have patrol slime and follow slime also react to player's ChainEdge attack, and not only player's projectiles

This commit is contained in:
2025-02-08 04:02:17 +00:00
parent 23cf480dad
commit f9fe009d59

View File

@@ -2,6 +2,42 @@ structure EnemyBehaviour =
struct struct
open GameType open GameType
fun isColliding (ix, iy, ifx, ify, cx, cy, cfx, cfy) =
ix < cfx andalso ifx > cx andalso iy < cfy andalso ify > cy
fun isCollidingPlus (ix, iy, iw, ih, cx, cy, cw, ch) =
let
val ifx = ix + iw
val ify = iy + ih
val cfx = cx + cw
val cfy = cy + ch
in
isColliding (ix, iy, ifx, ify, cx, cy, cfx, cfy)
end
(* if player is attacking, does enemy collide with attack? *)
fun isCollidingWithPlayerAttack (player: player, enemy: enemy) =
let
val {x = px, y = py, facing, mainAttack, ...} = player
val pSize = Constants.playerSize
val {x = ex, y = ey, ...} = enemy
val eSize = Constants.enemySize
in
case mainAttack of
MAIN_ATTACKING {length, ...} =>
(case facing of
FACING_RIGHT =>
let val px = px + pSize
in isCollidingPlus (px, py, length, pSize, ex, ey, eSize, eSize)
end
| FACING_LEFT =>
let val px = px - length
in isCollidingPlus (px, py, length, pSize, ex, ey, eSize, eSize)
end)
| _ => false
end
fun canWalkAhead (x, y, wallTree, platformTree) = fun canWalkAhead (x, y, wallTree, platformTree) =
let let
val y = y + Constants.enemySize - 5 val y = y + Constants.enemySize - 5
@@ -358,12 +394,24 @@ struct
| _ => enemy | _ => enemy
fun updatePatrolState fun updatePatrolState
(enemy, walls, wallTree, platforms, platformTree, projectileTree, enemyList) = ( player
, enemy
, walls
, wallTree
, platforms
, platformTree
, projectileTree
, enemyList
) =
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 QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then if isAttacked then
(* no matter what projectiles hits it, PATROL_SLIME should be filtered out *) (* no matter what projectiles hits it, PATROL_SLIME should be filtered out *)
enemyList enemyList
else else
@@ -399,8 +447,12 @@ struct
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 QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then if isAttacked then
(* filter out when any projectile hits *) (* filter out when any projectile hits *)
enemyList enemyList
else else
@@ -441,7 +493,8 @@ struct
case #variant enemy of case #variant enemy of
PATROL_SLIME => PATROL_SLIME =>
updatePatrolState updatePatrolState
( enemy ( player
, enemy
, walls , walls
, wallTree , wallTree
, platforms , platforms