From: <geo...@us...> - 2008-12-12 07:42:33
|
Revision: 2699 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2699&view=rev Author: geoffthemedio Date: 2008-12-12 07:42:27 +0000 (Fri, 12 Dec 2008) Log Message: ----------- Updated DejaVu fonts and license to version 2.27 Modified Paths: -------------- trunk/FreeOrion/default/DejaVuSans-Bold.ttf trunk/FreeOrion/default/DejaVuSans-BoldOblique.ttf trunk/FreeOrion/default/DejaVuSans-Oblique.ttf trunk/FreeOrion/default/DejaVuSans.ttf Added Paths: ----------- trunk/FreeOrion/default/LICENSE.DejaVu Removed Paths: ------------- trunk/FreeOrion/License.DejaVu trunk/FreeOrion/License.Vera Deleted: trunk/FreeOrion/License.DejaVu =================================================================== --- trunk/FreeOrion/License.DejaVu 2008-12-12 06:48:17 UTC (rev 2698) +++ trunk/FreeOrion/License.DejaVu 2008-12-12 07:42:27 UTC (rev 2699) @@ -1,4 +0,0 @@ -The DejaVu fonts are based on Bitstream Vera. See License.Vera for -license terms of Vera. - -The DejaVu changes are in the public domain. Deleted: trunk/FreeOrion/License.Vera =================================================================== --- trunk/FreeOrion/License.Vera 2008-12-12 06:48:17 UTC (rev 2698) +++ trunk/FreeOrion/License.Vera 2008-12-12 07:42:27 UTC (rev 2699) @@ -1,47 +0,0 @@ -Copyright for Vera*.ttf: - - Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream - Vera is a trademark of Bitstream, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of the fonts accompanying this license ("Fonts") and associated - documentation files (the "Font Software"), to reproduce and distribute - the Font Software, including without limitation the rights to use, - copy, merge, publish, distribute, and/or sell copies of the Font - Software, and to permit persons to whom the Font Software is furnished - to do so, subject to the following conditions: - - The above copyright and trademark notices and this permission notice - shall be included in all copies of one or more of the Font Software - typefaces. - - The Font Software may be modified, altered, or added to, and in - particular the designs of glyphs or characters in the Fonts may be - modified and additional glyphs or characters may be added to the - Fonts, only if the fonts are renamed to names not containing either - the words "Bitstream" or the word "Vera". - - This License becomes null and void to the extent applicable to Fonts - or Font Software that has been modified and is distributed under the - "Bitstream Vera" names. - - The Font Software may be sold as part of a larger software package but - no copy of one or more of the Font Software typefaces may be sold by - itself. - - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL - BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, - OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR - OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT - SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - - Except as contained in this notice, the names of Gnome, the Gnome - Foundation, and Bitstream Inc., shall not be used in advertising or - otherwise to promote the sale, use or other dealings in this Font - Software without prior written authorization from the Gnome Foundation - or Bitstream Inc., respectively. For further information, contact: - fonts at gnome dot org. Modified: trunk/FreeOrion/default/DejaVuSans-Bold.ttf =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/DejaVuSans-BoldOblique.ttf =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/DejaVuSans-Oblique.ttf =================================================================== (Binary files differ) Modified: trunk/FreeOrion/default/DejaVuSans.ttf =================================================================== (Binary files differ) Added: trunk/FreeOrion/default/LICENSE.DejaVu =================================================================== --- trunk/FreeOrion/default/LICENSE.DejaVu (rev 0) +++ trunk/FreeOrion/default/LICENSE.DejaVu 2008-12-12 07:42:27 UTC (rev 2699) @@ -0,0 +1,99 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ |
From: <geo...@us...> - 2008-12-14 00:16:40
|
Revision: 2700 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2700&view=rev Author: geoffthemedio Date: 2008-12-14 00:16:37 +0000 (Sun, 14 Dec 2008) Log Message: ----------- -Fixed server-crashing pseudo-bug where pressing CTRL + r on the map screen in a non-release build would request a regression test from the server using a Message::DEBUG that wasn't recognized by the server, which then terminated the player's connection -Removed unnecessary #includes and using from Fleet.cpp -Changed how MapWnd keyboard accelerators are set and removed, so that the list of them doesn't have to be duplicated in code. MapWnd::RemoveAccelerators now just iterates through the accelerators in the GUI and disconnects them all. -Stored keyboard accelerator signal connections in a set in MapWnd so that they can be disconnected later -Moved keyboard accelerator connection-making into a separate function in MapWnd, which will make it easier to move the definition of these accelerator signal connections into the GUI later, in that it will be easier to reset them without creating a new MapWnd object (since the signal connections were previously right in the constructor) Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Fleet.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-12 07:42:27 UTC (rev 2699) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-12-14 00:16:37 UTC (rev 2700) @@ -377,46 +377,8 @@ m_backgrounds.clear(); m_bg_scroll_rate.clear(); + ConnectKeyboardAcceleratorSignals(); - // connect keyboard accelerators - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_ESCAPE), &MapWnd::ReturnToMap, 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::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), &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_F5), &MapWnd::ToggleDesign, 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), &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), &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), &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::MOD_KEY_CTRL), &RequestRegressionTestDump); -#endif - g_chat_edit_history.push_front(""); #if TEST_BROWSE_INFO @@ -2926,6 +2888,53 @@ return true; } +void MapWnd::ConnectKeyboardAcceleratorSignals() +{ + // disconnect and clear old signals + for (std::set<boost::signals::connection>::iterator it = m_keyboard_accelerator_signals.begin(); it != m_keyboard_accelerator_signals.end(); ++it) + it->disconnect(); + m_keyboard_accelerator_signals.clear(); + + // connect new signals + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_ESCAPE), &MapWnd::ReturnToMap, 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::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), &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_F5), &MapWnd::ToggleDesign, 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), &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), &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), &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 + // Previously-used but presently ignored development-only key combo for dumping + // ValueRef, Condition, and Effect regression tests using the current Universe + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r, GG::MOD_KEY_CTRL), &RequestRegressionTestDump); +#endif +} + void MapWnd::SetAccelerators() { GG::GUI::GetGUI()->SetAccelerator(GG::GGK_ESCAPE); @@ -2939,6 +2948,7 @@ 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_F5); GG::GUI::GetGUI()->SetAccelerator(GG::GGK_F10); GG::GUI::GetGUI()->SetAccelerator(GG::GGK_s); @@ -2966,40 +2976,12 @@ void MapWnd::RemoveAccelerators() { - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_ESCAPE); - - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_RETURN); - GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_KP_ENTER); - - 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); - 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); - 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); - 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); - 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::MOD_KEY_CTRL); -#endif + GG::GUI::const_accel_iterator i = GG::GUI::GetGUI()->accel_begin(); + while (i != GG::GUI::GetGUI()->accel_end()) { + GG::GUI::GetGUI()->RemoveAccelerator(i->first, i->second); + i = GG::GUI::GetGUI()->accel_begin(); + } + m_disabled_accels_list.clear(); } void MapWnd::DisableAlphaNumAccels() Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2008-12-12 07:42:27 UTC (rev 2699) +++ trunk/FreeOrion/UI/MapWnd.h 2008-12-14 00:16:37 UTC (rev 2700) @@ -204,9 +204,10 @@ bool ZoomToPrevFleet(); bool ZoomToNextFleet(); - void SetAccelerators(); + void ConnectKeyboardAcceleratorSignals(); //!< connects signals from keyboard accelerators to various GUI responses + void SetAccelerators(); //!< tells the GUI which keypress combinations to track and emit signals for when they occur + void RemoveAccelerators(); //!< tells GUI to stop emitting signals for keypresses - 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 @@ -241,6 +242,7 @@ std::vector<FleetButton*> m_moving_fleet_buttons; //!< moving fleets in the main map (SystemIcons contain stationary fleet buttons) std::vector<boost::signals::connection> m_fleet_state_change_signals; + std::set<boost::signals::connection> m_keyboard_accelerator_signals; //!< signals connecting keyboard accelerators to GUI responses std::map<const Fleet*, MovementLineData> m_fleet_lines; //!< lines used for moving fleets in the main map std::map<const Fleet*, Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-12-12 07:42:27 UTC (rev 2699) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-12-14 00:16:37 UTC (rev 2700) @@ -202,6 +202,9 @@ case Message::HUMAN_PLAYER_CHAT: m_fsm.process_event(PlayerChat(msg, player_connection)); break; case Message::REQUEST_NEW_OBJECT_ID: m_fsm.process_event(RequestObjectID(msg, player_connection)); break; case Message::REQUEST_NEW_DESIGN_ID: m_fsm.process_event(RequestDesignID(msg, player_connection)); break; +#ifndef FREEORION_RELEASE + case Message::DEBUG: break; +#endif default: m_log_category.errorStream() << "ServerApp::HandleMessage : Received an unknown message type \"" << msg.Type() << "\". Terminating connection."; @@ -216,6 +219,9 @@ case Message::HOST_SP_GAME: m_fsm.process_event(HostSPGame(msg, player_connection)); break; case Message::HOST_MP_GAME: m_fsm.process_event(HostMPGame(msg, player_connection)); break; case Message::JOIN_GAME: m_fsm.process_event(JoinGame(msg, player_connection)); break; +#ifndef FREEORION_RELEASE + case Message::DEBUG: break; +#endif default: m_log_category.errorStream() << "ServerApp::HandleNonPlayerMessage : Received an invalid message type \"" << msg.Type() << "\" for a non-player Message. Terminating connection."; Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-12-12 07:42:27 UTC (rev 2699) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-12-14 00:16:37 UTC (rev 2700) @@ -8,13 +8,9 @@ #include "../Empire/EmpireManager.h" #include <boost/lexical_cast.hpp> -using boost::lexical_cast; -#include <stdexcept> #include <cmath> -#include <boost/format.hpp> - namespace { const double MAX_SHIP_SPEED = 500.0; // max allowed speed of ship movement const double FLEET_MOVEMENT_EPSILON = 1.0e-1; // how close a fleet needs to be to a system to have arrived in the system |
From: <geo...@us...> - 2008-12-14 00:50:29
|
Revision: 2701 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2701&view=rev Author: geoffthemedio Date: 2008-12-14 00:50:23 +0000 (Sun, 14 Dec 2008) Log Message: ----------- Added chat message extraction for AI players; previously incoming chat messages weren't being propagated to the Python responder function Modified Paths: -------------- trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/default/AI/FreeOrionAI.py Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2008-12-14 00:16:37 UTC (rev 2700) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2008-12-14 00:50:23 UTC (rev 2701) @@ -185,6 +185,7 @@ } case Message::HUMAN_PLAYER_CHAT: + m_AI->HandleChatMessage(msg.SendingPlayer(), msg.Text()); break; default: { Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2008-12-14 00:16:37 UTC (rev 2700) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2008-12-14 00:50:23 UTC (rev 2701) @@ -78,7 +78,7 @@ # called when this player receives a chat message. senderID is the player who sent the message, and # messageText is the text of the sent message def handleChatMessage(senderID, messageText): - print "Received chat message - ignoring it" + print "Received chat message from " + str(senderID) + " that says: " + messageText + " - ignoring it" # called once per turn to tell the Python AI to generate and issue orders to control its empire. |
From: <geo...@us...> - 2008-12-14 17:36:18
|
Revision: 2703 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2703&view=rev Author: geoffthemedio Date: 2008-12-14 17:36:10 +0000 (Sun, 14 Dec 2008) Log Message: ----------- Option to enable / disable background starfields by OndrejR. (Makes a surprisingly large impact on my FPS.) Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/default/credits.xml trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-14 05:37:00 UTC (rev 2702) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-12-14 17:36:10 UTC (rev 2703) @@ -80,6 +80,7 @@ db.Add("UI.chat-hide-interval", "OPTIONS_DB_UI_CHAT_HIDE_INTERVAL", 10, RangedValidator<int>(0, 3600)); db.Add("UI.chat-edit-history", "OPTIONS_DB_UI_CHAT_EDIT_HISTORY", 50, RangedValidator<int>(0, 1000)); db.Add("UI.galaxy-gas-background", "OPTIONS_DB_GALAXY_MAP_GAS", true, Validator<bool>()); + db.Add("UI.galaxy-starfields", "OPTIONS_DB_GALAXY_MAP_STARFIELDS", true, Validator<bool>()); db.Add("UI.optimized-system-rendering", "OPTIONS_DB_OPTIMIZED_SYSTEM_RENDERING", true, Validator<bool>()); db.Add("UI.starlane-thickness", "OPTIONS_DB_STARLANE_THICKNESS", 2.5, RangedValidator<double>(0.1, 15.0)); db.Add("UI.resource-starlane-colouring", "OPTIONS_DB_RESOURCE_STARLANE_COLOURING", true, Validator<bool>()); @@ -1760,6 +1761,9 @@ void MapWnd::RenderStarfields() { + if (!GetOptionsDB().Get<bool>("UI.galaxy-starfields")) + return; + glColor3d(1.0, 1.0, 1.0); GG::Pt origin_offset = Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2008-12-14 05:37:00 UTC (rev 2702) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2008-12-14 17:36:10 UTC (rev 2703) @@ -731,6 +731,7 @@ EndSection(); BeginSection(UserString("OPTIONS_GALAXY_MAP")); BoolOption("UI.galaxy-gas-background", UserString("OPTIONS_GALAXY_MAP_GAS")); + BoolOption("UI.galaxy-starfields", UserString("OPTIONS_GALAXY_MAP_STARFIELDS")); BoolOption("UI.optimized-system-rendering", UserString("OPTIONS_OPTIMIZED_SYSTEM_RENDERING")); DoubleOption("UI.starlane-thickness", UserString("OPTIONS_STARLANE_THICKNESS")); BoolOption("UI.resource-starlane-colouring", UserString("OPTIONS_RESOURCE_STARLANE_COLOURING")); Modified: trunk/FreeOrion/default/credits.xml =================================================================== --- trunk/FreeOrion/default/credits.xml 2008-12-14 05:37:00 UTC (rev 2702) +++ trunk/FreeOrion/default/credits.xml 2008-12-14 17:36:10 UTC (rev 2703) @@ -21,6 +21,7 @@ <PERSON name="Karl Chen" nick="quarl" task="Programming"/> <PERSON name="Eliot Eshelman" nick="igrok" task="Programming"/> <PERSON name="stride" nick="" task="Programming"/> + <PERSON name="OndrejR" nick="" task="Programming"/> </GROUP> <GROUP name ="GAMEDESIGN"> <PERSON name="Samuel Knowlton" nick="Aquitaine" task="Game Design"/> Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-12-14 05:37:00 UTC (rev 2702) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-12-14 17:36:10 UTC (rev 2703) @@ -153,6 +153,9 @@ OPTIONS_DB_GALAXY_MAP_GAS Render gassy substance around systems to give galaxy shape. May slow rendering on older systems. +OPTIONS_DB_GALAXY_MAP_STARFIELDS +Render starsfields around systems. May slow rendering on older systems. + OPTIONS_DB_OPTIMIZED_SYSTEM_RENDERING Use fancy optimized OpenGL 1.5 rendering for systems on galaxy map. May crash on older graphics hardware. @@ -872,6 +875,9 @@ OPTIONS_GALAXY_MAP_GAS Galaxy map gas rendering +OPTIONS_GALAXY_MAP_STARFIELDS +Galaxy map starfields rendering + OPTIONS_OPTIMIZED_SYSTEM_RENDERING Optimized system rendering |
From: <geo...@us...> - 2008-12-23 06:51:23
|
Revision: 2707 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2707&view=rev Author: geoffthemedio Date: 2008-12-23 06:51:19 +0000 (Tue, 23 Dec 2008) Log Message: ----------- -Added OndrejR's full name to credits -Committed modified version of his AddPart patch, so that double-clicking a part on the Design screen attempts to add the clicked part to the current design, if possible Modified Paths: -------------- trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/default/credits.xml Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-23 05:55:35 UTC (rev 2706) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-23 06:51:19 UTC (rev 2707) @@ -1668,7 +1668,16 @@ } void DesignWnd::MainPanel::AddPart(const PartType* part) { - // TODO: IMPLEMENT THIS + for (unsigned int i = 0; i < m_slots.size(); ++i) { + const ShipSlotType slot_type = m_slots[i]->SlotType(); + const PartType* part_type = m_slots[i]->GetPart(); + + if (!part_type && part && part->CanMountInSlotType(slot_type)) { + SetPart(part, i); + return; + } + } + Logger().debugStream() << "DesignWnd::MainPanel::AddPart(" << (part ? part->Name() : "no part") << ") couldn't find a slot for the part"; } void DesignWnd::MainPanel::ClearParts() { Modified: trunk/FreeOrion/default/credits.xml =================================================================== --- trunk/FreeOrion/default/credits.xml 2008-12-23 05:55:35 UTC (rev 2706) +++ trunk/FreeOrion/default/credits.xml 2008-12-23 06:51:19 UTC (rev 2707) @@ -21,7 +21,7 @@ <PERSON name="Karl Chen" nick="quarl" task="Programming"/> <PERSON name="Eliot Eshelman" nick="igrok" task="Programming"/> <PERSON name="stride" nick="" task="Programming"/> - <PERSON name="OndrejR" nick="" task="Programming"/> + <PERSON name="Ondrej Riha" nick="OndrejR" task="Programming"/> </GROUP> <GROUP name ="GAMEDESIGN"> <PERSON name="Samuel Knowlton" nick="Aquitaine" task="Game Design"/> |
From: <geo...@us...> - 2008-12-24 19:57:04
|
Revision: 2708 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2708&view=rev Author: geoffthemedio Date: 2008-12-24 19:57:00 +0000 (Wed, 24 Dec 2008) Log Message: ----------- -Made SitRep, Research, Production, Design and Menu buttons on map screen highlight when appropriate screen or popup is shown -Fixed some line endings -Removed some debug output from ServerApp.cpp -Removed some unused code from Empire.cpp -Tweaked DesignWnd::MainPanel::AddPart a bit more Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-12-23 06:51:19 UTC (rev 2707) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-12-24 19:57:00 UTC (rev 2708) @@ -1904,14 +1904,9 @@ ship->GetMeter(METER_FUEL)->SetCurrent(Meter::METER_MAX); // ensures ship starts with some fuel. will be clamped to max value after effects are applied to set that max value appropriately 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); // rename fleet, given its id and the ship that is in it @@ -1940,9 +1935,9 @@ m_production_queue.erase(*it); } + // update minerals stockpile. TODO: Update this to work like food distribution and only stockpile within the group of resource- + // sharing systems that have access to the stockpile. m_resource_pools[RE_MINERALS]->SetStockpile(m_resource_pools[RE_MINERALS]->TotalAvailable() - m_production_queue.TotalPPsSpent()); - // can uncomment following line when / if industry stockpiling is allowed... - // m_resource_pools[RE_INDUSTRY]->SetStockpile(m_resource_pools[RE_INDUSTRY]->TotalAvailable() - m_production_queue.TotalPPsSpent()); } void Empire::CheckTradeSocialProgress() @@ -2075,14 +2070,19 @@ m_resource_pools[RE_TRADE]->SetSystemSupplyGroups(sets_set); // set stockpile location + m_resource_pools[RE_INDUSTRY]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + m_resource_pools[RE_RESEARCH]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + const UniverseObject* capitol = GetUniverse().Object(CapitolID()); if (capitol) { int system_id = capitol->SystemID(); m_resource_pools[RE_MINERALS]->SetStockpileSystem(system_id); m_resource_pools[RE_FOOD]->SetStockpileSystem(system_id); - m_resource_pools[RE_INDUSTRY]->SetStockpileSystem(system_id); - m_resource_pools[RE_RESEARCH]->SetStockpileSystem(system_id); m_resource_pools[RE_TRADE]->SetStockpileSystem(system_id); + } else { + m_resource_pools[RE_MINERALS]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + m_resource_pools[RE_FOOD]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + m_resource_pools[RE_TRADE]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); } } Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-23 06:51:19 UTC (rev 2707) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-24 19:57:00 UTC (rev 2708) @@ -1668,16 +1668,17 @@ } void DesignWnd::MainPanel::AddPart(const PartType* part) { - for (unsigned int i = 0; i < m_slots.size(); ++i) { - const ShipSlotType slot_type = m_slots[i]->SlotType(); - const PartType* part_type = m_slots[i]->GetPart(); - - if (!part_type && part && part->CanMountInSlotType(slot_type)) { - SetPart(part, i); - return; - } - } - Logger().debugStream() << "DesignWnd::MainPanel::AddPart(" << (part ? part->Name() : "no part") << ") couldn't find a slot for the part"; + if (!part) return; + for (unsigned int i = 0; i < m_slots.size(); ++i) { // scan through slots to find out that can mount part + const ShipSlotType slot_type = m_slots[i]->SlotType(); + const PartType* part_type = m_slots[i]->GetPart(); // check if this slot is empty + + if (!part_type && part->CanMountInSlotType(slot_type)) { // ... and if the part can mount here + SetPart(part, i); // add part to slot + return; + } + } + Logger().debugStream() << "DesignWnd::MainPanel::AddPart(" << (part ? part->Name() : "no part") << ") couldn't find a slot for the part"; } void DesignWnd::MainPanel::ClearParts() { Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-23 06:51:19 UTC (rev 2707) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-12-24 19:57:00 UTC (rev 2708) @@ -2438,6 +2438,7 @@ if (m_sitrep_panel->Visible()) { DetachChild(m_sitrep_panel); m_sitrep_panel->Hide(); // necessary so it won't be visible when next toggled + m_btn_siterep->MarkNotSelected(); } else { // hide other "competing" windows m_research_wnd->Hide(); @@ -2460,6 +2461,12 @@ AttachChild(m_sitrep_panel); MoveChildUp(m_sitrep_panel); m_sitrep_panel->Show(); + + // indicate selections on buttons + m_btn_siterep->MarkSelectedGray(); + m_btn_research->MarkNotSelected(); + m_btn_production->MarkNotSelected(); + m_btn_design->MarkNotSelected(); } return true; } @@ -2469,6 +2476,7 @@ ClearProjectedFleetMovementLines(); if (m_research_wnd->Visible()) { m_research_wnd->Hide(); + m_btn_research->MarkNotSelected(); } else { // hide other "competing" windows m_sitrep_panel->Hide(); @@ -2487,6 +2495,12 @@ // show the research window m_research_wnd->Show(); GG::GUI::GetGUI()->MoveUp(m_research_wnd); + + // indicate selections on buttons + m_btn_siterep->MarkNotSelected(); + m_btn_research->MarkSelectedGray(); + m_btn_production->MarkNotSelected(); + m_btn_design->MarkNotSelected(); } return true; } @@ -2497,6 +2511,7 @@ if (m_production_wnd->Visible()) { m_production_wnd->Hide(); m_in_production_view_mode = false; + m_btn_production->MarkNotSelected(); ShowAllPopups(); } else { // hide other "competing" windows @@ -2518,6 +2533,13 @@ GG::GUI::GetGUI()->MoveUp(m_production_wnd); + // indicate selections on buttons + m_btn_siterep->MarkNotSelected(); + m_btn_research->MarkNotSelected(); + m_btn_production->MarkSelectedGray(); + m_btn_design->MarkNotSelected(); + + // if no system is currently shown in sidepanel, default to this empire's home system (ie. where the capitol is) if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) if (const Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) @@ -2532,6 +2554,7 @@ ClearProjectedFleetMovementLines(); if (m_design_wnd->Visible()) { m_design_wnd->Hide(); + m_btn_design->MarkNotSelected(); EnableAlphaNumAccels(); } else { // hide other "competing" windows @@ -2551,6 +2574,12 @@ GG::GUI::GetGUI()->SetFocusWnd(m_design_wnd); DisableAlphaNumAccels(); m_design_wnd->Reset(); + + // indicate selections on buttons + m_btn_siterep->MarkNotSelected(); + m_btn_research->MarkNotSelected(); + m_btn_production->MarkNotSelected(); + m_btn_design->MarkSelectedGray(); } return true; } @@ -2560,9 +2589,11 @@ if (!m_menu_showing) { ClearProjectedFleetMovementLines(); m_menu_showing = true; + m_btn_menu->MarkSelectedGray(); InGameMenu menu; menu.Run(); m_menu_showing = false; + m_btn_menu->MarkNotSelected(); } return true; } @@ -2971,7 +3002,7 @@ 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::MOD_KEY_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), &MapWnd::ToggleSitRep, this); Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-12-23 06:51:19 UTC (rev 2707) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-12-24 19:57:00 UTC (rev 2708) @@ -678,37 +678,12 @@ // process production and growth phase - // DEBUG - Logger().debugStream() << "planets before applying effects and updating meters"; - std::vector<Planet*> planets = universe.FindObjects<Planet>(); - for (std::vector<Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (planet->Name() != "Hagalaz II") continue; - Logger().debugStream() << "planet: " << planet->Name(); - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = planet->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << " val: " << meter->Current() << "/" << meter->Max(); - } - // END DEBUG - // execute all effects and update meters prior to production, research, etc. universe.ApplyAllEffectsAndUpdateMeters(); - // DEBUG - Logger().debugStream() << "planets after applying effects and updating meters"; - for (std::vector<Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (planet->Name() != "Hagalaz II") continue; - Logger().debugStream() << "planet: " << planet->Name(); - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = planet->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << " val: " << meter->Current() << "/" << meter->Max(); - } - // END DEBUG - // Determine how much of each resource is available, and determine how to distribute it to planets or on queues for (EmpireManager::iterator it = empires.begin(); it != empires.end(); ++it) { empire = it->second; @@ -721,7 +696,8 @@ empire->UpdateResourcePools(); // determines how much of each resources is available in each resource sharing group } - // consume distributed resources on queues + // Consume distributed resources to planets and on queues, create new objects for completed production and + // give techs to empires that have researched them for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { empire = empires.Lookup(it->first); empire->CheckResearchProgress(); @@ -731,38 +707,13 @@ } - // DEBUG - Logger().debugStream() << "planets after updating pools and growth"; - for (std::vector<Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (planet->Name() != "Hagalaz II") continue; - Logger().debugStream() << "planet: " << planet->Name(); - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = planet->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << " val: " << meter->Current() << "/" << meter->Max(); - } - // END DEBUG - - // re-execute all meter-related effects after production, so that new UniverseObjects created during production // will have effects applied to them this turn, allowing (for example) ships to have max fuel meters greater than // 0 on the turn they are created. universe.ApplyMeterEffectsAndUpdateMeters(); - // DEBUG - Logger().debugStream() << "planets after applying effects and updating meters... again"; - for (std::vector<Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (planet->Name() != "Hagalaz II") continue; - Logger().debugStream() << "planet: " << planet->Name(); - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = planet->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << " val: " << meter->Current() << "/" << meter->Max(); - } - // END DEBUG - // regenerate empire system visibility, which is needed for some UniverseObject subclasses' PopGrowthProductionResearchPhase() universe.RebuildEmpireViewSystemGraphs(); // Population growth or loss, health meter growth, resource current meter growth @@ -772,17 +723,6 @@ } - // DEBUG - Logger().debugStream() << "planets after growth and meter clamping"; - for (std::vector<Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (planet->Name() != "Hagalaz II") continue; - Logger().debugStream() << "planet: " << planet->Name(); - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = planet->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << ": " << meter->Dump(); - } - // END DEBUG // copy latest updated current meter values to initial current values, and initial current values // to previous values, so that clients will have this information based on values after all changes |
From: <geo...@us...> - 2009-01-01 22:30:19
|
Revision: 2710 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2710&view=rev Author: geoffthemedio Date: 2009-01-01 22:30:15 +0000 (Thu, 01 Jan 2009) Log Message: ----------- -Production allocation takes into account resource-sharing groups -Minerals stockpile updates and predictions updated accordingly -Unimplemented RemovePartType and RemoveHullType functions in Empire -Removed PopCenter DensityType which was unused and unnecessary (v0.4 design will / should be updated accordingly) -A few related clarification and grooming type changes Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/python/PythonEmpireWrapper.cpp trunk/FreeOrion/universe/PopCenter.cpp trunk/FreeOrion/universe/PopCenter.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-12-30 21:03:29 UTC (rev 2709) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-01-01 22:30:15 UTC (rev 2710) @@ -28,10 +28,12 @@ namespace { const double EPSILON = 1.0e-5; - // sets the .spending, value for each Tech in the queue. Only sets nonzero funding to + // sets the .allocated_rp, value for each Tech in the queue. Only sets nonzero funding to // a Tech if it is researchable this turn. Also determines total number of spent RP // (returning by reference in total_RPs_spent) - void SetTechQueueElementSpending(double RPs, const std::map<std::string, double>& research_progress, const std::map<std::string, TechStatus>& research_status, ResearchQueue::QueueType& queue, double& total_RPs_spent, int& projects_in_progress) + void SetTechQueueElementSpending(double RPs, const std::map<std::string, double>& research_progress, + const std::map<std::string, TechStatus>& research_status, ResearchQueue::QueueType& queue, + double& total_RPs_spent, int& projects_in_progress) { total_RPs_spent = 0.0; projects_in_progress = 0; @@ -54,61 +56,123 @@ double RPs_to_spend = std::min(RPs_needed, tech->ResearchCost()); if (total_RPs_spent + RPs_to_spend <= RPs - EPSILON) { - it->spending = RPs_to_spend; - total_RPs_spent += it->spending; + it->allocated_rp = RPs_to_spend; + total_RPs_spent += it->allocated_rp; ++projects_in_progress; } else if (total_RPs_spent < RPs - EPSILON) { - it->spending = RPs - total_RPs_spent; - total_RPs_spent += it->spending; + it->allocated_rp = RPs - total_RPs_spent; + total_RPs_spent += it->allocated_rp; ++projects_in_progress; } else { - it->spending = 0.0; + it->allocated_rp = 0.0; } } else { // item can't be researched this turn - it->spending = 0.0; + it->allocated_rp = 0.0; } } } - // sets the .spending, value for each Element in the queue. Only sets nonzero funding to - // an Element if its ProductionItem is buildable this turn. Also determines total number - // of spent PP (returning by reference in total_PPs_spent) - void SetProdQueueElementSpending(Empire* empire, double PPs, const std::vector<double>& production_status, ProductionQueue::QueueType& queue, double& total_PPs_spent, int& projects_in_progress) + // sets the .allocated_pp value for each Element in the passed ProductionQueue \a queue. Elements are allocated PP based on their + // need, the limits they can be given per turn, and the amount available at their production location (which is itself limited by + // the resource supply system groups that are able to exchange resources with the build location and the amount of minerals and + // industry produced in the group). Elements will not receive funding if they cannot be built by \a empire this turn, or can't be + // built at their build location. + void SetProdQueueElementSpending(Empire* empire, std::map<std::set<int>, double> available_pp, + const std::vector<std::set<int> >& queue_element_resource_sharing_system_groups, + const std::vector<double>& production_status, ProductionQueue::QueueType& queue, + std::map<std::set<int>, double>& allocated_pp, int& projects_in_progress) { + // TODO: When combat and blockading are updated to allow an armed ship to be in a system containing an enemy planet without + // actually attacking that planet, it will be possible to blockade a system from exchanging resources with itself. This will + // mean that planets won't be listed in any resource sharing group, and thus won't be allocated the industry and minerals that + // they produce locally when such a blockade occurs. The mineral and industry distribution code probably needs to be updated + // to allow a ResourceCenter to use its own production in cases where its system is not part of any resource-sharing group. + assert(production_status.size() == queue.size()); - total_PPs_spent = 0.0; + assert(production_status.size() == queue_element_resource_sharing_system_groups.size()); + projects_in_progress = 0; + allocated_pp.clear(); + int i = 0; + for (ProductionQueue::iterator it = queue.begin(); it != queue.end(); ++it, ++i) { + ProductionQueue::Element& queue_element = *it; - for (ProductionQueue::iterator it = queue.begin(); it != queue.end(); ++it, ++i) { + // get resource sharing group and amount of resource available to build this item + const std::set<int>& group = queue_element_resource_sharing_system_groups[i]; + if (group.empty()) { + Logger().debugStream() << "resource sharing group for queue element is empty. no allocating any resources to element"; + queue_element.allocated_pp = 0.0; + continue; + } + + std::map<std::set<int>, double>::iterator available_pp_it = available_pp.find(group); + if (available_pp_it == available_pp.end()) { + // item is not being built in a system that has access to resources, so it can't be built. + Logger().debugStream() << "no resource sharing group for production queue element"; + queue_element.allocated_pp = 0.0; + continue; + } + + double& group_pp_available = available_pp_it->second; + + + // if group has no pp available, can't build anything this turn + if (group_pp_available <= 0.0) { + Logger().debugStream() << "no pp available in group"; + queue_element.allocated_pp = 0.0; + continue; + } + + + ProductionQueue::ProductionItem& item = queue_element.item; + + // see if item is buildable this turn... - int location = it->location; - bool buildable = empire->BuildableItem(it->item, location); - - if (buildable) { - double item_cost; - int build_turns; - boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(it->item); - - double progress = production_status[i]; - double PPs_needed = item_cost * build_turns * it->remaining - progress; - double PPs_to_spend = std::min(PPs_needed, item_cost); - if (total_PPs_spent + PPs_to_spend <= PPs - EPSILON) { - it->spending = PPs_to_spend; - total_PPs_spent += it->spending; - ++projects_in_progress; - } else if (total_PPs_spent < PPs - EPSILON) { - it->spending = PPs - total_PPs_spent; - total_PPs_spent += it->spending; - ++projects_in_progress; - } else { - it->spending = 0.0; - } - } else { - // item can't be produced at its location this turn - it->spending = 0.0; + int location = queue_element.location; + bool buildable = empire->BuildableItem(item, location); + + if (!buildable) { + // can't be built at this location this turn. + queue_element.allocated_pp = 0.0; + Logger().debugStream() << "item can't be built at location this turn"; + continue; } + + + // get max contribution per turn and turns to build at max contribution rate + double item_cost; + int build_turns; + boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(item); + + + // determine additional PP needed to complete build queue element: total cost - progress + double element_accumulated_PP = production_status[i]; // PP accumulated by this element towards building next item + double element_total_cost = item_cost * build_turns * queue_element.remaining; // total PP to build all items in this element + double additional_pp_to_complete_element = element_total_cost - element_accumulated_PP; // additional PP, beyond already-accumulated PP, to build all items in this element + + + // determine how many pp to allocate to this queue element this turn. allocation is limited by the + // item cost, which is the max number of PP per turn that can be put towards this item, and by the + // total cost remaining to complete the last item in the queue element (eg. the element has all but + // the last item complete already) and by the total pp available in this element's production location's + // resource sharing group + double allocation = std::max(std::min(std::min(additional_pp_to_complete_element, item_cost), group_pp_available), 0.0); // added max (..., 0.0) to prevent any negative-allocation bugs that might come up... + + + // allocate pp + queue_element.allocated_pp = allocation; + + // record alloation in group, if group is not empty + allocated_pp[group] += allocation; // assuming the double indexed by group will be default initialized to 0.0 if that entry doesn't already exist in the map + group_pp_available -= allocation; + + + // check if this will complete the element + if (allocation >= additional_pp_to_complete_element - EPSILON) { + ++projects_in_progress; + } } } @@ -131,13 +195,13 @@ //////////////////////////////////////// ResearchQueue::Element::Element() : tech(0), - spending(0.0), + allocated_rp(0.0), turns_left(0) {} ResearchQueue::Element::Element(const Tech* tech_, double spending_, int turns_left_) : tech(tech_), - spending(spending_), + allocated_rp(spending_), turns_left(turns_left_) {} @@ -203,7 +267,7 @@ ResearchQueue::const_iterator ResearchQueue::UnderfundedProject() const { for (const_iterator it = begin(); it != end(); ++it) { - if (it->spending && it->spending < it->tech->ResearchCost() && 1 < it->turns_left) + if (it->allocated_rp && it->allocated_rp < it->tech->ResearchCost() && 1 < it->turns_left) return it; } return end(); @@ -243,7 +307,7 @@ for (unsigned int i = 0; i < sim_queue.size(); ++i) { const Tech* tech = sim_queue[i].tech; double& status = sim_research_progress[tech->Name()]; - status += sim_queue[i].spending; + status += sim_queue[i].allocated_rp; if (tech->ResearchCost() * tech->ResearchTurns() - EPSILON <= status) { m_queue[i].turns_left = simulation_results[m_queue[i].tech]; simulation_results[tech] = turns; @@ -327,7 +391,7 @@ ResearchQueue::iterator ResearchQueue::UnderfundedProject() { for (iterator it = begin(); it != end(); ++it) { - if (it->spending && it->spending < it->tech->ResearchCost() && 1 < it->turns_left) + if (it->allocated_rp && it->allocated_rp < it->tech->ResearchCost() && 1 < it->turns_left) return it; } return end(); @@ -365,7 +429,7 @@ ordered(0), remaining(0), location(UniverseObject::INVALID_OBJECT_ID), - spending(0.0), + allocated_pp(0.0), turns_left_to_next_item(-1), turns_left_to_completion(-1) {} @@ -375,7 +439,7 @@ ordered(ordered_), remaining(remaining_), location(location_), - spending(0.0), + allocated_pp(0.0), turns_left_to_next_item(-1), turns_left_to_completion(-1) {} @@ -385,7 +449,7 @@ ordered(ordered_), remaining(remaining_), location(location_), - spending(0.0), + allocated_pp(0.0), turns_left_to_next_item(-1), turns_left_to_completion(-1) {} @@ -395,7 +459,7 @@ ordered(ordered_), remaining(remaining_), location(location_), - spending(0.0), + allocated_pp(0.0), turns_left_to_next_item(-1), turns_left_to_completion(-1) {} @@ -404,8 +468,7 @@ // ProductionQueue // ///////////////////// ProductionQueue::ProductionQueue() : - m_projects_in_progress(0), - m_total_PPs_spent(0.0) + m_projects_in_progress(0) {} int ProductionQueue::ProjectsInProgress() const @@ -415,9 +478,62 @@ double ProductionQueue::TotalPPsSpent() const { - return m_total_PPs_spent; + // add up allocated PP from all resource sharing system groups + double retval = 0; + for (std::map<std::set<int>, double>::const_iterator it = m_system_group_allocated_pp.begin(); it != m_system_group_allocated_pp.end(); ++it) + retval += it->second; + return retval; } +std::map<std::set<int>, double> ProductionQueue::AvailablePP(const std::map<ResourceType, boost::shared_ptr<ResourcePool> >& resource_pools) const +{ + std::map<std::set<int>, double> available_pp; + + // get resource pools used for production... + boost::shared_ptr<ResourcePool> industry_pool, minerals_pool; + std::map<ResourceType, boost::shared_ptr<ResourcePool> >::const_iterator pool_it = resource_pools.find(RE_INDUSTRY); + if (pool_it != resource_pools.end()) { + industry_pool = pool_it->second; + } else { + Logger().errorStream() << "ProductionQueue::AvailablePP couldn't get an industry resource pool from passed resource pools"; + return available_pp; + } + pool_it = resource_pools.find(RE_MINERALS); + if (pool_it != resource_pools.end()) { + minerals_pool = pool_it->second; + } else { + Logger().errorStream() << "ProductionQueue::AvailablePP couldn't get a minerals resource pool from passed resource pools"; + return available_pp; + } + + + // determine available PP in each resource sharing group of systems for this empire. PP are minimum of available minerals + // and industry in each resource-sharing group of systems + std::map<std::set<int>, double> available_industry = industry_pool->Available(); + std::map<std::set<int>, double> available_minerals = minerals_pool->Available(); + + + for (std::map<std::set<int>, double>::const_iterator ind_it = available_industry.begin(); ind_it != available_industry.end(); ++ind_it) { + // get group of systems in industry pool + const std::set<int>& group = ind_it->first; + + // find same group in minerals pool + std::map<std::set<int>, double>::const_iterator min_it = available_minerals.find(group); + + if (min_it == available_minerals.end()) + continue; // this group doesn't appear in both pools, so has no PP production + + available_pp[group] = std::min(ind_it->second, min_it->second); // available pp needs minerals and industry. whichever is less is the available pp + } + + return available_pp; +} + +std::map<std::set<int>, double> ProductionQueue::AllocatedPP() const +{ + return m_system_group_allocated_pp; +} + bool ProductionQueue::empty() const { return !m_queue.size(); @@ -455,100 +571,207 @@ double item_cost; int build_turns; boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(it->item); - if (it->spending && it->spending < item_cost && 1 < it->turns_left_to_next_item) + if (it->allocated_pp && it->allocated_pp < item_cost && 1 < it->turns_left_to_next_item) return it; } return end(); } -void ProductionQueue::Update(Empire* empire, double PPs, const std::vector<double>& production_status) +void ProductionQueue::Update(Empire* empire, const std::map<ResourceType, boost::shared_ptr<ResourcePool> >& resource_pools, + const std::vector<double>& production_status) { - SetProdQueueElementSpending(empire, PPs, production_status, m_queue, m_total_PPs_spent, m_projects_in_progress); + if (!empire) { + Logger().errorStream() << "ProductionQueue::Update passed null empire. doing nothing."; + return; + } if (m_queue.empty()) { + Logger().debugStream() << "ProductionQueue::Update aborting early due to an empty queue"; + m_projects_in_progress = 0; + + if (!production_status.empty()) + Logger().errorStream() << "warnong: ProductionQueue::Update queue was empty, but passed production_status was not."; + ProductionQueueChangedSignal(); // need this so BuildingsPanel updates properly after removing last building - return; // nothing more to do... + return; // nothing to do for an empty queue } + + std::map<std::set<int>, double> available_pp = AvailablePP(resource_pools); + + + // determine which resource sharing group each queue item is located in + std::vector<std::set<int> > queue_element_groups; + for (ProductionQueue::const_iterator queue_it = m_queue.begin(); queue_it != m_queue.end(); ++queue_it) { + // get location object for element + const ProductionQueue::Element& element = *queue_it; + int location_id = element.location; + const UniverseObject* location_obj = GetUniverse().Object(location_id); + if (!location_obj) { + Logger().errorStream() << "ProductionQueue::Update couldn't get a location object for a production queue element"; + queue_element_groups.push_back(std::set<int>()); // record empty resource sharing system group for this element + continue; + } + + + // find resource sharing group with available pp that contains this system, if any + int system_id = location_obj->SystemID(); + + for (std::map<std::set<int>, double>::const_iterator groups_it = available_pp.begin(); true; ++groups_it) { + if (groups_it == available_pp.end()) { + // didn't find a group containing this system, so add an empty group as this element's queue element group + queue_element_groups.push_back(std::set<int>()); + break; + } + + // check if system id is in this group + const std::set<int>& group = groups_it->first; + std::set<int>::const_iterator set_it = group.find(system_id); + if (set_it != group.end()) { + // system is in this group. + queue_element_groups.push_back(group); // record this discovery + break; // stop searching for a group containing a system, since one has been found + } + } + } + + + // allocate pp to queue elements, returning updated available pp and updated allocated pp for each group of resource sharing systems + SetProdQueueElementSpending(empire, available_pp, queue_element_groups, production_status, m_queue, m_system_group_allocated_pp, m_projects_in_progress); + + + // if at least one resource-sharing system group have available PP, simulate future turns to predict when build items will be finished + bool simulate_future = false; + for (std::map<std::set<int>, double>::const_iterator available_it = available_pp.begin(); available_it != available_pp.end(); ++available_it) { + if (available_it->second > EPSILON) { + simulate_future = true; + break; + } + } + + + if (!simulate_future) { + // since there are so few PPs, indicate that the number of turns left is indeterminate by providing a number < 0 + for (ProductionQueue::QueueType::iterator queue_it = m_queue.begin(); queue_it != m_queue.end(); ++queue_it) { + queue_it->turns_left_to_next_item = -1; + queue_it->turns_left_to_completion = -1; + } + ProductionQueueChangedSignal(); + return; + } + + + // there are enough PP available in at least one group to make it worthwhile to simulate the future. + Logger().debugStream() << "ProductionQueue::Update: Simulating future turns of production queue"; + + + // duplicate produciton queue state for future simulation + QueueType sim_queue = m_queue; + std::vector<double> sim_production_status = production_status; + std::vector<int> simulation_results(sim_production_status.size(), -1); + std::vector<int> sim_queue_original_indices(sim_production_status.size()); + for (unsigned int i = 0; i < sim_queue_original_indices.size(); ++i) + sim_queue_original_indices[i] = i; + + + int turns = 1; // to keep track of how man turn-iterations simulation takes to finish items const int TOO_MANY_TURNS = 500; // stop counting turns to completion after this long, to prevent seemingly endless loops - if (EPSILON < PPs) { - //Logger().debugStream() << "ProductionQueue::Update: Simulating future turns of production queue"; - // simulate future turns in order to determine when the builditems in the queue will be finished - int turns = 1; - QueueType sim_queue = m_queue; - std::vector<double> sim_production_status = production_status; - std::vector<int> simulation_results(sim_production_status.size(), -1); - std::vector<int> sim_queue_original_indices(sim_production_status.size()); - for (unsigned int i = 0; i < sim_queue_original_indices.size(); ++i) { - sim_queue_original_indices[i] = i; + + + // remove from simulated queue any items that can't be built due to not meeting their location conditions + // might be better to re-check buildability each turn, but this would require creating a simulated universe + // into which simulated completed buildings could be inserted, as well as spoofing the current turn, or + // otherwise faking the results for evaluating arbitrary location conditions for the simulated universe. + // this would also be inaccurate anyway due to player choices or random chance, so for simplicity, it is + // assume that building location conditions evaluated at the present turn apply indefinitely + // + // also remove from simulated queue any items that are located in a resource sharing system group that is + // empty or that does not have any PP available + for (unsigned int i = 0; i < sim_queue.size(); ++i) { + const std::set<int>& group = queue_element_groups[sim_queue_original_indices[i]]; + + // if any removal condition is met, remove item from queue + bool remove = false; + if (group.empty() || !empire->BuildableItem(sim_queue[i].item, sim_queue[i].location)) { // empty group or not buildable + remove = true; + } else { + std::map<std::set<int>, double>::const_iterator available_it = available_pp.find(group); + if (available_it == available_pp.end() || available_it->second < EPSILON) // missing group or non-empty group with no PP available + remove = true; } - // remove from simulated queue any items that can't be built due to not meeting their location conditions - // might be better to re-check buildability each turn, but this would require creating a simulated universe - // into which simulated completed buildings could be inserted, as well as spoofing the current turn, or - // otherwise faking the results for evaluating arbitrary location conditions for the simulated universe. - // this would also be inaccurate anyway due to player choices or random chance, so for simplicity, it is - // assume that building location conditions evaluated at the present turn apply indefinitely - for (unsigned int i = 0; i < sim_queue.size(); ++i) { - if (empire->BuildableItem(sim_queue[i].item, sim_queue[i].location)) continue; - + if (remove) { // remove unbuildable items from the simulated queue, since they'll never finish... m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; // turns left is indeterminate for this item sim_queue.erase(sim_queue.begin() + i); sim_production_status.erase(sim_production_status.begin() + i); sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); } + } - // cycle through items on queue, adding up their allotted PP until each is finished and removed from queue - // until everything on queue has been finished, in order to calculate expected completion times - while (!sim_queue.empty() && turns < TOO_MANY_TURNS) { - double total_PPs_spent = 0.0; - int projects_in_progress = 0; - //Logger().debugStream() << "ProductionQueue::Update: Calling SetProdQueueElementSpending for simulated queue"; - SetProdQueueElementSpending(empire, PPs, sim_production_status, sim_queue, total_PPs_spent, projects_in_progress); - // cycle through items on queue, apply one turn's PP towards items, remove items that are done - for (unsigned int i = 0; i < sim_queue.size(); ++i) { - double item_cost; - int build_turns; - boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(sim_queue[i].item); + // cycle through items on queue, adding up their allotted PP until each is finished and removed from queue + // until everything on queue has been finished, in order to calculate expected completion times + while (!sim_queue.empty() && turns < TOO_MANY_TURNS) { + std::map<std::set<int>, double> allocated_pp; + int projects_in_progress = 0; - double& status = sim_production_status[i]; - status += sim_queue[i].spending; - if (item_cost * build_turns - EPSILON <= status) { - sim_production_status[i] -= item_cost * build_turns; // might have spillover to next item in order, so don't set to exactly 0 - if (sim_queue[i].remaining == m_queue[sim_queue_original_indices[i]].remaining) { - m_queue[sim_queue_original_indices[i]].turns_left_to_next_item = turns; - } - if (!--sim_queue[i].remaining) { - //Logger().debugStream() << " ITEM COMPLETE! REMOVING"; - m_queue[sim_queue_original_indices[i]].turns_left_to_completion = turns; - sim_queue.erase(sim_queue.begin() + i); - sim_production_status.erase(sim_production_status.begin() + i); - sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); - } + // update allocation of PP on the simulated queue. previous iterations of simulation may have removed elements + // from the queue, freeing up PP to be spent on other elements further down the queue + SetProdQueueElementSpending(empire, available_pp, queue_element_groups, sim_production_status, sim_queue, allocated_pp, projects_in_progress); + + + // cycle through items on queue, apply one turn's PP towards items, remove items that are done + for (unsigned int i = 0; i < sim_queue.size(); ++i) { + ProductionQueue::Element& element = sim_queue[i]; + + double item_cost_per_turn; + int build_turns; + boost::tie(item_cost_per_turn, build_turns) = empire->ProductionCostAndTime(element.item); + + + double& status = sim_production_status[i]; // get previous iteration's accumulated PP for this element + status += element.allocated_pp; // add one turn's allocated PP to element + + + // check if additional turn's PP allocation was enough to finish next item in element + if (item_cost_per_turn * build_turns - EPSILON <= status) { + // an item has been completed. + + // deduct cost of one item from accumulated PP. don't set accumulation to zero, as this + // would eliminate any partial completion of the next item + sim_production_status[i] -= item_cost_per_turn * build_turns; + + // if this was the first item in the element to be completed in this simuation, update the original + // queue element with the turns required to complete the next item in the element + if (element.remaining == m_queue[sim_queue_original_indices[i]].remaining) + m_queue[sim_queue_original_indices[i]].turns_left_to_next_item = turns; + + // if all items in the element are completed in the simulation... + if (!--element.remaining) { + //Logger().debugStream() << " ITEM COMPLETE! REMOVING"; + m_queue[sim_queue_original_indices[i]].turns_left_to_completion = turns; // record the (estimated) turns to complete the whole element on the original queue + sim_queue.erase(sim_queue.begin() + i); // remove the completed item from the simulated queue + sim_production_status.erase(sim_production_status.begin() + i); // and production status + sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); // and bookkeeping } } - ++turns; - } // loop while (!sim_queue.empty() && turns < TOO_MANY_TURNS) - - // mark rest of items on simulated queue (if any) as never to be finished - for (unsigned int i = 0; i < sim_queue.size(); ++i) { - if (sim_queue[i].remaining == m_queue[sim_queue_original_indices[i]].remaining) - m_queue[sim_queue_original_indices[i]].turns_left_to_next_item = -1; - m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; } + ++turns; + } // loop while (!sim_queue.empty() && turns < TOO_MANY_TURNS) - } else { - // since there are so few PPs, indicate that the number of turns left is indeterminate by providing a number < 0 - for (unsigned int i = 0; i < m_queue.size(); ++i) { - m_queue[i].turns_left_to_next_item = -1; - m_queue[i].turns_left_to_completion = -1; - } + + // mark rest of items on simulated queue (if any) as never to be finished + for (unsigned int i = 0; i < sim_queue.size(); ++i) { + if (sim_queue[i].remaining == m_queue[sim_queue_original_indices[i]].remaining) + m_queue[sim_queue_original_indices[i]].turns_left_to_next_item = -1; + m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; } + + ProductionQueueChangedSignal(); } @@ -601,7 +824,7 @@ double item_cost; int build_turns; boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(it->item); - if (it->spending && it->spending < item_cost && 1 < it->turns_left_to_next_item) + if (it->allocated_pp && it->allocated_pp < item_cost && 1 < it->turns_left_to_next_item) return it; } return end(); @@ -1533,7 +1756,7 @@ m_production_queue.insert(m_production_queue.begin() + pos, build); m_production_progress.insert(m_production_progress.begin() + pos, 0.0); } - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); } void Empire::PlaceBuildInQueue(BuildType build_type, int design_id, int number, int location, int pos/* = -1*/) @@ -1549,7 +1772,7 @@ m_production_queue.insert(m_production_queue.begin() + pos, build); m_production_progress.insert(m_production_progress.begin() + pos, 0.0); } - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); } void Empire::PlaceBuildInQueue(const ProductionQueue::ProductionItem& item, int number, int location, int pos/* = -1*/) @@ -1573,7 +1796,7 @@ int original_quantity = m_production_queue[index].remaining; m_production_queue[index].remaining = quantity; m_production_queue[index].ordered += quantity - original_quantity; - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); } void Empire::MoveBuildWithinQueue(int index, int new_index) @@ -1589,7 +1812,7 @@ m_production_progress.erase(m_production_progress.begin() + index); m_production_queue.insert(m_production_queue.begin() + new_index, build); m_production_progress.insert(m_production_progress.begin() + new_index, status); - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); } void Empire::RemoveBuildFromQueue(int index) @@ -1598,7 +1821,7 @@ throw std::runtime_error("Empire::RemoveBuildFromQueue() : Attempted to delete a production queue item with an invalid index."); m_production_queue.erase(index); m_production_progress.erase(m_production_progress.begin() + index); - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); } void Empire::ConquerBuildsAtLocation(int location_id) { @@ -1678,7 +1901,6 @@ void Empire::UnlockItem(const ItemSpec& item) { - // TODO: handle other types (such as ship components) as they are implemented switch (item.type) { case UIT_BUILDING: AddBuildingType(item.name); @@ -1807,9 +2029,19 @@ void Empire::LockItem(const ItemSpec& item) { - // TODO: handle other types (such as ship components) as they are implemented - if (item.type == UIT_BUILDING) { + switch (item.type) { + case UIT_BUILDING: RemoveBuildingType(item.name); + (item.name); + break; + case UIT_SHIP_PART: + RemovePartType(item.name); + break; + case UIT_SHIP_HULL: + RemoveHullType(item.name); + break; + default: + Logger().errorStream() << "Empire::LockItem : passed ItemSpec with unrecognized UnlockableItemType"; } } @@ -1818,6 +2050,16 @@ m_available_building_types.erase(name); } +void Empire::RemovePartType(const std::string& name) +{ + // TODO: THIS +} + +void Empire::RemoveHullType(const std::string& name) +{ + // TODO: THIS +} + void Empire::ClearSitRep() { for (SitRepItr it = m_sitrep_entries.begin(); it != m_sitrep_entries.end(); ++it) @@ -1833,7 +2075,7 @@ for (ResearchQueue::iterator it = m_research_queue.begin(); it != m_research_queue.end(); ++it) { const Tech* tech = it->tech; double& progress = m_research_progress[tech->Name()]; - progress += it->spending; + progress += it->allocated_rp; if (tech->ResearchCost() * tech->ResearchTurns() - EPSILON <= progress) { m_techs.insert(tech->Name()); const std::vector<ItemSpec>& unlocked_items = tech->UnlockedItems(); @@ -1859,14 +2101,21 @@ void Empire::CheckProductionProgress() { // following commented line should be redundant, as previous call to UpdateResourcePools should have generated necessary info - // m_production_queue.Update(this, ProductionPoints(), m_production_progress); + // m_production_queue.Update(this, m_resource_pools, m_production_progress); + + + // go through queue, updating production progress. If a build item is completed, create the built object or take whatever other + // action is appropriate, and record that queue item as complete, so it can be erased from the queue std::vector<int> to_erase; for (unsigned int i = 0; i < m_production_queue.size(); ++i) { double item_cost; int build_turns; boost::tie(item_cost, build_turns) = ProductionCostAndTime(m_production_queue[i].item); double& status = m_production_progress[i]; - status += m_production_queue[i].spending; + status += m_production_queue[i].allocated_pp; // add allocated PP to queue item + + + // if accumulated PP is sufficient, the item is complete if (item_cost * build_turns - EPSILON <= status) { m_production_progress[i] -= item_cost * build_turns; switch (m_production_queue[i].item.build_type) { @@ -1922,22 +2171,72 @@ } default: + Logger().debugStream() << "Build item of unknown build type finished on production queue."; break; } - if (!--m_production_queue[i].remaining) - to_erase.push_back(i); + + if (!--m_production_queue[i].remaining) // decrement number of remaining items to be produced in current queue element + to_erase.push_back(i); // remember completed element so that it can be removed from queue } } + // removed completed items from queue for (std::vector<int>::reverse_iterator it = to_erase.rbegin(); it != to_erase.rend(); ++it) { m_production_progress.erase(m_production_progress.begin() + *it); m_production_queue.erase(*it); } - // update minerals stockpile. TODO: Update this to work like food distribution and only stockpile within the group of resource- - // sharing systems that have access to the stockpile. - m_resource_pools[RE_MINERALS]->SetStockpile(m_resource_pools[RE_MINERALS]->TotalAvailable() - m_production_queue.TotalPPsSpent()); + + // update minerals stockpile + + // get minerals resource pool and stockpile location + boost::shared_ptr<ResourcePool> pool = m_resource_pools[RE_MINERALS]; + int stockpile_system_id = pool->StockpileSystemID(); + + + if (stockpile_system_id == UniverseObject::INVALID_OBJECT_ID) { + // empire has nowhere to stockpile food, so has no stockpile. + pool->SetStockpile(0.0); + Logger().debugStream() << "no mineral stockpile location. stockpile is set to 0.0"; + + } else { + // find minerals (PP) allocated to production elements located in systems in the group of + // resource-sharing systems that has access to stockpile + double stockpile_group_pp_allocation = 0.0; + + // find the set of systems that contains the stopile system, from the map of PP allocated within each group + std::map<std::set<int>, double> allocated_pp = m_production_queue.AllocatedPP(); + + Logger().debugStream() << "trying to find stockpile system group... stockpile system has id: " << stockpile_system_id; + for (std::map<std::set<int>, double>::const_iterator it = allocated_pp.begin(); it != allocated_pp.end(); ++it) { + const std::set<int>& group = it->first; // get group + Logger().debugStream() << "potential group:"; + for (std::set<int>::const_iterator qit = group.begin(); qit != group.end(); ++qit) + Logger().debugStream() << "...." << *qit; + + if (group.find(stockpile_system_id) != group.end()) { // check for stockpile system + stockpile_group_pp_allocation = it->second; // record allocation for this group + Logger().debugStream() << "Empire::CheckGrowthFoodProgress found group of systems for stockpile system. size: " << it->first.size(); + break; + } + + Logger().debugStream() << "didn't find in group... trying next."; + } + // if the stockpile system is not found in any group of systems with allocated pp, assuming this is fine and that the + // stockpile system's group of systems didn't have any allocated pp... + + + double stockpile_system_group_available = pool->GroupAvailable(stockpile_system_id); + Logger().debugStream() << "minerals available in stockpile group is: " << stockpile_system_group_available; + Logger().debugStream() << "minerals allocation in stockpile group is: " << stockpile_group_pp_allocation; // as of this writing, PP consume one mineral and one industry point, so PP allocation is equal to minerals allocation + + Logger().debugStream() << "Old stockpile was " << pool->Stockpile(); + + double new_stockpile = stockpile_system_group_available - stockpile_group_pp_allocation; + pool->SetStockpile(new_stockpile); + Logger().debugStream() << "New stockpile is: " << new_stockpile; + } } void Empire::CheckTradeSocialProgress() @@ -1952,15 +2251,17 @@ int stockpile_system_id = pool->StockpileSystemID(); - Logger().debugStream() << "stockpile system id: " << stockpile_system_id; + Logger().debugStream() << "food stockpile system id: " << stockpile_system_id; if (stockpile_system_id == UniverseObject::INVALID_OBJECT_ID) { // empire has nowhere to stockpile food, so has no stockpile. pool->SetStockpile(0.0); } else { - // find total food allocated to group that has access to stockpile - std::map<std::set<int>, double> food_sharing_groups = pool->Available(); + // find total food allocated to group that has access to stockpile... + + // first find the set of systems that contains the stockpile system + std::map<std::set<int>, double> food_sharing_groups = pool->Available(); // don't actually need the available PP; just using the map as a set of sets of systems std::set<int> stockpile_group_systems; Logger().debugStream() << "trying to find stockpile system group... stockpile system has id: " << stockpile_system_id; for (std::map<std::set<int>, double>::const_iterator it = food_sharing_groups.begin(); it != food_sharing_groups.end(); ++it) { @@ -1978,13 +2279,10 @@ Logger().debugStream() << "didn't find in group... trying next."; } - const std::vector<PopCenter*>& pop_centers = pop_pool.PopCenters(); - double stockpile_group_food_allocation = 0.0; - // go through population pools, adding up food allocation of those that are in one of the systems // in the group of systems that can access the stockpile for (std::vector<PopCenter*>::const_iterator it = pop_centers.begin(); it != pop_centers.end(); ++it) { @@ -2002,6 +2300,7 @@ } } + double stockpile_system_group_available = pool->GroupAvailable(stockpile_system_id); Logger().debugStream() << "food available in stockpile group is: " << stockpile_system_group_available; Logger().debugStream() << "food allocation in stockpile group is: " << stockpile_group_food_allocation; @@ -2012,8 +2311,6 @@ pool->SetStockpile(new_stockpile); Logger().debugStream() << "New stockpile is: " << new_stockpile; } - - } void Empire::SetColor(const GG::Clr& color) @@ -2059,6 +2356,7 @@ m_resource_pools[RE_FOOD]->SetSystemSupplyGroups(m_resource_supply_groups); m_resource_pools[RE_INDUSTRY]->SetSystemSupplyGroups(m_resource_supply_groups); + // set non-blockadeable resrouce pools to share resources between all systems std::set<std::set<int> > sets_set; std::set<int> all_systems_set; @@ -2069,18 +2367,19 @@ m_resource_pools[RE_RESEARCH]->SetSystemSupplyGroups(sets_set); m_resource_pools[RE_TRADE]->SetSystemSupplyGroups(sets_set); + // set stockpile location - m_resource_pools[RE_INDUSTRY]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + m_resource_pools[RE_INDUSTRY]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); // industry and research are not stockpileable m_resource_pools[RE_RESEARCH]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); - const UniverseObject* capitol = GetUniverse().Object(CapitolID()); + const UniverseObject* capitol = GetUniverse().Object(CapitolID()); // other resources are stockpilable, and stockpile location is currently the capitol. could be changed later to let an effect set the stockpile location if (capitol) { int system_id = capitol->SystemID(); m_resource_pools[RE_MINERALS]->SetStockpileSystem(system_id); m_resource_pools[RE_FOOD]->SetStockpileSystem(system_id); m_resource_pools[RE_TRADE]->SetStockpileSystem(system_id); } else { - m_resource_pools[RE_MINERALS]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); + m_resource_pools[RE_MINERALS]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); // if there is no capitol, there's nowhere to stockpile, so resources become nonstockpilable m_resource_pools[RE_FOOD]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); m_resource_pools[RE_TRADE]->SetStockpileSystem(UniverseObject::INVALID_OBJECT_ID); } @@ -2088,7 +2387,7 @@ void Empire::UpdateResourcePools() { - // updating queues, spending, distribution and growth each update their respective pools, + // updating queues, allocated_rp, distribution and growth each update their respective pools, // (as well as the ways in which the resources are used, which needs to be done // simultaneously to keep things consistent) UpdateResearchQueue(); @@ -2109,7 +2408,7 @@ { m_resource_pools[RE_MINERALS]->Update(); m_resource_pools[RE_INDUSTRY]->Update(); - m_production_queue.Update(this, ProductionPoints(), m_production_progress); + m_production_queue.Update(this, m_resource_pools, m_production_progress); m_resource_pools[RE_MINERALS]->ChangedSignal(); m_resource_pools[RE_INDUSTRY]->ChangedSignal(); } @@ -2134,6 +2433,12 @@ void Empire::UpdateFoodDistribution() { + // TODO: When combat and blockading are updated to allow an armed ship to be in a system containing an enemy planet without + // actually attacking that planet, it will be possible to blockade a system from exchanging resources with itself. This will + // mean that planets won't be listed in any resource sharing group, and thus won't be allocated the food that they produce + // locally when such a blockade occurs. The food distribution code probably needs to be updated to allow a ResourceCenter + // that is also a PopCenter to use its own food production in cases where its system is not part of any resource-sharing group. + Logger().debugStream() << "@@@@ Food distribution for empire: " << EmpireID() << " @@@@"; m_resource_pools[RE_FOOD]->Update(); // recalculate total food production Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2008-12-30 21:03:29 UTC (rev 2709) +++ trunk/FreeOrion/Empire/Empire.h 2009-01-01 22:30:15 UTC (rev 2710) @@ -25,7 +25,7 @@ Element(const Tech* tech_, double spending_, int turns_left_); ///< basic ctor. const Tech* tech; - double spending; + double allocated_rp; int turns_left; private: @@ -121,13 +121,13 @@ Element(BuildType build_type, std::string name, int ordered_, int remaining_, int location_); ///< basic ctor. Element(BuildType build_type, int design_id, int ordered_, int remaining_, int location_); ///< basic ctor. - ProductionItem item; - int ordered; ///< how many of item to produce - int remaining; ///< how many left to produce - int location; ///< the ID of the UniverseObject at which this item is being produced - double spending; - int turns_left_to_next_item; - int turns_left_to_completion; + ProductionItem item; + int ordered; ///< how many of item to produce + int remaining; ///< how many left to produce + int location; ///< the ID of the UniverseObject at which this item is being produced + double allocated_pp; ///< amount of PP allocated to this ProductionQueue Element by Empire production update + int turns_left_to_next_item; + int turns_left_to_completion; private: friend class boost::serialization::access; @@ -151,9 +151,17 @@ //@} /** \name Accessors */ //@{ - int ProjectsInProgress() const; ///< Returns the number of production projects currently (perhaps partially) funded. - double TotalPPsSpent() const; ///< Returns the number of PPs currently spent on the projects in this queue. + int ProjectsInProgress() const; ///< Returns the number of production projects currently (perhaps partially) funded. + double TotalPPsSpent() const; ///< Returns the number of PPs currently spent on the projects in this queue. + /** Returns map from sets of system ids that can share resources to amount of PP available in those groups of systems */ + std::map<std::set<int>, double> AvailablePP(const std::map<ResourceType, boost::shared_ptr<ResourcePool> >& resource_pools) const; + + /** Returns map from sets of system ids that can share resources to amount of PP allocated to production queue elmenets that have + build locations in systems in the group. */ + std::map<std::set<int>, double> AllocatedPP() const; + + // STL container-like interface bool empty() const; unsigned int size() const; @@ -168,14 +176,12 @@ /** \name Mutators */ //@{ /** Recalculates the PPs spent on and number of turns left for each project in the queue. Also - * determines the number of projects in progress, and the total number of PPs spent on the projects - * in the queue. Does not actually "spend" the PP, but just determines how much should be spent - * on each item in the queue. Later call to empire->CheckProductionProgress() will actually - * spend PP, remove items from queue and create them in the universe. \note A precondition of - * this function that \a PPs must be greater than some epsilon > 0; see the implementation for - * the actual value used for epsilon. - */ - void Update(Empire* empire, double PPs, const std::vector<double>& production_status); + * determines the number of projects in progress, and the minerals and industry consumed by projects + * in each resource-sharing group of systems. Does not actually "spend" the PP; a later call to + * empire->CheckProductionProgress() will actually spend PP, remove items from queue and create them + * in the universe. */ + void Update(Empire* empire, const std::map<ResourceType, boost::shared_ptr<ResourcePool> >& resource_pools, + const std::vector<double>& production_status); // STL container-like interface void push_back(const Element& element); @@ -195,9 +201,9 @@ //@} private: - QueueType m_queue; - int m_projects_in_progress; - double m_total_PPs_spent; + QueueType m_queue; + int m_projects_in_progress; + std::map<std::set<int>, double> m_system_group_allocated_pp; friend class boost::serialization::access; template <class Archive> @@ -350,7 +356,6 @@ void UnlockItem(const ItemSpec& item); ///< Adds a given buildable item (Building, Ship Component, etc.) to the list of available buildable items. void AddBuildingType(const std::string& name); ///< Inserts the given BuildingType into the Empire's list of available BuldingTypes. void AddPartType(const std::string& name); ///< Inserts the given ship PartType into the Empire's list of available BuldingTypes. - void AddHullType(const std::string& name); ///< Inserts the given ship HullType into the Empire's list of available BuldingTypes. void AddExploredSystem(int ID); ///< Inserts the given ID into the Empire's list of explored systems. void AddShipDesign(int ship_design_id); ///< inserts given design id into the empire's set of designs @@ -372,6 +377,8 @@ void RemoveTech(const std::string& name); ///< Removes the given Tech from the empire's list void LockItem(const ItemSpec& item); ///< Removes a given buildable item (Building, ShipComponent, etc.) from the list of available buildable items. void RemoveBuildingType(const std::string& name); ///< Removes the given BuildingType from the empire's list + void RemovePartType(const std::string& name); ///< + void RemoveHullType(const std::string& name); ///< void RemoveShipDesign(int ship_design_id); ///< Removes the ShipDesign with the given id from the empire's set void UpdateSystemSupplyRanges(); ///< Calculates ranges that systems can send fleet and resource supplies. @@ -416,11 +423,11 @@ * call UpdateResourceSupply before calling this. */ void InitResourcePools(); - /** Resets production of resources and calculates spending (on each item in queues and - * overall) for each resource by calling UpdateResearchQueue, UpdateProductionQueue, + /** Resets production of resources and calculates allocated resources (on each item in + * queues and overall) for each resource by calling UpdateResearchQueue, UpdateProductionQueue, * UpdateTradeSpending, and UpdateFoodDistribution. Does not actually "spend" resources, - * but just determines how much and on what to spend. Actual spending, removal of items - * from queue, processing of finished items and population growth happens in various + * but just determines how much and on what to spend. Actual consumption of resources, removal + * of items from queue, processing of finished items and population growth happens in various * Check(Whatever)Progress functions. */ void UpdateResourcePools(); @@ -511,7 +518,7 @@ tech_name = tech->Name(); } ar & BOOST_SERIALIZATION_NVP(tech_name) - & BOOST_SERIALIZATION_NVP(spending) + & BOOST_SERIALIZATION_NVP(allocated_rp) & BOOST_SERIALIZATION_NVP(turns_left); if (Archive::is_loading::value) { assert(tech_name != ""); @@ -542,7 +549,7 @@ & BOOST_SERIALIZATION_NVP(ordered) & BOOST_SERIALIZATION_NVP(remaining) & BOOST_SERIALIZATION_NVP(location) - & BOOST_SERIALIZATION_NVP(spending) + & BOOST_SERIALIZATION_NVP(allocated_pp) & BOOST_SERIALIZATION_NVP(turns_left_to_next_item) & BOOST_SERIALIZATION_NVP(turns_left_to_completion); } @@ -552,7 +559,7 @@ { ar & BOOST_SERIALIZATION_NVP(m_queue) & BOOST_SERIALIZATION_NVP(m_projects_in_progress) - & BOOST_SERIALIZATION_NVP(m_total_PPs_spent); + & BOOST_SERIALIZATION_NVP(m_system_group_allocated_pp); } template <class Archive> Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-30 21:03:29 UTC (rev 2709) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-01 22:30:15 UTC (rev 2710) @@ -1477,7 +1477,7 @@ int prev_system_id = m_side_panel->SystemID(); if (prev_system_id != UniverseObject::INVALID_OBJECT_ID) m_system_icons[prev_system_id]->SetSelected(false); - + // place indicator on newly selected system if (system_id != UniverseObject::INVALID_OBJECT_ID) m_system_icons[system_id]->SetSelected(true); @@ -1487,14 +1487,14 @@ if (system_id != m_side_panel->SystemID()) { // only set selected system if newly selected system is different from before, otherwise planet rotation phase resets m_side_panel->SetSystem(system_id); - m_production_wnd->SelectSystem(system_id); + m_production_wnd->SelectSystem(system_id); } m_side_panel->Hide(); // only show ProductionWnd's sidepanel when ProductionWnd is open DetachChild(m_side_panel); } else { if (!m_side_panel->Visible() || system_id != m_side_panel->SystemID()) { m_side_panel->SetSystem(system_id); - + // if selected an invalid system, hide sidepanel if (system_id == UniverseObject::INVALID_OBJECT_ID) { m_side_panel->Hide(); @@ -2620,7 +2620,21 @@ void MapWnd::RefreshFoodResourceIndicator() { Empire* empire = HumanClientApp::GetApp()->Empires().Lookup( HumanClientApp::GetApp()->EmpireID() ); + if (!empire) { + Logger().errorStream() << "MapWnd::RefreshFoodResourceIndicator couldn't get an empire"; + m_mineral->SetValue(0.0); + m_mineral->SetValue(0.0, 1); + return; + } + const ResourcePool* pool = empire->GetResourcePool(RE_FOOD); + if (!pool) { + Logger().errorStream() << "MapWnd::RefreshFoodResourceIndicator couldn't get a food resourepool"; + m_food->SetValue(0.0); + m_food->SetValue(0.0, 1); + return; + } + const PopulationPool& pop_pool = empire->GetPopulationPool(); int stockpile_system_id = pool->StockpileSystemID(); @@ -2629,84 +2643,146 @@ // empire has nowhere to stockpile food, so has no stockpile. Instead of showing stockpile, show production m_food->SetValue(pool->TotalAvailable()); // no stockpile means available is equal to production m_food->SetValue(0.0, 1); // TODO: Make StatisticIcon able to change number of numbers shown, and remove second number here + return; + } - } else { - // empire has a stockpile. Show stockpiled amount for first number + // empire has a stockpile. Show stockpiled amount for first number - m_food->SetValue(pool->Stockpile()); // set first value to stockpiled food + m_food->SetValue(pool->Stockpile()); // set first value to stockpiled food - // for second number, show predicted change in stockpile for next turn compared to this turn. + // for second number, show predicted change in stockpile for next turn compared to this turn. - // find total food allocated to group that has access to stockpile - std::map<std::set<int>, double> food_sharing_groups = pool->Available(); - std::set<int> stockpile_group_s... [truncated message content] |
From: <geo...@us...> - 2009-01-02 10:44:50
|
Revision: 2712 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2712&view=rev Author: geoffthemedio Date: 2009-01-02 10:44:46 +0000 (Fri, 02 Jan 2009) Log Message: ----------- -Rekejiggered MapWnd showing and hiding of SitRep, DesignWnd, ProductionWnd and ResearchWnd to have separate Hide and Show functions instead of putting all logic into Toggle functions. -In process, fixed minor bug where leaving SitRep open at end of turn would cause the SitRep button not to be highlighted next turn if the SitRep automatically was showed due to a new SitRep being available. -May have caused a minor bug where occasionally the SidePanel open sound isn't played if the production screen is opened and closed first. -Implemented Empire::RemovePartType and Empire::RemoveHullType -Changed SidePanel to not show infopanels for all planets - had changed to show them all for debugging purposes, similar to universe show all objects that was recently undone. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-01-02 05:57:47 UTC (rev 2711) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-01-02 10:44:46 UTC (rev 2712) @@ -2047,17 +2047,26 @@ void Empire::RemoveBuildingType(const std::string& name) { + std::set<std::string>::const_iterator it = m_available_building_types.find(name); + if (it == m_available_building_types.end()) + Logger().debugStream() << "Empire::RemoveBuildingType asked to remove building type " << name << " that was no available to this empire"; m_available_building_types.erase(name); } void Empire::RemovePartType(const std::string& name) { - // TODO: THIS + std::set<std::string>::const_iterator it = m_available_part_types.find(name); + if (it == m_available_part_types.end()) + Logger().debugStream() << "Empire::RemovePartType asked to remove part type " << name << " that was no available to this empire"; + m_available_part_types.erase(name); } void Empire::RemoveHullType(const std::string& name) { - // TODO: THIS + std::set<std::string>::const_iterator it = m_available_hull_types.find(name); + if (it == m_available_hull_types.end()) + Logger().debugStream() << "Empire::RemoveHullType asked to remove hull type " << name << " that was no available to this empire"; + m_available_hull_types.erase(name); } void Empire::ClearSitRep() Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2009-01-02 05:57:47 UTC (rev 2711) +++ trunk/FreeOrion/Empire/Empire.h 2009-01-02 10:44:46 UTC (rev 2712) @@ -377,8 +377,8 @@ void RemoveTech(const std::string& name); ///< Removes the given Tech from the empire's list void LockItem(const ItemSpec& item); ///< Removes a given buildable item (Building, ShipComponent, etc.) from the list of available buildable items. void RemoveBuildingType(const std::string& name); ///< Removes the given BuildingType from the empire's list - void RemovePartType(const std::string& name); ///< - void RemoveHullType(const std::string& name); ///< + void RemovePartType(const std::string& name); ///< Removes the given PartType from the empire's list + void RemoveHullType(const std::string& name); ///< Removes the given HullType from the empire's list void RemoveShipDesign(int ship_design_id); ///< Removes the ShipDesign with the given id from the empire's set void UpdateSystemSupplyRanges(); ///< Calculates ranges that systems can send fleet and resource supplies. Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-02 05:57:47 UTC (rev 2711) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-02 10:44:46 UTC (rev 2712) @@ -1055,20 +1055,11 @@ // HACK! The first time this SitRepPanel gets an update, the report row(s) are misaligned. I have no idea why, and // I am sick of dealing with it, so I'm forcing another update in order to force it to behave. m_sitrep_panel->Update(); + empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); - if (empire && empire->NumSitRepEntries()) { - AttachChild(m_sitrep_panel); - MoveChildUp(m_sitrep_panel); - m_sitrep_panel->Show(); - } else { - DetachChild(m_sitrep_panel); - m_sitrep_panel->Hide(); - } + if (empire && empire->NumSitRepEntries()) + ShowSitRep(); - m_research_wnd->Hide(); - m_production_wnd->Hide(); - m_design_wnd->Hide(); - m_in_production_view_mode = false; m_chat_edit->Hide(); EnableAlphaNumAccels(); @@ -1491,7 +1482,7 @@ } m_side_panel->Hide(); // only show ProductionWnd's sidepanel when ProductionWnd is open DetachChild(m_side_panel); - } else { + } else { if (!m_side_panel->Visible() || system_id != m_side_panel->SystemID()) { m_side_panel->SetSystem(system_id); @@ -2360,10 +2351,10 @@ { CloseAllPopups(); RemoveAccelerators(); - m_research_wnd->Hide(); - m_production_wnd->Hide(); - m_design_wnd->Hide(); - m_in_production_view_mode = false; + HideResearch(); + HideProduction(); + HideDesign(); + HideSitRep(); m_toolbar->Hide(); m_FPS->Hide(); } @@ -2388,26 +2379,17 @@ bool MapWnd::ReturnToMap() { if (m_sitrep_panel->Visible()) - m_sitrep_panel->Hide(); - if (m_research_wnd->Visible()) { - m_research_wnd->Hide(); - HumanClientApp::GetApp()->MoveDown(m_research_wnd); - } - if (m_design_wnd->Visible()) { - m_design_wnd->Hide(); - HumanClientApp::GetApp()->MoveDown(m_design_wnd); - EnableAlphaNumAccels(); - } - if (m_production_wnd->Visible()) { - m_production_wnd->Hide(); - if (m_in_production_view_mode) { - m_in_production_view_mode = false; - ShowAllPopups(); - if (!m_side_panel->Visible()) - m_side_panel->SetSystem(m_side_panel->SystemID()); - } - HumanClientApp::GetApp()->MoveDown(m_production_wnd); - } + ToggleSitRep(); + + if (m_research_wnd->Visible()) + ToggleResearch(); + + if (m_design_wnd->Visible()) + ToggleDesign(); + + if (m_production_wnd->Visible()) + ToggleProduction(); + return true; } @@ -2432,155 +2414,150 @@ return true; } -bool MapWnd::ToggleSitRep() +void MapWnd::ShowSitRep() { ClearProjectedFleetMovementLines(); - if (m_sitrep_panel->Visible()) { - DetachChild(m_sitrep_panel); - m_sitrep_panel->Hide(); // necessary so it won't be visible when next toggled - m_btn_siterep->MarkNotSelected(); - } else { - // hide other "competing" windows - m_research_wnd->Hide(); - HumanClientApp::GetApp()->MoveDown(m_research_wnd); - if (m_design_wnd->Visible()) { - m_design_wnd->Hide(); - HumanClientApp::GetApp()->MoveDown(m_design_wnd); - EnableAlphaNumAccels(); - } - m_production_wnd->Hide(); - if (m_in_production_view_mode) { - m_in_production_view_mode = false; - ShowAllPopups(); - if (!m_side_panel->Visible()) - m_side_panel->SetSystem(m_side_panel->SystemID()); - } - HumanClientApp::GetApp()->MoveDown(m_production_wnd); - // show the sitrep window - AttachChild(m_sitrep_panel); - MoveChildUp(m_sitrep_panel); - m_sitrep_panel->Show(); + // hide other "competing" windows + HideResearch(); + HideProduction(); + HideDesign(); - // indicate selections on buttons - m_btn_siterep->MarkSelectedGray(); - m_btn_research->MarkNotSelected(); - m_btn_production->MarkNotSelected(); - m_btn_design->MarkNotSelected(); - } + // show the sitrep window + AttachChild(m_sitrep_panel); + MoveChildUp(m_sitrep_panel); + m_sitrep_panel->Show(); + + // indicate selection on button + m_btn_siterep->MarkSelectedGray(); +} + +void MapWnd::HideSitRep() +{ + DetachChild(m_sitrep_panel); + m_sitrep_panel->Hide(); // necessary so it won't be visible when next toggled + m_btn_siterep->MarkNotSelected(); +} + +bool MapWnd::ToggleSitRep() +{ + if (m_sitrep_panel->Visible()) + HideSitRep(); + else + ShowSitRep(); return true; } -bool MapWnd::ToggleResearch() +void MapWnd::ShowResearch() { ClearProjectedFleetMovementLines(); - if (m_research_wnd->Visible()) { - m_research_wnd->Hide(); - m_btn_research->MarkNotSelected(); - } else { - // hide other "competing" windows - m_sitrep_panel->Hide(); - if (m_design_wnd->Visible()) { - m_design_wnd->Hide(); - EnableAlphaNumAccels(); - } - m_production_wnd->Hide(); - if (m_in_production_view_mode) { - m_in_production_view_mode = false; - ShowAllPopups(); - if (!m_side_panel->Visible()) - m_side_panel->SetSystem(m_side_panel->SystemID()); - } - // show the research window - m_research_wnd->Show(); - GG::GUI::GetGUI()->MoveUp(m_research_wnd); + // hide other "competing" windows + HideSitRep(); + HideProduction(); + HideDesign(); - // indicate selections on buttons - m_btn_siterep->MarkNotSelected(); - m_btn_research->MarkSelectedGray(); - m_btn_production->MarkNotSelected(); - m_btn_design->MarkNotSelected(); - } + // show the research window + m_research_wnd->Show(); + GG::GUI::GetGUI()->MoveUp(m_research_wnd); + + // indicate selection on button + m_btn_research->MarkSelectedGray(); +} + +void MapWnd::HideResearch() +{ + m_research_wnd->Hide(); + m_btn_research->MarkNotSelected(); + ShowAllPopups(); +} + +bool MapWnd::ToggleResearch() +{ + if (m_research_wnd->Visible()) + HideResearch(); + else + ShowResearch(); return true; } -bool MapWnd::ToggleProduction() +void MapWnd::ShowProduction() { ClearProjectedFleetMovementLines(); - if (m_production_wnd->Visible()) { - m_production_wnd->Hide(); - m_in_production_view_mode = false; - m_btn_production->MarkNotSelected(); - ShowAllPopups(); - } else { - // hide other "competing" windows - m_sitrep_panel->Hide(); - DetachChild(m_sitrep_panel); - m_research_wnd->Hide(); - if (m_design_wnd->Visible()) { - m_design_wnd->Hide(); - EnableAlphaNumAccels(); - } - // show the production window - m_production_wnd->Show(); - m_in_production_view_mode = true; - HideAllPopups(); + // hide other "competing" windows + HideSitRep(); + HideResearch(); + HideDesign(); - m_side_panel->Hide(); - DetachChild(m_side_panel); + // show the production window + m_production_wnd->Show(); + m_in_production_view_mode = true; + HideAllPopups(); + GG::GUI::GetGUI()->MoveUp(m_production_wnd); - GG::GUI::GetGUI()->MoveUp(m_production_wnd); + // indicate selection on button + m_btn_production->MarkSelectedGray(); - // indicate selections on buttons - m_btn_siterep->MarkNotSelected(); - m_btn_research->MarkNotSelected(); - m_btn_production->MarkSelectedGray(); - m_btn_design->MarkNotSelected(); + // if no system is currently shown in sidepanel, default to this empire's home system (ie. where the capitol is) + if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) + if (const Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) + if (const UniverseObject* obj = GetUniverse().Object(empire->CapitolID())) + m_production_wnd->SelectSystem(obj->SystemID()); +} +void MapWnd::HideProduction() +{ + m_production_wnd->Hide(); + m_in_production_view_mode = false; + m_btn_production->MarkNotSelected(); + ShowAllPopups(); + //if (!m_side_panel->Visible()) + // m_side_panel->SetSystem(m_side_panel->SystemID()); +} - // if no system is currently shown in sidepanel, default to this empire's home system (ie. where the capitol is) - if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) - if (const Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) - if (const UniverseObject* obj = GetUniverse().Object(empire->CapitolID())) - m_production_wnd->SelectSystem(obj->SystemID()); - } +bool MapWnd::ToggleProduction() +{ + if (m_production_wnd->Visible()) + HideProduction(); + else + ShowProduction(); return true; } -bool MapWnd::ToggleDesign() +void MapWnd::ShowDesign() { ClearProjectedFleetMovementLines(); - if (m_design_wnd->Visible()) { - m_design_wnd->Hide(); - m_btn_design->MarkNotSelected(); - EnableAlphaNumAccels(); - } else { - // hide other "competing" windows - m_sitrep_panel->Hide(); - m_research_wnd->Hide(); - m_production_wnd->Hide(); - if (m_in_production_view_mode) { - m_in_production_view_mode = false; - ShowAllPopups(); - if (!m_side_panel->Visible()) - m_side_panel->SetSystem(m_side_panel->SystemID()); - } - // show the design window - m_design_wnd->Show(); - GG::GUI::GetGUI()->MoveUp(m_design_wnd); - GG::GUI::GetGUI()->SetFocusWnd(m_design_wnd); - DisableAlphaNumAccels(); - m_design_wnd->Reset(); + // hide other "competing" windows + HideSitRep(); + HideResearch(); + HideProduction(); - // indicate selections on buttons - m_btn_siterep->MarkNotSelected(); - m_btn_research->MarkNotSelected(); - m_btn_production->MarkNotSelected(); - m_btn_design->MarkSelectedGray(); - } + // show the design window + m_design_wnd->Show(); + GG::GUI::GetGUI()->MoveUp(m_design_wnd); + //GG::GUI::GetGUI()->SetFocusWnd(m_design_wnd); + DisableAlphaNumAccels(); + m_design_wnd->Reset(); + + // indicate selection on button + m_btn_design->MarkSelectedGray(); +} + +void MapWnd::HideDesign() +{ + m_design_wnd->Hide(); + m_btn_design->MarkNotSelected(); + EnableAlphaNumAccels(); +} + +bool MapWnd::ToggleDesign() +{ + if (m_design_wnd->Visible()) + HideDesign(); + else + ShowDesign(); return true; } @@ -3194,7 +3171,7 @@ // get popup and increment iterator first since closing the popup will change this list by removing the popup MapWndPopup* popup = *it++; popup->Close(); - } + } // clear list m_popups.clear(); } Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-01-02 05:57:47 UTC (rev 2711) +++ trunk/FreeOrion/UI/MapWnd.h 2009-01-02 10:44:46 UTC (rev 2712) @@ -188,10 +188,23 @@ bool ReturnToMap(); bool OpenChatWindow(); bool EndTurn(); + bool ToggleSitRep(); + void ShowSitRep(); + void HideSitRep(); + bool ToggleResearch(); + void ShowResearch(); + void HideResearch(); + bool ToggleProduction(); + void ShowProduction(); + void HideProduction(); + bool ToggleDesign(); + void ShowDesign(); + void HideDesign(); + bool ShowMenu(); bool CloseSystemView(); //!< closes off the current system view bool KeyboardZoomIn(); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-02 05:57:47 UTC (rev 2711) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-02 10:44:46 UTC (rev 2712) @@ -654,7 +654,7 @@ // SidePanel::PlanetPanel //////////////////////////////////////////////// namespace { - static const bool SHOW_ALL_PLANET_PANELS = true; + static const bool SHOW_ALL_PLANET_PANELS = false; } SidePanel::PlanetPanel::PlanetPanel(GG::X w, const Planet &planet, StarType star_type) : @@ -1513,8 +1513,7 @@ if (system && system != s_system) PlaySidePanelOpenSound(); s_system = system; - for (std::set<SidePanel*>::iterator it = s_side_panels.begin(); it != s_side_panels.end(); ++it) { + for (std::set<SidePanel*>::iterator it = s_side_panels.begin(); it != s_side_panels.end(); ++it) (*it)->SetSystemImpl(); - } } |
From: <geo...@us...> - 2009-01-03 02:24:14
|
Revision: 2714 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2714&view=rev Author: geoffthemedio Date: 2009-01-03 02:24:10 +0000 (Sat, 03 Jan 2009) Log Message: ----------- -Initialized some member variables that weren't, which OndrejR posted about on forums -A bit of ProductionWnd.cpp grooming Modified Paths: -------------- trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/network/Message.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-02 16:37:04 UTC (rev 2713) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-03 02:24:10 UTC (rev 2714) @@ -211,7 +211,6 @@ m_production_info_panel = new ProductionInfoPanel(PRODUCTION_INFO_AND_QUEUE_WIDTH, GG::Y(200), UserString("PRODUCTION_INFO_PANEL_TITLE"), UserString("PRODUCTION_INFO_PP"), OUTER_LINE_THICKNESS, ClientUI::KnownTechFillColor(), ClientUI::KnownTechTextAndBorderColor()); m_queue_lb = new QueueListBox(GG::X(2), m_production_info_panel->LowerRight().y, m_production_info_panel->Width() - 4, ClientSize().y - 4 - m_production_info_panel->Height(), "PRODUCTION_QUEUE_ROW"); - GG::Connect(m_queue_lb->QueueItemMoved, &ProductionWnd::QueueItemMoved, this); m_queue_lb->SetStyle(GG::LIST_NOSORT | GG::LIST_NOSEL | GG::LIST_USERDELETE); GG::Pt buid_designator_wnd_size = ClientSize() - GG::Pt(m_production_info_panel->Width(), GG::Y(6)); m_build_designator_wnd = new BuildDesignatorWnd(buid_designator_wnd_size.x, buid_designator_wnd_size.y); @@ -219,13 +218,14 @@ EnableChildClipping(true); - GG::Connect(m_build_designator_wnd->AddNamedBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); - GG::Connect(m_build_designator_wnd->AddIDedBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); - GG::Connect(m_build_designator_wnd->BuildQuantityChangedSignal, &ProductionWnd::ChangeBuildQuantitySlot, this); - GG::Connect(m_build_designator_wnd->SystemSelectedSignal, SystemSelectedSignal); - GG::Connect(m_queue_lb->ErasedSignal, &ProductionWnd::QueueItemDeletedSlot, this); - GG::Connect(m_queue_lb->LeftClickedSignal, &ProductionWnd::QueueItemClickedSlot, this); - GG::Connect(m_queue_lb->DoubleClickedSignal, &ProductionWnd::QueueItemDoubleClickedSlot, this); + GG::Connect(m_build_designator_wnd->AddNamedBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); + GG::Connect(m_build_designator_wnd->AddIDedBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); + GG::Connect(m_build_designator_wnd->BuildQuantityChangedSignal, &ProductionWnd::ChangeBuildQuantitySlot, this); + GG::Connect(m_build_designator_wnd->SystemSelectedSignal, SystemSelectedSignal); + GG::Connect(m_queue_lb->QueueItemMoved, &ProductionWnd::QueueItemMoved, this); + GG::Connect(m_queue_lb->ErasedSignal, &ProductionWnd::QueueItemDeletedSlot, this); + GG::Connect(m_queue_lb->LeftClickedSignal, &ProductionWnd::QueueItemClickedSlot, this); + GG::Connect(m_queue_lb->DoubleClickedSignal, &ProductionWnd::QueueItemDoubleClickedSlot, this); AttachChild(m_production_info_panel); AttachChild(m_queue_lb); @@ -351,9 +351,8 @@ const GG::X QUEUE_WIDTH = m_queue_lb->Width() - 8 - 14; int i = 0; - for (ProductionQueue::const_iterator it = queue.begin(); it != queue.end(); ++it, ++i) { + for (ProductionQueue::const_iterator it = queue.begin(); it != queue.end(); ++it, ++i) m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, *it, i)); - } if (!m_queue_lb->Empty()) { m_queue_lb->BringRowIntoView(--m_queue_lb->end()); Modified: trunk/FreeOrion/network/Message.cpp =================================================================== --- trunk/FreeOrion/network/Message.cpp 2009-01-02 16:37:04 UTC (rev 2713) +++ trunk/FreeOrion/network/Message.cpp 2009-01-03 02:24:10 UTC (rev 2714) @@ -122,6 +122,7 @@ m_type(UNDEFINED), m_sending_player(0), m_receiving_player(0), + m_synchronous_response(false), m_message_size(0), m_message_text(0) {} Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2009-01-02 16:37:04 UTC (rev 2713) +++ trunk/FreeOrion/server/ServerApp.cpp 2009-01-03 02:24:10 UTC (rev 2714) @@ -74,7 +74,8 @@ boost::bind(&ServerApp::PlayerDisconnected, this, _1)), m_log_category(log4cpp::Category::getRoot()), m_fsm(*this), - m_current_turn(INVALID_GAME_TURN) + m_current_turn(INVALID_GAME_TURN), + m_single_player_game(false) { if (s_app) throw std::runtime_error("Attempted to construct a second instance of singleton class ServerApp"); Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-01-02 16:37:04 UTC (rev 2713) +++ trunk/FreeOrion/universe/Universe.cpp 2009-01-03 02:24:10 UTC (rev 2714) @@ -345,7 +345,9 @@ bool Universe::s_inhibit_universe_object_signals = false; int Universe::s_encoding_empire = ALL_EMPIRES; -Universe::Universe() +Universe::Universe() : + m_last_allocated_object_id(UniverseObject::INVALID_OBJECT_ID), + m_last_allocated_design_id(UniverseObject::INVALID_OBJECT_ID) {} const Universe& Universe::operator=(Universe& rhs) |
From: <geo...@us...> - 2009-01-03 09:56:42
|
Revision: 2717 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2717&view=rev Author: geoffthemedio Date: 2009-01-03 09:56:35 +0000 (Sat, 03 Jan 2009) Log Message: ----------- Hopefully fixed [ 2483160 ] Minerals Stockpile Change Not Always Updated At Start of Tur, and a related bug where negative minerals stockpiles were possible. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-01-03 06:06:36 UTC (rev 2716) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-01-03 09:56:35 UTC (rev 2717) @@ -83,6 +83,7 @@ const std::vector<double>& production_status, ProductionQueue::QueueType& queue, std::map<std::set<int>, double>& allocated_pp, int& projects_in_progress) { + Logger().debugStream() << "========SetProdQueueElementSpending========"; // TODO: When combat and blockading are updated to allow an armed ship to be in a system containing an enemy planet without // actually attacking that planet, it will be possible to blockade a system from exchanging resources with itself. This will // mean that planets won't be listed in any resource sharing group, and thus won't be allocated the industry and minerals that @@ -95,6 +96,8 @@ projects_in_progress = 0; allocated_pp.clear(); + Logger().debugStream() << "queue size: " << queue.size(); + int i = 0; for (ProductionQueue::iterator it = queue.begin(); it != queue.end(); ++it, ++i) { ProductionQueue::Element& queue_element = *it; @@ -124,6 +127,7 @@ queue_element.allocated_pp = 0.0; continue; } + Logger().debugStream() << "group has " << group_pp_available << " PP available"; ProductionQueue::ProductionItem& item = queue_element.item; @@ -145,6 +149,7 @@ double item_cost; int build_turns; boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(item); + Logger().debugStream() << "item " << item.name << " costs " << item_cost << " for " << build_turns << " turns"; // determine additional PP needed to complete build queue element: total cost - progress @@ -160,6 +165,8 @@ // resource sharing group double allocation = std::max(std::min(std::min(additional_pp_to_complete_element, item_cost), group_pp_available), 0.0); // added max (..., 0.0) to prevent any negative-allocation bugs that might come up... + Logger().debugStream() << "element accumulated " << element_accumulated_PP << " of total cost " << element_total_cost << " and needs " << additional_pp_to_complete_element << " more to be completed"; + Logger().debugStream() << "... allocating " << allocation; // allocate pp queue_element.allocated_pp = allocation; @@ -168,11 +175,12 @@ allocated_pp[group] += allocation; // assuming the double indexed by group will be default initialized to 0.0 if that entry doesn't already exist in the map group_pp_available -= allocation; + Logger().debugStream() << "... leaving " << group_pp_available << " PP available to group"; + // check if this will complete the element - if (allocation >= additional_pp_to_complete_element - EPSILON) { + if (allocation >= additional_pp_to_complete_element - EPSILON) ++projects_in_progress; - } } } @@ -582,12 +590,15 @@ { if (!empire) { Logger().errorStream() << "ProductionQueue::Update passed null empire. doing nothing."; + m_projects_in_progress = 0; + m_system_group_allocated_pp.clear(); return; } if (m_queue.empty()) { Logger().debugStream() << "ProductionQueue::Update aborting early due to an empty queue"; m_projects_in_progress = 0; + m_system_group_allocated_pp.clear(); if (!production_status.empty()) Logger().errorStream() << "warnong: ProductionQueue::Update queue was empty, but passed production_status was not."; @@ -651,9 +662,10 @@ if (!simulate_future) { + Logger().debugStream() << "not enough PP to be worth simulating future turns production. marking everything as never complete"; // since there are so few PPs, indicate that the number of turns left is indeterminate by providing a number < 0 for (ProductionQueue::QueueType::iterator queue_it = m_queue.begin(); queue_it != m_queue.end(); ++queue_it) { - queue_it->turns_left_to_next_item = -1; + queue_it->turns_left_to_next_item = -1; // -1 is sentinel value indicating never to be complete. ProductionWnd checks for turns to completeion less than 0 and displays "NEVER" when appropriate queue_it->turns_left_to_completion = -1; } ProductionQueueChangedSignal(); @@ -2109,6 +2121,7 @@ void Empire::CheckProductionProgress() { + Logger().debugStream() << "========Empire::CheckProductionProgress======="; // following commented line should be redundant, as previous call to UpdateResourcePools should have generated necessary info // m_production_queue.Update(this, m_resource_pools, m_production_progress); @@ -2226,7 +2239,7 @@ if (group.find(stockpile_system_id) != group.end()) { // check for stockpile system stockpile_group_pp_allocation = it->second; // record allocation for this group - Logger().debugStream() << "Empire::CheckGrowthFoodProgress found group of systems for stockpile system. size: " << it->first.size(); + Logger().debugStream() << "Empire::CheckProductionProgress found group of systems for stockpile system. size: " << it->first.size(); break; } @@ -2255,6 +2268,8 @@ void Empire::CheckGrowthFoodProgress() { + Logger().debugStream() << "========Empire::CheckGrowthFoodProgress======="; + boost::shared_ptr<ResourcePool> pool = m_resource_pools[RE_FOOD]; const PopulationPool& pop_pool = m_population_pool; // adding a reference to a member variable of this object for consistency with other implementation of this code in MapWnd @@ -2415,6 +2430,8 @@ void Empire::UpdateProductionQueue() { + Logger().debugStream() << "========= Production Update for empire: " << EmpireID() << " ========"; + m_resource_pools[RE_MINERALS]->Update(); m_resource_pools[RE_INDUSTRY]->Update(); m_production_queue.Update(this, m_resource_pools, m_production_progress); @@ -2448,7 +2465,7 @@ // locally when such a blockade occurs. The food distribution code probably needs to be updated to allow a ResourceCenter // that is also a PopCenter to use its own food production in cases where its system is not part of any resource-sharing group. - Logger().debugStream() << "@@@@ Food distribution for empire: " << EmpireID() << " @@@@"; + Logger().debugStream() << "======= Food distribution for empire: " << EmpireID() << " ======="; m_resource_pools[RE_FOOD]->Update(); // recalculate total food production int stockpile_system_id = m_resource_pools[RE_FOOD]->StockpileSystemID(); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-03 06:06:36 UTC (rev 2716) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-03 09:56:35 UTC (rev 2717) @@ -2642,7 +2642,7 @@ if (group.find(stockpile_system_id) != group.end()) { // check for stockpile system stockpile_group_systems = group; - Logger().debugStream() << "Empire::CheckGrowthFoodProgress found group of systems for stockpile system. size: " << stockpile_group_systems.size(); + Logger().debugStream() << "MapWnd::RefreshFoodResourceIndicator found group of systems for stockpile system. size: " << stockpile_group_systems.size(); break; } @@ -2737,7 +2737,7 @@ if (group.find(stockpile_system_id) != group.end()) { // check for stockpile system stockpile_group_pp_allocation = it->second; // record allocation for this group - Logger().debugStream() << "Empire::CheckGrowthFoodProgress found group of systems for stockpile system. size: " << it->first.size(); + Logger().debugStream() << "MapWnd::RefreshMineralsResourceIndicator found group of systems for stockpile system. size: " << it->first.size(); break; } |
From: <geo...@us...> - 2009-01-03 11:53:08
|
Revision: 2718 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2718&view=rev Author: geoffthemedio Date: 2009-01-03 11:53:04 +0000 (Sat, 03 Jan 2009) Log Message: ----------- -Fixed a food distribution calculation bug where the food available to a group of systems was only counting the food production of the first ResourceCenter found to be located in each system -Removed some debugging code that was specific to a particular universe that was being generated in my tests Modified Paths: -------------- trunk/FreeOrion/Empire/ResourcePool.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Planet.cpp Modified: trunk/FreeOrion/Empire/ResourcePool.cpp =================================================================== --- trunk/FreeOrion/Empire/ResourcePool.cpp 2009-01-03 09:56:35 UTC (rev 2717) +++ trunk/FreeOrion/Empire/ResourcePool.cpp 2009-01-03 11:53:04 UTC (rev 2718) @@ -191,24 +191,27 @@ // sum production from all ResourceCenters in each group, for resource point type appropriate for this pool MeterType meter_type = ResourceToMeter(m_type); + if (INVALID_METER_TYPE == meter_type) + Logger().errorStream() << "ResourcePool::Update() called when m_type can't be converted to a valid MeterType"; + // for every group... for (std::map<std::set<int>, double>::iterator it = m_supply_system_groups_resource_production.begin(); it != m_supply_system_groups_resource_production.end(); ++it) { // sum production from from all ResourceCenters in this pool that are located in a system in this group - it->second = 0.0; // zero production for this pool before beginning accumulation const std::set<int>& group_ids = it->first; // extract the set of systems that this group comprises double& group_production = it->second; // to be updated later... + group_production = 0.0; // zero production for this pool before beginning accumulation // loop through systems in group, checking each resource center to see if it is located therein for (std::set<int>::const_iterator group_it = group_ids.begin(); group_it != group_ids.end(); ++group_it) { int system_in_group_id = *group_it; // get system to check resource centers against - //// DEBUG - //const UniverseObject* system = GetUniverse().Object(system_in_group_id); - //if (!system) - // Logger().errorStream() << "ResourcePool::Update tried to get a system that doesn't exist but is listed in a supply system group"; - //Logger().debugStream() << "... system: " << system->Name() << "(" << system_in_group_id << ")"; - //// END DEBUG + // DEBUG + const UniverseObject* system = GetUniverse().Object(system_in_group_id); + if (!system) + Logger().errorStream() << "ResourcePool::Update tried to get a system that doesn't exist but is listed in a supply system group"; + Logger().debugStream() << "... system: " << system->Name() << "(" << system_in_group_id << ")"; + // END DEBUG // check all ResourceCenters in this pool to see if any are in this system. for (std::map<const ResourceCenter*, const UniverseObject*>::const_iterator obj_it = m_resource_center_objs.begin(); obj_it != m_resource_center_objs.end(); ++obj_it) { @@ -216,10 +219,12 @@ // add this ResourceCenter's production to the group pool const ResourceCenter* rc = obj_it->first; group_production += rc->ProjectedMeterPoints(meter_type); - Logger().debugStream() << "... ... contributes: " << rc->ProjectedMeterPoints(meter_type); - break; // assuming ResourceCenter are located in only one system + Logger().debugStream() << "... ... " << obj_it->second->Name() << " contributes: " << rc->ProjectedMeterPoints(meter_type); } } + + // this checks all ResourceCenter against all systems, even if a system has already been found for a ResourceCenter. Some + // fancy caching or swapping the inner and outer loops might be a performance improvement... or detriment. } Logger().debugStream() << "... group production: " << group_production; } Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2009-01-03 09:56:35 UTC (rev 2717) +++ trunk/FreeOrion/server/ServerApp.cpp 2009-01-03 11:53:04 UTC (rev 2718) @@ -476,16 +476,6 @@ Universe& universe = GetUniverse(); EmpireManager& empires = Empires(); - for (Universe::const_iterator blah = universe.begin(); blah != universe.end(); ++blah) { - const UniverseObject* obj = blah->second; - if (obj->Name() == "Hagalaz II") { - Logger().debugStream() << "Hagalaz II at start of ProcessTurns"; - for (MeterType meter_type = MeterType(0); meter_type != NUM_METER_TYPES; meter_type = MeterType(meter_type + 1)) - if (const Meter* meter = obj->GetMeter(meter_type)) - Logger().debugStream() << "...type: " << boost::lexical_cast<std::string>(meter_type) << " val: " << meter->Current() << "/" << meter->Max(); - break; - } - } // Now all orders, then process turns for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-01-03 09:56:35 UTC (rev 2717) +++ trunk/FreeOrion/universe/Planet.cpp 2009-01-03 11:53:04 UTC (rev 2718) @@ -544,9 +544,6 @@ void Planet::PopGrowthProductionResearchPhase() { - if (Name() == "Hagalaz II") { - Logger().debugStream() << "Hagalaz II Growth"; - } // do not do production if planet was just conquered if (m_just_conquered) m_just_conquered = false; |
From: <geo...@us...> - 2009-01-06 02:36:01
|
Revision: 2724 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2724&view=rev Author: geoffthemedio Date: 2009-01-06 02:35:59 +0000 (Tue, 06 Jan 2009) Log Message: ----------- -Made ProductionQueue PP allocation numbers always use 3 digits, instead of reporting numbers like +9.73526 PP -Made buildings be captured rather than be destroyed when the planet they are on is captured -Trivial whitespace grooming Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/IntroScreen.h trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/UI/CUIControls.cpp 2009-01-06 02:35:59 UTC (rev 2724) @@ -1038,7 +1038,7 @@ void StatisticIcon::Refresh() { std::string text = ""; - + // first value: always present std::string clr_tag = GG::RgbaTag(ValueColor(0)); text += clr_tag + DoubleToString(m_values[0], m_digits[0], m_integerize[0], m_show_signs[0]) + "</rgba>"; @@ -1056,7 +1056,7 @@ GG::Clr StatisticIcon::ValueColor(int index) const { int effectiveSign = EffectiveSign(m_values.at(index), m_integerize.at(index)); - + if (index == 0) return ClientUI::TextColor(); if (effectiveSign == -1) return ClientUI::StatDecrColor(); Modified: trunk/FreeOrion/UI/IntroScreen.h =================================================================== --- trunk/FreeOrion/UI/IntroScreen.h 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/UI/IntroScreen.h 2009-01-06 02:35:59 UTC (rev 2724) @@ -37,7 +37,7 @@ void OnCredits(); //!< called when credits is clicked void OnExitGame(); //!< called when exit_game is clicked virtual void KeyPress (GG::Key key, boost::uint32_t key_code_point, GG::Flags<GG::ModKey> mod_keys); - + virtual void Close(); virtual void Render(); Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/UI/LinkText.h 2009-01-06 02:35:59 UTC (rev 2724) @@ -9,7 +9,7 @@ class TextLinker { private: - struct BoolCombiner + struct BoolCombiner { typedef bool result_type; template<class InIt> result_type operator()(InIt first, InIt last) const; @@ -57,10 +57,10 @@ static bool s_link_tags_registered; }; -/** allows text that the user sees to emit signals when clicked, and indicates to the user visually which text +/** allows text that the user sees to emit signals when clicked, and indicates to the user visually which text represents a link. There is one type of signal for each type of ZoomTo*() method in ClientUI. This allows - any text that refers to game elements to be tagged as such and clicked by the user, emitting a signal of the - appropriate type. These signals can be used to ZoomTo*() an appropriate screen, or take some other action. + any text that refers to game elements to be tagged as such and clicked by the user, emitting a signal of the + appropriate type. These signals can be used to ZoomTo*() an appropriate screen, or take some other action The folowig tags are currently supported: \verbatim <planet ID> @@ -81,7 +81,7 @@ LinkText(GG::X x, GG::Y y, GG::X w, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Flags<GG::TextFormat> format = GG::FORMAT_NONE, GG::Clr color = GG::CLR_BLACK, GG::Flags<GG::WndFlag> flags = GG::CLICKABLE); ///< ctor taking a font directly /** ctor that does not require window size. - Window size is determined from the string and font; the window will be large enough to fit the text as rendered, + Window size is determined from the string and font; the window will be large enough to fit the text as rendered, and no larger. \see DynamicText::DynamicText() */ LinkText(GG::X x, GG::Y y, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color = GG::CLR_BLACK, GG::Flags<GG::WndFlag> flags = GG::CLICKABLE); //@} @@ -104,8 +104,8 @@ 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 - (i.e. if the second ctor type was used), calls to this function cause the window to be resized to whatever + /** sets the text to \a str; may resize the window. If the window was constructed to fit the size of the text + (i.e. if the second ctor type was used), calls to this function cause the window to be resized to whatever space the newly rendered text occupies. */ virtual void SetText(const std::string& str); //@} Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-06 02:35:59 UTC (rev 2724) @@ -153,7 +153,7 @@ top += m_progress_bar->Height() + MARGIN; - std::string turn_spending_text = str(FlexibleFormat(UserString("PRODUCTION_TURN_COST_STR")) % turn_spending); + std::string turn_spending_text = str(FlexibleFormat(UserString("PRODUCTION_TURN_COST_STR")) % DoubleToString(turn_spending, 3, false, false)); m_PPs_and_turns_text = new GG::TextControl(left, top, TURNS_AND_COST_WIDTH, GG::Y(FONT_PTS + MARGIN), turn_spending_text, font, clr, GG::FORMAT_LEFT); Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-06 02:35:59 UTC (rev 2724) @@ -119,14 +119,14 @@ m_name_text->ClipText(true); top += m_name_text->Height(); // not sure why I need two margins here... otherwise the progress bar appears over the bottom of the text - + m_progress_bar = new MultiTurnProgressBar(METER_WIDTH, METER_HEIGHT, tech->ResearchTurns(), turns_completed, partially_complete_turn, ClientUI::TechWndProgressBar(), ClientUI::TechWndProgressBarBackground(), clr); m_progress_bar->MoveTo(GG::Pt(left, top)); top += m_progress_bar->Height() + MARGIN; - + using boost::io::str; using boost::format; @@ -135,7 +135,7 @@ turns_cost_text, font, clr, GG::FORMAT_LEFT); left += TURNS_AND_COST_WIDTH; - + std::string turns_left_text = turns_left < 0 ? UserString("TECH_TURNS_LEFT_NEVER") : str(format(UserString("TECH_TURNS_LEFT_STR")) % turns_left); m_turns_remaining_text = new GG::TextControl(left, top, TURNS_AND_COST_WIDTH, GG::Y(FONT_PTS + MARGIN), turns_left_text, font, clr, GG::FORMAT_RIGHT); Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/universe/Building.cpp 2009-01-06 02:35:59 UTC (rev 2724) @@ -244,7 +244,7 @@ if (as_production_item && location && to_empire) return CR_CAPTURE; - return CR_DESTROY; + return CR_CAPTURE; } ///////////////////////////////////////////////// Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2009-01-05 13:26:09 UTC (rev 2723) +++ trunk/FreeOrion/util/Order.h 2009-01-06 02:35:59 UTC (rev 2724) @@ -32,7 +32,7 @@ Order(int empire) : m_empire(empire) {} ///< ctor taking the ID of the Empire issuing the order virtual ~Order() {} //@} - + /** \name Accessors */ //@{ int EmpireID() const {return m_empire;} ///< returns the ID of the Empire issuing the order @@ -132,7 +132,7 @@ private: /** - * Preconditions of execute: + * Preconditions of execute: * None. * * Postconditions: @@ -258,7 +258,7 @@ int PlanetID() const {return m_planet;} ///< returns ID of the planet to be colonized int ShipID () const {return m_ship ;} ///< returns ID of the ship which is colonizing the planet - virtual void ServerExecute() const; //< called if the server allows the colonization effort + virtual void ServerExecute() const; //< called if the server allows the colonization effort //@} private: @@ -471,7 +471,7 @@ private: /** - * Preconditions of execute: + * Preconditions of execute: * - For creating a new design, the passed design is a valid reference to a design created by the * empire issuing the order * - For remembering an existing ship design, there exists a ship design with the passed id, and |
From: <tz...@us...> - 2009-01-07 03:17:43
|
Revision: 2727 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2727&view=rev Author: tzlaine Date: 2009-01-07 03:17:41 +0000 (Wed, 07 Jan 2009) Log Message: ----------- Changes to bring code into agreement with recent GG changes. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/GalaxySetupWnd.h trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h trunk/FreeOrion/UI/TurnProgressWnd.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -1185,7 +1185,7 @@ continue; // TODO: consider future special case if current object is itself a system // check if object has a construction meter - if (const Meter* construction = obj->GetMeter(METER_CONSTRUCTION)) { + if (obj->GetMeter(METER_CONSTRUCTION)) { // get resource supply range for next turn for this object int resource_supply_range = static_cast<int>(floor(obj->ProjectedCurrentMeter(METER_CONSTRUCTION) / 20.0)); @@ -1196,7 +1196,7 @@ } // check if object has a supply meter - if (const Meter* supply_meter = obj->GetMeter(METER_SUPPLY)) { + if (obj->GetMeter(METER_SUPPLY)) { // get fleet supply range for next turn for this object int fleet_supply_range = static_cast<int>(floor(obj->ProjectedCurrentMeter(METER_SUPPLY))); @@ -2468,8 +2468,6 @@ Logger().debugStream() << "======= Food distribution for empire: " << EmpireID() << " ======="; m_resource_pools[RE_FOOD]->Update(); // recalculate total food production - int stockpile_system_id = m_resource_pools[RE_FOOD]->StockpileSystemID(); - double stockpile = m_resource_pools[RE_FOOD]->Stockpile(); std::vector<PopCenter*> pop_centers = m_population_pool.PopCenters(); std::vector<ResourceCenter*> resource_centers = m_resource_pools[RE_FOOD]->ResourceCenters(); Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/CUIControls.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -830,9 +830,9 @@ return CUIMultiEdit::TextLowerRight(); } -const std::string& CUILinkTextMultiEdit::WindowText() const +std::string CUILinkTextMultiEdit::Text_() const { - return CUIMultiEdit::WindowText(); + return CUIMultiEdit::Text(); } void CUILinkTextMultiEdit::Render() Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/CUIControls.h 2009-01-07 03:17:41 UTC (rev 2727) @@ -308,7 +308,7 @@ virtual const boost::shared_ptr<GG::Font>& GetFont() const; virtual GG::Pt TextUpperLeft() const; virtual GG::Pt TextLowerRight() const; - virtual const std::string& WindowText() const; + virtual std::string Text_() const; //@} /** \name Mutators */ //@{ @@ -319,9 +319,10 @@ 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 - (i.e. if the second ctor type was used), calls to this function cause the window to be resized to whatever - space the newly rendered text occupies. */ + /** sets the text to \a str; may resize the window. If the window was + constructed to fit the size of the text (i.e. if the second ctor type + was used), calls to this function cause the window to be resized to + whatever space the newly rendered text occupies. */ virtual void SetText(const std::string& str); //@} Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -153,8 +153,8 @@ m_close_button(0), m_minimize_button(0) { - // set window text - SetText(t); + // set window name + SetName(t); // call to CUIWnd::MinimizedWidth() because MinimizedWidth is virtual SetMinSize(GG::Pt(CUIWnd::MinimizedWidth(), BORDER_TOP + INNER_BORDER_ANGLE_OFFSET + BORDER_BOTTOM + 50)); InitButtons(); @@ -247,7 +247,7 @@ glColor(ClientUI::TextColor()); boost::shared_ptr<GG::Font> font = ClientUI::GetTitleFont(); - font->RenderText(GG::Pt(ul.x + BORDER_LEFT, ul.y), WindowText()); + font->RenderText(GG::Pt(ul.x + BORDER_LEFT, ul.y), Name()); } void CUIWnd::LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -433,6 +433,6 @@ void CUIEditWnd::OkClicked() { - m_result = m_edit->WindowText(); + m_result = m_edit->Text(); CloseClicked(); } Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -1622,14 +1622,14 @@ const std::string& DesignWnd::MainPanel::DesignName() const { if (m_design_name) - return m_design_name->WindowText(); + return m_design_name->Text(); else return EMPTY_STRING; } const std::string& DesignWnd::MainPanel::DesignDescription() const { if (m_design_description) - return m_design_description->WindowText(); + return m_design_description->Text(); else return EMPTY_STRING; } Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -404,7 +404,7 @@ GG::ListBox::Row(PANEL_WD - ClientUI::ScrollWidth(), PANEL_HT + 4, fleet ? FLEET_DROP_TYPE_STRING : ""), m_fleet(fleet) { - SetText("FleetRow"); + SetName("FleetRow"); EnableChildClipping(); push_back(new FleetDataPanel(Width(), PANEL_HT, m_fleet)); } @@ -426,7 +426,7 @@ GG::ListBox::Row(PANEL_WD - ClientUI::ScrollWidth(), PANEL_HT + 4, SHIP_DROP_TYPE_STRING), m_ship(ship) { - SetText("ShipRow"); + SetName("ShipRow"); if (!ship) throw std::invalid_argument("ShipRow::ShipRow() : Attempted to contruct a ShipRow using a null ship pointer."); @@ -930,7 +930,7 @@ m_ships_lb(0), m_ship_status_text(0) { - SetText("FleetDetailPanel"); + SetName("FleetDetailPanel"); EnableChildClipping(true); m_destination_text = new GG::TextControl(GG::X0, GG::Y0, FLEET_LISTBOX_WIDTH, GG::Y(ClientUI::Pts() + 4), "temp", ClientUI::GetFont(), ClientUI::TextColor(), GG::FORMAT_LEFT); @@ -1059,14 +1059,15 @@ if (popup.Run()) { switch (popup.MenuID()) { case 1: { // rename ship - std::string ship_name = (**it)[0]->WindowText(); + GG::TextControl* text_control = boost::polymorphic_downcast<GG::TextControl*>((**it)[0]); + std::string ship_name = text_control->Text(); CUIEditWnd edit_wnd(GG::X(350), UserString("ENTER_NEW_NAME"), ship_name); edit_wnd.Run(); if (edit_wnd.Result() != "") { HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), ship->ID(), edit_wnd.Result()))); - (**it)[0]->SetText(edit_wnd.Result()); + text_control->SetText(edit_wnd.Result()); } break;} default: @@ -1143,7 +1144,7 @@ GridLayout(); GetLayout()->SetBorderMargin(7); SetMaxSize(GG::Pt(Width(), MaxSize().y)); - SetText(TitleText()); + SetName(TitleText()); EnableChildClipping(false); } @@ -1276,7 +1277,7 @@ if (!m_read_only) GG::Connect(m_new_fleet_drop_target->NewFleetFromShipsSignal, &FleetWnd::CreateNewFleetFromDrops, this); - SetText(TitleText()); + SetName(TitleText()); if (GetOptionsDB().Get<bool>("UI.fleet-autoselect") && !fleets.empty()) { GG::ListBox::iterator it = boost::next(m_fleets_lb->begin(), selected_fleet); @@ -1382,7 +1383,7 @@ HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID(), edit_wnd.Result()))); - (**it)[0]->SetText(edit_wnd.Result()); + boost::polymorphic_downcast<GG::TextControl*>((**it)[0])->SetText(edit_wnd.Result()); } break; } Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -351,9 +351,9 @@ Init(); } -const std::string& GalaxySetupWnd::EmpireName() const +std::string GalaxySetupWnd::EmpireName() const { - return m_empire_name_edit->WindowText(); + return m_empire_name_edit->Text(); } GG::Clr GalaxySetupWnd::EmpireColor() const Modified: trunk/FreeOrion/UI/GalaxySetupWnd.h =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.h 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/GalaxySetupWnd.h 2009-01-07 03:17:41 UTC (rev 2727) @@ -100,7 +100,7 @@ /** returns the panel containing all the user-chosen options. */ const GalaxySetupPanel& Panel() const {return *m_galaxy_setup_panel;} - const std::string& EmpireName() const; + std::string EmpireName() const; GG::Clr EmpireColor() const; int NumberAIs() const; //!@} Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -318,7 +318,7 @@ m_multi_icon_value_indicator(0), m_multi_meter_status_bar(0), m_expand_button(0) { - SetText("PopulationPanel"); + SetName("PopulationPanel"); const PopCenter* pop = dynamic_cast<const PopCenter*>(&obj); if (!pop) @@ -592,7 +592,7 @@ m_secondary_focus_drop(0), m_expand_button(0) { - SetText("ResourcePanel"); + SetName("ResourcePanel"); const ResourceCenter* res = dynamic_cast<const ResourceCenter*>(&obj); if (!res) @@ -1131,7 +1131,7 @@ m_multi_meter_status_bar(0), m_expand_button(0) { - SetText("MilitaryPanel"); + SetName("MilitaryPanel"); // expand / collapse button at top right m_expand_button = new GG::Button(w - 16, GG::Y0, GG::X(16), GG::Y(16), "", ClientUI::GetFont(), GG::CLR_WHITE, GG::CLR_ZERO, GG::ONTOP | GG::CLICKABLE); @@ -1430,7 +1430,7 @@ { m_obj_vec.push_back(&obj); - SetText("MultiIconValueIndicator"); + SetName("MultiIconValueIndicator"); GG::X x(EDGE_PAD); for (std::vector<MeterType>::const_iterator it = m_meter_types.begin(); it != m_meter_types.end(); ++it) { @@ -1452,7 +1452,7 @@ m_meter_types(meter_types), m_obj_vec(obj_vec) { - SetText("MultiIconValueIndicator"); + SetName("MultiIconValueIndicator"); GG::X x(EDGE_PAD); for (std::vector<MeterType>::const_iterator it = m_meter_types.begin(); it != m_meter_types.end(); ++it) { @@ -1474,7 +1474,7 @@ m_meter_types(), m_obj_vec() { - SetText("MultiIconValueIndicator"); + SetName("MultiIconValueIndicator"); } bool MultiIconValueIndicator::Empty() @@ -1536,7 +1536,7 @@ m_obj(obj), m_bar_colours() { - SetText("MultiMeterStatusBar"); + SetName("MultiMeterStatusBar"); Update(); } @@ -1682,7 +1682,7 @@ m_building_indicators(), m_expand_button(0) { - SetText("BuildingsPanel"); + SetName("BuildingsPanel"); if (m_columns < 1) throw std::invalid_argument("Attempted to create a BuidingsPanel with less than 1 column"); @@ -2057,7 +2057,7 @@ m_object_id(obj.ID()), m_icons() { - SetText("SpecialsPanel"); + SetName("SpecialsPanel"); Update(); } Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/LinkText.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -78,9 +78,9 @@ return GG::TextControl::GetFont(); } -const std::string& LinkText::WindowText() const +std::string LinkText::Text_() const { - return GG::TextControl::WindowText(); + return GG::TextControl::Text(); } void LinkText::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -180,7 +180,7 @@ if (rollover_link != m_old_rollover_link) { ClearOldRollover(); if (rollover_link != -1) { - std::string text = WindowText(); + std::string text = Text_(); text.insert(m_links[rollover_link].text_posn.first, "<u>"); text.insert(m_links[rollover_link].text_posn.second + 3, "</u>"); SetLinkedText(text); @@ -266,7 +266,7 @@ void TextLinker::ClearOldRollover() { if (m_old_rollover_link != -1) { - std::string text = WindowText(); + std::string text = Text_(); std::string::size_type pos = text.find("<u>", m_links[m_old_rollover_link].text_posn.first); text.erase(pos, 3); pos = text.find("</u>", m_links[m_old_rollover_link].text_posn.first); Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/LinkText.h 2009-01-07 03:17:41 UTC (rev 2727) @@ -34,7 +34,7 @@ virtual GG::Pt TextUpperLeft() const = 0; virtual GG::Pt TextLowerRight() const = 0; virtual void SetLinkedText(const std::string& str) = 0; - virtual const std::string& WindowText() const = 0; + virtual std::string Text_() const = 0; void FindLinks(); ///< finds the links in the text and populates m_links @@ -92,7 +92,7 @@ virtual const std::vector<GG::Font::LineData>& GetLineData() const; virtual const boost::shared_ptr<GG::Font>& GetFont() const; - virtual const std::string& WindowText() const; + virtual std::string Text_() const; //@} /** \name Mutators */ //@{ @@ -104,9 +104,10 @@ 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 - (i.e. if the second ctor type was used), calls to this function cause the window to be resized to whatever - space the newly rendered text occupies. */ + /** sets the text to \a str; may resize the window. If the window was + constructed to fit the size of the text (i.e. if the second ctor type + was used), calls to this function cause the window to be resized to + whatever space the newly rendered text occupies. */ virtual void SetText(const std::string& str); //@} Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -36,21 +36,7 @@ #include <vector> #include <deque> -#define TEST_BROWSE_INFO 0 -#if TEST_BROWSE_INFO -#include <GG/BrowseInfoWnd.h> -class BrowseFoo : public GG::TextBoxBrowseInfoWnd -{ -public: - BrowseFoo() : - TextBoxBrowseInfoWnd(200, ClientUI::Font(), 12, GG::CLR_SHADOW, GG::CLR_WHITE, GG::CLR_WHITE) - {} - void Update(int mode, const GG::Wnd* target) - { SetText("mode=" + boost::lexical_cast<std::string>(mode) + " wnd=" + target->WindowText()); } -}; -#endif - namespace { const double ZOOM_STEP_SIZE = 1.25; const int MIN_NEBULAE = 3; // this min and max are for a 1000.0-width galaxy @@ -253,7 +239,7 @@ m_current_fleet(UniverseObject::INVALID_OBJECT_ID), m_in_production_view_mode(false) { - SetText("MapWnd"); + SetName("MapWnd"); Connect(GetUniverse().UniverseObjectDeleteSignal, &MapWnd::UniverseObjectDeleted, this); @@ -492,7 +478,7 @@ switch (key) { case GG::GGK_TAB: { // auto-complete current chat edit word if (m_chat_edit->Visible()) { - std::string text = m_chat_edit->WindowText(); + std::string text = m_chat_edit->Text(); std::pair<GG::CPSize, GG::CPSize> cursor_pos = m_chat_edit->CursorPosn(); if (cursor_pos.first == cursor_pos.second && 0 < cursor_pos.first && cursor_pos.first <= text.size()) { std::string::size_type word_start = text.substr(0, Value(cursor_pos.first)).find_last_of(" :"); @@ -558,7 +544,7 @@ case GG::GGK_RETURN: case GG::GGK_KP_ENTER: { // send chat message if (m_chat_edit->Visible()) { - std::string edit_text = m_chat_edit->WindowText(); + std::string edit_text = m_chat_edit->Text(); if (edit_text != "") { if (g_chat_edit_history.size() == 1 || g_chat_edit_history[1] != edit_text) { g_chat_edit_history[0] = edit_text; @@ -583,7 +569,7 @@ case GG::GGK_UP: { if (m_chat_edit->Visible() && g_history_position < static_cast<int>(g_chat_edit_history.size()) - 1) { - g_chat_edit_history[g_history_position] = m_chat_edit->WindowText(); + g_chat_edit_history[g_history_position] = m_chat_edit->Text(); ++g_history_position; m_chat_edit->SetText(g_chat_edit_history[g_history_position]); } @@ -592,7 +578,7 @@ case GG::GGK_DOWN: { if (m_chat_edit->Visible() && 0 < g_history_position) { - g_chat_edit_history[g_history_position] = m_chat_edit->WindowText(); + g_chat_edit_history[g_history_position] = m_chat_edit->Text(); --g_history_position; m_chat_edit->SetText(g_chat_edit_history[g_history_position]); } Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -128,7 +128,7 @@ m_player_data.m_empire_color = it->second.m_color; m_player_data.m_save_game_empire_id = it->second.m_id; m_color_selector->SelectColor(m_player_data.m_empire_color); - operator[](3)->SetText(it->second.m_player_name); + boost::polymorphic_downcast<GG::TextControl*>(operator[](3))->SetText(it->second.m_player_name); DataChangedSignal(); } @@ -267,7 +267,7 @@ { 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 - std::string text = m_chat_input_edit->WindowText(); + std::string text = m_chat_input_edit->Text(); HumanClientApp::GetApp()->Networking().SendMessage(LobbyChatMessage(HumanClientApp::GetApp()->PlayerID(), receiver, text)); m_chat_input_edit->SetText(""); *m_chat_box += m_lobby_data.m_players[HumanClientApp::GetApp()->PlayerID()].m_player_name + ": " + text + "\n"; @@ -313,7 +313,7 @@ std::string player_name = m_lobby_data.m_players[player_id].m_player_name; m_lobby_data.m_players.erase(player_id); for (GG::ListBox::iterator it = m_players_lb->begin(); it != m_players_lb->end(); ++it) { - if (player_name == (**it)[0]->WindowText()) { + if (player_name == boost::polymorphic_downcast<GG::TextControl*>((**it)[0])->Text()) { delete m_players_lb->Erase(it); break; } Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -12,6 +12,7 @@ #include <GG/TabWnd.h> #include <GG/dialogs/ThreeButtonDlg.h> +#include <boost/cast.hpp> #include <boost/format.hpp> #include <boost/spirit.hpp> #include <boost/algorithm/string/erase.hpp> @@ -76,7 +77,7 @@ void operator()() { try { - FileDlg dlg(m_path.native_directory_string(), m_edit->WindowText(), false, false, m_filters); + FileDlg dlg(m_path.native_directory_string(), m_edit->Text(), false, false, m_filters); if (m_directory) dlg.SelectDirectories(true); dlg.Run(); @@ -168,7 +169,7 @@ void operator()(GG::DropDownList::iterator it) { assert(it != m_drop_list->end()); - GetOptionsDB().Set<std::string>(m_option_name, (*it)->WindowText()); + GetOptionsDB().Set<std::string>(m_option_name, (*it)->Name()); } const std::string m_option_name; CUIDropDownList* m_drop_list; @@ -180,7 +181,7 @@ m_drop_list(drop_list), m_width_spin(width_spin), m_height_spin(height_spin), m_color_depth_spin(color_depth_spin), m_fullscreen_button(fullscreen_button) { const GG::ListBox::Row* row = *m_drop_list->CurrentItem(); - if (row && row->WindowText() != UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")) { + if (row && row->Name() != UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")) { m_width_spin->Disable(true); m_height_spin->Disable(true); m_color_depth_spin->Disable(true); @@ -192,7 +193,7 @@ { const GG::ListBox::Row* row = *it; assert(row); - if (row->WindowText() == UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")) { + if (row->Name() == UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")) { m_width_spin->Disable(false); m_height_spin->Disable(false); m_color_depth_spin->Disable(false); @@ -207,7 +208,7 @@ int w, h, bpp; using namespace boost::spirit; rule<> resolution_p = int_p[assign_a(w)] >> str_p(" x ") >> int_p[assign_a(h)] >> str_p(" @ ") >> int_p[assign_a(bpp)]; - parse(row->WindowText().c_str(), resolution_p); + parse(row->Name().c_str(), resolution_p); GetOptionsDB().Set<int>("app-width", w); GetOptionsDB().Set<int>("app-height", h); GetOptionsDB().Set<int>("color-depth", bpp); @@ -449,7 +450,7 @@ 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())) + if (string_validator && !string_validator(edit->Text())) edit->SetTextColor(GG::CLR_RED); } @@ -534,7 +535,7 @@ int index = -1; for (std::set<std::string>::const_iterator it = filenames.begin(); it != filenames.end(); ++it) { GG::ListBox::Row* font_row = new CUISimpleDropDownListRow(boost::algorithm::erase_last_copy(*it, FONT_SUFFIX)); - font_row->SetText(*it); + font_row->SetName(*it); drop_list->Insert(font_row); if (*it == current_font) index = drop_list->NumRows() - 1; @@ -599,11 +600,11 @@ m_current_option_list->Insert(row); drop_list->SetStyle(GG::LIST_NOSORT); GG::ListBox::Row* font_row = new CUISimpleDropDownListRow(UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")); - font_row->SetText(UserString("OPTIONS_VIDEO_MODE_LIST_CUSTOM_OPTION")); + font_row->SetName(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->SetText(*it); + font_row->SetName(*it); drop_list->Insert(font_row); } if (current_resolution_index != -1 && GetOptionsDB().Get<bool>("fullscreen")) Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -346,7 +346,6 @@ const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ProductionQueue& queue = empire->GetProductionQueue(); std::size_t first_visible_queue_row = std::distance(m_queue_lb->begin(), m_queue_lb->FirstRowShown()); - std::size_t original_queue_length = m_queue_lb->NumRows(); m_queue_lb->Clear(); const GG::X QUEUE_WIDTH = m_queue_lb->Width() - 8 - 14; Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -273,7 +273,6 @@ const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ResearchQueue& queue = empire->GetResearchQueue(); std::size_t first_visible_queue_row = std::distance(m_queue_lb->begin(), m_queue_lb->FirstRowShown()); - std::size_t original_queue_length = m_queue_lb->NumRows(); m_queue_lb->Clear(); const GG::X QUEUE_WIDTH = m_queue_lb->Width() - 8 - 14; Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -9,6 +9,8 @@ #include <GG/TextControl.h> #include <GG/SDL/SDLGUI.h> +#include <boost/cast.hpp> + #include <sstream> #include <iomanip> #include <cctype> @@ -176,8 +178,11 @@ m_result.second = "HOST GAME SELECTED"; } else { m_result.second = *m_IP_address_edit; - if (m_result.second == "") - m_result.second = (***m_servers_lb->Selections().begin())[0]->WindowText(); + if (m_result.second == "") { + m_result.second = + boost::polymorphic_downcast<GG::TextControl*>( + (***m_servers_lb->Selections().begin())[0])->Text(); + } } CUIWnd::CloseClicked(); } @@ -191,8 +196,8 @@ m_internet_game_label->Disable(host_selected); m_IP_address_edit->Disable(host_selected); bool disable_ok_bn = - !NameOK(m_player_name_edit->WindowText()) || + !NameOK(m_player_name_edit->Text()) || (!host_selected && m_servers_lb->Selections().empty() && - m_IP_address_edit->WindowText().empty()); + m_IP_address_edit->Text().empty()); m_ok_bn->Disable(disable_ok_bn); } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -672,7 +672,7 @@ m_buildings_panel(0), m_specials_panel(0) { - SetText(UserString("PLANET_PANEL")); + SetName(UserString("PLANET_PANEL")); GG::Pt ul = UpperLeft(), lr = LowerRight(); int planet_image_sz = PlanetDiameter(); @@ -1059,7 +1059,7 @@ m_planet_id(UniverseObject::INVALID_OBJECT_ID), m_vscroll(new CUIScroll(Width()-14,GG::Y0,GG::X(14),Height(),GG::VERTICAL)) { - SetText("PlanetPanelContainer"); + SetName("PlanetPanelContainer"); EnableChildClipping(true); GG::Connect(m_vscroll->ScrolledSignal, &SidePanel::PlanetPanelContainer::VScroll, this); } @@ -1232,7 +1232,7 @@ TempUISoundDisabler sound_disabler; - SetText(UserString("SIDE_PANEL")); + SetName(UserString("SIDE_PANEL")); m_system_name->DisableDropArrow(); m_system_name->SetStyle(GG::LIST_CENTER); Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -84,7 +84,7 @@ m_selection_indicator(0), m_mouseover_indicator(0), m_selected(false), - m_name(0), + m_colored_name(0), m_showing_name(false) { parent->AttachChild(this); @@ -101,7 +101,7 @@ for (std::vector<const Fleet*>::const_iterator it = fleets.begin(); it != fleets.end(); ++it) m_fleet_state_change_signals[*it] = GG::Connect((*it)->StateChangedSignal, &SystemIcon::FleetStateChanged, this); - SetText(m_system.Name()); + SetName(m_system.Name()); // everything is resized by SizeMove const int DEFAULT_SIZE = 10; @@ -280,8 +280,8 @@ AttachChild(m_mouseover_indicator); MoveChildUp(m_mouseover_indicator); } - if (m_name) - m_name->Show(); + if (m_colored_name) + m_colored_name->Show(); PlaySystemIconRolloverSound(); @@ -294,8 +294,8 @@ if (m_mouseover_indicator) { DetachChild(m_mouseover_indicator); } - if (!m_showing_name && m_name) - m_name->Hide(); + if (!m_showing_name && m_colored_name) + m_colored_name->Hide(); MouseLeavingSignal(m_system.ID()); } @@ -318,14 +318,14 @@ void SystemIcon::Refresh() { - SetText(m_system.Name()); + SetName(m_system.Name()); // set up the name text controls if (!m_system.Name().empty()) { - delete m_name; + delete m_colored_name; boost::shared_ptr<GG::Font> font = ClientUI::GetFont(ClientUI::Pts() + 3); - m_name = new OwnerColoredSystemName(&m_system, font); - AttachChild(m_name); + m_colored_name = new OwnerColoredSystemName(&m_system, font); + AttachChild(m_colored_name); m_showing_name = true; PositionSystemName(); } @@ -412,15 +412,15 @@ void SystemIcon::ShowName() { - if (m_name) - m_name->Show(); + if (m_colored_name) + m_colored_name->Show(); m_showing_name = true; } void SystemIcon::HideName() { - if (m_name) - m_name->Hide(); + if (m_colored_name) + m_colored_name->Hide(); m_showing_name = false; } @@ -448,8 +448,8 @@ void SystemIcon::PositionSystemName() { - if (m_name) - m_name->MoveTo(GG::Pt((Width() - m_name->Width()) / 2, Height())); + if (m_colored_name) + m_colored_name->MoveTo(GG::Pt((Width() - m_colored_name->Width()) / 2, Height())); } bool SystemIcon::InWindow(const GG::Pt& pt) const Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/SystemIcon.h 2009-01-07 03:17:41 UTC (rev 2727) @@ -109,7 +109,7 @@ GG::StaticGraphic* m_selection_indicator; //!< shown to indicate system is selected in sidepanel GG::StaticGraphic* m_mouseover_indicator; //!< shown when the mouse cursor is over the system bool m_selected; //!< is this icon presently selected / should it show m_selected_indicator - OwnerColoredSystemName* m_name; //!< the control that holds the name of the system + OwnerColoredSystemName* m_colored_name; //!< the control that holds the name of the system bool m_showing_name; //!< is the icon supposed to show its name? std::map<int, FleetButton*> m_stationary_fleet_markers; //!< the fleet buttons for the fleets that are stationary in the system, indexed by Empire ID of the owner Modified: trunk/FreeOrion/UI/TurnProgressWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TurnProgressWnd.cpp 2009-01-07 01:39:14 UTC (rev 2726) +++ trunk/FreeOrion/UI/TurnProgressWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) @@ -28,7 +28,7 @@ ClientUI::GetTexture(ClientUI::ArtDir() / "logo.png"), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE)) { - SetText(UserString("TURN_PROGRESS_WND")); + SetName(UserString("TURN_PROGRESS_WND")); m_splash->AttachChild(m_logo); GG::GUI::GetGUI()->Register(m_splash); |
From: <tz...@us...> - 2009-01-08 05:01:39
|
Revision: 2728 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2728&view=rev Author: tzlaine Date: 2009-01-08 05:01:31 +0000 (Thu, 08 Jan 2009) Log Message: ----------- Fixed numerous memory leaks, mainly by adding missing destructors and delete statements. Modified Paths: -------------- trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/Special.cpp trunk/FreeOrion/universe/Tech.cpp trunk/FreeOrion/universe/Tech.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -1960,22 +1960,14 @@ graphic = hull->Graphic(); // create design from stuff chosen in UI - ShipDesign* design = new ShipDesign(name, description, empire_id, CurrentTurn(), - hull_name, parts, graphic, "some model"); + ShipDesign design(name, description, empire_id, CurrentTurn(), + hull_name, parts, graphic, "some model"); - if (!design) { - Logger().errorStream() << "DesignWnd::AddDesign failed to create a new ShipDesign object"; - return; - } - int new_design_id = HumanClientApp::GetApp()->GetNewDesignID(); - HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ShipDesignOrder(empire_id, new_design_id, *design))); + HumanClientApp::GetApp()->Orders().IssueOrder( + OrderPtr(new ShipDesignOrder(empire_id, new_design_id, design))); EmpireDesignsChangedSignal(); - Logger().debugStream() << "Added new design: " << design->Name(); - - //const Universe& universe = GetUniverse(); - //for (Universe::ship_design_iterator it = universe.beginShipDesigns(); it != universe.endShipDesigns(); ++it) - // Logger().debugStream() << "Shipdesign: " << it->second->Name(); + Logger().debugStream() << "Added new design: " << design.Name(); } Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -290,6 +290,7 @@ ~ShipDataPanel() { + delete m_ship_icon; m_ship_connection.disconnect(); } Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -1712,6 +1712,7 @@ for (std::vector<BuildingIndicator*>::iterator it = m_building_indicators.begin(); it != m_building_indicators.end(); ++it) delete *it; m_building_indicators.clear(); + delete m_expand_button; } void BuildingsPanel::ExpandCollapse(bool expanded) Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -439,6 +439,7 @@ /** \name Structors */ //@{ PlanetPanelContainer(GG::X x, GG::Y y, GG::X w, GG::Y h); + ~PlanetPanelContainer(); //@} void Clear(); @@ -1064,6 +1065,9 @@ GG::Connect(m_vscroll->ScrolledSignal, &SidePanel::PlanetPanelContainer::VScroll, this); } +SidePanel::PlanetPanelContainer::~PlanetPanelContainer() +{ delete m_vscroll; } + bool SidePanel::PlanetPanelContainer::InWindow(const GG::Pt& pt) const { for (std::vector<PlanetPanel*>::const_iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { @@ -1278,6 +1282,9 @@ m_fleet_state_change_signals.erase(m_fleet_state_change_signals.begin()); } s_side_panels.erase(this); + + delete m_star_graphic; + delete m_system_resource_summary; } bool SidePanel::InWindow(const GG::Pt& pt) const @@ -1377,7 +1384,7 @@ // top right star graphic - DeleteChild(m_star_graphic); + delete m_star_graphic; boost::shared_ptr<GG::Texture> graphic = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "stars_sidepanel", ClientUI::StarTypeFilePrefixes()[s_system->Star()], s_system->ID()); std::vector<boost::shared_ptr<GG::Texture> > textures; textures.push_back(graphic); Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -2021,10 +2021,9 @@ m_hscroll->SizeScroll(0, Value(layout_size.x - 1), std::max(50, Value(std::min(layout_size.x / 10, client_sz.x))), Value(client_sz.x)); gvFreeLayout(gvc, graph); + agclose(graph); gvFreeContext(gvc); - agclose(graph); - Logger().debugStream() << "Tech Tree Layout Done"; if (keep_position) { @@ -2559,6 +2558,12 @@ ShowTreeView(); } +TechTreeWnd::~TechTreeWnd() +{ + delete m_tech_list; + delete m_layout_panel; +} + double TechTreeWnd::Scale() const { return m_layout_panel->Scale(); Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2009-01-08 05:01:31 UTC (rev 2728) @@ -20,6 +20,7 @@ /** \name Structors */ //@{ TechTreeWnd(GG::X w, GG::Y h); + ~TechTreeWnd(); //@} /** \name Accessors */ //@{ Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Building.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -143,6 +143,9 @@ m_graphic(graphic) {} +BuildingType::~BuildingType() +{ delete m_location; } + const std::string& BuildingType::Name() const { return m_name; @@ -279,6 +282,13 @@ ReportError(std::cerr, input.c_str(), result); } +BuildingTypeManager::~BuildingTypeManager() +{ + for (std::map<std::string, BuildingType*>::iterator it = m_building_types.begin(); it != m_building_types.end(); ++it) { + delete it->second; + } +} + const BuildingType* BuildingTypeManager::GetBuildingType(const std::string& name) const { std::map<std::string, BuildingType*>::const_iterator it = m_building_types.find(name); Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Building.h 2009-01-08 05:01:31 UTC (rev 2728) @@ -69,6 +69,8 @@ const Condition::ConditionBase* location, const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects, const std::string& graphic); + + ~BuildingType(); ///< dtor //@} /** \name Accessors */ //@{ @@ -127,6 +129,7 @@ private: BuildingTypeManager(); + ~BuildingTypeManager(); std::map<std::string, BuildingType*> m_building_types; Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -97,6 +97,13 @@ ReportError(std::cerr, input.c_str(), result); } +PartTypeManager::~PartTypeManager() +{ + for (std::map<std::string, PartType*>::iterator it = m_parts.begin(); it != m_parts.end(); ++it) { + delete it->second; + } +} + const PartType* PartTypeManager::GetPartType(const std::string& name) const { std::map<std::string, PartType*>::const_iterator it = m_parts.find(name); return it != m_parts.end() ? it->second : 0; @@ -149,6 +156,9 @@ m_graphic(graphic) {} +PartType::~PartType() +{ delete m_location; } + const std::string& PartType::Name() const { return m_name; } @@ -226,6 +236,9 @@ m_graphic(graphic) {} +HullType::~HullType() +{ delete m_location; } + const std::string& HullType::Name() const { return m_name; } @@ -306,6 +319,13 @@ ReportError(std::cerr, input.c_str(), result); } +HullTypeManager::~HullTypeManager() +{ + for (std::map<std::string, HullType*>::iterator it = m_hulls.begin(); it != m_hulls.end(); ++it) { + delete it->second; + } +} + const HullType* HullTypeManager::GetHullType(const std::string& name) const { std::map<std::string, HullType*>::const_iterator it = m_hulls.find(name); return it != m_hulls.end() ? it->second : 0; Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/ShipDesign.h 2009-01-08 05:01:31 UTC (rev 2728) @@ -29,6 +29,7 @@ std::vector<ShipSlotType> mountable_slot_types, const Condition::ConditionBase* location, const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects, const std::string& graphic); + ~PartType(); //@} /** \name Accessors */ //@{ @@ -98,6 +99,7 @@ private: PartTypeManager(); + ~PartTypeManager(); std::map<std::string, PartType*> m_parts; static PartTypeManager* s_instance; @@ -139,6 +141,7 @@ const Condition::ConditionBase* location, const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects, const std::string& graphic); + ~HullType(); //@} /** \name Accessors */ //@{ @@ -206,6 +209,8 @@ private: HullTypeManager(); + ~HullTypeManager(); + std::map<std::string, HullType*> m_hulls; static HullTypeManager* s_instance; }; Modified: trunk/FreeOrion/universe/Special.cpp =================================================================== --- trunk/FreeOrion/universe/Special.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Special.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -42,6 +42,13 @@ ProcessSpecialsFile(settings_dir + "planet_specials.txt", true); } + ~SpecialManager() + { + for (std::map<std::string, Special*>::iterator it = m_specials.begin(); it != m_specials.end(); ++it) { + delete it->second; + } + } + const std::set<std::string>& PlanetSpecialNames() const { return m_planet_special_names; Modified: trunk/FreeOrion/universe/Tech.cpp =================================================================== --- trunk/FreeOrion/universe/Tech.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Tech.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -501,6 +501,16 @@ #endif } +TechManager::~TechManager() +{ + for (std::map<std::string, TechCategory*>::iterator it = m_categories.begin(); it != m_categories.end(); ++it) { + delete it->second; + } + for (TechContainer::iterator it = m_techs.begin(); it != m_techs.end(); ++it) { + delete *it; + } +} + std::string TechManager::FindIllegalDependencies() { assert(!m_techs.empty()); Modified: trunk/FreeOrion/universe/Tech.h =================================================================== --- trunk/FreeOrion/universe/Tech.h 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Tech.h 2009-01-08 05:01:31 UTC (rev 2728) @@ -216,6 +216,7 @@ private: TechManager(); + ~TechManager(); /** returns an error string indicating the first instance of an illegal prerequisite relationship between two techs in m_techs, or an empty string if there are no illegal dependencies */ Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/Universe.cpp 2009-01-08 05:01:31 UTC (rev 2728) @@ -377,6 +377,8 @@ delete it->second; for (ObjectMap::iterator it = m_destroyed_objects.begin(); it != m_destroyed_objects.end(); ++it) delete it->second; + for (ShipDesignMap::iterator it = m_ship_designs.begin(); it != m_ship_designs.end(); ++it) + delete it->second; } const UniverseObject* Universe::Object(int id) const Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2009-01-07 03:17:41 UTC (rev 2727) +++ trunk/FreeOrion/universe/ValueRef.h 2009-01-08 05:01:31 UTC (rev 2728) @@ -106,6 +106,7 @@ struct ValueRef::StaticCast : public ValueRef::Variable<ToType> { StaticCast(const ValueRef::Variable<FromType>* value_ref); + ~StaticCast(); virtual double Eval(const UniverseObject* source, const UniverseObject* target) const; virtual std::string Description() const; @@ -322,6 +323,10 @@ {} template <class FromType, class ToType> +ValueRef::StaticCast<FromType, ToType>::~StaticCast() +{ delete m_value_ref; } + +template <class FromType, class ToType> double ValueRef::StaticCast<FromType, ToType>::Eval(const UniverseObject* source, const UniverseObject* target) const { return static_cast<ToType>(m_value_ref->Eval(source, target)); |
From: <tz...@us...> - 2009-01-09 15:23:52
|
Revision: 2730 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2730&view=rev Author: tzlaine Date: 2009-01-09 15:23:48 +0000 (Fri, 09 Jan 2009) Log Message: ----------- Updated install script and build_config.py for a new release. Modified Paths: -------------- trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi trunk/FreeOrion/build_config.py Modified: trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi =================================================================== --- trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi 2009-01-09 01:28:06 UTC (rev 2729) +++ trunk/FreeOrion/Installer/FreeOrion_Install_Script.nsi 2009-01-09 15:23:48 UTC (rev 2730) @@ -2,7 +2,7 @@ ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "FreeOrion" -!define PRODUCT_VERSION "0.3.10" +!define PRODUCT_VERSION "0.3.11" !define PRODUCT_PUBLISHER "FreeOrion Community" !define PRODUCT_WEB_SITE "http://www.freeorion.org" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\freeorionca.exe" @@ -44,7 +44,7 @@ ; MUI end ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -OutFile "..\..\FreeOrion-0.3.10-Setup.exe" +OutFile "..\..\FreeOrion-0.3.11-Setup.exe" InstallDir "$PROGRAMFILES\FreeOrion" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show @@ -58,7 +58,7 @@ File /r /x .svn "..\default" File "..\glew32.dll" File "..\alut.dll" - File "..\boost_python-vc80-mt-1_34.dll" + File "..\boost_python-vc80-mt-1_36.dll" File "..\devil.dll" File "..\GiGi.dll" File "..\GG\GiGi.dll.manifest" @@ -71,7 +71,6 @@ File "..\libogg.dll" File "..\libvorbis.dll" File "..\libvorbisfile.dll" - File "..\log4cpp.dll" File "..\msvcm80.dll" File "..\msvcp80.dll" File "..\msvcr80.dll" Modified: trunk/FreeOrion/build_config.py =================================================================== --- trunk/FreeOrion/build_config.py 2009-01-09 01:28:06 UTC (rev 2729) +++ trunk/FreeOrion/build_config.py 2009-01-09 15:23:48 UTC (rev 2730) @@ -1,6 +1,6 @@ # -*- Python -*- -freeorion_version = 'v0.3.10' +freeorion_version = 'v0.3.11' gigi_version = '0.6.0' @@ -19,8 +19,6 @@ return str(int(pieces[0]) * 100000 + int(pieces[1]) * 100 + (3 <= len(pieces) and int(pieces[2]) or 0)) boost_version = BoostStringToNumber(boost_version_string) -log4cpp_version = '0.3.4b' - openal_pkgconfig_version = '0.0.8' alut_pkgconfig_version ='1.1.0' openal_win32_lib_name = 'OpenAL32' |
From: <geo...@us...> - 2009-01-11 01:04:48
|
Revision: 2732 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2732&view=rev Author: geoffthemedio Date: 2009-01-11 01:04:42 +0000 (Sun, 11 Jan 2009) Log Message: ----------- -Fixed [ 2494849 ] Crash on queueing more production than points available -Fixed [ 2498589 ] Crash when trying to display low status number -Updated MSVC 2008 Version.cpp to v0.3.11 with help from kroddn. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/msvc2008/src/Version.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-01-10 23:18:35 UTC (rev 2731) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-01-11 01:04:42 UTC (rev 2732) @@ -90,6 +90,13 @@ // they produce locally when such a blockade occurs. The mineral and industry distribution code probably needs to be updated // to allow a ResourceCenter to use its own production in cases where its system is not part of any resource-sharing group. + Logger().debugStream() << "production status: "; + for (std::vector<double>::const_iterator it = production_status.begin(); it != production_status.end(); ++it) + Logger().debugStream() << " ... " << *it; + Logger().debugStream() << "queue: "; + for (ProductionQueue::QueueType::const_iterator it = queue.begin(); it != queue.end(); ++it) + Logger().debugStream() << " ... name: " << it->item.name << "id: " << it->item.design_id << " allocated: " << it->allocated_pp << " locationid: " << it->location << " ordered: " << it->ordered; + assert(production_status.size() == queue.size()); assert(production_status.size() == queue_element_resource_sharing_system_groups.size()); @@ -679,9 +686,10 @@ // duplicate produciton queue state for future simulation QueueType sim_queue = m_queue; - std::vector<double> sim_production_status = production_status; - std::vector<int> simulation_results(sim_production_status.size(), -1); - std::vector<int> sim_queue_original_indices(sim_production_status.size()); + std::vector<double> sim_production_status = production_status; + std::vector<std::set<int> > sim_queue_element_groups = queue_element_groups; + std::vector<int> simulation_results(sim_production_status.size(), -1); + std::vector<int> sim_queue_original_indices(sim_production_status.size()); for (unsigned int i = 0; i < sim_queue_original_indices.size(); ++i) sim_queue_original_indices[i] = i; @@ -718,6 +726,7 @@ m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; // turns left is indeterminate for this item sim_queue.erase(sim_queue.begin() + i); sim_production_status.erase(sim_production_status.begin() + i); + sim_queue_element_groups.erase(sim_queue_element_groups.begin() + i); sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); } } @@ -733,7 +742,7 @@ // update allocation of PP on the simulated queue. previous iterations of simulation may have removed elements // from the queue, freeing up PP to be spent on other elements further down the queue - SetProdQueueElementSpending(empire, available_pp, queue_element_groups, sim_production_status, sim_queue, allocated_pp, projects_in_progress); + SetProdQueueElementSpending(empire, available_pp, sim_queue_element_groups, sim_production_status, sim_queue, allocated_pp, projects_in_progress); // cycle through items on queue, apply one turn's PP towards items, remove items that are done @@ -768,6 +777,7 @@ m_queue[sim_queue_original_indices[i]].turns_left_to_completion = turns; // record the (estimated) turns to complete the whole element on the original queue sim_queue.erase(sim_queue.begin() + i); // remove the completed item from the simulated queue sim_production_status.erase(sim_production_status.begin() + i); // and production status + sim_queue_element_groups.erase(sim_queue_element_groups.begin() + i); // and the group of systems this element could access resources from sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); // and bookkeeping } } Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2009-01-10 23:18:35 UTC (rev 2731) +++ trunk/FreeOrion/UI/ClientUI.cpp 2009-01-11 01:04:42 UTC (rev 2732) @@ -836,31 +836,31 @@ // append base scale SI prefix (as postfix) switch (unitPow10) { case -15: - text += "f"; // femto + text += "f"; // femto break; case -12: - text += "p"; // pico + text += "p"; // pico break; case -9: - text += "n"; // nano + text += "n"; // nano break; case -6: - text += "\xB5"; // micro + text += "\xC2\xB5"; // micro. mu in UTF-8 break; case -3: - text += "m"; // milli + text += "m"; // milli break; case 3: - text += "k"; // kilo + text += "k"; // kilo break; case 6: - text += "M"; // Mega + text += "M"; // Mega break; case 9: - text += "G"; // Giga + text += "G"; // Giga break; case 12: - text += "T"; // Terra + text += "T"; // Terra break; default: break; Modified: trunk/FreeOrion/msvc2008/src/Version.cpp =================================================================== --- trunk/FreeOrion/msvc2008/src/Version.cpp 2009-01-10 23:18:35 UTC (rev 2731) +++ trunk/FreeOrion/msvc2008/src/Version.cpp 2009-01-11 01:04:42 UTC (rev 2732) @@ -2,6 +2,6 @@ const std::string& FreeOrionVersionString() { - static const std::string retval = "Post-v0.3.10 [Development Build]"; + static const std::string retval = "Post-v0.3.11 [Development Build]"; return retval; } |
From: <geo...@us...> - 2009-01-11 11:01:42
|
Revision: 2733 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2733&view=rev Author: geoffthemedio Date: 2009-01-11 11:01:36 +0000 (Sun, 11 Jan 2009) Log Message: ----------- -Replaced BuildDetailPanel with EncyclopediaDetailPanel and updated the later to handle BuildingType and ShipDesign (by OndrejR) -Updated version number in MSVC 2005 Version.cpp Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.h trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp trunk/FreeOrion/UI/EncyclopediaDetailPanel.h trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/msvc2005/src/Version.cpp Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-01-11 11:01:36 UTC (rev 2733) @@ -7,6 +7,7 @@ #include "SidePanel.h" #include "TechTreeWnd.h" #include "MapWnd.h" +#include "EncyclopediaDetailPanel.h" #include "../util/MultiplayerCommon.h" #include "../universe/UniverseObject.h" #include "../Empire/Empire.h" @@ -55,329 +56,6 @@ } ////////////////////////////////////////////////// -// BuildDesignatorWnd::BuildDetailPanel -////////////////////////////////////////////////// -class BuildDesignatorWnd::BuildDetailPanel : public CUIWnd -{ -public: - BuildDetailPanel(GG::X w, GG::Y h); - - void SizeMove(const GG::Pt& ul, const GG::Pt& lr); - void Render(); - 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 */ - GG::Pt ClientUpperLeft() const; - - void SetBuildItem(BuildType build_type, const std::string& item = ""); - void SetBuildItem(BuildType build_type, int design_id); - void SetBuild(int queue_idx); - -private: - static const GG::X TEXT_MARGIN_X; - static const GG::Y TEXT_MARGIN_Y; - - void Reset(); - void DoLayout(); - - bool DisplayingQueueItem() const; - - BuildType m_build_type; - std::string m_item_name; - int m_item_design_id; - GG::TextControl* m_item_name_text; - GG::TextControl* m_cost_text; - GG::TextControl* m_summary_text; - CUIMultiEdit* m_description_box; - GG::StaticGraphic* m_item_graphic; -}; -const GG::X BuildDesignatorWnd::BuildDetailPanel::TEXT_MARGIN_X(3); -const GG::Y BuildDesignatorWnd::BuildDetailPanel::TEXT_MARGIN_Y(3); - -BuildDesignatorWnd::BuildDetailPanel::BuildDetailPanel(GG::X w, GG::Y h) : - CUIWnd("", GG::X1, GG::Y1, w - 1, h - 1, GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE | GG::ONTOP), - m_build_type(INVALID_BUILD_TYPE), - m_item_name("") -{ - const int PTS = ClientUI::Pts(); - const int NAME_PTS = PTS*3/2; - const int COST_PTS = PTS; - const int SUMMARY_PTS = PTS*4/3; - - m_item_name_text = new GG::TextControl(GG::X0, GG::Y0, GG::X(10), GG::Y(10), "", ClientUI::GetBoldFont(NAME_PTS), ClientUI::TextColor()); - m_cost_text = new GG::TextControl(GG::X0, GG::Y0, GG::X(10), GG::Y(10), "", ClientUI::GetFont(COST_PTS), ClientUI::TextColor()); - m_summary_text = new GG::TextControl(GG::X0, GG::Y0, GG::X(10), GG::Y(10), "", ClientUI::GetFont(SUMMARY_PTS), ClientUI::TextColor()); - m_description_box = new CUILinkTextMultiEdit(GG::X0, GG::Y0, GG::X(10), GG::Y(10), "", GG::MULTI_WORDBREAK | GG::MULTI_READ_ONLY); - m_description_box->SetColor(GG::CLR_ZERO); - m_description_box->SetInteriorColor(GG::CLR_ZERO); - - m_item_graphic = 0; - - AttachChild(m_item_name_text); - AttachChild(m_cost_text); - AttachChild(m_summary_text); - AttachChild(m_description_box); - - DoLayout(); -} - -void BuildDesignatorWnd::BuildDetailPanel::DoLayout() -{ - const int PTS = ClientUI::Pts(); - const int NAME_PTS = PTS*3/2; - const int COST_PTS = PTS; - const int SUMMARY_PTS = PTS*4/3; - - const int ICON_SIZE = 12 + NAME_PTS + COST_PTS + SUMMARY_PTS; - - // name - GG::Pt ul = GG::Pt(); - GG::Pt lr = ul + GG::Pt(Width(), GG::Y(NAME_PTS + 4)); - m_item_name_text->SizeMove(ul, lr); - - // cost / turns - ul += GG::Pt(GG::X0, m_item_name_text->Height()); - lr = ul + GG::Pt(Width(), GG::Y(COST_PTS + 4)); - m_cost_text->SizeMove(ul, lr); - - // one line summary - ul += GG::Pt(GG::X0, m_cost_text->Height()); - lr = ul + GG::Pt(Width(), GG::Y(SUMMARY_PTS + 4)); - m_summary_text->SizeMove(ul, lr); - - // main verbose description (fluff, effects, unlocks, ...) - ul = GG::Pt(GG::X1, ICON_SIZE + TEXT_MARGIN_Y + 1); - lr = ul + GG::Pt(Width() - TEXT_MARGIN_X - BORDER_RIGHT, Height() - BORDER_BOTTOM - ul.y - TEXT_MARGIN_Y); - m_description_box->SizeMove(ul, lr); - - // icon - if (m_item_graphic) { - ul = GG::Pt(GG::X1, GG::Y1); - lr = ul + GG::Pt(GG::X(ICON_SIZE), GG::Y(ICON_SIZE)); - m_item_graphic->SizeMove(ul, lr); - } -} - -void BuildDesignatorWnd::BuildDetailPanel::SizeMove(const GG::Pt& ul, const GG::Pt& lr) -{ - GG::Pt old_size = GG::Wnd::LowerRight() - GG::Wnd::UpperLeft(); - - // maybe later do something interesting with docking - GG::Wnd::SizeMove(ul, lr); - - if (Visible() && old_size != GG::Wnd::Size()) - DoLayout(); -} - -GG::Pt BuildDesignatorWnd::BuildDetailPanel::ClientUpperLeft() const -{ - return GG::Wnd::UpperLeft(); -} - -void BuildDesignatorWnd::BuildDetailPanel::Render() -{ - GG::Pt ul = UpperLeft(); - GG::Pt lr = LowerRight(); - const GG::Y ICON_HEIGHT = m_summary_text->LowerRight().y - m_item_name_text->UpperLeft().y; - GG::Pt cl_ul = ul + GG::Pt(BORDER_LEFT, ICON_HEIGHT + BORDER_BOTTOM); - GG::Pt cl_lr = lr - GG::Pt(BORDER_RIGHT, BORDER_BOTTOM); - - // use GL to draw the lines - glDisable(GL_TEXTURE_2D); - GLint initial_modes[2]; - glGetIntegerv(GL_POLYGON_MODE, initial_modes); - - // draw background - glPolygonMode(GL_BACK, GL_FILL); - glBegin(GL_POLYGON); - glColor(ClientUI::WndColor()); - glVertex(ul.x, ul.y); - glVertex(lr.x, ul.y); - glVertex(lr.x, lr.y - OUTER_EDGE_ANGLE_OFFSET); - glVertex(lr.x - OUTER_EDGE_ANGLE_OFFSET, lr.y); - glVertex(ul.x, lr.y); - glVertex(ul.x, ul.y); - glEnd(); - - // draw outer border on pixel inside of the outer edge of the window - glPolygonMode(GL_BACK, GL_LINE); - glBegin(GL_POLYGON); - glColor(ClientUI::WndOuterBorderColor()); - glVertex(ul.x, ul.y); - glVertex(lr.x, ul.y); - glVertex(lr.x, lr.y - OUTER_EDGE_ANGLE_OFFSET); - glVertex(lr.x - OUTER_EDGE_ANGLE_OFFSET, lr.y); - glVertex(ul.x, lr.y); - glVertex(ul.x, ul.y); - glEnd(); - - // reset this to whatever it was initially - glPolygonMode(GL_BACK, initial_modes[1]); - - // draw inner border, including extra resize-tab lines - glBegin(GL_LINE_STRIP); - glColor(ClientUI::WndInnerBorderColor()); - glVertex(cl_ul.x, cl_ul.y); - glVertex(cl_lr.x, cl_ul.y); - glVertex(cl_lr.x, cl_lr.y - INNER_BORDER_ANGLE_OFFSET); - glVertex(cl_lr.x - INNER_BORDER_ANGLE_OFFSET, cl_lr.y); - glVertex(cl_ul.x, cl_lr.y); - glVertex(cl_ul.x, cl_ul.y); - glEnd(); - glBegin(GL_LINES); - // draw the extra lines of the resize tab - glColor(ClientUI::WndInnerBorderColor()); - glVertex(cl_lr.x, cl_lr.y - RESIZE_HASHMARK1_OFFSET); - glVertex(cl_lr.x - RESIZE_HASHMARK1_OFFSET, cl_lr.y); - - glVertex(cl_lr.x, cl_lr.y - RESIZE_HASHMARK2_OFFSET); - glVertex(cl_lr.x - RESIZE_HASHMARK2_OFFSET, cl_lr.y); - glEnd(); - glEnable(GL_TEXTURE_2D); -} - -void BuildDesignatorWnd::BuildDetailPanel::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) -{ - if (m_drag_offset != GG::Pt(-GG::X1, -GG::Y1)) { // resize-dragging - GG::Pt new_lr = pt - m_drag_offset; - - // constrain to within parent - if (GG::Wnd* parent = Parent()) { - GG::Pt max_lr = parent->ClientLowerRight(); - new_lr.x = std::min(new_lr.x, max_lr.x); - new_lr.y = std::min(new_lr.y, max_lr.y); - } - - Resize(new_lr - UpperLeft()); - } else { // normal-dragging - GG::Pt final_move = move; - - if (GG::Wnd* parent = Parent()) { - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::Pt new_ul = ul + move, new_lr = lr + move; - - GG::Pt min_ul = parent->ClientUpperLeft() + GG::Pt(GG::X1, GG::Y1); - GG::Pt max_lr = parent->ClientLowerRight(); - GG::Pt max_ul = max_lr - this->Size(); - - new_ul.x = std::max(min_ul.x, std::min(max_ul.x, new_ul.x)); - new_ul.y = std::max(min_ul.y, std::min(max_ul.y, new_ul.y)); - - final_move = new_ul - ul; - } - - GG::Wnd::LDrag(pt, final_move, mod_keys); - } -} - -void BuildDesignatorWnd::BuildDetailPanel::SetBuildItem(BuildType build_type, const std::string& item) -{ - if (build_type != BT_BUILDING && build_type != INVALID_BUILD_TYPE) - throw std::invalid_argument("Attempted to SetBuildItem with a name and BuildType that wasn't BT_BUILDING"); - m_build_type = build_type; - m_item_name = item; - m_item_design_id = UniverseObject::INVALID_OBJECT_ID; - Reset(); -} - -void BuildDesignatorWnd::BuildDetailPanel::SetBuildItem(BuildType build_type, int design_id) -{ - if (build_type != BT_SHIP) - throw std::invalid_argument("Attempted to SetBuildItem with a design id and BuildType that wasn't BT_SHIP"); - m_build_type = build_type; - m_item_name = ""; - m_item_design_id = design_id; - Reset(); -} - -void BuildDesignatorWnd::BuildDetailPanel::SetBuild(int queue_idx) -{ - Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - const ProductionQueue& queue = empire->GetProductionQueue(); - if (0 <= queue_idx && queue_idx < static_cast<int>(queue.size())) { - m_build_type = queue[queue_idx].item.build_type; - m_item_name = queue[queue_idx].item.name; - m_item_design_id = queue[queue_idx].item.design_id; - } else { - m_build_type = INVALID_BUILD_TYPE; - m_item_name = ""; - m_item_design_id = UniverseObject::INVALID_OBJECT_ID; - } - Reset(); -} - -void BuildDesignatorWnd::BuildDetailPanel::Reset() -{ - m_item_name_text->SetText(""); - m_cost_text->SetText(""); - m_description_box->SetText(""); - if (m_item_graphic) { - DeleteChild(m_item_graphic); - m_item_graphic = 0; - } - - if (m_build_type == INVALID_BUILD_TYPE) return; - - Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - if (!empire) return; - - using boost::io::str; - using boost::format; - double cost_per_turn = 0; - int turns = 0; - std::string item_name_str = UserString(m_item_name); - std::string description_str; - boost::shared_ptr<GG::Texture> graphic; - if (m_build_type == BT_BUILDING) { - assert(empire); - const BuildingType* building_type = GetBuildingType(m_item_name); - assert(building_type); - turns = building_type->BuildTime(); - boost::tie(cost_per_turn, turns) = empire->ProductionCostAndTime(BT_BUILDING, m_item_name); - if (building_type->Effects().empty()) { - description_str = str(format(UserString("PRODUCTION_DETAIL_BUILDING_DESCRIPTION_STR")) - % UserString(building_type->Description())); - } else { - description_str = str(format(UserString("PRODUCTION_DETAIL_BUILDING_DESCRIPTION_STR_WITH_EFFECTS")) - % UserString(building_type->Description()) - % EffectsDescription(building_type->Effects())); - } - graphic = ClientUI::BuildingTexture(building_type->Name()); - } else if (m_build_type == BT_SHIP) { - assert(empire); - const ShipDesign* design = GetShipDesign(m_item_design_id); - assert(design); - turns = 5; // this is a kludge for v0.3 only - boost::tie(cost_per_turn, turns) = empire->ProductionCostAndTime(BT_SHIP, m_item_design_id); - item_name_str = design->Name(); - description_str = str(format(UserString("PRODUCTION_DETAIL_SHIP_DESCRIPTION_STR")) - % design->Description() - % design->Attack() - % design->Defense() - % design->Speed()); - graphic = ClientUI::ShipIcon(design->ID()); - } - - if (graphic) { - GG::Pt ul = ClientUpperLeft(); - m_item_graphic = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(10), GG::Y(10), - graphic, GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); - m_item_graphic->Show(); - AttachChild(m_item_graphic); - } - - DoLayout(); - - m_item_name_text->SetText(item_name_str); - m_cost_text->SetText(str(format(UserString("PRODUCTION_TOTAL_COST_STR")) - % static_cast<int>(cost_per_turn + 0.5) - % turns)); - m_description_box->SetText(description_str); -} - - -////////////////////////////////////////////////// // BuildDesignatorWnd::BuildSelector ////////////////////////////////////////////////// class BuildDesignatorWnd::BuildSelector : public CUIWnd @@ -405,9 +83,9 @@ void ShowAvailability(bool available, bool refresh_list = true); void HideAvailability(bool available, bool refresh_list = true); - mutable boost::signal<void (BuildType, const std::string&)> DisplayNamedBuildItemSignal; + mutable boost::signal<void (const BuildingType*)> DisplayBuildingTypeSignal; mutable boost::signal<void (BuildType, const std::string&, int)> RequestNamedBuildItemSignal; - mutable boost::signal<void (BuildType, int)> DisplayIDedBuildItemSignal; + mutable boost::signal<void (const ShipDesign*)> DisplayShipDesignSignal; mutable boost::signal<void (BuildType, int, int)> RequestIDedBuildItemSignal; private: @@ -443,7 +121,7 @@ int m_build_location; - GG::Y m_row_height; + GG::Y m_row_height; friend class BuildDesignatorWnd; // so BuildDesignatorWnd can access buttons }; @@ -889,10 +567,15 @@ if (selections.size() == 1) { GG::ListBox::iterator row = *selections.begin(); BuildType build_type = m_build_types[row]; - if (build_type == BT_BUILDING) - DisplayNamedBuildItemSignal(BT_BUILDING, (*row)->DragDropDataType()); - else if (build_type == BT_SHIP) - DisplayIDedBuildItemSignal(BT_SHIP, boost::lexical_cast<int>((*row)->DragDropDataType())); + if (build_type == BT_BUILDING) { + const BuildingType* building_type = GetBuildingType((*row)->DragDropDataType()); + assert(building_type); + DisplayBuildingTypeSignal(building_type); + } else if (build_type == BT_SHIP) { + const ShipDesign* design = GetShipDesign(boost::lexical_cast<int>((*row)->DragDropDataType())); + assert(design); + DisplayShipDesignSignal(design); + } } } @@ -907,7 +590,6 @@ RequestIDedBuildItemSignal(BT_SHIP, boost::lexical_cast<int>((*it)->DragDropDataType()), 1); } - ////////////////////////////////////////////////// // BuildDesignatorWnd ////////////////////////////////////////////////// @@ -919,7 +601,7 @@ const GG::Y DETAIL_PANEL_HEIGHT = TechTreeWnd::NAVIGATOR_AND_DETAIL_HEIGHT; const GG::Y BUILD_SELECTOR_HEIGHT = DETAIL_PANEL_HEIGHT; - m_build_detail_panel = new BuildDetailPanel(CHILD_WIDTHS, DETAIL_PANEL_HEIGHT); + m_enc_detail_panel = new EncyclopediaDetailPanel(CHILD_WIDTHS, DETAIL_PANEL_HEIGHT); m_side_panel = new SidePanel(Width() - MapWnd::SIDE_PANEL_WIDTH, GG::Y0, MapWnd::SIDE_PANEL_WIDTH, GG::GUI::GetGUI()->AppHeight()); m_side_panel->Hide(); @@ -930,8 +612,8 @@ m_build_selector->MoveTo(GG::Pt(GG::X0, h - BUILD_SELECTOR_HEIGHT)); - GG::Connect(m_build_selector->DisplayNamedBuildItemSignal, &BuildDesignatorWnd::BuildDetailPanel::SetBuildItem, m_build_detail_panel); - GG::Connect(m_build_selector->DisplayIDedBuildItemSignal, &BuildDesignatorWnd::BuildDetailPanel::SetBuildItem, m_build_detail_panel); + GG::Connect(m_build_selector->DisplayBuildingTypeSignal, &EncyclopediaDetailPanel::SetItem, m_enc_detail_panel); + GG::Connect(m_build_selector->DisplayShipDesignSignal, &EncyclopediaDetailPanel::SetItem, m_enc_detail_panel); GG::Connect(m_build_selector->RequestNamedBuildItemSignal, &BuildDesignatorWnd::BuildItemRequested, this); GG::Connect(m_build_selector->RequestIDedBuildItemSignal, &BuildDesignatorWnd::BuildItemRequested, this); @@ -948,11 +630,11 @@ 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_enc_detail_panel); AttachChild(m_build_selector); AttachChild(m_side_panel); - MoveChildUp(m_build_detail_panel); + MoveChildUp(m_enc_detail_panel); MoveChildUp(m_build_selector); ShowAllTypes(false); // show all types without populating the list @@ -974,7 +656,7 @@ { GG::Rect clip_rect = m_map_view_hole + UpperLeft(); return clip_rect.Contains(pt) ? - (m_build_detail_panel->InWindow(pt) || m_build_selector->InWindow(pt) || m_side_panel->InWindow(pt)) : + (m_enc_detail_panel->InWindow(pt) || m_build_selector->InWindow(pt) || m_side_panel->InWindow(pt)) : Wnd::InClient(pt); } @@ -982,7 +664,7 @@ { GG::Rect clip_rect = m_map_view_hole + UpperLeft(); return clip_rect.Contains(pt) ? - (m_build_detail_panel->InClient(pt) || m_build_selector->InClient(pt) || m_side_panel->InClient(pt)) : + (m_enc_detail_panel->InClient(pt) || m_build_selector->InClient(pt) || m_side_panel->InClient(pt)) : Wnd::InClient(pt); } @@ -993,7 +675,8 @@ void BuildDesignatorWnd::CenterOnBuild(int queue_idx) { - m_build_detail_panel->SetBuild(queue_idx); + SetBuild(queue_idx); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ProductionQueue& queue = empire->GetProductionQueue(); if (0 <= queue_idx && queue_idx < static_cast<int>(queue.size())) { @@ -1009,6 +692,27 @@ } } +void BuildDesignatorWnd::SetBuild(int queue_idx) +{ + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + const ProductionQueue& queue = empire->GetProductionQueue(); + if (0 <= queue_idx && queue_idx < static_cast<int>(queue.size())) { + BuildType buildType = queue[queue_idx].item.build_type; + if (buildType == BT_BUILDING) { + const BuildingType* building_type = GetBuildingType(queue[queue_idx].item.name); + assert(building_type); + m_build_selector->DisplayBuildingTypeSignal(building_type); + } else if (buildType == BT_SHIP) { + const ShipDesign* design = GetShipDesign(boost::lexical_cast<int>(queue[queue_idx].item.design_id)); + assert(design); + m_build_selector->DisplayShipDesignSignal(design); + } + } else { + m_enc_detail_panel->UnsetAll(); + } + m_enc_detail_panel->Reset(); +} + void BuildDesignatorWnd::SelectSystem(int system) { if (system != UniverseObject::INVALID_OBJECT_ID) { @@ -1037,13 +741,14 @@ } SelectDefaultPlanet(m_side_panel->SystemID()); m_build_selector->Reset(); - m_build_detail_panel->SetBuildItem(INVALID_BUILD_TYPE); + m_enc_detail_panel->Reset(); m_side_panel->Refresh(); } void BuildDesignatorWnd::Clear() { - m_build_detail_panel->SetBuildItem(INVALID_BUILD_TYPE); + m_enc_detail_panel->UnsetAll(); + m_enc_detail_panel->Reset(); m_build_selector->Reset(); SystemSelectedSignal(UniverseObject::INVALID_OBJECT_ID); m_side_panel->Hide(); Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.h =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.h 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.h 2009-01-11 11:01:36 UTC (rev 2733) @@ -3,6 +3,7 @@ #define _BuildDesignatorWnd_h_ #include "../universe/Enums.h" +#include "EncyclopediaDetailPanel.h" #include <GG/Wnd.h> @@ -13,10 +14,10 @@ { public: /** \name Signal Types */ //@{ - typedef boost::signal<void (BuildType, const std::string&, int, int)> AddNamedBuildToQueueSignalType; ///< emitted when the indicated named build is indicated by the user - typedef boost::signal<void (BuildType, int, int, int)> AddIDedBuildToQueueSignalType; ///< emitted when the indicated id'd build is indicated by the user - typedef boost::signal<void (int, int)> BuildQuantityChangedSignalType; ///< emitted when the quantity of items in a single build queue item is changed by the user - typedef boost::signal<void (int)> SystemSelectedSignalType; ///< emitted when system selection is required. + typedef boost::signal<void (BuildType, const std::string&, int, int)> AddNamedBuildToQueueSignalType; ///< emitted when the indicated named build is indicated by the user + typedef boost::signal<void (BuildType, int, int, int)> AddIDedBuildToQueueSignalType; ///< emitted when the indicated id'd build is indicated by the user + typedef boost::signal<void (int, int)> BuildQuantityChangedSignalType; ///< emitted when the quantity of items in a single build queue item is changed by the user + typedef boost::signal<void (int)> SystemSelectedSignalType; ///< emitted when system selection is required. //@} /** \name Structors */ //@{ @@ -46,32 +47,32 @@ void HideAllTypes(bool refresh_list = true); void ToggleType(BuildType type, bool refresh_list = true); void ToggleAllTypes(bool refresh_list = true); - + void ShowAvailability(bool available, bool refresh_list = true); void HideAvailability(bool available, bool refresh_list = true); void ToggleAvailabilitly(bool available, bool refresh_list = true); //@} - mutable AddNamedBuildToQueueSignalType AddNamedBuildToQueueSignal; - mutable AddIDedBuildToQueueSignalType AddIDedBuildToQueueSignal; - mutable BuildQuantityChangedSignalType BuildQuantityChangedSignal; - mutable SystemSelectedSignalType SystemSelectedSignal; + mutable AddNamedBuildToQueueSignalType AddNamedBuildToQueueSignal; + mutable AddIDedBuildToQueueSignalType AddIDedBuildToQueueSignal; + mutable BuildQuantityChangedSignalType BuildQuantityChangedSignal; + mutable SystemSelectedSignalType SystemSelectedSignal; private: - class BuildDetailPanel; class BuildSelector; void BuildItemRequested(BuildType build_type, const std::string& item, int num_to_build); void BuildItemRequested(BuildType build_type, int design_id, int num_to_build); void BuildQuantityChanged(int queue_idx, int quantity); + void SetBuild(int queue_idx); void SelectDefaultPlanet(int system); - BuildDetailPanel* m_build_detail_panel; - BuildSelector* m_build_selector; - SidePanel* m_side_panel; - int m_build_location; - GG::Rect m_map_view_hole; - std::map<int, int> m_system_default_planets; + EncyclopediaDetailPanel* m_enc_detail_panel; + BuildSelector* m_build_selector; + SidePanel* m_side_panel; + int m_build_location; + GG::Rect m_map_view_hole; + std::map<int, int> m_system_default_planets; }; #endif // _BuildDesignatorWnd_h_ Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2009-01-11 11:01:36 UTC (rev 2733) @@ -220,7 +220,6 @@ return; } - // get details of item as applicable in order to set summary, cost, description TextControls std::string name = ""; boost::shared_ptr<GG::Texture> texture; @@ -243,7 +242,6 @@ specific_type = UserString(boost::lexical_cast<std::string>(m_part->Class())); detailed_description = UserString(m_part->Description()) + boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(m_part->Effects())); - } else if (m_hull) { // Ship Hulls name = UserString(m_hull->Name()); @@ -255,7 +253,6 @@ // hulls have no specific types detailed_description = UserString(m_hull->Description()) + boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(m_hull->Effects())); - } else if (m_tech) { // Technologies name = UserString(m_tech->Name()); @@ -266,17 +263,29 @@ cost_units = UserString("ENC_RP"); general_type = UserString("ENC_TECH"); specific_type = UserString(m_tech->Category()); - } else if (m_building) { // Buildings name = UserString(m_building->Name()); texture = ClientUI::BuildingTexture(m_building->Name()); - + turns = m_building->BuildTime(); + cost = m_building->BuildCost(); + cost_units = UserString("ENC_PP"); + general_type = UserString("ENC_BUILDING_TYPE"); + detailed_description = UserString(m_building->Description()) + + boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(m_building->Effects())); } else if (m_design) { // Ship Designs - name = UserString(m_design->Name()); + name = m_design->Name(); texture = ClientUI::ShipIcon(m_design->ID()); - + turns = m_design->BuildTime(); + cost = m_design->Cost(); + cost_units = UserString("ENC_PP"); + general_type = UserString("ENC_SHIP_DESIGN"); + detailed_description = boost::io::str(FlexibleFormat(UserString("ENC_SHIP_DESIGN_DESCRIPTION_STR")) + % m_design->Description() + % m_design->Attack() + % m_design->Defense() + % m_design->Speed()); } else if (m_special) { // Specials name = UserString(m_special->Name()); Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.h =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.h 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.h 2009-01-11 11:01:36 UTC (rev 2733) @@ -41,14 +41,14 @@ void SetItem(const BuildingType* building); void SetItem(const ShipDesign* design); void SetItem(const Special* special); + + void Reset(); + void UnsetAll(); //@} private: - void Reset(); void DoLayout(); - bool NothingSet(); - void UnsetAll(); const Tech* m_tech; const PartType* m_part; Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/default/eng_stringtable.txt 2009-01-11 11:01:36 UTC (rev 2733) @@ -1452,23 +1452,6 @@ PRODUCTION_TURNS_LEFT_NEVER Never -PRODUCTION_DETAIL_BUILDING_DESCRIPTION_STR -%1% - -PRODUCTION_DETAIL_BUILDING_DESCRIPTION_STR_WITH_EFFECTS -'''%1% - -<u>Effects</u> - -%2%''' - -PRODUCTION_DETAIL_SHIP_DESCRIPTION_STR -'''%1% - -Attack: %2% -Defense: %3% -Speed: %4%''' - PRODUCTION_DETAIL_NUMBER_TO_BUILD Quantity @@ -1560,15 +1543,15 @@ ENC_TECH Technology -ENC_SHIP_DESIGN -Ship Design - ENC_SPECIAL Special -ENC_BUILDING -Building +ENC_BUILDING_TYPE +Building Type +ENC_SHIP_DESIGN +Ship Design + # type of thing being shown. %1% is a bit of detail, and %2% is the general type. # for example: %1% = "Point Defence" or "Farming" and %2% = "Ship Part" or "Building". # %1% may be an empty string for most general types of things that can be shown. @@ -1598,8 +1581,15 @@ %1%''' +ENC_SHIP_DESIGN_DESCRIPTION_STR +'''%1% +Attack: %2% +Defense: %3% +Speed: %4%''' + + #################### # Combat Messages # #################### Modified: trunk/FreeOrion/msvc2005/src/Version.cpp =================================================================== --- trunk/FreeOrion/msvc2005/src/Version.cpp 2009-01-11 01:04:42 UTC (rev 2732) +++ trunk/FreeOrion/msvc2005/src/Version.cpp 2009-01-11 11:01:36 UTC (rev 2733) @@ -2,6 +2,6 @@ const std::string& FreeOrionVersionString() { - static const std::string retval = "Post-v0.3.10 [Development Build]"; + static const std::string retval = "Post-v0.3.11 [Development Build]"; return retval; } |
From: <kr...@us...> - 2009-01-11 12:32:22
|
Revision: 2735 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2735&view=rev Author: kroddn Date: 2009-01-11 12:32:10 +0000 (Sun, 11 Jan 2009) Log Message: ----------- UI/MapWnd.cpp: Introduced define USE_GL_BIND_BUFFER_ARB for supporting easier switching of GL functions used. For windows, this is defined by default. The code has not changed at all because at the top of the source USE_GL_BIND_BUFFER_ARB is defined for windows builds as it was before.\nbuild_support.py: supported newer linux distroy, where boost-python libs have -py25 suffixes\nSome cosmetix\nSConstruct: use Clone instead of Copy. Exit on GG errors. Export PKG_CONFIG_PATH env.\nHumanClientApp.cpp: added some throw-catch blocks to better find crashes Modified Paths: -------------- trunk/FreeOrion/SConstruct trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/build_support.py trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/util/Directories.cpp Modified: trunk/FreeOrion/SConstruct =================================================================== --- trunk/FreeOrion/SConstruct 2009-01-11 11:33:07 UTC (rev 2734) +++ trunk/FreeOrion/SConstruct 2009-01-11 12:32:10 UTC (rev 2735) @@ -112,6 +112,10 @@ options.Update(env) +# We maybe need this env var for pkg-config later +if os.environ.has_key('PKG_CONFIG_PATH'): + env['ENV']['PKG_CONFIG_PATH'] = os.environ['PKG_CONFIG_PATH'] + if env.has_key('use_distcc') and env['use_distcc']: if 'distcc' not in env['CC']: env['CC'] = 'distcc %s' % env['CC'] @@ -225,6 +229,8 @@ if conf.CheckPkg('GiGiSDL', gigi_version): env.ParseConfig('pkg-config --cflags --libs GiGiSDL') found_gg_pkg_config = True + else: + Exit(1) freeorion_boost_libs = [ ('boost_serialization', 'boost/archive/binary_iarchive.hpp', 'boost::archive::binary_iarchive::is_saving();'), @@ -581,7 +587,7 @@ env.Command('icon.rbj', 'win32_resources.res', ['cvtres /out:icon.rbj /machine:ix86 win32_resources.res']) freeorion = env.Program("freeorion", human_objects + ['icon.rbj']) else: - env_copy = env.Copy() + env_copy = env.Clone() env_copy.AppendUnique(LIBS = human_libs) freeorion = env_copy.Program("freeorion", human_objects) Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-11 11:33:07 UTC (rev 2734) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-11 12:32:10 UTC (rev 2735) @@ -1,7 +1,13 @@ #ifdef FREEORION_WIN32 #include <GL/glew.h> +# ifndef USE_GL_BIND_BUFFER_ARB +# define USE_GL_BIND_BUFFER_ARB +# endif #endif +// Maybe also set for Linux +//#define USE_GL_BIND_BUFFER_ARB + #include "MapWnd.h" #include "ClientUI.h" @@ -1104,7 +1110,7 @@ for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_core_quad_vertices.begin(); it != m_star_core_quad_vertices.end(); ++it) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &it->second.m_name); #else glDeleteBuffers(1, &it->second.m_name); @@ -1115,7 +1121,7 @@ m_star_halo_quad_vertices.begin(); it != m_star_halo_quad_vertices.end(); ++it) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &it->second.m_name); #else glDeleteBuffers(1, &it->second.m_name); @@ -1126,7 +1132,7 @@ m_galaxy_gas_quad_vertices.begin(); it != m_galaxy_gas_quad_vertices.end(); ++it) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &it->second.m_name); #else glDeleteBuffers(1, &it->second.m_name); @@ -1135,7 +1141,7 @@ m_galaxy_gas_quad_vertices.clear(); if (m_star_texture_coords.m_name) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &m_star_texture_coords.m_name); #else glDeleteBuffers(1, &m_star_texture_coords.m_name); @@ -1144,7 +1150,7 @@ } if (m_starlane_vertices.m_name) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &m_starlane_vertices.m_name); #else glDeleteBuffers(1, &m_starlane_vertices.m_name); @@ -1153,7 +1159,7 @@ } if (m_starlane_colors.m_name) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &m_starlane_colors.m_name); #else glDeleteBuffers(1, &m_starlane_colors.m_name); @@ -1162,7 +1168,7 @@ } if (m_starlane_fleet_supply_vertices.m_name) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glDeleteBuffersARB(1, &m_starlane_fleet_supply_vertices.m_name); #else glDeleteBuffers(1, &m_starlane_fleet_supply_vertices.m_name); @@ -1187,7 +1193,7 @@ it != raw_star_core_quad_vertices.end(); ++it) { GLuint& name = m_star_core_quad_vertices[it->first].m_name; -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1209,7 +1215,7 @@ it != raw_star_halo_quad_vertices.end(); ++it) { GLuint& name = m_star_halo_quad_vertices[it->first].m_name; -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1231,7 +1237,7 @@ it != raw_galaxy_gas_quad_vertices.end(); ++it) { GLuint& name = m_galaxy_gas_quad_vertices[it->first].m_name; -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1250,7 +1256,7 @@ } if (!raw_star_texture_coords.empty()) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &m_star_texture_coords.m_name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_star_texture_coords.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1268,7 +1274,7 @@ m_star_texture_coords.m_size = raw_star_texture_coords.size() / 2; } if (!raw_starlane_vertices.empty()) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &m_starlane_vertices.m_name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_vertices.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1304,7 +1310,7 @@ m_starlane_colors.m_size = raw_starlane_colors.size() / 4; } if (!raw_starlane_supply_vertices.empty()) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &m_starlane_fleet_supply_vertices.m_name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_vertices.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1322,7 +1328,7 @@ m_starlane_fleet_supply_vertices.m_size = raw_starlane_supply_vertices.size() / 2; } if (!raw_starlane_supply_colors.empty()) { -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glGenBuffersARB(1, &m_starlane_fleet_supply_colors.m_name); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_colors.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, @@ -1340,7 +1346,7 @@ m_starlane_fleet_supply_colors.m_size = raw_starlane_supply_colors.size() / 4; } -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glBindBufferARB(GL_ARRAY_BUFFER, 0); #else glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1915,7 +1921,7 @@ else glColor(UNOWNED_STARLANE_GRAY_CLR); -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_vertices.m_name); #else glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); @@ -1947,13 +1953,13 @@ glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); glEnableClientState(GL_COLOR_ARRAY); -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_vertices.m_name); #else glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); #endif glVertexPointer(2, GL_FLOAT, 0, 0); -#ifdef FREEORION_WIN32 +#ifdef USE_GL_BIND_BUFFER_ARB glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_colors.m_name); #else glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); Modified: trunk/FreeOrion/build_support.py =================================================================== --- trunk/FreeOrion/build_support.py 2009-01-11 11:33:07 UTC (rev 2734) +++ trunk/FreeOrion/build_support.py 2009-01-11 12:32:10 UTC (rev 2735) @@ -234,9 +234,14 @@ if conf.CheckLibWithHeader(lib_name, lib_tuple[1], 'C++', lib_tuple[2]): ret = lib_name else: - lib_name = lib_name + '-mt' - if conf.CheckLibWithHeader(lib_name, lib_tuple[1], 'C++', lib_tuple[2]): - ret = lib_name + lib_name_mt = lib_name + '-mt' + if conf.CheckLibWithHeader(lib_name_mt, lib_tuple[1], 'C++', lib_tuple[2]): + ret = lib_name_mt + else: + lib_name_py = lib_name + '-py25' + if conf.CheckLibWithHeader(lib_name_py, lib_tuple[1], 'C++', lib_tuple[2]): + ret = lib_name_py + return ret def CheckBGL(context, conf): Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 11:33:07 UTC (rev 2734) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 12:32:10 UTC (rev 2735) @@ -474,7 +474,15 @@ void HumanClientApp::HandleSystemEvents() { + try { SDLGUI::HandleSystemEvents(); + } + catch (const std::runtime_error& e) { + std::cerr << "std::runtime_error exception caught while SDLGUI::HandleSystemEvents() in HumanClientApp::HandleSystemEvents(): " << e.what() << "\n"; + throw e; + } + + try { if (m_connected && !Networking().Connected()) { m_connected = false; // Note that Disconnections are handled with a post_event instead of a process_event. This is because a @@ -487,6 +495,11 @@ Networking().GetMessage(msg); HandleMessage(msg); } + } + catch (const std::runtime_error& e) { + std::cerr << "std::runtime_error exception caught in HumanClientApp::HandleSystemEvents(): " << e.what() << "\n"; + throw e; + } } void HumanClientApp::HandleNonGGEvent(const SDL_Event& event) Modified: trunk/FreeOrion/util/Directories.cpp =================================================================== --- trunk/FreeOrion/util/Directories.cpp 2009-01-11 11:33:07 UTC (rev 2734) +++ trunk/FreeOrion/util/Directories.cpp 2009-01-11 12:32:10 UTC (rev 2735) @@ -138,7 +138,7 @@ if (fs::path::default_name_check_writable()) fs::path::default_name_check(fs::native); - // store working dir + // store working dir (current working dir) fs::initial_path(); br_init(0); |
From: <kr...@us...> - 2009-01-11 15:06:28
|
Revision: 2736 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2736&view=rev Author: kroddn Date: 2009-01-11 15:06:23 +0000 (Sun, 11 Jan 2009) Log Message: ----------- Indent and Linefeed fixes. Fixed errors in Tech and Shipparts Modified Paths: -------------- trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/default/buildings.txt trunk/FreeOrion/default/techs.txt trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 12:32:10 UTC (rev 2735) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 15:06:23 UTC (rev 2736) @@ -475,30 +475,30 @@ void HumanClientApp::HandleSystemEvents() { try { - SDLGUI::HandleSystemEvents(); + SDLGUI::HandleSystemEvents(); } catch (const std::runtime_error& e) { - std::cerr << "std::runtime_error exception caught while SDLGUI::HandleSystemEvents() in HumanClientApp::HandleSystemEvents(): " << e.what() << "\n"; - throw e; + std::cerr << "std::runtime_error exception caught while SDLGUI::HandleSystemEvents() in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; + throw e; } try { - if (m_connected && !Networking().Connected()) { - m_connected = false; - // Note that Disconnections are handled with a post_event instead of a process_event. This is because a - // Disconnection inherently precipitates a transition out of any state S that handles it, and if another event - // that also causes a transition out of S is currently active (e.g. MPLobby), a double-destruction of S will - // occur. - m_fsm->post_event(Disconnection()); - } else if (Networking().MessageAvailable()) { - Message msg; - Networking().GetMessage(msg); - HandleMessage(msg); - } + if (m_connected && !Networking().Connected()) { + m_connected = false; + // Note that Disconnections are handled with a post_event instead of a process_event. This is because a + // Disconnection inherently precipitates a transition out of any state S that handles it, and if another event + // that also causes a transition out of S is currently active (e.g. MPLobby), a double-destruction of S will + // occur. + m_fsm->post_event(Disconnection()); + } else if (Networking().MessageAvailable()) { + Message msg; + Networking().GetMessage(msg); + HandleMessage(msg); + } } catch (const std::runtime_error& e) { - std::cerr << "std::runtime_error exception caught in HumanClientApp::HandleSystemEvents(): " << e.what() << "\n"; - throw e; + std::cerr << "std::runtime_error exception caught in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; + throw e; } } Modified: trunk/FreeOrion/default/buildings.txt =================================================================== --- trunk/FreeOrion/default/buildings.txt 2009-01-11 12:32:10 UTC (rev 2735) +++ trunk/FreeOrion/default/buildings.txt 2009-01-11 15:06:23 UTC (rev 2736) @@ -175,8 +175,8 @@ OwnedExclusivelyBy TheEmpire Source.Owner PrimaryFocus Research ] - activation = OwnerHasTech "LRN_THEORM_PROVER" - stackinggroup = "THEORM_PROVER_STACK_PRIMARY" + activation = OwnerHasTech "LRN_THEOREM_PROVER" + stackinggroup = "THEOREM_PROVER_STACK_PRIMARY" effects = SetMaxResearch Target.MaxResearch + 5 EffectsGroup @@ -184,8 +184,8 @@ OwnedExclusivelyBy TheEmpire Source.Owner SecondaryFocus Research ] - activation = OwnerHasTech "LRN_THEORM_PROVER" - stackinggroup = "THEORM_PROVER_STACK_SECONDARY" + activation = OwnerHasTech "LRN_THEOREM_PROVER" + stackinggroup = "THEOREM_PROVER_STACK_SECONDARY" effects = SetMaxResearch Target.MaxResearch + 2 ] graphic = "" Modified: trunk/FreeOrion/default/techs.txt =================================================================== --- trunk/FreeOrion/default/techs.txt 2009-01-11 12:32:10 UTC (rev 2735) +++ trunk/FreeOrion/default/techs.txt 2009-01-11 15:06:23 UTC (rev 2736) @@ -2016,7 +2016,7 @@ researchcost = 1 researchturns = 1 prerequisites = "SHP_SPACE_TACTICS" - unlock = Item type = ShipPart name = "SR_ION_CANNON" + unlock = Item type = ShipPart name = "LR_NUCLEAR_MISSILE" graphic = "" Tech Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2009-01-11 12:32:10 UTC (rev 2735) +++ trunk/FreeOrion/util/Order.cpp 2009-01-11 15:06:23 UTC (rev 2736) @@ -118,13 +118,13 @@ m_ship_ids(ship_ids) { #if DEBUG_CREATE_FLEET_ORDER - std::cerr << "NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, int system_id, int ship_id) : \n" - << " m_empire=" << EmpireID() << "\n" - << " m_fleet_name=" << m_fleet_name << "\n" - << " m_system_id=" << m_system_id << "\n" - << " m_position=(" << m_position.first << " " << m_position.second << ")\n" - << " m_new_id=" << m_new_id << "\n" - << " m_ship_ids.size()=" << m_ship_ids.size() << "\n" + std::cerr << "NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, int system_id, int ship_id) : \n" << std::endl + << " m_empire=" << EmpireID() << std::endl + << " m_fleet_name=" << m_fleet_name << std::endl + << " m_system_id=" << m_system_id << std::endl + << " m_position=(" << m_position.first << " " << m_position.second << ")" << std::endl + << " m_new_id=" << m_new_id << std::endl + << " m_ship_ids.size()=" << m_ship_ids.size() << std::endl << std::endl; #endif } @@ -138,13 +138,13 @@ m_ship_ids(ship_ids) { #if DEBUG_CREATE_FLEET_ORDER - std::cerr << "NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, double x, double y, int ship_id : \n" - << " m_empire=" << EmpireID() << "\n" - << " m_fleet_name=" << m_fleet_name << "\n" - << " m_system_id=" << m_system_id << "\n" - << " m_position=(" << m_position.first << " " << m_position.second << ")\n" - << " m_new_id=" << m_new_id << "\n" - << " m_ship_ids.size()=" << m_ship_ids.size() << "\n" + std::cerr << "NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, double x, double y, int ship_id : " << std::endl + << " m_empire=" << EmpireID() << std::endl + << " m_fleet_name=" << m_fleet_name << std::endl + << " m_system_id=" << m_system_id << std::endl + << " m_position=(" << m_position.first << " " << m_position.second << ")" << std::endl + << " m_new_id=" << m_new_id << std::endl + << " m_ship_ids.size()=" << m_ship_ids.size() << std::endl << std::endl; #endif } @@ -208,13 +208,13 @@ } #if DEBUG_FLEET_MOVE_ORDER - std::cerr << "FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : \n" - << " m_empire=" << EmpireID() << "\n" - << " m_fleet=" << m_fleet << "\n" - << " m_start_system=" << m_start_system << "\n" - << " m_dest_system=" << m_dest_system << "\n" - << " m_route.size()=" << m_route.size() << "\n" - << " m_route_length=" << m_route_length << "\n" + std::cerr << "FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : " << std::endl + << " m_empire=" << EmpireID() << std::endl + << " m_fleet=" << m_fleet << std::endl + << " m_start_system=" << m_start_system << std::endl + << " m_dest_system=" << m_dest_system << std::endl + << " m_route.size()=" << m_route.size() << std::endl + << " m_route_length=" << m_route_length << std::endl << std::endl; #endif } |
From: <geo...@us...> - 2009-01-11 22:21:41
|
Revision: 2738 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2738&view=rev Author: geoffthemedio Date: 2009-01-11 22:21:38 +0000 (Sun, 11 Jan 2009) Log Message: ----------- -Grooming -Gave kroddn programming credit Modified Paths: -------------- trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/default/credits.xml Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 17:12:02 UTC (rev 2737) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2009-01-11 22:21:38 UTC (rev 2738) @@ -474,32 +474,30 @@ void HumanClientApp::HandleSystemEvents() { - try { - SDLGUI::HandleSystemEvents(); - } - catch (const std::runtime_error& e) { - std::cerr << "std::runtime_error exception caught while SDLGUI::HandleSystemEvents() in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; - throw e; - } + try { + SDLGUI::HandleSystemEvents(); + } catch (const std::runtime_error& e) { + std::cerr << "std::runtime_error exception caught while SDLGUI::HandleSystemEvents() in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; + throw e; + } - try { - if (m_connected && !Networking().Connected()) { - m_connected = false; - // Note that Disconnections are handled with a post_event instead of a process_event. This is because a - // Disconnection inherently precipitates a transition out of any state S that handles it, and if another event - // that also causes a transition out of S is currently active (e.g. MPLobby), a double-destruction of S will - // occur. - m_fsm->post_event(Disconnection()); - } else if (Networking().MessageAvailable()) { - Message msg; - Networking().GetMessage(msg); - HandleMessage(msg); - } - } - catch (const std::runtime_error& e) { - std::cerr << "std::runtime_error exception caught in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; - throw e; - } + try { + if (m_connected && !Networking().Connected()) { + m_connected = false; + // Note that Disconnections are handled with a post_event instead of a process_event. This is because a + // Disconnection inherently precipitates a transition out of any state S that handles it, and if another event + // that also causes a transition out of S is currently active (e.g. MPLobby), a double-destruction of S will + // occur. + m_fsm->post_event(Disconnection()); + } else if (Networking().MessageAvailable()) { + Message msg; + Networking().GetMessage(msg); + HandleMessage(msg); + } + } catch (const std::runtime_error& e) { + std::cerr << "std::runtime_error exception caught in HumanClientApp::HandleSystemEvents(): " << e.what() << std::endl; + throw e; + } } void HumanClientApp::HandleNonGGEvent(const SDL_Event& event) Modified: trunk/FreeOrion/default/credits.xml =================================================================== --- trunk/FreeOrion/default/credits.xml 2009-01-11 17:12:02 UTC (rev 2737) +++ trunk/FreeOrion/default/credits.xml 2009-01-11 22:21:38 UTC (rev 2738) @@ -70,7 +70,7 @@ <PERSON name="Ivan Sanchez" nick="Ivan s c" task="Spanish Translation"/> <PERSON name="Myckel Habets" nick="Myckel" task="Dutch Translation"/> <PERSON name="Martin Roth" nick="Captain Rage" task="Swedish Translation"/> - <PERSON name="Markus Sinner" nick="kroddn" task="German Translation"/> + <PERSON name="Markus Sinner" nick="kroddn" task="German Translation, Programming"/> <PERSON name="Fran Valenzuela" nick="Synyestro" task="Spanish Translation"/> <PERSON name="Guillaume" nick="nyquist" task="French Translation"/> </GROUP> |
From: <tz...@us...> - 2009-01-12 03:52:47
|
Revision: 2741 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2741&view=rev Author: tzlaine Date: 2009-01-12 03:52:43 +0000 (Mon, 12 Jan 2009) Log Message: ----------- Removed the dependency on DevIL. Modified Paths: -------------- trunk/FreeOrion/SConstruct trunk/FreeOrion/build_config.py Modified: trunk/FreeOrion/SConstruct =================================================================== --- trunk/FreeOrion/SConstruct 2009-01-11 23:46:37 UTC (rev 2740) +++ trunk/FreeOrion/SConstruct 2009-01-12 03:52:43 UTC (rev 2741) @@ -47,9 +47,6 @@ options.Add('with_ft', 'Root directory of FreeType2 installation') options.Add('with_ft_include', 'Specify exact include dir for FreeType2 headers') options.Add('with_ft_libdir', 'Specify exact library dir for FreeType2 library') -options.Add('with_devil', 'Root directory of DevIL installation') -options.Add('with_devil_include', 'Specify exact include dir for DevIL headers') -options.Add('with_devil_libdir', 'Specify exact library dir for DevIL library') options.Add('with_openal', 'Root directory of OpenAL installation') options.Add('with_openal_include', 'Specify exact include dir for OpenAL headers') options.Add('with_openal_libdir', 'Specify exact library dir for OpenAL library') @@ -309,36 +306,6 @@ else: env.AppendUnique(LIBS = [ft_win32_lib_name]) - # DevIL (aka IL) - AppendPackagePaths('devil', env) - version_regex = re.compile(r'IL_VERSION\s*(\d+)') - if not conf.CheckVersionHeader('DevIL', 'IL/il.h', version_regex, devil_version, True, 'Checking DevIL version >= %s... ' % devil_version_string): - Exit(1) - if not conf.CheckCHeader('IL/il.h') or \ - not conf.CheckCHeader('IL/ilu.h') or \ - not conf.CheckCHeader('IL/ilut.h'): - print "Note: since SDL support is disabled, the SDL headers are not in the compiler's search path during tests. If DevIL was built with SDL support, this may cause the search for ilut.h to fail." - Exit(1) - if str(Platform()) != 'win32' and (not conf.CheckLib('IL', 'ilInit') or \ - not conf.CheckLib('ILU', 'iluInit') or \ - not conf.CheckLib('ILUT', 'ilutInit')): - Exit(1) - from sys import stdout - stdout.write('Checking for DevIL OpenGL support... ') - devil_gl_check_app = """ -#include <IL/ilut.h> -#ifndef ILUT_USE_OPENGL -#error "DevIL not built with OpenGL support" -#endif -int main() { - return 0; -} -""" - if not conf.TryCompile(devil_gl_check_app, '.c'): - print 'no' - else: - print 'yes' - # ltdl if str(Platform()) != 'win32': if not conf.CheckLibLTDL(): Modified: trunk/FreeOrion/build_config.py =================================================================== --- trunk/FreeOrion/build_config.py 2009-01-11 23:46:37 UTC (rev 2740) +++ trunk/FreeOrion/build_config.py 2009-01-12 03:52:43 UTC (rev 2741) @@ -8,9 +8,6 @@ ft_version = '2.1.2' ft_win32_lib_name = 'freetype214MT' -devil_version_string = '1.6.1' -devil_version = ''.join(devil_version_string.split('.')) - sdl_version = '1.2.7' boost_version_string = '1.36' |
From: <geo...@us...> - 2009-01-12 22:57:37
|
Revision: 2744 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2744&view=rev Author: geoffthemedio Date: 2009-01-12 22:57:32 +0000 (Mon, 12 Jan 2009) Log Message: ----------- -Updated for recent dependency changes -Removed accidentally added file from MSVC 2008 project file -Fixed typo in stringtable Modified Paths: -------------- trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj trunk/FreeOrion/msvc2008/include/GG/Config.h Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2009-01-12 22:39:51 UTC (rev 2743) +++ trunk/FreeOrion/default/eng_stringtable.txt 2009-01-12 22:57:32 UTC (rev 2744) @@ -3342,7 +3342,7 @@ Interstellar Lighthouses SHP_LIGHTHOUSE_DESC -Useful for ships travelling into and out of a system by starlanes, Interstellar "Lighthouses" indicate the location of a starlane entrance in a system, and also make the lane safely navigable in either direction. Use of the lane is made significant safer. +Useful for ships travelling into and out of a system by starlanes, Interstellar "Lighthouses" indicate the location of a starlane entrance in a system, and also make the lane safely navigable in either direction. Use of the lane is made significantly safer. SHP_FLEET_LOGISTICS Fleet Logistics Modified: trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj =================================================================== --- trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj 2009-01-12 22:39:51 UTC (rev 2743) +++ trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj 2009-01-12 22:57:32 UTC (rev 2744) @@ -479,10 +479,6 @@ > </File> <File - RelativePath="..\..\..\UI\Hotkey.h" - > - </File> - <File RelativePath="..\..\..\UI\InfoPanels.cpp" > </File> @@ -1137,10 +1133,6 @@ > </File> </Filter> - <Filter - Name="GIL" - > - </Filter> </Filter> </Filter> <Filter Modified: trunk/FreeOrion/msvc2008/include/GG/Config.h =================================================================== --- trunk/FreeOrion/msvc2008/include/GG/Config.h 2009-01-12 22:39:51 UTC (rev 2743) +++ trunk/FreeOrion/msvc2008/include/GG/Config.h 2009-01-12 22:57:32 UTC (rev 2744) @@ -26,9 +26,9 @@ #ifndef _GG_Config_h_ #define _GG_Config_h_ -#define GG_USE_DEVIL_IMAGE_LOAD_LIBRARY 1 +#define GG_USE_DEVIL_IMAGE_LOAD_LIBRARY 0 #define GG_HAVE_LIBJPEG 0 -#define GG_HAVE_LIBPNG 0 +#define GG_HAVE_LIBPNG 1 #define GG_HAVE_LIBTIFF 0 #endif // _GG_Config_h_ |
From: <geo...@us...> - 2009-01-14 13:22:31
|
Revision: 2748 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2748&view=rev Author: geoffthemedio Date: 2009-01-14 11:30:34 +0000 (Wed, 14 Jan 2009) Log Message: ----------- -Changed interface of Fleet::SetRoute to only take the route, not the distance, since the latter is a function of the former. -Added some order validity checks to FleetMoveOrder to ensure orders that shouldn't be allowed aren't. Still need to fully validate the requested move path, however. -Tweaked FleetMoveOrder::ExecuteImpl comment pre and post conditions, which were a copy-paste of CreateFleetOrder's conditions. Need to finish this as well. -Added usable error output to AIClientApp, which was previously attempting to use the logger to display a message before the logger was initialized. Modified Paths: -------------- trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2009-01-14 11:30:34 UTC (rev 2748) @@ -33,7 +33,7 @@ s_app = this; if (argc < 2) { - Logger().fatal("The AI client should not be executed directly!"); + std::cerr << "The AI client should not be executed directly! Run freeorion to start the game."; Exit(1); } Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/universe/Effect.cpp 2009-01-14 11:30:34 UTC (rev 2748) @@ -125,7 +125,7 @@ } /** Resets the previous and next systems of \a fleet and recalcultes / resets the fleet's move route. Used after a fleet - has been moved with the MoveTo effect, as its previous route was assigned based on its previous location, an may not + has been moved with the MoveTo effect, as its previous route was assigned based on its previous location, and may not be valid for its new location. */ void UpdateFleetRoute(Fleet* fleet, int new_next_system, int new_previous_system) { if (!fleet) { @@ -143,6 +143,9 @@ fleet->SetNextAndPreviousSystems(new_next_system, new_previous_system); + + // recalculate route from the shortest path between first system on path and final destination + int owner = -1; const std::set<int>& owners = fleet->Owners(); if (!owners.empty()) @@ -156,15 +159,14 @@ std::pair<std::list<System*>, double> route_pair = universe.ShortestPath(start_system, dest_system, owner); - if (route_pair.first.empty()) { + // if shortest path is empty, the route may be impossible or trivial, so just set route to move fleet + // to the next system that it was just set to move to anyway. + if (route_pair.first.empty()) route_pair.first.push_back(next_system); - double dist_x = next_system->X() - fleet->X(); - double dist_y = next_system->Y() - fleet->Y(); - route_pair.second = std::sqrt(dist_x * dist_x + dist_y * dist_y); - } - fleet->SetRoute(route_pair.first, route_pair.second); + // set fleet with newly recalculated route + fleet->SetRoute(route_pair.first); } /** returns true of the owners of the two passed objects are the same, and both are owned, false otherwise */ @@ -840,19 +842,26 @@ { Universe& universe = GetUniverse(); + // get all objects in an ObjectSet Condition::ObjectSet potential_locations; for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) potential_locations.insert(it->second); Condition::ObjectSet valid_locations; + // apply location condition to determine valid location to move target to m_location_condition->Eval(source, valid_locations, potential_locations); + // early exit if there are no valid locations - can't move anything if there's nowhere to move to if (valid_locations.empty()) return; + // "randomly" pick a destination UniverseObject* destination = *valid_locations.begin(); + + // do the moving... + if (Fleet* fleet = universe_object_cast<Fleet*>(target)) { // fleets can be inserted into the system that contains the destination object (or the // destination object istelf if it is a system Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-01-14 11:30:34 UTC (rev 2748) @@ -485,7 +485,7 @@ return visitor.Visit(const_cast<Fleet* const>(this)); } -void Fleet::SetRoute(const std::list<System*>& route, double distance) +void Fleet::SetRoute(const std::list<System*>& route) { if (route.empty()) throw std::invalid_argument("Fleet::SetRoute() : Attempted to set an empty route."); @@ -497,8 +497,28 @@ throw std::invalid_argument("Fleet::SetRoute() : Illegally attempted to change a fleet's direction while it was in transit."); m_travel_route = route; - m_travel_distance = distance; + // calculate length of line segments between systems on route, and sum up to determine length of route between + // systems on route. (Might later add distance from fleet to first system on route to this to get the total + // route length, or this may itself be the total route length if the fleet is at the first system on the route). + m_travel_distance = 0.0; + for (std::list<System*>::const_iterator it = m_travel_route.begin(); it != m_travel_route.end(); ++it) { + std::list<System*>::const_iterator next_it = it; ++next_it; + + if (next_it == m_travel_route.end()) + break; // current system is the last on the route, so don't need to add any additional distance. + + const System* cur_sys = *it; + const System* next_sys = *next_it; + if (!cur_sys || !next_sys) + throw std::invalid_argument("Fleet::SetRoute() : passed a null System pointer on route"); + + double dist_x = next_sys->X() - cur_sys->X(); + double dist_y = next_sys->Y() - cur_sys->Y(); + m_travel_distance += std::sqrt(dist_x * dist_x + dist_y * dist_y); + } + + // if resetting to no movement while in a system if (SystemID() != UniverseObject::INVALID_OBJECT_ID && SystemID() == m_travel_route.back()->ID()) { m_moving_to = UniverseObject::INVALID_OBJECT_ID; @@ -514,7 +534,7 @@ } m_moving_to = m_travel_route.back()->ID(); if (m_prev_system != SystemID() && m_prev_system == m_travel_route.front()->ID()) { - m_prev_system = m_next_system; // if already in transit and turning around, swap prev and next + m_prev_system = m_next_system; // if already in transit and turning around, swap prev and next } else if (SystemID() == route.front()->ID()) { m_prev_system = SystemID(); } Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/universe/Fleet.h 2009-01-14 11:30:34 UTC (rev 2748) @@ -79,7 +79,7 @@ //@} /** \name Mutators */ //@{ - void SetRoute(const std::list<System*>& route, double distance); ///< orders the fleet to move through the systems in the list, in order + void SetRoute(const std::list<System*>& route); ///< orders the fleet to move through the systems in the list, in order void AddShip(int ship_id); ///< adds the ship to the fleet bool RemoveShip(int ship); ///< removes the ship from the fleet. Returns false if no ship with ID \a id was found. Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/util/Order.cpp 2009-01-14 11:30:34 UTC (rev 2748) @@ -181,40 +181,30 @@ FleetMoveOrder::FleetMoveOrder() : Order(), m_fleet(UniverseObject::INVALID_OBJECT_ID), - m_dest_system(UniverseObject::INVALID_OBJECT_ID), - m_route_length(0.0) + m_start_system(UniverseObject::INVALID_OBJECT_ID), + m_dest_system(UniverseObject::INVALID_OBJECT_ID) {} -FleetMoveOrder::FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : +FleetMoveOrder::FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : Order(empire), m_fleet(fleet), m_start_system(start_system), m_dest_system(dest_system) { std::pair<std::list<System*>, double> route = GetUniverse().ShortestPath(start_system, dest_system, empire); - for (std::list<System*>::iterator it = route.first.begin(); it != route.first.end(); ++it) { + for (std::list<System*>::iterator it = route.first.begin(); it != route.first.end(); ++it) m_route.push_back((*it)->ID()); - } - m_route_length = route.second; // ensure a zero-length (invalid) route is not requested / sent to a fleet - if (m_route.empty()) { + if (m_route.empty()) m_route.push_back(start_system); - const Fleet* fleet_obj = GetUniverse().Object<const Fleet>(fleet); - const System* system_obj = GetUniverse().Object<const System>(start_system); - double dist_x = system_obj->X() - fleet_obj->X(); - double dist_y = system_obj->Y() - fleet_obj->Y(); - m_route_length = std::sqrt(dist_x * dist_x + dist_y * dist_y); - } #if DEBUG_FLEET_MOVE_ORDER - std::cerr << "FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : " << std::endl + std::cerr << "FleetMoveOrder(int empire, int fleet, int start_syste, int dest_system) : " << std::endl << " m_empire=" << EmpireID() << std::endl << " m_fleet=" << m_fleet << std::endl << " m_start_system=" << m_start_system << std::endl << " m_dest_system=" << m_dest_system << std::endl - << " m_route.size()=" << m_route.size() << std::endl - << " m_route_length=" << m_route_length << std::endl << std::endl; #endif } @@ -226,23 +216,47 @@ Universe& universe = GetUniverse(); Fleet* fleet = universe.Object<Fleet>(FleetID()); - System* system = universe.Object<System>(DestinationSystemID()); + System* destination_system = universe.Object<System>(DestinationSystemID()); // perform sanity checks if (!fleet) throw std::runtime_error("Non-fleet object ID specified in fleet move order."); - if (!system) throw std::runtime_error("Non-system destination ID specified in fleet move order."); + if (!destination_system) throw std::runtime_error("Non-system destination ID specified in fleet move order."); + // verify that empire specified in order owns specified fleet if ( !fleet->OwnedBy(EmpireID()) ) - throw std::runtime_error("Empire " + boost::lexical_cast<std::string>(EmpireID()) + + throw std::runtime_error("Empire " + boost::lexical_cast<std::string>(EmpireID()) + " specified in fleet order does not own specified fleet " + boost::lexical_cast<std::string>(FleetID()) + "."); + + // verify fleet route first system + int fleet_sys_id = fleet->SystemID(); + if (fleet_sys_id != UniverseObject::INVALID_OBJECT_ID) { + // fleet is in a system. Its move path should also start from that system. + if (fleet_sys_id != m_start_system) + throw std::runtime_error("Empire " + boost::lexical_cast<std::string>(EmpireID()) + + " ordered a fleet to move from a system with id " + boost::lexical_cast<std::string>(m_start_system) + + " that it is not at. Fleet is located at system with id " + boost::lexical_cast<std::string>(fleet_sys_id) + "."); + } else { + // fleet is not in a system. Its move path should start from the next system it is moving to. + int next_system = fleet->NextSystemID(); + if (next_system != m_start_system) + throw std::runtime_error("Empire " + boost::lexical_cast<std::string>(EmpireID()) + + " ordered a fleet to move starting from a system with id " + boost::lexical_cast<std::string>(m_start_system) + + ", but the fleet's next destination is system with id " + boost::lexical_cast<std::string>(next_system) + "."); + } + + // convert list of ids to list of System std::list<System*> route; - for (unsigned int i = 0; i < m_route.size(); ++i) { + for (unsigned int i = 0; i < m_route.size(); ++i) route.push_back(universe.Object<System>(m_route[i])); - } + + // validate route. Only allow travel between systems connected in series by starlanes known to this fleet's owner. + + + // check destination validity: disallow movement that's out of range std::pair<int, int> eta = fleet->ETA(fleet->MovePath(route)); if (eta.first == Fleet::ETA_NEVER || eta.first == Fleet::ETA_OUT_OF_RANGE) { @@ -250,7 +264,7 @@ return; } - fleet->SetRoute(route, m_route_length); + fleet->SetRoute(route); } Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2009-01-14 08:19:49 UTC (rev 2747) +++ trunk/FreeOrion/util/Order.h 2009-01-14 11:30:34 UTC (rev 2748) @@ -172,17 +172,18 @@ int StartSystemID() const {return m_start_system;} ///< returns ID of system set as the start system for this order (the system the route starts from) int DestinationSystemID() const {return m_dest_system;} ///< returns ID of system set as destination for this order const std::vector<int>& Route() const {return m_route;} ///< returns the IDs of the systems in the route specified by this Order - double RouteLength() const {return m_route_length;} ///< returns the length of the route specified by this Order //@} private: /** - * Preconditions of execute: - * None. + * Preconditions of execute: + * - m_fleet is a valid id of a fleet owned by the order-giving empire + * - if the fleet is located in a system, m_start_system is the id of that system + * - if the fleet is not located in a system, m_start_system is the id of the system the fleet is moving to + * - * * Postconditions: - * - a new fleet will exist either in system m_system_id or at position m_position, - * and will belong to the creating empire. + * - TODO: WRITE THIS * */ virtual void ExecuteImpl() const; @@ -191,7 +192,6 @@ int m_start_system; int m_dest_system; std::vector<int> m_route; - double m_route_length; friend class boost::serialization::access; template <class Archive> @@ -537,8 +537,7 @@ & BOOST_SERIALIZATION_NVP(m_fleet) & BOOST_SERIALIZATION_NVP(m_start_system) & BOOST_SERIALIZATION_NVP(m_dest_system) - & BOOST_SERIALIZATION_NVP(m_route) - & BOOST_SERIALIZATION_NVP(m_route_length); + & BOOST_SERIALIZATION_NVP(m_route); } template <class Archive> |
From: <geo...@us...> - 2009-01-15 10:28:03
|
Revision: 2750 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2750&view=rev Author: geoffthemedio Date: 2009-01-15 10:27:53 +0000 (Thu, 15 Jan 2009) Log Message: ----------- -Initial skeleton of new BrowseInfoWnd for system resource summary that will indicate resource flow into / out of system -New MeterToResource that does the opposite of ResourceToMeter function for the two enums -Removed some unnecessary includes and forward delcares of XMLDoc -Grooming Modified Paths: -------------- trunk/FreeOrion/UI/About.h trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/combat/Combat.cpp trunk/FreeOrion/network/Message.cpp trunk/FreeOrion/network/Message.h trunk/FreeOrion/universe/Enums.cpp trunk/FreeOrion/universe/Enums.h Modified: trunk/FreeOrion/UI/About.h =================================================================== --- trunk/FreeOrion/UI/About.h 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/UI/About.h 2009-01-15 10:27:53 UTC (rev 2750) @@ -80,15 +80,15 @@ //! \name Controls //!@{ - GG::Button* m_done_btn; //!< Done button - GG::Button* m_license; //!< License button - GG::Button* m_vision; //!< Vision button + GG::Button* m_done_btn; //!< Done button + GG::Button* m_license; //!< License button + GG::Button* m_vision; //!< Vision button - XMLDoc m_vision_doc; //!< XML document containing the project vision + XMLDoc m_vision_doc; //!< XML document containing the project vision - GG::MultiEdit * m_info; //!< Displays the license or vision information + GG::MultiEdit* m_info; //!< Displays the license or vision information - std::string m_license_str; //!< String containing the copyright license + std::string m_license_str; //!< String containing the copyright license //!@} Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -179,7 +179,7 @@ void CombatWnd::UpdateCombatTurnProgress(const std::string& message) { std::stringstream stream(message); XMLDoc doc; - doc.ReadDoc(stream); + doc.ReadDoc(stream); CombatUpdateMessage msg(doc.root_node.Child("combat-update-message")); std::size_t r; Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -28,6 +28,8 @@ using boost::lexical_cast; namespace { + /** Gives details about what effects contribute to a meter's maximum value (Effect Accounting) and + * shows the current turn's current meter value and the predicted current meter value for next turn. */ class MeterBrowseWnd : public GG::BrowseInfoWnd { public: MeterBrowseWnd(MeterType meter_type, const UniverseObject* obj, const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >& meter_map) : @@ -249,28 +251,28 @@ } } - MeterType m_meter_type; - const UniverseObject* m_obj; - const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >& m_meter_map; + MeterType m_meter_type; + const UniverseObject* m_obj; + const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >& m_meter_map; - GG::TextControl* m_summary_title; + GG::TextControl* m_summary_title; - GG::TextControl* m_current_label; - GG::TextControl* m_current_value; - GG::TextControl* m_next_turn_label; - GG::TextControl* m_next_turn_value; - GG::TextControl* m_change_label; - GG::TextControl* m_change_value; + GG::TextControl* m_current_label; + GG::TextControl* m_current_value; + GG::TextControl* m_next_turn_label; + GG::TextControl* m_next_turn_value; + GG::TextControl* m_change_label; + GG::TextControl* m_change_value; - GG::TextControl* m_meter_title; + GG::TextControl* m_meter_title; - std::vector<std::pair<GG::TextControl*, GG::TextControl*> > m_effect_labels_and_values; + std::vector<std::pair<GG::TextControl*, GG::TextControl*> > m_effect_labels_and_values; - GG::Y row_height; + GG::Y row_height; - static const GG::X LABEL_WIDTH; - static const GG::X VALUE_WIDTH; - static const int EDGE_PAD; + static const GG::X LABEL_WIDTH; + static const GG::X VALUE_WIDTH; + static const int EDGE_PAD; bool initialized; }; @@ -278,9 +280,9 @@ const GG::X MeterBrowseWnd::VALUE_WIDTH(50); const int MeterBrowseWnd::EDGE_PAD(3); - - GG::Clr MeterColor(MeterType meter_type) - { + /** Returns GG::Clr with which to display programatically coloured things (such as meter bars) for the + indicated \a meter_type */ + GG::Clr MeterColor(MeterType meter_type) { switch (meter_type) { case METER_FARMING: return GG::CLR_YELLOW; @@ -522,11 +524,6 @@ m_pop_stat->SetValue(pop->MeterPoints(METER_POPULATION)); m_health_stat->SetValue(pop->MeterPoints(METER_HEALTH)); - const Universe::EffectAccountingMap& effect_accounting_map = universe.GetEffectAccountingMap(); - const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >* meter_map = 0; - Universe::EffectAccountingMap::const_iterator map_it = effect_accounting_map.find(m_popcenter_id); - if (map_it != effect_accounting_map.end()) - meter_map = &(map_it->second); // meter bar displays and production stats m_multi_meter_status_bar->Update(); @@ -535,7 +532,14 @@ m_pop_stat->SetValue(pop->ProjectedMeterPoints(METER_POPULATION)); m_health_stat->SetValue(pop->ProjectedMeterPoints(METER_HEALTH)); + // tooltips + const Universe::EffectAccountingMap& effect_accounting_map = universe.GetEffectAccountingMap(); + const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >* meter_map = 0; + Universe::EffectAccountingMap::const_iterator map_it = effect_accounting_map.find(m_popcenter_id); + if (map_it != effect_accounting_map.end()) + meter_map = &(map_it->second); + if (meter_map) { boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd(new MeterBrowseWnd(METER_POPULATION, obj, *meter_map)); m_pop_stat->SetBrowseInfoWnd(browse_wnd); @@ -914,11 +918,6 @@ m_secondary_focus_drop->Disable(true); } - const Universe::EffectAccountingMap& effect_accounting_map = universe.GetEffectAccountingMap(); - const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >* meter_map = 0; - 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); // meter bar displays and production stats m_multi_meter_status_bar->Update(); @@ -930,7 +929,14 @@ m_research_stat->SetValue(res->ProjectedMeterPoints(METER_RESEARCH)); m_trade_stat->SetValue(res->ProjectedMeterPoints(METER_TRADE)); + // tooltips + const Universe::EffectAccountingMap& effect_accounting_map = universe.GetEffectAccountingMap(); + const std::map<MeterType, std::vector<Universe::EffectAccountingInfo> >* meter_map = 0; + 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); + if (meter_map) { boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>(new MeterBrowseWnd(METER_FARMING, obj, *meter_map)); m_farming_stat->SetBrowseInfoWnd(browse_wnd); @@ -2233,3 +2239,39 @@ GG::FlatRectangle(ul, lr, ClientUI::WndColor(), ClientUI::WndOuterBorderColor(), 1); // main background GG::FlatRectangle(GG::Pt(ul.x + ICON_WIDTH, ul.y), GG::Pt(lr.x, ul.y + ROW_HEIGHT), ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // top title filled background } + +////////////////////////////////////// +// SystemResourceSummaryBrowseWnd // +////////////////////////////////////// +const GG::X SystemResourceSummaryBrowseWnd::LABEL_WIDTH(300); +const GG::X SystemResourceSummaryBrowseWnd::VALUE_WIDTH(50); +const int SystemResourceSummaryBrowseWnd::EDGE_PAD(3); + +SystemResourceSummaryBrowseWnd::SystemResourceSummaryBrowseWnd(ResourceType resource_type, const System* system) : + GG::BrowseInfoWnd(GG::X0, GG::Y0, LABEL_WIDTH + VALUE_WIDTH, GG::Y1), + m_resource_type(resource_type), + m_system(system), + initialized(false) +{} + +bool SystemResourceSummaryBrowseWnd::WndHasBrowseInfo(const GG::Wnd* wnd, std::size_t mode) const { + const std::vector<GG::Wnd::BrowseInfoMode>& browse_modes = wnd->BrowseModes(); + assert(mode <= browse_modes.size()); + return true; +} + +void SystemResourceSummaryBrowseWnd::Render() { + // TEMP // + int row_height = ClientUI::Pts() * 3/2; + // END TEMP // + + GG::Pt ul = UpperLeft(); + GG::Pt lr = LowerRight(); + GG::FlatRectangle(ul, lr, OpaqueColor(ClientUI::WndColor()), ClientUI::WndOuterBorderColor(), 1); // main background + GG::FlatRectangle(ul, GG::Pt(lr.x, ul.y + row_height), ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // top title filled background + GG::FlatRectangle(GG::Pt(ul.x, ul.y + 4*row_height), GG::Pt(lr.x, ul.y + 5*row_height), ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // middle title filled background +} + +void SystemResourceSummaryBrowseWnd::Initialize() { + initialized = true; +} Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/UI/InfoPanels.h 2009-01-15 10:27:53 UTC (rev 2750) @@ -15,10 +15,10 @@ class SpecialsPanel; class MultiTurnProgressBar; class MultiMeterStatusBar; -class MeterStatusBar; // TODO: delete this line class MultiIconValueIndicator; class Meter; class ShipDesign; +class System; class Planet; class ResourceCenter; class PopCenter; @@ -30,6 +30,7 @@ class StaticGraphic; } +/** Shows population and health with meter bars */ class PopulationPanel : public GG::Wnd { public: /** \name Structors */ //@{ @@ -77,6 +78,7 @@ static const int EDGE_PAD; ///< distance between edges of panel and placement of child controls }; +/** Shows resource meters with meter-bars */ class ResourcePanel : public GG::Wnd { public: /** \name Structors */ //@{ @@ -134,6 +136,7 @@ static const int EDGE_PAD; ///< distance between edges of panel and placement of child controls }; +/** Shows military-related meters including stealth, detection, shields, defense; with meter bars */ class MilitaryPanel : public GG::Wnd { public: /** \name Structors */ //@{ @@ -305,9 +308,8 @@ /** Display icon and number for various meter-related quantities associated with objects. Typical use would be to display the resource production values for a planet (not the meter values) and the - construction (a meter value), or the population (not a meter value) and health (a meter value). - Given a set of MeterType, the indicator will present the appropriate values for each. -*/ + construction (a meter value), or the population (not a meter value) and health (a meter value). + Given a set of MeterType, the indicator will present the appropriate values for each. */ class MultiIconValueIndicator : public GG::Wnd { public: MultiIconValueIndicator(GG::X w, const UniverseObject& obj, const std::vector<MeterType>& meter_types); @@ -385,4 +387,27 @@ const GG::Y ROW_HEIGHT; }; +/** Gives information about inporting and exporting of resources to and from this system when mousing + * over the system resource production summary. */ +class SystemResourceSummaryBrowseWnd : public GG::BrowseInfoWnd { +public: + SystemResourceSummaryBrowseWnd(ResourceType resource_type, const System* system); + + virtual bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const; + + virtual void Render(); + +private: + void Initialize(); + + ResourceType m_resource_type; + const System* m_system; + + static const GG::X LABEL_WIDTH; + static const GG::X VALUE_WIDTH; + static const int EDGE_PAD; + + bool initialized; +}; + #endif Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -1375,6 +1375,7 @@ GG::Y drop_height = std::min(TEXT_ROW_HEIGHT * system_names_in_droplist, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_system_name->SetDropHeight(drop_height); + // select system name in list for system currently being set for (GG::ListBox::iterator it = m_system_name->begin(); it != m_system_name->end(); ++it) { if (select_row == *it) { m_system_name->Select(it); @@ -1395,35 +1396,56 @@ AttachChild(m_star_graphic); MoveChildDown(m_star_graphic); - // add panels for planets + + // update planet panel container std::vector<const Planet*> plt_vec = s_system->FindObjects<Planet>(); + m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); + + // connect signals so changes to planets will update GUI + for (unsigned int i = 0; i < plt_vec.size(); i++) { + m_system_connections.insert(GG::Connect(plt_vec[i]->StateChangedSignal, &MultiIconValueIndicator::Update, m_system_resource_summary)); + m_system_connections.insert(GG::Connect(plt_vec[i]->ResourceCenterChangedSignal, SidePanel::ResourceCenterChangedSignal)); + } + + + // populate system resource summary + + // get planets owned by player's empire std::vector<const UniverseObject*> owned_planets; for (std::vector<const Planet*>::const_iterator it = plt_vec.begin(); it != plt_vec.end(); ++it) if ((*it)->WhollyOwnedBy(HumanClientApp::GetApp()->EmpireID())) owned_planets.push_back(universe_object_cast<const UniverseObject*>(*it)); + // specify which meter types to include in resource summary. Oddly enough, these are the resource meters. std::vector<MeterType> meter_types; meter_types.push_back(METER_FARMING); meter_types.push_back(METER_MINING); meter_types.push_back(METER_INDUSTRY); meter_types.push_back(METER_RESEARCH); meter_types.push_back(METER_TRADE); + // refresh the system resource summary. delete m_system_resource_summary; m_system_resource_summary = new MultiIconValueIndicator(Width() - MAX_PLANET_DIAMETER - 8, owned_planets, meter_types); m_system_resource_summary->MoveTo(GG::Pt(GG::X(MAX_PLANET_DIAMETER + 4), 140 - m_system_resource_summary->Height())); AttachChild(m_system_resource_summary); - m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); - for (unsigned int i = 0; i < plt_vec.size(); i++) { - m_system_connections.insert(GG::Connect(plt_vec[i]->StateChangedSignal, &MultiIconValueIndicator::Update, m_system_resource_summary)); - m_system_connections.insert(GG::Connect(plt_vec[i]->ResourceCenterChangedSignal, SidePanel::ResourceCenterChangedSignal)); - } - if(m_system_resource_summary->Empty()) { + // add tooltips and show system resource summary if it not empty + if (m_system_resource_summary->Empty()) { DetachChild(m_system_resource_summary); } else { + // add tooltips to the system resource summary + for (std::vector<MeterType>::const_iterator it = meter_types.begin(); it != meter_types.end(); ++it) { + MeterType type = *it; + // add tooltip for each meter type + boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>( + new SystemResourceSummaryBrowseWnd(MeterToResource(type), s_system)); + m_system_resource_summary->SetToolTip(type, browse_wnd); + } + AttachChild(m_system_resource_summary); m_system_resource_summary->Update(); } + } else { // (!s_system) DetachChild(m_star_graphic); DetachChild(m_system_resource_summary); Modified: trunk/FreeOrion/combat/Combat.cpp =================================================================== --- trunk/FreeOrion/combat/Combat.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/combat/Combat.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -1,7 +1,6 @@ #include "Combat.h" #include "../util/MultiplayerCommon.h" -#include "../util/XMLDoc.h" Modified: trunk/FreeOrion/network/Message.cpp =================================================================== --- trunk/FreeOrion/network/Message.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/network/Message.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -5,7 +5,6 @@ #include "../universe/Universe.h" #include "../util/OptionsDB.h" #include "../util/Serialize.h" -#include "../util/XMLDoc.h" #include <boost/lexical_cast.hpp> #include <boost/algorithm/string/erase.hpp> Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/network/Message.h 2009-01-15 10:27:53 UTC (rev 2750) @@ -18,7 +18,6 @@ struct SaveGameUIData; struct SinglePlayerSetupData; class Universe; -class XMLDoc; struct PlayerInfo; /** Fills in the relevant portions of \a message with the values in the buffer \a header_buf. */ Modified: trunk/FreeOrion/universe/Enums.cpp =================================================================== --- trunk/FreeOrion/universe/Enums.cpp 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/universe/Enums.cpp 2009-01-15 10:27:53 UTC (rev 2750) @@ -47,3 +47,18 @@ break; } } + +ResourceType MeterToResource(MeterType type) +{ + switch (type) { + case METER_FARMING: return RE_FOOD; + case METER_INDUSTRY: return RE_INDUSTRY; + case METER_MINING: return RE_MINERALS; + case METER_RESEARCH: return RE_RESEARCH; + case METER_TRADE: return RE_TRADE; + default: + assert(0); + return INVALID_RESOURCE_TYPE; + break; + } +} \ No newline at end of file Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2009-01-15 06:14:03 UTC (rev 2749) +++ trunk/FreeOrion/universe/Enums.h 2009-01-15 10:27:53 UTC (rev 2750) @@ -530,6 +530,10 @@ /** Returns the equivalent meter type for the given resource type; if no such meter type exists, returns INVALID_METER_TYPE. */ MeterType ResourceToMeter(ResourceType type); +/** Returns the equivalent resource type for the given meter type; if no such resource type exists, returns INVALID_RESOURCE_TYPE. */ +ResourceType MeterToResource(MeterType type); + + /** the value used for the encoding empire when all data are desired, not just those visible to one empire */ enum EncodingVisbility { ALL_EMPIRES = -1 |
From: <geo...@us...> - 2009-01-15 18:23:40
|
Revision: 2751 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2751&view=rev Author: geoffthemedio Date: 2009-01-15 18:23:30 +0000 (Thu, 15 Jan 2009) Log Message: ----------- -More system resource summary tooltip progress. -Commented out some debug output in ResourcePool Modified Paths: -------------- trunk/FreeOrion/Empire/ResourcePool.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h Modified: trunk/FreeOrion/Empire/ResourcePool.cpp =================================================================== --- trunk/FreeOrion/Empire/ResourcePool.cpp 2009-01-15 10:27:53 UTC (rev 2750) +++ trunk/FreeOrion/Empire/ResourcePool.cpp 2009-01-15 18:23:30 UTC (rev 2751) @@ -206,12 +206,12 @@ for (std::set<int>::const_iterator group_it = group_ids.begin(); group_it != group_ids.end(); ++group_it) { int system_in_group_id = *group_it; // get system to check resource centers against - // DEBUG - const UniverseObject* system = GetUniverse().Object(system_in_group_id); - if (!system) - Logger().errorStream() << "ResourcePool::Update tried to get a system that doesn't exist but is listed in a supply system group"; - Logger().debugStream() << "... system: " << system->Name() << "(" << system_in_group_id << ")"; - // END DEBUG + //// DEBUG + //const UniverseObject* system = GetUniverse().Object(system_in_group_id); + //if (!system) + // Logger().errorStream() << "ResourcePool::Update tried to get a system that doesn't exist but is listed in a supply system group"; + //Logger().debugStream() << "... system: " << system->Name() << "(" << system_in_group_id << ")"; + //// END DEBUG // check all ResourceCenters in this pool to see if any are in this system. for (std::map<const ResourceCenter*, const UniverseObject*>::const_iterator obj_it = m_resource_center_objs.begin(); obj_it != m_resource_center_objs.end(); ++obj_it) { @@ -219,14 +219,14 @@ // add this ResourceCenter's production to the group pool const ResourceCenter* rc = obj_it->first; group_production += rc->ProjectedMeterPoints(meter_type); - Logger().debugStream() << "... ... " << obj_it->second->Name() << " contributes: " << rc->ProjectedMeterPoints(meter_type); + //Logger().debugStream() << "... ... " << obj_it->second->Name() << " contributes: " << rc->ProjectedMeterPoints(meter_type); } } // this checks all ResourceCenter against all systems, even if a system has already been found for a ResourceCenter. Some // fancy caching or swapping the inner and outer loops might be a performance improvement... or detriment. } - Logger().debugStream() << "... group production: " << group_production; + //Logger().debugStream() << "... group production: " << group_production; } ChangedSignal(); Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-15 10:27:53 UTC (rev 2750) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-15 18:23:30 UTC (rev 2751) @@ -37,6 +37,12 @@ m_meter_type(meter_type), m_obj(obj), m_meter_map(meter_map), + m_summary_title(0), + m_current_label(0), m_current_value(0), + m_next_turn_label(0), m_next_turn_value(0), + m_change_label(0), m_change_value(0), + m_meter_title(0), + row_height(1), initialized(false) {} @@ -120,7 +126,7 @@ clr = ClientUI::StatIncrColor(); else if (change < 0.0) clr = ClientUI::StatDecrColor(); - m_change_value->SetText(GG::RgbaTag(clr) + DoubleToString(change, 3, false, true) + "</rgba>"); // crahses itermittantly due to UTF-8 invalid text error + m_change_value->SetText(GG::RgbaTag(clr) + DoubleToString(change, 3, false, true) + "</rgba>"); m_meter_title->SetText(boost::io::str(FlexibleFormat(UserString("TT_METER")) % DoubleToString(meter_cur, 3, false, false) % DoubleToString(meter_max, 3, false, false))); @@ -2251,6 +2257,9 @@ GG::BrowseInfoWnd(GG::X0, GG::Y0, LABEL_WIDTH + VALUE_WIDTH, GG::Y1), m_resource_type(resource_type), m_system(system), + m_production_label(0), m_allocation_label(0), + m_import_export_label(0), m_import_export_amount(0), + row_height(1), production_label_top(0), allocation_label_top(0), import_export_label_top(0), initialized(false) {} @@ -2261,17 +2270,161 @@ } void SystemResourceSummaryBrowseWnd::Render() { - // TEMP // - int row_height = ClientUI::Pts() * 3/2; - // END TEMP // - GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); - GG::FlatRectangle(ul, lr, OpaqueColor(ClientUI::WndColor()), ClientUI::WndOuterBorderColor(), 1); // main background - GG::FlatRectangle(ul, GG::Pt(lr.x, ul.y + row_height), ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // top title filled background - GG::FlatRectangle(GG::Pt(ul.x, ul.y + 4*row_height), GG::Pt(lr.x, ul.y + 5*row_height), ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // middle title filled background + GG::FlatRectangle(ul, lr, OpaqueColor(ClientUI::WndColor()), ClientUI::WndOuterBorderColor(), 1); // main background + GG::FlatRectangle(GG::Pt(ul.x, ul.y + production_label_top), GG::Pt(lr.x, ul.y + production_label_top + row_height), + ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // production label background + GG::FlatRectangle(GG::Pt(ul.x, ul.y + allocation_label_top), GG::Pt(lr.x, ul.y + allocation_label_top + row_height), + ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // allocation label background + GG::FlatRectangle(GG::Pt(ul.x, ul.y + import_export_label_top), GG::Pt(lr.x, ul.y + import_export_label_top + row_height), + ClientUI::WndOuterBorderColor(), ClientUI::WndOuterBorderColor(), 0); // import or export label background } +void SystemResourceSummaryBrowseWnd::UpdateImpl(std::size_t mode, const GG::Wnd* target) { + if (!initialized) + Initialize(); +} + void SystemResourceSummaryBrowseWnd::Initialize() { + row_height = GG::Y(ClientUI::Pts() * 3/2); + const GG::X TOTAL_WIDTH = LABEL_WIDTH + VALUE_WIDTH; + + const boost::shared_ptr<GG::Font>& font = ClientUI::GetFont(); + const boost::shared_ptr<GG::Font>& font_bold = ClientUI::GetBoldFont(); + + GG::Y top = GG::Y0; + + production_label_top = top; + m_production_label = new GG::TextControl(GG::X0, production_label_top, TOTAL_WIDTH - EDGE_PAD, production_label_top + row_height, "", font_bold, ClientUI::TextColor(), GG::FORMAT_RIGHT | GG::FORMAT_VCENTER); + AttachChild(m_production_label); + top += row_height; + + UpdateProduction(top); + + allocation_label_top = top; + m_allocation_label = new GG::TextControl(GG::X0, allocation_label_top, TOTAL_WIDTH - EDGE_PAD, allocation_label_top + row_height, "", font_bold, ClientUI::TextColor(), GG::FORMAT_RIGHT | GG::FORMAT_VCENTER); + AttachChild(m_allocation_label); + top += row_height; + + UpdateAllocation(top); + + + // create import / export labels anywhere... will be positions in UpdateImportExport() + m_import_export_label = new GG::TextControl(GG::X0, GG::Y0, TOTAL_WIDTH - EDGE_PAD, row_height, "", font_bold, ClientUI::TextColor(), GG::FORMAT_RIGHT | GG::FORMAT_VCENTER); + AttachChild(m_import_export_label); + m_import_export_amount = new GG::TextControl(GG::X0, GG::Y0, TOTAL_WIDTH - EDGE_PAD, row_height, "", font_bold, ClientUI::TextColor(), GG::FORMAT_RIGHT | GG::FORMAT_VCENTER); + AttachChild(m_import_export_amount); + + import_export_label_top = top; + UpdateImportExport(top); // positions and updates import / export labels + + + Resize(GG::Pt(LABEL_WIDTH + VALUE_WIDTH, top)); + + initialized = true; } + +void SystemResourceSummaryBrowseWnd::UpdateProduction(GG::Y& top) { + // adds pairs of TextControl for ResourceCenter name and production of resource starting at vertical position \a top + // and updates \a top to the vertical position after the last entry + for (unsigned int i = 0; i < m_production_labels_and_amounts.size(); ++i) { + DeleteChild(m_production_labels_and_amounts[i].first); + DeleteChild(m_production_labels_and_amounts[i].second); + } + m_production_labels_and_amounts.clear(); + + if (!m_system || m_resource_type == INVALID_RESOURCE_TYPE) + return; + + + double total_system_resource_production = 0.0; + + + const boost::shared_ptr<GG::Font>& font = ClientUI::GetFont(); + + // add label-value pair for each resource-producing object in system to indicate amount of resource produced + std::vector<UniverseObject*> obj_vec = m_system->FindObjects(); + for (std::vector<UniverseObject*>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) { + const UniverseObject* obj = *it; + const ResourceCenter* rc = dynamic_cast<const ResourceCenter*>(obj); + if (!rc) + continue; + + std::string name = obj->Name(); + double production = rc->ProjectedMeterPoints(ResourceToMeter(m_resource_type)); + total_system_resource_production += production; + + std::string amount_text = DoubleToString(production, 3, false, false); + + + GG::TextControl* label = new GG::TextControl(GG::X0, top, LABEL_WIDTH, top + row_height, + name, font, ClientUI::TextColor(), + GG::FORMAT_RIGHT | GG::FORMAT_VCENTER); + label->Resize(GG::Pt(LABEL_WIDTH, row_height)); + AttachChild(label); + + GG::TextControl* value = new GG::TextControl(VALUE_WIDTH, top, VALUE_WIDTH, top + row_height, + amount_text, font, ClientUI::TextColor(), + GG::FORMAT_CENTER | GG::FORMAT_VCENTER); + AttachChild(value); + + m_production_labels_and_amounts.push_back(std::pair<GG::TextControl*, GG::TextControl*>(label, value)); + + top += row_height; + } + + + + // set production label + std::string resource_text = ""; + switch (m_resource_type) { + case RE_FOOD: + resource_text = UserString("RP_FOOD"); break; + case RE_MINERALS: + resource_text = UserString("RP_MINERALS"); break; + case RE_INDUSTRY: + resource_text = UserString("RP_INDUSTRY"); break; + case RE_RESEARCH: + resource_text = UserString("RP_RESEARCH"); break; + case RE_TRADE: + resource_text = UserString("RP_TRADE"); break; + default: + resource_text = UserString("UNKNOWN_VALUE_SYMBOL"); break; + } + + m_production_label->SetText(boost::io::str(FlexibleFormat(UserString("RESOURCE_PRODUCTION_TOOLTIP")) % + resource_text % + DoubleToString(total_system_resource_production, 3, false, false))); + + + // height of label already added to top outside this function +} + +void SystemResourceSummaryBrowseWnd::UpdateAllocation(GG::Y& top) { + // adds pairs of TextControl for allocation of resources in system, starting at vertical position \a top and + // updates \a top to be the vertical position after the last entry + for (unsigned int i = 0; i < m_allocation_labels_and_amounts.size(); ++i) { + DeleteChild(m_allocation_labels_and_amounts[i].first); + DeleteChild(m_allocation_labels_and_amounts[i].second); + } + m_allocation_labels_and_amounts.clear(); + + // UserString("TT_RESOURCE_ALLOCATION") // parames: object_name and allocation + + // TEMP + top += row_height; +} + +void SystemResourceSummaryBrowseWnd::UpdateImportExport(GG::Y& top) { + // sets m_import_export_label and m_import_export text and amount to indicate how much resource is being + // imported or exported from this system, and moves them to vertical position \a top and updates \a top + // to be the vertical position below these labels + m_import_export_label; + m_import_export_amount; + + // TEMP + top += row_height; +} + Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2009-01-15 10:27:53 UTC (rev 2750) +++ trunk/FreeOrion/UI/InfoPanels.h 2009-01-15 18:23:30 UTC (rev 2751) @@ -393,16 +393,36 @@ public: SystemResourceSummaryBrowseWnd(ResourceType resource_type, const System* system); - virtual bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const; + virtual bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const; - virtual void Render(); + virtual void Render(); private: - void Initialize(); + void Initialize(); + virtual void UpdateImpl(std::size_t mode, const GG::Wnd* target); + void UpdateProduction(GG::Y& top); // adds pairs of TextControl for ResourceCenter name and production of resource starting at vertical position \a top and updates \a top to the vertical position after the last entry + void UpdateAllocation(GG::Y& top); // adds pairs of TextControl for allocation of resources in system, starting at vertical position \a top and updates \a top to be the vertical position after the last entry + void UpdateImportExport(GG::Y& top); // sets m_import_export_label and m_import_export text and amount to indicate how much resource is being imported or exported from this system, and moves them to vertical position \a top and updates \a top to be the vertical position below these labels + ResourceType m_resource_type; const System* m_system; + GG::TextControl* m_production_label; + GG::TextControl* m_allocation_label; + + GG::TextControl* m_import_export_label; + GG::TextControl* m_import_export_amount; + + std::vector<std::pair<GG::TextControl*, GG::TextControl*> > m_production_labels_and_amounts; + std::vector<std::pair<GG::TextControl*, GG::TextControl*> > m_allocation_labels_and_amounts; + + GG::Y row_height; + + GG::Y production_label_top; + GG::Y allocation_label_top; + GG::Y import_export_label_top; + static const GG::X LABEL_WIDTH; static const GG::X VALUE_WIDTH; static const int EDGE_PAD; |