From c75e7bc33bb2e6f012f77473d92481c8745bc238 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 14 Feb 2025 13:15:45 +0000 Subject: [PATCH] add attacked enemies who are defeated to player's list of defeated_enemies, allowing them to be shot as projectiles --- fcore/game-update.sml | 3 ++- fcore/player/player-attack.sml | 49 +++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/fcore/game-update.sml b/fcore/game-update.sml index 6794f22..4abb683 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -18,7 +18,8 @@ struct val enemyTree = Enemy.generateTree enemies 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 (enemies, walls, wallTree, platforms, platformTree, player, graph) diff --git a/fcore/player/player-attack.sml b/fcore/player/player-attack.sml index 2c5cea1..5c170c3 100644 --- a/fcore/player/player-attack.sml +++ b/fcore/player/player-attack.sml @@ -4,21 +4,38 @@ struct MakeQuadTreeFold (struct type env = unit - type state = EnemyMap.t + type state = PlayerType.defeated_enemies list * EnemyMap.t open EnemyType - fun onAttacked - (enemyID: int, enemy: EnemyType.enemy, enemyMap: EnemyMap.t) = + fun onAttacked (enemyID, enemy, enemyMap, defeatedList) = case #variant enemy of - PATROL_SLIME => EnemyMap.remove (enemyID, enemyMap) - | FOLLOW_SLIME => EnemyMap.remove (enemyID, enemyMap) - | STRAIGHT_BAT => EnemyMap.remove (enemyID, enemyMap) + PATROL_SLIME => + let + 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 - SOME enemy => onAttacked (enemyID, enemy, enemyMap) - | NONE => enemyMap + SOME enemy => onAttacked (enemyID, enemy, enemyMap, defeatedList) + | NONE => (defeatedList, enemyMap) end) fun attackEnemies (player: PlayerType.player, enemyMap, enemyTree) = @@ -35,10 +52,18 @@ struct (case facing of FACING_RIGHT => x + Constants.playerSize | 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 - AttackEnemies.foldRegion - (x, y, length, height, (), enemyMap, enemyTree) + (player, enemyMap) end - | _ => enemyMap + | _ => (player, enemyMap) end end