add functionality for enemy to walk to appropriate position if next platform is below current one, but only partially overlapping with current platform so enemy will not reach it if they drop down from current position

This commit is contained in:
2025-01-24 22:51:20 +00:00
parent 5e6a831add
commit 7a5517571d

View File

@@ -88,10 +88,10 @@ struct
if
hasWallAhead
then EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
else (* invert direction if moving further left
* will result in falling down *) if
canWalkAhead (searchStartX, y, wallTree, platformTree)
then acc
else if canWalkAhead (searchStartX, y, wallTree, platformTree) then
(* invert direction if moving further left
* will result in falling down *)
acc
else EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
end
| MOVE_RIGHT =>
@@ -122,10 +122,10 @@ struct
if
hasWallAhead
then EnemyPatch.W_X_AXIS MOVE_LEFT :: acc
else (* invert direction if moving further right
* will result in falling down *) if
canWalkAhead (searchStartX, y, wallTree, platformTree)
then acc
else if canWalkAhead (searchStartX, y, wallTree, platformTree) then
(* invert direction if moving further right
* will result in falling down *)
acc
else EnemyPatch.W_X_AXIS MOVE_LEFT :: acc
end
| STAY_STILL => acc
@@ -190,7 +190,7 @@ struct
val nPlatFinishX = nPlatX + nPlatW
in
(isBetween (nPlatX, pPlatX, nPlatFinishX)
orelse isBetween (nPlatX, pPlatFinishX, nPlatFinishX))
orelse isBetween (nPlatX, pPlatFinishX, nPlatFinishX))
andalso pPlatY > nPlatY
end
@@ -206,33 +206,65 @@ struct
val standingOnPlat = standingOnArea (enemy, platformTree)
in
if ey >= platY andalso standingOnPlat then
if isBetween (platX, ecx, platFinishX) then
if
isBetween (platX, ecx, platFinishX)
then
(* can jump from same position enemy is at *)
case eyAxis of
ON_GROUND => EnemyPatch.W_Y_AXIS (JUMPING 0) :: acc
| FALLING => EnemyPatch.W_Y_AXIS (JUMPING 0) :: acc
| _ => acc
else
else
(* have to travel either left or right before jumping *)
if ecx < platX then
EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
else
EnemyPatch.W_X_AXIS MOVE_LEFT :: acc
else
acc
else
acc
end
fun canDrop (nextPlatform, platformTree, enemy) =
fun canDrop (prevPlatform, nextPlatform) =
let
val {x = platX, y = platY, width = platW, ...} = nextPlatform
val platFinishX = platX + platW
val {x = pPlatX, y = pPlatY, width = pPlatW, ...} = prevPlatform
val pPlatFinishX = pPlatX + pPlatW
val {x = eX, y = ey, yAxis = eyAxis, ...} = enemy
val {x = nPlatX, y = nPlatY, width = nPlatW, ...} = nextPlatform
val nPlatFinishX = nPlatX + nPlatW
in
(isBetween (nPlatX, pPlatX, nPlatFinishX)
orelse isBetween (nPlatX, pPlatFinishX, nPlatFinishX))
andalso pPlatY < nPlatY
end
fun getDropPatches (nextPlatform, platformTree, enemy, acc) =
let
val {x = platX, y = platY, width = platWidth, ...} = nextPlatform
val platFinishX = platX + platWidth
val {x = eX, y = ey, yAxis = eyAxis, xAxis = exAxis, ...} = enemy
val ecx = eX + (Constants.enemySize div 2)
val ey = ey + Constants.enemySize
val standingOnPlat = standingOnArea (enemy, platformTree)
in
isBetween (platX, eX, platFinishX) andalso standingOnPlat
andalso ey < platY
if ey <= platY andalso standingOnPlat then
if
isBetween (platX, ecx, platFinishX)
then
(* can jump from same position enemy is at *)
case eyAxis of
ON_GROUND => EnemyPatch.W_Y_AXIS DROP_BELOW_PLATFORM :: acc
| FALLING => EnemyPatch.W_Y_AXIS DROP_BELOW_PLATFORM :: acc
| _ => acc
else
(* have to travel either left or right before jumping *)
if ecx < platX then
EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
else
EnemyPatch.W_X_AXIS MOVE_LEFT :: acc
else
acc
end
(* get patches to help enemy move to nextPlatformID *)
@@ -245,11 +277,14 @@ struct
val {x = eX, y = ey, yAxis = eyAxis, ...} = enemy
val canJump = canJump (currentPlatform, nextPlatform)
val canDrop = canDrop (nextPlatform, platformTree, enemy)
val canDrop = canDrop (currentPlatform, nextPlatform)
in
if canJump then getJumpPatches (nextPlatform, platformTree, enemy, acc)
else if canDrop then EnemyPatch.W_Y_AXIS DROP_BELOW_PLATFORM :: acc
else acc
if canJump then
getJumpPatches (nextPlatform, platformTree, enemy, acc)
else if canDrop then
getDropPatches (nextPlatform, platformTree, enemy, acc)
else
acc
end
fun canJumpOnPlatform (player, platforms, enemy: enemy, platformTree, acc) =