diff --git a/fcore/game-update.sml b/fcore/game-update.sml index 1187ebf..6794f22 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -18,6 +18,8 @@ struct val enemyTree = Enemy.generateTree enemies val player = Player.checkEnemyCollisions (player, enemies, enemyTree) + val enemies = PlayerAttack.attackEnemies (player, enemies, enemyTree) + val enemies = Enemy.update (enemies, walls, wallTree, platforms, platformTree, player, graph) diff --git a/fcore/player/player-attack.sml b/fcore/player/player-attack.sml new file mode 100644 index 0000000..2c5cea1 --- /dev/null +++ b/fcore/player/player-attack.sml @@ -0,0 +1,44 @@ +structure PlayerAttack = +struct + structure AttackEnemies = + MakeQuadTreeFold + (struct + type env = unit + type state = EnemyMap.t + + open EnemyType + + fun onAttacked + (enemyID: int, enemy: EnemyType.enemy, enemyMap: EnemyMap.t) = + case #variant enemy of + PATROL_SLIME => EnemyMap.remove (enemyID, enemyMap) + | FOLLOW_SLIME => EnemyMap.remove (enemyID, enemyMap) + | STRAIGHT_BAT => EnemyMap.remove (enemyID, enemyMap) + + fun fold (enemyID, (), enemyMap) = + case EnemyMap.get (enemyID, enemyMap) of + SOME enemy => onAttacked (enemyID, enemy, enemyMap) + | NONE => enemyMap + end) + + fun attackEnemies (player: PlayerType.player, enemyMap, enemyTree) = + let + open PlayerType + val {x, y, facing, mainAttack, ...} = player + in + case mainAttack of + MAIN_ATTACKING {length, ...} => + let + open EntityType + val height = Constants.playerSize + val x = + (case facing of + FACING_RIGHT => x + Constants.playerSize + | FACING_LEFT => x - length) + in + AttackEnemies.foldRegion + (x, y, length, height, (), enemyMap, enemyTree) + end + | _ => enemyMap + end +end diff --git a/oms.mlb b/oms.mlb index 4052ea1..c078cff 100644 --- a/oms.mlb +++ b/oms.mlb @@ -44,6 +44,7 @@ fcore/enemy/enemy-behaviour.sml fcore/enemy/enemy.sml fcore/enemy/falling-enemies.sml fcore/player/player.sml +fcore/player/player-attack.sml fcore/projectile.sml fcore/game-update.sml