Classes become trades; building costs draw on every trade
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
f810e16eb8
commit
f4b2bb1320
6 changed files with 305 additions and 137 deletions
179
game.py
179
game.py
|
|
@ -66,6 +66,13 @@ ITEMS = {
|
|||
"dragon_bones": {"name": "Dragon bones", "icon": "🦴", "value": 15},
|
||||
"studded_body": {"name": "Studded jerkin", "icon": "🧥", "value": 40, "slot": "body", "armour": 6,
|
||||
"req": ["combat", 10]},
|
||||
# Building materials from every trade: thatch and flax from the fields, rope
|
||||
# twisted from flax, glue boiled from hides, and provisions to feed the builders.
|
||||
"thatch": {"name": "Thatch", "icon": "🌾", "value": 2},
|
||||
"flax": {"name": "Flax", "icon": "🌿", "value": 2},
|
||||
"rope": {"name": "Rope", "icon": "🪢", "value": 8},
|
||||
"hide_glue": {"name": "Hide glue", "icon": "🍯", "value": 7},
|
||||
"provisions": {"name": "Provisions", "icon": "🎒", "value": 10},
|
||||
}
|
||||
|
||||
# --- tier ladders -----------------------------------------------------------
|
||||
|
|
@ -280,35 +287,46 @@ SKILLS = [
|
|||
{"id": "herblore", "name": "Herblore", "icon": "🧪", "group": "Crafting"},
|
||||
{"id": "combat", "name": "Combat", "icon": "⚔️", "group": "Combat"},
|
||||
{"id": "prayer", "name": "Prayer", "icon": "🙏", "group": "Combat"},
|
||||
{"id": "reconnaissance", "name": "Reconnaissance", "icon": "🔭", "group": "Signature", "class": "scout"},
|
||||
{"id": "reconnaissance", "name": "Reconnaissance", "icon": "🔭", "group": "Combat"},
|
||||
]
|
||||
SKILL_IDS = [skill["id"] for skill in SKILLS]
|
||||
GATHERING = {"mining", "woodcutting", "farming", "hunting", "fishing"}
|
||||
CRAFTING = {"smithing", "masonry", "cooking", "leatherworking", "herblore"}
|
||||
SURVEYED = {"mining", "woodcutting", "farming"} # what the pioneer's double yield applies to
|
||||
CRAFTING = {"smithing", "masonry", "construction", "cooking", "leatherworking", "herblore"}
|
||||
|
||||
# A class is a whole trade, from gathering to the finished goods: its skills are
|
||||
# 20% faster, 1 in 10 of its crafts make double, and it has one bonus of its own.
|
||||
# Nothing is locked: every class can train every skill.
|
||||
CLASSES = {
|
||||
"warrior": {
|
||||
"name": "Warrior", "icon": "🛡️", "fast": ["combat"],
|
||||
"bonus": "Combat actions 20% faster",
|
||||
"signature": "Command: counts for half again as much in the garrison",
|
||||
"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",
|
||||
},
|
||||
"scout": {
|
||||
"name": "Scout", "icon": "🏹", "fast": ["hunting", "fishing", "reconnaissance"],
|
||||
"bonus": "Hunting and fishing 20% faster",
|
||||
"signature": "Reconnaissance: scout the roads to sharpen intel on what's coming",
|
||||
"builder": {
|
||||
"name": "Builder", "icon": "🏗️", "fast": ["woodcutting", "construction", "masonry"],
|
||||
"craft": ["construction", "masonry"],
|
||||
"bonus": "Woodcutting, construction and masonry 20% faster",
|
||||
"masterwork": "Masterwork: 1 in 10 construction and masonry crafts make double",
|
||||
"signature": "Foreman: +1 labour every time you work a building site",
|
||||
},
|
||||
"artisan": {
|
||||
"name": "Artisan", "icon": "⚒️", "fast": ["smithing", "masonry", "cooking", "leatherworking"],
|
||||
"bonus": "Smithing, masonry, cooking and leatherworking 20% faster",
|
||||
"signature": "Masterwork: 1 in 10 crafts makes double",
|
||||
"homesteader": {
|
||||
"name": "Homesteader", "icon": "🌾", "fast": ["farming", "cooking", "herblore"],
|
||||
"craft": ["cooking", "herblore"],
|
||||
"bonus": "Farming, cooking and herblore 20% faster",
|
||||
"masterwork": "Masterwork: 1 in 10 cooking and herblore crafts make double",
|
||||
"signature": "Steady hand: potions you drink last 25% longer",
|
||||
},
|
||||
"pioneer": {
|
||||
"name": "Pioneer", "icon": "🧭", "fast": ["mining", "woodcutting", "farming", "construction"],
|
||||
"bonus": "Mining, woodcutting, farming and construction 20% faster",
|
||||
"signature": "Surveying: 1 in 10 gathers yields double",
|
||||
"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",
|
||||
},
|
||||
}
|
||||
# Classes from before the trades, as a starting point until their player re-picks.
|
||||
OLD_CLASSES = {"pioneer": "miner", "artisan": "builder", "scout": "ranger", "warrior": "builder"}
|
||||
|
||||
|
||||
def _action(id, skill, name, level, time, xp, inputs=None, outputs=None, **extra):
|
||||
|
|
@ -384,6 +402,14 @@ ACTIONS = [
|
|||
_action("lw_studded", "leatherworking", "Studded jerkin", 25, 50, 40,
|
||||
{"leather": 4, "iron_bar": 1}, {"studded_body": 1}, group="Leather"),
|
||||
_action("labour", "construction", "Work on the building site", 1, 30, 10, special="labour"),
|
||||
_action("twist_rope", "construction", "Twist rope", 5, 30, 10, {"flax": 3}, {"rope": 1}, group="Supplies"),
|
||||
_action("grow_thatch", "farming", "Cut thatch reeds", 3, 30, 7, outputs={"thatch": 3}),
|
||||
_action("grow_flax", "farming", "Grow flax", 10, 35, 11, outputs={"flax": 3}),
|
||||
_action("boil_glue", "leatherworking", "Boil hide glue", 5, 30, 10, {"hide": 1, "logs": 1}, {"hide_glue": 2},
|
||||
group="Tanning"),
|
||||
_action("pack_bread", "cooking", "Pack bread rations", 1, 20, 6, {"bread": 2}, {"provisions": 1}),
|
||||
_action("pack_meat", "cooking", "Pack meat rations", 5, 20, 7, {"cooked_meat": 2}, {"provisions": 1}),
|
||||
_action("pack_fish", "cooking", "Pack fish rations", 1, 20, 6, {"cooked_shrimp": 2}, {"provisions": 1}),
|
||||
*[_action(f"saw_{plank}", "construction", f"Saw {name.lower()}s", TIER_LEVELS[tier], 25 + 3 * tier,
|
||||
[6, 14, 22, 32, 44, 58][tier], {TREES[tier][0]: 2}, {plank: 1}, group="Planks")
|
||||
for tier, (plank, name) in enumerate(PLANKS)],
|
||||
|
|
@ -431,62 +457,77 @@ ACTION_BY_ID = {action["id"]: action for action in ACTIONS}
|
|||
BUILDINGS = {
|
||||
"houses": {
|
||||
"name": "Houses", "icon": "🏠", "max": 8, "gold": 200,
|
||||
"base": {"logs": 600, "bricks": 300}, "advanced": {"oak_logs": 200},
|
||||
"late": {"willow_logs": 150, "oak_plank": 60}, "final": {"maple_logs": 100, "willow_plank": 60},
|
||||
"base": {"logs": 300, "bricks": 150, "thatch": 300, "provisions": 80},
|
||||
"advanced": {"oak_logs": 100, "leather": 80, "rope": 40, "iron_bar": 30},
|
||||
"late": {"willow_logs": 80, "oak_plank": 35, "hide_glue": 50},
|
||||
"final": {"maple_logs": 50, "willow_plank": 30, "hard_leather": 60},
|
||||
"effect": "Room for 20 more people per level",
|
||||
},
|
||||
"walls": {
|
||||
"name": "Walls", "icon": "🏰", "max": 5, "gold": 300,
|
||||
"base": {"stone": 1200, "bricks": 500}, "advanced": {"cut_stone": 300, "beam": 40},
|
||||
"late": {"steel_bar": 60, "oak_plank": 40}, "final": {"mithril_bar": 40, "maple_plank": 40},
|
||||
"base": {"stone": 1000, "bricks": 250, "provisions": 90},
|
||||
"advanced": {"cut_stone": 150, "beam": 20, "rope": 50, "iron_bar": 40},
|
||||
"late": {"steel_bar": 80, "oak_plank": 25, "hide_glue": 50},
|
||||
"final": {"mithril_bar": 50, "maple_plank": 20, "hide_glue": 60},
|
||||
"effect": "+20 defence per level, and raiders carry off less",
|
||||
},
|
||||
"barracks": {
|
||||
"name": "Barracks", "icon": "⛺", "max": 5, "gold": 300,
|
||||
"base": {"logs": 600, "bricks": 400, "copper_sword": 20}, "advanced": {"iron_sword": 15},
|
||||
"late": {"steel_sword": 10, "oak_plank": 50}, "final": {"mithril_sword": 6, "willow_plank": 50},
|
||||
"base": {"logs": 300, "bricks": 200, "thatch": 200, "leather": 80, "copper_sword": 25, "provisions": 80},
|
||||
"advanced": {"iron_sword": 20, "hard_leather": 40},
|
||||
"late": {"steel_sword": 12, "oak_plank": 30, "hide_glue": 40},
|
||||
"final": {"mithril_sword": 8, "willow_plank": 25, "bear_leather": 40},
|
||||
"effect": "Trains townsfolk as militia: more defence per citizen",
|
||||
},
|
||||
"smithy": {
|
||||
"name": "Smithy", "icon": "⚒️", "max": 5, "gold": 250,
|
||||
"base": {"stone": 500, "logs": 600, "copper_bar": 150}, "advanced": {"iron_bar": 150},
|
||||
"late": {"steel_bar": 80, "oak_plank": 40}, "final": {"mithril_bar": 60, "maple_plank": 40},
|
||||
"base": {"stone": 400, "logs": 250, "copper_bar": 180, "provisions": 60},
|
||||
"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",
|
||||
},
|
||||
"temple": {
|
||||
"name": "Temple", "icon": "⛪", "max": 3, "gold": 300,
|
||||
"base": {"stone": 800, "bricks": 400, "cut_stone": 100}, "advanced": {"beam": 20},
|
||||
"late": {"willow_logs": 150, "oak_plank": 60},
|
||||
"base": {"stone": 700, "bricks": 200, "cut_stone": 60, "provisions": 60},
|
||||
"advanced": {"beam": 15, "rope": 40, "iron_bar": 30},
|
||||
"late": {"willow_logs": 80, "oak_plank": 35, "hide_glue": 40},
|
||||
"effect": "Offerings ward the city in raids; +1 prayer point per bone buried and +25% devotion per level",
|
||||
},
|
||||
"granary": {
|
||||
"name": "Granary", "icon": "🌾", "max": 3, "gold": 150,
|
||||
"base": {"logs": 400, "bricks": 200, "plank": 60}, "advanced": {"cut_stone": 80},
|
||||
"late": {"oak_plank": 60},
|
||||
"base": {"logs": 200, "bricks": 100, "plank": 40, "thatch": 300, "provisions": 50},
|
||||
"advanced": {"cut_stone": 40, "rope": 40, "iron_bar": 20},
|
||||
"late": {"oak_plank": 35, "hide_glue": 35},
|
||||
"effect": "Protects a quarter of the food from locusts and rats per level",
|
||||
},
|
||||
"lumber_shed": {
|
||||
"name": "Lumber shed", "icon": "🪵", "max": 3, "gold": 120,
|
||||
"base": {"logs": 300, "stone": 200, "plank": 80}, "advanced": {"oak_plank": 60},
|
||||
"late": {"willow_plank": 40},
|
||||
"base": {"logs": 200, "stone": 250, "plank": 50, "thatch": 180, "provisions": 40},
|
||||
"advanced": {"oak_plank": 40, "rope": 40, "iron_bar": 20},
|
||||
"late": {"willow_plank": 25, "hide_glue": 35},
|
||||
"effect": "Keeps a quarter of the stored wood safe from rot per level",
|
||||
},
|
||||
"well": {
|
||||
"name": "Well", "icon": "🪣", "max": 3, "gold": 120,
|
||||
"base": {"stone": 500, "bricks": 150}, "advanced": {"cut_stone": 80},
|
||||
"late": {"oak_plank": 40},
|
||||
"base": {"stone": 500, "bricks": 80, "rope": 50, "provisions": 40},
|
||||
"advanced": {"cut_stone": 40, "leather": 60, "iron_bar": 25},
|
||||
"late": {"oak_plank": 25, "hide_glue": 35},
|
||||
"effect": "Each level cuts fire losses by a quarter and may save the building",
|
||||
},
|
||||
"spymaster": {
|
||||
"name": "Spymaster's guild", "icon": "🕵️", "max": 3, "gold": 400,
|
||||
"base": {"logs": 500, "bricks": 300, "hide": 100, "feathers": 300}, "advanced": {"cut_stone": 150},
|
||||
"late": {"bear_leather": 40, "oak_plank": 40},
|
||||
"base": {"logs": 200, "bricks": 150, "hide": 120, "feathers": 300, "provisions": 60},
|
||||
"advanced": {"cut_stone": 80, "hard_leather": 40, "iron_bar": 20},
|
||||
"late": {"bear_leather": 50, "oak_plank": 25},
|
||||
"effect": "+25% reconnaissance per level, and its agents gather some every hour on their own",
|
||||
},
|
||||
"storehouse": {
|
||||
"name": "Storehouse", "icon": "📦", "max": 5, "gold": 200,
|
||||
"base": {"logs": 800, "stone": 800}, "advanced": {"oak_logs": 300, "cut_stone": 200},
|
||||
"late": {"willow_logs": 200, "oak_plank": 80}, "final": {"yew_logs": 80, "yew_plank": 40},
|
||||
"base": {"logs": 400, "stone": 800, "thatch": 200, "provisions": 60},
|
||||
"advanced": {"oak_logs": 150, "cut_stone": 100, "rope": 50, "iron_bar": 30},
|
||||
"late": {"willow_logs": 120, "oak_plank": 45, "hide_glue": 45},
|
||||
"final": {"yew_logs": 40, "yew_plank": 20, "bear_leather": 40},
|
||||
"effect": "+3 bank slots and +250 per stack for everyone, per level",
|
||||
},
|
||||
}
|
||||
|
|
@ -523,7 +564,7 @@ RAID_TRAITS = ["lightly armoured, heavy on archers", "mounted and fast, few bows
|
|||
|
||||
# --- world ---------------------------------------------------------------
|
||||
|
||||
WORLD_VERSION = 11
|
||||
WORLD_VERSION = 12
|
||||
|
||||
|
||||
def new_world(now: float, speed: float = 1.0) -> dict:
|
||||
|
|
@ -633,6 +674,13 @@ def migrate(world: dict, now: float | None = None) -> dict:
|
|||
if world["version"] < 11:
|
||||
_migrate_potions(world)
|
||||
world["version"] = 11
|
||||
if world["version"] < 12:
|
||||
# Classes became trades: everyone gets a stand-in and one free pick.
|
||||
for player in world["players"].values():
|
||||
player["cls"] = OLD_CLASSES.get(player["cls"], player["cls"])
|
||||
player["repick"] = True
|
||||
_return_overfunding(world)
|
||||
world["version"] = 12
|
||||
return world
|
||||
|
||||
|
||||
|
|
@ -656,6 +704,24 @@ def _migrate_potions(world: dict) -> None:
|
|||
action[key] = f"brew_{OLD_POTIONS[old]}"
|
||||
|
||||
|
||||
def _return_overfunding(world: dict) -> None:
|
||||
"""After building costs change, anything a fund holds beyond its new target goes back to the stockpile."""
|
||||
city = world["city"]
|
||||
for key, building in city["buildings"].items():
|
||||
target = fund_target(world, key) or {}
|
||||
for item, qty in list(building["fund"].items()):
|
||||
extra = qty - target.get(item, 0)
|
||||
if extra <= 0:
|
||||
continue
|
||||
building["fund"][item] = qty - extra
|
||||
if not building["fund"][item]:
|
||||
del building["fund"][item]
|
||||
if item == "gold":
|
||||
city["treasury"] += extra
|
||||
else:
|
||||
city["stockpile"][item] = city["stockpile"].get(item, 0) + extra
|
||||
|
||||
|
||||
def _sell_useless_stock(world: dict, now: float) -> None:
|
||||
"""The council sells what the city can't use, into the treasury."""
|
||||
city = world["city"]
|
||||
|
|
@ -1006,7 +1072,8 @@ def use_potion(player: dict, item: str) -> str | None:
|
|||
bank_take(player, item, 1)
|
||||
current = player["potions"].get(spec["skill"])
|
||||
charges = current["charges"] if current and current["item"] == item else 0
|
||||
player["potions"][spec["skill"]] = {"item": item, "charges": charges + POTION_CHARGES}
|
||||
fresh = round(POTION_CHARGES * (1.25 if player["cls"] == "homesteader" else 1))
|
||||
player["potions"][spec["skill"]] = {"item": item, "charges": charges + fresh}
|
||||
return None
|
||||
|
||||
|
||||
|
|
@ -1042,8 +1109,6 @@ def upcoming_event(world: dict) -> dict | None:
|
|||
|
||||
def can_start(world: dict, player: dict, action: dict) -> str | None:
|
||||
"""Why the action can't run right now, or None."""
|
||||
if action["skill"] == "reconnaissance" and player["cls"] != "scout":
|
||||
return "Only scouts can do that"
|
||||
if skill_level(player, action["skill"]) < action["level"]:
|
||||
return f"Needs level {action['level']}"
|
||||
for key, level in action.get("city", {}).items():
|
||||
|
|
@ -1086,9 +1151,9 @@ def _complete(world: dict, player: dict, action: dict, now: float, rng: random.R
|
|||
for item, qty in action["inputs"].items():
|
||||
bank_take(player, item, qty)
|
||||
xp = action["xp"]
|
||||
lucky = (
|
||||
(player["cls"] == "artisan" and action["skill"] in CRAFTING)
|
||||
or (player["cls"] == "pioneer" and action["skill"] in SURVEYED)
|
||||
cls = CLASSES[player["cls"]]
|
||||
lucky = bool(action["outputs"]) and (
|
||||
action["skill"] in cls["craft"] or (player["cls"] == "miner" and action["skill"] == "mining")
|
||||
) and rng.random() < LUCKY_CHANCE
|
||||
outputs = {item: qty * (2 if lucky else 1) for item, qty in action["outputs"].items()}
|
||||
if lucky:
|
||||
|
|
@ -1155,7 +1220,7 @@ def _complete(world: dict, player: dict, action: dict, now: float, rng: random.R
|
|||
# Once a threat is fully scouted, scouting only trains the skill (and keeps the informant's leads).
|
||||
if event and event["recon"] < intel_costs(event)[-1]:
|
||||
city = world["city"]
|
||||
gain = recon_gain(world, action)
|
||||
gain = recon_gain(world, player, action)
|
||||
# An informant's leads double the reconnaissance (and the XP) of whoever follows them up.
|
||||
boost = min(city.get("recon_boost", 0), gain)
|
||||
city["recon_boost"] = city.get("recon_boost", 0) - boost
|
||||
|
|
@ -1598,7 +1663,7 @@ def defence(world: dict) -> dict:
|
|||
garrison = []
|
||||
for player in world["players"].values():
|
||||
if player["garrison"]:
|
||||
power = combat_power(player) * (1.5 if player["cls"] == "warrior" else 1)
|
||||
power = combat_power(player)
|
||||
garrison.append({"id": player["id"], "name": player["name"], "power": round(power, 1)})
|
||||
parts["garrison"] += power
|
||||
total = sum(parts.values())
|
||||
|
|
@ -1690,7 +1755,8 @@ def labour_needed(level: int, repair: bool) -> float:
|
|||
|
||||
|
||||
def labour_per_action(player: dict) -> float:
|
||||
return 1 + skill_level(player, "construction") // 20 # one more labour every 20 levels
|
||||
# One more labour every 20 levels, and one more for a builder.
|
||||
return 1 + skill_level(player, "construction") // 20 + (player["cls"] == "builder")
|
||||
|
||||
|
||||
def _finish_construction(world: dict, now: float) -> None:
|
||||
|
|
@ -1758,8 +1824,9 @@ SPYMASTER_AGENTS = 0.5 # recon per guild level per game hour, wi
|
|||
INFORMANT_RECON = 30 # boosted recon per informant: doubled recon and XP for the scout who works it
|
||||
|
||||
|
||||
def recon_gain(world: dict, action: dict) -> float:
|
||||
return (action["recon"] + fitted(world, "map_table")) * (1 + SPYMASTER_RECON * building_level(world, "spymaster"))
|
||||
def recon_gain(world: dict, player: dict, action: dict) -> float:
|
||||
gain = (action["recon"] + fitted(world, "map_table")) * (1 + SPYMASTER_RECON * building_level(world, "spymaster"))
|
||||
return gain * (1.5 if player["cls"] == "ranger" else 1)
|
||||
|
||||
|
||||
def intel_costs(event: dict) -> list[int]:
|
||||
|
|
@ -2635,9 +2702,7 @@ def favours(world: dict, now: float) -> dict:
|
|||
"informant": {
|
||||
"cost": round(INFORMANT_FAVOUR * (1 + 0.5 * (raid or {}).get("informants", 0))),
|
||||
"why": "No news to dig into" if not raid else
|
||||
"Nothing more to learn" if raid["recon"] >= intel_costs(raid)[-1] else
|
||||
"No scout in the guild to follow up the leads"
|
||||
if not any(p["cls"] == "scout" for p in world["players"].values()) else None,
|
||||
"Nothing more to learn" if raid["recon"] >= intel_costs(raid)[-1] else None,
|
||||
"recon": INFORMANT_RECON,
|
||||
"boost": round(city.get("recon_boost", 0)),
|
||||
},
|
||||
|
|
@ -2728,6 +2793,8 @@ GLYPHS = {
|
|||
"bones": ("broken-bone", "#e9dfc6"), "big_bones": ("crossed-bones", "#e9dfc6"),
|
||||
"dragon_bones": ("dinosaur-bones", "#a6d98f"), "studded_body": ("leather-armor", "#a3825a"),
|
||||
"coal": ("ore", "#5d626b"), "water_barrel": ("barrel", "#5aa0d8"),
|
||||
"thatch": ("high-grass", "#d8c070"), "flax": ("flax", "#8fb0d8"), "rope": ("rope-coil", "#c9a66b"),
|
||||
"hide_glue": ("honey-jar", "#c08a40"), "provisions": ("knapsack", "#a08050"),
|
||||
"raw_shrimp": ("shrimp", "#f39a82"), "raw_trout": ("flatfish", "#9fb5c8"), "raw_salmon": ("salmon", "#f08a6a"),
|
||||
"raw_eel": ("eel", "#7f9a6a"), "raw_lobster": ("crab", "#e05a3a"), "raw_swordfish": ("angler-fish", "#7fa3c8"),
|
||||
"cooked_shrimp": ("shrimp", "#f0b07a"), "cooked_trout": ("fish-cooked", "#d9a060"),
|
||||
|
|
@ -2742,8 +2809,8 @@ SKILL_GLYPHS = {
|
|||
"herblore": ("cauldron", "#7fbf5a"), "combat": ("crossed-swords", "#e05a5a"), "prayer": ("prayer", "#e9dfc6"),
|
||||
"reconnaissance": ("spyglass", "#6f8fec"),
|
||||
}
|
||||
CLASS_GLYPHS = {"warrior": ("black-knight-helm", "#c0c6d0"), "scout": ("bow-arrow", "#8fbf6a"),
|
||||
"artisan": ("anvil-impact", "#e0a050"), "pioneer": ("compass", "#4fb3d9")}
|
||||
CLASS_GLYPHS = {"miner": ("miner", "#d07a3c"), "builder": ("crane", "#d1a46a"),
|
||||
"homesteader": ("farmer", "#8fbf6a"), "ranger": ("bow-arrow", "#5fae8a")}
|
||||
BUILDING_GLYPHS = {
|
||||
"houses": ("house", "#d0a060"), "walls": ("stone-wall", "#a8a29e"), "barracks": ("barracks-tent", "#c06a4a"),
|
||||
"smithy": ("anvil", "#d07a3c"), "temple": ("temple-gate", "#e9dfc6"), "granary": ("granary", "#e3c060"),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue