internal static List <SortedCombatant> Rebuild_SortedCombatantList(int size, int max_range, Point pos, Predicate <Player> filter) /* sub_738D8 */ { var deltas = ovr033.GetSizeBasedMapDeltas(size); var attackerMap = ovr033.BuildSizeMap(size, pos); var sortedCombatants = new List <SortedCombatant>(); for (int playerIndex = 1; playerIndex <= gbl.CombatantCount; playerIndex++) { var combatantMap = gbl.CombatMap[playerIndex]; if (combatantMap.size > 0 && filter(gbl.player_array[playerIndex])) { var targetMap = ovr033.BuildSizeMap(combatantMap.size, combatantMap.pos); bool found = false; int found_range = max_range; Point found_target = new Point(); Point found_attacker = new Point(); foreach (var targetPos in targetMap) { foreach (var attackerPos in attackerMap) { int tmp_range = max_range; if (canReachTarget(ref tmp_range, targetPos, attackerPos) == true) { found = true; if (tmp_range < found_range) { found_range = tmp_range; found_attacker = attackerPos; found_target = targetPos; } } } } if (found == true) { byte tmpDir = FindCombatantDirection(found_target, found_attacker); var combatant = new SortedCombatant(gbl.player_array[playerIndex], combatantMap.pos, found_range, tmpDir); sortedCombatants.Add(combatant); } } } sortedCombatants.Sort(); return(sortedCombatants); }
/* sub_738D8 */ internal static List<SortedCombatant> Rebuild_SortedCombatantList(int size, int max_range, Point pos, Predicate<Player> filter) { var deltas = ovr033.GetSizeBasedMapDeltas(size); var attackerMap = ovr033.BuildSizeMap(size, pos); var sortedCombatants = new List<SortedCombatant>(); for (int playerIndex = 1; playerIndex <= gbl.CombatantCount; playerIndex++) { var combatantMap = gbl.CombatMap[playerIndex]; if (combatantMap.size > 0 && filter(gbl.player_array[playerIndex])) { var targetMap = ovr033.BuildSizeMap(combatantMap.size, combatantMap.pos); bool found = false; int found_range = max_range; Point found_target = new Point(); Point found_attacker = new Point(); foreach (var targetPos in targetMap) { foreach (var attackerPos in attackerMap) { int tmp_range = max_range; if (canReachTarget(ref tmp_range, targetPos, attackerPos) == true) { found = true; if (tmp_range < found_range) { found_range = tmp_range; found_attacker = attackerPos; found_target = targetPos; } } } } if (found == true) { byte tmpDir = FindCombatantDirection(found_target, found_attacker); var combatant = new SortedCombatant(gbl.player_array[playerIndex], combatantMap.pos, found_range, tmpDir); sortedCombatants.Add(combatant); } } } sortedCombatants.Sort(); return sortedCombatants; }
/* sub_41932 */ internal static Player step_combat_list(bool arg_2, int step, ref int list_index, ref Point attackerPos, SortedCombatant[] sorted_list) { if (arg_2 == true) { attackerPos = sorted_list[list_index - 1].pos; } else { ovr033.RedrawPosition(attackerPos); } list_index += step; if (list_index == 0) { list_index = sorted_list.GetLength(0); } if (list_index > sorted_list.GetLength(0)) { list_index = 1; } Player newTarget = sorted_list[list_index - 1].player; var targetPos = sorted_list[list_index - 1].pos; if (arg_2 == true) { ovr025.draw_missile_attack(0, 1, targetPos, attackerPos); attackerPos = targetPos; } return newTarget; }