diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-05-23 22:52:01 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-05-23 22:52:01 +0100 |
commit | f886dc2f03a75b12749ad029134b70c346aea194 (patch) | |
tree | b3d6f00d52672e35c477a003537e159e86161318 /src/Game/Entities | |
parent | a8091dc3c82a4d646e84b356c46319ba54847ce0 (diff) | |
download | space-plat-hs-f886dc2f03a75b12749ad029134b70c346aea194.tar.gz space-plat-hs-f886dc2f03a75b12749ad029134b70c346aea194.zip |
Deadly blocks kill the player
Implemented "auto-checkpoints" based on where the player lands after a
jump.
Diffstat (limited to 'src/Game/Entities')
-rw-r--r-- | src/Game/Entities/Player.hs | 22 | ||||
-rw-r--r-- | src/Game/Entities/Types.hs | 3 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/Game/Entities/Player.hs b/src/Game/Entities/Player.hs index 620f236..82e528a 100644 --- a/src/Game/Entities/Player.hs +++ b/src/Game/Entities/Player.hs @@ -10,8 +10,8 @@ import qualified Game.Sprites as S dyingSet :: Int dyingSet = 2 -mkPlayer :: S.SpriteSheet -> Int -> Int -> IORef C.Controls -> IsBlocked -> IO Entity -mkPlayer sprites x y controls isBlocked = do +mkPlayer :: S.SpriteSheet -> Int -> Int -> IORef C.Controls -> IsBlocked -> IsBlocked -> IO Entity +mkPlayer sprites x y controls isBlocked isBlockedDeadly = do s <- S.get sprites "player" pure Entity @@ -25,10 +25,10 @@ mkPlayer sprites x y controls isBlocked = do gravity = gravityOff, dir = DirRight, sprite = s, - update = updatePlayer controls isBlocked, + update = updatePlayer controls isBlocked isBlockedDeadly, destroy = False, actions = [], - dat = NoData + dat = PlayerData x y } updateHorizontal :: IsBlocked -> Bool -> Bool -> Entity -> Entity @@ -62,12 +62,20 @@ updateVertical isBlocked jump down e e {gravity = gravityDown, frame = jumpFrame, y = e.y + 1} | otherwise = e -updatePlayer :: IORef C.Controls -> IsBlocked -> Entity -> IO Entity -updatePlayer controls isBlocked e +updateGravityCheckDeadly :: IsBlocked -> IsBlocked -> Entity -> Entity +updateGravityCheckDeadly isBlocked isBlockedDeadly e + | isBlockedDeadly (updated.x + 8) (updated.y + 24) = updated {actions = updated.actions ++ [ActionHitPlayerDeadly]} + | updated.gravity == gravityOff && e.gravity /= gravityOff = updated {dat = PlayerData updated.x updated.y} + | otherwise = updated + where + updated = updateGravity isBlocked e + +updatePlayer :: IORef C.Controls -> IsBlocked -> IsBlocked -> Entity -> IO Entity +updatePlayer controls isBlocked isBlockedDeadly e | e.set /= dyingSet = do ctl <- readIORef controls pure $ - updateGravity isBlocked $ + updateGravityCheckDeadly isBlocked isBlockedDeadly $ updateVertical isBlocked ctl.a ctl.down $ updateHorizontal isBlocked ctl.left ctl.right $ -- left or right, but not both (keyboard) diff --git a/src/Game/Entities/Types.hs b/src/Game/Entities/Types.hs index e9ca02f..765800f 100644 --- a/src/Game/Entities/Types.hs +++ b/src/Game/Entities/Types.hs @@ -17,7 +17,7 @@ data Dir = DirRight | DirLeft deriving (Eq, Show, Ord) data Type = TypePlayer | TypePickup | TypeEffect | TypeEnemy deriving (Eq) -data EntityData = NoData | ShooterData {coolDown :: Int} | RunnerData {wallCount :: Int} +data EntityData = NoData | ShooterData {coolDown :: Int} | RunnerData {wallCount :: Int} | PlayerData {checkx :: Int, checky :: Int} type Collision = Entity -> IO Bool @@ -36,6 +36,7 @@ data Action = ActionAddEffect Int Int EffectName | ActionAddBattery Int Int | ActionHitPlayer + | ActionHitPlayerDeadly | ActionExitStarted | ActionEntryDone | ActionExitDone |