add main attack patches to player.sml, registering attack input (although we don't react on the attack input yet)

This commit is contained in:
2024-12-22 20:21:16 +00:00
parent 9e30beb7d2
commit 400b971c7b
2 changed files with 51 additions and 28 deletions

View File

@@ -19,7 +19,7 @@ sig
datatype facing = FACING_LEFT | FACING_RIGHT
datatype main_attack = MAIN_UNUSED | MAIN_ATTACKING of int
datatype main_attack = MAIN_NOT_ATTACKING | MAIN_ATTACKING of int
type player =
{ yAxis: player_y_axis
@@ -27,6 +27,7 @@ sig
, recoil: player_recoil
, attacked: player_attacked
, mainAttack: main_attack
, mainAttackPressed: bool
, facing: facing
, health: int
, x: int
@@ -71,7 +72,7 @@ struct
datatype facing = FACING_LEFT | FACING_RIGHT
datatype main_attack = MAIN_UNUSED | MAIN_ATTACKING of int
datatype main_attack = MAIN_NOT_ATTACKING | MAIN_ATTACKING of int
type player =
{ yAxis: player_y_axis
@@ -79,6 +80,7 @@ struct
, recoil: player_recoil
, attacked: player_attacked
, mainAttack: main_attack
, mainAttackPressed: bool
, facing: facing
, health: int
, x: int
@@ -105,7 +107,8 @@ struct
, xAxis = STAY_STILL
, recoil = NO_RECOIL
, attacked = NOT_ATTACKED
, mainAttack = MAIN_UNUSED
, mainAttack = MAIN_NOT_ATTACKING
, mainAttackPressed = false
, facing = FACING_RIGHT
, health = 3
, x = 500

View File

@@ -25,12 +25,14 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
) =
{ yAxis = yAxis
, xAxis = xAxis
, recoil = recoil
, attacked = attacked
, mainAttack = MAIN_UNUSED
, mainAttack = mainAttack
, mainAttackPressed = mainAttackPressed
, facing = facing
, health = health
, x = x
@@ -46,6 +48,7 @@ struct
, recoil
, attacked
, mainAttack
, mainAttackPressed
, facing
, health
, x
@@ -66,6 +69,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_Y_AXIS yAxis =>
mkPlayer
@@ -79,6 +83,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_RECOIL recoil =>
mkPlayer
@@ -92,6 +97,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_ATTACKED attacked =>
mkPlayer
@@ -105,6 +111,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_MAIN_ATTACK mainAttack =>
mkPlayer
@@ -118,6 +125,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_FACING facing =>
mkPlayer
@@ -131,6 +139,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_HEALTH health =>
mkPlayer
@@ -144,6 +153,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_X x =>
mkPlayer
@@ -157,6 +167,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_Y y =>
mkPlayer
@@ -170,6 +181,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
| W_JUMP_PRESSED jumpPressed =>
mkPlayer
@@ -183,6 +195,7 @@ struct
, attacked
, mainAttack
, facing
, mainAttackPressed
)
end
@@ -203,7 +216,8 @@ struct
val jumpLimit = 150
val floatLimit = 3
val recoilLimit = 15
val attackLimit = 55
val attackedLimit = 55
val mainAttackLimit = 15
(* helper functions checking input *)
fun getXAxis (lh, rh) =
@@ -382,7 +396,7 @@ struct
checkEnemies (player, enemies, enemyCollisions, acc)
end
| ATTACKED amt =>
if amt = attackLimit then
if amt = attackedLimit then
(* if we hit limit, exit ATTACKED phase
* and react to enemy collisions again
* *)
@@ -448,13 +462,9 @@ struct
end
end
fun getInputPatches (player: player, input) =
fun getJumpPatches (player, upHeld, downHeld, acc) =
let
val {x, y, yAxis, jumpPressed, facing, ...} = player
val {leftHeld, rightHeld, upHeld, downHeld, attackHeld} = input
val xAxis = getXAxis (leftHeld, rightHeld)
val facing = getFacing (facing, xAxis)
val {yAxis, jumpPressed, ...} = player
in
case (upHeld, downHeld) of
(false, false) =>
@@ -462,40 +472,50 @@ struct
val yAxis = defaultYAxis yAxis
val jumpPressed = false
in
[ W_X_AXIS xAxis
, W_Y_AXIS yAxis
, W_JUMP_PRESSED jumpPressed
, W_FACING facing
]
W_JUMP_PRESSED jumpPressed :: W_Y_AXIS yAxis :: acc
end
| (true, true) =>
let val yAxis = defaultYAxis yAxis
in [W_X_AXIS xAxis, W_Y_AXIS yAxis, W_FACING facing]
in W_Y_AXIS yAxis :: acc
end
| (true, false) =>
let
val yAxis = onJumpPressed (yAxis, jumpPressed)
val jumpPressed = true
in
[ W_X_AXIS xAxis
, W_Y_AXIS yAxis
, W_JUMP_PRESSED jumpPressed
, W_FACING facing
]
W_Y_AXIS yAxis :: W_JUMP_PRESSED jumpPressed :: acc
end
| (false, true) =>
let
val jumpPressed = false
val yAxis = DROP_BELOW_PLATFORM
in
[ W_X_AXIS xAxis
, W_Y_AXIS yAxis
, W_JUMP_PRESSED jumpPressed
, W_FACING facing
]
W_Y_AXIS yAxis :: W_JUMP_PRESSED jumpPressed :: acc
end
end
fun getMainAttackPatches (prevAttack, attackHeld) =
case prevAttack of
MAIN_NOT_ATTACKING => if attackHeld then MAIN_ATTACKING 0 else prevAttack
| MAIN_ATTACKING amt =>
if amt = mainAttackLimit then MAIN_NOT_ATTACKING
else let val amt = amt + 1 in MAIN_ATTACKING amt end
fun getInputPatches (player: player, input) =
let
val {x, y, yAxis, jumpPressed, facing, mainAttack, ...} = player
val {leftHeld, rightHeld, upHeld, downHeld, attackHeld} = input
val xAxis = getXAxis (leftHeld, rightHeld)
val facing = getFacing (facing, xAxis)
val mainAttack = getMainAttackPatches (mainAttack, attackHeld)
val acc = [W_X_AXIS xAxis, W_FACING facing, W_MAIN_ATTACK mainAttack]
val acc = getJumpPatches (player, upHeld, downHeld, acc)
in
acc
end
fun getRecoilPatches player =
case #recoil player of
NO_RECOIL => []