Prototype version – bar04
playtest name – Bar1860PT04-pc
Game prototype crit
I attended this week’s game crit and had the chance to see other students’ game prototypes. It was interesting to see how everyone had different ideas and approaches to game design. I also presented my own game and received some useful feedback and suggestions. These gave me a better idea of what I could improve.
Feedback I get:

Based on the feedback I received, I decided to focus on improving the bartending interactions, story branches and gameplay loop.
For example, I want to make bartending more interactive and allow different choices to have a clearer impact on the story. I also want to improve the overall gameplay flow, making the connections between bartending, dialogue and story progression feel more natural and consistent.
Drink Attribute System
I decided to keep the original four drink attributes: strength, sourness, sweetness and warmth. Each customer will still have their own preferences and dislikes, so this part of the design will stay the same. What I mainly want to change is how the values are calculated, so that different drink choices can lead to more noticeable reactions.

During playtesting, I realised that I hadn’t balanced the drink attributes very well. Some ingredients didn’t affect the final values in a reasonable way, meaning different drink combinations could produce similar results.
To improve the balance of my drink attributes, I looked at the bartending system in VA-11 HALL-A and how different ingredients and proportions affect the final drink.

- Water: Dilutes the other attributes. In a Hot Toddy, it counts as hot water and contributes warmth.
- Ice: Slightly dilutes the drink and reduces warmth to 0.
These are the ingredients’ base values. The finished drink’s values are calculated from the proportions of its ingredients, rather than adding 10 points per measure.
After setting the values for each available ingredient, I also created formulas to calculate the four drink attributes: strength, sourness, sweetness and warmth. This allows the system to calculate the final drink’s attributes based on the ingredients and proportions chosen by the player, and use the results to determine how customers react.
I referred to data from Mixed Spirits Bartender and adjusted them to fit the four attributes in my own game.

My Version

After setting up these values and formulas, I found it much easier to design drink preferences and conditions for different customers. I could use the four attributes to decide which drinks would suit each customer’s tastes and how they would react to different drinks.

Evaluation Code:
Basic properties of materials
INGREDIENT_TASTE = {
'Whisky': {'strength': 10},
'Gin': {'strength': 10},
'Brandy': {'strength': 10},
'Rum': {'strength': 10},
'Water': {},
'Coffee': {'warmth': 10},
'Lemon': {'sourness': 10},
'Sugar': {'sweetness': 10},
}
Calculate the four values for the beverage
def drink_properties(parts, ice, name=None):
# 只计算有效且数量大于零的材料
clean = {
key: value
for key, value in parts.items()
if key in INGREDIENT_TASTE and value > 0
}
total = sum(clean.values())
# 加冰后,计算用的总量增加 10%,模拟稀释
denominator = total * (1.1 if ice else 1.0)
axes = ('strength', 'sweetness', 'sourness', 'warmth')
taste = {axis: 0.0 for axis in axes}
if not total:
return taste
for axis in axes:
units = sum(
INGREDIENT_TASTE[key].get(axis, 0) * value
for key, value in clean.items()
)
# 热托迪中的水按热水处理
if axis == 'warmth' and identify_drink(clean, ice) == 'Hot Toddy':
units += 10 * clean.get('Water', 0)
# 限制在 0–10,并保留一位小数
taste[axis] = round(
max(0.0, min(10.0, units / denominator)),
1
)
# 加冰后不再有温暖感
if ice:
taste['warmth'] = 0.0
return taste
Does the customer like this drink
TASTE_PROFILES = {
'balanced': {
'strength': (2, 6),
'sweetness': (0, 3),
'sourness': (0, 3),
},
'bold': {
'strength': (6, 10),
'sweetness': (0, 1),
'sourness': (0, 2),
},
# 钟表匠使用这一组偏好。
'sweet': {
'strength': (1, 5),
'sweetness': (1.5, 4),
'sourness': (0, 2.5),
},
'comfort': {
'strength': (0, 4),
'sweetness': (0, 4),
'sourness': (0, 2),
},
}
Assessment and Determination of Trustworthiness
preferences = TASTE_PROFILES[profile]
# 烈度、甜度、酸度:
# 在接受区间内 +1,否则 -1
score = sum(
1 if preferences[key][0] <= properties[key] <= preferences[key][1]
else -1
for key in ('strength', 'sweetness', 'sourness')
)
# 喜欢温热饮品,或当前觉得冷:
# 温暖感达到 4,加 2 分;否则减 2 分
warmth_bonus = (
properties['warmth'] >= 4
and (profile == 'comfort' or mood == 'cold')
)
if warmth_bonus:
score += 2
elif profile == 'comfort' or mood == 'cold':
score -= 2
# 烦躁状态下,烈度达到 4 加分,否则减分
if mood == 'restless':
score += 1 if properties['strength'] >= 4 else -1
# 最终评价
kind = (
'liked' if score >= 2
else 'disliked' if score <= -1
else 'neutral'
)
# 喜欢 +1 信任,不喜欢 -1,普通不变
delta = 1 if kind == 'liked' else -1 if kind == 'disliked' else 0
# 信任度限制在 0–5
next_trust = max(0, min(5, trust + delta))
With these values in place, I can create more story branches.
Character Preferences
During playtesting, one player mentioned that customers’ preferences were not displayed on screen, which made it easy to forget what each customer liked. They had to keep checking previous information. This made me realise that although I had designed different preferences for each customer, the information was not easy enough for players to access during gameplay.
To fix this, I added some code that allows the Customer Notebook to read the interactions between the player and customers after each round and automatically update their preferences.
The result is shown in the video below:
Evaluation Code
if section == "preferences":
for entry in customer_preference_lines(customer_note_selection):
text entry color PAPER_INK size 20
def customer_preference_lines(customer_id):
known = set(
store.customer_notes
.get(customer_id, {})
.get('preferences', [])
)
groups = CUSTOMER_PREFERENCE_GROUPS.get(customer_id, {})
separator = '、' if persistent.ui_language == 'zh' else ', '
lines = []
for heading in ('Likes', 'Can accept', 'Dislikes'):
items = [
tr(text)
for key, text in groups.get(heading, ())
if key in known
]
content = separator.join(items) if items else tr('Not yet known.')
lines.append(
tr(heading + ': {items}').format(items=content)
)
return lines
Future Plans
Continued improving my game based on the feedback I had received, mainly focusing on bartending interactions, story branches and the overall gameplay loop. I also started thinking about adding new mechanics that would allow players to influence the story through choices other than just making drinks.
Use of AI Tools
Google translate
Youdao translate
Chat GPT drawing, code debugging.