High-tier faction PvP: the Thornford showcase
cargo run --release -p uo-client -- --combat-demo pvp --combat-auto plays six of the Aelwyn
Concord against six of the Karrak Dominion (decision #97's factions) in Thornford, a village
crossroads, every fighter in a complete T5 build of the catalogue's pieces (docs/builds.md).
The camera follows the Concord's frost controller, FrostyKatya; without --combat-auto you play her.
Played live, the fight starts 10 s after the scene loads (UO_PVP_HOLD=<seconds>), so the
world streams in and the lighting settles; recordings start on their first frame. Record it with --record pvp.mp4 --width 1920 --height 1080 --zoom 3 (add --no-hud for a clean
cut). UO_PVP_POV=thornwarden (or archer, storm, healer, shade, ironwall, …)
follows another fighter in the same fight; the camera leads towards the fight unless
UO_PVP_LEAD=0. Code: rosters and builds in crates/uo-combat/src/pvp.rs, the squad tactics in
crates/uo-combat/src/squad.rs, the village in crates/uo-client/src/combat/pvp.rs.
The field
Four cobbled streets meet a flagstone square with a well and the Concord's banner (the objective: the Dominion has come to take it). Houses stand at the back (north) and the sides, so nothing tall hides the fight; their roofs hide while the camera is in the village.
- The Concord comes up the south street and holds the square's south-west corner behind a low fieldstone wall (low cover: half the shots stop on it).
- The Dominion comes down the east street in a shield wall (three shields side by side, Surcoat of the Shield Wall: full cover for everyone behind them), its casters and healer behind it.
- The flank: the market garden south of the east street (the camera side, all low crops and hay) is the Concord assassin's way round to the Dominion's back line.
The builds (all T5, every slot filled)
Each build is an ExampleBuildDef in uo_combat::pvp (BUILDS), dressed with
builds::craft::dress at tier 5, school skill 100 (every pick open, the masteries), and the
support skills of its role.
The Aelwyn Concord: soak, freeze, chain, flank
| Fighter | Role | Weapon (Q / W / E) | Armour (R / D / F) | Key pieces | Why it works |
|---|---|---|---|---|---|
| FrostyKatya, Frost Warden (point of view) | controller | Glacial Staff: Frost Bolt / Glacial Wall / Frozen Tomb | 6 chainmail: Spell Mirror / Focus / Blink Step | Skirt of Frost, Frostwake Trousers, Frostbite Ring, Mirror Silk, Rally Cloak, Phoenix Pendant, Rune of Lingering | Every Q and W chills; a Soaked target freezes; Glacial Wall closes the choke in front of melee coming at the back line; Blink Step leaves frost behind; Frozen Tomb saves a dying friend, or locks the enemy's healer away while its patient dies; chainmail is Unbroken and cuts every element |
| ByHTAPb, Thornwarden | tank | Pike: Thrust / Impale / Phalanx | 6 chainmail: Last Stand / Rally / Break Free | Skirt of Tides, Standard Cloak, Shirt of Resolve, Warden's Trousers, Lord's Seal, Rune of Impact | Holds the choke two tiles out and soaks the shield wall it thrusts into; Impale roots a diver; Last Stand keeps it on 1 hit for 4 s when the wall closes in |
| Legolasik, Wildwood Archer | archer | Longbow: Multishot / Mark Target / Piercing Shot | 6 leather: Second Wind / Eagle Eye / Bound | Skirt of Tides, Hunter's Loop, Hunter's Eye, Archer's Gloves, Hunter's Cloak, fireproof leggings | Marks the side's target (everyone focuses the Marked) and, like the tank, soaks whatever her Q and W touch: the set-up for the lightning and the frost |
| ZeusDaddy, Stormcaller | artillery | Storm Staff: Lightning (Rune of Chains) / Blink / Gravity Well | 6 cloth: Mana Shield / Focus / Phase | Skirt of Storms, Stormhand Gloves, Thunder Studs, Robe of Echoes, Pact of Echoes, Mantle of the Magi | Gravity Well packs the shield wall tighter; Lightning jumps through every Soaked body (Electrocute); cloth's Overflow carries a kill into the next one |
| HealPlzz, Lifewarden | healer | Lifetouched Staff: Heal / Cleanse / Guardian Angel | 6 chainmail: Divine Grace / Rally / Swap | Healer's Mantle, Penitent's Shirt, Healing Sleeves, Robe of Haste | Cleanses roots and burns, Guardian Angel on a friend about to fall, Swaps a cornered friend with the tank |
| N1ghtSt4lker, Shade | assassin | Dagger: Puncture / Garrote / Backstab | 6 padded: Adrenaline / Blind / Shadow Step | Cloak of Shadows, Shadow Breeches, Seer's Studs, Ring of Blades, Skirt of Venom, Phoenix Pendant, Torch | Hidden beyond six tiles, it goes round through the garden, Shadow Steps behind the pyromancer, Garrote silences, Backstab from behind |
The Karrak Dominion: the iron wall and its guns
| Fighter | Role | Weapon (Q / W / E) | Armour (R / D / F) | Key pieces | Why it works |
|---|---|---|---|---|---|
| TankoGrib, Iron Wall | tank | Mace + Tower Shield: Concussion / Taunt / Bell Ringer | 6 plate: Bulwark / Challenge / Break Free | Surcoat of the Shield Wall, Standard Cloak, Shirt of Wrath, Lord's Seal | The wall's anchor: Bastion, Taunt pulls divers off the casters, Bell Ringer stuns |
| MolotOK, Shieldbreaker | tank | Morningstar + Heater Shield: Armour Breaker / Stagger / Sunder | plate and hardened: Thorn Skin / War Cry / Dash | Surcoat of the Shield Wall, War Cloak, Thorned Doublet, Berserker's Torc | Sunders the Concord's front, Stagger interrupts |
| xX_Varyag_Xx, Iron Captain | bruiser | Longsword + Kite Shield: Cleave / Lunge / Execute | 6 hardened: Second Wind / Battle Focus / Dash | Surcoat of the Shield Wall, Skirt of Mending, Executioner's Ring, Glass Heart | The wall's third shield, then the dive: Lunge onto the Concord's casters |
| Arbalet228, Arbalest | archer | Heavy Crossbow: Heavy Bolt / Bolas / Siege Bolt | 6 leather: Second Wind / Eagle Eye / Roll | Bandolier, Ring of Precision, Splitting Studs, Phoenix Pendant | Knocks the front back, roots a diver, shoots from behind the shields |
| Pyr0maniac, Pyromancer | artillery | Fire Staff + Totem: Fireball / Fire Ring / Meteor | 6 cloth: Mana Shield / Focus / Phase | Skirt of Flame, Robe of the Inferno, Ember Band, Glass Heart | The Dominion's killer: Burning ticks hundreds a second, Meteor on a bunched back line; fire on the Soaked makes Steam |
| SvyatoyBatya, Ironpriest | healer | Divine Staff: Heal / Holy Shield / Sanctuary | 6 padded: Shield of Faith / Rally / Break Free | Healer's Mantle, Penitent's Shirt, Healing Sleeves | Keeps the wall standing; Sanctuary when it buckles |
The tactics (uo_combat::squad)
Every fighter has a post: a route walked under cover, a post to hold with a leash, and later posts by time (the wall's advance, the captain let off the leash). By role:
- Approach: both squads walk their routes until an enemy is within 11 tiles; the back line keeps walking to its post under fire unless melee is on it (a healer heals on the way). The Dominion's three shields advance as a group (nobody steps ahead of the slowest), forming the Shield Wall.
- Hold and charge: once the fight is on, tanks and bruisers charge (up to 14 tiles from their
post): the enemy melee in their face first, then the called target, so once the enemy's
knights are down they run at its back line; shooters and casters find a spot near their post
with a clear line, and never shoot into a shield wall (
formations::wall_on_line). - Focus fire: the side's called target is the Marked enemy (the archer marks it), else a diver on our back line, else the weakest enemy by role (artillery, healer, controller, archer first; tanks last: their armour eats the damage).
- Peel and zoning: an enemy melee within reach of a back-liner is the diver: the tank Challenges and Impales it, the controller chills or freezes it and raises a Glacial Wall across the way of melee coming at the back line, the healer Swaps with the tank; back-liners with melee on them escape (Blink, Bound, Phase) towards their post.
- Dodge: an enemy area ability winding up on my tile (a Meteor, a Gravity Well) is mirrored (Spell Mirror) or escaped (Blink Step out, or a step off its tiles).
- Flank: the assassin walks the garden under its Cloak of Shadows, waits at its ambush post until the fight is on, then dives the enemy's artillery (healer next): Shadow Step behind, Garrote, Backstab, Adrenaline to reset.
- Push: a side with two more standing, or whose enemy lost its healer, drops its posts and
chases the called target; at 28 s both sides commit (
squad::ALL_IN). - Abilities first: every decision tries the E, W, Q, D and R keys by their own rule (areas on the densest pack, roots on the unrooted, interrupts on someone winding up, Focus before a big E); auto-attacks only fill the gaps. Squad fighters think faster than mobs (120–300 ms) and keep chasing whom they go for without stopping to think between the steps.
Pacing
Between complete T5 builds a blow deals hundreds (a Lightning through a Soaked pack 900, a Meteor
700 to everyone in it, Burning 460 a second), so six against six would be over in a few seconds.
The showcase gives its fighters three times their hits (pvp::HITS_SCALE): the fight takes
about half a minute while every number on screen stays the build's real T5 number. The battle's
seed (pvp::SEED = 7, UO_PVP_SEED) picks one fight; the rules decide the rest. Seed 7: the
knights charge into each other at 7 s, the Dominion captain falls at 10 s, the Shieldbreaker at
18 s, the Shade's dive on the pyromancer fails at 19 s, the Iron Wall falls at 24 s, then the pike
knight runs straight on at the Dominion's back line: a chained Lightning takes the pyromancer and
the arbalest at 30 s and the priest falls at 36 s. Of 60 seeds the Concord wins about a sixth with
both its point of view and its knight standing.
Findings for balance (not changed here)
- A T5 Stormcaller's Lightning with a Rune of Chains, Stormhand Gloves and the arcane mastery hits a packed group about a dozen times per cast; with Storm Heart (its own Soaked) every cast is an Electrocute on everyone within reach: a shield wall dies to one cast. The showcase uses Pact of Echoes instead, so the chain needs the archer's soak.
- A T5 pyromancer's Burning (Skirt of Flame, Glass Heart) ticks about 460 a second, more than a T5 leather archer's hits in two ticks; Cleanse is the only answer.
- Plate with Iron Oath and Stalwart Greaves took 0–20 from T5 spells and arrows: a plate tank with a healer could not be killed by the Concord's comp (the showcase's Iron Wall wears the Lord's Seal instead).
Headless tuning
cargo test --release -p uo-combat pvp_fight -- --nocapture plays the fight without the client
and prints who used what, deaths, reactions and the end (UO_PVP_VERBOSE=1 for every event,
UO_PVP_SEED for another fight); with the default seed it checks the Concord wins with FrostyKatya and ByHTAPb
standing within a minute. It plays on the village's real arena, crates/uo-combat/src/pvp_arena.txt,
written from the client's scene by combat::build_arena; the client's pvp_arena test fails when
the village changes (UO_BLESS=1 cargo test --release -p uo-client pvp_arena rewrites it). The
headless fight and the client's are the same, event for event.