From 66c60a490d4660a054a27161bf1d0881ce9af9e4 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 15 Feb 2025 12:34:10 +0000 Subject: [PATCH] begin adding shield slime enemy variant --- fcore/enemy/enemy-behaviour.sml | 6 ++++++ fcore/enemy/enemy-patch.sml | 35 +++++++++++++++++++++++++++++++++ fcore/enemy/enemy-type.sml | 6 ++++-- fcore/enemy/enemy.sml | 1 + fcore/game-type.sml | 4 +++- fcore/player/player-attack.sml | 12 +++++++++++ 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/fcore/enemy/enemy-behaviour.sml b/fcore/enemy/enemy-behaviour.sml index eea2b84..c154d37 100644 --- a/fcore/enemy/enemy-behaviour.sml +++ b/fcore/enemy/enemy-behaviour.sml @@ -517,6 +517,9 @@ struct EnemyPatch.withPatches (enemy, patches) end + fun updateShieldSlime + (player, enemy, walls, wallTree, platforms, platformTree) = enemy + fun updateEnemyState (enemy, walls, wallTree, platforms, platformTree, player, graph) = case #variant enemy of @@ -527,4 +530,7 @@ struct updateFollowState (player, enemy, walls, wallTree, platforms, platformTree, graph) | STRAIGHT_BAT => updateStraightBat (player, enemy, walls, wallTree) + | SHIELD_SLIME => + updateShieldSlime + (player, enemy, walls, wallTree, platforms, platformTree) end diff --git a/fcore/enemy/enemy-patch.sml b/fcore/enemy/enemy-patch.sml index 6450281..85066b2 100644 --- a/fcore/enemy/enemy-patch.sml +++ b/fcore/enemy/enemy-patch.sml @@ -13,6 +13,7 @@ sig | W_BAT_MIN_Y of int | W_BAT_DIR_Y of EnemyType.bat_dir_y | W_FACING of EntityType.facing + | W_SHIELD_ON of bool val withPatch: EnemyType.enemy * enemy_patch -> EnemyType.enemy @@ -34,6 +35,7 @@ struct | W_BAT_MIN_Y of int | W_BAT_DIR_Y of EnemyType.bat_dir_y | W_FACING of EntityType.facing + | W_SHIELD_ON of bool fun mkEnemy ( id @@ -50,6 +52,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) = { id = id , health = health @@ -65,6 +68,7 @@ struct , batMaxY = batMaxY , batMinY = batMinY , facing = facing + , shieldOn = shieldOn } fun withPatch (enemy, patch) = @@ -84,6 +88,7 @@ struct , batMaxY , batMinY , facing + , shieldOn } = enemy in case patch of @@ -103,6 +108,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_X x => mkEnemy @@ -120,6 +126,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_X_AXIS xAxis => mkEnemy @@ -137,6 +144,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_Y y => mkEnemy @@ -154,6 +162,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_Y_AXIS yAxis => mkEnemy @@ -171,6 +180,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_PLAT_ID platID => mkEnemy @@ -188,6 +198,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_NEXT_PLAT_ID nextPlatID => mkEnemy @@ -205,6 +216,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_BAT_REST batRest => mkEnemy @@ -222,6 +234,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_BAT_MAX_Y batMaxY => mkEnemy @@ -239,6 +252,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_BAT_MIN_Y batMinY => mkEnemy @@ -256,6 +270,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_BAT_DIR_Y batDirY => mkEnemy @@ -273,6 +288,7 @@ struct , batMaxY , batMinY , facing + , shieldOn ) | W_FACING facing => mkEnemy @@ -290,6 +306,25 @@ struct , batMaxY , batMinY , facing + , shieldOn + ) + | W_SHIELD_ON shieldOn => + mkEnemy + ( id + , health + , x + , y + , xAxis + , yAxis + , variant + , platID + , nextPlatID + , batRest + , batDirY + , batMaxY + , batMinY + , facing + , shieldOn ) end diff --git a/fcore/enemy/enemy-type.sml b/fcore/enemy/enemy-type.sml index e28cc8e..1964eaa 100644 --- a/fcore/enemy/enemy-type.sml +++ b/fcore/enemy/enemy-type.sml @@ -1,6 +1,6 @@ signature ENEMY_TYPE = sig - datatype variant = PATROL_SLIME | FOLLOW_SLIME | STRAIGHT_BAT + datatype variant = PATROL_SLIME | FOLLOW_SLIME | STRAIGHT_BAT | SHIELD_SLIME datatype bat_dir_y = UP | DOWN @@ -19,6 +19,7 @@ sig , batMaxY: int , batMinY: int , facing: EntityType.facing + , shieldOn: bool } type falling_enemy = {x: int, y: int, variant: variant} @@ -29,7 +30,7 @@ end structure EnemyType: ENEMY_TYPE = struct - datatype variant = PATROL_SLIME | FOLLOW_SLIME | STRAIGHT_BAT + datatype variant = PATROL_SLIME | FOLLOW_SLIME | STRAIGHT_BAT | SHIELD_SLIME datatype bat_dir_y = UP | DOWN @@ -48,6 +49,7 @@ struct , batMaxY: int , batMinY: int , facing: EntityType.facing + , shieldOn: bool } type falling_enemy = {x: int, y: int, variant: variant} diff --git a/fcore/enemy/enemy.sml b/fcore/enemy/enemy.sml index 3976b4b..7e9d48b 100644 --- a/fcore/enemy/enemy.sml +++ b/fcore/enemy/enemy.sml @@ -86,6 +86,7 @@ struct PATROL_SLIME => (0.5, 0.5, 1.0) | FOLLOW_SLIME => (1.0, 0.5, 0.5) | STRAIGHT_BAT => (0.55, 0.55, 0.55) + | SHIELD_SLIME => (0.33, 0.33, 0.11) in if wratio < hratio then let diff --git a/fcore/game-type.sml b/fcore/game-type.sml index 3a243cb..41409e5 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -110,6 +110,7 @@ struct , batMaxY = 485 , batMinY = 625 , facing = EntityType.FACING_RIGHT + , shieldOn = false } val enemy2 = { id = 2 @@ -118,7 +119,7 @@ struct , health = 1 , xAxis = EntityType.MOVE_RIGHT , yAxis = EntityType.FALLING - , variant = EnemyType.PATROL_SLIME + , variant = EnemyType.SHIELD_SLIME , batDirY = EnemyType.UP , platID = ~1 , nextPlatID = ~1 @@ -126,6 +127,7 @@ struct , batMaxY = 485 , batMinY = 625 , facing = EntityType.FACING_RIGHT + , shieldOn = false } val enemies = enemyMapFromList ([enemy1, enemy2], EnemyMap.empty) val graph = Graph.fromPlatforms (platforms, platformTree) diff --git a/fcore/player/player-attack.sml b/fcore/player/player-attack.sml index 73b0008..c2fa048 100644 --- a/fcore/player/player-attack.sml +++ b/fcore/player/player-attack.sml @@ -17,11 +17,17 @@ struct (defeatedList, enemyMap) end + fun shieldSlimeAttacked (enemyID, enemy, enemyMap, defeatedList) = + if #shieldOn enemy then (defeatedList, enemyMap) + else defeatEnemy (enemyID, enemyMap, defeatedList) + fun onPlayerAttack (enemyID, enemy, enemyMap, defeatedList) = case #variant enemy of PATROL_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList) | FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList) | STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, defeatedList) + | SHIELD_SLIME => + shieldSlimeAttacked (enemyID, enemy, enemyMap, defeatedList) fun fold (enemyID, (), (defeatedList, enemyMap)) = case EnemyMap.get (enemyID, enemyMap) of @@ -105,11 +111,17 @@ struct (fallingMap, enemyMap) end + fun onShieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap) = + if #shieldOn enemy then (fallingMap, enemyMap) + else onDefeated (enemyID, enemy, enemyMap, fallingMap) + fun onProjectileAttack (enemyID, enemy, enemyMap, fallingMap) = case #variant enemy of PATROL_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap) | FOLLOW_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap) | STRAIGHT_BAT => onDefeated (enemyID, enemy, enemyMap, fallingMap) + | SHIELD_SLIME => + onShieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap) fun fold (enemyID, (), (fallingMap, enemyMap)) = case EnemyMap.get (enemyID, enemyMap) of