Give item categories and subtypes real types (refactor step 2)
ObjectKind separates what an item is from how it draws: Object.Type (a byte that doubled as the map character) becomes Kind ObjectKind, with Glyph() producing the display character and objectKindForGlyph converting back at the map boundary. KindWand covers the C 'stick' category. The magic-missile bolt uses KindGold, matching C's literal o_type='*' trick, with a comment. PotionKind, ScrollKind, RingKind, WandKind, WeaponKind, ArmorKind and TrapKind are now iota enums with Stringer (names come from the base info tables); Object gains typed accessors (obj.RingKind(), ...) and Launch is typed WeaponKind. beTrapped returns TrapKind. The getItem/inventory/whatis prompt filters take ObjectKind, with KindCallable/KindRingOrStick replacing the C CALLABLE/R_OR_S sentinels; wizard.c's type_name table is subsumed by ObjectKind.String(). IsRing/IsWearing/initWeapon/doPot signatures are typed accordingly. The save format version becomes 5.4.4-go2: the gob field rename would otherwise silently zero Kind when reading old saves. No behavior change; full suite green.
This commit is contained in:
@@ -4,12 +4,12 @@ import "fmt"
|
||||
|
||||
// weapons.c — functions for dealing with problems brought about by weapons.
|
||||
|
||||
const noWeapon = -1
|
||||
const noWeapon WeaponKind = -1
|
||||
|
||||
// missile fires a missile in a given direction (weapons.c missile).
|
||||
func (g *RogueGame) missile(ydelta, xdelta int) {
|
||||
// Get which thing we are hurling
|
||||
obj := g.getItem("throw", int(Weapon))
|
||||
obj := g.getItem("throw", KindWeapon)
|
||||
if obj == nil {
|
||||
return
|
||||
}
|
||||
@@ -48,7 +48,7 @@ func (g *RogueGame) doMotion(obj *Object, ydelta, xdelta int) {
|
||||
if stepOk(ch) && ch != Door {
|
||||
// It hasn't hit anything yet, so display it if it's alright.
|
||||
if g.cansee(obj.Pos.Y, obj.Pos.X) && !g.Options.Terse {
|
||||
g.mvaddch(obj.Pos.Y, obj.Pos.X, obj.Type)
|
||||
g.mvaddch(obj.Pos.Y, obj.Pos.X, obj.Kind.Glyph())
|
||||
g.refresh()
|
||||
}
|
||||
continue
|
||||
@@ -61,13 +61,13 @@ func (g *RogueGame) doMotion(obj *Object, ydelta, xdelta int) {
|
||||
func (g *RogueGame) fall(obj *Object, pr bool) {
|
||||
if fpos, ok := g.fallpos(obj.Pos); ok {
|
||||
pp := g.Level.At(fpos.Y, fpos.X)
|
||||
pp.Ch = obj.Type
|
||||
pp.Ch = obj.Kind.Glyph()
|
||||
obj.Pos = fpos
|
||||
if g.cansee(fpos.Y, fpos.X) {
|
||||
if pp.Monst != nil {
|
||||
pp.Monst.OldCh = obj.Type
|
||||
pp.Monst.OldCh = obj.Kind.Glyph()
|
||||
} else {
|
||||
g.mvaddch(fpos.Y, fpos.X, obj.Type)
|
||||
g.mvaddch(fpos.Y, fpos.X, obj.Kind.Glyph())
|
||||
}
|
||||
}
|
||||
attachObj(&g.Level.Objects, obj)
|
||||
@@ -98,12 +98,12 @@ func (g *RogueGame) wield() {
|
||||
return
|
||||
}
|
||||
p.CurWeapon = oweapon
|
||||
obj := g.getItem("wield", int(Weapon))
|
||||
obj := g.getItem("wield", KindWeapon)
|
||||
if obj == nil {
|
||||
g.After = false
|
||||
return
|
||||
}
|
||||
if obj.Type == Armor {
|
||||
if obj.Kind == KindArmor {
|
||||
g.msg("you can't wield armor")
|
||||
g.After = false
|
||||
return
|
||||
@@ -123,9 +123,9 @@ func (g *RogueGame) wield() {
|
||||
|
||||
// initWeaps is the weapons.c init_dam[] table.
|
||||
var initWeaps = [NumWeaponTypes]struct {
|
||||
dam string // damage when wielded
|
||||
hrl string // damage when thrown
|
||||
launch int // launching weapon
|
||||
dam string // damage when wielded
|
||||
hrl string // damage when thrown
|
||||
launch WeaponKind // launching weapon
|
||||
flags ObjFlags
|
||||
}{
|
||||
{"2x4", "1x3", noWeapon, 0}, // WeaponMace
|
||||
@@ -140,10 +140,10 @@ var initWeaps = [NumWeaponTypes]struct {
|
||||
}
|
||||
|
||||
// initWeapon sets up a new weapon (weapons.c init_weapon).
|
||||
func (g *RogueGame) initWeapon(weap *Object, which int) {
|
||||
func (g *RogueGame) initWeapon(weap *Object, which WeaponKind) {
|
||||
iwp := &initWeaps[which]
|
||||
weap.Type = Weapon
|
||||
weap.Which = which
|
||||
weap.Kind = KindWeapon
|
||||
weap.Which = int(which)
|
||||
weap.Damage = iwp.dam
|
||||
weap.HurlDmg = iwp.hrl
|
||||
weap.Launch = iwp.launch
|
||||
|
||||
Reference in New Issue
Block a user