From: <geo...@us...> - 2009-09-07 19:36:24
|
Revision: 3150 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3150&view=rev Author: geoffthemedio Date: 2009-09-07 19:36:16 +0000 (Mon, 07 Sep 2009) Log Message: ----------- Tweaked SetTechAvailability to be a no-op if the indicated empire or tech can't be found, rather than a crash, since needing to add checks to scope conditions, to ensure everything such an effect acted on had an owner, was / would have been awkward. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2009-09-07 18:52:01 UTC (rev 3149) +++ trunk/FreeOrion/universe/Effect.cpp 2009-09-07 19:36:16 UTC (rev 3150) @@ -454,8 +454,8 @@ return; double value = m_value->Eval(source, target); - Empire* empire = Empires().Lookup(*source->Owners().begin()); - empire->SetResourceStockpile(m_stockpile, value); + if (Empire* empire = Empires().Lookup(*source->Owners().begin())) + empire->SetResourceStockpile(m_stockpile, value); } std::string SetEmpireStockpile::Description() const @@ -1024,8 +1024,10 @@ void SetTechAvailability::Execute(const UniverseObject* source, UniverseObject* target) const { Empire* empire = Empires().Lookup(m_empire_id->Eval(source, target)); + if (!empire) return; + const Tech* tech = GetTech(m_tech_name); - assert(empire && tech); + if (!tech) return; const std::vector<ItemSpec>& items = tech->UnlockedItems(); for (unsigned int i = 0; i < items.size(); ++i) { |
From: <geo...@us...> - 2010-05-29 18:59:44
|
Revision: 3613 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3613&view=rev Author: geoffthemedio Date: 2010-05-29 18:59:38 +0000 (Sat, 29 May 2010) Log Message: ----------- Added safety checks to SetShipPartMeter::Execute in Effect.cpp to prevent a crash, although there still seem to be some issues since some parts aren't being gotten when they seemingly should be. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2010-05-29 17:50:55 UTC (rev 3612) +++ trunk/FreeOrion/universe/Effect.cpp 2010-05-29 18:59:38 UTC (rev 3613) @@ -549,16 +549,35 @@ void SetShipPartMeter::Execute(const UniverseObject* source, UniverseObject* target) const { - if (Ship* ship = universe_object_cast<Ship*>(target)) { - for (std::size_t i = 0; i < ship->Design()->Parts().size(); ++i) { - if (Meter* meter = ship->GetMeter(m_meter, m_part_name)) { - const PartType* part = GetPartType(ship->Design()->Parts()[i]); - if (PartMatchesEffect(*part, m_part_class, m_fighter_type, m_part_name, m_slot_type)) { - double val = m_value->Eval(source, target, meter->Current()); - meter->SetCurrent(val); - } - } + if (!target) { + Logger().debugStream() << "SetShipPartMeter::Execute passed null target pointer"; + return; + } + + Ship* ship = universe_object_cast<Ship*>(target); + if (!ship) { + Logger().errorStream() << "SetShipPartMeter::Execute acting on non-ship target:"; + target->Dump(); + return; + } + + for (std::size_t i = 0; i < ship->Design()->Parts().size(); ++i) { + Meter* meter = ship->GetMeter(m_meter, m_part_name); + if (!meter) + continue; + + const PartType* part = GetPartType(ship->Design()->Parts()[i]); + if (!part) { + Logger().errorStream() << "SetShipPartMeter::Execute acting on target:"; + ship->Dump(); + Logger().errorStream() << "Couldn't get part type: " << m_part_name; + return; } + + if (PartMatchesEffect(*part, m_part_class, m_fighter_type, m_part_name, m_slot_type)) { + double val = m_value->Eval(source, target, meter->Current()); + meter->SetCurrent(val); + } } } |
From: <geo...@us...> - 2010-05-29 19:33:37
|
Revision: 3614 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3614&view=rev Author: geoffthemedio Date: 2010-05-29 19:33:30 +0000 (Sat, 29 May 2010) Log Message: ----------- More rewriting for clarity and safety and correctness of SetShipPartMeter::Execute. This seems to fix the custom ship design crashes for me, although I may have a different presentation of this issue than others reporting it. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2010-05-29 18:59:38 UTC (rev 3613) +++ trunk/FreeOrion/universe/Effect.cpp 2010-05-29 19:33:30 UTC (rev 3614) @@ -561,20 +561,26 @@ return; } - for (std::size_t i = 0; i < ship->Design()->Parts().size(); ++i) { - Meter* meter = ship->GetMeter(m_meter, m_part_name); + // loop through all parts in the ship design, applying effect to each if appropriate + const std::vector<std::string>& design_parts = ship->Design()->Parts(); + for (std::size_t i = 0; i < design_parts.size(); ++i) { + const std::string& target_part_name = design_parts[i]; + if (target_part_name.empty()) + continue; // slots in a design may be empty... this isn't an error + + Meter* meter = ship->GetMeter(m_meter, target_part_name); if (!meter) + continue; // some parts may not have the requested meter. this isn't an error + + const PartType* target_part = GetPartType(target_part_name); + if (!target_part) { + Logger().errorStream() << "SetShipPartMeter::Execute couldn't get part type: " << target_part_name; continue; - - const PartType* part = GetPartType(ship->Design()->Parts()[i]); - if (!part) { - Logger().errorStream() << "SetShipPartMeter::Execute acting on target:"; - ship->Dump(); - Logger().errorStream() << "Couldn't get part type: " << m_part_name; - return; } - if (PartMatchesEffect(*part, m_part_class, m_fighter_type, m_part_name, m_slot_type)) { + // verify that found part matches the target part type information for + // this effect: same name, same class and slot type, or same fighter type + if (PartMatchesEffect(*target_part, m_part_class, m_fighter_type, m_part_name, m_slot_type)) { double val = m_value->Eval(source, target, meter->Current()); meter->SetCurrent(val); } |
From: <geo...@us...> - 2010-10-17 09:29:16
|
Revision: 3823 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3823&view=rev Author: geoffthemedio Date: 2010-10-17 09:29:09 +0000 (Sun, 17 Oct 2010) Log Message: ----------- Implemented SetEmpireMeter::Execute effect. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2010-10-16 23:22:53 UTC (rev 3822) +++ trunk/FreeOrion/universe/Effect.cpp 2010-10-17 09:29:09 UTC (rev 3823) @@ -718,7 +718,23 @@ void SetEmpireMeter::Execute(const UniverseObject* source, UniverseObject* target) const { - // todo + int empire_id = m_empire_id->Eval(source, target, boost::any()); + + Empire* empire = Empires().Lookup(empire_id); + if (!empire) { + Logger().debugStream() << "SetEmpireMeter::Execute unable to find empire with id " << empire_id; + return; + } + + Meter* meter = empire->GetMeter(m_meter); + if (!meter) { + Logger().debugStream() << "SetEmpireMeter::Execute empire " << empire->Name() << " doesn't have a meter named " << m_meter; + return; + } + + double value = m_value->Eval(source, target, meter->Current()); + + meter->SetCurrent(value); } std::string SetEmpireMeter::Description() const @@ -764,8 +780,10 @@ int empire_id = m_empire_id->Eval(source, target, boost::any()); Empire* empire = Empires().Lookup(empire_id); - if (empire) + if (!empire) { + Logger().debugStream() << "SetEmpireStockpile::Execute couldn't find an empire with id " << empire_id; return; + } double value = m_value->Eval(source, target, empire->ResourceStockpile(m_stockpile)); empire->SetResourceStockpile(m_stockpile, value); |
From: <geo...@us...> - 2011-08-07 04:14:25
|
Revision: 4107 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4107&view=rev Author: geoffthemedio Date: 2011-08-07 04:14:19 +0000 (Sun, 07 Aug 2011) Log Message: ----------- Made SetDestination randomly pick from condition-matching objects, rather than always choosing whatever is first in the set. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-08-07 03:47:01 UTC (rev 4106) +++ trunk/FreeOrion/universe/Effect.cpp 2011-08-07 04:14:19 UTC (rev 4107) @@ -1,12 +1,13 @@ #include "Effect.h" #include "../util/AppInterface.h" +#include "../util/Random.h" +#include "../Empire/EmpireManager.h" +#include "../Empire/Empire.h" #include "ValueRef.h" #include "Condition.h" #include "Universe.h" #include "UniverseObject.h" -#include "../Empire/EmpireManager.h" -#include "../Empire/Empire.h" #include "Building.h" #include "Planet.h" #include "System.h" @@ -1764,7 +1765,10 @@ return; // "randomly" pick a destination - UniverseObject* destination = const_cast<UniverseObject*>(*valid_locations.begin()); + int destination_idx = RandSmallInt(0, valid_locations.size() - 1); + Condition::ObjectSet::iterator obj_it = valid_locations.begin(); + std::advance(obj_it, destination_idx); + UniverseObject* destination = const_cast<UniverseObject*>(*obj_it); int destination_system_id = destination->SystemID(); // early exit if destination is not / in a system |
From: <geo...@us...> - 2011-09-01 18:15:13
|
Revision: 4213 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4213&view=rev Author: geoffthemedio Date: 2011-09-01 18:15:07 +0000 (Thu, 01 Sep 2011) Log Message: ----------- Seemingly fixed issue with CreateShip effect where (some?) ships created would have 0 fuel and structure meters. Fix involved setting the current and max meters to large values and then back propegating during creation of the objects, allowing later meter resetting and clamping to fix them to reasonable values. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-09-01 18:08:12 UTC (rev 4212) +++ trunk/FreeOrion/universe/Effect.cpp 2011-09-01 18:15:07 UTC (rev 4213) @@ -1243,10 +1243,20 @@ return; } ship->Rename(empire ? empire->NewShipName() : ship->Design()->Name()); - ship->UniverseObject::GetMeter(METER_FUEL)->SetCurrent(Meter::LARGE_VALUE); - ship->UniverseObject::GetMeter(METER_SHIELD)->SetCurrent(Meter::LARGE_VALUE); - ship->UniverseObject::GetMeter(METER_STRUCTURE)->SetCurrent(Meter::LARGE_VALUE); + UniverseObject* obj = ship; + obj->ResetTargetMaxUnpairedMeters(); + obj->ResetPairedActiveMeters(); + + obj->GetMeter(METER_MAX_FUEL)->SetCurrent(Meter::LARGE_VALUE); + obj->GetMeter(METER_MAX_SHIELD)->SetCurrent(Meter::LARGE_VALUE); + obj->GetMeter(METER_MAX_STRUCTURE)->SetCurrent(Meter::LARGE_VALUE); + obj->GetMeter(METER_FUEL)->SetCurrent(Meter::LARGE_VALUE); + obj->GetMeter(METER_SHIELD)->SetCurrent(Meter::LARGE_VALUE); + obj->GetMeter(METER_STRUCTURE)->SetCurrent(Meter::LARGE_VALUE); + + obj->BackPropegateMeters(); + int new_ship_id = GetNewObjectID(); GetUniverse().InsertID(ship, new_ship_id); |
From: <geo...@us...> - 2011-09-01 18:28:17
|
Revision: 4214 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4214&view=rev Author: geoffthemedio Date: 2011-09-01 18:28:10 +0000 (Thu, 01 Sep 2011) Log Message: ----------- Added TROOPS meter cases to SetMeter::Dump. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-09-01 18:15:07 UTC (rev 4213) +++ trunk/FreeOrion/universe/Effect.cpp 2011-09-01 18:28:10 UTC (rev 4214) @@ -484,6 +484,7 @@ case METER_MAX_SHIELD: retval += "MaxShield"; break; case METER_MAX_STRUCTURE: retval += "MaxStructure"; break; case METER_MAX_DEFENSE: retval += "MaxDefense"; break; + case METER_MAX_TROOPS: retval += "MaxTroops"; break; case METER_POPULATION: retval += "Population"; break; case METER_HEALTH: retval += "Health"; break; @@ -498,6 +499,7 @@ case METER_SHIELD: retval += "Shield"; break; case METER_STRUCTURE: retval += "Structure"; break; case METER_DEFENSE: retval += "Defense"; break; + case METER_TROOPS: retval += "Troops"; break; case METER_FOOD_CONSUMPTION: retval += "FoodConsumption"; break; case METER_SUPPLY: retval += "Supply"; break; |
From: <geo...@us...> - 2011-10-01 22:26:41
|
Revision: 4316 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4316&view=rev Author: geoffthemedio Date: 2011-10-01 22:26:35 +0000 (Sat, 01 Oct 2011) Log Message: ----------- -Fixed some potential effect description crashes where no empire ID is specified or an empire doesn't exist that was specified. -Tweaked GenerateSitRepMessage description and dump output to hide "parameters" label when not needed. -Tweaked GenerateSitRepMessage dump to show the empire affiliation. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-10-01 22:24:17 UTC (rev 4315) +++ trunk/FreeOrion/universe/Effect.cpp 2011-10-01 22:26:35 UTC (rev 4316) @@ -319,14 +319,10 @@ } const std::string& EffectsGroup::StackingGroup() const -{ - return m_stacking_group; -} +{ return m_stacking_group; } const std::vector<EffectBase*>& EffectsGroup::EffectsList() const -{ - return m_effects; -} +{ return m_effects; } EffectsGroup::Description EffectsGroup::GetDescription() const { @@ -434,9 +430,7 @@ {} SetMeter::~SetMeter() -{ - delete m_value; -} +{ delete m_value; } void SetMeter::Execute(const ScriptingContext& context) const { @@ -729,9 +723,15 @@ std::string SetEmpireMeter::Description() const { - std::string empire_str = ValueRef::ConstantExpr(m_empire_id) ? - Empires().Lookup(m_empire_id->Eval())->Name() : - m_empire_id->Description(); + std::string empire_str; + if (m_empire_id) { + if (ValueRef::ConstantExpr(m_empire_id)) { + if (const Empire* empire = Empires().Lookup(m_empire_id->Eval())) + empire_str = empire->Name(); + } else { + empire_str = m_empire_id->Description(); + } + } std::string value_str = ValueRef::ConstantExpr(m_value) ? lexical_cast<std::string>(m_value->Eval()) : m_value->Description(); @@ -743,9 +743,7 @@ } std::string SetEmpireMeter::Dump() const -{ - return DumpIndent() + "SetEmpireMeter meter = " + UserString(m_meter) + " empire = " + m_empire_id->Dump() + " value = " + m_value->Dump(); -} +{ return DumpIndent() + "SetEmpireMeter meter = " + UserString(m_meter) + " empire = " + m_empire_id->Dump() + " value = " + m_value->Dump(); } /////////////////////////////////////////////////////////// @@ -785,9 +783,15 @@ std::string SetEmpireStockpile::Description() const { - std::string empire_str = ValueRef::ConstantExpr(m_empire_id) ? - Empires().Lookup(m_empire_id->Eval())->Name() : - m_empire_id->Description(); + std::string empire_str; + if (m_empire_id) { + if (ValueRef::ConstantExpr(m_empire_id)) { + if (const Empire* empire = Empires().Lookup(m_empire_id->Eval())) + empire_str = empire->Name(); + } else { + empire_str = m_empire_id->Description(); + } + } std::string value_str = ValueRef::ConstantExpr(m_value) ? lexical_cast<std::string>(m_value->Eval()) : m_value->Description(); @@ -824,9 +828,7 @@ {} SetEmpireCapital::~SetEmpireCapital() -{ - delete m_empire_id; -} +{ delete m_empire_id; } void SetEmpireCapital::Execute(const ScriptingContext& context) const { @@ -845,16 +847,20 @@ std::string SetEmpireCapital::Description() const { - std::string empire_str = ValueRef::ConstantExpr(m_empire_id) ? - Empires().Lookup(m_empire_id->Eval())->Name() : - m_empire_id->Description(); + std::string empire_str; + if (m_empire_id) { + if (ValueRef::ConstantExpr(m_empire_id)) { + if (const Empire* empire = Empires().Lookup(m_empire_id->Eval())) + empire_str = empire->Name(); + } else { + empire_str = m_empire_id->Description(); + } + } return str(FlexibleFormat(UserString("DESC_SET_EMPIRE_CAPITAL")) % empire_str); } std::string SetEmpireCapital::Dump() const -{ - return DumpIndent() + "SetEmpireCapital empire = " + m_empire_id->Dump() + "\n"; -} +{ return DumpIndent() + "SetEmpireCapital empire = " + m_empire_id->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -865,9 +871,7 @@ {} SetPlanetType::~SetPlanetType() -{ - delete m_type; -} +{ delete m_type; } void SetPlanetType::Execute(const ScriptingContext& context) const { @@ -894,9 +898,7 @@ } std::string SetPlanetType::Dump() const -{ - return DumpIndent() + "SetPlanetType type = " + m_type->Dump() + "\n"; -} +{ return DumpIndent() + "SetPlanetType type = " + m_type->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -907,9 +909,7 @@ {} SetPlanetSize::~SetPlanetSize() -{ - delete m_size; -} +{ delete m_size; } void SetPlanetSize::Execute(const ScriptingContext& context) const { @@ -934,9 +934,7 @@ } std::string SetPlanetSize::Dump() const -{ - return DumpIndent() + "SetPlanetSize size = " + m_size->Dump() + "\n"; -} +{ return DumpIndent() + "SetPlanetSize size = " + m_size->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -947,9 +945,7 @@ {} SetSpecies::~SetSpecies() -{ - delete m_species_name; -} +{ delete m_species_name; } void SetSpecies::Execute(const ScriptingContext& context) const { @@ -971,9 +967,7 @@ } std::string SetSpecies::Dump() const -{ - return DumpIndent() + "SetSpecies name = " + m_species_name->Dump() + "\n"; -} +{ return DumpIndent() + "SetSpecies name = " + m_species_name->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -984,9 +978,7 @@ {} SetOwner::~SetOwner() -{ - delete m_empire_id; -} +{ delete m_empire_id; } void SetOwner::Execute(const ScriptingContext& context) const { @@ -997,16 +989,20 @@ std::string SetOwner::Description() const { - std::string value_str = ValueRef::ConstantExpr(m_empire_id) ? - Empires().Lookup(m_empire_id->Eval())->Name() : - m_empire_id->Description(); - return str(FlexibleFormat(UserString("DESC_SET_OWNER")) % value_str); + std::string empire_str; + if (m_empire_id) { + if (ValueRef::ConstantExpr(m_empire_id)) { + if (const Empire* empire = Empires().Lookup(m_empire_id->Eval())) + empire_str = empire->Name(); + } else { + empire_str = m_empire_id->Description(); + } + } + return str(FlexibleFormat(UserString("DESC_SET_OWNER")) % empire_str); } std::string SetOwner::Dump() const -{ - return DumpIndent() + "SetOwner empire = " + m_empire_id->Dump() + "\n"; -} +{ return DumpIndent() + "SetOwner empire = " + m_empire_id->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1083,9 +1079,7 @@ } std::string CreatePlanet::Dump() const -{ - return DumpIndent() + "CreatePlanet size = " + m_size->Dump() + " type = " + m_type->Dump() + "\n"; -} +{ return DumpIndent() + "CreatePlanet size = " + m_size->Dump() + " type = " + m_type->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1096,9 +1090,7 @@ {} CreateBuilding::~CreateBuilding() -{ - delete m_building_type_name; -} +{ delete m_building_type_name; } void CreateBuilding::Execute(const ScriptingContext& context) const { @@ -1146,9 +1138,7 @@ } std::string CreateBuilding::Dump() const -{ - return DumpIndent() + "CreateBuilding type = " + m_building_type_name->Dump() + "\n"; -} +{ return DumpIndent() + "CreateBuilding type = " + m_building_type_name->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1355,14 +1345,10 @@ } std::string Destroy::Description() const -{ - return UserString("DESC_DESTROY"); -} +{ return UserString("DESC_DESTROY"); } std::string Destroy::Dump() const -{ - return DumpIndent() + "Destroy\n"; -} +{ return DumpIndent() + "Destroy\n"; } /////////////////////////////////////////////////////////// @@ -1382,14 +1368,10 @@ } std::string AddSpecial::Description() const -{ - return str(FlexibleFormat(UserString("DESC_ADD_SPECIAL")) % UserString(m_name)); -} +{ return str(FlexibleFormat(UserString("DESC_ADD_SPECIAL")) % UserString(m_name)); } std::string AddSpecial::Dump() const -{ - return DumpIndent() + "AddSpecial name = \"" + m_name + "\"\n"; -} +{ return DumpIndent() + "AddSpecial name = \"" + m_name + "\"\n"; } /////////////////////////////////////////////////////////// @@ -1409,14 +1391,10 @@ } std::string RemoveSpecial::Description() const -{ - return str(FlexibleFormat(UserString("DESC_REMOVE_SPECIAL")) % UserString(m_name)); -} +{ return str(FlexibleFormat(UserString("DESC_REMOVE_SPECIAL")) % UserString(m_name)); } std::string RemoveSpecial::Dump() const -{ - return DumpIndent() + "RemoveSpecial name = \"" + m_name + "\"\n"; -} +{ return DumpIndent() + "RemoveSpecial name = \"" + m_name + "\"\n"; } /////////////////////////////////////////////////////////// @@ -1427,9 +1405,7 @@ {} AddStarlanes::~AddStarlanes() -{ - delete m_other_lane_endpoint_condition; -} +{ delete m_other_lane_endpoint_condition; } void AddStarlanes::Execute(const ScriptingContext& context) const { @@ -1492,9 +1468,7 @@ } std::string AddStarlanes::Dump() const -{ - return DumpIndent() + "AddStarlanes endpoints = " + m_other_lane_endpoint_condition->Dump() + "\n"; -} +{ return DumpIndent() + "AddStarlanes endpoints = " + m_other_lane_endpoint_condition->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1505,9 +1479,7 @@ {} RemoveStarlanes::~RemoveStarlanes() -{ - delete m_other_lane_endpoint_condition; -} +{ delete m_other_lane_endpoint_condition; } void RemoveStarlanes::Execute(const ScriptingContext& context) const { @@ -1570,9 +1542,7 @@ } std::string RemoveStarlanes::Dump() const -{ - return DumpIndent() + "RemoveStarlanes endpoints = " + m_other_lane_endpoint_condition->Dump() + "\n"; -} +{ return DumpIndent() + "RemoveStarlanes endpoints = " + m_other_lane_endpoint_condition->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1583,9 +1553,7 @@ {} SetStarType::~SetStarType() -{ - delete m_type; -} +{ delete m_type; } void SetStarType::Execute(const ScriptingContext& context) const { @@ -1608,9 +1576,7 @@ } std::string SetStarType::Dump() const -{ - return DumpIndent() + "SetStarType type = " + m_type->Dump() + "\n"; -} +{ return DumpIndent() + "SetStarType type = " + m_type->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1621,9 +1587,7 @@ {} MoveTo::~MoveTo() -{ - delete m_location_condition; -} +{ delete m_location_condition; } void MoveTo::Execute(const ScriptingContext& context) const { @@ -1769,9 +1733,7 @@ } std::string MoveTo::Dump() const -{ - return DumpIndent() + "MoveTo destination = " + m_location_condition->Dump() + "\n"; -} +{ return DumpIndent() + "MoveTo destination = " + m_location_condition->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1782,9 +1744,7 @@ {} SetDestination::~SetDestination() -{ - delete m_location_condition; -} +{ delete m_location_condition; } void SetDestination::Execute(const ScriptingContext& context) const { @@ -1854,9 +1814,7 @@ } std::string SetDestination::Dump() const -{ - return DumpIndent() + "SetDestination destination = " + m_location_condition->Dump() + "\n"; -} +{ return DumpIndent() + "SetDestination destination = " + m_location_condition->Dump() + "\n"; } /////////////////////////////////////////////////////////// @@ -1876,14 +1834,10 @@ } std::string Victory::Description() const -{ - return UserString("DESC_VICTORY"); -} +{ return UserString("DESC_VICTORY"); } std::string Victory::Dump() const -{ - return DumpIndent() + "Victory reason = \"" + m_reason_string + "\"\n"; -} +{ return DumpIndent() + "Victory reason = \"" + m_reason_string + "\"\n"; } /////////////////////////////////////////////////////////// @@ -1897,9 +1851,7 @@ {} SetTechAvailability::~SetTechAvailability() -{ - delete m_empire_id; -} +{ delete m_empire_id; } void SetTechAvailability::Execute(const ScriptingContext& context) const { @@ -1930,10 +1882,16 @@ std::string SetTechAvailability::Description() const { - 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())->Name() : - m_empire_id->Description(); + std::string affected = str(FlexibleFormat(UserString(m_include_tech ? "DESC_TECH_AND_ITEMS_AFFECTED" : "DESC_ITEMS_ONLY_AFFECTED")) % UserString(m_tech_name)); + std::string empire_str; + if (m_empire_id) { + if (ValueRef::ConstantExpr(m_empire_id)) { + if (const Empire* empire = Empires().Lookup(m_empire_id->Eval())) + empire_str = empire->Name(); + } else { + empire_str = m_empire_id->Description(); + } + } return str(FlexibleFormat(UserString(m_available ? "DESC_SET_TECH_AVAIL" : "DESC_SET_TECH_UNAVAIL")) % affected % empire_str); @@ -2020,28 +1978,45 @@ std::string GenerateSitRepMessage::Description() const { - std::string empire_str = ValueRef::ConstantExpr(m_recipient_empire_id) ? - Empires().Lookup(m_recipient_empire_id->Eval())->Name() : - m_recipient_empire_id->Description(); + std::string empire_str; + if (m_recipient_empire_id) { + int empire_id = ALL_EMPIRES; + if (ValueRef::ConstantExpr(m_recipient_empire_id)) + empire_id = m_recipient_empire_id->Eval(); + if (const Empire* empire = Empires().Lookup(empire_id)) + empire_str = empire->Name(); + else + empire_str = m_recipient_empire_id->Description(); + } return str(FlexibleFormat(UserString("DESC_GENERATE_SITREP")) % empire_str); } std::string GenerateSitRepMessage::Dump() const { std::string retval = DumpIndent(); - retval += "GenerateSitRepMessage message = \"" + m_message_string + "\"" - + " parameters = "; + retval += "GenerateSitRepMessage message = \"" + m_message_string + "\""; if (m_message_parameters.size() == 1) { - retval += "tag = " + m_message_parameters[0].first + " data = " + m_message_parameters[0].second->Dump() + "\n"; - } else { - retval += "[ "; + retval += "parameters = tag = " + m_message_parameters[0].first + " data = " + m_message_parameters[0].second->Dump() + "\n"; + } else if (!m_message_parameters.empty()) { + retval += "parameters = [ "; for (unsigned int i = 0; i < m_message_parameters.size(); ++i) { - retval += " tag = " + m_message_parameters[i].first + " data = " + m_message_parameters[i].second->Dump() + " "; + retval += " tag = " + m_message_parameters[i].first + + " data = " + m_message_parameters[i].second->Dump() + + " "; } retval += "]\n"; } + retval += " affiliation = "; + switch (m_affiliation) { + case AFFIL_SELF: retval += "TheEmpire"; break; + case AFFIL_ENEMY: retval += "EnemyOf"; break; + case AFFIL_ALLY: retval += "AllyOf"; break; + case AFFIL_ANY: retval += "AnyEmpire"; break; + default: retval += "?"; break; + } + retval += " empire = " + m_recipient_empire_id->Dump() + "\n"; return retval; |
From: <geo...@us...> - 2011-10-22 17:10:40
|
Revision: 4429 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4429&view=rev Author: geoffthemedio Date: 2011-10-22 17:10:33 +0000 (Sat, 22 Oct 2011) Log Message: ----------- -Modified SetDestination::Execute to not attempt to set empty routes, which could cause crashes. -Modified SetOwner::Execute to copy a ship's old fleet's next and previous systems when creating a new fleet, to avoid the possibility of a new fleet being created for an owner-changed ship, which would then end up stranded not moving mid-starlane. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-10-21 15:58:49 UTC (rev 4428) +++ trunk/FreeOrion/universe/Effect.cpp 2011-10-22 17:10:33 UTC (rev 4429) @@ -1110,10 +1110,13 @@ return; // move ship into new fleet + Fleet* new_fleet = 0; if (System* system = GetObject<System>(ship->SystemID())) - CreateNewFleet(system, ship); + new_fleet = CreateNewFleet(system, ship); else - CreateNewFleet(ship->X(), ship->Y(), ship); + new_fleet = CreateNewFleet(ship->X(), ship->Y(), ship); + if (new_fleet) + new_fleet->SetNextAndPreviousSystems(fleet->NextSystemID(), fleet->PreviousSystemID()); // if old fleet is empty, destroy it. Don't reassign ownership of fleet // in case that would reval something to the recipient that shouldn't be... @@ -1942,6 +1945,10 @@ std::pair<std::list<int>, double> short_path = universe.ShortestPath(start_system_id, destination_system_id, target_fleet->Owner()); const std::list<int>& route_list = short_path.first; + // reject empty move paths (no path exists). + if (route_list.empty()) + return; + // check destination validity: disallow movement that's out of range std::pair<int, int> eta = target_fleet->ETA(target_fleet->MovePath(route_list)); if (eta.first == Fleet::ETA_NEVER || eta.first == Fleet::ETA_OUT_OF_RANGE) |
From: <geo...@us...> - 2011-12-04 06:34:56
|
Revision: 4511 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4511&view=rev Author: geoffthemedio Date: 2011-12-04 06:34:50 +0000 (Sun, 04 Dec 2011) Log Message: ----------- Tweaked patch by Vezzra to CreateShip::Execute to not abort if an empire ID is specified by reference that is equal to -1. Instead, aborts only happen if a non -1 id is specified which is not a valid ID. This avoid the need to have multiple effects groups depending whether or not a ship is being created for an empire or for no empire, which occurs for monsters. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2011-12-01 16:54:52 UTC (rev 4510) +++ trunk/FreeOrion/universe/Effect.cpp 2011-12-04 06:34:50 UTC (rev 4511) @@ -1358,10 +1358,12 @@ Empire* empire(0); // not const Empire* so that empire::NewShipName can be called if (m_empire_id) { empire_id = m_empire_id->Eval(context); - empire = Empires().Lookup(empire_id); - if (!empire) { - Logger().errorStream() << "CreateShip::Execute couldn't get empire with id " << empire_id; - return; + if (empire_id != ALL_EMPIRES) { + empire = Empires().Lookup(empire_id); + if (!empire) { + Logger().errorStream() << "CreateShip::Execute couldn't get empire with id " << empire_id; + return; + } } } |
From: <geo...@us...> - 2012-01-06 07:46:56
|
Revision: 4572 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4572&view=rev Author: geoffthemedio Date: 2012-01-06 07:46:49 +0000 (Fri, 06 Jan 2012) Log Message: ----------- Modified SetEmpireTechProgress execution code to allow Value to be used in effect scripts to reference the current progress of that tech for the indicated empire. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2012-01-05 20:00:10 UTC (rev 4571) +++ trunk/FreeOrion/universe/Effect.cpp 2012-01-06 07:46:49 UTC (rev 4572) @@ -527,11 +527,9 @@ { delete m_value; } void SetMeter::Execute(const ScriptingContext& context) const { - if (!context.effect_target) - return; + if (!context.effect_target) return; Meter* m = context.effect_target->GetMeter(m_meter); - if (!m) - return; + if (!m) return; double val = m_value->Eval(ScriptingContext(context, m->Current())); m->SetCurrent(val); @@ -776,7 +774,8 @@ m_value(value) {} -SetEmpireMeter::SetEmpireMeter(const ValueRef::ValueRefBase<int>* empire_id, const std::string& meter, const ValueRef::ValueRefBase<double>* value) : +SetEmpireMeter::SetEmpireMeter(const ValueRef::ValueRefBase<int>* empire_id, const std::string& meter, + const ValueRef::ValueRefBase<double>* value) : m_empire_id(empire_id), m_meter(meter), m_value(value) @@ -1501,8 +1500,7 @@ AddStarlanes::~AddStarlanes() { delete m_other_lane_endpoint_condition; } -void AddStarlanes::Execute(const ScriptingContext& context) const -{ +void AddStarlanes::Execute(const ScriptingContext& context) const { Universe& universe = GetUniverse(); ObjectMap& objects = universe.Objects(); @@ -1557,8 +1555,7 @@ } } -std::string AddStarlanes::Description() const -{ +std::string AddStarlanes::Description() const { std::string value_str = m_other_lane_endpoint_condition->Description(); return str(FlexibleFormat(UserString("DESC_ADD_STARLANES")) % value_str); } @@ -1577,8 +1574,7 @@ RemoveStarlanes::~RemoveStarlanes() { delete m_other_lane_endpoint_condition; } -void RemoveStarlanes::Execute(const ScriptingContext& context) const -{ +void RemoveStarlanes::Execute(const ScriptingContext& context) const { Universe& universe = GetUniverse(); ObjectMap& objects = universe.Objects(); @@ -1633,8 +1629,7 @@ } } -std::string RemoveStarlanes::Description() const -{ +std::string RemoveStarlanes::Description() const { std::string value_str = m_other_lane_endpoint_condition->Description(); return str(FlexibleFormat(UserString("DESC_REMOVE_STARLANES")) % value_str); } @@ -1653,8 +1648,7 @@ SetStarType::~SetStarType() { delete m_type; } -void SetStarType::Execute(const ScriptingContext& context) const -{ +void SetStarType::Execute(const ScriptingContext& context) const { if (!context.effect_target) { Logger().errorStream() << "SetStarType::Execute given no target object"; return; @@ -1665,8 +1659,7 @@ Logger().errorStream() << "SetStarType::Execute given a non-system target"; } -std::string SetStarType::Description() const -{ +std::string SetStarType::Description() const { std::string value_str = ValueRef::ConstantExpr(m_type) ? UserString(lexical_cast<std::string>(m_type->Eval())) : m_type->Description(); @@ -1687,8 +1680,7 @@ MoveTo::~MoveTo() { delete m_location_condition; } -void MoveTo::Execute(const ScriptingContext& context) const -{ +void MoveTo::Execute(const ScriptingContext& context) const { if (!context.effect_target) { Logger().errorStream() << "MoveTo::Execute given no target object"; return; @@ -1826,8 +1818,7 @@ } } -std::string MoveTo::Description() const -{ +std::string MoveTo::Description() const { std::string value_str = m_location_condition->Description(); return str(FlexibleFormat(UserString("DESC_MOVE_TO")) % value_str); } @@ -1980,11 +1971,9 @@ return; } - double progress = 0.0; - if (m_research_progress) - progress = m_research_progress->Eval(context); - - empire->SetTechResearchProgress(m_tech_name, progress); + double value = m_research_progress->Eval( + ScriptingContext(context, empire->ResearchProgress(m_tech_name))); + empire->SetTechResearchProgress(m_tech_name, value); } std::string SetEmpireTechProgress::Description() const { |
From: <geo...@us...> - 2012-03-04 12:24:17
|
Revision: 4683 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4683&view=rev Author: geoffthemedio Date: 2012-03-04 12:24:11 +0000 (Sun, 04 Mar 2012) Log Message: ----------- Implemented MoveInOrbit::Execute effect. It seems to be mostly working, though some weird issues with systems not moving and then starting to move again when a repetitive rotation is applied were observed. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2012-03-04 12:22:51 UTC (rev 4682) +++ trunk/FreeOrion/universe/Effect.cpp 2012-03-04 12:24:11 UTC (rev 4683) @@ -131,9 +131,6 @@ return; } - const Universe& universe = GetUniverse(); - const ObjectMap& objects = universe.Objects(); - const System* next_system = GetSystem(new_next_system); if (!next_system) { Logger().errorStream() << "UpdateFleetRoute couldn't get new next system with id: " << new_next_system; @@ -154,7 +151,7 @@ int dest_system = fleet->FinalDestinationID(); - std::pair<std::list<int>, double> route_pair = universe.ShortestPath(start_system, dest_system, fleet->Owner()); + std::pair<std::list<int>, double> route_pair = GetUniverse().ShortestPath(start_system, dest_system, fleet->Owner()); // if shortest path is empty, the route may be impossible or trivial, so just set route to move fleet // to the next system that it was just set to move to anyway. @@ -1708,7 +1705,7 @@ UpdateFleetRoute(fleet, INVALID_OBJECT_ID, INVALID_OBJECT_ID); // inserted into dest_system, so next and previous systems are invalid objects } } else { - fleet->UniverseObject::MoveTo(destination); + fleet->UniverseObject::MoveTo(destination); // UniverseObject:: scope specification seemingly needed due to mixture of overridded and non-virtual base class MoveTo functions // fleet has been moved to a location that is not a system. Presumably this will be located on a starlane between two // other systems, which may or may not have been explored. Regardless, the fleet needs to be given a new next and @@ -1846,14 +1843,17 @@ Logger().errorStream() << "MoveInOrbit::Execute given no target object"; return; } + UniverseObject* target = context.effect_target; double focus_x = 0.0, focus_y = 0.0, speed = 1.0; if (m_focus_x) - focus_x = m_focus_x->Eval(context); + focus_x = m_focus_x->Eval(ScriptingContext(context, target->X())); if (m_focus_y) - focus_y = m_focus_y->Eval(context); + focus_y = m_focus_y->Eval(ScriptingContext(context, target->Y())); if (m_speed) speed = m_speed->Eval(context); + if (speed == 0.0) + return; if (m_focal_point_condition) { Condition::ObjectSet matches; m_focal_point_condition->Eval(context, matches); @@ -1863,6 +1863,39 @@ focus_x = focus_object->X(); focus_y = focus_object->Y(); } + + double focus_to_target_x = target->X() - focus_x; + double focus_to_target_y = target->Y() - focus_y; + double focus_to_target_radius = std::sqrt(focus_to_target_x * focus_to_target_x + + focus_to_target_y * focus_to_target_y); + if (focus_to_target_radius < 1.0) + return; // don't move objects that are too close to focus + + double angle_radians = atan2(focus_to_target_y, focus_to_target_x); + double angle_increment_radians = speed / focus_to_target_radius; + double new_angle_radians = angle_radians + angle_increment_radians; + + double new_x = focus_x + focus_to_target_radius * cos(new_angle_radians); + double new_y = focus_y + focus_to_target_radius * sin(new_angle_radians); + + if (target->X() == new_x && target->Y() == new_y) + return; + + if (System* system = universe_object_cast<System*>(target)) { + system->MoveTo(new_x, new_y); + return; + } else if (Fleet* fleet = universe_object_cast<Fleet*>(target)) { + fleet->MoveTo(new_x, new_y); + // todo: is fleet now close enough to fall into a system? + UpdateFleetRoute(fleet, INVALID_OBJECT_ID, INVALID_OBJECT_ID); + return; + } else if (Ship* ship = universe_object_cast<Ship*>(target)) { + Fleet* old_fleet = GetFleet(ship->FleetID()); + CreateNewFleet(new_x, new_y, ship); // creates new fleet and inserts ship into fleet + if (old_fleet && old_fleet->NumShips() < 1) + GetUniverse().EffectDestroy(old_fleet->ID()); + } + // don't move planets or buildings, as these can't exist outside of systems } std::string MoveInOrbit::Description() const { |
From: <geo...@us...> - 2012-03-04 13:12:31
|
Revision: 4685 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4685&view=rev Author: geoffthemedio Date: 2012-03-04 13:12:25 +0000 (Sun, 04 Mar 2012) Log Message: ----------- Extended standard MoveTo effect to function on systems, which can move to the location of objects that are not and are not in systems (eg. fleets or ships). Each object that is attempted to be moved tests to make sure it's not being moved onto another system, so only the first object moved to an initially valid destination each turn will actually move; any others will not be moved. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2012-03-04 12:47:11 UTC (rev 4684) +++ trunk/FreeOrion/universe/Effect.cpp 2012-03-04 13:12:25 UTC (rev 4685) @@ -1799,6 +1799,21 @@ } } // else if destination is something else that can be on a planet... + + } else if (System* system = universe_object_cast<System*>(context.effect_target)) { + if (destination->SystemID() == INVALID_OBJECT_ID) { + // can simply move system to new location, and insert destination object into system + system->UniverseObject::MoveTo(destination); + // find fleets at this location and insert into system + std::vector<Fleet*> fleets = GetUniverse().Objects().FindObjects<Fleet>(); + for (std::vector<Fleet*>::iterator it = fleets.begin(); it != fleets.end(); ++it) + if (Fleet* fleet = *it) + if (fleet->X() == system->X() && fleet->Y() == system->Y()) + system->Insert(fleet); + } else { + //System* destination_system = GetSystem(destination->SystemID()); + // TODO: merge systems + } } } |
From: <geo...@us...> - 2013-01-05 18:22:10
|
Revision: 5616 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5616&view=rev Author: geoffthemedio Date: 2013-01-05 18:22:03 +0000 (Sat, 05 Jan 2013) Log Message: ----------- Fixed issue where effects execution was being aborted after the first non-meter effect was executed. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-01-05 01:12:26 UTC (rev 5615) +++ trunk/FreeOrion/universe/Effect.cpp 2013-01-05 18:22:03 UTC (rev 5616) @@ -294,7 +294,7 @@ // for non-meter effects, can do default batch execute if (!meter_effect) { effect->Execute(source_context, targets); - return; + continue; } // for meter effects, need to separately call effect's Execute for each |
From: <geo...@us...> - 2013-02-10 03:13:53
|
Revision: 5741 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5741&view=rev Author: geoffthemedio Date: 2013-02-10 03:13:44 +0000 (Sun, 10 Feb 2013) Log Message: ----------- Minor tweak to clarify an error message. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-02-10 01:06:05 UTC (rev 5740) +++ trunk/FreeOrion/universe/Effect.cpp 2013-02-10 03:13:44 UTC (rev 5741) @@ -1259,7 +1259,7 @@ std::string building_type_name = m_building_type_name->Eval(context); const BuildingType* building_type = GetBuildingType(building_type_name); if (!building_type) { - Logger().errorStream() << "CreateBuilding::Execute couldn't get building type"; + Logger().errorStream() << "CreateBuilding::Execute couldn't get building type: " << building_type_name; return; } |
From: <geo...@us...> - 2013-03-07 05:15:40
|
Revision: 5837 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5837&view=rev Author: geoffthemedio Date: 2013-03-07 05:15:34 +0000 (Thu, 07 Mar 2013) Log Message: ----------- ObjectMap iterator use updates / fix compile errors. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-03-07 03:16:22 UTC (rev 5836) +++ trunk/FreeOrion/universe/Effect.cpp 2013-03-07 05:15:34 UTC (rev 5837) @@ -304,7 +304,7 @@ TargetSet potential_targets; potential_targets.reserve(objects.NumObjects()); for (ObjectMap::iterator<> it = objects.begin(); it != objects.end(); ++it) - potential_targets.push_back(it->second); + potential_targets.push_back(*it); GetTargetSet(source_id, targets, potential_targets); } @@ -1809,7 +1809,7 @@ Condition::ObjectSet potential_endpoint_objects; potential_endpoint_objects.reserve(objects.NumObjects()); for (ObjectMap::iterator<> it = objects.begin(); it != objects.end(); ++it) - potential_endpoint_objects.push_back(it->second); + potential_endpoint_objects.push_back(*it); Condition::ObjectSet endpoint_objects; endpoint_objects.reserve(potential_endpoint_objects.size()); @@ -1883,7 +1883,7 @@ Condition::ObjectSet potential_endpoint_objects; potential_endpoint_objects.reserve(objects.NumObjects()); for (ObjectMap::iterator<> it = objects.begin(); it != objects.end(); ++it) - potential_endpoint_objects.push_back(it->second); + potential_endpoint_objects.push_back(*it); Condition::ObjectSet endpoint_objects; endpoint_objects.reserve(potential_endpoint_objects.size()); @@ -1981,7 +1981,7 @@ Condition::ObjectSet potential_locations; potential_locations.reserve(objects.NumObjects()); for (ObjectMap::iterator<> it = objects.begin(); it != objects.end(); ++it) - potential_locations.push_back(it->second); + potential_locations.push_back(*it); Condition::ObjectSet valid_locations; valid_locations.reserve(potential_locations.size()); @@ -2420,7 +2420,7 @@ Condition::ObjectSet potential_locations; potential_locations.reserve(objects.NumObjects()); for (ObjectMap::iterator<> it = objects.begin(); it != objects.end(); ++it) - potential_locations.push_back(it->second); + potential_locations.push_back(*it); Condition::ObjectSet valid_locations; valid_locations.reserve(potential_locations.size()); |
From: <geo...@us...> - 2013-03-31 09:57:33
|
Revision: 5922 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5922&view=rev Author: geoffthemedio Date: 2013-03-31 09:57:26 +0000 (Sun, 31 Mar 2013) Log Message: ----------- Commented out unneeded code. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-03-31 09:56:36 UTC (rev 5921) +++ trunk/FreeOrion/universe/Effect.cpp 2013-03-31 09:57:26 UTC (rev 5922) @@ -1647,11 +1647,11 @@ } void CreateSystem::Execute(const ScriptingContext& context) const { - if (!context.effect_target) { - Logger().errorStream() << "CreateSystem::Execute passed null target"; - return; - } - const UniverseObject* target = context.effect_target; + //if (!context.effect_target) { + // Logger().errorStream() << "CreateSystem::Execute passed null target"; + // return; + //} + //const UniverseObject* target = context.effect_target; // pick a star type StarType star_type = STAR_NONE; |
From: <geo...@us...> - 2013-07-26 10:58:34
|
Revision: 6265 http://sourceforge.net/p/freeorion/code/6265 Author: geoffthemedio Date: 2013-07-26 10:58:31 +0000 (Fri, 26 Jul 2013) Log Message: ----------- Removed unnecessary lexical_cast and UserString call from SetEmpireMeter description and dump functions. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-07-26 10:01:35 UTC (rev 6264) +++ trunk/FreeOrion/universe/Effect.cpp 2013-07-26 10:58:31 UTC (rev 6265) @@ -970,12 +970,12 @@ return str(FlexibleFormat(UserString("DESC_SET_EMPIRE_METER")) % empire_str - % UserString(lexical_cast<std::string>(m_meter)) + % UserString(m_meter) % value_str); } std::string SetEmpireMeter::Dump() const -{ return DumpIndent() + "SetEmpireMeter meter = " + UserString(m_meter) + " empire = " + m_empire_id->Dump() + " value = " + m_value->Dump(); } +{ return DumpIndent() + "SetEmpireMeter meter = " + m_meter + " empire = " + m_empire_id->Dump() + " value = " + m_value->Dump(); } /////////////////////////////////////////////////////////// |
From: <dil...@us...> - 2013-11-08 00:12:19
|
Revision: 6503 http://sourceforge.net/p/freeorion/code/6503 Author: dilvish-fo Date: 2013-11-08 00:12:16 +0000 (Fri, 08 Nov 2013) Log Message: ----------- made it so that creation of sitreps regarding a predefined ship design will also grant the sitrep recipient knowledge of the design. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-11-06 22:26:11 UTC (rev 6502) +++ trunk/FreeOrion/universe/Effect.cpp 2013-11-08 00:12:16 UTC (rev 6503) @@ -2707,6 +2707,19 @@ m_message_parameters.begin(); it != m_message_parameters.end(); ++it) { parameter_tag_values.push_back(std::make_pair(it->first, it->second->Eval(context))); + if (it->first == VarText::PREDEFINED_DESIGN_TAG) { + if (const ShipDesign* design = GetPredefinedShipDesign(it->second->Eval(context))) { + int design_id = design->ID(); + if (!empire) { + // ensure all empires aware of ship design + for (EmpireManager::const_iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) + GetUniverse().SetEmpireKnowledgeOfShipDesign(design_id, empire_it->first); + } else if (m_affiliation == AFFIL_SELF) { + // ensure empire has knowledge of the design + GetUniverse().SetEmpireKnowledgeOfShipDesign(design_id, empire->EmpireID()); + } + } + } } if (!empire) { |
From: <geo...@us...> - 2013-11-10 23:14:23
|
Revision: 6509 http://sourceforge.net/p/freeorion/code/6509 Author: geoffthemedio Date: 2013-11-10 23:14:20 +0000 (Sun, 10 Nov 2013) Log Message: ----------- Fixed crash with SetEmpireTechProgress when referencing the initial Value in the script when specifying the new progress amount. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-11-10 11:48:42 UTC (rev 6508) +++ trunk/FreeOrion/universe/Effect.cpp 2013-11-10 23:14:20 UTC (rev 6509) @@ -2255,6 +2255,7 @@ return DumpIndent() + "MoveInOrbit"; } + /////////////////////////////////////////////////////////// // MoveTowards // /////////////////////////////////////////////////////////// @@ -2565,8 +2566,8 @@ return; } - double value = m_research_progress->Eval( - ScriptingContext(context, empire->ResearchProgress(tech_name))); + float initial_progress = empire->ResearchProgress(tech_name); + double value = m_research_progress->Eval(ScriptingContext(context, initial_progress)); empire->SetTechResearchProgress(tech_name, value); } |
From: <geo...@us...> - 2013-11-16 09:10:35
|
Revision: 6526 http://sourceforge.net/p/freeorion/code/6526 Author: geoffthemedio Date: 2013-11-16 09:10:31 +0000 (Sat, 16 Nov 2013) Log Message: ----------- Added check for empty tech name in SetEmpireTechProgress to avoid error messages if no tech is specified. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2013-11-16 08:59:48 UTC (rev 6525) +++ trunk/FreeOrion/universe/Effect.cpp 2013-11-16 09:10:31 UTC (rev 6526) @@ -2561,6 +2561,8 @@ return; } std::string tech_name = m_tech_name->Eval(context); + if (tech_name.empty()) + return; const Tech* tech = GetTech(tech_name); if (!tech) { |
From: <geo...@us...> - 2014-05-17 18:00:15
|
Revision: 7119 http://sourceforge.net/p/freeorion/code/7119 Author: geoffthemedio Date: 2014-05-17 18:00:11 +0000 (Sat, 17 May 2014) Log Message: ----------- Hopefully fixed issue where effect-created monster fleets were passive even if they had armed ships due to ordering of adding ships to the fleet and setting of the aggression based on fleet contents. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2014-05-16 08:08:50 UTC (rev 7118) +++ trunk/FreeOrion/universe/Effect.cpp 2014-05-17 18:00:11 UTC (rev 7119) @@ -80,11 +80,11 @@ ship_ids.push_back(ship->ID()); std::string fleet_name = Fleet::GenerateFleetName(ship_ids, fleet->ID()); fleet->Rename(fleet_name); - fleet->SetAggressive(fleet->HasArmedShips()); fleet->GetMeter(METER_STEALTH)->SetCurrent(Meter::LARGE_VALUE); fleet->AddShip(ship->ID()); ship->SetFleetID(fleet->ID()); + fleet->SetAggressive(fleet->HasArmedShips()); return fleet; } |