module States ( DState(..) , MState(..) , KState(..) , changeKStateDownKey , DContainer(..) , GObject(..) , GameMode(..) , GState(..) , GStage(..) , PBound(..) , changeGObjectPos , changeGObjectVel , changeGObjectAcc , changeGObjectPVA , addGObjectVel , changeGStateGObject , changeMStateGState , KeyS(..) , DownKeyCount(..) , changeKStateKeyS , changeKStateKeyAndKeyS , changeKeySDownKeyCount , changeKeySCP , changeGObjectGAction , ActionType(..) , ActionData(..) , ActionName(..) , PosType(..) , changeGObjectPosType ) where import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import qualified Data.Map as Map import Control.Applicative data DState = DState { windowWidth :: GLint ,windowHeight :: GLint } deriving (Show) data DContainer = DContainer { containerX :: GLfloat ,containerY :: GLfloat ,containerWidth :: GLfloat ,containerHeight :: GLfloat } deriving (Show) data MState = MState { gameMode :: GameMode ,gState :: GState } deriving (Show) changeMStateGState :: MState -> GState -> MState changeMStateGState (MState gm _ ) gst = (MState gm gst) data GameMode = GameStartMenu | GameMain | GameOver | GameIntro | GameEnding deriving (Show , Eq) data GState = GState { gStateObjs :: [GObject] ,gStage :: GStage } deriving (Show) changeGStateGObject :: GState -> [GObject] -> GState changeGStateGObject (GState _ gstage) gObjs = (GState gObjs gstage) data GObject = GObject { widthGObj :: (Vector2 GLfloat) ,posGObj :: (Vector2 GLfloat) ,velGObj :: (Vector2 GLfloat) ,accGObj :: (Vector2 GLfloat) ,gFrontSide :: GLint ,gHP :: GLint ,gPosType :: PosType ,gAction :: ActionName ,gActionDatas :: (Map.Map ActionName ActionData) } deriving (Show) changeGObjectPos :: GObject -> (Vector2 GLfloat) -> GObject changeGObjectPos (GObject w _ vel acc fside gHP pt act ad) pos = (GObject w pos vel acc fside gHP pt act ad) changeGObjectVel :: GObject -> (Vector2 GLfloat) -> GObject changeGObjectVel (GObject w pos _ acc fside gHP pt act ad) vel = (GObject w pos vel acc fside gHP pt act ad) changeGObjectAcc :: GObject -> (Vector2 GLfloat) -> GObject changeGObjectAcc (GObject w pos vel _ fside gHP pt act ad) acc = (GObject w pos vel acc fside gHP pt act ad) changeGObjectPVA :: GObject -> (Vector2 GLfloat) -> (Vector2 GLfloat) -> (Vector2 GLfloat) -> GObject changeGObjectPVA (GObject w _ _ _ fside gHP pt act ad) pos vel acc = (GObject w pos vel acc fside gHP pt act ad) addGObjectVel :: GObject -> (Vector2 GLfloat) -> GObject addGObjectVel (GObject w pos vel acc fside gHP pt act ad) vela = (GObject w pos ((+) <$> vel <*> vela) acc fside gHP pt act ad) changeGObjectGAction :: GObject -> ActionName -> GObject changeGObjectGAction (GObject w pos vel acc fside gHP pt _ ad) act = (GObject w pos vel acc fside gHP pt act ad) changeGObjectPosType :: GObject -> PosType -> GObject changeGObjectPosType (GObject w pos vel acc fside gHP _ act ad) pt = (GObject w pos vel acc fside gHP pt act ad) data PosType = OnGround | OverGround deriving (Show , Eq) data PBound = PBound { minPBound :: GLfloat ,maxPBound :: GLfloat } deriving (Show) data GStage = GStage { boundaryStage :: (Vector2 PBound) } deriving (Show) data KState = KState { downKey :: (Maybe Key) ,keyS :: KeyS } deriving (Show) type DownKeyCount = GLint data KeyS = KeyS { cKey ::Maybe Key ,pKey ::Maybe Key ,downKeyCount :: DownKeyCount }deriving (Show) changeKeySCP :: KeyS -> (Maybe Key ) -> (Maybe Key ) -> KeyS changeKeySCP (KeyS _ _ dkc) ckey pkey = (KeyS ckey pkey dkc) changeKeySDownKeyCount :: KeyS -> DownKeyCount -> KeyS changeKeySDownKeyCount (KeyS ck pk _) c = (KeyS ck pk c) -----KStateにおいてKeyの値の変更 changeKStateDownKey :: KState -> (Maybe Key) -> KState changeKStateDownKey (KState _ ks) mkey = (KState mkey ks) -----KStateにおいてKeySの値の変更 changeKStateKeyS :: KState -> KeyS -> KState changeKStateKeyS (KState mkey _) ks = (KState mkey ks) -----KStateにおいてKeyとKeySの値の変更 changeKStateKeyAndKeyS :: KState -> (Maybe Key) -> KeyS -> KState changeKStateKeyAndKeyS kst mkey ks = changeKStateKeyS (changeKStateDownKey kst mkey) ks ----- data ActionData = ActionData { actionType :: ActionType ,actionVelX :: Maybe GLfloat ,actionVelY :: Maybe GLfloat } deriving (Show) data ActionType = AMove | AAttack deriving (Show) data ActionName = ANeutral | AStand | AWalkF | AWalkB | AJump deriving (Show , Ord, Eq)