require attack button to be pressed twice in order to trigger throwing of defeated enemies

This commit is contained in:
2025-01-08 13:18:35 +00:00
parent f7ee3e9e29
commit bd946bf635
2 changed files with 69 additions and 29 deletions

View File

@@ -19,7 +19,11 @@ sig
datatype facing = FACING_LEFT | FACING_RIGHT datatype facing = FACING_LEFT | FACING_RIGHT
datatype main_attack = MAIN_NOT_ATTACKING | MAIN_ATTACKING | MAIN_CHARGING datatype main_attack =
MAIN_NOT_ATTACKING
| MAIN_ATTACKING
| MAIN_CHARGING
| MAIN_THROWING
type defeated_enemies = {angle: int} type defeated_enemies = {angle: int}
@@ -94,7 +98,11 @@ struct
datatype facing = FACING_LEFT | FACING_RIGHT datatype facing = FACING_LEFT | FACING_RIGHT
datatype main_attack = MAIN_NOT_ATTACKING | MAIN_ATTACKING | MAIN_CHARGING datatype main_attack =
MAIN_NOT_ATTACKING
| MAIN_ATTACKING
| MAIN_CHARGING
| MAIN_THROWING
type defeated_enemies = {angle: int} type defeated_enemies = {angle: int}

View File

@@ -546,22 +546,7 @@ struct
defeatedEnemiesToProjectiles (pos + 1, defeteadEnemies, player, acc) defeatedEnemiesToProjectiles (pos + 1, defeteadEnemies, player, acc)
end end
fun getMainAttackPatches fun getThrowPatches (defeteadEnemies, projectiles, player, acc) =
( prevAttack
, defeteadEnemies
, projectiles
, attackHeld
, chargeHeld
, charge
, player
, acc
) =
if attackHeld then
if
prevWasNotAttacking prevAttack andalso Vector.length defeteadEnemies > 0
then
(* shoot projectiles if player was not attacking previously,
* and there is more than one enemy *)
let let
val newProjectiles = val newProjectiles =
defeatedEnemiesToProjectiles (0, defeteadEnemies, player, []) defeatedEnemiesToProjectiles (0, defeteadEnemies, player, [])
@@ -572,8 +557,26 @@ struct
(* remove defeated enemies from player record *) (* remove defeated enemies from player record *)
val enemies = Vector.fromList [] val enemies = Vector.fromList []
in in
W_PROJECTILES allProjectiles :: W_ENEMIES enemies :: acc W_MAIN_ATTACK MAIN_THROWING :: W_PROJECTILES allProjectiles
:: W_ENEMIES enemies :: acc
end end
fun getMainAttackPatches
( prevAttack
, defeteadEnemies
, projectiles
, attackHeld
, chargeHeld
, charge
, player
, acc
) =
case prevAttack of
MAIN_NOT_ATTACKING =>
if attackHeld andalso Vector.length defeteadEnemies > 0 then
(* shoot projectiles if player was not attacking previously,
* and there is more than one enemy *)
getThrowPatches (defeteadEnemies, projectiles, player, acc)
else else
let let
val mainAttack = val mainAttack =
@@ -581,6 +584,26 @@ struct
in in
mainAttack :: acc mainAttack :: acc
end end
| MAIN_CHARGING =>
if attackHeld andalso Vector.length defeteadEnemies > 0 then
getThrowPatches (defeteadEnemies, projectiles, player, acc)
else
let
val mainAttack =
helpGetMainAttackPatches (attackHeld, chargeHeld, charge)
in
mainAttack :: acc
end
| MAIN_ATTACKING =>
let
val mainAttack =
helpGetMainAttackPatches (attackHeld, chargeHeld, charge)
in
mainAttack :: acc
end
| MAIN_THROWING =>
if attackHeld then
acc
else else
let let
val mainAttack = val mainAttack =
@@ -615,7 +638,7 @@ struct
case mainAttack of case mainAttack of
MAIN_CHARGING => Int.min (charge + 1, maxCharge) MAIN_CHARGING => Int.min (charge + 1, maxCharge)
| MAIN_ATTACKING => Int.max (charge - 1, 0) | MAIN_ATTACKING => Int.max (charge - 1, 0)
| MAIN_NOT_ATTACKING => charge | _ => charge
val acc = [W_X_AXIS xAxis, W_FACING facing, W_CHARGE charge] val acc = [W_X_AXIS xAxis, W_FACING facing, W_CHARGE charge]
@@ -738,6 +761,15 @@ struct
Block.lerp (x, y, size, size, width, height, 0.9, 0.9, 0.9) Block.lerp (x, y, size, size, width, height, 0.9, 0.9, 0.9)
else else
Block.lerp (x, y, size, size, width, height, 0.5, 0.5, 0.5)) Block.lerp (x, y, size, size, width, height, 0.5, 0.5, 0.5))
| MAIN_THROWING =>
(case attacked of
NOT_ATTACKED =>
Block.lerp (x, y, size, size, width, height, 0.5, 0.5, 0.5)
| ATTACKED amt =>
if amt mod 5 = 0 then
Block.lerp (x, y, size, size, width, height, 0.9, 0.9, 0.9)
else
Block.lerp (x, y, size, size, width, height, 0.5, 0.5, 0.5))
| MAIN_ATTACKING => | MAIN_ATTACKING =>
(case attacked of (case attacked of
NOT_ATTACKED => NOT_ATTACKED =>