Skip to content
Felucca Online

Docs

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

FighterRoleWeapon (Q / W / E)Armour (R / D / F)Key piecesWhy it works
FrostyKatya, Frost Warden (point of view)controllerGlacial Staff: Frost Bolt / Glacial Wall / Frozen Tomb6 chainmail: Spell Mirror / Focus / Blink StepSkirt of Frost, Frostwake Trousers, Frostbite Ring, Mirror Silk, Rally Cloak, Phoenix Pendant, Rune of LingeringEvery 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, ThornwardentankPike: Thrust / Impale / Phalanx6 chainmail: Last Stand / Rally / Break FreeSkirt of Tides, Standard Cloak, Shirt of Resolve, Warden's Trousers, Lord's Seal, Rune of ImpactHolds 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 ArcherarcherLongbow: Multishot / Mark Target / Piercing Shot6 leather: Second Wind / Eagle Eye / BoundSkirt of Tides, Hunter's Loop, Hunter's Eye, Archer's Gloves, Hunter's Cloak, fireproof leggingsMarks 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, StormcallerartilleryStorm Staff: Lightning (Rune of Chains) / Blink / Gravity Well6 cloth: Mana Shield / Focus / PhaseSkirt of Storms, Stormhand Gloves, Thunder Studs, Robe of Echoes, Pact of Echoes, Mantle of the MagiGravity Well packs the shield wall tighter; Lightning jumps through every Soaked body (Electrocute); cloth's Overflow carries a kill into the next one
HealPlzz, LifewardenhealerLifetouched Staff: Heal / Cleanse / Guardian Angel6 chainmail: Divine Grace / Rally / SwapHealer's Mantle, Penitent's Shirt, Healing Sleeves, Robe of HasteCleanses roots and burns, Guardian Angel on a friend about to fall, Swaps a cornered friend with the tank
N1ghtSt4lker, ShadeassassinDagger: Puncture / Garrote / Backstab6 padded: Adrenaline / Blind / Shadow StepCloak of Shadows, Shadow Breeches, Seer's Studs, Ring of Blades, Skirt of Venom, Phoenix Pendant, TorchHidden 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

FighterRoleWeapon (Q / W / E)Armour (R / D / F)Key piecesWhy it works
TankoGrib, Iron WalltankMace + Tower Shield: Concussion / Taunt / Bell Ringer6 plate: Bulwark / Challenge / Break FreeSurcoat of the Shield Wall, Standard Cloak, Shirt of Wrath, Lord's SealThe wall's anchor: Bastion, Taunt pulls divers off the casters, Bell Ringer stuns
MolotOK, ShieldbreakertankMorningstar + Heater Shield: Armour Breaker / Stagger / Sunderplate and hardened: Thorn Skin / War Cry / DashSurcoat of the Shield Wall, War Cloak, Thorned Doublet, Berserker's TorcSunders the Concord's front, Stagger interrupts
xX_Varyag_Xx, Iron CaptainbruiserLongsword + Kite Shield: Cleave / Lunge / Execute6 hardened: Second Wind / Battle Focus / DashSurcoat of the Shield Wall, Skirt of Mending, Executioner's Ring, Glass HeartThe wall's third shield, then the dive: Lunge onto the Concord's casters
Arbalet228, ArbalestarcherHeavy Crossbow: Heavy Bolt / Bolas / Siege Bolt6 leather: Second Wind / Eagle Eye / RollBandolier, Ring of Precision, Splitting Studs, Phoenix PendantKnocks the front back, roots a diver, shoots from behind the shields
Pyr0maniac, PyromancerartilleryFire Staff + Totem: Fireball / Fire Ring / Meteor6 cloth: Mana Shield / Focus / PhaseSkirt of Flame, Robe of the Inferno, Ember Band, Glass HeartThe Dominion's killer: Burning ticks hundreds a second, Meteor on a bunched back line; fire on the Soaked makes Steam
SvyatoyBatya, IronpriesthealerDivine Staff: Heal / Holy Shield / Sanctuary6 padded: Shield of Faith / Rally / Break FreeHealer's Mantle, Penitent's Shirt, Healing SleevesKeeps 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.