aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-03-21 21:28:25 +0000
committerJuan J. Martinez <jjm@usebox.net>2023-03-21 21:28:25 +0000
commit11d2ed7f15a86dd465bc3456e3478e9ff03bf5d2 (patch)
treef5e6df771eb4396df13fe3cdc2d98721917a2d68
parent1c8a22d24b14d258a9103f7b83d627359eae0da8 (diff)
downloadspace-plat-hs-11d2ed7f15a86dd465bc3456e3478e9ff03bf5d2.tar.gz
space-plat-hs-11d2ed7f15a86dd465bc3456e3478e9ff03bf5d2.zip
Introduce a set property
Stopped abusing the direction property!
-rw-r--r--data/sprites.json1
-rw-r--r--src/Game/Entities.hs6
-rw-r--r--src/Game/Entities/Common.hs4
-rw-r--r--src/Game/Entities/Effect.hs1
-rw-r--r--src/Game/Entities/Entry.hs6
-rw-r--r--src/Game/Entities/Exit.hs8
-rw-r--r--src/Game/Entities/Pickup.hs1
-rw-r--r--src/Game/Entities/Player.hs12
-rw-r--r--src/Game/Entities/Robot.hs5
-rw-r--r--src/Game/Entities/Slime.hs1
-rw-r--r--src/Game/Entities/Types.hs3
11 files changed, 30 insertions, 18 deletions
diff --git a/data/sprites.json b/data/sprites.json
index 4e76eab..3c0b7b7 100644
--- a/data/sprites.json
+++ b/data/sprites.json
@@ -70,7 +70,6 @@
{ "x": 16, "y": 56, "width": 16, "height": 16 }
],
"sets": [
- [0, 1],
[0, 1]
]
},
diff --git a/src/Game/Entities.hs b/src/Game/Entities.hs
index b43ab0e..2f647d9 100644
--- a/src/Game/Entities.hs
+++ b/src/Game/Entities.hs
@@ -95,7 +95,7 @@ updateAll es state = do
then
( s {GS.lives = 0, GS.gameOverDelay = gameOverDelay},
-- the player is not in the action, changing then type disables collision detection
- (head ents) {typ = TypeEffect, dir = Dying, gravity = gravityUp, frame = 0} : tail ents
+ (head ents) {typ = TypeEffect, set = dyingSet, gravity = gravityUp, frame = 0} : tail ents
)
else
( s {GS.lives = s.lives - 1, GS.hitDelay = hitDelay},
@@ -158,6 +158,4 @@ render renderer es state = do
renderOne :: Entity -> IO ()
renderOne e =
- S.render renderer e.sprite e.x e.y set e.frame
- where
- set = toSpriteSet e.dir
+ S.render renderer e.sprite e.x e.y e.set e.frame
diff --git a/src/Game/Entities/Common.hs b/src/Game/Entities/Common.hs
index 69786e5..82e790e 100644
--- a/src/Game/Entities/Common.hs
+++ b/src/Game/Entities/Common.hs
@@ -16,12 +16,10 @@ import qualified Game.Sprites as S
toSpriteSet :: Dir -> Int
toSpriteSet DirRight = 0
toSpriteSet DirLeft = 1
--- not really a direction
-toSpriteSet Dying = 2
-- | Return the number of frames available on the entity's sprite for current direction.
frameLimit :: Entity -> Int
-frameLimit e = S.frameCount e.sprite (toSpriteSet e.dir)
+frameLimit e = S.frameCount e.sprite e.set
-- | Collision detection of player vs entity.
--
diff --git a/src/Game/Entities/Effect.hs b/src/Game/Entities/Effect.hs
index 7a2b341..f8b668a 100644
--- a/src/Game/Entities/Effect.hs
+++ b/src/Game/Entities/Effect.hs
@@ -15,6 +15,7 @@ mkEffect sprites x y name = do
y = y,
delay = frameDelay,
frame = 0,
+ set = 0,
jumping = False,
gravity = gravityOff,
dir = DirRight,
diff --git a/src/Game/Entities/Entry.hs b/src/Game/Entities/Entry.hs
index 5c17146..28b1c4e 100644
--- a/src/Game/Entities/Entry.hs
+++ b/src/Game/Entities/Entry.hs
@@ -5,6 +5,9 @@ import Game.Entities.Const
import Game.Entities.Types
import qualified Game.Sprites as S
+openingDoorSet :: Int
+openingDoorSet = 2
+
mkEntry :: S.SpriteSheet -> Int -> Int -> IO Entity
mkEntry sprites x y = do
s <- S.get sprites "exit"
@@ -15,9 +18,10 @@ mkEntry sprites x y = do
y = y,
delay = frameDelay,
frame = 0,
+ set = openingDoorSet,
jumping = False,
gravity = gravityOff,
- dir = Dying,
+ dir = DirRight,
sprite = s,
update = pure . updateEntry,
destroy = False,
diff --git a/src/Game/Entities/Exit.hs b/src/Game/Entities/Exit.hs
index b87c115..206bfaa 100644
--- a/src/Game/Entities/Exit.hs
+++ b/src/Game/Entities/Exit.hs
@@ -5,6 +5,9 @@ import Game.Entities.Const
import Game.Entities.Types
import qualified Game.Sprites as S
+closingDoorSet :: Int
+closingDoorSet = 1
+
mkExit :: S.SpriteSheet -> Int -> Int -> Collision -> IO Entity
mkExit sprites x y playerCollision = do
s <- S.get sprites "exit"
@@ -15,6 +18,7 @@ mkExit sprites x y playerCollision = do
y = y,
delay = frameDelay,
frame = 0,
+ set = 0,
jumping = False,
gravity = gravityOff,
dir = DirRight,
@@ -27,9 +31,9 @@ mkExit sprites x y playerCollision = do
updateExit :: Collision -> Entity -> IO Entity
updateExit touchedPlayer e
-- right is the set 0, left set 1
- | e.dir == DirRight = do
+ | e.set /= closingDoorSet = do
touched <- if e.frame < fullyOpen then pure False else touchedPlayer e
- pure $ if touched then e {dir = DirLeft, frame = 0, actions = [ActionExitStarted]} else updateLoop
+ pure $ if touched then e {set = closingDoorSet, frame = 0, actions = [ActionExitStarted]} else updateLoop
| otherwise = pure updateOnce
where
fullyOpen :: Int
diff --git a/src/Game/Entities/Pickup.hs b/src/Game/Entities/Pickup.hs
index a933efc..68d3852 100644
--- a/src/Game/Entities/Pickup.hs
+++ b/src/Game/Entities/Pickup.hs
@@ -15,6 +15,7 @@ mkBattery sprites x y playerCollision = do
y = y,
delay = frameDelay,
frame = 0,
+ set = 0,
jumping = False,
gravity = gravityOff,
dir = DirRight,
diff --git a/src/Game/Entities/Player.hs b/src/Game/Entities/Player.hs
index a69799b..18625b6 100644
--- a/src/Game/Entities/Player.hs
+++ b/src/Game/Entities/Player.hs
@@ -1,4 +1,4 @@
-module Game.Entities.Player (mkPlayer) where
+module Game.Entities.Player (mkPlayer, dyingSet) where
import Data.IORef
import qualified Game.Controller as C
@@ -7,6 +7,9 @@ import Game.Entities.Const
import Game.Entities.Types
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
s <- S.get sprites "player"
@@ -17,6 +20,7 @@ mkPlayer sprites x y controls isBlocked = do
y = y,
delay = 0,
frame = 0,
+ set = toSpriteSet DirRight,
jumping = False,
gravity = gravityOff,
dir = DirRight,
@@ -31,8 +35,8 @@ updateHorizontal isBlocked left right e
-- prevent pressing both directions (keyboard)
| left && right = e
-- change direction first
- | left && e.dir /= DirLeft = e {dir = DirLeft, delay = 0}
- | right && e.dir /= DirRight = e {dir = DirRight, delay = 0}
+ | left && e.dir /= DirLeft = e {dir = DirLeft, set = toSpriteSet DirLeft, delay = 0}
+ | right && e.dir /= DirRight = e {dir = DirRight, set = toSpriteSet DirRight, delay = 0}
| left && isGoingDown = if isBlocked (e.x - 1) (e.y + 23) then e else e {x = e.x - 1}
| left && not isGoingDown = if isBlocked (e.x - 1) (e.y + 23) && isBlocked (e.x - 1) (e.y + 17) then e else e {x = e.x - 1}
| right && isGoingDown = if isBlocked (e.x + 17) (e.y + 23) then e else e {x = e.x + 1}
@@ -59,7 +63,7 @@ updateVertical isBlocked jump down e
updatePlayer :: IORef C.Controls -> IsBlocked -> Entity -> IO Entity
updatePlayer controls isBlocked e
- | e.dir /= Dying = do
+ | e.set /= dyingSet = do
ctl <- readIORef controls
pure $
updateGravity isBlocked $
diff --git a/src/Game/Entities/Robot.hs b/src/Game/Entities/Robot.hs
index dd3404a..44fc310 100644
--- a/src/Game/Entities/Robot.hs
+++ b/src/Game/Entities/Robot.hs
@@ -16,6 +16,7 @@ mkRobot sprites x y playerCollision isBlocked = do
y = y,
delay = frameDelay,
frame = 0,
+ set = toSpriteSet DirRight,
jumping = False,
gravity = gravityOff,
dir = DirRight,
@@ -36,10 +37,10 @@ updateRobot touchedPlayer isBlocked e = do
| testBit ent.delay 1 = ent
| ent.dir == DirLeft
&& (isBlocked (ent.x - 1) (ent.y + 17) || isBlocked (ent.x - 1) (ent.y + 17) || not (isBlocked (ent.x - 1) (ent.y + 24))) =
- ent {dir = DirRight}
+ ent {dir = DirRight, set = toSpriteSet DirRight}
| ent.dir == DirLeft = ent {x = ent.x - 1}
| ent.dir == DirRight
&& (isBlocked (ent.x + 16) (ent.y + 17) || isBlocked (ent.x + 16) (ent.y + 17) || not (isBlocked (ent.x + 16) (ent.y + 24))) =
- ent {dir = DirLeft}
+ ent {dir = DirLeft, set = toSpriteSet DirLeft}
| ent.dir == DirRight = ent {x = ent.x + 1}
| otherwise = ent
diff --git a/src/Game/Entities/Slime.hs b/src/Game/Entities/Slime.hs
index 1f50927..c102712 100644
--- a/src/Game/Entities/Slime.hs
+++ b/src/Game/Entities/Slime.hs
@@ -16,6 +16,7 @@ mkSlime sprites x y playerCollision isBlocked = do
y = y,
delay = frameDelay,
frame = 0,
+ set = 0,
jumping = False,
gravity = gravityOff,
dir = DirRight,
diff --git a/src/Game/Entities/Types.hs b/src/Game/Entities/Types.hs
index e8b29b0..34bddd3 100644
--- a/src/Game/Entities/Types.hs
+++ b/src/Game/Entities/Types.hs
@@ -12,7 +12,7 @@ where
import Data.IORef
import qualified Game.Sprites as S
-data Dir = DirRight | DirLeft | Dying deriving (Eq)
+data Dir = DirRight | DirLeft deriving (Eq)
data Type = TypePlayer | TypePickup | TypeEffect | TypeEnemy deriving (Eq)
@@ -43,6 +43,7 @@ data Entity = Entity
y :: Int,
delay :: Int,
frame :: Int,
+ set :: Int,
jumping :: Bool,
gravity :: Int,
dir :: Dir,