begin adding shield slime enemy variant

This commit is contained in:
2025-02-15 12:34:10 +00:00
parent 190f11d7ef
commit 66c60a490d
6 changed files with 61 additions and 3 deletions

View File

@@ -517,6 +517,9 @@ struct
EnemyPatch.withPatches (enemy, patches) EnemyPatch.withPatches (enemy, patches)
end end
fun updateShieldSlime
(player, enemy, walls, wallTree, platforms, platformTree) = enemy
fun updateEnemyState fun updateEnemyState
(enemy, walls, wallTree, platforms, platformTree, player, graph) = (enemy, walls, wallTree, platforms, platformTree, player, graph) =
case #variant enemy of case #variant enemy of
@@ -527,4 +530,7 @@ struct
updateFollowState updateFollowState
(player, enemy, walls, wallTree, platforms, platformTree, graph) (player, enemy, walls, wallTree, platforms, platformTree, graph)
| STRAIGHT_BAT => updateStraightBat (player, enemy, walls, wallTree) | STRAIGHT_BAT => updateStraightBat (player, enemy, walls, wallTree)
| SHIELD_SLIME =>
updateShieldSlime
(player, enemy, walls, wallTree, platforms, platformTree)
end end

View File

@@ -13,6 +13,7 @@ sig
| W_BAT_MIN_Y of int | W_BAT_MIN_Y of int
| W_BAT_DIR_Y of EnemyType.bat_dir_y | W_BAT_DIR_Y of EnemyType.bat_dir_y
| W_FACING of EntityType.facing | W_FACING of EntityType.facing
| W_SHIELD_ON of bool
val withPatch: EnemyType.enemy * enemy_patch -> EnemyType.enemy val withPatch: EnemyType.enemy * enemy_patch -> EnemyType.enemy
@@ -34,6 +35,7 @@ struct
| W_BAT_MIN_Y of int | W_BAT_MIN_Y of int
| W_BAT_DIR_Y of EnemyType.bat_dir_y | W_BAT_DIR_Y of EnemyType.bat_dir_y
| W_FACING of EntityType.facing | W_FACING of EntityType.facing
| W_SHIELD_ON of bool
fun mkEnemy fun mkEnemy
( id ( id
@@ -50,6 +52,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) = ) =
{ id = id { id = id
, health = health , health = health
@@ -65,6 +68,7 @@ struct
, batMaxY = batMaxY , batMaxY = batMaxY
, batMinY = batMinY , batMinY = batMinY
, facing = facing , facing = facing
, shieldOn = shieldOn
} }
fun withPatch (enemy, patch) = fun withPatch (enemy, patch) =
@@ -84,6 +88,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
} = enemy } = enemy
in in
case patch of case patch of
@@ -103,6 +108,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_X x => | W_X x =>
mkEnemy mkEnemy
@@ -120,6 +126,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_X_AXIS xAxis => | W_X_AXIS xAxis =>
mkEnemy mkEnemy
@@ -137,6 +144,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_Y y => | W_Y y =>
mkEnemy mkEnemy
@@ -154,6 +162,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_Y_AXIS yAxis => | W_Y_AXIS yAxis =>
mkEnemy mkEnemy
@@ -171,6 +180,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_PLAT_ID platID => | W_PLAT_ID platID =>
mkEnemy mkEnemy
@@ -188,6 +198,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_NEXT_PLAT_ID nextPlatID => | W_NEXT_PLAT_ID nextPlatID =>
mkEnemy mkEnemy
@@ -205,6 +216,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_BAT_REST batRest => | W_BAT_REST batRest =>
mkEnemy mkEnemy
@@ -222,6 +234,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_BAT_MAX_Y batMaxY => | W_BAT_MAX_Y batMaxY =>
mkEnemy mkEnemy
@@ -239,6 +252,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_BAT_MIN_Y batMinY => | W_BAT_MIN_Y batMinY =>
mkEnemy mkEnemy
@@ -256,6 +270,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_BAT_DIR_Y batDirY => | W_BAT_DIR_Y batDirY =>
mkEnemy mkEnemy
@@ -273,6 +288,7 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
) )
| W_FACING facing => | W_FACING facing =>
mkEnemy mkEnemy
@@ -290,6 +306,25 @@ struct
, batMaxY , batMaxY
, batMinY , batMinY
, facing , facing
, shieldOn
)
| W_SHIELD_ON shieldOn =>
mkEnemy
( id
, health
, x
, y
, xAxis
, yAxis
, variant
, platID
, nextPlatID
, batRest
, batDirY
, batMaxY
, batMinY
, facing
, shieldOn
) )
end end

View File

