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

View File

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