#4 Increase playerhp

This commit is contained in:
Tibo De Peuter 2022-12-23 10:50:42 +01:00
parent b108b2ed65
commit f284413836

View file

@ -4,11 +4,12 @@ module RPGEngine.Input.ActionSelection
import RPGEngine.Input.Core (InputHandler, handleKey, composeInputHandlers, ListSelector (selection))
import RPGEngine.Data (Game (..), State (..), Direction (..), Action (..), ItemId, EntityId, Level (..), Player (inventory))
import RPGEngine.Data (Game (..), State (..), Direction (..), Action (..), ItemId, EntityId, Level (..), Player (inventory, playerHp, Player), Item (..), HP)
import Graphics.Gloss.Interface.IO.Game (Key(SpecialKey), SpecialKey (KeyUp, KeyDown))
import Graphics.Gloss.Interface.IO.Interact
( SpecialKey(..), KeyState(..) )
import RPGEngine.Data.Level (getWithId)
import Data.Foldable (find)
------------------------------ Exported ------------------------------
@ -50,7 +51,8 @@ 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 (IncreasePlayerHp iid) s = healedPlayer
where healedPlayer = s{ player = increasePlayerHp iid (player s)}
execute _ s = s
-- Pick up the item with itemId and put it in the players inventory
@ -58,14 +60,14 @@ execute _ s = s
pickUpItem :: ItemId -> State -> State
pickUpItem id s@Playing{ level = level, player = player } = newState
where (Just (Left pickedUpItem)) = getWithId id level
newState = s{ level = newLevel, player = newPlayer }
newLevel = level{ items = filteredItems }
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 on the player
-- Use an item
useItem :: ItemId -> State -> State -- TODO
useItem _ s = s -- TODO
@ -79,8 +81,23 @@ decreaseHp _ _ s = s
-- 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
-- Should receive a Player
increasePlayerHp :: ItemId -> Player -> Player
increasePlayerHp id p@Player{ playerHp = hp, inventory = inventory} = newPlayer
where newPlayer = p{ playerHp = newHp, inventory = newInventory newItem }
(Just usedItem) = find ((== id) . itemId) inventory
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