module MainState (newMState ) where import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import States import ProgInit import VectorMaps import TipTileMaps import EventFlags import qualified Data.Map as Map -----新しいMStateの作成 newMState :: MState -> KState -> DState -> MState newMState mst kst dst = (newMState' (eventAllAct (changeMStateAllEventxClick dst kst (changeKeyM mst kst)) kst dst ) kst dst) ------リセットボタンイベント eventResetButton :: MState -> DState -> MState eventResetButton mst dst = if (\(Just x) -> x) (mStateGetEventFlag mst EReset) then let mst' = (mStateChangeCounterValue (setInitTiles (setTiles (mStateChangeDivTileNum mst (dStateGetCounterV dst CDivTileNum)))) 0) in mStateChangeMaxValue mst' (setMaxCount (divTileNum mst')) else mst -------イベント実行 eventAct :: DState -> MState -> EventKey -> MState eventAct dst mst ekey = case ekey of EReset -> eventResetButton mst dst _ -> mst -------すべてのイベント実行 eventAllAct :: MState -> KState -> DState -> MState eventAllAct mst kst dst = let ekeys = Map.keys (events mst) in foldl (eventAct dst) mst ekeys -----新しいMStateの作成 newMState' :: MState -> KState -> DState -> MState newMState' mst kst dst = let ctile = (getTileClickPos kst dst mst) in case ctile of Nothing -> mst Just ctile' -> if (isNeighborEmptyTile (tileID ctile') mst) then mStateChangeCounterValue (mStateTransTipTiles mst (transpositionTipTile (tileID ctile') (-1) (tipTiles mst))) ((getMStateCounterValueM mst) + 1) else mst -----クリックした位置のタイル座標を得る getTileClickPos :: KState -> DState -> MState -> (Maybe TipTile) getTileClickPos kst dst mst= (clickPos kst) >>= (getTilePos dst mst) -----Key情報の更新 changeKeyM :: MState -> KState -> MState changeKeyM mst kst = let keyM = keyInM mst in mStateTransKey mst ((downKey kst) , (fst keyM))