From: <geo...@us...> - 2009-11-04 05:15:43
|
Revision: 3256 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3256&view=rev Author: geoffthemedio Date: 2009-11-04 05:15:35 +0000 (Wed, 04 Nov 2009) Log Message: ----------- Made numerous sanity checks in Order execution and creation code output error messages and/or do nothing, rather than throwing exceptions, so as to reduce the likelihood of the server or AIs crashing if something weird happens, which I observed occurring with fleet move orders recently due to also-recent changes in the visibility system causing the AI to think fleets still existed after they were destroyed. Modified Paths: -------------- trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2009-11-04 03:03:28 UTC (rev 3255) +++ trunk/FreeOrion/util/Order.cpp 2009-11-04 05:15:35 UTC (rev 3256) @@ -79,8 +79,19 @@ m_object(object), m_name(name) { - if (name == "") - throw std::invalid_argument("RenameOrder::RenameOrder() : Attempted to name an object \"\"."); + const Universe& universe = GetUniverse(); + const UniverseObject* obj = universe.Object(object); + if (!obj) { + Logger().errorStream() << "RenameOrder::RenameOrder() : Attempted to rename nonexistant object with id " << object; + return; + } + + if (m_name == "") { + Logger().errorStream() << "RenameOrder::RenameOrder() : Attempted to name an object \"\"."; + // make order do nothing + m_object = UniverseObject::INVALID_OBJECT_ID; + return; + } } void RenameOrder::ExecuteImpl() const @@ -89,13 +100,22 @@ UniverseObject* obj = GetUniverse().Object(m_object); + if (!obj) { + Logger().errorStream() << "Attempted to rename nonexistant object with id " << m_object; + return; + } + // verify that empire specified in order owns specified object - if (!obj->WhollyOwnedBy(EmpireID())) - throw std::runtime_error("Empire specified in rename order does not own specified object."); + if (!obj->WhollyOwnedBy(EmpireID())) { + Logger().errorStream() << "Empire specified in rename order does not own specified object."; + return; + } // disallow the name "", since that denotes an unknown object - if (m_name == "") - throw std::runtime_error("Name \"\" specified in rename order is invalid."); + if (m_name == "") { + Logger().errorStream() << "Name \"\" specified in rename order is invalid."; + return; + } obj->Rename(m_name); } @@ -167,8 +187,10 @@ } for (unsigned int i = 0; i < m_ship_ids.size(); ++i) { // verify that empire is not trying to take ships from somebody else's fleet - if (!universe.Object(m_ship_ids[i])->OwnedBy(EmpireID())) - throw std::runtime_error("Empire attempted to create a new fleet with ships from another's fleet."); + if (!universe.Object(m_ship_ids[i])->OwnedBy(EmpireID())) { + Logger().errorStream() << "Empire attempted to create a new fleet with ships from another's fleet."; + return; + } fleet->AddShip(m_ship_ids[i]); } } @@ -177,27 +199,48 @@ //////////////////////////////////////////////// // FleetMoveOrder //////////////////////////////////////////////// -FleetMoveOrder::FleetMoveOrder() : +FleetMoveOrder::FleetMoveOrder() : Order(), m_fleet(UniverseObject::INVALID_OBJECT_ID), 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_id, int start_system_id, int dest_system_id) : Order(empire), - m_fleet(fleet), - m_start_system(start_system), - m_dest_system(dest_system) + m_fleet(fleet_id), + m_start_system(start_system_id), + m_dest_system(dest_system_id) { - std::pair<std::list<int>, double> short_path = GetUniverse().ShortestPath(start_system, dest_system, empire); + const Universe& universe = GetUniverse(); + // perform sanity checks + const Fleet* fleet = universe.Object<Fleet>(FleetID()); + if (!fleet) { + Logger().errorStream() << "Empire with id " << EmpireID() << " ordered fleet with id " << FleetID() << " to move, but no such fleet exists"; + return; + } + + const System* destination_system = universe.Object<System>(DestinationSystemID()); + if (!destination_system) { + Logger().errorStream() << "Empire with id " << EmpireID() << " ordered fleet to move to system with id " << DestinationSystemID() << " but no such system exists"; + return; + } + + // verify that empire specified in order owns specified fleet + if ( !fleet->OwnedBy(EmpireID()) ) { + Logger().errorStream() << "Empire with id " << EmpireID() << " order to move but does not own fleet with id " << FleetID(); + return; + } + + std::pair<std::list<int>, double> short_path = GetUniverse().ShortestPath(m_start_system, m_dest_system, empire); + m_route.clear(); std::copy(short_path.first.begin(), short_path.first.end(), std::back_inserter(m_route)); // ensure a zero-length (invalid) route is not requested / sent to a fleet if (m_route.empty()) - m_route.push_back(start_system); + m_route.push_back(m_start_system); #if DEBUG_FLEET_MOVE_ORDER std::cerr << "FleetMoveOrder(int empire, int fleet, int start_syste, int dest_system) : " << std::endl @@ -219,31 +262,40 @@ 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 (!destination_system) throw std::runtime_error("Non-system destination ID specified in fleet move order."); + if (!fleet) { + Logger().errorStream() << "Empire with id " << EmpireID() << " ordered fleet with id " << FleetID() << " to move, but no such fleet exists"; + return; + } + if (!destination_system) { + Logger().errorStream() << "Empire with id " << EmpireID() << " ordered fleet to move to system with id " << DestinationSystemID() << " but no such system exists"; + return; + } // verify that empire specified in order owns specified fleet - if ( !fleet->OwnedBy(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()) + "."); + if ( !fleet->OwnedBy(EmpireID()) ) { + Logger().errorStream() << "Empire with id " << EmpireID() << " order to move but does not own fleet with id " << FleetID(); + return; + } // 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) + "."); + if (fleet_sys_id != m_start_system) { + Logger().errorStream() << "Empire " << EmpireID() << " ordered a fleet to move from a system with id " << m_start_system << + " that it is not at. Fleet is located at system with id " << fleet_sys_id; + return; + } } 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) + "."); + if (next_system != m_start_system) { + Logger().errorStream() << "Empire " << EmpireID() << " ordered a fleet to move starting from a system with id " << m_start_system << + ", but the fleet's next destination is system with id " << next_system; + return; + } } @@ -293,19 +345,25 @@ Fleet* target_fleet = universe.Object<Fleet>(DestinationFleet()); // sanity check - if (!source_fleet || !target_fleet) - throw std::runtime_error("Illegal fleet id specified in fleet merge order."); + if (!source_fleet || !target_fleet) { + Logger().errorStream() << "Illegal fleet id specified in fleet merge order."; + return; + } // verify that empire is not trying to take ships from somebody else's fleet - if ( !source_fleet->OwnedBy(EmpireID()) ) - throw std::runtime_error("Empire attempted to merge ships from another's fleet."); + if ( !source_fleet->OwnedBy(EmpireID()) ) { + Logger().errorStream() << "Empire attempted to merge ships from another's fleet."; + return; + } // verify that empire cannot merge ships into somebody else's fleet. // this is just an additional security measure. IT could be removed to // allow 'donations' of ships to other players, provided the server // verifies IDs of the Empires issuing the orders. - if ( !target_fleet->OwnedBy(EmpireID()) ) - throw std::runtime_error("Empire attempted to merge ships into another's fleet."); + if ( !target_fleet->OwnedBy(EmpireID()) ) { + Logger().errorStream() << "Empire attempted to merge ships into another's fleet."; + return; + } // iterate down the ship vector and add each one to the fleet @@ -315,13 +373,17 @@ // find the ship, verify that ID is valid int curr = (*itr); Ship* a_ship = universe.Object<Ship>(curr); - if (!a_ship) - throw std::runtime_error("Illegal ship id specified in fleet merge order."); + if (!a_ship) { + Logger().errorStream() << "Illegal ship id specified in fleet merge order."; + return; + } // figure out what fleet this ship is coming from -- verify its the one we // said it comes from - if (a_ship->FleetID() != SourceFleet()) - throw std::runtime_error("Ship in merge order is not in specified source fleet."); + if (a_ship->FleetID() != SourceFleet()) { + Logger().errorStream() << "Ship in merge order is not in specified source fleet."; + return; + } // send the ship to its new fleet //a_ship->SetFleetID(DestinationFleet()); // redundant: AddShip resets the Fleet ID of ships it adds @@ -425,22 +487,27 @@ Fleet* fleet = universe.Object<Fleet>(ship->FleetID()); // verify that empire issuing order owns specified fleet - if (!fleet->OwnedBy(EmpireID())) - throw std::runtime_error("Empire attempted to issue colonize order to another's fleet."); + if (!fleet->OwnedBy(EmpireID())) { + Logger().errorStream() << "Empire attempted to issue colonize order to another's fleet."; + return; + } // verify that planet exists and is un-occupied. Planet* planet = universe.Object<Planet>(m_planet); - if (!planet) - throw std::runtime_error("Colonization order issued with invalid planet id."); + if (!planet) { + Logger().errorStream() << "Colonization order issued with invalid planet id."; + return; + } - if (!planet->Unowned()) - throw std::runtime_error("Colonization order issued for owned planet."); + if (!planet->Unowned()) { + Logger().errorStream() << "Colonization order issued for owned planet."; + return; + } // verify that planet is in same system as the fleet - if (planet->SystemID() != fleet->SystemID() || - planet->SystemID() == UniverseObject::INVALID_OBJECT_ID) { - throw std::runtime_error("Fleet specified in colonization order is not in " - "specified system."); + if (planet->SystemID() != fleet->SystemID() || planet->SystemID() == UniverseObject::INVALID_OBJECT_ID) { + Logger().errorStream() << "Fleet specified in colonization order is not in specified system."; + return; } planet->SetIsAboutToBeColonized(true); @@ -489,8 +556,10 @@ } fleet = new Fleet(new_fleet_name, system->X(), system->Y(), EmpireID()); - if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) - throw std::runtime_error("FleetColonizeOrder::UndoImpl(): Unable to obtain a new fleet ID"); + if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) { + Logger().errorStream() << "FleetColonizeOrder::UndoImpl(): Unable to obtain a new fleet ID"; + return false; + } universe.InsertID(fleet, new_fleet_id); fleet->AddShip(ship->ID()); system->Insert(fleet); @@ -523,11 +592,15 @@ Fleet* fleet = GetUniverse().Object<Fleet>(FleetID()); - if (!fleet) - throw std::runtime_error("Illegal fleet id specified in fleet delete order."); + if (!fleet) { + Logger().errorStream() << "Illegal fleet id specified in fleet delete order."; + return; + } - if (!fleet->OwnedBy(EmpireID())) - throw std::runtime_error("Empire attempted to issue deletion order to another's fleet."); + if (!fleet->OwnedBy(EmpireID())) { + Logger().errorStream() << "Empire attempted to issue deletion order to another's fleet."; + return; + } // this needs to be a no-op, instead of an exception case, because of its interaction with cancelled colonize orders // that cause a fleet to be deleted, then silently reconsistuted @@ -560,11 +633,15 @@ Planet* planet = GetUniverse().Object<Planet>(PlanetID()); - if (!planet) - throw std::runtime_error("Illegal planet id specified in change planet focus order."); + if (!planet) { + Logger().errorStream() << "Illegal planet id specified in change planet focus order."; + return; + } - if (!planet->OwnedBy(EmpireID())) - throw std::runtime_error("Empire attempted to issue change planet focus to another's planet."); + if (!planet->OwnedBy(EmpireID())) { + Logger().errorStream() << "Empire attempted to issue change planet focus to another's planet."; + return; + } m_primary ? planet->SetPrimaryFocus(m_focus) : planet->SetSecondaryFocus(m_focus); @@ -633,8 +710,11 @@ m_new_quantity(INVALID_QUANTITY), m_new_index(INVALID_INDEX) { - if (build_type == BT_SHIP) - throw std::invalid_argument("Attempted to construct a ProductionQueueOrder for a BT_SHIP with a name, not a design id"); + if (build_type == BT_SHIP) { + Logger().errorStream() << "Attempted to construct a ProductionQueueOrder for a BT_SHIP with a name, not a design id"; + build_type = INVALID_BUILD_TYPE; + return; + } } ProductionQueueOrder::ProductionQueueOrder(int empire, BuildType build_type, int design_id, int number, int location) : @@ -648,8 +728,11 @@ m_new_quantity(INVALID_QUANTITY), m_new_index(INVALID_INDEX) { - if (build_type == BT_BUILDING) - throw std::invalid_argument("Attempted to construct a ProductionQueueOrder for a BT_BUILDING with a design id, not a name"); + if (build_type == BT_BUILDING) { + Logger().errorStream() << "Attempted to construct a ProductionQueueOrder for a BT_BUILDING with a design id, not a name"; + build_type = INVALID_BUILD_TYPE; + return; + } } @@ -698,6 +781,8 @@ empire->PlaceBuildInQueue(m_build_type, m_item_name, m_number, m_location); else if (m_build_type == BT_SHIP) empire->PlaceBuildInQueue(BT_SHIP, m_design_id, m_number, m_location); + else if (m_build_type == INVALID_BUILD_TYPE) + Logger().errorStream() << "ProductionQueueOrder specified with INVALID_BUILD_TYPE"; else if (m_new_quantity != INVALID_QUANTITY) empire->SetBuildQuantity(m_index, m_new_quantity); else if (m_new_index != INVALID_INDEX) @@ -705,7 +790,7 @@ else if (m_index != INVALID_INDEX) empire->RemoveBuildFromQueue(m_index); else - throw std::runtime_error("Malformed ProductionQueueOrder."); + Logger().errorStream() << "Malformed ProductionQueueOrder."; } //////////////////////////////////////////////// @@ -749,19 +834,25 @@ Empire* empire = Empires().Lookup(EmpireID()); if (m_delete_design_from_empire) { - if (!empire->ShipDesignKept(m_design_id)) - throw std::runtime_error("Tried to remove a ShipDesign that the empire wasn't remembering"); + if (!empire->ShipDesignKept(m_design_id)) { + Logger().errorStream() << "Tried to remove a ShipDesign that the empire wasn't remembering"; + return; + } empire->RemoveShipDesign(m_design_id); } else if (m_create_new_design) { - if (m_ship_design.DesignedByEmpire() != EmpireID()) - throw std::runtime_error("Tried to create a new ShipDesign designed by another empire"); + if (m_ship_design.DesignedByEmpire() != EmpireID()) { + Logger().errorStream() << "Tried to create a new ShipDesign designed by another empire"; + return; + } Universe& universe = GetUniverse(); // check if a design with this ID already exists - if (universe.GetShipDesign(m_design_id)) - throw std::runtime_error("Tried to create a new ShipDesign with an id of an already-existing ShipDesign"); + if (universe.GetShipDesign(m_design_id)) { + Logger().errorStream() << "Tried to create a new ShipDesign with an id of an already-existing ShipDesign"; + return; + } ShipDesign* new_ship_design = new ShipDesign(m_ship_design); universe.InsertShipDesignID(new_ship_design, m_design_id); @@ -769,8 +860,10 @@ } else if (!m_create_new_design && !m_delete_design_from_empire) { // check if empire is already remembering the design - if (empire->ShipDesignKept(m_design_id)) - throw std::runtime_error("Tried to remember a ShipDesign that was already being remembered"); + if (empire->ShipDesignKept(m_design_id)) { + Logger().errorStream() << "Tried to remember a ShipDesign that was already being remembered"; + return; + } // check if the empire can see any objects that have this design (thus enabling it to be copied) std::vector<Ship*> ship_vec = GetUniverse().FindObjects<Ship>(); @@ -784,13 +877,16 @@ } } - if (known) + if (known) { empire->AddShipDesign(m_design_id); - else - throw std::runtime_error("Tried to remember a ShipDesign that this empire can't see"); - + } else { + Logger().errorStream() << "Tried to remember a ShipDesign that this empire can't see"; + return; + } + } else { - throw std::runtime_error("Malformed ShipDesignOrder."); + Logger().errorStream() << "Malformed ShipDesignOrder."; + return; } } Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2009-11-04 03:03:28 UTC (rev 3255) +++ trunk/FreeOrion/util/Order.h 2009-11-04 05:15:35 UTC (rev 3256) @@ -162,7 +162,7 @@ public: /** \name Structors */ //@{ FleetMoveOrder(); - FleetMoveOrder(int empire, int fleet, int start_system, int dest_system); + FleetMoveOrder(int empire, int fleet_id, int start_system_id, int dest_system_id); //@} /** \name Accessors */ //@{ |
From: <tz...@us...> - 2010-04-01 20:29:14
|
Revision: 3412 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3412&view=rev Author: tzlaine Date: 2010-04-01 20:29:08 +0000 (Thu, 01 Apr 2010) Log Message: ----------- Added a new compilation unit, Math.{h,cpp}. So far it only includes PointInEllipse(), but it will probably pick up some other geometry functions later. Added Paths: ----------- trunk/FreeOrion/util/Math.cpp trunk/FreeOrion/util/Math.h Added: trunk/FreeOrion/util/Math.cpp =================================================================== --- trunk/FreeOrion/util/Math.cpp (rev 0) +++ trunk/FreeOrion/util/Math.cpp 2010-04-01 20:29:08 UTC (rev 3412) @@ -0,0 +1,36 @@ +#include "Math.h" + +#include <boost/numeric/ublas/matrix.hpp> + + +bool PointInEllipse(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major) +{ + typedef boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major> Matrix; + Matrix v(2, 1); + v(0, 0) = x - ellipse_x; + v(0, 1) = y - ellipse_y; + + const double SIN = std::sin(-theta_major); + const double COS = std::cos(-theta_major); + Matrix rotate(2, 2); + rotate(0, 0) = COS; + rotate(0, 1) = -SIN; + rotate(1, 0) = SIN; + rotate(1, 1) = COS; + + v = prod(rotate, v); + + Matrix scale(2, 2); + scale(0, 0) = 1.0 / major; + scale(0, 1) = 0.0; + scale(1, 0) = 0.0; + scale(1, 1) = 1.0 / minor; + + v = prod(scale, v); + + return v(0, 0) * v(0, 0) + v(0, 1) * v(0, 1) < 1.0; +} + Added: trunk/FreeOrion/util/Math.h =================================================================== --- trunk/FreeOrion/util/Math.h (rev 0) +++ trunk/FreeOrion/util/Math.h 2010-04-01 20:29:08 UTC (rev 3412) @@ -0,0 +1,13 @@ +// -*- C++ -*- +#ifndef _Math_h_ +#define _Math_h_ + +/** Returns true iff <i>(x, y)</i> falls inside the ellipse centered at + <i>(ellipse_x, ellipse_y)</i>, with major and minor axes \a major and \a + minor, with the major axis at angle \a theta_major. */ +bool PointInEllipse(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major); + +#endif // _Math_h_ |
From: <tz...@us...> - 2010-04-07 04:38:10
|
Revision: 3438 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3438&view=rev Author: tzlaine Date: 2010-04-07 04:38:03 +0000 (Wed, 07 Apr 2010) Log Message: ----------- Added new util/Math.h function, PointInPartialEllipse(), and fixed an indexing error in PointInEllipse(). Modified Paths: -------------- trunk/FreeOrion/util/Math.cpp trunk/FreeOrion/util/Math.h Modified: trunk/FreeOrion/util/Math.cpp =================================================================== --- trunk/FreeOrion/util/Math.cpp 2010-04-06 21:49:05 UTC (rev 3437) +++ trunk/FreeOrion/util/Math.cpp 2010-04-07 04:38:03 UTC (rev 3438) @@ -3,34 +3,58 @@ #include <boost/numeric/ublas/matrix.hpp> -bool PointInEllipse(double x, double y, - double ellipse_x, double ellipse_y, - double major, double minor, - double theta_major) -{ - typedef boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major> Matrix; - Matrix v(2, 1); - v(0, 0) = x - ellipse_x; - v(0, 1) = y - ellipse_y; +namespace { + bool PointInEllipseImpl(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major, + double theta_begin, + double theta_end) + { + typedef boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major> Matrix; + Matrix v(2, 1); + v(0, 0) = x - ellipse_x; + v(1, 0) = y - ellipse_y; - const double SIN = std::sin(-theta_major); - const double COS = std::cos(-theta_major); - Matrix rotate(2, 2); - rotate(0, 0) = COS; - rotate(0, 1) = -SIN; - rotate(1, 0) = SIN; - rotate(1, 1) = COS; + const double SIN = std::sin(-theta_major); + const double COS = std::cos(-theta_major); + Matrix rotate(2, 2); + rotate(0, 0) = COS; + rotate(0, 1) = -SIN; + rotate(1, 0) = SIN; + rotate(1, 1) = COS; - v = prod(rotate, v); + v = prod(rotate, v); - Matrix scale(2, 2); - scale(0, 0) = 1.0 / major; - scale(0, 1) = 0.0; - scale(1, 0) = 0.0; - scale(1, 1) = 1.0 / minor; + if (theta_begin != theta_end) { + double theta = std::atan2(y, x); + if (theta < theta_begin || theta_end < theta) + return false; + } - v = prod(scale, v); + Matrix scale(2, 2); + scale(0, 0) = 1.0 / major; + scale(0, 1) = 0.0; + scale(1, 0) = 0.0; + scale(1, 1) = 1.0 / minor; - return v(0, 0) * v(0, 0) + v(0, 1) * v(0, 1) < 1.0; + v = prod(scale, v); + + return v(0, 0) * v(0, 0) + v(1, 0) * v(1, 0) < 1.0; + } + } +bool PointInEllipse(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major) +{ return PointInEllipseImpl(x, y, ellipse_x, ellipse_y, major, minor, theta_major, 0, 0); } + +bool PointInPartialEllipse(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major, + double theta_begin, + double theta_end) +{ return PointInEllipseImpl(x, y, ellipse_x, ellipse_y, major, minor, theta_major, theta_begin, theta_end); } Modified: trunk/FreeOrion/util/Math.h =================================================================== --- trunk/FreeOrion/util/Math.h 2010-04-06 21:49:05 UTC (rev 3437) +++ trunk/FreeOrion/util/Math.h 2010-04-07 04:38:03 UTC (rev 3438) @@ -10,4 +10,16 @@ double major, double minor, double theta_major); +/** Returns true iff <i>(x, y)</i> falls inside the angular portion + <i>(theta_begin, theta_end)</i> ellipse centered at <i>(ellipse_x, + ellipse_y)</i>, with major and minor axes \a major and \a minor, with the + major axis at angle \a theta_major. The angular region <i>(theta_begin, + theta_end)</i> is taken to be relative to \a theta_major. */ +bool PointInPartialEllipse(double x, double y, + double ellipse_x, double ellipse_y, + double major, double minor, + double theta_major, + double theta_begin, + double theta_end); + #endif // _Math_h_ |
From: <tz...@us...> - 2010-04-13 06:11:59
|
Revision: 3474 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3474&view=rev Author: tzlaine Date: 2010-04-13 06:11:53 +0000 (Tue, 13 Apr 2010) Log Message: ----------- Moved UniverseObject serialization exports to Serialize.ipp to fix broken serialization on win32. Modified Paths: -------------- trunk/FreeOrion/util/Serialize.ipp trunk/FreeOrion/util/SerializeUniverse.cpp Modified: trunk/FreeOrion/util/Serialize.ipp =================================================================== --- trunk/FreeOrion/util/Serialize.ipp 2010-04-13 03:42:18 UTC (rev 3473) +++ trunk/FreeOrion/util/Serialize.ipp 2010-04-13 06:11:53 UTC (rev 3474) @@ -2,6 +2,13 @@ #undef int64_t #endif +#include "../universe/Building.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" +#include "../universe/Planet.h" +#include "../universe/ShipDesign.h" +#include "../universe/System.h" + #include <boost/static_assert.hpp> #include <boost/detail/endian.hpp> #include <boost/serialization/export.hpp> @@ -13,6 +20,13 @@ #include <boost/serialization/weak_ptr.hpp> #include <boost/ptr_container/serialize_ptr_vector.hpp> +// exports for boost serialization of polymorphic UniverseObject hierarchy +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) + // some endianness and size checks to ensure portability of binary save files; // of one or more of these fails, it means that FreeOrion is not supported on // your platform/compiler pair, and must be modified to provide data of the Modified: trunk/FreeOrion/util/SerializeUniverse.cpp =================================================================== --- trunk/FreeOrion/util/SerializeUniverse.cpp 2010-04-13 03:42:18 UTC (rev 3473) +++ trunk/FreeOrion/util/SerializeUniverse.cpp 2010-04-13 06:11:53 UTC (rev 3474) @@ -1,22 +1,8 @@ #include "Serialize.h" -#include "../universe/Building.h" -#include "../universe/Fleet.h" -#include "../universe/Ship.h" -#include "../universe/Planet.h" -#include "../universe/ShipDesign.h" -#include "../universe/System.h" - #include "Serialize.ipp" -// exports for boost serialization of polymorphic UniverseObject hierarchy -BOOST_CLASS_EXPORT(System) -BOOST_CLASS_EXPORT(Planet) -BOOST_CLASS_EXPORT(Building) -BOOST_CLASS_EXPORT(Fleet) -BOOST_CLASS_EXPORT(Ship) - template <class Archive> void Universe::serialize(Archive& ar, const unsigned int version) { |
From: <tz...@us...> - 2010-04-13 17:32:44
|
Revision: 3475 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3475&view=rev Author: tzlaine Date: 2010-04-13 17:32:38 +0000 (Tue, 13 Apr 2010) Log Message: ----------- r3474 broke the build under GCC. This should fix things, without breaking win32 -- moved the UniversObject-related exports to new file SerializeUniverseExports.ipp, and included that in SerializeUniverse.cpp when FREEORION_WIN32 is not defined, or in Serialize.ipp if it is. Modified Paths: -------------- trunk/FreeOrion/util/Serialize.ipp trunk/FreeOrion/util/SerializeUniverse.cpp Added Paths: ----------- trunk/FreeOrion/util/SerializeUniverseExports.ipp Modified: trunk/FreeOrion/util/Serialize.ipp =================================================================== --- trunk/FreeOrion/util/Serialize.ipp 2010-04-13 06:11:53 UTC (rev 3474) +++ trunk/FreeOrion/util/Serialize.ipp 2010-04-13 17:32:38 UTC (rev 3475) @@ -2,13 +2,6 @@ #undef int64_t #endif -#include "../universe/Building.h" -#include "../universe/Fleet.h" -#include "../universe/Ship.h" -#include "../universe/Planet.h" -#include "../universe/ShipDesign.h" -#include "../universe/System.h" - #include <boost/static_assert.hpp> #include <boost/detail/endian.hpp> #include <boost/serialization/export.hpp> @@ -20,12 +13,9 @@ #include <boost/serialization/weak_ptr.hpp> #include <boost/ptr_container/serialize_ptr_vector.hpp> -// exports for boost serialization of polymorphic UniverseObject hierarchy -BOOST_CLASS_EXPORT(System) -BOOST_CLASS_EXPORT(Planet) -BOOST_CLASS_EXPORT(Building) -BOOST_CLASS_EXPORT(Fleet) -BOOST_CLASS_EXPORT(Ship) +#ifdef FREEORION_WIN32 +#include "SerializeUniverseExports.ipp" +#endif // some endianness and size checks to ensure portability of binary save files; // of one or more of these fails, it means that FreeOrion is not supported on Modified: trunk/FreeOrion/util/SerializeUniverse.cpp =================================================================== --- trunk/FreeOrion/util/SerializeUniverse.cpp 2010-04-13 06:11:53 UTC (rev 3474) +++ trunk/FreeOrion/util/SerializeUniverse.cpp 2010-04-13 17:32:38 UTC (rev 3475) @@ -2,7 +2,11 @@ #include "Serialize.ipp" +#ifndef FREEORION_WIN32 +#include "SerializeUniverseExports.ipp" +#endif + template <class Archive> void Universe::serialize(Archive& ar, const unsigned int version) { Added: trunk/FreeOrion/util/SerializeUniverseExports.ipp =================================================================== --- trunk/FreeOrion/util/SerializeUniverseExports.ipp (rev 0) +++ trunk/FreeOrion/util/SerializeUniverseExports.ipp 2010-04-13 17:32:38 UTC (rev 3475) @@ -0,0 +1,13 @@ +#include "../universe/Building.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" +#include "../universe/Planet.h" +#include "../universe/ShipDesign.h" +#include "../universe/System.h" + +// exports for boost serialization of polymorphic UniverseObject hierarchy +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) |
From: <geo...@us...> - 2010-10-03 07:01:40
|
Revision: 3806 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3806&view=rev Author: geoffthemedio Date: 2010-10-03 07:01:33 +0000 (Sun, 03 Oct 2010) Log Message: ----------- Reworked some serialization class exporting code to hopefully fix issue on GCC where attempting to serialize a System object would throw an unregistered class exception, crashing the server. In process, removed special cases for Win32 and not-Win32, which were reported to not be necessary on Linux / GCC after this change by user on forums. Modified Paths: -------------- trunk/FreeOrion/util/Serialize.ipp trunk/FreeOrion/util/SerializeUniverse.cpp trunk/FreeOrion/util/SerializeUniverseExports.ipp Modified: trunk/FreeOrion/util/Serialize.ipp =================================================================== --- trunk/FreeOrion/util/Serialize.ipp 2010-10-02 07:15:39 UTC (rev 3805) +++ trunk/FreeOrion/util/Serialize.ipp 2010-10-03 07:01:33 UTC (rev 3806) @@ -13,10 +13,6 @@ #include <boost/serialization/weak_ptr.hpp> #include <boost/ptr_container/serialize_ptr_vector.hpp> -#ifdef FREEORION_WIN32 -#include "SerializeUniverseExports.ipp" -#endif - // some endianness and size checks to ensure portability of binary save files; // of one or more of these fails, it means that FreeOrion is not supported on // your platform/compiler pair, and must be modified to provide data of the Modified: trunk/FreeOrion/util/SerializeUniverse.cpp =================================================================== --- trunk/FreeOrion/util/SerializeUniverse.cpp 2010-10-02 07:15:39 UTC (rev 3805) +++ trunk/FreeOrion/util/SerializeUniverse.cpp 2010-10-03 07:01:33 UTC (rev 3806) @@ -2,10 +2,18 @@ #include "Serialize.ipp" -#ifndef FREEORION_WIN32 -#include "SerializeUniverseExports.ipp" -#endif +#include "../universe/Building.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" +#include "../universe/Planet.h" +#include "../universe/ShipDesign.h" +#include "../universe/System.h" +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) template <class Archive> void ObjectMap::serialize(Archive& ar, const unsigned int version) @@ -27,6 +35,8 @@ ObjectKnowledgeMap empire_known_destroyed_object_ids; ShipDesignMap ship_designs; + ar.template register_type<System>(); + if (Archive::is_saving::value) { GetObjectsToSerialize( objects, s_encoding_empire); GetEmpireKnownObjectsToSerialize( empire_latest_known_objects, s_encoding_empire); Modified: trunk/FreeOrion/util/SerializeUniverseExports.ipp =================================================================== --- trunk/FreeOrion/util/SerializeUniverseExports.ipp 2010-10-02 07:15:39 UTC (rev 3805) +++ trunk/FreeOrion/util/SerializeUniverseExports.ipp 2010-10-03 07:01:33 UTC (rev 3806) @@ -1,36 +0,0 @@ -#include "../universe/Building.h" -#include "../universe/Fleet.h" -#include "../universe/Ship.h" -#include "../universe/Planet.h" -#include "../universe/ShipDesign.h" -#include "../universe/System.h" - -// exports for boost serialization of polymorphic UniverseObject hierarchy - -#ifdef FREEORION_WIN32 - -BOOST_CLASS_EXPORT(System) - -#else - -// HACK! For some odd reason, defining guid() below with inline, and only -// when specialized to System, fails to define a reachable specialization when -// overload resolution looks for it at call time later. GCC. Go figure. - -namespace boost { namespace serialization { - template<> - struct guid_defined<System> : boost::mpl::true_ {}; - - template<> - const char * guid<System>() - { return "System"; } -} } - -BOOST_CLASS_EXPORT_IMPLEMENT(System) - -#endif - -BOOST_CLASS_EXPORT(Planet) -BOOST_CLASS_EXPORT(Building) -BOOST_CLASS_EXPORT(Fleet) -BOOST_CLASS_EXPORT(Ship) |
From: <geo...@us...> - 2011-06-13 11:57:40
|
Revision: 3996 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3996&view=rev Author: geoffthemedio Date: 2011-06-13 11:57:33 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Tweaks / fixes to MultiplayerCommon.cpp and Directories.cpp to be compatible with Boost FileSystem 2 and 3. Involved removing the default name check calls, which were removed from filesystem3, but which presumably weren't doing much good in filesystem2 anyway. Modified Paths: -------------- trunk/FreeOrion/util/Directories.cpp trunk/FreeOrion/util/MultiplayerCommon.cpp Modified: trunk/FreeOrion/util/Directories.cpp =================================================================== --- trunk/FreeOrion/util/Directories.cpp 2011-06-12 06:40:39 UTC (rev 3995) +++ trunk/FreeOrion/util/Directories.cpp 2011-06-13 11:57:33 UTC (rev 3996) @@ -47,9 +47,6 @@ if (g_initialized) return; - if (fs::path::default_name_check_writable()) - fs::path::default_name_check(fs::native); - // store working dir fs::initial_path(); fs::path bundle_path; @@ -139,9 +136,6 @@ if (g_initialized) return; - if (fs::path::default_name_check_writable()) - fs::path::default_name_check(fs::native); - /* store working dir. some implimentations get the value of initial_path * from the value of current_path the first time initial_path is called, * so it is necessary to call initial_path as soon as possible after @@ -167,8 +161,6 @@ } const fs::path GetUserDir() { - if (fs::path::default_name_check_writable()) - fs::path::default_name_check(fs::native); static fs::path p = fs::path(getenv("HOME")) / ".freeorion"; return p; } @@ -260,8 +252,6 @@ if (g_initialized) return; - fs::path::default_name_check(fs::native); - fs::path local_dir = GetUserDir(); if (!exists(local_dir)) fs::create_directories(local_dir); @@ -276,8 +266,6 @@ } const fs::path GetUserDir() { - if (fs::path::default_name_check_writable()) - fs::path::default_name_check(fs::native); static fs::path p = fs::path(std::string(getenv("APPDATA"))) / "FreeOrion"; return p; } @@ -331,8 +319,13 @@ fs::path RelativePath(const fs::path& from, const fs::path& to) { fs::path retval; +#if defined(BOOST_FILESYSTEM_VERSION) && BOOST_FILESYSTEM_VERSION == 3 + fs::path from_abs = fs::absolute(from); + fs::path to_abs = fs::absolute(to); +#else fs::path from_abs = fs::complete(from); fs::path to_abs = fs::complete(to); +#endif fs::path::iterator from_it = from_abs.begin(); fs::path::iterator end_from_it = from_abs.end(); fs::path::iterator to_it = to_abs.begin(); Modified: trunk/FreeOrion/util/MultiplayerCommon.cpp =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.cpp 2011-06-12 06:40:39 UTC (rev 3995) +++ trunk/FreeOrion/util/MultiplayerCommon.cpp 2011-06-13 11:57:33 UTC (rev 3996) @@ -497,20 +497,23 @@ // build a list of save files fs::path save_dir(GetSaveDir()); - Logger().debugStream() << "MultiplayerLobbyData::MultiplayerLobbyData save dir path: " << save_dir.native_file_string(); + Logger().debugStream() << "MultiplayerLobbyData::MultiplayerLobbyData save dir path: " << save_dir.string(); fs::directory_iterator end_it; for (fs::directory_iterator it(save_dir); it != end_it; ++it) { try { #if defined(BOOST_FILESYSTEM_VERSION) && BOOST_FILESYSTEM_VERSION == 3 - if (fs::exists(*it) && !fs::is_directory(*it) && it->filename()[0] != '.') { - std::string filename = it->filename(); + if (fs::exists(*it) && !fs::is_directory(*it) && it->path().filename().string()[0] != '.') { + std::string filename = it->path().filename().string(); +#else + if (fs::exists(*it) && !fs::is_directory(*it) && it->path().filename()[0] != '.') { + std::string filename = it->path().filename(); +#endif // disallow filenames that begin with a dot, and filenames with spaces in them if (filename.find('.') != 0 && filename.find(' ') == std::string::npos && filename.find(MP_SAVE_FILE_EXTENSION) == filename.size() - MP_SAVE_FILE_EXTENSION.size()) { m_save_games.push_back(filename); } } -#endif } catch (const fs::filesystem_error& e) { // ignore files for which permission is denied, and rethrow other exceptions if (e.code() != boost::system::posix_error::permission_denied) |
From: <geo...@us...> - 2011-08-24 22:19:13
|
Revision: 4180 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4180&view=rev Author: geoffthemedio Date: 2011-08-24 22:19:07 +0000 (Wed, 24 Aug 2011) Log Message: ----------- Added a ground combat sitrep type. Modified Paths: -------------- trunk/FreeOrion/util/SitRepEntry.cpp trunk/FreeOrion/util/SitRepEntry.h Modified: trunk/FreeOrion/util/SitRepEntry.cpp =================================================================== --- trunk/FreeOrion/util/SitRepEntry.cpp 2011-08-24 21:58:24 UTC (rev 4179) +++ trunk/FreeOrion/util/SitRepEntry.cpp 2011-08-24 22:19:07 UTC (rev 4180) @@ -23,34 +23,40 @@ SitRepEntry* CreateTechResearchedSitRep(const std::string& tech_name) { SitRepEntry* sitrep = new SitRepEntry("SITREP_TECH_RESEARCHED"); sitrep->AddVariable(VarText::TECH_TAG, tech_name); - return(sitrep); + return sitrep; } SitRepEntry* CreateShipBuiltSitRep(int ship_id, int system_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_SHIP_BUILT"); sitrep->AddVariable(VarText::SYSTEM_ID_TAG, boost::lexical_cast<std::string>(system_id)); sitrep->AddVariable(VarText::SHIP_ID_TAG, boost::lexical_cast<std::string>(ship_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateBuildingBuiltSitRep(int building_id, int planet_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_BUILDING_BUILT"); sitrep->AddVariable(VarText::PLANET_ID_TAG, boost::lexical_cast<std::string>(planet_id)); sitrep->AddVariable(VarText::BUILDING_ID_TAG, boost::lexical_cast<std::string>(building_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateCombatSitRep(int system_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_COMBAT_SYSTEM"); sitrep->AddVariable(VarText::SYSTEM_ID_TAG, boost::lexical_cast<std::string>(system_id)); - return(sitrep); + return sitrep; } +SitRepEntry* CreateGroundCombatSitRep(int planet_id) { + SitRepEntry* sitrep = new SitRepEntry("SITREP_GROUND_BATTLE"); + sitrep->AddVariable(VarText::PLANET_ID_TAG, boost::lexical_cast<std::string>(planet_id)); + return sitrep; +} + SitRepEntry* CreatePlanetCapturedSitRep(int planet_id, int empire_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_PLANET_CAPTURED"); sitrep->AddVariable(VarText::PLANET_ID_TAG, boost::lexical_cast<std::string>(planet_id)); sitrep->AddVariable(VarText::EMPIRE_ID_TAG, boost::lexical_cast<std::string>(empire_id)); - return(sitrep); + return sitrep; } namespace { @@ -96,33 +102,33 @@ SitRepEntry* CreatePlanetStarvedToDeathSitRep(int planet_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_PLANET_LOST_STARVED_TO_DEATH"); sitrep->AddVariable(VarText::PLANET_ID_TAG, boost::lexical_cast<std::string>(planet_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreatePlanetColonizedSitRep(int planet_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_PLANET_COLONIZED"); sitrep->AddVariable(VarText::PLANET_ID_TAG, boost::lexical_cast<std::string>(planet_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_FLEET_ARRIVED_AT_DESTINATION"); sitrep->AddVariable(VarText::SYSTEM_ID_TAG, boost::lexical_cast<std::string>(system_id)); sitrep->AddVariable(VarText::FLEET_ID_TAG, boost::lexical_cast<std::string>(fleet_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateEmpireEliminatedSitRep(int empire_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_EMPIRE_ELIMINATED"); sitrep->AddVariable(VarText::EMPIRE_ID_TAG, boost::lexical_cast<std::string>(empire_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateVictorySitRep(const std::string& reason_string, int empire_id) { SitRepEntry* sitrep = new SitRepEntry("SITREP_VICTORY"); sitrep->AddVariable(VarText::TEXT_TAG, reason_string); sitrep->AddVariable(VarText::EMPIRE_ID_TAG, boost::lexical_cast<std::string>(empire_id)); - return(sitrep); + return sitrep; } SitRepEntry* CreateSitRep(const std::string& template_string, const std::vector<std::pair<std::string, std::string> >& parameters) { Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2011-08-24 21:58:24 UTC (rev 4179) +++ trunk/FreeOrion/util/SitRepEntry.h 2011-08-24 22:19:07 UTC (rev 4180) @@ -30,6 +30,7 @@ SitRepEntry* CreateShipBuiltSitRep(int ship_id, int system_id); SitRepEntry* CreateBuildingBuiltSitRep(int building_id, int planet_id); SitRepEntry* CreateCombatSitRep(int system_id); +SitRepEntry* CreateGroundCombatSitRep(int planet_id); SitRepEntry* CreatePlanetCapturedSitRep(int planet_id, int empire_id); SitRepEntry* CreateCombatDestroyedObjectSitRep(int object_id, int combat_system_id, int empire_id); SitRepEntry* CreatePlanetStarvedToDeathSitRep(int planet_id); |
From: <geo...@us...> - 2012-03-01 13:37:01
|
Revision: 4674 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4674&view=rev Author: geoffthemedio Date: 2012-03-01 13:36:51 +0000 (Thu, 01 Mar 2012) Log Message: ----------- Changed ShipDesignOrder to store the details of the design, rather than an actual ShipDesign object. This seems to fix a crash bug when issuing ShipDesignOrders and ending the turn, though I'm not sure why there was a problem that this fixes. This might break some saved games if they have any partially-played turns in which ship design orders have been issued. Modified Paths: -------------- trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h trunk/FreeOrion/util/SerializeOrderSet.cpp Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2012-03-01 13:34:49 UTC (rev 4673) +++ trunk/FreeOrion/util/Order.cpp 2012-03-01 13:36:51 UTC (rev 4674) @@ -810,7 +810,6 @@ //////////////////////////////////////////////// ShipDesignOrder::ShipDesignOrder() : Order(), - m_ship_design(), m_design_id(INVALID_OBJECT_ID), m_delete_design_from_empire(false), m_create_new_design(false) @@ -818,7 +817,6 @@ ShipDesignOrder::ShipDesignOrder(int empire, int existing_design_id_to_remember) : Order(empire), - m_ship_design(), m_design_id(existing_design_id_to_remember), m_delete_design_from_empire(false), m_create_new_design(false) @@ -826,7 +824,6 @@ ShipDesignOrder::ShipDesignOrder(int empire, int design_id_to_erase, bool dummy) : Order(empire), - m_ship_design(), m_design_id(design_id_to_erase), m_delete_design_from_empire(true), m_create_new_design(false) @@ -834,10 +831,19 @@ ShipDesignOrder::ShipDesignOrder(int empire, int new_design_id, const ShipDesign& ship_design) : Order(empire), - m_ship_design(ship_design), m_design_id(new_design_id), m_delete_design_from_empire(false), - m_create_new_design(true) + m_create_new_design(true), + m_name(ship_design.Name()), + m_description(ship_design.Description()), + m_designed_by_empire_id(ship_design.DesignedByEmpire()), + m_designed_on_turn(ship_design.DesignedOnTurn()), + m_hull(ship_design.Hull()), + m_parts(ship_design.Parts()), + m_is_monster(ship_design.IsMonster()), + m_icon(ship_design.Icon()), + m_3D_model(ship_design.Model()), + m_name_desc_in_stringtable(ship_design.LookupInStringtable()) {} void ShipDesignOrder::ExecuteImpl() const { @@ -856,7 +862,7 @@ } else if (m_create_new_design) { // player is creating a new design - if (m_ship_design.DesignedByEmpire() != EmpireID()) { + if (m_designed_by_empire_id != EmpireID()) { Logger().errorStream() << "Tried to create a new ShipDesign designed by another empire"; return; } @@ -866,7 +872,10 @@ Logger().errorStream() << "Tried to create a new ShipDesign with an id of an already-existing ShipDesign"; return; } - ShipDesign* new_ship_design = new ShipDesign(m_ship_design); + ShipDesign* new_ship_design = new ShipDesign(m_name, m_description, m_designed_by_empire_id, + m_designed_on_turn, m_hull, m_parts, + m_icon, m_3D_model, m_name_desc_in_stringtable, + m_is_monster); universe.InsertShipDesignID(new_ship_design, m_design_id); universe.SetEmpireKnowledgeOfShipDesign(m_design_id, EmpireID()); Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2012-03-01 13:34:49 UTC (rev 4673) +++ trunk/FreeOrion/util/Order.h 2012-03-01 13:36:51 UTC (rev 4674) @@ -477,11 +477,6 @@ ShipDesignOrder(int empire, int new_design_id, const ShipDesign& ship_design); //@} - /** \name Accessors */ //@{ - const ShipDesign& GetShipDesign() const {return m_ship_design;} ///< returns the ship design to be created and/or added or removed to/from the empire's designs - int DesignID() const {return m_design_id;} ///< returns the ship design ID - //@} - private: /** * Preconditions of execute: @@ -503,11 +498,23 @@ */ virtual void ExecuteImpl() const; - ShipDesign m_ship_design; int m_design_id; bool m_delete_design_from_empire; bool m_create_new_design; + // details of design to create + std::string m_name; + std::string m_description; + int m_designed_by_empire_id; + int m_designed_on_turn; + std::string m_hull; + std::vector<std::string> m_parts; + bool m_is_monster; + std::string m_icon; + std::string m_3D_model; + bool m_name_desc_in_stringtable; + // end details of design to create + friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); Modified: trunk/FreeOrion/util/SerializeOrderSet.cpp =================================================================== --- trunk/FreeOrion/util/SerializeOrderSet.cpp 2012-03-01 13:34:49 UTC (rev 4673) +++ trunk/FreeOrion/util/SerializeOrderSet.cpp 2012-03-01 13:36:51 UTC (rev 4674) @@ -128,10 +128,19 @@ void ShipDesignOrder::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Order) - & BOOST_SERIALIZATION_NVP(m_ship_design) & BOOST_SERIALIZATION_NVP(m_design_id) & BOOST_SERIALIZATION_NVP(m_delete_design_from_empire) - & BOOST_SERIALIZATION_NVP(m_create_new_design); + & BOOST_SERIALIZATION_NVP(m_create_new_design) + & BOOST_SERIALIZATION_NVP(m_name) + & BOOST_SERIALIZATION_NVP(m_description) + & BOOST_SERIALIZATION_NVP(m_designed_by_empire_id) + & BOOST_SERIALIZATION_NVP(m_designed_on_turn) + & BOOST_SERIALIZATION_NVP(m_hull) + & BOOST_SERIALIZATION_NVP(m_parts) + & BOOST_SERIALIZATION_NVP(m_is_monster) + & BOOST_SERIALIZATION_NVP(m_icon) + & BOOST_SERIALIZATION_NVP(m_3D_model) + & BOOST_SERIALIZATION_NVP(m_name_desc_in_stringtable); } template <class Archive> |
From: <geo...@us...> - 2012-04-10 21:24:47
|
Revision: 4807 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4807&view=rev Author: geoffthemedio Date: 2012-04-10 21:24:41 +0000 (Tue, 10 Apr 2012) Log Message: ----------- -Added some getters to SitRepEntry to return the template string and get data as int or string by looking up a tag. -grooming Modified Paths: -------------- trunk/FreeOrion/util/SitRepEntry.cpp trunk/FreeOrion/util/SitRepEntry.h trunk/FreeOrion/util/VarText.cpp trunk/FreeOrion/util/VarText.h Modified: trunk/FreeOrion/util/SitRepEntry.cpp =================================================================== --- trunk/FreeOrion/util/SitRepEntry.cpp 2012-04-10 20:21:38 UTC (rev 4806) +++ trunk/FreeOrion/util/SitRepEntry.cpp 2012-04-10 21:24:41 UTC (rev 4807) @@ -20,6 +20,28 @@ VarText(template_string, true) {} +int SitRepEntry::GetDataIDNumber(const std::string& tag) const { + if (!m_variables.ContainsChild(tag)) + return -1; + const XMLElement& token_elem = m_variables.Child(tag); + try { + const std::string& text = token_elem.Attribute("value"); + return boost::lexical_cast<int>(text); + } catch (...) { + return -1; + } + return -1; +} + +const std::string& SitRepEntry::GetDataString(const std::string& tag) const { + static const std::string EMPTY_STRING; + if (!m_variables.ContainsChild(tag)) + return EMPTY_STRING; + const XMLElement& token_elem = m_variables.Child(tag); + return token_elem.Attribute("value"); + return EMPTY_STRING; +} + SitRepEntry* CreateTechResearchedSitRep(const std::string& tech_name) { SitRepEntry* sitrep = new SitRepEntry("SITREP_TECH_RESEARCHED"); sitrep->AddVariable(VarText::TECH_TAG, tech_name); Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2012-04-10 20:21:38 UTC (rev 4806) +++ trunk/FreeOrion/util/SitRepEntry.h 2012-04-10 21:24:41 UTC (rev 4807) @@ -11,14 +11,19 @@ #include <boost/lexical_cast.hpp> /** Situation report entry, to be displayed in the SitRep screen. */ -class SitRepEntry : public VarText -{ +class SitRepEntry : public VarText { public: /** \name Structors */ //@{ SitRepEntry(); ///< default ctor SitRepEntry(const std::string& template_string); //@} + /** Accessors */ //@{ + const std::string& GetTemplateString() const { return m_template_string; } + int GetDataIDNumber(const std::string& tag) const; + const std::string& GetDataString(const std::string& tag) const; + //@} + private: friend class boost::serialization::access; template <class Archive> @@ -32,6 +37,7 @@ SitRepEntry* CreateCombatSitRep(int system_id); SitRepEntry* CreateGroundCombatSitRep(int planet_id); SitRepEntry* CreatePlanetCapturedSitRep(int planet_id, int empire_id); +SitRepEntry* CreateCombatDamagedObjectSitRep(int object_id, int empire_id, double hnnn); SitRepEntry* CreateCombatDestroyedObjectSitRep(int object_id, int combat_system_id, int empire_id); SitRepEntry* CreatePlanetStarvedToDeathSitRep(int planet_id); SitRepEntry* CreatePlanetColonizedSitRep(int planet_id); Modified: trunk/FreeOrion/util/VarText.cpp =================================================================== --- trunk/FreeOrion/util/VarText.cpp 2012-04-10 20:21:38 UTC (rev 4806) +++ trunk/FreeOrion/util/VarText.cpp 2012-04-10 21:24:41 UTC (rev 4807) @@ -62,7 +62,7 @@ // plain text substitution token if (token == VarText::TEXT_TAG) { - std::string text = token_elem.Attribute("value"); + const std::string& text = token_elem.Attribute("value"); m_str += UserString(text); return; } Modified: trunk/FreeOrion/util/VarText.h =================================================================== --- trunk/FreeOrion/util/VarText.h 2012-04-10 20:21:38 UTC (rev 4806) +++ trunk/FreeOrion/util/VarText.h 2012-04-10 21:24:41 UTC (rev 4807) @@ -25,8 +25,7 @@ * An example of VarText implementation are SitReps. They are created by the * server which knows nothing about what the final string will look like. * ClientUI.cpp ultimately generates a string from the variables. */ -class VarText -{ +class VarText { public: /** \name Structors */ //@{ VarText(); |
From: <geo...@us...> - 2012-06-21 17:36:45
|
Revision: 4915 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4915&view=rev Author: geoffthemedio Date: 2012-06-21 17:36:38 +0000 (Thu, 21 Jun 2012) Log Message: ----------- -Added AggressiveOrder order type for setting aggression state of fleets (though not way yet to actually use it). -grooming Modified Paths: -------------- trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h trunk/FreeOrion/util/SerializeOrderSet.cpp Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2012-06-21 17:06:47 UTC (rev 4914) +++ trunk/FreeOrion/util/Order.cpp 2012-06-21 17:36:38 UTC (rev 4915) @@ -954,3 +954,27 @@ } return true; } + +//////////////////////////////////////////////// +// AggressiveOrder +//////////////////////////////////////////////// +AggressiveOrder::AggressiveOrder() : + Order(), + m_object_id(INVALID_OBJECT_ID), + m_aggression(false) +{} + +AggressiveOrder::AggressiveOrder(int empire, int object_id, bool aggression/* = true*/) : + Order(empire), + m_object_id(object_id), + m_aggression(aggression) +{} + +void AggressiveOrder::ExecuteImpl() const { + ValidateEmpireID(); + int empire_id = EmpireID(); + if (Fleet* fleet = GetFleet(m_object_id)) { + if (fleet->OwnedBy(empire_id)) + fleet->SetAggressive(m_aggression); + } +} Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2012-06-21 17:06:47 UTC (rev 4914) +++ trunk/FreeOrion/util/Order.h 2012-06-21 17:36:38 UTC (rev 4915) @@ -17,15 +17,16 @@ ///////////////////////////////////////////////////// // Order ///////////////////////////////////////////////////// -/** the abstract base class for serializable player actions. Orders are generally executed on the - client side as soon as they are issued. Those that define UndoImpl() may also be undone on the client - side. Subclass-defined UndoImpl() \a must return true, indicating that the call had some effect; the - default implementation does nothing and returns false. Note that only some Order subclasses define - UndoImpl(), specifically those that need to be undone before another order of a similar type can be - issued. For example, ColonizeOrder needs to be undoable; otherwise, once the user clicks the - colonize button, she is locked in to this decision. */ -class Order -{ +/** The abstract base class for serializable player actions. Orders are + * generally executed on the client side as soon as they are issued. Those + * that define UndoImpl() may also be undone on the client side. Subclass- + * defined UndoImpl() \a must return true, indicating that the call had some + * effect; the default implementation does nothing and returns false. Note that + * only some Order subclasses define UndoImpl(), specifically those that need + * to be undone before another order of a similar type can be issued. For + * example, ColonizeOrder needs to be undoable; otherwise, once the user clicks + * the colonize button, she is locked in to this decision. */ +class Order { public: /** \name Structors */ //@{ Order(); ///< default ctor @@ -73,8 +74,7 @@ // RenameOrder ///////////////////////////////////////////////////// /** the Order subclass that represents the renaming of a UniverseObject. */ -class RenameOrder : public Order -{ +class RenameOrder : public Order { public: /** \name Structors */ //@{ RenameOrder(); @@ -111,8 +111,7 @@ ///////////////////////////////////////////////////// /** the Order subclass that represents forming a new fleet. Only one of system or position will be used to place the new fleet.*/ -class NewFleetOrder : public Order -{ +class NewFleetOrder : public Order { public: /** \name Structors */ //@{ NewFleetOrder(); @@ -153,8 +152,7 @@ ///////////////////////////////////////////////////// /** the Order subclass that represents fleet movement These orders change the current destination of a fleet */ -class FleetMoveOrder : public Order -{ +class FleetMoveOrder : public Order { public: /** \name Structors */ //@{ FleetMoveOrder(); @@ -196,11 +194,10 @@ ///////////////////////////////////////////////////// // FleetTransferOrder ///////////////////////////////////////////////////// -/** the Order subclass that represents transfer of ships between existing fleets - A FleetTransferOrder is used to transfer ships from one existing fleet to another - */ -class FleetTransferOrder : public Order -{ +/** The Order subclass that represents transfer of ships between existing fleets + * A FleetTransferOrder is used to transfer ships from one existing fleet to + * another. */ +class FleetTransferOrder : public Order { public: /** \name Structors */ //@{ FleetTransferOrder(); @@ -240,8 +237,7 @@ // ColonizeOrder ///////////////////////////////////////////////////// /** the Order subclass that represents a planet colonization action*/ -class ColonizeOrder : public Order -{ +class ColonizeOrder : public Order { public: /** \name Structors */ //@{ ColonizeOrder(); @@ -281,8 +277,7 @@ // InvadeOrder ///////////////////////////////////////////////////// /** the Order subclass that represents a planet invasion action*/ -class InvadeOrder : public Order -{ +class InvadeOrder : public Order { public: /** \name Structors */ //@{ InvadeOrder(); @@ -321,10 +316,10 @@ ///////////////////////////////////////////////////// // DeleteFleetOrder ///////////////////////////////////////////////////// -/** the Order subclass that represents removing an existing fleet that contains - * no ships */ -class DeleteFleetOrder : public Order -{ +/** The Order subclass that represents removing an existing fleet that contains + * no ships. This is mainly a utility order that is issued automatically by the + * game when the user removes all ships from a fleet. */ +class DeleteFleetOrder : public Order { public: /** \name Structors */ //@{ DeleteFleetOrder(); @@ -359,8 +354,7 @@ // ChangeFocusOrder ///////////////////////////////////////////////////// /** the Order subclass that represents changing a planet focus*/ -class ChangeFocusOrder : public Order -{ +class ChangeFocusOrder : public Order { public: /** \name Structors */ //@{ ChangeFocusOrder(); @@ -393,11 +387,10 @@ ///////////////////////////////////////////////////// // ResearchQueueOrder ///////////////////////////////////////////////////// -/** The Order subclass that represents changing an empire's research queue. The 2-arg ctor removes the named - tech from \a empire's queue, whereas the 3-arg ctor places \a tech_name at position \a position in - \a empire's research queue. */ -class ResearchQueueOrder : public Order -{ +/** The Order subclass that represents changing an empire's research queue. The + * 2-arg ctor removes the named tech from \a empire's queue, whereas the 3-arg + * ctor places \a tech_name at position \a position in \a empire's research queue. */ +class ResearchQueueOrder : public Order { public: /** \name Structors */ //@{ ResearchQueueOrder(); @@ -421,11 +414,12 @@ ///////////////////////////////////////////////////// // ProductionQueueOrder ///////////////////////////////////////////////////// -/** The Order subclass that represents changing an empire's production queue. The 5-arg ctor adds the build to the end - of \a empire's queue, the 3-arg ctor moves an existing build from its current location at \a index to a new one at - \a new_index, and the 2-arg ctor removes the build at \a index from \a empire's queue. */ -class ProductionQueueOrder : public Order -{ +/** The Order subclass that represents changing an empire's production queue. + * The 5-arg ctor adds the build to the end of \a empire's queue, the 3-arg + * ctor moves an existing build from its current location at \a index to a new + * one at \a new_index, and the 2-arg ctor removes the build at \a index from + * \a empire's queue. */ +class ProductionQueueOrder : public Order { public: /** \name Structors */ //@{ ProductionQueueOrder(); @@ -461,14 +455,16 @@ // ShipDesignOrder ///////////////////////////////////////////////////// /** The Order subclass that represents manipulating an empire's ship designs. - The 2-arg ctor adds the existing ship design to the \a empire's set of designs - remembering, or "keeping" the - design and enabling the \a empire to produce ships of that design (if all design prerequisites are met) - The 3-arg ctor taking a bool removes the indicated design from the empire's set of remembered designs - The 3-arg ctor taking a ShipDesign argument creates a new shipdesign in the universe's catalog of shipdesigns - with the passed new design id, and adds this design to the \a empire's set of remembered designs. The new design must - be marked as designed by this \a empire.*/ -class ShipDesignOrder : public Order -{ + * The 2-arg ctor adds the existing ship design to the \a empire's set of + * designs - remembering, or "keeping" the design and enabling the \a empire to + * produce ships of that design (if all design prerequisites are met) + * The 3-arg ctor taking a bool removes the indicated design from the empire's + * set of remembered designs. + * The 3-arg ctor taking a ShipDesign argument creates a new shipdesign in the + * universe's catalog of shipdesigns with the passed new design id, and adds + * this design to the \a empire's set of remembered designs. The new design + * must be marked as designed by this \a empire.*/ +class ShipDesignOrder : public Order { public: /** \name Structors */ //@{ ShipDesignOrder(); @@ -526,8 +522,7 @@ ///////////////////////////////////////////////////// /** the Order subclass that represents the scrapping / recycling / destroying * a building or ship owned by an empire. */ -class ScrapOrder : public Order -{ +class ScrapOrder : public Order { public: /** \name Structors */ //@{ ScrapOrder(); @@ -535,7 +530,7 @@ //@} /** \name Accessors */ //@{ - int ObjectID() const {return m_object_id;} ///< returns ID of object selected in this order + int ObjectID() const { return m_object_id; }///< returns ID of object selected in this order //@} private: @@ -557,6 +552,43 @@ void serialize(Archive& ar, const unsigned int version); }; + +///////////////////////////////////////////////////// +// AggressiveOrder +///////////////////////////////////////////////////// +/** the Order subclass that represents setting the aggression state of objects + * controlled by an empire. */ +class AggressiveOrder : public Order { +public: + /** \name Structors */ //@{ + AggressiveOrder(); + AggressiveOrder(int empire, int object_id, bool aggression = true); + //@} + + /** \name Accessors */ //@{ + int ObjectID() const { return m_object_id; } ///< returns ID of object selected in this order + bool Aggression() const { return m_aggression; }///< returns aggression state to set object to + //@} + +private: + /** + * Preconditions: + * - m_object_id must be the ID of an object owned by issuing empire + * - the object must have an aggression status: fleets + * + * Postconditions: + * - the object is set to the new aggression state + */ + virtual void ExecuteImpl() const; + + int m_object_id; + bool m_aggression; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + // Note: *::serialize() implemented in SerializeOrderSet.cpp. #endif // _Order_h_ Modified: trunk/FreeOrion/util/SerializeOrderSet.cpp =================================================================== --- trunk/FreeOrion/util/SerializeOrderSet.cpp 2012-06-21 17:06:47 UTC (rev 4914) +++ trunk/FreeOrion/util/SerializeOrderSet.cpp 2012-06-21 17:36:38 UTC (rev 4915) @@ -25,6 +25,7 @@ BOOST_CLASS_EXPORT(ProductionQueueOrder) BOOST_CLASS_EXPORT(ShipDesignOrder) BOOST_CLASS_EXPORT(ScrapOrder) +BOOST_CLASS_EXPORT(AggressiveOrder) template <class Archive> void Order::serialize(Archive& ar, const unsigned int version) @@ -150,6 +151,14 @@ & BOOST_SERIALIZATION_NVP(m_object_id); } +template <class Archive> +void AggressiveOrder::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Order) + & BOOST_SERIALIZATION_NVP(m_object_id) + & BOOST_SERIALIZATION_NVP(m_aggression); +} + void Serialize(FREEORION_OARCHIVE_TYPE& oa, const OrderSet& order_set) { oa << BOOST_SERIALIZATION_NVP(order_set); } |
From: <ve...@us...> - 2012-06-25 18:46:50
|
Revision: 4933 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4933&view=rev Author: vezzra Date: 2012-06-25 18:46:44 +0000 (Mon, 25 Jun 2012) Log Message: ----------- Added process priority handling to the implementation of the process class (prereq for intelligent AI process priority management) Modified Paths: -------------- trunk/FreeOrion/util/Process.cpp trunk/FreeOrion/util/Process.h Modified: trunk/FreeOrion/util/Process.cpp =================================================================== --- trunk/FreeOrion/util/Process.cpp 2012-06-25 08:21:09 UTC (rev 4932) +++ trunk/FreeOrion/util/Process.cpp 2012-06-25 18:46:44 UTC (rev 4933) @@ -5,14 +5,23 @@ #include <stdexcept> Process::Process() : - m_empty(true) + m_empty(true), + m_low_priority(false) {} Process::Process(const std::string& cmd, const std::vector<std::string>& argv) : m_impl(new ProcessImpl(cmd, argv)), - m_empty(false) + m_empty(false), + m_low_priority(false) {} +void Process::SetLowPriority(bool low) { + if ((!m_empty) && (m_low_priority != low)) { + m_low_priority = low; + m_impl->SetLowPriority(low); + } +} + void Process::Kill() { if (m_impl) m_impl->Kill(); } @@ -59,6 +68,13 @@ Process::ProcessImpl::~ProcessImpl() { if (!m_free) Kill(); } +void Process::ProcessImpl::SetLowPriority(bool low) { + if (low) + SetPriorityClass(m_process_info.hProcess, BELOW_NORMAL_PRIORITY_CLASS); + else + SetPriorityClass(m_process_info.hProcess, NORMAL_PRIORITY_CLASS); +} + void Process::ProcessImpl::Kill() { if (!TerminateProcess(m_process_info.hProcess, 0)) { std::string err_str; @@ -77,6 +93,8 @@ #elif defined(FREEORION_LINUX) || defined(FREEORION_MACOSX) #include <sys/types.h> +#include <sys/time.h> +#include <sys/resource.h> #include <unistd.h> #include <signal.h> #include <cstdio> @@ -112,6 +130,13 @@ Process::ProcessImpl::~ProcessImpl() { if (!m_free) Kill(); } +void Process::ProcessImpl::SetLowPriority(bool low) { + if (low) + setpriority(PRIO_PROCESS, m_process_id, 10); + else + setpriority(PRIO_PROCESS, m_process_id, 0); +} + void Process::ProcessImpl::Kill() { kill(m_process_id, SIGHUP); } Modified: trunk/FreeOrion/util/Process.h =================================================================== --- trunk/FreeOrion/util/Process.h 2012-06-25 08:21:09 UTC (rev 4932) +++ trunk/FreeOrion/util/Process.h 2012-06-25 18:46:44 UTC (rev 4933) @@ -47,9 +47,13 @@ /** \name Accessors */ //@{ bool Empty() const {return m_empty;} ///< returns true if this is a default-constructed object with no associated process + bool HasLowPriority() {return m_low_priority;} ///< true if process is set to low priority //@} /** \name Mutators */ //@{ + /** sets process priority */ + void SetLowPriority(bool low); + /** kills the controlled process immediately. */ void Kill(); @@ -67,6 +71,7 @@ ProcessImpl(const std::string& cmd, const std::vector<std::string>& argv); ~ProcessImpl(); + void SetLowPriority(bool low); void Kill(); void Free(); @@ -82,7 +87,7 @@ boost::shared_ptr<ProcessImpl> m_impl; bool m_empty; ///< true iff this is a default-constructed Process (no associated process exists) + bool m_low_priority; ///< true if this process is set to low priority }; -#endif // _Process_h_ - +#endif // _Process_h_ \ No newline at end of file |
From: <ve...@us...> - 2012-07-01 09:37:16
|
Revision: 4950 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4950&view=rev Author: vezzra Date: 2012-07-01 09:37:10 +0000 (Sun, 01 Jul 2012) Log Message: ----------- Added return value to process priority handling in process class to indicate success or failure when trying to change process priority Modified Paths: -------------- trunk/FreeOrion/util/Process.cpp trunk/FreeOrion/util/Process.h Modified: trunk/FreeOrion/util/Process.cpp =================================================================== --- trunk/FreeOrion/util/Process.cpp 2012-06-30 05:38:52 UTC (rev 4949) +++ trunk/FreeOrion/util/Process.cpp 2012-07-01 09:37:10 UTC (rev 4950) @@ -15,10 +15,13 @@ m_low_priority(false) {} -void Process::SetLowPriority(bool low) { +bool Process::SetLowPriority(bool low) { if ((!m_empty) && (m_low_priority != low)) { - m_low_priority = low; - m_impl->SetLowPriority(low); + if (m_impl->SetLowPriority(low)) { + m_low_priority = low; + return true; + } + else return false; } } @@ -68,11 +71,11 @@ Process::ProcessImpl::~ProcessImpl() { if (!m_free) Kill(); } -void Process::ProcessImpl::SetLowPriority(bool low) { +bool Process::ProcessImpl::SetLowPriority(bool low) { if (low) - SetPriorityClass(m_process_info.hProcess, BELOW_NORMAL_PRIORITY_CLASS); + return (SetPriorityClass(m_process_info.hProcess, BELOW_NORMAL_PRIORITY_CLASS) != 0); else - SetPriorityClass(m_process_info.hProcess, NORMAL_PRIORITY_CLASS); + return (SetPriorityClass(m_process_info.hProcess, NORMAL_PRIORITY_CLASS) != 0); } void Process::ProcessImpl::Kill() { @@ -130,11 +133,11 @@ Process::ProcessImpl::~ProcessImpl() { if (!m_free) Kill(); } -void Process::ProcessImpl::SetLowPriority(bool low) { +bool Process::ProcessImpl::SetLowPriority(bool low) { if (low) - setpriority(PRIO_PROCESS, m_process_id, 10); + return (setpriority(PRIO_PROCESS, m_process_id, 10) == 0); else - setpriority(PRIO_PROCESS, m_process_id, 0); + return (setpriority(PRIO_PROCESS, m_process_id, 0) == 0); } void Process::ProcessImpl::Kill() Modified: trunk/FreeOrion/util/Process.h =================================================================== --- trunk/FreeOrion/util/Process.h 2012-06-30 05:38:52 UTC (rev 4949) +++ trunk/FreeOrion/util/Process.h 2012-07-01 09:37:10 UTC (rev 4950) @@ -52,7 +52,7 @@ /** \name Mutators */ //@{ /** sets process priority */ - void SetLowPriority(bool low); + bool SetLowPriority(bool low); /** kills the controlled process immediately. */ void Kill(); @@ -71,7 +71,7 @@ ProcessImpl(const std::string& cmd, const std::vector<std::string>& argv); ~ProcessImpl(); - void SetLowPriority(bool low); + bool SetLowPriority(bool low); void Kill(); void Free(); |
From: <geo...@us...> - 2012-10-22 05:55:51
|
Revision: 5327 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5327&view=rev Author: geoffthemedio Date: 2012-10-22 05:55:45 +0000 (Mon, 22 Oct 2012) Log Message: ----------- Attempt to fix longstanding issue (bug 2986732 - std::string values in config.xml erroneously saved as "1") by adding explicit flag parameter to Options and checking that before assuming an XML entry with no text is a flag (rather than a blank string, which was then given the text "1" which lead to "1" as text for strings in-game). Not sure how to actually test this, though. Modified Paths: -------------- trunk/FreeOrion/util/OptionsDB.cpp trunk/FreeOrion/util/OptionsDB.h Modified: trunk/FreeOrion/util/OptionsDB.cpp =================================================================== --- trunk/FreeOrion/util/OptionsDB.cpp 2012-10-22 02:31:00 UTC (rev 5326) +++ trunk/FreeOrion/util/OptionsDB.cpp 2012-10-22 05:55:45 UTC (rev 5327) @@ -73,7 +73,7 @@ OptionsDB::Option::Option(char short_name_, const std::string& name_, const boost::any& value_, const boost::any& default_value_, const std::string& description_, - const ValidatorBase* validator_, bool storable_) : + const ValidatorBase* validator_, bool storable_, bool flag_) : name(name_), short_name(short_name_), value(value_), @@ -81,6 +81,7 @@ description(description_), validator(validator_), storable(storable_), + flag(flag_), option_changed_sig_ptr(new boost::signal<void ()>()) { if (short_name_) @@ -88,27 +89,24 @@ } void OptionsDB::Option::SetFromString(const std::string& str) { - if (validator) { // non-flag + if (!flag) value = validator->Validate(str); - } else { // flag + else value = boost::lexical_cast<bool>(str); - } } std::string OptionsDB::Option::ValueToString() const { - if (validator) { // non-flag + if (!flag) return validator->String(value); - } else { // flag + else return boost::lexical_cast<std::string>(boost::any_cast<bool>(value)); - } } std::string OptionsDB::Option::DefaultValueToString() const { - if (validator) { // non-flag + if (!flag) return validator->String(default_value); - } else { // flag + else return boost::lexical_cast<std::string>(boost::any_cast<bool>(default_value)); - } } @@ -130,11 +128,10 @@ if (it == m_options.end()) throw std::runtime_error("Attempted to validate unknown option \"" + name + "\"."); - if (it->second.validator) { // non-flag + if (it->second.validator) it->second.validator->Validate(value); - } else { // flag + else if (it->second.flag) boost::lexical_cast<bool>(value); - } } std::string OptionsDB::GetValueString(const std::string& option_name) const { @@ -257,9 +254,9 @@ } XMLElement temp(name); - if (it->second.validator) { // non-flag + if (it->second.validator) { temp.SetText(it->second.ValueToString()); - } else { // flag + } else if (it->second.flag) { if (!boost::any_cast<bool>(it->second.value)) continue; } @@ -303,7 +300,7 @@ if (option.value.empty()) throw std::runtime_error("The value member of option \"--" + option.name + "\" is undefined."); - if (option.validator) { // non-flag + if (!option.flag) { // non-flag try { // ensure a parameter exists... if (i + 1 >= static_cast<unsigned int>(args.size())) @@ -352,16 +349,14 @@ if (option.value.empty()) throw std::runtime_error("The value member of option \"--" + option.name + "\" is undefined."); - if (option.validator) { // non-flag + if (!option.flag) { if (j < single_char_options.size() - 1) throw std::runtime_error(std::string("Option \"-") + single_char_options[j] + "\" was given with no parameter."); else option.SetFromString(args[++i]); - } else { // flag + } else { option.value = true; } - - //option_changed = true; } } } @@ -369,18 +364,18 @@ } void OptionsDB::SetFromXML(const XMLDoc& doc) { - for (int i = 0; i < doc.root_node.NumChildren(); ++i) { + for (int i = 0; i < doc.root_node.NumChildren(); ++i) SetFromXMLRecursive(doc.root_node.Child(i), ""); - } } void OptionsDB::SetFromXMLRecursive(const XMLElement& elem, const std::string& section_name) { std::string option_name = section_name + (section_name == "" ? "" : ".") + elem.Tag(); - // flags have no text or children; their presence at all indicates a value of true - std::string option_value = elem.NumChildren() || elem.Text() != "" ? elem.Text() : "1"; + if (elem.NumChildren()) { + for (int i = 0; i < elem.NumChildren(); ++i) + SetFromXMLRecursive(elem.Child(i), option_name); - if (option_value != "") { + } else { std::map<std::string, Option>::iterator it = m_options.find(option_name); if (it == m_options.end()) { @@ -389,19 +384,19 @@ } Option& option = it->second; - if (option.value.empty()) { - Logger().errorStream() << "The value member of option \"" << option.name << "\" in config.xml is undefined."; - return; - } + //if (!option.flag && option.value.empty()) { + // Logger().errorStream() << "The value member of option \"" << option.name << "\" in config.xml is undefined."; + // return; + //} - try { - option.SetFromString(option_value); - } catch (const std::exception& e) { - Logger().errorStream() << "OptionsDB::SetFromXMLRecursive() : while processing config.xml the following exception was caught when attemptimg to set option \"" << option_name << "\": " << e.what(); - return; + if (option.flag) { + option.value = true; + } else { + try { + option.SetFromString(elem.Text()); + } catch (const std::exception& e) { + Logger().errorStream() << "OptionsDB::SetFromXMLRecursive() : while processing config.xml the following exception was caught when attemptimg to set option \"" << option_name << "\": " << e.what(); + } } } - - for (int i = 0; i < elem.NumChildren(); ++i) - SetFromXMLRecursive(elem.Child(i), option_name); } Modified: trunk/FreeOrion/util/OptionsDB.h =================================================================== --- trunk/FreeOrion/util/OptionsDB.h 2012-10-22 02:31:00 UTC (rev 5326) +++ trunk/FreeOrion/util/OptionsDB.h 2012-10-22 05:55:45 UTC (rev 5327) @@ -170,7 +170,7 @@ { if (m_options.find(name) != m_options.end()) throw std::runtime_error("OptionsDB::Add<>() : Option " + name + " was specified twice."); - m_options[name] = Option(static_cast<char>(0), name, default_value, default_value, description, validator.Clone(), storable); + m_options[name] = Option(static_cast<char>(0), name, default_value, default_value, description, validator.Clone(), storable, false); OptionAddedSignal(name); } @@ -182,7 +182,7 @@ { if (m_options.find(name) != m_options.end()) throw std::runtime_error("OptionsDB::Add<>() : Option " + name + " was specified twice."); - m_options[name] = Option(short_name, name, default_value, default_value, description, validator.Clone(), storable); + m_options[name] = Option(short_name, name, default_value, default_value, description, validator.Clone(), storable, false); OptionAddedSignal(name); } @@ -195,7 +195,7 @@ if (m_options.find(name) != m_options.end()) throw std::runtime_error("OptionsDB::AddFlag<>() : Option " + name + " was specified twice."); m_options[name] = Option(static_cast<char>(0), name, false, boost::lexical_cast<std::string>(false), - description, 0, storable); + description, 0, storable, true); OptionAddedSignal(name); } @@ -208,7 +208,7 @@ if (m_options.find(name) != m_options.end()) throw std::runtime_error("OptionsDB::AddFlag<>() : Option " + name + " was specified twice."); m_options[name] = Option(short_name, name, false, boost::lexical_cast<std::string>(false), - description, 0, storable); + description, 0, storable, true); OptionAddedSignal(name); } @@ -241,7 +241,7 @@ Option(); Option(char short_name_, const std::string& name_, const boost::any& value_, const boost::any& default_value_, const std::string& description_, - const ValidatorBase *validator_, bool storable_); + const ValidatorBase *validator_, bool storable_, bool flag_); void SetFromString(const std::string& str); std::string ValueToString() const; @@ -255,6 +255,7 @@ boost::shared_ptr<const ValidatorBase> validator; ///< a validator for the option. Flags have no validators; lexical_cast boolean conversions are done for them. bool storable; ///< whether this option can be stored in an XML config file for use across multiple runs + bool flag; mutable boost::shared_ptr<boost::signal<void ()> > option_changed_sig_ptr; |
From: <geo...@us...> - 2013-02-22 13:32:25
|
Revision: 5775 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5775&view=rev Author: geoffthemedio Date: 2013-02-22 13:32:17 +0000 (Fri, 22 Feb 2013) Log Message: ----------- Added MultiplayerLobbyData::Dump function. Modified Paths: -------------- trunk/FreeOrion/util/MultiplayerCommon.cpp trunk/FreeOrion/util/MultiplayerCommon.h Modified: trunk/FreeOrion/util/MultiplayerCommon.cpp =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.cpp 2013-02-22 13:31:17 UTC (rev 5774) +++ trunk/FreeOrion/util/MultiplayerCommon.cpp 2013-02-22 13:32:17 UTC (rev 5775) @@ -498,7 +498,28 @@ } } +std::string MultiplayerLobbyData::Dump() const { + std::stringstream stream; + for (std::list<std::pair<int, PlayerSetupData> >::const_iterator it = m_players.begin(); + it != m_players.end(); ++it) + { + stream << it->first << ": " << (it->second.m_player_name.empty() ? "NO NAME" : it->second.m_player_name) << " "; + if (it->second.m_client_type == Networking::CLIENT_TYPE_AI_PLAYER) + stream << "AI PLAYER"; + else if (it->second.m_client_type == Networking::CLIENT_TYPE_HUMAN_PLAYER) + stream << "HUMAN PLAYER"; + else if (it->second.m_client_type == Networking::CLIENT_TYPE_HUMAN_OBSERVER) + stream << "HUMAN OBSERVER"; + else if (it->second.m_client_type == Networking::CLIENT_TYPE_HUMAN_MODERATOR) + stream << "HUMAN MODERATOR"; + else + stream << "UNKNOWN CLIENT TPYE"; + stream << " " << (it->second.m_empire_name.empty() ? "NO EMPIRE NAME" : it->second.m_empire_name) << std::endl; + } + return stream.str(); +} + //////////////////////////////////////////////// // CombatData //////////////////////////////////////////////// Modified: trunk/FreeOrion/util/MultiplayerCommon.h =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.h 2013-02-22 13:31:17 UTC (rev 5774) +++ trunk/FreeOrion/util/MultiplayerCommon.h 2013-02-22 13:32:17 UTC (rev 5775) @@ -197,6 +197,8 @@ explicit MultiplayerLobbyData(bool build_save_game_list); ///< Basic ctor. //@} + std::string Dump() const; + bool m_new_game; int m_save_file_index; std::list<std::pair<int, PlayerSetupData> > m_players; // <player_id, PlayerSetupData> |
From: <geo...@us...> - 2013-02-24 20:23:25
|
Revision: 5801 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5801&view=rev Author: geoffthemedio Date: 2013-02-24 20:23:19 +0000 (Sun, 24 Feb 2013) Log Message: ----------- grooming Modified Paths: -------------- trunk/FreeOrion/util/OrderSet.cpp trunk/FreeOrion/util/OrderSet.h Modified: trunk/FreeOrion/util/OrderSet.cpp =================================================================== --- trunk/FreeOrion/util/OrderSet.cpp 2013-02-24 20:22:40 UTC (rev 5800) +++ trunk/FreeOrion/util/OrderSet.cpp 2013-02-24 20:23:19 UTC (rev 5801) @@ -5,21 +5,17 @@ OrderSet::OrderSet() -{ -} +{} -const OrderPtr OrderSet::ExamineOrder(int order) const -{ +const OrderPtr OrderSet::ExamineOrder(int order) const { OrderPtr retval; OrderMap::const_iterator it = m_orders.find(order); - if (it != m_orders.end()) { + if (it != m_orders.end()) retval = it->second; - } return retval; } -int OrderSet::IssueOrder(OrderPtr order) -{ +int OrderSet::IssueOrder(OrderPtr order) { int retval = ((m_orders.rbegin() != m_orders.rend()) ? m_orders.rbegin()->first + 1 : 0); m_orders[retval] = order; @@ -28,15 +24,12 @@ return retval; } -void OrderSet::ApplyOrders() -{ - for (OrderMap::iterator it = m_orders.begin(); it != m_orders.end(); ++it) { +void OrderSet::ApplyOrders() { + for (OrderMap::iterator it = m_orders.begin(); it != m_orders.end(); ++it) it->second->Execute(); - } } -bool OrderSet::RecindOrder(int order) -{ +bool OrderSet::RecindOrder(int order) { bool retval = false; OrderMap::iterator it = m_orders.find(order); if (it != m_orders.end()) { @@ -49,6 +42,4 @@ } void OrderSet::Reset() -{ - m_orders.clear(); -} +{ m_orders.clear(); } Modified: trunk/FreeOrion/util/OrderSet.h =================================================================== --- trunk/FreeOrion/util/OrderSet.h 2013-02-24 20:22:40 UTC (rev 5800) +++ trunk/FreeOrion/util/OrderSet.h 2013-02-24 20:23:19 UTC (rev 5801) @@ -13,8 +13,7 @@ typedef boost::shared_ptr<Order> OrderPtr; /** a collection of orders that may be searched using arbitrary predicate functions and functors*/ -class OrderSet -{ +class OrderSet { private: typedef std::map<int, OrderPtr> OrderMap; |
From: <geo...@us...> - 2013-04-07 18:36:12
|
Revision: 5962 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5962&view=rev Author: geoffthemedio Date: 2013-04-07 18:36:03 +0000 (Sun, 07 Apr 2013) Log Message: ----------- Fixed AddStarlane serialization / compile error. Modified Paths: -------------- trunk/FreeOrion/util/ModeratorAction.cpp trunk/FreeOrion/util/SerializeModeratorAction.cpp Modified: trunk/FreeOrion/util/ModeratorAction.cpp =================================================================== --- trunk/FreeOrion/util/ModeratorAction.cpp 2013-04-07 15:08:11 UTC (rev 5961) +++ trunk/FreeOrion/util/ModeratorAction.cpp 2013-04-07 18:36:03 UTC (rev 5962) @@ -114,53 +114,53 @@ {} namespace { - void LoadSystemNames(std::list<std::string>& names) { - boost::filesystem::ifstream ifs(GetResourceDir() / "starnames.txt"); - while (ifs) { - std::string latest_name; - std::getline(ifs, latest_name); - if (!latest_name.empty()) - names.push_back(latest_name.substr(0, latest_name.find_last_not_of(" \t") + 1)); // strip off trailing whitespace - } - } - - std::string GenerateSystemName() { - static std::list<std::string> star_names; - if (star_names.empty()) - LoadSystemNames(star_names); - - const ObjectMap& objects = Objects(); - std::vector<const System*> systems = objects.FindObjects<System>(); - - // pick a name for the system - for (std::list<std::string>::const_iterator it = star_names.begin(); it != star_names.end(); ++it) { - // does an existing system have this name? - bool dupe = false; - for (std::vector<const System*>::const_iterator sys_it = systems.begin(); - sys_it != systems.end(); ++sys_it) - { - if ((*sys_it)->Name() == *it) { - dupe = true; - break; // another systme has this name. skip to next potential name. - } - } - if (!dupe) - return *it; // no systems have this name yet. use it. - } - return ""; // fallback to empty name. + void LoadSystemNames(std::list<std::string>& names) { + boost::filesystem::ifstream ifs(GetResourceDir() / "starnames.txt"); + while (ifs) { + std::string latest_name; + std::getline(ifs, latest_name); + if (!latest_name.empty()) + names.push_back(latest_name.substr(0, latest_name.find_last_not_of(" \t") + 1)); // strip off trailing whitespace + } } + + std::string GenerateSystemName() { + static std::list<std::string> star_names; + if (star_names.empty()) + LoadSystemNames(star_names); + + const ObjectMap& objects = Objects(); + std::vector<const System*> systems = objects.FindObjects<System>(); + + // pick a name for the system + for (std::list<std::string>::const_iterator it = star_names.begin(); it != star_names.end(); ++it) { + // does an existing system have this name? + bool dupe = false; + for (std::vector<const System*>::const_iterator sys_it = systems.begin(); + sys_it != systems.end(); ++sys_it) + { + if ((*sys_it)->Name() == *it) { + dupe = true; + break; // another systme has this name. skip to next potential name. + } + } + if (!dupe) + return *it; // no systems have this name yet. use it. + } + return ""; // fallback to empty name. + } } void Moderator::CreateSystem::Execute() const { - const int MAX_SYSTEM_ORBITS = 9; // hard coded value in UniverseServer.cpp - - System* system = new System(m_star_type, MAX_SYSTEM_ORBITS, GenerateSystemName(), m_x, m_y); - if (!system) { - Logger().errorStream() << "CreateSystem::Execute couldn't create system!"; - return; - } - - int new_id = GetNewObjectID(); + const int MAX_SYSTEM_ORBITS = 9; // hard coded value in UniverseServer.cpp + + System* system = new System(m_star_type, MAX_SYSTEM_ORBITS, GenerateSystemName(), m_x, m_y); + if (!system) { + Logger().errorStream() << "CreateSystem::Execute couldn't create system!"; + return; + } + + int new_id = GetNewObjectID(); GetUniverse().InsertID(system, new_id); } @@ -190,28 +190,28 @@ {} void Moderator::CreatePlanet::Execute() const { - System* location = GetSystem(m_system_id); - if (!location) { - Logger().errorStream() << "CreatePlanet::Execute couldn't get a System object at which to create the planet"; - return; + System* location = GetSystem(m_system_id); + if (!location) { + Logger().errorStream() << "CreatePlanet::Execute couldn't get a System object at which to create the planet"; + return; } - // determine if and which orbits are available - std::set<int> free_orbits = location->FreeOrbits(); - if (free_orbits.empty()) { - Logger().errorStream() << "CreatePlanet::Execute couldn't find any free orbits in system where planet was to be created"; - return; - } - - Planet* planet = new Planet(m_planet_type, m_planet_size); - if (!planet) { - Logger().errorStream() << "CreatePlanet::Execute unable to create new Planet object"; - return; - } - int new_planet_id = GetNewObjectID(); - GetUniverse().InsertID(planet, new_planet_id); - - int orbit = *(free_orbits.begin()); + // determine if and which orbits are available + std::set<int> free_orbits = location->FreeOrbits(); + if (free_orbits.empty()) { + Logger().errorStream() << "CreatePlanet::Execute couldn't find any free orbits in system where planet was to be created"; + return; + } + + Planet* planet = new Planet(m_planet_type, m_planet_size); + if (!planet) { + Logger().errorStream() << "CreatePlanet::Execute unable to create new Planet object"; + return; + } + int new_planet_id = GetNewObjectID(); + GetUniverse().InsertID(planet, new_planet_id); + + int orbit = *(free_orbits.begin()); location->Insert(planet, orbit); } Modified: trunk/FreeOrion/util/SerializeModeratorAction.cpp =================================================================== --- trunk/FreeOrion/util/SerializeModeratorAction.cpp 2013-04-07 15:08:11 UTC (rev 5961) +++ trunk/FreeOrion/util/SerializeModeratorAction.cpp 2013-04-07 18:36:03 UTC (rev 5962) @@ -8,6 +8,7 @@ // exports for boost serialization of polymorphic ModeratorAction hierarchy BOOST_CLASS_EXPORT(Moderator::DestroyUniverseObject) BOOST_CLASS_EXPORT(Moderator::SetOwner) +BOOST_CLASS_EXPORT(Moderator::AddStarlane) BOOST_CLASS_EXPORT(Moderator::CreateSystem) BOOST_CLASS_EXPORT(Moderator::CreatePlanet) @@ -48,10 +49,9 @@ & BOOST_SERIALIZATION_NVP(m_id_2); } -template void Moderator::CreatePlanet::serialize<FREEORION_OARCHIVE_TYPE>(FREEORION_OARCHIVE_TYPE&, const unsigned int); -template void Moderator::CreatePlanet::serialize<FREEORION_IARCHIVE_TYPE>(FREEORION_IARCHIVE_TYPE&, const unsigned int); +template void Moderator::AddStarlane::serialize<FREEORION_OARCHIVE_TYPE>(FREEORION_OARCHIVE_TYPE&, const unsigned int); +template void Moderator::AddStarlane::serialize<FREEORION_IARCHIVE_TYPE>(FREEORION_IARCHIVE_TYPE&, const unsigned int); - template <class Archive> void Moderator::CreateSystem::serialize(Archive& ar, const unsigned int version) { |
From: <geo...@us...> - 2013-06-20 20:50:17
|
Revision: 6179 http://sourceforge.net/p/freeorion/code/6179 Author: geoffthemedio Date: 2013-06-20 20:50:14 +0000 (Thu, 20 Jun 2013) Log Message: ----------- Patch by adrian_broher making AppInterface functions definitions in-header. Modified Paths: -------------- trunk/FreeOrion/util/AppInterface.cpp trunk/FreeOrion/util/AppInterface.h Modified: trunk/FreeOrion/util/AppInterface.cpp =================================================================== --- trunk/FreeOrion/util/AppInterface.cpp 2013-06-20 19:48:34 UTC (rev 6178) +++ trunk/FreeOrion/util/AppInterface.cpp 2013-06-20 20:50:14 UTC (rev 6179) @@ -1,95 +1,9 @@ #include "AppInterface.h" -#include "../universe/Planet.h" -#include "../universe/System.h" -#include "../universe/Ship.h" -#include "../universe/Fleet.h" -#include "../universe/Building.h" -#include "../universe/Field.h" -#include "../universe/Universe.h" - -#include "Logger.h" -#include "OptionsDB.h" - -#include <boost/timer.hpp> -#include <string> - const int INVALID_GAME_TURN = -(2 << 15) + 1; const int BEFORE_FIRST_TURN = -(2 << 14); const int IMPOSSIBLY_LARGE_TURN = 2 << 15; -EmpireManager& Empires() { - return IApp::GetApp()->Empires(); -} - -Universe& GetUniverse() { - return IApp::GetApp()->GetUniverse(); -} - -ObjectMap& Objects() -{ return GetUniverse().Objects(); } - -ObjectMap& EmpireKnownObjects(int empire_id) -{ return IApp::GetApp()->EmpireKnownObjects(empire_id); } - -UniverseObject* GetUniverseObject(int object_id) -{ return IApp::GetApp()->GetUniverseObject(object_id); } - -std::string GetVisibleObjectName(const UniverseObject* object) -{ return IApp::GetApp()->GetVisibleObjectName(object); } - -UniverseObject* GetEmpireKnownObject(int object_id, int empire_id) -{ return IApp::GetApp()->EmpireKnownObject(object_id, empire_id); } - -Planet* GetPlanet(int object_id) -{ return Objects().Object<Planet>(object_id); } - -Planet* GetEmpireKnownPlanet(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<Planet>(object_id); } - -System* GetSystem(int object_id) -{ return Objects().Object<System>(object_id); } - -System* GetEmpireKnownSystem(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<System>(object_id); } - -Field* GetField(int object_id) -{ return Objects().Object<Field>(object_id); } - -Field* GetEmpireKnownField(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<Field>(object_id); } - -Ship* GetShip(int object_id) -{ return Objects().Object<Ship>(object_id); } - -Ship* GetEmpireKnownShip(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<Ship>(object_id); } - -Fleet* GetFleet(int object_id) -{ return Objects().Object<Fleet>(object_id); } - -Fleet* GetEmpireKnownFleet(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<Fleet>(object_id); } - -Building* GetBuilding(int object_id) -{ return Objects().Object<Building>(object_id); } - -Building* GetEmpireKnownBuilding(int object_id, int empire_id) -{ return EmpireKnownObjects(empire_id).Object<Building>(object_id); } - -int GetNewObjectID() -{ return IApp::GetApp()->GetNewObjectID(); } - -int GetNewDesignID() -{ return IApp::GetApp()->GetNewDesignID(); } - -int CurrentTurn() -{ return IApp::GetApp()->CurrentTurn(); } - -//////////////////////////////////////////////// -// IApp -//////////////////////////////////////////////// -// static member(s) IApp* IApp::s_app = 0; IApp::IApp() { Modified: trunk/FreeOrion/util/AppInterface.h =================================================================== --- trunk/FreeOrion/util/AppInterface.h 2013-06-20 19:48:34 UTC (rev 6178) +++ trunk/FreeOrion/util/AppInterface.h 2013-06-20 20:50:14 UTC (rev 6179) @@ -2,12 +2,8 @@ #ifndef _AppInterface_h_ #define _AppInterface_h_ -#include <string> +#include "../universe/Universe.h" -#if defined(_MSC_VER) && defined(int64_t) -#undef int64_t -#endif - class EmpireManager; class Universe; class UniverseObject; @@ -19,58 +15,6 @@ class Building; class Field; -/** Accessor for the App's empire manager */ -EmpireManager& Empires(); - -/** Accessor for the App's universe object */ -Universe& GetUniverse(); - -/** Accessor for all (on server) or all known (on client) objects ObjectMap */ -ObjectMap& Objects(); - -/** Accessor for known objects of specified empire. */ -ObjectMap& EmpireKnownObjects(int empire_id); - -/** Accessor for individual objects. */ -UniverseObject* GetUniverseObject(int object_id); -UniverseObject* GetEmpireKnownObject(int object_id, int empire_id); -Planet* GetPlanet(int object_id); -Planet* GetEmpireKnownPlanet(int object_id, int empire_id); -System* GetSystem(int object_id); -System* GetEmpireKnownSystem(int object_id, int empire_id); -Field* GetField(int object_id); -Field* GetEmpireKnownField(int object_id, int empire_id); -Ship* GetShip(int object_id); -Ship* GetEmpireKnownShip(int object_id, int empire_id); -Fleet* GetFleet(int object_id); -Fleet* GetEmpireKnownFleet(int object_id, int empire_id); -Building* GetBuilding(int object_id); -Building* GetEmpireKnownBuilding(int object_id, int empire_id); - -/** Returns the object name of the universe object. This can be apperant object - * name, if the application isn't supposed to see the real object name. */ -std::string GetVisibleObjectName(const UniverseObject* object); - -/** Returns a new object ID from the server */ -int GetNewObjectID(); - -/** Returns a new object ID from the server */ -int GetNewDesignID(); - -/** Returns current game turn. This is >= 1 during a game, BEFORE_FIRST_TURN during galaxy setup, or is - INVALID_GAME_TURN at other times */ -int CurrentTurn(); - -// sentinel values returned by CurrentTurn(). Can't be an enum since CurrentGameTurn() needs to return an integer -// game turn number -extern const int INVALID_GAME_TURN; ///< returned by CurrentGameTurn if a game is not currently in progress or being set up. -extern const int BEFORE_FIRST_TURN; ///< returned by CurrentGameTurn if the galaxy is currently being set up -extern const int IMPOSSIBLY_LARGE_TURN; ///< a number that's almost assuredly larger than any real turn number that might come up - -/* add additional accessors here for app specific things - that are needed for both the server and the client, but for which - access will vary and requires an #ifdef */ - class IApp { public: virtual ~IApp(); @@ -110,4 +54,87 @@ IApp(const IApp&); // disabled }; +/** Accessor for the App's empire manager */ +inline EmpireManager& Empires() +{ return IApp::GetApp()->Empires(); } + +/** Accessor for the App's universe object */ +inline Universe& GetUniverse() +{ return IApp::GetApp()->GetUniverse(); } + +/** Accessor for all (on server) or all known (on client) objects ObjectMap */ +inline ObjectMap& Objects() +{ return IApp::GetApp()->GetUniverse().Objects(); } + +/** Accessor for known objects of specified empire. */ +inline ObjectMap& EmpireKnownObjects(int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id); } + +/** Accessor for individual objects. */ +inline UniverseObject* GetUniverseObject(int object_id) +{ return IApp::GetApp()->GetUniverseObject(object_id); } + +inline UniverseObject* GetEmpireKnownObject(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObject(object_id, empire_id); } + +inline Planet* GetPlanet(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<Planet>(object_id); } + +inline Planet* GetEmpireKnownPlanet(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<Planet>(object_id); } + +inline System* GetSystem(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<System>(object_id); } + +inline System* GetEmpireKnownSystem(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<System>(object_id); } + +inline Field* GetField(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<Field>(object_id); } + +inline Field* GetEmpireKnownField(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<Field>(object_id); } + +inline Ship* GetShip(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<Ship>(object_id); } + +inline Ship* GetEmpireKnownShip(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<Ship>(object_id); } + +inline Fleet* GetFleet(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<Fleet>(object_id); } + +inline Fleet* GetEmpireKnownFleet(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<Fleet>(object_id); } + +inline Building* GetBuilding(int object_id) +{ return IApp::GetApp()->GetUniverse().Objects().Object<Building>(object_id); } + +inline Building* GetEmpireKnownBuilding(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id).Object<Building>(object_id); } + +/** Returns the object name of the universe object. This can be apperant object + * name, if the application isn't supposed to see the real object name. */ +inline std::string GetVisibleObjectName(const UniverseObject* object) +{ return IApp::GetApp()->GetVisibleObjectName(object); } + +/** Returns a new object ID from the server */ +inline int GetNewObjectID() +{ return IApp::GetApp()->GetNewObjectID(); } + +/** Returns a new object ID from the server */ +inline int GetNewDesignID() +{ return IApp::GetApp()->GetNewDesignID(); } + +/** Returns current game turn. This is >= 1 during a game, BEFORE_FIRST_TURN during galaxy setup, or is + INVALID_GAME_TURN at other times */ +inline int CurrentTurn() +{ return IApp::GetApp()->CurrentTurn(); } + +// sentinel values returned by CurrentTurn(). Can't be an enum since CurrentGameTurn() needs to return an integer +// game turn number +extern const int INVALID_GAME_TURN; ///< returned by CurrentGameTurn if a game is not currently in progress or being set up. +extern const int BEFORE_FIRST_TURN; ///< returned by CurrentGameTurn if the galaxy is currently being set up +extern const int IMPOSSIBLY_LARGE_TURN; ///< a number that's almost assuredly larger than any real turn number that might come up + #endif // _AppInterface_h_ |
From: <mar...@us...> - 2014-01-11 11:15:34
|
Revision: 6625 http://sourceforge.net/p/freeorion/code/6625 Author: marcel_metz Date: 2014-01-11 11:15:30 +0000 (Sat, 11 Jan 2014) Log Message: ----------- Move process implementation detail into source file. Modified Paths: -------------- trunk/FreeOrion/util/Process.cpp trunk/FreeOrion/util/Process.h Modified: trunk/FreeOrion/util/Process.cpp =================================================================== --- trunk/FreeOrion/util/Process.cpp 2014-01-11 09:37:06 UTC (rev 6624) +++ trunk/FreeOrion/util/Process.cpp 2014-01-11 11:15:30 UTC (rev 6625) @@ -6,13 +6,42 @@ #include <stdexcept> +// assume Linux environment by default +#if (!defined(FREEORION_WIN32) && !defined(FREEORION_LINUX) && !defined(FREEORION_MACOSX)) +#define FREEORION_LINUX +#endif + +#ifdef FREEORION_WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + +class Process::Impl { +public: + Impl(const std::string& cmd, const std::vector<std::string>& argv); + ~Impl(); + + bool SetLowPriority(bool low); + void Kill(); + void Free(); + +private: + bool m_free; +#if defined(FREEORION_WIN32) + STARTUPINFO m_startup_info; + PROCESS_INFORMATION m_process_info; +#elif defined(FREEORION_LINUX) || defined(FREEORION_MACOSX) + pid_t m_process_id; +#endif +}; + Process::Process() : m_empty(true), m_low_priority(false) {} Process::Process(const std::string& cmd, const std::vector<std::string>& argv) : - m_impl(new ProcessImpl(cmd, argv)), + m_impl(new Impl(cmd, argv)), m_empty(false), m_low_priority(false) {} @@ -52,7 +81,7 @@ #if defined(FREEORION_WIN32) -Process::ProcessImpl::ProcessImpl(const std::string& cmd, const std::vector<std::string>& argv) : +Process::Impl::Impl(const std::string& cmd, const std::vector<std::string>& argv) : m_free(false) { std::string args; @@ -81,17 +110,17 @@ WaitForInputIdle(m_process_info.hProcess, 1000); // wait for process to finish setting up, or for 1 sec, which ever comes first } -Process::ProcessImpl::~ProcessImpl() +Process::Impl::~Impl() { if (!m_free) Kill(); } -bool Process::ProcessImpl::SetLowPriority(bool low) { +bool Process::Impl::SetLowPriority(bool low) { if (low) return (SetPriorityClass(m_process_info.hProcess, BELOW_NORMAL_PRIORITY_CLASS) != 0); else return (SetPriorityClass(m_process_info.hProcess, NORMAL_PRIORITY_CLASS) != 0); } -void Process::ProcessImpl::Kill() { +void Process::Impl::Kill() { if (m_process_info.hProcess && !TerminateProcess(m_process_info.hProcess, 0)) { std::string err_str; DWORD err = GetLastError(); @@ -102,7 +131,7 @@ LocalFree(buf); } boost::algorithm::trim(err_str); - Logger().errorStream() << "Process::ProcessImpl::Kill : Error terminating process: " << err_str; + Logger().errorStream() << "Process::Impl::Kill : Error terminating process: " << err_str; } if (m_process_info.hProcess && !CloseHandle(m_process_info.hProcess)) { @@ -115,7 +144,7 @@ LocalFree(buf); } boost::algorithm::trim(err_str); - Logger().errorStream() << "Process::ProcessImpl::Kill : Error closing process handle: " << err_str; + Logger().errorStream() << "Process::Impl::Kill : Error closing process handle: " << err_str; } if (m_process_info.hThread && !CloseHandle(m_process_info.hThread)) { @@ -128,7 +157,7 @@ LocalFree(buf); } boost::algorithm::trim(err_str); - Logger().errorStream() << "Process::ProcessImpl::Kill : Error closing thread handle: " << err_str; + Logger().errorStream() << "Process::Impl::Kill : Error closing thread handle: " << err_str; } m_process_info.hProcess = 0; @@ -146,7 +175,7 @@ #include <sys/wait.h> -Process::ProcessImpl::ProcessImpl(const std::string& cmd, const std::vector<std::string>& argv) : +Process::Impl::Impl(const std::string& cmd, const std::vector<std::string>& argv) : m_free(false) { std::vector<char*> args; @@ -173,17 +202,17 @@ } } -Process::ProcessImpl::~ProcessImpl() +Process::Impl::~Impl() { if (!m_free) Kill(); } -bool Process::ProcessImpl::SetLowPriority(bool low) { +bool Process::Impl::SetLowPriority(bool low) { if (low) return (setpriority(PRIO_PROCESS, m_process_id, 10) == 0); else return (setpriority(PRIO_PROCESS, m_process_id, 0) == 0); } -void Process::ProcessImpl::Kill() { +void Process::Impl::Kill() { int status; kill(m_process_id, SIGHUP); waitpid(m_process_id, &status, 0); @@ -191,5 +220,5 @@ #endif -void Process::ProcessImpl::Free() +void Process::Impl::Free() { m_free = true; } Modified: trunk/FreeOrion/util/Process.h =================================================================== --- trunk/FreeOrion/util/Process.h 2014-01-11 09:37:06 UTC (rev 6624) +++ trunk/FreeOrion/util/Process.h 2014-01-11 11:15:30 UTC (rev 6625) @@ -9,17 +9,7 @@ #include "Export.h" -// assume Linux environment by default -#if (!defined(FREEORION_WIN32) && !defined(FREEORION_LINUX) && !defined(FREEORION_MACOSX)) -#define FREEORION_LINUX -#endif - -#ifdef FREEORION_WIN32 -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#endif - -/** encapsulates a spawned child process in a platform-independent manner. A Process object holds a shared_ptr to the +/** Encapsulates a spawned child process in a platform-independent manner. A Process object holds a shared_ptr to the data on the process it creates; therefore Process objects can be freely copied, with the same copy semantics as a shared_ptr. In addition, the created process is automatically killed when its owning Process object is destroyed, unless it is explicitly Free()d. Note that whether or not the process is explicitly Free()d, it may be @@ -66,28 +56,11 @@ //@} private: - class ProcessImpl { - public: - ProcessImpl(const std::string& cmd, const std::vector<std::string>& argv); - ~ProcessImpl(); + class Impl; - bool SetLowPriority(bool low); - void Kill(); - void Free(); - - private: - bool m_free; - #if defined(FREEORION_WIN32) - STARTUPINFO m_startup_info; - PROCESS_INFORMATION m_process_info; - #elif defined(FREEORION_LINUX) || defined(FREEORION_MACOSX) - pid_t m_process_id; - #endif - }; - - boost::shared_ptr<ProcessImpl> m_impl; - bool m_empty; ///< true iff this is a default-constructed Process (no associated process exists) - bool m_low_priority; ///< true if this process is set to low priority + boost::shared_ptr<Impl> m_impl; + bool m_empty; ///< true iff this is a default-constructed Process (no associated process exists) + bool m_low_priority; ///< true if this process is set to low priority }; #endif // _Process_h_ |
From: <geo...@us...> - 2014-01-13 18:44:14
|
Revision: 6638 http://sourceforge.net/p/freeorion/code/6638 Author: geoffthemedio Date: 2014-01-13 18:44:11 +0000 (Mon, 13 Jan 2014) Log Message: ----------- -Changed stringtable data to be stored in a map, indexed by filename from which it is looked up when getting a UserString. Consequently, if the stringtable is changed while the program is running, future UserString lookups will use the newly-specified stringtable. -Added an as-yet-unused function FlushLoadedStringTables, which clears the stored stingtable data so that it will be reloaded on the next lookup. This could be useful to refresh the stored strings after a stringtable edit while the program is running. Modified Paths: -------------- trunk/FreeOrion/util/i18n.cpp trunk/FreeOrion/util/i18n.h Modified: trunk/FreeOrion/util/i18n.cpp =================================================================== --- trunk/FreeOrion/util/i18n.cpp 2014-01-13 08:56:22 UTC (rev 6637) +++ trunk/FreeOrion/util/i18n.cpp 2014-01-13 18:44:11 UTC (rev 6638) @@ -17,17 +17,31 @@ return option_filename; } - const StringTable_& GetStringTable() { - static std::auto_ptr<StringTable_> string_table( - new StringTable_(GetStringTableFileName())); - return *string_table; + std::map<std::string, const StringTable_*> stringtables; + + void FlushLoadedStringTables() + { stringtables.clear(); } + + const StringTable_& GetStringTable(std::string stringtable_filename = "") { + // get option-configured stringtable if no filename specified + if (stringtable_filename.empty()) + stringtable_filename = GetStringTableFileName(); + + // attempt to find requested stringtable... + std::map<std::string, const StringTable_*>::const_iterator it = + stringtables.find(stringtable_filename); + if (it != stringtables.end()) + return *(it->second); + + // if already loaded, load, store, and return + const StringTable_* table = new StringTable_(stringtable_filename); + stringtables[stringtable_filename] = table; + + return *table; } - const StringTable_& GetDefaultStringTable() { - static std::auto_ptr<StringTable_> default_string_table( - new StringTable_(GetDefaultStringTableFileName())); - return *default_string_table; - } + const StringTable_& GetDefaultStringTable() + { return GetStringTable(GetDefaultStringTableFileName()); } } const std::string& UserString(const std::string& str) { Modified: trunk/FreeOrion/util/i18n.h =================================================================== --- trunk/FreeOrion/util/i18n.h 2014-01-13 08:56:22 UTC (rev 6637) +++ trunk/FreeOrion/util/i18n.h 2014-01-13 18:44:11 UTC (rev 6638) @@ -15,6 +15,10 @@ /** Returns a language-specific list of strings for the key-string \a str_list */ FO_COMMON_API void UserStringList(const std::string& str_list, std::list<std::string>& strings); +/** Clears all loaded strings, so that subsequent UserString lookups will cause + * the stringtable(s) to be reloaded. */ +FO_COMMON_API void FlushLoadedStringTables(); + /** Placeholder for non local translations, evaluates to a non operation */ #define UserStringNop(key) key |
From: <geo...@us...> - 2014-01-23 23:12:59
|
Revision: 6666 http://sourceforge.net/p/freeorion/code/6666 Author: geoffthemedio Date: 2014-01-23 23:12:56 +0000 (Thu, 23 Jan 2014) Log Message: ----------- Give object to empire Order. Modified Paths: -------------- trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h trunk/FreeOrion/util/SerializeOrderSet.cpp Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2014-01-23 23:12:02 UTC (rev 6665) +++ trunk/FreeOrion/util/Order.cpp 2014-01-23 23:12:56 UTC (rev 6666) @@ -54,7 +54,6 @@ bool Order::UndoImpl() const { return false; } - //////////////////////////////////////////////// // RenameOrder //////////////////////////////////////////////// @@ -107,7 +106,6 @@ obj->Rename(m_name); } - //////////////////////////////////////////////// // CreateFleetOrder //////////////////////////////////////////////// @@ -208,7 +206,6 @@ system->StateChangedSignal(); } - //////////////////////////////////////////////// // FleetMoveOrder //////////////////////////////////////////////// @@ -328,7 +325,6 @@ fleet->SetRoute(route_list); } - //////////////////////////////////////////////// // FleetTransferOrder //////////////////////////////////////////////// @@ -417,7 +413,6 @@ target_fleet->AddShips(validated_ship_ids); } - //////////////////////////////////////////////// // ColonizeOrder //////////////////////////////////////////////// @@ -529,7 +524,6 @@ return true; } - //////////////////////////////////////////////// // InvadeOrder //////////////////////////////////////////////// @@ -630,7 +624,6 @@ return true; } - //////////////////////////////////////////////// // BombardOrder //////////////////////////////////////////////// @@ -723,7 +716,6 @@ return true; } - //////////////////////////////////////////////// // DeleteFleetOrder //////////////////////////////////////////////// @@ -762,7 +754,6 @@ GetUniverse().Destroy(FleetID()); } - //////////////////////////////////////////////// // ChangeFocusOrder //////////////////////////////////////////////// @@ -1141,3 +1132,50 @@ fleet->SetAggressive(m_aggression); } } + +///////////////////////////////////////////////////// +// GiveObjectToEmpireOrder +///////////////////////////////////////////////////// +GiveObjectToEmpireOrder::GiveObjectToEmpireOrder() : + Order(), + m_object_id(INVALID_OBJECT_ID), + m_recipient_empire_id(ALL_EMPIRES) +{} + +GiveObjectToEmpireOrder::GiveObjectToEmpireOrder(int empire, int object_id, int recipient) : + Order(), + m_object_id(INVALID_OBJECT_ID), + m_recipient_empire_id(ALL_EMPIRES) +{} + +void GiveObjectToEmpireOrder::ExecuteImpl() const { + ValidateEmpireID(); + int empire_id = EmpireID(); + + if (TemporaryPtr<Ship> ship = GetShip(m_object_id)) { + if (ship->OwnedBy(empire_id)) + ship->SetGiveToEmpire(m_recipient_empire_id); + } else if (TemporaryPtr<Planet> planet = GetPlanet(m_object_id)) { + if (planet->OwnedBy(empire_id)) + planet->SetGiveToEmpire(m_recipient_empire_id); + } +} + +bool GiveObjectToEmpireOrder::UndoImpl() const { + ValidateEmpireID(); + int empire_id = EmpireID(); + + if (TemporaryPtr<Ship> ship = GetShip(m_object_id)) { + if (ship->OwnedBy(empire_id)) { + ship->ClearGiveToEmpire(); + return true; + } + } else if (TemporaryPtr<Planet> planet = GetPlanet(m_object_id)) { + if (planet->OwnedBy(empire_id)) { + planet->ClearGiveToEmpire(); + return true; + } + } + return false; +} + Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2014-01-23 23:12:02 UTC (rev 6665) +++ trunk/FreeOrion/util/Order.h 2014-01-23 23:12:56 UTC (rev 6666) @@ -628,6 +628,44 @@ void serialize(Archive& ar, const unsigned int version); }; + +///////////////////////////////////////////////////// +// GiveObjectToEmpireOrder +///////////////////////////////////////////////////// +/** the Order subclass that represents giving control of a ship to + * another empire */ +class FO_COMMON_API GiveObjectToEmpireOrder : public Order { +public: + /** \name Structors */ //@{ + GiveObjectToEmpireOrder(); + GiveObjectToEmpireOrder(int empire, int object_id, int recipient); + //@} + + /** \name Accessors */ //@{ + int ObjectID() const { return m_object_id; } ///< returns ID of object selected in this order + int RecipientEmpireID() { return m_recipient_empire_id; } ///< returns ID of empire to which object is given + //@} + +private: + /** + * Preconditions: + * - m_object_id must be the ID of an object owned by issuing empire + * - m_recipient_empire_id must be the ID of another empire + * + * Postconditions: + * - the object's ownership is set to the other empire + */ + virtual void ExecuteImpl() const; + virtual bool UndoImpl() const; + + int m_object_id; + int m_recipient_empire_id; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + // Note: *::serialize() implemented in SerializeOrderSet.cpp. #endif // _Order_h_ Modified: trunk/FreeOrion/util/SerializeOrderSet.cpp =================================================================== --- trunk/FreeOrion/util/SerializeOrderSet.cpp 2014-01-23 23:12:02 UTC (rev 6665) +++ trunk/FreeOrion/util/SerializeOrderSet.cpp 2014-01-23 23:12:56 UTC (rev 6666) @@ -169,6 +169,14 @@ & BOOST_SERIALIZATION_NVP(m_aggression); } +template <class Archive> +void GiveObjectToEmpireOrder::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Order) + & BOOST_SERIALIZATION_NVP(m_object_id) + & BOOST_SERIALIZATION_NVP(m_recipient_empire_id); +} + void Serialize(freeorion_oarchive& oa, const OrderSet& order_set) { oa << BOOST_SERIALIZATION_NVP(order_set); } |
From: <geo...@us...> - 2014-01-24 00:15:55
|
Revision: 6668 http://sourceforge.net/p/freeorion/code/6668 Author: geoffthemedio Date: 2014-01-24 00:15:41 +0000 (Fri, 24 Jan 2014) Log Message: ----------- -Inhibited signals while setting ship fleet id in FleetTransferOrder::ExecuteImpl. Subsequent state change signals of fleets should suffice for UI updates. This might speed up some fleet manipulations in the human client. -grooming Modified Paths: -------------- trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2014-01-24 00:02:22 UTC (rev 6667) +++ trunk/FreeOrion/util/Order.cpp 2014-01-24 00:15:41 UTC (rev 6668) @@ -378,6 +378,7 @@ return; } + GetUniverse().InhibitUniverseObjectSignals(true); // iterate down the ship vector check validity of each std::vector<int> validated_ship_ids; @@ -411,6 +412,10 @@ // set fleet records source_fleet->RemoveShips(validated_ship_ids); target_fleet->AddShips(validated_ship_ids); + + GetUniverse().InhibitUniverseObjectSignals(false); + source_fleet->StateChangedSignal(); + target_fleet->StateChangedSignal(); } //////////////////////////////////////////////// Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2014-01-24 00:02:22 UTC (rev 6667) +++ trunk/FreeOrion/util/Order.h 2014-01-24 00:15:41 UTC (rev 6668) @@ -115,7 +115,7 @@ public: /** \name Structors */ //@{ NewFleetOrder(); - explicit NewFleetOrder(int empire, const std::string& fleet_name, int fleet_id, int system_id, const std::vector<int>& ship_ids); + NewFleetOrder(int empire, const std::string& fleet_name, int fleet_id, int system_id, const std::vector<int>& ship_ids); //@} /** \name Accessors */ //@{ @@ -131,7 +131,7 @@ * None. * * Postconditions: - * - a new fleet will exist either in system m_system_id, + * - a new fleet will exist in system with id m_system_id, * and will belong to the creating empire. */ virtual void ExecuteImpl() const; @@ -206,7 +206,7 @@ /** \name Accessors */ //@{ int SourceFleet() const {return m_fleet_from;} ///< returns ID of the fleet the ships will come from - int DestinationFleet() const {return m_fleet_to;} ///< returns ID of the fleet that the ships will go into + int DestinationFleet() const {return m_fleet_to;} ///< returns ID of the fleet that the ships will go into const std::vector<int>& Ships() const {return m_add_ships;} ///< returns IDs of the ships selected for addition to the fleet //@} |
From: <geo...@us...> - 2014-04-28 16:29:11
|
Revision: 7106 http://sourceforge.net/p/freeorion/code/7106 Author: geoffthemedio Date: 2014-04-28 16:29:07 +0000 (Mon, 28 Apr 2014) Log Message: ----------- Patch by Mitten.O allowing multiple VarText references of the same type, with labels to disambiguate. Modified Paths: -------------- trunk/FreeOrion/util/VarText.cpp trunk/FreeOrion/util/VarText.h Modified: trunk/FreeOrion/util/VarText.cpp =================================================================== --- trunk/FreeOrion/util/VarText.cpp 2014-04-27 19:38:03 UTC (rev 7105) +++ trunk/FreeOrion/util/VarText.cpp 2014-04-28 16:29:07 UTC (rev 7106) @@ -8,8 +8,12 @@ #include "i18n.h" #include "Logger.h" +#include <boost/static_assert.hpp> +#include <boost/algorithm/string.hpp> #include <boost/spirit/include/classic.hpp> +#include <map> + // Forward declarations class Tech; class BuildingType; @@ -25,7 +29,157 @@ namespace { const std::string START_VAR("%"); const std::string END_VAR("%"); + const std::string LABEL_SEPARATOR(":"); + ////////////////////////////////////////// + ///// Tag substitution generators//////// + //////////////////////////////////////// + + /// Surround content with approprite tags based on tag_of + std::string WithTags(const std::string& content, const std::string& tag, const XMLElement& data) { + std::string open_tag = "<" + tag + " " + data.Attribute("value") + ">"; + std::string close_tag = "</" + tag + ">"; + return open_tag + content + close_tag; + } + + /// The signature of functions that generate substitution strings for + /// tags. + typedef std::string (*TagString)(const XMLElement& data, const std::string& tag, bool& valid); + + /// Get string substitute for a translated text tag + std::string TextString(const XMLElement& data, const std::string& tag, bool& valid) { + const std::string& text = data.Attribute("value"); + return UserString(text); + } + + /// Get string substitute for a raw text tag + std::string RawTextString(const XMLElement& data, const std::string& tag, bool& valid) { + const std::string& text = data.Attribute("value"); + return text; + } + + ///Get string substitute for a tag that is a universe object + std::string UniverseObjectString(const XMLElement& data, const std::string& tag, bool& valid) { + int object_id = INVALID_OBJECT_ID; + try { + object_id = boost::lexical_cast<int>(data.Attribute("value")); + } catch (const std::exception&) { + Logger().errorStream() << "UniverseObjectString couldn't cast \"" << data.Attribute("value") << "\" to int for object ID."; + valid = false; + return UserString("ERROR"); + } + TemporaryPtr<const UniverseObject> obj = GetUniverseObject(object_id); + if (!obj) { + //Logger().errorStream() << "UniverseObjectString couldn't get object with ID " << object_id; + valid = false; + return UserString("ERROR"); + } + + return WithTags(GetVisibleObjectName(obj), tag, data); + } + + /// combat links always just labelled "Combat"; don't need to look up details + std::string CombatLogString(const XMLElement& data, const std::string& tag, bool& valid) { + return WithTags(UserString("COMBAT"), tag, data); + } + + /// Returns substitution string for a ship design tag + std::string ShipDesignString(const XMLElement& data, const std::string& tag, bool& valid) { + int design_id = ShipDesign::INVALID_DESIGN_ID; + try { + design_id = boost::lexical_cast<int>(data.Attribute("value")); + } catch (const std::exception&) { + Logger().errorStream() << "SubstituteAndAppend couldn't cast \"" << data.Attribute("value") << "\" to int for ship design ID."; + valid = false; + return UserString("ERROR"); + } + const ShipDesign* design = GetShipDesign(design_id); + if (!design) { + Logger().errorStream() << "SubstituteAndAppend couldn't get ship design with ID " << design_id; + valid = false; + return UserString("ERROR"); + } + return WithTags(design->Name(), tag, data); + } + + /// Returns substitution string for a predefined ship design tag + std::string PredefinedShipDesignString(const XMLElement& data, const std::string& tag, bool& valid) { + const std::string& design_name = data.Attribute("value"); + const ShipDesign* design = GetPredefinedShipDesign(design_name); + if (!design) { + Logger().errorStream() << "SubstituteAndAppend couldn't get predefined ship design with name " << design_name; + valid = false; + return UserString("ERROR"); + } + return WithTags(design->Name(), tag, data); + } + + /// Returns substitution string for an empire tag + std::string EmpireString(const XMLElement& data, const std::string& tag, bool& valid) { + int empire_id = ALL_EMPIRES; + try { + empire_id = boost::lexical_cast<int>(data.Attribute("value")); + } catch (const std::exception&) { + Logger().errorStream() << "SubstituteAndAppend couldn't cast \"" << data.Attribute("value") << "\" to int for empire ID."; + valid = false; + return UserString("ERROR"); + } + const Empire* empire = Empires().Lookup(empire_id); + if (!empire) { + Logger().errorStream() << "SubstituteAndAppend couldn't get empire with ID " << empire_id; + valid = false; + return UserString("ERROR"); + } + return WithTags(empire->Name(), tag, data); + } + + /// Interprets value of data as a name. + /// Returns translation of name, if Get says + /// that a thing by that name exists, otherwise ERROR. + template <typename T,const T* (*GetByName)(const std::string&)> + std::string NameString(const XMLElement& data, const std::string& tag, bool& valid) { + std::string name = data.Attribute("value"); + if (!GetByName(name)) { + valid = false; + return UserString("ERROR"); + } + return WithTags(UserString(name), tag, data); + } + + /// Returns a map that tells shich function should be used to + /// generate a substitution for which tag. + std::map<std::string, TagString> CreateSubstituterMap() { + std::map<std::string, TagString> subs; + subs[VarText::TEXT_TAG] = TextString; + subs[VarText::RAW_TEXT_TAG] = RawTextString; + + subs[VarText::PLANET_ID_TAG] = + subs[VarText::SYSTEM_ID_TAG] = + subs[VarText::SHIP_ID_TAG] = + subs[VarText::FLEET_ID_TAG] = + subs[VarText::BUILDING_ID_TAG] = + subs[VarText::FIELD_ID_TAG] = UniverseObjectString; + subs[VarText::COMBAT_ID_TAG] = CombatLogString; + subs[VarText::TECH_TAG] = NameString<Tech, GetTech>; + subs[VarText::BUILDING_TYPE_TAG] = NameString<BuildingType, GetBuildingType>; + subs[VarText::SHIP_HULL_TAG] = NameString<HullType, GetHullType>; + subs[VarText::SHIP_PART_TAG] = NameString<PartType, GetPartType>; + subs[VarText::SPECIAL_TAG] = NameString<Special, GetSpecial>; + subs[VarText::SPECIES_TAG] = NameString<Species, GetSpecies>; + subs[VarText::FIELD_TYPE_TAG] = NameString<FieldType, GetFieldType>; + subs[VarText::DESIGN_ID_TAG] = ShipDesignString; + subs[VarText::PREDEFINED_DESIGN_TAG] = PredefinedShipDesignString; + subs[VarText::EMPIRE_ID_TAG] = EmpireString; + return subs; + } + + /// Global substitution map, wrapped in a function to avoid initialization order issues + const std::map<std::string, TagString>& SubstitutionMap() { + static std::map<std::string, TagString> subs = CreateSubstituterMap(); + return subs; + } + + /** Converts (first, last) to a string, looks up its value in the Universe, * then appends this to the end of a std::string. */ struct SubstituteAndAppend { @@ -37,191 +191,46 @@ void operator()(const char* first, const char* last) const { std::string token(first, last); - + // special case: "%%" is interpreted to be a '%' character if (token.empty()) { m_str += "%"; return; } + + // Labelled tokens have the form %tag:label%, unlabelled are just %tag% + std::vector<std::string> pieces; + boost::split(pieces, token, boost::is_any_of(LABEL_SEPARATOR)); + + std::string tag; //< The tag of the token (the type) + std::string label; //< The label of the token (the kay to fetch data by) + if (pieces.size() == 1) { + // No separator. There is only a tag. The tag is the default label + tag = token; + label = token; + } else if(pieces.size() == 2) { + // Had a separator + tag = pieces[0]; + label = pieces[1]; + } // look up child - if (!m_variables.ContainsChild(token)) { + if (!m_variables.ContainsChild(label)) { m_str += UserString("ERROR"); m_valid = false; return; } + + const XMLElement& token_elem = m_variables.Child(label); - const XMLElement& token_elem = m_variables.Child(token); - - // stringtable text substitution token - if (token == VarText::TEXT_TAG) { - const std::string& text = token_elem.Attribute("value"); - m_str += UserString(text); - return; - } else if (token == VarText::RAW_TEXT_TAG) { - const std::string& text = token_elem.Attribute("value"); - m_str += text; - return; + std::map<std::string, TagString>::const_iterator substituter = SubstitutionMap().find(tag); + if (substituter != SubstitutionMap().end()) { + m_str += substituter->second(token_elem, tag, m_valid); + } else { + Logger().errorStream() << "SubstituteAndAppend::operator(): No substitution scheme defined for tag: " << tag << " from token: " << token; + m_str += UserString("ERROR"); + m_valid = false; } - - std::string open_tag = "<" + token_elem.Tag() + " " + token_elem.Attribute("value") + ">"; - std::string close_tag = "</" + token_elem.Tag() + ">"; - - // universe object token types - if (token == VarText::PLANET_ID_TAG || - token == VarText::SYSTEM_ID_TAG || - token == VarText::SHIP_ID_TAG || - token == VarText::FLEET_ID_TAG || - token == VarText::BUILDING_ID_TAG || - token == VarText::FIELD_ID_TAG) - { - int object_id = INVALID_OBJECT_ID; - try { - object_id = boost::lexical_cast<int>(token_elem.Attribute("value")); - } catch (const std::exception&) { - Logger().errorStream() << "SubstituteAndAppend couldn't cast \"" << token_elem.Attribute("value") << "\" to int for object ID."; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - TemporaryPtr<const UniverseObject> obj = GetUniverseObject(object_id); - if (!obj) { - //Logger().errorStream() << "SubstituteAndAppend couldn't get object with ID " << object_id; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - - std::string name_text = GetVisibleObjectName(obj); - m_str += open_tag + name_text + close_tag; - - // combat log - } else if (token == VarText::COMBAT_ID_TAG) { - // combat links always just labelled "Combat"; don't need to look up details - m_str += open_tag + UserString("COMBAT") + close_tag; - - // technology token - } else if (token == VarText::TECH_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetTech(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // building type token - } else if (token == VarText::BUILDING_TYPE_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetBuildingType(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // ship hull token - } else if (token == VarText::SHIP_HULL_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetHullType(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // ship part token - } else if (token == VarText::SHIP_PART_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetPartType(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // special token - } else if (token == VarText::SPECIAL_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetSpecial(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // species token - } else if (token == VarText::SPECIES_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetSpecies(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // field type token - } else if (token == VarText::FIELD_TYPE_TAG) { - std::string name = token_elem.Attribute("value"); - if (!GetFieldType(name)) { - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + UserString(name) + close_tag; - - // ship design token - } else if (token == VarText::DESIGN_ID_TAG) { - int design_id = ShipDesign::INVALID_DESIGN_ID; - try { - design_id = boost::lexical_cast<int>(token_elem.Attribute("value")); - } catch (const std::exception&) { - Logger().errorStream() << "SubstituteAndAppend couldn't cast \"" << token_elem.Attribute("value") << "\" to int for ship design ID."; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - const ShipDesign* design = GetShipDesign(design_id); - if (!design) { - Logger().errorStream() << "SubstituteAndAppend couldn't get ship design with ID " << design_id; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + design->Name() + close_tag; - - // predefined ship design token - } else if (token == VarText::PREDEFINED_DESIGN_TAG) { - const std::string& design_name = token_elem.Attribute("value"); - const ShipDesign* design = GetPredefinedShipDesign(design_name); - if (!design) { - Logger().errorStream() << "SubstituteAndAppend couldn't get predefined ship design with name " << design_name; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + design->Name() + close_tag; - - // empire token - } else if (token == VarText::EMPIRE_ID_TAG) { - int empire_id = ALL_EMPIRES; - try { - empire_id = boost::lexical_cast<int>(token_elem.Attribute("value")); - } catch (const std::exception&) { - Logger().errorStream() << "SubstituteAndAppend couldn't cast \"" << token_elem.Attribute("value") << "\" to int for empire ID."; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - const Empire* empire = Empires().Lookup(empire_id); - if (!empire) { - Logger().errorStream() << "SubstituteAndAppend couldn't get empire with ID " << empire_id; - m_str += UserString("ERROR"); - m_valid = false; - return; - } - m_str += open_tag + empire->Name() + close_tag; - } } const XMLElement& m_variables; Modified: trunk/FreeOrion/util/VarText.h =================================================================== --- trunk/FreeOrion/util/VarText.h 2014-04-27 19:38:03 UTC (rev 7105) +++ trunk/FreeOrion/util/VarText.h 2014-04-28 16:29:07 UTC (rev 7106) @@ -22,10 +22,16 @@ * the tag name of "planet" and substitute the name of the planet in the game * universe with the appropriate ID number that is stored in that VarText * entry. + * + * If you need to use more than one item of the same type, you must label + * the tags. For example: %planet:my_planet% crashed into %planet:other_planet%. + * That will look for the xml elements "my_planet" and "other_planet" and + * do the planet lookup for them. * * An example of VarText implementation are SitReps. They are created by the * server which knows nothing about what the final string will look like. - * ClientUI.cpp ultimately generates a string from the variables. */ + * ClientUI.cpp ultimately generates a string from the variables. + */ class FO_COMMON_API VarText { public: /** \name Structors */ //@{ |
From: <geo...@us...> - 2014-05-11 19:07:12
|
Revision: 7116 http://sourceforge.net/p/freeorion/code/7116 Author: geoffthemedio Date: 2014-05-11 19:07:09 +0000 (Sun, 11 May 2014) Log Message: ----------- Removed some unnecessary include path specifications. Modified Paths: -------------- trunk/FreeOrion/util/SaveGamePreviewUtils.cpp trunk/FreeOrion/util/SaveGamePreviewUtils.h Modified: trunk/FreeOrion/util/SaveGamePreviewUtils.cpp =================================================================== --- trunk/FreeOrion/util/SaveGamePreviewUtils.cpp 2014-05-08 14:28:18 UTC (rev 7115) +++ trunk/FreeOrion/util/SaveGamePreviewUtils.cpp 2014-05-11 19:07:09 UTC (rev 7116) @@ -4,12 +4,12 @@ #include "SaveGamePreviewUtils.h" -#include "../util/i18n.h" -#include "../util/Directories.h" -#include "../util/Logger.h" -#include "../util/MultiplayerCommon.h" -#include "../util/EnumText.h" -#include "../util/Serialize.h" +#include "i18n.h" +#include "Directories.h" +#include "Logger.h" +#include "MultiplayerCommon.h" +#include "EnumText.h" +#include "Serialize.h" #include "Serialize.ipp" #include <boost/lexical_cast.hpp> Modified: trunk/FreeOrion/util/SaveGamePreviewUtils.h =================================================================== --- trunk/FreeOrion/util/SaveGamePreviewUtils.h 2014-05-08 14:28:18 UTC (rev 7115) +++ trunk/FreeOrion/util/SaveGamePreviewUtils.h 2014-05-11 19:07:09 UTC (rev 7116) @@ -12,8 +12,8 @@ #include <GG/Clr.h> -#include "../util/MultiplayerCommon.h" -#include "../util/Export.h" +#include "MultiplayerCommon.h" +#include "Export.h" namespace boost { namespace filesystem { class path; } } namespace boost { namespace serialization { class access; } } |
From: <geo...@us...> - 2015-03-04 20:08:09
|
Revision: 8013 http://sourceforge.net/p/freeorion/code/8013 Author: geoffthemedio Date: 2015-03-04 20:08:06 +0000 (Wed, 04 Mar 2015) Log Message: ----------- -Added UserStringExists function that checks if there is any UserString entry for a specified key. -grooming Modified Paths: -------------- trunk/FreeOrion/util/i18n.cpp trunk/FreeOrion/util/i18n.h Modified: trunk/FreeOrion/util/i18n.cpp =================================================================== --- trunk/FreeOrion/util/i18n.cpp 2015-03-04 18:53:38 UTC (rev 8012) +++ trunk/FreeOrion/util/i18n.cpp 2015-03-04 20:08:06 UTC (rev 8013) @@ -45,11 +45,9 @@ { stringtables.clear(); } const std::string& UserString(const std::string& str) { - const StringTable_& string_table = GetStringTable(); - if (string_table.StringExists(str)) + if (GetStringTable().StringExists(str)) return GetStringTable().String(str); - else - return GetDefaultStringTable().String(str); + return GetDefaultStringTable().String(str); } void UserStringList(const std::string& str_list, std::list<std::string>& strings) { @@ -60,6 +58,12 @@ } } +bool UserStringExists(const std::string& str) { + if (GetStringTable().StringExists(str)) + return true; + return GetDefaultStringTable().StringExists(str); +} + boost::format FlexibleFormat(const std::string &string_to_format) { try { boost::format retval(string_to_format); Modified: trunk/FreeOrion/util/i18n.h =================================================================== --- trunk/FreeOrion/util/i18n.h 2015-03-04 18:53:38 UTC (rev 8012) +++ trunk/FreeOrion/util/i18n.h 2015-03-04 20:08:06 UTC (rev 8013) @@ -15,6 +15,9 @@ /** Returns a language-specific list of strings for the key-string \a str_list */ FO_COMMON_API void UserStringList(const std::string& str_list, std::list<std::string>& strings); +/** Returns true iff a user-string exists for the key string \a str */ +FO_COMMON_API bool UserStringExists(const std::string& str); + /** Clears all loaded strings, so that subsequent UserString lookups will cause * the stringtable(s) to be reloaded. */ FO_COMMON_API void FlushLoadedStringTables(); |