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

63 lines
1.7 KiB
Go

package level
// TilePosition contains the coordinates of a tile in a level.
type TilePosition struct {
X byte
Y byte
}
// FinePosition contains the coordinates of an object within a tile.
type FinePosition struct {
X byte
Y byte
}
// SlopeFactorFor returns the factor of how much the slope of given tile type would apply at the fine position.
func (pos FinePosition) SlopeFactorFor(tileType TileType) float32 {
southToNorth := float32(pos.Y) / 255
westToEast := float32(pos.X) / 255
swneDiag := func(northWest, southEast float32) float32 {
if pos.X < pos.Y {
return northWest
}
return southEast
}
nwseDiag := func(southWest, northEast float32) float32 {
if (255 - pos.X) < pos.Y {
return northEast
}
return southWest
}
switch tileType {
case TileTypeSlopeSouthToNorth:
return southToNorth
case TileTypeSlopeWestToEast:
return westToEast
case TileTypeSlopeNorthToSouth:
return 1 - southToNorth
case TileTypeSlopeEastToWest:
return 1 - westToEast
case TileTypeValleySouthEastToNorthWest:
return nwseDiag(1-westToEast, southToNorth)
case TileTypeValleySouthWestToNorthEast:
return swneDiag(southToNorth, westToEast)
case TileTypeValleyNorthWestToSouthEast:
return nwseDiag(1-southToNorth, westToEast)
case TileTypeValleyNorthEastToSouthWest:
return swneDiag(1-westToEast, 1-southToNorth)
case TileTypeRidgeNorthWestToSouthEast:
return nwseDiag(westToEast, 1-southToNorth)
case TileTypeRidgeNorthEastToSouthWest:
return swneDiag(1-southToNorth, 1-westToEast)
case TileTypeRidgeSouthEastToNorthWest:
return nwseDiag(southToNorth, 1-westToEast)
case TileTypeRidgeSouthWestToNorthEast:
return swneDiag(westToEast, southToNorth)
}
return 0.0
}