Epic: spell system — server-paced power-word duel (vertical slices) #36
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo#36
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Epic tracking the spell system — the agreed player-facing design is
docs/game-design/systems/spell-system.md(produced by the game-design interview + a 4-lens critical panel). This epic's original sketch ("Vulgare Arcano", a 118-word compositional formula language submitted atomically) is superseded: the interview converged on a different, tighter model whose core value it keeps.The agreed design (one-liner)
You don't cast fixed spells — you speak them one power word at a time, in public, at a server-paced rhythm (~0.75s/word, tick-driven). Combat is a real-time duel of reading, predicting, and bluffing your opponent's incantation. Element first (XEN fire / GHY water), form second (attack-bolt / shield / heal); ~7 words in the MVP. Full spec + six-lens review + player-observable DoD in the design doc.
Why the pivot: atomic formula submission kills the word-by-word tell and the bluff/feint the duel is built on; and the emergent 118-word grammar was deliberately scoped down to 5 fixed valid combos. The design doc is the source of truth.
Technical direction (server-authoritative)
World-ownedSpellSystemcomponent (no lock — the single sim thread serializes it, #54): current mana + regen, the in-progress incantation FSM, shield stance, cooldowns, known-words.World.csonly delegates (HARD GATE).Castwith a pre-picked target,CancelCast); the server paces word emission, charges mana (no refund), broadcastsPowerWordSpokenvia AoI (not the chat/ChatRateLimiterpath). A modified client cannot rush the sequence → the public tell + anti-bot property always hold.TargetValidator(LOS+range), thePendingSwing/_pending"queue-now-resolve-at-a-future-tick" idiom, skills-as-data (addMagery), AoI broadcast, the damage-number pipeline, GM-spawn for the training dummy.Mobile.OnHit) introduced only when a type must react differently (shield-absorb / disrupt); MVP keeps shield state inSpellSystem.Implementation slices (each its own green PR)
SpellSystemstepped from the tick; add theMageryskill. Server-only, unit-tested. (in progress)Cast(fire, attack, target), re-validate LOS+range at a resolve tick → fizzle, elemental damage, mana spend, Magery gain,PowerWordSpoken+ damage number. Proves cast→target→resolve→damage against the dummy.Server slices (0–3) land before UI (4) so each is testable headless against
World.Definition of Done
The player-observable DoD is the one in
docs/game-design/systems/spell-system.md(duel with visible word-by-word tells at a rhythm no client can rush; feint; cancel + 2s reset; targeted attack that fizzles on lost LOS/range and can't reach outside AoI; shield absorbs one hit of any element; fire bolt > water bolt; self-heal < bolt with a cooldown; "fire cannot heal" distinct cue; 3-word silence; mana spent with no refund and gates casting; casting trains Magery; legend + practice; key-or-click parity; the training-dummy demonstration). Each slice's own DoD is the delta it delivers toward that whole.Agreed design (game-design review)
Produced with the
game-designskill: a multi-round interview + a 4-lens critical panel. Full design doc:docs/game-design/systems/spell-system.md(PR #48). This comment is the player-facing summary; the technical breakdown is a separate review and should be filed as sub-issues of this epic.One-liner: you dont cast fixed spells — you speak them, one power word at a time, in public; combat is a real-time duel of reading, predicting, and bluffing your opponents incantation.
Six-lens summary
World-ownedSpellSystemcomponent, transient mana, Magery use-based skill, cast-walk via the movement component (HARD GATE).Definition of Done (player-observable)
Deferred: 4 elements, the telegraphing sparring dummy, grimoire, reagents, word-unlock quests, group-fight legibility + interrupt anti-lock.
Epic: compositional spell language (Vulgare Arcano) — vertical sliceto Epic: spell system — server-paced power-word duel (vertical slices)Spell VFX requirement (owner): the spells must be visible — fireball (projectile + explosion), shield (aura/shimmer), heal (sparkle), etc. — not just damage numbers. Reuse as much legacy UO effect art as possible via the AssetExtractor →
assets.isoapack (neweffect/namespace; effect graphic ids need a discovery pass, as the human anims did). Reuse smartly: one projectile art hued per element (fire warm / water blue) rather than separate art; reuse the explosion, heal sparkle, and an aura for the shield. Server stays authoritative — it sends an effect descriptor (e.g.fire bolt A→B,heal self,shield up X) in the spell broadcast; the client maps it to the art and renders (never decides an effect happened). UO effect art is a temporary placeholder like the rest, to be replaced via the Asset Editor. Tracked as its own slice: extract UO effect art + client spell-FX rendering, feeding slice 1 (bolt) and slice 4 (client polish).Art slice also covers the training-dummy art. Use the real UO training dummy: it is an animated static in
art.mul(the bag/dummy on a post that swings when struck), not a body animation. Pack its static frame(s) undercreature/dummy/(e.g.stand_2, and later the swing frames) reusing the extractor's static→frame path (ArtToFrame) — the same discovery-pass tooling as the spell FX (AssetExtractor statics --range) finds the id (candidate ~0x1070-range, confirm visually). The server dummy (#60) already uses kinddummy, so it renders the UO art automatically once packed. Bonus: play the UO swing frames on-hit (one-shot animator, triggered by theSpellBolt/Attackedbroadcast).MVP fully landed across this session's vertical slices: slice 0 persisted mana + Magery (#57), slice 1 server-authoritative fire/water bolt + UO fireball VFX (#58/#67), slice 2a the server-paced incantation FSM (#75/#77), slice 2b shield (#85) + heal (#82) with the invalid-combination cue, the Spell/SpellCatalog hierarchy (#79), and self-VFX (#92). Element-first/form-second, XEN/GHY + bolt/shield/heal, the public word-by-word tell, mana-per-word, timeout, and Lop cancel all work per the design doc. The MVP duel is playable; further spells/balance can be tracked as fresh issues. Closing the epic.