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