Skip to content

PVP towns and tactical bots · local verification · 14 September 2026

Local implementation only. No production deployment was performed. PVE retains the campaign map, progression and saves. PVP builds an idempotent private map copy around the existing combat, movement, gathering, crafting and animation systems.

Changed player journey

Choose PVP and Blue or Red before joining. Greyfen and Sunken Bell each have two destructible archer towers and a capturable standard. Secure all five road frontiers once to unlock the opposing town for the round; destroy its towers and hold the standard for six seconds to win. Road recaptures can disrupt movement and resources without relocking an already breached town.

Sunken Bell has mirrored village streets and houses, lanterns, its bell landmark, stone perimeter and open road gate. Layered hills, a volcanic caldera, lava seams and soft smoke provide a distant skyline. The backdrop follows the camera's view range so the low-distance setting does not reveal a blank horizon. PVE does not allocate this scenery.

Bots normally assign up to two raiders, leaving supply/capture workers. Falling behind or going 90 seconds without a capture returns one raider to progression. A visible town invasion can recall up to three defenders. Retreats route toward staging instead of kiting indefinitely across the map. Bots retain ordinary health, inventory, aiming, weapon and resource rules.

Verification

  • npm run typecheck: shared, server and client pass.
  • VITE_GAME_SERVER=same-origin npm run build: client and wiki pass. Vite retains its large-chunk advisory; this is not a bundle-size optimization.
  • 98 tests pass across pvp-towns, clash, clash-rooms, campaign, reach, frontier-animation, territory-spawns and encounter-scaling.
  • Coverage includes PVE source preservation, map idempotence, both gates and standards reachable, held town capture/release, enemy contest, invalid team rejection, ordinary melee/bow/spell tower damage, friendly immunity, hit feedback, directional shield blocking, tower removal stopping arrows, finite spawn protection, team-facing respawns and adaptive raid assignments.
  • Two older PVE test fixtures were updated to use the already-required staff and shared mechanism/wheel stance positions. PVE gameplay requirements were not relaxed.
  • Chrome: signed in and joined Red with the finished same-origin build, rendered the real town in first person, and opened the PVP map. Both towns, tower counts and five road frontiers appeared correctly. No warning/error console entries were captured in that final check.
  • Additional player-height art inspection used the real world and tower renderers for arrival, courtyard, gate, rear wall/volcano and destroyed-tower views. Checked the skyline at 180 m and 80 m view distance. This art fixture was removed from deliverable source.
  • Isolated WebSocket smoke test passed: 15-second waiting room, private-code joining, public/private isolation, late bot-seat takeover, same-seat reconnect and two concurrent rooms (four connected humans plus sixteen bots). Observed snapshot p99 was about 76 ms in this local check.
  • Manual shield combat was not visually playtested; the real projectile/shield path was verified in server tests. A brief 120 FPS HUD observation is not a performance certification.

Final bot simulations

These run the real Zone at 30 ticks/second with in-memory saves and ordinary input commands. The 45-minute ceiling reports failure if no town is captured. No score-based or random winner is substituted.

Seed Seats Town sides Winner Simulated duration
9 10 bots Normal Red 30m 58s
21 10 bots Normal Blue 29m 41s
9 10 bots Swapped Blue 22m 02s
21 Blue 3 input proxies + 2 bots; Red 1 proxy + 4 bots Normal Blue 17m 38s
9 Blue 3 input proxies + 2 bots; Red 1 proxy + 4 bots Normal Red 20m 33s

Every listed run completed through enemy tower destruction and town capture. Both teams dealt PVP damage, and the periodic check recorded no characters beyond |x| = 230 in these final runs. Input proxies use AI drivers in human-designated seats: this verifies roster/resource behavior, not the skill or balance of actual humans.

Exploratory runs with fixed raider assignments stalled, including one at 45 minutes after improving retreats. The final adaptive assignments resolved the tested seeds. This limited sample does not establish that every possible match ends promptly or that the map is perfectly balanced. Continue local human playtests before release.

