packages feed

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)