@@ -1,6 +1,6 @@
signature ENEMY_TYPE = signature ENEMY_TYPE =
sig 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 datatype bat_dir_y = UP | DOWN
@@ -19,6 +19,7 @@ sig
, batMaxY: int , batMaxY: int
, batMinY: int , batMinY: int
, facing: EntityType.facing , facing: EntityType.facing
, shieldOn: bool
} }
type falling_enemy = {x: int, y: int, variant: variant} type falling_enemy = {x: int, y: int, variant: variant}
@@ -29,7 +30,7 @@ end
structure EnemyType: ENEMY_TYPE = structure EnemyType: ENEMY_TYPE =
struct 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 datatype bat_dir_y = UP | DOWN
@@ -48,6 +49,7 @@ struct
, batMaxY: int , batMaxY: int
, batMinY: int , batMinY: int
, facing: EntityType.facing , facing: EntityType.facing
, shieldOn: bool
} }
type falling_enemy = {x: int, y: int, variant: variant} type falling_enemy = {x: int, y: int, variant: variant}

View File

@@ -86,6 +86,7 @@ struct
PATROL_SLIME => (0.5, 0.5, 1.0) PATROL_SLIME => (0.5, 0.5, 1.0)
| FOLLOW_SLIME => (1.0, 0.5, 0.5) | FOLLOW_SLIME => (1.0, 0.5, 0.5)
| STRAIGHT_BAT => (0.55, 0.55, 0.55) | STRAIGHT_BAT => (0.55, 0.55, 0.55)
| SHIELD_SLIME => (0.33, 0.33, 0.11)
in in
if wratio < hratio then if wratio < hratio then
let let

View File

@@ -110,6 +110,7 @@ struct
, batMaxY = 485 , batMaxY = 485
, batMinY = 625 , batMinY = 625
, facing = EntityType.FACING_RIGHT , facing = EntityType.FACING_RIGHT
, shieldOn = false
} }
val enemy2 = val enemy2 =
{ id = 2 { id = 2
@@ -118,7 +119,7 @@ struct
, health = 1 , health = 1
, xAxis = EntityType.MOVE_RIGHT , xAxis = EntityType.MOVE_RIGHT
, yAxis = EntityType.FALLING , yAxis = EntityType.FALLING
, variant = EnemyType.PATROL_SLIME , variant = EnemyType.SHIELD_SLIME
, batDirY = EnemyType.UP , batDirY = EnemyType.UP
, platID = ~1 , platID = ~1
, nextPlatID = ~1 , nextPlatID = ~1
@@ -126,6 +127,7 @@ struct
, batMaxY = 485 , batMaxY = 485
, batMinY = 625 , batMinY = 625
, facing = EntityType.FACING_RIGHT , facing = EntityType.FACING_RIGHT
, shieldOn = false
} }
val enemies = enemyMapFromList ([enemy1, enemy2], EnemyMap.empty) val enemies = enemyMapFromList ([enemy1, enemy2], EnemyMap.empty)
val graph = Graph.fromPlatforms (platforms, platformTree) val graph = Graph.fromPlatforms (platforms, platformTree)

View File

@@ -17,11 +17,17 @@ struct
(defeatedList, enemyMap) (defeatedList, enemyMap)
end end
fun shieldSlimeAttacked (enemyID, enemy, enemyMap, defeatedList) =
if #shieldOn enemy then (defeatedList, enemyMap)
else defeatEnemy (enemyID, enemyMap, defeatedList)
fun onPlayerAttack (enemyID, enemy, enemyMap, defeatedList) = fun onPlayerAttack (enemyID, enemy, enemyMap, defeatedList) =
case #variant enemy of case #variant enemy of
PATROL_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList) PATROL_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList)
| FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList) | FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, defeatedList)
| STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, defeatedList) | STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, defeatedList)
| SHIELD_SLIME =>
shieldSlimeAttacked (enemyID, enemy, enemyMap, defeatedList)
fun fold (enemyID, (), (defeatedList, enemyMap)) = fun fold (enemyID, (), (defeatedList, enemyMap)) =
case EnemyMap.get (enemyID, enemyMap) of case EnemyMap.get (enemyID, enemyMap) of
@@ -105,11 +111,17 @@ struct
(fallingMap, enemyMap) (fallingMap, enemyMap)
end 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) = fun onProjectileAttack (enemyID, enemy, enemyMap, fallingMap) =
case #variant enemy of case #variant enemy of
PATROL_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap) PATROL_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap)
| FOLLOW_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap) | FOLLOW_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap)
| STRAIGHT_BAT => onDefeated (enemyID, enemy, enemyMap, fallingMap) | STRAIGHT_BAT => onDefeated (enemyID, enemy, enemyMap, fallingMap)
| SHIELD_SLIME =>
onShieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap)
fun fold (enemyID, (), (fallingMap, enemyMap)) = fun fold (enemyID, (), (fallingMap, enemyMap)) =
case EnemyMap.get (enemyID, enemyMap) of case EnemyMap.get (enemyID, enemyMap) of