From: <tz...@us...> - 2006-01-30 03:03:06
|
Revision: 1713 Author: tzlaine Date: 2006-01-29 19:02:32 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1713&view=rev Log Message: ----------- Made changes required by previous commit's file name changes. Modified Paths: -------------- trunk/FreeOrion/SConscript trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FleetWnd.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h Modified: trunk/FreeOrion/SConscript =================================================================== --- trunk/FreeOrion/SConscript 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/SConscript 2006-01-30 03:02:32 UTC (rev 1713) @@ -86,7 +86,7 @@ 'UI/CUIWnd.cpp', 'UI/CombatWnd.cpp', 'UI/FleetButton.cpp', - 'UI/FleetWindow.cpp', + 'UI/FleetWnd.cpp', 'UI/FocusSelector.cpp', 'UI/GalaxySetupWnd.cpp', 'UI/InGameMenu.cpp', @@ -102,7 +102,7 @@ 'UI/SitRepPanel.cpp', 'UI/Splash.cpp', 'UI/SystemIcon.cpp', - 'UI/TechWnd.cpp', + 'UI/TechTreeWnd.cpp', 'UI/TurnProgressWnd.cpp', 'universe/Universe.cpp', 'util/AppInterface.cpp' Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -9,7 +9,7 @@ #include "../util/MultiplayerCommon.h" #include "../universe/ShipDesign.h" #include "SidePanel.h" -#include "TechWnd.h" +#include "TechTreeWnd.h" #include <GG/DrawUtil.h> #include <GG/Layout.h> Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/ClientUI.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -6,7 +6,7 @@ #include "../universe/Building.h" #include "CUIControls.h" #include "../universe/Fleet.h" -#include "FleetWindow.h" +#include "FleetWnd.h" #include "IntroScreen.h" #include "MapWnd.h" #include "SidePanel.h" Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/FleetButton.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -2,7 +2,7 @@ #include "../util/AppInterface.h" #include "../universe/Fleet.h" -#include "FleetWindow.h" +#include "FleetWnd.h" #include "../client/human/HumanClientApp.h" #include "MapWnd.h" #include "../util/MultiplayerCommon.h" Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -1,4 +1,4 @@ -#include "FleetWindow.h" +#include "FleetWnd.h" #include "../util/AppInterface.h" #include "ClientUI.h" #include "CUIControls.h" @@ -376,7 +376,7 @@ return current_fleet->ID() != fleet->ID() && (current_fleet->X() == fleet->X() && current_fleet->Y() == fleet->Y()); } - bool temp_header_bool = RecordHeaderFile(FleetWindowRevision()); + bool temp_header_bool = RecordHeaderFile(FleetWndRevision()); bool temp_source_bool = RecordSourceFile("$RCSfile$", "$Revision$"); } Modified: trunk/FreeOrion/UI/FleetWnd.h =================================================================== --- trunk/FreeOrion/UI/FleetWnd.h 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/FleetWnd.h 2006-01-30 03:02:32 UTC (rev 1713) @@ -1,6 +1,6 @@ // -*- C++ -*- -#ifndef _FleetWindow_h_ -#define _FleetWindow_h_ +#ifndef _FleetWnd_h_ +#define _FleetWnd_h_ #ifndef _CUIWnd_h_ #include "CUIWnd.h" @@ -138,7 +138,7 @@ static GG::Pt s_last_position; ///< the latest position to which any FleetWnd has been moved. This is used to keep the place of the fleet window in single-fleetwindow mode. }; -inline std::pair<std::string, std::string> FleetWindowRevision() +inline std::pair<std::string, std::string> FleetWndRevision() {return std::pair<std::string, std::string>("$RCSfile$", "$Revision$");} -#endif // _FleetWindow_h_ +#endif // _FleetWnd_h_ Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -6,7 +6,7 @@ #include "CUIControls.h" #include "../universe/Fleet.h" #include "FleetButton.h" -#include "FleetWindow.h" +#include "FleetWnd.h" #include "../client/human/HumanClientApp.h" #include "InGameMenu.h" #include "../network/Message.h" Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -7,7 +7,7 @@ #include "../client/human/HumanClientApp.h" #include "../util/MultiplayerCommon.h" #include "../universe/Tech.h" -#include "../UI/TechWnd.h" +#include "../UI/TechTreeWnd.h" #include <GG/DrawUtil.h> Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -21,7 +21,7 @@ #include "../universe/Ship.h" #include "../util/OptionsDB.h" -#include "../UI/FleetWindow.h" +#include "../UI/FleetWnd.h" #include <boost/format.hpp> Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -5,7 +5,7 @@ #include "ClientUI.h" #include "../universe/Fleet.h" #include "FleetButton.h" -#include "FleetWindow.h" +#include "FleetWnd.h" #include "../client/human/HumanClientApp.h" #include "MapWnd.h" #include "../util/MultiplayerCommon.h" Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) @@ -1,4 +1,4 @@ -#include "TechWnd.h" +#include "TechTreeWnd.h" #include "ClientUI.h" #include "CUIControls.h" @@ -427,7 +427,7 @@ const std::string m_category; }; - bool temp_header_bool = RecordHeaderFile(TechWndRevision()); + bool temp_header_bool = RecordHeaderFile(TechTreeWndRevision()); bool temp_source_bool = RecordSourceFile("$RCSfile$", "$Revision$"); } Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2006-01-30 02:57:04 UTC (rev 1712) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2006-01-30 03:02:32 UTC (rev 1713) @@ -1,6 +1,6 @@ // -*- C++ -*- -#ifndef _TechWnd_h_ -#define _TechWnd_h_ +#ifndef _TechTreeWnd_h_ +#define _TechTreeWnd_h_ #include "CUIWnd.h" @@ -83,7 +83,7 @@ CUIButton* m_uncollapse_all_button; }; -inline std::pair<std::string, std::string> TechWndRevision() +inline std::pair<std::string, std::string> TechTreeWndRevision() {return std::pair<std::string, std::string>("$RCSfile$", "$Revision$");} -#endif // _TechWnd_h_ +#endif // _TechTreeWnd_h_ |
From: <tz...@us...> - 2006-02-08 22:29:46
|
Revision: 1743 Author: tzlaine Date: 2006-02-08 14:29:23 -0800 (Wed, 08 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1743&view=rev Log Message: ----------- Completely removed the use of XDiff. Updates are now sent as plain XML. This was done because of the large number of crashes caused by the use of XDiff to date, which are getting progressively more difficult to diagnose, much less to fix, because of the low quality of the XDiff implementation. XDiff was originally put in place to minimize client-server traffic, but it looks so far like it wasa pessimization. After removing it, save file sizes are able to be cut roughly in half, and turn processing times are negligible. Modified Paths: -------------- trunk/FreeOrion/Empire/ClientEmpireManager.cpp trunk/FreeOrion/Empire/ServerEmpireManager.cpp trunk/FreeOrion/SConscript trunk/FreeOrion/client/ClientApp.cpp trunk/FreeOrion/client/ClientApp.h trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h Modified: trunk/FreeOrion/Empire/ClientEmpireManager.cpp =================================================================== --- trunk/FreeOrion/Empire/ClientEmpireManager.cpp 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/Empire/ClientEmpireManager.cpp 2006-02-08 22:29:23 UTC (rev 1743) @@ -3,7 +3,6 @@ #include "../util/MultiplayerCommon.h" #include "../util/SitRepEntry.h" #include "../util/XMLObjectFactory.h" -#include "../network/XDiff.hpp" #include <map> #include <list> Modified: trunk/FreeOrion/Empire/ServerEmpireManager.cpp =================================================================== --- trunk/FreeOrion/Empire/ServerEmpireManager.cpp 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/Empire/ServerEmpireManager.cpp 2006-02-08 22:29:23 UTC (rev 1743) @@ -4,7 +4,6 @@ #include "../universe/Planet.h" #include "../server/ServerApp.h" #include "../universe/Universe.h" -#include "../network/XDiff.hpp" #include <boost/lexical_cast.hpp> @@ -19,8 +18,7 @@ ServerEmpireManager::ServerEmpireManager() : EmpireManager() -{ -} +{} Empire* ServerEmpireManager::CreateEmpire(int id, @@ -30,14 +28,10 @@ int planetID) { Empire* emp = new Empire(name, player_name, id, color, planetID); - if(emp == NULL) - { - throw std::runtime_error("Memory allocation failed. ServerEmpireManager::CreateEmpire()"); - } - id++; + ++id; - // Add system homeplanet is in to the ExploredSystem list + // Add system homeplanet is in to the explored system list ServerApp* server_app = ServerApp::GetApp(); Universe& universe = server_app->GetUniverse(); Planet* planet = universe.Object<Planet>(planetID); @@ -66,22 +60,14 @@ { XMLElement this_turn(EmpireManager::EMPIRE_UPDATE_TAG); - // find whatever empire they're talking about Empire* emp = Lookup(empire_id); - - // perform sanity check if (!emp) - { throw std::runtime_error("Invalid empire_id passed to ServerEmpireManager::CreateClientEmpireUpdate()"); - } - // set ID attribute of the update to indicate whose empire this is this_turn.SetAttribute("empire_id", boost::lexical_cast<std::string>(empire_id)); - for (EmpireManager::iterator it = begin(); it != end(); it++) - { + for (EmpireManager::iterator it = begin(); it != end(); ++it) { XMLElement current_empire("Empire" + boost::lexical_cast<std::string>(it->second->EmpireID())); - // Only append visible information current_empire.AppendChild(it->second->XMLEncode(*emp)); this_turn.AppendChild(current_empire); } Modified: trunk/FreeOrion/SConscript =================================================================== --- trunk/FreeOrion/SConscript 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/SConscript 2006-02-08 22:29:23 UTC (rev 1743) @@ -8,11 +8,6 @@ 'Empire/ResourcePool.cpp', 'network/Message.cpp', 'network/NetworkCore.cpp', - 'network/XDiff.cpp', - 'network/XHash.cpp', - 'network/XLut.cpp', - 'network/XParser.cpp', - 'network/XTree.cpp', 'UI/StringTable.cpp', 'universe/Building.cpp', 'universe/Condition.cpp', Modified: trunk/FreeOrion/client/ClientApp.cpp =================================================================== --- trunk/FreeOrion/client/ClientApp.cpp 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/client/ClientApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) @@ -1,7 +1,6 @@ #include "ClientApp.h" #include "../util/MultiplayerCommon.h" -#include "../network/XDiff.hpp" #include <stdexcept> @@ -108,36 +107,10 @@ return new_id; } -void ClientApp::UpdateTurnData( const XMLDoc &diff ) +void ClientApp::UpdateTurnData( const XMLDoc &new_doc ) { - XMLDoc new_doc; - - // we may not have a universe object if nothing has changed - if (diff.root_node.ContainsChild("Universe")) - { - // get old universe data - new_doc.root_node.AppendChild(m_previous_universe); - } - - if (diff.root_node.ContainsChild(EmpireManager::EMPIRE_UPDATE_TAG)) - { - // get old empire data - new_doc.root_node.AppendChild(m_empires.EncodeEmpires()); - } - - // XPatch - XPatch( new_doc, diff ); - - // apply empire - if (new_doc.root_node.ContainsChild( EmpireManager::EMPIRE_UPDATE_TAG ) ) - { - m_empires.HandleEmpireElementUpdate( new_doc.root_node.Child( EmpireManager::EMPIRE_UPDATE_TAG ) ); - } - - // apply universe - if (new_doc.root_node.ContainsChild( "Universe" ) ) - { - m_previous_universe = new_doc.root_node.Child("Universe"); - m_universe.SetUniverse( m_previous_universe ); - } + if (new_doc.root_node.ContainsChild(EmpireManager::EMPIRE_UPDATE_TAG)) + m_empires.HandleEmpireElementUpdate(new_doc.root_node.Child(EmpireManager::EMPIRE_UPDATE_TAG)); + if (new_doc.root_node.ContainsChild("Universe")) + m_universe.SetUniverse(new_doc.root_node.Child("Universe")); } Modified: trunk/FreeOrion/client/ClientApp.h =================================================================== --- trunk/FreeOrion/client/ClientApp.h 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/client/ClientApp.h 2006-02-08 22:29:23 UTC (rev 1743) @@ -86,7 +86,6 @@ std::string m_player_name; int m_player_id; int m_empire_id; - XMLElement m_previous_universe; private: const ClientApp& operator=(const ClientApp&); // disabled Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) @@ -784,8 +784,6 @@ m_empire_id = boost::lexical_cast<int>(doc.root_node.Child("empire_id").Text()); - m_previous_universe = doc.root_node.Child("Universe"); - // free current sitreps, if any if (Empires().Lookup(m_empire_id)) Empires().Lookup(m_empire_id)->ClearSitRep(); @@ -799,7 +797,7 @@ Logger().debugStream() << "No Empire data received from server. Update Server Code."; } - m_universe.SetUniverse(m_previous_universe); + m_universe.SetUniverse(doc.root_node.Child("Universe")); Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Universe setup complete."; for (Empire::SitRepItr it = Empires().Lookup(m_empire_id)->SitRepBegin(); it != Empires().Lookup(m_empire_id)->SitRepEnd(); ++it) { @@ -852,7 +850,7 @@ // free current sitreps Empires().Lookup(m_empire_id)->ClearSitRep(); - // Update data used XPatch and needs only elements common to universe and empire + // Update data universe and empire using state from server UpdateTurnData(doc); Empires().Lookup(m_empire_id)->UpdateResourcePool(); Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) @@ -3,7 +3,6 @@ #include "../network/Message.h" #include "../util/XMLDoc.h" -#include "../network/XDiff.hpp" #include "../universe/Building.h" #include "../util/OrderSet.h" #include "../util/GZStream.h" @@ -1434,15 +1433,12 @@ m_network_core.Players().size() - m_ai_clients.size(), m_ai_clients.size(), g_lobby_data.players); m_log_category.debugStream() << "ServerApp::GameInit : Created universe " << " (SERVER_GAME_SETUP)."; - // add empires to turn sequence map - // according to spec this should be done randomly - // for now it's not + // add empires to turn sequence map according to spec this should be done randomly for now it's not for (it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { AddEmpireTurn( it->first ); } - // the universe creation caused the creation of empires. But now we - // need to assign the empires to players. + // the universe creation caused the creation of empires. But now we need to assign the empires to players. for (it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { XMLDoc doc; if (m_single_player_game) @@ -1592,30 +1588,17 @@ XMLDoc ServerApp::CreateTurnUpdate(int empire_id) { XMLDoc this_turn; - XMLDoc update_patch; // generate new data for this turn - // for the final game, we'd have visibility - // but for now we are able to see the whole universe XMLElement universe_data = m_universe.XMLEncode(empire_id); XMLElement empire_data = m_empires.CreateClientEmpireUpdate(empire_id); // build the new turn doc + this_turn.root_node.SetAttribute("turn_number", boost::lexical_cast<std::string>(m_current_turn)); this_turn.root_node.AppendChild(universe_data); this_turn.root_node.AppendChild(empire_data); - std::map<int, XMLDoc>::iterator itr = m_last_turn_update_msg.find(empire_id); - - XMLDoc last_turn = itr->second; - - // diff this turn with previous turn - XDiff(last_turn, this_turn, update_patch); - - // turn number is an attribute of the document - update_patch.root_node.SetAttribute("turn_number", boost::lexical_cast<std::string>(m_current_turn)); - - // return the results of the diff - return update_patch; + return this_turn; } XMLDoc ServerApp::LobbyUpdateDoc() const @@ -1721,21 +1704,11 @@ { doc.root_node.AppendChild(XMLElement("turn_number", boost::lexical_cast<std::string>(m_current_turn))); - XMLElement temp("m_last_turn_update_msg"); - for (std::map<int, XMLDoc>::const_iterator it = m_last_turn_update_msg.begin(); it != m_last_turn_update_msg.end(); ++it) { - temp.AppendChild(XMLElement(LAST_TURN_UPDATE_SAVE_ELEM_PREFIX + boost::lexical_cast<std::string>(it->first), it->second.root_node)); - } - doc.root_node.AppendChild(temp); } void ServerApp::LoadGameVars(const XMLDoc& doc) { m_current_turn = boost::lexical_cast<int>(doc.root_node.Child("turn_number").Text()); - - const XMLElement& last_turn_update_elem = doc.root_node.Child("m_last_turn_update_msg"); - for (XMLElement::const_child_iterator it = last_turn_update_elem.child_begin(); it != last_turn_update_elem.child_end(); ++it) { - m_last_turn_update_msg[boost::lexical_cast<int>(it->Tag().substr(LAST_TURN_UPDATE_SAVE_ELEM_PREFIX.size()))].root_node = it->Child(0); - } } @@ -1806,23 +1779,6 @@ OrderSet *pOrderSet; OrderSet::const_iterator order_it; - - // Some orders, like NewFleetOrder, change the state of the universe, - // we therefore need to get the state before these are executed, - // to be able to sucessfully diff later. - for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) - { - XMLDoc game_state; - - XMLElement universe_data = m_universe.XMLEncode(it->first); - - // build the new turn doc - game_state.root_node.AppendChild(universe_data); - - // We will append to it later - m_last_turn_update_msg[ it->first ] = game_state; - } - // Now all orders, then process turns for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { @@ -1846,15 +1802,6 @@ } } - // After the Orders are processed, save the Empire states. - // Unlike Universe, orders do not change Empire states the client does - // not know about - for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) - { - XMLElement empire_data = m_empires.CreateClientEmpireUpdate( it->first ); - m_last_turn_update_msg[ it->first ].root_node.AppendChild(empire_data); - } - // filter FleetColonizeOrder for later processing std::map<int,std::vector<FleetColonizeOrder*> > colonize_order_map; for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2006-02-08 22:22:49 UTC (rev 1742) +++ trunk/FreeOrion/server/ServerApp.h 2006-02-08 22:29:23 UTC (rev 1743) @@ -126,7 +126,7 @@ As a side effect, logs an error message and sends a failure message to the sending player as appropriate. */ bool VersionMismatch(int player_id, const PlayerInfo& player_info, const PlayerInfo& connection, const XMLDoc& doc); - XMLDoc CreateTurnUpdate(int empire_id); ///< creates encoded universe and empire data for the specified empire, diffs it with the previous turn data, stores the new data over the previous turn data and returns the diff XMLElement + XMLDoc CreateTurnUpdate(int empire_id); ///< creates encoded universe and empire data for the specified empire XMLDoc LobbyUpdateDoc() const; ///< returns an MP lobby-mode update XMLDoc containing all relevant parts of the lobby state XMLDoc LobbyStartDoc() const; ///< returns an MP lobby-mode update XMLDoc containing just the initial server-side data that the clients don't have XMLDoc SaveGameUpdateDoc() const; ///< returns an MP lobby-mode update XMLDoc containing just empire data for the currently-selected save game @@ -170,8 +170,6 @@ std::map<int, XMLElement> m_player_save_game_data; ///< stores the save game data coming in from the players during a save game operation - std::map<int, XMLDoc> m_last_turn_update_msg; ///< stores the xml encoded empire and universe data from the previous turn in order to generate diffs for turn update message. Map is indexed by empire ID, with separate message data for each since each player sees different parts of the universe. - // turn sequence map is used for turn processing. Each empire is added at the start of a game or reload and then the map maintains OrderSets for that turn std::map<int, OrderSet*> m_turn_sequence; |
From: <tz...@us...> - 2006-02-19 04:13:17
|
Revision: 1762 Author: tzlaine Date: 2006-02-18 20:12:55 -0800 (Sat, 18 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1762&view=rev Log Message: ----------- Fixed some errors in the untested Universe Boost.Serialization code recently committed, and added some temporary testing code that will remain in place only during the transition from the use of XMLDoc to Boost.Serialization for turn updates. Modified Paths: -------------- trunk/FreeOrion/SConstruct trunk/FreeOrion/build_support.py trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/SConstruct =================================================================== --- trunk/FreeOrion/SConstruct 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/SConstruct 2006-02-19 04:12:55 UTC (rev 1762) @@ -190,7 +190,12 @@ env.ParseConfig('pkg-config --cflags --libs GiGiSDL') found_gg_pkg_config = True - if not found_gg_pkg_config: + freeorion_boost_libs = [('boost_serialization', 'boost/archive/binary_iarchive.hpp', 'boost::archive::binary_iarchive::is_saving();')] + + if found_gg_pkg_config: + if not conf.CheckBoost(boost_version_string, freeorion_boost_libs, conf, not ms_linker): + Exit(1) + else: if OptionValue('boost_signals_namespace', env): signals_namespace = OptionValue('boost_signals_namespace', env) env.Append(CPPDEFINES = [ @@ -198,9 +203,11 @@ ('signals', signals_namespace) ]) - boost_libs = [('boost_signals', 'boost::signals::connection', '#include <boost/signals.hpp>'), - ('boost_filesystem', 'boost::filesystem::initial_path', '#include <boost/filesystem/operations.hpp>')] - if not conf.CheckBoost('1.32.0', boost_libs, conf, not ms_linker): + boost_libs = freeorion_boost_libs + [ + ('boost_signals', 'boost/signals.hpp', 'boost::signals::connection();'), + ('boost_filesystem', 'boost/filesystem/operations.hpp', 'boost::filesystem::initial_path();') + ] + if not conf.CheckBoost(boost_version_string, boost_libs, conf, not ms_linker): Exit(1) # pthreads Modified: trunk/FreeOrion/build_support.py =================================================================== --- trunk/FreeOrion/build_support.py 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/build_support.py 2006-02-19 04:12:55 UTC (rev 1762) @@ -232,11 +232,11 @@ if suffix: lib_name += suffix print 'Looking for boost lib %s... ' % lib_name - if conf.CheckLib(lib_name, lib_tuple[1], header = lib_tuple[2], language = 'C++'): + if conf.CheckLibWithHeader(lib_name, lib_tuple[1], 'C++', lib_tuple[2]): ret = lib_name else: lib_name = lib_name + '-mt' - if conf.CheckLib(lib_name, lib_tuple[1], header = lib_tuple[2], language = 'C++'): + if conf.CheckLibWithHeader(lib_name, lib_tuple[1], 'C++', lib_tuple[2]): ret = lib_name return ret Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-19 04:12:55 UTC (rev 1762) @@ -713,6 +713,7 @@ Logger().debugStream() << "SDLQuit() complete."; } +#include <boost/iostreams/device/file.hpp> void HumanClientApp::HandleMessageImpl(const Message& msg) { m_handling_message = true; @@ -792,8 +793,32 @@ } else { Logger().debugStream() << "No Empire data received from server. Update Server Code."; } - + m_universe.SetUniverse(doc.root_node.Child("Universe")); + +#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 +#if TEST_UNIVERSE_BOOST_SERIALIZATION + Universe boost_xml_universe; + namespace io = boost::iostreams; + std::string boost_xml_filename = (GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(m_empire_id) + "-boost.xml")).native_file_string(); + io::filtering_istream is; + is.push(io::file_source(boost_xml_filename)); + boost_xml_universe.SetUniverse(is); + + { + XMLDoc doc; + doc.root_node.AppendChild(m_universe.XMLEncode()); + std::ofstream ofs("Univese_XMLDoc.xml"); + doc.WriteDoc(ofs); + } + { + XMLDoc doc; + doc.root_node.AppendChild(boost_xml_universe.XMLEncode()); + std::ofstream ofs("Univese_Boost_Serialization.xml"); + doc.WriteDoc(ofs); + } +#endif + Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Universe setup complete."; for (Empire::SitRepItr it = Empires().Lookup(m_empire_id)->SitRepBegin(); it != Empires().Lookup(m_empire_id)->SitRepEnd(); ++it) { Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-02-19 04:12:55 UTC (rev 1762) @@ -1429,6 +1429,14 @@ doc.root_node.AppendChild(m_empires.CreateClientEmpireUpdate(it->first)); doc.root_node.AppendChild(XMLElement("empire_id", boost::lexical_cast<std::string>(it->first))); +#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 +#if TEST_UNIVERSE_BOOST_SERIALIZATION + { + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.xml")); + ofs << m_universe.Encode(it->first); + } +#endif + // turn number is an attribute of the document doc.root_node.SetAttribute("turn_number", boost::lexical_cast<std::string>(m_current_turn)); Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/universe/ResourceCenter.h 2006-02-19 04:12:55 UTC (rev 1762) @@ -121,7 +121,7 @@ & BOOST_SERIALIZATION_NVP(m_research) & BOOST_SERIALIZATION_NVP(m_trade) & BOOST_SERIALIZATION_NVP(m_construction) - & BOOST_SERIALIZATION_NVP(m_pop); + & boost::serialization::make_nvp("m_pop", const_cast<Meter&>(m_pop)); } } Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/universe/System.h 2006-02-19 04:12:55 UTC (rev 1762) @@ -287,7 +287,8 @@ } } ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) - & BOOST_SERIALIZATION_NVP(vis); + & BOOST_SERIALIZATION_NVP(vis) + & BOOST_SERIALIZATION_NVP(m_star); if (ALL_OBJECTS_VISIBLE || vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(orbits) Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/universe/Universe.cpp 2006-02-19 04:12:55 UTC (rev 1762) @@ -27,14 +27,52 @@ #include "../server/ServerApp.h" #endif -#include <boost/tuple/tuple.hpp> +#ifdef FREEORION_LINUX +# include <SDL/SDL_byteorder.h> +#else +# include <SDL_byteorder.h> +#endif + +#include <boost/archive/xml_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/filesystem/fstream.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/breadth_first_search.hpp> +#include <boost/iostreams/device/back_inserter.hpp> +#include <boost/iostreams/filtering_stream.hpp> +#include <boost/range/iterator_range.hpp> +#include <boost/serialization/export.hpp> +#include <boost/serialization/list.hpp> +#include <boost/serialization/map.hpp> +#include <boost/serialization/set.hpp> +#include <boost/serialization/vector.hpp> +#include <boost/static_assert.hpp> +#include <boost/tuple/tuple.hpp> #include <cmath> -#include <boost/filesystem/fstream.hpp> #include <stdexcept> + +// exports for boost serialization of polymorphic UniverseObject hierarchy +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) + +// some endianness and size checks to ensure portability of binary save files; of one or more of these fails, it means +// that FreeOrion is not supported on your platform/compiler pair, and must be modified to provide data of the +// appropriate size(s). +BOOST_STATIC_ASSERT(SDL_BYTEORDER == SDL_LIL_ENDIAN); +BOOST_STATIC_ASSERT(sizeof(char) == 1); +BOOST_STATIC_ASSERT(sizeof(short) == 2); +BOOST_STATIC_ASSERT(sizeof(int) == 4); +BOOST_STATIC_ASSERT(sizeof(Uint32) == 4); +BOOST_STATIC_ASSERT(sizeof(long) == 4); +BOOST_STATIC_ASSERT(sizeof(long long) == 8); +BOOST_STATIC_ASSERT(sizeof(float) == 4); +BOOST_STATIC_ASSERT(sizeof(double) == 8); + namespace { // for UniverseObject factory UniverseObject* NewBuilding(const XMLElement& elem) {return new Building(elem);} @@ -883,6 +921,19 @@ m_last_allocated_id = -1; } +const Universe& Universe::operator=(Universe& rhs) +{ + for (ObjectMap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) { + delete it->second; + } + m_objects.clear(); + m_last_allocated_id = rhs.m_last_allocated_id; + m_objects = rhs.m_objects; + rhs.m_objects.clear(); + InitializeSystemGraph(); + return *this; +} + Universe::Universe(const XMLElement& elem) { m_factory.AddGenerator("Building", &NewBuilding); @@ -923,6 +974,14 @@ InitializeSystemGraph(); } +void Universe::SetUniverse(boost::iostreams::filtering_istream& is) +{ + boost::archive::xml_iarchive ia(is); + Universe tmp; + ia >> boost::serialization::make_nvp("universe", tmp); + *this = tmp; +} + const UniverseObject* Universe::Object(int id) const { const_iterator it = m_objects.find(id); @@ -1024,6 +1083,20 @@ return retval; } +std::string Universe::Encode(int empire_id/* = ALL_EMPIRES*/) const +{ + std::string retval; + s_encoding_empire = empire_id; + { + namespace io = boost::iostreams; + io::filtering_ostream os; + os.push(io::back_inserter(retval)); + boost::archive::xml_oarchive oa(os); + oa << boost::serialization::make_nvp("universe", *this); + } + return retval; +} + void Universe::CreateUniverse(int size, Shape shape, Age age, StarlaneFrequency starlane_freq, PlanetDensity planet_density, SpecialsFrequency specials_freq, int players, int ai_players, const std::vector<PlayerSetupData>& player_setup_data/* = std::vector<PlayerSetupData>()*/) Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/universe/Universe.h 2006-02-19 04:12:55 UTC (rev 1762) @@ -40,6 +40,7 @@ #include <boost/graph/filtered_graph.hpp> #endif +#include <boost/iostreams/filtering_stream.hpp> #include <boost/serialization/access.hpp> #include <boost/serialization/nvp.hpp> #include <boost/type_traits/remove_const.hpp> @@ -144,6 +145,7 @@ /** \name Structors */ //@{ Universe(); ///< default ctor Universe(const XMLElement& elem); ///< ctor that constructs a Universe object from an XMLElement. \throw std::invalid_argument May throw std::invalid_argument if \a elem does not encode a Universe object + const Universe& operator=(Universe& rhs); ///< assignment (move semantics) virtual ~Universe(); ///< dtor //@} @@ -201,12 +203,14 @@ std::map<double, System*> ImmediateNeighbors(int system, int empire_id = ALL_EMPIRES) const; virtual XMLElement XMLEncode(int empire_id = ALL_EMPIRES) const; ///< constructs an XMLElement from a Universe object with visibility restrictions for the given empire + std::string Encode(int empire_id = ALL_EMPIRES) const; ///< constructs a serialized representation from a Universe object with visibility restrictions for the given empire mutable UniverseObjectDeleteSignalType UniverseObjectDeleteSignal; ///< the state changed signal object for this UniverseObject //@} /** \name Mutators */ //@{ - void SetUniverse(const XMLElement& elem ); ///< wipes out the current object map and sets the map to the XMLElement passed in. + void SetUniverse(const XMLElement& elem); ///< wipes out the current object map and sets the map to the XMLElement passed in. + void SetUniverse(boost::iostreams::filtering_istream& is); ///< wipes out the current object map and sets the map to the serialized representation in stream \a is. /** inserts object \a obj into the universe; returns the ID number assigned to the object, or -1 on failure. \note Universe gains ownership of \a obj once it is inserted; the caller should \a never delete \a obj after @@ -319,7 +323,6 @@ void PopulateSystems(PlanetDensity density, SpecialsFrequency specials_freq); ///< Will generate planets for all systems that have empty object maps (ie those that aren't homeworld systems) - //old version -- void GenerateStarlanes(StarlaneFrequency freq, const AdjacencyGrid& adjacency_grid); ///< creates starlanes and adds them systems already generated void GenerateStarlanes(StarlaneFrequency freq, const AdjacencyGrid& adjacency_grid); ///< creates starlanes and adds them systems already generated bool ConnectedWithin(int system1, int system2, int maxLaneJumps, std::vector<std::set<int> >& laneSetArray); // used by GenerateStarlanes. Determines if two systems are connected by maxLaneJumps or less edges on graph void CullAngularlyTooCloseLanes(double maxLaneUVectDotProd, std::vector<std::set<int> >& laneSetArray, std::vector<System*> &systems); // Removes lanes from passed graph that are angularly too close to eachother @@ -356,22 +359,31 @@ // template implementations +#if (10 * __GNUC__ + __GNUC_MINOR__ > 33) && (!defined _UniverseObject_h_) +# include "UniverseObject.h" +#endif + template <class Archive> void Universe::serialize(Archive& ar, const unsigned int version) { + ObjectMap objects; + if (Archive::is_saving::value) { + for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { + if (UniverseObject::ALL_OBJECTS_VISIBLE || + it->second->GetVisibility(s_encoding_empire) != UniverseObject::NO_VISIBILITY || + universe_object_cast<System*>(it->second)) + { + objects.insert(*it); + } + } + } ar & BOOST_SERIALIZATION_NVP(s_universe_width) - & BOOST_SERIALIZATION_NVP(m_objects) + & BOOST_SERIALIZATION_NVP(objects) & BOOST_SERIALIZATION_NVP(m_last_allocated_id); + if (Archive::is_loading::value) + m_objects = objects; } -inline std::string UniverseRevision() -{return "$Id$";} - -#if (10*__GNUC__ + __GNUC_MINOR__ > 33) && (!defined _UniverseObject_h_) -# include "UniverseObject.h" -#endif - -// template implementations template <class T> const T* Universe::Object(int id) const { @@ -458,5 +470,7 @@ m_generators[name] = gen; } +inline std::string UniverseRevision() +{return "$Id$";} #endif // _Universe_h_ Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2006-02-18 15:57:42 UTC (rev 1761) +++ trunk/FreeOrion/universe/UniverseObject.h 2006-02-19 04:12:55 UTC (rev 1762) @@ -190,7 +190,7 @@ vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { // We don't disclose the real object name for some types of objects, cinve it would look funny if e.g. the user // saw an incoming enemy cleet called "Decoy". - std::string name = PublicName(); + std::string name = PublicName(Universe::s_encoding_empire); ar & BOOST_SERIALIZATION_NVP(name) & BOOST_SERIALIZATION_NVP(m_owners) & BOOST_SERIALIZATION_NVP(m_specials); |
From: <tz...@us...> - 2006-02-23 23:11:22
|
Revision: 1771 Author: tzlaine Date: 2006-02-23 15:11:08 -0800 (Thu, 23 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1771&view=rev Log Message: ----------- - Rewrote EmpireManager. - Unified Empire::XMLEncode() methods and changed their signature to match XMLEncode() methods of other classes. - Added Serialize.h/cpp, which contains free functions that serialize Empires and Universes; this allows all the serialization code to be placed in one compilation unit. - Moved the ALL_OBJECTS_VISIBLE constant from UniverseObject to Universe. - Fixed a bug in the serialization of the m_orbits member of System. - Updated serialization test code to include checks of binary serialization as well. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/Empire/EmpireManager.cpp trunk/FreeOrion/Empire/EmpireManager.h trunk/FreeOrion/Empire/ServerEmpireManager.cpp trunk/FreeOrion/SConscript trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h Added Paths: ----------- trunk/FreeOrion/util/Serialize.cpp trunk/FreeOrion/util/Serialize.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/Empire/Empire.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -535,6 +535,11 @@ //////////////////////////////////////// // class Empire // //////////////////////////////////////// +Empire::Empire() : + m_id(-1), + m_homeworld_id(-1) +{} + Empire::Empire(const std::string& name, const std::string& player_name, int ID, const GG::Clr& color, int homeworld_id) : m_id(ID), m_name(name), @@ -977,7 +982,7 @@ m_sitrep_entries.clear(); } -XMLElement Empire::XMLEncode() const +XMLElement Empire::XMLEncode(int empire_id/* = Universe::ALL_EMPIRES*/) const { using boost::lexical_cast; @@ -986,85 +991,68 @@ retval.AppendChild(XMLElement("m_name", m_name)); retval.AppendChild(XMLElement("m_player_name", m_player_name)); retval.AppendChild(XMLElement("m_color", ClrToXML(m_color))); - retval.AppendChild(XMLElement("m_homeworld_id", lexical_cast<std::string>(m_homeworld_id))); - retval.AppendChild(XMLElement("m_sitrep_entries")); - for (SitRepItr it = SitRepBegin(); it != SitRepEnd(); ++it) { - retval.LastChild().AppendChild((*it)->XMLEncode()); - } + if (empire_id == m_id || empire_id == Universe::ALL_EMPIRES) { + retval.AppendChild(XMLElement("m_homeworld_id", lexical_cast<std::string>(m_homeworld_id))); - retval.AppendChild(XMLElement("m_ship_designs")); - int i = 0; - for (ShipDesignItr it = ShipDesignBegin(); it != ShipDesignEnd(); ++it) { - retval.LastChild().AppendChild(XMLElement("design" + lexical_cast<std::string>(i++), it->second.XMLEncode())); - } + retval.AppendChild(XMLElement("m_sitrep_entries")); + for (SitRepItr it = SitRepBegin(); it != SitRepEnd(); ++it) { + retval.LastChild().AppendChild((*it)->XMLEncode()); + } - retval.AppendChild(XMLElement("m_explored_systems", StringFromContainer<std::set<int> >(m_explored_systems))); - retval.AppendChild(XMLElement("m_techs")); - i = 0; - for (TechItr it = TechBegin(); it != TechEnd(); ++it) { - retval.LastChild().AppendChild(XMLElement("tech" + lexical_cast<std::string>(i++), *it)); - } + retval.AppendChild(XMLElement("m_ship_designs")); + int i = 0; + for (ShipDesignItr it = ShipDesignBegin(); it != ShipDesignEnd(); ++it) { + retval.LastChild().AppendChild(XMLElement("design" + lexical_cast<std::string>(i++), it->second.XMLEncode())); + } - retval.AppendChild(XMLElement("m_research_queue", m_research_queue.XMLEncode())); - retval.AppendChild(XMLElement("m_research_status")); - for (std::map<std::string, double>::const_iterator it = m_research_status.begin(); it != m_research_status.end(); ++it) { - retval.LastChild().AppendChild(XMLElement(it->first, lexical_cast<std::string>(it->second))); - } + retval.AppendChild(XMLElement("m_explored_systems", StringFromContainer<std::set<int> >(m_explored_systems))); + retval.AppendChild(XMLElement("m_techs")); + i = 0; + for (TechItr it = TechBegin(); it != TechEnd(); ++it) { + retval.LastChild().AppendChild(XMLElement("tech" + lexical_cast<std::string>(i++), *it)); + } - retval.AppendChild(XMLElement("m_production_queue", m_production_queue.XMLEncode())); - retval.AppendChild(XMLElement("m_production_status", StringFromContainer(m_production_status))); + retval.AppendChild(XMLElement("m_research_queue", m_research_queue.XMLEncode())); + retval.AppendChild(XMLElement("m_research_status")); + for (std::map<std::string, double>::const_iterator it = m_research_status.begin(); it != m_research_status.end(); ++it) { + retval.LastChild().AppendChild(XMLElement(it->first, lexical_cast<std::string>(it->second))); + } - retval.AppendChild(XMLElement("m_building_types")); - i = 0; - for (BuildingTypeItr it = BuildingTypeBegin(); it != BuildingTypeEnd(); ++it) { - retval.LastChild().AppendChild(XMLElement("building_type" + lexical_cast<std::string>(i++), *it)); - } + retval.AppendChild(XMLElement("m_production_queue", m_production_queue.XMLEncode())); + retval.AppendChild(XMLElement("m_production_status", StringFromContainer(m_production_status))); - retval.AppendChild(XMLElement("m_mineral_resource_pool", m_mineral_resource_pool.XMLEncode())); - retval.AppendChild(XMLElement("m_food_resource_pool", m_food_resource_pool.XMLEncode())); - retval.AppendChild(XMLElement("m_research_resource_pool", m_research_resource_pool.XMLEncode())); - retval.AppendChild(XMLElement("m_industry_resource_pool", m_industry_resource_pool.XMLEncode())); - retval.AppendChild(XMLElement("m_population_resource_pool", m_population_resource_pool.XMLEncode())); - retval.AppendChild(XMLElement("m_trade_resource_pool", m_trade_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_building_types")); + i = 0; + for (BuildingTypeItr it = BuildingTypeBegin(); it != BuildingTypeEnd(); ++it) { + retval.LastChild().AppendChild(XMLElement("building_type" + lexical_cast<std::string>(i++), *it)); + } - return retval; -} - -XMLElement Empire::XMLEncode(const Empire& viewer) const -{ - // same empire ---> call other version - if (viewer.EmpireID() == this->EmpireID()) - { - return XMLEncode(); + retval.AppendChild(XMLElement("m_mineral_resource_pool", m_mineral_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_food_resource_pool", m_food_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_research_resource_pool", m_research_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_industry_resource_pool", m_industry_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_population_resource_pool", m_population_resource_pool.XMLEncode())); + retval.AppendChild(XMLElement("m_trade_resource_pool", m_trade_resource_pool.XMLEncode())); + } else { + // leave these in, but unpopulated or default-populated + retval.AppendChild(XMLElement("m_homeworld_id")); + retval.AppendChild(XMLElement("m_sitrep_entries")); + retval.AppendChild(XMLElement("m_ship_designs")); + retval.AppendChild(XMLElement("m_explored_systems")); + retval.AppendChild(XMLElement("m_techs")); + retval.AppendChild(XMLElement("m_research_queue", ResearchQueue().XMLEncode())); + retval.AppendChild(XMLElement("m_research_status")); + retval.AppendChild(XMLElement("m_production_queue", ProductionQueue().XMLEncode())); + retval.AppendChild(XMLElement("m_production_status")); + retval.AppendChild(XMLElement("m_building_types")); + retval.AppendChild(XMLElement("m_mineral_resource_pool", MineralResourcePool().XMLEncode())); + retval.AppendChild(XMLElement("m_food_resource_pool", FoodResourcePool().XMLEncode())); + retval.AppendChild(XMLElement("m_research_resource_pool", ResearchResourcePool().XMLEncode())); + retval.AppendChild(XMLElement("m_industry_resource_pool", IndustryResourcePool().XMLEncode())); + retval.AppendChild(XMLElement("m_population_resource_pool", PopulationResourcePool().XMLEncode())); + retval.AppendChild(XMLElement("m_trade_resource_pool", TradeResourcePool().XMLEncode())); } - - using boost::lexical_cast; - - XMLElement retval("Empire"); - retval.AppendChild(XMLElement("m_id", lexical_cast<std::string>(m_id))); - retval.AppendChild(XMLElement("m_name", m_name)); - retval.AppendChild(XMLElement("m_player_name", m_player_name)); - retval.AppendChild(XMLElement("m_color", ClrToXML(m_color))); - - // leave these in, but unpopulated or default-populated - retval.AppendChild(XMLElement("m_homeworld_id")); - retval.AppendChild(XMLElement("m_sitrep_entries")); - retval.AppendChild(XMLElement("m_ship_designs")); - retval.AppendChild(XMLElement("m_explored_systems")); - retval.AppendChild(XMLElement("m_techs")); - retval.AppendChild(XMLElement("m_research_queue", ResearchQueue().XMLEncode())); - retval.AppendChild(XMLElement("m_research_status")); - retval.AppendChild(XMLElement("m_production_queue", ProductionQueue().XMLEncode())); - retval.AppendChild(XMLElement("m_production_status")); - retval.AppendChild(XMLElement("m_building_types")); - retval.AppendChild(XMLElement("m_mineral_resource_pool", MineralResourcePool().XMLEncode())); - retval.AppendChild(XMLElement("m_food_resource_pool", FoodResourcePool().XMLEncode())); - retval.AppendChild(XMLElement("m_research_resource_pool", ResearchResourcePool().XMLEncode())); - retval.AppendChild(XMLElement("m_industry_resource_pool", IndustryResourcePool().XMLEncode())); - retval.AppendChild(XMLElement("m_population_resource_pool", PopulationResourcePool().XMLEncode())); - retval.AppendChild(XMLElement("m_trade_resource_pool", TradeResourcePool().XMLEncode())); - return retval; } Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/Empire/Empire.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -379,30 +379,9 @@ /// Returns the number of production points available to the empire (this is the minimum of current industry and mineral outputs). double ProductionPoints() const; - /// Encodes an empire into an XMLElement - /** - * This method encodes an empire into an XMLElement, which can then - * be transmitted over the network and used by a client to replicate - * the empire object. - * - * This method is used by the Server to generate turn updates. - * - * All data on the empire is encoded. - * - * - */ - XMLElement XMLEncode() const; - - - /// Encodes an empire into an XMLElement, from the perspective of another - /** - * This method encodes the empire into an XMLElement, but includes only - * the information that the specified empire will have access to. - * - * If the viewer has the same empire ID as the host object - * then the return value is the same as the no-arg version of XMLEncode() - */ - XMLElement XMLEncode(const Empire& viewer) const; + /** Encodes the dat of this empire as visible to the empire with id \a empire_id (or all data if \a empire_id == + Universe::ALL_EMPIRES) */ + XMLElement XMLEncode(int empire_id = Universe::ALL_EMPIRES) const; //@} @@ -552,6 +531,7 @@ TradeResourcePool m_trade_resource_pool; friend class boost::serialization::access; + Empire(); template <class Archive> void serialize(Archive& ar, const unsigned int version); }; @@ -617,7 +597,8 @@ & BOOST_SERIALIZATION_NVP(m_name) & BOOST_SERIALIZATION_NVP(m_player_name) & BOOST_SERIALIZATION_NVP(m_color); - if (m_id == Universe::s_encoding_empire) { + if (Universe::ALL_OBJECTS_VISIBLE || + Universe::s_encoding_empire == Universe::ALL_EMPIRES || m_id == Universe::s_encoding_empire) { ar & BOOST_SERIALIZATION_NVP(m_homeworld_id) & BOOST_SERIALIZATION_NVP(m_techs) & BOOST_SERIALIZATION_NVP(m_research_queue) Modified: trunk/FreeOrion/Empire/EmpireManager.cpp =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/Empire/EmpireManager.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -8,30 +8,27 @@ bool temp_source_bool = RecordSourceFile("$Id$"); } - const std::string EmpireManager::EMPIRE_UPDATE_TAG = "EmpireUpdate"; -/** Constructors */ -EmpireManager::EmpireManager() +EmpireManager::~EmpireManager() { - // nothing to do yet + RemoveAllEmpires(); } - - -/** Destructors */ -EmpireManager::~EmpireManager() + +const EmpireManager& EmpireManager::operator=(EmpireManager& rhs) { - // kill 'em all! - EmpireManager::iterator itr = begin(); - while(itr != end()) - { - delete (*itr).second; - itr++; - } + RemoveAllEmpires(); + m_empire_map = rhs.m_empire_map; + rhs.m_empire_map.clear(); + return *this; } - -/** Const Iterators */ +const Empire* EmpireManager::Lookup(int ID) const +{ + const_iterator it = m_empire_map.find(ID); + return it == end() ? 0 : it->second; +} + EmpireManager::const_iterator EmpireManager::begin() const { return m_empire_map.begin(); @@ -42,46 +39,11 @@ return m_empire_map.end(); } - -/** Empire Lookup By ID */ - -/** -* Lookup will look up an empire by its EmpireID -* and return a pointer to that empire, if it exists in teh manager -* or NULL if it does not. (This one is the const version) -*/ -const Empire* EmpireManager::Lookup(int ID) const -{ - const_iterator itr = m_empire_map.find(ID); - - if(itr == end()) - { - return NULL; - } - - return (*itr).second; - -} -/** -* Lookup will look up an empire by its EmpireID -* and return a pointer to that empire, if it exists in teh manager -* or NULL if it does not -*/ Empire* EmpireManager::Lookup(int ID) { - iterator itr = m_empire_map.find(ID); - - if(itr == end()) - { - return NULL; - } - - return (*itr).second; + iterator it = m_empire_map.find(ID); + return it == end() ? 0 : it->second; } - - - -/** Non-Const Iterators */ EmpireManager::iterator EmpireManager::begin() { @@ -93,57 +55,34 @@ return m_empire_map.end(); } - -bool EmpireManager::UpdateEmpireStatus(int empireID, - std::string &name, - GG::Clr color) +XMLElement EmpireManager::XMLEncode(int empire_id/* = Universe::ALL_EMPIRES*/) { - Empire* emp = Lookup(empireID); - - if(emp != NULL) - { - emp->SetName(name); - emp->SetColor(color); - - return true; + XMLElement retval("EmpireManager"); + for (EmpireManager::iterator it = begin(); it != end(); ++it) { + retval.AppendChild(XMLElement("Empire" + boost::lexical_cast<std::string>(it->second->EmpireID()), it->second->XMLEncode(empire_id))); } - else - { - return false; - } - + return retval; } - - -/** -* InsertEmpire adds the given empire to the manager's map -* -*/ void EmpireManager::InsertEmpire(Empire* empire) { - if(empire != NULL) - { - std::pair<int, Empire*> newpair(empire->EmpireID(), empire); - m_empire_map.insert(newpair); + if (empire) { + assert(!m_empire_map[empire->EmpireID()]); + m_empire_map[empire->EmpireID()] = empire; } } -/** -* RemoveEmpire removes the given empire from the manager's map -*/ void EmpireManager::RemoveEmpire(Empire* empire) { - if(empire != NULL) - { + if (empire) m_empire_map.erase(empire->EmpireID()); - } } void EmpireManager::RemoveAllEmpires() { - for(EmpireManager::iterator itr = begin(); itr != end(); itr++) - delete itr->second; + for (EmpireManager::iterator it = begin(); it != end(); ++it) { + delete it->second; + } m_empire_map.clear(); } Modified: trunk/FreeOrion/Empire/EmpireManager.h =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/Empire/EmpireManager.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -3,6 +3,8 @@ #define _EmpireManager_h_ #include "Empire.h" + +#include "../universe/Universe.h" #include "../util/XMLDoc.h" #ifndef _GG_Clr_h_ @@ -14,119 +16,51 @@ #include <string> -/** -* Base class for Empire managers. The Empire Manager -* maintains all of the Empire Objects that will exist in FreeOrion -* -* There are client and server versions. -* - The server version is able to generate XML updates for clients -* - The client version is able to process those updates -* -*/ +/** Maintains all of the Empire objects that exist in the application. */ class EmpireManager { public: - /** \name Iterator types */ //@{ /// Iterator over Empires typedef std::map<int, Empire*>::iterator iterator; /// Const Iterator over Empires typedef std::map<int, Empire*>::const_iterator const_iterator; - //@} - /** \name Constructors */ //@{ - /// Default Constructor - EmpireManager(); + /** \name Structors */ //@{ + virtual ~EmpireManager(); ///< virtual dtor + const EmpireManager& operator=(EmpireManager& rhs); ///< assignment operator (move semantics) //@} - /** \name Destructors */ //@{ - /// Virtual Destructor - Deallocates all Empires - /** Deallocates all empires that exist in the manager. */ - virtual ~EmpireManager(); - //@} + /** \name Accessors */ //@{ + /** Returns the empire whose ID is \a ID, or 0 if none exists. */ + const Empire* Lookup(int ID) const; - /** \name Const Iterators */ //@{ - /** - * Returns a const iterator pointing at the first empire - * in the manager. - */ const_iterator begin() const; - /** - * Returns a const iterator which is past the end of - * the list of empires. - */ const_iterator end() const; //@} - /** \name Empire Lookup By ID */ //@{ - - /// Provides read-only access to empires stored in the manager. - /** - * Lookup will look up an empire by its EmpireID - * and return a pointer to that empire, if it exists in the manager, - * or NULL if it does not. - */ - const Empire* Lookup(int ID) const; - - /// Provides full access to empires stored in the manager. - /** - * Lookup will look up an empire by its EmpireID - * and return a pointer to that empire, if it exists in the manager, - * or NULL if it does not - */ + /** \name Mutators */ //@{ + /** Returns the empire whose ID is \a ID, or 0 if none exists. */ Empire* Lookup(int ID); - //@} - /** \name Non-Const Iterators */ //@{ - /** - * Returns an iterator pointing at the first empire - * in the manager. - */ iterator begin(); - /** - * Returns an iterator which is past the end of - * the list of empires. - */ iterator end(); //@} - /// Changes the properties of an empire, if it exists. - /** - * UpdateEmpireStatus changes the id, name, or color - * of the empire whose ID equals empireID. Returns true if successful - * false if not. If the empire manager does not have an empire object - * for the specified empire this method will return false. - * - */ - virtual bool UpdateEmpireStatus(int empireID, - std::string &name, - GG::Clr color); - - /** \name Constants */ //@{ /// Tag for empire update XMLElements static const std::string EMPIRE_UPDATE_TAG; + XMLElement XMLEncode(int empire_id = Universe::ALL_EMPIRES); - /** - * Adds the given empire to the manager's map. Does not modify the - * given empire object, or any others. - * - */ + /** Adds the given empire to the manager. */ void InsertEmpire(Empire* empire); - /** - * Removes the given empire from the manager's map. Does - * not modify the given empire object, or any others. - */ + /** Removes the given empire from the manager. */ void RemoveEmpire(Empire* empire); - /** - * Removes all empires from the manager's map and deallocates those empires. - * - */ + /** Removes and deletes all empires from the manager. */ void RemoveAllEmpires(); private: - // map of IDs to empires for fast lookup std::map<int, Empire*> m_empire_map; friend class boost::serialization::access; Modified: trunk/FreeOrion/Empire/ServerEmpireManager.cpp =================================================================== --- trunk/FreeOrion/Empire/ServerEmpireManager.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/Empire/ServerEmpireManager.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -68,7 +68,7 @@ for (EmpireManager::iterator it = begin(); it != end(); ++it) { XMLElement current_empire("Empire" + boost::lexical_cast<std::string>(it->second->EmpireID())); - current_empire.AppendChild(it->second->XMLEncode(*emp)); + current_empire.AppendChild(it->second->XMLEncode(emp->EmpireID())); this_turn.AppendChild(current_empire); } Modified: trunk/FreeOrion/SConscript =================================================================== --- trunk/FreeOrion/SConscript 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/SConscript 2006-02-23 23:11:08 UTC (rev 1771) @@ -36,6 +36,7 @@ 'util/Process.cpp', 'util/Random.cpp', 'util/SitRepEntry.cpp', + 'util/Serialize.cpp', 'util/VarText.cpp', 'util/binreloc.c', 'util/Directories.cpp', Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -31,6 +31,16 @@ #include <sstream> +#define TEST_UNIVERSE_BOOST_SERIALIZATION 0 +#define TEST_BINARY_ARCHIVES 1 +#if TEST_UNIVERSE_BOOST_SERIALIZATION +#include "../../util/Serialize.h" +#include <boost/iostreams/device/back_inserter.hpp> +#include <boost/iostreams/filtering_stream.hpp> +#include <boost/range/iterator_range.hpp> +#endif + + #ifdef ENABLE_CRASH_BACKTRACE # include <signal.h> # include <execinfo.h> @@ -796,24 +806,41 @@ m_universe.SetUniverse(doc.root_node.Child("Universe")); -#define TEST_UNIVERSE_BOOST_SERIALIZATION 0 #if TEST_UNIVERSE_BOOST_SERIALIZATION - Universe boost_xml_universe; namespace io = boost::iostreams; std::string boost_xml_filename = (GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(m_empire_id) + "-boost.xml")).native_file_string(); + std::string boost_binary_filename = (GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(m_empire_id) + "-boost.bin")).native_file_string(); io::filtering_istream is; +#if TEST_BINARY_ARCHIVES + is.push(io::file_source(boost_binary_filename, std::ios_base::in | std::ios_base::binary)); + boost::archive::binary_iarchive ia(is); +#else is.push(io::file_source(boost_xml_filename)); - boost_xml_universe.SetUniverse(is); + boost::archive::xml_iarchive ia(is); +#endif + bool boost_xml_single_player_game; + Universe boost_xml_universe; + EmpireManager boost_xml_empire_manager; + Universe::s_encoding_empire = m_empire_id; + ia >> boost::serialization::make_nvp("single_player_game", boost_xml_single_player_game); + Deserialize(&ia, boost_xml_universe); + Deserialize(&ia, boost_xml_empire_manager); + assert(boost_xml_single_player_game == m_single_player_game); + { XMLDoc doc; doc.root_node.AppendChild(m_universe.XMLEncode()); + doc.root_node.AppendChild(m_empires.XMLEncode(m_empire_id)); + doc.root_node.AppendChild(m_empires.XMLEncode()); std::ofstream ofs("Univese_XMLDoc.xml"); doc.WriteDoc(ofs); } { XMLDoc doc; doc.root_node.AppendChild(boost_xml_universe.XMLEncode()); + doc.root_node.AppendChild(boost_xml_empire_manager.XMLEncode(m_empire_id)); + doc.root_node.AppendChild(boost_xml_empire_manager.XMLEncode()); std::ofstream ofs("Univese_Boost_Serialization.xml"); doc.WriteDoc(ofs); } Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -1,12 +1,3 @@ -#define TEST_BINARY_ARCHIVES 0 -#if TEST_BINARY_ARCHIVES -#include <boost/archive/binary_oarchive.hpp> -#include <boost/archive/binary_iarchive.hpp> -#else -#include <boost/archive/xml_oarchive.hpp> -#include <boost/archive/xml_iarchive.hpp> -#endif - #include "ServerApp.h" #include "../combat/CombatSystem.h" @@ -76,39 +67,16 @@ # define GZIP_SAVE_FILES_COMPRESSION_LEVEL 0 #endif -#include "../universe/ShipDesign.h" +#define TEST_UNIVERSE_BOOST_SERIALIZATION 0 +#define TEST_BINARY_ARCHIVES 1 +#if TEST_UNIVERSE_BOOST_SERIALIZATION +#include "../util/Serialize.h" #include <boost/iostreams/device/back_inserter.hpp> #include <boost/iostreams/filtering_stream.hpp> #include <boost/range/iterator_range.hpp> -#include <boost/serialization/export.hpp> -#include <boost/serialization/deque.hpp> -#include <boost/serialization/list.hpp> -#include <boost/serialization/map.hpp> -#include <boost/serialization/set.hpp> -#include <boost/serialization/vector.hpp> -#include <boost/static_assert.hpp> +#endif -// exports for boost serialization of polymorphic UniverseObject hierarchy -BOOST_CLASS_EXPORT(System) -BOOST_CLASS_EXPORT(Planet) -BOOST_CLASS_EXPORT(Building) -BOOST_CLASS_EXPORT(Fleet) -BOOST_CLASS_EXPORT(Ship) -// some endianness and size checks to ensure portability of binary save files; of one or more of these fails, it means -// that FreeOrion is not supported on your platform/compiler pair, and must be modified to provide data of the -// appropriate size(s). -BOOST_STATIC_ASSERT(SDL_BYTEORDER == SDL_LIL_ENDIAN); -BOOST_STATIC_ASSERT(sizeof(char) == 1); -BOOST_STATIC_ASSERT(sizeof(short) == 2); -BOOST_STATIC_ASSERT(sizeof(int) == 4); -BOOST_STATIC_ASSERT(sizeof(Uint32) == 4); -BOOST_STATIC_ASSERT(sizeof(long) == 4); -BOOST_STATIC_ASSERT(sizeof(long long) == 8); -BOOST_STATIC_ASSERT(sizeof(float) == 4); -BOOST_STATIC_ASSERT(sizeof(double) == 8); - - namespace { const std::string SAVE_FILE_EXTENSION = ".mps"; const std::string SAVE_DIR_NAME = "save/"; @@ -1456,7 +1424,6 @@ AddEmpireTurn( it->first ); } -#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 #if TEST_UNIVERSE_BOOST_SERIALIZATION { Universe::s_encoding_empire = Universe::ALL_EMPIRES; @@ -1470,13 +1437,12 @@ #else boost::archive::xml_oarchive oa(os); #endif - const EmpireManager& empire_manager = m_empires; - oa << boost::serialization::make_nvp("single_player_game", m_single_player_game) - << BOOST_SERIALIZATION_NVP(m_universe) - << boost::serialization::make_nvp("m_empires", empire_manager); + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game); + Serialize(&oa, m_universe); + Serialize(&oa, m_empires); } #if TEST_BINARY_ARCHIVES - boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-boost.bin")); + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-boost.bin"), std::ios_base::in | std::ios_base::binary); #else boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-boost.xml")); #endif @@ -1506,14 +1472,12 @@ #else boost::archive::xml_oarchive oa(os); #endif - const EmpireManager& empire_manager = m_empires; - oa << boost::serialization::make_nvp("single_player_game", m_single_player_game) - << boost::serialization::make_nvp("m_empire_id", it->first) - << BOOST_SERIALIZATION_NVP(m_universe) - << boost::serialization::make_nvp("m_empires", empire_manager); + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game); + Serialize(&oa, m_universe); + Serialize(&oa, m_empires); } #if TEST_BINARY_ARCHIVES - boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.bin")); + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.bin"), std::ios_base::in | std::ios_base::binary); #else boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.xml")); #endif Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Fleet.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -62,9 +62,9 @@ UniverseObject::Visibility Fleet::GetVisibility(int empire_id) const { - if (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) + if (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) { return FULL_VISIBILITY; - else { + } else { // A fleet is visible to another player, iff // the previous system on the route or the next system on the route // is visible to the player. @@ -86,7 +86,7 @@ { // Disclose real fleet name only to fleet owners. Rationale: a player might become suspicious if the incoming // foreign fleet is called "Decoy" - if (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) + if (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) return Name(); else return UserString("FW_FOREIGN_FLEET"); @@ -102,7 +102,7 @@ // Disclose real fleet name only to fleet owners. Rationale: a player // might become suspicious if the incoming foreign fleet is called "Decoy" - if (!ALL_OBJECTS_VISIBLE && + if (!Universe::ALL_OBJECTS_VISIBLE && empire_id != Universe::ALL_EMPIRES && !OwnedBy(empire_id)) { retval.Child("UniverseObject").Child("m_name").SetText(UserString("FW_FOREIGN_FLEET")); // the player also only sees the immediate destination of the fleet, Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Fleet.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -110,7 +110,7 @@ bool visible; int moving_to; if (Archive::is_saving::value) - visible = ALL_OBJECTS_VISIBLE || Universe::s_encoding_empire == Universe::ALL_EMPIRES || OwnedBy(Universe::s_encoding_empire); + visible = Universe::ALL_OBJECTS_VISIBLE || Universe::s_encoding_empire == Universe::ALL_EMPIRES || OwnedBy(Universe::s_encoding_empire); ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_NVP(visible); if (Archive::is_saving::value) Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Planet.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -140,7 +140,7 @@ & BOOST_SERIALIZATION_NVP(m_type) & BOOST_SERIALIZATION_NVP(m_size) & BOOST_SERIALIZATION_NVP(m_just_conquered); - if (ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_buildings) & BOOST_SERIALIZATION_NVP(m_available_trade) Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/ResourceCenter.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -111,7 +111,7 @@ vis = object->GetVisibility(Universe::s_encoding_empire); } ar & BOOST_SERIALIZATION_NVP(vis); - if (UniverseObject::ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || vis == UniverseObject::FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_primary) & BOOST_SERIALIZATION_NVP(m_secondary) Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Ship.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -73,7 +73,7 @@ { UniverseObject::Visibility vis = NO_VISIBILITY; - if (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) + if (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) vis = FULL_VISIBILITY; else vis = PARTIAL_VISIBILITY; // TODO: do something smarter here, such as a range check vs. owned systems and fleets @@ -91,7 +91,7 @@ { // Disclose real ship name only to fleet owners. Rationale: a player who doesn't know the design for a particular // ship can easily guess it if the ship's name is "Scout" - if (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) + if (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) return Name(); else return UserString("FW_FOREIGN_SHIP"); Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/System.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -23,8 +23,7 @@ UniverseObject(), m_star(INVALID_STAR_TYPE), m_orbits(0) -{ -} +{} System::System(StarType star, int orbits, const std::string& name, double x, double y, const std::set<int>& owners/* = std::set<int>()*/) : @@ -203,7 +202,7 @@ // if system is at least partially owned by this empire it is fully visible, if it has been explored it is partially visible, // and otherwise it will be partially visible Empire* empire = 0; - if (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) + if (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || OwnedBy(empire_id)) return FULL_VISIBILITY; else if ((empire = Empires().Lookup(empire_id)) && empire->HasExploredSystem(ID())) return PARTIAL_VISIBILITY; Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/System.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -275,7 +275,7 @@ StarlaneMap starlanes_wormholes; if (Archive::is_saving::value) { vis = GetVisibility(Universe::s_encoding_empire); - if (ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) { orbits = m_orbits; objects = m_objects; @@ -289,11 +289,13 @@ ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_star); - if (ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(orbits) & BOOST_SERIALIZATION_NVP(objects) & BOOST_SERIALIZATION_NVP(starlanes_wormholes); + } else { + orbits = 0; } if (Archive::is_loading::value) { m_orbits = orbits; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Universe.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -874,6 +874,7 @@ // class Universe ///////////////////////////////////////////// // static(s) +const bool Universe::ALL_OBJECTS_VISIBLE = false; double Universe::s_universe_width = 1000.0; bool Universe::s_inhibit_universe_object_signals = false; int Universe::s_encoding_empire = Universe::ALL_EMPIRES; Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/Universe.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -120,7 +120,10 @@ NUM_SPECIALS_FREQENCIES // keep this last, the number of specials frequency options }; - /** the value passed to XMLEncode() when the entire object is desired, not just the portion visible to one empire */ + /** Set to true to make everything visible for everyone. Useful for debugging. */ + static const bool ALL_OBJECTS_VISIBLE; + + /** the value used for the encoding empire when all data are desired, not just those visible to one empire */ enum {ALL_EMPIRES = -1}; struct vertex_system_pointer_t {typedef boost::vertex_property_tag kind;}; ///< a system graph property map type @@ -367,7 +370,7 @@ ObjectMap objects; if (Archive::is_saving::value) { for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (UniverseObject::ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || it->second->GetVisibility(s_encoding_empire) != UniverseObject::NO_VISIBILITY || universe_object_cast<System*>(it->second)) { Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -143,7 +143,7 @@ UniverseObject::Visibility UniverseObject::GetVisibility(int empire_id) const { - return (ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || m_owners.find(empire_id) != m_owners.end()) ? FULL_VISIBILITY : NO_VISIBILITY; + return (Universe::ALL_OBJECTS_VISIBLE || empire_id == Universe::ALL_EMPIRES || m_owners.find(empire_id) != m_owners.end()) ? FULL_VISIBILITY : NO_VISIBILITY; } const std::string& UniverseObject::PublicName(int empire_id) const Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2006-02-23 19:25:41 UTC (rev 1770) +++ trunk/FreeOrion/universe/UniverseObject.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -46,9 +46,6 @@ class UniverseObject { public: - /// Set to true to make everything visible for everyone. Useful for debugging - static const bool ALL_OBJECTS_VISIBLE = false; - /** the three different visibility levels */ enum Visibility { FULL_VISIBILITY, @@ -186,11 +183,14 @@ & BOOST_SERIALIZATION_NVP(m_x) & BOOST_SERIALIZATION_NVP(m_y) & BOOST_SERIALIZATION_NVP(m_system_id); - if (ALL_OBJECTS_VISIBLE || + if (Universe::ALL_OBJECTS_VISIBLE || vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { - // We don't disclose the real object name for some types of objects, cinve it would look funny if e.g. the user - // saw an incoming enemy cleet called "Decoy". - std::string name = PublicName(Universe::s_encoding_empire); + std::string name; + if (Archive::is_saving::value) { + // We don't disclose the real object name for some types of objects, cinve it would look funny if e.g. the user + // saw an incoming enemy cleet called "Decoy". + name = PublicName(Universe::s_encoding_empire); + } ar & BOOST_SERIALIZATION_NVP(name) & BOOST_SERIALIZATION_NVP(m_owners) & BOOST_SERIALIZATION_NVP(m_specials); Added: trunk/FreeOrion/util/Serialize.cpp =================================================================== --- trunk/FreeOrion/util/Serialize.cpp (rev 0) +++ trunk/FreeOrion/util/Serialize.cpp 2006-02-23 23:11:08 UTC (rev 1771) @@ -0,0 +1,92 @@ +#include "Serialize.h" + +#include "../Empire/Empire.h" +#include "../Empire/EmpireManager.h" +#include "../universe/Building.h" +#include "../universe/Fleet.h" +#include "../universe/Planet.h" +#include "../universe/Predicates.h" +#include "../universe/ShipDesign.h" +#include "../universe/Special.h" +#include "../universe/System.h" + +#include "SDL_byteorder.h" + +#include <boost/serialization/export.hpp> +#include <boost/serialization/deque.hpp> +#include <boost/serialization/list.hpp> +#include <boost/serialization/map.hpp> +#include <boost/serialization/set.hpp> +#include <boost/serialization/vector.hpp> +#include <boost/static_assert.hpp> +#include <boost/variant/get.hpp> + + +// exports for boost serialization of polymorphic UniverseObject hierarchy +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) + +// some endianness and size checks to ensure portability of binary save files; of one or more of these fails, it means +// that FreeOrion is not supported on your platform/compiler pair, and must be modified to provide data of the +// appropriate size(s). +BOOST_STATIC_ASSERT(SDL_BYTEORDER == SDL_LIL_ENDIAN); +BOOST_STATIC_ASSERT(sizeof(char) == 1); +BOOST_STATIC_ASSERT(sizeof(short) == 2); +BOOST_STATIC_ASSERT(sizeof(int) == 4); +BOOST_STATIC_ASSERT(sizeof(Uint32) == 4); +BOOST_STATIC_ASSERT(sizeof(long) == 4); +BOOST_STATIC_ASSERT(sizeof(long long) == 8); +BOOST_STATIC_ASSERT(sizeof(float) == 4); +BOOST_STATIC_ASSERT(sizeof(double) == 8); + + +void Serialize(OArchivePtr oa, const Empire& empire) +{ + if (oa.which()) + *boost::get<boost::archive::xml_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(empire); + else + *boost::get<boost::archive::binary_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(empire); +} + +void Serialize(OArchivePtr oa, const EmpireManager& empire_manager) +{ + if (oa.which()) + *boost::get<boost::archive::xml_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(empire_manager); + else + *boost::get<boost::archive::binary_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(empire_manager); +} + +void Serialize(OArchivePtr oa, const Universe& universe) +{ + if (oa.which()) + *boost::get<boost::archive::xml_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(universe); + else + *boost::get<boost::archive::binary_oarchive*>(oa) << BOOST_SERIALIZATION_NVP(universe); +} + +void Deserialize(IArchivePtr ia, Empire& empire) +{ + if (ia.which()) + *boost::get<boost::archive::xml_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(empire); + else + *boost::get<boost::archive::binary_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(empire); +} + +void Deserialize(IArchivePtr ia, EmpireManager& empire_manager) +{ + if (ia.which()) + *boost::get<boost::archive::xml_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(empire_manager); + else + *boost::get<boost::archive::binary_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(empire_manager); +} + +void Deserialize(IArchivePtr ia, Universe& universe) +{ + if (ia.which()) + *boost::get<boost::archive::xml_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(universe); + else + *boost::get<boost::archive::binary_iarchive*>(ia) >> BOOST_SERIALIZATION_NVP(universe); +} Added: trunk/FreeOrion/util/Serialize.h =================================================================== --- trunk/FreeOrion/util/Serialize.h (rev 0) +++ trunk/FreeOrion/util/Serialize.h 2006-02-23 23:11:08 UTC (rev 1771) @@ -0,0 +1,41 @@ +// -*- C++ -*- +#ifndef _Serialize_h_ +#define _Serialize_h_ + +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> +#include <boost/variant/variant.hpp> + +class Empire; +class EmpireManager; +class Universe; + +/** The type used to refer to an input archive, whether binary or XML. */ +typedef boost::variant<boost::archive::binary_iarchive*, + boost::archive::xml_iarchive*> IArchivePtr; + +/** The type used to refer to an output archive, whether binary or XML. */ +typedef boost::variant<boost::archive::binary_oarchive*, + boost::archive::xml_oarchive*> OArchivePtr; + +/** Serializes the single empire \a empire to output archive \a oa. */ +void Serialize(OArchivePtr oa, const Empire& empire); + +/** Serializes \a empire_empire, including all its Empires, to output archive \a oa. */ +void Serialize(OArchivePtr oa, const EmpireManager& empire_manager); + +/** Serializes \a universe to output archive \a oa. */ +void Serialize(OArchivePtr oa, const Universe& universe); + +/** Deserializes the single empire \a empire from input archive \a ia. */ +void Deserialize(IArchivePtr ia, Empire& empire); + +/** Deserializes \a empire_empire, including all its Empires, from input archive \a ia. */ +void Deserialize(IArchivePtr ia, EmpireManager& empire_manager); + +/** Deserializes \a universe from input archive \a ia. */ +void Deserialize(IArchivePtr ia, Universe& universe); + +#endif // _Serialize_h_ |
From: <de...@us...> - 2006-03-01 15:55:20
|
Revision: 1777 Author: dennis Date: 2006-03-01 07:54:51 -0800 (Wed, 01 Mar 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1777&view=rev Log Message: ----------- Split out sound system to be able to incorporate OpenAL as an alternative. Modified Paths: -------------- trunk/FreeOrion/SConscript trunk/FreeOrion/build_support.py trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/client/human/HumanClientApp.h trunk/FreeOrion/client/human/chmain.cpp Added Paths: ----------- trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.cpp trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.h Modified: trunk/FreeOrion/SConscript =================================================================== --- trunk/FreeOrion/SConscript 2006-02-26 11:32:03 UTC (rev 1776) +++ trunk/FreeOrion/SConscript 2006-03-01 15:54:51 UTC (rev 1777) @@ -70,6 +70,8 @@ target_sources = [ 'client/ClientApp.cpp', 'client/human/HumanClientApp.cpp', + 'client/human/HumanClientAppSoundFMOD.cpp', +# 'client/human/HumanClientAppSoundOpenAL.cpp', 'client/human/chmain.cpp', 'network/ClientNetworkCore.cpp', 'UI/About.cpp', Modified: trunk/FreeOrion/build_support.py =================================================================== --- trunk/FreeOrion/build_support.py 2006-02-26 11:32:03 UTC (rev 1776) +++ trunk/FreeOrion/build_support.py 2006-03-01 15:54:51 UTC (rev 1777) @@ -189,14 +189,14 @@ f = open(os.path.normpath(os.path.join(i, filename)), 'r') break except Exception: - None + pass if not f: for i in ['.', '/usr/include', '/usr/local/include']: try: f = open(os.path.normpath(os.path.join(i, filename)), 'r') break except Exception: - None + pass if f: return regex.findall(f.read()) else: Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-26 11:32:03 UTC (rev 1776) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-03-01 15:54:51 UTC (rev 1777) @@ -16,9 +16,6 @@ #include "../../util/Directories.h" #include "../../util/XMLDoc.h" -#include <fmod.h> -#include <fmod_errors.h> - #include <log4cpp/Appender.hh> #include <log4cpp/Category.hh> #include <log4cpp/PatternLayout.hh> @@ -94,107 +91,6 @@ } bool temp_bool = RegisterOptions(&AddOptions); - enum SoundDriver { - SOUND_DRIVER_NOSOUND = FSOUND_OUTPUT_NOSOUND, - SOUND_DRIVER_DIRECT_SOUND = FSOUND_OUTPUT_DSOUND, - SOUND_DRIVER_WINDOWS_MULTIMEDIA_WAVEOUT = FSOUND_OUTPUT_WINMM, - SOUND_DRIVER_ASIO = FSOUND_OUTPUT_ASIO, - SOUND_DRIVER_OSS = FSOUND_OUTPUT_OSS, - SOUND_DRIVER_ESD = FSOUND_OUTPUT_ESD, - SOUND_DRIVER_ALSA = FSOUND_OUTPUT_ALSA - }; - - /** Assumes that sound has not been initialized! */ - std::vector<SoundDriver> GetSoundDrivers() - { - std::vector<SoundDriver> retval; - -#if defined(FREEORION_WIN32) - if (FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_DIRECT_SOUND); - if (FSOUND_SetOutput(FSOUND_OUTPUT_WINMM) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_WINDOWS_MULTIMEDIA_WAVEOUT); - if (FSOUND_SetOutput(FSOUND_OUTPUT_ASIO) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_ASIO); -#elif defined(FREEORION_LINUX) - if (FSOUND_SetOutput(FSOUND_OUTPUT_ALSA) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_ALSA); - if (FSOUND_SetOutput(FSOUND_OUTPUT_OSS) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_OSS); - if (FSOUND_SetOutput(FSOUND_OUTPUT_ESD) && FSOUND_GetNumDrivers()) - retval.push_back(SOUND_DRIVER_ESD); -#endif - - FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND); - - return retval; - } - - void InitFMOD(unsigned int channels = 64, unsigned int memory_size = 4*1024*1024) - { - const int SAMPLE_FREQ = 44100; - - assert(0 < channels); - assert((memory_size % 512) == 0); - - log4cpp::Category& logger = HumanClientApp::GetApp()->Logger(); - - if (FSOUND_GetVersion() < FMOD_VERSION) { - logger.errorStream() << "InitFMOD() : You are using the wrong version of the FMOD DLL! This program was built with FMOD " << FMOD_VERSION; - } - - if (!FSOUND_SetMemorySystem(malloc(memory_size), memory_size, 0, 0, 0)) { - logger.errorStream() << "InitFMOD() : Error initializing FMOD memory; FMOD error was \"" << FMOD_ErrorString(FSOUND_GetError()) << "\""; - } - - FSOUND_SetOutput(-1); - FSOUND_SetDriver(0); - SoundDriver default_sound_driver = static_cast<SoundDriver>(FSOUND_GetOutput()); - bool success = true; - if (!FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { - success = false; - // first chance: try all other devices for this output driver - int num_devices = FSOUND_GetNumDrivers(); - for (int i = 1; i < num_devices; ++i) { // start at 1, since 0 obviously didn't work - FSOUND_SetDriver(i); - if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { - success = true; - break; - } - } - // second chance: try other output drivers's devices - if (!success) { - std::vector<SoundDriver> sound_drivers = GetSoundDrivers(); - std::vector<SoundDriver>::iterator it = std::find(sound_drivers.begin(), sound_drivers.end(), default_sound_driver); - if (it != sound_drivers.end()) { - sound_drivers.erase(it); - } - for (unsigned int i = 0; i < sound_drivers.size(); ++i) { - FSOUND_SetOutput(sound_drivers[i]); - num_devices = FSOUND_GetNumDrivers(); - for (int j = 0; j < num_devices; ++j) { - FSOUND_SetDriver(j); - if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { - success = true; - break; - } - } - } - } - } - - if (!success) { - FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND); - FSOUND_SetDriver(0); - if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { - logger.errorStream() << "InitFMOD() : No suitable sound configuration could be found ... sound disabled"; - } else { - logger.errorStream() << "InitFMOD() : No suitable sound configuration could be found, and FSOUND_Init() failed even with " - "FSOUND_OUTPUT_NOSOUND as the output (sound disabled); FMOD error was \"" << FMOD_ErrorString(FSOUND_GetError()) << "\""; - } - } - } - bool temp_header_bool = RecordHeaderFile(HumanClientAppRevision()); bool temp_source_bool = RecordSourceFile("$Id$"); } @@ -204,10 +100,6 @@ SDLGUI(GetOptionsDB().Get<int>("app-width"), GetOptionsDB().Get<int>("app-height"), false, "freeorion"), - m_current_music(0), - m_music_channel(-1), - m_music_loops(0), - m_next_music_time(0), m_single_player_game(true), m_game_started(false), m_turns_since_autosave(0), @@ -317,83 +209,6 @@ m_multiplayer_lobby_wnd = lobby; } -void HumanClientApp::PlayMusic(const std::string& filename, int loops) -{ - StopMusic(); - m_current_music = FSOUND_Stream_Open(filename.c_str(), FSOUND_2D, 0, 0); - m_music_channel = FSOUND_Stream_Play(FSOUND_FREE, m_current_music); - FSOUND_SetVolumeAbsolute(m_music_channel, GetOptionsDB().Get<int>("music-volume")); - m_music_loops = loops; - m_next_music_time = m_music_loops ? GG::GUI::GetGUI()->Ticks() + FSOUND_Stream_GetLengthMs(m_current_music) : 0; - m_music_name = filename; -} - -void HumanClientApp::StopMusic() -{ - if (m_current_music) { - FSOUND_Stream_Close(m_current_music); - m_current_music = 0; - m_music_channel = -1; - m_next_music_time = 0; - m_music_loops = 0; - } -} - -void HumanClientApp::PlaySound(const std::string& filename) -{ - std::map<std::string, int>::iterator it = m_sounds.find(filename); - if (it != m_sounds.end()) { - if (FSOUND_SAMPLE* sample = FSOUND_Sample_Get(it->second)) - FSOUND_PlaySound(FSOUND_FREE, sample); - } else { - int first_available_sample_slot = 0; - std::set<int>::iterator used_index_it = m_used_sample_indices.begin(); - while (used_index_it != m_used_sample_indices.end() && *used_index_it == first_available_sample_slot) { - ++first_available_sample_slot; - ++used_index_it; - } - if (FSOUND_SAMPLE* sample = FSOUND_Sample_Load(first_available_sample_slot, filename.c_str(), 0, 0, 0)) { - m_sounds[filename] = first_available_sample_slot; - m_used_sample_indices.insert(first_available_sample_slot); - FSOUND_PlaySound(FSOUND_FREE, sample); - } - } -} - -void HumanClientApp::FreeSound(const std::string& filename) -{ - std::map<std::string, int>::iterator it = m_sounds.find(filename); - if (it != m_sounds.end()) { - FSOUND_Sample_Free(FSOUND_Sample_Get(it->second)); - m_used_sample_indices.erase(it->second); - m_sounds.erase(it); - } -} - -void HumanClientApp::FreeAllSounds() -{ - for (std::map<std::string, int>::iterator it = m_sounds.begin(); it != m_sounds.end(); ++it) { - FSOUND_Sample_Free(FSOUND_Sample_Get(it->second)); - } - m_used_sample_indices.clear(); - m_sounds.clear(); -} - -void HumanClientApp::SetMusicVolume(int vol) -{ - vol = std::max(0, std::min(vol, 255)); - if (m_music_channel != -1) - FSOUND_SetVolumeAbsolute(m_music_channel, vol); - GetOptionsDB().Set<int>("music-volume", vol); -} - -void HumanClientApp::SetUISoundsVolume(int vol) -{ - vol = std::max(0, std::min(vol, 255)); - FSOUND_SetSFXMasterVolume(vol); - GetOptionsDB().Set<int>("UI.sound.volume", vol); -} - bool HumanClientApp::LoadSinglePlayerGame() { std::vector<std::pair<std::string, std::string> > save_file_types; @@ -540,8 +355,6 @@ SDL_WM_SetCaption("FreeOrion v0.3", "FreeOrion v0.3"); - InitFMOD(); - if (SDLNet_Init() < 0) { Logger().errorStream() << "SDL Net initialization failed: " << SDLNet_GetError(); Exit(1); @@ -699,8 +512,6 @@ void HumanClientApp::RenderBegin() { - if (m_next_music_time && m_next_music_time <= GG::GUI::GetGUI()->Ticks() && (m_music_loops == -1 || (--m_music_loops + 1))) - PlayMusic(m_music_name, m_music_loops); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // this is the only line in SDLGUI::RenderBegin() } @@ -718,7 +529,6 @@ NET2_Quit(); FE_Quit(); SDLNet_Quit(); - FSOUND_Close(); SDL_Quit(); Logger().debugStream() << "SDLQuit() complete."; } @@ -1126,3 +936,25 @@ Logger().errorStream() << "HumanClientApp::Autosave : An error occured while attempting to save the autosave file \"" << save_filename << "\""; } } + +/* Default sound implementation, do nothing */ +void HumanClientApp::PlayMusic(const std::string& filename, int loops /* = 0*/) +{} + +void HumanClientApp::StopMusic() +{} + +void HumanClientApp::PlaySound(const std::string& filename) +{} + +void HumanClientApp::FreeSound(const std::string& filename) +{} + +void HumanClientApp::FreeAllSounds() +{} + +void HumanClientApp::SetMusicVolume(int vol) +{} + +void HumanClientApp::SetUISoundsVolume(int vol) +{} Modified: trunk/FreeOrion/client/human/HumanClientApp.h =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.h 2006-02-26 11:32:03 UTC (rev 1776) +++ trunk/FreeOrion/client/human/HumanClientApp.h 2006-03-01 15:54:51 UTC (rev 1777) @@ -59,25 +59,25 @@ void SetLobby(MultiplayerLobbyWnd* lobby); ///< registers a lobby dialog so that Messages can reach it; passing 0 unsets the lobby dialog /** plays a music file. The file will be played in an infinitve loop if \a loop is < 0, and it will be played \a loops + 1 times otherwise. */ - void PlayMusic(const std::string& filename, int loops = 0); + virtual void PlayMusic(const std::string& filename, int loops = 0); + + /** stops playing music */ + virtual void StopMusic(); - /** stops playing music */ - void StopMusic(); - /** plays a sound file.*/ - void PlaySound(const std::string& filename); + virtual void PlaySound(const std::string& filename); /** frees the cached sound data associated with the filename.*/ - void FreeSound(const std::string& filename); + virtual void FreeSound(const std::string& filename); /** frees all cached sound data.*/ - void FreeAllSounds(); + virtual void FreeAllSounds(); /** sets the music volume from 0 (muted) to 255 (full volume); \a vol is range-adjusted */ - void SetMusicVolume(int vol); + virtual void SetMusicVolume(int vol); /** sets the UI sounds volume from 0 (muted) to 255 (full volume); \a vol is range-adjusted */ - void SetUISoundsVolume(int vol); + virtual void SetUISoundsVolume(int vol); bool LoadSinglePlayerGame(); ///< loads a single player game chosen by the user; returns true if a game was loaded, and false if the operation was cancelled void SetSaveFileName(const std::string& filename) {m_save_filename = filename;} ///< records the current game's filename @@ -116,13 +116,6 @@ void Autosave(int turn_number, bool new_game); ///< autosaves the current game, iff autosaves are enabled, and m_turns_since_autosave % autosaves.turns == 0 Process m_server_process; ///< the server process (when hosting a game or playing single player); will be empty when playing multiplayer as a non-host player - FSOUND_STREAM* m_current_music; ///< the currently-playing music, if any - int m_music_channel; ///< the channel on which the currently-playing music is playing (or -1 if no music is playing) - int m_music_loops; ///< the number of loops of the current music to play (< 0 for loop forever) - int m_next_music_time; ///< the time in ms that the next loop of the current music should play (0 if no repeats are scheduled) - std::string m_music_name; ///< the name of the currently-playing music file - std::map<std::string, int> m_sounds; ///< the currently-cached (and possibly playing) sounds, if any; keyed on filename - std::set<int> m_used_sample_indices;///< the used indices in m_sounds boost::shared_ptr<ClientUI> m_ui; ///< the one and only ClientUI object! std::string m_save_filename; ///< the name under which the current game has been saved bool m_single_player_game; ///< true when this game is a single-player game Added: trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.cpp (rev 0) +++ trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.cpp 2006-03-01 15:54:51 UTC (rev 1777) @@ -0,0 +1,208 @@ +#include "HumanClientAppSoundFMOD.h" +#include "../../util/OptionsDB.h" + +#include <fmod.h> +#include <fmod_errors.h> + +namespace { + enum SoundDriver { + SOUND_DRIVER_NOSOUND = FSOUND_OUTPUT_NOSOUND, + SOUND_DRIVER_DIRECT_SOUND = FSOUND_OUTPUT_DSOUND, + SOUND_DRIVER_WINDOWS_MULTIMEDIA_WAVEOUT = FSOUND_OUTPUT_WINMM, + SOUND_DRIVER_ASIO = FSOUND_OUTPUT_ASIO, + SOUND_DRIVER_OSS = FSOUND_OUTPUT_OSS, + SOUND_DRIVER_ESD = FSOUND_OUTPUT_ESD, + SOUND_DRIVER_ALSA = FSOUND_OUTPUT_ALSA + }; + + /** Assumes that sound has not been initialized! */ + std::vector<SoundDriver> GetSoundDrivers() + { + std::vector<SoundDriver> retval; + +#if defined(FREEORION_WIN32) + if (FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_DIRECT_SOUND); + if (FSOUND_SetOutput(FSOUND_OUTPUT_WINMM) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_WINDOWS_MULTIMEDIA_WAVEOUT); + if (FSOUND_SetOutput(FSOUND_OUTPUT_ASIO) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_ASIO); +#elif defined(FREEORION_LINUX) + if (FSOUND_SetOutput(FSOUND_OUTPUT_ALSA) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_ALSA); + if (FSOUND_SetOutput(FSOUND_OUTPUT_OSS) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_OSS); + if (FSOUND_SetOutput(FSOUND_OUTPUT_ESD) && FSOUND_GetNumDrivers()) + retval.push_back(SOUND_DRIVER_ESD); +#endif + + FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND); + + return retval; + } + + void InitFMOD(unsigned int channels = 64, unsigned int memory_size = 4*1024*1024) + { + const int SAMPLE_FREQ = 44100; + + assert(0 < channels); + assert((memory_size % 512) == 0); + + log4cpp::Category& logger = HumanClientApp::GetApp()->Logger(); + + if (FSOUND_GetVersion() < FMOD_VERSION) { + logger.errorStream() << "InitFMOD() : You are using the wrong version of the FMOD DLL! This program was built with FMOD " << FMOD_VERSION; + } + + if (!FSOUND_SetMemorySystem(malloc(memory_size), memory_size, 0, 0, 0)) { + logger.errorStream() << "InitFMOD() : Error initializing FMOD memory; FMOD error was \"" << FMOD_ErrorString(FSOUND_GetError()) << "\""; + } + + FSOUND_SetOutput(-1); + FSOUND_SetDriver(0); + SoundDriver default_sound_driver = static_cast<SoundDriver>(FSOUND_GetOutput()); + bool success = true; + if (!FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { + success = false; + // first chance: try all other devices for this output driver + int num_devices = FSOUND_GetNumDrivers(); + for (int i = 1; i < num_devices; ++i) { // start at 1, since 0 obviously didn't work + FSOUND_SetDriver(i); + if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { + success = true; + break; + } + } + // second chance: try other output drivers's devices + if (!success) { + std::vector<SoundDriver> sound_drivers = GetSoundDrivers(); + std::vector<SoundDriver>::iterator it = std::find(sound_drivers.begin(), sound_drivers.end(), default_sound_driver); + if (it != sound_drivers.end()) { + sound_drivers.erase(it); + } + for (unsigned int i = 0; i < sound_drivers.size(); ++i) { + FSOUND_SetOutput(sound_drivers[i]); + num_devices = FSOUND_GetNumDrivers(); + for (int j = 0; j < num_devices; ++j) { + FSOUND_SetDriver(j); + if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { + success = true; + break; + } + } + } + } + } + + if (!success) { + FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND); + FSOUND_SetDriver(0); + if (FSOUND_Init(SAMPLE_FREQ, channels, FSOUND_INIT_USEDEFAULTMIDISYNTH)) { + logger.errorStream() << "InitFMOD() : No suitable sound configuration could be found ... sound disabled"; + } else { + logger.errorStream() << "InitFMOD() : No suitable sound configuration could be found, and FSOUND_Init() failed even with " + "FSOUND_OUTPUT_NOSOUND as the output (sound disabled); FMOD error was \"" << FMOD_ErrorString(FSOUND_GetError()) << "\""; + } + } + } +} + +HumanClientAppSoundFMOD::HumanClientAppSoundFMOD() + : HumanClientApp(), + m_current_music(0), + m_music_channel(-1), + m_music_loops(0), + m_next_music_time(0) +{ + InitFMOD(); +} + +void HumanClientAppSoundFMOD::PlayMusic(const std::string& filename, int loops) +{ + StopMusic(); + m_current_music = FSOUND_Stream_Open(filename.c_str(), FSOUND_2D, 0, 0); + m_music_channel = FSOUND_Stream_Play(FSOUND_FREE, m_current_music); + FSOUND_SetVolumeAbsolute(m_music_channel, GetOptionsDB().Get<int>("music-volume")); + m_music_loops = loops; + m_next_music_time = m_music_loops ? GG::GUI::GetGUI()->Ticks() + FSOUND_Stream_GetLengthMs(m_current_music) : 0; + m_music_name = filename; +} + +void HumanClientAppSoundFMOD::StopMusic() +{ + if (m_current_music) { + FSOUND_Stream_Close(m_current_music); + m_current_music = 0; + m_music_channel = -1; + m_next_music_time = 0; + m_music_loops = 0; + } +} + +void HumanClientAppSoundFMOD::PlaySound(const std::string& filename) +{ + std::map<std::string, int>::iterator it = m_sounds.find(filename); + if (it != m_sounds.end()) { + if (FSOUND_SAMPLE* sample = FSOUND_Sample_Get(it->second)) + FSOUND_PlaySound(FSOUND_FREE, sample); + } else { + int first_available_sample_slot = 0; + std::set<int>::iterator used_index_it = m_used_sample_indices.begin(); + while (used_index_it != m_used_sample_indices.end() && *used_index_it == first_available_sample_slot) { + ++first_available_sample_slot; + ++used_index_it; + } + if (FSOUND_SAMPLE* sample = FSOUND_Sample_Load(first_available_sample_slot, filename.c_str(), 0, 0, 0)) { + m_sounds[filename] = first_available_sample_slot; + m_used_sample_indices.insert(first_available_sample_slot); + FSOUND_PlaySound(FSOUND_FREE, sample); + } + } +} + +void HumanClientAppSoundFMOD::FreeSound(const std::string& filename) +{ + std::map<std::string, int>::iterator it = m_sounds.find(filename); + if (it != m_sounds.end()) { + FSOUND_Sample_Free(FSOUND_Sample_Get(it->second)); + m_used_sample_indices.erase(it->second); + m_sounds.erase(it); + } +} + +void HumanClientAppSoundFMOD::FreeAllSounds() +{ + for (std::map<std::string, int>::iterator it = m_sounds.begin(); it != m_sounds.end(); ++it) { + FSOUND_Sample_Free(FSOUND_Sample_Get(it->second)); + } + m_used_sample_indices.clear(); + m_sounds.clear(); +} + +void HumanClientAppSoundFMOD::SetMusicVolume(int vol) +{ + vol = std::max(0, std::min(vol, 255)); + if (m_music_channel != -1) + FSOUND_SetVolumeAbsolute(m_music_channel, vol); + GetOptionsDB().Set<int>("music-volume", vol); +} + +void HumanClientAppSoundFMOD::SetUISoundsVolume(int vol) +{ + vol = std::max(0, std::min(vol, 255)); + FSOUND_SetSFXMasterVolume(vol); + GetOptionsDB().Set<int>("UI.sound.volume", vol); +} + +void HumanClientAppSoundFMOD::RenderBegin() +{ + if (m_next_music_time && m_next_music_time <= GG::GUI::GetGUI()->Ticks() && (m_music_loops == -1 || (--m_music_loops + 1))) + PlayMusic(m_music_name, m_music_loops); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // this is the only line in SDLGUI::RenderBegin() +} + +HumanClientAppSoundFMOD::~HumanClientAppSoundFMOD() +{ + FSOUND_Close(); +} + Added: trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.h =================================================================== --- trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.h (rev 0) +++ trunk/FreeOrion/client/human/HumanClientAppSoundFMOD.h 2006-03-01 15:54:51 UTC (rev 1777) @@ -0,0 +1,32 @@ +// -*- c++ -*- +#include "HumanClientApp.h" + +struct FSOUND_STREAM; + +class HumanClientAppSoundFMOD : public HumanClientApp +{ +public: + HumanClientAppSoundFMOD(); + virtual ~HumanClientAppSoundFMOD(); + virtual void PlayMusic(const std::string& filename, int loops = 0); + virtual void StopMusic(); + virtual void PlaySound(const std::string& filename); + virtual void FreeSound(const std::string& filename); + virtual void FreeAllSounds(); + virtual void SetMusicVolume(int vol); + virtual void SetUISoundsVolume(int vol); + + +private: + FSOUND_STREAM* m_current_music; ///< the currently-playing music, if any + int m_music_channel; ///< the channel on which the currently-playing music is playing (or -1 if no music is playing) + int m_music_loops; ///< the number of loops of the current music to play (< 0 for loop forever) + int m_next_music_time; ///< the time in ms that the next loop of the current music should play (0 if no repeats are scheduled) + std::string m_music_name; ///< the name of the currently-playing music file + std::map<std::string, int> m_sounds; ///< the currently-cached (and possibly playing) sounds, if any; keyed on filename + std::set<int> m_used_sample_indices;///< the used indices in m_sounds + + virtual void RenderBegin(); +}; + + Modified: trunk/FreeOrion/client/human/chmain.cpp =================================================================== --- trunk/FreeOrion/client/human/chmain.cpp 2006-02-26 11:32:03 UTC (rev 1776) +++ trunk/FreeOrion/client/human/chmain.cpp 2006-03-01 15:54:51 UTC (rev 1777) @@ -1,4 +1,4 @@ -#include "HumanClientApp.h" +#include "HumanClientAppSoundFMOD.h" #include "../../util/OptionsDB.h" #include "../../util/Directories.h" #include "../../util/XMLDoc.h" @@ -64,7 +64,7 @@ return 1; } - HumanClientApp app; + HumanClientAppSoundFMOD app; try { app(); // run app (intialization and main process loop) |
From: <tz...@us...> - 2006-10-18 23:55:20
|
Revision: 1912 http://svn.sourceforge.net/freeorion/revision/?rev=1912&view=rev Author: tzlaine Date: 2006-10-18 16:55:15 -0700 (Wed, 18 Oct 2006) Log Message: ----------- Changed the label used for the settings-dir option in the OptionsWnd slightly, fixed the display of OptionsWnd tooltips text, and added "fullscreen" to the items in the video mode drop-list. Modified Paths: -------------- trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/default/ger_stringtable.txt Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2006-10-18 04:31:57 UTC (rev 1911) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2006-10-18 23:55:15 UTC (rev 1912) @@ -280,7 +280,7 @@ m_current_option_list->Insert(row); button->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); button->SetCheck(GetOptionsDB().Get<bool>(option_name)); - button->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + button->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(button->CheckedSignal, SetOptionFunctor<bool>(option_name)); return button; } @@ -311,9 +311,9 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); spin->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - spin->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + spin->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); text_control->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - text_control->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + text_control->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(spin->ValueChangedSignal, SetOptionFunctor<int>(option_name)); return spin; } @@ -344,9 +344,9 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); spin->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - spin->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + spin->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); text_control->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - text_control->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + text_control->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(spin->ValueChangedSignal, SetOptionFunctor<double>(option_name)); return spin; } @@ -368,9 +368,9 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); button->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - button->SetBrowseText(GetOptionsDB().GetDescription("music-off")); + button->SetBrowseText(UserString(GetOptionsDB().GetDescription("music-off"))); slider->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - slider->SetBrowseText(GetOptionsDB().GetDescription("music-volume")); + slider->SetBrowseText(UserString(GetOptionsDB().GetDescription("music-volume"))); GG::Connect(button->CheckedSignal, &OptionsWnd::MusicClicked, this); GG::Connect(slider->SlidAndStoppedSignal, &OptionsWnd::MusicVolumeSlid, this); } @@ -393,9 +393,9 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); button->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - button->SetBrowseText(GetOptionsDB().GetDescription(toggle_option_name)); + button->SetBrowseText(UserString(GetOptionsDB().GetDescription(toggle_option_name))); slider->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - slider->SetBrowseText(GetOptionsDB().GetDescription(volume_option_name)); + slider->SetBrowseText(UserString(GetOptionsDB().GetDescription(volume_option_name))); GG::Connect(button->CheckedSignal, SetOptionFunctor<bool>(toggle_option_name)); GG::Connect(slider->SlidAndStoppedSignal, volume_slider_handler, this); } @@ -419,11 +419,11 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); edit->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - edit->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + edit->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); button->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - button->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + button->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); text_control->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - text_control->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + text_control->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(edit->EditedSignal, SetOptionFunctor<std::string>(option_name, edit, string_validator)); GG::Connect(button->ClickedSignal, BrowseForPathButtonFunctor(path, filters, edit, directory)); if (string_validator && !string_validator(edit->WindowText())) @@ -470,9 +470,9 @@ row->push_back(new RowContentsWnd(row->Width(), row->Height(), layout, m_indentation_level)); m_current_option_list->Insert(row); color_selector->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - color_selector->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + color_selector->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); text_control->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - text_control->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + text_control->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(color_selector->ColorChangedSignal, SetOptionFunctor<GG::Clr>(option_name)); } @@ -519,9 +519,9 @@ if (index != -1) drop_list->Select(index); drop_list->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - drop_list->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + drop_list->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); text_control->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - text_control->SetBrowseText(GetOptionsDB().GetDescription(option_name)); + text_control->SetBrowseText(UserString(GetOptionsDB().GetDescription(option_name))); GG::Connect(drop_list->SelChangedSignal, DropListIndexSetOptionFunctor(option_name, drop_list)); } @@ -579,7 +579,7 @@ font_row->SetText(UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")); drop_list->Insert(font_row); for (std::vector<std::string>::const_iterator it = resolutions.begin(); it != resolutions.end(); ++it) { - font_row = new CUISimpleDropDownListRow(*it); + font_row = new CUISimpleDropDownListRow(*it + " " + UserString("OPTIONS_FULLSCREEN")); font_row->SetText(*it); drop_list->Insert(font_row); } Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2006-10-18 04:31:57 UTC (rev 1911) +++ trunk/FreeOrion/default/eng_stringtable.txt 2006-10-18 23:55:15 UTC (rev 1912) @@ -375,7 +375,7 @@ The directory in which saved games are saved and from which they are loaded. Directory names are taken to be relative to the location of the executable. OPTIONS_DB_SETTINGS_DIR -Sets the root directory for the settings and data files. +Sets the root directory for the game resource files (settings and data files). OPTIONS_DB_LOG_LEVEL Sets the level at or above which log messages will be output (levels in order of decreasing verbosity: DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT, FATAL, EMERG) @@ -965,20 +965,11 @@ All files OPTIONS_FOLDER_SETTINGS -Settings +Resource Files -OPTIONS_FOLDER_ART -Art - OPTIONS_FOLDER_SAVE Save files -OPTIONS_FOLDER_FONTS -Fonts - -OPTIONS_FOLDER_SOUNDS -Sounds and music - OPTIONS_LANGUAGE_FILE Language files Modified: trunk/FreeOrion/default/ger_stringtable.txt =================================================================== --- trunk/FreeOrion/default/ger_stringtable.txt 2006-10-18 04:31:57 UTC (rev 1911) +++ trunk/FreeOrion/default/ger_stringtable.txt 2006-10-18 23:55:15 UTC (rev 1912) @@ -375,7 +375,7 @@ The directory in which saved games are saved and from which they are loaded. Directory names are taken to be relative to the location of the executable. OPTIONS_DB_SETTINGS_DIR -Sets the root directory for the settings and data files. +Sets the root directory for the game resource files (settings and data files). OPTIONS_DB_LOG_LEVEL Sets the level at or above which log messages will be output (levels in order of decreasing verbosity: DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT, FATAL, EMERG) @@ -965,20 +965,11 @@ Alle Dateien OPTIONS_FOLDER_SETTINGS -Einstellungen +Resource Files -OPTIONS_FOLDER_ART -Grafiken - OPTIONS_FOLDER_SAVE Spielstandverzeichnis -OPTIONS_FOLDER_FONTS -Schriftarten - -OPTIONS_FOLDER_SOUNDS -Sound und Musik - OPTIONS_LANGUAGE_FILE Sprachdateien |
From: <tz...@us...> - 2006-10-29 21:37:22
|
Revision: 1939 http://svn.sourceforge.net/freeorion/revision/?rev=1939&view=rev Author: tzlaine Date: 2006-10-29 13:37:15 -0800 (Sun, 29 Oct 2006) Log Message: ----------- Fixed a bug in Universe::serialize(), and converted GameStartMessages to use Boost.Serialization instead of XMLDoc. Modified Paths: -------------- trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/network/Message.cpp trunk/FreeOrion/network/Message.h trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-10-29 21:37:15 UTC (rev 1939) @@ -212,12 +212,15 @@ if (msg.Sender() == -1) { Logger().debugStream() << "AIClientApp::HandleMessageImpl : Received GAME_START message; " "starting AI turn..."; - std::stringstream stream(msg.GetText()); - XMLDoc doc; - doc.ReadDoc(stream); - m_empire_id = boost::lexical_cast<int>(doc.root_node.Child("empire_id").Text()); - m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); - // as it stands now, just start turn + std::istringstream is(msg.GetText()); + boost::archive::binary_iarchive ia(is); + bool single_player_game; + ia >> BOOST_SERIALIZATION_NVP(single_player_game); + ia >> boost::serialization::make_nvp("empire_id", m_empire_id); + ia >> BOOST_SERIALIZATION_NVP(m_current_turn); + Universe::s_encoding_empire = m_empire_id; + Deserialize(&ia, Empires()); + Deserialize(&ia, GetUniverse()); StartTurn(); } break; @@ -246,8 +249,8 @@ boost::archive::binary_iarchive ia(is); Universe::s_encoding_empire = m_empire_id; ia >> BOOST_SERIALIZATION_NVP(m_current_turn); + Deserialize(&ia, Empires()); Deserialize(&ia, GetUniverse()); - Deserialize(&ia, Empires()); StartTurn(); } break; Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-10-29 21:37:15 UTC (rev 1939) @@ -577,41 +577,23 @@ Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Received GAME_START message; " "starting player turn..."; m_game_started = true; + std::istringstream is(msg.GetText()); + boost::archive::binary_iarchive ia(is); + ia >> boost::serialization::make_nvp("single_player_game", m_single_player_game); + ia >> boost::serialization::make_nvp("empire_id", m_empire_id); + ia >> BOOST_SERIALIZATION_NVP(m_current_turn); + Universe::s_encoding_empire = m_empire_id; + Deserialize(&ia, Empires()); + Deserialize(&ia, GetUniverse()); - std::stringstream stream(msg.GetText()); - XMLDoc doc; - doc.ReadDoc(stream); - - if (m_single_player_game = doc.root_node.ContainsChild("single_player_game")) { - Logger().debugStream() << "Single-Player game"; - doc.root_node.RemoveChild("single_player_game"); - } - - m_empire_id = boost::lexical_cast<int>(doc.root_node.Child("empire_id").Text()); - - // free current sitreps, if any - if (Empires().Lookup(m_empire_id)) - Empires().Lookup(m_empire_id)->ClearSitRep(); Orders().Reset(); - // if we have empire data, then process it. As it stands now, - // we may not, so dont assume we do. - if (doc.root_node.ContainsChild(EmpireManager::EMPIRE_UPDATE_TAG)) { - m_empires.HandleEmpireElementUpdate(doc.root_node.Child(EmpireManager::EMPIRE_UPDATE_TAG)); - } else { - Logger().debugStream() << "No Empire data received from server. Update Server Code."; - } - - m_universe.SetUniverse(doc.root_node.Child("Universe")); - Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Universe setup complete."; for (Empire::SitRepItr it = Empires().Lookup(m_empire_id)->SitRepBegin(); it != Empires().Lookup(m_empire_id)->SitRepEnd(); ++it) { m_ui->GenerateSitRepText(*it); } - m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); - Autosave(true); m_ui->ScreenMap(); m_ui->InitTurn(m_current_turn); // init the new turn @@ -648,8 +630,8 @@ boost::archive::binary_iarchive ia(is); Universe::s_encoding_empire = m_empire_id; ia >> BOOST_SERIALIZATION_NVP(m_current_turn); - Deserialize(&ia, GetUniverse()); Deserialize(&ia, Empires()); + Deserialize(&ia, GetUniverse()); // Now decode sitreps // Empire sitreps need UI in order to generate text, since it needs string resources Modified: trunk/FreeOrion/network/Message.cpp =================================================================== --- trunk/FreeOrion/network/Message.cpp 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/network/Message.cpp 2006-10-29 21:37:15 UTC (rev 1939) @@ -194,9 +194,9 @@ return Message(Message::SERVER_STATUS, -1, player_id, Message::CORE, conflict_details); } -Message GameStartMessage(int player_id, const XMLDoc& start_data) +Message GameStartMessage(int player_id, const std::string& data) { - return Message(Message::GAME_START, -1, player_id, Message::CORE, start_data); + return Message(Message::GAME_START, -1, player_id, Message::CORE, data); } Message HostAckMessage(int player_id) Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/network/Message.h 2006-10-29 21:37:15 UTC (rev 1939) @@ -142,7 +142,7 @@ Message VersionConflictMessage(int player_id, const XMLDoc& conflict_details); /** creates a GAME_START message. Contains the initial game state visible to player \a player_id.*/ -Message GameStartMessage(int player_id, const XMLDoc& start_data); +Message GameStartMessage(int player_id, const std::string& data); /** creates a HOST_GAME acknowledgement message. The \a player_id is the ID of the receiving player. This message should only be sent by the server.*/ Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-10-29 21:37:15 UTC (rev 1939) @@ -1277,23 +1277,17 @@ // the universe creation caused the creation of empires. But now we need to assign the empires to players. for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { - XMLDoc doc; - if (m_single_player_game) - doc.root_node.AppendChild("single_player_game"); - doc.root_node.AppendChild(m_universe.XMLEncode(it->first)); - doc.root_node.AppendChild(m_empires.CreateClientEmpireUpdate(it->first)); - doc.root_node.AppendChild(XMLElement("empire_id", boost::lexical_cast<std::string>(it->first))); - - // turn number is an attribute of the document - doc.root_node.SetAttribute("turn_number", boost::lexical_cast<std::string>(m_current_turn)); - - if (GetOptionsDB().Get<bool>("debug.log-new-game-universe")) { - boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameInit-empire" + boost::lexical_cast<std::string>(it->first) + "-doc.xml")); - doc.WriteDoc(ofs); - ofs.close(); + std::ostringstream os; + { + boost::archive::binary_oarchive oa(os); + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game); + oa << boost::serialization::make_nvp("empire_id", it->first); + oa << BOOST_SERIALIZATION_NVP(m_current_turn); + Universe::s_encoding_empire = it->first; + Serialize(&oa, m_empires); + Serialize(&oa, m_universe); } - - m_network_core.SendMessage(GameStartMessage(it->first, doc)); + m_network_core.SendMessage(GameStartMessage(it->first, os.str())); } m_losers.clear(); @@ -1327,12 +1321,8 @@ std::map<int, XMLDoc>::iterator player_doc_it = player_docs.begin(); for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it, ++player_doc_it) { - XMLDoc doc; const int INVALID_EMPIRE_ID = -5000; int empire_id = INVALID_EMPIRE_ID; - if (m_single_player_game) { - doc.root_node.AppendChild("single_player_game"); - } if (player_to_empire_ids[it->first] != -1) { empire_id = player_to_empire_ids[it->first]; } else { @@ -1347,17 +1337,17 @@ } } assert(empire_id != INVALID_EMPIRE_ID); - doc.root_node.AppendChild(m_universe.XMLEncode(empire_id)); - doc.root_node.AppendChild(m_empires.CreateClientEmpireUpdate(empire_id)); - doc.root_node.AppendChild(XMLElement("empire_id", boost::lexical_cast<std::string>(empire_id))); - doc.root_node.SetAttribute("turn_number", boost::lexical_cast<std::string>(m_current_turn)); - m_network_core.SendMessage(GameStartMessage(it->first, doc)); - - if (GetOptionsDB().Get<bool>("debug.log-load-game-universe")) { - boost::filesystem::ofstream ofs(GetLocalDir() / ("LoadGameInit-empire" + boost::lexical_cast<std::string>(empire_id) + "-doc.xml")); - doc.WriteDoc(ofs); - ofs.close(); + std::ostringstream os; + { + boost::archive::binary_oarchive oa(os); + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game); + oa << BOOST_SERIALIZATION_NVP(empire_id); + oa << BOOST_SERIALIZATION_NVP(m_current_turn); + Universe::s_encoding_empire = empire_id; + Serialize(&oa, m_empires); + Serialize(&oa, m_universe); } + m_network_core.SendMessage(GameStartMessage(it->first, os.str())); // send saved pending orders to player m_network_core.SendMessage(ServerLoadGameMessage(it->first, player_docs[empire_id])); @@ -1861,8 +1851,8 @@ boost::archive::binary_oarchive oa(os); Universe::s_encoding_empire = pEmpire->EmpireID(); oa << BOOST_SERIALIZATION_NVP(m_current_turn); - Serialize(&oa, m_universe); Serialize(&oa, m_empires); + Serialize(&oa, m_universe); } m_network_core.SendMessage(TurnUpdateMessage(player_it->first, os.str())); } Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2006-10-29 21:26:50 UTC (rev 1938) +++ trunk/FreeOrion/universe/Universe.h 2006-10-29 21:37:15 UTC (rev 1939) @@ -335,8 +335,10 @@ ar & BOOST_SERIALIZATION_NVP(s_universe_width) & BOOST_SERIALIZATION_NVP(objects) & BOOST_SERIALIZATION_NVP(m_last_allocated_id); - if (Archive::is_loading::value) + if (Archive::is_loading::value) { m_objects = objects; + InitializeSystemGraph(); + } } template <class T> |
From: <tz...@us...> - 2006-11-22 03:56:48
|
Revision: 1953 http://svn.sourceforge.net/freeorion/revision/?rev=1953&view=rev Author: tzlaine Date: 2006-11-21 19:56:47 -0800 (Tue, 21 Nov 2006) Log Message: ----------- More XML to plain text message conversions, and a slight refinement of the existing set of messages. The new messages are more natural and explicit. Modified Paths: -------------- trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/network/Message.cpp trunk/FreeOrion/network/Message.h trunk/FreeOrion/network/NetworkCore.h trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2006-11-22 03:56:47 UTC (rev 1953) @@ -229,7 +229,7 @@ if (!failed) { ClientUI::GetClientUI()->ScreenNewGame(); - HumanClientApp::GetApp()->NetworkCore().SendMessage(HostGameMessage(HumanClientApp::GetApp()->PlayerID(), game_parameters)); + HumanClientApp::GetApp()->NetworkCore().SendMessage(HostSPGameMessage(HumanClientApp::GetApp()->PlayerID(), game_parameters)); } } else { failed = true; @@ -284,7 +284,7 @@ ClientUI::GetClientUI()->ScreenIntro(); } else { HumanClientApp::GetApp()->NetworkCore().SendMessage(server_connect_wnd.Result().second == "HOST GAME SELECTED" ? - HostGameMessage(HumanClientApp::GetApp()->PlayerID(), server_connect_wnd.Result().first) : + HostMPGameMessage(HumanClientApp::GetApp()->PlayerID(), server_connect_wnd.Result().first) : JoinGameMessage(server_connect_wnd.Result().first)); MultiplayerLobbyWnd multiplayer_lobby_wnd(server_connect_wnd.Result().second == "HOST GAME SELECTED"); multiplayer_lobby_wnd.Run(); Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-11-22 03:56:47 UTC (rev 1953) @@ -415,7 +415,7 @@ void MultiplayerLobbyWnd::StartGameClicked() { - HumanClientApp::GetApp()->NetworkCore().SendMessage(HostGameMessage(HumanClientApp::GetApp()->PlayerID(), HumanClientApp::GetApp()->PlayerName())); + HumanClientApp::GetApp()->NetworkCore().SendMessage(StartMPGameMessage(HumanClientApp::GetApp()->PlayerID())); m_result = true; CUIWnd::CloseClicked(); } Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-11-22 03:56:47 UTC (rev 1953) @@ -253,11 +253,9 @@ m_empire_id = -1; m_player_name = "Happy_Player"; - // HACK! send the multiplayer form of the HostGameMessage, since it establishes us as the host, and the single-player - // LOAD_GAME message will establish us as a single-player game - XMLDoc parameters; - parameters.root_node.AppendChild(XMLElement("host_player_name", std::string("Happy_Player"))); - NetworkCore().SendMessage(HostGameMessage(NetworkCore::HOST_PLAYER_ID, parameters)); + // HACK! Send HostMPGameMessage, since it establishes us as the host, and the LOAD_GAME message will + // establish us as a single-player game. + NetworkCore().SendMessage(HostMPGameMessage(NetworkCore::HOST_PLAYER_ID, "Happy_Player")); NetworkCore().SendMessage(HostLoadGameMessage(NetworkCore::HOST_PLAYER_ID, filename)); return true; @@ -545,9 +543,10 @@ break; } - case Message::HOST_GAME: { + case Message::HOST_SP_GAME: + case Message::HOST_MP_GAME: { if (msg.Sender() == -1 && msg.GetText() == "ACK") - Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Received HOST_GAME acknowledgement"; + Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Received " << (msg.Type() == Message::HOST_SP_GAME ? "HOST_SP_GAME" : "HOST_MP_GAME") << " acknowledgement"; break; } Modified: trunk/FreeOrion/network/Message.cpp =================================================================== --- trunk/FreeOrion/network/Message.cpp 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/network/Message.cpp 2006-11-22 03:56:47 UTC (rev 1953) @@ -55,12 +55,14 @@ GG_ENUM_MAP_INSERT(Message::UNDEFINED) GG_ENUM_MAP_INSERT(Message::DEBUG) GG_ENUM_MAP_INSERT(Message::SERVER_STATUS) - GG_ENUM_MAP_INSERT(Message::HOST_GAME) + GG_ENUM_MAP_INSERT(Message::HOST_SP_GAME) + GG_ENUM_MAP_INSERT(Message::HOST_MP_GAME) GG_ENUM_MAP_INSERT(Message::JOIN_GAME) GG_ENUM_MAP_INSERT(Message::LOBBY_UPDATE) GG_ENUM_MAP_INSERT(Message::LOBBY_CHAT) GG_ENUM_MAP_INSERT(Message::LOBBY_HOST_ABORT) GG_ENUM_MAP_INSERT(Message::LOBBY_EXIT) + GG_ENUM_MAP_INSERT(Message::START_MP_GAME) GG_ENUM_MAP_INSERT(Message::SAVE_GAME) GG_ENUM_MAP_INSERT(Message::LOAD_GAME) GG_ENUM_MAP_INSERT(Message::GAME_START) @@ -269,16 +271,14 @@ //////////////////////////////////////////////// // Message-Creation Free Functions //////////////////////////////////////////////// -Message HostGameMessage(int player_id, const XMLDoc& doc) +Message HostSPGameMessage(int player_id, const XMLDoc& doc) { - return Message(Message::HOST_GAME, player_id, -1, Message::CORE, doc); + return Message(Message::HOST_SP_GAME, player_id, -1, Message::CORE, doc); } -Message HostGameMessage(int player_id, const std::string& host_player_name) +Message HostMPGameMessage(int player_id, const std::string& host_player_name) { - XMLDoc doc; - doc.root_node.AppendChild(XMLElement("host_player_name", host_player_name)); - return Message(Message::HOST_GAME, player_id, -1, Message::CORE, doc); + return Message(Message::HOST_MP_GAME, player_id, -1, Message::CORE, host_player_name); } Message JoinGameMessage(const std::string& player_name) @@ -296,11 +296,16 @@ return Message(Message::GAME_START, -1, player_id, Message::CORE, data); } -Message HostAckMessage(int player_id) +Message HostSPAckMessage(int player_id) { - return Message(Message::HOST_GAME, -1, player_id, Message::CORE, "ACK"); + return Message(Message::HOST_SP_GAME, -1, player_id, Message::CORE, "ACK"); } +Message HostMPAckMessage(int player_id) +{ + return Message(Message::HOST_MP_GAME, -1, player_id, Message::CORE, "ACK"); +} + Message JoinAckMessage(int player_id) { return Message(Message::JOIN_GAME, -1, player_id, Message::CORE, boost::lexical_cast<std::string>(player_id)); @@ -328,7 +333,7 @@ Message TurnProgressMessage(int player_id, Message::TurnProgressPhase phase_id, int empire_id) { - /// Turn progres message sends down message ID instead of text for faster transfer + /// Turn progress message sends down message ID instead of text for faster transfer /// The data is a number indicating the phase being started and the empire ID XMLDoc doc; @@ -446,3 +451,8 @@ { return Message(Message::LOBBY_EXIT, sender, receiver, Message::CLIENT_LOBBY_MODULE, ""); } + +Message StartMPGameMessage(int player_id) +{ + return Message(Message::START_MP_GAME, player_id, -1, Message::CORE, ""); +} Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/network/Message.h 2006-11-22 03:56:47 UTC (rev 1953) @@ -35,13 +35,15 @@ UNDEFINED, DEBUG, ///< used to send special messages used for debugging purposes SERVER_STATUS, ///< sent to the client when requested, and when the server first recieves a connection from a client - HOST_GAME, ///< sent when a client wishes to establish a game at the server + HOST_SP_GAME, ///< sent when a client wishes to establish a single player game at the server + HOST_MP_GAME, ///< sent when a client wishes to establish a multiplayer game at the server JOIN_GAME, ///< sent when a client wishes to join a game being established at the server RENAME_PLAYER, ///< sent when the server must assign a new name to a player, because another player already has her desired name LOBBY_UPDATE, ///< used to synchronize multiplayer lobby dialogs among different players, when a user changes a setting, or the server updates the state LOBBY_CHAT, ///< used to send chat messages in the multiplayer lobby LOBBY_HOST_ABORT, ///< sent to server (by the "host" client only) when a multiplayer game is to be cancelled while it is still being set up in the multiplayer lobby LOBBY_EXIT, ///< sent to server (by a non-"host" client only) when a player leaves the multiplayer lobby + START_MP_GAME, ///< sent to server (by the "host" client only) when the settings in the MP lobby are satisfactory and it is time to start the game SAVE_GAME, ///< sent to server (by the "host" client only) when a game is to be saved, or from the server to the clients when the game is being saved LOAD_GAME, ///< sent to server (by the "host" client only) when a game is to be loaded, or from the server to the clients when the game is being loaded GAME_START, ///< sent to each client before the first turn of a new or newly loaded game, instead of a TURN_UPDATE @@ -141,11 +143,11 @@ std::ostream& operator<<(std::ostream& os, const Message& msg); -/** creates a HOST_GAME message*/ -Message HostGameMessage(int player_id, const XMLDoc& doc); +/** creates a HOST_SP_GAME message*/ +Message HostSPGameMessage(int player_id, const XMLDoc& doc); -/** creates a minimal HOST_GAME message used to enter and finalize the multiplayer "lobby" setup*/ -Message HostGameMessage(int player_id, const std::string& host_player_name); +/** creates a minimal HOST_MP_GAME message used to initiate multiplayer "lobby" setup*/ +Message HostMPGameMessage(int player_id, const std::string& host_player_name); /** creates a JOIN_GAME message. The sender's player name is sent in the message.*/ Message JoinGameMessage(const std::string& player_name); @@ -156,10 +158,14 @@ /** creates a GAME_START message. Contains the initial game state visible to player \a player_id.*/ Message GameStartMessage(int player_id, const std::string& data); -/** creates a HOST_GAME acknowledgement message. The \a player_id is the ID of the receiving player. This message +/** creates a HOST_SP_GAME acknowledgement message. The \a player_id is the ID of the receiving player. This message should only be sent by the server.*/ -Message HostAckMessage(int player_id); +Message HostSPAckMessage(int player_id); +/** creates a HOST_MP_GAME acknowledgement message. The \a player_id is the ID of the receiving player. This message + should only be sent by the server.*/ +Message HostMPAckMessage(int player_id); + /** creates a JOIN_GAME acknowledgement message. The \a player_id is the ID of the receiving player. This message should only be sent by the server.*/ Message JoinAckMessage(int player_id); @@ -255,4 +261,7 @@ /** creates an LOBBY_EXIT message. This message should only be sent by the server.*/ Message ServerLobbyExitMessage(int sender, int receiver); +/** creates a START_MP_GAME used to finalize the multiplayer "lobby" setup*/ +Message StartMPGameMessage(int player_id); + #endif // _Message_h_ Modified: trunk/FreeOrion/network/NetworkCore.h =================================================================== --- trunk/FreeOrion/network/NetworkCore.h 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/network/NetworkCore.h 2006-11-22 03:56:47 UTC (rev 1953) @@ -26,9 +26,9 @@ /** the states the server may be in at various points during its execution*/ enum ServerState { - SERVER_IDLE, ///< there is no game yet and no one has send a HOST_GAME Message yet; this is the initial state + SERVER_IDLE, ///< there is no game yet and no one has send a HOST_*_GAME Message yet; this is the initial state SERVER_MP_LOBBY, ///< the host and possibly other players are in the multiplayer lobby, preparing to start a game - SERVER_GAME_SETUP, ///< a HOST_GAME Message has been received, and a game is being set up (the server is waiting for all players to join) + SERVER_GAME_SETUP, ///< a HOST_*_GAME Message has been received, and a game is being set up (the server is waiting for all players to join) SERVER_WAITING, ///< a game is in progress and currently the server is waiting for players to finish their turns SERVER_PROCESSING, ///< the server is processing a turn SERVER_DISCONNECT, ///< the server has encountered a disconnect error and is dealing with it Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-11-22 03:10:41 UTC (rev 1952) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-11-22 03:56:47 UTC (rev 1953) @@ -213,86 +213,75 @@ void ServerApp::HandleMessage(const Message& msg) { switch (msg.Type()) { - case Message::HOST_GAME: { // this should only be received at the end of MP setup - std::string host_player_name = msg.GetText(); - std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().find(msg.Sender()); - bool spoofed_host = (m_state == SERVER_MP_LOBBY && it != m_network_core.Players().end() && it->second.name == host_player_name); - if (!spoofed_host) { - if (m_lobby_data.m_new_game) { // new game - m_galaxy_size = m_lobby_data.m_size; - m_galaxy_shape = m_lobby_data.m_shape; - m_galaxy_age = m_lobby_data.m_age; - m_starlane_freq = m_lobby_data.m_starlane_freq; - m_planet_density = m_lobby_data.m_planet_density; - m_specials_freq = m_lobby_data.m_specials_freq; - m_expected_players = m_network_core.Players().size() + m_lobby_data.m_AIs.size(); - for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { - if (it->first != msg.Sender()) - m_network_core.SendMessage(Message(Message::GAME_START, -1, it->first, Message::CLIENT_LOBBY_MODULE, "")); + case Message::START_MP_GAME: { + if (m_lobby_data.m_new_game) { // new game + m_galaxy_size = m_lobby_data.m_size; + m_galaxy_shape = m_lobby_data.m_shape; + m_galaxy_age = m_lobby_data.m_age; + m_starlane_freq = m_lobby_data.m_starlane_freq; + m_planet_density = m_lobby_data.m_planet_density; + m_specials_freq = m_lobby_data.m_specials_freq; + m_expected_players = m_network_core.Players().size() + m_lobby_data.m_AIs.size(); + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + if (it->first != msg.Sender()) + m_network_core.SendMessage(Message(Message::GAME_START, -1, it->first, Message::CLIENT_LOBBY_MODULE, "")); + } + m_state = SERVER_GAME_SETUP; + CreateAIClients(m_lobby_data.m_AIs); + m_player_save_game_data.clear(); + m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_GAME_SETUP << " (SERVER_GAME_SETUP)."; + if (m_expected_players == static_cast<int>(m_network_core.Players().size())) { + NewGameInit(); + m_state = SERVER_WAITING; + m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_WAITING << " (SERVER_WAITING)."; + } + } else { // load game + std::map<int, PlayerInfo>::const_iterator sender_it = m_network_core.Players().find(msg.Sender()); + if (sender_it != m_network_core.Players().end() && sender_it->second.host) { + m_empires.RemoveAllEmpires(); + m_single_player_game = false; + + std::string load_filename = (GetLocalDir() / "save" / m_lobby_data.m_save_games[m_lobby_data.m_save_file_index]).native_file_string(); + std::ifstream ifs(load_filename.c_str(), std::ios_base::binary); + { + boost::archive::xml_iarchive ia(ifs); + ia >> BOOST_SERIALIZATION_NVP(m_current_turn); + Universe::s_encoding_empire = ALL_EMPIRES; + ia >> BOOST_SERIALIZATION_NVP(m_player_save_game_data); + ia >> BOOST_SERIALIZATION_NVP(m_universe); } - m_state = SERVER_GAME_SETUP; - CreateAIClients(m_lobby_data.m_AIs); - m_player_save_game_data.clear(); - m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_GAME_SETUP << " (SERVER_GAME_SETUP)."; - if (m_expected_players == static_cast<int>(m_network_core.Players().size())) { - NewGameInit(); - m_state = SERVER_WAITING; - m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_WAITING << " (SERVER_WAITING)."; - } - } else { // load game - std::map<int, PlayerInfo>::const_iterator sender_it = m_network_core.Players().find(msg.Sender()); - if (sender_it != m_network_core.Players().end() && sender_it->second.host) { - m_empires.RemoveAllEmpires(); - m_single_player_game = false; + ifs.close(); + m_expected_players = m_player_save_game_data.size(); - std::string load_filename = (GetLocalDir() / "save" / m_lobby_data.m_save_games[m_lobby_data.m_save_file_index]).native_file_string(); - std::ifstream ifs(load_filename.c_str(), std::ios_base::binary); - { - boost::archive::xml_iarchive ia(ifs); - ia >> BOOST_SERIALIZATION_NVP(m_current_turn); - Universe::s_encoding_empire = ALL_EMPIRES; - ia >> BOOST_SERIALIZATION_NVP(m_player_save_game_data); - ia >> BOOST_SERIALIZATION_NVP(m_universe); - } - ifs.close(); - m_expected_players = m_player_save_game_data.size(); - - m_empires.RemoveAllEmpires(); - for (unsigned int i = 0; i < m_player_save_game_data.size(); ++i) { - for (unsigned int j = 0; j < m_lobby_data.m_players.size(); ++j) { - assert(m_player_save_game_data[i].m_empire); - if (m_lobby_data.m_players[j].m_save_game_empire_id == m_player_save_game_data[i].m_empire->EmpireID()) { - std::map<int, PlayerInfo>::const_iterator player_it = m_network_core.Players().begin(); - std::advance(player_it, j); - m_player_save_game_data[i].m_name = player_it->second.name; - m_player_save_game_data[i].m_empire->SetPlayerName(player_it->second.name); - } + m_empires.RemoveAllEmpires(); + for (unsigned int i = 0; i < m_player_save_game_data.size(); ++i) { + for (unsigned int j = 0; j < m_lobby_data.m_players.size(); ++j) { + assert(m_player_save_game_data[i].m_empire); + if (m_lobby_data.m_players[j].m_save_game_empire_id == m_player_save_game_data[i].m_empire->EmpireID()) { + std::map<int, PlayerInfo>::const_iterator player_it = m_network_core.Players().begin(); + std::advance(player_it, j); + m_player_save_game_data[i].m_name = player_it->second.name; + m_player_save_game_data[i].m_empire->SetPlayerName(player_it->second.name); } - m_empires.InsertEmpire(m_player_save_game_data[i].m_empire); } + m_empires.InsertEmpire(m_player_save_game_data[i].m_empire); + } - for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { - if (it != sender_it) - m_network_core.SendMessage(Message(Message::GAME_START, -1, it->first, Message::CLIENT_LOBBY_MODULE, "")); - } + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + if (it != sender_it) + m_network_core.SendMessage(Message(Message::GAME_START, -1, it->first, Message::CLIENT_LOBBY_MODULE, "")); + } - int AI_clients = m_expected_players - m_network_core.Players().size(); - CreateAIClients(std::vector<PlayerSetupData>(AI_clients)); - m_state = SERVER_GAME_SETUP; + int AI_clients = m_expected_players - m_network_core.Players().size(); + CreateAIClients(std::vector<PlayerSetupData>(AI_clients)); + m_state = SERVER_GAME_SETUP; - if (!AI_clients) - LoadGameInit(); - } else { - m_log_category.errorStream() << "Player #" << msg.Sender() << " attempted to initiate a game load, but is not the host, or is " - "not found in the player list."; - } + if (!AI_clients) + LoadGameInit(); + } else { + m_log_category.errorStream() << "Player #" << msg.Sender() << " attempted to initiate a game load, but is not the host, or is " + "not found in the player list."; } - } else { - const char* socket_hostname = SDLNet_ResolveIP(const_cast<IPaddress*>(&m_network_core.Players().find(msg.Sender())->second.address)); - m_log_category.errorStream() << "ServerApp::HandleMessage : A human player attempted to host " - "a new MP game with the wrong player name, or while one was not being setup. Terminating connection to " << - (socket_hostname ? socket_hostname : "[unknown host]") << " (player #" << msg.Sender() << ")"; - m_network_core.DumpPlayer(msg.Sender()); } break; } @@ -579,56 +568,70 @@ void ServerApp::HandleNonPlayerMessage(const Message& msg, const PlayerInfo& connection) { switch (msg.Type()) { - case Message::HOST_GAME: { + case Message::HOST_SP_GAME: { if (m_network_core.Players().empty() && m_expected_ai_players.empty()) { std::stringstream stream(msg.GetText()); XMLDoc doc; doc.ReadDoc(stream); std::string host_player_name = doc.root_node.Child("host_player_name").Text(); + PlayerInfo host_player_info(connection.socket, connection.address, host_player_name, true); + int player_id = NetworkCore::HOST_PLAYER_ID; + // immediately start a new game with the given parameters + m_single_player_game = true; + m_expected_players = boost::lexical_cast<int>(doc.root_node.Child("num_players").Text()); + m_galaxy_size = boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("size").Text()); + m_galaxy_shape = boost::lexical_cast<Shape>(doc.root_node.Child("universe_params").Child("shape").Text()); + m_galaxy_age = boost::lexical_cast<Age>(doc.root_node.Child("universe_params").Child("age").Text()); + m_starlane_freq = boost::lexical_cast<StarlaneFrequency>(doc.root_node.Child("universe_params").Child("starlane_freq").Text()); + m_planet_density = boost::lexical_cast<PlanetDensity>(doc.root_node.Child("universe_params").Child("planet_density").Text()); + m_specials_freq = boost::lexical_cast<SpecialsFrequency>(doc.root_node.Child("universe_params").Child("specials_freq").Text()); + CreateAIClients(doc.root_node); + m_player_save_game_data.clear(); + m_lobby_data.m_players.clear(); + m_lobby_data.m_players.push_back(PlayerSetupData()); + m_lobby_data.m_players.back().m_player_id = 0; + m_lobby_data.m_players.back().m_player_name = "Happy_Player"; + m_lobby_data.m_players.back().m_empire_name = doc.root_node.Child("empire_name").Text(); + m_lobby_data.m_players.back().m_empire_color = XMLToClr(doc.root_node.Child("empire_color").Child("GG::Clr")); + m_state = SERVER_GAME_SETUP; + if (m_network_core.EstablishPlayer(connection.socket, player_id, host_player_info)) { + m_network_core.SendMessage(HostSPAckMessage(player_id)); + m_network_core.SendMessage(JoinAckMessage(player_id)); + } + m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Server now in mode " << SERVER_GAME_SETUP << " (SERVER_GAME_SETUP)."; + m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Universe size set to " << m_galaxy_size << " systems (SERVER_GAME_SETUP)."; + m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Universe shape set to " << m_galaxy_shape << " (SERVER_GAME_SETUP)."; + } else { + const char* socket_hostname = SDLNet_ResolveIP(const_cast<IPaddress*>(&connection.address)); + m_log_category.errorStream() << "ServerApp::HandleNonPlayerMessage : A human player attempted to host " + "a new game but there was already one in progress or one being setup. Terminating connection to " << + (socket_hostname ? socket_hostname : "[unknown host]") << " on socket " << connection.socket; + m_network_core.DumpConnection(connection.socket); + } + break; + } + + case Message::HOST_MP_GAME: { + if (m_network_core.Players().empty() && m_expected_ai_players.empty()) { + std::string host_player_name = msg.GetText(); PlayerInfo host_player_info(connection.socket, connection.address, host_player_name, true); int player_id = NetworkCore::HOST_PLAYER_ID; - if (!doc.root_node.ContainsChild("universe_params")) { // start an MP lobby situation so that game settings can be established - m_single_player_game = false; - m_state = SERVER_MP_LOBBY; - m_lobby_data = MultiplayerLobbyData(true); - m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Server now in mode " << SERVER_MP_LOBBY << " (SERVER_MP_LOBBY)."; - if (m_network_core.EstablishPlayer(connection.socket, player_id, host_player_info)) { - m_network_core.SendMessage(HostAckMessage(player_id)); - m_network_core.SendMessage(JoinAckMessage(player_id)); - m_lobby_data.m_players.push_back(PlayerSetupData()); - m_lobby_data.m_players.back().m_player_id = player_id; - m_lobby_data.m_players.back().m_player_name = host_player_name; - m_lobby_data.m_players.back().m_empire_color = EmpireColors().at(0); - } - m_network_core.SendMessage(ServerLobbyUpdateMessage(player_id, LobbyUpdate())); - } else { // immediately start a new game with the given parameters - m_single_player_game = true; - m_expected_players = boost::lexical_cast<int>(doc.root_node.Child("num_players").Text()); - m_galaxy_size = boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("size").Text()); - m_galaxy_shape = boost::lexical_cast<Shape>(doc.root_node.Child("universe_params").Child("shape").Text()); - m_galaxy_age = boost::lexical_cast<Age>(doc.root_node.Child("universe_params").Child("age").Text()); - m_starlane_freq = boost::lexical_cast<StarlaneFrequency>(doc.root_node.Child("universe_params").Child("starlane_freq").Text()); - m_planet_density = boost::lexical_cast<PlanetDensity>(doc.root_node.Child("universe_params").Child("planet_density").Text()); - m_specials_freq = boost::lexical_cast<SpecialsFrequency>(doc.root_node.Child("universe_params").Child("specials_freq").Text()); - CreateAIClients(doc.root_node); - m_player_save_game_data.clear(); - m_lobby_data.m_players.clear(); + // start an MP lobby situation so that game settings can be established + m_single_player_game = false; + m_state = SERVER_MP_LOBBY; + m_lobby_data = MultiplayerLobbyData(true); + m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Server now in mode " << SERVER_MP_LOBBY << " (SERVER_MP_LOBBY)."; + if (m_network_core.EstablishPlayer(connection.socket, player_id, host_player_info)) { + m_network_core.SendMessage(HostMPAckMessage(player_id)); + m_network_core.SendMessage(JoinAckMessage(player_id)); m_lobby_data.m_players.push_back(PlayerSetupData()); - m_lobby_data.m_players.back().m_player_id = 0; - m_lobby_data.m_players.back().m_player_name = "Happy_Player"; - m_lobby_data.m_players.back().m_empire_name = doc.root_node.Child("empire_name").Text(); - m_lobby_data.m_players.back().m_empire_color = XMLToClr(doc.root_node.Child("empire_color").Child("GG::Clr")); - m_state = SERVER_GAME_SETUP; - if (m_network_core.EstablishPlayer(connection.socket, player_id, host_player_info)) { - m_network_core.SendMessage(HostAckMessage(player_id)); - m_network_core.SendMessage(JoinAckMessage(player_id)); - } - m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Server now in mode " << SERVER_GAME_SETUP << " (SERVER_GAME_SETUP)."; - m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Universe size set to " << m_galaxy_size << " systems (SERVER_GAME_SETUP)."; - m_log_category.debugStream() << "ServerApp::HandleNonPlayerMessage : Universe shape set to " << m_galaxy_shape << " (SERVER_GAME_SETUP)."; + m_lobby_data.m_players.back().m_player_id = player_id; + m_lobby_data.m_players.back().m_player_name = host_player_name; + m_lobby_data.m_players.back().m_empire_color = EmpireColors().at(0); } + m_network_core.SendMessage(ServerLobbyUpdateMessage(player_id, LobbyUpdate())); } else { const char* socket_hostname = SDLNet_ResolveIP(const_cast<IPaddress*>(&connection.address)); m_log_category.errorStream() << "ServerApp::HandleNonPlayerMessage : A human player attempted to host " @@ -636,10 +639,9 @@ (socket_hostname ? socket_hostname : "[unknown host]") << " on socket " << connection.socket; m_network_core.DumpConnection(connection.socket); } - break; } - + case Message::JOIN_GAME: { std::string player_name = msg.GetText(); |
From: <geo...@us...> - 2006-12-22 08:00:11
|
Revision: 1977 http://svn.sourceforge.net/freeorion/revision/?rev=1977&view=rev Author: geoffthemedio Date: 2006-12-22 00:00:08 -0800 (Fri, 22 Dec 2006) Log Message: ----------- -Updated system mouseover reticle image -Updated MSVC project files -Made fleetbuttons' default size a bit smaller... larger size was accidentally committed, and only really worked when halos were used, which currently are not by default -Shortened names of a few techs Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/default/data/art/misc/system_mouseover.png trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2006-12-15 23:45:39 UTC (rev 1976) +++ trunk/FreeOrion/UI/ClientUI.cpp 2006-12-22 08:00:08 UTC (rev 1977) @@ -218,7 +218,7 @@ // misc db.Add("UI.scroll-width", "OPTIONS_DB_UI_SCROLL_WIDTH", 14, RangedValidator<int>(8, 30)); db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); - db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 0.5, RangedValidator<double>(0.2, 2)); + db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 0.3, RangedValidator<double>(0.2, 2)); db.Add("UI.system-selection-indicator-size", "OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE", 2.0, RangedValidator<double>(0.5, 5)); // tech category colors Modified: trunk/FreeOrion/default/data/art/misc/system_mouseover.png =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2006-12-15 23:45:39 UTC (rev 1976) +++ trunk/FreeOrion/default/eng_stringtable.txt 2006-12-22 08:00:08 UTC (rev 1977) @@ -2800,7 +2800,7 @@ Applying the concepts of Planetary Geology allows effective extraction of minerals from near the surface of planets. By identifying the probable locations and ideal extraction methods, efficiency and total possible production are increased. As well, proper planning and analysis increase mine safety and longevity.\n\nBonuses depend on planet type:\nBarren and Inferno recive +4 per 10 population of planet at mining focused worlds.\nDesert, Radiated and Toxic recive +2.\nTundra and Terran recive +1.\nOcean and Swap receive no bonus.\n\nLarge research cost and time and lack of building-production requirement to receive effect make technology attractive for research-focused empires, but less useful for production-focused. Bonuses are largest on low-population planet types, making overall benefit small until future advances can increase the popluations of these planet types. PRO_INDUSTRY_CENTRE_I -Regional Industrial Centres +Industrial Centres PRO_INDUSTRY_CENTRE_I_DESC Coordinating industrial activity between planets and star systems can be effectively accomplished at large centralized complexes.\n\nFacility's large cost and build time, as well as significant future range growth potential, require strong planning to produce in location with ideal future utility. Large industrial benefits come with large up-front cost, in both production resources and time, but with minimal research prerequisites, making facility useful for high-production strategies, but unattractive for research-focused empires. @@ -2816,13 +2816,13 @@ Experience with operation of initial implementations of asteroid mining techniques allows more refined methods to be devised. The same asteroid field and population produces additional minerals at all planets in-system that focus primarily on mining. PRO_INDUSTRY_CENTRE_II -Greater Regional Industrial Centre +Greater Industrial Centre PRO_INDUSTRY_CENTRE_II_DESC Improved centralized management of dispersed industrial activities increases the range and size of increased industiral output provided. PRO_INDUSTRY_CENTRE_III -Supreme Regional Industrial Centre +Supreme Industrial Centre PRO_INDUSTRY_CENTRE_III_DESC Additional experience and facilities improvements further extend the range and size of industrial output improvement. @@ -2874,7 +2874,7 @@ Available with Heavy Mining Processors.\n\nProvides +5 mining to mining-focused worlds, non stacking, within 100 distance of the facility, that are of type Barren, Radiated, Toxic or Inferno. Also proves +2 to mining and -5 to farming, both non-stacking, on planet at which it is built. BLD_INDUSTRY_CENTRE -Regional Industrial Centre +Industrial Centre BLD_INDUSTRY_CENTRE_DESC Available with Regional Industrial Centres.\n\nInitially provides +5 industry within 100 direct-line distance of facility, non stacking, to industry-focused worlds.\n\nGreater Regional Industrial Centre refinement increases bonus to +6 and increases distance to 200.\n\nSupreme Regional Industrial Centre refinement further increases bonus to +7 and range to 300. Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2006-12-15 23:45:39 UTC (rev 1976) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2006-12-22 08:00:08 UTC (rev 1977) @@ -127,7 +127,7 @@ <Tool Name="VCCLCompilerTool" Optimization="2" - AdditionalIncludeDirectories="C:\FreeOrion\GG;"C:\Boost\include\boost-1_33_1";C:\DevIL\include;C:\fmodapi375win\api\inc;"C:\log4cpp-0.3.4b\include";"C:\SDL-1.2.7\include";C:\zlib\include;C:\graphviz\include;"C:\freetype-2.1.7\include";"C:\OpenAL 1.1 SDK\include";"C:\alut-1.1.0\include";"C:\oggvorbis-win32sdk-1.0\include"" + AdditionalIncludeDirectories="C:\FreeOrion\GG;"C:\Boost\include\boost-1_33_1";C:\DevIL\include;C:\fmodapi375win\api\inc;"C:\log4cpp-0.3.4b\include";"C:\SDL-1.2.7\include";C:\zlib\include;C:\graphviz\include;"C:\freetype-2.1.7\include";"C:\OpenAL 1.1 SDK\include";"C:\alut-1.1.0\include";"C:\libvorbis-1.1.2\include";"C:\libogg-1.1.3\include"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;FREEORION_BUILD_HUMAN;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE" RuntimeLibrary="2" DisableLanguageExtensions="false" @@ -151,10 +151,10 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib fmodvc.lib log4cpp.lib freetype214MT.lib cdt.lib circogen.lib common.lib dotgen.lib fdpgen.lib gd.lib graph.lib gvc.lib libexpat.lib neatogen.lib pack.lib pathplan.lib plugin.lib twopigen.lib png.lib jpeg.lib OpenAL32.lib alut.lib vorbisfile.lib" + AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib fmodvc.lib log4cpp.lib freetype214MT.lib cdt.lib circogen.lib common.lib dotgen.lib fdpgen.lib gd.lib graph.lib gvc.lib libexpat.lib neatogen.lib pack.lib pathplan.lib plugin.lib twopigen.lib png.lib jpeg.lib OpenAL32.lib alut.lib vorbisfile_d.lib" OutputFile="$(OutDir)/freeorion.exe" LinkIncremental="1" - AdditionalLibraryDirectories="C:\FreeOrion\GG;C:\Boost\lib;C:\DevIL\lib;C:\fmodapi375win\api\lib;"C:\freetype-2.1.7\objs";C:\Graphviz\lib;"C:\SDL-1.2.7\lib";C:\zlib\lib;"C:\log4cpp-0.3.4b\msvc6\log4cppDLL\Release";"C:\OpenAL 1.1 SDK\libs\Win32";"C:\alut-1.1.0\lib";"C:\oggvorbis-win32sdk-1.0\lib"" + AdditionalLibraryDirectories="C:\FreeOrion\GG;C:\Boost\lib;C:\DevIL\lib;C:\fmodapi375win\api\lib;"C:\freetype-2.1.7\objs";C:\Graphviz\lib;"C:\SDL-1.2.7\lib";C:\zlib\lib;"C:\log4cpp-0.3.4b\msvc6\log4cppDLL\Release";"C:\OpenAL 1.1 SDK\libs\Win32";"C:\alut-1.1.0\lib";"C:\libvorbis-1.1.2\win32\VorbisFile_Dynamic_Debug";"C:\libogg-1.1.3\win32\Dynamic_Debug"" GenerateManifest="true" IgnoreDefaultLibraryNames="LIBCMT" GenerateDebugInformation="true" @@ -287,10 +287,6 @@ Name="client" > <File - RelativePath="..\..\..\client\ClientApp.cpp" - > - </File> - <File RelativePath="..\..\..\client\ClientApp.h" > </File> @@ -302,6 +298,10 @@ > </File> <File + RelativePath="..\..\..\client\ClientApp.cpp" + > + </File> + <File RelativePath="..\..\..\client\human\HumanClientApp.cpp" > </File> @@ -478,14 +478,6 @@ Name="Empire" > <File - RelativePath="..\..\..\Empire\ClientEmpireManager.cpp" - > - </File> - <File - RelativePath="..\..\..\Empire\ClientEmpireManager.h" - > - </File> - <File RelativePath="..\..\..\Empire\Empire.cpp" > </File> Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2006-12-15 23:45:39 UTC (rev 1976) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2006-12-22 08:00:08 UTC (rev 1977) @@ -318,14 +318,6 @@ Name="Empire" > <File - RelativePath="..\..\..\Empire\ClientEmpireManager.cpp" - > - </File> - <File - RelativePath="..\..\..\Empire\ClientEmpireManager.h" - > - </File> - <File RelativePath="..\..\..\Empire\Empire.cpp" > </File> @@ -446,6 +438,10 @@ > </File> <File + RelativePath="..\..\..\universe\Parser.h" + > + </File> + <File RelativePath="..\..\..\universe\ParserUtil.cpp" > </File> @@ -646,10 +642,6 @@ > </File> <File - RelativePath="..\..\..\util\Parse.h" - > - </File> - <File RelativePath="..\..\..\util\Process.cpp" > </File> Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2006-12-15 23:45:39 UTC (rev 1976) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2006-12-22 08:00:08 UTC (rev 1977) @@ -322,14 +322,6 @@ RelativePath="..\..\..\Empire\ResourcePool.h" > </File> - <File - RelativePath="..\..\..\Empire\ServerEmpireManager.cpp" - > - </File> - <File - RelativePath="..\..\..\Empire\ServerEmpireManager.h" - > - </File> </Filter> <Filter Name="network" @@ -367,6 +359,14 @@ > </File> <File + RelativePath="..\..\..\server\SaveLoad.cpp" + > + </File> + <File + RelativePath="..\..\..\server\SaveLoad.h" + > + </File> + <File RelativePath="..\..\..\server\ServerApp.cpp" > </File> |
From: <geo...@us...> - 2007-05-17 18:34:26
|
Revision: 2053 http://svn.sourceforge.net/freeorion/revision/?rev=2053&view=rev Author: geoffthemedio Date: 2007-05-17 11:34:24 -0700 (Thu, 17 May 2007) Log Message: ----------- -Fixed layout of TechTreeWnd TechNavigator when it is resized. -Made titles of TechNavigator and TechDetailPanel into UserStrings -Updated tech icon, and several references to tech icons in text.txt Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/default/data/art/tech_icons/Stellar_Tomography.png trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/default/techs.txt Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-05-14 18:54:20 UTC (rev 2052) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-05-17 18:34:24 UTC (rev 2053) @@ -373,7 +373,7 @@ }; TechTreeWnd::TechTreeControls::TechTreeControls(int x, int y, int w) : - CUIWnd("Display", x, y, w, 10, GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE) + CUIWnd(UserString("TECH_DISPLAY"), x, y, w, 10, GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE) { // create a button for each tech category... const std::vector<std::string>& cats = GetTechManager().CategoryNames(); @@ -676,7 +676,7 @@ m_tech_graphic->SizeMove(ul, lr); } if (m_category_graphic) { - lr = GG::Pt(Width(), ICON_SIZE + 1); + lr = GG::Pt(Width() - BORDER_RIGHT, ICON_SIZE + 1); ul = lr - GG::Pt(ICON_SIZE, ICON_SIZE); m_category_graphic->SizeMove(ul, lr); } @@ -876,8 +876,6 @@ class TechTreeWnd::TechNavigator : public CUIWnd { public: - enum {ROW_HEIGHT = 25}; - TechNavigator(int w, int h); const Tech* CurrentTech() const {return m_current_tech;} @@ -895,8 +893,9 @@ class SectionHeaderControl : public GG::Control { public: - SectionHeaderControl(int w, int h, const std::string& str); + SectionHeaderControl(const std::string& str); virtual void Render(); + virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); GG::TextControl* m_label; }; @@ -904,30 +903,34 @@ class TechControl : public GG::Control { public: - TechControl(int w, int h, const Tech* tech, int indentation); + TechControl(const Tech* tech); virtual GG::Pt ClientUpperLeft() const {return UpperLeft() + GG::Pt(3, 2);} virtual GG::Pt ClientLowerRight() const {return LowerRight() - GG::Pt(2, 2);} + virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); virtual void Render(); virtual void LClick(const GG::Pt& pt, Uint32 keys) {ClickedSignal(m_tech);} virtual void MouseEnter(const GG::Pt& pt, Uint32 keys) {m_selected = true;} virtual void MouseLeave() {m_selected = false;} + + mutable boost::signal<void (const Tech*)> ClickedSignal; + + private: const Tech * const m_tech; GG::Clr m_border_color; GG::TextControl* m_name_text; - mutable boost::signal<void (const Tech*)> ClickedSignal; - private: - int m_indentation; bool m_selected; }; static const int TECH_ROW_INDENTATION = 8; static const int LB_MARGIN_X = 5; static const int LB_MARGIN_Y = 5; - + GG::ListBox::Row* NewSectionHeaderRow(const std::string& str); GG::ListBox::Row* NewTechRow(const Tech* tech); void Reset(); + void DoLayout(); + std::set<boost::signals::connection> m_row_connections; const Tech* m_current_tech; @@ -935,28 +938,27 @@ }; TechTreeWnd::TechNavigator::TechNavigator(int w, int h) : - CUIWnd("Navigation", 0, 0, w, h, GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE), + CUIWnd(UserString("TECH_NAVIGATION"), 0, 0, w, h, GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE), m_current_tech(0) { - m_lb = new CUIListBox(LB_MARGIN_X, LB_MARGIN_Y, ClientWidth() - LB_MARGIN_X, ClientHeight() - LB_MARGIN_Y); + m_lb = new CUIListBox(LB_MARGIN_X, LB_MARGIN_Y, 100, 100); // resized later when TechNavigator is SizeMoved m_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL); AttachChild(m_lb); - EnableChildClipping(true); } GG::ListBox::Row* TechTreeWnd::TechNavigator::NewSectionHeaderRow(const std::string& str) { - GG::ListBox::Row* retval = new GG::ListBox::Row(Width() - 33 - 14, ROW_HEIGHT + 2, ""); - retval->push_back(new SectionHeaderControl(Width() - 33 - 14, ROW_HEIGHT, str)); + GG::ListBox::Row* retval = new GG::ListBox::Row(m_lb->Width(), 3*ClientUI::Pts()/2 + 4, ""); + retval->push_back(new SectionHeaderControl(str)); return retval; } GG::ListBox::Row* TechTreeWnd::TechNavigator::NewTechRow(const Tech* tech) { - GG::ListBox::Row* retval = new GG::ListBox::Row(Width() - TECH_ROW_INDENTATION - 8 - 14, ROW_HEIGHT + 2, ""); - TechControl* control = new TechControl(Width() - TECH_ROW_INDENTATION - 8 - 14, ROW_HEIGHT, tech, TECH_ROW_INDENTATION); + TechControl* control = new TechControl(tech); + m_row_connections.insert(GG::Connect(control->ClickedSignal, &TechTreeWnd::TechNavigator::TechClickedSlot, this)); + GG::ListBox::Row* retval = new GG::ListBox::Row(m_lb->Width(), 3*ClientUI::Pts()/2 + 4, ""); retval->push_back(control); - m_row_connections.insert(GG::Connect(control->ClickedSignal, &TechTreeWnd::TechNavigator::TechClickedSlot, this)); return retval; } @@ -982,13 +984,29 @@ for (std::set<std::string>::const_iterator it = unlocks.begin(); it != unlocks.end(); ++it) { m_lb->Insert(NewTechRow(GetTech(*it))); } + + DoLayout(); } void TechTreeWnd::TechNavigator::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { // maybe later do something interesting with docking CUIWnd::SizeMove(ul, lr); + + DoLayout(); +} + +void TechTreeWnd::TechNavigator::DoLayout() +{ m_lb->Resize(ClientSize() - GG::Pt(2*LB_MARGIN_X, 2*LB_MARGIN_Y)); + + for (int i = 0; i < m_lb->NumRows(); ++i) { + GG::ListBox::Row& row = m_lb->GetRow(i); + GG::Pt size = GG::Pt(m_lb->Width() - 4*LB_MARGIN_X, row.Height()); + row.Resize(size); + GG::Control* control = row.at(0); + control->Resize(size); + } } void TechTreeWnd::TechNavigator::LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) @@ -1025,12 +1043,12 @@ } } - - -TechTreeWnd::TechNavigator::SectionHeaderControl::SectionHeaderControl(int w, int h, const std::string& str) : - GG::Control(0, 0, w, h) +TechTreeWnd::TechNavigator::SectionHeaderControl::SectionHeaderControl(const std::string& str) : + GG::Control(0, 0, 10, 3*ClientUI::Pts()/2 + 4) { - m_label = new GG::TextControl(8, 0, w - 8, h, str, GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), ClientUI::KnownTechTextAndBorderColor(), GG::TF_LEFT); + m_label = new GG::TextControl(0, 0, 10, 3*ClientUI::Pts()/2 + 4, str, + GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), + ClientUI::KnownTechTextAndBorderColor(), GG::TF_LEFT); AttachChild(m_label); } @@ -1080,10 +1098,17 @@ glEnable(GL_TEXTURE_2D); } -TechTreeWnd::TechNavigator::TechControl::TechControl(int w, int h, const Tech* tech, int indentation) : - GG::Control(0, 0, w, h), +void TechTreeWnd::TechNavigator::SectionHeaderControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) +{ + GG::Wnd::SizeMove(ul, lr); + GG::Pt label_ul(TECH_ROW_INDENTATION, 0); + GG::Pt label_lr(ClientWidth(), ClientHeight()); + m_label->SizeMove(label_ul, label_lr); +} + +TechTreeWnd::TechNavigator::TechControl::TechControl(const Tech* tech) : + GG::Control(0, 0, 10, 3*ClientUI::Pts()/2 + 4), m_tech(tech), - m_indentation(indentation), m_selected(false) { EnableChildClipping(true); @@ -1113,14 +1138,16 @@ } #endif GG::Pt client_size = ClientSize(); - m_name_text = new GG::TextControl(m_indentation, 0, client_size.x - m_indentation, client_size.y, UserString(m_tech->Name()), GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), m_border_color, GG::TF_LEFT); + m_name_text = new GG::TextControl(0, 0, 10, 3*ClientUI::Pts()/2 + 4, UserString(m_tech->Name()), + GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), + m_border_color, GG::TF_LEFT); AttachChild(m_name_text); } void TechTreeWnd::TechNavigator::TechControl::Render() { GG::Rect rect(UpperLeft(), LowerRight()); - rect += GG::Pt(m_indentation, 0); + rect += GG::Pt(TECH_ROW_INDENTATION, 0); TechType tech_type = m_tech->Type(); GG::Clr color_to_use = Color(); GG::Clr border_color_to_use = m_border_color; @@ -1141,6 +1168,13 @@ glEnable(GL_TEXTURE_2D); } +void TechTreeWnd::TechNavigator::TechControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) +{ + GG::Wnd::SizeMove(ul, lr); + GG::Pt text_ul(TECH_ROW_INDENTATION, 0); + GG::Pt text_lr(ClientWidth() - TECH_ROW_INDENTATION, ClientHeight()); + m_name_text->SizeMove(text_ul, text_lr); +} ////////////////////////////////////////////////// // TechTreeWnd::LayoutPanel // ////////////////////////////////////////////////// @@ -1774,7 +1808,8 @@ void TechTreeWnd::LayoutPanel::Layout(bool keep_position, double old_scale/* = -1.0*/) { - const int TECH_PANEL_MARGIN = ClientUI::Pts()*16; + const int TECH_PANEL_MARGIN_X = ClientUI::Pts()*16; + const int TECH_PANEL_MARGIN_Y = ClientUI::Pts()*16 + 100; if (old_scale < 0.0) old_scale = m_scale; @@ -1785,8 +1820,8 @@ } else { GG::Pt cl_sz = ClientSize(); GG::Pt center = m_scroll_position + GG::Pt(cl_sz.x / 2, cl_sz.y / 2); - center.x = static_cast<int>((center.x - TECH_PANEL_MARGIN) * m_scale / old_scale + 0.5 + TECH_PANEL_MARGIN); - center.y = static_cast<int>((center.y - TECH_PANEL_MARGIN) * m_scale / old_scale + 0.5 + TECH_PANEL_MARGIN); + center.x = static_cast<int>((center.x - TECH_PANEL_MARGIN_X) * m_scale / old_scale + 0.5 + TECH_PANEL_MARGIN_X); + center.y = static_cast<int>((center.y - TECH_PANEL_MARGIN_Y) * m_scale / old_scale + 0.5 + TECH_PANEL_MARGIN_Y); final_position = GG::Pt(center.x - cl_sz.x / 2, center.y - cl_sz.y / 2); } } @@ -1849,8 +1884,8 @@ const Tech* tech = GetTech(node->name); assert(tech); m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, m_categories_shown, m_tech_types_shown, m_tech_statuses_shown, m_scale); - m_techs[tech]->MoveTo(GG::Pt(static_cast<int>(PS2INCH(ND_coord_i(node).x) - m_techs[tech]->Width() / 2 + TECH_PANEL_MARGIN), - static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) / 2 + TECH_PANEL_MARGIN))); + m_techs[tech]->MoveTo(GG::Pt(static_cast<int>(PS2INCH(ND_coord_i(node).x) - m_techs[tech]->Width() / 2 + TECH_PANEL_MARGIN_X), + static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) / 2 + TECH_PANEL_MARGIN_Y))); m_layout_surface->AttachChild(m_techs[tech]); m_tech_connections.insert(GG::Connect(m_techs[tech]->TechBrowsedSignal, &TechTreeWnd::LayoutPanel::TechBrowsedSlot, this)); m_tech_connections.insert(GG::Connect(m_techs[tech]->TechClickedSignal, &TechTreeWnd::LayoutPanel::TechClickedSlot, this)); @@ -1865,8 +1900,8 @@ for (int i = 0; i < ED_spl(edge)->size; ++i) { std::vector<std::pair<int, int> > temp; for (int j = 0; j < ED_spl(edge)->list[i].size; ++j) { - temp.push_back(std::make_pair(static_cast<int>(PS2INCH(ED_spl(edge)->list[i].list[j].x) + TECH_PANEL_MARGIN), - static_cast<int>(PS2INCH(ED_spl(edge)->list[i].list[j].y) + TECH_PANEL_MARGIN))); + temp.push_back(std::make_pair(static_cast<int>(PS2INCH(ED_spl(edge)->list[i].list[j].x) + TECH_PANEL_MARGIN_X), + static_cast<int>(PS2INCH(ED_spl(edge)->list[i].list[j].y) + TECH_PANEL_MARGIN_Y))); } points.push_back(Spline(temp)); } @@ -1889,10 +1924,10 @@ GG::Pt client_sz = ClientSize(); GG::Pt layout_size(std::max(client_sz.x, static_cast<int>(PS2INCH(GD_bb(graph).UR.x - GD_bb(graph).LL.x) + - 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_LEFT_EXTRUSION * m_scale)), + 2 * TECH_PANEL_MARGIN_X + PROGRESS_PANEL_LEFT_EXTRUSION * m_scale)), std::max(client_sz.y, static_cast<int>(PS2INCH(GD_bb(graph).UR.y - GD_bb(graph).LL.y) + - 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale))); + 2 * TECH_PANEL_MARGIN_Y + PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale))); m_layout_surface->Resize(layout_size); m_vscroll->SizeScroll(0, layout_size.y - 1, std::max(50, std::min(layout_size.y / 10, client_sz.y)), client_sz.y); m_hscroll->SizeScroll(0, layout_size.x - 1, std::max(50, std::min(layout_size.x / 10, client_sz.x)), client_sz.x); Modified: trunk/FreeOrion/default/data/art/tech_icons/Stellar_Tomography.png =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2007-05-14 18:54:20 UTC (rev 2052) +++ trunk/FreeOrion/default/eng_stringtable.txt 2007-05-17 18:34:24 UTC (rev 2053) @@ -1104,6 +1104,12 @@ # TechTreeWnd # ############### +TECH_DISPLAY +Display + +TECH_NAVIGATION +Navigation + TECH_TOTAL_COST_STR %1% RP / %2% Turns @@ -1131,12 +1137,6 @@ TECH_DETAIL_UNLOCKED_ITEM_STR %1%: %2%\n -TECH_DETAIL_CENTER_ON_TECH -Center on Tech - -TECH_DETAIL_ADD_TO_QUEUE -Add to Queue - TECH_WND_TECH_COMPLETED COMPLETED Modified: trunk/FreeOrion/default/techs.txt =================================================================== --- trunk/FreeOrion/default/techs.txt 2007-05-14 18:54:20 UTC (rev 2052) +++ trunk/FreeOrion/default/techs.txt 2007-05-17 18:34:24 UTC (rev 2053) @@ -903,7 +903,7 @@ "PRO_FRC_FLD_ASSMB" ] unlock = [] - graphic = "" + graphic = "tech_icons/N-Dimensional_Assembly.png" Tech name = "PRO_SINGULAR_GEN" @@ -1283,7 +1283,7 @@ researchturns = 5 prerequisites = "PRO_ORBITAL_GEN" unlock = Item type = Building name = "BLD_MINI_SUN" - graphic = "" + graphic = "tech_icons/Miniature_Suns.png" TechCategory "CONSTRUCTION_CATEGORY" @@ -1510,7 +1510,7 @@ "PRO_NDIM_ASSMB" ] unlock = [] - graphic = "" + graphic = "tech_icons/N-Dimensional_Structures.png" Tech name = "CON_GRAVITY_WELLS" |
From: <geo...@us...> - 2007-05-25 01:53:08
|
Revision: 2055 http://svn.sourceforge.net/freeorion/revision/?rev=2055&view=rev Author: geoffthemedio Date: 2007-05-24 18:53:09 -0700 (Thu, 24 May 2007) Log Message: ----------- -Added AIInterface functions to be used by AI implementations to interact with the rest of the game. C++ implementations of AI will find these to be just utility functions, but they can also be exposed to other languages, such as Python, as a simpler interface than the various other classes and functions that they wrap -Added ReferenceAI, which takes all the previous AI code out of AIClientApp -Added AIBase class, which specific AI implementations should inherit from. AIClientApp now has a member AIBase* that points to whatever implementation of AIBase is being used as the AI logic. Currently AIClientApp creates a new ReferenceAI when initialized. -Also added PythonAI class, which is not presently used and not tested, but which will set up a wrapping of AIInterface classes with Boost.Python, as well as initialize a Python interpreter and call a Python implementation of AI, which itself calls the exposed-to-Python AIInterface functions to access the gamestate and issue orders. -Added FreeOrionAI.py Python AI code that is to be called by PythonAI -Updated freeorionca.vcproj MSVC project file for AI to include the new files. Still need to do the SCons files... -Updated Asteroid Mining tech icons. Modified Paths: -------------- trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/AI/AIClientApp.h trunk/FreeOrion/client/ClientApp.h trunk/FreeOrion/default/data/art/tech_icons/Asteroid_Mining_I.png trunk/FreeOrion/default/data/art/tech_icons/Asteroid_Mining_II.png trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj Added Paths: ----------- trunk/FreeOrion/AI/ trunk/FreeOrion/AI/AIInterface.cpp trunk/FreeOrion/AI/AIInterface.h trunk/FreeOrion/AI/FreeOrionAI.py trunk/FreeOrion/AI/PythonAI.cpp trunk/FreeOrion/AI/PythonAI.h trunk/FreeOrion/AI/ReferenceAI.cpp trunk/FreeOrion/AI/ReferenceAI.h Added: trunk/FreeOrion/AI/AIInterface.cpp =================================================================== --- trunk/FreeOrion/AI/AIInterface.cpp (rev 0) +++ trunk/FreeOrion/AI/AIInterface.cpp 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,230 @@ +#include "AIInterface.h" + +#include "../util/MultiplayerCommon.h" +#include "../network/ClientNetworkCore.h" +#include "../client/AI/AIClientApp.h" + +#include "../universe/Universe.h" +#include "../universe/UniverseObject.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" + + +#include "../util/OrderSet.h" + +#include <stdexcept> +#include <string> +#include <map> + +////////////////////////////////// +// AI Base // +////////////////////////////////// +void AIBase::GenerateOrders() +{ + AIInterface::DoneTurn(); +} + +void AIBase::HandleChatMessage(int sender_id, const std::string& msg) +{} + +////////////////////////////////// +// AI Interface // +////////////////////////////////// +namespace AIInterface { + const Universe& GetUniverse() + { + return AIClientApp::GetApp()->GetUniverse(); + } + + const std::string& PlayerName() + { + return AIClientApp::GetApp()->PlayerName(); + } + + const std::string& PlayerName(int player_id) + { + const std::map<int, PlayerInfo>& players = AIClientApp::GetApp()->Players(); + std::map<int, PlayerInfo>::const_iterator it = players.find(player_id); + if (it != players.end()) + return it->second.name; + else + throw std::invalid_argument("AIInterface::PlayerName : given invalid player_id"); + } + + int PlayerID() + { + return AIClientApp::GetApp()->PlayerID(); + } + + int EmpireID() + { + return AIClientApp::GetApp()->EmpireID(); + } + + const Empire* GetEmpire() + { + return AIClientApp::GetApp()->Empires().Lookup(AIClientApp::GetApp()->EmpireID()); + } + + const Empire* GetEmpire(int empire_id) + { + return AIClientApp::GetApp()->Empires().Lookup(empire_id); + } + + int EmpirePlayerID(int empire_id) + { + return AIClientApp::GetApp()->GetEmpirePlayerID(empire_id); + } + + const Empire* GetPlayerEmpire(int player_id) + { + return AIClientApp::GetApp()->GetPlayerEmpire(player_id); + } + + int CurrentTurn() + { + return AIClientApp::GetApp()->CurrentTurn(); + } + + int IssueFleetMoveOrder(int fleet_id, int destination_id) + { + Universe& universe = AIClientApp::GetApp()->GetUniverse(); + + const Fleet* fleet = universe.Object<Fleet>(fleet_id); + if (!fleet) { + Logger().errorStream() << "AIInterface::IssueFleetMoveOrder : passed an invalid fleet_id"; + return 0; + } + + int empire_id = AIClientApp::GetApp()->EmpireID(); + if (!fleet->WhollyOwnedBy(empire_id)) { + Logger().errorStream() << "AIInterface::IssueFleetMoveOrder : passed fleet_id of fleet not owned only by player"; + return 0; + } + + int start_id = fleet->SystemID(); + if (start_id == UniverseObject::INVALID_OBJECT_ID) + start_id = fleet->NextSystemID(); + + AIClientApp::GetApp()->Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet_id, start_id, destination_id)); + + return 1; + } + + int IssueRenameOrder() + { + return 0; + } + + int IssueNewFleetOrder(const std::string fleet_name, const std::vector<int>& ship_ids) + { + if (ship_ids.empty()) { + Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed empty vector of ship_ids"; + return 0; + } + + Universe& universe = AIClientApp::GetApp()->GetUniverse(); + int empire_id = AIClientApp::GetApp()->EmpireID(); + Ship* ship = 0; + + // make sure all ships exist and are owned just by this player + for (std::vector<int>::const_iterator it = ship_ids.begin(); it != ship_ids.end(); ++it) { + ship = universe.Object<Ship>(*it); + if (!ship) { + Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed an invalid ship_id"; + return 0; + } + if (!ship->WhollyOwnedBy(empire_id)) { + Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed ship_id of ship not owned only by player"; + return 0; + } + } + + // make sure all ships are at the same location + System* system = ship->GetSystem(); + int system_id = ship->SystemID(); + double ship_x = ship->X(); + double ship_y = ship->Y(); + if (system_id != UniverseObject::INVALID_OBJECT_ID) { + // ships are located in a system: can just check that all ships have same system id as first ship + std::vector<int>::const_iterator it = ship_ids.begin(); + for (++it; it != ship_ids.end(); ++it) { + Ship* ship2 = universe.Object<Ship>(*it); + if (ship2->SystemID() != system_id) { + Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed ship_ids of ships at different locations"; + return 0; + } + } + } else { + // ships are located in deep space: need to check their exact locations + std::vector<int>::const_iterator it = ship_ids.begin(); + for (++it; it != ship_ids.end(); ++it) { + Ship* ship2 = universe.Object<Ship>(*it); + if ((ship2->X() != ship_x) || (ship2->Y() != ship_y)) { + Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed ship_ids of ships at different locations"; + return 0; + } + } + } + + int new_fleet_id = ClientApp::GetNewObjectID(); + if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) + throw std::runtime_error("Couldn't get new object ID when transferring ship to new fleet"); + + if (system) + AIClientApp::GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, system->ID(), ship_ids)); + else + AIClientApp::GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, ship_x, ship_y, ship_ids)); + + return 1; + } + + int IssueFleetTransferOrder() + { + return 0; + } + + int IssueFleetColonizeOrder() + { + return 0; + } + + int IssueDeleteFleetOrder() + { + return 0; + } + + int IssueChangeFocusOrder() + { + return 0; + } + + int IssueResearchQueueOrder() + { + return 0; + } + + int IssueProductionQueueOrder() + { + return 0; + } + + void SendPlayerChatMessage(int recipient_player_id, const std::string& message_text) + { + if (recipient_player_id == -1) + AIClientApp::GetApp()->NetworkCore().SendMessage(GlobalChatMessage(PlayerID(), message_text)); + else + AIClientApp::GetApp()->NetworkCore().SendMessage(SingleRecipientChatMessage(PlayerID(), recipient_player_id, message_text)); + } + + void DoneTurn() + { + AIClientApp::GetApp()->StartTurn(); // encodes order sets and sends turn orders message. "done" the turn for the client, but "starts" the turn for the server + } + + void SaveState() + {} + + void LoadState() + {} +} // namespace AIInterface \ No newline at end of file Added: trunk/FreeOrion/AI/AIInterface.h =================================================================== --- trunk/FreeOrion/AI/AIInterface.h (rev 0) +++ trunk/FreeOrion/AI/AIInterface.h 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,65 @@ +#ifndef AI_INTERFACE +#define AI_INTERFACE + +#include "../universe/Universe.h" +#include "../universe/UniverseObject.h" +#include "../universe/Condition.h" +#include "../util/Order.h" + +#include <string> + +class AIClientApp; +class Empire; + +/* AI logic modules implement this class, and AIClientApps contain one, and call it to generate orders */ +class AIBase +{ +public: + virtual void GenerateOrders(); ///< The server has sent a new turn update. AI should review the new gamestate and send orders for this turn. + virtual void HandleChatMessage(int sender_id, const std::string& msg); ///< another player has sent a chat message to this player. AI can respond or ignore. +}; + +/* Public interface providing functions that an AI client program can call to get information about the + gamestate and to interact with it, such as by issuing orders, ending its turn, or sending message to + other players. */ +namespace AIInterface +{ + /** Gamestate Accessors */ //@{ + const Universe& GetUniverse(); ///< returns Universe known to this player + + const std::string& PlayerName(); ///< returns the player name of this client + const std::string& PlayerName(int player_id); ///< returns the name of player with \a player_id + + int PlayerID(); ///< returns the player ID of this client + int EmpireID(); ///< returns the empire ID of this client + const Empire* GetEmpire(); ///< returns empire of this client's player + const Empire* GetEmpire(int empire_id); ///< returns empire with id \a empire_id + const Empire* GetPlayerEmpire(int player_id); ///< returns empire of player with id \a player_id + int EmpirePlayerID(int empire_id); ///< returns ID of player controlling empire with id \a empire_id + + int CurrentTurn(); ///< returns the current game turn + //@} + + /** Order-Giving */ //@{ + int IssueFleetMoveOrder(int fleet_id, int destination_id); + int IssueRenameOrder(); + int IssueNewFleetOrder(const std::string fleet_name, const std::vector<int>& ship_ids); + int IssueFleetTransferOrder(); + int IssueFleetColonizeOrder(); + int IssueDeleteFleetOrder(); + int IssueChangeFocusOrder(); + int IssueResearchQueueOrder(); + int IssueProductionQueueOrder(); + + void SendPlayerChatMessage(int recipient_player_id, const std::string& message_text); + + void DoneTurn(); ///< AI player is done submitting orders for this turn + //@} + + /** AI State storage and retrieval */ //@{ + void SaveState(); + void LoadState(); + //@} +}; + +#endif \ No newline at end of file Added: trunk/FreeOrion/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/AI/FreeOrionAI.py (rev 0) +++ trunk/FreeOrion/AI/FreeOrionAI.py 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,7 @@ + +def GenerateOrders(): + import FreeOrionAIPythonInterface + + foInt = FreeOrionAIPythonInterface.fointerface() + + foInt.DoneTurn() \ No newline at end of file Added: trunk/FreeOrion/AI/PythonAI.cpp =================================================================== --- trunk/FreeOrion/AI/PythonAI.cpp (rev 0) +++ trunk/FreeOrion/AI/PythonAI.cpp 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,45 @@ +#include "PythonAI.h" + +#include <boost/python.hpp> + +//////////////////////// +// Python AIInterface // +//////////////////////// +BOOST_PYTHON_MODULE(FreeOrionAIPythonInterface) +{ + boost::python::def("EmpirePlayerID", AIInterface::EmpirePlayerID); + boost::python::def("CurrentTurn", AIInterface::CurrentTurn); + + boost::python::def("DoneTurn", AIInterface::DoneTurn); +} + +/////////////////////// +// PythonAI // +/////////////////////// +PythonAI::PythonAI() : + AIBase() +{ + std::cout << "Starting Python AI" << std::endl; + + Py_Initialize(); // initializes Python interpreter, allowing Python functions to be called from C++ + + initFreeOrionAIPythonInterface(); // allows the "FreeOrionAIPythonInterface" C++ module to be imported within Python code + + /* import contents of "FreeOrionAI.py" into Python */ + int ignored = PyRun_SimpleString("import FreeOrionAI"); +} + +PythonAI::~PythonAI() +{ + std::cout << "Cleaning up / destructing Python AI" << std::endl; + Py_Finalize(); // stops Python interpreter and release its resources +} + +void PythonAI::GenerateOrders() +{ + /* call the GenerateOrders() Python function, which is defined in "FreeOrionAI.py" */ + int ignored = PyRun_SimpleString("FreeOrionAI.GenerateOrders()"); +} + +void PythonAI::HandleChatMessage(int sender_id, const std::string& msg) +{} Added: trunk/FreeOrion/AI/PythonAI.h =================================================================== --- trunk/FreeOrion/AI/PythonAI.h (rev 0) +++ trunk/FreeOrion/AI/PythonAI.h 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,17 @@ +#include "AIInterface.h" + +#include <boost/python.hpp> + +#include <string> + +class PythonAI : public AIBase +{ +public: + /** \name structors */ //@{ + PythonAI(); + ~PythonAI(); + //@} + + void GenerateOrders(); + void HandleChatMessage(int sender_id, const std::string& msg); +}; Added: trunk/FreeOrion/AI/ReferenceAI.cpp =================================================================== --- trunk/FreeOrion/AI/ReferenceAI.cpp (rev 0) +++ trunk/FreeOrion/AI/ReferenceAI.cpp 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,158 @@ +#include "ReferenceAI.h" + +#include "../universe/Universe.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" +#include "../universe/ShipDesign.h" +#include "../universe/System.h" +#include "../Empire/Empire.h" + +#include "../util/AppInterface.h" + +#include <set> + +ReferenceAI::ReferenceAI() +{} + +void ReferenceAI::GenerateOrders() +{ + Universe& universe = GetUniverse(); + int empire_id = AIInterface::EmpireID(); + + Fleet* fleet; + + // 1) Split stationary multi-ship fleets into multiple single-ship fleets + Universe::ObjectVec stat_fleets = universe.FindObjects(StationaryFleetVisitor(empire_id)); + Universe::ObjectVec::iterator fleet_it; + + for (fleet_it = stat_fleets.begin(); fleet_it != stat_fleets.end(); ++fleet_it) { + if(!(fleet = dynamic_cast<Fleet*>(*fleet_it))) continue; + + // split fleet into single-ship fleets if it presently has more than one ship + if (fleet->NumShips() > 1) { + SplitFleet(fleet); + } + } + + // 2) Give stationary fleets orders + stat_fleets = universe.FindObjects(StationaryFleetVisitor(empire_id)); // redo to get any newly created fleets from above + + for (fleet_it = stat_fleets.begin(); fleet_it != stat_fleets.end(); ++fleet_it) { + if(!(fleet = dynamic_cast<Fleet*>(*fleet_it))) continue; + + if (fleet->NumShips() < 1) continue; // shouldn't be possible... but to be safe... + + // get ship, design + Ship* ship = universe.Object<Ship>(*(fleet->begin())); if (!ship) continue; + const ShipDesign *design = ship->Design(); + + // give orders according to type of ship in fleet + if (design->name == "Scout") { + Explore(fleet); + + } else if (design->name == "Colony Ship") { + ColonizeSomewhere(fleet); + + } + } + + AIInterface::DoneTurn(); +} + +void ReferenceAI::HandleChatMessage(int sender_id, const std::string& msg) +{ +} + +void ReferenceAI::Explore(Fleet* fleet) { + if (!fleet) return; + + Logger().debugStream() << "telling fleet to explore"; + + Universe& universe = GetUniverse(); + int empire_id = AIInterface::EmpireID(); + + // ensure this player owns this fleet + const std::set<int>& owners = fleet->Owners(); + if (owners.size() != 1 || *(owners.begin()) != empire_id) return; // don't own fleet + + const Empire* empire = AIInterface::GetEmpire(); + if (!empire) throw std::runtime_error("Couldn't get pointer to empire when telling fleet to Explore"); + + + int start_id = fleet->SystemID(); // system where fleet is presently + + Logger().debugStream() << "telling fleet to explore2"; + + // attempt to find an unexplored system that can be explored (fleet can get to) + int explorable_system = UniverseObject::INVALID_OBJECT_ID; + std::vector<System*> systems = universe.FindObjects<System>(); + for (std::vector<System*>::const_iterator system_it = systems.begin(); system_it != systems.end(); ++system_it) { + System* system = *system_it; + int dest_id = system->ID(); // system to go to + if (empire->HasExploredSystem(dest_id)) continue; // already explored system + if (m_fleet_exploration_targets_map.find(dest_id) != m_fleet_exploration_targets_map.end()) continue; // another fleet has been dispatched + + Logger().debugStream() << "telling fleet to explore3"; + + // get path to destination. don't care that it's short, but just that it exists + std::list<System*> route = universe.ShortestPath(start_id, dest_id, empire_id).first; + + if (route.empty()) continue; // can't get to system (with present starlanes knowledge) + + Logger().debugStream() << "telling fleet to explore4"; + + // order ship to go ot system + AIInterface::IssueFleetMoveOrder(fleet->ID(), dest_id); + + Logger().debugStream() << "telling fleet to explore5"; + + // mark system as targeted for exploration, so another ship isn't sent to it redundantly + m_fleet_exploration_targets_map.insert(std::pair<int, int>(dest_id, fleet->ID())); + + return; // don't need to keep looping at this point + } +} + +void ReferenceAI::ColonizeSomewhere(Fleet* fleet) { + +} + +void ReferenceAI::SplitFleet(Fleet* fleet) +{ + if (!fleet) return; // no fleet to process... + if (fleet->NumShips() < 2) return; // can't split fleet with one (or no?) ships + + Universe& universe = GetUniverse(); + int empire_id = AIInterface::EmpireID(); + + // ensure this player owns this fleet + const std::set<int>& owners = fleet->Owners(); + + if (owners.size() != 1 || *(owners.begin()) != empire_id) return; // don't own fleet + + // starting with second ship, pick ships to transfer to new fleets + std::set<int> ship_ids_to_remove; + for (Fleet::iterator ship_it = ++(fleet->begin()); ship_it != fleet->end(); ++ship_it) { + + Ship *ship = universe.Object<Ship>(*ship_it); + const std::set<int>& ship_owners = ship->Owners(); + + if (ship_owners.size() != 1 || *(ship_owners.begin()) != empire_id) continue; // don't own ship + + ship_ids_to_remove.insert(*ship_it); + } + + if (ship_ids_to_remove.empty()) return; // nothing more to do + + // order transfers of ships from old fleet to new fleets + for (std::set<int>::iterator ship_it = ship_ids_to_remove.begin(); ship_it != ship_ids_to_remove.end(); ++ship_it) { + std::vector<int> ship_ids; + ship_ids.push_back(*ship_it); + + std::string fleet_name = UserString("FW_NEW_FLEET_NAME"); + + AIInterface::IssueNewFleetOrder(fleet_name, ship_ids); + + } +} + Added: trunk/FreeOrion/AI/ReferenceAI.h =================================================================== --- trunk/FreeOrion/AI/ReferenceAI.h (rev 0) +++ trunk/FreeOrion/AI/ReferenceAI.h 2007-05-25 01:53:09 UTC (rev 2055) @@ -0,0 +1,23 @@ +#include "AIInterface.h" + +#include <map> +#include <string> + +class Fleet; + +class ReferenceAI : public AIBase +{ +public: + ReferenceAI(); + void GenerateOrders(); + void HandleChatMessage(int sender_id, const std::string& msg); + +private: + // utility order-generating functions + void SplitFleet(Fleet* fleet); ///< transfers ships after first ship in fleet into new single-ship fleets + void Explore(Fleet* fleet); ///< orders fleet to explore. tries to find an unexplored system and goes there + void ColonizeSomewhere(Fleet* fleet); ///< orders fleet to find and colonize a planet / system + + // planning data / universe analysis intermediate results + std::map<int, int> m_fleet_exploration_targets_map; ///< map of (system_id, fleet_id) for systems that have had a fleet dispatched to explore them +}; \ No newline at end of file Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2007-05-22 02:54:55 UTC (rev 2054) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2007-05-25 01:53:09 UTC (rev 2055) @@ -26,6 +26,9 @@ #include <boost/filesystem/fstream.hpp> +#include "../AI/ReferenceAI.h" +//#include "../AI/PythonAI.h" + // static member(s) AIClientApp* AIClientApp::s_app = 0; @@ -134,6 +137,7 @@ void AIClientApp::Initialize() { + m_AI = new ReferenceAI(); // join game at server const int MAX_TRIES = 5; int tries = 0; @@ -223,9 +227,6 @@ if (!NetworkCore().Connected()) break; AIGenerateOrders(); - - //Logger().debugStream() << "Starting turn update (sending orders to server)"; - StartTurn(); } break; } @@ -292,150 +293,5 @@ void AIClientApp::AIGenerateOrders() { - Universe& universe = ClientApp::GetUniverse(); - int empire_id = ClientApp::EmpireID(); - - Fleet* fleet; - - // 1) Split stationary multi-ship fleets into multiple single-ship fleets - Universe::ObjectVec stat_fleets = universe.FindObjects(StationaryFleetVisitor(empire_id)); - Universe::ObjectVec::iterator fleet_it; - - for (fleet_it = stat_fleets.begin(); fleet_it != stat_fleets.end(); ++fleet_it) { - if(!(fleet = dynamic_cast<Fleet*>(*fleet_it))) continue; - - // split fleet into single-ship fleets if it presently has more than one ship - if (fleet->NumShips() > 1) { - SplitFleet(fleet); - } - } - - // 2) Give stationary fleets orders - stat_fleets = universe.FindObjects(StationaryFleetVisitor(empire_id)); // redo to get any newly created fleets from above - - for (fleet_it = stat_fleets.begin(); fleet_it != stat_fleets.end(); ++fleet_it) { - if(!(fleet = dynamic_cast<Fleet*>(*fleet_it))) continue; - - if (fleet->NumShips() < 1) continue; // shouldn't be possible... but to be safe... - - // get ship, design - Ship* ship = universe.Object<Ship>(*(fleet->begin())); if (!ship) continue; - const ShipDesign *design = ship->Design(); - - // give orders according to type of ship in fleet - if (design->name == "Scout") { - Explore(fleet); - - } else if (design->name == "Colony Ship") { - ColonizeSomewhere(fleet); - - } - } + m_AI->GenerateOrders(); } - -void AIClientApp::Explore(Fleet* fleet) { - if (!fleet) return; - - Logger().debugStream() << "telling fleet to explore"; - - Universe& universe = ClientApp::GetUniverse(); - int empire_id = ClientApp::EmpireID(); - - // ensure this player owns this fleet - const std::set<int>& owners = fleet->Owners(); - if (owners.size() != 1 || *(owners.begin()) != empire_id) return; // don't own fleet - - const Empire* empire = ClientApp::Empires().Lookup(empire_id); - if (!empire) throw std::runtime_error("Couldn't get pointer to empire when telling fleet to Explore"); - - - int start_id = fleet->SystemID(); // system where fleet is presently - - Logger().debugStream() << "telling fleet to explore2"; - - // attempt to find an unexplored system that can be explored (fleet can get to) - int explorable_system = UniverseObject::INVALID_OBJECT_ID; - std::vector<System*> systems = universe.FindObjects<System>(); - for (std::vector<System*>::const_iterator system_it = systems.begin(); system_it != systems.end(); ++system_it) { - System* system = *system_it; - int dest_id = system->ID(); // system to go to - if (empire->HasExploredSystem(dest_id)) continue; // already explored system - if (m_fleet_exploration_targets_map.find(dest_id) != m_fleet_exploration_targets_map.end()) continue; // another fleet has been dispatched - - Logger().debugStream() << "telling fleet to explore3"; - - // get path to destination. don't care that it's short, but just that it exists - std::list<System*> route = universe.ShortestPath(start_id, dest_id, empire_id).first; - - if (route.empty()) continue; // can't get to system (with present starlanes knowledge) - - Logger().debugStream() << "telling fleet to explore4"; - - // order ship to go ot system - GetApp()->Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_id, dest_id)); - - Logger().debugStream() << "telling fleet to explore5"; - - // mark system as targeted for exploration, so another ship isn't sent to it redundantly - m_fleet_exploration_targets_map.insert(std::pair<int, int>(dest_id, fleet->ID())); - - return; // don't need to keep looping at this point - } -} - -void AIClientApp::ColonizeSomewhere(Fleet* fleet) { - -} - -void AIClientApp::SplitFleet(Fleet* fleet) -{ - if (!fleet) return; // no fleet to process... - if (fleet->NumShips() < 2) return; // can't split fleet with one (or no?) ships - - Universe& universe = ClientApp::GetUniverse(); - int empire_id = ClientApp::EmpireID(); - - // ensure this player owns this fleet - const std::set<int>& owners = fleet->Owners(); - - if (owners.size() != 1 || *(owners.begin()) != empire_id) return; // don't own fleet - - // starting with second ship, pick ships to transfer to new fleets - std::set<int> ship_ids_to_remove; - for (Fleet::iterator ship_it = ++(fleet->begin()); ship_it != fleet->end(); ++ship_it) { - - Ship *ship = universe.Object<Ship>(*ship_it); - const std::set<int>& ship_owners = ship->Owners(); - - if (ship_owners.size() != 1 || *(ship_owners.begin()) != empire_id) continue; // don't own ship - - ship_ids_to_remove.insert(*ship_it); - } - - if (ship_ids_to_remove.empty()) return; // nothing more to do - - // info from source fleet that may be copied to new fleets - System* system = fleet->GetSystem(); - double fleet_x = fleet->X(); - double fleet_y = fleet->Y(); - - // order transfers of ships from old fleet to new fleets - for (std::set<int>::iterator ship_it = ship_ids_to_remove.begin(); ship_it != ship_ids_to_remove.end(); ++ship_it) { - std::vector<int> ship_ids; - ship_ids.push_back(*ship_it); - - int new_fleet_id = ClientApp::GetNewObjectID(); - if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) - throw std::runtime_error("Couldn't get new object ID when transferring ship to new fleet"); - - std::string fleet_name = UserString("FW_NEW_FLEET_NAME") + boost::lexical_cast<std::string>(new_fleet_id); - - Fleet* new_fleet = 0; - if (system) { - GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, system->ID(), ship_ids)); - - } else { - GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, fleet_x, fleet_y, ship_ids)); - } - } -} \ No newline at end of file Modified: trunk/FreeOrion/client/AI/AIClientApp.h =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.h 2007-05-22 02:54:55 UTC (rev 2054) +++ trunk/FreeOrion/client/AI/AIClientApp.h 2007-05-25 01:53:09 UTC (rev 2055) @@ -2,9 +2,8 @@ #ifndef _AIClientApp_h_ #define _AIClientApp_h_ -#ifndef _ClientApp_h_ #include "../ClientApp.h" -#endif +#include "../AI/AIInterface.h" namespace log4cpp {class Category;} @@ -34,14 +33,6 @@ void Initialize(); ///< app initialization void AIGenerateOrders(); ///< processes gamestate and generates orders - // utility order-generating functions - void SplitFleet(Fleet* fleet); ///< transfers ships after first ship in fleet into new single-ship fleets - void Explore(Fleet* fleet); ///< orders fleet to explore. tries to find an unexplored system and goes there - void ColonizeSomewhere(Fleet* fleet); ///< orders fleet to find and colonize a planet / system - - // planning data / universe analysis intermediate results - std::map<int, int> m_fleet_exploration_targets_map; ///< map of (system_id, fleet_id) for systems that have had a fleet dispatched to explore them - void Poll(); ///< handles all waiting SDL messages void FinalCleanup(); ///< app final cleanup @@ -52,6 +43,8 @@ log4cpp::Category& m_log_category; ///< reference to the log4cpp object used to log events to file + AIBase* m_AI; ///< implementation of AI logic + static AIClientApp* s_app; }; Modified: trunk/FreeOrion/client/ClientApp.h =================================================================== --- trunk/FreeOrion/client/ClientApp.h 2007-05-22 02:54:55 UTC (rev 2054) +++ trunk/FreeOrion/client/ClientApp.h 2007-05-25 01:53:09 UTC (rev 2055) @@ -41,7 +41,7 @@ //@} /** \name Mutators */ //@{ - virtual void StartTurn(); ///< encodes order sets and sends turn orders message + virtual void StartTurn(); ///< encodes order sets and sends turn orders message Universe& GetUniverse(); ///< returns client's local copy of Universe EmpireManager& Empires(); ///< returns the set of known Empires Modified: trunk/FreeOrion/default/data/art/tech_icons/Asteroid_Mining_I.png =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/data/art/tech_icons/Asteroid_Mining_II.png =================================================================== (Binary files differ) Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-05-22 02:54:55 UTC (rev 2054) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-05-25 01:53:09 UTC (rev 2055) @@ -123,7 +123,7 @@ /> <Tool Name="VCCLCompilerTool" - AdditionalIncludeDirectories="C:\FreeOrion\GG;"C:\Boost\include\boost-1_33_1";C:\DevIL\include;C:\fmodapi375win\api\inc;"C:\log4cpp-0.3.4b\include";"C:\SDL-1.2.7\include";C:\zlib\include;C:\graphviz\include;"C:\freetype-2.1.7\include"" + AdditionalIncludeDirectories="C:\FreeOrion\GG;"C:\Boost\include\boost-1_33_1";C:\DevIL\include;C:\fmodapi375win\api\inc;"C:\log4cpp-0.3.4b\include";"C:\SDL-1.2.7\include";C:\zlib\include;C:\graphviz\include;"C:\freetype-2.1.7\include";"C:\Program Files\Python 2.4\include"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;FREEORION_BUILD_AI;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE" RuntimeLibrary="2" DisableLanguageExtensions="false" @@ -146,10 +146,10 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib fmodvc.lib log4cpp.lib freetype214MT.lib cdt.lib common.lib dotgen.lib gd.lib graph.lib pathplan.lib libexpat.lib png.lib jpeg.lib" + AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib fmodvc.lib log4cpp.lib freetype214MT.lib cdt.lib common.lib dotgen.lib gd.lib graph.lib pathplan.lib libexpat.lib png.lib jpeg.lib python24.lib boost_python-vc80-mt-1_33_1.lib" OutputFile="$(OutDir)/freeorionca.exe" LinkIncremental="1" - AdditionalLibraryDirectories="C:\FreeOrion\GG;C:\Boost\lib;C:\DevIL\lib;C:\fmodapi375win\api\lib;"C:\freetype-2.1.7\objs";C:\graphviz\lib;"C:\SDL-1.2.7\lib";C:\zlib\lib;"C:\log4cpp-0.3.4b\msvc6\log4cppDLL\Release"" + AdditionalLibraryDirectories="C:\FreeOrion\GG;C:\Boost\lib;C:\DevIL\lib;C:\fmodapi375win\api\lib;"C:\freetype-2.1.7\objs";C:\graphviz\lib;"C:\SDL-1.2.7\lib";C:\zlib\lib;"C:\log4cpp-0.3.4b\msvc6\log4cppDLL\Release";"C:\Program Files\Python 2.4\libs"" GenerateManifest="true" GenerateDebugInformation="false" SubSystem="2" @@ -702,6 +702,38 @@ > </File> </Filter> + <Filter + Name="AI" + > + <File + RelativePath="..\..\..\AI\AIInterface.cpp" + > + </File> + <File + RelativePath="..\..\..\AI\AIInterface.h" + > + </File> + <File + RelativePath="..\..\..\AI\FreeOrionAI.py" + > + </File> + <File + RelativePath="..\..\..\AI\PythonAI.cpp" + > + </File> + <File + RelativePath="..\..\..\AI\PythonAI.h" + > + </File> + <File + RelativePath="..\..\..\AI\ReferenceAI.cpp" + > + </File> + <File + RelativePath="..\..\..\AI\ReferenceAI.h" + > + </File> + </Filter> </Filter> </Files> <Globals> |
From: <geo...@us...> - 2007-05-26 02:25:29
|
Revision: 2059 http://svn.sourceforge.net/freeorion/revision/?rev=2059&view=rev Author: geoffthemedio Date: 2007-05-25 19:25:31 -0700 (Fri, 25 May 2007) Log Message: ----------- -Tweaked AIInterface to take std::strings insntead of const char* for LogOutput. -Made PythonAI send player 0 a CHAT_MSG every turn -Made MapWnd clear its chat history after ending a game Modified Paths: -------------- trunk/FreeOrion/AI/AIInterface.cpp trunk/FreeOrion/AI/AIInterface.h trunk/FreeOrion/AI/FreeOrionAI.py trunk/FreeOrion/AI/PythonAI.cpp trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/AI/AIInterface.cpp =================================================================== --- trunk/FreeOrion/AI/AIInterface.cpp 2007-05-25 18:19:06 UTC (rev 2058) +++ trunk/FreeOrion/AI/AIInterface.cpp 2007-05-26 02:25:31 UTC (rev 2059) @@ -229,7 +229,7 @@ void LoadState() {} - void LogOutput(char const* log_text) + void LogOutput(const std::string& log_text) { Logger().debugStream() << "AI Log : " << log_text; } Modified: trunk/FreeOrion/AI/AIInterface.h =================================================================== --- trunk/FreeOrion/AI/AIInterface.h 2007-05-25 18:19:06 UTC (rev 2058) +++ trunk/FreeOrion/AI/AIInterface.h 2007-05-26 02:25:31 UTC (rev 2059) @@ -62,7 +62,7 @@ //@} /** Misc */ //@{ - void LogOutput(char const* log_text); ///< output text to logfile + void LogOutput(const std::string& log_text); ///< output text to logfile //@} }; Modified: trunk/FreeOrion/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/AI/FreeOrionAI.py 2007-05-25 18:19:06 UTC (rev 2058) +++ trunk/FreeOrion/AI/FreeOrionAI.py 2007-05-26 02:25:31 UTC (rev 2059) @@ -5,4 +5,5 @@ def GenerateOrders(): foaiint.DoneTurn() + foaiint.SendChatMessage(0, "Sending chat message from within Python!") foaiint.LogOutput("Generated Orders") \ No newline at end of file Modified: trunk/FreeOrion/AI/PythonAI.cpp =================================================================== --- trunk/FreeOrion/AI/PythonAI.cpp 2007-05-25 18:19:06 UTC (rev 2058) +++ trunk/FreeOrion/AI/PythonAI.cpp 2007-05-26 02:25:31 UTC (rev 2059) @@ -13,20 +13,24 @@ boost::python::def("DoneTurn", AIInterface::DoneTurn); + boost::python::def("SendChatMessage", AIInterface::SendPlayerChatMessage); + boost::python::def("LogOutput", AIInterface::LogOutput); } /////////////////////// // PythonAI // /////////////////////// -using boost::python::borrowed; - PythonAI::PythonAI() { + using boost::python::borrowed; + Py_Initialize(); // initializes Python interpreter, allowing Python functions to be called from C++ initfoaiint(); // allows the "foaiint" C++ module to be imported within Python code + + // get access to Python main namespace, which is needed to call other functions below try { main_module = PyOBJECT((PyHANDLE(borrowed(PyImport_AddModule("__main__"))))); dict = PyOBJECT(main_module.attr("__dict__")); @@ -37,6 +41,7 @@ PyHANDLE handle; + // import Python built-in sys module, giving access to sys.path below try { handle = PyHANDLE(PyRun_String("import sys", Py_file_input, dict.ptr(), dict.ptr())); } catch (PyERROR err) { @@ -44,7 +49,7 @@ return; } - + // tell Python the path in which to locate AI script file std::string AI_DIR("C:\\FreeOrion\\AI"); std::string python_path_command = "sys.path.append('" + AI_DIR + "')"; try { @@ -54,15 +59,15 @@ return; } - + // load Python script of AI functions try { handle = PyHANDLE(PyRun_String("import FreeOrionAI", Py_file_input, dict.ptr(), dict.ptr())); } catch (PyERROR err) { - Logger().errorStream() << "error importing blah"; + Logger().errorStream() << "error importing FreeOrionAI.py into Python"; return; } - + // initialize AI within Python try { handle = PyHANDLE(PyRun_String("FreeOrionAI.InitFreeOrionAI()", Py_file_input, dict.ptr(), dict.ptr())); } catch(PyERROR err) { Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-05-25 18:19:06 UTC (rev 2058) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-05-26 02:25:31 UTC (rev 2059) @@ -1486,6 +1486,7 @@ Cleanup(); m_side_panel->MoveTo(GG::Pt(GG::GUI::GetGUI()->AppWidth() - SIDE_PANEL_WIDTH, m_toolbar->LowerRight().y)); m_chat_display->MoveTo(GG::Pt(LAYOUT_MARGIN, m_turn_update->LowerRight().y + LAYOUT_MARGIN)); + m_chat_display->Clear(); m_chat_edit->MoveTo(GG::Pt(LAYOUT_MARGIN, GG::GUI::GetGUI()->AppHeight() - CHAT_EDIT_HEIGHT - LAYOUT_MARGIN)); m_sitrep_panel->MoveTo(GG::Pt((GG::GUI::GetGUI()->AppWidth() - SITREP_PANEL_WIDTH) / 2, (GG::GUI::GetGUI()->AppHeight() - SITREP_PANEL_HEIGHT) / 2)); m_sitrep_panel->Resize(GG::Pt(SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT)); |
From: <geo...@us...> - 2007-05-26 02:57:03
|
Revision: 2060 http://svn.sourceforge.net/freeorion/revision/?rev=2060&view=rev Author: geoffthemedio Date: 2007-05-25 19:57:04 -0700 (Fri, 25 May 2007) Log Message: ----------- -Created new AI directory in /default -Moved FreeOrionAI.py to /default/AI -Made PythonAI locate FreeOrionAI.py in /default/AI using GetGlobalDir() which will also work on Linux (presumably) -Added a few tech icons -Updated MSVC project file for above change in location of FreeOrinAI.py -Single character change in comments of Directories.h Modified Paths: -------------- trunk/FreeOrion/AI/PythonAI.cpp trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj trunk/FreeOrion/util/Directories.h Added Paths: ----------- trunk/FreeOrion/default/AI/ trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/data/art/tech_icons/Genome_Bank.png trunk/FreeOrion/default/data/art/tech_icons/Habitation_Domes.png trunk/FreeOrion/default/data/art/tech_icons/Urban_Farming.png Removed Paths: ------------- trunk/FreeOrion/AI/FreeOrionAI.py Deleted: trunk/FreeOrion/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/AI/FreeOrionAI.py 2007-05-26 02:25:31 UTC (rev 2059) +++ trunk/FreeOrion/AI/FreeOrionAI.py 2007-05-26 02:57:04 UTC (rev 2060) @@ -1,9 +0,0 @@ -import foaiint - -def InitFreeOrionAI(): - foaiint.LogOutput("Initialized FreeOrion Python AI") - -def GenerateOrders(): - foaiint.DoneTurn() - foaiint.SendChatMessage(0, "Sending chat message from within Python!") - foaiint.LogOutput("Generated Orders") \ No newline at end of file Modified: trunk/FreeOrion/AI/PythonAI.cpp =================================================================== --- trunk/FreeOrion/AI/PythonAI.cpp 2007-05-26 02:25:31 UTC (rev 2059) +++ trunk/FreeOrion/AI/PythonAI.cpp 2007-05-26 02:57:04 UTC (rev 2060) @@ -1,5 +1,6 @@ #include "PythonAI.h" #include "../util/AppInterface.h" +#include "../util/Directories.h" #include <boost/python.hpp> @@ -50,8 +51,8 @@ } // tell Python the path in which to locate AI script file - std::string AI_DIR("C:\\FreeOrion\\AI"); - std::string python_path_command = "sys.path.append('" + AI_DIR + "')"; + std::string AI_path = (GetGlobalDir() / "default" / "AI").native_directory_string(); + std::string python_path_command = "sys.path.append('" + AI_path + "')"; try { handle = PyHANDLE(PyRun_String(python_path_command.c_str(), Py_file_input, dict.ptr(), dict.ptr())); } catch (PyERROR err) { Added: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py (rev 0) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2007-05-26 02:57:04 UTC (rev 2060) @@ -0,0 +1,9 @@ +import foaiint + +def InitFreeOrionAI(): + foaiint.LogOutput("Initialized FreeOrion Python AI") + +def GenerateOrders(): + foaiint.DoneTurn() + foaiint.SendChatMessage(0, "Sending chat message from within Python!") + foaiint.LogOutput("Generated Orders") \ No newline at end of file Added: trunk/FreeOrion/default/data/art/tech_icons/Genome_Bank.png =================================================================== (Binary files differ) Property changes on: trunk/FreeOrion/default/data/art/tech_icons/Genome_Bank.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/FreeOrion/default/data/art/tech_icons/Habitation_Domes.png =================================================================== (Binary files differ) Property changes on: trunk/FreeOrion/default/data/art/tech_icons/Habitation_Domes.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/FreeOrion/default/data/art/tech_icons/Urban_Farming.png =================================================================== (Binary files differ) Property changes on: trunk/FreeOrion/default/data/art/tech_icons/Urban_Farming.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-05-26 02:25:31 UTC (rev 2059) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-05-26 02:57:04 UTC (rev 2060) @@ -714,7 +714,7 @@ > </File> <File - RelativePath="..\..\..\AI\FreeOrionAI.py" + RelativePath="..\..\..\default\AI\FreeOrionAI.py" > </File> <File Modified: trunk/FreeOrion/util/Directories.h =================================================================== --- trunk/FreeOrion/util/Directories.h 2007-05-26 02:25:31 UTC (rev 2059) +++ trunk/FreeOrion/util/Directories.h 2007-05-26 02:57:04 UTC (rev 2060) @@ -12,7 +12,7 @@ /** This function returns the directory where FreeOrion should store user specific data, like the configuration file and savegames. Under Unix, this would be <tt>~/.freeorion</tt>, under Windows, this might be something along the lines - of <tt>C:\\Documents and settings\\Username\\FreeOrion</tt> or even + of <tt>C:\\Documents and Settings\\Username\\FreeOrion</tt> or even <tt>\\\\Gandalf\\Users\\Frodo\\Settings\\FreeOrion</tt>. \note <ul><li> If the directory does not exist, it will be created.<li>This directory is the only one that can be considered writable!</ul> */ |
From: <geo...@us...> - 2007-05-28 05:36:08
|
Revision: 2061 http://svn.sourceforge.net/freeorion/revision/?rev=2061&view=rev Author: geoffthemedio Date: 2007-05-27 22:36:07 -0700 (Sun, 27 May 2007) Log Message: ----------- -Exposed part of Empire class and AIInterface getters for Empire to Python -Added some test code to FreeOrionAI.py to test Empire getting and calling member functions -Added default m_universe initialization to ClientApp and ServerApp -Corrected parameter name error in Order.cpp -Implemented a few additional functions in AIInterface Modified Paths: -------------- trunk/FreeOrion/AI/AIInterface.cpp trunk/FreeOrion/AI/AIInterface.h trunk/FreeOrion/AI/PythonAI.cpp trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/ClientApp.cpp trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/AI/AIInterface.cpp =================================================================== --- trunk/FreeOrion/AI/AIInterface.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/AI/AIInterface.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -6,10 +6,10 @@ #include "../universe/Universe.h" #include "../universe/UniverseObject.h" +#include "../universe/Planet.h" #include "../universe/Fleet.h" #include "../universe/Ship.h" - #include "../util/OrderSet.h" #include <stdexcept> @@ -47,8 +47,10 @@ std::map<int, PlayerInfo>::const_iterator it = players.find(player_id); if (it != players.end()) return it->second.name; - else + else { + Logger().debugStream() << "AIInterface::PlayerName(" << boost::lexical_cast<std::string>(player_id) << ") - passed an invalid player_id"; throw std::invalid_argument("AIInterface::PlayerName : given invalid player_id"); + } } int PlayerID() @@ -73,14 +75,12 @@ int EmpirePlayerID(int empire_id) { - return AIClientApp::GetApp()->GetEmpirePlayerID(empire_id); + int player_id = AIClientApp::GetApp()->GetEmpirePlayerID(empire_id); + if (-1 == player_id) + Logger().debugStream() << "AIInterface::EmpirePlayerID(" << boost::lexical_cast<std::string>(empire_id) << ") - passed an invalid empire_id"; + return player_id; } - const Empire* GetPlayerEmpire(int player_id) - { - return AIClientApp::GetApp()->GetPlayerEmpire(player_id); - } - int CurrentTurn() { return AIClientApp::GetApp()->CurrentTurn(); @@ -88,7 +88,7 @@ int IssueFleetMoveOrder(int fleet_id, int destination_id) { - Universe& universe = AIClientApp::GetApp()->GetUniverse(); + const Universe& universe = AIClientApp::GetApp()->GetUniverse(); const Fleet* fleet = universe.Object<Fleet>(fleet_id); if (!fleet) { @@ -111,21 +111,41 @@ return 1; } - int IssueRenameOrder() + int IssueRenameOrder(int object_id, const std::string& new_name) { - return 0; + if (new_name.empty()) { + Logger().errorStream() << "AIInterface::IssueRenameOrder : passed an empty new name"; + return 0; + } + + const Universe& universe = AIClientApp::GetApp()->GetUniverse(); + int empire_id = AIClientApp::GetApp()->EmpireID(); + const UniverseObject* obj = universe.Object(object_id); + + if (!obj) { + Logger().errorStream() << "AIInterface::IssueRenameOrder : passed an invalid object_id"; + return 0; + } + if (!obj->WhollyOwnedBy(empire_id)) { + Logger().errorStream() << "AIInterface::IssueRenameOrder : passed object_id of object not owned only by player"; + return 0; + } + + AIClientApp::GetApp()->Orders().IssueOrder(new RenameOrder(empire_id, object_id, new_name)); + + return 1; } - int IssueNewFleetOrder(const std::string fleet_name, const std::vector<int>& ship_ids) + int IssueNewFleetOrder(const std::string& fleet_name, const std::vector<int>& ship_ids) { if (ship_ids.empty()) { Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed empty vector of ship_ids"; return 0; } - Universe& universe = AIClientApp::GetApp()->GetUniverse(); + const Universe& universe = AIClientApp::GetApp()->GetUniverse(); int empire_id = AIClientApp::GetApp()->EmpireID(); - Ship* ship = 0; + const Ship* ship = 0; // make sure all ships exist and are owned just by this player for (std::vector<int>::const_iterator it = ship_ids.begin(); it != ship_ids.end(); ++it) { @@ -149,7 +169,7 @@ // ships are located in a system: can just check that all ships have same system id as first ship std::vector<int>::const_iterator it = ship_ids.begin(); for (++it; it != ship_ids.end(); ++it) { - Ship* ship2 = universe.Object<Ship>(*it); + const Ship* ship2 = universe.Object<Ship>(*it); if (ship2->SystemID() != system_id) { Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed ship_ids of ships at different locations"; return 0; @@ -159,7 +179,7 @@ // ships are located in deep space: need to check their exact locations std::vector<int>::const_iterator it = ship_ids.begin(); for (++it; it != ship_ids.end(); ++it) { - Ship* ship2 = universe.Object<Ship>(*it); + const Ship* ship2 = universe.Object<Ship>(*it); if ((ship2->X() != ship_x) || (ship2->Y() != ship_y)) { Logger().errorStream() << "AIInterface::IssueNewFleetOrder : passed ship_ids of ships at different locations"; return 0; @@ -184,9 +204,59 @@ return 0; } - int IssueFleetColonizeOrder() + int IssueFleetColonizeOrder(int ship_id, int planet_id) { - return 0; + const Universe& universe = AIClientApp::GetApp()->GetUniverse(); + int empire_id = AIClientApp::GetApp()->EmpireID(); + + // make sure ship_id is a ship... + const Ship* ship = universe.Object<Ship>(ship_id); + if (!ship) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : passed an invalid ship_id"; + return 0; + } + + // get fleet of ship + const Fleet* fleet = universe.Object<Fleet>(ship->FleetID()); + if (!fleet) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : ship with passed ship_id has invalid fleet_id"; + return 0; + } + + // make sure player owns ship and its fleet + if (!fleet->WhollyOwnedBy(empire_id)) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : empire does not own fleet of passed ship"; + return 0; + } + if (!ship->WhollyOwnedBy(empire_id)) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : empire does not own passed ship"; + return 0; + } + + // verify that planet exists and is un-occupied. + const Planet* planet = universe.Object<Planet>(planet_id); + if (!planet) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : no planet with passed planet_id"; + return 0; + } + if (!planet->Unowned()) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : planet with passed planet_id is already owned or colonized"; + return 0; + } + + // verify that planet is in same system as the fleet + if (planet->SystemID() != fleet->SystemID()) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : fleet and planet are not in the same system"; + return 0; + } + if (ship->SystemID() == UniverseObject::INVALID_OBJECT_ID) { + Logger().errorStream() << "AIInterface::IssueFleetColonizeOrder : ship is not in a system"; + return 0; + } + + AIClientApp::GetApp()->Orders().IssueOrder(new FleetColonizeOrder(empire_id, ship_id, planet_id)); + + return 1; } int IssueDeleteFleetOrder() Modified: trunk/FreeOrion/AI/AIInterface.h =================================================================== --- trunk/FreeOrion/AI/AIInterface.h 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/AI/AIInterface.h 2007-05-28 05:36:07 UTC (rev 2061) @@ -25,27 +25,34 @@ namespace AIInterface { /** Gamestate Accessors */ //@{ - const Universe& GetUniverse(); ///< returns Universe known to this player - const std::string& PlayerName(); ///< returns the player name of this client const std::string& PlayerName(int player_id); ///< returns the name of player with \a player_id int PlayerID(); ///< returns the player ID of this client + int EmpirePlayerID(int empire_id); ///< returns ID of player controlling empire with id \a empire_id + const std::set<int> AllPlayerIDs(); ///< returns std::set<int> containing IDs of all players in game + + bool PlayerIsAI(int player_id); ///< returns true iff the player with id \a player_id is an AI + bool PlayerIsHost(int player_id); ///< returns true iff the player with id \a player_id is the game host + int EmpireID(); ///< returns the empire ID of this client + int PlayerEmpireID(int player_id); ///< returns ID of empire controlled by player with id \a player_id + const std::set<int> AllEmpireIDs(); ///< returns std::set<int> containing IDs of all empires in game + const Empire* GetEmpire(); ///< returns empire of this client's player const Empire* GetEmpire(int empire_id); ///< returns empire with id \a empire_id - const Empire* GetPlayerEmpire(int player_id); ///< returns empire of player with id \a player_id - int EmpirePlayerID(int empire_id); ///< returns ID of player controlling empire with id \a empire_id + const Universe& GetUniverse(); ///< returns Universe known to this player + int CurrentTurn(); ///< returns the current game turn //@} /** Order-Giving */ //@{ int IssueFleetMoveOrder(int fleet_id, int destination_id); - int IssueRenameOrder(); - int IssueNewFleetOrder(const std::string fleet_name, const std::vector<int>& ship_ids); + int IssueRenameOrder(int object_id, const std::string& new_name); + int IssueNewFleetOrder(const std::string& fleet_name, const std::vector<int>& ship_ids); int IssueFleetTransferOrder(); - int IssueFleetColonizeOrder(); + int IssueFleetColonizeOrder(int ship_id, int planet_id); int IssueDeleteFleetOrder(); int IssueChangeFocusOrder(); int IssueResearchQueueOrder(); Modified: trunk/FreeOrion/AI/PythonAI.cpp =================================================================== --- trunk/FreeOrion/AI/PythonAI.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/AI/PythonAI.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -2,21 +2,65 @@ #include "../util/AppInterface.h" #include "../util/Directories.h" +#include "../Empire/Empire.h" + #include <boost/python.hpp> //////////////////////// // Python AIInterface // //////////////////////// +// disambiguate overloaded AIInterface functions +const std::string& (*AIIntPlayerNameVoid)(void) = &AIInterface::PlayerName; +const std::string& (*AIIntPlayerNameInt)(int) = &AIInterface::PlayerName; + +const Empire* (*AIIntGetEmpireVoid)(void) = &AIInterface::GetEmpire; +const Empire* (*AIIntGetEmpireInt)(int) = &AIInterface::GetEmpire; + + +// expose to Python BOOST_PYTHON_MODULE(foaiint) { - boost::python::def("EmpirePlayerID", AIInterface::EmpirePlayerID); - boost::python::def("CurrentTurn", AIInterface::CurrentTurn); + using boost::python::def; + using boost::python::return_value_policy; + using boost::python::copy_const_reference; + using boost::python::reference_existing_object; + using boost::python::class_; + using boost::noncopyable; + using boost::python::no_init; - boost::python::def("DoneTurn", AIInterface::DoneTurn); + // AIInterface + def("PlayerName", AIIntPlayerNameVoid, return_value_policy<copy_const_reference>()); + def("IDPlayerName", AIIntPlayerNameInt, return_value_policy<copy_const_reference>()); - boost::python::def("SendChatMessage", AIInterface::SendPlayerChatMessage); + def("PlayerID", AIInterface::PlayerID); + def("EmpireID", AIInterface::EmpireID); + def("EmpirePlayerID", AIInterface::EmpirePlayerID); - boost::python::def("LogOutput", AIInterface::LogOutput); + def("GetEmpire", AIIntGetEmpireVoid, return_value_policy<reference_existing_object>()); + def("GetIDEmpire", AIIntGetEmpireInt, return_value_policy<reference_existing_object>()); + + def("CurrentTurn", AIInterface::CurrentTurn); + + def("IssueFleetMoveOrder", AIInterface::IssueFleetMoveOrder); + def("IssueRenameOrder", AIInterface::IssueRenameOrder); + def("IssueNewFleetOrder", AIInterface::IssueNewFleetOrder); + def("IssueFleetColonizeOrder", AIInterface::IssueFleetColonizeOrder); + + def("SendChatMessage", AIInterface::SendPlayerChatMessage); + + def("DoneTurn", AIInterface::DoneTurn); + + def("LogOutput", AIInterface::LogOutput); + + // Empire + class_<Empire, noncopyable>("Empire", no_init) + .def("Name", &Empire::Name, return_value_policy<copy_const_reference>()) + .def("PlayerName", &Empire::PlayerName, return_value_policy<copy_const_reference>()) + .def("EmpireID", &Empire::EmpireID) + .def("HomeworldID", &Empire::HomeworldID) + .def("CapitolID", &Empire::CapitolID) + .def("BuildingTypeAvailable", &Empire::BuildingTypeAvailable) + ; } /////////////////////// Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -27,7 +27,7 @@ #include <boost/filesystem/fstream.hpp> #include "../AI/ReferenceAI.h" -//#include "../AI/PythonAI.h" +#include "../AI/PythonAI.h" // static member(s) AIClientApp* AIClientApp::s_app = 0; @@ -137,7 +137,8 @@ void AIClientApp::Initialize() { - m_AI = new ReferenceAI(); + //m_AI = new ReferenceAI(); + m_AI = new PythonAI(); // join game at server const int MAX_TRIES = 5; int tries = 0; @@ -250,15 +251,7 @@ // ... copied from HumanClientApp.cpp. Not sure if / why it's necessary. if (!NetworkCore().Connected()) break; - std::string chat_message = "Generating AI orders for ID: " + boost::lexical_cast<std::string>(ClientApp::EmpireID()); - NetworkCore().SendMessage(GlobalChatMessage(PlayerID(), chat_message)); - AIGenerateOrders(); - - chat_message = "Sending orders for ID: " + boost::lexical_cast<std::string>(ClientApp::EmpireID()); - NetworkCore().SendMessage(SingleRecipientChatMessage(PlayerID(), 0, chat_message)); - - StartTurn(); } break; } Modified: trunk/FreeOrion/client/ClientApp.cpp =================================================================== --- trunk/FreeOrion/client/ClientApp.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/client/ClientApp.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -15,7 +15,8 @@ m_current_combat(0), m_player_id(-1), m_empire_id(-1), - m_current_turn(INVALID_GAME_TURN) + m_current_turn(INVALID_GAME_TURN), + m_universe() { if (s_app) throw std::runtime_error("Attempted to construct a second instance of ClientApp"); Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2007-05-28 05:36:07 UTC (rev 2061) @@ -2,8 +2,12 @@ def InitFreeOrionAI(): foaiint.LogOutput("Initialized FreeOrion Python AI") + foaiint.LogOutput(foaiint.PlayerName()) def GenerateOrders(): + foaiint.SendChatMessage(0, "Sending chat message from within Python!") + empire = foaiint.GetEmpire() + homeworldID = empire.HomeworldID() + foaiint.SendChatMessage(0, "My homeworld id: " + str(empire.HomeworldID())) foaiint.DoneTurn() - foaiint.SendChatMessage(0, "Sending chat message from within Python!") - foaiint.LogOutput("Generated Orders") \ No newline at end of file + foaiint.LogOutput("Generated Orders") Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/server/ServerApp.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -96,7 +96,8 @@ m_current_combat(0), m_log_category(log4cpp::Category::getRoot()), m_state(SERVER_IDLE), - m_current_turn(INVALID_GAME_TURN) + m_current_turn(INVALID_GAME_TURN), + m_universe() { for (int n = 0; n < 10000; n++) { int x = n/(n+1); @@ -685,7 +686,7 @@ Universe& ServerApp::GetUniverse() { - return ServerApp::GetApp()->m_universe; + return s_app->m_universe; } EmpireManager& ServerApp::Empires() Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2007-05-26 02:57:04 UTC (rev 2060) +++ trunk/FreeOrion/util/Order.cpp 2007-05-28 05:36:07 UTC (rev 2061) @@ -76,9 +76,9 @@ m_object(UniverseObject::INVALID_OBJECT_ID) {} -RenameOrder::RenameOrder(int empire, int fleet, const std::string& name) : +RenameOrder::RenameOrder(int empire, int object, const std::string& name) : Order(empire), - m_object(fleet), + m_object(object), m_name(name) { if (name == "") |
From: <geo...@us...> - 2007-06-17 09:08:23
|
Revision: 2076 http://svn.sourceforge.net/freeorion/revision/?rev=2076&view=rev Author: geoffthemedio Date: 2007-06-17 02:08:25 -0700 (Sun, 17 Jun 2007) Log Message: ----------- -Added ability to custom-filter the buildable items list on the production screen by build item type (building, ship, orbital) and whether or not the item is currently available (buildable) -Added getters to Empire to access ship designs and available buildings -Improved encapsulation of TechTreeControls by making it a friend of TechTreeWnd and making the previously public button containers private (the friending lets the TechTreeWnd access these buttons still) -Made the BuildingTypeManager function like the TechManager - it's now a singleton and there is a GetBuildingTypeManager free function to access it, and there are beging and end functions to iterate through it Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.h trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Tech.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/Empire/Empire.cpp 2007-06-17 09:08:25 UTC (rev 2076) @@ -689,15 +689,41 @@ const std::set<std::string>& Empire::AvailableBuildingTypes() const { - return m_building_types; + return m_available_building_types; } bool Empire::BuildingTypeAvailable(const std::string& name) const { - Empire::BuildingTypeItr item = m_building_types.find(name); - return item != m_building_types.end(); + Empire::BuildingTypeItr item = m_available_building_types.find(name); + return item != m_available_building_types.end(); } +const std::map<std::string, ShipDesign>& Empire::ShipDesigns() const +{ + return m_ship_designs; +} + +std::map<std::string, ShipDesign> Empire::AvailableShipDesigns() const +{ + // create new map containing all ship designs that are available + std::map<std::string, ShipDesign> retval; + for (std::map<std::string, ShipDesign>::const_iterator it = m_ship_designs.begin(); it != m_ship_designs.end(); ++it) { + if (ShipDesignAvailable(it->first)) + retval.insert(*it); + } + return retval; +} + +bool Empire::ShipDesignAvailable(const std::string& name) const +{ + /* currently any ship design is available, but in future this will need to determine if + the specific design is buildable */ + if (m_ship_designs.find(name) != m_ship_designs.end()) + return true; + else + return false; +} + const ProductionQueue& Empire::GetProductionQueue() const { return m_production_queue; @@ -775,13 +801,13 @@ return m_techs.end(); } -Empire::TechItr Empire::BuildingTypeBegin() const +Empire::TechItr Empire::AvailableBuildingTypeBegin() const { - return m_building_types.begin(); + return m_available_building_types.begin(); } -Empire::TechItr Empire::BuildingTypeEnd() const +Empire::TechItr Empire::AvailableBuildingTypeEnd() const { - return m_building_types.end(); + return m_available_building_types.end(); } Empire::SystemIDItr Empire::ExploredBegin() const @@ -980,7 +1006,7 @@ void Empire::AddBuildingType(const std::string& name) { - m_building_types.insert(name); + m_available_building_types.insert(name); } void Empire::AddExploredSystem(int ID) @@ -1017,7 +1043,7 @@ void Empire::RemoveBuildingType(const std::string& name) { - m_building_types.erase(name); + m_available_building_types.erase(name); } void Empire::ClearSitRep() Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/Empire/Empire.h 2007-06-17 09:08:25 UTC (rev 2076) @@ -266,13 +266,6 @@ /// Returns the ship design with the requested name, or 0 if none exists. const ShipDesign* GetShipDesign(const std::string& name) const; - /* ****************************************************** - * The Empire object maintains containers of the following - * objects (all referenced by their object IDs) - * - Tech advances - * - Explored Systems - *********************************************************/ - /// Returns true iff \a name is a tech that has not been researched, and has no unresearched prerequisites. bool ResearchableTech(const std::string& name) const; @@ -298,6 +291,15 @@ /// Returns true if the given building type is known to this empire, false if it is not. bool BuildingTypeAvailable(const std::string& name) const; + /// Returns the set of all ship designs of this empire + const std::map<std::string, ShipDesign>& ShipDesigns() const; + + /// Returns the set of ship designs of this empire that the empire can actually build + std::map<std::string, ShipDesign> AvailableShipDesigns() const; + + /// Returns true iff this ship design can be built by this empire + bool ShipDesignAvailable(const std::string& name) const; + /// Returns the queue of items being or queued to be produced. const ProductionQueue& GetProductionQueue() const; @@ -320,8 +322,8 @@ TechItr TechBegin() const; TechItr TechEnd() const; - BuildingTypeItr BuildingTypeBegin() const; - BuildingTypeItr BuildingTypeEnd() const; + BuildingTypeItr AvailableBuildingTypeBegin() const; + BuildingTypeItr AvailableBuildingTypeEnd() const; SystemIDItr ExploredBegin() const; SystemIDItr ExploredEnd() const; ShipDesignItr ShipDesignBegin() const; @@ -532,7 +534,7 @@ std::vector<double> m_production_progress; /// list of acquired BuildingType. These are string names referencing BuildingType objects - std::set<std::string> m_building_types; + std::set<std::string> m_available_building_types; /// systems you've explored std::set<int> m_explored_systems; @@ -640,7 +642,7 @@ & BOOST_SERIALIZATION_NVP(m_research_progress) & BOOST_SERIALIZATION_NVP(m_production_queue) & BOOST_SERIALIZATION_NVP(m_production_progress) - & BOOST_SERIALIZATION_NVP(m_building_types) + & BOOST_SERIALIZATION_NVP(m_available_building_types) & BOOST_SERIALIZATION_NVP(m_explored_systems) & BOOST_SERIALIZATION_NVP(m_ship_designs) & BOOST_SERIALIZATION_NVP(m_sitrep_entries) Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2007-06-17 09:08:25 UTC (rev 2076) @@ -32,6 +32,29 @@ {} virtual void GainingFocus() {DeselectAll();} }; + + struct ToggleBuildTypeFunctor + { + ToggleBuildTypeFunctor(BuildDesignatorWnd* designator_wnd, BuildType type) : m_designator_wnd(designator_wnd), m_build_type(type) {} + void operator()() {m_designator_wnd->ToggleType(m_build_type);} + BuildDesignatorWnd* const m_designator_wnd; + const BuildType m_build_type; + }; + + struct ToggleAllBuildTypesFunctor + { + ToggleAllBuildTypesFunctor(BuildDesignatorWnd* designator_wnd) : m_designator_wnd(designator_wnd) {} + void operator()() {m_designator_wnd->ToggleAllTypes();} + BuildDesignatorWnd* const m_designator_wnd; + }; + + struct ToggleAvailabilityFunctor + { + ToggleAvailabilityFunctor(BuildDesignatorWnd* designator_wnd, bool available) : m_designator_wnd(designator_wnd), m_available(available) {} + void operator()() {m_designator_wnd->ToggleAvailabilitly(m_available);} + BuildDesignatorWnd* const m_designator_wnd; + const bool m_available; // true: toggle whether to show available techs; false: toggle whether to show unavailable techs + }; } ////////////////////////////////////////////////// @@ -365,76 +388,87 @@ BuildSelector(int w, int h); ~BuildSelector(); - virtual void MinimizeClicked(); + const std::set<BuildType>& GetBuildTypesShown() const; + const std::pair<bool, bool>& GetAvailabilitiesShown() const; // .first -> available items; .second -> unavailable items + virtual void MinimizeClicked(); + void Reset(bool keep_selection); + void ShowType(BuildType type); + void ShowAllTypes(); + void HideType(BuildType type); + void HideAllTypes(); + + void ShowAvailability(bool available); + void ShowAllAvailabilities(); + void HideAvailability(bool available); + void HideAllAvailabilities(); + mutable boost::signal<void (BuildType, const std::string&)> DisplayBuildItemSignal; mutable boost::signal<void (BuildType, const std::string&, int)> RequestBuildItemSignal; private: - struct CategoryClickedFunctor - { - CategoryClickedFunctor(BuildType build_type_, BuildSelector& build_selector_); - void operator()(); - const BuildType build_type; - BuildSelector& build_selector; - }; + void DoLayout(); - void PopulateList(BuildType build_type, bool keep_selection); + bool BuildableItemVisible(const BuildingType& building_type); + bool BuildableItemVisible(const ShipDesign& ship_design); + bool BuildableOrbitalsVisible(); + void PopulateList(bool keep_selection); + void BuildItemSelected(const std::set<int>& selections); void BuildItemDoubleClicked(int row_index, GG::ListBox::Row* row); - BuildType m_current_build_type; - std::vector<CUIButton*> m_build_category_buttons; - BuildableItemsListBox* m_buildable_items; - std::map<GG::ListBox::Row*, BuildType> m_build_types; - GG::Pt m_original_ul; + std::map<BuildType, CUIButton*> m_build_type_buttons; + std::vector<CUIButton*> m_availability_buttons; - std::set<boost::signals::connection> m_misc_connections; + std::set<BuildType> m_build_types_shown; + std::pair<bool, bool> m_availabilities_shown; // .first -> available items; .second -> unavailable items + + BuildableItemsListBox* m_buildable_items; + std::map<GG::ListBox::Row*, BuildType> m_build_types; + GG::Pt m_original_ul; - friend struct PopulateListFunctor; -}; + std::set<boost::signals::connection> m_misc_connections; -BuildDesignatorWnd::BuildSelector::CategoryClickedFunctor::CategoryClickedFunctor(BuildType build_type_, BuildSelector& build_selector_) : - build_type(build_type_), - build_selector(build_selector_) -{} + int row_height; + int icon_col_width; + int name_col_width; + int cost_col_width; + int time_col_width; + int desc_col_width; -void BuildDesignatorWnd::BuildSelector::CategoryClickedFunctor::operator()() -{ - build_selector.PopulateList(build_type, false); -} + friend class BuildDesignatorWnd; // so BuildDesignatorWnd can access buttons +}; BuildDesignatorWnd::BuildSelector::BuildSelector(int w, int h) : - CUIWnd(UserString("PRODUCTION_WND_BUILD_ITEMS_TITLE"), 0, 0, w, h, GG::CLICKABLE | CUIWnd::MINIMIZABLE), - m_current_build_type(BT_BUILDING) + CUIWnd(UserString("PRODUCTION_WND_BUILD_ITEMS_TITLE"), 0, 0, w, h, GG::CLICKABLE | CUIWnd::MINIMIZABLE) { - GG::Pt client_size = ClientSize(); - GG::Layout* layout = new GG::Layout(0, 0, client_size.x, client_size.y, 1, 1, 3, 6); - int button_height; - for (BuildType i = BuildType(BT_NOT_BUILDING + 1); i < NUM_BUILD_TYPES; i = BuildType(i + 1)) { - CUIButton* button = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_" + boost::lexical_cast<std::string>(i))); - button_height = button->Height(); - m_misc_connections.insert(GG::Connect(button->ClickedSignal, CategoryClickedFunctor(i, *this))); - m_build_category_buttons.push_back(button); - layout->Add(button, 0, i - (BT_NOT_BUILDING + 1)); - } - CUIButton* button = new CUIButton(0, 0, 1, UserString("ALL")); - button_height = button->Height(); - m_misc_connections.insert(GG::Connect(button->ClickedSignal, CategoryClickedFunctor(NUM_BUILD_TYPES, *this))); - m_build_category_buttons.push_back(button); - layout->Add(button, 0, NUM_BUILD_TYPES - (BT_NOT_BUILDING + 1)); + // create build type toggle buttons (ship, building, orbital, all) + m_build_type_buttons[BT_BUILDING] = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_BT_BUILDING")); + AttachChild(m_build_type_buttons[BT_BUILDING]); + m_build_type_buttons[BT_SHIP] = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_BT_SHIP")); + AttachChild(m_build_type_buttons[BT_SHIP]); + m_build_type_buttons[BT_ORBITAL] = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_BT_ORBITAL")); + AttachChild(m_build_type_buttons[BT_ORBITAL]); + m_build_type_buttons[NUM_BUILD_TYPES] = new CUIButton(0, 0, 1, UserString("ALL")); + AttachChild(m_build_type_buttons[NUM_BUILD_TYPES]); + + // create availability toggle buttons (available, not available) + m_availability_buttons.push_back(new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_AVAILABILITY_AVAILABLE"))); + AttachChild(m_availability_buttons.back()); + m_availability_buttons.push_back(new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_AVAILABILITY_UNAVAILABLE"))); + AttachChild(m_availability_buttons.back()); + + // selectable list of buildable items m_buildable_items = new BuildableItemsListBox(0, 0, 1, 1); + AttachChild(m_buildable_items); m_misc_connections.insert(GG::Connect(m_buildable_items->SelChangedSignal, &BuildDesignatorWnd::BuildSelector::BuildItemSelected, this)); m_misc_connections.insert(GG::Connect(m_buildable_items->DoubleClickedSignal, &BuildDesignatorWnd::BuildSelector::BuildItemDoubleClicked, this)); m_buildable_items->SetStyle(GG::LB_NOSORT | GG::LB_SINGLESEL); - layout->Add(m_buildable_items, 1, 0, 1, layout->Columns()); - layout->SetMinimumRowHeight(0, button_height); - layout->SetRowStretch(0, 0); - layout->SetRowStretch(1, 1); - AttachChild(layout); - PopulateList(m_current_build_type, false); + + DoLayout(); + PopulateList(false); } BuildDesignatorWnd::BuildSelector::~BuildSelector() @@ -446,6 +480,56 @@ } } +const std::set<BuildType>& BuildDesignatorWnd::BuildSelector::GetBuildTypesShown() const +{ + return m_build_types_shown; +} + +const std::pair<bool, bool>& BuildDesignatorWnd::BuildSelector::GetAvailabilitiesShown() const +{ + return m_availabilities_shown; +} + +void BuildDesignatorWnd::BuildSelector::DoLayout() +{ + Logger().debugStream() << "BuildSelector::DoLayout()"; + GG::Pt client_size = ClientSize(); + + int x = 0, button_width = 60, button_height = 20; + for (unsigned int i = 0; i < m_build_type_buttons.size() - 1; ++i) { + m_build_type_buttons[BuildType(BT_BUILDING + i)]->SizeMove(GG::Pt(x, 0), GG::Pt(x + button_width, button_height)); + x += button_width; + } + m_build_type_buttons[NUM_BUILD_TYPES]->SizeMove(GG::Pt(x, 0), GG::Pt(x + button_width, button_height)); x += button_width; + + m_availability_buttons[0]->SizeMove(GG::Pt(x, 0), GG::Pt(x + button_width, button_height)); x += button_width; + m_availability_buttons[1]->SizeMove(GG::Pt(x, 0), GG::Pt(x + button_width, button_height)); + + m_buildable_items->SizeMove(GG::Pt(0, button_height), client_size); + + row_height = ClientUI::Pts()*3/2; + icon_col_width = row_height; + name_col_width = ClientUI::Pts()*18; + cost_col_width = ClientUI::Pts()*3; + time_col_width = ClientUI::Pts()*2; + desc_col_width = m_buildable_items->ClientWidth() + - (icon_col_width + name_col_width + cost_col_width + time_col_width) + - ClientUI::ScrollWidth(); + + m_buildable_items->SetNumCols(5); + m_buildable_items->LockColWidths(); + m_buildable_items->SetColWidth(0, icon_col_width); + m_buildable_items->SetColWidth(1, name_col_width); + m_buildable_items->SetColWidth(2, cost_col_width); + m_buildable_items->SetColWidth(3, time_col_width); + m_buildable_items->SetColWidth(4, desc_col_width); + m_buildable_items->SetColAlignment(0, GG::ALIGN_LEFT); + m_buildable_items->SetColAlignment(1, GG::ALIGN_LEFT); + m_buildable_items->SetColAlignment(2, GG::ALIGN_LEFT); + m_buildable_items->SetColAlignment(3, GG::ALIGN_LEFT); + m_buildable_items->SetColAlignment(4, GG::ALIGN_LEFT); +} + void BuildDesignatorWnd::BuildSelector::MinimizeClicked() { if (!m_minimized) { @@ -482,148 +566,247 @@ void BuildDesignatorWnd::BuildSelector::Reset(bool keep_selection) { - m_current_build_type = BT_BUILDING; - PopulateList(m_current_build_type, keep_selection); + PopulateList(keep_selection); + DoLayout(); } -void BuildDesignatorWnd::BuildSelector::PopulateList(BuildType build_type, bool keep_selection) +void BuildDesignatorWnd::BuildSelector::ShowType(BuildType type) { - std::string selected_row_data_type; - int row_to_select = -1; - if (keep_selection && build_type == m_current_build_type && m_buildable_items->Selections().size() == 1) { - selected_row_data_type = m_buildable_items->GetRow(*m_buildable_items->Selections().begin()).DragDropDataType(); + if (m_build_types_shown.find(type) == m_build_types_shown.end()) { + m_build_types_shown.insert(type); + PopulateList(true); } +} - const int ROW_HEIGHT = 24; // should change to be font point size... - const int ICON_COL_WIDTH = ROW_HEIGHT; - const int NAME_COL_WIDTH = 200; - const int COST_COL_WIDTH = 30; - const int TIME_COL_WIDTH = 20; - const int DESC_COL_WIDTH = m_buildable_items->Width() - (NAME_COL_WIDTH + COST_COL_WIDTH + TIME_COL_WIDTH); +void BuildDesignatorWnd::BuildSelector::HideType(BuildType type) +{ + std::set<BuildType>::iterator it = m_build_types_shown.find(type); + if (it != m_build_types_shown.end()) { + m_build_types_shown.erase(it); + PopulateList(true); + } +} - m_buildable_items->SetNumCols(5); - m_buildable_items->LockColWidths(); - m_buildable_items->SetColWidth(0, ICON_COL_WIDTH); - m_buildable_items->SetColWidth(1, NAME_COL_WIDTH); - m_buildable_items->SetColWidth(2, COST_COL_WIDTH); - m_buildable_items->SetColWidth(3, TIME_COL_WIDTH); - m_buildable_items->SetColWidth(4, DESC_COL_WIDTH); - m_buildable_items->SetColAlignment(0, GG::ALIGN_LEFT); - m_buildable_items->SetColAlignment(1, GG::ALIGN_LEFT); - m_buildable_items->SetColAlignment(2, GG::ALIGN_LEFT); - m_buildable_items->SetColAlignment(3, GG::ALIGN_LEFT); - m_buildable_items->SetColAlignment(4, GG::ALIGN_LEFT); +void BuildDesignatorWnd::BuildSelector::ShowAllTypes() +{ + m_build_types_shown.insert(BT_BUILDING); + m_build_types_shown.insert(BT_SHIP); + m_build_types_shown.insert(BT_ORBITAL); + PopulateList(true); +} - m_current_build_type = build_type; - m_buildable_items->Clear(); - m_build_types.clear(); +void BuildDesignatorWnd::BuildSelector::HideAllTypes() +{ + m_build_types_shown.clear(); + PopulateList(false); +} +void BuildDesignatorWnd::BuildSelector::ShowAvailability(bool available) +{ + if (available) { + if (!m_availabilities_shown.first) { + m_availabilities_shown.first = true; + PopulateList(true); + } + } else { + if (!m_availabilities_shown.second) { + m_availabilities_shown.second = true; + PopulateList(true); + } + } +} + +void BuildDesignatorWnd::BuildSelector::HideAvailability(bool available) +{ + if (available) { + if (m_availabilities_shown.first) { + m_availabilities_shown.first = false; + PopulateList(true); + } + } else { + if (m_availabilities_shown.second) { + m_availabilities_shown.second = false; + PopulateList(true); + } + } +} + +bool BuildDesignatorWnd::BuildSelector::BuildableItemVisible(const BuildingType& building_type) +{ + if (m_build_types_shown.find(BT_BUILDING) == m_build_types_shown.end()) + return false; + + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + bool available = empire->BuildingTypeAvailable(building_type.Name()); + + if (available) + return m_availabilities_shown.first; + else + return m_availabilities_shown.second; +} + +bool BuildDesignatorWnd::BuildSelector::BuildableItemVisible(const ShipDesign& ship_design) +{ + if (m_build_types_shown.find(BT_SHIP) == m_build_types_shown.end()) + return false; + + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + bool available = empire->ShipDesignAvailable(ship_design.name); + + if (available) + return m_availabilities_shown.first; + else + return m_availabilities_shown.second; +} + +bool BuildDesignatorWnd::BuildSelector::BuildableOrbitalsVisible() +{ + return m_availabilities_shown.first; // orbitals are currently always buildable, so only care if buildable items are visible +} + +void BuildDesignatorWnd::BuildSelector::PopulateList(bool keep_selection) +{ + Logger().errorStream() << "PopulateList start"; Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) return; + + // keep track of initially selected row, so that new rows added may be compared to it to see if they should be selected after repopulating + std::string selected_row; + if (m_buildable_items->Selections().size() == 1) { + selected_row = m_buildable_items->GetRow(*m_buildable_items->Selections().begin()).DragDropDataType(); + } + + m_buildable_items->Clear(); // the list of items to be populated + m_build_types.clear(); // map from row to BuildType + + boost::shared_ptr<GG::Font> default_font = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()); - int i = 0; - if (build_type == BT_BUILDING || build_type == NUM_BUILD_TYPES) { - Empire::BuildingTypeItr end_it = empire->BuildingTypeEnd(); - for (Empire::BuildingTypeItr it = empire->BuildingTypeBegin(); it != end_it; ++it, ++i) { + int row_to_select = -1; // may be set while populating - used to reselect previously selected row after populating + int i = 0; // counter that keeps track of how many rows have been added so far + + // populate list with building types + Logger().errorStream() << "Adding Buildings"; + if (m_build_types_shown.find(BT_BUILDING) != m_build_types_shown.end()) { + BuildingTypeManager& manager = GetBuildingTypeManager(); + + for (BuildingTypeManager::iterator it = manager.begin(); it != manager.end(); ++it, ++i) { + const BuildingType* type = it->second; + const std::string name = it->first; + + if (!BuildableItemVisible(*type)) continue; + GG::ListBox::Row* row = new GG::ListBox::Row(); - row->SetDragDropDataType(*it); + row->SetDragDropDataType(name); - const BuildingType* type = GetBuildingType(*it); - // icon - GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, ICON_COL_WIDTH, ROW_HEIGHT, + GG::Control* icon = new GG::StaticGraphic(0, 0, icon_col_width, row_height, ClientUI::GetTexture(ClientUI::ArtDir() / type->Graphic()), GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); - row->push_back(dynamic_cast<GG::Control*>(icon)); + row->push_back(icon); // building name - row->push_back(UserString(*it), default_font, ClientUI::TextColor()); + row->push_back(UserString(name), default_font, ClientUI::TextColor()); // cost / turn, and minimum production turns - const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_BUILDING, *it); + const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_BUILDING, name); std::string cost_text = boost::lexical_cast<std::string>(cost_time.first); row->push_back(cost_text, default_font, ClientUI::TextColor()); std::string time_text = boost::lexical_cast<std::string>(cost_time.second); row->push_back(time_text, default_font, ClientUI::TextColor()); // brief description - std::string desc_text = "Building"; - row->push_back(desc_text, default_font, ClientUI::TextColor()); + std::string desc_text = UserString("BT_BUILDING"); + GG::Control* desc_control = new GG::TextControl(0, 0, desc_col_width, row_height, desc_text, default_font, ClientUI::TextColor(), GG::TF_LEFT); ///< ctor taking a font directly + row->push_back(desc_control); m_buildable_items->Insert(row); m_build_types[row] = BT_BUILDING; - if (row->DragDropDataType() == selected_row_data_type) + if (row->DragDropDataType() == selected_row) row_to_select = i; } } - if (build_type == BT_SHIP || build_type == NUM_BUILD_TYPES) { + // populate with ship designs + Logger().errorStream() << "Adding ship designs"; + if (m_build_types_shown.find(BT_SHIP) != m_build_types_shown.end()) { Empire::ShipDesignItr end_it = empire->ShipDesignEnd(); for (Empire::ShipDesignItr it = empire->ShipDesignBegin(); it != end_it; ++it, ++i) { + const ShipDesign& type = it->second; + const std::string name = it->first; + + if (!BuildableItemVisible(type)) continue; + GG::ListBox::Row* row = new GG::ListBox::Row(); - row->SetDragDropDataType(it->first); + row->SetDragDropDataType(name); - const ShipDesign* type = GetShipDesign(empire->EmpireID(), it->first); - // icon - GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, ICON_COL_WIDTH, ROW_HEIGHT, - ClientUI::GetTexture(ClientUI::ArtDir() / type->graphic), + GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, icon_col_width, row_height, + ClientUI::GetTexture(ClientUI::ArtDir() / type.graphic), GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); row->push_back(dynamic_cast<GG::Control*>(icon)); // ship design name - row->push_back(it->first, default_font, ClientUI::TextColor()); + row->push_back(name, default_font, ClientUI::TextColor()); // cost / turn, and minimum production turns - const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_SHIP, it->first); + const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_SHIP, name); std::string cost_text = boost::lexical_cast<std::string>(cost_time.first); row->push_back(cost_text, default_font, ClientUI::TextColor()); std::string time_text = boost::lexical_cast<std::string>(cost_time.second); row->push_back(time_text, default_font, ClientUI::TextColor()); // brief description - std::string desc_text = "Ship"; - row->push_back(desc_text, default_font, ClientUI::TextColor()); + std::string desc_text = UserString("BT_SHIP"); + GG::Control* desc_control = new GG::TextControl(0, 0, desc_col_width, row_height, desc_text, default_font, ClientUI::TextColor(), GG::TF_LEFT); ///< ctor taking a font directly + row->push_back(desc_control); m_buildable_items->Insert(row); m_build_types[row] = BT_SHIP; - if (row->DragDropDataType() == selected_row_data_type) + if (row->DragDropDataType() == selected_row) row_to_select = i; } } - if (build_type == BT_ORBITAL || build_type == NUM_BUILD_TYPES) { - GG::ListBox::Row* row = new GG::ListBox::Row(); - row->SetDragDropDataType("DEFENSE_BASE"); + // populate with orbitals + Logger().errorStream() << "Adding Orbitals"; + if (m_build_types_shown.find(BT_ORBITAL) != m_build_types_shown.end()) { + if (BuildableOrbitalsVisible()) { - // icon - GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, ICON_COL_WIDTH, ROW_HEIGHT, - ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "defensebase.png"), - GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); - row->push_back(dynamic_cast<GG::Control*>(icon)); + GG::ListBox::Row* row = new GG::ListBox::Row(); + row->SetDragDropDataType("DEFENSE_BASE"); - // Defense Base "name" - row->push_back(UserString(row->DragDropDataType()), default_font, ClientUI::TextColor()); + // icon + GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, icon_col_width, row_height, + ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "defensebase.png"), + GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); + row->push_back(dynamic_cast<GG::Control*>(icon)); - // cost / turn, and minimum production turns - const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_ORBITAL, UserString(row->DragDropDataType())); - std::string cost_text = boost::lexical_cast<std::string>(cost_time.first); - row->push_back(cost_text, default_font, ClientUI::TextColor()); - std::string time_text = boost::lexical_cast<std::string>(cost_time.second); - row->push_back(time_text, default_font, ClientUI::TextColor()); + // Defense Base "name" + row->push_back(UserString(row->DragDropDataType()), default_font, ClientUI::TextColor()); - // brief description - std::string desc_text = "Def. Base"; - row->push_back(desc_text, default_font, ClientUI::TextColor()); + // cost / turn, and minimum production turns + const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_ORBITAL, UserString(row->DragDropDataType())); + std::string cost_text = boost::lexical_cast<std::string>(cost_time.first); + row->push_back(cost_text, default_font, ClientUI::TextColor()); + std::string time_text = boost::lexical_cast<std::string>(cost_time.second); + row->push_back(time_text, default_font, ClientUI::TextColor()); - m_buildable_items->Insert(row); - m_build_types[row] = BT_ORBITAL; - if (row->DragDropDataType() == selected_row_data_type) - row_to_select = i; + // brief description + std::string desc_text = UserString("BT_ORBITAL"); + GG::Control* desc_control = new GG::TextControl(0, 0, desc_col_width, row_height, desc_text, default_font, ClientUI::TextColor(), GG::TF_LEFT); ///< ctor taking a font directly + row->push_back(desc_control); + + m_buildable_items->Insert(row); + m_build_types[row] = BT_ORBITAL; + if (row->DragDropDataType() == selected_row) + row_to_select = i; + } } + Logger().errorStream() << "Selecting Row"; if (row_to_select != -1) m_buildable_items->SelectRow(row_to_select); + Logger().errorStream() << "Done"; } void BuildDesignatorWnd::BuildSelector::BuildItemSelected(const std::set<int>& selections) @@ -650,12 +833,18 @@ int CHILD_WIDTHS = w - MapWnd::SIDE_PANEL_WIDTH; const int DETAIL_PANEL_HEIGHT = TechTreeWnd::NAVIGATOR_AND_DETAIL_HEIGHT; const int BUILD_SELECTOR_HEIGHT = DETAIL_PANEL_HEIGHT; + m_build_detail_panel = new BuildDetailPanel(CHILD_WIDTHS, DETAIL_PANEL_HEIGHT); - m_build_selector = new BuildSelector(CHILD_WIDTHS, BUILD_SELECTOR_HEIGHT); - m_build_selector->MoveTo(GG::Pt(0, h - BUILD_SELECTOR_HEIGHT)); + m_side_panel = new SidePanel(Width() - MapWnd::SIDE_PANEL_WIDTH, 0, MapWnd::SIDE_PANEL_WIDTH, GG::GUI::GetGUI()->AppHeight()); m_side_panel->Hide(); + m_map_view_hole = GG::Rect(0, 0, CHILD_WIDTHS + SidePanel::MAX_PLANET_DIAMETER, h); + + m_build_selector = new BuildSelector(CHILD_WIDTHS, BUILD_SELECTOR_HEIGHT); + m_build_selector->MoveTo(GG::Pt(0, h - BUILD_SELECTOR_HEIGHT)); + + m_misc_connections.insert(GG::Connect(m_build_detail_panel->RequestBuildItemSignal, &BuildDesignatorWnd::BuildItemRequested, this)); m_misc_connections.insert(GG::Connect(m_build_detail_panel->BuildQuantityChangedSignal, BuildQuantityChangedSignal)); m_misc_connections.insert(GG::Connect(m_build_selector->DisplayBuildItemSignal, &BuildDesignatorWnd::BuildDetailPanel::SetBuildItem, m_build_detail_panel)); @@ -663,8 +852,17 @@ m_misc_connections.insert(GG::Connect(m_side_panel->PlanetSelectedSignal, &BuildDesignatorWnd::SelectPlanet, this)); m_misc_connections.insert(GG::Connect(m_side_panel->SystemSelectedSignal, SystemSelectedSignal)); - m_map_view_hole = GG::Rect(0, 0, CHILD_WIDTHS + SidePanel::MAX_PLANET_DIAMETER, h); + // connect build type button clicks to update display + GG::Connect(m_build_selector->m_build_type_buttons[BT_BUILDING]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_BUILDING)); + GG::Connect(m_build_selector->m_build_type_buttons[BT_SHIP]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_SHIP)); + GG::Connect(m_build_selector->m_build_type_buttons[BT_ORBITAL]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_ORBITAL)); + GG::Connect(m_build_selector->m_build_type_buttons[NUM_BUILD_TYPES]->ClickedSignal, ToggleAllBuildTypesFunctor(this)); // last button should be "All" button + + // connect availability button clicks to update display + GG::Connect(m_build_selector->m_availability_buttons.at(0)->ClickedSignal, ToggleAvailabilityFunctor(this, true)); // available items + GG::Connect(m_build_selector->m_availability_buttons.at(1)->ClickedSignal, ToggleAvailabilityFunctor(this, false)); // UNavailable items + AttachChild(m_build_detail_panel); AttachChild(m_build_selector); AttachChild(m_side_panel); @@ -679,6 +877,16 @@ } } +const std::set<BuildType>& BuildDesignatorWnd::GetBuildTypesShown() const +{ + return m_build_selector->GetBuildTypesShown(); +} + +const std::pair<bool, bool>& BuildDesignatorWnd::GetAvailabilitiesShown() const +{ + return m_build_selector->GetAvailabilitiesShown(); +} + bool BuildDesignatorWnd::InWindow(const GG::Pt& pt) const { GG::Rect clip_rect = m_map_view_hole + UpperLeft(); @@ -750,6 +958,9 @@ } SelectDefaultPlanet(m_side_panel->SystemID()); m_build_selector->Reset(true); + ShowAllTypes(); + ShowAvailability(true); + ShowAvailability(false); m_build_detail_panel->Reset(); m_side_panel->Refresh(); } @@ -764,6 +975,100 @@ m_system_default_planets.clear(); } +void BuildDesignatorWnd::ShowType(BuildType type) +{ + Logger().errorStream() << "BuildDesignatorWnd::ShowType(" << boost::lexical_cast<std::string>(type) << ")"; + if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + m_build_selector->ShowType(type); + m_build_selector->m_build_type_buttons[type]->MarkSelectedGray(); + } else { + throw std::invalid_argument("BuildDesignatorWnd::ShowType was passed an invalid BuildType"); + } +} + +void BuildDesignatorWnd::ShowAllTypes() +{ + m_build_selector->ShowAllTypes(); + m_build_selector->m_build_type_buttons[BT_BUILDING]->MarkSelectedGray(); + m_build_selector->m_build_type_buttons[BT_SHIP]->MarkSelectedGray(); + m_build_selector->m_build_type_buttons[BT_ORBITAL]->MarkSelectedGray(); +} + +void BuildDesignatorWnd::HideType(BuildType type) +{ + Logger().errorStream() << "BuildDesignatorWnd::HideType(" << boost::lexical_cast<std::string>(type) << ")"; + if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + m_build_selector->HideType(type); + m_build_selector->m_build_type_buttons[type]->MarkNotSelected(); + } else { + throw std::invalid_argument("BuildDesignatorWnd::HideType was passed an invalid BuildType"); + } +} + +void BuildDesignatorWnd::HideAllTypes() +{ + m_build_selector->HideAllTypes(); + m_build_selector->m_build_type_buttons[BT_BUILDING]->MarkNotSelected(); + m_build_selector->m_build_type_buttons[BT_SHIP]->MarkNotSelected(); + m_build_selector->m_build_type_buttons[BT_ORBITAL]->MarkNotSelected(); +} + +void BuildDesignatorWnd::ToggleType(BuildType type) +{ + if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + const std::set<BuildType>& types_shown = m_build_selector->GetBuildTypesShown(); + if (types_shown.find(type) == types_shown.end()) + ShowType(type); + else + HideType(type); + } else { + throw std::invalid_argument("BuildDesignatorWnd::ShowType was passed an invalid BuildType"); + } +} + +void BuildDesignatorWnd::ToggleAllTypes() +{ + const std::set<BuildType>& types_shown = m_build_selector->GetBuildTypesShown(); + if (types_shown.size() == 3) // will need to update this if more build types are added + HideAllTypes(); + else + ShowAllTypes(); +} + +void BuildDesignatorWnd::ShowAvailability(bool available) +{ + m_build_selector->ShowAvailability(available); + if (available) + m_build_selector->m_availability_buttons.at(0)->MarkSelectedGray(); + else + m_build_selector->m_availability_buttons.at(1)->MarkSelectedGray(); +} + +void BuildDesignatorWnd::HideAvailability(bool available) +{ + m_build_selector->HideAvailability(available); + if (available) + m_build_selector->m_availability_buttons.at(0)->MarkNotSelected(); + else + m_build_selector->m_availability_buttons.at(1)->MarkNotSelected(); +} + +void BuildDesignatorWnd::ToggleAvailabilitly(bool available) +{ + const std::pair<bool, bool>& avail_shown = m_build_selector->GetAvailabilitiesShown(); + if (available) { + if (avail_shown.first) + HideAvailability(true); + else + ShowAvailability(true); + } else { + if (avail_shown.second) + HideAvailability(false); + else + ShowAvailability(false); + } +} + void BuildDesignatorWnd::BuildItemRequested(BuildType build_type, const std::string& item, int num_to_build) { Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.h =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.h 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.h 2007-06-17 09:08:25 UTC (rev 2076) @@ -29,6 +29,9 @@ //@} /** \name Accessors */ //@{ + const std::set<BuildType>& GetBuildTypesShown() const; + const std::pair<bool, bool>& GetAvailabilitiesShown() const; // .first -> available items; .second -> unavailable items + virtual bool InWindow(const GG::Pt& pt) const; virtual bool InClient(const GG::Pt& pt) const; @@ -42,6 +45,17 @@ void SelectPlanet(int planet); void Reset(); void Clear(); + + void ShowType(BuildType type); + void ShowAllTypes(); + void HideType(BuildType type); + void HideAllTypes(); + void ToggleType(BuildType type); + void ToggleAllTypes(); + + void ShowAvailability(bool available); + void HideAvailability(bool available); + void ToggleAvailabilitly(bool available); //@} mutable AddBuildToQueueSignalType AddBuildToQueueSignal; Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-06-17 09:08:25 UTC (rev 2076) @@ -355,10 +355,6 @@ virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); //@} - std::vector<CUIButton*> m_category_buttons; - std::map<TechType, CUIButton*> m_tech_type_buttons; - std::map<TechStatus, CUIButton*> m_tech_status_buttons; - private: void DoButtonLayout(); @@ -368,8 +364,14 @@ int m_category_button_rows; int m_status_or_type_button_rows; - static const int BUTTON_SEPARATION = 3; // vertical or horizontal sepration between adjacent buttons - static const int UPPER_LEFT_PAD = 2; // offset of buttons' position from top left of controls box + static const int BUTTON_SEPARATION = 3; // vertical or horizontal sepration between adjacent buttons + static const int UPPER_LEFT_PAD = 2; // offset of buttons' position from top left of controls box + + std::vector<CUIButton*> m_category_buttons; + std::map<TechType, CUIButton*> m_tech_type_buttons; + std::map<TechStatus, CUIButton*> m_tech_status_buttons; + + friend class TechTreeWnd; // so TechTreeWnd can access buttons }; TechTreeWnd::TechTreeControls::TechTreeControls(int x, int y, int w) : @@ -1220,10 +1222,10 @@ void SetScale(double scale); void ShowCategory(const std::string& category); void HideCategory(const std::string& category); - void ShowType(const TechType type); - void HideType(const TechType type); - void ShowStatus(const TechStatus status); - void HideStatus(const TechStatus status); + void ShowType(TechType type); + void HideType(TechType type); + void ShowStatus(TechStatus status); + void HideStatus(TechStatus status); void ShowTech(const Tech* tech); void CenterOnTech(const Tech* tech); //@} @@ -1759,14 +1761,14 @@ } } -void TechTreeWnd::LayoutPanel::ShowType(const TechType type) { +void TechTreeWnd::LayoutPanel::ShowType(TechType type) { if (m_tech_types_shown.find(type) == m_tech_types_shown.end()) { m_tech_types_shown.insert(type); Layout(true); } } -void TechTreeWnd::LayoutPanel::HideType(const TechType type) { +void TechTreeWnd::LayoutPanel::HideType(TechType type) { std::set<TechType>::iterator it = m_tech_types_shown.find(type); if (it != m_tech_types_shown.end()) { m_tech_types_shown.erase(it); @@ -1774,14 +1776,14 @@ } } -void TechTreeWnd::LayoutPanel::ShowStatus(const TechStatus status) { +void TechTreeWnd::LayoutPanel::ShowStatus(TechStatus status) { if (m_tech_statuses_shown.find(status) == m_tech_statuses_shown.end()) { m_tech_statuses_shown.insert(status); Layout(true); } } -void TechTreeWnd::LayoutPanel::HideStatus(const TechStatus status) { +void TechTreeWnd::LayoutPanel::HideStatus(TechStatus status) { std::set<TechStatus>::iterator it = m_tech_statuses_shown.find(status); if (it != m_tech_statuses_shown.end()) { m_tech_statuses_shown.erase(it); @@ -2198,7 +2200,7 @@ HideCategory(category); } -void TechTreeWnd::ShowStatus(const TechStatus status) +void TechTreeWnd::ShowStatus(TechStatus status) { m_layout_panel->ShowStatus(status); @@ -2206,7 +2208,7 @@ button->MarkSelectedGray(); } -void TechTreeWnd::HideStatus(const TechStatus status) +void TechTreeWnd::HideStatus(TechStatus status) { m_layout_panel->HideStatus(status); @@ -2214,7 +2216,7 @@ button->MarkNotSelected(); } -void TechTreeWnd::ToggleStatus(const TechStatus status) +void TechTreeWnd::ToggleStatus(TechStatus status) { std::set<TechStatus> statuses = m_layout_panel->GetTechStatusesShown(); @@ -2225,7 +2227,7 @@ HideStatus(status); } -void TechTreeWnd::ShowType(const TechType type) +void TechTreeWnd::ShowType(TechType type) { m_layout_panel->ShowType(type); @@ -2233,7 +2235,7 @@ button->MarkSelectedGray(); } -void TechTreeWnd::HideType(const TechType type) +void TechTreeWnd::HideType(TechType type) { m_layout_panel->HideType(type); @@ -2241,7 +2243,7 @@ button->MarkNotSelected(); } -void TechTreeWnd::ToggleType(const TechType type) +void TechTreeWnd::ToggleType(TechType type) { std::set<TechType> types = m_layout_panel->GetTechTypesShown(); Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/default/eng_stringtable.txt 2007-06-17 09:08:25 UTC (rev 2076) @@ -1221,6 +1221,12 @@ PRODUCTION_WND_CATEGORY_BT_ORBITAL Orbitals +PRODUCTION_WND_AVAILABILITY_AVAILABLE +Available + +PRODUCTION_WND_AVAILABILITY_UNAVAILABLE +Unavailable + PRODUCTION_TOTAL_COST_STR %1% PP / %2% Turns Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/universe/Building.cpp 2007-06-17 09:08:25 UTC (rev 2076) @@ -38,43 +38,11 @@ }; const phoenix::function<store_building_type_impl> store_building_type_; - - // loads and stores BuildingTypes specified in [settings-dir]/buildings.txt - class BuildingTypeManager - { - public: - BuildingTypeManager() - { - std::string settings_dir = GetOptionsDB().Get<std::string>("settings-dir"); - if (!settings_dir.empty() && settings_dir[settings_dir.size() - 1] != '/') - settings_dir += '/'; - std::string filename = settings_dir + "buildings.txt"; - std::ifstream ifs(filename.c_str()); - std::string input; - std::getline(ifs, input, '\0'); - ifs.close(); - using namespace boost::spirit; - using namespace phoenix; - parse_info<const char*> result = - parse(input.c_str(), - as_lower_d[*building_type_p[store_building_type_(var(m_building_types), arg1)]], - skip_p); - if (!result.full) - ReportError(std::cerr, input.c_str(), result); - } - - const BuildingType* GetBuildingType(const std::string& name) const - { - std::map<std::string, BuildingType*>::const_iterator it = m_building_types.find(name); - return it != m_building_types.end() ? it->second : 0; - } - - private: - std::map<std::string, BuildingType*> m_building_types; - }; - } +///////////////////////////////////////////////// +// Building // +///////////////////////////////////////////////// Building::Building() : m_building_type(""), m_operating(true), @@ -266,12 +234,6 @@ std::copy(effects.begin(), effects.end(), m_effects.end()); } -const BuildingType* GetBuildingType(const std::string& name) -{ - static BuildingTypeManager manager; - return manager.GetBuildingType(name); -} - CaptureResult BuildingType::GetCaptureResult(int from_empire_id, int to_empire_id, int location_id, bool as_production_item) const { Empire* from_empire = Empires().Lookup(from_empire_id); if (!from_empire) @@ -293,3 +255,70 @@ Logger().debugStream() << "BuildingType::GetCaptureResult: returning CR_DESTROY"; return CR_DESTROY; } + +///////////////////////////////////////////////// +// BuildingTypeManager // +///////////////////////////////////////////////// +// static(s) +BuildingTypeManager* BuildingTypeManager::s_instance = 0; + +BuildingTypeManager::BuildingTypeManager() +{ + if (s_instance) + throw std::runtime_error("Attempted to create more than one TechManager."); + + s_instance = this; + + std::string settings_dir = GetOptionsDB().Get<std::string>("settings-dir"); + if (!settings_dir.empty() && settings_dir[settings_dir.size() - 1] != '/') + settings_dir += '/'; + std::string filename = settings_dir + "buildings.txt"; + std::ifstream ifs(filename.c_str()); + std::string input; + std::getline(ifs, input, '\0'); + ifs.close(); + using namespace boost::spirit; + using namespace phoenix; + parse_info<const char*> result = + parse(input.c_str(), + as_lower_d[*building_type_p[store_building_type_(var(m_building_types), arg1)]], + skip_p); + if (!result.full) + ReportError(std::cerr, input.c_str(), result); +} + +const BuildingType* BuildingTypeManager::GetBuildingType(const std::string& name) const +{ + std::map<std::string, BuildingType*>::const_iterator it = m_building_types.find(name); + return it != m_building_types.end() ? it->second : 0; +} + +BuildingTypeManager& BuildingTypeManager::GetBuildingTypeManager() +{ + static BuildingTypeManager manager; + return manager; +} + +BuildingTypeManager::iterator BuildingTypeManager::begin() const +{ + return m_building_types.begin(); +} + +BuildingTypeManager::iterator BuildingTypeManager::end() const +{ + return m_building_types.end(); +} + + +/////////////////////////////////////////////////////////// +// Free Functions // +/////////////////////////////////////////////////////////// +BuildingTypeManager& GetBuildingTypeManager() +{ + return BuildingTypeManager::GetBuildingTypeManager(); +} + +const BuildingType* GetBuildingType(const std::string& name) +{ + return GetBuildingTypeManager().GetBuildingType(name); +} Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/universe/Building.h 2007-06-17 09:08:25 UTC (rev 2076) @@ -111,6 +111,37 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Holds all FreeOrion building types. Techs may be looked up by name. */ +class BuildingTypeManager +{ +public: + typedef std::map<std::string, BuildingType*>::const_iterator iterator; + + /** \name Accessors */ //@{ + /** returns the building type with the name \a name; you should use the free function GetBuildingType() instead */ + const BuildingType* GetBuildingType(const std::string& name) const; + + /** iterator to the first tech */ + iterator begin() const; + + /** iterator to the last + 1th tech */ + iterator end() const; + + /** returns the instance of this singleton class; you should use the free function GetBuildingTypeManager() instead */ + static BuildingTypeManager& GetBuildingTypeManager(); + //@} + +private: + BuildingTypeManager(); + + std::map<std::string, BuildingType*> m_building_types; + + static BuildingTypeManager* s_instance; +}; + +/** returns the singleton building type manager */ +BuildingTypeManager& GetBuildingTypeManager(); + /** Returns the BuildingType specification object for a building of type \a name. If no such BuildingType exists, 0 is returned instead. */ const BuildingType* GetBuildingType(const std::string& name); Modified: trunk/FreeOrion/universe/Tech.cpp =================================================================== --- trunk/FreeOrion/universe/Tech.cpp 2007-06-12 06:41:43 UTC (rev 2075) +++ trunk/FreeOrion/universe/Tech.cpp 2007-06-17 09:08:25 UTC (rev 2076) @@ -88,7 +88,6 @@ } const phoenix::function<store_tech_impl> store_tech_; - } |
From: <geo...@us...> - 2007-06-23 13:41:11
|
Revision: 2081 http://svn.sourceforge.net/freeorion/revision/?rev=2081&view=rev Author: geoffthemedio Date: 2007-06-23 06:41:13 -0700 (Sat, 23 Jun 2007) Log Message: ----------- Updated a few headers to (hopefully) fix compile errors that MSVC wasn't producing but GCC (rightly) was (or is) Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/Empire/ResourcePool.h trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2007-06-22 22:53:05 UTC (rev 2080) +++ trunk/FreeOrion/Empire/Empire.h 2007-06-23 13:41:13 UTC (rev 2081) @@ -5,6 +5,7 @@ #include <GG/Clr.h> #include "../util/SitRepEntry.h" #include "../universe/Tech.h" +#include "../universe/UniverseObject.h" #include "ResourcePool.h" #include <deque> @@ -13,6 +14,7 @@ class BuildingType; class ShipDesign; +class Empire; struct ResearchQueue { Modified: trunk/FreeOrion/Empire/ResourcePool.h =================================================================== --- trunk/FreeOrion/Empire/ResourcePool.h 2007-06-22 22:53:05 UTC (rev 2080) +++ trunk/FreeOrion/Empire/ResourcePool.h 2007-06-23 13:41:13 UTC (rev 2081) @@ -3,9 +3,12 @@ #define _ResourcePool_h_ #include "../universe/Enums.h" -#include "../universe/Universe.h" -#include "../universe/UniverseObject.h" +#include <boost/signal.hpp> +#include <boost/serialization/nvp.hpp> + +#include <vector> + class ResourceCenter; class PopCenter; Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2007-06-22 22:53:05 UTC (rev 2080) +++ trunk/FreeOrion/universe/Universe.h 2007-06-23 13:41:13 UTC (rev 2081) @@ -10,13 +10,11 @@ #include <boost/signal.hpp> #endif -#ifndef _Enums_h_ #include "Enums.h" -#endif - -#ifndef _Predicates_h_ #include "Predicates.h" -#endif +#include "Ship.h" +#include "../Empire/EmpireManager.h" +#include "../Empire/Empire.h" #if defined(_MSC_VER) // HACK! this keeps VC 7.x from barfing when it sees "typedef __int64 int64_t;" |
From: <geo...@us...> - 2007-07-02 21:30:30
|
Revision: 2112 http://svn.sourceforge.net/freeorion/revision/?rev=2112&view=rev Author: geoffthemedio Date: 2007-07-02 14:30:32 -0700 (Mon, 02 Jul 2007) Log Message: ----------- -Updated MSVC project files to point to where I have Python 2.4 installed, since the Python libs and headers aren't in the SDK directory as I had previously assumed. Anyone building FO with the project files on will need to set these directories in the project properties to where they have Python installed -Made some incomplete changes towards having clicks of BuildingTypes in SitRep entries show the clicked BuildingType in the ProductionWnd, similar to how clicking techs in the SitRep displayes the tech on the ResearchWnd Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/SitRepPanel.cpp trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/UI/ClientUI.cpp 2007-07-02 21:30:32 UTC (rev 2112) @@ -424,7 +424,7 @@ #ifndef FREEORION_BUILD_UTIL if (!GetBuildingType(building_type_name)) return false; - // TODO + m_map_wnd->ShowBuildingType(building_type_name); return true; #else return false; Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-07-02 21:30:32 UTC (rev 2112) @@ -876,6 +876,13 @@ m_research_wnd->CenterOnTech(tech_name); } +void MapWnd::ShowBuildingType(const std::string& building_type_name) +{ + //if (!m_production_wnd->Visible()) + // ToggleProduction(); + //m_production_wnd->building_type_name); +} + void MapWnd::CenterOnSystem(System* system) { CenterOnMapCoord(system->X(), system->Y()); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/UI/MapWnd.h 2007-07-02 21:30:32 UTC (rev 2112) @@ -93,7 +93,8 @@ void CenterOnFleet(int fleetID); //!< centers the map on fleet \a fleetID void CenterOnSystem(System* system); //!< centers the map on system \a system void CenterOnFleet(Fleet* fleet); //!< centers the map on fleet \a fleet - void ShowTech(const std::string& tech_name);//!< brings up the research screen and centers the tech tree on \a tech_name + void ShowTech(const std::string& tech_name); //!< brings up the research screen and centers the tech tree on \a tech_name + void ShowBuildingType(const std::string& building_type_name); //!< brings up the production screen and displays info about the buildtype \a type_name void SelectSystem(int systemID); //!< catches emitted signals from the system icons, and allows programmatic selection of planets void SelectFleet(int fleetID); //!< allows programmatic selection of fleets void SelectFleet(Fleet* fleet); //!< allows programmatic selection of fleets Modified: trunk/FreeOrion/UI/SitRepPanel.cpp =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.cpp 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/UI/SitRepPanel.cpp 2007-07-02 21:30:32 UTC (rev 2112) @@ -83,6 +83,7 @@ GG::Connect(link_text->FleetLinkSignal, &ClientUI::ZoomToFleet, ClientUI::GetClientUI()); GG::Connect(link_text->ShipLinkSignal, &ClientUI::ZoomToShip, ClientUI::GetClientUI()); GG::Connect(link_text->TechLinkSignal, &ClientUI::ZoomToTech, ClientUI::GetClientUI()); + GG::Connect(link_text->BuildingLinkSignal, &ClientUI::ZoomToBuildingType, ClientUI::GetClientUI()); GG::Connect(link_text->EncyclopediaLinkSignal, &ClientUI::ZoomToEncyclopediaEntry, ClientUI::GetClientUI()); row->push_back(link_text); m_sitreps_lb->Insert(row); Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2007-07-02 21:30:32 UTC (rev 2112) @@ -42,7 +42,7 @@ <Tool Name="VCCLCompilerTool" Optimization="2" - AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1"" + AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1";"C:\Program Files\Python 2.4\include"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;FREEORION_BUILD_HUMAN;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE" RuntimeLibrary="2" DisableLanguageExtensions="false" @@ -69,7 +69,7 @@ AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib log4cpp.lib freetype214MT.lib cdt.lib circogen.lib common.lib dotgen.lib fdpgen.lib gd.lib graph.lib gvc.lib libexpat.lib neatogen.lib pack.lib pathplan.lib plugin.lib twopigen.lib png.lib jpeg.lib OpenAL32.lib alut.lib libvorbisfile.lib" OutputFile="../../../freeorion.exe" LinkIncremental="1" - AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/" + AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/;"C:\Program Files\Python 2.4\libs"" GenerateManifest="true" IgnoreDefaultLibraryNames="LIBCMT" GenerateDebugInformation="true" Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2007-07-02 21:30:32 UTC (rev 2112) @@ -39,7 +39,7 @@ /> <Tool Name="VCCLCompilerTool" - AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1"" + AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1";"C:\Program Files\Python 2.4\include"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;FREEORION_BUILD_AI;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE" RuntimeLibrary="2" DisableLanguageExtensions="false" @@ -65,7 +65,7 @@ AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib log4cpp.lib freetype214MT.lib cdt.lib common.lib dotgen.lib gd.lib graph.lib pathplan.lib libexpat.lib png.lib jpeg.lib python24.lib boost_python-vc80-mt-1_33_1.lib" OutputFile="../../../freeorionca.exe" LinkIncremental="1" - AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/" + AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/;"C:\Program Files\Python 2.4\libs"" GenerateManifest="true" GenerateDebugInformation="false" SubSystem="2" Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2007-07-02 08:30:02 UTC (rev 2111) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2007-07-02 21:30:32 UTC (rev 2112) @@ -40,7 +40,7 @@ /> <Tool Name="VCCLCompilerTool" - AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1"" + AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_33_1";"C:\Program Files\Python 2.4\include"" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;FREEORION_BUILD_SERVER;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE" RuntimeLibrary="2" DisableLanguageExtensions="false" @@ -66,7 +66,7 @@ AdditionalDependencies="GiGiNet.lib GiGiSDL.lib GiGi.lib opengl32.lib glu32.lib wsock32.lib zdll.lib SDL.lib SDLmain.lib log4cpp.lib freetype214MT.lib cdt.lib common.lib dotgen.lib gd.lib graph.lib pathplan.lib libexpat.lib png.lib jpeg.lib" OutputFile="../../../freeoriond.exe" LinkIncremental="1" - AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/" + AdditionalLibraryDirectories="../../../../lib/;../../../../Boost/lib/;"C:\Program Files\Python 2.4\libs"" GenerateManifest="true" GenerateDebugInformation="true" SubSystem="2" |
From: <geo...@us...> - 2007-07-15 16:23:40
|
Revision: 2161 http://svn.sourceforge.net/freeorion/revision/?rev=2161&view=rev Author: geoffthemedio Date: 2007-07-15 09:23:41 -0700 (Sun, 15 Jul 2007) Log Message: ----------- -Removed comments recently added, one of which was causing compile problems on Linux. -Tweaked layout of test tooltip for effects accounting Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/universe/PopCenter.cpp trunk/FreeOrion/universe/PopCenter.h Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-07-15 05:41:31 UTC (rev 2160) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-07-15 16:23:41 UTC (rev 2161) @@ -745,13 +745,15 @@ meter_it = meter_map->find(METER_INDUSTRY); if (meter_it != meter_map->end()) { const std::vector<Universe::EffectAccountingInfo>& info_vec = meter_it->second; - text = ""; + const Meter* meter = obj->GetMeter(meter_it->first); // METER_INDUSTRY in this case + text = "Meter Max: " + lexical_cast<std::string>(meter->Max()) + "\n\nEffects:"; for (std::vector<Universe::EffectAccountingInfo>::const_iterator info_it = info_vec.begin(); info_it != info_vec.end(); ++info_it) { - if (info_it != info_vec.begin()) text += "\n"; - text += "change: " + lexical_cast<std::string>(info_it->meter_change) - + " total: " + lexical_cast<std::string>(info_it->running_meter_total) - + " source: " + lexical_cast<std::string>(info_it->source_id) - + " type: " + lexical_cast<std::string>(info_it->cause_type); + const UniverseObject* source = universe.Object(info_it->source_id); + + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " type: " + lexical_cast<std::string>(info_it->cause_type); + if (source) + text += " source: " + source->Name(); } m_industry_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); m_industry_meter_bar->SetBrowseText(text); @@ -934,12 +936,12 @@ void MeterStatusBar2::SetProjectedCurrent(double current) { - //assert(Meter::METER_MIN <= current && current <= Meter::METER_MAX); + assert(Meter::METER_MIN <= current && current <= Meter::METER_MAX); m_projected_current = current; } void MeterStatusBar2::SetProjectedMax(double max) { - //assert(Meter::METER_MIN <= max && max <= Meter::METER_MAX); + assert(Meter::METER_MIN <= max && max <= Meter::METER_MAX); m_projected_max = max; } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-07-15 05:41:31 UTC (rev 2160) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-07-15 16:23:41 UTC (rev 2161) @@ -656,6 +656,10 @@ EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { + const PopCenter* pop = dynamic_cast<const PopCenter*>(it->second); + if (pop) Logger().debugStream() << "id: " << it->second->ID() << " max pop: " << pop->MaxPop() << " initial max pop: " << pop->PopulationMeter().InitialMax(); + } // update effect accounting and meter estimates universe.InitMeterEstimatesAndDiscrepancies(); Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2007-07-15 05:41:31 UTC (rev 2160) +++ trunk/FreeOrion/universe/PopCenter.cpp 2007-07-15 16:23:41 UTC (rev 2161) @@ -104,9 +104,6 @@ double PopCenter::FuturePopGrowth() const { - Logger().debugStream() << "PopCenter::FuturePopGrowth(): id: " << dynamic_cast<const UniverseObject* const>(this)->ID(); - Logger().debugStream() << "FuturePopGrowthMax(): " << FuturePopGrowthMax(); - Logger().debugStream() << "std::min(AvailableFood(), m_pop.Max()) - m_pop.Current(): " << std::min(AvailableFood(), m_pop.Max()) - m_pop.Current(); return std::max(-m_pop.Current(), std::min(FuturePopGrowthMax(), std::min(AvailableFood(), m_pop.Max()) - m_pop.Current())); } @@ -114,16 +111,10 @@ { Logger().debugStream() << "PopCenter::FuturePopGrowthMax(): id: " << dynamic_cast<const UniverseObject* const>(this)->ID(); if (20.0 < m_health.Current()) { - Logger().debugStream() << "health " << m_health.Current() <<" > 20"; - Logger().debugStream() << "m_pop.Max(): " << m_pop.Max(); - Logger().debugStream() << "m_pop.Current(): " << m_pop.Current(); return std::min(m_pop.Max() - m_pop.Current(), m_pop.Current() * (((m_pop.Max() + 1.0) - m_pop.Current()) / (m_pop.Max() + 1.0)) * (m_health.Current() - 20.0) * 0.01); } else if (m_health.Current() == 20.0) { return 0.0; } else { // m_health.Current() < 20.0 - Logger().debugStream() << "health " << m_health.Current() << " < 20"; - Logger().debugStream() << "m_pop.Max(): " << m_pop.Max(); - Logger().debugStream() << "m_pop.Current(): " << m_pop.Current(); return std::max(-m_pop.Current(), -m_pop.Current()*( exp( (m_health.Current()-20)*(m_health.Current()-20) / (400/log(2.0)) ) - 1 )); } } Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2007-07-15 05:41:31 UTC (rev 2160) +++ trunk/FreeOrion/universe/PopCenter.h 2007-07-15 16:23:41 UTC (rev 2161) @@ -101,7 +101,6 @@ & BOOST_SERIALIZATION_NVP(m_growth) & BOOST_SERIALIZATION_NVP(m_race) & BOOST_SERIALIZATION_NVP(m_available_food); - Logger().debugStream() << "PopCenter::serialize: m_pop.InitialMax(): " << m_pop.InitialMax(); } #endif // _PopCenter_h_ |
From: <geo...@us...> - 2007-07-16 02:16:48
|
Revision: 2170 http://svn.sourceforge.net/freeorion/revision/?rev=2170&view=rev Author: geoffthemedio Date: 2007-07-15 19:16:50 -0700 (Sun, 15 Jul 2007) Log Message: ----------- -More effects accounting and tooltips stuff. Semi-working now, though building effects don't seem to be accounted for properly, and empire of origin for techs is always unknown, even when it should be known. -Also improved explanatory commenting in Universe.h Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-07-16 01:01:42 UTC (rev 2169) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-07-16 02:16:50 UTC (rev 2170) @@ -24,6 +24,84 @@ using boost::lexical_cast; +// Free Function +std::string EffectAccountingToolTip(MeterType meter_type, const UniverseObject* obj, + const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >& meter_map) +{ + std::string text = ""; + + const Meter* meter = obj->GetMeter(meter_type); + if (!meter) return text; + + // determine if meter_map contains info about the specified meter + std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >::const_iterator meter_it = meter_map.find(meter_type); + if (meter_it == meter_map.end() || meter_it->second.empty()) { + // no info about specified meter -> no tooltip + text = "Meter Max: " + lexical_cast<std::string>(meter->Max()); + return text; + } + + text = "Meter Max: " + lexical_cast<std::string>(meter->Max()) + "\n\nAccounting:"; + + // append lines to tooltip for each alteration to the meter + const std::vector<Universe::EffectAccountingInfo>& info_vec = meter_it->second; + for (std::vector<Universe::EffectAccountingInfo>::const_iterator info_it = info_vec.begin(); info_it != info_vec.end(); ++info_it) { + const UniverseObject* source = GetUniverse().Object(info_it->source_id); + + int empire_id = info_it->caused_by_empire_id; + const Empire* empire = 0; + const Building* building = 0; + const Planet* planet = 0; + + switch (info_it->cause_type) { + case ECT_UNIVERSE_TABLE_ADJUSTMENT: + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " from Basic Focus and Universe Adjustments"; + break; + + case ECT_TECH: + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " due to: " + UserString(info_it->specific_cause) + " [Tech]"; + + if (empire_id != -1) { + empire = EmpireManager().Lookup(empire_id); + if (empire) { + text += " of empire: " + empire->Name() + " with id: " + boost::lexical_cast<std::string>(empire_id); + break; + } + } + // else... + text += " of unknown empire"; // I think this should never come up, as if it's known the effect is due to a tech, the source empire should also be known + break; + + case ECT_BUILDING: + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " due to: " + UserString(info_it->specific_cause) + " [Building]"; + + building = dynamic_cast<const Building*>(source); + if (!building) break; + planet = building->GetPlanet(); + if (!planet) break; + + text += " at: " + planet->Name(); + break; + + case ECT_SPECIAL: + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " due to: " + UserString(info_it->specific_cause) + " [Special]"; + break; + + case ECT_UNKNOWN_CAUSE: + default: + if (info_it->meter_change != 0.0) { + text += "\n" + lexical_cast<std::string>(info_it->meter_change) + + " [Cause Unknown]"; + } + } + } + return text; +} + ///////////////////////////////////// // PopulationPanel // ///////////////////////////////////// @@ -726,7 +804,6 @@ const Universe::EffectAccountingMap& effect_accounting_map = universe.GetEffectAccountingMap(); const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >* meter_map = 0; - std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >::const_iterator meter_it; Universe::EffectAccountingMap::const_iterator map_it = effect_accounting_map.find(m_rescenter_id); if (map_it != effect_accounting_map.end()) meter_map = &(map_it->second); @@ -735,39 +812,45 @@ // meter bar display m_farming_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_FARMING)); m_farming_meter_bar->SetProjectedMax(res->FarmingMeter().Max()); - + if (meter_map) { + m_farming_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_farming_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_FARMING, obj, *meter_map)); + } + m_mining_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_MINING)); m_mining_meter_bar->SetProjectedMax(res->MiningMeter().Max()); + if (meter_map) { + m_mining_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_mining_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_MINING, obj, *meter_map)); + } m_industry_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_INDUSTRY)); m_industry_meter_bar->SetProjectedMax(res->IndustryMeter().Max()); if (meter_map) { - meter_it = meter_map->find(METER_INDUSTRY); - if (meter_it != meter_map->end()) { - const std::vector<Universe::EffectAccountingInfo>& info_vec = meter_it->second; - const Meter* meter = obj->GetMeter(meter_it->first); // METER_INDUSTRY in this case - text = "Meter Max: " + lexical_cast<std::string>(meter->Max()) + "\n\nEffects:"; - for (std::vector<Universe::EffectAccountingInfo>::const_iterator info_it = info_vec.begin(); info_it != info_vec.end(); ++info_it) { - const UniverseObject* source = universe.Object(info_it->source_id); - - text += "\n" + lexical_cast<std::string>(info_it->meter_change) - + " type: " + lexical_cast<std::string>(info_it->cause_type); - if (source) - text += " source: " + source->Name(); - } - m_industry_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - m_industry_meter_bar->SetBrowseText(text); - } + m_industry_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_industry_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_INDUSTRY, obj, *meter_map)); } m_research_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_RESEARCH)); m_research_meter_bar->SetProjectedMax(res->ResearchMeter().Max()); - + if (meter_map) { + m_research_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_research_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_RESEARCH, obj, *meter_map)); + } + m_trade_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_TRADE)); m_trade_meter_bar->SetProjectedMax(res->TradeMeter().Max()); + if (meter_map) { + m_trade_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_trade_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_TRADE, obj, *meter_map)); + } m_construction_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_CONSTRUCTION)); m_construction_meter_bar->SetProjectedMax(res->ConstructionMeter().Max()); + if (meter_map) { + m_construction_meter_bar->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_construction_meter_bar->SetBrowseText(EffectAccountingToolTip(METER_CONSTRUCTION, obj, *meter_map)); + } switch (res->PrimaryFocus()) { Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2007-07-16 01:01:42 UTC (rev 2169) +++ trunk/FreeOrion/UI/InfoPanels.h 2007-07-16 02:16:50 UTC (rev 2170) @@ -61,15 +61,15 @@ PopCenter* GetPopCenter(); ///< returns the planet with ID m_planet_id const PopCenter* GetPopCenter() const; - int m_popcenter_id; ///< object id for the UniverseObject that is also a PopCenter which is being displayed in this panel + int m_popcenter_id; ///< object id for the UniverseObject that is also a PopCenter which is being displayed in this panel - StatisticIcon* m_pop_stat; ///< icon and number of population - StatisticIcon* m_health_stat; ///< icon and number of health + StatisticIcon* m_pop_stat; ///< icon and number of population + StatisticIcon* m_health_stat; ///< icon and number of health - MeterStatusBar2* m_pop_meter_bar; ///< graphically indicates status of population - MeterStatusBar2* m_health_meter_bar; ///< graphically indicates health + MeterStatusBar2* m_pop_meter_bar; ///< graphically indicates status of population + MeterStatusBar2* m_health_meter_bar; ///< graphically indicates health - GG::Button* m_expand_button; ///< at top right of panel, toggles the panel open/closed to show details or minimal summary + GG::Button* m_expand_button; ///< at top right of panel, toggles the panel open/closed to show details or minimal summary std::set<boost::signals::connection> m_misc_connections; @@ -94,13 +94,13 @@ //@} /** \name Mutators */ //@{ - void ExpandCollapse(bool expanded); ///< expands or collapses panel to show details or just summary info + void ExpandCollapse(bool expanded); ///< expands or collapses panel to show details or just summary info virtual void Render(); virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) - void Update(); ///< updates indicators with values of associated object. Does not do layout and resizing. - void Refresh(); ///< updates, redoes layout, resizes indicator + void Update(); ///< updates indicators with values of associated object. Does not do layout and resizing. + void Refresh(); ///< updates, redoes layout, resizes indicator mutable ExpandCollapseSignalType ExpandCollapseSignal; mutable FocusChangedSignalType PrimaryFocusChangedSignal; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2007-07-16 01:01:42 UTC (rev 2169) +++ trunk/FreeOrion/universe/Universe.cpp 2007-07-16 02:16:50 UTC (rev 2170) @@ -617,13 +617,13 @@ UniverseObject* obj = obj_it->second; int object_id = obj_it->first; - // Reset meters to METER_MIN + // Reset max meters to METER_MIN obj->ResetMaxMeters(); // Apply non-effect focus mods from tables obj->ApplyUniverseTableMaxMeterAdjustments(); - // record value of meters after applying universe table adjustments + // record value of max meters after applying universe table adjustments for (MeterType type = MeterType(0); type != NUM_METER_TYPES; type = MeterType(type + 1)) { Meter* meter = obj->GetMeter(type); if (meter) { @@ -639,15 +639,18 @@ m_effect_accounting_map[object_id][type].push_back(info); } } + + // reset current meters to value at star of turn (before growth or effects changes) } // cache all activation and scoping condition results before applying Effects, since the application of // these Effects may affect the activation and scoping evaluations EffectsAndTargetsMap effects_targets_map; - GetEffectsAndTargets(effects_targets_map); + EffectsAndCausesMap effects_causes_map; + GetEffectsAndTargets(effects_targets_map, &effects_causes_map); // Apply and record effect meter adjustments - ExecuteMeterEffects(effects_targets_map, true); + ExecuteMeterEffects(effects_targets_map, &effects_causes_map); // Apply known discrepancies between expected and calculated meter maxes at start of turn. This // accounts for the unknown effects on the meter, and brings the estimate in line with the actual @@ -666,6 +669,9 @@ for(std::map<MeterType, double>::iterator meter_it = meter_map.begin(); meter_it != meter_map.end(); ++meter_it) { MeterType type = meter_it->first; double discrepancy = meter_it->second; + + //if (discrepancy == 0.0) continue; + Meter* meter = obj->GetMeter(type); if (meter) { @@ -685,12 +691,16 @@ } /////////////////////////// - // do current meter growth + // do current meter growth ? /////////////////////////// } -void Universe::GetEffectsAndTargets(EffectsAndTargetsMap& effects_targets_map) +void Universe::GetEffectsAndTargets(EffectsAndTargetsMap& effects_targets_map, EffectsAndCausesMap* effects_causes_map) { + effects_targets_map.clear(); + if (effects_causes_map) + effects_causes_map->clear(); + // get effects groups from specials for (Universe::const_iterator it = begin(); it != end(); ++it) { for (std::set<std::string>::const_iterator special_it = it->second->Specials().begin(); @@ -703,6 +713,8 @@ EffectsAndTargetsMapElem map_elem(effect, std::make_pair(it->first, Effect::EffectsGroup::TargetSet())); special->Effects()[i]->GetTargetSet(it->first, map_elem.second.second); effects_targets_map.insert(map_elem); + if (effects_causes_map) + effects_causes_map->insert(EffectsAndCausesMapElem(effect, std::make_pair(it->first, std::make_pair(ECT_SPECIAL, special->Name())))); } } } @@ -717,6 +729,8 @@ EffectsAndTargetsMapElem map_elem(effect, std::make_pair(it->second->CapitolID(), Effect::EffectsGroup::TargetSet())); tech->Effects()[i]->GetTargetSet(it->second->CapitolID(), map_elem.second.second); effects_targets_map.insert(map_elem); + if (effects_causes_map) + effects_causes_map->insert(EffectsAndCausesMapElem(effect, std::make_pair(it->second->CapitolID(), std::make_pair(ECT_TECH, tech->Name())))); } } } @@ -731,6 +745,8 @@ EffectsAndTargetsMapElem map_elem(effect, std::make_pair(buildings[i]->ID(), Effect::EffectsGroup::TargetSet())); building_type->Effects()[j]->GetTargetSet(buildings[i]->ID(), map_elem.second.second); effects_targets_map.insert(map_elem); + if (effects_causes_map) + effects_causes_map->insert(EffectsAndCausesMapElem(effect, std::make_pair(buildings[i]->ID(), std::make_pair(ECT_BUILDING, building_type->Name())))); } } } @@ -766,30 +782,45 @@ } } -void Universe::ExecuteMeterEffects(EffectsAndTargetsMap& effects_targets_map, bool do_effect_accounting) +void Universe::ExecuteMeterEffects(EffectsAndTargetsMap& effects_targets_map, EffectsAndCausesMap* effects_causes_map) { + if (effects_causes_map) + assert(effects_targets_map.size() == effects_causes_map->size()); + std::map<std::string, Effect::EffectsGroup::TargetSet> executed_nonstacking_effects; - for (EffectsAndTargetsMap::const_iterator it = effects_targets_map.begin(); it != effects_targets_map.end(); ++it) { + EffectsAndCausesMap::const_iterator causes_it; + if (effects_causes_map) + causes_it = effects_causes_map->begin(); + + for (EffectsAndTargetsMap::const_iterator targets_it = effects_targets_map.begin(); targets_it != effects_targets_map.end(); ++targets_it) { // if other EffectsGroups with the same stacking group have affected some of the targets in the scope of the current EffectsGroup, skip them - std::map<std::string, std::set<UniverseObject*> >::iterator non_stacking_it = executed_nonstacking_effects.find(it->first->StackingGroup()); - Effect::EffectsGroup::TargetSet targets(it->second.second); + std::map<std::string, std::set<UniverseObject*> >::iterator non_stacking_it = executed_nonstacking_effects.find(targets_it->first->StackingGroup()); + Effect::EffectsGroup::TargetSet targets(targets_it->second.second); if (non_stacking_it != executed_nonstacking_effects.end()) { for (Effect::EffectsGroup::TargetSet::const_iterator object_it = non_stacking_it->second.begin(); object_it != non_stacking_it->second.end(); ++object_it) { targets.erase(*object_it); } } + // if doing effect accounting, get cause of effect + EffectsCauseType cause_type = INVALID_EFFECTS_GROUP_CAUSE_TYPE; + std::string specific_cause = ""; + if (effects_causes_map) { + cause_type = causes_it->second.second.first; // see definition of Universe::EffectsAndCausesMapElem + specific_cause = causes_it->second.second.second; + } + // execute only the SetMeter effects in the EffectsGroup - boost::shared_ptr<const Effect::EffectsGroup> effects_group = it->first; - int source = it->second.first; + boost::shared_ptr<const Effect::EffectsGroup> effects_group = targets_it->first; + int source = targets_it->second.first; const std::vector<Effect::EffectBase*>& effects = effects_group->EffectsList(); for (unsigned int i = 0; i < effects.size(); ++i) { const Effect::SetMeter* meter_effect = dynamic_cast<Effect::SetMeter*>(effects[i]); if (!meter_effect) continue; - if (do_effect_accounting) { - + // do effect accounting + if (effects_causes_map) { // determine meter to be altered by this effect MeterType meter_type = meter_effect->GetMeterType(); @@ -829,7 +860,8 @@ // update accounting info with meter change and new total info.meter_change = meter->Max() - info.running_meter_total; // change is new max minus old max (stored in temp value with misleading name) info.running_meter_total = meter->Max(); // replacing temp stored value with new meter total - info.cause_type = ECT_SPECIAL; // need to get this somehow ... + info.cause_type = cause_type; + info.specific_cause = specific_cause; } } else { @@ -839,12 +871,15 @@ } // if this EffectsGroup belongs to a stacking group, add the objects just affected by it to executed_nonstacking_effects - if (it->first->StackingGroup() != "") { - Effect::EffectsGroup::TargetSet& affected_targets = executed_nonstacking_effects[it->first->StackingGroup()]; + if (targets_it->first->StackingGroup() != "") { + Effect::EffectsGroup::TargetSet& affected_targets = executed_nonstacking_effects[targets_it->first->StackingGroup()]; for (Effect::EffectsGroup::TargetSet::const_iterator object_it = targets.begin(); object_it != targets.end(); ++object_it) { affected_targets.insert(*object_it); } } + + if (effects_causes_map) + ++causes_it; } } Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2007-07-16 01:01:42 UTC (rev 2169) +++ trunk/FreeOrion/universe/Universe.h 2007-07-16 02:16:50 UTC (rev 2170) @@ -98,7 +98,6 @@ double running_meter_total; }; typedef std::map<int, std::map<MeterType, std::vector<EffectAccountingInfo> > > EffectAccountingMap; //!< Effect accounting info for all meters - typedef std::map<int, std::map<MeterType, double> > EffectDiscrepancyMap; //!< Discrepancy between meter's value at start of turn, and the value that this client calculate that the meter should have with the knowledge available -> the unknown factor affecting the meter /** \name Signal Types */ //@{ @@ -194,10 +193,6 @@ in order effects were applied to the meter. */ const EffectAccountingMap& GetEffectAccountingMap() const {return m_effect_accounting_map;} - /** returns map, indexed by object id, to map, indexed by MeterType, to the discrepancy between the actual and the - explainable value that the meter had at the start of the turn */ - const EffectDiscrepancyMap& GetEffectDiscrepancyMap() const {return m_effect_discrepancy_map;} - mutable UniverseObjectDeleteSignalType UniverseObjectDeleteSignal; ///< the state changed signal object for this UniverseObject //@} @@ -300,14 +295,37 @@ typedef boost::property_map<SystemGraph, boost::edge_weight_t>::type EdgeWeightPropertyMap; // effects processing stuff + /** Multimap from effects group to pairs (one per effect in the effects group), consisting of source object + ID and the set of targets to which the effects should be applied. EffectsGroup does not contain any info + about its source object, so it needs to be stored here. */ typedef std::pair<boost::shared_ptr<const Effect::EffectsGroup>, std::pair<int, Effect::EffectsGroup::TargetSet> > EffectsAndTargetsMapElem; typedef std::multimap<boost::shared_ptr<const Effect::EffectsGroup>, std::pair<int, Effect::EffectsGroup::TargetSet> > EffectsAndTargetsMap; + + /** Discrepancy between meter's value at start of turn, and the value that this client calculate that the + meter should have with the knowledge available -> the unknown factor affecting the meter. */ + typedef std::map<int, std::map<MeterType, double> > EffectDiscrepancyMap; - void GetEffectsAndTargets(EffectsAndTargetsMap& effects_targets_map); // populates \a effects_targets_map with all EffectsGroups and their targets in the known universe - void ExecuteEffects(EffectsAndTargetsMap& effects_targets_map); // executes all effects - void ExecuteMeterEffects(EffectsAndTargetsMap& effects_targets_map, bool do_effect_accounting = false); // executes meter-altering effects; ignores other effects. If \a do_effect_acounting == true, records effect details in m_effect_accounting_map + /** Multimap from effects group to pairs (one per effect in the effects group), consistent of source object + ID and another pair, consisting of the type of cause for the effect (eg. special, building, tech) and the + name of the specific cause. Specific cause is the name of the tech, building type or special that contains + the effects group. The causes should be stored in the same order as the targets in a simultaneously built + EffectsAndTargetsMap, allowing a particular effects group's targets and cause info to be looked up together. */ + typedef std::pair<boost::shared_ptr<const Effect::EffectsGroup>, std::pair<int, std::pair<EffectsCauseType, std::string> > > EffectsAndCausesMapElem; + typedef std::multimap<boost::shared_ptr<const Effect::EffectsGroup>, std::pair<int, std::pair<EffectsCauseType, std::string> > > EffectsAndCausesMap; + /** Populates \a effects_targets_map with all EffectsGroups and their targets in the known universe. If + \a effects_causes_map is provided (nonzero pointer) then this map will be simultaneously populated with + information about the causes of each effects group. */ + void GetEffectsAndTargets(EffectsAndTargetsMap& effects_targets_map, EffectsAndCausesMap* effects_causes_map = 0); + + void ExecuteEffects(EffectsAndTargetsMap& effects_targets_map); ///< executes all effects + /** Executes only meter-altering effects; ignores other effects. If \a effects_causes_map is provided + (nonzero pointer) then its contents will be used to records effect details in m_effect_accounting_map; + if it is not provided, then no effect accounting is done. */ + void ExecuteMeterEffects(EffectsAndTargetsMap& effects_targets_map, EffectsAndCausesMap* effects_causes_map = 0); + + void GenerateIrregularGalaxy(int stars, Age age, AdjacencyGrid& adjacency_grid); ///< creates an irregular galaxy and stores the empire homeworlds in the homeworlds vector void PopulateSystems(PlanetDensity density, SpecialsFrequency specials_freq); ///< Will generate planets for all systems that have empty object maps (ie those that aren't homeworld systems) |
From: <tz...@us...> - 2007-07-21 06:22:38
|
Revision: 2190 http://svn.sourceforge.net/freeorion/revision/?rev=2190&view=rev Author: tzlaine Date: 2007-07-20 23:22:40 -0700 (Fri, 20 Jul 2007) Log Message: ----------- Added support for randomly-generated ship names. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/util/MultiplayerCommon.cpp trunk/FreeOrion/util/MultiplayerCommon.h Added Paths: ----------- trunk/FreeOrion/default/shipnames.txt Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/Empire/Empire.cpp 2007-07-21 06:22:40 UTC (rev 2190) @@ -3,7 +3,9 @@ #include "../universe/Building.h" #include "../universe/Fleet.h" #include "../universe/Ship.h" +#include "../util/Directories.h" #include "../util/MultiplayerCommon.h" +#include "../util/Random.h" #include "../universe/Predicates.h" #include "../universe/Planet.h" #include "ResourcePool.h" @@ -17,6 +19,7 @@ #include <algorithm> +#include <boost/filesystem/fstream.hpp> #include <boost/lexical_cast.hpp> @@ -115,6 +118,18 @@ return a > b; } }; + + void LoadShipNames(std::vector<std::string>& names) + { + boost::filesystem::ifstream ifs(GetSettingsDir() / "shipnames.txt"); + while (ifs) { + std::string latest_name; + std::getline(ifs, latest_name); + if (latest_name != "") { + names.push_back(latest_name.substr(0, latest_name.find_last_not_of(" \t") + 1)); // strip off trailing whitespace + } + } + } } @@ -1186,6 +1201,20 @@ m_explored_systems.insert(ID); } +std::string Empire::NewShipName() +{ + std::string retval; + static std::vector<std::string> ship_names; + if (ship_names.empty()) + LoadShipNames(ship_names); + int star_name_idx = RandSmallInt(0, static_cast<int>(ship_names.size()) - 1); + retval = ship_names[star_name_idx]; + int times_name_used = ++m_ship_names_used[retval]; + if (1 < times_name_used) + retval += " " + RomanNumber(times_name_used); + return retval; +} + void Empire::AddShipDesign(int ship_design_id) { /* Check if design id is valid. that is, check that it corresponds to an existing shipdesign in the @@ -1345,12 +1374,16 @@ Logger().debugStream() << "New Fleet created on turn: " << fleet->CreationTurn(); // add ship - const ShipDesign* ship_design = GetShipDesign(m_production_queue[i].item.design_id); Ship *ship = new Ship(m_id, m_production_queue[i].item.design_id); int ship_id = universe.Insert(ship); +#if 0 + const ShipDesign* ship_design = GetShipDesign(m_production_queue[i].item.design_id); std::string ship_name(ship_design->name); ship_name += boost::lexical_cast<std::string>(ship_id); ship->Rename(ship_name); +#else + ship->Rename(NewShipName()); +#endif fleet->AddShip(ship_id); Logger().debugStream() << "New Ship created on turn: " << ship->CreationTurn(); Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/Empire/Empire.h 2007-07-21 06:22:40 UTC (rev 2190) @@ -433,6 +433,9 @@ /// inserts given ShipDesign into the Universe, adds the design's id to the Empire's set of ids, and returns the new design's id, which is UniverseObject::INVALID_OBJECT_ID on failure. If successful, universe takes ownership of passed ShipDesign. int AddShipDesign(ShipDesign* ship_design); + /// generates a random ship name, appending II, III, etc., to it if it has been used before by this empire + std::string NewShipName(); + /** Inserts the a pointer to given SitRep entry into the empire's sitrep list. * \warning When you call this method, you are transferring ownership * of the entry object to the Empire. @@ -608,6 +611,8 @@ */ double m_maintenance_total_cost; + std::map<std::string, int> m_ship_names_used; // map from name to number of times used + friend class boost::serialization::access; Empire(); template <class Archive> @@ -695,7 +700,8 @@ & BOOST_SERIALIZATION_NVP(m_trade_resource_pool) & BOOST_SERIALIZATION_NVP(m_population_pool) & BOOST_SERIALIZATION_NVP(m_food_total_distributed) - & BOOST_SERIALIZATION_NVP(m_maintenance_total_cost); + & BOOST_SERIALIZATION_NVP(m_maintenance_total_cost) + & BOOST_SERIALIZATION_NVP(m_ship_names_used); } } Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/default/eng_stringtable.txt 2007-07-21 06:22:40 UTC (rev 2190) @@ -1424,7 +1424,7 @@ %planet% has completed a defense base. SITREP_SHIP_BUILT -A new %ship% has been produced in the %system% system. +The %ship%, a new ship, has been produced in the %system% system. SITREP_BUILDING_BUILT %building% has been produced on %planet%. Added: trunk/FreeOrion/default/shipnames.txt =================================================================== --- trunk/FreeOrion/default/shipnames.txt (rev 0) +++ trunk/FreeOrion/default/shipnames.txt 2007-07-21 06:22:40 UTC (rev 2190) @@ -0,0 +1,1732 @@ +Aardvark +Aardwolf +Agouti +Alpaca +Ape +Armadillo +Aye-Aye +Babirusa +Baboon +Badger +Bandicoot +Bat +Bear +Beaver +Boar +Bobcat +Bonobo +Camel +Capuchin +Caracal +Cat +Chevrotain +Chimpanzee +Chinchilla +Civet +Coati +Colobus +Cottontail +Coyote +Deer +Dhole +Dingo +Dog +Dolphin +Donkey +Dromedary +Dugong +Elephant +Elk +Fennec +Ferret +Fox +Genet +Gibbon +Giraffe +Goat +Gorilla +Guanaco +Hare +Hart +Hedgehog +Hippopotamus +Hog +Horse +Humpback +Hyena +Hyrax +Jackal +Jackrabbit +Jaguar +Jaguarundi +Kangaroo +Kine +Kinkajou +Kodiak +Langur +Lemur +Leopard +Lion +Llama +Loris +Lynx +Macaque +Mammoth +Manatee +Mandrill +Margay +Marmoset +Marten +Mink +Mole +Mongoose +Monkey +Moose +Mouse +Mule +Muntjac +Narwhale +Ocelot +Okapi +Onager +Opossum +Orangutan +Orca +Otter +Ox +Panda +Pangolin +Pika +Platypus +Polecat +Porpoises +Pronghorn +Puma +Rabbit +Raccoon +Ram +Rat +Reindeer +Rhinoceros +Sabretooth +Seal +Shrew +Skunk +Sloth +Stag +Tamandua +Tamarin +Tapir +Tarpan +Tarsius +Tenrec +Tiger +Vicugna +Wallaby +Walrus +Warthog +Weasel +Whale +Wildebeest +Wolf +Wolverine +Wombat +Zebra +Swallow +Osprey +Falcon +Eagle +Finch +Pelican +Stork +Sparrow +Pidgeon +Ostrich +Albatross +Dove +Canary +Quail +Kiwi +Rhea +Swan +Goose +Pheasant +Penguin +Cormorant +Heron +Flamingo +Condor +Woodpecker +Lark +Thrush +Crow +Raven +Pike +Sockeye +Trout +Eel +Albacore +Anchovy +Lamprey +Herring +Barracuda +Sturgeon +Mackerel +Coelacanth +Stingray +Shark +Minnow +Flounder +Gourami +Sculpin +Koi +Marlin +Remora +Piranha +Walleye +Bass +Trout +Capelin +Char +Guppy +Larch +Cedar +Willow +Aspen +Pine +Fir +Oak +Birch +Maple +Dogwood +Chestnut +Hickory +Balsa +Mahogany +Eucalyptus +Ash +Cork +Elm +Palm +Cypress +Sequoia +Juniper +Spruce +Bamboo +Mango +Sumac +Apple +Pear +Orange +Rubber +Cherry +Lime +Avacado +Holly +Hazel +Persimmon +Arbutus +Beech +Chestnut +Cinnamon +Durian +Cacao +Fig +Olive +Almond +Plum +Poplar +Granite +Shale +Slate +Chalk +Flint +Marble +Limestone +Basalt +Clay +Gneiss +Obsidian +Pumice +Quartzite +Sandstone +Schist +Pegmatite +Komatite +Gabbro +Dolomite +Amphibolite +Andesite +Stormcloud +Thunder +Lightning +Rainfall +Cold +Snap +Blizzard +Whirlwind +Maelstrom +Twister +Cyclone +Vortex +Snowfall +Seacurrent +Sunshine +Heatwave +Wind +Thermal +Avalanche +Lavaflow +Daybreak +Nightfall +Tsunami +Hurricane +Tornado +Rainbow +Earthquake +Summer +Winter +Spring +Autumn +Monsoon +Drought +Eclipse +Solstice +Fog +Drizzle +Sleet +Breeze +Tide +Calm +Dawn +Dusk +Mist +Andromeda +Antlia +Apus +Aquarius +Aquila +Ara +Aries +Auriga +Bootes +Caelum +Camelopardalis +Cancer +Canes +Venatici +Canis +Capricornus +Carina +Cassiopeia +Centaurus +Cepheus +Cetus +Chamaeleon +Circinus +Columba +Coma +Berenices +Corona +Corvus +Crater +Crux +Cygnus +Delphinus +Dorado +Draco +Equuleus +Eridanus +Fornax +Gemini +Grus +Hercules +Horologium +Hydra +Hydrus +Indus +Lacerta +Leo +Lepus +Libra +Lupus +Lynx +Lyra +Mensa +Microscopium +Monoceros +Musca +Norma +Octans +Ophiuchus +Orion +Pavo +Pegasus +Perseus +Phoenix +Pictor +Pisces +Puppis +Pyxis +Reticulum +Sagitta +Sagittarius +Scorpius +Sculptor +Scutum +Serpens +Sextans +Taurus +Telescopium +Triangulum +Tucana +Ursa +Vela +Virgo +Volans +Vulpecula +Acamar +Achernar +Achird +Acrux +Acubens +Adhafera +Adhil +Agena +Ain +Al +Athfar +Al +Bali +Al +Dhanab +Al +Dulfim +Al +Gieba +Al +Giedi +Al +Haud +Al +Nair +Al +Niyat +Al +Rescha +Al +Thalimain +Alaraph +Albireo +Alchibah +Alcyone +Aldebaran +Alfirk +Algenib +Algol +Algorab +Alioth +Alkalurops +Alkes +Almach +Almeisan +Alnilam +Alnitak +Alphard +Alpheratz +Alruccabah +Alsafi +Alshain +Altair +Aludra +Alya +Ancha +Angetenar +Ankaa +Antares +Arcturus +Arkab +Arrakis +Ascella +Asellus +Asmidiske +Asterope +Atik +Atlas +Atria +Auva +Avior +Azelfafage +Azha +Azimech +Baham +Baten +Kaitos +Beid +Bellatrix +Benetnasch +Betelgeuse +Botein +Canopus +Capella +Caph +Caput +Trianguli +Castor +Celaeno +Celbalrai +Chara +Cheleb +Chertan +Chort +Cih +Cor +Caroli +Cor +Hydrae +Cor +Leonis +Coxa +Cujam +Cursa +Dabih +Deneb +Denebola +Diphda +Dnoces +Dschubba +Dubhe +Dziban +Edasich +El +Nath +Electra +Eltanin +Enif +Er +Rai +Eschamali +Fomalhaut +Furud +Gacrux +Garnet +Gemma +Giauzar +Gienah +Gomeisa +Graffias +Grumium +Hadar +Hamal +Heka +Heze +Homam +Izar +Jabbah +Kabdhilinan +Kaffaljidhmah +Kaitos +Kalb +Kaou +Pih +Kaus +Ke +Kwan +Keid +Kentaurus +Kin +Yu +Kitalpha +Kochab +Kokab +Kornephoros +Kraz +Kuma +Kurhah +Lesuth +Maasim +Maaz +Maia +Marchab +Marfak +Markab +Matar +Mebsuta +Megrez +Meissa +Mekbuda +Men +Menkab +Menkalinan +Menkar +Menkent +Menkib +Merak +Merope +Mesarthim +Miaplacidus +Mimosa +Minkar +Mintaka +Mira +Mirach +Mirak +Mirzam +Mizar +Mothallah +Muhlifain +Muliphein +Mulu-lizi +Muphrid +Muscida +Nakkar +Naos +Nashira +Navi +Nekkar +Nihal +Nodus +Nunki +Nusakan +Phact +Phad +Phaet +Phecda +Pherkab +Pleione +Polaris +Pollux +Porrima +Praecipula +Prijipati +Primus +Hyadum +Procyon +Propus +Pulcherrima +Rana +Ras +Algethi +Ras +Alhague +Ras +Elased +Rasalas +Rastaban +Regor +Regulus +Rigel +Rigilkent +Rischa +Rotanev +Ruchba +Rukbah +Rukbat +Sabik +Sadachbia +Sadal +Melik +Sadal +Suud +Sadalbari +Sadatoni +Sadr +Saiph +Samakah +Sargas +Sarin +Scheat +Schedar +Schemali +Scutulum +Segin +Seginus +Shaula +Shedir +Sheliak +Shelyak +Sheratan +Sirius +Situla +Skat +Spica +Sualocin +Suhail +Sulafat +Syrma +Talitha +Tania +Tarazed +Tarf +Taygeta +Tchou +Tegmine +Tejat +Thabit +Thuban +Tseen +Ke +Tsih +Tso +Hea +Tsze +Tsze +Tseang +Tyl +Ukdah +Unuk +Al +Hay +Unukalhai +Vega +Vindemiatrix +Wasat +Wezen +Wezn +Yed +Yildun +Zaniah +Zaurak +Zavijava +Zozma +Zubanalakrab +Zubenhakrabi +Aardharaa +Aashada +Aaslesha +Abhijit +Ashresha +Ashwini +Bharani +Bhargava +Bhishaja +Bhomyavasar +Brihaspativasara +Budhavar +Chitra +Dhanishta +Dhanu +Guruvar +Hastaa +Induvasar +Jyeshta +Kanya +Karkataka +Krittika +Kumbha +Makara +Mangalvar +Mesha +Mithuna +Mrigasheerisham +Phalguni +Proshtapada +Pubba +Punarvasu +Purvashada +Pushya +Ravivar +Revathi +Rohini +Savitru +Shaniva +Shatha +Shravana +Shukravar +Simha +Somavar +Sthiravasara +Swati +Tishya +Tula +Uttara +Uttarashada +Vichruta +Vishaaka +Vrishchika +Aesculapius +Aurora +Auster +Bacchus +Bellona +Decima +Diana +Orcus +Fama +Faunus +Favonius +Fortuna +Galinthis +Gratiae +Juno +Justitia +Latona +Matuta +Minerva +Morta +Nona +Parcae +Pax +Proserpina +Salacia +Salus +Silvanus +Somnus +Tellus +Ulysses +Veiovis +Vesper +Vesta +Vulturnus +Achelois +Acheron +Acis +Adrasteia +Aegaeon +Aeolus +Aether +Agdistis +Agrius +Alastor +Alcyoneus +Alectrona +Aloadae +Alpheus +Amphitrite +Ananke +Antaeus +Antheia +Aphaea +Aphrodite +Arethusa +Argus +Aristaeus +Artemis +Asclepius +Asopus +Asteria +Astraeus +Ate +Athena +Atropos +Attis +Auxo +Bia +Boreas +Briareus +Brontes +Cabiri +Caerus +Calliope +Calypso +Ceto +Chloris +Chronos +Circe +Cladeus +Cleochareia +Clio +Clymene +Clytie +Coeus +Cotys +Cragus +Crataeis +Crius +Cronus +Cybele +Cyclopes +Daphne +Demeter +Dinlas +Dionysus +Dioscuri +Doris +Echo +Efreisone +Eidyia +Eileithyia +Elpis +Enyalius +Enyo +Eos +Eosphorus +Ephialtes +Epimetheus +Erato +Erebus +Erinyes +Ethehofos +Eunomia +Eurotas +Eurus +Euterpe +Galinthias +Giants +Glaucus +Gyes +Hades +Hamadryads +Hebe +Hecate +Hecatoncheires +Helios +Hemera +Hephaestus +Hera +Heracles +Hermes +Hespera +Hesperos +Hestia +Horae +Hybris +Hypnos +Irene +Iris +Lachesis +Leto +Melpomene +Metis +Metope +Mnemosyne +Moirae +Momus +Morpheus +Naiads +Nemesis +Nereids +Nereus +Notus +Oceanid +Odysseus +Ophion +Oreads +Otus +Peitho +Peneus +Persephone +Pheme +Phoebe +Phorcys +Phosporus +Pleiades +Polyhymnia +Polyphemus +Poseidon +Priapus +Prometheus +Selene +Semele +Silenus +Sterope +Steropes +Tartarus +Taygete +Terpsichore +Thalia +Thallo +Thanatos +Theia +Themis +Thetis +Titans +Tityas +Tyche +Typhon +Zephyrus +Zeus +Aegir +Alaisiagae +Alberich +Alfhild +Alfrodull +Alvis +Andhrimnir +Andvaranaut +Andvari +Angrboda +As +Asgard +Embla +Astrild +Asynjur +Atla +Audhumla +Balder +Beldegg +Bergelmir +Beyla +Bifrost +Billing +Bor +Borghild +Bragi +Brono +Brunhilde +Buri +Bylgia +Dagur +Disen +Dvalin +Edda +Einmyria +Eir +Eisa +Elli +Fafnir +Fenrir +Forseti +Freyr +Frigg +Gefion +Geirrod +Ginnungagap +Gjallar +Gladsheim +Glen +Glum +Gna +Gullveig +Gunnar +Heimdall +Heimskringla +Helheim +Hermod +Hladgunnr +Hlin +Honir +Muninn +Hymir +Idun +Jord +Jormungand +Jotunheim +Jotuns +Kari +Ketill +Kvasir +Laga +Landvaettir +Lifthrasir +Lofn +Loki +Magni +Modi +Miming +Mimir +Mjollnir +Mundilfari +Muspell +Nidhogg +Niflheim +Njord +Norn +Nott +Odin +Ragnarok +Sceaf +Sif +Sigurd +Sjofn +Skadi +Sleipnir +Snotra +Surt +Svadilfari +Svalin +Syn +Thiazi +Thor +Thrud +Tyr +Utgard +Valhalla +Vali +Valkyri +Vanaheim +Vanir +Ve +Vidar +Vili +Yggdrasil +Ymir +Aatxe +Adur +Aide +Aideko +Akerbeltz +Ama +Itsaso +Amalur +Argiduna +Atarrabi +Axular +Basa +Begizko +Beigorri +Benzozia +Betadur +Birao +Eate +Egoi +Eguzku +Ekaitz +Eki +Erditse +Erensuge +Erge +Erio +Etsai +Euri +Gaixtoak +Gaizkin +Galtzagorri +Gauargi +Gaueko +Goikoa +Gorritxiki +Hodei +Iduzki +Ieltxu +Iguzki +Ilargi +Inguma +Inizitu +Intxixu +Iratargi +Iritxu +Itsaso +Itxasgorrieta +Iuski +Laino +Laminak +Lur +Lurra +Maju +Mayi +Mikelats +Mozorro +Numen +Oaztargi +Odei +Ortz +Ortzeder +Ortzi +Ost +Ostadar +Ostots +Ostri +Ozkarri +Patuek +Sakre +Sorguin +Sugoi +Tartaro +Torto +Tronagarru +Txaalgorri +Tximistarri +Ur +Urci +Urtzi +Yaun +Zezengorri +Zuberoa +Hydra +Cerberus +Gorgon +Minotaur +Sphinx +Medusa +Pegasus +Echidna +Basilisk +Chimera +Satyr +Nymph +Cyclops +Harpy +Abarimon +Abatwa +Ahriman +Aitvaras +Ajatar +Amphisbaena +Anubite +Apis +Aspare +Aswang +Athos +Automatas +Aziza +Bahamut +Bakhtak +Baku +Balaur +Banshee +Barbegazi +Barghest +Basilisk +Baxajuan +Boobrie +Broxa +Bukavac +Bunyip +Buraq +Catoblepas +Cerberus +Charybdis +Cherufe +Chimaera +Chimera +Chiron +Chrysaor +Cikavac +Cluricaun +Coblynau +Cockatrice +Crocotta +Dahu +Diwata +Domowije +Drac +Draugr +Drekavac +Dvergr +Dybbuk +Eloko +Empusa +Encantado +Ettin +Euryale +Fachen +Feeorin +Gaki +Gancanagh +Gargoyle +Garuda +Geryon +Gorgon +Grendel +Griffin +Guivre +Gwyllgi +Haetae +Hippogriff +Hitotsume-kozou +Huldra +Huldrefolk +Hypocampus +Ifrit +Ixionidae +Jengu +Jikininki +Kabouter +Kallikantzaroi +Kapre +Karkadann +Kharybdis +Kishi +Kitsune +Klytias +Kobold +Kraken +Kroni +Kujuta +Kumiho +Ladon +Lamia +Lammasu +Lampades +Leshii +Leyak +Liderc +Maal +Manananggal +Mandrake +Manticore +Mara +Medusa +Menehune +Merrow +Midwayer +Mimi +Minotaur +Mitmitke +Myling +Naga +Naiad +Ngoro +Nue +Nukekubi +Oni +Opinicus +Oread +Orochi +Orthrus +Ouroboros +Ovinnik +Patupairehe +Penanggalan +Piasa +Pixie +Polevik +Ponaturi +Pooka +Rabisu +Raiju +Rakshasa +Redcap +Roc +Rokurokubi +Rusalka +Samebito +Scylla +Selkie +Serpopard +Shedim +Simurgh +Sirena +Skvader +Sluagh +Sphinx +Spriggan +Squonk +Stheno +Stryx +Talos +Taniwha +Tanuki +Tarasque +Tengu +Tikbalang +Tomte +Tonttu +Trowe +Turul +Unwaba +Vetter +Voadkyn +Vodyanoy +Wendigo +Wyrm +Wyvern +Yuki-onna +Yuurei +Ampere +Angstrom +Archimedes +Aristotle +Avogadro +Becquerel +Bell +Bernoulli +Bohr +Boltzmann +Boyle +Cassini +Cavendish +Celsius +Chandrasekhar +Copernicus +Coulomb +Crick +Curie +Darwin +Dalton +Descartes +Dirac +Doppler +Edison +Einstein +Euler +Faraday +Fermi +Feynman +Flemming +Ford +Foucault +Franklin +Galen +Galileo +Galvani +Gauss +Glenn +Goddard +Golgi +Goodall +Hales +Halley +Hawking +Heisenberg +Helmholtz +Herschel +Hertzsprung +Hooke +Hoyle +Hubble +Huygens +Hertz +Jenner +Kelvin +Kepler +Kuiper +Lagrange +Lavoisier +Leeuwenhoek +Linnaeus +Lorenz +Mach +Malpighi +Maxwell +Mendeleev +Needham +Newton +Oersted +Ohm +Oort +Oppenheimer +Pasteur +Pauling +Planck +Pliny +Redi +Richter +Rontgen +Rutherford +Sagan +Salk +Schwann +Schrodinger +Schwarzchild +Spallanzani +Tesla +Tycho +Vesalius +Van +Allen +Volta +Voltaire +Watson +Adams +Aldiss +Alexander +Anderson +Anthony +Asimov +Baum +Beagle +Bear +Bester +Bisson +Blish +Bloch +Bova +Bradbury +Bradley +Brin +Brooks +Brunner +Bujold +Burroughs +Butler +Capek +Card +Charnas +Cherryh +Chesterton +Chiang +Clarke +Clement +Clifton +Cordwainer +Crichton +Davidson +Delany +Dick +Dickson +Effinger +Egan +Ellison +Farmer +Foster +Gaiman +Gerrold +Gibson +Greeley +Haldeman +Heinlein +Henderson +Herbert +Hickman +Johnson +Jordan +Kagan +Kelly +Keyes +Knight +Kornbluth +Kress +L'Engle +Lafferty +Landis +Langford +Larson +Le +Guin +Leiber +Leinster +Lem +Levine +Lewis +Link +Longyear +Lucas +Martin +McCaffrey +McHugh +McIntyre +Miller +Niven +Orwell +Perry +Pohl +Resnick +Riley +Robinson +Roddenberry +Rowling +Rusch +Russ +Russell +Sawyer +Sheffield +Shelley +Shepard +Silverberg +Simak +Simmons +Stapledon +Steele +Stephenson +Sterling +Straczynski +Stross +Sturgeon +Swanwick +Tiptree +Tolkien +Turtledove +Vance +Varley +Verne +Vinge +Vonnegut +Watt-Evans +Wells +Wilhelm +Williamson +Willis +Wilson +Wolfe +Wolverton +Zahn +Zelazny +Botticelli +Bruegel +Caravaggio +Cezanne +Chagall +Da +Vinci +Dali +Degas +Delacroix +Dore +Duerer +Escher +Gauguin +Giotto +Gogh +Goya +Holbein +Kahlo +Kandinsky +Klee +Klimt +Magritte +Manet +Matisse +Michelangelo +Miro +Modigliani +Mondrian +Monet +O'Keeffe +Picasso +Pollock +Raphael +Rembrandt +Renoir +Rodin +Rubens +Warhol +Whistler +Acceptance +Altruism +Autonomy +Balance +Charity +Chastity +Commitment +Compassion +Confidence +Continence +Cooperation +Courage +Courtesy +Creativity +Curiosity +Dependability +Detachment +Determination +Diligence +Discipline +Empathy +Endurance +Enthusiasm +Excellence +Fairness +Faith +Fidelity +Focus +Foresight +Forgiveness +Fortitude +Freedom +Generosity +Happiness +Helpfulness +Honesty +Honor +Hope +Hospitality +Humility +Humor +Idealism +Imagination +Independence +Innocence +Integrity +Justice +Kindness +Liberty +Loyalty +Mercy +Moderation +Modesty +Nurture +Obedience +Optimism +Patience +Peace +Perfection +Perseverance +Piety +Prudence +Purity +Reason +Refinement +Respect +Restraint +Self-Discipline +Sensitivity +Sincerity +Strength +Sympathy +Tactfulness +Temperance +Tolerance +Trust +Truth +Understanding +Unselfishness +Valor +Virtue +Wisdom +Zeal +Acceptance +Anger +Anticipation +Boredom +Disgust +Envy +Fear +Guilt +Hate +Hope +Joy +Jealousy +Love +Remorse +Sorrow +Surprise +Ambivalance +Awe +Rage +Shame +Ecstacy +Smugness +Suspicion +Lonliness +Depression +Agony +Confidence +Pride +Frustration +Angst +Arch +Butress +Ceiling +Column +Pillar +Wall +Window +Vault +Minaret +Tower +Veranda +Terrace +Dome +Cornice +Foundation +Eaves +Frieze +Stucco +Barrel +Truss +Keystone +Apex +Gable +Facade +Pediment +Pier +Pilaster +Rotunda +Spandrel +Lir +Endoria +Tewari +Xanthus +Fixas +Muscida +Ezra +Manzil +Woz +Akrab +Yarak +Erigone +Vox +Yekub +Eternal September \ No newline at end of file Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/universe/Universe.cpp 2007-07-21 06:22:40 UTC (rev 2190) @@ -69,35 +69,6 @@ const int destination_system; }; - // "only" defined for 1 <= n <= 3999, as we can't display the symbol for 5000 - std::string RomanNumber(unsigned int n) - { - static const char N[] = "IVXLCDM??"; - std::string retval; - int e = 3; - int mod = 1000; - for (; 0 <= e; e--, mod /= 10) { - unsigned int m = (n / mod) % 10; - if (m % 5 == 4) { - retval += N[e << 1]; - ++m; - if (m == 10) { - retval += N[(e << 1) + 2]; - continue; - } - } - if (m >= 5) { - retval += N[(e << 1) + 1]; - m -= 5; - } - while (m) { - retval += N[e << 1]; - --m; - } - } - return retval; - } - void LoadSystemNames(std::list<std::string>& names) { boost::filesystem::ifstream ifs(GetSettingsDir() / "starnames.txt"); @@ -1977,9 +1948,6 @@ void Universe::GenerateIrregularGalaxy(int stars, Age age, AdjacencyGrid& adjacency_grid) { #ifdef FREEORION_BUILD_SERVER - std::list<std::string> star_names; - LoadSystemNames(star_names); - SmallIntDistType star_type_gen = SmallIntDist(0, NUM_STAR_TYPES - 1); // generate star field @@ -2939,17 +2907,17 @@ Ship* ship = 0; ship = new Ship(empire_id, scout_design_id); - ship->Rename("Scout"); + ship->Rename(empire->NewShipName()); int ship_id = Insert(ship); home_fleet->AddShip(ship_id); ship = new Ship(empire_id, scout_design_id); - ship->Rename("Scout"); + ship->Rename(empire->NewShipName()); ship_id = Insert(ship); home_fleet->AddShip(ship_id); ship = new Ship(empire_id, colony_ship_design_id); - ship->Rename("Colony Ship"); + ship->Rename(empire->NewShipName()); ship_id = Insert(ship); home_fleet->AddShip(ship_id); } Modified: trunk/FreeOrion/util/MultiplayerCommon.cpp =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.cpp 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/util/MultiplayerCommon.cpp 2007-07-21 06:22:40 UTC (rev 2190) @@ -118,6 +118,34 @@ return GetStringTable().String(str); } +std::string RomanNumber(unsigned int n) +{ + static const char N[] = "IVXLCDM??"; + std::string retval; + int e = 3; + int mod = 1000; + for (; 0 <= e; e--, mod /= 10) { + unsigned int m = (n / mod) % 10; + if (m % 5 == 4) { + retval += N[e << 1]; + ++m; + if (m == 10) { + retval += N[(e << 1) + 2]; + continue; + } + } + if (m >= 5) { + retval += N[(e << 1) + 1]; + m -= 5; + } + while (m) { + retval += N[e << 1]; + --m; + } + } + return retval; +} + const std::string& Language() { return GetStringTable().Language(); Modified: trunk/FreeOrion/util/MultiplayerCommon.h =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.h 2007-07-21 05:37:50 UTC (rev 2189) +++ trunk/FreeOrion/util/MultiplayerCommon.h 2007-07-21 06:22:40 UTC (rev 2190) @@ -29,6 +29,10 @@ /** Returns a language-specific string for the key-string \a str */ const std::string& UserString(const std::string& str); +/** Returns the stringified form of \a n as a roman number. "Only" defined for 1 <= n <= 3999, as we can't display the + symbol for 5000. */ +std::string RomanNumber(unsigned int n); + /** Returns the language of the StringTable currently in use */ const std::string& Language(); |
From: <tz...@us...> - 2007-08-09 04:27:12
|
Revision: 2219 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2219&view=rev Author: tzlaine Date: 2007-08-08 21:26:56 -0700 (Wed, 08 Aug 2007) Log Message: ----------- Updated to reflect recent GG API change. Modified Paths: -------------- trunk/FreeOrion/UI/About.cpp trunk/FreeOrion/UI/About.h trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/CUIWnd.h trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetButton.h trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FocusSelector.cpp trunk/FreeOrion/UI/FocusSelector.h trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/GalaxySetupWnd.h trunk/FreeOrion/UI/InGameMenu.cpp trunk/FreeOrion/UI/InGameMenu.h trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/IntroScreen.h trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.h trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/OptionsWnd.h trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.h trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SitRepPanel.cpp trunk/FreeOrion/UI/SitRepPanel.h trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp Modified: trunk/FreeOrion/UI/About.cpp =================================================================== --- trunk/FreeOrion/UI/About.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/About.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -76,7 +76,7 @@ CUIWnd::Render(); } -void About::KeyPress (GG::Key key, Uint32 key_mods) +void About::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if ((key == GG::GGK_RETURN) || (key == GG::GGK_ESCAPE)) // Same behaviour as if "done" was pressed { Modified: trunk/FreeOrion/UI/About.h =================================================================== --- trunk/FreeOrion/UI/About.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/About.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -52,7 +52,7 @@ //! \name Mutators //!@{ virtual void Render(); //!< drawing code - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); //!@} Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -67,7 +67,7 @@ void SizeMove(const GG::Pt& ul, const GG::Pt& lr); void Render(); - void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); + void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); /* need to redefine this so that icons and name can be put at the top of the Wnd, rather than being restricted to the client area of a CUIWnd */ @@ -238,7 +238,7 @@ glEnable(GL_TEXTURE_2D); } -void BuildDesignatorWnd::BuildDetailPanel::LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) +void BuildDesignatorWnd::BuildDetailPanel::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { if (m_drag_offset != GG::Pt(-1, -1)) { // resize-dragging GG::Pt new_lr = pt - m_drag_offset; @@ -268,7 +268,7 @@ final_move = new_ul - ul; } - GG::Wnd::LDrag(pt, final_move, keys); + GG::Wnd::LDrag(pt, final_move, mod_keys); } } @@ -393,7 +393,7 @@ BuildSelector(int w, int h); void SizeMove(const GG::Pt& ul, const GG::Pt& lr); - void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); + void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); const std::set<BuildType>& GetBuildTypesShown() const; const std::pair<bool, bool>& GetAvailabilitiesShown() const; // .first -> available items; .second -> unavailable items @@ -530,7 +530,7 @@ DoLayout(); } -void BuildDesignatorWnd::BuildSelector::LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) +void BuildDesignatorWnd::BuildSelector::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { if (m_drag_offset != GG::Pt(-1, -1)) { // resize-dragging GG::Pt new_lr = pt - m_drag_offset; @@ -560,7 +560,7 @@ final_move = new_ul - ul; } - GG::Wnd::LDrag(pt, final_move, keys); + GG::Wnd::LDrag(pt, final_move, mod_keys); } } Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/CUIControls.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -146,7 +146,7 @@ return InAngledCornerRect(pt, ul.x, ul.y, lr.x, lr.y, CUIBUTTON_ANGLE_OFFSET); } -void CUIButton::MouseHere(const GG::Pt& pt, Uint32 keys) +void CUIButton::MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (!Disabled()) { if (State() != BN_ROLLOVER && PlaySounds()) @@ -264,7 +264,7 @@ bool CUIArrowButton::FillBackgroundWithWndColor() const { return m_fill_background_with_wnd_color; } -void CUIArrowButton::MouseHere(const GG::Pt& pt, Uint32 keys) +void CUIArrowButton::MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (!Disabled()) { if (State() != BN_ROLLOVER && PlaySounds()) @@ -448,7 +448,7 @@ } } -void CUIStateButton::MouseEnter(const GG::Pt& pt, Uint32 keys) +void CUIStateButton::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_mouse_here = true; } @@ -547,24 +547,24 @@ AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, border_color_to_use, CUISCROLL_ANGLE_OFFSET, 1); } -void CUIScroll::ScrollTab::LButtonDown(const GG::Pt& pt, Uint32 keys) +void CUIScroll::ScrollTab::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_being_dragged = true; } -void CUIScroll::ScrollTab::LButtonUp(const GG::Pt& pt, Uint32 keys) +void CUIScroll::ScrollTab::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_being_dragged = false; if (!InWindow(GG::GUI::GetGUI()->MousePosition())) m_mouse_here = false; } -void CUIScroll::ScrollTab::LClick(const GG::Pt& pt, Uint32 keys) +void CUIScroll::ScrollTab::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_being_dragged = false; } -void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, Uint32 keys) +void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (!m_being_dragged && !m_mouse_here) { if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); @@ -682,14 +682,14 @@ } } -void CUIDropDownList::LClick(const GG::Pt& pt, Uint32 keys) +void CUIDropDownList::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (!Disabled()) PlayDropDownListOpenSound(); - DropDownList::LClick(pt, keys); + DropDownList::LClick(pt, mod_keys); } -void CUIDropDownList::MouseEnter(const GG::Pt& pt, Uint32 keys) +void CUIDropDownList::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); m_mouse_here = true; @@ -1215,7 +1215,7 @@ GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, Color(), GG::CLR_WHITE, 1); } -void ColorSelector::LClick(const GG::Pt& pt, Uint32 keys) +void ColorSelector::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { int x = std::min(pt.x, GG::GUI::GetGUI()->AppWidth() - 315); // 315 is width of ColorDlg from GG::ColorDlg:::ColorDlg int y = std::min(pt.y, GG::GUI::GetGUI()->AppHeight() - 300); // 300 is height of ColorDlg from GG::ColorDlg:::ColorDlg Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/CUIControls.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -43,7 +43,7 @@ //@} /** \name Mutators */ //@{ - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); void SetBorderColor(GG::Clr clr); ///< sets the color used to render the border of the button void SetBorderThick(int thick); ///< sets the thickness of the rendered the border of the button @@ -92,7 +92,7 @@ //@} /** \name Mutators */ //@{ - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); void FillBackgroundWithWndColor(bool fill); //@} @@ -129,7 +129,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); //@} @@ -150,10 +150,10 @@ ScrollTab(GG::Orientation orientation, int scroll_width, GG::Clr color, GG::Clr border_color); ///< basic ctor virtual void SetColor(GG::Clr c); virtual void Render(); - virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); - virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); private: GG::Clr m_border_color; @@ -229,8 +229,8 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); void DisableDropArrow(); ///< disables rendering of the small downward-facing arrow on the right of the control @@ -440,7 +440,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void LClick(const GG::Pt& pt, Uint32 keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); //@} mutable ColorChangedSignalType ColorChangedSignal; Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -238,7 +238,7 @@ font->RenderText(ul.x + BORDER_LEFT, ul.y, WindowText()); } -void CUIWnd::LButtonDown(const GG::Pt& pt, Uint32 keys) +void CUIWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (!m_minimized && m_resizable) { GG::Pt cl_lr = LowerRight() - GG::Pt(BORDER_RIGHT, BORDER_BOTTOM); @@ -249,7 +249,7 @@ } } -void CUIWnd::LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) +void CUIWnd::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { if (m_drag_offset != GG::Pt(-1, -1)) { // resize-dragging Resize((pt - m_drag_offset) - UpperLeft()); @@ -257,11 +257,11 @@ GG::Pt ul = UpperLeft(), lr = LowerRight(); GG::Pt final_move(std::max(-ul.x, std::min(move.x, GG::GUI::GetGUI()->AppWidth() - 1 - lr.x)), std::max(-ul.y, std::min(move.y, GG::GUI::GetGUI()->AppHeight() - 1 - lr.y))); - GG::Wnd::LDrag(pt + final_move - move, final_move, keys); + GG::Wnd::LDrag(pt + final_move - move, final_move, mod_keys); } } -void CUIWnd::LButtonUp(const GG::Pt& pt, Uint32 keys) +void CUIWnd::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_drag_offset = GG::Pt(-1, -1); } @@ -403,7 +403,7 @@ GG::GUI::GetGUI()->SetFocusWnd(m_edit); } -void CUIEditWnd::KeyPress(GG::Key key, Uint32 key_mods) +void CUIEditWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) { switch (key) { case GG::GGK_RETURN: if (!m_ok_bn->Disabled()) OkClicked(); break; Modified: trunk/FreeOrion/UI/CUIWnd.h =================================================================== --- trunk/FreeOrion/UI/CUIWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/CUIWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -3,14 +3,10 @@ #ifndef _CUIWnd_h_ #define _CUIWnd_h_ -#ifndef _GG_Wnd_h_ +#include <GG/Button.h> #include <GG/Wnd.h> -#endif +#include <GG/WndEvent.h> -#ifndef _GG_Button_h_ -#include <GG/Button.h> -#endif - class CUIEdit; class CUIButton; @@ -103,10 +99,10 @@ //! \name Mutators //@{ virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); virtual void Render(); - virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); - virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); - virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); - virtual void LClick(const GG::Pt& pt, Uint32 keys) {return LButtonUp(pt, keys);} + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) {return LButtonUp(pt, mod_keys);} void ToggleMinimized() {MinimizeClicked();} void Close() {CloseClicked();} @@ -163,7 +159,7 @@ CUIEditWnd(int w, const std::string& prompt_text, const std::string& edit_text, GG::Flags<GG::WndFlag> flags = GG::MODAL); virtual void ModalInit(); - virtual void KeyPress(GG::Key key, Uint32 key_mods); + virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); const std::string& Result() const; Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/FleetButton.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -65,7 +65,7 @@ return InFleetMarker(pt, ul.x, ul.y, lr.x, lr.y, m_orientation); } -void FleetButton::MouseHere(const GG::Pt& pt, Uint32 keys) +void FleetButton::MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if (!Disabled() && (!map_wnd || !map_wnd->InProductionViewMode())) { @@ -75,12 +75,12 @@ } } -void FleetButton::LClick(const GG::Pt& pt, Uint32 keys) +void FleetButton::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if (!Disabled() && (!map_wnd || !map_wnd->InProductionViewMode())) PlayFleetButtonOpenSound(); - GG::Button::LClick(pt, keys); + GG::Button::LClick(pt, mod_keys); } void FleetButton::RenderUnpressed() Modified: trunk/FreeOrion/UI/FleetButton.h =================================================================== --- trunk/FreeOrion/UI/FleetButton.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/FleetButton.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -1,5 +1,4 @@ // -*- C++ -*- -//FleetButton.h #ifndef _FleetButton_h_ #define _FleetButton_h_ @@ -30,8 +29,8 @@ //@} /** \name Mutators */ //@{ - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); /** sets the orientation of the fleet marker (must be one of SHAPE_LEFT and SHAPE_RIGHT; otherwise, SHAPE_LEFT will be used) */ Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -42,7 +42,7 @@ bool Selected() const; virtual void Render(); - virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys); + virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys); virtual void DragDropLeave(); virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt); void Select(bool b); @@ -346,7 +346,7 @@ GG::FlatRectangle(text_ul.x, text_ul.y, text_lr.x + 5, text_lr.y, color_to_use, GG::CLR_ZERO, 0); } -void FleetDataPanel::DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) +void FleetDataPanel::DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { Select(true); for (std::map<Wnd*, GG::Pt>::const_iterator it = drag_drop_wnds.begin(); it != drag_drop_wnds.end(); ++it) { @@ -611,12 +611,12 @@ } } - virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { - DragDropHere(pt, drag_drop_wnds, keys); + DragDropHere(pt, drag_drop_wnds, mod_keys); } - virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { int row_index = RowUnderPt(pt); Modified: trunk/FreeOrion/UI/FocusSelector.cpp =================================================================== --- trunk/FreeOrion/UI/FocusSelector.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/FocusSelector.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -9,6 +9,7 @@ #include <GG/GUI.h> #include <GG/DrawUtil.h> #include <GG/Layout.h> +#include <GG/WndEvent.h> #include <boost/format.hpp> @@ -62,12 +63,12 @@ } } -void FocusButton::RClick(const GG::Pt& pt, Uint32 keys) +void FocusButton::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { RightClickedSignal(); } -void FocusButton::MouseEnter(const GG::Pt& pt, Uint32 keys) +void FocusButton::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_mouse_here = true; } @@ -243,17 +244,17 @@ GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, FOCUS_SELECTOR_SECONDARY_OUTLINE_COLOR, 1); } -void FocusSelector::LClick(const GG::Pt& pt, Uint32 keys) +void FocusSelector::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { PrimaryFocusChangedSignal(FOCUS_BALANCED); } -void FocusSelector::RClick(const GG::Pt& pt, Uint32 keys) +void FocusSelector::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { SecondaryFocusChangedSignal(FOCUS_BALANCED); } -void FocusSelector::MouseEnter(const GG::Pt& pt, Uint32 keys) +void FocusSelector::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_mouse_here = true; } Modified: trunk/FreeOrion/UI/FocusSelector.h =================================================================== --- trunk/FreeOrion/UI/FocusSelector.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/FocusSelector.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -14,8 +14,8 @@ FocusButton(GG::Clr color, const boost::shared_ptr<GG::Texture>& image); virtual void Render(); - virtual void RClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); void SetImage(const boost::shared_ptr<GG::Texture>& image); @@ -51,9 +51,9 @@ FocusSelector(int w, const ResourceCenter& resource_center); virtual void Render(); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void RClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); void Update(); Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -315,7 +315,7 @@ ClientUpperLeft().y + m_preview_ul.y + PREVIEW_SZ.y + 2, GG::CLR_BLACK, ClientUI::WndInnerBorderColor(), 1); } -void GalaxySetupWnd::KeyPress (GG::Key key, Uint32 key_mods) +void GalaxySetupWnd::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if (!m_ok->Disabled() && (key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER)) // Same behaviour as if "OK" was pressed OkClicked(); Modified: trunk/FreeOrion/UI/GalaxySetupWnd.h =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/GalaxySetupWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -105,7 +105,7 @@ /** \name Mutators*/ //!@{ virtual void Render(); //!< drawing code - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); //!@} private: Modified: trunk/FreeOrion/UI/InGameMenu.cpp =================================================================== --- trunk/FreeOrion/UI/InGameMenu.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/InGameMenu.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -75,7 +75,7 @@ void InGameMenu::Render() { CUIWnd::Render(); } -void InGameMenu::KeyPress (GG::Key key, Uint32 key_mods) +void InGameMenu::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if (key == GG::GGK_RETURN || key == GG::GGK_ESCAPE || key == GG::GGK_F10) // Same behaviour as if "done" was pressed Done(); Modified: trunk/FreeOrion/UI/InGameMenu.h =================================================================== --- trunk/FreeOrion/UI/InGameMenu.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/InGameMenu.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -19,7 +19,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); //@} protected: Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -20,6 +20,7 @@ #include <GG/StaticGraphic.h> #include <GG/BrowseInfoWnd.h> #include <GG/StyleFactory.h> +#include <GG/WndEvent.h> #include <boost/lexical_cast.hpp> #include <boost/format.hpp> @@ -480,11 +481,11 @@ ExpandCollapseSignal(); } -void PopulationPanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void PopulationPanel::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } void PopulationPanel::Render() @@ -924,11 +925,11 @@ ExpandCollapseSignal(); } -void ResourcePanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void ResourcePanel::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } void ResourcePanel::Render() @@ -1310,11 +1311,11 @@ clr, clr, 0); } -void MeterStatusBar2::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void MeterStatusBar2::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } ///////////////////////////////////// @@ -1417,11 +1418,11 @@ glEnable(GL_TEXTURE_2D); } -void BuildingsPanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void BuildingsPanel::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } void BuildingsPanel::Update() @@ -1684,11 +1685,11 @@ if (m_progress_bar) m_progress_bar->SizeMove(GG::Pt(0, bar_top), child_lr); } -void BuildingIndicator::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void BuildingIndicator::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } ///////////////////////////////////// @@ -1726,11 +1727,11 @@ void SpecialsPanel::Render() {} -void SpecialsPanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void SpecialsPanel::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if((parent = Parent())) - parent->MouseWheel(pt, move, keys); + parent->MouseWheel(pt, move, mod_keys); } void SpecialsPanel::Update() Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/InfoPanels.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -1,3 +1,4 @@ +// -*- C++ -*- #ifndef _InfoPanels_h_ #define _InfoPanels_h_ @@ -45,7 +46,7 @@ virtual void Render(); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Update(); ///< updates indicators with values of associated object. Does not do layout and resizing. void Refresh(); ///< updates, redoes layout, resizes indicator @@ -97,7 +98,7 @@ void ExpandCollapse(bool expanded); ///< expands or collapses panel to show details or just summary info virtual void Render(); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Update(); ///< updates indicators with values of associated object. Does not do layout and resizing. void Refresh(); ///< updates, redoes layout, resizes indicator @@ -164,7 +165,7 @@ void ExpandCollapse(bool expanded); ///< expands or collapses panel to show details or just summary info virtual void Render(); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Refresh(); ///< recreates indicators, redoes layout, resizes @@ -204,7 +205,7 @@ virtual void Render(); virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) private: @@ -229,7 +230,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Update(); ///< regenerates indicators according to buildings on planets and on queue on planet and redoes layout //@} @@ -252,7 +253,7 @@ MeterStatusBar2(int w, int h, const Meter& meter); virtual void Render(); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void SetProjectedCurrent(double current); void SetProjectedMax(double max); Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -46,7 +46,7 @@ CreditsWnd(int x, int y, int w, int h,const XMLElement &credits,int cx, int cy, int cw, int ch,int co); virtual void Render(); - virtual void LClick(const GG::Pt& pt, Uint32 keys) {m_bRender=false;} + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) {m_bRender=false;} private: XMLElement m_credits; @@ -260,7 +260,7 @@ GG::GUI::GetGUI()->Exit(0); } -void IntroScreen::KeyPress (GG::Key key, Uint32 key_mods) +void IntroScreen::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if (key == GG::GGK_ESCAPE) OnExitGame(); Modified: trunk/FreeOrion/UI/IntroScreen.h =================================================================== --- trunk/FreeOrion/UI/IntroScreen.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/IntroScreen.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -36,7 +36,7 @@ void OnAbout(); //!< called when about is clicked void OnCredits(); //!< called when credits is clicked void OnExitGame(); //!< called when exit_game is clicked - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); virtual void Close(); Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/LinkText.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -3,6 +3,7 @@ #include "../util/MultiplayerCommon.h" #include <GG/DrawUtil.h> +#include <GG/WndEvent.h> #include <boost/lexical_cast.hpp> @@ -48,18 +49,18 @@ GG::TextControl::Render(); } -void LinkText::LButtonDown(const GG::Pt& pt, Uint32 keys) +void LinkText::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_old_sel_link = GetLinkUnderPt(pt); } -void LinkText::LButtonUp(const GG::Pt& pt, Uint32 keys) +void LinkText::LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { m_old_sel_link = -1; ClearOldRollover(); } -void LinkText::LClick(const GG::Pt& pt, Uint32 keys) +void LinkText::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { using boost::lexical_cast; int sel_link = GetLinkUnderPt(pt); @@ -83,7 +84,7 @@ m_old_sel_link = -1; } -void LinkText::MouseHere(const GG::Pt& pt, Uint32 keys) +void LinkText::MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { int rollover_link = GetLinkUnderPt(pt); if (rollover_link != m_old_rollover_link) { Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/LinkText.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -54,10 +54,10 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); - virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseLeave(); /** sets the text to \a str; may resize the window. If the window was constructed to fit the size of the text Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -296,41 +296,41 @@ m_bg_scroll_rate[2] = 0.5; // connect keyboard accelerators - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_ESCAPE, 0), &MapWnd::ReturnToMap, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_ESCAPE), &MapWnd::ReturnToMap, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_RETURN, 0), &MapWnd::OpenChatWindow, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_ENTER, 0), &MapWnd::OpenChatWindow, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_RETURN), &MapWnd::OpenChatWindow, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_ENTER), &MapWnd::OpenChatWindow, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_RETURN, GG::GGKMOD_CTRL), &MapWnd::EndTurn, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_ENTER, GG::GGKMOD_CTRL), &MapWnd::EndTurn, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_RETURN, GG::MOD_KEY_CTRL), &MapWnd::EndTurn, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_ENTER, GG::MOD_KEY_CTRL), &MapWnd::EndTurn, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F2, 0), &MapWnd::ToggleSitRep, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F3, 0), &MapWnd::ToggleResearch, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F4, 0), &MapWnd::ToggleProduction, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F10, 0), &MapWnd::ShowMenu, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_s, 0), &MapWnd::CloseSystemView, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F2), &MapWnd::ToggleSitRep, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F3), &MapWnd::ToggleResearch, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F4), &MapWnd::ToggleProduction, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F10), &MapWnd::ShowMenu, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_s), &MapWnd::CloseSystemView, this); // Keys for zooming - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_e, 0), &MapWnd::KeyboardZoomIn, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_PLUS, 0), &MapWnd::KeyboardZoomIn, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r, 0), &MapWnd::KeyboardZoomOut, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_MINUS, 0), &MapWnd::KeyboardZoomOut, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_e), &MapWnd::KeyboardZoomIn, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_PLUS), &MapWnd::KeyboardZoomIn, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r), &MapWnd::KeyboardZoomOut, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_KP_MINUS), &MapWnd::KeyboardZoomOut, this); // Keys for showing systems - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_d, 0), &MapWnd::ZoomToHomeSystem, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_x, 0), &MapWnd::ZoomToPrevOwnedSystem, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_c, 0), &MapWnd::ZoomToNextOwnedSystem, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_d), &MapWnd::ZoomToHomeSystem, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_x), &MapWnd::ZoomToPrevOwnedSystem, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_c), &MapWnd::ZoomToNextOwnedSystem, this); // Keys for showing fleets - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_f, 0), &MapWnd::ZoomToPrevIdleFleet, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_g, 0), &MapWnd::ZoomToNextIdleFleet, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_v, 0), &MapWnd::ZoomToPrevFleet, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_b, 0), &MapWnd::ZoomToNextFleet, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_f), &MapWnd::ZoomToPrevIdleFleet, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_g), &MapWnd::ZoomToNextIdleFleet, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_v), &MapWnd::ZoomToPrevFleet, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_b), &MapWnd::ZoomToNextFleet, this); #ifndef FREEORION_RELEASE // special development-only key combo that dumps ValueRef, Condition, and Effect regression tests using the current // Universe - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r, GG::GGKMOD_CTRL), &RequestRegressionTestDump); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r, GG::MOD_KEY_CTRL), &RequestRegressionTestDump); #endif g_chat_edit_history.push_front(""); @@ -395,7 +395,7 @@ } } -void MapWnd::KeyPress (GG::Key key, Uint32 key_mods) +void MapWnd::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { switch (key) { case GG::GGK_TAB: { // auto-complete current chat edit word @@ -512,10 +512,10 @@ } } -void MapWnd::LButtonDown (const GG::Pt &pt, Uint32 keys) +void MapWnd::LButtonDown (const GG::Pt &pt, GG::Flags<GG::ModKey> mod_keys) { m_drag_offset = pt - ClientUpperLeft(); } -void MapWnd::LDrag (const GG::Pt &pt, const GG::Pt &move, Uint32 keys) +void MapWnd::LDrag (const GG::Pt &pt, const GG::Pt &move, GG::Flags<GG::ModKey> mod_keys) { GG::Pt move_to_pt = pt - m_drag_offset; CorrectMapPosition(move_to_pt); @@ -530,13 +530,13 @@ m_dragged = true; } -void MapWnd::LButtonUp (const GG::Pt &pt, Uint32 keys) +void MapWnd::LButtonUp (const GG::Pt &pt, GG::Flags<GG::ModKey> mod_keys) { m_drag_offset = GG::Pt(-1, -1); m_dragged = false; } -void MapWnd::LClick (const GG::Pt &pt, Uint32 keys) +void MapWnd::LClick (const GG::Pt &pt, GG::Flags<GG::ModKey> mod_keys) { m_drag_offset = GG::Pt(-1, -1); if (!m_dragged && !m_in_production_view_mode) { @@ -547,7 +547,7 @@ m_dragged = false; } -void MapWnd::RClick(const GG::Pt& pt, Uint32 keys) +void MapWnd::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { // Attempt to close open fleet windows (if any are open and this is allowed), then attempt to close the SidePanel (if open); // if these fail, go ahead with the context-sensitive popup menu . Note that this enforces a one-close-per-click policy. @@ -564,7 +564,7 @@ } } -void MapWnd::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void MapWnd::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { if (move) Zoom(move); @@ -963,7 +963,7 @@ } else { for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { if (std::find(m_moving_fleet_buttons[i]->Fleets().begin(), m_moving_fleet_buttons[i]->Fleets().end(), fleet) != m_moving_fleet_buttons[i]->Fleets().end()) { - m_moving_fleet_buttons[i]->LClick(GG::Pt(), 0); + m_moving_fleet_buttons[i]->LClick(GG::Pt(), GG::MOD_KEY_NONE); break; } } @@ -2003,77 +2003,77 @@ void MapWnd::SetAccelerators() { - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_ESCAPE, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_ESCAPE); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_RETURN, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_ENTER, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_RETURN); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_ENTER); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_RETURN, GG::GGKMOD_CTRL); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_ENTER, GG::GGKMOD_CTRL); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_RETURN, GG::MOD_KEY_CTRL); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_ENTER, GG::MOD_KEY_CTRL); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F2, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F3, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F4, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F10, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_s, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F2); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F3); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F4); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F10); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_s); // Keys for zooming - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_e, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_r, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_PLUS, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_MINUS, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_e); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_r); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_PLUS); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_KP_MINUS); // Keys for showing systems - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_d, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_x, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_c, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_d); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_x); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_c); // Keys for showing fleets - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_f, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_g, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_v, 0); - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_b, 0); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_f); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_g); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_v); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_b); #ifndef FREEORION_RELEASE - GG::GUI::GetGUI()->SetAccelerator(GG::GGK_r, GG::GGKMOD_CTRL); + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_r, GG::MOD_KEY_CTRL); #endif } void MapWnd::RemoveAccelerators() { - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_ESCAPE, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_ESCAPE); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_RETURN, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_ENTER, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_RETURN); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_ENTER); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_RETURN, GG::GGKMOD_CTRL); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_ENTER, GG::GGKMOD_CTRL); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_RETURN, GG::MOD_KEY_CTRL); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_ENTER, GG::MOD_KEY_CTRL); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F2, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F3, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F4, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F10, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_s, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F2); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F3); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F4); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_F10); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_s); // Zoom keys - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_e, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_r, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_PLUS, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_MINUS, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_e); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_r); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_PLUS); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_MINUS); // Keys for showing systems - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_d, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_x, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_c, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_d); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_x); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_c); // Keys for showing fleets - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_f, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_g, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_v, 0); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_b, 0); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_f); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_g); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_v); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_b); #ifndef FREEORION_RELEASE - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_r, GG::GGKMOD_CTRL); + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_r, GG::MOD_KEY_CTRL); #endif } @@ -2088,7 +2088,7 @@ { for (GG::GUI::const_accel_iterator i = GG::GUI::GetGUI()->accel_begin(); i != GG::GUI::GetGUI()->accel_end(); ++i) { - if (i->second != 0) // we only want to disable keys without modifiers + if (i->second != 0) // we only want to disable mod_keys without modifiers continue; GG::Key key = i->first; if ((key >= GG::GGK_a && key <= GG::GGK_z) || @@ -2098,7 +2098,7 @@ } for (std::set<GG::Key>::iterator i = m_disabled_accels_list.begin(); i != m_disabled_accels_list.end(); ++i) { - GG::GUI::GetGUI()->RemoveAccelerator(*i, 0); + GG::GUI::GetGUI()->RemoveAccelerator(*i); } } @@ -2107,7 +2107,7 @@ { for (std::set<GG::Key>::iterator i = m_disabled_accels_list.begin(); i != m_disabled_accels_list.end(); ++i) { - GG::GUI::GetGUI()->SetAccelerator(*i, 0); + GG::GUI::GetGUI()->SetAccelerator(*i); } m_disabled_accels_list.clear(); } Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/MapWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -61,22 +61,22 @@ SidePanel* GetSidePanel() const; void GetSaveGameUIData(SaveGameUIData& data) const; //!< populates the relevant UI state that should be restored after a save-and-load cycle bool InProductionViewMode() const; //!< returns true iff this MapWnd is visible and usable for interaction, but the allowed interactions are restricted to those appropriate to the production screen - bool FleetWndsOpen() const; //!< returns true iff there is at least one open FleetWnd + bool FleetWndsOpen() const; //!< returns true iff there is at least one open FleetWnd typedef std::set<FleetWnd*>::const_iterator FleetWndIter; - FleetWndIter FleetWndBegin(); - FleetWndIter FleetWndEnd(); + FleetWndIter FleetWndBegin(); + FleetWndIter FleetWndEnd(); //!@} //! \name Mutators //!@{ virtual void Render(); - virtual void KeyPress (GG::Key key, Uint32 key_mods); - virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); - virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); - virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void RClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); void InitTurn(int turn_number); //!< called at the start of each turn void RestoreFromSaveData(const SaveGameUIData& data); //!< restores the UI state that was saved in an earlier call to GetSaveGameUIData(). Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -257,7 +257,7 @@ GG::CLR_BLACK, ClientUI::WndInnerBorderColor(), 1); } -void MultiplayerLobbyWnd::KeyPress(GG::Key key, Uint32 key_mods) +void MultiplayerLobbyWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if ((key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER) && GG::GUI::GetGUI()->FocusWnd() == m_chat_input_edit) { int receiver = -1; // all players by default Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.h =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -41,7 +41,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void KeyPress(GG::Key key, Uint32 key_mods); + virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); void ChatMessage(int player_id, const std::string& msg); void LobbyUpdate(const MultiplayerLobbyData& lobby_data); Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -782,7 +782,7 @@ OptionsWnd::~OptionsWnd() {} -void OptionsWnd::KeyPress (GG::Key key, Uint32 key_mods) +void OptionsWnd::KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if (key == GG::GGK_ESCAPE || key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER) // Same behaviour as if "done" was pressed DoneClicked(); Modified: trunk/FreeOrion/UI/OptionsWnd.h =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/OptionsWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -36,7 +36,7 @@ //! \name Mutators //!@{ - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); //!@} private: Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -78,11 +78,11 @@ GG::FlatRectangle(ul.x, ul.y - 1, lr.x, ul.y, GG::CLR_ZERO, GG::CLR_WHITE, 1); } } - virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { - DragDropHere(pt, drag_drop_wnds, keys); + DragDropHere(pt, drag_drop_wnds, mod_keys); } - virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { if (drag_drop_wnds.size() == 1 && drag_drop_wnds.begin()->first->DragDropDataType() == "PRODUCTION_QUEUE_ROW") { m_drop_point = RowUnderPt(pt); Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -79,7 +79,7 @@ GG::FlatRectangle(ul.x, ul.y - 1, lr.x, ul.y, GG::CLR_ZERO, GG::CLR_WHITE, 1); } } - virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, GG::Flags<GG::ModKey> mod_keys) { if (drag_drop_wnds.size() == 1 && AllowedDropTypes().find(drag_drop_wnds.begin()->first->DragDropDataType()) != AllowedDropTypes().end()) { m_drop_point = RowUnderPt(pt); @@ -90,7 +90,7 @@ } else { m_drop_point = -1; } - ListBox::DragDropHere(pt, drag_drop_wnds, keys); + ListBox::DragDropHere(pt, drag_drop_wnds, mod_keys); } virtual void DragDropLeave() { Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -98,7 +98,7 @@ GG::GUI::GetGUI()->SetFocusWnd(m_player_name_edit); } -void ServerConnectWnd::KeyPress(GG::Key key, Uint32 key_mods) +void ServerConnectWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) { if (!m_ok_bn->Disabled() && (key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER)) { // Same behaviour as if "OK" was pressed OkClicked(); Modified: trunk/FreeOrion/UI/ServerConnectWnd.h =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.h 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/ServerConnectWnd.h 2007-08-09 04:26:56 UTC (rev 2219) @@ -27,7 +27,7 @@ //! \name Mutators //!@{ virtual void ModalInit (); - virtual void KeyPress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, GG::Flags<GG::ModKey> mod_keys); //!@} /** \name Accessors */ //@{ Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/FreeOrion/UI/SidePanel.cpp 2007-08-09 04:26:56 UTC (rev 2219) @@ -397,9 +397,9 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void LClick(const GG::Pt& pt, Uint32 keys); - virtual void RClick(const GG::Pt& pt, Uint32 keys); - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Refresh(); ///< updates panels, shows / hides colonize button, redoes layout of infopanels void Hilite(HilitingType ht); @@ -453,7 +453,7 @@ /** \name Accessors */ //@{ virtual bool InWindow(const GG::Pt& pt) const; - virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) int PlanetID() const {return m_planet_id;} int PlanetPanels() const {return m_planet_panels.size();} @@ -897,11 +897,11 @@ HumanClientApp::GetApp()->Orders().IssueOrder(new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(),planet->ID(),focus,false)); } -void SidePanel::PlanetPanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void SidePanel::PlanetPanel::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { GG::Wnd *parent; if ((parent=Parent())) - parent->MouseWheel(pt,move,keys); + parent->MouseWheel(pt,move,mod_keys); } bool SidePanel::PlanetPanel::InWindow(const GG::Pt& pt) const @@ -919,7 +919,7 @@ return m_hiliting; } -void SidePanel::PlanetPanel::LClick(const GG::Pt& pt, Uint32 keys) +void SidePanel::PlanetPanel::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (InPlanet(pt)) { @@ -1010,7 +1010,7 @@ } } -void SidePanel::PlanetPanel::RClick(const GG::Pt& pt, Uint32 keys) +void SidePanel::PlanetPanel::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { const Planet *planet = GetPlanet(); @@ -1066,7 +1066,7 @@ return UpperLeft() + GG::Pt(MAX_PLANET_DIAMETER, 0) <= pt && pt < LowerRight(); } -void SidePanel::PlanetPanelContainer::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) +void SidePanel::PlanetPanelContainer::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { if (m_vscroll) move < 0 ? m_vscroll->ScrollLineIncr() : m_vscroll->ScrollLineDecr(); Modified: trunk/FreeOrion/UI/SitRepPanel.cpp =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.cpp 2007-08-07 06:25:59 UTC (rev 2218) +++ trunk/... [truncated message content] |
From: <tz...@us...> - 2007-08-12 01:02:03
|
Revision: 2222 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2222&view=rev Author: tzlaine Date: 2007-08-11 18:02:02 -0700 (Sat, 11 Aug 2007) Log Message: ----------- Updated calls to GG::Clr's ctor with floating point values to use the GG::FloatClr() named ctor. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2007-08-11 04:08:28 UTC (rev 2221) +++ trunk/FreeOrion/UI/CUIControls.cpp 2007-08-12 01:02:02 UTC (rev 2222) @@ -1159,7 +1159,7 @@ void CUIToolBar::Render() { GG::Pt ul(UpperLeft()),lr(LowerRight()); - GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::Clr(0.0,0.0,0.0,0.8),GG::CLR_ZERO,0); + GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::FloatClr(0.0,0.0,0.0,0.8),GG::CLR_ZERO,0); } /////////////////////////////////////// Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2007-08-11 04:08:28 UTC (rev 2221) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2007-08-12 01:02:02 UTC (rev 2222) @@ -39,7 +39,9 @@ item_img_topic ( 24,48,24+40,48+40), item_img_arrow_split ( 65,40,65+64,40+64), rc_txt_empire ( 25, 6,500,19); - const GG::Clr border_color(0.5,0.5,0.5,1.0),bg_color(0.25,0.25,0.25,1.0),bg_item_color(0.15,0.15,0.15,1.0); + const GG::Clr border_color = GG::FloatClr(0.5,0.5,0.5,1.0); + const GG::Clr bg_color = GG::FloatClr(0.25,0.25,0.25,1.0); + const GG::Clr bg_item_color = GG::FloatClr(0.15,0.15,0.15,1.0); GG::Pt ul(UpperLeft()),lr(LowerRight()); GG::FlatRectangle(ul.x+1,ul.y+1,lr.x,lr.y,bg_color,border_color,2); Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2007-08-11 04:08:28 UTC (rev 2221) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2007-08-12 01:02:02 UTC (rev 2222) @@ -71,7 +71,7 @@ boost::shared_ptr<GG::Font> font=HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts()*1.3));; GG::Flags<GG::TextFormat> format = GG::FORMAT_CENTER | GG::FORMAT_TOP; - GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::Clr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,0); + GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::FloatClr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,0); glColor(GG::CLR_WHITE); int offset=m_co; Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2007-08-11 04:08:28 UTC (rev 2221) +++ trunk/FreeOrion/UI/SidePanel.cpp 2007-08-12 01:02:02 UTC (rev 2222) @@ -325,9 +325,9 @@ glRotated(100.0, -1.0, 0.0, 0.0); // make the poles upright, instead of head-on (we go a bit more than 90 degrees, to avoid some artifacting caused by the GLU-supplied texture coords) glRotated(axis_tilt, 0.0, 1.0, 0.0); // axis tilt double intensity = GetRotatingPlanetAmbientIntensity(); - GG::Clr ambient(intensity, intensity, intensity, 1.0); + GG::Clr ambient = GG::FloatClr(intensity, intensity, intensity, 1.0); intensity = GetRotatingPlanetDiffuseIntensity(); - GG::Clr diffuse(intensity, intensity, intensity, 1.0); + GG::Clr diffuse = GG::FloatClr(intensity, intensity, intensity, 1.0); RenderSphere(diameter / 2, ambient, diffuse, GG::CLR_WHITE, shininess, texture); @@ -549,7 +549,7 @@ void SetRotatingPlanetData(const RotatingPlanetData& planet_data) { m_planet_data = planet_data; - m_surface_texture = GG::GUI::GetGUI()->GetTexture(m_planet_data.filename); + m_surface_texture = ClientUI::GetTexture(ClientUI::ArtDir() / m_planet_data.filename, true); } private: @@ -1207,7 +1207,7 @@ void SidePanel::SystemResourceSummary::Render() { - GG::FlatRectangle(UpperLeft().x,UpperLeft().y,LowerRight().x,LowerRight().y,GG::Clr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,1); + GG::FlatRectangle(UpperLeft().x,UpperLeft().y,LowerRight().x,LowerRight().y,GG::FloatClr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,1); int farming=m_farming,mining=m_mining,trade=m_trade,research=m_research,industry=m_industry,defense=m_defense; @@ -1287,7 +1287,7 @@ SidePanel::SidePanel(int x, int y, int w, int h) : Wnd(x, y, w, h, GG::CLICKABLE), - m_system_name(new CUIDropDownList(MAX_PLANET_DIAMETER, 0, w-MAX_PLANET_DIAMETER, SystemNameFontSize(), 10*SystemNameFontSize(), GG::CLR_ZERO, GG::Clr(0.0, 0.0, 0.0, 0.5))), + m_system_name(new CUIDropDownList(MAX_PLANET_DIAMETER, 0, w-MAX_PLANET_DIAMETER, SystemNameFontSize(), 10*SystemNameFontSize(), GG::CLR_ZERO, GG::FloatClr(0.0, 0.0, 0.0, 0.5))), m_button_prev(new GG::Button(MAX_PLANET_DIAMETER+4,4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE)), m_button_next(new GG::Button(w-SystemNameFontSize()-4,4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE)), m_star_graphic(0), Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2007-08-11 04:08:28 UTC (rev 2221) +++ trunk/FreeOrion/universe/Universe.cpp 2007-08-12 01:02:02 UTC (rev 2222) @@ -2764,7 +2764,7 @@ color = colors[color_idx]; colors.erase(colors.begin() + color_idx); } else { // as a last resort, make up a color - color = GG::Clr(RandZeroToOne(), RandZeroToOne(), RandZeroToOne(), 1.0); + color = GG::FloatClr(RandZeroToOne(), RandZeroToOne(), RandZeroToOne(), 1.0); } int home_planet_id = homeworlds[i]; |
From: <geo...@us...> - 2007-08-19 10:08:19
|
Revision: 2231 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2231&view=rev Author: geoffthemedio Date: 2007-08-19 03:08:21 -0700 (Sun, 19 Aug 2007) Log Message: ----------- -Fixed bug (one char stringtable change) where the names of specials weren't appearing in tooltips -Tweaked layout of MultiIconValueIndicator Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-19 08:39:07 UTC (rev 2230) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-19 10:08:21 UTC (rev 2231) @@ -1236,7 +1236,7 @@ m_icons.push_back(new StatisticIcon(x, EDGE_PAD, ICON_WIDTH, ICON_WIDTH + ClientUI::Pts()*3/2, texture, ProjectedCurrentMeter(&m_obj, *it), 3, false, false)); AttachChild(m_icons.back()); - x += ICON_WIDTH; + x += ICON_WIDTH + EDGE_PAD; } if (!m_icons.empty()) Resize(GG::Pt(w, EDGE_PAD + ICON_WIDTH + ClientUI::Pts()*3/2 + EDGE_PAD)); Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2007-08-19 08:39:07 UTC (rev 2230) +++ trunk/FreeOrion/default/eng_stringtable.txt 2007-08-19 10:08:21 UTC (rev 2231) @@ -1130,7 +1130,7 @@ %1% Building <i>%2%</i> TT_SPECIAL -Special <i>%2%</i> +Special <i>%1%</i> TT_UNKNOWN Unknown |
From: <geo...@us...> - 2007-12-21 05:36:30
|
Revision: 2272 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2272&view=rev Author: geoffthemedio Date: 2007-12-20 21:36:33 -0800 (Thu, 20 Dec 2007) Log Message: ----------- -Got hull parser working Modified Paths: -------------- trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/default/ship_hulls.txt trunk/FreeOrion/universe/Parser.h trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/TopLevelParsers.cpp Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2007-12-21 05:36:33 UTC (rev 2272) @@ -22,9 +22,14 @@ GG::Wnd(0, 0, w, h, GG::ONTOP) { EnableChildClipping(true); - const PartTypeManager& manager = GetPartTypeManager(); - for (PartTypeManager::iterator it = manager.begin(); it != manager.end(); ++it) + const PartTypeManager& part_manager = GetPartTypeManager(); + for (PartTypeManager::iterator it = part_manager.begin(); it != part_manager.end(); ++it) Logger().errorStream() << "part: " << it->first; + + const HullTypeManager& hull_manager = GetHullTypeManager(); + for (HullTypeManager::iterator it = hull_manager.begin(); it != hull_manager.end(); ++it) + Logger().errorStream() << "hull: " << it->first; + } void DesignWnd::Reset() { Modified: trunk/FreeOrion/default/ship_hulls.txt =================================================================== --- trunk/FreeOrion/default/ship_hulls.txt 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/default/ship_hulls.txt 2007-12-21 05:36:33 UTC (rev 2272) @@ -1,23 +1,23 @@ -Hull - name = "SH_SMALL" - description = "SH_SMALL_DESC" - slots = 5 - mass = 100 - graphic = "ship_hull_icons/Small.png" - model = "ship_models/Small.mod" - -Hull - name = "SH_LARGE" - description = "SH_LARGE_DESC" - slots = 10 - mass = 300 - graphic = "ship_hull_icons/Large.png" - model = "ship_models/Large.mod" - -Hull - name = "SH_HUGE" - description = "SH_HUGE_DESC" - slots = 20 - mass = 1500 - graphic = "ship_hull_icons/Huge.png" - model = "ship_models/Huge.mod" +Hull + name = "SH_SMALL" + description = "SH_SMALL_DESC" + mass = 100 + speed = 80 + slots = 5 + graphic = "ship_hull_icons/Small.png" + +Hull + name = "SH_LARGE" + description = "SH_LARGE_DESC" + mass = 300 + speed = 50 + slots = 10 + graphic = "ship_hull_icons/Large.png" + +Hull + name = "SH_HUGE" + description = "SH_HUGE_DESC" + mass = 1500 + speed = 30 + slots = 20 + graphic = "ship_hull_icons/Huge.png" Modified: trunk/FreeOrion/universe/Parser.h =================================================================== --- trunk/FreeOrion/universe/Parser.h 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/universe/Parser.h 2007-12-21 05:36:33 UTC (rev 2272) @@ -30,8 +30,9 @@ class Special; class BuildingType; class Tech; +struct ItemSpec; class PartType; -struct ItemSpec; +class HullType; //////////////////////////////////////////////////////////// // Scanner // @@ -146,10 +147,23 @@ member9 graphic; }; +struct HullClosure : boost::spirit::closure<HullClosure, HullType*, std::string, std::string, double, double, + int, std::string> +{ + member1 this_; + member2 name; + member3 description; + member4 mass; + member5 speed; + member6 number_slots; + member7 graphic; +}; + extern boost::spirit::rule<Scanner, BuildingTypeClosure::context_t> building_type_p; extern boost::spirit::rule<Scanner, SpecialClosure::context_t> special_p; extern boost::spirit::rule<Scanner, NameClosure::context_t> tech_category_p; extern boost::spirit::rule<Scanner, TechClosure::context_t> tech_p; extern boost::spirit::rule<Scanner, PartClosure::context_t> part_p; +extern boost::spirit::rule<Scanner, HullClosure::context_t> hull_p; #endif // _Parser_h_ Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2007-12-21 05:36:33 UTC (rev 2272) @@ -27,6 +27,21 @@ }; const phoenix::function<store_part_type_impl> store_part_type_; + + struct store_hull_type_impl { + template <class T1, class T2> + struct result {typedef void type;}; + template <class T> + void operator()(std::map<std::string, HullType*>& hull_types, const T& hull_type) const { + if (hull_types.find(hull_type->Name()) != hull_types.end()) { + std::string error_str = "ERROR: More than one ship hull in ship_hulls.txt has the name " + hull_type->Name(); + throw std::runtime_error(error_str.c_str()); + } + hull_types[hull_type->Name()] = hull_type; + } + }; + + const phoenix::function<store_hull_type_impl> store_hull_type_; } //////////////////////////////////////////////// @@ -206,9 +221,26 @@ // HullType //////////////////////////////////////////////// HullType::HullType() : - m_name("generic hull type") + m_name("generic hull type"), + m_description("indescribable"), + m_mass(1.0), + m_speed(1.0), + m_number_slots(5), + m_effects(), + m_graphic("") {} +HullType::HullType(std::string name, std::string description, double mass, double speed, int num_slots, + std::string graphic) : + m_name(name), + m_description(description), + m_mass(mass), + m_speed(speed), + m_number_slots(num_slots), + m_effects(), + m_graphic(graphic) +{} + std::string HullType::Name() const { return m_name; } @@ -231,17 +263,17 @@ std::string filename = settings_dir + "ship_hulls.txt"; std::ifstream ifs(filename.c_str()); - //std::string input; - //std::getline(ifs, input, '\0'); - //ifs.close(); - //using namespace boost::spirit; - //using namespace phoenix; - //parse_info<const char*> result = - // parse(input.c_str(), - // as_lower_d[*part_p[store_part_type_(var(m_parts), arg1)]], - // skip_p); - //if (!result.full) - // ReportError(std::cerr, input.c_str(), result); + std::string input; + std::getline(ifs, input, '\0'); + ifs.close(); + using namespace boost::spirit; + using namespace phoenix; + parse_info<const char*> result = + parse(input.c_str(), + as_lower_d[*hull_p[store_hull_type_(var(m_hulls), arg1)]], + skip_p); + if (!result.full) + ReportError(std::cerr, input.c_str(), result); } const HullType* HullTypeManager::GetHullType(const std::string& name) const { Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/universe/ShipDesign.h 2007-12-21 05:36:33 UTC (rev 2272) @@ -97,6 +97,8 @@ public: /** \name Structors */ //@{ HullType(); + HullType(std::string name, std::string description, double mass, double speed, int num_slots, + std::string graphic); //@} /** \name Accessors */ //@{ @@ -232,12 +234,27 @@ void PartType::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(m_name); + & BOOST_SERIALIZATION_NVP(m_description) + & BOOST_SERIALIZATION_NVP(m_upgrade) + & BOOST_SERIALIZATION_NVP(m_class) + & BOOST_SERIALIZATION_NVP(m_mass) + & BOOST_SERIALIZATION_NVP(m_power) + & BOOST_SERIALIZATION_NVP(m_range) + & BOOST_SERIALIZATION_NVP(m_effects) + & BOOST_SERIALIZATION_NVP(m_graphic) + & BOOST_SERIALIZATION_NVP(m_battle_animation) } template <class Archive> void HullType::serialize(Archive& ar, const unsigned int version) { - ar & BOOST_SERIALIZATION_NVP(m_name); + ar & BOOST_SERIALIZATION_NVP(m_name) + & BOOST_SERIALIZATION_NVP(m_description) + & BOOST_SERIALIZATION_NVP(m_mass) + & BOOST_SERIALIZATION_NVP(m_speed) + & BOOST_SERIALIZATION_NVP(m_number_slots) + & BOOST_SERIALIZATION_NVP(m_effects) + & BOOST_SERIALIZATION_NVP(m_graphic) } template <class Archive> @@ -253,6 +270,4 @@ & BOOST_SERIALIZATION_NVP(m_3D_model); } -#endif // _ShipDesign_h_ - - +#endif // _ShipDesign_h_ \ No newline at end of file Modified: trunk/FreeOrion/universe/TopLevelParsers.cpp =================================================================== --- trunk/FreeOrion/universe/TopLevelParsers.cpp 2007-12-20 18:27:58 UTC (rev 2271) +++ trunk/FreeOrion/universe/TopLevelParsers.cpp 2007-12-21 05:36:33 UTC (rev 2272) @@ -18,6 +18,7 @@ rule<Scanner, NameClosure::context_t> tech_category_p; rule<Scanner, TechClosure::context_t> tech_p; rule<Scanner, PartClosure::context_t> part_p; +rule<Scanner, HullClosure::context_t> hull_p; struct EffectsGroupClosure : boost::spirit::closure<EffectsGroupClosure, Effect::EffectsGroup*, Condition::ConditionBase*, Condition::ConditionBase*, @@ -72,6 +73,8 @@ ParamLabel power_label("power"); ParamLabel range_label("range"); ParamLabel mass_label("mass"); + ParamLabel speed_label("speed"); + ParamLabel slots_label("slots"); Effect::EffectsGroup* const NULL_EFF = 0; Condition::ConditionBase* const NULL_COND = 0; @@ -161,7 +164,18 @@ [part_p.this_ = new_<PartType>(part_p.name, part_p.description, part_p.part_class, part_p.upgrade, part_p.mass, part_p.power, part_p.range, part_p.graphic)]; - return true; + hull_p = + (str_p("hull") + >> name_label >> name_p[hull_p.name = arg1] + >> description_label >> name_p[hull_p.description = arg1] + >> mass_label >> real_p[hull_p.mass = arg1] + >> speed_label >> real_p[hull_p.speed = arg1] + >> slots_label >> int_p[hull_p.number_slots = arg1] + >> graphic_label >> file_name_p[hull_p.graphic = arg1]) + [hull_p.this_ = new_<HullType>(hull_p.name, hull_p.description, hull_p.mass, hull_p.speed, + hull_p.number_slots, hull_p.graphic)]; + + return true; } bool dumy = Init(); } |
From: <geo...@us...> - 2007-12-24 22:20:38
|
Revision: 2279 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2279&view=rev Author: geoffthemedio Date: 2007-12-24 14:20:41 -0800 (Mon, 24 Dec 2007) Log Message: ----------- -Added basic ship design UI widgets to DesignWnd. Can select a hull and put parts in slots, and name and describe design. Adding ship causes it to appear on the ProductionWnd and be buildable. Currently MapWnd keyboard accelerators aren't disabled on the DesignWnd, so some letters aren't typable in names and descriptions. -Fixed code that determines if a design is available so that empty slots aren't considered to be unavailable parts. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/UI/DesignWnd.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2007-12-24 05:49:04 UTC (rev 2278) +++ trunk/FreeOrion/Empire/Empire.cpp 2007-12-24 22:20:41 UTC (rev 2279) @@ -758,9 +758,13 @@ // design is kept, but still need to verify that it is buildable at this time. Part or hull tech // requirements might prevent it from being built. const std::vector<std::string>& parts = design->Parts(); - for (std::vector<std::string>::const_iterator it = parts.begin(); it != parts.end(); ++it) - if (!ShipPartAvailable(*it)) + for (std::vector<std::string>::const_iterator it = parts.begin(); it != parts.end(); ++it) { + std::string name = *it; + if (name == "") + continue; // empty slot can't be unavailable + if (!ShipPartAvailable(name)) return false; + } if (!ShipHullAvailable(design->Hull())) return false; Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2007-12-24 05:49:04 UTC (rev 2278) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2007-12-24 22:20:41 UTC (rev 2279) @@ -14,27 +14,55 @@ #include <boost/format.hpp> #include <cmath> +using boost::lexical_cast; +namespace { + struct SelectPartFunctor { + SelectPartFunctor(DesignWnd* design_wnd, int slot) : m_design_wnd(design_wnd), m_slot(slot) {} + void operator()(int index) {m_design_wnd->PartSelected(index, m_slot);} + DesignWnd* const m_design_wnd; + int m_slot; + }; +} + ////////////////////////////////////////////////// // DesignWnd // ////////////////////////////////////////////////// DesignWnd::DesignWnd(int w, int h) : - GG::Wnd(0, 0, w, h, GG::ONTOP), - m_add_design_button(0) + GG::Wnd(0, 0, w, h, GG::ONTOP | GG::CLICKABLE), + m_add_design_button(0), + m_hulls_list(0), + m_design_name_edit(0), + m_design_description_edit(0), + m_parts_lists(), + m_selected_hull(""), + m_selected_parts() { EnableChildClipping(true); - const PartTypeManager& part_manager = GetPartTypeManager(); - for (PartTypeManager::iterator it = part_manager.begin(); it != part_manager.end(); ++it) - Logger().debugStream() << "part: " << it->first; - - const HullTypeManager& hull_manager = GetHullTypeManager(); - for (HullTypeManager::iterator it = hull_manager.begin(); it != hull_manager.end(); ++it) - Logger().debugStream() << "hull: " << it->first; - m_add_design_button = new CUIButton(100, 100, 120, "Add Test Design"); AttachChild(m_add_design_button); GG::Connect(m_add_design_button->ClickedSignal, &DesignWnd::AddDesign, this); + + m_design_name_edit = new CUIEdit(100, 125, 150, "ShipDesign Name"); + AttachChild(m_design_name_edit); + + m_design_description_edit = new CUIEdit(100, 150, 150, "ShipDesign Description"); + AttachChild(m_design_description_edit); + + GG::Connect(this->DesignChangedSignal, &DesignWnd::DesignChanged, this); + + const int DROPLIST_HEIGHT = ClientUI::Pts() + 4; + m_hulls_list = new CUIDropDownList(300, 150, 200, DROPLIST_HEIGHT, 100); + AttachChild(m_hulls_list); + GG::Connect(m_hulls_list->SelChangedSignal, &DesignWnd::HullSelected, this); + + const HullTypeManager& hull_manager = GetHullTypeManager(); + for (HullTypeManager::iterator it = hull_manager.begin(); it != hull_manager.end(); ++it) { + const std::string& hull_name = it->first; + m_hulls_list->Insert(new CUISimpleDropDownListRow(hull_name)); + } + m_hulls_list->Select(m_hulls_list->NumRows() - 1); } void DesignWnd::Reset() { @@ -70,7 +98,7 @@ bool DesignWnd::ValidateCurrentDesign() { // TODO: determine if design specified in UI is valid - return true; + return ShipDesign::ValidDesign(m_selected_hull, m_selected_parts); } void DesignWnd::AddDesign() { @@ -78,21 +106,19 @@ const Empire* empire = Empires().Lookup(empire_id); if (!empire) return; - // get currently selected parts and hull, etc. - std::string hull = "SH_SMALL"; - std::vector<std::string> parts; - parts.push_back("SR_LASER"); - parts.push_back("SR_LASER"); - parts.push_back("SR_ION_CANNON"); - - if (!ShipDesign::ValidDesign(hull, parts)) { + if (!ShipDesign::ValidDesign(m_selected_hull, m_selected_parts)) { Logger().errorStream() << "DesignWnd::AddDesign tried to add an invalid ShipDesign"; return; } + // make sure name isn't blank. TODO: prevent duplicate names? + std::string name = m_design_name_edit->WindowText(); + if (name == "") + name = "User ShipDesign"; + // create design from stuff chosen in UI - ShipDesign* design = new ShipDesign("procedural dummy design", "generated for testing purposes", - empire_id, CurrentTurn(), hull, parts, "misc/base1.png", "some model"); + ShipDesign* design = new ShipDesign(name, m_design_description_edit->WindowText(), empire_id, CurrentTurn(), + m_selected_hull, m_selected_parts, "misc/base1.png", "some model"); if (!design) { Logger().errorStream() << "DesignWnd::AddDesign failed to create a new ShipDesign object"; @@ -101,4 +127,127 @@ int new_design_id = HumanClientApp::GetApp()->GetNewDesignID(); HumanClientApp::GetApp()->Orders().IssueOrder(new ShipDesignOrder(empire_id, new_design_id, *design)); + + Logger().errorStream() << "Added new design: " << design->Name(); + + const Universe& universe = GetUniverse(); + for (Universe::ship_design_iterator it = universe.beginShipDesigns(); it != universe.endShipDesigns(); ++it) + Logger().errorStream() << "Shipdesign: " << it->second->Name(); } + +void DesignWnd::HullSelected(int index) { + // need to convert index in list of hulls to a particular hull name. + + // if index is -1, no hull was selected + if (index < 0) { + SetDesignHull(""); + return; + } + + // an actual row was selected, so need to figure out which hull the row index corresponds to + std::string hull = ""; + const HullTypeManager& manager = GetHullTypeManager(); + HullTypeManager::iterator it = manager.begin(); + int n = 0; + // loop until selected hull is reached. assuming list is sorted the same way as the hulls in the manager. + while (n < index && it != manager.end()) { + ++n; + ++it; + } + if (it != manager.end()) + hull = it->first; + + SetDesignHull(hull); +} + +void DesignWnd::SetDesignHull(const std::string& hull) { + m_selected_hull = hull; + + int num_slots = 0; + + // get number of slots needed for this hull. (defaults to zero if hull is invalid) + const HullTypeManager& hull_manager = GetHullTypeManager(); + const HullType* hull_type = hull_manager.GetHullType(hull); + if (hull_type) + num_slots = hull_type->NumberSlots(); + + // remove extra slot droplists + while (static_cast<int>(m_parts_lists.size()) > num_slots) { + CUIDropDownList* list = m_parts_lists.back(); + delete list; + m_parts_lists.pop_back(); + m_selected_parts.pop_back(); + } + + // add extra slot drop lists to meet required number + const PartTypeManager& part_manager = GetPartTypeManager(); + + int n = static_cast<int>(m_parts_lists.size()); // used as index to set selected part, and to determine y positions of additional lists to be created + const int DROPLIST_HEIGHT = ClientUI::Pts() + 4; + + while (static_cast<int>(m_parts_lists.size()) < num_slots) { + // create new list + CUIDropDownList* list = new CUIDropDownList(500, 150 + n*DROPLIST_HEIGHT*3/2, 200, DROPLIST_HEIGHT, 200); + m_parts_lists.push_back(list); + AttachChild(list); + GG::Connect(list->SelChangedSignal, SelectPartFunctor(this, n)); + + // populate new list with parts + for (PartTypeManager::iterator it = part_manager.begin(); it != part_manager.end(); ++it) { + const std::string& part_name = it->first; + list->Insert(new CUISimpleDropDownListRow(part_name)); + } + + // select no part by default + m_selected_parts.push_back(""); + list->Select(-1); + + ++n; + } + DesignChangedSignal(); +} + +void DesignWnd::DoLayout() { +} + +void DesignWnd::PartSelected(int index, int slot) { + if (slot >= static_cast<int>(m_parts_lists.size()) || slot < 0) + throw std::invalid_argument("DesignWnd::PartSelected called with invalid slot number: " + lexical_cast<std::string>(slot)); + if (index >= static_cast<int>(m_parts_lists[slot]->NumRows())) + throw std::invalid_argument("DesignWnd::PartSelected called with invalid part number: " + lexical_cast<std::string>(slot)); + + // need to convert index in list of hulls to a particular hull name. + + // if index is -1, no hull was selected + if (index < 0) { + SetDesignPart("", slot); + return; + } + + // an actual row was selected, so need to figure out which hull the row index corresponds to + std::string part = ""; + const PartTypeManager& manager = GetPartTypeManager(); + PartTypeManager::iterator it = manager.begin(); + int n = 0; + // loop until selected part is reached. assuming list is sorted the same way as the hulls in the manager. + while (n < index && it != manager.end()) { + ++n; + ++it; + } + if (it != manager.end()) + part = it->first; + + SetDesignPart(part, slot); +} + +void DesignWnd::SetDesignPart(const std::string& part, int slot) { + m_selected_parts.at(slot) = part; + DesignChangedSignal(); +} + +void DesignWnd::DesignChanged() { + if (ValidateCurrentDesign()) + m_add_design_button->Disable(false); + else + m_add_design_button->Disable(); +} \ No newline at end of file Modified: trunk/FreeOrion/UI/DesignWnd.h =================================================================== --- trunk/FreeOrion/UI/DesignWnd.h 2007-12-24 05:49:04 UTC (rev 2278) +++ trunk/FreeOrion/UI/DesignWnd.h 2007-12-24 22:20:41 UTC (rev 2279) @@ -4,12 +4,18 @@ #include "CUIWnd.h" +class CUIEdit; class CUIButton; +class CUIDropDownList; class ShipDesign; /** Lets the player design ships */ class DesignWnd : public GG::Wnd { public: + //! \name Signal Types //!@{ + typedef boost::signal<void ()> DesignChangedSignalType; //!< emitted when the design is changed + //@} + /** \name Structors */ //@{ DesignWnd(int w, int h); //@} @@ -19,13 +25,34 @@ void Sanitize(); void Render(); + + void HullSelected(int index); ///< called when a hull is selected in hull droplist + void PartSelected(int index, int slot); ///< called when a part is selected in one of the part droplists + + mutable DesignChangedSignalType DesignChangedSignal; //@} private: + void DoLayout(); + + bool ValidateCurrentDesign(); ///< returns true if ship currently being designed is complete and can be added to the empire and universe + void AddDesign(); - bool ValidateCurrentDesign(); ///< returns true if ship currently being designed is complete and can be added to the empire and universe - CUIButton* m_add_design_button; + void SetDesignHull(const std::string& hull); ///< sets m_selected_hull and creates appropriate set of part droplists + void SetDesignPart(const std::string& part, int slot); ///< sets m_selected_parts entry as indicated by \a slot + + void DesignChanged(); ///< called when design is changed. disables add design button if design is invalid + + CUIDropDownList* m_hulls_list; + std::vector<CUIDropDownList*> m_parts_lists; + + CUIButton* m_add_design_button; + CUIEdit* m_design_name_edit; + CUIEdit* m_design_description_edit; + + std::string m_selected_hull; + std::vector<std::string> m_selected_parts; }; #endif // _DesignWnd_h_ Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-12-24 05:49:04 UTC (rev 2278) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-12-24 22:20:41 UTC (rev 2279) @@ -1774,8 +1774,10 @@ m_research_wnd->Hide(); HumanClientApp::GetApp()->MoveDown(m_research_wnd); } - if (m_design_wnd->Visible()) + if (m_design_wnd->Visible()) { m_design_wnd->Hide(); + HumanClientApp::GetApp()->MoveDown(m_design_wnd); + } if (m_production_wnd->Visible()) { m_production_wnd->Hide(); if (m_in_production_view_mode) { @@ -1915,6 +1917,8 @@ // show the design window m_design_wnd->Show(); GG::GUI::GetGUI()->MoveUp(m_design_wnd); + GG::GUI::GetGUI()->SetFocusWnd(m_design_wnd); + //DisableAlphaNumAccels(); // so users can type names and descriptions (commented out until I can figure out how to make doing this play nice with the other ToggleSubscreen functions) m_design_wnd->Reset(); } return true; @@ -2261,13 +2265,6 @@ #endif } -/* Disables keyboard accelerators that use an alphanumeric key - without modifiers. This is useful if a keyboard input is required, - so that the keys aren't interpreted as an accelerator. - @note Repeated calls of DisableAlphaNumAccels have to be followed by the - same number of calls to EnableAlphaNumAccels to re-enable the - accelerators. -*/ void MapWnd::DisableAlphaNumAccels() { for (GG::GUI::const_accel_iterator i = GG::GUI::GetGUI()->accel_begin(); @@ -2286,7 +2283,6 @@ } } -// Re-enable accelerators disabled by DisableAlphaNumAccels void MapWnd::EnableAlphaNumAccels() { for (std::set<GG::Key>::iterator i = m_disabled_accels_list.begin(); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2007-12-24 05:49:04 UTC (rev 2278) +++ trunk/FreeOrion/UI/MapWnd.h 2007-12-24 22:20:41 UTC (rev 2279) @@ -172,7 +172,6 @@ void UniverseObjectDeleted(const UniverseObject *obj); bool ReturnToMap(); bool OpenChatWindow(); - bool OpenConsoleWindow(); bool EndTurn(); bool ToggleSitRep(); bool ToggleResearch(); @@ -191,9 +190,16 @@ bool ZoomToNextFleet(); void SetAccelerators(); + void RemoveAccelerators(); + /** Disables keyboard accelerators that use an alphanumeric key without modifiers. This is useful if a + * keyboard input is required, so that the keys aren't interpreted as an accelerator. + * @note Repeated calls of DisableAlphaNumAccels have to be followed by the same number of calls to + * EnableAlphaNumAccels to re-enable the accelerators. + */ void DisableAlphaNumAccels(); - void EnableAlphaNumAccels(); + void EnableAlphaNumAccels(); //!< Re-enable accelerators disabled by DisableAlphaNumAccels + void CloseAllPopups(); void HideAllPopups(); void ShowAllPopups(); |