Files
questshock/modding/hacked/ss1/content/archive/level/TileFlag.go
T

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))
}
}