diff --git a/fcore/bin-search.sml b/fcore/bin-search.sml index c752672..5f2aee5 100644 --- a/fcore/bin-search.sml +++ b/fcore/bin-search.sml @@ -1,23 +1,40 @@ structure BinSearch = struct - local - fun helpFind (findNum, vec, low, high) = - if high >= low then - let - val mid = low + ((high - low) div 2) - val curNum = Vector.sub (vec, mid) - in - if curNum = findNum then - mid - else if curNum < findNum then - helpFind (findNum, vec, mid + 1, high) - else - helpFind (findNum, vec, low, mid - 1) - end - else - ~1 - in - fun find (findNum, vec) = - helpFind (findNum, vec, 0, Vector.length vec - 1) - end + fun helpExists (findNum, vec, low, high) = + if high >= low then + let + val mid = low + ((high - low) div 2) + val curNum = Vector.sub (vec, mid) + in + if curNum = findNum then + true + else if curNum < findNum then + helpExists (findNum, vec, mid + 1, high) + else + helpExists (findNum, vec, low, mid - 1) + end + else + false + + fun exists (findNum, vec) = + helpExists (findNum, vec, 0, Vector.length vec - 1) + + fun helpFind (findNum, vec, low, high) = + if high >= low then + let + val mid = low + ((high - low) div 2) + val curNum = Vector.sub (vec, mid) + in + if curNum = findNum then + mid + else if curNum < findNum then + helpFind (findNum, vec, mid + 1, high) + else + helpFind (findNum, vec, low, mid - 1) + end + else + ~1 + + fun find (findNum, vec) = + helpFind (findNum, vec, 0, Vector.length vec - 1) end diff --git a/fcore/game-update.sml b/fcore/game-update.sml index 1f7309d..8601c81 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -47,14 +47,21 @@ struct end | [] => acc - fun checkEnemiesWhileAttacking (player, enemies, lst, acc) = - let - open QuadTree - in - case lst of - enemyID :: tl => (* placeholder *) acc - | [] => acc - end + (* removes enemies from `enemies` vector when that enemy is in collisions *) + fun filterEnemyCollisions (pos, collisions, enemies: enemy vector, acc) = + if pos < 0 then + Vector.fromList acc + else + let + val enemy = Vector.sub (enemies, pos) + in + if BinSearch.exists (#id enemy, collisions) then + (* filter out *) + filterEnemyCollisions (pos - 1, collisions, enemies, acc) + else + (* don't filter out *) + filterEnemyCollisions (pos - 1, collisions, enemies, enemy :: acc) + end fun checkPlayerEnemyCollisions (player, game) = let @@ -108,6 +115,10 @@ struct val patches = checkEnemiesWhileAttacking (player, enemies, enemyCollisions, []) val player = Player.withPatches (player, patches) + + val enemyCollisions = Vector.fromList enemyCollisions + val enemies = filterEnemyCollisions + (Vector.length enemies - 1, enemyCollisions, enemies, []) in (player, enemies) end @@ -122,6 +133,9 @@ struct (* check player-enemy collisions and react *) val (player, enemies) = checkPlayerEnemyCollisions (player, game) + + (* create enemy quad tree from list of new enemies *) + val enemyTree = Enemy.generateTree enemies in { player = player , walls = walls