{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE LambdaCase #-}
module Imj.Game.Hamazed.World.Types
( World(..)
, WallDistribution(..)
, WorldShape(..)
, BattleShip(..)
, Number(..)
, Boundaries(..)
, mkWorldContainer
, InTerminal(..)
, environmentInteraction
, module Imj.Iteration
, module Imj.Graphics.Text.Animation
, module Imj.Physics.Discrete.Types
, Terminal.Window
, RectContainer(..)
) where
import Imj.Prelude
import qualified System.Console.Terminal.Size as Terminal( Window(..))
import Imj.Game.Hamazed.World.Space.Types
import Imj.Game.Hamazed.World.Space
import Imj.Geo.Discrete
import Imj.Graphics.Animation.Design.Types
import Imj.Graphics.Text.Animation
import Imj.Graphics.UI.RectContainer
import Imj.Iteration
import Imj.Physics.Discrete.Types
import Imj.Physics.Discrete
import Imj.Timing
data WorldShape = Square
| Rectangle2x1
data WallDistribution = None
| Deterministic
| Random !RandomParameters
mkWorldContainer :: World -> RectContainer
mkWorldContainer (World _ _ (Space _ sz _) _ (InTerminal _ upperLeft)) =
RectContainer sz upperLeft
data World = World {
_worldNumbers :: ![Number]
, _worldShip :: !BattleShip
, _worldSpace :: !Space
, _worldAnimations :: ![Animation]
, _worldEmbedded :: !InTerminal
}
data InTerminal = InTerminal {
_inTerminalSize :: !(Maybe (Terminal.Window Int))
, _inTerminalUpperLeft :: !(Coords Pos)
} deriving (Show)
data BattleShip = BattleShip {
_shipPosSpeed :: !PosSpeed
, _shipAmmo :: !Int
, _shipSafeUntil :: !(Maybe SystemTime)
, _shipCollisions :: ![Number]
} deriving(Show)
data Number = Number {
_numberPosSpeed :: !PosSpeed
, _numberNum :: !Int
} deriving(Eq, Show)
environmentInteraction :: World -> Boundaries -> Coords Pos -> InteractionResult
environmentInteraction (World _ _ space _ (InTerminal mayTermWindow upperLeft)) scope =
let worldCorner = translate' 1 1 upperLeft
in scopedLocation space mayTermWindow worldCorner scope >>> \case
InsideWorld -> Stable
OutsideWorld -> Mutation