From: <geo...@us...> - 2010-04-23 21:47:15
|
Revision: 3532 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3532&view=rev Author: geoffthemedio Date: 2010-04-23 21:47:09 +0000 (Fri, 23 Apr 2010) Log Message: ----------- -Fixed bug where producing a ship with a custom design would cause a crash. This involved making sure empires get knowledge of their own ship designs before there is a ship in existence that uses that design. -Added EmpireKnownShipDesignIDs function to Universe to allow external access to which ship designs are known to each empire -Updated Win32 install script to hopefully fix issues with the install directory and two files in it not being deleted when uninstalling -Misc. code grooming Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi trunk/FreeOrion/client/human/chmain.cpp trunk/FreeOrion/msvc2008/src/Version.cpp trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/Empire/Empire.cpp 2010-04-23 21:47:09 UTC (rev 3532) @@ -1082,9 +1082,9 @@ bool Empire::ShipDesignAvailable(int ship_design_id) const { - // if design isn't kept by this empire, it can't be built + // if design isn't kept by this empire, it can't be built. if (!ShipDesignKept(ship_design_id)) - return false; + return false; // The empire needs to issue a ShipDesignOrder to add this design id to its kept designs const ShipDesign* design = GetShipDesign(ship_design_id); if (!design) return false; @@ -2218,9 +2218,11 @@ { /* Check if design id is valid. that is, check that it corresponds to an * existing shipdesign in the universe. On clients, this means that this - * empire knows about this ship design. On the server, all existing ship - * designs will be valid, so this just adds this design's id to those that - * this empire will remember */ + * empire knows about this ship design and the server consequently sent the + * design to this player. On the server, all existing ship designs will be + * valid, so this just adds this design's id to those that this empire will + * retain as one of it's ship designs, which are those displayed in the GUI + * list of available designs for human players, and */ const ShipDesign* ship_design = GetUniverse().GetShipDesign(ship_design_id); if (ship_design) { // design is valid, so just add the id to empire's set of ids that it knows about Modified: trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi =================================================================== --- trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi 2010-04-23 21:47:09 UTC (rev 3532) @@ -171,16 +171,19 @@ Delete "$INSTDIR\ogre_plugins.cfg" RMDir /r "$INSTDIR\default" - RMDir "$INSTDIR" Delete "$SMPROGRAMS\FreeOrion\Uninstall.lnk" Delete "$SMPROGRAMS\FreeOrion\Website.lnk" Delete "$DESKTOP\FreeOrion.lnk" Delete "$SMPROGRAMS\FreeOrion\FreeOrion.lnk" Delete "$SMPROGRAMS\FreeOrion\FreeOrion windowed.lnk" - RMDir "$SMPROGRAMS\FreeOrion" + Delete "$INSTDIR\FreeOrion.org.url" + Delete "$INSTDIR\Uninstall.exe" + RMDir "$INSTDIR" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true Modified: trunk/FreeOrion/client/human/chmain.cpp =================================================================== --- trunk/FreeOrion/client/human/chmain.cpp 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/client/human/chmain.cpp 2010-04-23 21:47:09 UTC (rev 3532) @@ -216,7 +216,6 @@ #ifdef FREEORION_WIN32 # ifdef IDI_ICON1 // set window icon to embedded application icon - std::cout << "setting render window icon" << std::endl; HWND hwnd; window->getCustomAttribute("WINDOW", &hwnd); HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL); Modified: trunk/FreeOrion/msvc2008/src/Version.cpp =================================================================== --- trunk/FreeOrion/msvc2008/src/Version.cpp 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/msvc2008/src/Version.cpp 2010-04-23 21:47:09 UTC (rev 3532) @@ -1,7 +1,7 @@ #include "../../util/Version.h" namespace { - static const std::string retval = "v0.3.14 [Rev 3527]"; + static const std::string retval = "v0.3.14 [Rev 3532]"; } const std::string& FreeOrionVersionString() Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/universe/Universe.cpp 2010-04-23 21:47:09 UTC (rev 3532) @@ -774,6 +774,15 @@ return (it != m_ship_designs.end() ? it->second : 0); } +const std::set<int>& Universe::EmpireKnownShipDesignIDs(int empire_id) const +{ + std::map<int, std::set<int> >::const_iterator it = m_empire_known_ship_design_ids.find(empire_id); + if (it != m_empire_known_ship_design_ids.end()) + return it->second; + static const std::set<int> empty_set; + return empty_set; +} + Visibility Universe::GetObjectVisibilityByEmpire(int object_id, int empire_id) const { if (empire_id == ALL_EMPIRES || Universe::ALL_OBJECTS_VISIBLE) Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/universe/Universe.h 2010-04-23 21:47:09 UTC (rev 3532) @@ -283,7 +283,7 @@ /** Returns IDs of objects that the Empire with id \a empire_id knows have * been destroyed. Each empire's latest known objects data contains the * last known information about each object, whether it has been destroyed - * or not. If \a empire_id = ALL_EMPIRES and empty set of IDs is + * or not. If \a empire_id = ALL_EMPIRES an empty set of IDs is * returned. */ const std::set<int>& EmpireKnownDestroyedObjectIDs(int empire_id) const; @@ -291,6 +291,10 @@ ship_design_iterator beginShipDesigns() const {return m_ship_designs.begin();} ///< returns the begin iterator for ship designs ship_design_iterator endShipDesigns() const {return m_ship_designs.end();} ///< returns the end iterator for ship designs + /** Returns IDs of ship designs that the Empire with id \a empire_id has + * seen during the game. If \a empire_id = ALL_EMPIRES an empty set of + * ids is returned */ + const std::set<int>& EmpireKnownShipDesignIDs(int empire_id) const; Visibility GetObjectVisibilityByEmpire(int object_id, int empire_id) const;///< returns the Visibility level of empire with id \a empire_id of UniverseObject with id \a object_id as determined by calling UpdateEmpireObjectVisibilities const VisibilityTurnMap&GetObjectVisibilityTurnMapByEmpire(int object_id, int empire_id) const; ///< returns the map from Visibility level to turn number on which the empire with id \a empire_id last had the various Visibility levels of the UniverseObject with id \a object_id . The returned map may be empty or not have entries for all visibility levels, if the empire has not seen the object at that visibility level yet. Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2010-04-23 20:52:27 UTC (rev 3531) +++ trunk/FreeOrion/util/Order.cpp 2010-04-23 21:47:09 UTC (rev 3532) @@ -20,9 +20,6 @@ const Tech* GetTech(const std::string& name); -using boost::lexical_cast; -using std::vector; - #define DEBUG_CREATE_FLEET_ORDER 0 #define DEBUG_FLEET_MOVE_ORDER 0 #if DEBUG_CREATE_FLEET_ORDER || DEBUG_FLEET_MOVE_ORDER @@ -361,7 +358,7 @@ // iterate down the ship vector and add each one to the fleet // after first verifying that it is a valid ship id - vector<int>::const_iterator itr = m_add_ships.begin(); + std::vector<int>::const_iterator itr = m_add_ships.begin(); while (itr != m_add_ships.end()) { // find the ship, verify that ID is valid int curr = (*itr); @@ -855,6 +852,7 @@ Empire* empire = Empires().Lookup(EmpireID()); if (m_delete_design_from_empire) { + // player is ordering empire to forget about a particular design if (!empire->ShipDesignKept(m_design_id)) { Logger().errorStream() << "Tried to remove a ShipDesign that the empire wasn't remembering"; return; @@ -862,6 +860,7 @@ empire->RemoveShipDesign(m_design_id); } else if (m_create_new_design) { + // player is creating a new design if (m_ship_design.DesignedByEmpire() != EmpireID()) { Logger().errorStream() << "Tried to create a new ShipDesign designed by another empire"; return; @@ -875,9 +874,17 @@ ShipDesign* new_ship_design = new ShipDesign(m_ship_design); universe.InsertShipDesignID(new_ship_design, m_design_id); + universe.SetEmpireKnowledgeOfShipDesign(m_design_id, EmpireID()); empire->AddShipDesign(m_design_id); } else if (!m_create_new_design && !m_delete_design_from_empire) { + // player is order empire to retain a particular design, so that is can + // be used to construct ships by that empire. + + // TODO: consider removing this order, so that an empire needs to use + // espionage or trade to gain access to a ship design made by another + // player + // check if empire is already remembering the design if (empire->ShipDesignKept(m_design_id)) { Logger().errorStream() << "Tried to remember a ShipDesign that was already being remembered"; @@ -885,21 +892,11 @@ } // check if the empire can see any objects that have this design (thus enabling it to be copied) - std::vector<Ship*> ship_vec = objects.FindObjects<Ship>(); - bool known = false; - for (std::vector<Ship*>::const_iterator it = ship_vec.begin(); it != ship_vec.end(); ++it) { - if (Universe::ALL_OBJECTS_VISIBLE || (*it)->GetVisibility(EmpireID()) != VIS_NO_VISIBILITY) { - if ((*it)->DesignID() == m_design_id) { - known = true; - break; - } - } - } - - if (known) { + const std::set<int>& empire_known_design_ids = universe.EmpireKnownShipDesignIDs(EmpireID()); + if (empire_known_design_ids.find(m_design_id) != empire_known_design_ids.end()) { empire->AddShipDesign(m_design_id); } else { - Logger().errorStream() << "Tried to remember a ShipDesign that this empire can't see"; + Logger().errorStream() << "Tried to remember a ShipDesign that this empire hasn't seen"; return; } |