Livelier frontier: 2-day raids, more and shorter happenings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rope 2026-10-24 11:43:56 +01:00
parent bf013a1648
commit db1a00e8aa
5 changed files with 201 additions and 48 deletions

View file

@ -153,7 +153,8 @@ Beta. The core game is in place; changes from here are mostly balance and tuning
of the XP of every craft the fire pays for, shared evenly by everyone whose of the XP of every craft the fire pays for, shared evenly by everyone whose
pile is hot enough for that craft on its own. Because the fires are shared, the server runs pile is hot enough for that craft on its own. Because the fires are shared, the server runs
everyone's actions as time passes, not only when they next look. everyone's actions as time passes, not only when they next look.
- **Events:** raids are announced a day or two ahead. Reconnaissance from - **Events:** a threat lands every two days, give or take two hours, and the
next is rumoured as soon as the last one lands. Reconnaissance from
scouts, informants and the spymaster's guild narrows down when, how strong, scouts, informants and the spymaster's guild narrows down when, how strong,
and finally where their camp is, so fighters can sabotage it. Fighters can and finally where their camp is, so fighters can sabotage it. Fighters can
also drill the militia before any raid: a full drill takes as much work as also drill the militia before any raid: a full drill takes as much work as
@ -161,8 +162,8 @@ Beta. The core game is in place; changes from here are mostly balance and tuning
informants and drill sergeants double what players put in for a while, informants and drill sergeants double what players put in for a while,
XP included. Each intel XP included. Each intel
level takes more scouting than the last and more for a bigger band, and level takes more scouting than the last and more for a bigger band, and
levels 2 and 3 only open about a day and eight hours before the raid levels 2 and 3 only open about a day and a half and exactly a day before
arrives. Defeat kills or drives the raid arrives, so the second day is for fighting at the camp. Defeat kills or drives
off people, loots the stockpile and treasury, and may damage a building. off people, loots the stockpile and treasury, and may damage a building.
Damaged buildings stop working until repaired but keep their level. Damaged buildings stop working until repaired but keep their level.
Every fight uses up arrows and breaks some of the swords and shields Every fight uses up arrows and breaks some of the swords and shields
@ -171,11 +172,11 @@ Beta. The core game is in place; changes from here are mostly balance and tuning
five minutes out, and everyone watches the battle play out once, live or five minutes out, and everyone watches the battle play out once, live or
on their next visit, before the report. on their next visit, before the report.
- **Happenings:** three more tracks run on their own cooldowns. Minor threats - **Happenings:** three more tracks run on their own cooldowns. Minor threats
(wolves, a mine collapse, goblin thieves…) slow or block a skill until (wolves, a mine collapse, goblin thieves, smugglers…) slow or block a skill until
players deal with them; hardships (sickness, locusts, rot, storms, fire, players deal with them; hardships (sickness, locusts, rot, storms, fire,
harsh winters, drought) hit the stores and buildings, softened by a granary, harsh winters, drought, blight, the tax collector…) hit the stores and buildings, softened by a granary,
lumber shed, well and water barrels; fortunes (visiting masters, harvests, lumber shed, well and water barrels; fortunes (visiting masters, harvests,
festivals, nobles, mercenaries…) give windows of plenty. Weather changes festivals, nobles, mercenaries…) give short windows of plenty, several a day. Weather changes
every few hours, and a game season lasts a week. every few hours, and a game season lasts a week.
## Running ## Running

189
game.py
View file

