Compare commits

..

No commits in common. "f2844138366b2ca433ca5fdeeadce9b515c84e72" and "72b460788da4fc38dd5b200ec610ef5e9684d76a" have entirely different histories.

2 changed files with 11 additions and 47 deletions

View file

@ -37,15 +37,6 @@ hasAt pos level = match firstItem firstEntity
firstItem = find ((== pos) . getICoord) $ items level firstItem = find ((== pos) . getICoord) $ items level
getICoord i = (itemX i, itemY i) getICoord i = (itemX i, itemY i)
getWithId :: String -> Level -> Maybe (Either Item Entity)
getWithId id level = match firstItem firstEntity
where match :: Maybe Item -> Maybe Entity -> Maybe (Either Item Entity)
match (Just a) _ = Just $ Left a
match _ (Just a) = Just $ Right a
match _ _ = Nothing
firstEntity = find ((== id) . entityId) $ entities level
firstItem = find ((== id) . itemId) $ items level
directionOffsets :: Direction -> (X, Y) directionOffsets :: Direction -> (X, Y)
directionOffsets North = ( 0, 1) directionOffsets North = ( 0, 1)
directionOffsets East = ( 1, 0) directionOffsets East = ( 1, 0)

View file

@ -4,12 +4,10 @@ module RPGEngine.Input.ActionSelection
import RPGEngine.Input.Core (InputHandler, handleKey, composeInputHandlers, ListSelector (selection)) import RPGEngine.Input.Core (InputHandler, handleKey, composeInputHandlers, ListSelector (selection))
import RPGEngine.Data (Game (..), State (..), Direction (..), Action (..), ItemId, EntityId, Level (..), Player (inventory, playerHp, Player), Item (..), HP) 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.Game (Key(SpecialKey), SpecialKey (KeyUp, KeyDown))
import Graphics.Gloss.Interface.IO.Interact import Graphics.Gloss.Interface.IO.Interact
( SpecialKey(..), KeyState(..) ) ( SpecialKey(..), KeyState(..) )
import RPGEngine.Data.Level (getWithId)
import Data.Foldable (find)
------------------------------ Exported ------------------------------ ------------------------------ Exported ------------------------------
@ -24,10 +22,9 @@ handleInputActionSelection = composeInputHandlers [
---------------------------------------------------------------------- ----------------------------------------------------------------------
selectAction :: Game -> Game selectAction :: Game -> Game
selectAction game@Game{ state = ActionSelection list selector continue } = newGame selectAction game@Game{ state = ActionSelection list selection continue } = newGame
where newGame = game{ state = execute selectedAction continue } where newGame = game{ state = execute selectedAction continue }
selectedAction = list !! index selectedAction = Leave
index = selection selector
selectAction g = g selectAction g = g
-- TODO Lift this code from LevelSelection -- TODO Lift this code from LevelSelection
@ -51,23 +48,14 @@ execute :: Action -> State -> State
execute (RetrieveItem id ) s = pickUpItem id s execute (RetrieveItem id ) s = pickUpItem id s
execute (UseItem id ) s = useItem id s execute (UseItem id ) s = useItem id s
execute (DecreaseHp eid iid) s = decreaseHp eid iid s execute (DecreaseHp eid iid) s = decreaseHp eid iid s
execute (IncreasePlayerHp iid) s = healedPlayer execute (IncreasePlayerHp iid) s = increasePlayerHp iid s
where healedPlayer = s{ player = increasePlayerHp iid (player s)}
execute _ s = s execute _ s = s
-- Pick up the item with itemId and put it in the players inventory -- Pick up the item with itemId and put it in the players inventory
-- Should receive a Playing state
pickUpItem :: ItemId -> State -> State pickUpItem :: ItemId -> State -> State
pickUpItem id s@Playing{ level = level, player = player } = newState pickUpItem _ s = s -- TODO
where (Just (Left pickedUpItem)) = getWithId id level
newState = s{ level = newLevel, player = newPlayer }
newLevel = level{ items = filteredItems }
filteredItems = filter (/= pickedUpItem) $ items level
newPlayer = player{ inventory = newInventory }
newInventory = pickedUpItem:inventory player
pickUpItem _ _ = Error "Something went wrong while picking up an item"
-- Use an item -- Use an item on the player
useItem :: ItemId -> State -> State -- TODO useItem :: ItemId -> State -> State -- TODO
useItem _ s = s -- TODO useItem _ s = s -- TODO
@ -81,23 +69,8 @@ decreaseHp _ _ s = s
-- TODO Break item if durability below zero -- TODO Break item if durability below zero
-- Heal a bit -- Heal a bit
-- Should receive a Player increasePlayerHp :: ItemId -> State -> State
increasePlayerHp :: ItemId -> Player -> Player increasePlayerHp _ s = s
increasePlayerHp id p@Player{ playerHp = hp, inventory = inventory} = newPlayer -- TODO Increase playerHp
where newPlayer = p{ playerHp = newHp, inventory = newInventory newItem } -- TODO Decrease durability of item
(Just usedItem) = find ((== id) . itemId) inventory -- TODO Remove item if durability below zero
newItem = decreaseDurability usedItem
newInventory (Just item) = item:filteredInventory
newInventory _ = filteredInventory
filteredInventory =filter (/= usedItem) inventory
newHp = changeHealth hp (itemValue usedItem)
decreaseDurability :: Item -> Maybe Item
decreaseDurability item@Item{ useTimes = Nothing } = Just item -- Infinite uses, never breaks
decreaseDurability item@Item{ useTimes = Just val } | 0 < val - 1 = Just item{ useTimes = Just (val - 1) }
| otherwise = Nothing -- Broken
-- Change given health by a given amount
changeHealth :: HP -> HP -> HP
changeHealth (Just health) (Just difference) = Just (health + difference)
changeHealth health _ = health