progress coding function to make FOLLOW_SLIME go rightwards if next platform is towards the right
This commit is contained in:
@@ -134,7 +134,7 @@ struct
|
|||||||
(* pathfinding *)
|
(* pathfinding *)
|
||||||
fun isBetween (p1, check, p2) = check >= p1 andalso check <= p2
|
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
|
case collisions of
|
||||||
id :: tl =>
|
id :: tl =>
|
||||||
let
|
let
|
||||||
@@ -142,8 +142,10 @@ struct
|
|||||||
in
|
in
|
||||||
(* platY < highestY is correct because lowest number = highest
|
(* platY < highestY is correct because lowest number = highest
|
||||||
* in * this case *)
|
* in * this case *)
|
||||||
if platY < highestY then getHighestPlatform (tl, platforms, platY, id)
|
if platY < highestY andalso checkY <= platY then
|
||||||
else getHighestPlatform (tl, platforms, highestY, highestID)
|
getHighestPlatform (tl, platforms, platY, id, checkY)
|
||||||
|
else
|
||||||
|
getHighestPlatform (tl, platforms, highestY, highestID, checkY)
|
||||||
end
|
end
|
||||||
| [] => highestID
|
| [] => highestID
|
||||||
|
|
||||||
@@ -159,8 +161,9 @@ struct
|
|||||||
|
|
||||||
val collisions = QuadTree.getCollisions
|
val collisions = QuadTree.getCollisions
|
||||||
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
|
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
|
||||||
|
val checkY = y + Constants.playerSize
|
||||||
in
|
in
|
||||||
getHighestPlatform (collisions, platforms, wh, ~1)
|
getHighestPlatform (collisions, platforms, wh, ~1, checkY)
|
||||||
end
|
end
|
||||||
|
|
||||||
fun getPlatformBelowEnemy (enemy: enemy, platformTree, platforms) =
|
fun getPlatformBelowEnemy (enemy: enemy, platformTree, platforms) =
|
||||||
@@ -178,7 +181,7 @@ struct
|
|||||||
val collisions = QuadTree.getCollisions
|
val collisions = QuadTree.getCollisions
|
||||||
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
|
(x, y, searchWidth, searchHeight, 0, 0, ww, wh, ~1, platformTree)
|
||||||
in
|
in
|
||||||
getHighestPlatform (collisions, platforms, wh, ~1)
|
getHighestPlatform (collisions, platforms, wh, ~1, y)
|
||||||
end
|
end
|
||||||
|
|
||||||
fun canJump (prevPlatform, nextPlatform) =
|
fun canJump (prevPlatform, nextPlatform) =
|
||||||
@@ -267,6 +270,55 @@ struct
|
|||||||
acc
|
acc
|
||||||
end
|
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 *)
|
(* get patches to help enemy move to nextPlatformID *)
|
||||||
fun getPathToNextPlatform
|
fun getPathToNextPlatform
|
||||||
(nextPlatformID, platforms, platformTree, enemy, eID, pID, acc) =
|
(nextPlatformID, platforms, platformTree, enemy, eID, pID, acc) =
|
||||||
@@ -283,8 +335,19 @@ struct
|
|||||||
getJumpPatches (nextPlatform, platformTree, enemy, acc)
|
getJumpPatches (nextPlatform, platformTree, enemy, acc)
|
||||||
else if canDrop then
|
else if canDrop then
|
||||||
getDropPatches (nextPlatform, platformTree, enemy, acc)
|
getDropPatches (nextPlatform, platformTree, enemy, acc)
|
||||||
else
|
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
|
end
|
||||||
|
|
||||||
fun canJumpOnPlatform (player, platforms, enemy: enemy, platformTree, acc) =
|
fun canJumpOnPlatform (player, platforms, enemy: enemy, platformTree, acc) =
|
||||||
|
|||||||
Reference in New Issue
Block a user