add code to make enemy fall when attacked by projectile (assuming health is enough)

This commit is contained in:
2025-02-14 18:18:46 +00:00
parent c75e7bc33b
commit 5412a71d30
3 changed files with 92 additions and 25 deletions

View File

@@ -102,7 +102,7 @@ struct
, health = 1 , health = 1
, xAxis = EntityType.MOVE_RIGHT , xAxis = EntityType.MOVE_RIGHT
, yAxis = EntityType.FALLING , yAxis = EntityType.FALLING
, variant = EnemyType.STRAIGHT_BAT , variant = EnemyType.PATROL_SLIME
, batDirY = EnemyType.UP , batDirY = EnemyType.UP
, platID = ~1 , platID = ~1
, nextPlatID = ~1 , nextPlatID = ~1
@@ -110,7 +110,22 @@ struct
, batMaxY = 485 , batMaxY = 485
, batMinY = 625 , batMinY = 625
} }
val enemies = enemyMapFromList ([enemy1], EnemyMap.empty) val enemy2 =
{ id = 2
, x = 351
, y = 555
, health = 1
, xAxis = EntityType.MOVE_RIGHT
, yAxis = EntityType.FALLING
, variant = EnemyType.PATROL_SLIME
, batDirY = EnemyType.UP
, platID = ~1
, nextPlatID = ~1
, batRest = 0
, batMaxY = 485
, batMinY = 625
}
val enemies = enemyMapFromList ([enemy1, enemy2], EnemyMap.empty)
val graph = Graph.fromPlatforms (platforms, platformTree) val graph = Graph.fromPlatforms (platforms, platformTree)
in in
{ player = player { player = player

View File

@@ -21,6 +21,11 @@ struct
val (player, enemies) = val (player, enemies) =
PlayerAttack.attackEnemies (player, enemies, enemyTree) PlayerAttack.attackEnemies (player, enemies, enemyTree)
val projectiles = #projectiles player
val (fallingEnemies, enemies) =
PlayerAttack.projectileHitEnemy
(projectiles, enemies, enemyTree, fallingEnemies)
val enemies = Enemy.update val enemies = Enemy.update
(enemies, walls, wallTree, platforms, platformTree, player, graph) (enemies, walls, wallTree, platforms, platformTree, player, graph)

View File

@@ -8,33 +8,24 @@ struct
open EnemyType open EnemyType
fun onAttacked (enemyID, enemy, enemyMap, defeatedList) = fun defeatEnemy (enemyID, enemyMap, defeatedList) =
let
val defeatedList = {angle = 1} :: defeatedList
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
in
(defeatedList, enemyMap)
end
fun onPlayerAttack (enemyID, enemy, enemyMap, defeatedList) =
case #variant enemy of case #variant enemy of
PATROL_SLIME => PATROL_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList)
let | FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList)
val defeatedList = {angle = 1} :: defeatedList | STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, 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, (), (defeatedList, enemyMap)) = fun fold (enemyID, (), (defeatedList, enemyMap)) =
case EnemyMap.get (enemyID, enemyMap) of case EnemyMap.get (enemyID, enemyMap) of
SOME enemy => onAttacked (enemyID, enemy, enemyMap, defeatedList) SOME enemy =>
onPlayerAttack (enemyID, enemy, enemyMap, defeatedList)
| NONE => (defeatedList, enemyMap) | NONE => (defeatedList, enemyMap)
end) end)
@@ -66,4 +57,60 @@ struct
end end
| _ => (player, enemyMap) | _ => (player, enemyMap)
end end
structure ProjectileHitEnemy =
MakeQuadTreeFold
(struct
type env = unit
type state = EnemyType.falling_enemy list * EnemyMap.t
open EnemyType
fun onDefeated (enemyID, enemy, enemyMap, fallingList) =
let
val {x, y, variant, ...} = enemy
val fallingList = {x = x, y = y, variant = variant} :: fallingList
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
in
(fallingList, enemyMap)
end
fun onProjectileAttack (enemyID, enemy, enemyMap, fallingList) =
case #variant enemy of
PATROL_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingList)
| FOLLOW_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingList)
| STRAIGHT_BAT => onDefeated (enemyID, enemy, enemyMap, fallingList)
fun fold (enemyID, (), (fallingList, enemyMap)) =
case EnemyMap.get (enemyID, enemyMap) of
SOME enemy =>
onProjectileAttack (enemyID, enemy, enemyMap, fallingList)
| NONE => (fallingList, enemyMap)
end)
fun helpProjectileHitEnemy (pos, projectiles, enemyTree, enemyMap, newFalling) =
if pos = Vector.length projectiles then
(newFalling, enemyMap)
else
let
val {x, y, ...}: PlayerType.player_projectile =
Vector.sub (projectiles, pos)
val size = Constants.projectileSizeInt
val (newFalling, enemyMap) = ProjectileHitEnemy.foldRegion
(x, y, size, size, (), (newFalling, enemyMap), enemyTree)
in
helpProjectileHitEnemy
(pos + 1, projectiles, enemyTree, enemyMap, newFalling)
end
fun projectileHitEnemy (projectiles, enemyMap, enemyTree, oldFalling) =
let
val (newFalling, enemyMap) = helpProjectileHitEnemy
(0, projectiles, enemyTree, enemyMap, [])
val newFalling = Vector.fromList newFalling
val allFalling = Vector.concat [newFalling, oldFalling]
in
(allFalling, enemyMap)
end
end end