@ -737,6 +737,12 @@ WOLVES = [("Grey wolf", "skirmisher", "slash", "pierce", "blunt"),
GOBLINS = [("Goblin brute", "brute", "blunt", "blunt", "slash"), GOBLINS = [("Goblin brute", "brute", "blunt", "blunt", "slash"),
("Goblin rogue", "skirmisher", "pierce", "magic", "blunt"), ("Goblin rogue", "skirmisher", "pierce", "magic", "blunt"),
("Goblin warlock", "caster", "magic", "slash", "magic")] ("Goblin warlock", "caster", "magic", "slash", "magic")]
SPIDERS = [("Cave spider", "skirmisher", "pierce", "blunt", "pierce"),
("Bloated spider", "brute", "magic", "slash", "blunt"),
("Spider matriarch", "elite", "pierce", "magic", "slash")]
SMUGGLERS = [("Smuggler", "skirmisher", "slash", "blunt", "slash"),
("Smuggler bruiser", "brute", "blunt", "pierce", "blunt"),
("Smuggler hexer", "caster", "magic", "slash", "pierce")]
# Expedition areas, tiers II to VI: name, level, the reagent prefix, and four races. # Expedition areas, tiers II to VI: name, level, the reagent prefix, and four races.
# Each race: (name, trophy, weapon line its trophy goes into, level offset, roster). # Each race: (name, trophy, weapon line its trophy goes into, level offset, roster).
@ -1161,7 +1167,7 @@ RAID_TRAITS = ["lightly armoured, heavy on archers", "mounted and fast, few bows
# --- world --------------------------------------------------------------- # --- world ---------------------------------------------------------------
WORLD_VERSION = 26 WORLD_VERSION = 27
def new_world(now: float, speed: float = 1.0) -> dict: def new_world(now: float, speed: float = 1.0) -> dict:
@ -1366,6 +1372,16 @@ def migrate(world: dict, now: float | None = None) -> dict:
for party in world["parties"].values(): for party in world["parties"].values():
party["fight"] = None party["fight"] = None
world["version"] = 26 world["version"] = 26
if world["version"] < 27:
# Livelier happenings: tracks waiting longer than their new cooldowns are brought forward,
# and a city with no threat coming hears rumours of the next one straight away.
for track, (_low, high) in TRACK_HOURS.items():
key = f"next_{track}_at"
if world.get(key):
world[key] = min(world[key], now + high * HOUR / speed(world))
if world["next_event_at"] and not upcoming_event(world):
world["next_event_at"] = min(world["next_event_at"], now)
world["version"] = 27
return world return world
@ -2397,7 +2413,7 @@ def _complete(world: dict, player: dict, action: dict, now: float, rng: random.R
outputs[item] = outputs.get(item, 0) + qty outputs[item] = outputs.get(item, 0) + qty
if action.get("special") == "sabotage": if action.get("special") == "sabotage":
raid = upcoming_raid(world) raid = upcoming_raid(world)
raid["sabotage"] = min(0.3, raid["sabotage"] + 0.03) raid["sabotage"] = min(0.3, raid["sabotage"] + 0.01)
if action.get("special") == "problem": if action.get("special") == "problem":
_work_problem(world, player, action, now) _work_problem(world, player, action, now)
if action.get("special") == "recon": if action.get("special") == "recon":
@ -3457,15 +3473,16 @@ def tick(world: dict, now: float, rng: random.Random | None = None) -> bool:
_queue_if_funded(world, key, now) _queue_if_funded(world, key, now)
_start_next(world, now) _start_next(world, now)
changed = True changed = True
if world["next_event_at"] and world["next_event_at"] <= now and not upcoming_event(world):
_announce(world, now, rng)
changed = True
for event in world["events"]: for event in world["events"]:
if event["status"] == "upcoming" and event["fire_at"] <= now: if event["status"] == "upcoming" and event["fire_at"] <= now:
for player in world["players"].values(): for player in world["players"].values():
process_player(world, player, event["fire_at"], rng) process_player(world, player, event["fire_at"], rng)
_fire(world, event, now, rng) _fire(world, event, now, rng)
world["next_event_at"] = now + rng.uniform(8, 24) * HOUR / speed(world) # The next threat is rumoured as soon as this one is over.
world["next_event_at"] = now
changed = True
if world["next_event_at"] and world["next_event_at"] <= now and not upcoming_event(world):
_announce(world, now, rng)
changed = True changed = True
return changed return changed
@ -3534,16 +3551,33 @@ def _finish_construction(world: dict, now: float) -> None:
# --- events -------------------------------------------------------------- # --- events --------------------------------------------------------------
# Threats keep a two-day rhythm: one lands every THREAT_EVERY game hours, give or
# take THREAT_WOBBLE, and the next is rumoured the moment it's over. The first day
# is for scouting, drilling and building; on the second the camp can be found.
THREAT_EVERY = 48
THREAT_WOBBLE = 2
def threat_slot(world: dict, now: float) -> float:
"""When the next threat is due: two days after the last one's slot, never sooner than about two days off."""
hours = HOUR / speed(world)
last = next((e["slot"] for e in reversed(world["events"]) if e["kind"] in THREATS and "slot" in e), None)
soonest = now + (THREAT_EVERY - THREAT_WOBBLE) * hours
return max(last + THREAT_EVERY * hours, soonest) if last else now + THREAT_EVERY * hours
def _announce(world: dict, now: float, rng: random.Random) -> None: def _announce(world: dict, now: float, rng: random.Random) -> None:
city = world["city"] city = world["city"]
hours = HOUR / speed(world) hours = HOUR / speed(world)
first = not any(e["kind"] in ("raid", "dragon") for e in world["events"]) first = not any(e["kind"] in ("raid", "dragon") for e in world["events"])
slot = threat_slot(world, now)
day = (now - world["created"]) * speed(world) / DAY day = (now - world["created"]) * speed(world) / DAY
# The major-threat track: mostly bandits, sometimes (after the first days) a dragon. # The major-threat track: mostly bandits, sometimes (after the first days) a dragon.
kind = "dragon" if not first and day >= 5 and rng.random() < 0.15 else "raid" kind = "dragon" if not first and day >= 5 and rng.random() < 0.15 else "raid"
event = { event = {
"id": world["next_event_id"], "kind": kind, "status": "upcoming", "id": world["next_event_id"], "kind": kind, "status": "upcoming",
"announced": now, "recon": 0, "sabotage": 0.0, "jitter": rng.uniform(-1, 1), "announced": now, "recon": 0, "sabotage": 0.0, "jitter": rng.uniform(-1, 1),
"slot": slot, "fire_at": slot + rng.uniform(-THREAT_WOBBLE, THREAT_WOBBLE) * hours,
} }
world["next_event_id"] += 1 world["next_event_id"] += 1
# Bigger, richer and older cities draw bigger threats; every win draws a bolder one. # Bigger, richer and older cities draw bigger threats; every win draws a bolder one.
@ -3551,7 +3585,6 @@ def _announce(world: dict, now: float, rng: random.Random) -> None:
strength = (15 + 4 * day + 0.8 * city["population"] + 1.2 * math.sqrt(wealth)) * (1 + 0.08 * city["repelled"]) strength = (15 + 4 * day + 0.8 * city["population"] + 1.2 * math.sqrt(wealth)) * (1 + 0.08 * city["repelled"])
if kind == "dragon": if kind == "dragon":
event.update({ event.update({
"fire_at": now + rng.uniform(30, 54) * hours,
"strength": round(strength * 1.5 * rng.uniform(0.9, 1.15), 1), "strength": round(strength * 1.5 * rng.uniform(0.9, 1.15), 1),
"group": rng.choice(DRAGONS), "group": rng.choice(DRAGONS),
"trait": rng.choice(DRAGON_TRAITS), "trait": rng.choice(DRAGON_TRAITS),
@ -3559,7 +3592,6 @@ def _announce(world: dict, now: float, rng: random.Random) -> None:
log(world, now, "event", "Herders report scorched pastures in the hills") log(world, now, "event", "Herders report scorched pastures in the hills")
elif kind == "raid": elif kind == "raid":
event.update({ event.update({
"fire_at": now + rng.uniform(30, 54) * hours,
"strength": round(strength * rng.uniform(0.85, 1.2), 1), "strength": round(strength * rng.uniform(0.85, 1.2), 1),
"group": rng.choice(RAID_GROUPS), "group": rng.choice(RAID_GROUPS),
"trait": rng.choice(RAID_TRAITS), "trait": rng.choice(RAID_TRAITS),
@ -3574,7 +3606,7 @@ def _announce(world: dict, now: float, rng: random.Random) -> None:
# knowable as the threat draws near, however much scouting is done. # knowable as the threat draws near, however much scouting is done.
INTEL_POINTS = [15, 30, 45] # recon for intel levels 1, 2 and 3 against a small band INTEL_POINTS = [15, 30, 45] # recon for intel levels 1, 2 and 3 against a small band
INTEL_SIZE = [1.0, 1.33, 1.67, 2.0] # small, medium, large, huge INTEL_SIZE = [1.0, 1.33, 1.67, 2.0] # small, medium, large, huge
INTEL_OPENS = [None, 24, 8] # game hours before arrival that levels 2 and 3 open, ±25% per threat INTEL_OPENS = [None, 36, 24] # game hours before arrival that levels 2 (±25% per threat) and 3 open
SPYMASTER_RECON = 0.25 # more recon per guild level SPYMASTER_RECON = 0.25 # more recon per guild level
SPYMASTER_AGENTS = 0.5 # recon per guild level per game hour, with nobody scouting SPYMASTER_AGENTS = 0.5 # recon per guild level per game hour, with nobody scouting
INFORMANT_RECON = 30 # boosted recon per informant: doubled recon and XP for the scout who works it INFORMANT_RECON = 30 # boosted recon per informant: doubled recon and XP for the scout who works it
@ -3593,11 +3625,12 @@ def intel_costs(event: dict) -> list[int]:
def intel_opens(world: dict, event: dict, level: int) -> float: def intel_opens(world: dict, event: dict, level: int) -> float:
"""When an intel level becomes knowable. The ±25% is fixed per threat, so it can't be timed.""" """When an intel level becomes knowable. Level 2's ±25% is fixed per threat, so it can't be timed;
the camp (level 3) can always be found a day before the threat lands."""
hours = INTEL_OPENS[level - 1] hours = INTEL_OPENS[level - 1]
if hours is None: if hours is None:
return 0 return 0
wobble = random.Random(f"{event['id']}-{level}").uniform(0.75, 1.25) wobble = random.Random(f"{event['id']}-{level}").uniform(0.75, 1.25) if level < 3 else 1
return event["fire_at"] - hours * wobble * HOUR / speed(world) return event["fire_at"] - hours * wobble * HOUR / speed(world)
@ -3612,7 +3645,7 @@ def intel_level(world: dict, event: dict, now: float | None = None) -> int:
SIZE_LABELS = [(30, "small"), (60, "medium"), (100, "large"), (math.inf, "huge")] SIZE_LABELS = [(30, "small"), (60, "medium"), (100, "large"), (math.inf, "huge")]
WINDOW_HOURS = [24, 8, 2, 0] WINDOW_HOURS = [4, 3, 2, 0]
THREATS = ("raid", "dragon") THREATS = ("raid", "dragon")
@ -3926,14 +3959,24 @@ PROBLEMS = {
"rockslide": {"name": "Rockslide on the quarry road", "icon": "🪨", "work": 25, "action": "clear_rockslide", "rockslide": {"name": "Rockslide on the quarry road", "icon": "🪨", "work": 25, "action": "clear_rockslide",
"block": {"mining": "Quarry road blocked"}, "only": ["mine_stone"], "block": {"mining": "Quarry road blocked"}, "only": ["mine_stone"],
"text": "No stone until builders clear it."}, "text": "No stone until builders clear it."},
"flood": {"name": "Flooded fishing grounds", "icon": "🌊", "speed": {"fishing": 1.5}, "need": {"plank": 20}, "lasts": 36, "flood": {"name": "Flooded fishing grounds", "icon": "🌊", "speed": {"fishing": 1.5}, "need": {"plank": 20}, "lasts": 18,
"text": "Fishing slow for 36h, or until dammed with planks."}, "text": "Fishing slow for 18h, or until dammed with planks."},
"boars": {"name": "Boars trampling the crops", "icon": "🐗", "speed": {"farming": 1.5}, "work": 10, "action": "cull_boars", "boars": {"name": "Boars trampling the crops", "icon": "🐗", "speed": {"farming": 1.5}, "work": 10, "action": "cull_boars",
"text": "Farming slower until hunters cull them."}, "text": "Farming slower until hunters cull them."},
"rats": {"name": "Rats in the granary", "icon": "🐀", "steal_food": 0.03, "work": 12, "action": "catch_rats", "rats": {"name": "Rats in the granary", "icon": "🐀", "steal_food": 0.03, "work": 12, "action": "catch_rats",
"text": "Eat city food hourly until hunters catch them."}, "text": "Eat city food hourly until hunters catch them."},
"spiders": {"name": "Spiders in the mine", "icon": "🕷️", "speed": {"mining": 1.5}, "work": 10, "action": "clear_spiders",
"text": "Mining much slower until fighters clear them out."},
"smugglers": {"name": "Smugglers in the caves", "icon": "🏴‍☠️", "steal_gold": 0.01, "work": 10, "action": "catch_smugglers",
"text": "Skim 1% of the treasury hourly until fighters catch them."},
"bridge": {"name": "Bridge washed out", "icon": "🌉", "need": {"plank": 25},
"block": {"hunting": "The bridge to the hunting grounds is out"},
"text": "No hunting until the bridge is rebuilt with planks."},
"hornets": {"name": "Hornets in the woods", "icon": "🐝", "speed": {"woodcutting": 1.4}, "work": 8, "action": "smoke_hornets",
"text": "Woodcutting slower until herbalists smoke them out."},
} }
MINOR_THREATS = ("collapse", "wolves", "bear", "goblins", "rockslide", "flood", "boars") MINOR_THREATS = ("collapse", "wolves", "bear", "goblins", "rockslide", "flood", "boars",
"spiders", "smugglers", "bridge", "hornets")
PROBLEM_ACTIONS = [ PROBLEM_ACTIONS = [
_encounter("clear_wolves", "Wolf pack", "Frontier", 4, WOLVES, label="Drive off the wolves", _encounter("clear_wolves", "Wolf pack", "Frontier", 4, WOLVES, label="Drive off the wolves",
special="problem", problem="wolves"), special="problem", problem="wolves"),
@ -3943,6 +3986,11 @@ PROBLEM_ACTIONS = [
_action("cull_boars", "hunting", "Cull the boar herd", 1, 45, 14, special="problem", problem="boars"), _action("cull_boars", "hunting", "Cull the boar herd", 1, 45, 14, special="problem", problem="boars"),
_action("catch_rats", "hunting", "Catch the rats", 1, 30, 8, special="problem", problem="rats"), _action("catch_rats", "hunting", "Catch the rats", 1, 30, 8, special="problem", problem="rats"),
_action("clear_rockslide", "construction", "Clear the rockslide", 1, 30, 10, special="problem", problem="rockslide"), _action("clear_rockslide", "construction", "Clear the rockslide", 1, 30, 10, special="problem", problem="rockslide"),
_encounter("clear_spiders", "Mine spiders", "Frontier", 6, SPIDERS, label="Clear the spiders",
special="problem", problem="spiders"),
_encounter("catch_smugglers", "Smugglers", "Frontier", 8, SMUGGLERS, gold=6, label="Catch the smugglers",
special="problem", problem="smugglers"),
_action("smoke_hornets", "herblore", "Smoke out the hornets", 1, 40, 12, special="problem", problem="hornets"),
] ]
ACTIONS.extend(PROBLEM_ACTIONS) ACTIONS.extend(PROBLEM_ACTIONS)
ACTION_BY_ID.update({action["id"]: action for action in PROBLEM_ACTIONS}) ACTION_BY_ID.update({action["id"]: action for action in PROBLEM_ACTIONS})
@ -4002,11 +4050,16 @@ for _id, _name, _building, _blevel, _level, _inputs, _effect, _glyph, _tint in F
# (weights by season, spring to winter) # (weights by season, spring to winter)
HARDSHIPS = {"sickness": [2, 1, 2, 3], "locusts": [1, 3, 2, 0], "rot": [3, 1, 3, 1], "storm": [1, 1, 3, 1], HARDSHIPS = {"sickness": [2, 1, 2, 3], "locusts": [1, 3, 2, 0], "rot": [3, 1, 3, 1], "storm": [1, 1, 3, 1],
"rats": [2, 2, 2, 2], "fire": [1, 2, 1, 2], "winter": [0, 0, 0, 4], "drought": [0, 4, 1, 0]} "rats": [2, 2, 2, 2], "fire": [1, 2, 1, 2], "winter": [0, 0, 0, 4], "drought": [0, 4, 1, 0],
"blight": [2, 1, 3, 0], "tremors": [1, 1, 1, 1], "taxman": [1, 1, 2, 1]}
FORTUNES = {"merchant": [12] * 4, "refugees": [10] * 4, "master": [16] * 4, "harvest": [10, 10, 12, 0], FORTUNES = {"merchant": [12] * 4, "refugees": [10] * 4, "master": [16] * 4, "harvest": [10, 10, 12, 0],
"rich_vein": [10] * 4, "salmon": [10, 8, 4, 0], "festival": [8] * 4, "noble": [8] * 4, "rich_vein": [10] * 4, "salmon": [10, 8, 4, 0], "festival": [8] * 4, "noble": [8] * 4,
"pilgrims": [8] * 4, "mercenaries": [6] * 4, "cargo": [10] * 4} "pilgrims": [8] * 4, "mercenaries": [6] * 4, "cargo": [10] * 4,
TRACK_HOURS = {"minor": (48, 96), "hardship": (48, 96), "fortune": (36, 72)} "timber": [8, 6, 10, 8], "deer": [8, 10, 10, 4], "masons": [10, 10, 8, 6], "artisans": [8] * 4,
"trapper": [10] * 4}
TRACK_HOURS = {"minor": (16, 32), "hardship": (20, 40), "fortune": (10, 20)}
CRAFTS = ("smithing", "jewelcrafting", "cooking", "leatherworking", "tailoring", "herblore")
TRAPPER_RECON = 15 # boosted recon a trapper's leads are worth, like an informant's
def calendar_day(world: dict, now: float) -> int: def calendar_day(world: dict, now: float) -> int:
@ -4160,7 +4213,7 @@ def _hardship(world: dict, now: float, rng: random.Random, kind: str | None = No
kind = kind or _pick(weights, rng) kind = kind or _pick(weights, rng)
granary, shed, well = (building_level(world, k) for k in ("granary", "lumber_shed", "well")) granary, shed, well = (building_level(world, k) for k in ("granary", "lumber_shed", "well"))
if kind == "sickness": if kind == "sickness":
hours = 72 * (1 - 0.2 * building_level(world, "temple")) hours = 36 * (1 - 0.2 * building_level(world, "temple"))
_add_effect(world, now, hours, kind="sickness", name="Sickness", icon="🤒", food=2.0, _add_effect(world, now, hours, kind="sickness", name="Sickness", icon="🤒", food=2.0,
text="City eats twice as much food") text="City eats twice as much food")
_record(world, now, "hardship", kind, "🤒", "Sickness is spreading through the city", _record(world, now, "hardship", kind, "🤒", "Sickness is spreading through the city",
@ -4208,28 +4261,46 @@ def _hardship(world: dict, now: float, rng: random.Random, kind: str | None = No
lines.append("Water barrels in the stockpile (five per fire) would have put it out.") lines.append("Water barrels in the stockpile (five per fire) would have put it out.")
_record(world, now, "hardship", kind, "🔥", "Fire swept through part of the city", lines) _record(world, now, "hardship", kind, "🔥", "Fire swept through part of the city", lines)
elif kind == "winter": elif kind == "winter":
_add_effect(world, now, 48, kind="winter", name="Harsh winter", icon="🥶", firewood=0.1, _add_effect(world, now, 24, kind="winter", name="Harsh winter", icon="🥶", firewood=0.1,
text="Burns stockpile logs hourly") text="Burns stockpile logs hourly")
_record(world, now, "hardship", kind, "🥶", "A harsh cold snap has set in", _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.", ["For a day the city burns logs from the stockpile to keep warm.",
"Without firewood, the cold makes everyone eat 50% more food."]) "Without firewood, the cold makes everyone eat 50% more food."])
elif kind == "blight":
_add_effect(world, now, 12, kind="blight", name="Blight", icon="🥀", **{"yield": {"farming": 0.5}},
text="Farming yield halved")
_record(world, now, "hardship", kind, "🥀", "Blight has struck the fields",
["For 12 hours, farming yields half."])
elif kind == "tremors":
_add_effect(world, now, 12, kind="tremors", name="Tremors", icon="🫨", speed={"mining": 1.3},
text="Mining 30% slower")
_record(world, now, "hardship", kind, "🫨", "The ground is shaking under the mines",
["For 12 hours, mining is 30% slower."])
elif kind == "taxman":
gold = int(city["treasury"] * 0.15)
city["treasury"] -= gold
_record(world, now, "hardship", kind, "📜", "The crown's tax collector came by",
[f"The collector took {gold:,} gold (15%) from the treasury." if gold else "The treasury was empty, so the collector left grumbling."])
else: else:
_add_effect(world, now, 24, kind="drought", name="Drought", icon="🏜️", speed={"farming": 1.3, "fishing": 1.2}, _add_effect(world, now, 12, kind="drought", name="Drought", icon="🏜️", speed={"farming": 1.3, "fishing": 1.2},
text="Farming 30% and fishing 20% slower") text="Farming 30% and fishing 20% slower")
_record(world, now, "hardship", kind, "🏜️", "Drought has dried the fields and streams", _record(world, now, "hardship", kind, "🏜️", "Drought has dried the fields and streams",
["For a day, farming is 30% and fishing 20% slower."]) ["For 12 hours, farming is 30% and fishing 20% slower."])
def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = None) -> None: def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = None) -> None:
city = world["city"] city = world["city"]
weights = {kind: w[season(world, now)["index"]] for kind, w in FORTUNES.items()} weights = {kind: w[season(world, now)["index"]] for kind, w in FORTUNES.items()}
if not upcoming_raid(world): threat = upcoming_raid(world)
if not threat:
weights["mercenaries"] = 0 weights["mercenaries"] = 0
if not threat or threat["recon"] >= intel_costs(threat)[-1]:
weights["trapper"] = 0
kind = kind or _pick(weights, rng) kind = kind or _pick(weights, rng)
if kind == "merchant": if kind == "merchant":
city["merchant_until"] = now + 12 * HOUR / speed(world) city["merchant_until"] = now + 6 * HOUR / speed(world)
_record(world, now, "fortune", kind, "🐪", "A merchant caravan has arrived", _record(world, now, "fortune", kind, "🐪", "A merchant caravan has arrived",
["For the next 12 hours, everything sells for 50% more."]) ["For the next 6 hours, everything sells for 50% more."])
elif kind == "refugees": elif kind == "refugees":
people = rng.randint(6, 12) people = rng.randint(6, 12)
taken = min(max(0, housing(world) - int(city["population"])), people) taken = min(max(0, housing(world) - int(city["population"])), people)
@ -4241,30 +4312,30 @@ def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = Non
elif kind == "master": elif kind == "master":
skill = rng.choice([s for s in SKILL_IDS if s != "reconnaissance"]) skill = rng.choice([s for s in SKILL_IDS if s != "reconnaissance"])
name = next(s["name"] for s in SKILLS if s["id"] == skill) 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="🎓", _add_effect(world, now, 6, kind="master", name=f"A master of {name.lower()}", icon="🎓",
xp={skill: 1.5}, text=f"{name} +50% XP") xp={skill: 1.5}, text=f"{name} +50% XP")
_record(world, now, "fortune", kind, "🎓", f"A travelling master of {name.lower()} is visiting", _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."]) [f"For 6 hours, {name.lower()} earns 50% more XP. Learn while you can."])
elif kind == "harvest": elif kind == "harvest":
_add_effect(world, now, 12, kind="harvest", name="Bountiful harvest", icon="🌾", **{"yield": {"farming": 2}}, _add_effect(world, now, 6, kind="harvest", name="Bountiful harvest", icon="🌾", **{"yield": {"farming": 2}},
text="Farming yield doubled") text="Farming yield doubled")
_record(world, now, "fortune", kind, "🌾", "The fields are bursting: a bountiful harvest", _record(world, now, "fortune", kind, "🌾", "The fields are bursting: a bountiful harvest",
["Farming yields are doubled for 12 hours."]) ["Farming yields are doubled for 6 hours."])
elif kind == "rich_vein": elif kind == "rich_vein":
_add_effect(world, now, 12, kind="rich_vein", name="Rich vein", icon="💎", **{"yield": {"mining": 1.5}}, _add_effect(world, now, 6, kind="rich_vein", name="Rich vein", icon="💎", **{"yield": {"mining": 1.5}},
text="Mining yield +50%") text="Mining yield +50%")
_record(world, now, "fortune", kind, "💎", "Miners struck a rich vein", _record(world, now, "fortune", kind, "💎", "Miners struck a rich vein",
["Mining yields 50% more for 12 hours."]) ["Mining yields 50% more for 6 hours."])
elif kind == "salmon": elif kind == "salmon":
_add_effect(world, now, 12, kind="salmon", name="Salmon run", icon="🐟", **{"yield": {"fishing": 2}}, _add_effect(world, now, 6, kind="salmon", name="Salmon run", icon="🐟", **{"yield": {"fishing": 2}},
text="Fishing yield doubled") text="Fishing yield doubled")
_record(world, now, "fortune", kind, "🐟", "The salmon are running", _record(world, now, "fortune", kind, "🐟", "The salmon are running",
["Fishing yields are doubled for 12 hours."]) ["Fishing yields are doubled for 6 hours."])
elif kind == "festival": elif kind == "festival":
_add_effect(world, now, 24, kind="festival", name="Festival", icon="🎉", growth=2, favour=1.5, _add_effect(world, now, 12, kind="festival", name="Festival", icon="🎉", growth=2, favour=1.5,
text="Growth doubled, +50% favour from donations") text="Growth doubled, +50% favour from donations")
_record(world, now, "fortune", kind, "🎉", "The city is holding a festival", _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."]) ["For 12 hours, the population grows twice as fast and donations earn 50% more favour."])
elif kind == "noble": elif kind == "noble":
levels = sum(b["level"] for b in city["buildings"].values()) levels = sum(b["level"] for b in city["buildings"].values())
gold = 100 + 40 * levels gold = 100 + 40 * levels
@ -4283,10 +4354,34 @@ def _fortune(world: dict, now: float, rng: random.Random, kind: str | None = Non
_record(world, now, "fortune", kind, "🙏", "Pilgrims passed through the city", lines) _record(world, now, "fortune", kind, "🙏", "Pilgrims passed through the city", lines)
elif kind == "mercenaries": elif kind == "mercenaries":
cost = 150 + 30 * season(world, now)["index"] + int(city["population"]) * 5 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, _add_effect(world, now, 12, kind="mercenaries", name="Mercenaries for hire", icon="🗡️", offer=True,
cost=cost, defence=25, text="+25 defence for the coming threat") cost=cost, defence=25, text="+25 defence for the coming threat")
_record(world, now, "fortune", kind, "🗡️", "A sellsword company is camped outside the walls", _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."]) [f"For 12 hours they'll join the next defence for {cost:,} gold from the treasury."])
elif kind == "timber":
_add_effect(world, now, 6, kind="timber", name="Storm-felled timber", icon="🪵", **{"yield": {"woodcutting": 1.5}},
text="Woodcutting yield +50%")
_record(world, now, "fortune", kind, "🪵", "A storm felled trees all over the woods",
["Woodcutting yields 50% more for 6 hours."])
elif kind == "deer":
_add_effect(world, now, 6, kind="deer", name="Deer migration", icon="🦌", **{"yield": {"hunting": 2}},
text="Hunting yield doubled")
_record(world, now, "fortune", kind, "🦌", "Herds are migrating past the city",
["Hunting yields are doubled for 6 hours."])
elif kind == "masons":
_add_effect(world, now, 6, kind="masons", name="Masons' guild", icon="🧱", speed={"construction": 0.75},
text="Construction 25% faster")
_record(world, now, "fortune", kind, "🧱", "A masons' guild is passing through",
["For 6 hours, construction is 25% faster."])
elif kind == "artisans":
_add_effect(world, now, 6, kind="artisans", name="Artisans' fair", icon="🎨", speed={s: 0.85 for s in CRAFTS},
text="Smithing, jewelcrafting, cooking, leatherworking, tailoring and herblore 15% faster")
_record(world, now, "fortune", kind, "🎨", "Artisans from afar opened a fair",
["For 6 hours, every craft but construction and firekeeping is 15% faster."])
elif kind == "trapper":
city["recon_boost"] = city.get("recon_boost", 0) + TRAPPER_RECON
_record(world, now, "fortune", kind, "🗺️", "A trapper brought word from the hills",
[f"The next {TRAPPER_RECON} recon scouts gather counts double."])
else: else:
goods = rng.sample([("stone", 200), ("logs", 200), ("bricks", 80), ("bread", 60), ("arrows", 150), ("plank", 40)], 2) goods = rng.sample([("stone", 200), ("logs", 200), ("bricks", 80), ("bread", 60), ("arrows", 150), ("plank", 40)], 2)
for item, qty in goods: for item, qty in goods:
@ -4390,6 +4485,8 @@ def _happenings_hour(world: dict, now: float, rng: random.Random) -> None:
_take_share(stock, [i for i in stock if i not in _food_items(stock)], spec["steal"]) _take_share(stock, [i for i in stock if i not in _food_items(stock)], spec["steal"])
if spec.get("steal_food"): if spec.get("steal_food"):
_take_share(stock, _food_items(stock), spec["steal_food"] * (1 - 0.25 * building_level(world, "granary"))) _take_share(stock, _food_items(stock), spec["steal_food"] * (1 - 0.25 * building_level(world, "granary")))
if spec.get("steal_gold"):
city["treasury"] *= 1 - spec["steal_gold"]
def _happenings_tracks(world: dict, now: float, rng: random.Random) -> bool: def _happenings_tracks(world: dict, now: float, rng: random.Random) -> bool:
@ -4637,6 +4734,8 @@ ACTION_GLYPHS = {
"labour": ("hammer-nails", "#d1a46a"), "clear_wolves": ("wolf-head", "#9aa1ab"), "labour": ("hammer-nails", "#d1a46a"), "clear_wolves": ("wolf-head", "#9aa1ab"),
"catch_goblins": ("goblin-head", "#8fbf6a"), "drive_bear": ("bear-head", "#8a5a32"), "cull_boars": ("boar", "#a06a4a"), "catch_goblins": ("goblin-head", "#8fbf6a"), "drive_bear": ("bear-head", "#8a5a32"), "cull_boars": ("boar", "#a06a4a"),
"catch_rats": ("rat", "#9aa1ab"), "clear_rockslide": ("falling-rocks", "#a8a29e"), "catch_rats": ("rat", "#9aa1ab"), "clear_rockslide": ("falling-rocks", "#a8a29e"),
"clear_spiders": ("spider-alt", "#9a7fb0"), "catch_smugglers": ("pirate-hat", "#a08060"),
"smoke_hornets": ("wasp-sting", "#e3c060"),
"hunt_elk": ("deer", "#a07a50"), "hunt_sabrecat": ("saber-toothed-cat-head", "#e0a050"), "hunt_elk": ("deer", "#a07a50"), "hunt_sabrecat": ("saber-toothed-cat-head", "#e0a050"),
"hunt_mammoth": ("mammoth", "#8a6a50"), "hunt_mammoth": ("mammoth", "#8a6a50"),
} }
@ -4783,6 +4882,20 @@ ORDER_RECIPES, ORDER_RAW = _order_sources()
# What changed, shown on the Patch notes page. Newest first; every shipped change adds a # What changed, shown on the Patch notes page. Newest first; every shipped change adds a
# line here (new / balance / fix), and a new release a new entry on top. # line here (new / balance / fix), and a new release a new entry on top.
PATCH_NOTES = [ PATCH_NOTES = [
{"date": "2026-10-24", "title": "Livelier frontier", "notes": [
("balance", "A threat lands every 2 days (±2h), and the next one is rumoured as soon as the last lands. "
"Day 1: scout, drill, build. Day 2: the camp is found (intel III opens 24h out), with the exact hour."),
("balance", "Sabotage: -1% raid strength per win (was -3%), still max 30%."),
("balance", "Happenings ~3× as often: fortunes every 10–20h (was 36–72h), hardships 20–40h (was 48–96h), "
"minor threats 16–32h (was 48–96h)."),
("balance", "Shorter happenings: 12h boosts → 6h; festival, sellswords, drought 24h → 12h; cold snap 48h → 24h; "
"sickness 72h → 36h; flood 36h → 18h."),
("new", "Fortunes: storm-felled timber (woodcutting yield +50%), deer migration (hunting yield ×2), masons' guild "
"(construction 25% faster), artisans' fair (crafts 15% faster), a trapper's leads (next 15 recon doubled)."),
("new", "Hardships: blight (farming yield ½), tremors (mining 30% slower), the tax collector (-15% treasury)."),
("new", "Minor threats: spiders in the mine and smugglers skimming 1% treasury/h (fighters), a washed-out "
"bridge that blocks hunting (25 planks), hornets slowing woodcutting (herbalists smoke them out)."),
]},
{"date": "2026-10-24", "title": "Combat rework", "notes": [ {"date": "2026-10-24", "title": "Combat rework", "notes": [
("new", "Fights are against packs: as many enemies as there are of you, often one more (each 35% weaker). " ("new", "Fights are against packs: as many enemies as there are of you, often one more (each 35% weaker). "
"A rare elite still comes alone."), "A rare elite still comes alone."),

View file

@ -1186,7 +1186,7 @@ function actionCard(a) {
extra = `${e.boss || own ? `<div>${e.boss ? `<span class="tag warn">Boss</span> ` : ""}${own}</div>` : ""}${variantRows(e, o)}${fightingHere(a, why)}`; extra = `${e.boss || own ? `<div>${e.boss ? `<span class="tag warn">Boss</span> ` : ""}${own}</div>` : ""}${variantRows(e, o)}${fightingHere(a, why)}`;
if (a.gold) io += `<span class="item-chip" title="Gold: ${a.gold[0]}–${a.gold[1]} a kill">${COIN} ${a.gold[0]}–${a.gold[1]}</span>`; if (a.gold) io += `<span class="item-chip" title="Gold: ${a.gold[0]}–${a.gold[1]} a kill">${COIN} ${a.gold[0]}–${a.gold[1]}</span>`;
if (a.drops) io += a.drops.map(chance).join(""); if (a.drops) io += a.drops.map(chance).join("");
if (a.special === "sabotage") extra += `<div class="small muted">-3% raid strength per win (max 30%)</div>`; if (a.special === "sabotage") extra += `<div class="small muted">-1% raid strength per win (max 30%)</div>`;
} }
if (a.special === "drill") { if (a.special === "drill") {
const s = S.favours.sergeant, boost = s.boost; const s = S.favours.sergeant, boost = s.boost;

View file

@ -147,6 +147,7 @@
<symbol id="padlock" viewBox="0 0 512 512"><path fill="currentColor" d="M254.28 17.313c-81.048 0-146.624 65.484-146.624 146.406V236h49.594v-69.094c0-53.658 43.47-97.187 97.03-97.187c53.563 0 97.032 44.744 97.032 97.186V236h49.594v-72.28c0-78.856-65.717-146.407-146.625-146.407zM85.157 254.688c-14.61 22.827-22.844 49.148-22.844 76.78c0 88.358 84.97 161.5 191.97 161.5c106.998 0 191.968-73.142 191.968-161.5c0-27.635-8.26-53.95-22.875-76.78H85.155zM254 278.625c22.34 0 40.875 17.94 40.875 40.28c0 16.756-10.6 31.23-25.125 37.376l32.72 98.126h-96.376l32.125-98.125c-14.526-6.145-24.532-20.62-24.532-37.374c0-22.338 17.972-40.28 40.312-40.28z"/></symbol> <symbol id="padlock" viewBox="0 0 512 512"><path fill="currentColor" d="M254.28 17.313c-81.048 0-146.624 65.484-146.624 146.406V236h49.594v-69.094c0-53.658 43.47-97.187 97.03-97.187c53.563 0 97.032 44.744 97.032 97.186V236h49.594v-72.28c0-78.856-65.717-146.407-146.625-146.407zM85.157 254.688c-14.61 22.827-22.844 49.148-22.844 76.78c0 88.358 84.97 161.5 191.97 161.5c106.998 0 191.968-73.142 191.968-161.5c0-27.635-8.26-53.95-22.875-76.78H85.155zM254 278.625c22.34 0 40.875 17.94 40.875 40.28c0 16.756-10.6 31.23-25.125 37.376l32.72 98.126h-96.376l32.125-98.125c-14.526-6.145-24.532-20.62-24.532-37.374c0-22.338 17.972-40.28 40.312-40.28z"/></symbol>
<symbol id="palisade" viewBox="0 0 512 512"><path fill="currentColor" d="m112 144.836l-9 48V279h18v-86.164zm36 0l-9 48V279h18v-86.164zm216 0l-9 48V279h18v-86.164zm36 0l-9 48V279h18v-86.164zm-360 64l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm108 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm108 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zM18 297v16h138.96v-16zm156.96 0v16h162.005v-16zm180.005 0v16H494v-16zM31 331v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331z"/></symbol> <symbol id="palisade" viewBox="0 0 512 512"><path fill="currentColor" d="m112 144.836l-9 48V279h18v-86.164zm36 0l-9 48V279h18v-86.164zm216 0l-9 48V279h18v-86.164zm36 0l-9 48V279h18v-86.164zm-360 64l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm108 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zm108 0l-9 48V279h18v-22.164zm36 0l-9 48V279h18v-22.164zM18 297v16h138.96v-16zm156.96 0v16h162.005v-16zm180.005 0v16H494v-16zM31 331v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331zm36 0v156h18V331z"/></symbol>
<symbol id="pierced-body" viewBox="0 0 512 512"><path fill="currentColor" d="M242.5 21.5c-25.192 3.245-47.28 32.016-47.28 68.78c0 20.28 7.038 38.25 17.5 50.75l10.25 12.25l-15.69 2.94c-6.058 1.128-11.42 3.163-16.25 6.093l50.907 29.343l.22.125c10.092 5.547 17.387 12.847 21.687 20.72c4.332 7.932 5.865 16.78 2.562 24.75c-3.302 7.97-12.133 13.29-21.687 13.344c-9.457.054-20.02-3.703-32.345-11.5c-.13-.082-.245-.136-.375-.22l-52.313-30.06a193 193 0 0 0-4.156 14.56c-8.238 33.626-9.925 74.615-10.155 110.407H189.5l.625 8.626l11.28 149.78l96.69.002l9.935-149.69l.564-8.72h42c-.013-36.18-.378-77.737-7.844-111.624c-4.05-18.384-10.197-34.295-18.813-45.75s-19.257-18.706-34.593-21.062l-16-2.438L283.5 140.25c10.008-12.437 16.72-30.183 16.72-49.97c-.002-39.2-24.78-68.718-52.5-68.718c-2.913 0-4.762-.12-5.22-.062M20.812 85.78v21.626l200.875 115.5l.188.094l.188.125c10.573 6.74 18.416 8.805 22.53 8.78c4.115-.022 4.113-.724 4.563-1.81c.45-1.09.63-4.324-1.72-8.626c-2.348-4.304-7.01-9.363-14.436-13.407l-.094-.032l-.094-.06zm396.97 187.626l-15.626 28.22l-33.656-19.063c.355 8.144.576 16.234.688 24.187l22.906 13.03l-15.47 27.94l114.97 15.124z"/></symbol> <symbol id="pierced-body" viewBox="0 0 512 512"><path fill="currentColor" d="M242.5 21.5c-25.192 3.245-47.28 32.016-47.28 68.78c0 20.28 7.038 38.25 17.5 50.75l10.25 12.25l-15.69 2.94c-6.058 1.128-11.42 3.163-16.25 6.093l50.907 29.343l.22.125c10.092 5.547 17.387 12.847 21.687 20.72c4.332 7.932 5.865 16.78 2.562 24.75c-3.302 7.97-12.133 13.29-21.687 13.344c-9.457.054-20.02-3.703-32.345-11.5c-.13-.082-.245-.136-.375-.22l-52.313-30.06a193 193 0 0 0-4.156 14.56c-8.238 33.626-9.925 74.615-10.155 110.407H189.5l.625 8.626l11.28 149.78l96.69.002l9.935-149.69l.564-8.72h42c-.013-36.18-.378-77.737-7.844-111.624c-4.05-18.384-10.197-34.295-18.813-45.75s-19.257-18.706-34.593-21.062l-16-2.438L283.5 140.25c10.008-12.437 16.72-30.183 16.72-49.97c-.002-39.2-24.78-68.718-52.5-68.718c-2.913 0-4.762-.12-5.22-.062M20.812 85.78v21.626l200.875 115.5l.188.094l.188.125c10.573 6.74 18.416 8.805 22.53 8.78c4.115-.022 4.113-.724 4.563-1.81c.45-1.09.63-4.324-1.72-8.626c-2.348-4.304-7.01-9.363-14.436-13.407l-.094-.032l-.094-.06zm396.97 187.626l-15.626 28.22l-33.656-19.063c.355 8.144.576 16.234.688 24.187l22.906 13.03l-15.47 27.94l114.97 15.124z"/></symbol>
<symbol id="pirate-hat" viewBox="0 0 512 512"><path fill="currentColor" d="M94.32 70.473c-12.257.27-25.32 12.332-36.568 29.64a146 146 0 0 1 19.855-12.115c-31.622 23.364-46.658 83.72-47.166 122.336C43.54 191.32 70.73 160.196 96 174.964c-28.952-6.018-47.296 38.325-56.428 58.606c22.808-9.36 39.494-24.152 72.428-24.523c-32.47 21.4-43.966 44.83-56.428 68.168c23.376-14.505 40.286-22.99 55.528-26.227c13.683-16.43 28.01-33.093 43.728-46.746c11.79-10.24 24.533-18.877 38.37-24.043c-16.805-46.114-42.764-88.828-89.626-107.49c-3-1.6-6.1-2.307-9.252-2.237zM207.578 194.64c-14.066 3.29-27.57 11.573-40.947 23.192c-17.53 15.227-34.353 35.82-50.868 55.703s-32.62 39.088-50.287 51.707c-13.545 9.674-29.157 15.164-45.014 12.565c2.883 14.468 9.866 33.213 19.38 50.42c12.655 22.886 30.036 43.342 44.482 50.59c6.637 3.328 12.566 3.416 21.23 1.243c8.662-2.173 19.453-6.957 32.762-12.52C164.934 416.41 201.78 402.6 256 402.6s91.066 13.81 117.686 24.94c13.31 5.563 24.1 10.347 32.763 12.52s14.59 2.085 21.228-1.244c14.446-7.247 31.827-27.703 44.482-50.59c9.514-17.206 16.497-35.95 19.38-50.42c-15.858 2.6-31.47-2.89-45.015-12.564c-17.667-12.62-33.772-31.823-50.287-51.707s-33.337-40.476-50.87-55.703c-13.376-11.62-26.88-19.902-40.946-23.193c3.024 13.966-.075 26.363-7.594 34.985c-10.06 11.535-25.643 16.307-40.828 16.307s-30.77-4.772-40.828-16.307c-7.52-8.622-10.618-21.02-7.594-34.986zm113.04 35.702c8.495-.304 17.71 10.54 7.925 22.465c16.326-15.08 30.872 6.004 13.81 13.808c-13.26 6.065-25.986 13.423-37.937 21.86a32.3 32.3 0 0 1 1.584 9.958c0 10.202-2.76 19.5-10.88 26.696l-1.18 1.055l-.047 1.582l-.11 4.397c13.784 10.594 29.233 19.1 46.635 25.016c20.08 6.825 5.405 31.39-15.922 15.912c18.035 18.658-6.53 32.908-14.275 14.275c-4.626-11.13-10.36-21.786-17.02-31.887l-.007.233c-1.505.906-4.646 2.64-9.295 4.308V340.6h-9.343v21.583c-3.997.946-6.635 1.68-11.875 1.94v-20.516h-11.344v20.565c-5-.19-7.527-.81-11.518-1.645V340.6h-9.344v20c-5.884-1.864-9.905-3.948-11.69-4.96l-.01-.298c-6.652 10.092-12.38 20.738-17.003 31.855c-7.746 18.632-32.31 4.384-14.274-14.275c-21.327 15.48-36.005-9.097-15.924-15.922c17.313-5.885 32.705-14.322 46.435-24.84l-.156-4.687l-.05-1.547l-1.152-1.032C208.72 317.74 206 308.48 206 298.396c0-3.362.53-6.647 1.533-9.798c-11.935-8.415-24.646-15.747-37.883-21.8c-17.063-7.806-2.527-28.89 13.8-13.812c-9.574-11.666-.968-22.302 7.364-22.474c3.52-.073 6.99 1.722 9.024 6.086c5.733 12.305 12.05 24.032 19.04 35.013c8.91-7.97 21.735-13.142 36.214-13.352H256c14.805 0 27.942 5.186 37.03 13.28c7.024-11.008 13.372-22.763 19.124-35.11c1.926-4.134 5.14-5.967 8.463-6.086zM224.7 293.228c-4.483.056-7.877 1.904-8.042 7.28c0 8.555 6.923 15.498 15.485 15.498c8.555 0 15.496-6.943 15.496-15.498c0 0-13.757-7.395-22.94-7.28zm62.624 0c-9.18-.116-22.937 7.28-22.937 7.28c0 8.555 6.94 15.498 15.496 15.498c8.555 0 15.484-6.943 15.484-15.498c-.164-5.376-3.56-7.224-8.043-7.28m-31.336 18.96l-7.994 17.84h15.988z"/></symbol>
<symbol id="planks" viewBox="0 0 512 512"><path fill="currentColor" d="M360.602 74.52L63.272 349.44h54.5l42.94-37.573l2.683 37.572h13.468l113.14-123.354c.983-12.407 6.178-21.43 13.087-26.443c6.91-5.017 13.84-6.686 19.08-8.633l62.687-68.35l13.266 12.168l-65.516 71.434l-1.826.76c-7.4 3.094-13.675 4.69-17.116 7.19c-3.44 2.497-5.765 5.124-5.875 15.702l-.036 3.447l-106.467 116.08h33.736L471.098 74.52h-72.37l.637.644l-193.668 191.188c-1.248 8.702-6.653 15.696-12.613 20.435c-6.888 5.477-14.79 9.182-21.656 12.89l-8.555-15.835c7.352-3.972 14.477-7.54 19.008-11.143c4.532-3.603 6.167-6.01 6.102-10.253l-.058-3.843L374.394 74.52zm99.843 40.25L243.357 367.58H225.13l-47.71 49.975l-13.02-12.43l35.846-37.545h-53.742l-1.287-18.05l-20.63 18.05h-18.04l-73.12 69.89h29.778c12.26-14.002 18.418-24.828 27.223-34.67c9.07-10.14 21.11-18.166 41.988-23.89l4.76 17.36c-18.702 5.126-26.09 10.433-33.332 18.53c-5.058 5.653-10.032 13.24-17.342 22.67H210.28l271.43-322.7zM129.97 403.682a9 9 0 0 1 8.202 13.287c-1.728 3.296-3.94 7.49-8.033 11.182c-4.094 3.692-10.005 6.357-17.07 7.06a9 9 0 1 1-1.78-17.913c4.02-.4 5.47-1.32 6.792-2.513c1.32-1.192 2.576-3.18 4.147-6.176a9 9 0 0 1 7.74-4.928z"/></symbol> <symbol id="planks" viewBox="0 0 512 512"><path fill="currentColor" d="M360.602 74.52L63.272 349.44h54.5l42.94-37.573l2.683 37.572h13.468l113.14-123.354c.983-12.407 6.178-21.43 13.087-26.443c6.91-5.017 13.84-6.686 19.08-8.633l62.687-68.35l13.266 12.168l-65.516 71.434l-1.826.76c-7.4 3.094-13.675 4.69-17.116 7.19c-3.44 2.497-5.765 5.124-5.875 15.702l-.036 3.447l-106.467 116.08h33.736L471.098 74.52h-72.37l.637.644l-193.668 191.188c-1.248 8.702-6.653 15.696-12.613 20.435c-6.888 5.477-14.79 9.182-21.656 12.89l-8.555-15.835c7.352-3.972 14.477-7.54 19.008-11.143c4.532-3.603 6.167-6.01 6.102-10.253l-.058-3.843L374.394 74.52zm99.843 40.25L243.357 367.58H225.13l-47.71 49.975l-13.02-12.43l35.846-37.545h-53.742l-1.287-18.05l-20.63 18.05h-18.04l-73.12 69.89h29.778c12.26-14.002 18.418-24.828 27.223-34.67c9.07-10.14 21.11-18.166 41.988-23.89l4.76 17.36c-18.702 5.126-26.09 10.433-33.332 18.53c-5.058 5.653-10.032 13.24-17.342 22.67H210.28l271.43-322.7zM129.97 403.682a9 9 0 0 1 8.202 13.287c-1.728 3.296-3.94 7.49-8.033 11.182c-4.094 3.692-10.005 6.357-17.07 7.06a9 9 0 1 1-1.78-17.913c4.02-.4 5.47-1.32 6.792-2.513c1.32-1.192 2.576-3.18 4.147-6.176a9 9 0 0 1 7.74-4.928z"/></symbol>
<symbol id="pocket-bow" viewBox="0 0 512 512"><path fill="currentColor" d="m77.85 11.848l9.535 70.648l-69.418-11.174l41.508 56.07l-11.127 322.715c-11.712 13.235-20.716 28.85-25.823 47.914c74.198-55.834 152.88-71.602 223.606-101.383l-35.913-35.914c-53.122 25.232-105.774 42.49-142.547 71.347l9.674-280.54l8.06 10.888l2.2 4.47h71.304L358.723 394.03c15.618-13.627 29.605-28.41 42.66-44.645l-229.877-193.78V84.226l-11.86-9.165l273.594-10.66c-29.99 36.36-46.84 89.07-71.39 142.416l36.558 36.56c29.22-70.24 45.014-148.09 100.262-221.507c-18.54 4.97-33.69 13.015-46.604 23.603l-.02-.506l-315.437 12.29zm24.613 42.638l50.355 38.916v54.795H99.236l-.607-.146l-38.357-50.988l49 7.89l-6.81-50.466zm248.103 167.48a369 369 0 0 1-26.586 37.727l30.727 25.903c11.16-8.75 22.568-17.176 34.06-25.432l-38.2-38.2zm100.006 89.74C414.826 368.52 375.184 412.43 315.88 447.67c59.143 20.683 118.488 37.302 178.8 43.98c-8.706-60.66-23.977-120.562-44.108-179.94zm-184.08 5.774c-13.42 10.98-27.58 21.186-42.414 30.674l37.47 37.47c8.748-14.57 18.62-27.954 29.327-40.43z"/></symbol> <symbol id="pocket-bow" viewBox="0 0 512 512"><path fill="currentColor" d="m77.85 11.848l9.535 70.648l-69.418-11.174l41.508 56.07l-11.127 322.715c-11.712 13.235-20.716 28.85-25.823 47.914c74.198-55.834 152.88-71.602 223.606-101.383l-35.913-35.914c-53.122 25.232-105.774 42.49-142.547 71.347l9.674-280.54l8.06 10.888l2.2 4.47h71.304L358.723 394.03c15.618-13.627 29.605-28.41 42.66-44.645l-229.877-193.78V84.226l-11.86-9.165l273.594-10.66c-29.99 36.36-46.84 89.07-71.39 142.416l36.558 36.56c29.22-70.24 45.014-148.09 100.262-221.507c-18.54 4.97-33.69 13.015-46.604 23.603l-.02-.506l-315.437 12.29zm24.613 42.638l50.355 38.916v54.795H99.236l-.607-.146l-38.357-50.988l49 7.89l-6.81-50.466zm248.103 167.48a369 369 0 0 1-26.586 37.727l30.727 25.903c11.16-8.75 22.568-17.176 34.06-25.432l-38.2-38.2zm100.006 89.74C414.826 368.52 375.184 412.43 315.88 447.67c59.143 20.683 118.488 37.302 178.8 43.98c-8.706-60.66-23.977-120.562-44.108-179.94zm-184.08 5.774c-13.42 10.98-27.58 21.186-42.414 30.674l37.47 37.47c8.748-14.57 18.62-27.954 29.327-40.43z"/></symbol>
<symbol id="pointy-hat" viewBox="0 0 512 512"><path fill="currentColor" d="M416.125 42.406c-57.576.457-104.863 25.804-144.813 64.875c-41.984 41.063-75 97.61-100 155.5c.78 4.503 3.06 8.946 7.094 13.658c5.158 6.024 13.183 12.113 23.188 17.593c20.01 10.962 47.79 19.545 75.5 24.47s55.505 6.21 75.156 3.438c9.825-1.386 17.538-3.91 21.813-6.563s4.916-3.957 4.812-6.625l.72-.03c-3.408-42.828-6-88.797.092-131.94c2.82-19.972 7.668-39.434 15.22-57.624c-31.573 31.44-62.918 65.425-86.844 94.72c35.418-70.2 86.2-121.398 141.125-168.97c-11.376-1.71-22.42-2.584-33.063-2.5zM155.21 238.994a407 407 0 0 0-13.334.131c-23.138.575-44.227 2.91-61.876 7.188c-23.532 5.703-40.466 14.888-48.78 26.03c-8.317 11.144-10.08 24.667-.97 45.532c32.86 75.263 117.185 130.26 207.844 148.594c90.66 18.33 186.108.147 242.28-66.75c13.59-16.185 15.297-29.312 9.938-43.22c-5.358-13.908-19.586-28.878-40.78-42.75c-14.745-9.65-32.683-18.737-52.75-27.03c1.506 22.59 3.555 44.877 5.124 65.967v.219c.607 11.402-5.49 21.585-14.344 27.938s-20.268 10.08-33.437 12.406c-26.337 4.654-60.026 3.398-93.344-2.188c-33.317-5.585-66.085-15.466-90.28-29.312c-12.097-6.923-22.145-14.85-28.875-24.47c-6.73-9.617-9.76-21.554-6.594-33.374l.095-.375l.125-.374c7.637-21.206 16.308-42.79 26.094-64.094a634 634 0 0 0-6.133-.068zm6.634 46.662A839 839 0 0 0 153.031 309c-1.595 6.246-.4 11.407 3.907 17.563c4.374 6.25 12.28 12.923 22.844 18.968c21.128 12.09 52.4 21.78 84.095 27.095c31.694 5.314 64.016 6.28 87 2.22c11.492-2.032 20.53-5.42 25.78-9.19c5.25-3.766 6.864-6.726 6.595-11.78c-.517-6.93-1.088-14.027-1.688-21.25c-7.448 4.03-16.47 6.367-26.718 7.813c-22.732 3.206-51.79 1.665-81.03-3.532c-29.242-5.196-58.5-14.055-81.22-26.5c-11.36-6.222-21.122-13.34-28.375-21.812a59 59 0 0 1-2.376-2.938z"/></symbol> <symbol id="pointy-hat" viewBox="0 0 512 512"><path fill="currentColor" d="M416.125 42.406c-57.576.457-104.863 25.804-144.813 64.875c-41.984 41.063-75 97.61-100 155.5c.78 4.503 3.06 8.946 7.094 13.658c5.158 6.024 13.183 12.113 23.188 17.593c20.01 10.962 47.79 19.545 75.5 24.47s55.505 6.21 75.156 3.438c9.825-1.386 17.538-3.91 21.813-6.563s4.916-3.957 4.812-6.625l.72-.03c-3.408-42.828-6-88.797.092-131.94c2.82-19.972 7.668-39.434 15.22-57.624c-31.573 31.44-62.918 65.425-86.844 94.72c35.418-70.2 86.2-121.398 141.125-168.97c-11.376-1.71-22.42-2.584-33.063-2.5zM155.21 238.994a407 407 0 0 0-13.334.131c-23.138.575-44.227 2.91-61.876 7.188c-23.532 5.703-40.466 14.888-48.78 26.03c-8.317 11.144-10.08 24.667-.97 45.532c32.86 75.263 117.185 130.26 207.844 148.594c90.66 18.33 186.108.147 242.28-66.75c13.59-16.185 15.297-29.312 9.938-43.22c-5.358-13.908-19.586-28.878-40.78-42.75c-14.745-9.65-32.683-18.737-52.75-27.03c1.506 22.59 3.555 44.877 5.124 65.967v.219c.607 11.402-5.49 21.585-14.344 27.938s-20.268 10.08-33.437 12.406c-26.337 4.654-60.026 3.398-93.344-2.188c-33.317-5.585-66.085-15.466-90.28-29.312c-12.097-6.923-22.145-14.85-28.875-24.47c-6.73-9.617-9.76-21.554-6.594-33.374l.095-.375l.125-.374c7.637-21.206 16.308-42.79 26.094-64.094a634 634 0 0 0-6.133-.068zm6.634 46.662A839 839 0 0 0 153.031 309c-1.595 6.246-.4 11.407 3.907 17.563c4.374 6.25 12.28 12.923 22.844 18.968c21.128 12.09 52.4 21.78 84.095 27.095c31.694 5.314 64.016 6.28 87 2.22c11.492-2.032 20.53-5.42 25.78-9.19c5.25-3.766 6.864-6.726 6.595-11.78c-.517-6.93-1.088-14.027-1.688-21.25c-7.448 4.03-16.47 6.367-26.718 7.813c-22.732 3.206-51.79 1.665-81.03-3.532c-29.242-5.196-58.5-14.055-81.22-26.5c-11.36-6.222-21.122-13.34-28.375-21.812a59 59 0 0 1-2.376-2.938z"/></symbol>
@ -188,6 +189,7 @@
<symbol id="sparkles" viewBox="0 0 512 512"><path fill="currentColor" d="M237.4 20.73c-6.1 42.1-26.8 64.2-63.9 64c31.6 4.5 63.8 8 63.9 64.07c-.6-46.1 24.5-63.07 64.1-64.07c-38-1.5-64.9-16.3-64.1-64m127.8 11.58c-9.1 14.25-20.8 21.29-38.9 10.28c14.9 11.79 18.6 24.76 10.2 38.97c8.9-11.18 17.5-22.73 39-10.27c-17.8-10.06-18.8-23.57-10.3-38.98M59.68 41.69c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.52c-.3-20.5 10.9-28.12 28.5-28.52c-16.9-.7-28.9-7.3-28.5-28.5M431 66.28c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.52c-.3-20.5 10.9-28.12 28.5-28.52c-16.9-.7-28.9-7.3-28.5-28.5M120.3 116.4c-15.8 53.7-47.76 48-79.35 43.4C76.6 170 90.3 197.1 84.28 239.2c12.66-46 42.62-52.6 79.42-43.4c-37.6-12.1-56.9-35.4-43.4-79.4m187 5c-8.8 61.6-39.3 94-93.6 93.7c46.2 6.5 93.6 11.7 93.6 93.7c-.8-67.3 35.9-92.2 93.8-93.7c-55.5-2.2-94.9-23.9-93.8-93.7m136.8 38.3c-13.1 21.6-29.5 28.8-49.7 20.1c16.3 9.7 33 19.1 20.1 49.6c10.3-25.2 27.9-28.7 49.7-20c-20.3-9.7-31.6-23.9-20.1-49.7M50.7 243.2c9.16 16.7 7.63 30.1-5.61 40c12.46-6.9 24.85-14.3 39.91 5.6c-12.57-16.2-8.2-29 5.61-40c-13.92 9.7-27.47 11.6-39.91-5.6m137.2.3c11.4 26.8-.5 41.3-21.7 50.9c22.7-8.5 40.8-4.5 50.9 21.7c-12.7-31.8 4.8-41.2 21.7-50.9c-21 8.5-37.8.9-50.9-21.7m228 12.6c-26.6 64.7-68.7 91.7-127.8 76.4c48.6 19.8 98.8 38.5 76.4 127.9c17.5-73.7 64.4-90.7 127.9-76.5c-59.9-17.5-96.9-52-76.5-127.8M99.94 295.5c15.66 57.8.86 98.1-47.32 118.5c43.46-11.8 87.38-25.2 118.68 47.4c-26.4-59.3-3.4-95.4 47.3-118.8c-50 19.2-93.1 15-118.66-47.1m169.36 61c-21.8 20.6-43 23.6-63.2 7.3c15.5 16.3 31.6 32.4 7.2 63.3c19.8-25.6 41.2-24.1 63.3-7.3c-20.2-17.4-28.6-37.5-7.3-63.3M443.2 404c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.5c-.3-20.5 10.9-28.1 28.5-28.5c-16.9-.7-28.9-7.3-28.5-28.5m-169.7 36c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.5c-.3-20.5 10.9-28.1 28.5-28.5c-16.9-.7-28.9-7.3-28.5-28.5"/></symbol> <symbol id="sparkles" viewBox="0 0 512 512"><path fill="currentColor" d="M237.4 20.73c-6.1 42.1-26.8 64.2-63.9 64c31.6 4.5 63.8 8 63.9 64.07c-.6-46.1 24.5-63.07 64.1-64.07c-38-1.5-64.9-16.3-64.1-64m127.8 11.58c-9.1 14.25-20.8 21.29-38.9 10.28c14.9 11.79 18.6 24.76 10.2 38.97c8.9-11.18 17.5-22.73 39-10.27c-17.8-10.06-18.8-23.57-10.3-38.98M59.68 41.69c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.52c-.3-20.5 10.9-28.12 28.5-28.52c-16.9-.7-28.9-7.3-28.5-28.5M431 66.28c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.52c-.3-20.5 10.9-28.12 28.5-28.52c-16.9-.7-28.9-7.3-28.5-28.5M120.3 116.4c-15.8 53.7-47.76 48-79.35 43.4C76.6 170 90.3 197.1 84.28 239.2c12.66-46 42.62-52.6 79.42-43.4c-37.6-12.1-56.9-35.4-43.4-79.4m187 5c-8.8 61.6-39.3 94-93.6 93.7c46.2 6.5 93.6 11.7 93.6 93.7c-.8-67.3 35.9-92.2 93.8-93.7c-55.5-2.2-94.9-23.9-93.8-93.7m136.8 38.3c-13.1 21.6-29.5 28.8-49.7 20.1c16.3 9.7 33 19.1 20.1 49.6c10.3-25.2 27.9-28.7 49.7-20c-20.3-9.7-31.6-23.9-20.1-49.7M50.7 243.2c9.16 16.7 7.63 30.1-5.61 40c12.46-6.9 24.85-14.3 39.91 5.6c-12.57-16.2-8.2-29 5.61-40c-13.92 9.7-27.47 11.6-39.91-5.6m137.2.3c11.4 26.8-.5 41.3-21.7 50.9c22.7-8.5 40.8-4.5 50.9 21.7c-12.7-31.8 4.8-41.2 21.7-50.9c-21 8.5-37.8.9-50.9-21.7m228 12.6c-26.6 64.7-68.7 91.7-127.8 76.4c48.6 19.8 98.8 38.5 76.4 127.9c17.5-73.7 64.4-90.7 127.9-76.5c-59.9-17.5-96.9-52-76.5-127.8M99.94 295.5c15.66 57.8.86 98.1-47.32 118.5c43.46-11.8 87.38-25.2 118.68 47.4c-26.4-59.3-3.4-95.4 47.3-118.8c-50 19.2-93.1 15-118.66-47.1m169.36 61c-21.8 20.6-43 23.6-63.2 7.3c15.5 16.3 31.6 32.4 7.2 63.3c19.8-25.6 41.2-24.1 63.3-7.3c-20.2-17.4-28.6-37.5-7.3-63.3M443.2 404c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.5c-.3-20.5 10.9-28.1 28.5-28.5c-16.9-.7-28.9-7.3-28.5-28.5m-169.7 36c-2.7 18.8-12 28.6-28.5 28.5c14.1 2 28.4 3.6 28.5 28.5c-.3-20.5 10.9-28.1 28.5-28.5c-16.9-.7-28.9-7.3-28.5-28.5"/></symbol>
<symbol id="spears" viewBox="0 0 512 512"><path fill="currentColor" d="m433.877 19.855l-78.62 158.668l47.82 53.934l-15.673 260.824h38.79l15.697-261.233l51.04-45.25l-59.053-166.942zm-130.48 20.598L216.073 152.55l28.397 49.186l-28.616 106.387l-.102-.176l-9.545 35.62l.076.134l-40.234 149.58h32.68l29.676-111.186l.026.045l9.527-35.556l-.054-.09L274.56 209.15l48.415-27.95L303.4 40.452h-.002zM111.632 153.21l14.48 116.54l44.42 11.904L193 320.648l9.555-35.66l-9.256-16.1l12.022-44.87l-93.69-70.81zm-49.357 74.31l-42.68 79.31l23.57 28.455L30.786 493.28h18.746L61.83 336.26l27.608-22.865zh-.002zm257.06 10.878l-22.354 87.248l29.686 21.932L345.04 493.28h18.84l-18.823-149.235l21.293-28.824zm175.103 28.614l-40.108 226.27h18.98l21.128-119.188zm-339.903 38.886l-55.35 71.05l18.618 32.247l-20.41 84.086h19.233l19.51-80.385l30.81-17.788l-12.408-89.21h-.002zm96.623 63.645l-9.517 35.516l50.837 88.22h29.8z"/></symbol> <symbol id="spears" viewBox="0 0 512 512"><path fill="currentColor" d="m433.877 19.855l-78.62 158.668l47.82 53.934l-15.673 260.824h38.79l15.697-261.233l51.04-45.25l-59.053-166.942zm-130.48 20.598L216.073 152.55l28.397 49.186l-28.616 106.387l-.102-.176l-9.545 35.62l.076.134l-40.234 149.58h32.68l29.676-111.186l.026.045l9.527-35.556l-.054-.09L274.56 209.15l48.415-27.95L303.4 40.452h-.002zM111.632 153.21l14.48 116.54l44.42 11.904L193 320.648l9.555-35.66l-9.256-16.1l12.022-44.87l-93.69-70.81zm-49.357 74.31l-42.68 79.31l23.57 28.455L30.786 493.28h18.746L61.83 336.26l27.608-22.865zh-.002zm257.06 10.878l-22.354 87.248l29.686 21.932L345.04 493.28h18.84l-18.823-149.235l21.293-28.824zm175.103 28.614l-40.108 226.27h18.98l21.128-119.188zm-339.903 38.886l-55.35 71.05l18.618 32.247l-20.41 84.086h19.233l19.51-80.385l30.81-17.788l-12.408-89.21h-.002zm96.623 63.645l-9.517 35.516l50.837 88.22h29.8z"/></symbol>
<symbol id="spectre" viewBox="0 0 512 512"><path fill="currentColor" d="M282.83 18.877c21.567 6.146 36.328 15.205 40.572 28.77a71 71 0 0 0-4.066 2.363c-25.655 5.807-53.084 18.634-81.047 34.363c20.225-4.69 36.705-4.42 47.544 3.324c-5.712 10.3-10.797 22.294-15.123 36.06c-21.343 67.922-125.678-80.577-189.065-5.255C41.47 166.24 92.702 212.342 26.5 294.29c35.583-4.14 45.11-9.47 62.416-36.21c10.44-16.13 28.52-22.1 44.668-21.45c-12.718 11.206-25.786 30.354-38.21 59.895c19.832-18.528 44.927-38.68 71.603-40.005c.912 6.354-2.408 13.74-12.008 21.418C93.21 327.327 15.58 364.185 19.83 476.504c5.558-11.267 11.646-20.31 17.574-28.617c5.98 29.582 28.2 53.8 92.99 40.482c-46.928-6.407-76.268-59.586-45.355-82.528c62.716-46.544 128.82 1.436 269.9-75.342a80 80 0 0 1 7.164-3.46c-2.246 19.6-12.367 39.84-22.362 57.14c14.26-10.38 25.415-20.147 33.928-29.262c2.14 26.14-11.748 54.65-25.393 78.268c43.26-31.49 61.19-57.976 63.207-78.422c9.334 36.678-1.895 95.547-25.03 123.492c77.553-39.433 106.608-77.127 109.76-190.664c1.662-59.824-66.23-60.536-56.435-101.344c11.945-49.756 6.768-84.69-7.565-107.947c-19.6-49.73-79.99-59.74-149.385-59.423zM89.8 47.684C54.69 47.534 45.233 83.056 55.724 117c17.146-51.504 70.414-44.24 111.17-34.367c-33.282-25.005-58.707-34.87-77.096-34.95zm254.595 30.742c18.643 21.37 29.373 43.02 10.105 65.732c-26.562-16.677-26.985-39.252-10.105-65.732m74.494 48.6c3.655-.013 7.78.35 12.473 1.09c-1.706 30.506-14.4 33-46.634 32.154c8.335-22.146 14.416-33.176 34.16-33.245zm-84.677 40.316c9.652.1 20.258 2.84 30.598 8.918c44.65 26.246 21.934 73.314-4.1 74.78c-15.174.855 1.443-23.842-16.17-38.476c-15.258-12.678-38.596 12.53-45.204-5.78c-8.218-22.693 10.21-39.696 34.877-39.442zm60.18 246.168c-24.195 27.825-58.89 60.1-99.444 31.41c16.625 45.643 68.87 70.465 99.443-31.41z"/></symbol> <symbol id="spectre" viewBox="0 0 512 512"><path fill="currentColor" d="M282.83 18.877c21.567 6.146 36.328 15.205 40.572 28.77a71 71 0 0 0-4.066 2.363c-25.655 5.807-53.084 18.634-81.047 34.363c20.225-4.69 36.705-4.42 47.544 3.324c-5.712 10.3-10.797 22.294-15.123 36.06c-21.343 67.922-125.678-80.577-189.065-5.255C41.47 166.24 92.702 212.342 26.5 294.29c35.583-4.14 45.11-9.47 62.416-36.21c10.44-16.13 28.52-22.1 44.668-21.45c-12.718 11.206-25.786 30.354-38.21 59.895c19.832-18.528 44.927-38.68 71.603-40.005c.912 6.354-2.408 13.74-12.008 21.418C93.21 327.327 15.58 364.185 19.83 476.504c5.558-11.267 11.646-20.31 17.574-28.617c5.98 29.582 28.2 53.8 92.99 40.482c-46.928-6.407-76.268-59.586-45.355-82.528c62.716-46.544 128.82 1.436 269.9-75.342a80 80 0 0 1 7.164-3.46c-2.246 19.6-12.367 39.84-22.362 57.14c14.26-10.38 25.415-20.147 33.928-29.262c2.14 26.14-11.748 54.65-25.393 78.268c43.26-31.49 61.19-57.976 63.207-78.422c9.334 36.678-1.895 95.547-25.03 123.492c77.553-39.433 106.608-77.127 109.76-190.664c1.662-59.824-66.23-60.536-56.435-101.344c11.945-49.756 6.768-84.69-7.565-107.947c-19.6-49.73-79.99-59.74-149.385-59.423zM89.8 47.684C54.69 47.534 45.233 83.056 55.724 117c17.146-51.504 70.414-44.24 111.17-34.367c-33.282-25.005-58.707-34.87-77.096-34.95zm254.595 30.742c18.643 21.37 29.373 43.02 10.105 65.732c-26.562-16.677-26.985-39.252-10.105-65.732m74.494 48.6c3.655-.013 7.78.35 12.473 1.09c-1.706 30.506-14.4 33-46.634 32.154c8.335-22.146 14.416-33.176 34.16-33.245zm-84.677 40.316c9.652.1 20.258 2.84 30.598 8.918c44.65 26.246 21.934 73.314-4.1 74.78c-15.174.855 1.443-23.842-16.17-38.476c-15.258-12.678-38.596 12.53-45.204-5.78c-8.218-22.693 10.21-39.696 34.877-39.442zm60.18 246.168c-24.195 27.825-58.89 60.1-99.444 31.41c16.625 45.643 68.87 70.465 99.443-31.41z"/></symbol>
<symbol id="spider-alt" viewBox="0 0 512 512"><path fill="currentColor" d="M255.9 20.45c-54.1 0-98 93.45-98 146.85c0 31 14.9 58.6 37.9 76.3c5.9-6.9 12.2-12.9 19-17.7c13.7-7.9 27.8-13.9 41.1-14.1c14.4 0 28.4 5 41.2 14.1c6.7 4.8 13.1 10.8 19 17.7c23-17.7 37.8-45.3 37.8-76.3c0-53.4-43.9-146.85-98-146.85m236.9 14.27L419.3 208.1L329.2 262c3.2 5.2 6 10.6 8.6 16.2l96.1-57.4l58.9-139.03zm-473.72 0v47.05L78.01 220.8L174.1 278c2.6-5.6 5.5-11 8.6-16.2l-90.13-53.7zM255.9 227.8c-10.7 0-21.3 3.6-31.8 11.1c-10.8 8.9-19.9 19-26.1 28.6c-14.9 23.5-24 54.4-24 81.5c0 26.6 8.4 47.2 24 61c14 12.4 33.8 19.3 57.9 19.3s43.9-6.9 58-19.3c15.5-13.8 24-34.4 24-61c0-27.1-9.1-58-24.1-81.5c-7.8-12.3-16.6-21.9-26-28.6c-10.5-6.2-21.5-10.9-31.9-11.1M19.08 238.5v23.4l64.42 51.2l76.6 10.6q1.5-9 3.9-18l-73-10.1zm473.72 0l-71.9 57.1l-73.1 10.2c1.7 5.9 3 11.9 4 18l76.6-10.7l64.4-51.2zM353.7 355.1c-.3 6.4-1 12.5-2.2 18.3l69 15.1l72.3 58.1v-23.5l-64.1-51.6c-25-5.5-50-10.9-75-16.4m-195.6.1l-74.92 16.3l-64.11 51.6v23.5l72.24-58.1l69.09-15c-1.1-6.4-2-12.8-2.3-18.3m44.4 6.6c5.6 0 10.1 4.5 10.1 10.1c0 5.5-4.5 10-10.1 10s-10.1-4.5-10.1-10c0-5.6 4.5-10.1 10.1-10.1m107.1 0c5.6 0 10.1 4.5 10.1 10.1c0 5.5-4.5 10-10.1 10s-10.1-4.5-10.1-10c0-5.6 4.5-10.1 10.1-10.1m-74.8 11.3c9.3 0 16.9 7.6 16.9 16.8c0 9.3-7.6 16.9-16.9 16.9c-9.4 0-16.9-7.6-16.9-16.9c0-9.2 7.5-16.8 16.9-16.8m42.5 0c9.4 0 16.9 7.6 16.9 16.8c0 9.3-7.5 16.9-16.9 16.9c-9.3 0-16.9-7.6-16.9-16.9c0-9.2 7.6-16.8 16.9-16.8m64.4 27.3c-3 5.4-6.6 10.5-10.7 15.1l51.1 27.1l27.5 51h20.9L395.6 429c-18-9.5-35.9-19.1-53.9-28.6m-171.5.1l-54 28.5l-34.82 64.7h20.82l27.5-51.1l51.2-27c-4.1-5-8-10.3-10.7-15.1m30.2 25.3c-4.4.1-9.5 2.3-14.9 7.7c-3.8 7.8-5.9 16.5-5.9 25.7c0 16.5 6.8 31.4 17.8 42.5v-4c0-20.8 7.7-39.3 19.6-50.8c0-10.8-6.7-21.2-16.5-21.1zm111.1 0c-9.8-.1-16.6 10.3-16.6 21.1c11.9 11.5 19.6 30 19.6 50.8v4c11-11.1 17.8-26 17.8-42.5c0-9.2-2.1-17.9-5.9-25.7c-5.4-5.4-10.5-7.6-14.9-7.7m-70.3 14.1c-1.6.1-3.4.9-5.3 2.8c-1.4 2.8-2.1 5.9-2.1 9.2c0 5.9 2.4 11.3 6.4 15.3c-.1-.5-.1-1-.1-1.5c0-7.4 2.8-14.1 7.1-18.2c-.9-3.9-2.7-7.5-6-7.6m29.7 0c-3.6 0-6 3.7-6 7.6c4.3 4.1 7.1 10.8 7.1 18.2c0 .5 0 1-.1 1.5c4-4 6.4-9.4 6.4-15.3c0-3.3-.7-6.4-2.1-9.2c-1.6-1.3-3.5-2.7-5.3-2.8"/></symbol>
<symbol id="spider-face" viewBox="0 0 512 512"><path fill="currentColor" d="M16 17.188v236.656c0 20.48 19.324 40.365 48.156 57.47c11.504-6.066 23.26-9.564 34.813-9.564c29.023 0 53.453 20.3 62.093 48.188c1.888.495 3.752.863 5.625 1.343c13.824-9.92 26.255-12.217 34.687-12.217c17.552 0 33.037 9.688 42.125 24.312c4.288.208 8.717.53 12.78.53c4.177 0 8.507-.18 12.94-.436c9.087-14.69 24.586-24.408 42.186-24.408c8.08 0 19.85 2.198 32.97 11.094c2.655-.736 5.296-1.576 7.968-2.344c9.216-26.784 33.18-46.03 61.47-46.03c10.27 0 20.71 2.715 30.998 7.53C475.325 291.6 496 271.923 496 253.97V17.187zm67.53 126.28c20.72 0 37.5 16.796 37.5 37.532c0 20.72-16.78 37.5-37.5 37.5S46 201.72 46 181s16.81-37.53 37.53-37.53zm345.126 0c20.72 0 37.53 16.796 37.53 37.532c.002 20.72-16.81 37.5-37.53 37.5s-37.53-16.78-37.53-37.5s16.81-37.53 37.53-37.53zM76.97 155.282c-9.112 0-16.5 7.39-16.5 16.5c0 9.112 7.388 16.5 16.5 16.5c9.11 0 16.5-7.388 16.5-16.5c0-9.11-7.39-16.5-16.5-16.5m345.124 0c-9.11 0-16.5 7.39-16.5 16.5c0 9.112 7.39 16.5 16.5 16.5s16.5-7.388 16.5-16.5c0-9.11-7.39-16.5-16.5-16.5m-241.03 11.97c33.135 0 60 26.848 60 60c.014 33.136-26.85 60.03-60 60.03c-33.137 0-60.033-26.894-60.033-60.03s26.897-60 60.032-60zm150.06 0c33.137 0 60 26.848 60 60c.017 33.136-26.847 60.03-60 60.03c-33.135 0-60.03-26.894-60.03-60.03s26.895-60 60.03-60M170.563 182.5c-16.577 0-30.03 13.423-30.03 30s13.453 30.03 30.03 30.03s30-13.453 30-30.03s-13.422-30-30-30m150.032 0c-16.578 0-30 13.423-30 30s13.422 30.03 30 30.03s30.03-13.453 30.03-30.03s-13.453-30-30.03-30M100.03 193.563c-3.63 0-6.593 2.96-6.593 6.593s2.962 6.563 6.594 6.563s6.564-2.932 6.564-6.564s-2.93-6.594-6.563-6.594zm345.126 0c-3.632 0-6.594 2.96-6.594 6.593s2.962 6.563 6.594 6.563s6.563-2.932 6.563-6.564s-2.932-6.594-6.564-6.594zM207.47 242.875c-8.29 0-15 6.71-15 15s6.71 15.03 15 15.03c8.287 0 15-6.74 15-15.03s-6.713-15-15-15m150.06 0c-8.287 0-15.03 6.71-15.03 15s6.743 15.03 15.03 15.03c8.29 0 15-6.74 15-15.03s-6.71-15-15-15m56.314 81.375c-25.584 0-43.156 23.245-43.156 47.47c31.408 25.71 51.75 67.292 51.75 114.092c0 3.008-.06 6.008-.157 9c29.105-24.928 46.94-58.54 46.94-95.5c0-20.624-5.565-40.165-15.533-57.78c-14.368-12.257-27.955-17.282-39.843-17.282zM99 324.28c-11.872 0-25.49 4.995-39.875 17.25c-9.968 17.617-15.5 37.19-15.5 57.814c0 36.944 17.818 70.556 46.906 95.5c-.11-2.976-.155-5.992-.155-9c0-46.8 20.373-88.398 51.78-114.094c.017-24.24-17.57-47.47-43.155-47.47zm102.406 35.845c-8.144 0-17.488 3.5-27.344 12.125c-6.832 12.4-10.656 26.175-10.656 40.688c0 26.016 12.25 49.666 32.22 67.218c-.08-2.096-.126-4.2-.126-6.312c0-32.944 13.98-62.217 35.53-80.313c0-17.023-12.072-33.405-29.624-33.405zm110.03 0c-17.55 0-29.623 16.382-29.623 33.438c21.552 18.096 35.5 47.352 35.5 80.312c0 2.112-.014 4.216-.094 6.313c19.967-17.568 32.217-41.203 32.217-67.22c0-14.51-3.808-28.287-10.656-40.687c-9.855-8.623-19.182-12.17-27.342-12.155z"/></symbol> <symbol id="spider-face" viewBox="0 0 512 512"><path fill="currentColor" d="M16 17.188v236.656c0 20.48 19.324 40.365 48.156 57.47c11.504-6.066 23.26-9.564 34.813-9.564c29.023 0 53.453 20.3 62.093 48.188c1.888.495 3.752.863 5.625 1.343c13.824-9.92 26.255-12.217 34.687-12.217c17.552 0 33.037 9.688 42.125 24.312c4.288.208 8.717.53 12.78.53c4.177 0 8.507-.18 12.94-.436c9.087-14.69 24.586-24.408 42.186-24.408c8.08 0 19.85 2.198 32.97 11.094c2.655-.736 5.296-1.576 7.968-2.344c9.216-26.784 33.18-46.03 61.47-46.03c10.27 0 20.71 2.715 30.998 7.53C475.325 291.6 496 271.923 496 253.97V17.187zm67.53 126.28c20.72 0 37.5 16.796 37.5 37.532c0 20.72-16.78 37.5-37.5 37.5S46 201.72 46 181s16.81-37.53 37.53-37.53zm345.126 0c20.72 0 37.53 16.796 37.53 37.532c.002 20.72-16.81 37.5-37.53 37.5s-37.53-16.78-37.53-37.5s16.81-37.53 37.53-37.53zM76.97 155.282c-9.112 0-16.5 7.39-16.5 16.5c0 9.112 7.388 16.5 16.5 16.5c9.11 0 16.5-7.388 16.5-16.5c0-9.11-7.39-16.5-16.5-16.5m345.124 0c-9.11 0-16.5 7.39-16.5 16.5c0 9.112 7.39 16.5 16.5 16.5s16.5-7.388 16.5-16.5c0-9.11-7.39-16.5-16.5-16.5m-241.03 11.97c33.135 0 60 26.848 60 60c.014 33.136-26.85 60.03-60 60.03c-33.137 0-60.033-26.894-60.033-60.03s26.897-60 60.032-60zm150.06 0c33.137 0 60 26.848 60 60c.017 33.136-26.847 60.03-60 60.03c-33.135 0-60.03-26.894-60.03-60.03s26.895-60 60.03-60M170.563 182.5c-16.577 0-30.03 13.423-30.03 30s13.453 30.03 30.03 30.03s30-13.453 30-30.03s-13.422-30-30-30m150.032 0c-16.578 0-30 13.423-30 30s13.422 30.03 30 30.03s30.03-13.453 30.03-30.03s-13.453-30-30.03-30M100.03 193.563c-3.63 0-6.593 2.96-6.593 6.593s2.962 6.563 6.594 6.563s6.564-2.932 6.564-6.564s-2.93-6.594-6.563-6.594zm345.126 0c-3.632 0-6.594 2.96-6.594 6.593s2.962 6.563 6.594 6.563s6.563-2.932 6.563-6.564s-2.932-6.594-6.564-6.594zM207.47 242.875c-8.29 0-15 6.71-15 15s6.71 15.03 15 15.03c8.287 0 15-6.74 15-15.03s-6.713-15-15-15m150.06 0c-8.287 0-15.03 6.71-15.03 15s6.743 15.03 15.03 15.03c8.29 0 15-6.74 15-15.03s-6.71-15-15-15m56.314 81.375c-25.584 0-43.156 23.245-43.156 47.47c31.408 25.71 51.75 67.292 51.75 114.092c0 3.008-.06 6.008-.157 9c29.105-24.928 46.94-58.54 46.94-95.5c0-20.624-5.565-40.165-15.533-57.78c-14.368-12.257-27.955-17.282-39.843-17.282zM99 324.28c-11.872 0-25.49 4.995-39.875 17.25c-9.968 17.617-15.5 37.19-15.5 57.814c0 36.944 17.818 70.556 46.906 95.5c-.11-2.976-.155-5.992-.155-9c0-46.8 20.373-88.398 51.78-114.094c.017-24.24-17.57-47.47-43.155-47.47zm102.406 35.845c-8.144 0-17.488 3.5-27.344 12.125c-6.832 12.4-10.656 26.175-10.656 40.688c0 26.016 12.25 49.666 32.22 67.218c-.08-2.096-.126-4.2-.126-6.312c0-32.944 13.98-62.217 35.53-80.313c0-17.023-12.072-33.405-29.624-33.405zm110.03 0c-17.55 0-29.623 16.382-29.623 33.438c21.552 18.096 35.5 47.352 35.5 80.312c0 2.112-.014 4.216-.094 6.313c19.967-17.568 32.217-41.203 32.217-67.22c0-14.51-3.808-28.287-10.656-40.687c-9.855-8.623-19.182-12.17-27.342-12.155z"/></symbol>
<symbol id="spiked-tail" viewBox="0 0 512 512"><path fill="currentColor" d="M19.297 16.27v113.06L266.15 263.12L132.357 16.27zm134.318 0l158.947 293.263L19.298 150.586v35.9l39.24 24.815l25.9 162.188l18.735-133.963l82.383 52.094l21.43 134.204l15.503-110.85l75.72 47.88l17.263 108.095l12.49-89.282l61.923 39.158l12.6 78.914l9.117-65.18l70.68 44.694l-45.186-71.46l66.656-9.32l-80.7-12.888l-38.847-61.434l90.758-12.693l-109.88-17.548l-47.57-75.228l112.326-15.71l-135.992-21.716l-51.783-81.89l135.432-18.94l-163.965-26.184l-24.013-37.974h-35.9zm223.877 64.158l.006.002v-.002z"/></symbol> <symbol id="spiked-tail" viewBox="0 0 512 512"><path fill="currentColor" d="M19.297 16.27v113.06L266.15 263.12L132.357 16.27zm134.318 0l158.947 293.263L19.298 150.586v35.9l39.24 24.815l25.9 162.188l18.735-133.963l82.383 52.094l21.43 134.204l15.503-110.85l75.72 47.88l17.263 108.095l12.49-89.282l61.923 39.158l12.6 78.914l9.117-65.18l70.68 44.694l-45.186-71.46l66.656-9.32l-80.7-12.888l-38.847-61.434l90.758-12.693l-109.88-17.548l-47.57-75.228l112.326-15.71l-135.992-21.716l-51.783-81.89l135.432-18.94l-163.965-26.184l-24.013-37.974h-35.9zm223.877 64.158l.006.002v-.002z"/></symbol>
<symbol id="spinning-blades" viewBox="0 0 512 512"><path fill="currentColor" d="M440.375 17.094c7.244 33.827-9.717 62.662-30.344 72.656c-40.512-39.534-95.873-63.906-156.874-63.906c-124 0-224.72 100.72-224.72 224.72a226 226 0 0 0 2.94 36.28c5.123-22.73 11.156-44.567 17.843-65.72c.002-.008-.004-.02 0-.03C63.49 121.188 149.265 44.53 253.155 44.53c54.75 0 104.47 21.3 141.344 56.064c-1.904 7.596-4.423 15.604-7.47 23.875c-32.876-33.995-78.9-55.19-129.842-55.19c-86.62 0-159.115 61.164-176.657 142.595l3.75 7.78c10.117-16.993 20.68-33.225 31.532-48.936c27.73-49.41 80.598-82.75 141.375-82.75c48.77 0 92.437 21.46 122.125 55.468a376 376 0 0 1-11.406 23.468c-24.99-34.106-65.29-56.312-110.72-56.312c-60.896 0-112.65 39.874-130.56 94.875l.374 1.968c14.06-14.37 28.43-27.556 43-40c21.655-23.47 52.667-38.157 87.188-38.157c42.452 0 79.623 22.21 100.562 55.657c-14.732 24.656-32.192 47.79-50.125 64.97l-18.938-14.626l-11.406 14.814l23.158 17.875l-46.72 60.405l14.782 11.438l46.75-60.407l23.188 17.906l11.406-14.812l-20.938-16.156c11.89-21.11 35.404-29.97 46.125-14.844c74.936-51.748 179.996-131.883 65.345-234.406zM241.937 172.72l-46.75 60.436L172 215.25l-11.406 14.78l20.937 16.19c-11.89 21.11-35.402 29.968-46.124 14.843C60.472 312.81-44.59 392.945 70.062 495.469c-7.92-36.983 13.087-67.99 36.188-74.94c39.41 34.102 90.772 54.75 146.906 54.75c124 0 224.72-100.72 224.72-224.717c0-11.354-.84-22.503-2.47-33.407c-5.543 24.092-12.11 47.15-19.375 69.5c-17.035 96.65-101.29 169.938-202.874 169.938c-51.942 0-99.347-19.163-135.562-50.813c2.672-9.376 6.182-19.278 10.406-29.436c32.822 33.565 78.604 54.406 129.188 54.406c82.997 0 153.034-56.144 174.187-132.47L426 287.095c-10.52 17.824-21.513 34.807-32.844 51.22c-28.88 44.414-78.95 73.748-135.97 73.748c-48.1 0-91.25-20.868-120.905-54.062a396 396 0 0 1 13.282-25.063c25.165 31.768 64.04 52.188 107.625 52.188c55.623 0 103.587-33.243 125.125-80.906L380.344 294c-12.463 13.042-25.167 25.128-38.063 36.53c-21.528 22.162-51.676 35.908-85.092 35.908c-40.265 0-75.76-19.976-97.188-50.563c13.052-20.2 27.723-38.827 42.78-53.25l18.97 14.656l11.406-14.81l-23.187-17.908l46.75-60.406z"/></symbol> <symbol id="spinning-blades" viewBox="0 0 512 512"><path fill="currentColor" d="M440.375 17.094c7.244 33.827-9.717 62.662-30.344 72.656c-40.512-39.534-95.873-63.906-156.874-63.906c-124 0-224.72 100.72-224.72 224.72a226 226 0 0 0 2.94 36.28c5.123-22.73 11.156-44.567 17.843-65.72c.002-.008-.004-.02 0-.03C63.49 121.188 149.265 44.53 253.155 44.53c54.75 0 104.47 21.3 141.344 56.064c-1.904 7.596-4.423 15.604-7.47 23.875c-32.876-33.995-78.9-55.19-129.842-55.19c-86.62 0-159.115 61.164-176.657 142.595l3.75 7.78c10.117-16.993 20.68-33.225 31.532-48.936c27.73-49.41 80.598-82.75 141.375-82.75c48.77 0 92.437 21.46 122.125 55.468a376 376 0 0 1-11.406 23.468c-24.99-34.106-65.29-56.312-110.72-56.312c-60.896 0-112.65 39.874-130.56 94.875l.374 1.968c14.06-14.37 28.43-27.556 43-40c21.655-23.47 52.667-38.157 87.188-38.157c42.452 0 79.623 22.21 100.562 55.657c-14.732 24.656-32.192 47.79-50.125 64.97l-18.938-14.626l-11.406 14.814l23.158 17.875l-46.72 60.405l14.782 11.438l46.75-60.407l23.188 17.906l11.406-14.812l-20.938-16.156c11.89-21.11 35.404-29.97 46.125-14.844c74.936-51.748 179.996-131.883 65.345-234.406zM241.937 172.72l-46.75 60.436L172 215.25l-11.406 14.78l20.937 16.19c-11.89 21.11-35.402 29.968-46.124 14.843C60.472 312.81-44.59 392.945 70.062 495.469c-7.92-36.983 13.087-67.99 36.188-74.94c39.41 34.102 90.772 54.75 146.906 54.75c124 0 224.72-100.72 224.72-224.717c0-11.354-.84-22.503-2.47-33.407c-5.543 24.092-12.11 47.15-19.375 69.5c-17.035 96.65-101.29 169.938-202.874 169.938c-51.942 0-99.347-19.163-135.562-50.813c2.672-9.376 6.182-19.278 10.406-29.436c32.822 33.565 78.604 54.406 129.188 54.406c82.997 0 153.034-56.144 174.187-132.47L426 287.095c-10.52 17.824-21.513 34.807-32.844 51.22c-28.88 44.414-78.95 73.748-135.97 73.748c-48.1 0-91.25-20.868-120.905-54.062a396 396 0 0 1 13.282-25.063c25.165 31.768 64.04 52.188 107.625 52.188c55.623 0 103.587-33.243 125.125-80.906L380.344 294c-12.463 13.042-25.167 25.128-38.063 36.53c-21.528 22.162-51.676 35.908-85.092 35.908c-40.265 0-75.76-19.976-97.188-50.563c13.052-20.2 27.723-38.827 42.78-53.25l18.97 14.656l11.406-14.81l-23.187-17.908l46.75-60.406z"/></symbol>
@ -221,6 +223,7 @@
<symbol id="visored-helm" viewBox="0 0 512 512"><path fill="currentColor" d="M258.094 18.5c-74.34 0-138.073 62.498-156.188 148.438c52.758-7.697 102.23-22.044 153.938-45.094l4.125-1.813l3.967 2.064c49.424 25.667 97.648 41.026 150.657 46.406c-17.66-86.744-81.71-150-156.5-150zm1.28 122.156c-57.41 25.148-112.883 39.993-172.53 47c6.724 32.847 6.91 65.935-.5 98.938c89.29 41.602 231.648 43.154 340.594-.125c-10.762-32.516-11.727-65.66-1.188-98.408c-59.03-4.235-112.628-20.06-166.375-47.406zm-13.5 33.125h18.72v127.75h-18.72V173.78zm-58.78 11.19h18.687v101.655h-18.686V184.97zm115.72 0H321.5v101.655h-18.688V184.97zm-171.72 14.905h18.687v79.28h-18.686zm227.72 0H377.5v79.28h-18.688v-79.28zm38.748 116.75c-14.302 4.282-28.96 7.873-43.78 10.844l-19.22 64.06c26.114-17.337 48.002-43.31 63-74.905zm-277.53 2.875c13.95 28.257 33.448 51.85 56.562 68.53l-17.688-58.905c-13.397-2.61-26.387-5.826-38.875-9.625zm213.156 11.656c-51.63 8.175-104.745 8.588-153.72 1.438l20.845 69.5c18 8.52 37.49 13.187 57.78 13.187c18.588 0 36.507-3.92 53.22-11.124zm-195.5 47.156c-19.436 21.562-36.416 44.367-48.594 72.157c70.233-8.736 133.743 14.684 168.03 50.75c39.684-35.607 103.71-55.685 170.876-44.25c-15.08-29.372-33.32-51.982-53.938-74c-31.187 31.75-71.53 51-115.968 51c-46.568 0-88.65-21.142-120.406-55.658z"/></symbol> <symbol id="visored-helm" viewBox="0 0 512 512"><path fill="currentColor" d="M258.094 18.5c-74.34 0-138.073 62.498-156.188 148.438c52.758-7.697 102.23-22.044 153.938-45.094l4.125-1.813l3.967 2.064c49.424 25.667 97.648 41.026 150.657 46.406c-17.66-86.744-81.71-150-156.5-150zm1.28 122.156c-57.41 25.148-112.883 39.993-172.53 47c6.724 32.847 6.91 65.935-.5 98.938c89.29 41.602 231.648 43.154 340.594-.125c-10.762-32.516-11.727-65.66-1.188-98.408c-59.03-4.235-112.628-20.06-166.375-47.406zm-13.5 33.125h18.72v127.75h-18.72V173.78zm-58.78 11.19h18.687v101.655h-18.686V184.97zm115.72 0H321.5v101.655h-18.688V184.97zm-171.72 14.905h18.687v79.28h-18.686zm227.72 0H377.5v79.28h-18.688v-79.28zm38.748 116.75c-14.302 4.282-28.96 7.873-43.78 10.844l-19.22 64.06c26.114-17.337 48.002-43.31 63-74.905zm-277.53 2.875c13.95 28.257 33.448 51.85 56.562 68.53l-17.688-58.905c-13.397-2.61-26.387-5.826-38.875-9.625zm213.156 11.656c-51.63 8.175-104.745 8.588-153.72 1.438l20.845 69.5c18 8.52 37.49 13.187 57.78 13.187c18.588 0 36.507-3.92 53.22-11.124zm-195.5 47.156c-19.436 21.562-36.416 44.367-48.594 72.157c70.233-8.736 133.743 14.684 168.03 50.75c39.684-35.607 103.71-55.685 170.876-44.25c-15.08-29.372-33.32-51.982-53.938-74c-31.187 31.75-71.53 51-115.968 51c-46.568 0-88.65-21.142-120.406-55.658z"/></symbol>
<symbol id="war-pick" viewBox="0 0 512 512"><path fill="currentColor" d="M136.48 27.746c-2.108.024-4.174.152-6.242.272c42.927 23.035 87.233 59.434 121.902 96.57c8.66 9.276 12.358 18.765 16.371 27.44c2.486 5.37 5.173 10.658 9.297 16.37l30.65-26.373c-3.067-5.031-5.213-10.567-6.044-16.386c-.919-6.432.09-13.283 3.039-19.48c-32.92-24.035-68.653-47.25-102.75-62.026c-22.779-9.871-44.547-15.843-64.1-16.371q-1.07-.029-2.123-.016m226.463 99.256c-2.825 0-5.562.505-8.092 1.293l28.91 28.91c.788-2.53 1.293-5.266 1.293-8.092c0-6.485-2.314-12.726-5.85-16.262s-9.776-5.85-16.261-5.85zm-23.088 11.754l-21.89 18.836c9.951-2.533 20.985.059 28.712 7.787s10.32 18.761 7.788 28.713l18.835-21.89zm-14.39 35.78c-3.053 0-6.104 1.189-8.485 3.57c-4.762 4.761-4.762 12.208 0 16.97s12.21 4.762 16.97 0c4.763-4.762 4.763-12.209 0-16.97c-2.38-2.381-5.433-3.57-8.485-3.57m-27.582.335l-9.846 8.47l-5.352 46.03l46.03-5.352l8.468-9.841c-10.923 4.588-24.09 2.467-32.931-6.373c-8.842-8.842-10.959-22.01-6.37-32.934zm72.148 28.727l-26.373 30.65c5.712 4.124 11 6.812 16.371 9.297c8.674 4.013 18.163 7.711 27.44 16.37c37.136 34.67 73.534 78.977 96.57 121.903c1.254-21.638-4.803-46.36-16.115-72.465c-14.776-34.097-37.992-69.829-62.026-102.75c-6.198 2.95-13.049 3.958-19.48 3.04c-5.82-.832-11.355-2.978-16.387-6.045m-103.375 7.79l-28.398 26.588L274.08 273.8l26.588-28.399l-38.489 4.477zm-41.545 38.897l-11.686 10.941l37.405 37.405l10.941-11.686zm-24.832 23.252l-90.564 84.797l44.007 44.008l84.797-90.565zM96.566 370.643l-21.91 20.515l46.242 46.242l20.516-21.91zm-28.09 39.79l-5.656 16.971l21.832 21.832l16.97-5.656zm-18.789 29.295l-18.49 9.686a106 106 0 0 0-2.746 13.676c-.608 4.548-.852 9.29-.469 12.92s1.496 5.735 1.912 6.152c.417.417 2.523 1.53 6.153 1.912c3.63.383 8.372.139 12.92-.469a106 106 0 0 0 13.675-2.746l9.686-18.49z"/></symbol> <symbol id="war-pick" viewBox="0 0 512 512"><path fill="currentColor" d="M136.48 27.746c-2.108.024-4.174.152-6.242.272c42.927 23.035 87.233 59.434 121.902 96.57c8.66 9.276 12.358 18.765 16.371 27.44c2.486 5.37 5.173 10.658 9.297 16.37l30.65-26.373c-3.067-5.031-5.213-10.567-6.044-16.386c-.919-6.432.09-13.283 3.039-19.48c-32.92-24.035-68.653-47.25-102.75-62.026c-22.779-9.871-44.547-15.843-64.1-16.371q-1.07-.029-2.123-.016m226.463 99.256c-2.825 0-5.562.505-8.092 1.293l28.91 28.91c.788-2.53 1.293-5.266 1.293-8.092c0-6.485-2.314-12.726-5.85-16.262s-9.776-5.85-16.261-5.85zm-23.088 11.754l-21.89 18.836c9.951-2.533 20.985.059 28.712 7.787s10.32 18.761 7.788 28.713l18.835-21.89zm-14.39 35.78c-3.053 0-6.104 1.189-8.485 3.57c-4.762 4.761-4.762 12.208 0 16.97s12.21 4.762 16.97 0c4.763-4.762 4.763-12.209 0-16.97c-2.38-2.381-5.433-3.57-8.485-3.57m-27.582.335l-9.846 8.47l-5.352 46.03l46.03-5.352l8.468-9.841c-10.923 4.588-24.09 2.467-32.931-6.373c-8.842-8.842-10.959-22.01-6.37-32.934zm72.148 28.727l-26.373 30.65c5.712 4.124 11 6.812 16.371 9.297c8.674 4.013 18.163 7.711 27.44 16.37c37.136 34.67 73.534 78.977 96.57 121.903c1.254-21.638-4.803-46.36-16.115-72.465c-14.776-34.097-37.992-69.829-62.026-102.75c-6.198 2.95-13.049 3.958-19.48 3.04c-5.82-.832-11.355-2.978-16.387-6.045m-103.375 7.79l-28.398 26.588L274.08 273.8l26.588-28.399l-38.489 4.477zm-41.545 38.897l-11.686 10.941l37.405 37.405l10.941-11.686zm-24.832 23.252l-90.564 84.797l44.007 44.008l84.797-90.565zM96.566 370.643l-21.91 20.515l46.242 46.242l20.516-21.91zm-28.09 39.79l-5.656 16.971l21.832 21.832l16.97-5.656zm-18.789 29.295l-18.49 9.686a106 106 0 0 0-2.746 13.676c-.608 4.548-.852 9.29-.469 12.92s1.496 5.735 1.912 6.152c.417.417 2.523 1.53 6.153 1.912c3.63.383 8.372.139 12.92-.469a106 106 0 0 0 13.675-2.746l9.686-18.49z"/></symbol>
<symbol id="warhammer" viewBox="0 0 512 512"><path fill="currentColor" d="m351.4 31.4l-55.9 27.75l54 34.62zM143.2 67.33l20 33.47L182 71.5zm57 9.16l-7.6 11.82l100.2 64.19l-9.7 15.1l-100.2-64.1l-24.8 38.7l100.2 64.1l-9.7 15.2l-100.2-64.1l-7.5 11.7l150 96.1l37.9-7.6l44.8-70zm93.2 2.73l-16.2 25.28l38.7 24.7l16.2-25.2zM108.7 121.2l20 33.5l18.8-29.3zm280.1 76.1L346.7 263l11.8 7.5l42.1-65.7zm-224.1 8.5l.6 36l72.8 46.6l33-14.5zm250.4 9.9l-33.2 51.8c11.7 2.8 24 7.3 36.5 12.3c19.3 7.6 39.1 16.7 56.6 24c-9.5-27.2-22.2-57.9-59.9-88.1m-242.5 52.1L27.77 494h54.61L211.4 292.6z"/></symbol> <symbol id="warhammer" viewBox="0 0 512 512"><path fill="currentColor" d="m351.4 31.4l-55.9 27.75l54 34.62zM143.2 67.33l20 33.47L182 71.5zm57 9.16l-7.6 11.82l100.2 64.19l-9.7 15.1l-100.2-64.1l-24.8 38.7l100.2 64.1l-9.7 15.2l-100.2-64.1l-7.5 11.7l150 96.1l37.9-7.6l44.8-70zm93.2 2.73l-16.2 25.28l38.7 24.7l16.2-25.2zM108.7 121.2l20 33.5l18.8-29.3zm280.1 76.1L346.7 263l11.8 7.5l42.1-65.7zm-224.1 8.5l.6 36l72.8 46.6l33-14.5zm250.4 9.9l-33.2 51.8c11.7 2.8 24 7.3 36.5 12.3c19.3 7.6 39.1 16.7 56.6 24c-9.5-27.2-22.2-57.9-59.9-88.1m-242.5 52.1L27.77 494h54.61L211.4 292.6z"/></symbol>
<symbol id="wasp-sting" viewBox="0 0 512 512"><path fill="currentColor" d="M235.75 42.28c-.68.006-1.353.01-2.03.032c-3.1.11-6.195.404-9.25.907c-20.682 3.4-40.108 14.714-55.376 30.28c-18.356-6.394-37.205-10.75-56.656-12.563a78 78 0 0 0-6.844-.343a76 76 0 0 0-2.25.03c-20.82.524-38.94 9.602-52.53 23.063c-15.533 15.385-25.624 36.27-29.658 57.907c-4.033 21.638-2.052 44.237 8.125 62.906c10.178 18.67 29.117 32.835 55.532 36.094c36.828 4.544 70.415 5.794 103.72 4.594l.437.406l.374-.438c27.815-1.036 55.45-3.77 84.625-7.78c-.814 7.602.168 14.882 3.155 21.31c23.12 15.608 47.78 19.41 76.72 11.22a98.5 98.5 0 0 0 10.75-6.687c10.992-7.885 19.667-17.44 25.592-27.47c-10.102-20.476-13.347-41.67-9.656-62.53c-6.924-3.75-15.252-5.577-24.28-5.47c-.715.008-1.433.06-2.156.094c-16.59-32.33-35.69-63.26-60.063-95.563c-15.846-21-37.24-30.144-58.28-30zm2.188 18.532c14.892.16 28.934 6.522 41.156 22.72c22.482 29.797 40.225 58.18 55.75 87.812a88 88 0 0 0-8.313 3.062c-44.5-38.158-89.732-72.463-138.124-93.344c11.76-10.097 25.604-17.187 39.094-19.406c3.515-.578 7-.88 10.438-.843zm165 17.563l-6.625 17.47c30.865 11.68 52.434 36.81 64.5 67.25c-27.754-32.927-66.408-55.983-109.563-56.19l-.094 18.72c27.147.13 52.99 11.29 74.688 29.125c-10.274 5.33-19.327 12.764-27.094 22.438c-3.192 18.115.078 35.896 10.406 54.562c21.263 21.66 46.337 33.562 76.25 33.094c6.106-18.483 7.41-34.1 5.344-47.656c-2.258-58.64-30.98-117.305-87.813-138.813zm-291.782 1.188c69.776 6.655 133.8 50.255 197.97 104.593c-.27.19-.545.37-.813.563a99 99 0 0 0-3.657 2.78l-191.03-67.22l-2.47-40.718zM92.5 80.656l5.563 91.156l-59.094-23.343c.17-1.15.348-2.292.56-3.44c3.39-18.177 12.1-35.84 24.44-48.06c8.12-8.044 17.597-13.812 28.53-16.314zm22.375 59.844l109.656 38.594l-43.624 47.656c-8.55.216-17.118.268-25.78.125l-37.657-43.938zm-76.72 27.75l63.657 25.125l27.907 32.563c-13.784-.8-27.915-2.095-42.595-3.907c-21.254-2.62-33.857-12.56-41.438-26.468c-4.322-7.93-6.81-17.322-7.53-27.312zm397.5 4.813c.374-.02.75 0 1.126 0c12.082 0 21.876 9.794 21.876 21.875c0 12.082-9.794 21.875-21.875 21.875s-21.874-9.795-21.874-21.875c0-11.703 9.193-21.29 20.75-21.875zM242.782 185.53l47.032 16.532c-4.065 5.014-7.425 10.27-10 15.594c-25.21 3.637-48.96 6.376-72.468 7.906l36.094-39.437l-.657-.594zm19 85.157c-22.023 3.702-40.202 14.834-53.28 30.063c13.942 16.114 30.9 26.48 51.47 31.78c24.453 6.303 54.333 5.188 89.624-3.905c-1.118-13.518-6.158-25.815-20.72-36.125c-24.175.564-46.892-6.817-67.093-21.813zM197.595 316.5c-9.088 16.403-13.382 35.462-11.844 54.5c31.95 24.294 61.132 35.617 87.625 35.156c25.832-.45 50.003-11.76 73.594-35.875c.625-7.607 1.596-15.078 2.25-22.342c-35.35 8.516-66.727 9.7-93.94 2.687c-22.447-5.785-41.876-17.308-57.686-34.125zm149.562 78.97c-22.667 18.85-47.38 28.92-73.47 29.374c-26.433.46-53.628-8.724-81.498-26.53c10.815 26.82 35.084 50.75 75.968 63.31c22.05 3.672 40.392 3.026 54.906-1.437c16.862-5.183 28.98-15.113 37.688-31.312c-8.31-10.982-12.13-22.215-13.594-33.406zm150.406 12.655c-21.934 13.607-78.608 25.768-99.343 15.594c-4.52 19.162-15.06 21.715-23.47 18.28c-8.854 14.47-21.072 25.37-35.97 32.156c30.077 21.514 136.794 17.434 158.783-66.03"/></symbol>
<symbol id="water-tank" viewBox="0 0 512 512"><path fill="currentColor" d="M160 25c-14.5 0-38 3.89-56.7 11.36c-9.29 3.73-17.41 8.37-22.69 13.25A30 30 0 0 0 75.99 55H244c-1.2-1.77-2.6-3.55-4.6-5.39c-5.3-4.88-13.4-9.52-22.7-13.25C198 28.89 174.5 25 160 25M89 73v129.9l71 42.6l71-42.6V73zm167 78v18h23v14h-30v18h51.3l29.3 29.4l12.8-12.8l-34.7-34.6H297v-14h23v-18zM84.65 221.3L39.12 494.5l17.76 3L74.3 393h171.4l17.4 104.5l17.8-3l-45.5-273.2l-16.7 10l13.7 81.8l-72.4 26.4l-72.38-26.3l13.68-81.9zm263.15 22.4s-10.2 49.6 5.2 59.7c9.8 6.4 28.8-2.9 31-15.4c3.8-19.6-36.2-44.3-36.2-44.3M377 329s-13.4 29.1-5.8 38.5c4.9 5.9 17.4 3.7 20.6-3.6C397 352.3 377 329 377 329m-292.41 2.3l48.91 17.8l-55.22 20.1zm150.81 0l6.3 37.9l-55.2-20.1zm179 7.5s1.4 32.1 12.4 36.9c7.2 3 17.2-4.7 16.8-12.7c-.8-12.6-29.2-24.2-29.2-24.2M160 358.7l44.8 16.3h-89.6zm251.7 40.5s-3.4 21.5 3.4 26.2c4.3 2.9 12.1-1 12.8-6.3c1.3-8.6-16.2-19.9-16.2-19.9"/></symbol> <symbol id="water-tank" viewBox="0 0 512 512"><path fill="currentColor" d="M160 25c-14.5 0-38 3.89-56.7 11.36c-9.29 3.73-17.41 8.37-22.69 13.25A30 30 0 0 0 75.99 55H244c-1.2-1.77-2.6-3.55-4.6-5.39c-5.3-4.88-13.4-9.52-22.7-13.25C198 28.89 174.5 25 160 25M89 73v129.9l71 42.6l71-42.6V73zm167 78v18h23v14h-30v18h51.3l29.3 29.4l12.8-12.8l-34.7-34.6H297v-14h23v-18zM84.65 221.3L39.12 494.5l17.76 3L74.3 393h171.4l17.4 104.5l17.8-3l-45.5-273.2l-16.7 10l13.7 81.8l-72.4 26.4l-72.38-26.3l13.68-81.9zm263.15 22.4s-10.2 49.6 5.2 59.7c9.8 6.4 28.8-2.9 31-15.4c3.8-19.6-36.2-44.3-36.2-44.3M377 329s-13.4 29.1-5.8 38.5c4.9 5.9 17.4 3.7 20.6-3.6C397 352.3 377 329 377 329m-292.41 2.3l48.91 17.8l-55.22 20.1zm150.81 0l6.3 37.9l-55.2-20.1zm179 7.5s1.4 32.1 12.4 36.9c7.2 3 17.2-4.7 16.8-12.7c-.8-12.6-29.2-24.2-29.2-24.2M160 358.7l44.8 16.3h-89.6zm251.7 40.5s-3.4 21.5 3.4 26.2c4.3 2.9 12.1-1 12.8-6.3c1.3-8.6-16.2-19.9-16.2-19.9"/></symbol>
<symbol id="well" viewBox="0 0 512 512"><path fill="currentColor" d="m86.236 28.564l-41.248 110h422.024l-41.248-110zm32.764 128v176.07c76.024 28.87 197.976 28.87 274 0v-176.07h-18v137.428c-7.16-3.66-15.96-6.65-26.307-9.236c-24.208-6.052-56.74-9.64-92.693-9.64c-7.85 0-15.526.18-23 .51c-.017-12.01.002-24.02.04-36.032l24.013-60.03H238.05L215 237.194v39.566c-19.528 1.612-37.125 4.354-51.693 7.996c-10.346 2.586-19.147 5.577-26.307 9.236V156.564zm89 23v16h4.266l6.4-16zm68.44 0l-25.6 64h17.867l25.602-64zm-196.44 23v18h21v-18zm75 0v18h42v-18zm149.492 0l-16.4 41H304v-23h53v-18zm106.508 0v18h12v80h57v-18h-39v-80zm-155 90.55c34.738 0 66.208 3.575 88.326 9.105c11.06 2.763 19.795 6.09 25.035 9.186c4.377 2.587 5.365 4.425 5.576 4.71c.04-.057.064-.074.064 0c0 .073-.023.055-.064 0c-.21.283-1.2 2.12-5.575 4.706c-5.24 3.098-13.975 6.425-25.034 9.19c-22.118 5.53-53.588 9.103-88.326 9.103s-66.208-3.574-88.326-9.103c-11.06-2.765-19.795-6.092-25.035-9.19c-4.377-2.586-5.365-4.423-5.576-4.707c-.04.056-.064.074-.064 0c0-.073.023-.056.064 0c.21-.284 1.2-2.122 5.575-4.71c5.24-3.096 13.975-6.422 25.034-9.186c12.965-3.243 29.16-5.805 47.326-7.376v28.72h18v-29.91c7.456-.347 15.138-.54 23-.54zm137 58.665c-32.96 11.616-71.95 18.42-112 20.417v27.45c40.88-2.024 80.4-9.035 112-21.038zm-274 .02v26.83c9.95 3.777 20.683 7.063 32 9.852V361.16c-11.143-2.664-21.856-5.785-32-9.36zm50 13.202v27.408c29.46 5.657 61.842 8.253 94 7.81v-27.447c-31.99.444-64.16-2.134-94-7.77zm224 32.777a303 303 0 0 1-16 5.146v25.158a254 254 0 0 0 16-5.46zm-274 .01v24.827c27.454 10.426 60.89 17.082 96 19.98v-25.44c-34.372-2.842-67.45-9.302-96-19.366zm240 9.837c-38.988 9.09-83.038 12.637-126 10.67v25.445c43.22 1.968 87.805-1.613 126-10.777zM119 441.78c1.642 9.154 8.428 17.585 16 21.704v-16.558a303 303 0 0 1-16-5.147zm274 .007c-12.8 4.513-26.5 8.312-40.834 11.373v19.73c16.52-4.255 40.596-15.226 40.834-31.103m-240 9.84v19.275c33.85 9.257 73.556 12.422 103 12.534c29.185 0 56.113-2.365 78.166-6.493v-20.37c-58.66 9.767-125.146 8.115-181.166-4.946"/></symbol> <symbol id="well" viewBox="0 0 512 512"><path fill="currentColor" d="m86.236 28.564l-41.248 110h422.024l-41.248-110zm32.764 128v176.07c76.024 28.87 197.976 28.87 274 0v-176.07h-18v137.428c-7.16-3.66-15.96-6.65-26.307-9.236c-24.208-6.052-56.74-9.64-92.693-9.64c-7.85 0-15.526.18-23 .51c-.017-12.01.002-24.02.04-36.032l24.013-60.03H238.05L215 237.194v39.566c-19.528 1.612-37.125 4.354-51.693 7.996c-10.346 2.586-19.147 5.577-26.307 9.236V156.564zm89 23v16h4.266l6.4-16zm68.44 0l-25.6 64h17.867l25.602-64zm-196.44 23v18h21v-18zm75 0v18h42v-18zm149.492 0l-16.4 41H304v-23h53v-18zm106.508 0v18h12v80h57v-18h-39v-80zm-155 90.55c34.738 0 66.208 3.575 88.326 9.105c11.06 2.763 19.795 6.09 25.035 9.186c4.377 2.587 5.365 4.425 5.576 4.71c.04-.057.064-.074.064 0c0 .073-.023.055-.064 0c-.21.283-1.2 2.12-5.575 4.706c-5.24 3.098-13.975 6.425-25.034 9.19c-22.118 5.53-53.588 9.103-88.326 9.103s-66.208-3.574-88.326-9.103c-11.06-2.765-19.795-6.092-25.035-9.19c-4.377-2.586-5.365-4.423-5.576-4.707c-.04.056-.064.074-.064 0c0-.073.023-.056.064 0c.21-.284 1.2-2.122 5.575-4.71c5.24-3.096 13.975-6.422 25.034-9.186c12.965-3.243 29.16-5.805 47.326-7.376v28.72h18v-29.91c7.456-.347 15.138-.54 23-.54zm137 58.665c-32.96 11.616-71.95 18.42-112 20.417v27.45c40.88-2.024 80.4-9.035 112-21.038zm-274 .02v26.83c9.95 3.777 20.683 7.063 32 9.852V361.16c-11.143-2.664-21.856-5.785-32-9.36zm50 13.202v27.408c29.46 5.657 61.842 8.253 94 7.81v-27.447c-31.99.444-64.16-2.134-94-7.77zm224 32.777a303 303 0 0 1-16 5.146v25.158a254 254 0 0 0 16-5.46zm-274 .01v24.827c27.454 10.426 60.89 17.082 96 19.98v-25.44c-34.372-2.842-67.45-9.302-96-19.366zm240 9.837c-38.988 9.09-83.038 12.637-126 10.67v25.445c43.22 1.968 87.805-1.613 126-10.777zM119 441.78c1.642 9.154 8.428 17.585 16 21.704v-16.558a303 303 0 0 1-16-5.147zm274 .007c-12.8 4.513-26.5 8.312-40.834 11.373v19.73c16.52-4.255 40.596-15.226 40.834-31.103m-240 9.84v19.275c33.85 9.257 73.556 12.422 103 12.534c29.185 0 56.113-2.365 78.166-6.493v-20.37c-58.66 9.767-125.146 8.115-181.166-4.946"/></symbol>
<symbol id="wheat" viewBox="0 0 512 512"><path fill="currentColor" d="M98.344 16.688C79.692 43.785 68.498 69.01 65.5 89.56l23.938 39.157l28.624-33.47c.868-21.213-5.49-48.677-19.718-78.563zM472.5 19.625C444.04 36.055 423.112 54 411.562 71.25l4.75 45.688L456.563 99c9.89-18.777 15.938-46.29 15.938-79.375zm-91.75 27.28c-10.153 21.036-16.8 40.84-20.156 58.314l18.375 57.686l19.78-34.25l-6.5-62.22h.03a277 277 0 0 0-11.53-19.53zM27.25 80.782c-.125 23.364 2.393 44.102 6.875 61.314L75.5 186.25l3.125-39.406L46 93.47l.03-.032a280 280 0 0 0-18.78-12.657zm132.844 10.532c-8.415 3.504-16.29 7.213-23.594 11.094l-39.25 45.97l-3.094 39.374l50.438-39.094c6.712-15.904 12.09-35.263 15.5-57.344m177.22 21.626c-24.024 58.09-16.16 97.86 7.873 108.5l21.157-36.625l-19.594-61.438a274 274 0 0 0-9.438-10.438zm146.03.218c-4.55-.028-8.97.084-13.28.28L414.935 138l-19.78 34.28l62.343-13.655c12.897-11.47 26.09-26.626 38.656-45.094c-4.358-.216-8.64-.348-12.812-.374zm-226.094 8.72c-23.24 23.238-38.832 46.003-45.53 65.655l16.436 42.907l34.22-27.75c4.695-20.704 3.436-48.856-5.126-80.812M16.406 159.06c3.28 62.77 27.482 95.31 53.75 94.594l3.344-42.22l-44.063-47a279 279 0 0 0-13.03-5.374zm143.22 11.375a272 272 0 0 0-18.5 4.563l-48.97 37.938l-3.312 41.75c26.492 7.51 57.16-20.567 70.78-84.25zm16.06 1.563c-4.36 22.935-5.65 43.762-4.374 61.5l32.688 51l10.22-38.188l-22.407-58.437h.03a277 277 0 0 0-16.155-15.875zm267.408 8.938l-60.563 13.218l-20.936 36.25c20.682 18.195 60.438 6.035 100.125-45.625a275 275 0 0 0-18.626-3.843m-138.688 25.53c-8.912 1.92-17.304 4.16-25.187 6.657l-46.97 38.03l-10.22 38.19l56.69-29.283c9.493-14.424 18.323-32.49 25.686-53.593zm155.125 25.063c-25.85 20.324-44.046 41.06-53.03 59.782l11.22 44.532l37.28-23.47c7.126-19.99 9.236-48.088 4.53-80.843zm-123.342 8.595c-34.435 77.573-59.394 159.06-62.97 253.03h18.72c3.558-90.792 27.573-169.428 61.312-245.436l-17.063-7.595zm-185.375 6.906c-8.173 62.347 9.714 98.713 35.687 102.75l10.97-40.874l-34.814-54.25a279 279 0 0 0-11.844-7.625zm221.75 24.532c-7.053 22.243-10.817 42.77-11.657 60.532l26.406 54.594L402 349.967l-15.28-60.687h.06c-4.3-5.848-9.033-11.76-14.217-17.717zm-302.47 1.532c-8.664 74.584-8.13 147.835 12.188 220.062h19.44c-20.877-70.772-21.764-143.02-13.064-217.906l-18.562-2.156zm219.47 11.094c-6.613.16-12.953.54-19.032 1.125L215.5 313.78l-10.844 40.408c24.69 12.23 59.938-9.82 84.906-70zm206.718 36.937c-9.072.844-17.664 2.052-25.78 3.594l-51.156 32.217l-14.688 36.657l59.75-22.313c11.14-13.193 22.055-30.075 31.875-50.155zm-157.31 22c-15.528 60.938-2.096 99.19 23.217 106.28l15.72-39.28l-28.094-58.03c-3.43-3-7.053-5.985-10.844-8.97zM183.25 368.72c-12.674 41.233-22.26 82.547-26.844 124.436h18.813c4.507-39.722 13.69-79.23 25.905-118.97l-17.875-5.467zm270 26.655l-58 21.688l-15.563 38.875c23.056 15.098 60.673-2.606 92.625-59.407a273 273 0 0 0-19.062-1.155zM356.5 469.03c-1.874 7.713-3.185 15.757-3.656 24.126h18.687c.45-6.686 1.55-13.206 3.126-19.687l-18.156-4.44z"/></symbol> <symbol id="wheat" viewBox="0 0 512 512"><path fill="currentColor" d="M98.344 16.688C79.692 43.785 68.498 69.01 65.5 89.56l23.938 39.157l28.624-33.47c.868-21.213-5.49-48.677-19.718-78.563zM472.5 19.625C444.04 36.055 423.112 54 411.562 71.25l4.75 45.688L456.563 99c9.89-18.777 15.938-46.29 15.938-79.375zm-91.75 27.28c-10.153 21.036-16.8 40.84-20.156 58.314l18.375 57.686l19.78-34.25l-6.5-62.22h.03a277 277 0 0 0-11.53-19.53zM27.25 80.782c-.125 23.364 2.393 44.102 6.875 61.314L75.5 186.25l3.125-39.406L46 93.47l.03-.032a280 280 0 0 0-18.78-12.657zm132.844 10.532c-8.415 3.504-16.29 7.213-23.594 11.094l-39.25 45.97l-3.094 39.374l50.438-39.094c6.712-15.904 12.09-35.263 15.5-57.344m177.22 21.626c-24.024 58.09-16.16 97.86 7.873 108.5l21.157-36.625l-19.594-61.438a274 274 0 0 0-9.438-10.438zm146.03.218c-4.55-.028-8.97.084-13.28.28L414.935 138l-19.78 34.28l62.343-13.655c12.897-11.47 26.09-26.626 38.656-45.094c-4.358-.216-8.64-.348-12.812-.374zm-226.094 8.72c-23.24 23.238-38.832 46.003-45.53 65.655l16.436 42.907l34.22-27.75c4.695-20.704 3.436-48.856-5.126-80.812M16.406 159.06c3.28 62.77 27.482 95.31 53.75 94.594l3.344-42.22l-44.063-47a279 279 0 0 0-13.03-5.374zm143.22 11.375a272 272 0 0 0-18.5 4.563l-48.97 37.938l-3.312 41.75c26.492 7.51 57.16-20.567 70.78-84.25zm16.06 1.563c-4.36 22.935-5.65 43.762-4.374 61.5l32.688 51l10.22-38.188l-22.407-58.437h.03a277 277 0 0 0-16.155-15.875zm267.408 8.938l-60.563 13.218l-20.936 36.25c20.682 18.195 60.438 6.035 100.125-45.625a275 275 0 0 0-18.626-3.843m-138.688 25.53c-8.912 1.92-17.304 4.16-25.187 6.657l-46.97 38.03l-10.22 38.19l56.69-29.283c9.493-14.424 18.323-32.49 25.686-53.593zm155.125 25.063c-25.85 20.324-44.046 41.06-53.03 59.782l11.22 44.532l37.28-23.47c7.126-19.99 9.236-48.088 4.53-80.843zm-123.342 8.595c-34.435 77.573-59.394 159.06-62.97 253.03h18.72c3.558-90.792 27.573-169.428 61.312-245.436l-17.063-7.595zm-185.375 6.906c-8.173 62.347 9.714 98.713 35.687 102.75l10.97-40.874l-34.814-54.25a279 279 0 0 0-11.844-7.625zm221.75 24.532c-7.053 22.243-10.817 42.77-11.657 60.532l26.406 54.594L402 349.967l-15.28-60.687h.06c-4.3-5.848-9.033-11.76-14.217-17.717zm-302.47 1.532c-8.664 74.584-8.13 147.835 12.188 220.062h19.44c-20.877-70.772-21.764-143.02-13.064-217.906l-18.562-2.156zm219.47 11.094c-6.613.16-12.953.54-19.032 1.125L215.5 313.78l-10.844 40.408c24.69 12.23 59.938-9.82 84.906-70zm206.718 36.937c-9.072.844-17.664 2.052-25.78 3.594l-51.156 32.217l-14.688 36.657l59.75-22.313c11.14-13.193 22.055-30.075 31.875-50.155zm-157.31 22c-15.528 60.938-2.096 99.19 23.217 106.28l15.72-39.28l-28.094-58.03c-3.43-3-7.053-5.985-10.844-8.97zM183.25 368.72c-12.674 41.233-22.26 82.547-26.844 124.436h18.813c4.507-39.722 13.69-79.23 25.905-118.97l-17.875-5.467zm270 26.655l-58 21.688l-15.563 38.875c23.056 15.098 60.673-2.606 92.625-59.407a273 273 0 0 0-19.062-1.155zM356.5 469.03c-1.874 7.713-3.185 15.757-3.656 24.126h18.687c.45-6.686 1.55-13.206 3.126-19.687l-18.156-4.44z"/></symbol>

Before

Width:  |  Height:  |  Size: 371 KiB

After

Width:  |  Height:  |  Size: 379 KiB

Before After
Before After

View file

@ -392,7 +392,7 @@ class EventTest(unittest.TestCase):
self.assertIn("size", view) self.assertIn("size", view)
self.assertNotIn("strength", view) self.assertNotIn("strength", view)
self.assertEqual(view["recon_next"], 0) self.assertEqual(view["recon_next"], 0)
late = raid["fire_at"] - 12 * game.HOUR late = raid["fire_at"] - 25 * game.HOUR
self.assertEqual(game.intel_level(world, raid, late), 2) self.assertEqual(game.intel_level(world, raid, late), 2)
view = game.event_view(world, raid, raid["fire_at"] - game.HOUR) view = game.event_view(world, raid, raid["fire_at"] - game.HOUR)
self.assertEqual(view["intel"], 3) self.assertEqual(view["intel"], 3)
@ -413,6 +413,28 @@ class EventTest(unittest.TestCase):
self.assertIsNotNone(p["action"]) # still trains the skill self.assertIsNotNone(p["action"]) # still trains the skill
self.assertEqual(game.event_view(world, raid, T0)["recon"], full) self.assertEqual(game.event_view(world, raid, T0)["recon"], full)
def test_threats_land_every_two_days_and_the_camp_opens_a_day_out(self):
world = world_with(("sam", "ranger"))
raid = self.announce(world)
self.assertLessEqual(abs(raid["fire_at"] - (T0 + 48 * game.HOUR)), 2 * game.HOUR)
raid["recon"] = game.intel_costs(raid)[-1]
self.assertEqual(game.intel_level(world, raid, raid["fire_at"] - 24 * game.HOUR - 1), 2)
self.assertEqual(game.intel_level(world, raid, raid["fire_at"] - 24 * game.HOUR), 3)
raid["strength"] = 0
game.tick(world, raid["fire_at"], random.Random(3))
following = game.upcoming_raid(world)
self.assertIsNotNone(following) # rumoured the moment the last one lands
self.assertEqual(following["slot"], raid["slot"] + 48 * game.HOUR)
def test_v26_worlds_get_livelier_tracks(self):
world = world_with()
world["version"] = 26
world["next_fortune_at"] = T0 + 70 * game.HOUR
world["next_event_at"] = T0 + 20 * game.HOUR
game.migrate(world, T0)
self.assertEqual(world["next_fortune_at"], T0 + 20 * game.HOUR)
self.assertEqual(world["next_event_at"], T0)
def test_bigger_bands_take_more_scouting(self): def test_bigger_bands_take_more_scouting(self):
small = {"kind": "raid", "strength": 20} small = {"kind": "raid", "strength": 20}
huge = {"kind": "raid", "strength": 150} huge = {"kind": "raid", "strength": 150}
@ -1315,6 +1337,20 @@ class HappeningsTest(unittest.TestCase):
game.tick(self.world, T0 + 13 * game.HOUR, self.rng) game.tick(self.world, T0 + 13 * game.HOUR, self.rng)
self.assertFalse(any(e["kind"] == "harvest" for e in self.city["effects"])) self.assertFalse(any(e["kind"] == "harvest" for e in self.city["effects"]))
def test_new_happenings(self):
game._fortune(self.world, T0, self.rng, "masons")
self.assertEqual(game.skill_mods(self.world, game.ACTION_BY_ID["clear_rockslide"])["speed"], 0.75)
self.city["treasury"] = 1000
game._hardship(self.world, T0, self.rng, "taxman")
self.assertEqual(self.city["treasury"], 850)
game._minor_threat(self.world, T0, self.rng, "smugglers")
game.tick(self.world, T0 + 2 * game.HOUR + 1, self.rng)
self.assertLess(self.city["treasury"], 850)
game._minor_threat(self.world, T0, self.rng, "bridge")
p = self.world["players"]["ann"]
hunt = next(a for a in game.ACTIONS if a["skill"] == "hunting" and not a.get("special"))
self.assertTrue(game.can_start(self.world, p, hunt))
def test_festival_boosts_favour(self): def test_festival_boosts_favour(self):
game._fortune(self.world, T0, self.rng, "festival") game._fortune(self.world, T0, self.rng, "festival")
p = self.world["players"]["ann"] p = self.world["players"]["ann"]
@ -1340,7 +1376,7 @@ class HappeningsTest(unittest.TestCase):
"strength": 1000, "group": "a green dragon", "trait": "x"}) "strength": 1000, "group": "a green dragon", "trait": "x"})
self.assertEqual(game.upcoming_raid(self.world)["kind"], "dragon") self.assertEqual(game.upcoming_raid(self.world)["kind"], "dragon")
game.tick(self.world, T0 + 20, self.rng) game.tick(self.world, T0 + 20, self.rng)
report = self.world["events"][-1]["report"] report = next(e for e in self.world["events"] if e["id"] == 99)["report"]
self.assertIn("ablaze", report["title"]) self.assertIn("ablaze", report["title"])
self.assertTrue(self.city["buildings"]["houses"]["damaged"]) self.assertTrue(self.city["buildings"]["houses"]["damaged"])
self.assertLess(self.city["stockpile"]["logs"], 500) self.assertLess(self.city["stockpile"]["logs"], 500)
@ -1352,7 +1388,7 @@ class HappeningsTest(unittest.TestCase):
tracks = [e.get("track") for e in self.world["events"]] tracks = [e.get("track") for e in self.world["events"]]
self.assertIn("fortune", tracks) self.assertIn("fortune", tracks)
self.assertIn("hardship", tracks) self.assertIn("hardship", tracks)
self.assertGreater(self.world["next_fortune_at"], T0 + 30 * game.HOUR) self.assertGreater(self.world["next_fortune_at"], T0 + 8 * game.HOUR)
def test_v7_worlds_get_weather_and_tracks(self): def test_v7_worlds_get_weather_and_tracks(self):
world = world_with() world = world_with()