add falling_enemies type to game (these enemies can be picked up and thrown), and thread fallingEnemies through enemy.sml to set up scaffolding for them

This commit is contained in:
2025-02-08 09:20:10 +00:00
parent 1c105193e2
commit 38640b14a2
4 changed files with 69 additions and 20 deletions

View File

@@ -394,18 +394,29 @@ struct
, platformTree , platformTree
, projectileTree , projectileTree
, enemyList , enemyList
, fallingList
) = ) =
let let
val {x, y, ...} = enemy val {x, y, ...} = enemy
val size = Constants.enemySize val size = Constants.enemySize
val isAttacked =
QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree)
orelse isCollidingWithPlayerAttack (player, enemy)
in in
if isAttacked then if QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then
(* no matter what projectiles hits it, PATROL_SLIME should be filtered out *) (* if projectile hits, filter out from this list, and add to list of
enemyList * fallingEnemies *)
let
val fallingList =
{ falling = false
, x = x
, y = y
, variant = #variant enemy
, jumped = 0
} :: fallingList
in
(enemyList, fallingList)
end
else if isCollidingWithPlayerAttack (player, enemy) then
(* filter out when any projectile hits *)
(enemyList, fallingList)
else else
(* since we're not filtering out, update the enemy's state and cons enemy *) (* since we're not filtering out, update the enemy's state and cons enemy *)
let let
@@ -421,7 +432,7 @@ struct
(enemy, walls, wallTree, platforms, platformTree) (enemy, walls, wallTree, platforms, platformTree)
val enemy = EnemyPatch.withPatches (enemy, patches) val enemy = EnemyPatch.withPatches (enemy, patches)
in in
enemy :: enemyList (enemy :: enemyList, fallingList)
end end
end end
@@ -435,18 +446,29 @@ struct
, projectileTree , projectileTree
, graph , graph
, enemyList , enemyList
, fallingList
) = ) =
let let
val {x, y, ...} = enemy val {x, y, ...} = enemy
val size = Constants.enemySize val size = Constants.enemySize
val isAttacked =
QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree)
orelse isCollidingWithPlayerAttack (player, enemy)
in in
if isAttacked then if QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then
(* if projectile hits, filter out from this list, and add to list of
* fallingEnemies *)
let
val fallingList =
{ falling = false
, x = x
, y = y
, variant = #variant enemy
, jumped = 0
} :: fallingList
in
(enemyList, fallingList)
end
else if isCollidingWithPlayerAttack (player, enemy) then
(* filter out when any projectile hits *) (* filter out when any projectile hits *)
enemyList (enemyList, fallingList)
else else
(* since we're not filtering out, update the enemy's state and cons enemy *) (* since we're not filtering out, update the enemy's state and cons enemy *)
let let
@@ -463,7 +485,7 @@ struct
(enemy, walls, wallTree, platforms, platformTree) (enemy, walls, wallTree, platforms, platformTree)
val enemy = EnemyPatch.withPatches (enemy, patches) val enemy = EnemyPatch.withPatches (enemy, patches)
in in
enemy :: enemyList (enemy :: enemyList, fallingList)
end end
end end
@@ -478,6 +500,7 @@ struct
, player , player
, graph , graph
, enemyList , enemyList
, fallingList
) = ) =
let let
open EnemyVariants open EnemyVariants
@@ -493,6 +516,7 @@ struct
, platformTree , platformTree
, projectileTree , projectileTree
, enemyList , enemyList
, fallingList
) )
| FOLLOW_SIME => | FOLLOW_SIME =>
updateFollowState updateFollowState
@@ -505,6 +529,7 @@ struct
, projectileTree , projectileTree
, graph , graph
, enemyList , enemyList
, fallingList
) )
end end
end end

View File

