progress coding function to make FOLLOW_SLIME go rightwards if next platform is towards the right

This commit is contained in:
2025-01-25 00:23:30 +00:00
parent 7a5517571d
commit 0be8e0dc5f

View File

@@ -134,7 +134,7 @@ struct
(* pathfinding *)
fun isBetween (p1, check, p2) = check >= p1 andalso check <= p2
fun getHighestPlatform (collisions, platforms, highestY, highestID) =
fun getHighestPlatform (collisions, platforms, highestY, highestID, checkY) =
case collisions of
id :: tl =>
let
@@ -142,8 +142,10 @@ struct
in
(* platY < highestY is correct because lowest number = highest
* in * this case *)
if platY < highestY then getHighestPlatform (tl, platforms, platY, id)
else getHighestPlatform (tl, platforms, highestY, highestID)
if platY < highestY andalso checkY <= platY then
getHighestPlatform (tl, platforms, platY, id, checkY)
else
getHighestPlatform (tl, platforms, highestY, highestID, checkY)
end
| [] => highestID
@@ -159,8 +161,9 @@ struct
val collisions = QuadTree.getCollisions
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
val checkY = y + Constants.playerSize
in
getHighestPlatform (collisions, platforms, wh, ~1)
getHighestPlatform (collisions, platforms, wh, ~1, checkY)
end
fun getPlatformBelowEnemy (enemy: enemy, platformTree, platforms) =
@@ -178,7 +181,7 @@ struct
val collisions = QuadTree.getCollisions
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
in
getHighestPlatform (collisions, platforms, wh, ~1)
getHighestPlatform (collisions, platforms, wh, ~1, y)
end
fun canJump (prevPlatform, nextPlatform) =
@@ -267,6 +270,55 @@ struct
acc
end
fun getMoveRightPatches (nextPlatform, enemy, platformTree, acc) =
let
val {x = platX, y = platY, width = platWidth, ...} = nextPlatform
val platFinishX = platX + platWidth
val {x = ex, y = ey, yAxis = eyAxis, ...} = enemy
val xDiff = platX - ex
in
if ey > platY then
(* enemy is lower than next platform so needs to jump *)
let
val jumpAmt =
case eyAxis of
JUMPING amt => amt
| _ => 0
val apexY = ey - (Constants.jumpLimit - jumpAmt)
(* enemy moves in x and y axis at same rate
* with no acceleration or deceleration.
* So, we can directly compare to see which is lower;
* if x is lower, that means we can't reach if we jump at this point
* but if y is lower, that means we can reach if we jump at this point
* so we should simply move rightwards.
* *)
val xyDiff = apexY - xDiff
in
if xyDiff >= 0 then
let
val acc =
case eyAxis of
ON_GROUND => EnemyPatch.W_Y_AXIS (JUMPING 0) :: acc
| _ => acc
in
EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
end
else
EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
end
else
(* platform is below or at same y coordinat as enemy
* so might possibly require dropping below rather than jumping. *)
let
in
EnemyPatch.W_X_AXIS MOVE_RIGHT :: acc
end
end
(* get patches to help enemy move to nextPlatformID *)
fun getPathToNextPlatform
(nextPlatformID, platforms, platformTree, enemy, eID, pID, acc) =
@@ -284,7 +336,18 @@ struct
else if canDrop then
getDropPatches (nextPlatform, platformTree, enemy, acc)
else
acc
let
(* if can neither jump or drop to next platform vertically
* then remaining options are either jumping to the right or left.
* Figure out which the enemy needs to do and progress to it. *)
val {x = nPlatX, width = nPlatW, ...} = nextPlatform
in
if eX < nPlatX then
getMoveRightPatches (nextPlatform, enemy, platformTree, acc)
else
(* move to the left *)
EnemyPatch.W_X_AXIS MOVE_LEFT :: acc
end
end
fun canJumpOnPlatform (player, platforms, enemy: enemy, platformTree, acc) =