From 8906d244ebd1e9fa946ce46a80c6fcf6d6145aeb Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 12 Jan 2025 19:25:05 +0000 Subject: [PATCH] extract player patch types and functions to its own module --- fcore/game-type.sml | 30 ---- fcore/physics.sml | 8 +- fcore/player-enemy.sml | 1 + fcore/player-patch.sml | 320 +++++++++++++++++++++++++++++++++++++++++ fcore/player.sml | 296 +------------------------------------- oms.mlb | 2 + 6 files changed, 334 insertions(+), 323 deletions(-) create mode 100644 fcore/player-patch.sml diff --git a/fcore/game-type.sml b/fcore/game-type.sml index 189beef..255cb26 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -46,21 +46,6 @@ sig , projectiles: player_projectile vector } - datatype player_patch = - W_X_AXIS of x_axis - | W_Y_AXIS of y_axis - | W_RECOIL of player_recoil - | W_ATTACKED of player_attacked - | W_MAIN_ATTACK of main_attack - | W_FACING of facing - | W_HEALTH of int - | W_X of int - | W_Y of int - | W_JUMP_PRESSED of bool - | W_ENEMIES of defeated_enemies vector - | W_CHARGE of int - | W_PROJECTILES of player_projectile vector - type enemy = {id: int, health: int, x: int, y: int, xAxis: x_axis, yAxis: y_axis} @@ -125,21 +110,6 @@ struct , projectiles: player_projectile vector } - datatype player_patch = - W_X_AXIS of x_axis - | W_Y_AXIS of y_axis - | W_RECOIL of player_recoil - | W_ATTACKED of player_attacked - | W_MAIN_ATTACK of main_attack - | W_FACING of facing - | W_HEALTH of int - | W_X of int - | W_Y of int - | W_JUMP_PRESSED of bool - | W_ENEMIES of defeated_enemies vector - | W_CHARGE of int - | W_PROJECTILES of player_projectile vector - type enemy = {id: int, health: int, x: int, y: int, xAxis: x_axis, yAxis: y_axis} diff --git a/fcore/physics.sml b/fcore/physics.sml index 3b59e27..42d133a 100644 --- a/fcore/physics.sml +++ b/fcore/physics.sml @@ -76,7 +76,7 @@ structure PlayerPhysics = MakePhysics (struct type t = GameType.player - type patch = GameType.player_patch + type patch = PlayerPatch.player_patch (* constants for physics *) val moveBy = Constants.movePlayerBy @@ -90,7 +90,7 @@ structure PlayerPhysics = fun getXAxis ({xAxis, ...}: t) = xAxis fun getYAxis ({yAxis, ...}: t) = yAxis - val W_X = GameType.W_X - val W_Y = GameType.W_Y - val W_Y_AXIS = GameType.W_Y_AXIS + val W_X = PlayerPatch.W_X + val W_Y = PlayerPatch.W_Y + val W_Y_AXIS = PlayerPatch.W_Y_AXIS end) diff --git a/fcore/player-enemy.sml b/fcore/player-enemy.sml index 4429b40..ca828d4 100644 --- a/fcore/player-enemy.sml +++ b/fcore/player-enemy.sml @@ -1,6 +1,7 @@ structure PlayerEnemy = struct open GameType + open PlayerPatch fun getEnemyRecoilPatches (player, playerOnRight, acc) = if playerOnRight then diff --git a/fcore/player-patch.sml b/fcore/player-patch.sml new file mode 100644 index 0000000..5287538 --- /dev/null +++ b/fcore/player-patch.sml @@ -0,0 +1,320 @@ +signature PLAYER_PATCH = +sig + datatype player_patch = + W_X_AXIS of GameType.x_axis + | W_Y_AXIS of GameType.y_axis + | W_RECOIL of GameType.player_recoil + | W_ATTACKED of GameType.player_attacked + | W_MAIN_ATTACK of GameType.main_attack + | W_FACING of GameType.facing + | W_HEALTH of int + | W_X of int + | W_Y of int + | W_JUMP_PRESSED of bool + | W_ENEMIES of GameType.defeated_enemies vector + | W_CHARGE of int + | W_PROJECTILES of GameType.player_projectile vector + + val withPatches: GameType.player * player_patch list -> GameType.player +end + +structure PlayerPatch: PLAYER_PATCH = +struct + datatype player_patch = + W_X_AXIS of GameType.x_axis + | W_Y_AXIS of GameType.y_axis + | W_RECOIL of GameType.player_recoil + | W_ATTACKED of GameType.player_attacked + | W_MAIN_ATTACK of GameType.main_attack + | W_FACING of GameType.facing + | W_HEALTH of int + | W_X of int + | W_Y of int + | W_JUMP_PRESSED of bool + | W_ENEMIES of GameType.defeated_enemies vector + | W_CHARGE of int + | W_PROJECTILES of GameType.player_projectile vector + + fun mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) = + { yAxis = yAxis + , xAxis = xAxis + , recoil = recoil + , attacked = attacked + , mainAttack = mainAttack + , mainAttackPressed = mainAttackPressed + , facing = facing + , health = health + , x = x + , y = y + , jumpPressed = jumpPressed + , enemies = enemies + , charge = charge + , projectiles = projectiles + } + + fun withPatch (player, patch) = + let + val + { yAxis + , xAxis + , recoil + , attacked + , mainAttack + , mainAttackPressed + , facing + , health + , x + , y + , jumpPressed + , enemies + , charge + , projectiles + } = player + in + case patch of + W_X_AXIS xAxis => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_Y_AXIS yAxis => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_RECOIL recoil => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_ATTACKED attacked => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_MAIN_ATTACK mainAttack => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_FACING facing => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_HEALTH health => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_X x => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_Y y => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_JUMP_PRESSED jumpPressed => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_ENEMIES enemies => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_CHARGE charge => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + | W_PROJECTILES projectiles => + mkPlayer + ( health + , xAxis + , yAxis + , x + , y + , jumpPressed + , recoil + , attacked + , mainAttack + , facing + , mainAttackPressed + , enemies + , charge + , projectiles + ) + end + + fun withPatches (player: GameType.player, lst) = + case lst of + hd :: tl => + let val player = withPatch (player, hd) + in withPatches (player, tl) + end + | [] => player +end diff --git a/fcore/player.sml b/fcore/player.sml index 103426f..5356bd9 100644 --- a/fcore/player.sml +++ b/fcore/player.sml @@ -1,289 +1,7 @@ structure Player = struct open GameType - - fun mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) = - { yAxis = yAxis - , xAxis = xAxis - , recoil = recoil - , attacked = attacked - , mainAttack = mainAttack - , mainAttackPressed = mainAttackPressed - , facing = facing - , health = health - , x = x - , y = y - , jumpPressed = jumpPressed - , enemies = enemies - , charge = charge - , projectiles = projectiles - } - - fun withPatch (player: player, patch) = - let - val - { yAxis - , xAxis - , recoil - , attacked - , mainAttack - , mainAttackPressed - , facing - , health - , x - , y - , jumpPressed - , enemies - , charge - , projectiles - } = player - in - case patch of - W_X_AXIS xAxis => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_Y_AXIS yAxis => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_RECOIL recoil => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_ATTACKED attacked => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_MAIN_ATTACK mainAttack => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_FACING facing => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_HEALTH health => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_X x => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_Y y => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_JUMP_PRESSED jumpPressed => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_ENEMIES enemies => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_CHARGE charge => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - | W_PROJECTILES projectiles => - mkPlayer - ( health - , xAxis - , yAxis - , x - , y - , jumpPressed - , recoil - , attacked - , mainAttack - , facing - , mainAttackPressed - , enemies - , charge - , projectiles - ) - end - - fun withPatches (player: player, lst) = - case lst of - hd :: tl => - let val player = withPatch (player, hd) - in withPatches (player, tl) - end - | [] => player + open PlayerPatch (* helper functions checking input *) fun getXAxis (lh, rh) = @@ -689,17 +407,17 @@ struct val player = #player game val patches = getProjectilePatches player - val player = withPatches (player, patches) + val player = PlayerPatch.withPatches (player, patches) val patches = getRecoilPatches player - val player = withPatches (player, patches) + val player = PlayerPatch.withPatches (player, patches) val player = (* we only accept and handle input if player is not recoiling *) case #recoil player of NO_RECOIL => let val patches = getInputPatches (player, input) - in withPatches (player, patches) + in PlayerPatch.withPatches (player, patches) end | _ => player @@ -711,15 +429,15 @@ struct (fn {angle} => {angle = if angle < 360 then angle + 5 else 0}) e val patches = [W_ENEMIES e] in - withPatches (player, patches) + PlayerPatch.withPatches (player, patches) end val patches = PlayerPhysics.getPatches player - val player = withPatches (player, patches) + val player = PlayerPatch.withPatches (player, patches) val patches = getEnvironmentPatches (player, game) in - withPatches (player, patches) + PlayerPatch.withPatches (player, patches) end (* block is placeholder asset *) diff --git a/oms.mlb b/oms.mlb index 563b7a7..050a991 100644 --- a/oms.mlb +++ b/oms.mlb @@ -17,6 +17,8 @@ fcore/platform.sml fcore/enemy.sml fcore/game-type.sml +fcore/player-patch.sml + fcore/physics.sml fcore/player.sml fcore/projectile.sml