Implements source-aware triggered-ability damage for ETB and dies triggers
as part of the ongoing issue #86 damage-routing work.
Changes:
- Add deal_damage() centralized static method to GameEngine that handles
life reduction, stats tracking, elimination checks, and event logging
- Add etb_damage/dies_damage fields and target modes to Card model
- Add _detect_trigger_damage() heuristic in rules.py to parse ETB/dies
damage amounts and target modes from oracle text
- Wire ETB triggers to fire when creatures enter via _play_spells and
commander casting from command zone
- Wire dies triggers to fire in _send_to_graveyard for removal, board
wipes, and combat deaths
- Route combat damage through deal_damage() for consistent stat tracking
- Add 24 targeted regression tests covering deal_damage unit behavior,
trigger detection, ETB/dies firing, combat routing, and integration
All 355 existing tests continue to pass with 0 regressions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>