Ticker mixin, Particle VFX, Staff/Bhs attack logic, Scene ticks
- Add Ticker mixin with pure virtual tick(double dt)
- Remove virtual tick from Node; only Ticker subclasses tick
- Scene maintains tickers map; dispatches tick to all Ticker nodes
- Add Particle: physics sphere that despawns after 1 second
- Spawn particle rings on hit and crit for BHS and Staff
- Add virtual getDmg/isCrit/onAttack to Weapon as pure virtuals
- Remove attackCb lambda from Weapon::Ctor; replace with overrides
- Implement Staff::onAttack with sphere collision query and VFX
- Implement Bhs::onAttack with projectile spawn and crit support
- Add lvl field to Weapon::Ctor; scale damage via exponential formula
- Add Staff::Ctor and Bhs::Ctor with lvl parameter
- Rename applyDamage to applyDmg on Mob and CrystalSanctuaryGuardian
- Rename weapon to weaponMesh in Player for clarity
- Extract Player::animTick for weapon mesh sync and anim state machine
- Fix curWeapon null init in Player
- Remove Node::tickInternal; use Scene::tick for all ticking
- Replace scene➡️tickInternal(dt) with scene➡️tick(dt) in gameplay/editor
- Add particle/Particle mesh asset
- Fix todo: mark staff icon, BHS VFX, inventory UI as done