@@ -17,9 +17,10 @@ struct
, player , player
, graph , graph
, enemyList , enemyList
, fallingList
) = ) =
if pos < 0 then if pos < 0 then
Vector.fromList enemyList (Vector.fromList enemyList, fallingList)
else else
let let
val enemy = Vector.sub (enemies, pos) val enemy = Vector.sub (enemies, pos)
@@ -28,7 +29,7 @@ struct
* 1. updating enemy and :: cons :: ing to enemyList, or * 1. updating enemy and :: cons :: ing to enemyList, or
* 2. filtering enemy if projectile hit which enemy should not survive * 2. filtering enemy if projectile hit which enemy should not survive
* *) * *)
val enemyList = EnemyBehaviour.updateEnemyState val (enemyList, fallingList) = EnemyBehaviour.updateEnemyState
( enemy ( enemy
, projectiles , projectiles
, projectileTree , projectileTree
@@ -39,6 +40,7 @@ struct
, player , player
, graph , graph
, enemyList , enemyList
, fallingList
) )
in in
updateEnemyList updateEnemyList
@@ -53,6 +55,7 @@ struct
, player , player
, graph , graph
, enemyList , enemyList
, fallingList
) )
end end

View File

@@ -58,6 +58,9 @@ sig
, nextPlatID: int , nextPlatID: int
} }
type falling_enemy =
{falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int}
type game_type = type game_type =
{ player: player { player: player
, walls: wall vector , walls: wall vector
@@ -66,6 +69,7 @@ sig
, platformTree: QuadTree.t , platformTree: QuadTree.t
, enemies: enemy vector , enemies: enemy vector
, graph: PlatSet.elem vector vector , graph: PlatSet.elem vector vector
, fallingEnemies: falling_enemy vector
} }
val initial: game_type val initial: game_type
@@ -132,6 +136,9 @@ struct
, nextPlatID: int , nextPlatID: int
} }
type falling_enemy =
{falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int}
type game_type = type game_type =
{ player: player { player: player
, walls: wall vector , walls: wall vector
@@ -140,6 +147,7 @@ struct
, platformTree: QuadTree.t , platformTree: QuadTree.t
, enemies: enemy vector , enemies: enemy vector
, graph: PlatSet.elem vector vector , graph: PlatSet.elem vector vector
, fallingEnemies: falling_enemy vector
} }
val initial: game_type = val initial: game_type =
@@ -269,6 +277,7 @@ struct
, platformTree = platformTree , platformTree = platformTree
, enemies = enemies , enemies = enemies
, graph = graph , graph = graph
, fallingEnemies = Vector.fromList []
} }
end end
end end

View File

@@ -2,8 +2,16 @@ structure GameUpdate =
struct struct
fun update (game, input) = fun update (game, input) =
let let
val {player, walls, wallTree, platforms, platformTree, enemies, graph} = val
game { player
, walls
, wallTree
, platforms
, platformTree
, enemies
, graph
, fallingEnemies
} = game
val enemyTree = Enemy.generateTree enemies val enemyTree = Enemy.generateTree enemies
val player = Player.runPhysicsAndInput (game, input, enemyTree) val player = Player.runPhysicsAndInput (game, input, enemyTree)
@@ -11,7 +19,7 @@ struct
val projectiles = #projectiles player val projectiles = #projectiles player
val projectileTree = Projectile.generateTree projectiles val projectileTree = Projectile.generateTree projectiles
val enemies = Enemy.updateEnemyList val (enemies, newFallingEnemies) = Enemy.updateEnemyList
( Vector.length enemies - 1 ( Vector.length enemies - 1
, enemies , enemies
, projectiles , projectiles
@@ -23,7 +31,10 @@ struct
, player , player
, graph , graph
, [] , []
, []
) )
val fallingEnemies = Vector.fromList newFallingEnemies
in in
{ player = player { player = player
, walls = walls , walls = walls
@@ -32,6 +43,7 @@ struct
, platformTree = platformTree , platformTree = platformTree
, enemies = enemies , enemies = enemies
, graph = graph , graph = graph
, fallingEnemies = fallingEnemies
} }
end end
end end