From: <geo...@us...> - 2014-02-03 08:10:30
|
Revision: 6823 http://sourceforge.net/p/freeorion/code/6823 Author: geoffthemedio Date: 2014-02-03 08:10:26 +0000 (Mon, 03 Feb 2014) Log Message: ----------- Recorded some ship destruction statistics in empires. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2014-02-03 06:03:04 UTC (rev 6822) +++ trunk/FreeOrion/Empire/Empire.h 2014-02-03 08:10:26 UTC (rev 6823) @@ -543,6 +543,11 @@ /** Resets empire meters. */ void ResetMeters(); + + std::map<int, int>& EmpireShipsDestroyed() { return m_empire_ships_destroyed; } + std::map<int, int>& ShipDesignsDestroyed() { return m_ship_designs_destroyed; } + std::map<std::string, int>& SpeciesShipsDestroyed() { return m_species_ships_destroyed; } + std::map<std::string, int>& SpeciesPlanetsInvaded() { return m_species_planets_invaded; } //@} /** Processes Builditems on queues of empires other than the indicated Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2014-02-03 06:03:04 UTC (rev 6822) +++ trunk/FreeOrion/server/ServerApp.cpp 2014-02-03 08:10:26 UTC (rev 6823) @@ -1738,6 +1738,59 @@ } } + /** Records info in Empires about what they destroyed during combat. */ + void UpdateEmpireCombatDestructionInfo(const std::vector<CombatInfo>& combats) { + for (std::vector<CombatInfo>::const_iterator it = combats.begin(); + it != combats.end(); ++it) + { + const std::vector<AttackEvent>& attacks = it->combat_events; + for (std::vector<AttackEvent>::const_iterator it = attacks.begin(); + it != attacks.end(); ++it) + { + const AttackEvent& attack = *it; + if (!attack.target_destroyed) + continue; + TemporaryPtr<const UniverseObject> attacker = GetUniverseObject(attack.attacker_id); + if (!attacker) + continue; + int attacker_empire_id = attacker->Owner(); + Empire* attacker_empire = Empires().Lookup(attacker_empire_id); + if (!attacker_empire) + continue; + + TemporaryPtr<const Ship> target_ship = GetShip(attack.target_id); + if (!target_ship) + continue; + int target_empire_id = target_ship->Owner(); + int target_design_id = target_ship->DesignID(); + const std::string& target_species_name = target_ship->SpeciesName(); + + std::map<int, int>::iterator map_it; + // record destruction of an empire's ship by attacker empire + map_it = attacker_empire->EmpireShipsDestroyed().find(target_empire_id); + if (map_it == attacker_empire->EmpireShipsDestroyed().end()) + attacker_empire->EmpireShipsDestroyed()[target_empire_id] = 1; + else + map_it->second++; + + // record destruction of a design by attacker empire + map_it = attacker_empire->ShipDesignsDestroyed().find(target_design_id); + if (map_it == attacker_empire->ShipDesignsDestroyed().end()) + attacker_empire->ShipDesignsDestroyed()[target_design_id] = 1; + else + map_it->second++; + + // record destruction of ship with a species on it by attacker empire + std::map<std::string, int>::iterator species_it = + attacker_empire->SpeciesShipsDestroyed().find(target_species_name); + if (species_it == attacker_empire->SpeciesShipsDestroyed().end()) + attacker_empire->SpeciesShipsDestroyed()[target_species_name] = 1; + else + species_it->second++; + } + } + } + /** Does colonization, with safety checks */ bool ColonizePlanet(int ship_id, int planet_id) { TemporaryPtr<Ship> ship = GetShip(ship_id); @@ -2500,6 +2553,8 @@ BackProjectSystemCombatInfoObjectMeters(combats); + UpdateEmpireCombatDestructionInfo(combats); + DisseminateSystemCombatInfo(combats); CreateCombatSitReps(combats); |