Reproduce a run with node --import tsx tools/pvp-simulate.ts 9 2; add --swap or --hybrid for the corresponding scenario. Keep the default two-raider setting for current tuning.

Follow-up: lava, bronze scenery and objective focus

The lava now uses surface-following branching rivers with animated hot currents, cooling crust and irregular banks. Browser inspection covered town-height and closer views, frozen frames five seconds apart, and the 80 m view distance. No shader warnings/errors were captured. The old flat tubes and crater disc were removed.

The PVP conversion had removed the Abbey bronze resource scenery while retaining its gather definition. It now restores a bronze bell-fragment model at (100, -410), clears the immediate approach and suppresses grass inside the pile. A test reaches the node and completes the real timing challenge to receive bell fragments. PVE resource scenery is unchanged.

Bots can regroup behind the front if the area is safe and their ordinary healing flask is nearly ready, resuming objectives after recovery. Long flask cooldowns or unsafe approaches still justify a town retreat. Raid allocation now measures the deepest frontier advance rather than each recapture: reduce to one raider after 90 seconds without new ground and temporarily return all raiders to objectives after 180 seconds. Retaking the same frontier does not reset this timer.

Follow-up validation: typecheck and same-origin client/wiki build pass; 82 tests pass across PVP towns, clash, rooms, campaign, Reach and territory spawns. Final full simulations: seed 9 Red wins at 631 seconds; seed 21 Red wins at 673 seconds; swapped-town seed 9 Blue wins at 697 seconds; hybrid seed 21 Red wins at 469 seconds. The hybrid has three input-proxy seats on Blue and one on Red, not actual human players. All four report zero sampled positions beyond |x|=230. Earlier recovery variants stalled at the 45-minute ceiling; those variants were revised before this final check. These samples verify functional completion, not competitive map balance.

Perimeter and paired mob camps · 14 September 2026

PVP now has a closed, collidable rock perimeter beyond the usable towns, frontiers and gathering nodes. Broken backing ridges, trees, masonry and a distant ruined citadel extend the existing volcano skyline. Player-height art checks covered Greyfen, the western rim, Sunken Bell and the Sluice, including 80 m and 180 m view distances. Temporary art fixtures were removed from the source. PVE retains its original map.

Campaign ambient spawns are removed only from isolated PVP maps. The opening frontiers each have three defenders, the next pair four, and the centre five. Paired camps have matching role health, damage, movement and attack timing; they retain goblin/orc visual and projectile identities. The central warden is stronger. Ranged damage now uses the same role budget before encounter scaling, preventing projectile defaults from silently overriding it. These budgets are a starting balance, not proof that terrain or projectile differences have equal difficulty.

101 tests pass across towns, clash, rooms, campaign, encounter scaling and character/wolf/attachment/death animation. Added coverage checks paired budgets, authoritative projectile damage, real perimeter collision, and routes from both teams to every frontier and resource node. All character exports validate.

Final-map simulations use ordinary 30 Hz game inputs and finish by town capture:

Seed Seats Town sides Winner Seconds
9 10 bots Normal Red 627
9 10 bots Swapped Red 1239
21 10 bots Swapped Blue 1498
42 Blue 3 input proxies + 2 bots; Red 1 proxy + 4 bots Normal Red 855

All four recorded zero sampled positions beyond |x|=230. A previous perimeter revision stalled in swapped seed 9 at the 45-minute ceiling; the final layout completed that seed. No winner shortcut was added. This small sample cannot guarantee every seed finishes or establish human competitive balance.

The first public check exposed oversized outer trees cutting into distant mountain silhouettes. The finishing pass lowers that tree line and blends ridge foothills into the current regional haze. Greyfen's player-height view was checked again without shader warnings. All 17 town/navigation tests passed, and seed 9 again completed at 627 seconds with the same combat result.