module RPGEngine.Input.ActionSelection ( handleInputActionSelection ) where import RPGEngine.Input.Core (InputHandler, handleKey, composeInputHandlers, ListSelector (selection)) import RPGEngine.Data (Game (..), State (..), Direction (..), Action (..), ItemId, EntityId) import Graphics.Gloss.Interface.IO.Game (Key(SpecialKey), SpecialKey (KeyUp, KeyDown)) import Graphics.Gloss.Interface.IO.Interact ( SpecialKey(..), KeyState(..) ) ------------------------------ Exported ------------------------------ handleInputActionSelection :: InputHandler Game handleInputActionSelection = composeInputHandlers [ handleKey (SpecialKey KeySpace) Down selectAction, handleKey (SpecialKey KeyUp) Down $ moveSelector North, handleKey (SpecialKey KeyDown) Down $ moveSelector South ] ---------------------------------------------------------------------- selectAction :: Game -> Game selectAction game@Game{ state = ActionSelection list selection continue } = newGame where newGame = game{ state = execute selectedAction continue } selectedAction = Leave selectAction g = g -- TODO Lift this code from LevelSelection -- Move the selector either up or down moveSelector :: Direction -> Game -> Game moveSelector dir game@Game{ state = state@(ActionSelection list selector _) } = newGame where newGame = game{ state = newState } newState = state{ selector = newSelector } newSelector | constraint = selector{ selection = newSelection } | otherwise = selector constraint = 0 <= newSelection && newSelection < length list newSelection = selection selector + diff diff | dir == North = -1 | dir == South = 1 | otherwise = 0 moveSelector _ g = g{ state = Error "Something went wrong while moving the selector up or down"} ------------------------------ Actions ------------------------------- execute :: Action -> State -> State execute (RetrieveItem id ) s = pickUpItem id s execute (UseItem id ) s = useItem id s execute (DecreaseHp eid iid) s = decreaseHp eid iid s execute (IncreasePlayerHp iid) s = increasePlayerHp iid s execute _ s = s -- Pick up the item with itemId and put it in the players inventory pickUpItem :: ItemId -> State -> State pickUpItem _ s = s -- TODO -- Use an item on the player useItem :: ItemId -> State -> State -- TODO useItem _ s = s -- TODO -- Attack an entity using an item decreaseHp :: EntityId -> ItemId -> State -> State decreaseHp _ _ s = s -- TODO DecreaseHp of monster -- TODO Check if monster is dead -- TODO Entity attack player -- TODO Decrease durability of item -- TODO Break item if durability below zero -- Heal a bit increasePlayerHp :: ItemId -> State -> State increasePlayerHp _ s = s -- TODO Increase playerHp -- TODO Decrease durability of item -- TODO Remove item if durability below zero