add attacked enemies who are defeated to player's list of defeated_enemies, allowing them to be shot as projectiles

This commit is contained in:
2025-02-14 13:15:45 +00:00
parent 74a3fef32a
commit c75e7bc33b
2 changed files with 39 additions and 13 deletions

View File

@@ -18,7 +18,8 @@ struct
val enemyTree = Enemy.generateTree enemies val enemyTree = Enemy.generateTree enemies
val player = Player.checkEnemyCollisions (player, enemies, enemyTree) val player = Player.checkEnemyCollisions (player, enemies, enemyTree)
val enemies = PlayerAttack.attackEnemies (player, enemies, enemyTree) val (player, enemies) =
PlayerAttack.attackEnemies (player, enemies, enemyTree)
val enemies = Enemy.update val enemies = Enemy.update
(enemies, walls, wallTree, platforms, platformTree, player, graph) (enemies, walls, wallTree, platforms, platformTree, player, graph)

View File

@@ -4,21 +4,38 @@ struct
MakeQuadTreeFold MakeQuadTreeFold
(struct (struct
type env = unit type env = unit
type state = EnemyMap.t type state = PlayerType.defeated_enemies list * EnemyMap.t
open EnemyType open EnemyType
fun onAttacked fun onAttacked (enemyID, enemy, enemyMap, defeatedList) =
(enemyID: int, enemy: EnemyType.enemy, enemyMap: EnemyMap.t) =
case #variant enemy of case #variant enemy of
PATROL_SLIME => EnemyMap.remove (enemyID, enemyMap) PATROL_SLIME =>
| FOLLOW_SLIME => EnemyMap.remove (enemyID, enemyMap) let
| STRAIGHT_BAT => EnemyMap.remove (enemyID, enemyMap) val defeatedList = {angle = 1} :: defeatedList
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
in
(defeatedList, enemyMap)
end
| FOLLOW_SLIME =>
let
val defeatedList = {angle = 1} :: defeatedList
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
in
(defeatedList, enemyMap)
end
| STRAIGHT_BAT =>
let
val defeatedList = {angle = 1} :: defeatedList
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
in
(defeatedList, enemyMap)
end
fun fold (enemyID, (), enemyMap) = fun fold (enemyID, (), (defeatedList, enemyMap)) =
case EnemyMap.get (enemyID, enemyMap) of case EnemyMap.get (enemyID, enemyMap) of
SOME enemy => onAttacked (enemyID, enemy, enemyMap) SOME enemy => onAttacked (enemyID, enemy, enemyMap, defeatedList)
| NONE => enemyMap | NONE => (defeatedList, enemyMap)
end) end)
fun attackEnemies (player: PlayerType.player, enemyMap, enemyTree) = fun attackEnemies (player: PlayerType.player, enemyMap, enemyTree) =
@@ -35,10 +52,18 @@ struct
(case facing of (case facing of
FACING_RIGHT => x + Constants.playerSize FACING_RIGHT => x + Constants.playerSize
| FACING_LEFT => x - length) | FACING_LEFT => x - length)
val (defeatedList, enemyMap) = AttackEnemies.foldRegion
(x, y, length, height, (), ([], enemyMap), enemyTree)
val defeatedList = Vector.fromList defeatedList
val defeatedList = Vector.concat [defeatedList, #enemies player]
val player =
PlayerPatch.withPatch (player, PlayerPatch.W_ENEMIES defeatedList)
in in
AttackEnemies.foldRegion (player, enemyMap)
(x, y, length, height, (), enemyMap, enemyTree)
end end
| _ => enemyMap | _ => (player, enemyMap)
end end
end end