starrover2-0.0.9: src/SpaceState/Init.hs
module SpaceState.Init(lostLife, initState, die)
where
import Data.List
import Control.Monad
import Control.Monad.State as State
import Prelude hiding (catch)
import Graphics.Rendering.OpenGL as OpenGL
import Graphics.UI.SDL as SDL
import qualified Data.Edison.Assoc.StandardMap as M
import OpenGLUtils
import Statistics
import Entity
import AObject
import TextScreen
import Mission
import SpaceState.Game
import SpaceState.City
import SpaceState.Common
lostLife :: String -> String -> StateT SpaceState IO Bool
lostLife s1 s2 = do
modify $ modLives pred
modify $ modPlCash $ const 0 -- so that no points are given for cash
state <- State.get
if lives state <= 0
then do
gameOver s1 gameoverText
else do
pressKeyScreen (liftIO $ makeTextScreen (30, 550) [(gamefont state,
Color4 1.0 0.2 0.2 1.0, s1 ++ "\n\n" ++ s2 ++ "\n\nPress ENTER to continue")]
(return ())) SDLK_RETURN
initState
return False
initState :: StateT SpaceState IO ()
initState = do
modify $ modAObjects $ setupBarycenters
lc <- getRandomPlanet
modify $ modTri $ modifyPosition (const $ (getPosition lc *+* (glVector3UnitX *** (2 * AObject.size lc))))
modify $ modPlCash $ const startCash
modify $ modPlHoldspace $ const maxHold
modify $ modPlCargo $ const M.empty
modify $ modPlHealth $ const startPlHealth
modify $ modPlMissions $ const emptyMissionMap
modify $ modAvailMission $ const Nothing
gotoCity lc
releaseKeys
getRandomPlanet :: StateT SpaceState IO AObject
getRandomPlanet = do
state <- State.get
n <- liftIO $ chooseIO (aobjects state)
if (aobjName n == "Star")
then getRandomPlanet
else return n
die :: StateT SpaceState IO (Maybe Int)
die = do
state <- State.get
return $ Just $ finalPoints state