feat(spells): shield (GHY KOR) — timed damage-reduction ward #85

Merged
marco merged 1 commit from feat/spell-shield into main 2026-07-19 11:36:54 +02:00
Owner

Slice 2b, part 2 — the shield form.

Shield (GHY KOR)

Water-only self ward: reduces incoming damage by ShieldReductionPercent (50%) for ShieldDurationTicks (~10s), refreshed on recast, dropped on relog (transient). Water is the defensive element, so fire + shield is invalid (reuses the InvalidCombination cue).

  • ShieldSpell + catalog entry; the ward is transient state on Mobile (ShieldUntilTick), read by CombatSystem.ApplyDamage.
  • ApplyDamage now returns the actual damage dealt so the floating number reflects the mitigation — melee (AttackOutcome) and the bolt both show the reduced value. DamageResult.Dealt added; the invulnerable dummy still reports the full attempted number.
  • SpellCastResult.Shielded carries the duration; WorldTick broadcasts Shielded (seconds) within AoI.
  • Client: key 4 = KOR, a cyan ward ring on the caster for the duration.
  • SpellOptions/GameOptions tuning; docs/spells.md updated.
  • Real UO shield shimmer art is a follow-up (#84).

Element identity

Water = support (bolt + heal + shield), fire = offense (bolt only). Fire+heal and fire+shield both fizzle as invalid combinations.

Definition of Done

  • With a shield up, an incoming bolt/melee deals ~half damage, and the floating number shows the reduced value.
  • The ward lapses after its duration (full damage again) and resets on relog/death.
  • 2 → 4 (GHY KOR) raises the ward (cyan ring); 1 → 4 (fire+shield) fizzles with "Those words don't combine."
  • Suite green, whole solution builds, zero warnings.
Slice 2b, part 2 — the **shield** form. ### Shield (GHY KOR) Water-only self ward: reduces incoming damage by **ShieldReductionPercent (50%)** for **ShieldDurationTicks (~10s)**, refreshed on recast, dropped on relog (transient). Water is the defensive element, so **fire + shield is invalid** (reuses the InvalidCombination cue). - `ShieldSpell` + catalog entry; the ward is transient state on `Mobile` (`ShieldUntilTick`), read by `CombatSystem.ApplyDamage`. - **`ApplyDamage` now returns the actual damage dealt** so the floating number reflects the mitigation — melee (`AttackOutcome`) and the bolt both show the reduced value. `DamageResult.Dealt` added; the invulnerable dummy still reports the full attempted number. - `SpellCastResult.Shielded` carries the duration; `WorldTick` broadcasts `Shielded` (seconds) within AoI. - Client: **key 4 = KOR**, a cyan ward ring on the caster for the duration. - `SpellOptions`/`GameOptions` tuning; `docs/spells.md` updated. - Real UO shield shimmer art is a follow-up (#84). ### Element identity Water = support (bolt + heal + shield), fire = offense (bolt only). Fire+heal and fire+shield both fizzle as invalid combinations. ## Definition of Done - [ ] With a shield up, an incoming bolt/melee deals ~half damage, and the floating number shows the reduced value. - [ ] The ward lapses after its duration (full damage again) and resets on relog/death. - [ ] **2 → 4** (GHY KOR) raises the ward (cyan ring); **1 → 4** (fire+shield) fizzles with "Those words don't combine." - [ ] Suite green, whole solution builds, zero warnings.
feat(spells): shield (GHY KOR) — timed damage-reduction ward
All checks were successful
ci / Lint & Test (pull_request) Successful in 2m6s
44fa5b1279
Water-only self shield: a transient ward on the caster reduces incoming damage
by ShieldReductionPercent for ShieldDurationTicks (~10s), refreshed on recast,
dropped on relog. Fire + shield is an invalid combination (water is the
defensive element).

- ShieldSpell + catalog entry; the ward is state on Mobile, read by
  CombatSystem.ApplyDamage which now returns the actual damage dealt so the
  floating number reflects the mitigation (melee and bolt both use it)
- SpellCastResult.Shielded carries the duration; WorldTick broadcasts Shielded
  (in seconds) within AoI
- Client: key 4 = KOR, a cyan ward ring on the caster for the duration
- SpellOptions/GameOptions tuning; docs/spells.md updated

Real UO shield shimmer art is a follow-up (#84).
marco merged commit eb14461c45 into main 2026-07-19 11:36:54 +02:00
marco deleted branch feat/spell-shield 2026-07-19 11:36:55 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
marco/IsoMmo!85
No description provided.