Combat rework: packs, abilities, rest, health potions, group bosses

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rope 2026-10-24 09:49:21 +01:00
parent 472609ac70
commit 57d11e30da
10 changed files with 1562 additions and 380 deletions

View file

@ -14,31 +14,48 @@ Beta. The core game is in place; changes from here are mostly balance and tuning
firekeeping, combat, prayer and reconnaissance. Smiths also make hardware for builders,
one kind per metal (copper rivets to rune locks), which fittings and
buildings need.
- **Combat:** every fight is played out swing by swing: you and the enemy
each have HP, a swing timer, accuracy and a max hit, and swings hit, miss
or crit. Every blow has a damage type (slashing, blunt, piercing, magic);
each enemy is vulnerable to some (+25%) and resists others (-25%), shown
as tinted icons. Armour stops physical blows, ward stops magic. Below half
health you eat from your bank, and each bite holds back your next swing;
out of food you retreat, losing nothing but the fight. HP recovers 25%
an hour. The Combat page replays the fight live. Fights are split into
the Frontier (bandits, sabotage, drilling, the city's troubles) and
expeditions: Greenwood to start, then one area per
tier (Old Watchtower, Sunken Barrows, Iron Hills, Frostpeak, Dragon's
Spine), each with four races and a boss (the dragons at the top). Every
kill is one of the race's variants (a brute, a skirmisher, a caster, now
and then a rare elite), so each encounter mixes damage types: spirit races
lean on magic, golems and trolls on blows. Races drop trophies (10%,
20% from bosses) for stronger weapons and the area's armour reagents (10%,
far more from dragons). Each kill is followed by a 2-second pause.
- **Combat:** a fight is a party against a pack, played out in quarter-second
slices (`combat.py`). Everyone swings on their weapon's timer, and swings hit,
miss or crit. Every blow has a damage type (slashing, blunt, piercing, magic);
each enemy is vulnerable to some (+25%) and resists others (-25%), shown as
tinted icons. Armour stops physical blows, ward stops magic. On top of the
swings, your weapon gives four abilities (learned at combat 1, 15, 30 and 45)
and your trade one more; for now they're all on auto. Enemies use their own:
brutes wind up a Heavy Slam, skirmishers lunge at whoever isn't tanking,
casters cast a Hex Bolt you can interrupt, elites and bosses enrage, dragons
breathe fire. Enemies pick targets by threat. A pack is as many enemies as
there are of you, often one more (each weaker); a rare elite comes alone.
Between fights you rest back to full: food is only eaten then, and better food
rests you faster. In a fight the only heal you carry is a health potion
(Herblore), drunk once a fight under 35% HP. At 0 HP you're knocked out: you
lose that fight and come round at 30%; three knockouts in a row and you stop.
HP recovers 25% an hour away from fights. The Combat page replays the fight
live. Fights are split into the Frontier (bandits, sabotage, drilling, the
city's troubles) and expeditions: Greenwood to start, then one area per tier
(Old Watchtower, Sunken Barrows, Iron Hills, Frostpeak, Dragon's Spine), each
with four races and a boss (the dragons at the top). Races drop trophies
(10%, 20% from bosses) for stronger weapons and the area's armour reagents
(10%, far more from dragons).
- **Bosses and dragons** are group fights: two or more. Alone you wait at it
for someone to tag in. They grow with the group, and everyone who brings one
down gets their own loot.
- **Multiplayer Combat:** tag into anyone's fight from the encounter card or the guild roster.
- **Weapons:** four styles, one per trade, and anyone can use any of them.
- **Weapons:** four styles, one per trade, and anyone can use any of them; the
weapon decides your abilities and your role.
Sword and shield (slashing, 2.4s swings, the shield blocks 15% of hits;
swords from Smithing, shields from Construction), warhammer (blunt,
Smithing; slow, heavy, twice the crits), staff (magic, Herblore;
accurate) and bow (piercing, Leatherworking; fast, strikes first). The
last three take both hands and carry a shield's power. Your trade's weapon
does 15% more damage. Past copper, each weapon needs its tier's trophies.
- **Abilities:** sword and shield tanks (Shield Bash, Challenge, Sweeping Cut,
Shield Wall; the shield ones need a shield), warhammer hits hard and stuns
(Crushing Blow, Concuss, Earthshaker, Unstoppable), staff heals and holds
(Bolt, Mend, Ward, Thornbind), bow shoots from afar (Aimed Shot, Pinning
Shot, Barbed Arrow, Volley, which takes 5 arrows). Trades: Find the Seam
(miner: a target's resistance stops counting), Barricade (builder: the group
takes less), Hearty Meal (homesteader: the group heals over time), Mark Prey
(ranger: a target takes more from everyone).
- **Armour:** three weights. Heavy plate (Smithing) is strong against blows
and weak to magic, light cloth (Tailoring) the other way round, medium
leather (Leatherworking) a bit of both. Every trade gathers its own base
@ -119,7 +136,8 @@ Beta. The core game is in place; changes from here are mostly balance and tuning
logs → enchanted logs, copper bar → rune bar…), at Herblore 1, 15, 30, 45,
60 and 75. Gathering and Construction potions are 10–35% faster, crafting
potions a 10–35% chance to keep materials, Prayer more points from bones,
and combat has Strength and Defence ladders. Potions last 50 uses, one per
and combat has Strength and Defence ladders. Health potions (I–VI, the tier's
herb and cooked fish) are the one heal you take into a fight. Potions last 50 uses, one per
skill at a time; an empty one is replaced from the bank automatically.
- **Firekeeping:** the guild shares four fires: the forge (bars), the kitchen
fire (cooking), the kiln (bricks) and the still (potions). Every craft at a
@ -178,6 +196,8 @@ snapshot and exits; the NixOS module runs it nightly when
## Layout
- `game.py`: content tables and the rules. Pure functions of `(world, now)`.
- `combat.py`: the fight engine and the abilities.
- `tools/balance.py`: an hour of fighting per trade and tier (`solo`, `party`, `bosses`).
- `app.py`: stdlib HTTP server, persistence and the background ticker.
- `static/`: the client (vanilla JS, no build step).