From: <geo...@us...> - 2008-08-05 08:07:42
|
Revision: 2651 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2651&view=rev Author: geoffthemedio Date: 2008-08-05 08:07:51 +0000 (Tue, 05 Aug 2008) Log Message: ----------- -Added effect parser for MoveTo effect. Tested with player's empire's fleets, and seems to work fine. Tested with all fleets, and seems to work, but crashes server. I suspect this is due to visibility information not being properly updated after the enemy empire's fleet is inserted into the player's system, leading to an AI crash when it attempts to issue orders to an inconsistent universe. For now this doesn't affect the rest of the game, as nothing in trunk yet uses the MoveTo effect. -Added OrbitOccupied and FreeOrbits functions to System, which determine if there's anything in a particular orbit (by number) and returns a set of free orbit numbers, respectively. The latter is used to implement the MoveTo effect in the case of a planet target object. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/EffectParser.cpp trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-05 03:00:46 UTC (rev 2650) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-05 08:07:51 UTC (rev 2651) @@ -19,7 +19,6 @@ using namespace Effect; using namespace boost::io; using boost::lexical_cast; -using boost::format; extern int g_indent; @@ -205,11 +204,11 @@ if (dynamic_cast<const Condition::Self*>(m_scope)) retval.scope_description = UserString("DESC_EFFECTS_GROUP_SELF_SCOPE"); else - retval.scope_description = str(format(UserString("DESC_EFFECTS_GROUP_SCOPE")) % m_scope->Description()); + retval.scope_description = str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_SCOPE")) % m_scope->Description()); if (dynamic_cast<const Condition::Self*>(m_activation) || dynamic_cast<const Condition::All*>(m_activation)) retval.activation_description = UserString("DESC_EFFECTS_GROUP_ALWAYS_ACTIVE"); else - retval.activation_description = str(format(UserString("DESC_EFFECTS_GROUP_ACTIVATION")) % m_activation->Description()); + retval.activation_description = str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_ACTIVATION")) % m_activation->Description()); for (unsigned int i = 0; i < m_effects.size(); ++i) { retval.effect_descriptions.push_back(m_effects[i]->Description()); } @@ -223,11 +222,11 @@ } else { std::stringstream retval; Description description = GetDescription(); - retval << str(format(UserString("DESC_EFFECTS_GROUP_SCOPE_DESC")) % description.scope_description); + retval << str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_SCOPE_DESC")) % description.scope_description); if (!dynamic_cast<const Condition::Self*>(m_activation) && !dynamic_cast<const Condition::All*>(m_activation)) - retval << str(format(UserString("DESC_EFFECTS_GROUP_ACTIVATION_DESC")) % description.activation_description); + retval << str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_ACTIVATION_DESC")) % description.activation_description); for (unsigned int i = 0; i < description.effect_descriptions.size(); ++i) { - retval << str(format(UserString("DESC_EFFECTS_GROUP_EFFECT_DESC")) % description.effect_descriptions[i]); + retval << str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_EFFECT_DESC")) % description.effect_descriptions[i]); } return retval.str(); } @@ -275,10 +274,10 @@ { std::stringstream retval; if (effects_groups.size() == 1) { - retval << str(format(UserString("DESC_EFFECTS_GROUP_EFFECTS_GROUP_DESC")) % effects_groups[0]->DescriptionString()); + retval << str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_EFFECTS_GROUP_DESC")) % effects_groups[0]->DescriptionString()); } else { for (unsigned int i = 0; i < effects_groups.size(); ++i) { - retval << str(format(UserString("DESC_EFFECTS_GROUP_NUMBERED_EFFECTS_GROUP_DESC")) % (i + 1) % effects_groups[i]->DescriptionString()); + retval << str(FlexibleFormat(UserString("DESC_EFFECTS_GROUP_NUMBERED_EFFECTS_GROUP_DESC")) % (i + 1) % effects_groups[i]->DescriptionString()); } } return retval.str(); @@ -331,12 +330,12 @@ case ValueRef::DIVIDES: op_char = '/'; break; default: op_char = '?'; } - return str(format(UserString(m_max ? "DESC_SIMPLE_SET_METER_MAX" : "DESC_SIMPLE_SET_METER_CURRENT")) + return str(FlexibleFormat(UserString(m_max ? "DESC_SIMPLE_SET_METER_MAX" : "DESC_SIMPLE_SET_METER_CURRENT")) % UserString(lexical_cast<std::string>(m_meter)) % op_char % lexical_cast<std::string>(const_operand)); } else { - return str(format(UserString(m_max ? "DESC_COMPLEX_SET_METER_MAX" : "DESC_COMPLEX_SET_METER_CURRENT")) + return str(FlexibleFormat(UserString(m_max ? "DESC_COMPLEX_SET_METER_MAX" : "DESC_COMPLEX_SET_METER_CURRENT")) % UserString(lexical_cast<std::string>(m_meter)) % m_value->Description()); } @@ -387,7 +386,7 @@ std::string SetEmpireStockpile::Description() const { std::string value_str = ValueRef::ConstantExpr(m_value) ? lexical_cast<std::string>(m_value->Eval(0, 0)) : m_value->Description(); - return str(format(UserString("DESC_SET_EMPIRE_STOCKPILE")) % UserString(lexical_cast<std::string>(m_stockpile)) % value_str); + return str(FlexibleFormat(UserString("DESC_SET_EMPIRE_STOCKPILE")) % UserString(lexical_cast<std::string>(m_stockpile)) % value_str); } std::string SetEmpireStockpile::Dump() const @@ -435,7 +434,7 @@ std::string SetPlanetType::Description() const { std::string value_str = ValueRef::ConstantExpr(m_type) ? UserString(lexical_cast<std::string>(m_type->Eval(0, 0))) : m_type->Description(); - return str(format(UserString("DESC_SET_PLANET_TYPE")) % value_str); + return str(FlexibleFormat(UserString("DESC_SET_PLANET_TYPE")) % value_str); } std::string SetPlanetType::Dump() const @@ -473,7 +472,7 @@ std::string SetPlanetSize::Description() const { std::string value_str = ValueRef::ConstantExpr(m_size) ? UserString(lexical_cast<std::string>(m_size->Eval(0, 0))) : m_size->Description(); - return str(format(UserString("DESC_SET_PLANET_SIZE")) % value_str); + return str(FlexibleFormat(UserString("DESC_SET_PLANET_SIZE")) % value_str); } std::string SetPlanetSize::Dump() const @@ -504,7 +503,7 @@ std::string AddOwner::Description() const { std::string value_str = ValueRef::ConstantExpr(m_empire_id) ? Empires().Lookup(m_empire_id->Eval(0, 0))->Name() : m_empire_id->Description(); - return str(format(UserString("DESC_ADD_OWNER")) % value_str); + return str(FlexibleFormat(UserString("DESC_ADD_OWNER")) % value_str); } std::string AddOwner::Dump() const @@ -535,7 +534,7 @@ std::string RemoveOwner::Description() const { std::string value_str = ValueRef::ConstantExpr(m_empire_id) ? Empires().Lookup(m_empire_id->Eval(0, 0))->Name() : m_empire_id->Description(); - return str(format(UserString("DESC_REMOVE_OWNER")) % value_str); + return str(FlexibleFormat(UserString("DESC_REMOVE_OWNER")) % value_str); } std::string RemoveOwner::Dump() const @@ -593,7 +592,7 @@ std::string AddSpecial::Description() const { - return str(format(UserString("DESC_ADD_SPECIAL")) % UserString(m_name)); + return str(FlexibleFormat(UserString("DESC_ADD_SPECIAL")) % UserString(m_name)); } std::string AddSpecial::Dump() const @@ -616,7 +615,7 @@ std::string RemoveSpecial::Description() const { - return str(format(UserString("DESC_REMOVE_SPECIAL")) % UserString(m_name)); + return str(FlexibleFormat(UserString("DESC_REMOVE_SPECIAL")) % UserString(m_name)); } std::string RemoveSpecial::Dump() const @@ -647,7 +646,7 @@ std::string SetStarType::Description() const { std::string value_str = ValueRef::ConstantExpr(m_type) ? UserString(lexical_cast<std::string>(m_type->Eval(0, 0))) : m_type->Description(); - return str(format(UserString("DESC_SET_STAR_TYPE")) % value_str); + return str(FlexibleFormat(UserString("DESC_SET_STAR_TYPE")) % value_str); } std::string SetStarType::Dump() const @@ -673,11 +672,14 @@ Universe& universe = GetUniverse(); int dest_id = m_destination_object_id->Eval(source, target); UniverseObject* destination = universe.Object(dest_id); - if (!destination) return; + if (!destination) { + Logger().errorStream() << "MoveTo::Execute couldn't get destination object with specified id: " << dest_id; + return; + } - // restrict movable object types to the following, as moving others (eg. ships, systems) isn't - // supported yet, due to complicated other bookeeping that would be required if (Fleet* fleet = universe_object_cast<Fleet*>(target)) { + // fleets can be inserted into the system that contains the destination object (or the + // destination object istelf if it is a system if (System* dest_system = destination->GetSystem()) { dest_system->Insert(target); } else { @@ -703,18 +705,24 @@ } } else if (Planet* planet = universe_object_cast<Planet*>(target)) { + // planets need to be located in systems, so get system that contains destination object if (System* dest_system = destination->GetSystem()) { // determine if and which orbits are available - // if an orbit is available... - // dest_system->Insert(target); + std::set<int> free_orbits = dest_system->FreeOrbits(); + if (!free_orbits.empty()) { + int orbit = *(free_orbits.begin()); + dest_system->Insert(target, orbit); + } } // don't move planets to a location outside a system } else if (Building* building = universe_object_cast<Building*>(target)) { + // buildings need to be located on planets, so if destination is a planet, insert building into it, + // or attempt to get the planet on which the destination object is located and insert target building into that if (Planet* dest_planet = universe_object_cast<Planet*>(destination)) { dest_planet->AddBuilding(building->ID()); - } - else if (Building* dest_building = universe_object_cast<Building*>(destination)) { + + } else if (Building* dest_building = universe_object_cast<Building*>(destination)) { if (Planet* dest_planet = dest_building->GetPlanet()) { dest_planet->AddBuilding(building->ID()); } @@ -725,13 +733,13 @@ std::string MoveTo::Description() const { - std::string value_str = ValueRef::ConstantExpr(m_destination_object_id) ? Empires().Lookup(m_destination_object_id->Eval(0, 0))->Name() : m_destination_object_id->Description(); - return str(format(UserString("DESC_ADD_OWNER")) % value_str); + std::string value_str = ValueRef::ConstantExpr(m_destination_object_id) ? GetUniverse().Object(m_destination_object_id->Eval(0, 0))->Name() : m_destination_object_id->Description(); + return str(FlexibleFormat(UserString("DESC_MOVE_TO")) % value_str); } std::string MoveTo::Dump() const { - return DumpIndent() + "AddOwner empire = " + m_destination_object_id->Dump() + "\n"; + return DumpIndent() + "MoveTo destination_object_id = empire = " + m_destination_object_id->Dump() + "\n"; } @@ -774,9 +782,9 @@ std::string SetTechAvailability::Description() const { - std::string affected = str(format(UserString(m_include_tech ? "DESC_TECH_AND_ITEMS_AFFECTED" : "DESC_ITEMS_ONLY_AFFECTED")) % m_tech_name); + std::string affected = str(FlexibleFormat(UserString(m_include_tech ? "DESC_TECH_AND_ITEMS_AFFECTED" : "DESC_ITEMS_ONLY_AFFECTED")) % m_tech_name); std::string empire_str = ValueRef::ConstantExpr(m_empire_id) ? Empires().Lookup(m_empire_id->Eval(0, 0))->Name() : m_empire_id->Description(); - return str(format(UserString(m_available ? "DESC_SET_TECH_AVAIL" : "DESC_SET_TECH_UNAVAIL")) + return str(FlexibleFormat(UserString(m_available ? "DESC_SET_TECH_AVAIL" : "DESC_SET_TECH_UNAVAIL")) % affected % empire_str); } Modified: trunk/FreeOrion/universe/EffectParser.cpp =================================================================== --- trunk/FreeOrion/universe/EffectParser.cpp 2008-08-05 03:00:46 UTC (rev 2650) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-05 08:07:51 UTC (rev 2651) @@ -52,6 +52,12 @@ member2 empire; }; + struct ObjectIDParamClosure : boost::spirit::closure<ObjectIDParamClosure, Effect::EffectBase*, ValueRef::ValueRefBase<int>*> + { + member1 this_; + member2 object_id; + }; + struct NameParamClosure : boost::spirit::closure<NameParamClosure, Effect::EffectBase*, std::string> { member1 this_; @@ -72,32 +78,35 @@ member4 include_tech; }; - typedef rule<Scanner, SetMeterClosure::context_t> SetMeterRule; - typedef rule<Scanner, SetOwnerStockpileClosure::context_t> SetOwnerStockpileRule; - typedef rule<Scanner, SetPlanetTypeClosure::context_t> SetPlanetTypeRule; - typedef rule<Scanner, SetPlanetSizeClosure::context_t> SetPlanetSizeRule; - typedef rule<Scanner, EmpireParamClosure::context_t> EmpireParamRule; - typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; - typedef rule<Scanner, SetStarTypeClosure::context_t> SetStarTypeRule; - typedef rule<Scanner, SetTechAvailabilityClosure::context_t> SetTechAvailabilityRule; + typedef rule<Scanner, SetMeterClosure::context_t> SetMeterRule; + typedef rule<Scanner, SetOwnerStockpileClosure::context_t> SetOwnerStockpileRule; + typedef rule<Scanner, SetPlanetTypeClosure::context_t> SetPlanetTypeRule; + typedef rule<Scanner, SetPlanetSizeClosure::context_t> SetPlanetSizeRule; + typedef rule<Scanner, EmpireParamClosure::context_t> EmpireParamRule; + typedef rule<Scanner, ObjectIDParamClosure::context_t> ObjectIDParamRule; + typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; + typedef rule<Scanner, SetStarTypeClosure::context_t> SetStarTypeRule; + typedef rule<Scanner, SetTechAvailabilityClosure::context_t> SetTechAvailabilityRule; - SetMeterRule set_meter; - SetOwnerStockpileRule set_owner_stockpile; - SetPlanetTypeRule set_planet_type; - SetPlanetSizeRule set_planet_size; - EmpireParamRule add_owner; - EmpireParamRule remove_owner; - Rule destroy; - NameParamRule add_special; - NameParamRule remove_special; - SetStarTypeRule set_star_type; + SetMeterRule set_meter; + SetOwnerStockpileRule set_owner_stockpile; + SetPlanetTypeRule set_planet_type; + SetPlanetSizeRule set_planet_size; + EmpireParamRule add_owner; + EmpireParamRule remove_owner; + ObjectIDParamRule move_to; + Rule destroy; + NameParamRule add_special; + NameParamRule remove_special; + SetStarTypeRule set_star_type; SetTechAvailabilityRule set_tech_availability; - ParamLabel value_label; - ParamLabel type_label; - ParamLabel planetsize_label; - ParamLabel empire_label; - ParamLabel name_label; + ParamLabel value_label; + ParamLabel type_label; + ParamLabel planetsize_label; + ParamLabel empire_label; + ParamLabel name_label; + ParamLabel object_id_label; }; EffectParserDefinition::EffectParserDefinition() : @@ -105,7 +114,8 @@ type_label("type"), planetsize_label("size"), empire_label("empire"), - name_label("name") + name_label("name"), + object_id_label("objectid") { set_meter = ((str_p("setmax")[set_meter.max_meter = val(true)] @@ -154,6 +164,11 @@ >> empire_label >> int_expr_p[remove_owner.empire = arg1]) [remove_owner.this_ = new_<Effect::RemoveOwner>(remove_owner.empire)]; + move_to = + (str_p("moveto") + >> object_id_label >> int_expr_p[move_to.object_id = arg1]) + [move_to.this_ = new_<Effect::MoveTo>(move_to.object_id)]; + destroy = str_p("destroy") [destroy.this_ = new_<Effect::Destroy>()]; @@ -188,6 +203,7 @@ | set_planet_size[effect_p.this_ = arg1] | add_owner[effect_p.this_ = arg1] | remove_owner[effect_p.this_ = arg1] + | move_to[effect_p.this_ = arg1] | destroy[effect_p.this_ = arg1] | add_special[effect_p.this_ = arg1] | remove_special[effect_p.this_ = arg1] Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2008-08-05 03:00:46 UTC (rev 2650) +++ trunk/FreeOrion/universe/System.cpp 2008-08-05 08:07:51 UTC (rev 2651) @@ -475,6 +475,23 @@ return m_objects.equal_range(-1); } +bool System::OrbitOccupied(int orbit) const +{ + return (m_objects.find(orbit) != m_objects.end()); +} + +std::set<int> System::FreeOrbits() const +{ + std::set<int> occupied; + for (const_orbit_iterator it = begin(); it != end(); ++it) + occupied.insert(it->first); + std::set<int> retval; + for (int i = 0; i < m_orbits; ++i) + if (occupied.find(i) == occupied.end()) + retval.insert(i); + return retval; +} + System::lane_iterator System::begin_lanes() { return m_starlanes_wormholes.begin(); Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2008-08-05 03:00:46 UTC (rev 2650) +++ trunk/FreeOrion/universe/System.h 2008-08-05 08:07:51 UTC (rev 2651) @@ -99,6 +99,9 @@ std::pair<const_orbit_iterator, const_orbit_iterator> non_orbit_range() const; ///< returns begin and end iterators for all system objects not in an orbit + bool OrbitOccupied(int orbit) const; ///< returns true if there is an object in \a orbit + std::set<int> FreeOrbits() const; ///< returns the set of orbit numbers that are unoccupied + const_lane_iterator begin_lanes() const; ///< begin iterator for all starlanes and wormholes terminating in this system const_lane_iterator end_lanes() const; ///< end iterator for all starlanes and wormholes terminating in this system |
From: <geo...@us...> - 2008-08-09 00:08:35
|
Revision: 2656 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2656&view=rev Author: geoffthemedio Date: 2008-08-09 00:08:44 +0000 (Sat, 09 Aug 2008) Log Message: ----------- -Added check for planet being moved to a system it is already in in MoveTo effect -Added check for a building being added to a planet that it is already on Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Planet.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-08 23:14:17 UTC (rev 2655) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-09 00:08:44 UTC (rev 2656) @@ -824,12 +824,15 @@ } else if (Planet* planet = universe_object_cast<Planet*>(target)) { // planets need to be located in systems, so get system that contains destination object if (System* dest_system = destination->GetSystem()) { - // determine if and which orbits are available - std::set<int> free_orbits = dest_system->FreeOrbits(); - if (!free_orbits.empty()) { - int orbit = *(free_orbits.begin()); - dest_system->Insert(target, orbit); - ExploreSystem(dest_system->ID(), target); + // check if planet is already in this system. if so, don't need to do anything + if (planet->SystemID() == UniverseObject::INVALID_OBJECT_ID || planet->SystemID() != dest_system->ID()) { + // determine if and which orbits are available + std::set<int> free_orbits = dest_system->FreeOrbits(); + if (!free_orbits.empty()) { + int orbit = *(free_orbits.begin()); + dest_system->Insert(target, orbit); + ExploreSystem(dest_system->ID(), target); + } } } // don't move planets to a location outside a system Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2008-08-08 23:14:17 UTC (rev 2655) +++ trunk/FreeOrion/universe/Planet.cpp 2008-08-09 00:08:44 UTC (rev 2656) @@ -366,6 +366,10 @@ void Planet::AddBuilding(int building_id) { + if (this->Contains(building_id)) { + Logger().debugStream() << "Planet::AddBuilding this planet " << this->Name() << " already contained building " << building_id; + return; + } Logger().debugStream() << "Planet " << this->Name() << " adding building: " << building_id; if (Building* building = GetUniverse().Object<Building>(building_id)) { if (System* system = GetSystem()) { |
From: <geo...@us...> - 2008-08-09 07:49:43
|
Revision: 2657 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2657&view=rev Author: geoffthemedio Date: 2008-08-09 07:49:52 +0000 (Sat, 09 Aug 2008) Log Message: ----------- -Added definitions for CreateBuilding and CreatePlanet effects, the latter with partial implementation -Made UniverseObject::SystemID virtual so that System's override can return the system's own ID. Rewrote GetSystem so that SystemID is called, so that calling GetSystem on a system will return the system itself. This simplifies some other code that needs to get the system associated with an object, be that the system the object is in, or the object itself if it is a system. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-09 07:49:52 UTC (rev 2657) @@ -616,19 +616,93 @@ /////////////////////////////////////////////////////////// -// Create // +// CreatePlanet // /////////////////////////////////////////////////////////// -// TODO: create multiple Create*s for different kinds of objects -/*class Effect::Create : public Effect::EffectBase +CreatePlanet::CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size, + const ValueRef::ValueRefBase<int>* location_id) : + m_type(type), + m_size(size), + m_location_id(location_id) +{} + +CreatePlanet::~CreatePlanet() { -public: - Create(); + delete m_type; + delete m_size; + delete m_location_id; +} - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; -};*/ +void CreatePlanet::Execute(const UniverseObject* source, UniverseObject* target) const +{ + int location_id = m_location_id->Eval(source, target); + UniverseObject* location_obj = GetUniverse().Object(location_id); + if (!location_obj) { + Logger().errorStream() << "CreatePlanet::Execute couldn't get a location object with id " << location_id; + return; + } + System* location = location_obj->GetSystem(); + if (!location) { + Logger().errorStream() << "CreatePlanet::Execute couldn't get a System object at which to create the planet"; + return; + } + PlanetSize size = m_size->Eval(source, target); + PlanetType type = m_type->Eval(source, target); + if (size == INVALID_PLANET_SIZE || type == INVALID_PLANET_TYPE) { + Logger().errorStream() << "CreatePlanet::Execute got invalid size or type of planet to create..."; + 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(type, size); + int new_planet_id = GetNewObjectID(); + GetUniverse().InsertID(planet, new_planet_id); + + int orbit = *(free_orbits.begin()); + location->Insert(planet, orbit); +} + +std::string CreatePlanet::Description() const +{ + return ""; +} + +std::string CreatePlanet::Dump() const +{ + return ""; +} + + /////////////////////////////////////////////////////////// +// CreateBuilding // +/////////////////////////////////////////////////////////// +//class Effect::CreateBuilding : public Effect::EffectBase +//{ +//public: +// CreateBuilding(const std::string& building_type, const ValueRef::ValueRefBase<int>* location_id); +// virtual ~CreateBuilding(); +// +// virtual void Execute(const UniverseObject* source, UniverseObject* target) const; +// virtual std::string Description() const; +// virtual std::string Dump() const; +//private: +// const std::string m_type; +// const ValueRef::ValueRefBase<int>* m_location_id; +// +// friend class boost::serialization::access; +// template <class Archive> +// void serialize(Archive& ar, const unsigned int version); +//}; + + +/////////////////////////////////////////////////////////// // Destroy // /////////////////////////////////////////////////////////// Destroy::Destroy() @@ -831,7 +905,7 @@ if (!free_orbits.empty()) { int orbit = *(free_orbits.begin()); dest_system->Insert(target, orbit); - ExploreSystem(dest_system->ID(), target); + ExploreSystem(dest_system->ID(), target); } } } Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/Effect.h 2008-08-09 07:49:52 UTC (rev 2657) @@ -27,7 +27,8 @@ class SetPlanetSize; class AddOwner; class RemoveOwner; - //class Create; + class CreatePlanet; + class CreateBuilding; class Destroy; class AddSpecial; class RemoveSpecial; @@ -64,15 +65,15 @@ const std::vector<EffectBase*>& effects, const std::string& stacking_group = ""); virtual ~EffectsGroup(); - void GetTargetSet(int source_id, TargetSet& targets) const; - void GetTargetSet(int source_id, TargetSet& targets, const TargetSet& potential_targets) const; - void Execute(int source_id, const TargetSet& targets) const; // execute all effects in group - void Execute(int source_id, const TargetSet& targets, int effect_index) const; // execute effect with \a effect_index (but not other effects) - const std::string& StackingGroup() const; + void GetTargetSet(int source_id, TargetSet& targets) const; + void GetTargetSet(int source_id, TargetSet& targets, const TargetSet& potential_targets) const; + void Execute(int source_id, const TargetSet& targets) const; // execute all effects in group + void Execute(int source_id, const TargetSet& targets, int effect_index) const; // execute effect with \a effect_index (but not other effects) + const std::string& StackingGroup() const; const std::vector<EffectBase*>& EffectsList() const; - Description GetDescription() const; - std::string DescriptionString() const; - std::string Dump() const; + Description GetDescription() const; + std::string DescriptionString() const; + std::string Dump() const; protected: const Condition::ConditionBase* m_scope; @@ -98,7 +99,7 @@ public: virtual ~EffectBase(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const = 0; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const = 0; virtual std::string Description() const = 0; virtual std::string Dump() const = 0; @@ -117,7 +118,7 @@ SetMeter(MeterType meter, const ValueRef::ValueRefBase<double>* value, bool max); virtual ~SetMeter(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; MeterType GetMeterType() const {return m_meter;}; @@ -140,7 +141,7 @@ SetEmpireStockpile(ResourceType stockpile, const ValueRef::ValueRefBase<double>* value); virtual ~SetEmpireStockpile(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -163,7 +164,7 @@ SetPlanetType(const ValueRef::ValueRefBase<PlanetType>* type); virtual ~SetPlanetType(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -184,7 +185,7 @@ SetPlanetSize(const ValueRef::ValueRefBase<PlanetSize>* size); virtual ~SetPlanetSize(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -203,7 +204,7 @@ AddOwner(const ValueRef::ValueRefBase<int>* empire_id); virtual ~AddOwner(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -222,7 +223,7 @@ RemoveOwner(const ValueRef::ValueRefBase<int>* empire_id); virtual ~RemoveOwner(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -234,16 +235,46 @@ void serialize(Archive& ar, const unsigned int version); }; -// TODO: create multiple Create*s for different kinds of objects -/*class Effect::Create : public Effect::EffectBase +/** Creates a new Planet with specified \a type and \a size at the system with specified \a location_id */ +class Effect::CreatePlanet : public Effect::EffectBase { public: - Create(); + CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size, + const ValueRef::ValueRefBase<int>* location_id); + virtual ~CreatePlanet(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; -};*/ + virtual std::string Dump() const; +private: + const ValueRef::ValueRefBase<PlanetType>* m_type; + const ValueRef::ValueRefBase<PlanetSize>* m_size; + const ValueRef::ValueRefBase<int>* m_location_id; + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + +/** Creates a new Building with specified \a type at the system with specified \a location_id */ +class Effect::CreateBuilding : public Effect::EffectBase +{ +public: + CreateBuilding(const std::string& building_type, const ValueRef::ValueRefBase<int>* location_id); + virtual ~CreateBuilding(); + + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual std::string Description() const; + virtual std::string Dump() const; +private: + const std::string m_type; + const ValueRef::ValueRefBase<int>* m_location_id; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Destroys the target object. When executed on objects that contain other objects (such as Fleets and Planets), all contained objects are destroyed as well. Has no effect on System objects. Destroy effects are executed after all other effects. */ @@ -252,7 +283,7 @@ public: Destroy(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -268,7 +299,7 @@ public: AddSpecial(const std::string& name); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -286,7 +317,7 @@ public: RemoveSpecial(const std::string& name); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -305,7 +336,7 @@ SetStarType(const ValueRef::ValueRefBase<StarType>* type); virtual ~SetStarType(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -325,7 +356,7 @@ MoveTo(const ValueRef::ValueRefBase<int>* object_id); virtual ~MoveTo(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -347,7 +378,7 @@ SetTechAvailability(const std::string& tech_name, const ValueRef::ValueRefBase<int>* empire_id, bool available, bool include_tech); virtual ~SetTechAvailability(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; @@ -368,7 +399,7 @@ SetEffectTarget(const ValueRef::ValueRefBase<int>* effect_target_id); virtual ~SetEffectTarget(); - virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/System.cpp 2008-08-09 07:49:52 UTC (rev 2657) @@ -93,6 +93,15 @@ return (it == m_starlanes_wormholes.end() ? false : it->second == true); } +int System::SystemID() const +{ + // Systems don't have a valid UniverseObject::m_system_id since it is never set by inserting them into (another) system. + // When new systems are created, it's also not set because UniverseObject are created without a valid id number, and only + // get one when being inserted into the Universe. Universe::Insert overloads could check what is being inserted, but + // having SystemID be virtual and overriding it it in this class (System) is easier. + return this->ID(); +} + std::vector<UniverseObject*> System::FindObjects() const { Universe& universe = GetUniverse(); Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/System.h 2008-08-09 07:49:52 UTC (rev 2657) @@ -64,6 +64,8 @@ bool HasStarlaneTo(int id) const; ///< returns true if there is a starlane from this system to the system with ID number \a id bool HasWormholeTo(int id) const; ///< returns true if there is a wormhole from this system to the system with ID number \a id + virtual int SystemID() const; ///< returns this->ID() + virtual std::vector<UniverseObject*> FindObjects() const; ///< returns objects contained within this system virtual std::vector<int> Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-09 07:49:52 UTC (rev 2657) @@ -530,7 +530,7 @@ return retval; } -bool Universe::InsertID(UniverseObject* obj, int id ) +bool Universe::InsertID(UniverseObject* obj, int id) { bool retval = false; Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-09 07:49:52 UTC (rev 2657) @@ -96,7 +96,7 @@ System* UniverseObject::GetSystem() const { - return m_system_id == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<System>(m_system_id); + return SystemID() == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<System>(SystemID()); } const std::set<std::string>& UniverseObject::Specials() const Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-08-09 07:49:52 UTC (rev 2657) @@ -68,7 +68,7 @@ double X() const; ///< the X-coordinate of this object double Y() const; ///< the Y-coordinate of this object const std::set<int>& Owners() const; ///< returns the set of IDs of Empires owning all or part of this object. \note This may be empty or have an arbitrary number of elements. - int SystemID() const; ///< returns the ID number of the system in which this object can be found, or INVALID_OBJECT_ID if the object is not within any system + virtual int SystemID() const; ///< returns the ID number of the system in which this object can be found, or INVALID_OBJECT_ID if the object is not within any system System* GetSystem() const; ///< returns system in which this object can be found, or null if the object is not within any system const std::set<std::string>& Specials() const; ///< returns the set of names of the Specials attached to this object Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2008-08-09 00:08:44 UTC (rev 2656) +++ trunk/FreeOrion/universe/ValueRef.cpp 2008-08-09 07:49:52 UTC (rev 2657) @@ -118,7 +118,7 @@ case PE_ADEQUATE: return "Adequate"; case PE_GOOD: return "Good"; default: return "?"; - } + } } template <> |
From: <geo...@us...> - 2008-08-11 04:13:30
|
Revision: 2660 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2660&view=rev Author: geoffthemedio Date: 2008-08-11 04:13:37 +0000 (Mon, 11 Aug 2008) Log Message: ----------- -Added parsing for CreateBuilding and CreatePlanet effects -Added do-nothing implementation of CreateBuilding effect -Minor whitespace tweaking in ConditionParser files Modified Paths: -------------- trunk/FreeOrion/universe/ConditionParser1.cpp trunk/FreeOrion/universe/ConditionParser2.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/EffectParser.cpp Modified: trunk/FreeOrion/universe/ConditionParser1.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser1.cpp 2008-08-10 02:27:35 UTC (rev 2659) +++ trunk/FreeOrion/universe/ConditionParser1.cpp 2008-08-11 04:13:37 UTC (rev 2660) @@ -103,30 +103,30 @@ member2 condition; }; - typedef rule<Scanner, OwnedByClosure::context_t> OwnedByRule; - typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; - typedef rule<Scanner, PlanetTypeClosure::context_t> PlanetTypeRule; - typedef rule<Scanner, PlanetSizeClosure::context_t> PlanetSizeRule; - typedef rule<Scanner, PlanetEnvironmentClosure::context_t> PlanetEnvironmentRule; - typedef rule<Scanner, ObjectTypeClosure::context_t> ObjectTypeRule; - typedef rule<Scanner, FocusTypeClosure::context_t> FocusTypeRule; - typedef rule<Scanner, MeterValueClosure::context_t> MeterValueRule; - typedef rule<Scanner, AndOrClosure::context_t> AndOrRule; - typedef rule<Scanner, NotClosure::context_t> NotRule; + typedef rule<Scanner, OwnedByClosure::context_t> OwnedByRule; + typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; + typedef rule<Scanner, PlanetTypeClosure::context_t> PlanetTypeRule; + typedef rule<Scanner, PlanetSizeClosure::context_t> PlanetSizeRule; + typedef rule<Scanner, PlanetEnvironmentClosure::context_t> PlanetEnvironmentRule; + typedef rule<Scanner, ObjectTypeClosure::context_t> ObjectTypeRule; + typedef rule<Scanner, FocusTypeClosure::context_t> FocusTypeRule; + typedef rule<Scanner, MeterValueClosure::context_t> MeterValueRule; + typedef rule<Scanner, AndOrClosure::context_t> AndOrRule; + typedef rule<Scanner, NotClosure::context_t> NotRule; - Rule all; - OwnedByRule owned_by; - Rule source; - NameParamRule building; - PlanetTypeRule planet_type; - PlanetSizeRule planet_size; - PlanetEnvironmentRule planet_environment; - ObjectTypeRule object_type; - FocusTypeRule focus_type; - MeterValueRule meter_value; - AndOrRule and_; - AndOrRule or_; - NotRule not_; + Rule all; + OwnedByRule owned_by; + Rule source; + NameParamRule building; + PlanetTypeRule planet_type; + PlanetSizeRule planet_size; + PlanetEnvironmentRule planet_environment; + ObjectTypeRule object_type; + FocusTypeRule focus_type; + MeterValueRule meter_value; + AndOrRule and_; + AndOrRule or_; + NotRule not_; }; ConditionParser1Definition::ConditionParser1Definition() Modified: trunk/FreeOrion/universe/ConditionParser2.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser2.cpp 2008-08-10 02:27:35 UTC (rev 2659) +++ trunk/FreeOrion/universe/ConditionParser2.cpp 2008-08-11 04:13:37 UTC (rev 2660) @@ -106,31 +106,31 @@ member2 empires; }; - typedef rule<Scanner, WithinDistanceClosure::context_t> WithinDistanceRule; - typedef rule<Scanner, WithinStarlaneJumpsClosure::context_t> WithinStarlaneJumpsRule; - typedef rule<Scanner, NumberClosure::context_t> NumberRule; - typedef rule<Scanner, TurnClosure::context_t> TurnRule; - typedef rule<Scanner, NumberOfClosure::context_t> NumberOfRule; - typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; - typedef rule<Scanner, ConditionParamClosure::context_t> ConditionParamRule; - typedef rule<Scanner, StarTypeClosure::context_t> StarTypeRule; - typedef rule<Scanner, RandomClosure::context_t> RandomRule; - typedef rule<Scanner, StockpileClosure::context_t> StockpileRule; - typedef rule<Scanner, VisibleToEmpireClosure::context_t> VisibleToEmpireRule; + typedef rule<Scanner, WithinDistanceClosure::context_t> WithinDistanceRule; + typedef rule<Scanner, WithinStarlaneJumpsClosure::context_t> WithinStarlaneJumpsRule; + typedef rule<Scanner, NumberClosure::context_t> NumberRule; + typedef rule<Scanner, TurnClosure::context_t> TurnRule; + typedef rule<Scanner, NumberOfClosure::context_t> NumberOfRule; + typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; + typedef rule<Scanner, ConditionParamClosure::context_t> ConditionParamRule; + typedef rule<Scanner, StarTypeClosure::context_t> StarTypeRule; + typedef rule<Scanner, RandomClosure::context_t> RandomRule; + typedef rule<Scanner, StockpileClosure::context_t> StockpileRule; + typedef rule<Scanner, VisibleToEmpireClosure::context_t> VisibleToEmpireRule; - NameParamRule owner_has_tech; - WithinDistanceRule within_distance; + NameParamRule owner_has_tech; + WithinDistanceRule within_distance; WithinStarlaneJumpsRule within_starlane_jumps; - NumberRule number; - TurnRule turn; - NumberOfRule number_of; - NameParamRule has_special; - ConditionParamRule contains; - ConditionParamRule contained_by; - StarTypeRule star_type; - RandomRule random; - StockpileRule owner_stockpile; - VisibleToEmpireRule visible_to_empire; + NumberRule number; + TurnRule turn; + NumberOfRule number_of; + NameParamRule has_special; + ConditionParamRule contains; + ConditionParamRule contained_by; + StarTypeRule star_type; + RandomRule random; + StockpileRule owner_stockpile; + VisibleToEmpireRule visible_to_empire; }; ConditionParser2Definition::ConditionParser2Definition() Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-10 02:27:35 UTC (rev 2659) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-11 04:13:37 UTC (rev 2660) @@ -678,25 +678,25 @@ /////////////////////////////////////////////////////////// // CreateBuilding // /////////////////////////////////////////////////////////// -//class Effect::CreateBuilding : public Effect::EffectBase -//{ -//public: -// CreateBuilding(const std::string& building_type, const ValueRef::ValueRefBase<int>* location_id); -// virtual ~CreateBuilding(); -// -// virtual void Execute(const UniverseObject* source, UniverseObject* target) const; -// virtual std::string Description() const; -// virtual std::string Dump() const; -//private: -// const std::string m_type; -// const ValueRef::ValueRefBase<int>* m_location_id; -// -// friend class boost::serialization::access; -// template <class Archive> -// void serialize(Archive& ar, const unsigned int version); -//}; +CreateBuilding::CreateBuilding(const std::string& building_type) : + m_type(building_type) +{} +void CreateBuilding::Execute(const UniverseObject* source, UniverseObject* target) const +{ +} +std::string CreateBuilding::Description() const +{ + return "!"; +} + +std::string CreateBuilding::Dump() const +{ + return "@$"; +} + + /////////////////////////////////////////////////////////// // Destroy // /////////////////////////////////////////////////////////// Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-10 02:27:35 UTC (rev 2659) +++ trunk/FreeOrion/universe/Effect.h 2008-08-11 04:13:37 UTC (rev 2660) @@ -259,13 +259,12 @@ { public: CreateBuilding(const std::string& building_type); - virtual ~CreateBuilding(); virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; private: - const std::string m_type; + const std::string m_type; friend class boost::serialization::access; template <class Archive> @@ -470,6 +469,21 @@ } template <class Archive> +void Effect::CreatePlanet::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) + & BOOST_SERIALIZATION_NVP(m_type) + & BOOST_SERIALIZATION_NVP(m_size); +} + +template <class Archive> +void Effect::CreateBuilding::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) + & BOOST_SERIALIZATION_NVP(m_type); +} + +template <class Archive> void Effect::Destroy::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase); Modified: trunk/FreeOrion/universe/EffectParser.cpp =================================================================== --- trunk/FreeOrion/universe/EffectParser.cpp 2008-08-10 02:27:35 UTC (rev 2659) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-11 04:13:37 UTC (rev 2660) @@ -71,20 +71,18 @@ member2 type; }; - struct CreatePlanetClosure : boost::spirit::closure<CreatePlanetClosure, Effect::EffectBase*, ValueRef::ValueRefBase< ::StarType>*, - ValueRef::ValueRefBase< ::PlanetType>*, ValueRef::ValueRefBase<int>*> + struct CreatePlanetClosure : boost::spirit::closure<CreatePlanetClosure, Effect::EffectBase*, ValueRef::ValueRefBase< ::PlanetType>*, + ValueRef::ValueRefBase< ::PlanetSize>*> { member1 this_; member2 type; member3 size; - member4 location_id; }; - struct CreateBuildingClosure : boost::spirit::closure<CreateBuildingClosure, Effect::EffectBase*, std::string, ValueRef::ValueRefBase<int>*> + struct CreateBuildingClosure : boost::spirit::closure<CreateBuildingClosure, Effect::EffectBase*, std::string> { member1 this_; - member2 building_type; - member3 location_id; + member2 type; }; struct SetTechAvailabilityClosure : boost::spirit::closure<SetTechAvailabilityClosure, Effect::EffectBase*, std::string, bool, bool> @@ -185,13 +183,17 @@ >> empire_label >> int_expr_p[remove_owner.empire = arg1]) [remove_owner.this_ = new_<Effect::RemoveOwner>(remove_owner.empire)]; - //create_planet = - // (str_p("createplanet") - // >> type_label >> planettype_expr_p[create_planet.type = arg1] - // >> planetsize_label >> planetsize_expr_p[create_planet.size = arg1] - // >> empire_label >> int_expr_p[create_planet.location_id = arg1]) - // [create_planet.this_ = new_<Effect::CreatePlanet>(create_planet.type, create_planet.size, create_planet.location_id)]; + create_planet = + (str_p("createplanet") + >> type_label >> planettype_expr_p[create_planet.type = arg1] + >> planetsize_label >> planetsize_expr_p[create_planet.size = arg1]) + [create_planet.this_ = new_<Effect::CreatePlanet>(create_planet.type, create_planet.size)]; + create_building = + (str_p("createbuilding") + >> name_label >> name_p[create_building.type = arg1]) + [create_building.this_ = new_<Effect::CreateBuilding>(create_building.type)]; + move_to = (str_p("moveto") >> destination_label >> condition_p[move_to.condition = arg1]) |
From: <geo...@us...> - 2009-01-29 03:04:31
|
Revision: 2779 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2779&view=rev Author: geoffthemedio Date: 2009-01-29 03:04:21 +0000 (Thu, 29 Jan 2009) Log Message: ----------- -Gave AI empires names from list eleazar recently added -Random whitespace grooming Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-01-28 22:30:35 UTC (rev 2778) +++ trunk/FreeOrion/universe/Universe.cpp 2009-01-29 03:04:21 UTC (rev 2779) @@ -81,6 +81,18 @@ } } + void LoadEmpireNames(std::list<std::string>& names) + { + boost::filesystem::ifstream ifs(GetSettingsDir() / "empire_names.txt"); + while (ifs) { + std::string latest_name; + std::getline(ifs, latest_name); + if (latest_name != "") { + names.push_back(latest_name.substr(0, latest_name.find_last_not_of(" \t") + 1)); // strip off trailing whitespace + } + } + } + //////////////////////////////////////////////////////////////// // templated implementations of Universe graph search methods // //////////////////////////////////////////////////////////////// @@ -340,7 +352,7 @@ // class Universe ///////////////////////////////////////////// // static(s) -const bool Universe::ALL_OBJECTS_VISIBLE = false; +const bool Universe::ALL_OBJECTS_VISIBLE = true; double Universe::s_universe_width = 1000.0; bool Universe::s_inhibit_universe_object_signals = false; int Universe::s_encoding_empire = ALL_EMPIRES; @@ -3004,25 +3016,54 @@ #ifdef FREEORION_BUILD_SERVER // create empires and assign homeworlds, names, colors, and fleet ranges to each one + // load empire names + static std::list<std::string> empire_names; + if (empire_names.empty()) + LoadEmpireNames(empire_names); + std::size_t i = 0; + std::vector<GG::Clr> colors = EmpireColors(); + for (ServerNetworking::const_established_iterator it = ServerApp::GetApp()->Networking().established_begin(); it != ServerApp::GetApp()->Networking().established_end(); ++it, ++i) { - std::string empire_name = UserString("EMPIRE") + boost::lexical_cast<std::string>(i); + std::string empire_name = ""; GG::Clr color; std::map<int, PlayerSetupData>::const_iterator setup_data_it = player_setup_data.find((*it)->ID()); - if (setup_data_it != player_setup_data.end()) { // first try to use user-assigned colors + if (setup_data_it != player_setup_data.end()) { + // use user-assigned name and colour empire_name = setup_data_it->second.m_empire_name; color = setup_data_it->second.m_empire_color; + + // ensure no other empire gets auto-assigned this colour std::vector<GG::Clr>::iterator color_it = std::find(colors.begin(), colors.end(), color); if (color_it != colors.end()) colors.erase(color_it); - } else if (!colors.empty()) { // failing that, use other built-in colors - int color_idx = RandInt(0, colors.size() - 1); - color = colors[color_idx]; - colors.erase(colors.begin() + color_idx); - } else { // as a last resort, make up a color - color = GG::FloatClr(RandZeroToOne(), RandZeroToOne(), RandZeroToOne(), 1.0); + + } else { + // automatically assign colour + if (!colors.empty()) { + // a list of colours is available. pick a colour + int color_idx = RandInt(0, colors.size() - 1); + color = colors[color_idx]; + colors.erase(colors.begin() + color_idx); + } else { + // as a last resort, make up a color + color = GG::FloatClr(RandZeroToOne(), RandZeroToOne(), RandZeroToOne(), 1.0); + } + + // automatically pick a name + if (!empire_names.empty()) { + // pick a name from the list of empire names + int empire_name_idx = RandSmallInt(0, static_cast<int>(empire_names.size()) - 1); + std::list<std::string>::iterator it = empire_names.begin(); + std::advance(it, empire_name_idx); + empire_name = *it; + empire_names.erase(it); + } else { + // use a generic name + empire_name = UserString("EMPIRE") + boost::lexical_cast<std::string>(i); + } } int home_planet_id = homeworlds[i]; Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2009-01-28 22:30:35 UTC (rev 2778) +++ trunk/FreeOrion/universe/ValueRef.cpp 2009-01-29 03:04:21 UTC (rev 2779) @@ -105,7 +105,7 @@ case PT_ASTEROIDS: return "Asteroids"; case PT_GASGIANT: return "GasGiant"; default: return "?"; - } + } } template <> |
From: <tz...@us...> - 2009-04-05 01:19:18
|
Revision: 2967 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2967&view=rev Author: tzlaine Date: 2009-04-05 01:19:09 +0000 (Sun, 05 Apr 2009) Log Message: ----------- Fixed the declaration and definition of ALL_EMPIRES to prevent ODR violations. Modified Paths: -------------- trunk/FreeOrion/universe/Enums.h trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2009-04-04 16:31:57 UTC (rev 2966) +++ trunk/FreeOrion/universe/Enums.h 2009-04-05 01:19:09 UTC (rev 2967) @@ -554,7 +554,7 @@ ResourceType MeterToResource(MeterType type); -static const int ALL_EMPIRES = -1; +extern const int ALL_EMPIRES; /** degrees of visibility an Empire or UniverseObject can have for an UniverseObject. determines how much information the empire Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-04-04 16:31:57 UTC (rev 2966) +++ trunk/FreeOrion/universe/Universe.cpp 2009-04-05 01:19:09 UTC (rev 2967) @@ -272,6 +272,8 @@ } } +const int ALL_EMPIRES = -1; + ///////////////////////////////////////////// // struct Universe::GraphImpl ///////////////////////////////////////////// |
From: <geo...@us...> - 2009-05-10 07:38:39
|
Revision: 3023 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3023&view=rev Author: geoffthemedio Date: 2009-05-10 07:38:34 +0000 (Sun, 10 May 2009) Log Message: ----------- -Replaced hard-coded fleet generation and item unlocking during empire creation with stuff contained in manager classes that read in data files. -Added an optional parameter to ShipDesign::Name that specified whether or not to look up the name in the stringtable. This is useful for storing premade ship designs by unique name before adding them to empires or the universe, before which they don't yet have a unique id number. -Removed some unused functions / code from manager class(es) Modified Paths: -------------- trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2009-05-10 04:44:08 UTC (rev 3022) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2009-05-10 07:38:34 UTC (rev 3023) @@ -702,9 +702,9 @@ return m_id; } -const std::string& ShipDesign::Name() const +const std::string& ShipDesign::Name(bool stringtable_lookup /* = true */) const { - if (m_name_desc_in_stringtable) + if (m_name_desc_in_stringtable && stringtable_lookup) return UserString(m_name); else return m_name; Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2009-05-10 04:44:08 UTC (rev 3022) +++ trunk/FreeOrion/universe/ShipDesign.h 2009-05-10 07:38:34 UTC (rev 3023) @@ -339,7 +339,13 @@ /** \name Accessors */ //@{ int ID() const; ///< returns id number of design - const std::string& Name() const; ///< returns name of design + + /** returns name of design. if \a stringtable_lookup is true and the + * design was constructed specifying name_desc_in_stringtable true, + * the name string is looked up in the stringtable before being returned. + * otherwise, the raw name string is returned. */ + const std::string& Name(bool stringtable_lookup = true) const; + const std::string& Description() const; ///< returns description of design int DesignedByEmpire() const; ///< returns id of empire that created design int DesignedOnTurn() const; ///< returns turn on which design was created Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-05-10 04:44:08 UTC (rev 3022) +++ trunk/FreeOrion/universe/Universe.cpp 2009-05-10 07:38:34 UTC (rev 3023) @@ -2108,6 +2108,7 @@ } // end function } + namespace { struct store_ship_design_impl { @@ -2116,11 +2117,11 @@ template <class T> void operator()(std::map<std::string, ShipDesign*>& ship_designs, const T& ship_design) const { - if (ship_designs.find(ship_design->Name()) != ship_designs.end()) { - std::string error_str = "ERROR: More than one predefined ship design in predefined_ship_designs.txt has the name " + ship_design->Name(); + if (ship_designs.find(ship_design->Name(false)) != ship_designs.end()) { + std::string error_str = "ERROR: More than one predefined ship design in predefined_ship_designs.txt has the name " + ship_design->Name(false); throw std::runtime_error(error_str.c_str()); } - ship_designs[ship_design->Name()] = ship_design; + ship_designs[ship_design->Name(false)] = ship_design; } }; @@ -2131,29 +2132,18 @@ typedef std::map<std::string, ShipDesign*>::const_iterator iterator; /** \name Accessors */ //@{ - /** returns new copy of ShipDesign with name \a name. caller gains - * ownership of returned pointer. returned ShipDesign can be - * inserted into an empire using Empire::AddShipDesign(ShipDesign*) - * which also inserts it into the Universe, which takes ownership. */ - ShipDesign* CopyShipDesign(const std::string& name, int designing_empire_id = ALL_EMPIRES) const; - /** returns iterator pointing to first ship design. */ iterator begin() const { return m_ship_designs.begin(); } /** returns iterator pointing one past last ship design. */ iterator end() const { return m_ship_designs.end(); } - /** returns iterator pointing to ship design with indicated \a name or - * returns end() if no ship design exists with that name. */ - iterator find(const std::string& name) const { return m_ship_designs.find(name); } - - /** returns true iff a ship design with the indicated \a name exists. */ - bool contains(const std::string& name) const { return find(name) != end(); }; //@} /** Adds designs in this manager to the specified \a empire using that - * Empire's AddShipDesign(ShipDesign*) function. */ - void AddShipDesignsToEmpire(Empire* empire) const; + * Empire's AddShipDesign(ShipDesign*) function. Returns a map from + * ship design name to design id in universe. */ + std::map<std::string, int> AddShipDesignsToEmpire(Empire* empire) const; /** returns the instance of this singleton class; you should use the * free function GetPredefinedShipDesignManager() instead */ @@ -2205,13 +2195,13 @@ if (!result.full) ReportError(input.c_str(), result); -//#ifdef OUTPUT_DESIGNS_LIST +#ifdef OUTPUT_DESIGNS_LIST Logger().debugStream() << "Predefined Ship Designs:"; for (iterator it = begin(); it != end(); ++it) { const ShipDesign* d = it->second; Logger().debugStream() << " ... " << d->Name(); } -//#endif +#endif } PredefinedShipDesignManager::~PredefinedShipDesignManager() { @@ -2219,31 +2209,19 @@ delete it->second; } - ShipDesign* PredefinedShipDesignManager::CopyShipDesign(const std::string& name, int designing_empire_id) const { - ShipDesign* retval = NULL; - if (m_ship_designs.empty()) - return retval; + std::map<std::string, int> PredefinedShipDesignManager::AddShipDesignsToEmpire(Empire* empire) const { + std::map<std::string, int> retval; - std::map<std::string, ShipDesign*>::const_iterator it = m_ship_designs.find(name); - if (it == m_ship_designs.end()) + if (!empire) return retval; - ShipDesign* d = it->second; - - retval = new ShipDesign(d->Name(), d->Description(), designing_empire_id, - d->DesignedOnTurn(), d->Hull(), d->Parts(), - d->Graphic(), d->Model(), false); - - return retval; - } - - void PredefinedShipDesignManager::AddShipDesignsToEmpire(Empire* empire) const { - if (!empire) - return; - for (iterator it = begin(); it != end(); ++it) { ShipDesign* d = it->second; + if (it->first != d->Name(false)) { + Logger().errorStream() << "Predefined ship design name in map (" << it->first << ") doesn't match name in ShipDesign::m_name (" << d->Name(false) << ")"; + } + ShipDesign* copy = new ShipDesign(d->Name(), d->Description(), empire->EmpireID(), d->DesignedOnTurn(), d->Hull(), d->Parts(), d->Graphic(), d->Model(), false); @@ -2253,6 +2231,8 @@ if (design_id == UniverseObject::INVALID_OBJECT_ID) { delete copy; Logger().errorStream() << "PredefinedShipDesignManager::AddShipDesignsToEmpire couldn't add a design to an empire"; + } else { + retval[it->first] = design_id; } } } @@ -2338,13 +2318,13 @@ if (!result.full) ReportError(input.c_str(), result); -//#ifdef OUTPUT_PLANS_LIST +#ifdef OUTPUT_PLANS_LIST Logger().debugStream() << "Starting Fleet Plans:"; for (iterator it = begin(); it != end(); ++it) { const FleetPlan& p = *it; Logger().debugStream() << " ... " << p.Name(); } -//#endif +#endif } /** returns the singleton fleet plan manager */ @@ -2432,13 +2412,13 @@ if (!result.full) ReportError(input.c_str(), result); -//#ifdef OUTPUT_ITEM_SPECS_LIST +#ifdef OUTPUT_ITEM_SPECS_LIST Logger().debugStream() << "Starting Unlocked Item Specs:"; for (iterator it = begin(); it != end(); ++it) { const ItemSpec& item = *it; Logger().debugStream() << " ... " << boost::lexical_cast<std::string>(item.type) << " : " << item.name; } -//#endif +#endif } void ItemSpecManager::AddItemsToEmpire(Empire* empire) const { @@ -3287,13 +3267,13 @@ int planet_id, home_orbit; std::string planet_name; // we can only select a planet if there are planets in this system. - if (system->Orbits()>0 && !system->FindObjects<Planet>().empty()) { + if (system->Orbits() >0 && !system->FindObjects<Planet>().empty()) { std::vector<int> vec_orbits; - for(int i=0;i<system->Orbits();i++) - if(system->FindObjectIDsInOrbit<Planet>(i).size()>0) + for (int i = 0; i < system->Orbits(); i++) + if (system->FindObjectIDsInOrbit<Planet>(i).size() > 0) vec_orbits.push_back(i); - int planet_index = vec_orbits.size()>1?RandSmallInt(0, vec_orbits.size() - 1):0; + int planet_index = vec_orbits.size() > 1 ? RandSmallInt(0, vec_orbits.size() - 1) : 0; planet_name = system->Name() + " " + RomanNumber(planet_index + 1); home_orbit = vec_orbits[planet_index]; Delete(system->FindObjectIDsInOrbit<Planet>(home_orbit).back()); @@ -3398,15 +3378,16 @@ } } - Logger().debugStream() << "creating empire: " << empire_name; + Logger().debugStream() << "creating empire named: " << empire_name; int home_planet_id = homeworlds[i]; // create new Empire object through empire manager Empire* empire = Empires().CreateEmpire((*it)->ID(), empire_name, (*it)->PlayerName(), color, home_planet_id); + int empire_id = empire->EmpireID(); + // set ownership of home planet - int empire_id = empire->EmpireID(); Planet* home_planet = Object<Planet>(homeworlds[i]); Logger().debugStream() << "Setting " << home_planet->GetSystem()->Name() << " (Planet #" << home_planet->ID() << ") to be home system for Empire " << empire_id; @@ -3415,111 +3396,70 @@ System* home_system = home_planet->GetSystem(); home_system->AddOwner(empire_id); - // give homeworld's a shipyard so players can build ships immediately + + // give homeworlds a shipyard so players can build ships immediately Building* shipyard = new Building(empire_id, "BLD_SHIPYARD_BASE", UniverseObject::INVALID_OBJECT_ID); int shipyard_id = Insert(shipyard); home_planet->AddBuilding(shipyard_id); - // create population and industry on home planet + // add homeworld special and set double balanced default focus home_planet->AddSpecial("HOMEWORLD_SPECIAL"); home_planet->SetPrimaryFocus(FOCUS_BALANCED); home_planet->SetSecondaryFocus(FOCUS_BALANCED); - // grant empire access to some initial buildings, ship parts and hulls - empire->AddBuildingType("BLD_IMPERIAL_PALACE"); - empire->AddPartType("SR_LASER"); - empire->AddPartType("SH_DEFENSE_GRID"); - empire->AddPartType("CO_COLONY_POD"); + // give new empire items and ship designs it should start with + starting_unlocked_items.AddItemsToEmpire(empire); - empire->AddHullType("SH_SMALL"); + std::map<std::string, int> design_ids = predefined_ship_designs.AddShipDesignsToEmpire(empire); - std::vector<std::string> parts; - ShipDesign* design = 0; - // create the empire's initial ship designs - parts.resize(GetHullType("SH_SMALL")->NumSlots(), ""); - design = new ShipDesign("Scout", "Small and cheap unarmed vessel designed for recon and exploration.", - empire_id, 0, "SH_SMALL", parts, "misc/scout1.png", "model"); - int scout_design_id = empire->AddShipDesign(design); + // create new empire's starting fleets + for (FleetPlanManager::iterator it = starting_fleet_plans.begin(); it != starting_fleet_plans.end(); ++it) { - parts.clear(); - parts.resize(GetHullType("SH_MEDIUM")->NumSlots(), ""); - parts[4] = "CO_COLONY_POD"; - design = new ShipDesign("Colony Ship", "Huge unarmed vessel capable of delivering millions of citizens safely to new colony sites.", - empire_id, 0, "SH_MEDIUM", parts, "misc/colony1.png", "model"); - int colony_ship_design_id = empire->AddShipDesign(design); + // create fleet itself + const std::string& fleet_name = it->Name(); + Fleet* fleet = new Fleet(fleet_name, home_system->X(), home_system->Y(), empire_id); + if (!fleet) { + Logger().errorStream() << "unable to create new fleet!"; + break; + } + Insert(fleet); + home_system->Insert(fleet); - parts.clear(); - parts.resize(GetHullType("SH_SMALL")->NumSlots(), ""); - parts[0] = "SR_LASER"; - parts[1] = "SH_DEFENSE_GRID"; - design = new ShipDesign("Mark I", "Affordable armed patrol frigate.", - empire_id, 0, "SH_SMALL", parts, "misc/mark1.png", "model"); - int mark_I_design_id = empire->AddShipDesign(design); - parts.resize(GetHullType("SH_SMALL")->NumSlots(), ""); - parts[0] = "SR_ION_CANNON"; - parts[1] = "SH_DEFENSE_GRID"; - design = new ShipDesign("Mark II", "Cruiser with strong defensive and offensive capabilities.", - empire_id, 0, "SH_SMALL", parts, "misc/mark2.png", "model"); - int temp = empire->AddShipDesign(design); + // create ships and add to fleet + const std::vector<std::string>& ship_design_names = it->ShipDesigns(); + for (std::vector<std::string>::const_iterator ship_it = ship_design_names.begin(); ship_it != ship_design_names.end(); ++ship_it) { + // get universe id of design by looking up name in this empire's map from name to design id + const std::string& design_name = *ship_it; + std::map<std::string, int>::const_iterator design_it = design_ids.find(design_name); + if (design_it != design_ids.end()) { + // get actual design from universe + int design_id = design_it->second; + const ShipDesign* design = GetShipDesign(design_id); + if (!design) { + Logger().errorStream() << "unable to get ShipDesign with id " << design_id << " and name " << design_name; + continue; + } - parts.resize(GetHullType("SH_MEDIUM")->NumSlots(), ""); - parts[0] = "SR_ION_CANNON"; - parts[1] = "SH_DEFENSE_GRID"; - parts[2] = "SR_ION_CANNON"; - parts[3] = "SH_DEFLECTOR"; - design = new ShipDesign("Mark III", "Advanced cruiser with heavy weaponry and armor to do the dirty work.", - empire_id, 0, "SH_MEDIUM", parts, "misc/mark3.png", "model"); - temp = empire->AddShipDesign(design); + // create new ship + Ship* ship = new Ship(empire_id, design_id); + if (!ship) { + Logger().errorStream() << "unable to create new ship!"; + break; + } + ship->Rename(empire->NewShipName()); + int ship_id = Insert(ship); - parts.resize(GetHullType("SH_LARGE")->NumSlots(), ""); - parts[0] = "SR_ION_CANNON"; - parts[1] = "SH_DEFENSE_GRID"; - parts[2] = "SR_ION_CANNON"; - parts[3] = "SH_DEFLECTOR"; - parts[4] = "SR_ION_CANNON"; - parts[5] = "SH_DEFLECTOR"; - design = new ShipDesign("Mark IV", "Massive state-of-art warship armed and protected with the latest technolgy. Priced accordingly.", - empire_id, 0, "SH_LARGE", parts, "misc/mark4.png", "model"); - temp = empire->AddShipDesign(design); - - - // create the empire's starting fleet - Fleet* home_fleet = new Fleet(UserString("FW_HOME_FLEET"), home_system->X(), home_system->Y(), empire_id); - Insert(home_fleet); - home_system->Insert(home_fleet); - - Ship* ship = 0; - int ship_id = -1; - - // scouts for The Silent One to explore with - for (int n = 0; n < 2; ++n) { - ship = new Ship(empire_id, scout_design_id); - ship->Rename(empire->NewShipName()); - ship_id = Insert(ship); - home_fleet->AddShip(ship_id); + // add ship to fleet + fleet->AddShip(ship_id); // also moves ship to fleet's location and inserts into system + } else { // design_it == design_ids.end() + Logger().errorStream() << "couldn't find design name " << design_name << " in map from design names to ids of designs added to empire"; + } + } } - - // colony ships for The Silent One to test colonization - for (int n = 0; n < 1; ++n) { - ship = new Ship(empire_id, colony_ship_design_id); - ship->Rename(empire->NewShipName()); - ship_id = Insert(ship); - home_fleet->AddShip(ship_id); - } - - // create a battle fleet - Fleet* battle_fleet = new Fleet(UserString("FW_BATTLE_FLEET"), home_system->X(), home_system->Y(), empire_id); - Insert(battle_fleet); - home_system->Insert(battle_fleet); - - ship = new Ship(empire_id, mark_I_design_id); - ship->Rename(empire->NewShipName()); - ship_id = Insert(ship); - battle_fleet->AddShip(ship_id); } #else throw std::runtime_error("Non-server called Universe::GenerateEmpires; only server should call this while creating the universe"); |
From: <geo...@us...> - 2009-05-10 22:17:34
|
Revision: 3025 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3025&view=rev Author: geoffthemedio Date: 2009-05-10 22:17:24 +0000 (Sun, 10 May 2009) Log Message: ----------- Made buildings, ship and techs NOT cheap and fast using recently-added flags. Modified Paths: -------------- trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/Tech.cpp Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-05-10 22:03:06 UTC (rev 3024) +++ trunk/FreeOrion/universe/Building.cpp 2009-05-10 22:17:24 UTC (rev 3025) @@ -22,7 +22,7 @@ extern int g_indent; namespace { - const bool CHEAP_AND_FAST_BUILDING_PRODUCTION = true; // makes all buildings cost 1 PP and take 1 turn to build + const bool CHEAP_AND_FAST_BUILDING_PRODUCTION = false; // makes all buildings cost 1 PP and take 1 turn to build } namespace { Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2009-05-10 22:03:06 UTC (rev 3024) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2009-05-10 22:17:24 UTC (rev 3025) @@ -16,7 +16,7 @@ extern int g_indent; namespace { - const bool CHEAP_AND_FAST_SHIP_PRODUCTION = true; // makes all ships cost 1 PP and take 1 turn to build + const bool CHEAP_AND_FAST_SHIP_PRODUCTION = false; // makes all ships cost 1 PP and take 1 turn to build } namespace { Modified: trunk/FreeOrion/universe/Tech.cpp =================================================================== --- trunk/FreeOrion/universe/Tech.cpp 2009-05-10 22:03:06 UTC (rev 3024) +++ trunk/FreeOrion/universe/Tech.cpp 2009-05-10 22:17:24 UTC (rev 3025) @@ -16,7 +16,7 @@ extern int g_indent; namespace { - const bool CHEAP_AND_FAST_TECH_RESEARCH = true; // makes all techs cost 1 RP and take 1 turn to research + const bool CHEAP_AND_FAST_TECH_RESEARCH = false; // makes all techs cost 1 RP and take 1 turn to research } struct store_tech_impl |
From: <geo...@us...> - 2009-05-21 19:57:43
|
Revision: 3076 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3076&view=rev Author: geoffthemedio Date: 2009-05-21 19:57:22 +0000 (Thu, 21 May 2009) Log Message: ----------- Fixed bug 2792876 Part Effects Don't Stack by storing sourced effects groups and corresponding target sets in a multimap instead of a map, allowing multiple copies of the same effects group with the same source object to execute on the same target set. Previously only one copy each sourced effects group could be stored in the map, making multiple copies of the same ship part not duplicate effects, since all part effects have the same source object (the ship containing the parts). This issue would also have prevented multiple copies of specials from stacking effects, but presently only one copy of each special can be attached to a particular UniverseObject. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-05-21 17:43:21 UTC (rev 3075) +++ trunk/FreeOrion/universe/Universe.cpp 2009-05-21 19:57:22 UTC (rev 3076) @@ -996,11 +996,21 @@ std::vector<boost::shared_ptr<const Effect::EffectsGroup> >::const_iterator effects_it; for (effects_it = effects_groups.begin(); effects_it != effects_groups.end(); ++effects_it) { boost::shared_ptr<const Effect::EffectsGroup> effects_group = *effects_it; - SourcedEffectsGroup sourced_effects_group(source_object_id, effects_group); // combine effects group and source object id into sourced effects group - EffectCause effect_cause(effect_cause_type, specific_cause_name); // combine cause type and specific cause into effect cause - effects_group->GetTargetSet(source_object_id, target_set, potential_target_set);// get set of target objects for this effects group from potential targets specified - EffectTargetAndCause target_and_cause(target_set, effect_cause); // combine target set and effect cause - targets_causes_map[sourced_effects_group] = target_and_cause; // store effect cause and targets info in map, indexed by sourced effects group + + // combine effects group and source object id into a sourced effects group + SourcedEffectsGroup sourced_effects_group(source_object_id, effects_group); + + // combine cause type and specific cause into effect cause + EffectCause effect_cause(effect_cause_type, specific_cause_name); + + // get set of target objects for this effects group from potential targets specified + effects_group->GetTargetSet(source_object_id, target_set, potential_target_set); + + // combine target set and effect cause + EffectTargetAndCause target_and_cause(target_set, effect_cause); + + // store effect cause and targets info in map, indexed by sourced effects group + targets_causes_map.insert(std::make_pair(sourced_effects_group, target_and_cause)); } } Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2009-05-21 17:43:21 UTC (rev 3075) +++ trunk/FreeOrion/universe/Universe.h 2009-05-21 19:57:22 UTC (rev 3076) @@ -77,8 +77,13 @@ Effect::EffectsGroup::TargetSet target_set; EffectCause effect_cause; }; - /** Map from (effects group and source object) to target set of for that effects group with that source object. */ - typedef std::map<SourcedEffectsGroup, EffectTargetAndCause> EffectsTargetsCausesMap; + /** Map from (effects group and source object) to target set of for + * that effects group with that source object. A multiset is used + * so that a single source object can have multiple instances of the + * same effectsgroup. This is useful when a Ship has multiple copies + * of the same effects group due to having multiple copies of the same + * ship part in its design. */ + typedef std::multimap<SourcedEffectsGroup, EffectTargetAndCause> EffectsTargetsCausesMap; /** Accounting information about what the causes are and changes produced by effects groups acting on meters of objects. */ struct EffectAccountingInfo : public EffectCause { |
From: <geo...@us...> - 2009-09-06 05:24:07
|
Revision: 3144 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3144&view=rev Author: geoffthemedio Date: 2009-09-06 05:23:58 +0000 (Sun, 06 Sep 2009) Log Message: ----------- -Fixed bug with construction meter growth prediction where clamping wasn't being applied to the proper meter -Changed meter growth for construction and resource meters to a fixed +1 / turn, which I think is much easier to understand -Tweaked And and Or conditions to remove redundant complexity / groom Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/ResourceCenter.cpp Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2009-09-05 23:50:39 UTC (rev 3143) +++ trunk/FreeOrion/universe/Condition.cpp 2009-09-06 05:23:58 UTC (rev 3144) @@ -1497,10 +1497,7 @@ // if search domain is non targets, evalucate first operand condition on non targets, to assemble an // initial targets set. if search domain is targets, evaluate first (and all other) operand condition // on existing targets set - if (search_domain == NON_TARGETS) - m_operands[0]->Eval(source, targets, non_targets); - else - m_operands[0]->Eval(source, targets, non_targets, TARGETS); + m_operands[0]->Eval(source, targets, non_targets, search_domain); // regardless of whether search domain is TARGET or NON_TARGETS, evaluate remaining operand conditions // on targets set, removing any targets that don't meet additional conditions, and stopping early if all @@ -1561,25 +1558,24 @@ if (search_domain == NON_TARGETS) { // if search domain is non targets, evalucate with search domain non_targets on each operand condition, using // the remaining non_targets from the previous operand condition as the non_targets for the next operand condition - + for (unsigned int i = 0; i < m_operands.size(); ++i) { if (non_targets.empty()) break; - m_operands[i]->Eval(source, targets, non_targets); + m_operands[i]->Eval(source, targets, non_targets, NON_TARGETS); } - } - else - { + + } else { // if search domain is targets, create a temporary empty new_targets set, and use the targets set as the // effective non_targets set while evaluating each condition on the effective non_targets set. this way, // if a target set object matches any conditions, it will be added to the new_targets set. after evaluating // all conditions on the effective non_targets set, add the remaining objects to the real non_targets set, // and set the real targets set equal to the new_targets set - + ObjectSet new_targets; // new empty targets set ObjectSet& temp_non_targets = targets; for (unsigned int i = 0; i < m_operands.size(); ++i) { if (temp_non_targets.empty()) break; - m_operands[i]->Eval(source, new_targets, temp_non_targets); + m_operands[i]->Eval(source, new_targets, temp_non_targets, NON_TARGETS); } non_targets.insert(temp_non_targets.begin(), temp_non_targets.end()); // move targets set object that didn't match any conditions to non_targets set targets = new_targets; // set targets set equal to set of objects that matched at least one condition Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2009-09-05 23:50:39 UTC (rev 3143) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2009-09-06 05:23:58 UTC (rev 3144) @@ -58,7 +58,7 @@ assert(resource_meter); double initial_current = resource_meter->InitialCurrent(); - double delta = updated_current_construction / (10.0 + initial_current); + double delta = 1.0; resource_meter->AdjustCurrent(delta); } @@ -69,7 +69,7 @@ double initial_current = construction_meter->InitialCurrent(); double initial_max = construction_meter->InitialMax(); - double delta = (initial_current + 1) * ((initial_max - initial_current) / (initial_max + 1)) * (updated_current_population * 10.0) * 0.01; + double delta = 1.0; construction_meter->AdjustCurrent(delta); } @@ -106,13 +106,14 @@ case METER_RESEARCH: case METER_TRADE: GrowConstructionMeter(&construction, GetPopMeter()->Current()); + construction.Clamp(); GrowResourceMeter(&meter, construction.Current()); meter.Clamp(); return meter.Current(); break; case METER_CONSTRUCTION: GrowConstructionMeter(&construction, GetPopMeter()->Current()); - meter.Clamp(); + construction.Clamp(); return construction.Current(); break; default: |
From: <geo...@us...> - 2009-09-06 21:06:28
|
Revision: 3146 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3146&view=rev Author: geoffthemedio Date: 2009-09-06 21:06:20 +0000 (Sun, 06 Sep 2009) Log Message: ----------- -Made ships regenerate 0.1 fuel / turn every turn, so that they can't become permanently stuck without fuel. -Changed Planet visiblity determination to not be visible if the containing system has basic visibility (a player knows it exists, but not its name or anything about its contents). Previously, planets had the same visibility as their containing system, meaning players' clients actually knew about all planets in the universe, since all systems have basic visibility until they're explored (at which point the systems get partial or full visibility). -Changed Universe::StoreTargetsAndCausesOfEffectsGroups to start with a fresh set of potential targets for each effectsgroup is processes. Previously, the same potential targets set was used for each effectsgroup, which meant that the previous effectsgroup's results were used as input to the next effectsgroup, which I suspect was causing problems, but haven't thoroughly tested since I'm working on some other condition bugs that make it hard to tell what exactly is going on. Modified Paths: -------------- trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-09-06 07:09:55 UTC (rev 3145) +++ trunk/FreeOrion/universe/Planet.cpp 2009-09-06 21:06:20 UTC (rev 3146) @@ -205,12 +205,14 @@ Visibility Planet::GetVisibility(int empire_id) const { - // use the containing system's visibility - const System* system = GetSystem(); - if (system) - return system->GetVisibility(empire_id); - else - return VIS_NO_VISIBILITY; + // if empire_id knows more than basic visiblity of a system, it can + // see into the system and can see its planets. + if (const System* system = GetSystem()) { + Visibility system_vis = system->GetVisibility(empire_id); + if (system_vis > VIS_BASIC_VISIBILITY) + return system_vis; + } + return VIS_NO_VISIBILITY; } UniverseObject* Planet::Accept(const UniverseObjectVisitor& visitor) const Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-09-06 07:09:55 UTC (rev 3145) +++ trunk/FreeOrion/universe/Ship.cpp 2009-09-06 21:06:20 UTC (rev 3146) @@ -6,6 +6,12 @@ #include "Predicates.h" #include "ShipDesign.h" +namespace { + void GrowFuelMeter(Meter* fuel_meter) { + assert(fuel_meter); + fuel_meter->AdjustCurrent(0.1); + } +} Ship::Ship() : m_design_id(INVALID_OBJECT_ID), @@ -174,4 +180,5 @@ } void Ship::PopGrowthProductionResearchPhase() { + GrowFuelMeter(GetMeter(METER_FUEL)); } Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-09-06 07:09:55 UTC (rev 3145) +++ trunk/FreeOrion/universe/Universe.cpp 2009-09-06 21:06:20 UTC (rev 3146) @@ -931,7 +931,7 @@ } } - // 2) EffectsGroups from Specials + // 2) EffectsGroups from Techs for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { const Empire* empire = it->second; for (Empire::TechItr tech_it = empire->TechBegin(); tech_it != empire->TechEnd(); ++tech_it) { @@ -986,15 +986,19 @@ const std::string& specific_cause_name, const std::vector<int>& target_objects, EffectsTargetsCausesMap& targets_causes_map) { - Effect::EffectsGroup::TargetSet potential_target_set; + // transfer target objects from input vector to a set + Effect::EffectsGroup::TargetSet all_potential_targets; for (std::vector<int>::const_iterator it = target_objects.begin(); it != target_objects.end(); ++it) - potential_target_set.insert(Object(*it)); + all_potential_targets.insert(Object(*it)); - Effect::EffectsGroup::TargetSet target_set; - // process all effects groups in set provided std::vector<boost::shared_ptr<const Effect::EffectsGroup> >::const_iterator effects_it; for (effects_it = effects_groups.begin(); effects_it != effects_groups.end(); ++effects_it) { + // create non_targets and targets sets for current effects group + Effect::EffectsGroup::TargetSet target_set; // initially empty + Effect::EffectsGroup::TargetSet potential_target_set = all_potential_targets; // copy again each iteration, so previous iterations don't affect starting potential targets of next iteration + + // get effects group to process for this iteration boost::shared_ptr<const Effect::EffectsGroup> effects_group = *effects_it; // combine effects group and source object id into a sourced effects group @@ -1004,7 +1008,7 @@ EffectCause effect_cause(effect_cause_type, specific_cause_name); // get set of target objects for this effects group from potential targets specified - effects_group->GetTargetSet(source_object_id, target_set, potential_target_set); + effects_group->GetTargetSet(source_object_id, target_set, potential_target_set); // transfers objects from potential_target_set to target_set if they meet the condition // combine target set and effect cause EffectTargetAndCause target_and_cause(target_set, effect_cause); |
From: <geo...@us...> - 2009-09-07 11:13:21
|
Revision: 3148 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3148&view=rev Author: geoffthemedio Date: 2009-09-07 11:13:09 +0000 (Mon, 07 Sep 2009) Log Message: ----------- -Fixed Number Condition Eval function, which wasn't removing objects from the search domain, resulting in matched objects being in both sets -Completely rewrote NumberOf Condition Eval function to be much clearer and (I think, though am now forgetting details) fix bugs with how objects in input targets and non_targets sets were tracked and which objects got put into the results -Completely rewrote WithinDistance Condition Eval function to be clearer and to fix at least one bug where all objects would be matched when searching targets and there were no objects matched by the sub condition -Added some commented-out debug output in the And condition, and actual comments in a few other places in Condition.cpp Modified Paths: -------------- trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Condition.cpp Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-09-07 00:45:32 UTC (rev 3147) +++ trunk/FreeOrion/universe/Building.cpp 2009-09-07 11:13:09 UTC (rev 3148) @@ -233,13 +233,13 @@ UniverseObject* loc = universe.Object(location_id); if (!loc) return false; - Empire * empire = Empires().Lookup(empire_id); + Empire* empire = Empires().Lookup(empire_id); if (!empire) { Logger().debugStream() << "BuildingType::ProductionLocation: Unable to get pointer to empire " << empire_id; return false; } - UniverseObject * source = universe.Object(empire->CapitolID()); + UniverseObject* source = universe.Object(empire->CapitolID()); if (!source) return false; locations.insert(loc); Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2009-09-07 00:45:32 UTC (rev 3147) +++ trunk/FreeOrion/universe/Condition.cpp 2009-09-07 11:13:09 UTC (rev 3148) @@ -31,6 +31,20 @@ } return retval; } + + std::string GetTypeName(const UniverseObject* obj) { + if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) + return "Fleet"; + if (const Ship* fleet = universe_object_cast<const Ship*>(obj)) + return "Ship"; + if (const Planet* fleet = universe_object_cast<const Planet*>(obj)) + return "Planet"; + if (const System* fleet = universe_object_cast<const System*>(obj)) + return "System"; + if (const Building* fleet = universe_object_cast<const Building*>(obj)) + return "Building"; + return "UniverseObject"; + } } /////////////////////////////////////////////////////////// @@ -111,8 +125,7 @@ return retval; } -void Condition::Number::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, - SearchDomain search_domain/* = NON_TARGETS*/) const +void Condition::Number::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, SearchDomain search_domain/* = NON_TARGETS*/) const { // get set of all UniverseObjects that satisfy m_condition ObjectSet condition_targets; @@ -121,7 +134,7 @@ for (Universe::const_iterator uit = universe.begin(); uit != universe.end(); ++uit) { condition_non_targets.insert(uit->second); } - m_condition->Eval(source, condition_targets, condition_non_targets); + m_condition->Eval(source, condition_targets, condition_non_targets, NON_TARGETS); // compare number of objects that satisfy m_condition to the acceptable range of such objects int matched = condition_targets.size(); @@ -129,11 +142,15 @@ int high = m_high->Eval(source, source); bool in_range = (low <= matched && matched < high); + // transfer objects to or from target set, according to whether number of matches was within + // the requested range. if (search_domain == TARGETS && !in_range) { non_targets.insert(targets.begin(), targets.end()); + targets.clear(); } if (search_domain == NON_TARGETS && in_range) { targets.insert(non_targets.begin(), non_targets.end()); + non_targets.clear(); } } @@ -180,6 +197,43 @@ /////////////////////////////////////////////////////////// // NumberOf // /////////////////////////////////////////////////////////// +namespace { + /** Random number genrator function to use with random_shuffle */ + int CustomRandInt(int max_plus_one) { + return RandSmallInt(0, max_plus_one - 1); + } + int (*CRI)(int) = CustomRandInt; + + + /** Transfers the indicated \a number of objects from from_set to to_set */ + void TransferObjects(unsigned int number, Condition::ObjectSet& from_set, Condition::ObjectSet& to_set) { + // ensure number of objects to be moved is within reasonable range + number = std::min<unsigned int>(number, from_set.size()); + if (number == 0) + return; + + // create list of bool flags to indicate whether each item in from_set + // with corresponding place in iteration order should be transfered + std::vector<bool> transfer_flags(from_set.size(), false); // initialized to all false + + // set first number flags to true + std::fill_n(transfer_flags.begin(), number, true); + + // shuffle flags to randomize which flags are set + std::random_shuffle(transfer_flags.begin(), transfer_flags.end(), CRI); + + // transfer objects that have been flagged + int i = 0; + for (Condition::ObjectSet::iterator it = from_set.begin() ; it != from_set.end(); ++i) { + Condition::ObjectSet::iterator temp = it++; + if (transfer_flags[i]) { + to_set.insert(*temp); + from_set.erase(temp); + } + } + } +} + Condition::NumberOf::NumberOf(const ValueRef::ValueRefBase<int>* number, const ConditionBase* condition) : m_number(number), m_condition(condition) @@ -215,44 +269,35 @@ void Condition::NumberOf::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, SearchDomain search_domain/* = NON_TARGETS*/) const { - // get set of all UniverseObjects that satisfy m_condition - ObjectSet condition_targets; - ObjectSet condition_non_targets; - const Universe& universe = GetUniverse(); - for (Universe::const_iterator uit = universe.begin(); uit != universe.end(); ++uit) { - condition_non_targets.insert(uit->second); - } - m_condition->Eval(source, condition_targets, condition_non_targets); - - // find the desired number of objects in condition_targets int number = m_number->Eval(source, source); - std::vector<bool> inclusion_list(condition_targets.size()); - std::vector<int> selection_list(condition_targets.size()); - for (unsigned int i = 0; i < selection_list.size(); ++i) { - selection_list[i] = i; - } - for (int i = 0; i < std::min(number, static_cast<int>(condition_targets.size())); ++i) { - int temp = RandSmallInt(0, selection_list.size() - 1); - int selection = selection_list[temp]; - inclusion_list[selection] = true; - selection_list.erase(selection_list.begin() + temp); - } - int i = 0; - for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it, ++i) { - ObjectSet& from_set = search_domain == TARGETS ? targets : non_targets; - ObjectSet& to_set = search_domain == TARGETS ? non_targets : targets; - if (search_domain == TARGETS ? !inclusion_list[i] : inclusion_list[i]) { - to_set.insert(*it); - from_set.erase(*it); - } - } + if (search_domain == NON_TARGETS) { + // find items in non_targets set that match the test condition + ObjectSet matched_non_targets; + m_condition->Eval(source, matched_non_targets, non_targets, NON_TARGETS); - if (search_domain == TARGETS) { - for (ObjectSet::const_iterator it = condition_non_targets.begin(); it != condition_non_targets.end(); ++it) { - non_targets.insert(*it); - targets.erase(*it); - } + // transfer the indicated number of matched_non_targets to targets + TransferObjects(number, matched_non_targets, targets); + + // move remainder of matched_non_targets back to non_targets + non_targets.insert(matched_non_targets.begin(), matched_non_targets.end()); + matched_non_targets.clear(); + + } else { + // find items in targets set that don't match test condition, and move + // directly to non_targets + m_condition->Eval(source, targets, non_targets, TARGETS); + + // move all matched targets to matched_targets set + ObjectSet matched_targets = targets; + targets.clear(); + + // transfer desired number of matched_targets back to targets set + TransferObjects(number, matched_targets, targets); + + // move remainder to non_targets set + non_targets.insert(matched_targets.begin(), matched_targets.end()); + matched_targets.clear(); } } @@ -265,9 +310,12 @@ void Condition::All::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, SearchDomain search_domain/* = NON_TARGETS*/) const { if (search_domain == NON_TARGETS) { + // move all objects from non_targets to targets targets.insert(non_targets.begin(), non_targets.end()); non_targets.clear(); } + // if search_comain is TARGETS, do nothing: all objects in target set + // match this condition, so should remain in target set } std::string Condition::All::Description(bool negated/* = false*/) const @@ -1286,24 +1334,72 @@ ObjectSet condition_targets; ObjectSet condition_non_targets; const Universe& universe = GetUniverse(); - for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) condition_non_targets.insert(it->second); - } m_condition->Eval(source, condition_targets, condition_non_targets); - // determine which objects in the Universe are within the specified distance from the objects in condition_targets - for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { - ObjectSet& from_set = search_domain == TARGETS ? targets : non_targets; - ObjectSet& to_set = search_domain == TARGETS ? non_targets : targets; - ObjectSet::iterator it2 = from_set.begin(); - ObjectSet::iterator end_it2 = from_set.end(); - for ( ; it2 != end_it2; ) { - ObjectSet::iterator temp = it2++; - if (search_domain == TARGETS ? !Match(*it, *temp) : Match(*it, *temp)) { - to_set.insert(*temp); - from_set.erase(temp); + + //std::cout << "WithinDistance::Eval: objects meeting operand condition: " << m_condition->Dump() << std::endl; + //for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) + // std::cout << "... " << GetTypeName(*it) << " " << (*it)->Name() << std::endl; + //std::cout << std::endl; + + + if (search_domain == NON_TARGETS) { + // to be transferred to targets, object initially in non_targets + // needs to be within required distance of at least one + // condition_target + + // check each non_target + for (ObjectSet::iterator non_targets_it = non_targets.begin() ; non_targets_it != non_targets.end();) { + + // get current object while incrementing main iterator + ObjectSet::iterator current_non_target_it = non_targets_it++; + UniverseObject* non_target_obj = *current_non_target_it; + + // see if current object is within required distance of any condition target + for (ObjectSet::iterator condition_targets_it = condition_targets.begin(); condition_targets_it != condition_targets.end(); ++condition_targets_it) { + if (Match(non_target_obj, *condition_targets_it)) { + // current object is within required distance of current condition target. + // transfer current object to targets set + targets.insert(non_target_obj); + non_targets.erase(current_non_target_it); + break; + } } } + + } else { + // to be transferred to non_targets, object initially in targets needs + // to be not within required distance of all/any condition targets + + // transfer targets into temp storage + ObjectSet initial_targets = targets; + targets.clear(); + + // check initial targets + for (ObjectSet::iterator initial_targets_it = initial_targets.begin() ; initial_targets_it != initial_targets.end();) { + + // get current object while incrementing main iterator + ObjectSet::iterator current_initial_target_it = initial_targets_it++; + UniverseObject* initial_target_obj = *current_initial_target_it; + + // see if current object is within required distance of any condition target + for (ObjectSet::iterator condition_targets_it = condition_targets.begin(); condition_targets_it != condition_targets.end(); ++condition_targets_it) { + if (Match(initial_target_obj, *condition_targets_it)) { + // current object is within required distance of current condition target. + // transfer current object to back to targets set + targets.insert(initial_target_obj); + initial_targets.erase(current_initial_target_it); + break; + } + } + } + + // move any initial_targets that weren't in range of any condition + // target into non_targets + non_targets.insert(initial_targets.begin(), initial_targets.end()); + initial_targets.clear(); } } @@ -1494,6 +1590,16 @@ void Condition::And::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, SearchDomain search_domain/* = NON_TARGETS*/) const { + //std::cout << "And::Eval: input targets:" << std::endl; + //for (ObjectSet::const_iterator it = targets.begin(); it != targets.end(); ++it) + // std::cout << "... " << GetTypeName(*it) << " " << (*it)->Name() << std::endl; + //std::cout << std::endl; + + //std::cout << "And::Eval: input non_targets:" << std::endl; + //for (ObjectSet::const_iterator it = non_targets.begin(); it != non_targets.end(); ++it) + // std::cout << "... " << GetTypeName(*it) << " " << (*it)->Name() << std::endl; + //std::cout << std::endl; + if (search_domain == NON_TARGETS) { ObjectSet partly_checked_non_targets; @@ -1501,17 +1607,27 @@ // partly_checked_non_targets set m_operands[0]->Eval(source, partly_checked_non_targets, non_targets, NON_TARGETS); + //std::cout << "And::Eval: non_target input objects meeting first condition: " << m_operands[0]->Dump() << std::endl; + //for (ObjectSet::const_iterator it = partly_checked_non_targets.begin(); it != partly_checked_non_targets.end(); ++it) + // std::cout << "... " << GetTypeName(*it) << " " << (*it)->Name() << std::endl; + //std::cout << std::endl; + // move items that don't pass one of the other conditions back to non_targets for (unsigned int i = 1; i < m_operands.size(); ++i) { if (partly_checked_non_targets.empty()) break; m_operands[i]->Eval(source, partly_checked_non_targets, non_targets, TARGETS); + + //std::cout << "And::Eval: non_target input objects also meeting " << i + 1 <<"th condition: " << m_operands[i]->Dump() << std::endl; + //for (ObjectSet::const_iterator it = partly_checked_non_targets.begin(); it != partly_checked_non_targets.end(); ++it) + // std::cout << "... " << GetTypeName(*it) << " " << (*it)->Name() << std::endl; + //std::cout << std::endl; } // merge items that passed all operand conditions into targets targets.insert(partly_checked_non_targets.begin(), partly_checked_non_targets.end()); partly_checked_non_targets.clear(); - // items already in targets set are not checked/ and remain in targets set even if + // items already in targets set are not checked, and remain in targets set even if // they don't match one of the operand conditions } else { @@ -1522,6 +1638,9 @@ if (targets.empty()) break; m_operands[i]->Eval(source, targets, non_targets, TARGETS); } + + // items already in non_targets set are not checked, and remain in non_targets set + // even if they pass all operand conditions } } @@ -1582,6 +1701,9 @@ m_operands[i]->Eval(source, targets, non_targets, NON_TARGETS); } + // items already in targets set are not checked and remain in the + // targets set even if they fail all the operand conditions + } else { ObjectSet partly_checked_targets; @@ -1600,7 +1722,8 @@ partly_checked_targets.clear(); // items already in non_targets set are not checked and remain in - // non_targets set even if they pass one or more of the conditions + // non_targets set even if they pass one or more of the operand + // conditions } } |
From: <geo...@us...> - 2009-09-11 04:39:19
|
Revision: 3157 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3157&view=rev Author: geoffthemedio Date: 2009-09-11 04:39:13 +0000 (Fri, 11 Sep 2009) Log Message: ----------- -Made EffectsGroup::Execute abort if the source object doesn't exist, rather than failing an assert, since there are possibly cases, such as after an object has been destroyed by another effect, where an effect might get executed with a now-missing source object. In future, this can probably be made even more lenient, since many effects don't actually require the source object to exist when executing (although it is probably always required when scope and activation conditions are checked). -Made Universe::DestroyImpl use Universe::Destroy rather than Universe::Delete to do its destroying. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2009-09-10 10:09:12 UTC (rev 3156) +++ trunk/FreeOrion/universe/Effect.cpp 2009-09-11 04:39:13 UTC (rev 3157) @@ -239,28 +239,33 @@ void EffectsGroup::Execute(int source_id, const TargetSet& targets) const { UniverseObject* source = GetUniverse().Object(source_id); - assert(source); + if (!source) { + Logger().errorStream() << "EffectsGroup::Execute unable to get source object with id " << source_id; + return; + } // execute effects on targets for (Condition::ObjectSet::const_iterator it = targets.begin(); it != targets.end(); ++it) { //Logger().debugStream() << "effectsgroup source: " << source->Name() << " target " << (*it)->Name(); - for (unsigned int i = 0; i < m_effects.size(); ++i) { + for (unsigned int i = 0; i < m_effects.size(); ++i) m_effects[i]->Execute(source, *it); - } } } void EffectsGroup::Execute(int source_id, const TargetSet& targets, int effect_index) const { UniverseObject* source = GetUniverse().Object(source_id); - assert(source); + if (!source) { + // TODO: Don't necessarily need to abort at this stage... some effects can function without a source object. + Logger().errorStream() << "EffectsGroup::Execute unable to get source object with id " << source_id; + return; + } assert(0 <= effect_index && effect_index < static_cast<int>(m_effects.size())); // execute effect on targets - for (Condition::ObjectSet::const_iterator it = targets.begin(); it != targets.end(); ++it) { + for (Condition::ObjectSet::const_iterator it = targets.begin(); it != targets.end(); ++it) m_effects[effect_index]->Execute(source, *it); - } } const std::string& EffectsGroup::StackingGroup() const Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-09-10 10:09:12 UTC (rev 3156) +++ trunk/FreeOrion/universe/Universe.cpp 2009-09-11 04:39:13 UTC (rev 3157) @@ -1169,9 +1169,9 @@ m_destroyed_object_knowers[id] = knowing_empires; - // move object to invalid position, thereby removing it from anything that contained it - // and propegating associated signals - obj->MoveTo(UniverseObject::INVALID_POSITION, UniverseObject::INVALID_POSITION); + // move object to its own position, thereby removing it from anything + // that contained it and propegating associated signals + obj->MoveTo(obj->X(), obj->Y()); // remove from existing objects set and insert into destroyed objects set @@ -1415,19 +1415,17 @@ if (Ship* ship = universe_object_cast<Ship*>(obj)) { // if a ship is being deleted, and it is the last ship in its fleet, then the empty fleet should also be deleted Fleet* fleet = ship->GetFleet(); - Delete(id); - if (fleet && fleet->NumShips() == 0) - Delete(fleet->ID()); + Destroy(id); + if (fleet && fleet->Empty()) + Destroy(fleet->ID()); } else if (Fleet* fleet = universe_object_cast<Fleet*>(obj)) { - for (Fleet::iterator it = fleet->begin(); it != fleet->end(); ++it) { - Delete(*it); - } - Delete(id); + for (Fleet::iterator it = fleet->begin(); it != fleet->end(); ++it) + Destroy(*it); + Destroy(id); } else if (Planet* planet = universe_object_cast<Planet*>(obj)) { - for (std::set<int>::const_iterator it = planet->Buildings().begin(); it != planet->Buildings().end(); ++it) { - Delete (*it); - } - Delete(id); + for (std::set<int>::const_iterator it = planet->Buildings().begin(); it != planet->Buildings().end(); ++it) + Destroy(*it); + Destroy(id); } else if (universe_object_cast<System*>(obj)) { // unsupported: do nothing } else { |
From: <geo...@us...> - 2009-09-11 07:32:03
|
Revision: 3159 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3159&view=rev Author: geoffthemedio Date: 2009-09-11 07:31:57 +0000 (Fri, 11 Sep 2009) Log Message: ----------- Made resource supply connected systems provide fleet supply Modified Paths: -------------- trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Ship.cpp Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-09-11 06:08:45 UTC (rev 3158) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-09-11 07:31:57 UTC (rev 3159) @@ -696,10 +696,16 @@ std::set<int> fleet_supplied_systems; const std::set<int>& owners = Owners(); for (std::set<int>::const_iterator it = owners.begin(); it != owners.end(); ++it) { - std::set<int> empire_fleet_supplied_systems; - if (const Empire* empire = Empires().Lookup(*it)) - empire_fleet_supplied_systems = empire->FleetSupplyableSystemIDs(); - fleet_supplied_systems.insert(empire_fleet_supplied_systems.begin(), empire_fleet_supplied_systems.end()); + if (const Empire* empire = Empires().Lookup(*it)) { + // add systems that receive fleet supply + const std::set<int>& empire_fleet_supplied_systems = empire->FleetSupplyableSystemIDs(); + fleet_supplied_systems.insert(empire_fleet_supplied_systems.begin(), empire_fleet_supplied_systems.end()); + + // also add any system that is connected to a planet for resource sharing purposes + const std::set<std::set<int> >& empire_resource_supply_groups = empire->ResourceSupplyGroups(); + for (std::set<std::set<int> >::const_iterator set_set_it = empire_resource_supply_groups.begin(); set_set_it != empire_resource_supply_groups.end(); ++set_set_it) + fleet_supplied_systems.insert(set_set_it->begin(), set_set_it->end()); + } } //Logger().debugStream() << "Fleet Supplied Systems:"; //for (std::set<int>::const_iterator it = fleet_supplied_systems.begin(); it != fleet_supplied_systems.end(); ++it) Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-09-11 06:08:45 UTC (rev 3158) +++ trunk/FreeOrion/universe/Ship.cpp 2009-09-11 07:31:57 UTC (rev 3159) @@ -128,6 +128,7 @@ Meter* meter = GetMeter(METER_FUEL); assert(meter); meter->SetCurrent(meter->Max()); + for (ConsumablesMap::iterator it = m_fighters.begin(); it != m_fighters.end(); ++it) { @@ -135,6 +136,7 @@ it->second.first * boost::get<FighterStats>(GetPartType(it->first)->Stats()).m_capacity; } + for (ConsumablesMap::iterator it = m_missiles.begin(); it != m_missiles.end(); ++it) { |
From: <geo...@us...> - 2009-09-12 22:10:45
|
Revision: 3162 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3162&view=rev Author: geoffthemedio Date: 2009-09-12 22:10:32 +0000 (Sat, 12 Sep 2009) Log Message: ----------- Added C++ code for conditions to match ships with the indicated hull or number of indicated part. The parser doesn't know about these conditions, however, and there are no stringtable entries for them yet. Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Condition.h Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2009-09-12 20:36:50 UTC (rev 3161) +++ trunk/FreeOrion/universe/Condition.cpp 2009-09-12 22:10:32 UTC (rev 3162) @@ -1084,6 +1084,84 @@ } /////////////////////////////////////////////////////////// +// DesignHasHull // +/////////////////////////////////////////////////////////// +Condition::DesignHasHull::DesignHasHull(const std::string& name) : + m_name(name) +{} + +std::string Condition::DesignHasHull::Description(bool negated/* = false*/) const +{ + std::string description_str = "DESC_DESIGN_HAS_HULL"; + if (negated) + description_str += "_NOT"; + return str(format(UserString(description_str)) % UserString(m_name)); +} + +std::string Condition::DesignHasHull::Dump() const +{ + return DumpIndent() + "DesignHasHull name = \"" + m_name + "\"\n"; +} + +bool Condition::DesignHasHull::Match(const UniverseObject* source, const UniverseObject* target) const +{ + if (const Ship* ship = universe_object_cast<const Ship*>(target)) + if (const ShipDesign* design = ship->Design()) + return (design->Hull() == m_name); + return false; +} + +/////////////////////////////////////////////////////////// +// DesignHasPart // +/////////////////////////////////////////////////////////// +Condition::DesignHasPart::DesignHasPart(const ValueRef::ValueRefBase<int>* low, const ValueRef::ValueRefBase<int>* high, const std::string& name) : + m_low(low), + m_high(high), + m_name(name) +{ +} + +Condition::DesignHasPart::~DesignHasPart() +{ + delete m_low; + delete m_high; +} + +std::string Condition::DesignHasPart::Description(bool negated/* = false*/) const +{ + std::string low_str = ValueRef::ConstantExpr(m_low) ? lexical_cast<std::string>(m_low->Eval(0, 0)) : m_low->Description(); + std::string high_str = ValueRef::ConstantExpr(m_high) ? lexical_cast<std::string>(m_high->Eval(0, 0)) : m_high->Description(); + std::string description_str = "DESC_DESIGN_HAS_PART"; + if (negated) + description_str += "_NOT"; + return str(format(UserString(description_str)) + % low_str + % high_str + % m_name); +} + +std::string Condition::DesignHasPart::Dump() const{ + return DumpIndent() + "DesignHasPart low = " + m_low->Dump() + "Number high = " + m_high->Dump() + " name = " + m_name; +} + +bool Condition::DesignHasPart::Match(const UniverseObject* source, const UniverseObject* target) const +{ + if (const Ship* ship = universe_object_cast<const Ship*>(target)) { + if (const ShipDesign* design = ship->Design()) { + const std::vector<std::string>& parts = design->Parts(); + int count = 0; + for (std::vector<std::string>::const_iterator it = parts.begin(); it != parts.end(); ++it) + if (*it == m_name) + ++count; + int low = m_low->Eval(source, target); // number matched can depend on some property of target object! + int high = m_high->Eval(source, target); + return (low <= count && count < high); + } + } + return false; +} + +/////////////////////////////////////////////////////////// // Chance // /////////////////////////////////////////////////////////// Condition::Chance::Chance(const ValueRef::ValueRefBase<double>* chance) : Modified: trunk/FreeOrion/universe/Condition.h =================================================================== --- trunk/FreeOrion/universe/Condition.h 2009-09-12 20:36:50 UTC (rev 3161) +++ trunk/FreeOrion/universe/Condition.h 2009-09-12 22:10:32 UTC (rev 3162) @@ -34,6 +34,8 @@ struct PlanetEnvironment; struct FocusType; struct StarType; + struct DesignHasHull; + struct DesignHasPart; struct Chance; struct MeterValue; struct EmpireStockpileValue; @@ -68,8 +70,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all objects if the number of objects that match Condition \a condition is is >= \a low and < \a high. - Matched objects may or may not themselves match the condition. */ +/** Matches all objects if the number of objects that match Condition + * \a condition is is >= \a low and < \a high. Matched objects may + * or may not themselves match the condition. */ struct Condition::Number : Condition::ConditionBase { Number(const ValueRef::ValueRefBase<int>* low, const ValueRef::ValueRefBase<int>* high, const ConditionBase* condition); @@ -138,8 +141,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all objects that are owned (if \a exclusive == false) or only owned (if \a exclusive == true) by an empire that has - affilitation type \a affilitation with Empire \a empire_id. */ +/** Matches all objects that are owned (if \a exclusive == false) or only owned + * (if \a exclusive == true) by an empire that has affilitation type + * \a affilitation with Empire \a empire_id. */ struct Condition::EmpireAffiliation : Condition::ConditionBase { EmpireAffiliation(const ValueRef::ValueRefBase<int>* empire_id, EmpireAffiliationType affiliation, bool exclusive); @@ -235,8 +239,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all objects that have an attached Special of the sort specified by \a name. Passing "All" for - \a name will match all objects with attached Specials. */ +/** Matches all objects that have an attached Special of the sort specified by + * \a name. Passing "All" for \a name will match all objects with attached + * Specials. */ struct Condition::HasSpecial : Condition::ConditionBase { HasSpecial(const std::string& name); @@ -252,8 +257,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all objects that contain an object that matches Condition \a condition. Container objects are Systems, - Planets (which contain Buildings), and Fleets (which contain Ships). */ +/** Matches all objects that contain an object that matches Condition + * \a condition. Container objects are Systems, Planets (which contain + * Buildings), and Fleets (which contain Ships). */ struct Condition::Contains : Condition::ConditionBase { Contains(const ConditionBase* condition); @@ -269,8 +275,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all objects that are contained by an object that matches Condition \a condition. Container objects - are Systems, Planets (which contain Buildings), and Fleets (which contain Ships). */ +/** Matches all objects that are contained by an object that matches Condition + * \a condition. Container objects are Systems, Planets (which contain + * Buildings), and Fleets (which contain Ships). */ struct Condition::ContainedBy : Condition::ConditionBase { ContainedBy(const ConditionBase* condition); @@ -286,8 +293,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all Planet objects that have one of the PlanetTypes in \a types. Note that all - Building objects which are on matching planets are also matched. */ +/** Matches all Planet objects that have one of the PlanetTypes in \a types. + * Note that all Building objects which are on matching planets are also + * matched. */ struct Condition::PlanetType : Condition::ConditionBase { PlanetType(const std::vector<const ValueRef::ValueRefBase< ::PlanetType>*>& types); @@ -304,8 +312,9 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Matches all Planet objects that have one of the PlanetSizes in \a sizes. Note that all - Building objects which are on matching planets are also matched. */ +/** Matches all Planet objects that have one of the PlanetSizes in \a sizes. + * Note that all Building objects which are on matching planets are also + * matched. */ struct Condition::PlanetSize : Condition::ConditionBase { PlanetSize(const std::vector<const ValueRef::ValueRefBase< ::PlanetSize>*>& sizes); @@ -376,6 +385,42 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Matches all ships whose ShipDesign has the hull specified by \a name. */ +struct Condition::DesignHasHull : Condition::ConditionBase +{ + DesignHasHull(const std::string& name); + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + +private: + virtual bool Match(const UniverseObject* source, const UniverseObject* target) const; + std::string m_name; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + +/** Matches all ships whose ShipDesign has >= \a low and < \a high of the ship + * part specified by \a name. */ +struct Condition::DesignHasPart : Condition::ConditionBase +{ + DesignHasPart(const ValueRef::ValueRefBase<int>* low, const ValueRef::ValueRefBase<int>* high, const std::string& name); + virtual ~DesignHasPart(); + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + +private: + virtual bool Match(const UniverseObject* source, const UniverseObject* target) const; + std::string m_name; + const ValueRef::ValueRefBase<int>* m_low; + const ValueRef::ValueRefBase<int>* m_high; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Matches a given object with a linearly distributed probability of \a chance. */ struct Condition::Chance : Condition::ConditionBase { |
From: <geo...@us...> - 2009-09-13 02:07:25
|
Revision: 3164 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3164&view=rev Author: geoffthemedio Date: 2009-09-13 02:07:17 +0000 (Sun, 13 Sep 2009) Log Message: ----------- Moved ship fuel regeneration from within the ship itself to Fleet::MovementPhase. This way regeneration is guaranteed to happen before movement: previously, fleets could move, and then Ship::PopGrowthProductionResearchPhase could happen, and ships would regenerate fuel on the same turn they arrived in a system. Now, ships only regenerate fuel if they start the turn in a system and stay for the whole turn. Modified Paths: -------------- trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Ship.cpp Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-09-13 00:52:21 UTC (rev 3163) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-09-13 02:07:17 UTC (rev 3164) @@ -31,6 +31,11 @@ return true; return false; } + + void GrowFuelMeter(Meter* fuel_meter) { + assert(fuel_meter); + fuel_meter->AdjustCurrent(0.1001); + } } // static(s) @@ -728,15 +733,27 @@ std::list<MovePathNode>::const_iterator next_it = it; next_it++; // is the ship stuck in a system for a whole turn? if (current_system) { - // in a system - if (next_it == move_path.end()) { - // there is no system after the current one in the path... so won't be moving + // in a system. if there is no system after the current one in the + // path, or the current and next nodes have the same system id, that + // is an actual system, then won't be moving this turn. + if ((next_it == move_path.end()) || + (it->object_id != INVALID_OBJECT_ID && it->object_id == next_it->object_id) + ) + { + // fuel regeneration for ships in stationary fleet + if (this->FinalDestinationID() == UniverseObject::INVALID_OBJECT_ID || + this->FinalDestinationID() == this->SystemID()) + { + for (Fleet::const_iterator ship_it = this->begin(); ship_it != this->end(); ++ship_it) { + Ship* ship = universe.Object<Ship>(*ship_it); + if (!ship) continue; + Meter* fuel_meter = ship->GetMeter(METER_FUEL); + if (!fuel_meter) continue; + GrowFuelMeter(fuel_meter); + } + } return; } - if (it->object_id != INVALID_OBJECT_ID && it->object_id == next_it->object_id) { - // the current and next nodes have the same system id, that is an actual system. thus won't be moving this turn. - return; - } } Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-09-13 00:52:21 UTC (rev 3163) +++ trunk/FreeOrion/universe/Ship.cpp 2009-09-13 02:07:17 UTC (rev 3164) @@ -219,12 +219,4 @@ } void Ship::PopGrowthProductionResearchPhase() { - // fuel regeneration if stationary - if (Fleet* fleet = this->GetFleet()) { - if (fleet->FinalDestinationID() == UniverseObject::INVALID_OBJECT_ID || - fleet->FinalDestinationID() == fleet->SystemID()) - { - GrowFuelMeter(GetMeter(METER_FUEL)); - } - } } |
From: <geo...@us...> - 2009-09-13 02:44:39
|
Revision: 3165 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3165&view=rev Author: geoffthemedio Date: 2009-09-13 02:44:27 +0000 (Sun, 13 Sep 2009) Log Message: ----------- Added definition file parsing and serialization functions for DesignHasHull and DesignHasPart conditions. Modified Paths: -------------- trunk/FreeOrion/universe/Condition.h trunk/FreeOrion/universe/ConditionParser2.cpp Modified: trunk/FreeOrion/universe/Condition.h =================================================================== --- trunk/FreeOrion/universe/Condition.h 2009-09-13 02:07:17 UTC (rev 3164) +++ trunk/FreeOrion/universe/Condition.h 2009-09-13 02:44:27 UTC (rev 3165) @@ -412,9 +412,9 @@ private: virtual bool Match(const UniverseObject* source, const UniverseObject* target) const; - std::string m_name; const ValueRef::ValueRefBase<int>* m_low; const ValueRef::ValueRefBase<int>* m_high; + std::string m_name; friend class boost::serialization::access; template <class Archive> @@ -754,6 +754,22 @@ } template <class Archive> +void Condition::DesignHasHull::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) + & BOOST_SERIALIZATION_NVP(m_name); +} + +template <class Archive> +void Condition::DesignHasPart::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) + & BOOST_SERIALIZATION_NVP(m_low) + & BOOST_SERIALIZATION_NVP(m_high) + & BOOST_SERIALIZATION_NVP(m_name); +} + +template <class Archive> void Condition::Chance::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) Modified: trunk/FreeOrion/universe/ConditionParser2.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser2.cpp 2009-09-13 02:07:17 UTC (rev 3164) +++ trunk/FreeOrion/universe/ConditionParser2.cpp 2009-09-13 02:44:27 UTC (rev 3165) @@ -86,6 +86,14 @@ member2 types; }; + struct DesignHasPartClosure : boost::spirit::closure<DesignHasPartClosure, Condition::ConditionBase*, ValueRef::ValueRefBase<int>*, ValueRef::ValueRefBase<int>*, std::string> + { + member1 this_; + member2 high; + member3 low; + member4 name; + }; + struct RandomClosure : boost::spirit::closure<RandomClosure, Condition::ConditionBase*, ValueRef::ValueRefBase<double>*> { member1 this_; @@ -114,6 +122,7 @@ typedef rule<Scanner, NameParamClosure::context_t> NameParamRule; typedef rule<Scanner, ConditionParamClosure::context_t> ConditionParamRule; typedef rule<Scanner, StarTypeClosure::context_t> StarTypeRule; + typedef rule<Scanner, DesignHasPartClosure::context_t> DesignHasPartRule; typedef rule<Scanner, RandomClosure::context_t> RandomRule; typedef rule<Scanner, StockpileClosure::context_t> StockpileRule; typedef rule<Scanner, VisibleToEmpireClosure::context_t> VisibleToEmpireRule; @@ -128,6 +137,8 @@ ConditionParamRule contains; ConditionParamRule contained_by; StarTypeRule star_type; + NameParamRule design_has_hull; + DesignHasPartRule design_has_part; RandomRule random; StockpileRule owner_stockpile; VisibleToEmpireRule visible_to_empire; @@ -193,6 +204,18 @@ | ('[' >> +(startype_expr_p[push_back_(star_type.types, arg1)]) >> ']'))) [star_type.this_ = new_<Condition::StarType>(star_type.types)]; + design_has_hull = + (str_p("designhashull") + >> name_label >> name_p[design_has_hull.name = arg1]) + [design_has_hull.this_ = new_<Condition::DesignHasHull>(design_has_hull.name)]; + + design_has_part = + (str_p("designhaspart") + >> low_label >> int_expr_p[design_has_part.low = arg1] + >> high_label >> int_expr_p[design_has_part.high = arg1] + >> name_label >> name_p[design_has_part.name = arg1]) + [design_has_part.this_ = new_<Condition::DesignHasPart>(design_has_part.low, design_has_part.high, design_has_part.name)]; + random = (str_p("random") >> probability_label @@ -225,6 +248,8 @@ | contains[condition2_p.this_ = arg1] | contained_by[condition2_p.this_ = arg1] | star_type[condition2_p.this_ = arg1] + | design_has_hull[condition2_p.this_ = arg1] + | design_has_part[condition2_p.this_ = arg1] | random[condition2_p.this_ = arg1] | owner_stockpile[condition2_p.this_ = arg1] | visible_to_empire[condition2_p.this_ = arg1]; |
From: <geo...@us...> - 2009-09-14 13:45:22
|
Revision: 3170 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3170&view=rev Author: geoffthemedio Date: 2009-09-14 12:26:46 +0000 (Mon, 14 Sep 2009) Log Message: ----------- Enabled new visibility system, which seems to be mostly working, except for a few bugs, like system names being forgotten if an empire doesn't have visibility of a system on the current turn, even if the system was explored and its name known on previous turns, and empty universes being sent to players after loading a save, which I suspect is due to visibility not being updated after loading, with the default no visibility being used as a result. Modified Paths: -------------- trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Building.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -88,14 +88,6 @@ return m_planet_id == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<Planet>(m_planet_id); } -Visibility Building::GetVisibility(int empire_id) const { - const Planet* planet = GetPlanet(); - if (planet) - return planet->GetVisibility(empire_id); - else - return VIS_NO_VISIBILITY; -} - UniverseObject* Building::Accept(const UniverseObjectVisitor& visitor) const { return visitor.Visit(const_cast<Building* const>(this)); Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Building.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -33,8 +33,6 @@ int PlanetID() const; ///< returns the ID number of the planet this building is on Planet* GetPlanet() const; ///< returns a pointer to the planet this building is on - virtual Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this building relative to the input empire. - virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; //@} Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -79,27 +79,6 @@ return m_ships; } -Visibility Fleet::GetVisibility(int empire_id) const -{ - if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) { - return VIS_FULL_VISIBILITY; - } else { - // Fleet visibility is the most-visible of ships in fleet - Visibility retval = VIS_NO_VISIBILITY; - - // check all ships to find highest visibility - for (const_iterator it = begin(); it != end(); ++it) { - if (const Ship* ship = GetUniverse().Object<Ship>(*it)) { - Visibility ship_vis = ship->GetVisibility(empire_id); - if (ship_vis > retval) - retval = ship_vis; - } - } - - return retval; - } -} - const std::string& Fleet::PublicName(int empire_id) const { // Disclose real fleet name only to fleet owners. Rationale: a player might become suspicious if the incoming Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Fleet.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -43,7 +43,6 @@ const std::set<int>& ShipIDs() const; ///< returns set of IDs of ships in fleet. - virtual Visibility GetVisibility(int empire_id) const; virtual const std::string& PublicName(int empire_id) const; /** Returns the list of systems that this fleet will move through en route to its destination (may be empty). Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Planet.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -194,18 +194,6 @@ return retval; } -Visibility Planet::GetVisibility(int empire_id) const -{ - // if empire_id knows more than basic visiblity of a system, it can - // see into the system and can see its planets. - if (const System* system = GetSystem()) { - Visibility system_vis = system->GetVisibility(empire_id); - if (system_vis > VIS_BASIC_VISIBILITY) - return system_vis; - } - return VIS_NO_VISIBILITY; -} - UniverseObject* Planet::Accept(const UniverseObjectVisitor& visitor) const { return visitor.Visit(const_cast<Planet* const>(this)); Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Planet.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -113,8 +113,6 @@ bool IsAboutToBeColonized() const {return m_is_about_to_be_colonized;} - virtual Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. - virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Ship.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -85,17 +85,6 @@ return m_fleet_id == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<Fleet>(m_fleet_id); } -Visibility Ship::GetVisibility(int empire_id) const { - Visibility vis = VIS_NO_VISIBILITY; - - if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) - vis = VIS_FULL_VISIBILITY; - - // Ship is visible if its fleet is visible - Visibility retval = FleetID() == INVALID_OBJECT_ID ? VIS_NO_VISIBILITY : (GetFleet() ? GetFleet()->GetVisibility(empire_id) : vis); - return retval; -} - bool Ship::IsArmed() const { return Design()->IsArmed(); } Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Ship.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -28,7 +28,6 @@ int FleetID() const; ///< returns the ID of the fleet the ship is residing in Fleet* GetFleet() const; ///< returns the ID of the fleet the ship is residing in - virtual Visibility GetVisibility(int empire_id) const; virtual const std::string& PublicName(int empire_id) const; bool IsArmed() const; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/System.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -220,21 +220,6 @@ return retval; } -Visibility System::GetVisibility(int empire_id) const -{ - // if system is at least partially owned by this empire it is fully visible. - if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) - return VIS_FULL_VISIBILITY; - - // if system has been explored, it is partially visible - Empire* empire = Empires().Lookup(empire_id); - if (empire && empire->HasExploredSystem(ID())) - return VIS_PARTIAL_VISIBILITY; - - // otherwise, basic visibility - return VIS_BASIC_VISIBILITY; -} - UniverseObject* System::Accept(const UniverseObjectVisitor& visitor) const { return visitor.Visit(const_cast<System* const>(this)); Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/System.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -111,8 +111,6 @@ const_lane_iterator begin_lanes() const; ///< begin iterator for all starlanes and wormholes terminating in this system const_lane_iterator end_lanes() const; ///< end iterator for all starlanes and wormholes terminating in this system - virtual Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. - virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; mutable boost::signal<void (Fleet& fleet)> FleetInsertedSignal; ///< fleet is inserted into system Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Universe.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -505,6 +505,9 @@ Visibility Universe::GetObjectVisibilityByEmpire(int object_id, int empire_id) { + if (empire_id == ALL_EMPIRES || Universe::ALL_OBJECTS_VISIBLE) + return VIS_FULL_VISIBILITY; + ObjectVisibilityMap& vis_map = m_empire_object_visibility[empire_id]; ObjectVisibilityMap::iterator vis_map_it = vis_map.find(object_id); if (vis_map_it != vis_map.end()) @@ -1177,7 +1180,7 @@ namespace { /** Sets visibilities for indicated \a empires of object with \a object_id * in the passed-in \a empire_vis_map to \a vis */ - void SetEmpireObjectVisibility(Universe::EmpireObjectVisibilityMap empire_vis_map, const std::set<int>& empires, int object_id, Visibility vis) { + void SetEmpireObjectVisibility(Universe::EmpireObjectVisibilityMap& empire_vis_map, const std::set<int>& empires, int object_id, Visibility vis) { for (std::set<int>::const_iterator empire_it = empires.begin(); empire_it != empires.end(); ++empire_it) { int empire_id = *empire_it; @@ -1686,6 +1689,48 @@ } } +void Universe::GetObjectsToSerialize(ObjectMap& objects, int encoding_empire) +{ + objects.clear(); + for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) + if (GetObjectVisibilityByEmpire(it->first, encoding_empire) > VIS_NO_VISIBILITY) + objects.insert(*it); +} + +void Universe::GetDestroyedObjectsToSerialize(ObjectMap& destroyed_objects, int encoding_empire) +{ + if (Universe::ALL_OBJECTS_VISIBLE || encoding_empire == ALL_EMPIRES) { + // serialize all destroyed objects + destroyed_objects = m_destroyed_objects; + + } else { + // only serialize objects known about by encoding_empire + for (ObjectMap::const_iterator it = m_destroyed_objects.begin(); it != m_destroyed_objects.end(); ++it) { + ObjectKnowledgeMap::const_iterator know_it = m_destroyed_object_knowers.find(it->first); + if (know_it == m_destroyed_object_knowers.end()) + continue; // no empires know about this destroyed object + const std::set<int>& knowers = know_it->second; + if (knowers.find(encoding_empire) != knowers.end()) { + //Logger().debugStream() << "empire " << s_encoding_empire << " knows about destroyed object object " << know_it->first; + destroyed_objects.insert(*it); + } + } + } +} + +void Universe::GetDestroyedObjectKnowers(ObjectKnowledgeMap& destroyed_object_knowers, int encoding_empire) +{ + // who knows about destroyed objects? this data is only serialized when all encoding is for + // all empires. this way it is saved as part of a saved game, but isn't sent out to players. + // we don't want to tell all players what destroyed objects other players know about, or worry + // about who knows who knows what objects were destroyed, so instead, no players get any info + // about who knows what was destroyed. (players can tell whether they know something was + // destroyed by checking whether they got the object in the Universe's destroyed objects, so + // that info doesn't need to be sent with turn updates...) + if (encoding_empire == ALL_EMPIRES) + destroyed_object_knowers = m_destroyed_object_knowers; +} + ////////////////////////////////////////// // Server-Only General Functions // ////////////////////////////////////////// Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/Universe.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -482,6 +482,10 @@ void GetShipDesignsToSerialize(const ObjectMap& serialized_objects, ShipDesignMap& designs_to_serialize); + void GetObjectsToSerialize(ObjectMap& objects, int encoding_empire); + void GetDestroyedObjectsToSerialize(ObjectMap& destroyed_objects, int encoding_empire); + void GetDestroyedObjectKnowers(ObjectKnowledgeMap& destroyed_object_knowers, int encoding_empire); + friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); @@ -499,44 +503,11 @@ ObjectMap objects; ObjectMap destroyed_objects; ObjectKnowledgeMap destroyed_object_knowers; - if (Archive::is_saving::value) { - // existing objects - for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (Universe::ALL_OBJECTS_VISIBLE || s_encoding_empire == ALL_EMPIRES || - it->second->GetVisibility(s_encoding_empire) != VIS_NO_VISIBILITY || - universe_object_cast<System*>(it->second)) - { - objects.insert(*it); - } - } - // destroyed objects - if (Universe::ALL_OBJECTS_VISIBLE || s_encoding_empire == ALL_EMPIRES) { - // serialize all destroyed objects - destroyed_objects = m_destroyed_objects; - } else { - // only serialize objects known about by s_encoding_emprie - for (ObjectMap::const_iterator it = m_destroyed_objects.begin(); it != m_destroyed_objects.end(); ++it) { - ObjectKnowledgeMap::const_iterator know_it = m_destroyed_object_knowers.find(it->first); - if (know_it == m_destroyed_object_knowers.end()) - continue; // no empires know about this destroyed object - const std::set<int>& knowers = know_it->second; - if (knowers.find(s_encoding_empire) != knowers.end()) { - //Logger().debugStream() << "empire " << s_encoding_empire << " knows about destroyed object object " << know_it->first; - destroyed_objects.insert(*it); - } - } - } - - // who knows about destroyed objects? this data is only serialized when all encoding is for - // all empires. this way it is saved as part of a saved game, but isn't sent out to players. - // we don't want to tell all players what destroyed objects other players know about, or worry - // about who knows who knows what objects were destroyed, so instead, no players get any info - // about who knows what was destroyed. (players can tell whether they know something was - // destroyed by checking whether they got the object in the Universe's destroyed objects, so - // that info doesn't need to be sent with turn updates...) - if (s_encoding_empire == ALL_EMPIRES) - destroyed_object_knowers = m_destroyed_object_knowers; + if (Archive::is_saving::value) { + GetObjectsToSerialize( objects, s_encoding_empire); + GetDestroyedObjectsToSerialize( destroyed_objects, s_encoding_empire); + GetDestroyedObjectKnowers( destroyed_object_knowers, s_encoding_empire); } // ship designs Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2009-09-14 12:26:46 UTC (rev 3170) @@ -188,10 +188,7 @@ Visibility UniverseObject::GetVisibility(int empire_id) const { - if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || this->OwnedBy(empire_id)) - return VIS_FULL_VISIBILITY; - - return VIS_NO_VISIBILITY; + return GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); } const std::string& UniverseObject::PublicName(int empire_id) const Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-09-14 12:22:27 UTC (rev 3169) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-09-14 12:26:46 UTC (rev 3170) @@ -88,7 +88,7 @@ bool OwnedBy(int empire) const; ///< returns true iff the empire with id \a empire is an owner of this object bool WhollyOwnedBy(int empire) const; ///< returns true iff the empire with id \a empire is the only owner of this object - virtual Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. + Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. virtual const std::string& PublicName(int empire_id) const; ///< returns the name of this objectas it appears to empire \a empire_id @@ -198,26 +198,30 @@ void UniverseObject::serialize(Archive& ar, const unsigned int version) { Visibility vis; + if (Archive::is_saving::value) vis = GetVisibility(Universe::s_encoding_empire); + ar & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_id) & BOOST_SERIALIZATION_NVP(m_x) & BOOST_SERIALIZATION_NVP(m_y) & BOOST_SERIALIZATION_NVP(m_system_id) & BOOST_SERIALIZATION_NVP(m_meters); - if (Universe::ALL_OBJECTS_VISIBLE || - vis == VIS_PARTIAL_VISIBILITY || vis == VIS_FULL_VISIBILITY) { + + if (vis >= VIS_PARTIAL_VISIBILITY) { std::string name; if (Archive::is_saving::value) { // We don't disclose the real object name for some types of objects, since it would look funny if e.g. the // user saw an incoming enemy cleet called "Decoy". name = PublicName(Universe::s_encoding_empire); } + ar & BOOST_SERIALIZATION_NVP(name) & BOOST_SERIALIZATION_NVP(m_owners) & BOOST_SERIALIZATION_NVP(m_specials) & BOOST_SERIALIZATION_NVP(m_created_on_turn); + if (Archive::is_loading::value) m_name = name; } |
From: <geo...@us...> - 2009-09-18 02:29:16
|
Revision: 3174 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3174&view=rev Author: geoffthemedio Date: 2009-09-18 02:29:09 +0000 (Fri, 18 Sep 2009) Log Message: ----------- -Added empire visibility maps to Universe serialization, so that clients don't need to recalculate this, and since clients probably wouldn't be able to recalculate it in all cases. This actually duplicates information that's currently serialized along with each UniverseObject, but this isn't a huge addition to the serialized data size. Extracting the visibility map information from the UniverseObjects' being deserialized would have been rather awkward since the visibility map is stored in the universe, and each UniverseObject would have had to have updated the local Universe as the object was being deserialized. -Changed condition for whether a starlane is visible to: must have both end systems at least basically visible, and at least one must be partially visible (or better). -Fixed issue, revealed by above changes, where system graph indices (which are contiguous from 0 to num systems - 1) and system ID in universe (which can have gaps between numbers and need not start with 0) were being mixed up when calling graph functions in client to find shortest pathes, which was making fleets randomly refuse to plot movement pathes to some systems. -Added VIS_BASIC_VISIBILITY to enum map, since it was missing -Removed some early-exit checks in Universe::UpdateEmpireObjectVisibilities which were causing Systems and Fleets to not be visible to their owner in some cases. In particular, systems weren't being recognized as owned by and thus visible to players who owned planets in them. Modified Paths: -------------- trunk/FreeOrion/universe/Enums.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2009-09-16 03:20:31 UTC (rev 3173) +++ trunk/FreeOrion/universe/Enums.h 2009-09-18 02:29:09 UTC (rev 3174) @@ -577,6 +577,7 @@ GG_ENUM_MAP_BEGIN(Visibility) GG_ENUM_MAP_INSERT(INVALID_VISIBILITY) GG_ENUM_MAP_INSERT(VIS_NO_VISIBILITY) + GG_ENUM_MAP_INSERT(VIS_BASIC_VISIBILITY) GG_ENUM_MAP_INSERT(VIS_PARTIAL_VISIBILITY) GG_ENUM_MAP_INSERT(VIS_FULL_VISIBILITY) GG_ENUM_MAP_END Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-09-16 03:20:31 UTC (rev 3173) +++ trunk/FreeOrion/universe/System.cpp 2009-09-18 02:29:09 UTC (rev 3174) @@ -509,16 +509,25 @@ return m_starlanes_wormholes; Universe& universe = GetUniverse(); + StarlaneMap retval; + // starlanes are visible if both systems have basic visibility or greater, // and one or both systems has partial visibility or greater - StarlaneMap retval; + // check that current system has at least basic visibility + Visibility vis2 = universe.GetObjectVisibilityByEmpire(this->ID(), empire_id); + if (vis2 < VIS_BASIC_VISIBILITY) + return retval; + + // check each connected system, paired with current system, to ensure at + // least one is partial, and both are at least basically visible for (StarlaneMap::const_iterator it = m_starlanes_wormholes.begin(); it != m_starlanes_wormholes.end(); ++it) { Visibility vis1 = universe.GetObjectVisibilityByEmpire(it->first, empire_id); - Visibility vis2 = universe.GetObjectVisibilityByEmpire(it->second, empire_id); + if (vis1 < VIS_BASIC_VISIBILITY) + continue; - if ((vis1 >= VIS_PARTIAL_VISIBILITY && vis2 >= VIS_BASIC_VISIBILITY) || (vis2 >= VIS_PARTIAL_VISIBILITY && vis1 >= VIS_BASIC_VISIBILITY)) + if (vis1 >= VIS_PARTIAL_VISIBILITY || vis2 >= VIS_PARTIAL_VISIBILITY) retval.insert(*it); } return retval; Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-09-16 03:20:31 UTC (rev 3173) +++ trunk/FreeOrion/universe/System.h 2009-09-18 02:29:09 UTC (rev 3174) @@ -172,13 +172,18 @@ lane_iterator begin_lanes(); ///< begin iterator for all starlanes and wormholes terminating in this system lane_iterator end_lanes(); ///< end iterator for all starlanes and wormholes terminating in this system - /** returns a map of the starlanes and wormholes visible to empire \a empire_id; the map contains keys that are IDs - of connected systems, and bool values indicating whether each is a starlane (false) or a wormhole (true)*/ + /** returns a map of the starlanes and wormholes visible to empire + * \a empire_id; the map contains keys that are IDs of connected systems, + * and bool values indicating whether each is a starlane (false) or a + * wormhole (true)*/ StarlaneMap VisibleStarlanes(int empire_id) const; //@} private: - ObjectMultimap VisibleContainedObjects(int empire_id) const; ///< returns the subset of m_objects that is visible to empire with id \a empire_id + /** returns the subset of m_objects that is visible to empire with id + * \a empire_id */ + ObjectMultimap VisibleContainedObjects(int empire_id) const; + void UpdateOwnership(); StarType m_star; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-09-16 03:20:31 UTC (rev 3173) +++ trunk/FreeOrion/universe/Universe.cpp 2009-09-18 02:29:09 UTC (rev 3174) @@ -122,13 +122,12 @@ std::pair<std::list<System*>, double> retval; - ConstIndexPropertyMap index_map = boost::get(boost::vertex_index, graph); - ConstEdgeWeightPropertyMap edge_weight_map = boost::get(boost::edge_weight, graph); + ConstSystemPointerPropertyMap pointer_property_map = boost::get(vertex_system_pointer_t(), graph); + int system1_index = SystemGraphIndex(graph, system1_id); int system2_index = SystemGraphIndex(graph, system2_id); - ConstSystemPointerPropertyMap pointer_property_map = boost::get(vertex_system_pointer_t(), graph); // early exit if systems are the same if (system1_id == system2_id) { @@ -151,6 +150,10 @@ } + ConstIndexPropertyMap index_map = boost::get(boost::vertex_index, graph); + ConstEdgeWeightPropertyMap edge_weight_map = boost::get(boost::edge_weight, graph); + + // do the actual path finding using verbose boost magic... try { boost::dijkstra_shortest_paths(graph, system1_index, &predecessors[0], &distances[0], edge_weight_map, index_map, @@ -292,33 +295,52 @@ { EdgeVisibilityFilter() : m_graph(0), - m_empire(0) + m_empire_id(ALL_EMPIRES) {} EdgeVisibilityFilter(const SystemGraph* graph, int empire_id) : m_graph(graph), - m_empire(Empires().Lookup(empire_id)) + m_empire_id(empire_id) {} template <typename EdgeDescriptor> bool operator()(const EdgeDescriptor& edge) const { - return m_empire && m_graph ? - CanSeeAtLeastOneSystem(m_empire, - boost::source(edge, *m_graph), - boost::target(edge, *m_graph)) : - false; - } + if (!m_graph) + return false; - static bool CanSeeAtLeastOneSystem(const Empire* empire, int system1, int system2) - { - return empire && - (empire->HasExploredSystem(system1) || empire->HasExploredSystem(system2)); + // for reverse-lookup System universe ID from graph indices... + ConstSystemPointerPropertyMap pointer_property_map = boost::get(vertex_system_pointer_t(), *m_graph); + + + Universe& universe = GetUniverse(); + + + // get system id from graph index + int sys_graph_index_1 = boost::source(edge, *m_graph); + const System* system1 = pointer_property_map[sys_graph_index_1]; + int sys_id_1 = system1->ID(); + + Visibility vis1 = universe.GetObjectVisibilityByEmpire(sys_id_1, m_empire_id); + if (vis1 < VIS_BASIC_VISIBILITY) + return false; + + + // get system id from graph index + int sys_graph_index_2 = boost::source(edge, *m_graph); + const System* system2 = pointer_property_map[sys_graph_index_2]; + int sys_id_2 = system2->ID(); + + Visibility vis2 = universe.GetObjectVisibilityByEmpire(sys_id_2, m_empire_id); + if (vis2 < VIS_BASIC_VISIBILITY) + return false; + + return (vis1 >= VIS_PARTIAL_VISIBILITY || vis2 >= VIS_PARTIAL_VISIBILITY); } private: - const SystemGraph* m_graph; - const Empire* m_empire; + const SystemGraph* m_graph; + int m_empire_id; }; typedef boost::filtered_graph<SystemGraph, EdgeVisibilityFilter> EmpireViewSystemGraph; typedef std::map<int, boost::shared_ptr<EmpireViewSystemGraph> > EmpireViewSystemGraphMap; @@ -1217,17 +1239,16 @@ const UniverseObject* detector = detector_it->second; if (!detector) continue; + int detector_id = detector->ID(); + // get owners of detector const std::set<int> detector_owners = detector->Owners(); if (detector_owners.empty()) continue; // no point in continuing if object has no owners... no-one can get vision from this object - // short cut: fleets and systems can't detect things, at least as of this writing. change if this isn't true later. - if (const Fleet* fleet = universe_object_cast<const Fleet*>(detector)) - continue; - if (const System* fleet = universe_object_cast<const System*>(detector)) - continue; + // owners of an object get full visibility of it + SetEmpireObjectVisibility(m_empire_object_visibility, detector_owners, detector_id, VIS_FULL_VISIBILITY); // get detection ability @@ -1240,18 +1261,13 @@ double xd = detector->X(); double yd = detector->Y(); - int detector_id = detector->ID(); - // for each detectable object for (Universe::const_iterator target_it = this->begin(); target_it != this->end(); ++target_it) { // special case for pairs - if (target_it == detector_it) { - // owners of an object get full visibility of it - SetEmpireObjectVisibility(m_empire_object_visibility, detector_owners, detector_id, VIS_FULL_VISIBILITY); - continue; - } + if (target_it == detector_it) + continue; // can't detect any better than done above // get stealthy object const UniverseObject* target = target_it->second; @@ -1373,9 +1389,10 @@ { m_graph_impl->m_empire_system_graph_views.clear(); for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { - GraphImpl::EdgeVisibilityFilter filter(&m_graph_impl->m_system_graph, it->first); + int empire_id = it->first; + GraphImpl::EdgeVisibilityFilter filter(&m_graph_impl->m_system_graph, empire_id); boost::shared_ptr<GraphImpl::EmpireViewSystemGraph> filtered_graph_ptr(new GraphImpl::EmpireViewSystemGraph(m_graph_impl->m_system_graph, filter)); - m_graph_impl->m_empire_system_graph_views[it->first] = filtered_graph_ptr; + m_graph_impl->m_empire_system_graph_views[empire_id] = filtered_graph_ptr; } } @@ -1697,6 +1714,26 @@ objects.insert(*it); } +void Universe::GetEmpireObjectVisibilityMap(EmpireObjectVisibilityMap& empire_object_visibility, int encoding_empire) +{ + if (encoding_empire == ALL_EMPIRES) { + empire_object_visibility = m_empire_object_visibility; + return; + } + + // include just requested empire's visibility for each object it has + // better than no visibility of. TODO: include requested empire's + // visibility, and what requested empire knows about other empires' + // visibilites + empire_object_visibility.clear(); + for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { + int object_id = it->first; + Visibility vis = GetObjectVisibilityByEmpire(object_id, encoding_empire); + if (vis > VIS_NO_VISIBILITY) + empire_object_visibility[encoding_empire][object_id] = vis; + } +} + void Universe::GetDestroyedObjectsToSerialize(ObjectMap& destroyed_objects, int encoding_empire) { if (Universe::ALL_OBJECTS_VISIBLE || encoding_empire == ALL_EMPIRES) { Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2009-09-16 03:20:31 UTC (rev 3173) +++ trunk/FreeOrion/universe/Universe.h 2009-09-18 02:29:09 UTC (rev 3174) @@ -483,6 +483,7 @@ void GetShipDesignsToSerialize(const ObjectMap& serialized_objects, ShipDesignMap& designs_to_serialize); void GetObjectsToSerialize(ObjectMap& objects, int encoding_empire); + void GetEmpireObjectVisibilityMap(EmpireObjectVisibilityMap& empire_object_visibility, int encoding_empire); void GetDestroyedObjectsToSerialize(ObjectMap& destroyed_objects, int encoding_empire); void GetDestroyedObjectKnowers(ObjectKnowledgeMap& destroyed_object_knowers, int encoding_empire); @@ -500,12 +501,14 @@ template <class Archive> void Universe::serialize(Archive& ar, const unsigned int version) { - ObjectMap objects; - ObjectMap destroyed_objects; - ObjectKnowledgeMap destroyed_object_knowers; + ObjectMap objects; + ObjectMap destroyed_objects; + ObjectKnowledgeMap destroyed_object_knowers; + EmpireObjectVisibilityMap empire_object_visibility; if (Archive::is_saving::value) { GetObjectsToSerialize( objects, s_encoding_empire); + GetEmpireObjectVisibilityMap( empire_object_visibility, s_encoding_empire); GetDestroyedObjectsToSerialize( destroyed_objects, s_encoding_empire); GetDestroyedObjectKnowers( destroyed_object_knowers, s_encoding_empire); } @@ -517,6 +520,7 @@ ar & BOOST_SERIALIZATION_NVP(s_universe_width) & BOOST_SERIALIZATION_NVP(objects) + & BOOST_SERIALIZATION_NVP(empire_object_visibility) & BOOST_SERIALIZATION_NVP(destroyed_objects) & BOOST_SERIALIZATION_NVP(destroyed_object_knowers) & BOOST_SERIALIZATION_NVP(ship_designs) @@ -525,6 +529,7 @@ if (Archive::is_loading::value) { m_objects = objects; + m_empire_object_visibility = empire_object_visibility; m_destroyed_objects = destroyed_objects; m_destroyed_object_knowers = destroyed_object_knowers; m_ship_designs = ship_designs; |
From: <geo...@us...> - 2009-10-15 05:48:00
|
Revision: 3209 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3209&view=rev Author: geoffthemedio Date: 2009-10-15 05:47:48 +0000 (Thu, 15 Oct 2009) Log Message: ----------- Changed pure virtual functions in UniverseObject class, MovementPhase and PopGrowthProductionResearchPhase into regular virtual functions, since most derived classes used the same, empty, implementation and there was no reason to have them be pure virtual. Modified Paths: -------------- trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Building.cpp 2009-10-15 05:47:48 UTC (rev 3209) @@ -111,9 +111,6 @@ planet->RemoveBuilding(this->ID()); } -void Building::MovementPhase() -{} - void Building::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type/* = INVALID_METER_TYPE*/) { // give buildings base stealth slightly above 0, so that they can't be seen from a distance without high detection ability @@ -122,9 +119,6 @@ stealth->AdjustMax(0.001); } -void Building::PopGrowthProductionResearchPhase() -{} - void Building::Reset() { ClearOwners(); Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Building.h 2009-10-15 05:47:48 UTC (rev 3209) @@ -42,9 +42,7 @@ void SetPlanetID(int planet_id); ///< sets the planet on which the building is located virtual void MoveTo(double x, double y); - virtual void MovementPhase(); virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); - virtual void PopGrowthProductionResearchPhase(); void Reset(); ///< resets any building state, and removes owners void SetOrderedScrapped(bool b = true); ///< flags building for scrapping Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Planet.cpp 2009-10-15 05:47:48 UTC (rev 3209) @@ -523,10 +523,6 @@ } } -void Planet::MovementPhase() -{ -} - void Planet::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { ResourceCenter::ApplyUniverseTableMaxMeterAdjustments(meter_type); Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Planet.h 2009-10-15 05:47:48 UTC (rev 3209) @@ -126,7 +126,6 @@ virtual void SetSystem(int sys); virtual void MoveTo(double x, double y); - virtual void MovementPhase(); virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); virtual void PopGrowthProductionResearchPhase(); Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Ship.cpp 2009-10-15 05:47:48 UTC (rev 3209) @@ -206,15 +206,6 @@ } } -void Ship::MovementPhase() -{ - // Fleet::MovementPhase moves ships within fleet around and deals with ship fuel consumption -} - -void Ship::PopGrowthProductionResearchPhase() -{ -} - void Ship::SetOrderedScrapped(bool b) { bool initial_status = m_ordered_scrapped; Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/Ship.h 2009-10-15 05:47:48 UTC (rev 3209) @@ -55,9 +55,6 @@ virtual void MoveTo(double x, double y); - virtual void MovementPhase(); - virtual void PopGrowthProductionResearchPhase(); - void SetOrderedScrapped(bool b = true); ///< flags ship for scrapping //@} Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/System.cpp 2009-10-15 05:47:48 UTC (rev 3209) @@ -448,10 +448,6 @@ { } -void System::MovementPhase() -{ -} - void System::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { // give systems base stealth slightly above zero, so that they can't be seen from a distance without high detection ability @@ -460,10 +456,6 @@ stealth->AdjustMax(0.01); } -void System::PopGrowthProductionResearchPhase() -{ -} - System::orbit_iterator System::begin() { return m_objects.begin(); Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/System.h 2009-10-15 05:47:48 UTC (rev 3209) @@ -163,9 +163,7 @@ virtual void AddOwner(int id); ///< adding owner to system objects is a no-op virtual void RemoveOwner(int id); ///< removing owner from system objects is a no-op - virtual void MovementPhase(); virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); - virtual void PopGrowthProductionResearchPhase(); orbit_iterator begin(); ///< begin iterator for all system objects orbit_iterator end(); ///< end iterator for all system objects Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-15 05:47:48 UTC (rev 3209) @@ -317,3 +317,9 @@ for (std::map<MeterType, Meter>::iterator it = m_meters.begin(); it != m_meters.end(); ++it) it->second.Clamp(); } + +void UniverseObject::PopGrowthProductionResearchPhase() +{} + +void UniverseObject::MovementPhase() +{} Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-10-15 03:54:23 UTC (rev 3208) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-10-15 05:47:48 UTC (rev 3209) @@ -133,7 +133,7 @@ /** performs the movement that this object is responsible for this object's actions during the movement phase of a turn. */ - virtual void MovementPhase() = 0; + virtual void MovementPhase(); /** sets max meter value(s) for meter(s) in this UniverseObject to Meter::METER_MIN. This should be done before any * Effects that alter meter(s) act on the object. if \a meter_type is INVALID_METER_TYPE, all meters are reset. if @@ -151,7 +151,7 @@ /** performs the movement that this object is responsible for this object's actions during the pop growth/production/research phase of a turn. */ - virtual void PopGrowthProductionResearchPhase() = 0; + virtual void PopGrowthProductionResearchPhase(); //@} static const double INVALID_POSITION; ///< the position in x and y at which default-constructed objects are placed |
From: <geo...@us...> - 2009-10-16 06:16:02
|
Revision: 3211 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3211&view=rev Author: geoffthemedio Date: 2009-10-16 06:15:49 +0000 (Fri, 16 Oct 2009) Log Message: ----------- Fixed issue where fleets weren't having their stealth meters updated, so had 0 stealth, so were being revealed to everyone in the galaxy between turns 1 and 2. Not sure why they weren't revealed on turn 1, but it should be fixed now. Modified Paths: -------------- trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/UniverseObject.cpp Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-10-16 02:45:55 UTC (rev 3210) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-10-16 06:15:49 UTC (rev 3211) @@ -862,6 +862,8 @@ void Fleet::PopGrowthProductionResearchPhase() { + UniverseObject::PopGrowthProductionResearchPhase(); + // ensure that any newly opened or closed routes are taken into account m_travel_route.clear(); CalculateRoute(); Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-10-16 02:45:55 UTC (rev 3210) +++ trunk/FreeOrion/universe/Planet.cpp 2009-10-16 06:15:49 UTC (rev 3211) @@ -536,6 +536,8 @@ void Planet::PopGrowthProductionResearchPhase() { + UniverseObject::PopGrowthProductionResearchPhase(); + // do not do production if planet was just conquered if (m_just_conquered) m_just_conquered = false; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-10-16 02:45:55 UTC (rev 3210) +++ trunk/FreeOrion/universe/Universe.cpp 2009-10-16 06:15:49 UTC (rev 3211) @@ -1368,7 +1368,7 @@ // check whether having a contained object wouldn't change container's // visibility anyway... if (container_vis_it->second >= VIS_PARTIAL_VISIBILITY) - continue; // having visible container grants part vis only. if container already has this for current empire, don't need to propegate + continue; // having visible contained object grants part vis only. if container already has this for current empire, don't need to propegate } Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-16 02:45:55 UTC (rev 3210) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-16 06:15:49 UTC (rev 3211) @@ -319,7 +319,11 @@ } void UniverseObject::PopGrowthProductionResearchPhase() -{} +{ + Meter* meter = GetMeter(METER_STEALTH); + assert(meter); + meter->SetCurrent(meter->Max()); +} void UniverseObject::MovementPhase() {} |
From: <geo...@us...> - 2009-10-18 04:37:31
|
Revision: 3222 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3222&view=rev Author: geoffthemedio Date: 2009-10-18 04:37:23 +0000 (Sun, 18 Oct 2009) Log Message: ----------- Added steps to object visibility calculations, and to visible starlanes determination so that if a fleet is moving between two systems that have no other way for an empire to see them, the two systems are at least basically visible, and the starlane along which the fleet is moving is visible. Modified Paths: -------------- trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-10-17 23:46:31 UTC (rev 3221) +++ trunk/FreeOrion/universe/System.cpp 2009-10-18 04:37:23 UTC (rev 3222) @@ -520,15 +520,43 @@ if (vis2 < VIS_BASIC_VISIBILITY) return retval; + + std::vector<const Fleet*> moving_empire_fleets; + Universe::ObjectVec moving_fleet_objects = universe.FindObjects(MovingFleetVisitor()); + for (Universe::ObjectVec::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) + if (const Fleet* fleet = universe_object_cast<const Fleet*>(*it)) + if (fleet->OwnedBy(empire_id)) + moving_empire_fleets.push_back(fleet); + + // check each connected system, paired with current system, to ensure at - // least one is partial, and both are at least basically visible + // least one is partial, and both are at least basically visible, or that + // both are basically visible if there is a ship owned by the indicated + // empire travelling along a lane between them for (StarlaneMap::const_iterator it = m_starlanes_wormholes.begin(); it != m_starlanes_wormholes.end(); ++it) { Visibility vis1 = universe.GetObjectVisibilityByEmpire(it->first, empire_id); if (vis1 < VIS_BASIC_VISIBILITY) continue; - if (vis1 >= VIS_PARTIAL_VISIBILITY || vis2 >= VIS_PARTIAL_VISIBILITY) + if (vis1 >= VIS_PARTIAL_VISIBILITY || vis2 >= VIS_PARTIAL_VISIBILITY) { + // one or both systems are partially visible, so lane is visible retval.insert(*it); + continue; + + } else if (vis1 >= VIS_BASIC_VISIBILITY) { + // check for fleets not in a system and with next and previous + // systems that are the current pair + for (std::vector<const Fleet*>::const_iterator moving_fleet_it = moving_empire_fleets.begin(); moving_fleet_it != moving_empire_fleets.end(); ++moving_fleet_it) { + const Fleet* fleet = *moving_fleet_it; + if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID && + ((fleet->NextSystemID() == this->ID() && fleet->PreviousSystemID() == it->first) || + (fleet->NextSystemID() == it->first && fleet->PreviousSystemID() == this->ID()))) + { + retval.insert(*it); + break; + } + } + } } return retval; } Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-10-17 23:46:31 UTC (rev 3221) +++ trunk/FreeOrion/universe/Universe.cpp 2009-10-18 04:37:23 UTC (rev 3222) @@ -1434,6 +1434,45 @@ } } } + + + // ensure systems on either side of a starlane along which a fleet is + // moving are at least basically visible, so that the starlane itself will + // be visible + std::vector<const Fleet*> moving_fleets; + Universe::ObjectVec moving_fleet_objects = this->FindObjects(MovingFleetVisitor()); + for (Universe::ObjectVec::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) + if (const Fleet* fleet = universe_object_cast<const Fleet*>(*it)) { + if (fleet->SystemID() != UniverseObject::INVALID_OBJECT_ID || fleet->Unowned()) + continue; + + int prev = fleet->PreviousSystemID(); + int next = fleet->NextSystemID(); + + // for each empire that owns the fleet, ensure that empire has + // at least basic visibility of the next and previous systems + // on the fleet's path + const std::set<int>& owners = fleet->Owners(); + for (std::set<int>::const_iterator empire_it = owners.begin(); empire_it != owners.end(); ++empire_it) { + ObjectVisibilityMap& vis_map = m_empire_object_visibility[*empire_it]; + + ObjectVisibilityMap::iterator system_vis_it = vis_map.find(prev); + if (system_vis_it == vis_map.end()) { + vis_map[prev] = VIS_BASIC_VISIBILITY; + } else { + if (system_vis_it->second < VIS_BASIC_VISIBILITY) + system_vis_it->second = VIS_BASIC_VISIBILITY; + } + + system_vis_it = vis_map.find(next); + if (system_vis_it == vis_map.end()) { + vis_map[next] = VIS_BASIC_VISIBILITY; + } else { + if (system_vis_it->second < VIS_BASIC_VISIBILITY) + system_vis_it->second = VIS_BASIC_VISIBILITY; + } + } + } } void Universe::RebuildEmpireViewSystemGraphs() |
From: <on...@us...> - 2009-10-19 09:45:58
|
Revision: 3229 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3229&view=rev Author: ondrejr Date: 2009-10-19 09:45:44 +0000 (Mon, 19 Oct 2009) Log Message: ----------- -linux compile fix -grammar fix Modified Paths: -------------- trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2009-10-19 08:50:07 UTC (rev 3228) +++ trunk/FreeOrion/universe/Universe.h 2009-10-19 09:45:44 UTC (rev 3229) @@ -31,8 +31,8 @@ * UniverseObjects in a game, and (of less importance) all ShipDesigns in a * game. (Other gamestate is contained in the Empire class.) * The Universe class also provides functions with which to access objects in - * it, information about the objects, and infromation about the objects' - * relationships to eachother. As well, there are functions that generate + * it, information about the objects, and information about the objects' + * relationships to each other. As well, there are functions that generate * and populate new Universe gamestates when new games are started. */ class Universe { @@ -167,7 +167,7 @@ * distance travelled to get there. If no such path exists, the list * will be empty. Note that the path returned may be via one or more * starlane, or may be "offroad". The path is calculated using the - * visiblity for empire \a empire_id, or without regard to visibility if + * visibility for empire \a empire_id, or without regard to visibility if * \a empire_id == ALL_EMPIRES. * \throw std::out_of_range This function will throw if either system ID * is out of range. */ @@ -178,7 +178,7 @@ * that defines the path with the fewest jumps from \a system1 to * \a system2, and the number of jumps to get there. If no such path * exists, the list will be empty. The path is calculated using the - * visiblity for empire \a empire_id, or without regard to visibility if + * visibility for empire \a empire_id, or without regard to visibility if * \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function * will throw if either system ID is out of range. */ std::pair<std::list<int>, int> @@ -186,7 +186,7 @@ /** returns whether there is a path known to empire \a empire_id between * system \a system1 and system \a system2. The path is calculated using - * the visiblity for empire \a empire_id, or without regard to visibility + * the visibility for empire \a empire_id, or without regard to visibility * if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function * will throw if either system ID is out of range. */ bool SystemsConnected(int system1_id, int system2_id, int empire_id = ALL_EMPIRES) const; @@ -194,8 +194,8 @@ /** Returns true iff \a system is reachable from another system (i.e. it * has at least one known starlane to it). This does not guarantee that * the system is reachable from any specific other system, as two separate - * groups of locally but not globally internonnected systems may exist. - * The starlanes considered depend on their visiblity for empire + * groups of locally but not globally interconnected systems may exist. + * The starlanes considered depend on their visibility for empire * \a empire_id, or without regard to visibility if * \a empire_id == ALL_EMPIRES. * \throw std::out_of_range This function will throw if the system ID is @@ -204,7 +204,7 @@ /** Returns the systems that are one starlane hop away from system * \a system. The returned systems are indexed by distance from - * \a system. The neighborhood is calculated using the visiblity + * \a system. The neighborhood is calculated using the visibility * for empire \a empire_id, or without regard to visibility if * \a empire_id == ALL_EMPIRES. * \throw std::out_of_range This function will throw if the system @@ -235,18 +235,18 @@ * \note Universe gains ownership of \a obj once it is inserted; the * caller should \a never delete \a obj after * passing it to InsertID(). - * Useful mostly for times when ID needs to be consistant on client + * Useful mostly for times when ID needs to be consistent on client * and server */ bool InsertID(UniverseObject* obj, int id); /** Inserts \a ship_design into the universe; returns the ship design ID * assigned to it, or -1 on failure. - * \note Unvierse gains ownership of \a ship_design once inserted. */ + * \note Universe gains ownership of \a ship_design once inserted. */ int InsertShipDesign(ShipDesign* ship_design); /** Inserts \a ship_design into the universe with given \a id; returns * true on success, or false on failure. - * \note Unvierse gains ownership of \a ship_design once inserted. */ + * \note Universe gains ownership of \a ship_design once inserted. */ bool InsertShipDesignID(ShipDesign* ship_design, int id); /** Generates systems and planets, assigns homeworlds and populates them @@ -314,12 +314,12 @@ /** Used by the Destroy effect to mark an object for destruction later * during turn processing. (objects can't be destroyed immediately as - * other effects might depend on their existance) */ + * other effects might depend on their existence) */ void EffectDestroy(int id); /** Permanently deletes object with ID number \a id. no information about * this object is retained in the Universe. Can be performed on objects - * wether or not the have been destroyed. Returns true if such an object + * whether or not the have been destroyed. Returns true if such an object * was found, false otherwise. */ bool Delete(int id); @@ -343,7 +343,7 @@ * to service new ID requests. */ int GenerateObjectID(); - /** Generates adesign ID for a new (ship) design. Usually used by the + /** Generates design ID for a new (ship) design. Usually used by the * server to service new ID requests. */ int GenerateDesignID(); @@ -422,7 +422,7 @@ bool ConnectedWithin(int system1, int system2, int maxLaneJumps, std::vector<std::set<int> >& laneSetArray); /** Removes lanes from passed graph that are angularly too close to - * eachother. */ + * each other. */ void CullAngularlyTooCloseLanes(double maxLaneUVectDotProd, std::vector<std::set<int> >& laneSetArray, std::vector<System*> &systems); /** Removes lanes from passed graph that are too long. */ Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-10-19 08:50:07 UTC (rev 3228) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-10-19 09:45:44 UTC (rev 3229) @@ -32,11 +32,11 @@ a position, possibly a System in which it is, and zero or more owners. The position can range from 0 (left) to 1000 (right) in X, and 0 (top) to 1000 (bottom) in Y. This coordinate system was chosen to help with conversion to and from screen coordinates, which originate at the upper-left corner of the screen and increase down and to the - right. Each UniverseObject-derived class inherits serveral pure virtual members that perform its actions during + right. Each UniverseObject-derived class inherits several pure virtual members that perform its actions during various game phases, such as the movement phase. These subclasses must define what actions to perform during those phases. UniverseObjects advertise changes to themselves via the StateChanged signal. This means that all mutators on UniverseObject and its subclasses need to emit this signal. This is how the UI becomes aware that an - object that is being dislayed has changed.*/ + object that is being displayed has changed.*/ class UniverseObject { public: @@ -145,7 +145,7 @@ * meter is adjusted. */ virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); - /** calls Clamp() on each meter in this UniverseObject, to ensure that no Meter's Max() falls outisde the range + /** calls Clamp() on each meter in this UniverseObject, to ensure that no Meter's Max() falls outside the range * [Meter::METER_MIN, METER::METER_MAX]and that no Meter's Current() value exceed its Max() value. */ void ClampMeters(); @@ -223,7 +223,7 @@ std::string name; if (Archive::is_saving::value) { // We don't disclose the real object name for some types of objects, since it would look funny if e.g. the - // user saw an incoming enemy cleet called "Decoy". + // user saw an incoming enemy fleet called "Decoy". name = PublicName(Universe::s_encoding_empire); } |
From: <geo...@us...> - 2009-10-27 03:21:29
|
Revision: 3247 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3247&view=rev Author: geoffthemedio Date: 2009-10-27 03:21:21 +0000 (Tue, 27 Oct 2009) Log Message: ----------- -Switched Universe serialization function GetObjectsToSerialize to send each empire's latest known version of objects, rather than filtering only be current turn visibility. -Replaced all UniverseObject, derived and related classes serialization functions with simple versions that send all available information. Filtering for visibility levels is now done using the Copy and Clone methods in UpdateEmpireLatestKnownObjectsAndVisibilityTurns(). This is still a work in progress, and while it runs and I can move a fleet around, likely issues will occur if seeing other empires' fleets and ships or planets and buildings. Modified Paths: -------------- trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/Building.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -157,24 +157,10 @@ template <class Archive> void Building::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - bool ordered_scrapped = false; - - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - } - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) - & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_building_type) - & BOOST_SERIALIZATION_NVP(m_planet_id); - - if (vis == VIS_FULL_VISIBILITY) { - ar & BOOST_SERIALIZATION_NVP(ordered_scrapped); - } - - if (Archive::is_loading::value) - m_ordered_scrapped = ordered_scrapped; + & BOOST_SERIALIZATION_NVP(m_planet_id) + & BOOST_SERIALIZATION_NVP(m_ordered_scrapped); } template <class Archive> Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/Fleet.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -145,56 +145,14 @@ template <class Archive> void Fleet::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - int moving_to; - std::list<int> travel_route; - double travel_distance; - ShipIDSet ships; - - if (Archive::is_saving::value) - vis = GetVisibility(Universe::s_encoding_empire); - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) - & BOOST_SERIALIZATION_NVP(vis); - - if (Archive::is_saving::value) { - moving_to = (vis == VIS_FULL_VISIBILITY) ? m_moving_to : m_next_system; - if (1 <= version) { - ShortenRouteToEndAtSystem(travel_route, moving_to); - travel_distance = m_travel_distance; - if (!travel_route.empty() && travel_route.front() != 0 && travel_route.size() != m_travel_route.size()) { - if (moving_to == m_moving_to) - moving_to = travel_route.back(); - travel_distance -= GetUniverse().ShortestPath(travel_route.back(), m_travel_route.back()).second; - } - } - - ships = VisibleContainedObjects(Universe::s_encoding_empire); - } - - ar & BOOST_SERIALIZATION_NVP(ships) - & BOOST_SERIALIZATION_NVP(moving_to) + & BOOST_SERIALIZATION_NVP(m_ships) + & BOOST_SERIALIZATION_NVP(m_moving_to) + & BOOST_SERIALIZATION_NVP(m_speed) & BOOST_SERIALIZATION_NVP(m_prev_system) - & BOOST_SERIALIZATION_NVP(m_next_system); - - if (1 <= version) { - ar & BOOST_SERIALIZATION_NVP(m_speed) - & BOOST_SERIALIZATION_NVP(travel_route) - & BOOST_SERIALIZATION_NVP(travel_distance); - } - - if (Archive::is_loading::value) { - m_moving_to = moving_to; - if (1 <= version) { - std::swap(m_travel_route, travel_route); - m_travel_distance = travel_distance; - } - - m_ships = ships; - } - - if (vis == VIS_FULL_VISIBILITY) - ar & BOOST_SERIALIZATION_NVP(m_speed); + & BOOST_SERIALIZATION_NVP(m_next_system) + & BOOST_SERIALIZATION_NVP(m_travel_route) + & BOOST_SERIALIZATION_NVP(m_travel_distance); } #endif // _Fleet_h_ Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/Planet.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -211,33 +211,19 @@ template <class Archive> void Planet::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - std::set<int> buildings; - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - buildings = VisibleContainedObjects(Universe::s_encoding_empire); - } - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_BASE_OBJECT_NVP(PopCenter) & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourceCenter) - & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_type) & BOOST_SERIALIZATION_NVP(m_size) & BOOST_SERIALIZATION_NVP(m_orbital_period) & BOOST_SERIALIZATION_NVP(m_initial_orbital_position) & BOOST_SERIALIZATION_NVP(m_rotational_period) & BOOST_SERIALIZATION_NVP(m_axial_tilt) + & BOOST_SERIALIZATION_NVP(m_buildings) + & BOOST_SERIALIZATION_NVP(m_available_trade) & BOOST_SERIALIZATION_NVP(m_just_conquered) - & BOOST_SERIALIZATION_NVP(buildings); - - if (vis == VIS_FULL_VISIBILITY) { - ar & BOOST_SERIALIZATION_NVP(m_available_trade) - & BOOST_SERIALIZATION_NVP(m_is_about_to_be_colonized); - } - - if (Archive::is_loading::value) - m_buildings = buildings; + & BOOST_SERIALIZATION_NVP(m_is_about_to_be_colonized); } #endif // _Planet_h_ Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/ResourceCenter.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -78,17 +78,8 @@ template <class Archive> void ResourceCenter::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - } - - ar & BOOST_SERIALIZATION_NVP(vis); - - if (vis == VIS_FULL_VISIBILITY) { - ar & BOOST_SERIALIZATION_NVP(m_primary) - & BOOST_SERIALIZATION_NVP(m_secondary); - } + ar & BOOST_SERIALIZATION_NVP(m_primary) + & BOOST_SERIALIZATION_NVP(m_secondary); } #endif // _ResourceCenter_h_ Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/Ship.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -78,29 +78,12 @@ template <class Archive> void Ship::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - bool ordered_scrapped = false; - - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - } - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) - & BOOST_SERIALIZATION_NVP(vis) - & BOOST_SERIALIZATION_NVP(m_fleet_id); - - if (vis >= VIS_PARTIAL_VISIBILITY) { - ar & BOOST_SERIALIZATION_NVP(m_design_id) - & BOOST_SERIALIZATION_NVP(m_fighters) - & BOOST_SERIALIZATION_NVP(m_missiles); - } - - if (vis == VIS_FULL_VISIBILITY) { - ar & BOOST_SERIALIZATION_NVP(ordered_scrapped); - } - - if (Archive::is_loading::value) - m_ordered_scrapped = ordered_scrapped; + & BOOST_SERIALIZATION_NVP(m_design_id) + & BOOST_SERIALIZATION_NVP(m_fleet_id) + & BOOST_SERIALIZATION_NVP(m_ordered_scrapped) + & BOOST_SERIALIZATION_NVP(m_fighters) + & BOOST_SERIALIZATION_NVP(m_missiles); } #endif // _Ship_h_ Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/System.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -302,37 +302,11 @@ template <class Archive> void System::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - int orbits = 0; - ObjectMultimap objects; - StarlaneMap starlanes_wormholes; - - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - if (vis == VIS_FULL_VISIBILITY) - orbits = m_orbits; - - objects = VisibleContainedObjects(Universe::s_encoding_empire); - starlanes_wormholes = VisibleStarlanes( Universe::s_encoding_empire); - } - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) - & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_star) - & BOOST_SERIALIZATION_NVP(orbits) - & BOOST_SERIALIZATION_NVP(objects) - & BOOST_SERIALIZATION_NVP(starlanes_wormholes); - - if (Archive::is_loading::value) { - m_orbits = orbits; - m_objects = objects; - m_starlanes_wormholes = starlanes_wormholes; - //// DEBUG - //Logger().debugStream() << "system " << this->Name() << " deserialized objects ids:"; - //for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) - // Logger().debugStream() << ".... " << it->second; - //// END DEBUG - } + & BOOST_SERIALIZATION_NVP(m_orbits) + & BOOST_SERIALIZATION_NVP(m_objects) + & BOOST_SERIALIZATION_NVP(m_starlanes_wormholes); } #endif // _System_h_ Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/Universe.cpp 2009-10-27 03:21:21 UTC (rev 3247) @@ -1891,13 +1891,12 @@ if (s_encoding_empire == ALL_EMPIRES) { objects = m_objects; } else { - - // TODO: send contents of m_empire_latest_known_objects instead of filtering m_objects by visibility - - objects.clear(); - for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) - if (GetObjectVisibilityByEmpire(it->first, encoding_empire) > VIS_NO_VISIBILITY) - objects.insert(*it); + EmpireLatestKnownObjectMap::const_iterator it = m_empire_latest_known_objects.find(encoding_empire); + if (it == m_empire_latest_known_objects.end()) { + objects.clear(); + return; // nothing to send + } + objects = it->second; } } Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-10-26 08:52:26 UTC (rev 3246) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-10-27 03:21:21 UTC (rev 3247) @@ -220,42 +220,15 @@ template <class Archive> void UniverseObject::serialize(Archive& ar, const unsigned int version) { - Visibility vis; - std::map<MeterType, Meter> meters; - - if (Archive::is_saving::value) { - vis = GetVisibility(Universe::s_encoding_empire); - meters = CensoredMeters(vis); - } - - ar & BOOST_SERIALIZATION_NVP(vis) - & BOOST_SERIALIZATION_NVP(m_id) + ar & BOOST_SERIALIZATION_NVP(m_id) + & BOOST_SERIALIZATION_NVP(m_name) & BOOST_SERIALIZATION_NVP(m_x) & BOOST_SERIALIZATION_NVP(m_y) + & BOOST_SERIALIZATION_NVP(m_owners) & BOOST_SERIALIZATION_NVP(m_system_id) - & BOOST_SERIALIZATION_NVP(meters); - - if (Archive::is_loading::value) { - m_meters = meters; - } - - if (vis >= VIS_PARTIAL_VISIBILITY) { - std::string name; - if (Archive::is_saving::value) { - // We don't disclose the real object name for some types of objects, since it would look funny if e.g. the - // user saw an incoming enemy fleet called "Decoy". - name = PublicName(Universe::s_encoding_empire); - } - - ar & BOOST_SERIALIZATION_NVP(name) - & BOOST_SERIALIZATION_NVP(m_owners) - & BOOST_SERIALIZATION_NVP(m_specials) - & BOOST_SERIALIZATION_NVP(m_created_on_turn); - - if (Archive::is_loading::value) { - m_name = name; - } - } + & BOOST_SERIALIZATION_NVP(m_specials) + & BOOST_SERIALIZATION_NVP(m_meters) + & BOOST_SERIALIZATION_NVP(m_created_on_turn); } #endif // _UniverseObject_h_ |
From: <geo...@us...> - 2009-11-08 19:24:45
|
Revision: 3260 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3260&view=rev Author: geoffthemedio Date: 2009-11-08 19:24:39 +0000 (Sun, 08 Nov 2009) Log Message: ----------- Fixed issue with ship design description stringtable lookup Modified Paths: -------------- trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2009-11-07 22:56:35 UTC (rev 3259) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2009-11-08 19:24:39 UTC (rev 3260) @@ -824,9 +824,9 @@ return m_name; } -const std::string& ShipDesign::Description() const +const std::string& ShipDesign::Description(bool stringtable_lookup /* = true */) const { - if (m_name_desc_in_stringtable) + if (m_name_desc_in_stringtable && stringtable_lookup) return UserString(m_description); else return m_description; @@ -1269,7 +1269,7 @@ Logger().errorStream() << "Predefined ship design name in map (" << it->first << ") doesn't match name in ShipDesign::m_name (" << d->Name(false) << ")"; } - ShipDesign* copy = new ShipDesign(d->Name(false), d->Description(), empire->EmpireID(), + ShipDesign* copy = new ShipDesign(d->Name(false), d->Description(false), empire->EmpireID(), d->DesignedOnTurn(), d->Hull(), d->Parts(), d->Graphic(), d->Model(), true); @@ -1298,7 +1298,7 @@ Logger().errorStream() << "Predefined ship design name in map (" << it->first << ") doesn't match name in ShipDesign::m_name (" << d->Name(false) << ")"; } - ShipDesign* copy = new ShipDesign(d->Name(false), d->Description(), ALL_EMPIRES, + ShipDesign* copy = new ShipDesign(d->Name(false), d->Description(false), ALL_EMPIRES, d->DesignedOnTurn(), d->Hull(), d->Parts(), d->Graphic(), d->Model(), true); Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2009-11-07 22:56:35 UTC (rev 3259) +++ trunk/FreeOrion/universe/ShipDesign.h 2009-11-08 19:24:39 UTC (rev 3260) @@ -385,7 +385,12 @@ * otherwise, the raw name string is returned. */ const std::string& Name(bool stringtable_lookup = true) const; - const std::string& Description() const; ///< returns description of design + /** returns description of design. if \a stringtable_lookup is true and + * the design was constructed specifying name_desc_in_stringtable true, + * the description string is looked up in the stringtable before being + * returned. otherwise, the raw name string is returned. */ + const std::string& Description(bool stringtable_lookup = true) const; + int DesignedByEmpire() const; ///< returns id of empire that created design int DesignedOnTurn() const; ///< returns turn on which design was created |