Shorter descriptions throughout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rope 2026-10-20 08:01:57 +01:00
parent 5898e2006f
commit 61d8b2fce3
2 changed files with 146 additions and 153 deletions

124
game.py
View file

@ -281,14 +281,14 @@ def describe_potion(skill: str, effect: dict) -> str:
if "speed" in effect:
return f"{name.title()} {round(effect['speed'] * 100)}% faster"
if "double" in effect:
return f"{name.title()}: {round(effect['double'] * 100)}% chance of double yield"
return f"{name.title()}: {round(effect['double'] * 100)}% double yield"
if "keep" in effect:
return f"{name.title()}: {round(effect['keep'] * 100)}% chance to keep your materials"
return f"{name.title()}: {round(effect['keep'] * 100)}% save materials"
if "bones" in effect:
return f"+{round(effect['bones'] * 100)}% prayer points and devotion from bones"
return f"+{round(effect['bones'] * 100)}% from bones"
if "power" in effect:
return f"+{effect['power']} combat power"
return f"-{round(effect['reduce'] * 100)}% damage taken in fights"
return f"+{effect['power']} power"
return f"-{round(effect['reduce'] * 100)}% damage taken"
for _id, _name, _icon, _level, _time, _xp, _value in HERBS:
@ -328,31 +328,31 @@ CLASSES = {
"miner": {
"name": "Miner", "icon": "⛏️", "fast": ["mining", "smithing"], "craft": ["smithing"],
"bonus": "Mining and smithing 20% faster",
"masterwork": "Masterwork: 1 in 10 smithing crafts make double",
"signature": "Prospector: 1 in 10 mining trips bring back double",
"combat": "Warhammer: +15% damage with one. Slow, heavy, crushes golems",
"masterwork": "Masterwork: 10% double smithing crafts",
"signature": "Prospector: 10% double ore",
"combat": "Warhammer: +15% damage",
},
"builder": {
"name": "Builder", "icon": "🏗️", "fast": ["woodcutting", "construction"], "craft": ["construction"],
"bonus": "Woodcutting and construction (masonry included) 20% faster",
"masterwork": "Masterwork: 1 in 10 construction crafts make double",
"signature": "Foreman: +1 labour every time you work a building site",
"combat": "Sword and shield: +15% damage with a sword. The shield blocks, and trolls fall to blades",
"bonus": "Woodcutting and construction 20% faster",
"masterwork": "Masterwork: 10% double construction crafts",
"signature": "Foreman: +1 labour per site action",
"combat": "Sword: +15% damage",
},
"homesteader": {
"name": "Homesteader", "icon": "🌾", "fast": ["cooking", "herblore"], "craft": ["cooking", "herblore"],
"bonus": "Cooking and herblore 20% faster. Two plots: farm one crop 30% faster, or two crops at once",
"masterwork": "Masterwork: 1 in 10 cooking and herblore crafts make double",
"signature": "Steady hand: potions you drink last 25% longer",
"combat": "Staff: +15% damage with one. Rarely misses, ignores armour, and spirits fear it",
"bonus": "Cooking and herblore 20% faster, two farm plots",
"masterwork": "Masterwork: 10% double cooking and herblore crafts",
"signature": "Steady hand: potions last 25% longer",
"combat": "Staff: +15% damage",
},
"ranger": {
"name": "Ranger", "icon": "🏹", "fast": ["hunting", "fishing", "leatherworking", "cooking"],
"craft": ["leatherworking", "cooking"],
"bonus": "Hunting, fishing, leatherworking and cooking 20% faster",
"masterwork": "Masterwork: 1 in 10 leatherworking and cooking crafts make double",
"signature": "Pathfinder: your scouting gathers 50% more reconnaissance",
"combat": "Bow: +15% damage with one. Fast, strikes first, and brings down flyers",
"masterwork": "Masterwork: 10% double leatherworking and cooking crafts",
"signature": "Pathfinder: +50% recon",
"combat": "Bow: +15% damage",
},
}
# Classes from before the trades, as a starting point until their player re-picks.
@ -639,7 +639,7 @@ BUILDINGS = {
"advanced": {"oak_logs": 100, "leather": 80, "rope": 40, "iron_nails": 150},
"late": {"willow_logs": 80, "oak_plank": 35, "hide_glue": 50, "steel_hinges": 20},
"final": {"maple_logs": 50, "willow_plank": 30, "hard_leather": 60, "mithril_brackets": 15},
"effect": "Room for 20 more people per level",
"effect": "+20 homes per level",
},
"walls": {
"name": "Walls", "icon": "🏰", "max": 5, "gold": 300,
@ -647,7 +647,7 @@ BUILDINGS = {
"advanced": {"cut_stone": 150, "beam": 20, "rope": 50, "iron_nails": 200},
"late": {"steel_bar": 60, "oak_plank": 25, "hide_glue": 50, "steel_hinges": 30},
"final": {"mithril_brackets": 60, "maple_plank": 20, "hide_glue": 60, "adamant_chain": 10},
"effect": "+20 defence per level, and raiders carry off less",
"effect": "+20 defence per level, less plunder lost",
},
"barracks": {
"name": "Barracks", "icon": "⛺", "max": 5, "gold": 300,
@ -655,7 +655,7 @@ BUILDINGS = {
"advanced": {"iron_bar": 60, "hard_leather": 40},
"late": {"steel_bar": 40, "oak_plank": 30, "hide_glue": 40},
"final": {"mithril_bar": 25, "willow_plank": 25, "bear_leather": 40},
"effect": "Trains townsfolk as militia: more defence per citizen",
"effect": "More defence per townsperson",
},
"smithy": {
"name": "Smithy", "icon": "⚒️", "max": 5, "gold": 250,
@ -663,42 +663,42 @@ BUILDINGS = {
"advanced": {"iron_bar": 180, "leather": 70},
"late": {"steel_bar": 100, "oak_plank": 25, "hide_glue": 40},
"final": {"mithril_bar": 70, "maple_plank": 20, "bear_leather": 35},
"effect": "Smithing 8% faster per level; each level unlocks a metal: iron, steel, mithril, adamant, rune",
"effect": "Smithing 8% faster and one more metal per level",
},
"temple": {
"name": "Temple", "icon": "⛪", "max": 3, "gold": 300,
"base": {"stone": 700, "bricks": 200, "cut_stone": 60, "provisions": 60},
"advanced": {"beam": 15, "rope": 40, "iron_nails": 150},
"late": {"willow_logs": 80, "oak_plank": 35, "hide_glue": 40, "steel_hinges": 20},
"effect": "Offerings ward the city in raids; +1 prayer point per bone buried and +25% devotion per level",
"effect": "Per level: +1 prayer point per bone, +25% devotion",
},
"granary": {
"name": "Granary", "icon": "🌾", "max": 3, "gold": 150,
"base": {"logs": 200, "bricks": 100, "plank": 40, "thatch": 300, "provisions": 50, "copper_rivets": 40},
"advanced": {"cut_stone": 40, "rope": 40, "iron_nails": 100},
"late": {"oak_plank": 35, "hide_glue": 35, "steel_hinges": 15},
"effect": "Protects a quarter of the food from locusts and rats per level",
"effect": "Guards 25% of food from pests per level",
},
"lumber_shed": {
"name": "Lumber shed", "icon": "🪵", "max": 3, "gold": 120,
"base": {"logs": 200, "stone": 250, "plank": 50, "thatch": 180, "provisions": 40, "copper_rivets": 40},
"advanced": {"oak_plank": 40, "rope": 40, "iron_nails": 100},
"late": {"willow_plank": 25, "hide_glue": 35},
"effect": "Keeps a quarter of the stored wood safe from rot per level",
"effect": "Guards 25% of wood from rot per level",
},
"well": {
"name": "Well", "icon": "🪣", "max": 3, "gold": 120,
"base": {"stone": 500, "bricks": 80, "rope": 50, "provisions": 40},
"advanced": {"cut_stone": 40, "leather": 60, "iron_nails": 125},
"late": {"oak_plank": 25, "hide_glue": 35, "steel_hinges": 15},
"effect": "Each level cuts fire losses by a quarter and may save the building",
"effect": "Fire damage -25% per level",
},
"spymaster": {
"name": "Spymaster's guild", "icon": "🕵️", "max": 3, "gold": 400,
"base": {"logs": 200, "bricks": 150, "hide": 120, "feathers": 300, "provisions": 60},
"advanced": {"cut_stone": 80, "hard_leather": 40, "iron_nails": 100},
"late": {"bear_leather": 50, "oak_plank": 25, "steel_hinges": 15},
"effect": "+25% reconnaissance per level, and its agents gather some every hour on their own",
"effect": "+25% recon per level, plus some each hour",
},
"storehouse": {
"name": "Storehouse", "icon": "📦", "max": 5, "gold": 200,
@ -706,7 +706,7 @@ BUILDINGS = {
"advanced": {"oak_logs": 150, "cut_stone": 100, "rope": 50, "iron_nails": 150},
"late": {"willow_logs": 120, "oak_plank": 45, "hide_glue": 45, "steel_hinges": 25},
"final": {"yew_logs": 40, "yew_plank": 20, "bear_leather": 40, "rune_lock": 6},
"effect": "+3 bank slots and +250 per stack for everyone, per level",
"effect": "Per level: +3 bank slots, +250 stack size",
},
}
# Buildings rise by labour: players working the site, and a slow trickle from
@ -1285,9 +1285,9 @@ def describe_prayer(prayer: dict) -> str:
if prayer.get("power"):
parts.append(f"+{prayer['power']} power")
if prayer.get("regen"):
parts.append("HP recovers twice as fast while fighting")
parts.append("HP recovers twice as fast")
if prayer.get("wind"):
parts.append("once per outing, a retreat becomes a second wind: back to half health")
parts.append("once per outing, revive at half HP")
return ", ".join(parts)
@ -2269,7 +2269,7 @@ def event_view(world: dict, event: dict, now: float) -> dict:
view["sabotage"] = round(event["sabotage"] * 100)
view["requests"] = council_requests(world, event)
elif event["kind"] == "merchant":
view["headline"] = "A merchant caravan is on its way. Everything sells for half again as much while it's here."
view["headline"] = "A merchant caravan is on its way. Sell prices +50% while it's here."
else:
view["headline"] = f"About {event['people']} refugees are walking towards the city, hoping for a roof."
return view
@ -2481,15 +2481,15 @@ SEASON_DAYS = 7
# `speed` multiplies action time (below 1 is faster), `yield` multiplies output,
# `food` multiplies what the townsfolk eat, `firewood` is logs per person per hour.
WEATHER = {
"clear": {"name": "Clear skies", "icon": "🌤️", "text": "No effect on work or the city"},
"clear": {"name": "Clear skies", "icon": "🌤️", "text": "No effects"},
"rain": {"name": "Rain", "icon": "🌧️", "speed": {"farming": 0.9}, "text": "Farming 10% faster"},
"heat": {"name": "Heat wave", "icon": "🥵", "speed": {"farming": 0.85}, "food": 1.15,
"text": "Farming 15% faster, but food spoils: the city eats 15% more"},
"text": "Farming 15% faster, city eats 15% more"},
"storm": {"name": "Storm", "icon": "⛈️", "speed": {"fishing": 1.25}, "text": "Fishing 25% slower"},
"fog": {"name": "Fog", "icon": "🌫️", "speed": {"reconnaissance": 1.3, "hunting": 1.1},
"text": "Scouting 30% and hunting 10% slower"},
"snow": {"name": "Snow", "icon": "🌨️", "speed": {"hunting": 1.2}, "firewood": 0.05,
"text": "Hunting 20% slower, and the city burns firewood"},
"text": "Hunting 20% slower, burns firewood"},
}
SEASON_WEATHER = [
{"clear": 35, "rain": 40, "storm": 10, "fog": 15},
@ -2504,23 +2504,23 @@ WOOD = FIREWOOD + tuple(plank for plank, _name in PLANKS)
# either by working a special action (`work` completions) or by donating (`need`).
PROBLEMS = {
"collapse": {"name": "Mine collapse", "icon": "⛰️", "need": {"plank": 30},
"block": {"mining": "The mine has collapsed: shore it up with planks"}, "allow": ["mine_stone"],
"text": "A shaft caved in. Ore can't be mined until the mine is shored up with planks."},
"block": {"mining": "Mine collapsed"}, "allow": ["mine_stone"],
"text": "No ore until it's shored up with planks."},
"wolves": {"name": "Wolves at the farms", "icon": "🐺", "yield": {"farming": 0.5}, "work": 10, "action": "clear_wolves",
"text": "A pack is harrying the fields. Farming yields are halved until fighters drive them off."},
"text": "Farming yield halved until fighters drive them off."},
"bear": {"name": "Bear in the woods", "icon": "🐻", "speed": {"woodcutting": 1.5}, "work": 8, "action": "drive_bear",
"text": "Woodcutters won't go near it. Woodcutting is much slower until hunters drive it off."},
"text": "Woodcutting much slower until hunters drive it off."},
"goblins": {"name": "Goblin thieves", "icon": "👺", "steal": 0.01, "work": 10, "action": "catch_goblins",
"text": "Goblins raid the stockpile every hour until fighters catch them."},
"text": "Steal from the stockpile hourly until fighters catch them."},
"rockslide": {"name": "Rockslide on the quarry road", "icon": "🪨", "work": 25, "action": "clear_rockslide",
"block": {"mining": "The quarry road is blocked by a rockslide"}, "only": ["mine_stone"],
"text": "No stone can be quarried until builders clear the road."},
"block": {"mining": "Quarry road blocked"}, "only": ["mine_stone"],
"text": "No stone until builders clear it."},
"flood": {"name": "Flooded fishing grounds", "icon": "🌊", "speed": {"fishing": 1.5}, "need": {"plank": 20}, "lasts": 36,
"text": "The river burst its banks. Fishing is slow until it drops in a day and a half, or a dam of planks holds it back."},
"text": "Fishing slow for 36h, or until dammed with planks."},
"boars": {"name": "Boars trampling the crops", "icon": "🐗", "yield": {"farming": 0.6}, "work": 10, "action": "cull_boars",
"text": "A herd is trampling the fields. Farming yields are down until hunters cull them."},
"text": "Farming yield down until hunters cull them."},
"rats": {"name": "Rats in the granary", "icon": "🐀", "steal_food": 0.03, "work": 12, "action": "catch_rats",
"text": "Rats eat into the city's food every hour until someone catches them."},
"text": "Eat city food hourly until hunters catch them."},
}
MINOR_THREATS = ("collapse", "wolves", "bear", "goblins", "rockslide", "flood", "boars")
PROBLEM_ACTIONS = [
@ -2547,15 +2547,15 @@ ACTION_BY_ID[_barrel["id"]] = _barrel
# id, name, building, building level, construction level, inputs, effect, glyph, tint
FITTINGS = [
("grain_bins", "Grain bins", "granary", 1, 15, {"oak_plank": 20, "iron_nails": 25},
"The city eats 10% less food", "grain-bundle", "#e3c060"),
"City eats 10% less", "grain-bundle", "#e3c060"),
("saw_benches", "Saw benches", "lumber_shed", 1, 15, {"oak_plank": 20, "iron_nails": 40},
"Sawing planks is 20% faster", "hand-saw", "#8f5e30"),
"Planks 20% faster", "hand-saw", "#8f5e30"),
("shelving", "Shelving", "storehouse", 2, 20, {"oak_plank": 40, "iron_nails": 40},
"+1 bank slot for everyone", "bookshelf", "#8f5e30"),
"+1 bank slot", "bookshelf", "#8f5e30"),
("map_table", "Map table", "spymaster", 1, 30, {"willow_plank": 25, "hard_leather": 10, "steel_hinges": 4},
"Scouting gathers one more point of reconnaissance", "treasure-map", "#a3b86c"),
"+1 recon per scout", "treasure-map", "#a3b86c"),
("well_pump", "Well pump", "well", 2, 30, {"willow_plank": 25, "steel_hinges": 10},
"Half of all fires are put out before they spread", "water-tank", "#5aa0d8"),
"Stops half of all fires", "water-tank", "#5aa0d8"),
("furniture", "Furniture", "houses", 2, 35, {"willow_plank": 40, "leather": 30, "steel_hinges": 10},
"Population grows 25% faster", "sofa", "#a3b86c"),
("weapon_racks", "Weapon racks", "barracks", 2, 40, {"willow_plank": 30, "steel_hinges": 16},
@ -2563,13 +2563,13 @@ FITTINGS = [
("hoardings", "Hoardings", "walls", 3, 45, {"maple_plank": 40, "mithril_brackets": 20},
"+25 defence", "palisade", "#d0663a"),
("bellows", "Great bellows", "smithy", 3, 50, {"maple_plank": 30, "bear_leather": 15, "mithril_brackets": 6},
"Smithing another 10% faster", "bellows", "#d0663a"),
"Smithing 10% faster", "bellows", "#d0663a"),
("carved_altar", "Carved altar", "temple", 2, 60, {"yew_plank": 30, "cut_stone": 60, "adamant_chain": 4},
"+1 prayer point per bone buried, and offerings can ward 15 more", "star-altar", "#6f9a4a"),
"+1 prayer point per bone, ward +15", "star-altar", "#6f9a4a"),
("enchanted_chests", "Enchanted chests", "storehouse", 4, 75, {"magic_plank": 40, "rune_lock": 6},
"+500 per bank stack for everyone", "open-treasure-chest", "#a77be8"),
"+500 stack size", "open-treasure-chest", "#a77be8"),
("enchanted_hearths", "Enchanted hearths", "houses", 4, 80, {"magic_plank": 50, "red_dragon_leather": 5, "adamant_chain": 6},
"Everyone recovers HP twice as fast", "fireplace", "#a77be8"),
"HP recovers twice as fast", "fireplace", "#a77be8"),
]
# Builders' shields, homesteaders' staves and rangers' bows, after each skill's other tabs.
for _weapon in _weapon_actions():
@ -2748,7 +2748,7 @@ def _hardship(world: dict, now: float, rng: random.Random, kind: str | None = No
if kind == "sickness":
hours = 72 * (1 - 0.2 * building_level(world, "temple"))
_add_effect(world, now, hours, kind="sickness", name="Sickness", icon="🤒", food=1.5,
text="The sick need more food: the city eats half again as much")
text="City eats 50% more")
_record(world, now, "hardship", kind, "🤒", "Sickness is spreading through the city",
[f"For about {round(hours)} hours the townsfolk eat half again as much.",
"A bigger temple shortens it."])
@ -2795,7 +2795,7 @@ def _hardship(world: dict, now: float, rng: random.Random, kind: str | None = No
_record(world, now, "hardship", kind, "🔥", "Fire swept through part of the city", lines)
elif kind == "winter":
_add_effect(world, now, 48, kind="winter", name="Harsh winter", icon="🥶", firewood=0.1,
text="The city burns firewood from the stockpile every hour; without it, people go cold and hungry")
text="Burns stockpile logs hourly")
_record(world, now, "hardship", kind, "🥶", "A harsh cold snap has set in",
["For two days the city burns logs from the stockpile to keep warm.",
"Without firewood, the cold makes everyone eat half again as much."])
@ -2828,27 +2828,27 @@ def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = Non
skill = rng.choice([s for s in SKILL_IDS if s != "reconnaissance"])
name = next(s["name"] for s in SKILLS if s["id"] == skill)
_add_effect(world, now, 12, kind="master", name=f"A master of {name.lower()}", icon="🎓",
xp={skill: 1.5}, text=f"{name} earns 50% more XP")
xp={skill: 1.5}, text=f"{name} +50% XP")
_record(world, now, "fortune", kind, "🎓", f"A travelling master of {name.lower()} is visiting",
[f"For 12 hours, {name.lower()} earns 50% more XP. Learn while you can."])
elif kind == "harvest":
_add_effect(world, now, 12, kind="harvest", name="Bountiful harvest", icon="🌾", **{"yield": {"farming": 2}},
text="Farming yields doubled")
text="Farming yield doubled")
_record(world, now, "fortune", kind, "🌾", "The fields are bursting: a bountiful harvest",
["Farming yields are doubled for 12 hours."])
elif kind == "rich_vein":
_add_effect(world, now, 12, kind="rich_vein", name="Rich vein", icon="💎", **{"yield": {"mining": 1.5}},
text="Mining yields 50% more")
text="Mining yield +50%")
_record(world, now, "fortune", kind, "💎", "Miners struck a rich vein",
["Mining yields 50% more for 12 hours."])
elif kind == "salmon":
_add_effect(world, now, 12, kind="salmon", name="Salmon run", icon="🐟", **{"yield": {"fishing": 2}},
text="Fishing yields doubled")
text="Fishing yield doubled")
_record(world, now, "fortune", kind, "🐟", "The salmon are running",
["Fishing yields are doubled for 12 hours."])
elif kind == "festival":
_add_effect(world, now, 24, kind="festival", name="Festival", icon="🎉", growth=2, favour=1.5,
text="The population grows twice as fast, and giving to the city earns 50% more favour")
text="Growth doubled, +50% favour from donations")
_record(world, now, "fortune", kind, "🎉", "The city is holding a festival",
["For a day, the population grows twice as fast and donations earn 50% more favour."])
elif kind == "noble":
@ -2870,7 +2870,7 @@ def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = Non
elif kind == "mercenaries":
cost = 150 + 30 * season(world, now)["index"] + int(city["population"]) * 5
_add_effect(world, now, 24, kind="mercenaries", name="Mercenaries for hire", icon="🗡️", offer=True,
cost=cost, defence=25, text=f"A sellsword company offers +25 defence for the coming threat for {cost:,} gold from the treasury")
cost=cost, defence=25, text="+25 defence for the coming threat")
_record(world, now, "fortune", kind, "🗡️", "A sellsword company is camped outside the walls",
[f"For a day they'll join the next defence for {cost:,} gold from the treasury."])
else: