progress with enemy collision

This commit is contained in:
2024-12-23 03:59:27 +00:00
parent 5819c4facf
commit 36085f75c0

View File

@@ -228,6 +228,10 @@ struct
val moveBy = 5 val moveBy = 5
val mainAttackSize = 55
(* timing variables; always start at 0,
* and revert to default state when limit is hit *)
val jumpLimit = 150 val jumpLimit = 150
val floatLimit = 3 val floatLimit = 3
val recoilLimit = 15 val recoilLimit = 15
@@ -267,6 +271,7 @@ struct
case prevAxis of case prevAxis of
JUMPING _ => FLOATING 0 JUMPING _ => FLOATING 0
| FLOATING _ => prevAxis | FLOATING _ => prevAxis
| DROP_BELOW_PLATFORM => prevAxis
| _ => FALLING | _ => FALLING
(* We want to prevent a double jump (* We want to prevent a double jump
@@ -344,6 +349,24 @@ struct
| [] => acc | [] => acc
end end
fun getEnemyRecoilPatches (player, playerOnRight, acc) =
if playerOnRight then
let
val newRecoil = RECOIL_RIGHT 0
val newAttacked = ATTACKED 0
in
W_RECOIL newRecoil :: W_ATTACKED newAttacked :: W_FACING FACING_LEFT
:: W_Y_AXIS FALLING :: W_X_AXIS STAY_STILL :: acc
end
else
let
val newRecoil = RECOIL_LEFT 0
val newAttacked = ATTACKED 0
in
W_RECOIL newRecoil :: W_ATTACKED newAttacked :: W_FACING FACING_RIGHT
:: W_Y_AXIS FALLING :: W_X_AXIS STAY_STILL :: acc
end
fun checkEnemies (player, enemies, lst, acc) = fun checkEnemies (player, enemies, lst, acc) =
case lst of case lst of
id :: tl => id :: tl =>
@@ -365,31 +388,29 @@ struct
eCentreX < pCentreX eCentreX < pCentreX
end end
val newRecoil = val acc = getEnemyRecoilPatches (player, playerOnRight, acc)
if playerOnRight then RECOIL_RIGHT 0 else RECOIL_LEFT 0
val acc = W_RECOIL newRecoil :: acc
val acc =
case newRecoil of
RECOIL_LEFT _ => W_FACING FACING_RIGHT :: acc
| RECOIL_RIGHT _ => W_FACING FACING_LEFT :: acc
| NO_RECOIL => acc
val acc =
W_ATTACKED (ATTACKED 0) :: W_Y_AXIS (FALLING) :: W_X_AXIS STAY_STILL
:: acc
in in
checkEnemies (player, enemies, tl, acc) checkEnemies (player, enemies, tl, acc)
end end
| [] => acc | [] => acc
fun checkEnemiesWhileAttacking (player, wasAttacked, enemies, lst, acc) =
let
open QuadTree
in
case lst of
enemyID :: tl =>
(* placeholder *)
acc
| [] => acc
end
fun getCollisionPatches (player, game) = fun getCollisionPatches (player, game) =
let let
val {walls, wallTree, platformTree, platforms, enemyTree, enemies, ...} = val {walls, wallTree, platformTree, platforms, enemyTree, enemies, ...} =
game game
val {x, y, attacked, ...} = player val {x, y, attacked, mainAttack, ...} = player
val platCollisions = QuadTree.getCollisionsBelow val platCollisions = QuadTree.getCollisionsBelow
(x, y, size, size, 0, 0, 1920, 1080, 0, platformTree) (x, y, size, size, 0, 0, 1920, 1080, 0, platformTree)
@@ -404,22 +425,20 @@ struct
* where player can walk through enemies without receiving damage * where player can walk through enemies without receiving damage
* in which case enemy collisions don't count * in which case enemy collisions don't count
* *) * *)
case attacked of case (mainAttack, attacked) of
NOT_ATTACKED => (MAIN_NOT_ATTACKING, NOT_ATTACKED) =>
let let
val {x, y, ...} = player
val enemyCollisions = QuadTree.getCollisions val enemyCollisions = QuadTree.getCollisions
(x, y, size, size, 0, 0, 1920, 1080, 0, enemyTree) (x, y, size, size, 0, 0, 1920, 1080, 0, enemyTree)
in in
checkEnemies (player, enemies, enemyCollisions, acc) checkEnemies (player, enemies, enemyCollisions, acc)
end end
| ATTACKED amt => | (MAIN_NOT_ATTACKING, ATTACKED amt) =>
if amt = attackedLimit then if amt = attackedLimit then
(* if we hit limit, exit ATTACKED phase (* if we hit limit, exit ATTACKED phase
* and react to enemy collisions again * and react to enemy collisions again
* *) * *)
let let
val {x, y, ...} = player
val enemyCollisions = QuadTree.getCollisions val enemyCollisions = QuadTree.getCollisions
(x, y, size, size, 0, 0, 1920, 1080, 0, enemyTree) (x, y, size, size, 0, 0, 1920, 1080, 0, enemyTree)
@@ -434,6 +453,42 @@ struct
in in
W_ATTACKED attacked :: acc W_ATTACKED attacked :: acc
end end
| (MAIN_ATTACKING amt, NOT_ATTACKED) =>
let
val enemyCollisions = QuadTree.getCollisions
( x
, y
, mainAttackSize
, mainAttackSize
, 0
, 0
, 1920
, 1080
, 0
, enemyTree
)
in
checkEnemiesWhileAttacking
(player, false, enemies, enemyCollisions, acc)
end
| (MAIN_ATTACKING attackingAmt, ATTACKED attackedAmt) =>
let
val enemyCollisions = QuadTree.getCollisions
( x
, y
, mainAttackSize
, mainAttackSize
, 0
, 0
, 1920
, 1080
, 0
, enemyTree
)
in
checkEnemiesWhileAttacking
(player, true, enemies, enemyCollisions, acc)
end
end end
fun getMovePatches player = fun getMovePatches player =
@@ -570,7 +625,6 @@ struct
| _ => mainAttackPressed | _ => mainAttackPressed
in in
[ W_X_AXIS STAY_STILL [ W_X_AXIS STAY_STILL
, W_Y_AXIS FALLING
, W_MAIN_ATTACK mainAttack , W_MAIN_ATTACK mainAttack
, W_MAIN_ATTACK_PRESSED mainAttackPressed , W_MAIN_ATTACK_PRESSED mainAttackPressed
] ]