Combat & controls
Console-style ARPG controls (WASD, the 8-slot Mouse1 chain, Q E Z X C skills or buffs, Shift+Mouse1 attack in place, Mouse1 click-to-walk, tactical ↔ close camera, Mouse2 movement gem), finishers, cast phases, targeting, damage model, the AAA hit-feel stack and the hit-reaction system.
Zoen plays like a console action game that happens to be an MMO. You move with WASD, hammer Mouse1 to run your chain of attack skills, fire Q E Z X C for any skill or buff, and dash/jump on Mouse2 with your movement gem. Every binding can be remapped. Phones and gamepads get first-class layouts.
◆1. Inputs at a glance
| Input | Action | Notes |
|---|---|---|
| W A S D | Move (camera-relative, 8-dir) | Stops within 0.08 s; movement while casting follows the skill's free/slowed/committed/travel policy. Committed recovery unlocks at cancelableAfterS. |
| Mouse1 | Chain list (8 slots) on a monster · walk on empty ground | On a monster (or a locked target): hold or spam to run the attack skills in chain slots 1–8 in order; a basic hit fills gaps; finishers jump in when their condition holds. On empty ground: walk there (hold to keep walking toward the cursor). |
| Shift + Mouse1 | Attack in place | No movement and no magnet step. Also works with skills (Shift + Q). The modifier is rebindable (Shift, Ctrl, Alt or Space). |
| Mouse2 | Movement gem (always) | Cairn Vault, Anchor Pull, Reed Rush, Silk Roll, Mirror Exchange, Veilstride. |
| Q E Z X C | Quick skill slots | Any learned skill or buff: tap, hold (charge/channel), aimed, or toggle (auras). |
| 1–8, F1–F8 | Quick item slots | Potions, elixirs, scrolls (teleport, return, speed), food, buffs. |
| F | Interact / loot | |
| Tab / Shift+Tab / Esc | Next / previous / clear target | |
| G / H | Auto-Hunt / Auto-Quest | |
| I U K P M J O | Bag, Character, Codex, Atlas, Map, Quests, Social | |
| Wheel / Mouse3-drag / V | Zoom / orbit / switch view | Zoom smoothly from the tactical view (pitch 38–62°) to the close over-the-shoulder view; V toggles. |
Full defaults, the gamepad map and mobile layout: controls.json.
◆Camera: tactical ↔ close
The camera always follows the character like a console game, and WASD is relative to the camera. One continuous zoom (wheel or pinch; V / gamepad R3 toggles) runs between two views:
| View | Feel | Distance · pitch | Aim |
|---|---|---|---|
| Tactical (default) | Silkroad / Path of Exile-style zoomed-out overview: see the pack, telegraphs and terrain | 9–16 m · 38–62° | at the cursor on the ground |
| Close | Dynasty Warriors / Metal Gear-style third person behind the right shoulder, swings to your facing when you move | 3.6 m · 13°, 0.45 m shoulder offset | where you face (centre reticle); magnetism widens to 75° / 6 m |
R3 toggles views only; it is not also recenter or lock-on. Optional close-view boss/elite lock-on uses a separate remappable command, supports target switching/release and never restricts a valid escape. Both views show the same telegraphs, nameplates and HUD; the server never knows which view you use. Try it in the Feel Lab (mouse wheel or the Camera slider).
◆2. The Mouse1 chain (Smart Chain)
Each weapon has a 3-hit basic chain (see weapon families). In the Codex you fill up to 8 chain slots with attack skills only (buffs, auras, summons and mobility can't go there). A build with 8 attack skills can chain all 8. While Mouse1 is held or spammed, each press:
- Finisher check: if a finisher in the chain is ready and its condition is true on the target (stunned, knocked down, launched, …), it fires now. If not, it is skipped silently.
- Otherwise the next ready slot in order fires (off cooldown, enough mana, target inside its shape). Slots on cooldown are skipped; the pointer wraps after the last slot.
- If no slot is ready, the next basic hit plays. Basic hits restore 2 mana each, so spamming sustains itself.
- Inputs pressed during recovery are buffered for 150 ms and fire on the first legal frame. Releasing Mouse1 lets the current action finish its active window; an explicit valid movement gem can interrupt any phase.
- After movement, resume the next eligible chain slot within the proposed 1 s memory window; after expiry restart. Fresh action or deliberate held-chain input is required; interrupted contacts are never replayed.
Settings: number of chain slots in use (0–8), and "finisher jumps the chain" (on by default). Auto-Hunt runs the same list through the same command path, so manual and auto damage feel identical. See finishers.
◆3. Cast phases and cancel windows
Every action follows windup → active → recovery from skills.json (timing).
- Movement gem first (ADR-027): a valid gem cancels any own attack in windup, active or recovery, including signatures/finishers. Mana is required; cooldown, hard control and destination legality still apply. Stun, sleep and knockdown block movement; roots block displacement unless this gem explicitly declares an escape. Invalid requests leave the current attack running and are not buffered for later. Superarmour and local hitstop never delay a valid cancel.
- Windup: stun/sleep/knockdown can interrupt. Movement cancel charges no attack mana before commit. Owner accepted a starting 50% attack cooldown refund; the movement gem pays its full own mana/cooldown once.
- Active: commit costs and authoritative hits. Movement can cancel future cast-owned contacts/ticks; resolved hits stand and no attack refund occurs. Already released independent projectiles/fields continue their defined lifetime.
- Recovery: movement gem cancels immediately. Other skills and ordinary movement cancel after
cancelableAfterS; basic hits can be cancelled into skills at any time after active. Mobile casts retain their locomotion policy. - Superarmour skills ignore flinch/stagger from monsters during their listed window.
At a legal attack window, explicit Q/E/Z/X/C input wins over held Mouse1. WASD is sampled concurrently; it follows the
per-skill locomotion policy rather than waiting behind attacks. Clear older buffered attacks on movement cancel.
Sequence IDs never permit backdating or undoing resolved server hits. Full costs, tie ordering, WASD policies and
C1–C18 self-tests: development guide. Policies are documentation contracts
until implemented and verified; proposed tuning lives in development-standards.json. Owner-suggested movement reuse
starts at Cairn Vault 1 s / Reed Rush 0.3 s. This does not delay activation or apply to every gem: author positive
per-gem mana costs and travel/reuse values before coding; no overlapping movement or free fallback.
WASD/stick intent is sampled throughout animation: full movement for compatible buffs, slower aimed/charged casts, brief authored planted melee contact, and directed lunges. Assign/test each skill; no whole-clip translation lock by default. Valid movement gems always override attack commitment.
The first slice includes server-owned enemy engagement tokens by role/difficulty/visibility, active repositioning crowds, readable boss openings and optional cosmetic KO/combo feedback. No universal simultaneous-attacker cap is inferred; perfect-dodge rewards, hit-confirm cancels, hazards and destruction are deferred.
◆4. Targeting and magnetism
- Desktop: attacks aim at the cursor. Hovering an enemy soft-targets it. Clicking locks the target (Tab cycles).
- Gamepad/mobile: auto-targets inside a 70° forward cone, prioritised nearest / lowest HP / elite / quest (setting).
- Magnetism: melee rotates up to 60° and slides up to 1.5 m toward the target during windup so swings connect. Server-validated (no sliding through walls). Off/Low/Medium/High setting.
- Ground-targeted skills: hold the key to see a jade preview decal and release to cast. On mobile, drag from the button.
◆5. Damage model (proposed — tune in playtests)
hit = weaponRoll × skill% × (1 + Σ increased) × Π more × critMult(if crit) × (1 − mitigation)
increased : weapon notables, mastery, attributes (+0.5%/pt pure, +0.3%/pt hybrid), buffs
conditional: combo payoffs (vs stun/sleep/knockdown/burn/chill/shock…) share ONE bucket capped at +60%
crit : base 5% + weapon + AGI (+0.05%/pt); crit damage 150% base
armour : mitigation = armour / (armour + 10 × rawPhysical) (big hits pierce armour)
resist : monsters have fire/cold/lightning resist 0–40% by family
evasion : chance to evade a monster attack = evasion / (evasion + 4 × monsterAccuracy), max 60%
ailments : chance = skill/gem base × (1 + INT bonus); one roll per target per cast per ailment family
Values marked proposed in the data must be confirmed by playtest before the economy launches (OPEN-6).
◆6. The AAA hit-feel stack
Everything below is local presentation. It runs on the attacker's and target's clients and never changes the server outcome.
| Layer | Spec |
|---|---|
| Anticipation | heavy skills ≥ 0.25 s windup with a readable pose and a glint/charge VFX cue |
| Contact hitstop | freeze attacker + target poses 35 / 55 / 80 / 110 ms (light/medium/heavy/massive). Others keep moving. No global time scale. |
| Camera | trauma model (shake = trauma²), impact adds 0.05 / 0.12 / 0.25 / 0.45, decays at 1.6/s; massive hits add a 3° FOV punch. Setting 0–100%. |
| Hit flash | target rim-light flash, white, 60 ms (with a reduced-flash option) |
| Impact VFX | spark/dust/debris chosen by target hitMaterial (fur, carapace, scale, shell, feather, cloth) |
| Sound | 4 layers: swish (weapon), impact (weight), material (target), sweetener (crit/element). ±6% pitch randomisation, never on telegraphs |
| Damage numbers | white normal, gold crit (1.4×, pop), element tints. Rapid small hits merge into one rolling number |
| Reactions | chosen by impact vs weight (below). Directional flinches, knockback slides, launches |
| Death | death style by killing blow: collapse, blown back, launched, ash, shatter, charred, sliced |
| Haptics | phone vibration / gamepad dual-rumble scaled by impact (feel-quality.json patterns, Haptics setting 0–100%) |
| Tiers | Low → Ultra add debris, scorch decals, dust rings, camera kick, FOV punch, screen shockwave, colour-split pulse and a short screen vibrate (VFX tiers). Outcomes never change. |
| Trails | weapon ribbons per family (weapons.json trail), stretched by swing speed |
◆7. Hit reactions — different for every skill
The server picks the reaction for each hit with this rule (full contract in combat-states.json):
delta = impact(skill hit) − weight(target) light 1 · medium 2 · heavy 3 · massive 4
small 1 · medium 2 · large 3 · boss 4
≤ −1 → flash only 0 → flinch_light 1 → flinch_heavy ≥ 2 → stagger
poise reaches 0 → forced stagger · specials (knockback/knockdown/launch/pull/stun/sleep/root) if the class allows
So a dagger stab (light) only twitches a medium wolf, a greatsword cleave (medium→heavy) staggers it, and Earthsplitter (massive + launch) throws it into the air. Elites are one weight class heavier. Bosses only show hit flashes and fill break pressure. Each monster family has a reaction set (small quadruped, insectoid, reptile, bird, humanoid…) with directional clips, so the same skill reads differently on a beetle (flips on its back) and on a wolf (rolls on its side).
◆8. Monster combat language
- Telegraphs: red-orange fill-up decals (circle, cone, line, ring with a safe centre). Aim locks at telegraph start. Never culled. Same shape on every tier.
- Nature: neutral monsters fight back only when attacked; hostile ones aggro inside their radius and leash back.
- Elites (★): same two abilities, 3× HP, a bigger silhouette aura, never faster or unreadable.
- Bosses: immune to hard control, use break pressure, and have phase rules from
bestiary.json.
◆9. Manual, Assist and Auto
| Mode | Who moves | Who attacks | Use |
|---|---|---|---|
| Manual | you | you (Smart Chain + skills) | default on desktop |
| Assist | you | Smart Chain auto-targets while Mouse1 / Attack is held | mobile default |
| Auto-Hunt | automation | automation using your Smart Chain + buffs + potions | farming, offline (Automation) |
Every mode sends the same validated commands. Auto never gets extra speed or accuracy.
◆10. Accessibility
Camera shake slider, hitstop toggle, reduced flashes, colour-blind palettes (telegraphs also use pattern fills), hold-to-chain vs tap-to-chain, left-handed mobile layout, UI scale 80–130%, subtitles for voiced lines, and full remapping.
Source: zoen/docs/design/COMBAT.md · 2,059 words · edit the Markdown, not this page.

