use timing information introduced in MAIN_ATTACKING case so that a second attack is required to add a falling enemy to the player's list
This commit is contained in:
@@ -22,7 +22,7 @@ sig
|
|||||||
, shieldOn: bool
|
, shieldOn: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type falling_enemy = {x: int, y: int, variant: variant}
|
type falling_enemy = {x: int, y: int, variant: variant, time: Time.time}
|
||||||
|
|
||||||
datatype shoot_x_axis = SHOOT_LEFT | SHOOT_RIGHT | NO_SHOOT_X
|
datatype shoot_x_axis = SHOOT_LEFT | SHOOT_RIGHT | NO_SHOOT_X
|
||||||
datatype shoot_y_axis = SHOOT_UP | SHOOT_DOWN | NO_SHOOT_Y
|
datatype shoot_y_axis = SHOOT_UP | SHOOT_DOWN | NO_SHOOT_Y
|
||||||
@@ -52,7 +52,7 @@ struct
|
|||||||
, shieldOn: bool
|
, shieldOn: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type falling_enemy = {x: int, y: int, variant: variant}
|
type falling_enemy = {x: int, y: int, variant: variant, time: Time.time}
|
||||||
|
|
||||||
datatype shoot_x_axis = SHOOT_LEFT | SHOOT_RIGHT | NO_SHOOT_X
|
datatype shoot_x_axis = SHOOT_LEFT | SHOOT_RIGHT | NO_SHOOT_X
|
||||||
datatype shoot_y_axis = SHOOT_UP | SHOOT_DOWN | NO_SHOOT_Y
|
datatype shoot_y_axis = SHOOT_UP | SHOOT_DOWN | NO_SHOOT_Y
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ struct
|
|||||||
|
|
||||||
fun fold (fallingID, fallingEnemy, (), fallingMap) =
|
fun fold (fallingID, fallingEnemy, (), fallingMap) =
|
||||||
let
|
let
|
||||||
val {x, y, variant} = fallingEnemy
|
val {x, y, variant, time} = fallingEnemy
|
||||||
val size = Constants.enemySize
|
val size = Constants.enemySize
|
||||||
val ww = Constants.worldWidth
|
val ww = Constants.worldWidth
|
||||||
val wh = Constants.worldHeight
|
val wh = Constants.worldHeight
|
||||||
@@ -49,7 +49,11 @@ struct
|
|||||||
if Collision.isCollidingPlus (x, y, size, size, 0, 0, ww, wh) then
|
if Collision.isCollidingPlus (x, y, size, size, 0, 0, ww, wh) then
|
||||||
let
|
let
|
||||||
val newFalling =
|
val newFalling =
|
||||||
{x = x, y = y - Constants.moveEnemyBy, variant = variant}
|
{ x = x
|
||||||
|
, y = y - Constants.moveEnemyBy
|
||||||
|
, variant = variant
|
||||||
|
, time = time
|
||||||
|
}
|
||||||
in
|
in
|
||||||
FallingEnemyMap.add (fallingID, newFalling, fallingMap)
|
FallingEnemyMap.add (fallingID, newFalling, fallingMap)
|
||||||
end
|
end
|
||||||
@@ -81,7 +85,7 @@ struct
|
|||||||
fun helpGetDrawVec
|
fun helpGetDrawVec
|
||||||
(fallingEnemy, width, height, ratio, xOffset, yOffset, acc) =
|
(fallingEnemy, width, height, ratio, xOffset, yOffset, acc) =
|
||||||
let
|
let
|
||||||
val {x, y, variant = _} = fallingEnemy
|
val {x, y, variant = _, time = _} = fallingEnemy
|
||||||
|
|
||||||
val x = Real32.fromInt x * ratio + xOffset
|
val x = Real32.fromInt x * ratio + xOffset
|
||||||
val y = Real32.fromInt y * ratio + yOffset
|
val y = Real32.fromInt y * ratio + yOffset
|
||||||
|
|||||||
@@ -25,9 +25,8 @@ struct
|
|||||||
(player, enemies, enemyTree, fallingEnemies)
|
(player, enemies, enemyTree, fallingEnemies)
|
||||||
|
|
||||||
val projectiles = #projectiles player
|
val projectiles = #projectiles player
|
||||||
val (fallingEnemies, enemies) =
|
val (fallingEnemies, enemies) = PlayerAttack.projectileHitEnemy
|
||||||
PlayerAttack.projectileHitEnemy
|
(projectiles, enemies, enemyTree, fallingEnemies, time)
|
||||||
(projectiles, enemies, enemyTree, fallingEnemies)
|
|
||||||
|
|
||||||
val enemies = Enemy.update
|
val enemies = Enemy.update
|
||||||
(enemies, walls, wallTree, platforms, platformTree, player, graph)
|
(enemies, walls, wallTree, platforms, platformTree, player, graph)
|
||||||
|
|||||||
@@ -4,60 +4,78 @@ struct
|
|||||||
structure PlayerAttackEnemy =
|
structure PlayerAttackEnemy =
|
||||||
MakeQuadTreeFold
|
MakeQuadTreeFold
|
||||||
(struct
|
(struct
|
||||||
type env = unit
|
type env = Time.time
|
||||||
type state = FallingEnemyMap.t * EnemyMap.t
|
type state = FallingEnemyMap.t * EnemyMap.t
|
||||||
|
|
||||||
open EnemyType
|
open EnemyType
|
||||||
|
|
||||||
fun defeatEnemy (enemyID, enemyMap, fallingMap) =
|
fun defeatEnemy (enemyID, enemyMap, fallingMap, time) =
|
||||||
case EnemyMap.get (enemyID, enemyMap) of
|
case EnemyMap.get (enemyID, enemyMap) of
|
||||||
SOME (enemy: EnemyType.enemy) =>
|
SOME (enemy: EnemyType.enemy) =>
|
||||||
let
|
let
|
||||||
val {x, y, variant, ...} = enemy
|
val {x, y, variant, ...} = enemy
|
||||||
val fallenEnemy = {x = x, y = y, variant = variant}
|
val fallenEnemy =
|
||||||
val fallingMap = FallingEnemyMap.add (enemyID, fallenEnemy, fallingMap)
|
{x = x, y = y, variant = variant, time = time}
|
||||||
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
|
val fallingMap =
|
||||||
in
|
FallingEnemyMap.add (enemyID, fallenEnemy, fallingMap)
|
||||||
(fallingMap, enemyMap)
|
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
|
||||||
end
|
in
|
||||||
| NONE => (fallingMap, enemyMap)
|
(fallingMap, enemyMap)
|
||||||
|
end
|
||||||
|
| NONE => (fallingMap, enemyMap)
|
||||||
|
|
||||||
fun shieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap) =
|
fun shieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap, time) =
|
||||||
if #shieldOn enemy then (fallingMap, enemyMap)
|
if #shieldOn enemy then (fallingMap, enemyMap)
|
||||||
else defeatEnemy (enemyID, enemyMap, fallingMap)
|
else defeatEnemy (enemyID, enemyMap, fallingMap, time)
|
||||||
|
|
||||||
fun onPlayerAttack (enemyID, enemy, enemyMap, fallingMap) =
|
fun onPlayerAttack (enemyID, enemy, enemyMap, fallingMap, time) =
|
||||||
case #variant enemy of
|
case #variant enemy of
|
||||||
PATROL_SLIME => defeatEnemy (enemyID, enemyMap, fallingMap)
|
PATROL_SLIME => defeatEnemy (enemyID, enemyMap, fallingMap, time)
|
||||||
| FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, fallingMap)
|
| FOLLOW_SLIME => defeatEnemy (enemyID, enemyMap, fallingMap, time)
|
||||||
| STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, fallingMap)
|
| STRAIGHT_BAT => defeatEnemy (enemyID, enemyMap, fallingMap, time)
|
||||||
| SHIELD_SLIME =>
|
| SHIELD_SLIME =>
|
||||||
shieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap)
|
shieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap, time)
|
||||||
|
|
||||||
fun fold (enemyID, (), (fallingMap, enemyMap)) =
|
fun fold (enemyID, time, (fallingMap, enemyMap)) =
|
||||||
case EnemyMap.get (enemyID, enemyMap) of
|
case EnemyMap.get (enemyID, enemyMap) of
|
||||||
SOME enemy =>
|
SOME enemy =>
|
||||||
onPlayerAttack (enemyID, enemy, enemyMap, fallingMap)
|
onPlayerAttack (enemyID, enemy, enemyMap, fallingMap, time)
|
||||||
| NONE => (fallingMap, enemyMap)
|
| NONE => (fallingMap, enemyMap)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
structure PlayerAttackFalling =
|
structure PlayerAttackFalling =
|
||||||
MakeQuadTreeFold
|
MakeQuadTreeFold
|
||||||
(struct
|
(struct
|
||||||
type env = unit
|
type env = Time.time
|
||||||
type state = PlayerType.defeated_enemies list * FallingEnemyMap.t
|
type state = PlayerType.defeated_enemies list * FallingEnemyMap.t
|
||||||
|
|
||||||
fun fold (fallingID, (), (defeatedList, fallingMap)) =
|
open Time
|
||||||
let
|
|
||||||
val defeatedList = {angle = 1} :: defeatedList
|
fun fold (fallingID, mainAttackTime, (defeatedList, fallingMap)) =
|
||||||
val fallingMap = FallingEnemyMap.remove (fallingID, fallingMap)
|
case FallingEnemyMap.get (fallingID, fallingMap) of
|
||||||
in
|
SOME {time = fallingStartTime, ...} =>
|
||||||
(defeatedList, fallingMap)
|
if mainAttackTime > fallingStartTime then
|
||||||
end
|
let
|
||||||
|
val defeatedList = {angle = 1} :: defeatedList
|
||||||
|
val fallingMap =
|
||||||
|
FallingEnemyMap.remove (fallingID, fallingMap)
|
||||||
|
in
|
||||||
|
(defeatedList, fallingMap)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
(defeatedList, fallingMap)
|
||||||
|
| NONE => (defeatedList, fallingMap)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
fun helpAttackEnemies
|
fun helpAttackEnemies
|
||||||
(projectileX, projectileY, enemyMap, enemyTree, fallingMap, player) =
|
( projectileX
|
||||||
|
, projectileY
|
||||||
|
, enemyMap
|
||||||
|
, enemyTree
|
||||||
|
, fallingMap
|
||||||
|
, player
|
||||||
|
, mainAttackTime
|
||||||
|
) =
|
||||||
let
|
let
|
||||||
val width = Constants.projectileWidth
|
val width = Constants.projectileWidth
|
||||||
val height = Constants.projectileHeight
|
val height = Constants.projectileHeight
|
||||||
@@ -68,13 +86,20 @@ struct
|
|||||||
, projectileY
|
, projectileY
|
||||||
, width
|
, width
|
||||||
, height
|
, height
|
||||||
, ()
|
, mainAttackTime
|
||||||
, ([], fallingMap)
|
, ([], fallingMap)
|
||||||
, fallingTree
|
, fallingTree
|
||||||
)
|
)
|
||||||
|
|
||||||
val (fallingMap, enemyMap) = PlayerAttackEnemy.foldRegion
|
val (fallingMap, enemyMap) = PlayerAttackEnemy.foldRegion
|
||||||
(projectileX, projectileY, width, height, (), (fallingMap, enemyMap), enemyTree)
|
( projectileX
|
||||||
|
, projectileY
|
||||||
|
, width
|
||||||
|
, height
|
||||||
|
, mainAttackTime
|
||||||
|
, (fallingMap, enemyMap)
|
||||||
|
, enemyTree
|
||||||
|
)
|
||||||
|
|
||||||
val defeatedList = Vector.fromList defeatedList
|
val defeatedList = Vector.fromList defeatedList
|
||||||
val defeatedList = Vector.concat [defeatedList, #enemies player]
|
val defeatedList = Vector.concat [defeatedList, #enemies player]
|
||||||
@@ -91,7 +116,7 @@ struct
|
|||||||
val {x, y, facing, mainAttack, ...} = player
|
val {x, y, facing, mainAttack, ...} = player
|
||||||
in
|
in
|
||||||
case mainAttack of
|
case mainAttack of
|
||||||
MAIN_ATTACKING _ =>
|
MAIN_ATTACKING {timePressed, ...} =>
|
||||||
(case facing of
|
(case facing of
|
||||||
FACING_RIGHT =>
|
FACING_RIGHT =>
|
||||||
let
|
let
|
||||||
@@ -105,6 +130,7 @@ struct
|
|||||||
, enemyTree
|
, enemyTree
|
||||||
, fallingMap
|
, fallingMap
|
||||||
, player
|
, player
|
||||||
|
, timePressed
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
| FACING_LEFT =>
|
| FACING_LEFT =>
|
||||||
@@ -119,6 +145,7 @@ struct
|
|||||||
, enemyTree
|
, enemyTree
|
||||||
, fallingMap
|
, fallingMap
|
||||||
, player
|
, player
|
||||||
|
, timePressed
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
| _ => (player, enemyMap, fallingMap)
|
| _ => (player, enemyMap, fallingMap)
|
||||||
@@ -128,15 +155,16 @@ struct
|
|||||||
structure ProjectileHitEnemy =
|
structure ProjectileHitEnemy =
|
||||||
MakeQuadTreeFold
|
MakeQuadTreeFold
|
||||||
(struct
|
(struct
|
||||||
type env = unit
|
type env = Time.time
|
||||||
type state = FallingEnemyMap.t * EnemyMap.t
|
type state = FallingEnemyMap.t * EnemyMap.t
|
||||||
|
|
||||||
open EnemyType
|
open EnemyType
|
||||||
|
|
||||||
fun onDefeated (enemyID, enemy, enemyMap, fallingMap) =
|
fun onDefeated (enemyID, enemy, enemyMap, fallingMap, currentTime) =
|
||||||
let
|
let
|
||||||
val {x, y, variant, ...} = enemy
|
val {x, y, variant, ...} = enemy
|
||||||
val fallingItem = {x = x, y = y, variant = variant}
|
val fallingItem =
|
||||||
|
{x = x, y = y, variant = variant, time = currentTime}
|
||||||
val fallingMap =
|
val fallingMap =
|
||||||
FallingEnemyMap.add (enemyID, fallingItem, fallingMap)
|
FallingEnemyMap.add (enemyID, fallingItem, fallingMap)
|
||||||
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
|
val enemyMap = EnemyMap.remove (enemyID, enemyMap)
|
||||||
@@ -144,26 +172,34 @@ struct
|
|||||||
(fallingMap, enemyMap)
|
(fallingMap, enemyMap)
|
||||||
end
|
end
|
||||||
|
|
||||||
fun onShieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap) =
|
fun onShieldSlimeAttacked
|
||||||
|
(enemyID, enemy, enemyMap, fallingMap, currentTime) =
|
||||||
if #shieldOn enemy then (fallingMap, enemyMap)
|
if #shieldOn enemy then (fallingMap, enemyMap)
|
||||||
else onDefeated (enemyID, enemy, enemyMap, fallingMap)
|
else onDefeated (enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
|
|
||||||
fun onProjectileAttack (enemyID, enemy, enemyMap, fallingMap) =
|
fun onProjectileAttack
|
||||||
|
(enemyID, enemy, enemyMap, fallingMap, currentTime) =
|
||||||
case #variant enemy of
|
case #variant enemy of
|
||||||
PATROL_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap)
|
PATROL_SLIME =>
|
||||||
| FOLLOW_SLIME => onDefeated (enemyID, enemy, enemyMap, fallingMap)
|
onDefeated (enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
| STRAIGHT_BAT => onDefeated (enemyID, enemy, enemyMap, fallingMap)
|
| FOLLOW_SLIME =>
|
||||||
|
onDefeated (enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
|
| STRAIGHT_BAT =>
|
||||||
|
onDefeated (enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
| SHIELD_SLIME =>
|
| SHIELD_SLIME =>
|
||||||
onShieldSlimeAttacked (enemyID, enemy, enemyMap, fallingMap)
|
onShieldSlimeAttacked
|
||||||
|
(enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
|
|
||||||
fun fold (enemyID, (), (fallingMap, enemyMap)) =
|
fun fold (enemyID, currentTime, (fallingMap, enemyMap)) =
|
||||||
case EnemyMap.get (enemyID, enemyMap) of
|
case EnemyMap.get (enemyID, enemyMap) of
|
||||||
SOME enemy =>
|
SOME enemy =>
|
||||||
onProjectileAttack (enemyID, enemy, enemyMap, fallingMap)
|
onProjectileAttack
|
||||||
|
(enemyID, enemy, enemyMap, fallingMap, currentTime)
|
||||||
| NONE => (fallingMap, enemyMap)
|
| NONE => (fallingMap, enemyMap)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
fun helpProjectileHitEnemy (pos, projectiles, enemyTree, enemyMap, fallingMap) =
|
fun helpProjectileHitEnemy
|
||||||
|
(pos, projectiles, enemyTree, enemyMap, fallingMap, currentTime) =
|
||||||
if pos = Vector.length projectiles then
|
if pos = Vector.length projectiles then
|
||||||
(fallingMap, enemyMap)
|
(fallingMap, enemyMap)
|
||||||
else
|
else
|
||||||
@@ -172,12 +208,14 @@ struct
|
|||||||
Vector.sub (projectiles, pos)
|
Vector.sub (projectiles, pos)
|
||||||
val size = Constants.projectileSizeInt
|
val size = Constants.projectileSizeInt
|
||||||
val (fallingMap, enemyMap) = ProjectileHitEnemy.foldRegion
|
val (fallingMap, enemyMap) = ProjectileHitEnemy.foldRegion
|
||||||
(x, y, size, size, (), (fallingMap, enemyMap), enemyTree)
|
(x, y, size, size, currentTime, (fallingMap, enemyMap), enemyTree)
|
||||||
in
|
in
|
||||||
helpProjectileHitEnemy
|
helpProjectileHitEnemy
|
||||||
(pos + 1, projectiles, enemyTree, enemyMap, fallingMap)
|
(pos + 1, projectiles, enemyTree, enemyMap, fallingMap, currentTime)
|
||||||
end
|
end
|
||||||
|
|
||||||
fun projectileHitEnemy (projectiles, enemyMap, enemyTree, fallingMap) =
|
fun projectileHitEnemy
|
||||||
helpProjectileHitEnemy (0, projectiles, enemyTree, enemyMap, fallingMap)
|
(projectiles, enemyMap, enemyTree, fallingMap, currentTime) =
|
||||||
|
helpProjectileHitEnemy
|
||||||
|
(0, projectiles, enemyTree, enemyMap, fallingMap, currentTime)
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user