topkata-0.0: Topkata/World/Base.hs
module Topkata.World.Base where
import Data.Array
import Data.Ix
data BlockSide = SideFront | SideBack | SideLeft | SideTop | SideRight | SideBottom
deriving (Enum, Ix, Ord, Eq, Show)
allSides = [SideFront .. SideBottom]
type Pos = (Int, Int, Int)
type World =
Array Pos Block
data WallState = Solid | Open | NotSet
deriving (Show, Eq)
type Block = [BlockSide] -- list of open sides
-- type Direction = Ahead | Back | Left | Right | Up | Down
{-
go (x, y, z) Ahead = (x, y, z+1)
go (x, y, z) Back = (x, y, z-1)
go (x, y, z) Left = (x-1, y, z)
go (x, y, z) Right = (x+1, y, z)
go (x, y, z) Up = (x, y+1, z)
go (x, y, z) Down = (x, y-1, z)
-}
dirAhead = (0, 0, +1)
dirBack = (0, 0, -1)
dirLeft = (-1, 0, 0)
dirRight = (+1, 0, 0)
dirUp = (0, +1, 0)
dirDown = (0, -1, 0)
origin :: Pos
origin = (1,1,1)
mkArray :: Ix a => (a, a) -> b -> Array a b
mkArray bounds elem =
array bounds [ (ix, elem) | ix <- range bounds]
mkBlockWalls :: Block
mkBlockWalls = []
emptyWorld size = mkArray (origin, size) mkBlockWalls
myHorizFrontSide 0 1 = SideBack
myHorizFrontSide 0 (-1) = SideFront
myHorizFrontSide 1 0 = SideRight
myHorizFrontSide (-1) 0 = SideRight
wallInFrontOfMe world x y z dx dz =
myHorizFrontSide dx dz `elem` block
where block = world ! (x, y, z)