Convert doZap to a per-wand handler table (refactor step 7)
The do_zap switch becomes gameData.zapHandlers, indexed by WandKind; the shared monster-ray preamble is zapRayMonster/zapVictim, teleport away/to and the three bolt wands share handlers, and a false return aborts the zap without spending a charge (drain life on a too-weak hero, as in C). Effect order and RNG call sequence unchanged.
This commit is contained in:
@@ -132,6 +132,11 @@ type gameData struct {
|
||||
// the cases of the scrolls.c read_scroll switch. The handler gets
|
||||
// the scroll being read (the identify family needs its subtype).
|
||||
readHandlers [NumScrollTypes]func(g *RogueGame, obj *Object)
|
||||
|
||||
// zapHandlers dispatches each wand kind to its effect method: the
|
||||
// cases of the sticks.c do_zap switch. A false return aborts the
|
||||
// zap without using a charge (drain life on a too-weak hero).
|
||||
zapHandlers [NumWandTypes]func(g *RogueGame, obj *Object) bool
|
||||
}
|
||||
|
||||
// ripWall is the repeated blank wall line of the tombstone art.
|
||||
@@ -635,6 +640,22 @@ func newGameData() *gameData {
|
||||
ScrollAggravateMonsters: (*RogueGame).readAggravateMonsters,
|
||||
ScrollProtectArmor: (*RogueGame).readProtectArmor,
|
||||
},
|
||||
|
||||
zapHandlers: [NumWandTypes]func(*RogueGame, *Object) bool{
|
||||
WandLight: (*RogueGame).zapLight,
|
||||
WandInvisibility: (*RogueGame).zapInvisibility,
|
||||
WandLightning: (*RogueGame).zapBolt,
|
||||
WandFire: (*RogueGame).zapBolt,
|
||||
WandCold: (*RogueGame).zapBolt,
|
||||
WandPolymorph: (*RogueGame).zapPolymorph,
|
||||
WandMagicMissile: (*RogueGame).zapMagicMissile,
|
||||
WandHasteMonster: (*RogueGame).zapSpeed,
|
||||
WandSlowMonster: (*RogueGame).zapSpeed,
|
||||
WandDrainLife: (*RogueGame).zapDrainLife,
|
||||
WandTeleportAway: (*RogueGame).zapTeleport,
|
||||
WandTeleportTo: (*RogueGame).zapTeleport,
|
||||
WandCancellation: (*RogueGame).zapCancellation,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user