From 400b971c7bfc2af6243e3b42fe1904c0b263e953 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 22 Dec 2024 20:21:16 +0000 Subject: [PATCH] add main attack patches to player.sml, registering attack input (although we don't react on the attack input yet) --- fcore/game-type.sml | 9 ++++-- fcore/player.sml | 70 +++++++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/fcore/game-type.sml b/fcore/game-type.sml index fb3f4c0..984bb73 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -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 diff --git a/fcore/player.sml b/fcore/player.sml index 8f44c9c..010af57 100644 --- a/fcore/player.sml +++ b/fcore/player.sml @@ -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 => []