228 lines
7.1 KiB
Go
228 lines
7.1 KiB
Go
package level
|
|
|
|
import "fmt"
|
|
|
|
// TileFlag describes simple properties of a map tile.
|
|
type TileFlag uint32
|
|
|
|
// RealWorldFlag describes simple properties of a map tile in the real world.
|
|
type RealWorldFlag TileFlag
|
|
|
|
// CyberspaceFlag describes simple properties of a map tile in cyberspace.
|
|
type CyberspaceFlag TileFlag
|
|
|
|
// ForRealWorld interprets the flag value for the real world.
|
|
func (flag TileFlag) ForRealWorld() RealWorldFlag {
|
|
return RealWorldFlag(flag)
|
|
}
|
|
|
|
// ForCyberspace interprets the flag value for cyberspace.
|
|
func (flag TileFlag) ForCyberspace() CyberspaceFlag {
|
|
return CyberspaceFlag(flag)
|
|
}
|
|
|
|
// MusicZone returns the music zone.
|
|
func (flag TileFlag) MusicZone() TileMusicZone {
|
|
return TileMusicZone((flag & 0x0000E000) >> 13)
|
|
}
|
|
|
|
// WithMusicZone returns a new flag value with the given music index set.
|
|
func (flag TileFlag) WithMusicZone(value TileMusicZone) TileFlag {
|
|
return TileFlag(uint32(flag&^0x0000E000) | (uint32(value) << 13))
|
|
}
|
|
|
|
// Peril returns whether the tile is marked as peril (may play peril music).
|
|
func (flag TileFlag) Peril() bool {
|
|
return (flag & 0x00001000) != 0
|
|
}
|
|
|
|
// WithPeril returns a flag with the given peril set.
|
|
func (flag TileFlag) WithPeril(value bool) TileFlag {
|
|
var valueFlag uint32
|
|
if value {
|
|
valueFlag = 0x00001000
|
|
}
|
|
return TileFlag(uint32(flag&^0x00001000) | valueFlag)
|
|
}
|
|
|
|
// SlopeControl returns the slope control as per flags.
|
|
func (flag TileFlag) SlopeControl() TileSlopeControl {
|
|
return TileSlopeControl((flag & 0x00000C00) >> 10)
|
|
}
|
|
|
|
// WithSlopeControl returns a new flag value with the given slope control set.
|
|
func (flag TileFlag) WithSlopeControl(ctrl TileSlopeControl) TileFlag {
|
|
return TileFlag(uint32(flag&^0x00000C00) | (uint32(ctrl&0x3) << 10))
|
|
}
|
|
|
|
// AsTileFlag returns the flags as regular tile flag value.
|
|
func (flag RealWorldFlag) AsTileFlag() TileFlag {
|
|
return TileFlag(flag)
|
|
}
|
|
|
|
// WallTextureOffset returns the vertical offset (in tile height units) to apply for wall textures.
|
|
func (flag RealWorldFlag) WallTextureOffset() TileHeightUnit {
|
|
return TileHeightUnit(flag & 0x0000001F)
|
|
}
|
|
|
|
// WithWallTextureOffset returns a flag value with the given wall texture offset.
|
|
func (flag RealWorldFlag) WithWallTextureOffset(value TileHeightUnit) RealWorldFlag {
|
|
return RealWorldFlag(uint32(flag&^0x0000001F) | uint32(value&0x1F))
|
|
}
|
|
|
|
// WallTexturePattern returns the pattern to apply for walls.
|
|
func (flag RealWorldFlag) WallTexturePattern() WallTexturePattern {
|
|
return WallTexturePattern(byte(flag&0x00000060) >> 5)
|
|
}
|
|
|
|
// WithWallTexturePattern returns a flag with the given pattern set.
|
|
func (flag RealWorldFlag) WithWallTexturePattern(value WallTexturePattern) RealWorldFlag {
|
|
return RealWorldFlag(uint32(flag&^0x00000060) | (uint32(value&0x3) << 5))
|
|
}
|
|
|
|
// UseAdjacentWallTexture returns whether the wall texture from the adjacent tile should be used for each side.
|
|
func (flag RealWorldFlag) UseAdjacentWallTexture() bool {
|
|
return (flag & 0x00000100) != 0
|
|
}
|
|
|
|
// WithUseAdjacentWallTexture returns a flag with the given usage set.
|
|
func (flag RealWorldFlag) WithUseAdjacentWallTexture(value bool) RealWorldFlag {
|
|
var valueFlag uint32
|
|
if value {
|
|
valueFlag = 0x00000100
|
|
}
|
|
return RealWorldFlag(uint32(flag&^0x00000100) | valueFlag)
|
|
}
|
|
|
|
// Deconstructed returns whether the tile is marked as heavily deconstructed (should play spooky music).
|
|
func (flag RealWorldFlag) Deconstructed() bool {
|
|
return (flag & 0x00000200) != 0
|
|
}
|
|
|
|
// WithDeconstructed returns a flag with the given deconstruction set.
|
|
func (flag RealWorldFlag) WithDeconstructed(value bool) RealWorldFlag {
|
|
var valueFlag uint32
|
|
if value {
|
|
valueFlag = 0x00000200
|
|
}
|
|
return RealWorldFlag(uint32(flag&^0x00000200) | valueFlag)
|
|
}
|
|
|
|
// FloorShadow returns the floor shadow value. Range: [0..GradesOfShadow].
|
|
func (flag RealWorldFlag) FloorShadow() int {
|
|
return int((flag & 0x000F0000) >> 16)
|
|
}
|
|
|
|
// WithFloorShadow returns a new flag value with the given floor shadow set. Values beyond allowed range are ignored.
|
|
func (flag RealWorldFlag) WithFloorShadow(value int) RealWorldFlag {
|
|
if (value < 0) || (value >= GradesOfShadow) {
|
|
return flag
|
|
}
|
|
return RealWorldFlag(uint32(flag&^0x000F0000) | (uint32(value) << 16))
|
|
}
|
|
|
|
// CeilingShadow returns the ceiling shadow value. Range: [0..GradesOfShadow].
|
|
func (flag RealWorldFlag) CeilingShadow() int {
|
|
return int((flag & 0x0F000000) >> 24)
|
|
}
|
|
|
|
// WithCeilingShadow returns a new flag value with the given ceiling shadow set. Values beyond allowed range are ignored.
|
|
func (flag RealWorldFlag) WithCeilingShadow(value int) RealWorldFlag {
|
|
if (value < 0) || (value >= GradesOfShadow) {
|
|
return flag
|
|
}
|
|
return RealWorldFlag(uint32(flag&^0x0F000000) | (uint32(value) << 24))
|
|
}
|
|
|
|
// TileVisited returns whether the tile is marked as being visited (seen).
|
|
func (flag RealWorldFlag) TileVisited() bool {
|
|
return (flag & 0x80000000) != 0
|
|
}
|
|
|
|
// WithTileVisited returns a flag with the given visited set.
|
|
func (flag RealWorldFlag) WithTileVisited(value bool) RealWorldFlag {
|
|
var valueFlag uint32
|
|
if value {
|
|
valueFlag = 0x80000000
|
|
}
|
|
return RealWorldFlag(uint32(flag&^0x80000000) | valueFlag)
|
|
}
|
|
|
|
// AsTileFlag returns the flags as regular tile flag value.
|
|
func (flag CyberspaceFlag) AsTileFlag() TileFlag {
|
|
return TileFlag(flag)
|
|
}
|
|
|
|
// GameOfLifeState returns the current game-of-life state.
|
|
func (flag CyberspaceFlag) GameOfLifeState() int {
|
|
return int(byte(flag&0x00000060) >> 5)
|
|
}
|
|
|
|
// WithGameOfLifeState returns a flag with the given game-of-life state set.
|
|
func (flag CyberspaceFlag) WithGameOfLifeState(value int) CyberspaceFlag {
|
|
return CyberspaceFlag(uint32(flag&^0x00000060) | (uint32(value&0x3) << 5))
|
|
}
|
|
|
|
// FlightPull returns the pull applying in a tile.
|
|
func (flag CyberspaceFlag) FlightPull() CyberspaceFlightPull {
|
|
return CyberspaceFlightPull((uint32(flag&0x01000000) >> 20) | (uint32(flag&0x000F0000) >> 16))
|
|
}
|
|
|
|
// WithFlightPull returns a flag instance with the given pull applied.
|
|
func (flag CyberspaceFlag) WithFlightPull(value CyberspaceFlightPull) CyberspaceFlag {
|
|
newFlag := uint32(flag &^ 0x010F0000)
|
|
newFlag |= uint32(value&0x0F) << 16
|
|
newFlag |= uint32(value&0x10) << 20
|
|
return CyberspaceFlag(newFlag)
|
|
}
|
|
|
|
type TileMusicZone byte
|
|
|
|
const (
|
|
TileMusicZoneNoMusic TileMusicZone = 0
|
|
TileMusicZoneHospital TileMusicZone = 1
|
|
TileMusicZoneExecutive TileMusicZone = 2
|
|
TileMusicZoneIndustrial TileMusicZone = 3
|
|
TileMusicZoneMetal TileMusicZone = 4
|
|
TileMusicZonePark TileMusicZone = 5
|
|
TileMusicZoneBridge TileMusicZone = 6
|
|
TileMusicZoneElevator TileMusicZone = 7
|
|
)
|
|
|
|
// TileSlopeControls returns all control values.
|
|
func TileMusicZones() []TileMusicZone {
|
|
return []TileMusicZone{
|
|
TileMusicZoneNoMusic,
|
|
TileMusicZoneHospital,
|
|
TileMusicZoneExecutive,
|
|
TileMusicZoneIndustrial,
|
|
TileMusicZoneMetal,
|
|
TileMusicZonePark,
|
|
TileMusicZoneBridge,
|
|
TileMusicZoneElevator,
|
|
}
|
|
}
|
|
|
|
func (ctrl TileMusicZone) String() string {
|
|
switch ctrl {
|
|
case TileMusicZoneNoMusic:
|
|
return "No Music"
|
|
case TileMusicZoneHospital:
|
|
return "Hospital"
|
|
case TileMusicZoneExecutive:
|
|
return "Executive"
|
|
case TileMusicZoneIndustrial:
|
|
return "Industrial"
|
|
case TileMusicZoneMetal:
|
|
return "Metal"
|
|
case TileMusicZonePark:
|
|
return "Park"
|
|
case TileMusicZoneBridge:
|
|
return "Bridge"
|
|
case TileMusicZoneElevator:
|
|
return "Elevator"
|
|
default:
|
|
return fmt.Sprintf("Unknown%02X", int(ctrl))
|
|
}
|
|
}
|