diff --git a/fcore/enemy/enemy-behaviour.sml b/fcore/enemy/enemy-behaviour.sml index e348277..4f32a0b 100644 --- a/fcore/enemy/enemy-behaviour.sml +++ b/fcore/enemy/enemy-behaviour.sml @@ -394,18 +394,29 @@ struct , platformTree , projectileTree , enemyList + , fallingList ) = let val {x, y, ...} = enemy val size = Constants.enemySize - - val isAttacked = - QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) - orelse isCollidingWithPlayerAttack (player, enemy) in - if isAttacked then - (* no matter what projectiles hits it, PATROL_SLIME should be filtered out *) - enemyList + if QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then + (* if projectile hits, filter out from this list, and add to list of + * fallingEnemies *) + let + val fallingList = + { falling = false + , x = x + , y = y + , variant = #variant enemy + , jumped = 0 + } :: fallingList + in + (enemyList, fallingList) + end + else if isCollidingWithPlayerAttack (player, enemy) then + (* filter out when any projectile hits *) + (enemyList, fallingList) else (* since we're not filtering out, update the enemy's state and cons enemy *) let @@ -421,7 +432,7 @@ struct (enemy, walls, wallTree, platforms, platformTree) val enemy = EnemyPatch.withPatches (enemy, patches) in - enemy :: enemyList + (enemy :: enemyList, fallingList) end end @@ -435,18 +446,29 @@ struct , projectileTree , graph , enemyList + , fallingList ) = let val {x, y, ...} = enemy val size = Constants.enemySize - - val isAttacked = - QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) - orelse isCollidingWithPlayerAttack (player, enemy) in - if isAttacked then + if QuadTree.hasCollisionAt (x, y, size, size, ~1, projectileTree) then + (* if projectile hits, filter out from this list, and add to list of + * fallingEnemies *) + let + val fallingList = + { falling = false + , x = x + , y = y + , variant = #variant enemy + , jumped = 0 + } :: fallingList + in + (enemyList, fallingList) + end + else if isCollidingWithPlayerAttack (player, enemy) then (* filter out when any projectile hits *) - enemyList + (enemyList, fallingList) else (* since we're not filtering out, update the enemy's state and cons enemy *) let @@ -463,7 +485,7 @@ struct (enemy, walls, wallTree, platforms, platformTree) val enemy = EnemyPatch.withPatches (enemy, patches) in - enemy :: enemyList + (enemy :: enemyList, fallingList) end end @@ -478,6 +500,7 @@ struct , player , graph , enemyList + , fallingList ) = let open EnemyVariants @@ -493,6 +516,7 @@ struct , platformTree , projectileTree , enemyList + , fallingList ) | FOLLOW_SIME => updateFollowState @@ -505,6 +529,7 @@ struct , projectileTree , graph , enemyList + , fallingList ) end end diff --git a/fcore/enemy/enemy.sml b/fcore/enemy/enemy.sml index 6ef7a35..4519fdc 100644 --- a/fcore/enemy/enemy.sml +++ b/fcore/enemy/enemy.sml @@ -17,9 +17,10 @@ struct , player , graph , enemyList + , fallingList ) = if pos < 0 then - Vector.fromList enemyList + (Vector.fromList enemyList, fallingList) else let val enemy = Vector.sub (enemies, pos) @@ -28,7 +29,7 @@ struct * 1. updating enemy and :: cons :: ing to enemyList, or * 2. filtering enemy if projectile hit which enemy should not survive * *) - val enemyList = EnemyBehaviour.updateEnemyState + val (enemyList, fallingList) = EnemyBehaviour.updateEnemyState ( enemy , projectiles , projectileTree @@ -39,6 +40,7 @@ struct , player , graph , enemyList + , fallingList ) in updateEnemyList @@ -53,6 +55,7 @@ struct , player , graph , enemyList + , fallingList ) end diff --git a/fcore/game-type.sml b/fcore/game-type.sml index 8badfd5..6d961fc 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -58,6 +58,9 @@ sig , nextPlatID: int } + type falling_enemy = + {falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int} + type game_type = { player: player , walls: wall vector @@ -66,6 +69,7 @@ sig , platformTree: QuadTree.t , enemies: enemy vector , graph: PlatSet.elem vector vector + , fallingEnemies: falling_enemy vector } val initial: game_type @@ -132,6 +136,9 @@ struct , nextPlatID: int } + type falling_enemy = + {falling: bool, x: int, y: int, variant: EnemyVariants.t, jumped: int} + type game_type = { player: player , walls: wall vector @@ -140,6 +147,7 @@ struct , platformTree: QuadTree.t , enemies: enemy vector , graph: PlatSet.elem vector vector + , fallingEnemies: falling_enemy vector } val initial: game_type = @@ -269,6 +277,7 @@ struct , platformTree = platformTree , enemies = enemies , graph = graph + , fallingEnemies = Vector.fromList [] } end end diff --git a/fcore/game-update.sml b/fcore/game-update.sml index fcabc8e..45e32fe 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -2,8 +2,16 @@ structure GameUpdate = struct fun update (game, input) = let - val {player, walls, wallTree, platforms, platformTree, enemies, graph} = - game + val + { player + , walls + , wallTree + , platforms + , platformTree + , enemies + , graph + , fallingEnemies + } = game val enemyTree = Enemy.generateTree enemies val player = Player.runPhysicsAndInput (game, input, enemyTree) @@ -11,7 +19,7 @@ struct val projectiles = #projectiles player val projectileTree = Projectile.generateTree projectiles - val enemies = Enemy.updateEnemyList + val (enemies, newFallingEnemies) = Enemy.updateEnemyList ( Vector.length enemies - 1 , enemies , projectiles @@ -23,7 +31,10 @@ struct , player , graph , [] + , [] ) + + val fallingEnemies = Vector.fromList newFallingEnemies in { player = player , walls = walls @@ -32,6 +43,7 @@ struct , platformTree = platformTree , enemies = enemies , graph = graph + , fallingEnemies = fallingEnemies } end end