public void Remove(ICombatGroup group, BattleSide side, ReportState state) { lock (battleLock) { // Remove from appropriate combat list if (side == BattleSide.Attack) { if (!Attackers.Remove(group)) { return; } group.CombatObjectAdded -= AttackerGroupOnCombatObjectAdded; group.CombatObjectRemoved -= AttackerGroupOnCombatObjectRemoved; } else { if (!Defenders.Remove(group)) { return; } group.CombatObjectAdded -= DefenderGroupOnCombatObjectAdded; group.CombatObjectRemoved -= DefenderGroupOnCombatObjectRemoved; } // If battle hasnt started then dont worry about cleaning anything up since nothing has happened to these objects if (!BattleStarted) { return; } // Snap a report of exit BattleReport.WriteReportGroup(group, side == BattleSide.Attack, state); // Tell objects to exit from battle foreach (var co in group.Where(co => !co.Disposed)) { co.ExitBattle(); } // Send exit events if (side == BattleSide.Attack) { WithdrawAttacker(this, group); } else { WithdrawDefender(this, group); } } }