105 lines
2.2 KiB
Go
105 lines
2.2 KiB
Go
package object
|
|
|
|
import "fmt"
|
|
|
|
// Class describes a general category of objects.
|
|
type Class byte
|
|
|
|
// String returns the textual representation.
|
|
func (c Class) String() string {
|
|
if int(c) >= len(classNames) {
|
|
return fmt.Sprintf("Unknown%02X", int(c))
|
|
}
|
|
return classNames[c]
|
|
}
|
|
|
|
// Object classes constants.
|
|
const (
|
|
ClassGun Class = 0
|
|
ClassAmmo Class = 1
|
|
ClassPhysics Class = 2
|
|
ClassGrenade Class = 3
|
|
ClassDrug Class = 4
|
|
ClassHardware Class = 5
|
|
ClassSoftware Class = 6
|
|
ClassBigStuff Class = 7
|
|
ClassSmallStuff Class = 8
|
|
ClassFixture Class = 9
|
|
ClassDoor Class = 10
|
|
ClassAnimating Class = 11
|
|
ClassTrap Class = 12
|
|
ClassContainer Class = 13
|
|
ClassCritter Class = 14
|
|
)
|
|
|
|
var classNames = []string{
|
|
"Gun",
|
|
"Ammo",
|
|
"Physics",
|
|
"Grenade",
|
|
"Drug",
|
|
"Hardware",
|
|
"Software",
|
|
"BigStuff",
|
|
"SmallStuff",
|
|
"Fixture",
|
|
"Door",
|
|
"Animating",
|
|
"Trap",
|
|
"Container",
|
|
"Critter",
|
|
}
|
|
|
|
// Classes returns a list of all classes.
|
|
func Classes() []Class {
|
|
var classes [ClassCount]Class
|
|
for class := Class(0); class < ClassCount; class++ {
|
|
classes[class] = class
|
|
}
|
|
return classes[:]
|
|
}
|
|
|
|
// Subclass divides an object class.
|
|
type Subclass byte
|
|
|
|
// Type describes one specific object.
|
|
type Type byte
|
|
|
|
// Triple identifies one specific object by its full coordinate.
|
|
type Triple struct {
|
|
Class Class
|
|
Subclass Subclass
|
|
Type Type
|
|
}
|
|
|
|
// TripleFrom returns a Triple instance with given values as coordinates.
|
|
func TripleFrom(class, subclass, objType int) Triple {
|
|
return Triple{
|
|
Class: Class(class),
|
|
Subclass: Subclass(subclass),
|
|
Type: Type(objType),
|
|
}
|
|
}
|
|
|
|
// TripleFromInt returns a Triple instance based on a single integer value.
|
|
func TripleFromInt(value int) Triple {
|
|
return Triple{
|
|
Class: Class((value >> 16) & 0xFF),
|
|
Subclass: Subclass((value >> 8) & 0xFF),
|
|
Type: Type((value >> 0) & 0xFF),
|
|
}
|
|
}
|
|
|
|
// String returns the textual representation of the triple as "cl/s/ty" string.
|
|
func (triple Triple) String() string {
|
|
return fmt.Sprintf("%2d/%d/%2d", triple.Class, triple.Subclass, triple.Type)
|
|
}
|
|
|
|
// Int returns the triple as a single integer value.
|
|
func (triple Triple) Int() int {
|
|
value := int(triple.Class) << 16
|
|
value |= int(triple.Subclass) << 8
|
|
value |= int(triple.Type) << 0
|
|
return value
|
|
}
|