From: <geo...@us...> - 2008-08-04 10:34:03
|
Revision: 2649 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2649&view=rev Author: geoffthemedio Date: 2008-08-04 10:34:04 +0000 (Mon, 04 Aug 2008) Log Message: ----------- -Removed BT_ORBITAL and related code, as orbitals are removed from v0.4 -Altered how various ::MoveTo and System::Insert and System::Remove and Fleet::AddShip(s) work. Need to similarly alter Planet::AddBuilding -Made UniverseObject::Move and UniverseObject::MoveTo variations that don't take two doubles as parameters non-virtual. These now call the two-double MoveTo which is virtual. This way subclasses only need to redefine one Move-related function -Removed / disabled Operating function and data from Buildings, until these are planned out and used to some purpose -Added Planet::MoveTo that should work similarly to Planet::MoveTo. -Added Ship::MoveTo and Building::MoveTo that will aide in making a MoveTo effect -Started adding a MoveTo effect. Isn't completed or activated yet. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/combat/CombatSystem.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/python/PythonUniverseWrapper.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/Enums.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/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -813,8 +813,6 @@ break; return std::make_pair(building_type->BuildCost(), building_type->BuildTime()); } - case BT_ORBITAL: - return std::make_pair(20.0, 10); // v0.3 only default: break; } @@ -838,9 +836,7 @@ std::pair<double, int> Empire::ProductionCostAndTime(const ProductionQueue::ProductionItem& item) const { - if (item.build_type == BT_BUILDING || item.build_type == BT_ORBITAL) - return ProductionCostAndTime(item.build_type, item.name); - else if (item.build_type == BT_SHIP) + if (item.build_type == BT_SHIP) return ProductionCostAndTime(item.build_type, item.design_id); else throw std::invalid_argument("Empire::ProductionCostAndTime was passed a ProductionItem with an invalid BuildType"); @@ -860,8 +856,6 @@ if (build_type == BT_BUILDING && !BuildingTypeAvailable(name)) return false; - //if (build_type == BT_ORBITAL) -> nothing to do yet; orbitals are currently always buildable - if (ProductionCostAndTime(build_type, name) == std::make_pair(-1.0, -1)) { // item is unknown, unavailable, or invalid. return false; @@ -877,9 +871,6 @@ // ...and the specified location must be a valid production location for that building type return building_type->ProductionLocation(m_id, location); - } else if (build_type == BT_ORBITAL) { - // this empire must be only owner of the build location - return build_location->Owners().size() == 1 && *build_location->Owners().begin() == m_id; } else { throw std::invalid_argument("Empire::BuildableItem was passed an invalid BuildType"); } @@ -888,8 +879,8 @@ bool Empire::BuildableItem(BuildType build_type, int design_id, int location) const { // special case to check for buildings or orbitals being passed with ids, not names - if (build_type == BT_BUILDING || build_type == BT_ORBITAL) - throw std::invalid_argument("Empire::BuildableItem was passed BuildType BT_BUILDING or BT_ORBITAL with a design id number, but these types are tracked by name"); + if (build_type == BT_BUILDING) + throw std::invalid_argument("Empire::BuildableItem was passed BuildType BT_BUILDING with a design id number, but these types are tracked by name"); if (build_type == BT_SHIP && !ShipDesignAvailable(design_id)) return false; @@ -916,7 +907,7 @@ bool Empire::BuildableItem(const ProductionQueue::ProductionItem& item, int location) const { - if (item.build_type == BT_BUILDING || item.build_type == BT_ORBITAL) + if (item.build_type == BT_BUILDING) return BuildableItem(item.build_type, item.name, location); else if (item.build_type == BT_SHIP) return BuildableItem(item.build_type, item.design_id, location); @@ -1467,7 +1458,7 @@ void Empire::PlaceBuildInQueue(const ProductionQueue::ProductionItem& item, int number, int location, int pos/* = -1*/) { - if (item.build_type == BT_BUILDING || item.build_type == BT_ORBITAL) + if (item.build_type == BT_BUILDING) PlaceBuildInQueue(item.build_type, item.name, number, location, pos); else if (item.build_type == BT_SHIP) PlaceBuildInQueue(item.build_type, item.design_id, number, location, pos); @@ -1839,15 +1830,6 @@ break; } - case BT_ORBITAL: { - // v0.3 only - Planet* planet = GetUniverse().Object<Planet>(m_production_queue[i].location); - assert(planet); - planet->AdjustDefBases(1); - AddSitRepEntry(CreateBaseBuiltSitRep(planet->SystemID(), planet->ID())); - break; - } - default: break; } @@ -1978,7 +1960,7 @@ { Building *building = universe_object_cast<Building*>(*it); if (!building) continue; - if (building->Operating()) + //if (building->Operating()) m_maintenance_total_cost += GetBuildingType(building->BuildingTypeName())->MaintenanceCost(); } m_resource_pools[RE_TRADE]->ChangedSignal(); Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -21,9 +21,6 @@ #include <boost/format.hpp> namespace { - const int DEFENSE_BASE_BUILD_TURNS = 10; // this is a kludge for v0.3 only - const int DEFENSE_BASE_BUILD_COST = 20; // this is a kludge for v0.3 only - class BuildableItemsListBox : public CUIListBox { public: @@ -274,8 +271,8 @@ void BuildDesignatorWnd::BuildDetailPanel::SetBuildItem(BuildType build_type, const std::string& item) { - if (build_type != BT_BUILDING && build_type != BT_ORBITAL && build_type != INVALID_BUILD_TYPE) - throw std::invalid_argument("Attempted to SetBuildItem with a name and BuildType that wasn't BT_BUILDING or BT_ORBITAL"); + if (build_type != BT_BUILDING && build_type != INVALID_BUILD_TYPE) + throw std::invalid_argument("Attempted to SetBuildItem with a name and BuildType that wasn't BT_BUILDING"); m_build_type = build_type; m_item_name = item; m_item_design_id = UniverseObject::INVALID_OBJECT_ID; @@ -358,12 +355,6 @@ % design->Defense() % design->Speed()); graphic = ClientUI::ShipIcon(design->ID()); - } else if (m_build_type == BT_ORBITAL) { - turns = DEFENSE_BASE_BUILD_TURNS; - cost_per_turn = DEFENSE_BASE_BUILD_COST; - item_name_str = UserString("DEFENSE_BASE"); - description_str = UserString("DEFENSE_BASE_DESCRIPTION"); - graphic = ClientUI::GetTexture(ClientUI::ArtDir() / "misc" / "base1.png"); // this is a kludge for v0.3 only } if (graphic) { @@ -466,8 +457,6 @@ AttachChild(m_build_type_buttons[BT_BUILDING]); m_build_type_buttons[BT_SHIP] = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_BT_SHIP")); AttachChild(m_build_type_buttons[BT_SHIP]); - m_build_type_buttons[BT_ORBITAL] = new CUIButton(0, 0, 1, UserString("PRODUCTION_WND_CATEGORY_BT_ORBITAL")); - AttachChild(m_build_type_buttons[BT_ORBITAL]); m_build_type_buttons[NUM_BUILD_TYPES] = new CUIButton(0, 0, 1, UserString("ALL")); AttachChild(m_build_type_buttons[NUM_BUILD_TYPES]); @@ -650,7 +639,6 @@ { m_build_types_shown.insert(BT_BUILDING); m_build_types_shown.insert(BT_SHIP); - m_build_types_shown.insert(BT_ORBITAL); if (refresh_list) PopulateList(); } @@ -692,7 +680,7 @@ bool BuildDesignatorWnd::BuildSelector::BuildableItemVisible(BuildType build_type, const std::string& name) { - if (build_type != BT_BUILDING && build_type != BT_ORBITAL) + if (build_type != BT_BUILDING) throw std::invalid_argument("BuildableItemVisible was passed an invalid build type with a name"); if (m_build_types_shown.find(build_type) == m_build_types_shown.end()) @@ -703,8 +691,6 @@ const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (build_type == BT_BUILDING) available = empire->BuildingTypeAvailable(name); - else if (build_type == BT_ORBITAL) - available = true; if (available) return m_availabilities_shown.first; @@ -869,54 +855,7 @@ row->GetLayout()->SetColumnStretch(4, 1.0); } } - // populate with orbitals - Logger().debugStream() << "Adding Orbitals"; - if (m_build_types_shown.find(BT_ORBITAL) != m_build_types_shown.end()) { - if (BuildableItemVisible(BT_ORBITAL, "")) { - GG::ListBox::Row* row = new GG::ListBox::Row(); - row->SetDragDropDataType("DEFENSE_BASE"); - // icon - GG::StaticGraphic* icon = new GG::StaticGraphic(0, 0, icon_col_width, m_row_height, - ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "defensebase.png"), - GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); - row->push_back(dynamic_cast<GG::Control*>(icon)); - - // Defense Base "name" - row->push_back(UserString(row->DragDropDataType()), default_font, ClientUI::TextColor()); - - // cost / turn, and minimum production turns - const std::pair<double, int> cost_time = empire->ProductionCostAndTime(BT_ORBITAL, UserString(row->DragDropDataType())); - std::string cost_text = boost::lexical_cast<std::string>(cost_time.first); - row->push_back(cost_text, default_font, ClientUI::TextColor()); - std::string time_text = boost::lexical_cast<std::string>(cost_time.second); - row->push_back(time_text, default_font, ClientUI::TextColor()); - - // brief description - std::string desc_text = UserString("BT_ORBITAL"); - GG::Control* desc_control = new GG::TextControl(0, 0, desc_col_width, m_row_height, desc_text, default_font, ClientUI::TextColor(), GG::FORMAT_LEFT); ///< ctor taking a font directly - row->push_back(desc_control); - - // is item buildable? If not, disable row - if (!empire->BuildableItem(BT_ORBITAL, "", m_build_location)) { - row->Disable(true); - } else { - row->Disable(false); - } - - GG::ListBox::iterator row_it = m_buildable_items->Insert(row); - m_build_types[row_it] = BT_ORBITAL; - if (row->DragDropDataType() == selected_row) - row_to_select = row_it; - - row->GetLayout()->SetColumnStretch(0, 0.0); - row->GetLayout()->SetColumnStretch(1, 0.0); - row->GetLayout()->SetColumnStretch(2, 0.0); - row->GetLayout()->SetColumnStretch(3, 0.0); - row->GetLayout()->SetColumnStretch(4, 1.0); - } - } - Logger().debugStream() << "Selecting Row"; if (row_to_select != m_buildable_items->end()) m_buildable_items->SelectRow(row_to_select); @@ -927,7 +866,7 @@ { std::vector<int> retval; - retval.push_back(m_row_height); // icon + retval.push_back(m_row_height); // icon retval.push_back(ClientUI::Pts()*18); // name retval.push_back(ClientUI::Pts()*3); // cost retval.push_back(ClientUI::Pts()*2); // time @@ -945,9 +884,7 @@ if (selections.size() == 1) { GG::ListBox::iterator row = *selections.begin(); BuildType build_type = m_build_types[row]; - if (build_type == BT_BUILDING || build_type == BT_ORBITAL) - DisplayNamedBuildItemSignal(m_build_types[row], (*row)->DragDropDataType()); - else if (build_type == BT_SHIP) + if (build_type == BT_SHIP) DisplayIDedBuildItemSignal(m_build_types[row], boost::lexical_cast<int>((*row)->DragDropDataType())); } } @@ -957,9 +894,7 @@ if ((*it)->Disabled()) return; BuildType build_type = m_build_types[it]; - if (build_type == BT_BUILDING || build_type == BT_ORBITAL) - RequestNamedBuildItemSignal(build_type, (*it)->DragDropDataType(), 1); - else if (build_type == BT_SHIP) + if (build_type == BT_SHIP) RequestIDedBuildItemSignal(build_type, boost::lexical_cast<int>((*it)->DragDropDataType()), 1); } @@ -998,7 +933,6 @@ // connect build type button clicks to update display GG::Connect(m_build_selector->m_build_type_buttons[BT_BUILDING]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_BUILDING)); GG::Connect(m_build_selector->m_build_type_buttons[BT_SHIP]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_SHIP)); - GG::Connect(m_build_selector->m_build_type_buttons[BT_ORBITAL]->ClickedSignal, ToggleBuildTypeFunctor(this, BT_ORBITAL)); GG::Connect(m_build_selector->m_build_type_buttons[NUM_BUILD_TYPES]->ClickedSignal, ToggleAllBuildTypesFunctor(this)); // last button should be "All" button // connect availability button clicks to update display @@ -1111,7 +1045,7 @@ void BuildDesignatorWnd::ShowType(BuildType type, bool refresh_list) { Logger().errorStream() << "BuildDesignatorWnd::ShowType(" << boost::lexical_cast<std::string>(type) << ")"; - if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + if (type == BT_BUILDING || type == BT_SHIP) { m_build_selector->ShowType(type, refresh_list); m_build_selector->m_build_type_buttons[type]->MarkSelectedGray(); } else { @@ -1124,13 +1058,12 @@ m_build_selector->ShowAllTypes(refresh_list); m_build_selector->m_build_type_buttons[BT_BUILDING]->MarkSelectedGray(); m_build_selector->m_build_type_buttons[BT_SHIP]->MarkSelectedGray(); - m_build_selector->m_build_type_buttons[BT_ORBITAL]->MarkSelectedGray(); } void BuildDesignatorWnd::HideType(BuildType type, bool refresh_list) { Logger().errorStream() << "BuildDesignatorWnd::HideType(" << boost::lexical_cast<std::string>(type) << ")"; - if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + if (type == BT_BUILDING || type == BT_SHIP) { m_build_selector->HideType(type, refresh_list); m_build_selector->m_build_type_buttons[type]->MarkNotSelected(); } else { @@ -1143,12 +1076,11 @@ m_build_selector->HideAllTypes(refresh_list); m_build_selector->m_build_type_buttons[BT_BUILDING]->MarkNotSelected(); m_build_selector->m_build_type_buttons[BT_SHIP]->MarkNotSelected(); - m_build_selector->m_build_type_buttons[BT_ORBITAL]->MarkNotSelected(); } void BuildDesignatorWnd::ToggleType(BuildType type, bool refresh_list) { - if (type == BT_BUILDING || type == BT_SHIP || type == BT_ORBITAL) { + if (type == BT_BUILDING || type == BT_SHIP) { const std::set<BuildType>& types_shown = m_build_selector->GetBuildTypesShown(); if (types_shown.find(type) == types_shown.end()) ShowType(type, refresh_list); @@ -1162,7 +1094,7 @@ void BuildDesignatorWnd::ToggleAllTypes(bool refresh_list) { const std::set<BuildType>& types_shown = m_build_selector->GetBuildTypesShown(); - if (types_shown.size() == 3) // will need to update this if more build types are added + if (types_shown.size() == NUM_BUILD_TYPES - 1) // -1 because there are no buttons for BuildType::BT_NOT_BUILDING HideAllTypes(refresh_list); else ShowAllTypes(refresh_list); Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -117,9 +117,6 @@ } else if (build.item.build_type == BT_SHIP) { graphic = ClientUI::ShipIcon(build.item.design_id); name_text = GetShipDesign(build.item.design_id)->Name(); - } else if (build.item.build_type == BT_ORBITAL) { - graphic = ClientUI::GetTexture(ClientUI::ArtDir() / "misc" / "base1.png"); // this is a kludge for v0.3 only - name_text = UserString(build.item.name); } else { graphic = ClientUI::GetTexture(""); // get "missing texture" texture by supply intentionally bad path name_text = UserString("FW_UNKNOWN_DESIGN_NAME"); Modified: trunk/FreeOrion/combat/CombatSystem.cpp =================================================================== --- trunk/FreeOrion/combat/CombatSystem.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/combat/CombatSystem.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -212,12 +212,7 @@ for(unsigned int i=0; i<assets[e].planets.size(); i++) { Planet *plt = assets[e].planets[i]; - - if(plt->DefBases()>0) - // static defense bonus of >defence_base_hit_points< points per defense base - cahp.planets.push_back(std::pair<Planet*,unsigned int>(plt,plt->DefBases() * defence_base_hit_points)); - else - cahp.defenseless_planets.push_back(plt); + cahp.defenseless_planets.push_back(plt); } empire_combat_forces.push_back(cahp); @@ -372,22 +367,6 @@ for(int e=0;e<static_cast<int>(empire_combat_forces.size());e++) { - //remove defense bases of defenseless planets - for(unsigned int i=0; i<empire_combat_forces[e].defenseless_planets.size(); i++) - empire_combat_forces[e].defenseless_planets[i]->AdjustDefBases(-empire_combat_forces[e].defenseless_planets[i]->DefBases()); - - //adjust defense bases of planets - for(unsigned int i=0; i<empire_combat_forces[e].planets.size(); i++) - { - unsigned int defense_bases_left = defence_base_hit_points==0 - ?0 - : ( empire_combat_forces[e].planets[i].first->DefBases()*defence_base_hit_points - -empire_combat_forces[e].planets[i].second - +defence_base_hit_points-1) - / defence_base_hit_points; - empire_combat_forces[e].planets[i].first->AdjustDefBases(defense_bases_left-empire_combat_forces[e].planets[i].first->DefBases()); - } - // conquer planets if there is a victor if(victor!=-1 && victor!=e) { Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-04 10:34:04 UTC (rev 2649) @@ -101,15 +101,6 @@ ERROR ERROR -DEFENSE_BASE -Defense Base - -DEFENSE_BASE_DESCRIPTION -'''An orbital defense platform that aids in the defense of the planet at which it is located. - -Attack: 1 -Defense: 3''' - CHAT_WHISPER whisper @@ -1405,9 +1396,6 @@ PRODUCTION_WND_CATEGORY_BT_SHIP Ships -PRODUCTION_WND_CATEGORY_BT_ORBITAL -Orbitals - PRODUCTION_WND_AVAILABILITY_AVAILABLE Available Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -229,7 +229,7 @@ ////////////////// class_<Building, bases<UniverseObject>, noncopyable>("building", no_init) .def("getBuildingType", &Building::GetBuildingType, return_value_policy<reference_existing_object>()) - .add_property("operating", &Building::Operating) +// .add_property("operating", &Building::Operating) .def("getPlanet", &Building::GetPlanet, return_value_policy<reference_existing_object>()) ; Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Building.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -46,14 +46,12 @@ Building::Building() : UniverseObject(), m_building_type(""), - m_operating(true), m_planet_id(INVALID_OBJECT_ID) {} Building::Building(int empire_id, const std::string& building_type, int planet_id) : UniverseObject(), m_building_type(building_type), - m_operating(true), m_planet_id(planet_id) { AddOwner(empire_id); @@ -74,11 +72,6 @@ return m_building_type; } -bool Building::Operating() const -{ - return m_operating; -} - int Building::PlanetID() const { return m_planet_id; @@ -102,11 +95,6 @@ return visitor.Visit(const_cast<Building* const>(this)); } -void Building::Activate(bool activate) -{ - m_operating = activate; -} - void Building::SetPlanetID(int planet_id) { if (Planet* planet = GetPlanet()) @@ -114,6 +102,15 @@ m_planet_id = planet_id; } +void Building::MoveTo(double x, double y) +{ + UniverseObject::MoveTo(x, y); + + // if building is being moved away from its planet, remove from the planet. otherwise, keep building on planet + if (Planet* planet = GetPlanet()) + planet->RemoveBuilding(this->ID()); +} + void Building::MovementPhase() {} Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Building.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -30,7 +30,6 @@ const BuildingType* GetBuildingType() const; const std::string& BuildingTypeName() const; ///< returns the name of the BuildingType object for this building - bool Operating() const; ///< returns true iff this building is currently operating 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 @@ -40,8 +39,8 @@ //@} /** \name Mutators */ //@{ - void Activate(bool activate); ///< activates or deactivates the building 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 PopGrowthProductionResearchPhase(); @@ -49,7 +48,6 @@ private: std::string m_building_type; - bool m_operating; int m_planet_id; friend class boost::serialization::access; @@ -149,7 +147,6 @@ { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_NVP(m_building_type) - & BOOST_SERIALIZATION_NVP(m_operating) & BOOST_SERIALIZATION_NVP(m_planet_id); } Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -7,8 +7,10 @@ #include "UniverseObject.h" #include "../Empire/EmpireManager.h" #include "../Empire/Empire.h" +#include "Building.h" #include "Planet.h" #include "System.h" +#include "Fleet.h" #include "Tech.h" #include <cctype> @@ -604,6 +606,66 @@ /////////////////////////////////////////////////////////// +// MoveTo // +/////////////////////////////////////////////////////////// +MoveTo::MoveTo(const ValueRef::ValueRefBase<int>* object_id) : + m_destination_object_id(object_id) +{} + +MoveTo::~MoveTo() +{ + delete m_destination_object_id; +} + +void MoveTo::Execute(const UniverseObject* source, UniverseObject* target) const +{ + Universe& universe = GetUniverse(); + int dest_id = m_destination_object_id->Eval(source, target); + UniverseObject* destination = universe.Object(dest_id); + if (!destination) 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)) { + if (System* dest_system = destination->GetSystem()) + dest_system->Insert(target); + else + fleet->UniverseObject::MoveTo(destination); + + } else if (Planet* planet = universe_object_cast<Planet*>(target)) { + if (System* dest_system = destination->GetSystem()) { + // determine if and which orbits are available + // if an orbit is available... + // dest_system->Insert(target); + } + // don't move planets to a location outside a system + + } else if (Building* building = universe_object_cast<Building*>(target)) { + if (Planet* dest_planet = universe_object_cast<Planet*>(destination)) { + dest_planet->AddBuilding(building->ID()); + } + else if (Building* dest_building = universe_object_cast<Building*>(destination)) { + if (Planet* dest_planet = dest_building->GetPlanet()) { + dest_planet->AddBuilding(building->ID()); + } + } + // else if destination is something else that can be on a planet... + } +} + +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 MoveTo::Dump() const +{ + return DumpIndent() + "AddOwner empire = " + m_destination_object_id->Dump() + "\n"; +} + + +/////////////////////////////////////////////////////////// // SetTechAvailability // /////////////////////////////////////////////////////////// SetTechAvailability::SetTechAvailability(const std::string& tech_name, const ValueRef::ValueRefBase<int>* empire_id, bool available, bool include_tech) : Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Effect.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -34,6 +34,7 @@ class SetStarType; class SetTechAvailability; class SetEffectTarget; + class MoveTo; } namespace ValueRef { @@ -316,6 +317,27 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Moves an UniverseObject to a location of another UniverseObject with id \a object_id. If there are are no objects id + that id, nothing is done. */ +class Effect::MoveTo : public Effect::EffectBase +{ +public: + MoveTo(const ValueRef::ValueRefBase<int>* object_id); + virtual ~MoveTo(); + + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual std::string Description() const; + virtual std::string Dump() const; + +private: + const ValueRef::ValueRefBase<int>* m_destination_object_id; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + + /** Sets the availability of tech \a tech_name to empire \a empire_id. If \a include_tech is true, the tech is fully available, just as if it were researched normally; otherwise, only the items that the tech includes are made available. Note that this means this Effect is intended also to be used to unlock buildings, ships, etc. The tech and/or its items are made available if \a available is true, or unavailable otherwise. */ @@ -446,6 +468,13 @@ } template <class Archive> +void Effect::MoveTo::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) + & BOOST_SERIALIZATION_NVP(m_destination_object_id); +} + +template <class Archive> void Effect::SetTechAvailability::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Enums.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -431,7 +431,6 @@ BT_NOT_BUILDING, ///< no building is taking place BT_BUILDING, ///< a Building object is being built BT_SHIP, ///< a Ship object is being built - BT_ORBITAL, ///< an Orbital object is being built NUM_BUILD_TYPES }; @@ -441,7 +440,6 @@ GG_ENUM_MAP_INSERT(BT_NOT_BUILDING) GG_ENUM_MAP_INSERT(BT_BUILDING) GG_ENUM_MAP_INSERT(BT_SHIP) - GG_ENUM_MAP_INSERT(BT_ORBITAL) GG_ENUM_MAP_END } GG_ENUM_STREAM_IN(BuildType) Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -75,10 +75,14 @@ { AddOwner(owner); } Fleet::const_iterator Fleet::begin() const -{ return m_ships.begin(); } +{ + return m_ships.begin(); +} Fleet::const_iterator Fleet::end() const -{ return m_ships.end(); } +{ + return m_ships.end(); +} const std::set<int>& Fleet::ShipIDs() const { @@ -529,16 +533,13 @@ { for (unsigned int i = 0; i < ships.size(); ++i) { if (Ship* s = GetUniverse().Object<Ship>(ships[i])) { - if (Fleet* old_fleet = s->GetFleet()) { - old_fleet->RemoveShip(ships[i]); - } - s->SetFleetID(ID()); - s->MoveTo(X(), Y()); if (System* system = GetSystem()) { system->Insert(s); } else { + s->MoveTo(X(), Y()); s->SetSystem(SystemID()); } + s->SetFleetID(ID()); m_ships.insert(ships[i]); } else { throw std::invalid_argument("Fleet::AddShips() : Attempted to add an id of a non-ship object to a fleet."); @@ -550,20 +551,18 @@ void Fleet::AddShip(const int ship_id) { + Logger().debugStream() << "Fleet " << this->Name() << " adding ship: " << ship_id; if (Ship* s = GetUniverse().Object<Ship>(ship_id)) { - if (Fleet* old_fleet = s->GetFleet()) { - old_fleet->RemoveShip(ship_id); - } - s->SetFleetID(ID()); - s->MoveTo(X(), Y()); if (System* system = GetSystem()) { system->Insert(s); } else { + s->MoveTo(X(), Y()); s->SetSystem(SystemID()); } + s->SetFleetID(ID()); m_ships.insert(ship_id); } else { - throw std::invalid_argument("Fleet::AddShip() : Attempted to add an id of a non-ship object to a fleet."); + Logger().errorStream() << "Fleet::AddShip() : Attempted to add an id of a non-ship object to a fleet."; } RecalculateFleetSpeed(); // makes AddShip take Order(m_ships.size()) time - may need replacement StateChangedSignal(); @@ -625,28 +624,6 @@ } } -void Fleet::Move(double x, double y) -{ - // move fleet itself - UniverseObject::Move(x, y); - // move ships in fleet - for (iterator it = begin(); it != end(); ++it) { - UniverseObject* obj = GetUniverse().Object(*it); - assert(obj); - obj->Move(x, y); - } -} - -void Fleet::MoveTo(UniverseObject* object) -{ - if (!object) { - Logger().errorStream() << "Fleet::MoveTo a null object!?"; - return; - } - //Logger().debugStream() << "Fleet::MoveTo(const UniverseObject* object)"; - Fleet::MoveTo(object->X(), object->Y()); -} - void Fleet::MoveTo(double x, double y) { //Logger().debugStream() << "Fleet::MoveTo(double x, double y)"; @@ -656,7 +633,7 @@ for (iterator it = begin(); it != end(); ++it) { UniverseObject* obj = GetUniverse().Object(*it); assert(obj); - obj->MoveTo(x, y); + obj->UniverseObject::MoveTo(x, y); } } @@ -784,10 +761,14 @@ } Fleet::iterator Fleet::begin() -{ return m_ships.begin(); } +{ + return m_ships.begin(); +} Fleet::iterator Fleet::end() -{ return m_ships.end(); } +{ + return m_ships.end(); +} void Fleet::PopGrowthProductionResearchPhase() { Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Fleet.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -91,8 +91,6 @@ iterator end(); ///< returns the end iterator for the ships in the fleet virtual void SetSystem(int sys); - virtual void Move(double x, double y); - virtual void MoveTo(UniverseObject* object); virtual void MoveTo(double x, double y); virtual void MovementPhase(); Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Planet.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -99,8 +99,7 @@ m_axial_tilt(23.0), m_available_trade(0.0), m_just_conquered(false), - m_is_about_to_be_colonized(false), - m_def_bases(0) + m_is_about_to_be_colonized(false) { GG::Connect(ResourceCenter::GetObjectSignal, &Planet::This, this); GG::Connect(PopCenter::GetObjectSignal, &Planet::This, this); @@ -120,8 +119,7 @@ m_axial_tilt(RandZeroToOne() * HIGH_TILT_THERSHOLD), m_available_trade(0.0), m_just_conquered(false), - m_is_about_to_be_colonized(false), - m_def_bases(0) + m_is_about_to_be_colonized(false) { GG::Connect(ResourceCenter::GetObjectSignal, &Planet::This, this); GG::Connect(PopCenter::GetObjectSignal, &Planet::This, this); @@ -170,10 +168,10 @@ Universe& universe = GetUniverse(); for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) { Building* building = universe.Object<Building>(*it); - if (building->Operating()) { +// if (building->Operating()) { const BuildingType* bulding_type = GetBuildingType(building->BuildingTypeName()); retval += bulding_type->MaintenanceCost(); - } +// } } return retval; } @@ -369,14 +367,18 @@ void Planet::AddBuilding(int building_id) { if (Building* building = GetUniverse().Object<Building>(building_id)) { + building->MoveTo(X(), Y()); building->SetPlanetID(ID()); + if (System* system = GetSystem()) { system->Insert(building); } else { building->SetSystem(SystemID()); } - building->MoveTo(X(), Y()); + m_buildings.insert(building_id); + } else { + Logger().errorStream() << "Planet::AddBuilding() : Attempted to add an id of a non-building object to a planet."; } StateChangedSignal(); } @@ -396,7 +398,7 @@ m_available_trade = trade; } -void Planet::AddOwner (int id) +void Planet::AddOwner(int id) { GetSystem()->UniverseObject::AddOwner(id); UniverseObject::AddOwner(id); @@ -503,49 +505,24 @@ { //Logger().debugStream() << "Planet::MoveTo(UniverseObject* object)"; UniverseObject::SetSystem(sys); - // set system of buildings on this planet. TODO: THIS - //for (iterator it = begin(); it != end(); ++it) { - // UniverseObject* obj = GetUniverse().Object(*it); - // assert(obj); - // obj->SetSystem(sys); - //} + for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) { + UniverseObject* obj = GetUniverse().Object(*it); + assert(obj); + obj->SetSystem(sys); + } } -void Planet::Move(double x, double y) -{ - // move planet itself - UniverseObject::Move(x, y); - // move buildings TODO: THIS - //for (iterator it = begin(); it != end(); ++it) { - // UniverseObject* obj = GetUniverse().Object(*it); - // assert(obj); - // obj->Move(x, y); - //} -} - -void Planet::MoveTo(UniverseObject* object) -{ - //Logger().debugStream() << "Planet::MoveTo(const UniverseObject* object)"; - UniverseObject::MoveTo(object); - // move buildings TODO: THIS - //for (iterator it = begin(); it != end(); ++it) { - // UniverseObject* obj = GetUniverse().Object(*it); - // assert(obj); - // obj->MoveTo(object); - //} -} - void Planet::MoveTo(double x, double y) { //Logger().debugStream() << "Planet::MoveTo(double x, double y)"; // move planet itself UniverseObject::MoveTo(x, y); - // move buildings TODO: THIS - //for (iterator it = begin(); it != end(); ++it) { - // UniverseObject* obj = GetUniverse().Object(*it); - // assert(obj); - // obj->MoveTo(x, y); - //} + // move buildings + for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) { + UniverseObject* obj = GetUniverse().Object(*it); + assert(obj); + obj->UniverseObject::MoveTo(x, y); + } } void Planet::MovementPhase() Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Planet.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -112,12 +112,6 @@ bool IsAboutToBeColonized() const {return m_is_about_to_be_colonized;} - ///////////////////////////////////////////////////////////////////////////// - // V0.3 ONLY!!!! - int DefBases() const {return m_def_bases;} - // V0.3 ONLY!!!! - ///////////////////////////////////////////////////////////////////////////// - virtual UniverseObject::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; @@ -131,8 +125,6 @@ /** \name Mutators */ //@{ virtual void SetSystem(int sys); - virtual void Move(double x, double y); - virtual void MoveTo(UniverseObject* object); virtual void MoveTo(double x, double y); virtual void MovementPhase(); @@ -141,11 +133,6 @@ virtual Meter* GetMeter(MeterType type) {return UniverseObject::GetMeter(type);} - ///////////////////////////////////////////////////////////////////////////// - // V0.3 ONLY!!!! - void AdjustDefBases(int bases) {m_def_bases += bases; if (m_def_bases < 0) m_def_bases = 0; StateChangedSignal();} - // V0.3 ONLY!!!! - ///////////////////////////////////////////////////////////////////////////// void SetType(PlanetType type); ///< sets the type of this Planet to \a type void SetSize(PlanetSize size); ///< sets the size of this Planet to \a size @@ -198,12 +185,6 @@ bool m_is_about_to_be_colonized; - ///////////////////////////////////////////////////////////////////////////// - // V0.3 ONLY!!!! - int m_def_bases; - // V0.3 ONLY!!!! - ///////////////////////////////////////////////////////////////////////////// - friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); @@ -241,8 +222,7 @@ & BOOST_SERIALIZATION_NVP(buildings); if (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_available_trade) - & BOOST_SERIALIZATION_NVP(m_is_about_to_be_colonized) - & BOOST_SERIALIZATION_NVP(m_def_bases); + & BOOST_SERIALIZATION_NVP(m_is_about_to_be_colonized); } if (Archive::is_loading::value) m_buildings = buildings; Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Ship.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -95,6 +95,23 @@ return UniverseObject::ProjectedCurrentMeter(type); } +void Ship::SetFleetID(int fleet_id) +{ + m_fleet_id = fleet_id; + StateChangedSignal(); +} + +void Ship::MoveTo(double x, double y) +{ + UniverseObject::MoveTo(x, y); + + // if ship is being moved away from its fleet, remove from the fleet. otherwise, keep ship in fleet. + if (Fleet* fleet = GetFleet()) { + Logger().debugStream() << "Ship::MoveTo removing " << this->ID() << " from fleet " << fleet->Name(); + fleet->RemoveShip(this->ID()); + } +} + void Ship::MovementPhase() { // Fleet::MovementPhase moves ships within fleet around and deals with ship fuel consumption } Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/Ship.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -36,7 +36,9 @@ //@} /** \name Mutators */ //@{ - void SetFleetID(int fleet_id) {m_fleet_id = fleet_id; StateChangedSignal();} ///< sets the ID of the fleet the ship resides in + void SetFleetID(int fleet_id); ///< sets the ID of the fleet the ship resides in + virtual void MoveTo(double x, double y); + virtual void MovementPhase(); virtual void PopGrowthProductionResearchPhase(); //@} Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/System.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -17,34 +17,35 @@ System::System() : - UniverseObject(), - m_star(INVALID_STAR_TYPE), - m_orbits(0) + UniverseObject(), + m_star(INVALID_STAR_TYPE), + m_orbits(0) {} -System::System(StarType star, int orbits, const std::string& name, double x, double y, - const std::set<int>& owners/* = std::set<int>()*/) : - UniverseObject(name, x, y, owners), - m_star(star), - m_orbits(orbits) +System::System(StarType star, int orbits, const std::string& name, double x, double y, + const std::set<int>& owners/* = std::set<int>()*/) : + UniverseObject(name, x, y, owners), + m_star(star), + m_orbits(orbits) { - if (m_star < INVALID_STAR_TYPE || NUM_STAR_TYPES < m_star) - throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with an invalid star type."); - if (m_orbits < 0) - throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with fewer than 0 orbits."); + if (m_star < INVALID_STAR_TYPE || NUM_STAR_TYPES < m_star) + throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with an invalid star type."); + if (m_orbits < 0) + throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with fewer than 0 orbits."); } System::System(StarType star, int orbits, const StarlaneMap& lanes_and_holes, const std::string& name, double x, double y, const std::set<int>& owners/* = std::set<int>()*/) : - UniverseObject(name, x, y, owners), - m_star(star), - m_orbits(orbits), - m_starlanes_wormholes(lanes_and_holes) + UniverseObject(name, x, y, owners), + m_star(star), + m_orbits(orbits), + m_starlanes_wormholes(lanes_and_holes) { - if (m_star < INVALID_STAR_TYPE || NUM_STAR_TYPES < m_star) - throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with an invalid star type."); - if (m_orbits < 0) - throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with fewer than 0 orbits."); + if (m_star < INVALID_STAR_TYPE || NUM_STAR_TYPES < m_star) + throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with an invalid star type."); + if (m_orbits < 0) + throw std::invalid_argument("System::System : Attempted to create a system \"" + Name() + "\" with fewer than 0 orbits."); + SetSystem(ID()); } System::~System() @@ -233,44 +234,54 @@ if (!obj) throw std::invalid_argument("System::Insert() : Attempted to place a null object in a System"); - //Logger().debugStream() << "System::Insert(" << obj->Name() <<", " << orbit << ")"; + Logger().debugStream() << "System::Insert(" << obj->Name() <<", " << orbit << ")"; //Logger().debugStream() << "..initial objects in system: "; //for (ObjectMultimap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) // Logger().debugStream() << "...." << GetUniverse().Object(it->second)->Name(); //Logger().debugStream() << "..initial object systemid: " << obj->SystemID(); - int obj_id = obj->ID(); - if (orbit < -1) throw std::invalid_argument("System::Insert() : Attempted to place an object in an orbit less than -1"); - - // ensure object and its contents are all inserted - std::vector<UniverseObject*> contained_objects = obj->FindObjects(); - for (std::vector<UniverseObject*>::iterator it = contained_objects.begin(); it != contained_objects.end(); ++it) - this->Insert(*it, orbit); - - + // inform obj of its new location and system id. this should propegate to all objects contained within obj obj->MoveTo(this); // ensure object is physically at same location in universe as this system obj->SetSystem(this->ID()); // should do nothing if object is already in this system, but just to ensure things are consistent... - // ensure object isn't already in this system (as far as the system is concerned). If the system already - // thinks the object is here, just return its current orbit and don't change anything. - for (orbit_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (it->second == obj_id) { - return it->first; - } - } - // ensure this system has enough orbits to contain object + // ensure this system has enough orbits to contain objects if (m_orbits <= orbit) m_orbits = orbit + 1; - // record object in this system's record of objects in each orbit - std::pair<int, int> insertion(orbit, obj_id); - m_objects.insert(insertion); + // update obj and its contents in this System's bookkeeping + std::list<UniverseObject*> inserted_objects; + inserted_objects.push_back(obj); + // recursively get all objects contained within obj + for(std::list<UniverseObject*>::iterator it = inserted_objects.begin(); it != inserted_objects.end(); ++it) { + std::vector<UniverseObject*> contained_objects = (*it)->FindObjects(); + std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(inserted_objects)); + } + + // for all inserted objects, up date this System's bookkeeping about orbit and whether it is contained herein + for (std::list<UniverseObject*>::iterator it = inserted_objects.begin(); it != inserted_objects.end(); ++it) { + int cur_id = (*it)->ID(); + + // check if obj is already in system's internal bookkeeping. if it is, check if it is in the wrong + // orbit. if it is both, remove it from its current orbit + for (orbit_iterator orbit_it = m_objects.begin(); orbit_it != m_objects.end(); ++orbit_it) { + if (orbit != orbit_it->first && orbit_it->second == cur_id) { + m_objects.erase(orbit_it); + break; // assuming no duplicate entries + } + } + + // add obj to system's internal bookkeeping + std::pair<int, int> insertion(orbit, cur_id); + m_objects.insert(insertion); + } + + // special cases for if object is a planet or fleet if (universe_object_cast<Planet*>(obj)) UpdateOwnership(); @@ -295,47 +306,65 @@ void System::Remove(UniverseObject* obj) { - //Logger().debugStream() << "System::Remove( " << obj->Name() << " )"; + Logger().debugStream() << "System::Remove( " << obj->Name() << " )"; //Logger().debugStream() << "..objects in system: "; //for (ObjectMultimap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) // Logger().debugStream() << ".... " << GetUniverse().Object(it->second)->Name(); - // ensure object and its contents are all removed from system - std::vector<UniverseObject*> contained_objects = obj->FindObjects(); - for (std::vector<UniverseObject*>::iterator it = contained_objects.begin(); it != contained_objects.end(); ++it) - this->Remove(*it); + // ensure object and (recursive) contents are all removed from system + std::list<UniverseObject*> removed_objects; + removed_objects.push_back(obj); + obj = 0; // to ensure I don't accidentally use obj instead of cur_obj in subsequent code + // recursively get all objects contained within obj + for(std::list<UniverseObject*>::iterator it = removed_objects.begin(); it != removed_objects.end(); ++it) { + std::vector<UniverseObject*> contained_objects = (*it)->FindObjects(); + std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(removed_objects)); + } - if (obj->SystemID() != this->ID()) - Logger().debugStream() << "System::Remove tried to remove an object whose system id was not this system. Its current system id is: " << obj->SystemID(); + // keep track of what is removed... + bool removed_something = false; + std::vector<Fleet*> removed_fleets; + bool removed_planet = false; - // locate object in this system's map of objects, and erase if present - for (ObjectMultimap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - //Logger().debugStream() << "..system object id " << it->second; - if (it->second == obj->ID()) { - m_objects.erase(it); + // do actual removal + for (std::list<UniverseObject*>::iterator it = removed_objects.begin(); it != removed_objects.end(); ++it) { + UniverseObject* cur_obj = *it; - obj->SetSystem(INVALID_OBJECT_ID); + if (this->ID() != cur_obj->SystemID()) + Logger().debugStream() << "System::Remove tried to remove an object whose system id was not this system. Its current system id is: " << cur_obj->SystemID(); - //Logger().debugStream() << "....erased from system"; + for (ObjectMultimap::iterator map_it = m_objects.begin(); map_it != m_objects.end(); ++map_it) { + if (map_it->second == cur_obj->ID()) { + m_objects.erase(map_it); + cur_obj->SetSystem(INVALID_OBJECT_ID); - // UI bookeeping - if (universe_object_cast<Planet*>(obj)) - UpdateOwnership(); - else if (Fleet* fleet = universe_object_cast<Fleet*>(obj)) - FleetRemovedSignal(*fleet); + removed_something = true; - StateChangedSignal(); + if (universe_object_cast<Planet*>(cur_obj)) + removed_planet = true; + if (Fleet* fleet = universe_object_cast<Fleet*>(cur_obj)) + removed_fleets.push_back(fleet); - return; // assuming object isn't in system twice... + break; // assuming no duplicate entries + } } } + if (removed_something) { + // UI bookeeping + if (removed_planet) + UpdateOwnership(); + for (std::vector<Fleet*>::const_iterator it = removed_fleets.begin(); it != removed_fleets.end(); ++it) + FleetRemovedSignal(**it); - // didn't find object. this doesn't necessarily indicate a problem, as removing objects from - // systems may be done redundantly when inserting or moving objects that contain other objects - Logger().debugStream() << "System::Remove didn't find object in system"; + StateChangedSignal(); + } else { + // didn't find object. this doesn't necessarily indicate a problem, as removing objects from + // systems may be done redundantly when inserting or moving objects that contain other objects + Logger().debugStream() << "System::Remove didn't find object in system"; + } } void System::Remove(int id) Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -210,14 +210,12 @@ void UniverseObject::Move(double x, double y) { - if (m_x + x < 0.0 || Universe::UniverseWidth() < m_x + x || m_y + y < 0.0 || Universe::UniverseWidth() < m_y + y) - throw std::runtime_error("UniverseObject::Move : Attempted to move object \"" + m_name + "\" off the map area."); - UniverseObject::MoveTo(m_x + x, m_y + y); + MoveTo(m_x + x, m_y + y); } void UniverseObject::MoveTo(int object_id) { - UniverseObject::MoveTo(GetUniverse().Object(object_id)); + MoveTo(GetUniverse().Object(object_id)); } void UniverseObject::MoveTo(UniverseObject* object) @@ -225,7 +223,7 @@ if (!object) throw std::invalid_argument("UniverseObject::MoveTo passed an invalid object or object id"); - UniverseObject::MoveTo(object->X(), object->Y()); + MoveTo(object->X(), object->Y()); } void UniverseObject::MoveTo(double x, double y) @@ -236,6 +234,7 @@ m_x = x; m_y = y; + if (System* system = GetSystem()) system->Remove(this); StateChangedSignal(); Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-08-04 10:34:04 UTC (rev 2649) @@ -116,7 +116,7 @@ /** moves this object by relative displacements x and y. \throw std::runtime_error May throw std::runtime_error if the result of the move would place either coordinate outside the map area.*/ - virtual void Move(double x, double y); + void Move(double x, double y); /** calls MoveTo(const UniverseObject*) with the object pointed to by \a object_id. */ void MoveTo(int object_id); @@ -124,7 +124,7 @@ /** moves this object and contained objects to exact map coordinates of specified \a object If \a object is a system, places this object into that system. May throw std::invalid_argument if \a object is not a valid object*/ - virtual void MoveTo(UniverseObject* object); + void MoveTo(UniverseObject* object); /** moves this object and contained objects to exact map coordinates (x, y). \throw std::invalid_arugment May throw std::invalid_arugment if the either coordinate of the move is outside the map area.*/ Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2008-08-01 18:56:32 UTC (rev 2648) +++ trunk/FreeOrion/util/Order.cpp 2008-08-04 10:34:04 UTC (rev 2649) @@ -587,8 +587,8 @@ m_new_quantity(INVALID_QUANTITY), m_new_index(INVALID_INDEX) { - if (build_type == BT_BUILDING || build_type == BT_ORBITAL) - throw std::invalid_argument("Attempted to construct a ProductionQueueOrder for a BT_BUILDING or BT_ORBITAL with a design id, not a name"); + if (build_type == BT_BUILDING) + throw std::invalid_argument("Attempted to construct a ProductionQueueOrder for a BT_BUILDING with a design id, not a name"); } @@ -633,7 +633,7 @@ ValidateEmpireID(); Empire* empire = Empires().Lookup(EmpireID()); - if (m_build_type == BT_BUILDING || m_build_type == BT_ORBITAL) + if (m_build_type == BT_BUILDING) empire->PlaceBuildInQueue(m_build_type, m_item_name, m_number, m_location); else if (m_build_type == BT_SHIP) empire->PlaceBuildInQueue(BT_SHIP, m_design_id, m_number, m_location); |
From: <geo...@us...> - 2008-08-05 03:00:37
|
Revision: 2650 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2650&view=rev Author: geoffthemedio Date: 2008-08-05 03:00:46 +0000 (Tue, 05 Aug 2008) Log Message: ----------- -Fixed Planet::AddBuilding -Changed how System::Insert works when adding something at a higher orbit than the system has -More MoveTo effect stuff for single ships -Misc. Tweaks Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -1440,7 +1440,7 @@ double some_fleet_y = some_fleet->Y(); int empire_id = HumanClientApp::GetApp()->EmpireID(); - int new_fleet_id = HumanClientApp::GetApp()->GetNewObjectID(); + int new_fleet_id = GetNewObjectID(); if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) { ClientUI::MessageBox(UserString("SERVER_TIMEOUT"), true); return; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -11,6 +11,7 @@ #include "Planet.h" #include "System.h" #include "Fleet.h" +#include "Ship.h" #include "Tech.h" #include <cctype> @@ -57,6 +58,56 @@ return retval; } + Fleet* CreateNewFleet(System* system, Ship* ship) { + Universe& universe = GetUniverse(); + if (!system || !ship) + return 0; + + int owner_empire_id = -1; + const std::set<int>& owners = ship->Owners(); + if (!owners.empty()) + owner_empire_id = *(owners.begin()); + + int new_fleet_id = GetNewObjectID(); + + std::vector<int> ship_ids; + ship_ids.push_back(ship->ID()); + std::string fleet_name = Fleet::GenerateFleetName(ship_ids, new_fleet_id); + + Fleet* fleet = new Fleet(fleet_name, system->X(), system->Y(), owner_empire_id); + + universe.InsertID(fleet, new_fleet_id); + system->Insert(fleet); + + fleet->AddShip(ship->ID()); + + return fleet; + } + + Fleet* CreateNewFleet(double x, double y, Ship* ship) { + Universe& universe = GetUniverse(); + if (!ship) + return 0; + + int owner_empire_id = -1; + const std::set<int>& owners = ship->Owners(); + if (!owners.empty()) + owner_empire_id = *(owners.begin()); + + int new_fleet_id = GetNewObjectID(); + + std::vector<int> ship_ids; + ship_ids.push_back(ship->ID()); + std::string fleet_name = Fleet::GenerateFleetName(ship_ids, new_fleet_id); + + Fleet* fleet = new Fleet(fleet_name, x, y, owner_empire_id); + + universe.InsertID(fleet, new_fleet_id); + + fleet->AddShip(ship->ID()); + + return fleet; + } } /////////////////////////////////////////////////////////// @@ -627,11 +678,30 @@ // 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)) { - if (System* dest_system = destination->GetSystem()) + if (System* dest_system = destination->GetSystem()) { dest_system->Insert(target); - else + } else { fleet->UniverseObject::MoveTo(destination); + } + } else if (Ship* ship = universe_object_cast<Ship*>(target)) { + // TODO: make sure colonization doesn't interfere with this effect, and vice versa + + // if moved to a fleet, insert the ship into the fleet. otherwise, need to create a new + // fleet to put the ship into (as all ships must be in fleets) + if (Fleet* dest_fleet = universe_object_cast<Fleet*>(destination)) { + dest_fleet->AddShip(ship->ID()); // this takes care of moving the ship + + } else { + // need to create a new fleet for ship + Fleet* new_fleet = 0; + if (System* dest_system = destination->GetSystem()) { + new_fleet = CreateNewFleet(dest_system, ship); // creates new fleet, inserts fleet into system and ship into fleet + } else { + new_fleet = CreateNewFleet(destination->X(), destination->Y(), ship); // creates new fleet and inserts ship into fleet + } + } + } else if (Planet* planet = universe_object_cast<Planet*>(target)) { if (System* dest_system = destination->GetSystem()) { // determine if and which orbits are available Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/universe/Planet.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -366,16 +366,16 @@ void Planet::AddBuilding(int building_id) { + Logger().debugStream() << "Planet " << this->Name() << " adding building: " << building_id; if (Building* building = GetUniverse().Object<Building>(building_id)) { - building->MoveTo(X(), Y()); - building->SetPlanetID(ID()); - if (System* system = GetSystem()) { system->Insert(building); } else { + Logger().errorStream() << "... planet is not located in a system?!?!"; + building->MoveTo(X(), Y()); building->SetSystem(SystemID()); } - + building->SetPlanetID(ID()); m_buildings.insert(building_id); } else { Logger().errorStream() << "Planet::AddBuilding() : Attempted to add an id of a non-building object to a planet."; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/universe/System.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -231,8 +231,10 @@ int System::Insert(UniverseObject* obj, int orbit) { - if (!obj) - throw std::invalid_argument("System::Insert() : Attempted to place a null object in a System"); + if (!obj) { + Logger().errorStream() << "System::Insert() : Attempted to place a null object in a System"; + return -1; + } Logger().debugStream() << "System::Insert(" << obj->Name() <<", " << orbit << ")"; //Logger().debugStream() << "..initial objects in system: "; @@ -240,19 +242,21 @@ // Logger().debugStream() << "...." << GetUniverse().Object(it->second)->Name(); //Logger().debugStream() << "..initial object systemid: " << obj->SystemID(); - if (orbit < -1) - throw std::invalid_argument("System::Insert() : Attempted to place an object in an orbit less than -1"); + if (orbit < -1) { + Logger().errorStream() << "System::Insert() : Attempted to place an object in an orbit less than -1"; + return -1; + } + if (orbit >= m_orbits) { + Logger().errorStream() << "System::Insert() : Attempted to place an object in a non-existing orbit with number higher than the largest numbered orbit"; + return -1; + } + // inform obj of its new location and system id. this should propegate to all objects contained within obj obj->MoveTo(this); // ensure object is physically at same location in universe as this system obj->SetSystem(this->ID()); // should do nothing if object is already in this system, but just to ensure things are consistent... - // ensure this system has enough orbits to contain objects - if (m_orbits <= orbit) - m_orbits = orbit + 1; - - // update obj and its contents in this System's bookkeeping std::list<UniverseObject*> inserted_objects; inserted_objects.push_back(obj); Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/universe/System.h 2008-08-05 03:00:46 UTC (rev 2650) @@ -175,10 +175,10 @@ ObjectMultimap PartiallyVisibleObjects(int empire_id) const; ///< returns the subset of m_objects that is visible when this System's visibility is only PARTIAL_VISIBILITY void UpdateOwnership(); - StarType m_star; - int m_orbits; - ObjectMultimap m_objects; ///< each key value represents an orbit (-1 represents general system contents not in any orbit); there may be many or no objects at each orbit (including -1) - StarlaneMap m_starlanes_wormholes; ///< the ints represent the IDs of other connected systems; the bools indicate whether the connection is a wormhole (true) or a starlane (false) + StarType m_star; + int m_orbits; + ObjectMultimap m_objects; ///< each key value represents an orbit (-1 represents general system contents not in any orbit); there may be many or no objects at each orbit (including -1) + StarlaneMap m_starlanes_wormholes; ///< the ints represent the IDs of other connected systems; the bools indicate whether the connection is a wormhole (true) or a starlane (false) friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -1421,14 +1421,14 @@ ////////////////////////////////////////// namespace { #ifdef FREEORION_BUILD_SERVER - const double MIN_SYSTEM_SEPARATION = 30.0; // in universe units [0.0, s_universe_width] - const double MIN_HOME_SYSTEM_SEPARATION = 200.0; // in universe units [0.0, s_universe_width] - const double AVG_UNIVERSE_WIDTH = 1000.0 / std::sqrt(150.0); // so a 150 star universe is 1000 units across - const int ADJACENCY_BOXES = 25; - const double PI = 3.141592653589793; - const int MAX_SYSTEM_ORBITS = 10; // maximum slots where planets can be, in v0.2 - SmallIntDistType g_hundred_dist = SmallIntDist(1, 100); // a linear distribution [1, 100] used in most universe generation - const int MAX_ATTEMPTS_PLACE_SYSTEM = 100; + const double MIN_SYSTEM_SEPARATION = 30.0; // in universe units [0.0, s_universe_width] + const double MIN_HOME_SYSTEM_SEPARATION = 200.0; // in universe units [0.0, s_universe_width] + const double AVG_UNIVERSE_WIDTH = 1000.0 / std::sqrt(150.0); // so a 150 star universe is 1000 units across + const int ADJACENCY_BOXES = 25; + const double PI = 3.141592653589793; + const int MAX_SYSTEM_ORBITS = 9; // maximum slots where planets can be, in v0.2 + SmallIntDistType g_hundred_dist = SmallIntDist(1, 100); // a linear distribution [1, 100] used in most universe generation + const int MAX_ATTEMPTS_PLACE_SYSTEM = 100; #endif double CalcNewPosNearestNeighbour(const std::pair<double, double> &position,const std::vector<std::pair<double, double> > &positions) @@ -1718,7 +1718,7 @@ std::string star_name(*it); star_names.erase(it); - // make a series of "rolls" (1-100) for each planet size, and take the highest modified roll + // make a series of "rolls" (1-100) for each star type, and take the highest modified roll int idx = 0; int max_roll = 0; for (unsigned int i = 0; i < NUM_STAR_TYPES; ++i) { Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2008-08-04 10:34:04 UTC (rev 2649) +++ trunk/FreeOrion/util/Order.cpp 2008-08-05 03:00:46 UTC (rev 2650) @@ -129,7 +129,7 @@ #endif } -NewFleetOrder::NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, double x, double y, const std::vector<int>& ship_ids) : +NewFleetOrder::NewFleetOrder(int empire, const std::string& fleet_name, const int new_id, double x, double y, const std::vector<int>& ship_ids) : Order(empire), m_fleet_name(fleet_name), m_system_id(-1), |
From: <geo...@us...> - 2008-08-08 02:10:23
|
Revision: 2653 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2653&view=rev Author: geoffthemedio Date: 2008-08-08 02:10:30 +0000 (Fri, 08 Aug 2008) Log Message: ----------- -Move Visibility enum out of UniverseObject and into Enums.h -Made MoveTo effect explore the destination system for the owner of the moved object. Was hoping this would fix crashes after moving AI fleets into player's system, but it did not. Modified Paths: -------------- trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Enums.h trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/ResourceCenter.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 trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -438,13 +438,12 @@ void ServerApp::ProcessTurns() { - Empire *empire; - OrderSet *order_set; - OrderSet::const_iterator order_it; + Empire* empire; + OrderSet* order_set; + OrderSet::const_iterator order_it; // Now all orders, then process turns - for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) - { + for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { // broadcast UI message to all players for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::PROCESSING_ORDERS, it->first)); @@ -463,18 +462,15 @@ // filter FleetColonizeOrder for later processing typedef std::map<int, std::vector<boost::shared_ptr<FleetColonizeOrder> > > ColonizeOrderMap; ColonizeOrderMap colonize_order_map; - for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) - { + for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { order_set = it->second; // filter FleetColonizeOrder and sort them per planet boost::shared_ptr<FleetColonizeOrder> order; for (order_it = order_set->begin(); order_it != order_set->end(); ++order_it) { - if ((order = boost::dynamic_pointer_cast<FleetColonizeOrder>(order_it->second))) - { + if ((order = boost::dynamic_pointer_cast<FleetColonizeOrder>(order_it->second))) { ColonizeOrderMap::iterator it = colonize_order_map.find(order->PlanetID()); - if(it == colonize_order_map.end()) - { + if (it == colonize_order_map.end()) { colonize_order_map.insert(std::make_pair(order->PlanetID(),std::vector<boost::shared_ptr<FleetColonizeOrder> >())); it = colonize_order_map.find(order->PlanetID()); } @@ -488,8 +484,7 @@ // 2 - if there are more than one empire then // 2.a - if only one empire which tries to colonize (empire who don't are ignored) is armed, this empire wins the race // 2.b - if more than one empire is armed or all forces are unarmed, no one can colonize the planet - for (ColonizeOrderMap::iterator it = colonize_order_map.begin(); it != colonize_order_map.end(); ++it) - { + for (ColonizeOrderMap::iterator it = colonize_order_map.begin(); it != colonize_order_map.end(); ++it) { Planet *planet = GetUniverse().Object<Planet>(it->first); // only one empire? @@ -504,8 +499,7 @@ std::set<int> set_empire_with_military; for (unsigned int i=0;i<vec_fleet.size();i++) for (Fleet::const_iterator ship_it=vec_fleet[i]->begin();ship_it!=vec_fleet[i]->end();++ship_it) - if (GetUniverse().Object<Ship>(*ship_it)->IsArmed()) - { + if (GetUniverse().Object<Ship>(*ship_it)->IsArmed()) { set_empire_with_military.insert(*vec_fleet[i]->Owners().begin()); break; } @@ -516,11 +510,9 @@ bool winner_is_armed = set_empire_with_military.find(it->second[0]->EmpireID()) != set_empire_with_military.end(); for (unsigned int i=1;i<it->second.size();i++) // is this empire armed? - if (set_empire_with_military.find(it->second[i]->EmpireID()) != set_empire_with_military.end()) - { + if (set_empire_with_military.find(it->second[i]->EmpireID()) != set_empire_with_military.end()) { // if this empire is armed and the former winner too, noone can win - if (winner_is_armed) - { + if (winner_is_armed) { winner = -1; // no winner!! break; // won't find a winner! } @@ -578,24 +570,20 @@ std::vector<System*> sys_vec = GetUniverse().FindObjects<System>(); bool combat_happend = false; - for (std::vector<System*>::iterator it = sys_vec.begin(); it != sys_vec.end(); ++it) - { + for (std::vector<System*>::iterator it = sys_vec.begin(); it != sys_vec.end(); ++it) { std::vector<CombatAssets> empire_combat_forces; System* system = *it; std::vector<Fleet*> flt_vec = system->FindObjects<Fleet>(); if (flt_vec.empty()) continue; // skip systems with not fleets, as these can't have combat - for (std::vector<Fleet*>::iterator flt_it = flt_vec.begin();flt_it != flt_vec.end(); ++flt_it) - { + for (std::vector<Fleet*>::iterator flt_it = flt_vec.begin();flt_it != flt_vec.end(); ++flt_it) { Fleet* flt = *flt_it; // a fleet should belong only to one empire!? - if (1==flt->Owners().size()) - { + if (1==flt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*flt->Owners().begin()))); - if (ecf_it==empire_combat_forces.end()) - { + if (ecf_it==empire_combat_forces.end()) { CombatAssets ca(Empires().Lookup(*flt->Owners().begin())); ca.fleets.push_back(flt); empire_combat_forces.push_back(ca); @@ -605,16 +593,13 @@ } } std::vector<Planet*> plt_vec = system->FindObjects<Planet>(); - for (std::vector<Planet*>::iterator plt_it = plt_vec.begin();plt_it != plt_vec.end(); ++plt_it) - { + for (std::vector<Planet*>::iterator plt_it = plt_vec.begin();plt_it != plt_vec.end(); ++plt_it) { Planet* plt = *plt_it; // a planet should belong only to one empire!? - if (1==plt->Owners().size()) - { + if (1==plt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*plt->Owners().begin()))); - if (ecf_it==empire_combat_forces.end()) - { + if (ecf_it==empire_combat_forces.end()) { CombatAssets ca(Empires().Lookup(*plt->Owners().begin())); ca.planets.push_back(plt); empire_combat_forces.push_back(ca); @@ -624,8 +609,7 @@ } } - if (empire_combat_forces.size()>1) - { + if (empire_combat_forces.size() > 1) { combat_happend=true; CombatSystem combat_system; combat_system.ResolveCombat(system->ID(),empire_combat_forces); Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Building.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -82,12 +82,12 @@ return m_planet_id == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<Planet>(m_planet_id); } -UniverseObject::Visibility Building::GetVisibility(int empire_id) const { +Visibility Building::GetVisibility(int empire_id) const { const Planet* planet = GetPlanet(); if (planet) return planet->GetVisibility(empire_id); else - return NO_VISIBILITY; + return VIS_NO_VISIBITY; } UniverseObject* Building::Accept(const UniverseObjectVisitor& visitor) const Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Condition.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -1199,7 +1199,7 @@ { bool retval = false; for (unsigned int i = 0; i < m_empire_ids.size(); ++i) { - if (target->GetVisibility(m_empire_ids[i]->Eval(source, target)) != UniverseObject::NO_VISIBILITY) + if (target->GetVisibility(m_empire_ids[i]->Eval(source, target)) != VIS_NO_VISIBITY) return true; } return retval; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -107,6 +107,14 @@ return fleet; } + + void ExploreSystem(int system_id, const UniverseObject* target_object) { + if (!target_object) return; + const std::set<int>& owners = target_object->Owners(); + if (!owners.empty()) + if (Empire* owner_empire = Empires().Lookup(*owners.begin())) + owner_empire->AddExploredSystem(system_id); + } } /////////////////////////////////////////////////////////// @@ -682,6 +690,8 @@ // destination object istelf if it is a system if (System* dest_system = destination->GetSystem()) { dest_system->Insert(target); + ExploreSystem(dest_system->ID(), target); + } else { fleet->UniverseObject::MoveTo(destination); } @@ -699,6 +709,8 @@ Fleet* new_fleet = 0; if (System* dest_system = destination->GetSystem()) { new_fleet = CreateNewFleet(dest_system, ship); // creates new fleet, inserts fleet into system and ship into fleet + ExploreSystem(dest_system->ID(), target); + } else { new_fleet = CreateNewFleet(destination->X(), destination->Y(), ship); // creates new fleet and inserts ship into fleet } @@ -712,6 +724,7 @@ 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 @@ -721,10 +734,15 @@ // 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()); + if (const System* dest_system = dest_planet->GetSystem()) + ExploreSystem(dest_system->ID(), target); + } else if (Building* dest_building = universe_object_cast<Building*>(destination)) { if (Planet* dest_planet = dest_building->GetPlanet()) { dest_planet->AddBuilding(building->ID()); + if (const System* dest_system = dest_planet->GetSystem()) + ExploreSystem(dest_system->ID(), target); } } // else if destination is something else that can be on a planet... Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Enums.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -535,6 +535,29 @@ ALL_EMPIRES = -1 }; +/** degrees of visibility an Empire or UniverseObject can have for an UniverseObject. determines how much information the empire + gets about the (non)visible object. */ +enum Visibility { + INVALID_VISIBILITY = -1, + VIS_NO_VISIBITY, + VIS_BASIC_VISIBILITY, + VIS_PARTIAL_VISIBILITY, + VIS_FULL_VISIBILITY, + NUM_VISIBILITIES +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(Visibility) + GG_ENUM_MAP_INSERT(INVALID_VISIBILITY) + GG_ENUM_MAP_INSERT(VIS_NO_VISIBITY) + GG_ENUM_MAP_INSERT(VIS_PARTIAL_VISIBILITY) + GG_ENUM_MAP_INSERT(VIS_FULL_VISIBILITY) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(Visibility) +GG_ENUM_STREAM_OUT(Visibility) + + /** Possible results of an UniverseObject being captured by other empires, or an object's containing UniverseObject being captured, or the location of a Production Queue Build Item being conquered, or the result of other future events, such as spy activity... */ Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -89,25 +89,25 @@ return m_ships; } -UniverseObject::Visibility Fleet::GetVisibility(int empire_id) const +Visibility Fleet::GetVisibility(int empire_id) const { if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) { - return FULL_VISIBILITY; + return VIS_FULL_VISIBILITY; } else { // A fleet is visible to another player, iff // the previous system on the route or the next system on the route // is visible to the player. System * system; if ((system = GetUniverse().Object<System>(SystemID())) && - system->GetVisibility(empire_id) != NO_VISIBILITY) - return PARTIAL_VISIBILITY; + system->GetVisibility(empire_id) != VIS_NO_VISIBITY) + return VIS_PARTIAL_VISIBILITY; if ((system = GetUniverse().Object<System>(NextSystemID())) && - system->GetVisibility(empire_id) != NO_VISIBILITY) - return PARTIAL_VISIBILITY; + system->GetVisibility(empire_id) != VIS_NO_VISIBITY) + return VIS_PARTIAL_VISIBILITY; if ((system = GetUniverse().Object<System>(PreviousSystemID())) && - system->GetVisibility(empire_id) != NO_VISIBILITY) - return PARTIAL_VISIBILITY; - return NO_VISIBILITY; + system->GetVisibility(empire_id) != VIS_NO_VISIBITY) + return VIS_PARTIAL_VISIBILITY; + return VIS_NO_VISIBITY; } } Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Fleet.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -41,7 +41,7 @@ const std::set<int>& ShipIDs() const; ///< returns set of IDs of ships in fleet. - virtual UniverseObject::Visibility GetVisibility(int empire_id) const; + 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). @@ -138,7 +138,7 @@ template <class Archive> void Fleet::serialize(Archive& ar, const unsigned int version) { - bool vis; + Visibility vis; int moving_to; std::list<System*> travel_route; double travel_distance; @@ -147,7 +147,7 @@ ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_NVP(vis); if (Archive::is_saving::value) { - moving_to = (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) ? m_moving_to : m_next_system; + moving_to = (Universe::ALL_OBJECTS_VISIBLE || vis == VIS_FULL_VISIBILITY) ? m_moving_to : m_next_system; if (1 <= version) { ShortenRouteToEndAtSystem(travel_route, moving_to); travel_distance = m_travel_distance; @@ -175,7 +175,7 @@ } } if (Universe::ALL_OBJECTS_VISIBLE || - vis == FULL_VISIBILITY) + vis == VIS_FULL_VISIBILITY) ar & BOOST_SERIALIZATION_NVP(m_speed); } Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Planet.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -199,14 +199,14 @@ return retval; } -UniverseObject::Visibility Planet::GetVisibility(int empire_id) const +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 NO_VISIBILITY; + return VIS_NO_VISIBITY; } UniverseObject* Planet::Accept(const UniverseObjectVisitor& visitor) const Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Planet.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -112,7 +112,7 @@ bool IsAboutToBeColonized() const {return m_is_about_to_be_colonized;} - virtual UniverseObject::Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. + 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; @@ -203,7 +203,7 @@ for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) { int obj_id = *it; const UniverseObject* obj = universe.Object(obj_id); - if (obj->GetVisibility(Universe::s_encoding_empire) != NO_VISIBILITY) + if (obj->GetVisibility(Universe::s_encoding_empire) != VIS_NO_VISIBITY) buildings.insert(obj_id); } } @@ -220,7 +220,7 @@ & BOOST_SERIALIZATION_NVP(m_axial_tilt) & BOOST_SERIALIZATION_NVP(m_just_conquered) & BOOST_SERIALIZATION_NVP(buildings); - if (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) { + if (Universe::ALL_OBJECTS_VISIBLE || vis == VIS_FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_available_trade) & BOOST_SERIALIZATION_NVP(m_is_about_to_be_colonized); } Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/ResourceCenter.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -76,7 +76,7 @@ template <class Archive> void ResourceCenter::serialize(Archive& ar, const unsigned int version) { - UniverseObject::Visibility vis; + Visibility vis; if (Archive::is_saving::value) { UniverseObject* object = GetObjectSignal(); assert(object); @@ -84,7 +84,7 @@ } ar & BOOST_SERIALIZATION_NVP(vis); if (Universe::ALL_OBJECTS_VISIBLE || - vis == UniverseObject::FULL_VISIBILITY) { + vis == VIS_FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_primary) & BOOST_SERIALIZATION_NVP(m_secondary); } Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Ship.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -55,14 +55,14 @@ return m_fleet_id == INVALID_OBJECT_ID ? 0 : GetUniverse().Object<Fleet>(m_fleet_id); } -UniverseObject::Visibility Ship::GetVisibility(int empire_id) const { - UniverseObject::Visibility vis = NO_VISIBILITY; +Visibility Ship::GetVisibility(int empire_id) const { + Visibility vis = VIS_NO_VISIBITY; if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) - vis = FULL_VISIBILITY; + vis = VIS_FULL_VISIBILITY; // Ship is visible if its fleet is visible - UniverseObject::Visibility retval = FleetID() == INVALID_OBJECT_ID ? NO_VISIBILITY : (GetFleet() ? GetFleet()->GetVisibility(empire_id) : vis); + Visibility retval = FleetID() == INVALID_OBJECT_ID ? VIS_NO_VISIBITY : (GetFleet() ? GetFleet()->GetVisibility(empire_id) : vis); return retval; } Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Ship.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -23,7 +23,7 @@ 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 UniverseObject::Visibility GetVisibility(int empire_id) const; + 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 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/System.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -206,17 +206,17 @@ return retval; } -UniverseObject::Visibility System::GetVisibility(int empire_id) const +Visibility System::GetVisibility(int empire_id) const { // if system is at least partially owned by this empire it is fully visible, if it has been explored it is partially visible, // and otherwise it will be partially visible Empire* empire = 0; if (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || OwnedBy(empire_id)) - return FULL_VISIBILITY; + return VIS_FULL_VISIBILITY; else if ((empire = Empires().Lookup(empire_id)) && empire->HasExploredSystem(ID())) - return PARTIAL_VISIBILITY; + return VIS_PARTIAL_VISIBILITY; else - return NO_VISIBILITY; + return VIS_NO_VISIBITY; } UniverseObject* System::Accept(const UniverseObjectVisitor& visitor) const @@ -520,7 +520,7 @@ ObjectMultimap retval; const Universe& universe = GetUniverse(); for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (universe.Object(it->second)->GetVisibility(empire_id) <= PARTIAL_VISIBILITY) + if (universe.Object(it->second)->GetVisibility(empire_id) <= VIS_PARTIAL_VISIBILITY) retval.insert(*it); } return retval; Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/System.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -105,8 +105,7 @@ 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 UniverseObject::Visibility - GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. + 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; @@ -175,7 +174,7 @@ //@} private: - ObjectMultimap PartiallyVisibleObjects(int empire_id) const; ///< returns the subset of m_objects that is visible when this System's visibility is only PARTIAL_VISIBILITY + ObjectMultimap PartiallyVisibleObjects(int empire_id) const; ///< returns the subset of m_objects that is visible when this System's visibility is only VIS_PARTIAL_VISIBILITY void UpdateOwnership(); StarType m_star; @@ -276,11 +275,11 @@ if (Archive::is_saving::value) { vis = GetVisibility(Universe::s_encoding_empire); if (Universe::ALL_OBJECTS_VISIBLE || - vis == FULL_VISIBILITY) { + vis == VIS_FULL_VISIBILITY) { orbits = m_orbits; objects = m_objects; starlanes_wormholes = m_starlanes_wormholes; - } else if (vis == PARTIAL_VISIBILITY) { + } else if (vis == VIS_PARTIAL_VISIBILITY) { orbits = m_orbits; objects = PartiallyVisibleObjects(Universe::s_encoding_empire); starlanes_wormholes = VisibleStarlanes(Universe::s_encoding_empire); @@ -290,7 +289,7 @@ & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_star); if (Universe::ALL_OBJECTS_VISIBLE || - vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { + vis == VIS_PARTIAL_VISIBILITY || vis == VIS_FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(orbits) & BOOST_SERIALIZATION_NVP(objects) & BOOST_SERIALIZATION_NVP(starlanes_wormholes); Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -1094,7 +1094,7 @@ std::set<int> knowing_empires; for (EmpireManager::iterator emp_it = Empires().begin(); emp_it != Empires().end(); ++emp_it) { int empire_id = emp_it->first; - if (obj->GetVisibility(empire_id) != UniverseObject::NO_VISIBILITY || universe_object_cast<System*>(obj) || obj->OwnedBy(empire_id)) { + if (obj->GetVisibility(empire_id) != VIS_NO_VISIBITY || universe_object_cast<System*>(obj) || obj->OwnedBy(empire_id)) { knowing_empires.insert(empire_id); //Logger().debugStream() << "..visible to empire: " << empire_id; } Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/Universe.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -421,7 +421,7 @@ // 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) != UniverseObject::NO_VISIBILITY || + it->second->GetVisibility(s_encoding_empire) != VIS_NO_VISIBITY || universe_object_cast<System*>(it->second)) { objects.insert(*it); Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -181,9 +181,9 @@ return m_owners.size() == 1 && m_owners.find(empire) != m_owners.end(); } -UniverseObject::Visibility UniverseObject::GetVisibility(int empire_id) const +Visibility UniverseObject::GetVisibility(int empire_id) const { - return (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || m_owners.find(empire_id) != m_owners.end()) ? FULL_VISIBILITY : NO_VISIBILITY; + return (Universe::ALL_OBJECTS_VISIBLE || empire_id == ALL_EMPIRES || m_owners.find(empire_id) != m_owners.end()) ? VIS_FULL_VISIBILITY : VIS_NO_VISIBITY; } const std::string& UniverseObject::PublicName(int empire_id) const Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-08-08 02:10:30 UTC (rev 2653) @@ -42,13 +42,6 @@ class UniverseObject { public: - /** the three different visibility levels */ - enum Visibility { - FULL_VISIBILITY, - PARTIAL_VISIBILITY, - NO_VISIBILITY - }; - /** \name Signal Types */ //@{ typedef boost::signal<void ()> StateChangedSignalBaseType; ///< used to define StateChangedSignalType typedef InhibitableSignal<StateChangedSignalBaseType> StateChangedSignalType; ///< emitted when the UniverseObject is altered in any way @@ -215,7 +208,7 @@ & BOOST_SERIALIZATION_NVP(m_system_id) & BOOST_SERIALIZATION_NVP(m_meters); if (Universe::ALL_OBJECTS_VISIBLE || - vis == PARTIAL_VISIBILITY || vis == FULL_VISIBILITY) { + vis == VIS_PARTIAL_VISIBILITY || vis == VIS_FULL_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 Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2008-08-05 14:02:30 UTC (rev 2652) +++ trunk/FreeOrion/util/Order.cpp 2008-08-08 02:10:30 UTC (rev 2653) @@ -721,7 +721,7 @@ std::vector<Ship*> ship_vec = GetUniverse().FindObjects<Ship>(); bool known = false; for (std::vector<Ship*>::const_iterator it = ship_vec.begin(); it != ship_vec.end(); ++it) { - if (Universe::ALL_OBJECTS_VISIBLE || (*it)->GetVisibility(EmpireID()) != UniverseObject::NO_VISIBILITY) { + if (Universe::ALL_OBJECTS_VISIBLE || (*it)->GetVisibility(EmpireID()) != VIS_NO_VISIBITY) { if ((*it)->DesignID() == m_design_id) { known = true; break; |
From: <geo...@us...> - 2008-08-08 12:28:00
|
Revision: 2654 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2654&view=rev Author: geoffthemedio Date: 2008-08-08 12:28:09 +0000 (Fri, 08 Aug 2008) Log Message: ----------- -Fixed (apparently) crashes from MoveTo effect moving AI fleets to player's system and an odd visibility-test bug in system serialization that was causing it but was previously undetected -Added a bunch of debug output that will need to be removed later in the processed of the previous point. -Added code to update fleet routes after they are moved by an effect, which can lead to their original route being invalid -Minor optimization and other misc. tweaks Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -714,6 +714,11 @@ Universe& universe = GetUniverse(); + Logger().debugStream() << "MapWnd::InitTurn universe objects:"; + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) + Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first << " and systemID: " << it->second->SystemID(); + + Logger().debugStream() << "MapWnd::InitTurn universe destroyed objects:"; for (Universe::const_iterator it = universe.beginDestroyed(); it != universe.endDestroyed(); ++it) Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first; @@ -1394,19 +1399,16 @@ void MapWnd::SelectFleet(int fleet_id) { - if (Fleet* fleet = GetUniverse().Object<Fleet>(fleet_id)) - SelectFleet(fleet); + SelectFleet(GetUniverse().Object<Fleet>(fleet_id)); } void MapWnd::SelectFleet(Fleet* fleet) { + if (!fleet) return; if (System* system = fleet->GetSystem()) { - for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { - if (&it->second->GetSystem() == system) { - it->second->ClickFleetButton(fleet); - break; - } - } + std::map<int, SystemIcon*>::iterator it = m_system_icons.find(system->ID()); + if (it != m_system_icons.end()) + it->second->ClickFleetButton(fleet); } else { for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { if (std::find(m_moving_fleet_buttons[i]->Fleets().begin(), m_moving_fleet_buttons[i]->Fleets().end(), fleet) != m_moving_fleet_buttons[i]->Fleets().end()) { Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -351,7 +351,18 @@ const int empire_id = it->first; const Empire* empire = it->second; - std::vector<int> fleet_IDs = m_system.FindObjectIDs(StationaryFleetVisitor(empire_id)); + std::vector<int> contained_objects = m_system.FindObjectIDs(); + Logger().debugStream() << "System: " << m_system.Name() << " contained objects: "; + for (std::vector<int>::const_iterator it1 = contained_objects.begin(); it1 != contained_objects.end(); ++it1) + Logger().debugStream() << "... " << *it1; + + + std::vector<int> fleet_IDs = m_system.FindObjectIDs(StationaryFleetVisitor(empire_id)); + + Logger().debugStream() << "System: " << m_system.Name() << " stationary fleet ids: "; + for (std::vector<int>::const_iterator it1 = fleet_IDs.begin(); it1 != fleet_IDs.end(); ++it1) + Logger().debugStream() << "... " << *it1; + if (!fleet_IDs.empty()) { fb = new FleetButton(empire->Color(), fleet_IDs); m_stationary_fleet_markers[empire_id] = fb; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -57,6 +57,8 @@ return retval; } + /** creates a new fleet at \a system and inserts \a ship into it. used when a ship has been moved by the MoveTo + effect separately from the fleet that previously held it. all ships need to be within fleets. */ Fleet* CreateNewFleet(System* system, Ship* ship) { Universe& universe = GetUniverse(); if (!system || !ship) @@ -83,6 +85,9 @@ return fleet; } + /** creates a new fleet at a specified \a x and \a y location within the Universe, and and inserts \a ship into it. + used when a ship has been moved by the MoveTo effect separately from the fleet that previously held it. all + ships need to be within fleets. */ Fleet* CreateNewFleet(double x, double y, Ship* ship) { Universe& universe = GetUniverse(); if (!ship) @@ -108,6 +113,9 @@ return fleet; } + /** Explores the system with the specified \a system_id for the owner of the specified \a target_object. Used when + moving objects into a system with the MoveTo effect, as otherwise the system wouldn't get explored, and objects + being moved into unexplored systems might disappear for players or confuse the AI. */ void ExploreSystem(int system_id, const UniverseObject* target_object) { if (!target_object) return; const std::set<int>& owners = target_object->Owners(); @@ -115,6 +123,49 @@ if (Empire* owner_empire = Empires().Lookup(*owners.begin())) owner_empire->AddExploredSystem(system_id); } + + /** Resets the previous and next systems of \a fleet and recalcultes / resets the fleet's move route. Used after a fleet + has been moved with the MoveTo effect, as its previous route was assigned based on its previous location, an may not + be valid for its new location. */ + void UpdateFleetRoute(Fleet* fleet, int new_next_system, int new_previous_system) { + if (!fleet) { + Logger().errorStream() << "UpdateFleetRoute passed a null fleet pointer"; + return; + } + + Universe& universe = GetUniverse(); + + System* next_system = universe.Object<System>(new_next_system); + if (!next_system) { + Logger().errorStream() << "UpdateFleetRoute couldn't get new next system with id: " << new_next_system; + return; + } + + fleet->SetNextAndPreviousSystems(new_next_system, new_previous_system); + + int owner = -1; + const std::set<int>& owners = fleet->Owners(); + if (!owners.empty()) + owner = *owners.begin(); + + int start_system = fleet->SystemID(); + if (start_system == UniverseObject::INVALID_OBJECT_ID) + start_system = new_next_system; + + int dest_system = fleet->FinalDestinationID(); + + std::pair<std::list<System*>, double> route_pair = universe.ShortestPath(start_system, dest_system, owner); + + if (route_pair.first.empty()) { + route_pair.first.push_back(next_system); + + double dist_x = next_system->X() - fleet->X(); + double dist_y = next_system->Y() - fleet->Y(); + route_pair.second = std::sqrt(dist_x * dist_x + dist_y * dist_y); + } + + fleet->SetRoute(route_pair.first, route_pair.second); + } } /////////////////////////////////////////////////////////// @@ -691,9 +742,33 @@ if (System* dest_system = destination->GetSystem()) { dest_system->Insert(target); ExploreSystem(dest_system->ID(), target); + UpdateFleetRoute(fleet, UniverseObject::INVALID_OBJECT_ID, UniverseObject::INVALID_OBJECT_ID); // inserted into dest_system, so next and previous systems are invalid objects } else { fleet->UniverseObject::MoveTo(destination); + + // 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 + // previous system so it can move into a system, or can be ordered to a new location, and so that it won't try to move + // off of starlanes towards some other system from its current location (if it was heading to another system) and so it + // won't be stuck in the middle of a starlane, unable to move (if it wasn't previously moving) + + // if destination object is a fleet or is part of a fleet, can use that fleet's previous and next systems to get + // valid next and previous systems for the target fleet. + const Fleet* dest_fleet = 0; + + dest_fleet = universe_object_cast<const Fleet*>(destination); + if (!dest_fleet) + if (const Ship* dest_ship = universe_object_cast<const Ship*>(destination)) + dest_fleet = universe_object_cast<const Fleet*>(dest_ship->GetFleet()); + + if (dest_fleet) { + UpdateFleetRoute(fleet, dest_fleet->NextSystemID(), dest_fleet->PreviousSystemID()); + } else { + // need to do something more fancy, although as of this writing, there are no other types of UniverseObject subclass + // that can be located between systems other than fleets and ships, so this shouldn't matter for now... + Logger().errorStream() << "Effect::MoveTo::Execute couldn't find a way to set the previous and next systems for the target fleet!"; + } } } else if (Ship* ship = universe_object_cast<Ship*>(target)) { Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -637,6 +637,12 @@ } } +void Fleet::SetNextAndPreviousSystems(int next, int prev) +{ + m_prev_system = prev; + m_next_system = next; +} + void Fleet::MovementPhase() { //Logger().debugStream() << "Fleet::MovementPhase this: " << this->Name() << " id: " << this->ID(); Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/universe/Fleet.h 2008-08-08 12:28:09 UTC (rev 2654) @@ -92,6 +92,7 @@ virtual void SetSystem(int sys); virtual void MoveTo(double x, double y); + void SetNextAndPreviousSystems(int next, int prev); ///< sets the previous and next systems for this fleet. Useful after moving a moving fleet to a different location, so that it moves along its new local starlanes virtual void MovementPhase(); virtual void PopGrowthProductionResearchPhase(); Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/universe/System.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -236,7 +236,7 @@ return -1; } - Logger().debugStream() << "System::Insert(" << obj->Name() <<", " << orbit << ")"; + Logger().debugStream() << "System::Insert system " << this->Name() << " (object " << obj->Name() << ", orbit " << orbit << ")"; //Logger().debugStream() << "..initial objects in system: "; //for (ObjectMultimap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) // Logger().debugStream() << "...." << GetUniverse().Object(it->second)->Name(); @@ -520,7 +520,7 @@ ObjectMultimap retval; const Universe& universe = GetUniverse(); for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (universe.Object(it->second)->GetVisibility(empire_id) <= VIS_PARTIAL_VISIBILITY) + if (universe.Object(it->second)->GetVisibility(empire_id) >= VIS_PARTIAL_VISIBILITY) retval.insert(*it); } return retval; Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2008-08-08 02:10:30 UTC (rev 2653) +++ trunk/FreeOrion/util/Order.cpp 2008-08-08 12:28:09 UTC (rev 2654) @@ -197,6 +197,12 @@ } m_route_length = route.second; + // ensure a zero-length (invalid) route is not requested / sent to a fleet + if (m_route.empty()) { + m_route.push_back(start_system); + m_route_length = 0.0; + } + #if DEBUG_FLEET_MOVE_ORDER std::cerr << "FleetMoveOrder(int empire, int fleet, int start_system, int dest_system) : \n" << " m_empire=" << EmpireID() << "\n" |
From: <geo...@us...> - 2008-08-08 23:14:08
|
Revision: 2655 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2655&view=rev Author: geoffthemedio Date: 2008-08-08 23:14:17 +0000 (Fri, 08 Aug 2008) Log Message: ----------- -Improved MoveTo effect's treatment of ships being moved to systems or fleets where they already are -Made MoveTo effect do nothing if a fleet is moved to a system where it already is -Made MoveTo effect destroy fleets from which all ships are removed during execution of the effect -Made adding ships to fleets they are already in abort early -Fixed route length calculate done when issuing invalid move orders to ships that are between systems -Commented out some debug code Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-08 12:28:09 UTC (rev 2654) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-08 23:14:17 UTC (rev 2655) @@ -714,15 +714,14 @@ Universe& universe = GetUniverse(); - Logger().debugStream() << "MapWnd::InitTurn universe objects:"; - for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) - Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first << " and systemID: " << it->second->SystemID(); + //Logger().debugStream() << "MapWnd::InitTurn universe objects:"; + //for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) + // Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first << " and systemID: " << it->second->SystemID(); + //Logger().debugStream() << "MapWnd::InitTurn universe destroyed objects:"; + //for (Universe::const_iterator it = universe.beginDestroyed(); it != universe.endDestroyed(); ++it) + // Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first; - Logger().debugStream() << "MapWnd::InitTurn universe destroyed objects:"; - for (Universe::const_iterator it = universe.beginDestroyed(); it != universe.endDestroyed(); ++it) - Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first; - EmpireManager& manager = HumanClientApp::GetApp()->Empires(); Empire* empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) { Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2008-08-08 12:28:09 UTC (rev 2654) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2008-08-08 23:14:17 UTC (rev 2655) @@ -351,18 +351,16 @@ const int empire_id = it->first; const Empire* empire = it->second; - std::vector<int> contained_objects = m_system.FindObjectIDs(); - Logger().debugStream() << "System: " << m_system.Name() << " contained objects: "; - for (std::vector<int>::const_iterator it1 = contained_objects.begin(); it1 != contained_objects.end(); ++it1) - Logger().debugStream() << "... " << *it1; + //std::vector<int> contained_objects = m_system.FindObjectIDs(); + //Logger().debugStream() << "System: " << m_system.Name() << " contained objects: "; + //for (std::vector<int>::const_iterator it1 = contained_objects.begin(); it1 != contained_objects.end(); ++it1) + // Logger().debugStream() << "... " << *it1; - std::vector<int> fleet_IDs = m_system.FindObjectIDs(StationaryFleetVisitor(empire_id)); + //Logger().debugStream() << "System: " << m_system.Name() << " stationary fleet ids: "; + //for (std::vector<int>::const_iterator it1 = fleet_IDs.begin(); it1 != fleet_IDs.end(); ++it1) + // Logger().debugStream() << "... " << *it1; - Logger().debugStream() << "System: " << m_system.Name() << " stationary fleet ids: "; - for (std::vector<int>::const_iterator it1 = fleet_IDs.begin(); it1 != fleet_IDs.end(); ++it1) - Logger().debugStream() << "... " << *it1; - if (!fleet_IDs.empty()) { fb = new FleetButton(empire->Color(), fleet_IDs); m_stationary_fleet_markers[empire_id] = fb; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-08 12:28:09 UTC (rev 2654) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-08 23:14:17 UTC (rev 2655) @@ -166,6 +166,19 @@ fleet->SetRoute(route_pair.first, route_pair.second); } + + /** returns true of the owners of the two passed objects are the same, and both are owned, false otherwise */ + bool SameOwners(const UniverseObject* obj1, const UniverseObject* obj2) { + if (!obj1 || !obj2) return false; + + const std::set<int>& owners1 = obj1->Owners(); + const std::set<int>& owners2 = obj2->Owners(); + + int owner1 = *owners1.begin(); + int owner2 = *owners2.begin(); + + return owner1 == owner2; + } } /////////////////////////////////////////////////////////// @@ -740,10 +753,11 @@ // 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); - ExploreSystem(dest_system->ID(), target); - UpdateFleetRoute(fleet, UniverseObject::INVALID_OBJECT_ID, UniverseObject::INVALID_OBJECT_ID); // inserted into dest_system, so next and previous systems are invalid objects - + if (fleet->SystemID() != dest_system->ID()) { + dest_system->Insert(target); + ExploreSystem(dest_system->ID(), target); + UpdateFleetRoute(fleet, UniverseObject::INVALID_OBJECT_ID, UniverseObject::INVALID_OBJECT_ID); // inserted into dest_system, so next and previous systems are invalid objects + } } else { fleet->UniverseObject::MoveTo(destination); @@ -774,11 +788,24 @@ } else if (Ship* ship = universe_object_cast<Ship*>(target)) { // TODO: make sure colonization doesn't interfere with this effect, and vice versa - // if moved to a fleet, insert the ship into the fleet. otherwise, need to create a new - // fleet to put the ship into (as all ships must be in fleets) - if (Fleet* dest_fleet = universe_object_cast<Fleet*>(destination)) { - dest_fleet->AddShip(ship->ID()); // this takes care of moving the ship + Fleet* old_fleet = ship->GetFleet(); + Fleet* dest_fleet = universe_object_cast<Fleet*>(destination); // may be 0 if destination is not a fleet + bool same_owners = SameOwners(ship, destination); + int dest_sys_id = destination->SystemID(); + int ship_sys_id = ship->SystemID(); + if (dest_fleet && same_owners) { + // ship is moving to a different fleet owned by the same empire, so can be inserted into it + dest_fleet->AddShip(ship->ID()); // does nothing if fleet already contains the ship + + } else if (dest_sys_id == ship_sys_id && dest_sys_id != UniverseObject::INVALID_OBJECT_ID) { + // ship is moving to the system it is already in, but isn't being or can't be moved into a specific fleet, so the ship + // can be left in its current fleet and at its current location + + } else if (destination->X() == ship->X() && destination->Y() == ship->Y()) { + // ship is moving to the same location it's already at, but isn't being or can't be moved to a specific fleet, so the ship + // can be left in its current fleet and at its current location + } else { // need to create a new fleet for ship Fleet* new_fleet = 0; @@ -791,6 +818,9 @@ } } + if (old_fleet && old_fleet->NumShips() < 1) + universe.EffectDestroy(old_fleet->ID()); + } 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()) { Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-08-08 12:28:09 UTC (rev 2654) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-08-08 23:14:17 UTC (rev 2655) @@ -532,7 +532,14 @@ void Fleet::AddShips(const std::vector<int>& ships) { for (unsigned int i = 0; i < ships.size(); ++i) { - if (Ship* s = GetUniverse().Object<Ship>(ships[i])) { + int ship_id = ships[i]; + + if (this->Contains(ship_id)) { + Logger().debugStream() << "Fleet::AddShip this fleet " << this->Name() << " already contained ship " << ship_id; + continue; + } + + if (Ship* s = GetUniverse().Object<Ship>(ship_id)) { if (System* system = GetSystem()) { system->Insert(s); } else { @@ -540,7 +547,7 @@ s->SetSystem(SystemID()); } s->SetFleetID(ID()); - m_ships.insert(ships[i]); + m_ships.insert(ship_id); } else { throw std::invalid_argument("Fleet::AddShips() : Attempted to add an id of a non-ship object to a fleet."); } @@ -549,8 +556,13 @@ StateChangedSignal(); } -void Fleet::AddShip(const int ship_id) +void Fleet::AddShip(int ship_id) { + if (this->Contains(ship_id)) { + Logger().debugStream() << "Fleet::AddShip this fleet " << this->Name() << " already contained ship " << ship_id; + return; + } + Logger().debugStream() << "Fleet " << this->Name() << " adding ship: " << ship_id; if (Ship* s = GetUniverse().Object<Ship>(ship_id)) { if (System* system = GetSystem()) { Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2008-08-08 12:28:09 UTC (rev 2654) +++ trunk/FreeOrion/util/Order.cpp 2008-08-08 23:14:17 UTC (rev 2655) @@ -200,7 +200,11 @@ // ensure a zero-length (invalid) route is not requested / sent to a fleet if (m_route.empty()) { m_route.push_back(start_system); - m_route_length = 0.0; + const Fleet* fleet_obj = GetUniverse().Object<const Fleet>(fleet); + const System* system_obj = GetUniverse().Object<const System>(start_system); + double dist_x = system_obj->X() - fleet_obj->X(); + double dist_y = system_obj->Y() - fleet_obj->Y(); + m_route_length = std::sqrt(dist_x * dist_x + dist_y * dist_y); } #if DEBUG_FLEET_MOVE_ORDER |
From: <geo...@us...> - 2008-08-09 10:32:39
|
Revision: 2658 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2658&view=rev Author: geoffthemedio Date: 2008-08-09 10:32:45 +0000 (Sat, 09 Aug 2008) Log Message: ----------- -Fixed description in code for CreatePlanet -Added description stringtable entries for CreatePlanet and MoveTo Modified Paths: -------------- trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-09 07:49:52 UTC (rev 2657) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-09 10:32:45 UTC (rev 2658) @@ -2244,6 +2244,8 @@ DESC_SET_STAR_TYPE Changes the star's type to %1% +DESC_MOVE_TO +Moves the object to the location of an object with id that is %1% # SetTechAvailability @@ -2260,6 +2262,15 @@ Makes %1% unavailable to empire %2% +# Object Creation + +DESC_CREATE_PLANET +Creates a planet of type %1% of size %2% at the location of an object with id that is %3% + +DESC_CREATE_BUILDING +Creates a building of type %1% at the location of an object with id that is %2% + + # Conditions DESC_ALL Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-09 07:49:52 UTC (rev 2657) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-09 10:32:45 UTC (rev 2658) @@ -671,12 +671,19 @@ std::string CreatePlanet::Description() const { - return ""; + std::string type_str = ValueRef::ConstantExpr(m_type) ? UserString(lexical_cast<std::string>(m_type->Eval(0, 0))) : m_type->Description(); + std::string size_str = ValueRef::ConstantExpr(m_size) ? UserString(lexical_cast<std::string>(m_size->Eval(0, 0))) : m_size->Description(); + std::string location_str = ValueRef::ConstantExpr(m_location_id) ? GetUniverse().Object(m_location_id->Eval(0, 0))->Name() : m_location_id->Description(); + + return str(FlexibleFormat(UserString("DESC_CREATE_PLANET")) + % type_str + % size_str + % location_str); } std::string CreatePlanet::Dump() const { - return ""; + return DumpIndent() + "CreatePlanet size = " + m_size->Dump() + " type = " + m_type->Dump() + " location = " + m_location_id->Dump() + "\n"; } |
From: <geo...@us...> - 2008-08-10 02:27:28
|
Revision: 2659 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2659&view=rev Author: geoffthemedio Date: 2008-08-10 02:27:35 +0000 (Sun, 10 Aug 2008) Log Message: ----------- -Altered MoveTo effect to take a condition parameter instead of an object ID -Removed location parameter from Create* effects. Instead, new objects will be created at the location of target object(s). Modified Paths: -------------- trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/EffectParser.cpp Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-09 10:32:45 UTC (rev 2658) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-10 02:27:35 UTC (rev 2659) @@ -2245,7 +2245,7 @@ Changes the star's type to %1% DESC_MOVE_TO -Moves the object to the location of an object with id that is %1% +Moves the object to the location of an object%1% # SetTechAvailability @@ -2265,10 +2265,10 @@ # Object Creation DESC_CREATE_PLANET -Creates a planet of type %1% of size %2% at the location of an object with id that is %3% +Creates a planet of type %1% of size %2% DESC_CREATE_BUILDING -Creates a building of type %1% at the location of an object with id that is %2% +Creates a building of type %1% # Conditions Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2008-08-09 10:32:45 UTC (rev 2658) +++ trunk/FreeOrion/universe/Condition.cpp 2008-08-10 02:27:35 UTC (rev 2659) @@ -531,7 +531,7 @@ ObjectSet::const_iterator contained_it = condition_targets.begin(); ObjectSet::const_iterator contained_end = condition_targets.end(); - + if (search_domain == NON_TARGETS) { // non_targets (from_set) objects need to contain at least one condition_target to be transferred from // from_set to to_set. Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-09 10:32:45 UTC (rev 2658) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-10 02:27:35 UTC (rev 2659) @@ -618,30 +618,20 @@ /////////////////////////////////////////////////////////// // CreatePlanet // /////////////////////////////////////////////////////////// -CreatePlanet::CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size, - const ValueRef::ValueRefBase<int>* location_id) : +CreatePlanet::CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size) : m_type(type), - m_size(size), - m_location_id(location_id) + m_size(size) {} CreatePlanet::~CreatePlanet() { delete m_type; delete m_size; - delete m_location_id; } 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(); + System* location = target->GetSystem(); if (!location) { Logger().errorStream() << "CreatePlanet::Execute couldn't get a System object at which to create the planet"; return; @@ -673,17 +663,15 @@ { std::string type_str = ValueRef::ConstantExpr(m_type) ? UserString(lexical_cast<std::string>(m_type->Eval(0, 0))) : m_type->Description(); std::string size_str = ValueRef::ConstantExpr(m_size) ? UserString(lexical_cast<std::string>(m_size->Eval(0, 0))) : m_size->Description(); - std::string location_str = ValueRef::ConstantExpr(m_location_id) ? GetUniverse().Object(m_location_id->Eval(0, 0))->Name() : m_location_id->Description(); return str(FlexibleFormat(UserString("DESC_CREATE_PLANET")) % type_str - % size_str - % location_str); + % size_str); } std::string CreatePlanet::Dump() const { - return DumpIndent() + "CreatePlanet size = " + m_size->Dump() + " type = " + m_type->Dump() + " location = " + m_location_id->Dump() + "\n"; + return DumpIndent() + "CreatePlanet size = " + m_size->Dump() + " type = " + m_type->Dump() + "\n"; } @@ -809,27 +797,34 @@ /////////////////////////////////////////////////////////// -// MoveTo // +// MoveTo // /////////////////////////////////////////////////////////// -MoveTo::MoveTo(const ValueRef::ValueRefBase<int>* object_id) : - m_destination_object_id(object_id) +MoveTo::MoveTo(const Condition::ConditionBase* location_condition) : + m_location_condition(location_condition) {} MoveTo::~MoveTo() { - delete m_destination_object_id; + delete m_location_condition; } void MoveTo::Execute(const UniverseObject* source, UniverseObject* target) const { Universe& universe = GetUniverse(); - int dest_id = m_destination_object_id->Eval(source, target); - UniverseObject* destination = universe.Object(dest_id); - if (!destination) { - Logger().errorStream() << "MoveTo::Execute couldn't get destination object with specified id: " << dest_id; + + Condition::ObjectSet potential_locations; + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) + potential_locations.insert(it->second); + + Condition::ObjectSet valid_locations; + + m_location_condition->Eval(source, valid_locations, potential_locations); + + if (valid_locations.empty()) return; - } + UniverseObject* destination = *valid_locations.begin(); + 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 @@ -940,13 +935,13 @@ std::string MoveTo::Description() const { - 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(); + std::string value_str = m_location_condition->Description(); return str(FlexibleFormat(UserString("DESC_MOVE_TO")) % value_str); } std::string MoveTo::Dump() const { - return DumpIndent() + "MoveTo destination_object_id = empire = " + m_destination_object_id->Dump() + "\n"; + return DumpIndent() + "MoveTo destination = " + m_location_condition->Dump() + "\n"; } Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-09 10:32:45 UTC (rev 2658) +++ trunk/FreeOrion/universe/Effect.h 2008-08-10 02:27:35 UTC (rev 2659) @@ -239,8 +239,7 @@ class Effect::CreatePlanet : public Effect::EffectBase { public: - CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size, - const ValueRef::ValueRefBase<int>* location_id); + CreatePlanet(const ValueRef::ValueRefBase<PlanetType>* type, const ValueRef::ValueRefBase<PlanetSize>* size); virtual ~CreatePlanet(); virtual void Execute(const UniverseObject* source, UniverseObject* target) const; @@ -249,7 +248,6 @@ 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> @@ -260,7 +258,7 @@ class Effect::CreateBuilding : public Effect::EffectBase { public: - CreateBuilding(const std::string& building_type, const ValueRef::ValueRefBase<int>* location_id); + CreateBuilding(const std::string& building_type); virtual ~CreateBuilding(); virtual void Execute(const UniverseObject* source, UniverseObject* target) const; @@ -268,7 +266,6 @@ 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> @@ -311,7 +308,8 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Removes the Special with the name \a name to the target object. This has no effect if no such Special was already attached to the target object. */ +/** Removes the Special with the name \a name to the target object. This has no effect if no such Special was already + attached to the target object. */ class Effect::RemoveSpecial : public Effect::EffectBase { public: @@ -348,12 +346,12 @@ void serialize(Archive& ar, const unsigned int version); }; -/** Moves an UniverseObject to a location of another UniverseObject with id \a object_id. If there are are no objects id - that id, nothing is done. */ +/** Moves an UniverseObject to a location of another UniverseObject with id \a object_id. If there are are no objects + id that id, nothing is done. */ class Effect::MoveTo : public Effect::EffectBase { public: - MoveTo(const ValueRef::ValueRefBase<int>* object_id); + MoveTo(const Condition::ConditionBase* location_condition); virtual ~MoveTo(); virtual void Execute(const UniverseObject* source, UniverseObject* target) const; @@ -361,7 +359,7 @@ virtual std::string Dump() const; private: - const ValueRef::ValueRefBase<int>* m_destination_object_id; + const Condition::ConditionBase* m_location_condition; friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/universe/EffectParser.cpp =================================================================== --- trunk/FreeOrion/universe/EffectParser.cpp 2008-08-09 10:32:45 UTC (rev 2658) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-10 02:27:35 UTC (rev 2659) @@ -4,6 +4,7 @@ #include "ValueRefParser.h" #include "ValueRef.h" #include "Effect.h" +#include "Condition.h" using namespace boost::spirit; using namespace phoenix; @@ -52,16 +53,16 @@ member2 empire; }; - struct ObjectIDParamClosure : boost::spirit::closure<ObjectIDParamClosure, Effect::EffectBase*, ValueRef::ValueRefBase<int>*> + struct NameParamClosure : boost::spirit::closure<NameParamClosure, Effect::EffectBase*, std::string> { member1 this_; - member2 object_id; + member2 name; }; - struct NameParamClosure : boost::spirit::closure<NameParamClosure, Effect::EffectBase*, std::string> + struct ConditionParamClosure : boost::spirit::closure<ConditionParamClosure, Effect::EffectBase*, Condition::ConditionBase*> { member1 this_; - member2 name; + member2 condition; }; struct SetStarTypeClosure : boost::spirit::closure<SetStarTypeClosure, Effect::EffectBase*, ValueRef::ValueRefBase< ::StarType>*> @@ -70,6 +71,22 @@ member2 type; }; + struct CreatePlanetClosure : boost::spirit::closure<CreatePlanetClosure, Effect::EffectBase*, ValueRef::ValueRefBase< ::StarType>*, + ValueRef::ValueRefBase< ::PlanetType>*, ValueRef::ValueRefBase<int>*> + { + member1 this_; + member2 type; + member3 size; + member4 location_id; + }; + + struct CreateBuildingClosure : boost::spirit::closure<CreateBuildingClosure, Effect::EffectBase*, std::string, ValueRef::ValueRefBase<int>*> + { + member1 this_; + member2 building_type; + member3 location_id; + }; + struct SetTechAvailabilityClosure : boost::spirit::closure<SetTechAvailabilityClosure, Effect::EffectBase*, std::string, bool, bool> { member1 this_; @@ -83,9 +100,11 @@ 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, ConditionParamClosure::context_t> ConditionParamRule; typedef rule<Scanner, SetStarTypeClosure::context_t> SetStarTypeRule; + typedef rule<Scanner, CreatePlanetClosure::context_t> CreatePlanetRule; + typedef rule<Scanner, CreateBuildingClosure::context_t> CreateBuildingRule; typedef rule<Scanner, SetTechAvailabilityClosure::context_t> SetTechAvailabilityRule; SetMeterRule set_meter; @@ -94,7 +113,9 @@ SetPlanetSizeRule set_planet_size; EmpireParamRule add_owner; EmpireParamRule remove_owner; - ObjectIDParamRule move_to; + CreatePlanetRule create_planet; + CreateBuildingRule create_building; + ConditionParamRule move_to; Rule destroy; NameParamRule add_special; NameParamRule remove_special; @@ -106,7 +127,7 @@ ParamLabel planetsize_label; ParamLabel empire_label; ParamLabel name_label; - ParamLabel object_id_label; + ParamLabel destination_label; }; EffectParserDefinition::EffectParserDefinition() : @@ -115,7 +136,7 @@ planetsize_label("size"), empire_label("empire"), name_label("name"), - object_id_label("objectid") + destination_label("destination") { set_meter = ((str_p("setmax")[set_meter.max_meter = val(true)] @@ -164,10 +185,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)]; + 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)]; + >> destination_label >> condition_p[move_to.condition = arg1]) + [move_to.this_ = new_<Effect::MoveTo>(move_to.condition)]; destroy = str_p("destroy") |
From: <geo...@us...> - 2008-08-11 06:11:05
|
Revision: 2661 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2661&view=rev Author: geoffthemedio Date: 2008-08-11 06:11:14 +0000 (Mon, 11 Aug 2008) Log Message: ----------- -Added SetCapitolID function to Empire, and gave Empire m_capitol_id to keep track of its capitol separately from its homeworld, but initialized m_capitol_id with the passed homeworld id -Added SetEmpireCapitol effect and parsing -Added parsing and code skeleton for Capitol and Homeworld conditions, which currently always return false but will eventually match planets that are a capitol or a homeworld -Fixed up descriptions for various effects and added appropriate strings to stringtable Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Condition.h trunk/FreeOrion/universe/ConditionParser1.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/EffectParser.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-11 06:11:14 UTC (rev 2661) @@ -614,6 +614,7 @@ Empire::Empire() : m_id(-1), m_homeworld_id(UniverseObject::INVALID_OBJECT_ID), + m_capitol_id(UniverseObject::INVALID_OBJECT_ID), m_resource_pools(), m_population_pool(), m_food_total_distributed(0), @@ -632,6 +633,7 @@ m_player_name(player_name), m_color(color), m_homeworld_id(homeworld_id), + m_capitol_id(homeworld_id), m_resource_pools(), m_population_pool(), m_food_total_distributed(0), @@ -676,10 +678,21 @@ int Empire::CapitolID() const { - // TODO: come up with a system for changing (moving) the capitol from the homeworld to somewhere else - return m_homeworld_id; + return m_capitol_id; } +void Empire::SetCapitolID(int id) +{ + const Universe& universe = GetUniverse(); + const Planet* planet = universe.Object<Planet>(id); + if (planet) { + const std::set<int>& owners = planet->Owners(); + if (owners.size() == 1 && *owners.begin() == EmpireID()) { + m_capitol_id = id; + } + } +}; + bool Empire::ResearchableTech(const std::string& name) const { const Tech* tech = GetTech(name); Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/Empire/Empire.h 2008-08-11 06:11:14 UTC (rev 2661) @@ -320,12 +320,14 @@ //@} /** \name Mutators */ //@{ + void SetCapitolID(int id); ///< If the object with id \a id is a planet owned by this empire, sets that planet to be this empire's capitol, and otherwise does nothing + /** Adds \a tech to the research queue, placing it before position \a pos. If \a tech is already in the queue, it is moved to \a pos, then removed from its former position. If \a pos < 0 or queue.size() <= pos, \a tech is placed at the end of the queue. If \a tech is already available, no action is taken. */ void PlaceTechInQueue(const Tech* tech, int pos = -1); - void RemoveTechFromQueue(const Tech* tech); ///< Removes \a tech from the research queue, if it is in the research queue already. + void RemoveTechFromQueue(const Tech* tech); ///< Removes \a tech from the research queue, if it is in the research queue already. /** Adds the indicated build to the production queue, placing it before position \a pos. If \a pos < 0 or queue.size() <= pos, the build is placed at the end of the queue. */ @@ -469,6 +471,7 @@ std::string m_player_name; ///< Empire's Player's name GG::Clr m_color; ///< Empire's color int m_homeworld_id; ///< the ID of the empire's homeworld + int m_capitol_id; ///< the ID of the empire's capitol planet std::set<std::string> m_techs; ///< list of acquired technologies. These are string names referencing Tech objects @@ -585,6 +588,7 @@ if (Universe::ALL_OBJECTS_VISIBLE || Universe::s_encoding_empire == ALL_EMPIRES || m_id == Universe::s_encoding_empire) { ar & BOOST_SERIALIZATION_NVP(m_homeworld_id) + & BOOST_SERIALIZATION_NVP(m_capitol_id) & BOOST_SERIALIZATION_NVP(m_techs) & BOOST_SERIALIZATION_NVP(m_research_queue) & BOOST_SERIALIZATION_NVP(m_research_progress) Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-11 06:11:14 UTC (rev 2661) @@ -2220,6 +2220,9 @@ DESC_SET_EMPIRE_STOCKPILE Sets the stockpile of %1% of the object's owner to %2% +DESC_SET_EMPIRE_CAPITOL +Makes the object the object's owner's capitol planet + DESC_SET_PLANET_TYPE Changes the planet's type to %1% @@ -2265,10 +2268,10 @@ # Object Creation DESC_CREATE_PLANET -Creates a planet of type %1% of size %2% +Creates a new planet of type %1% and size %2% DESC_CREATE_BUILDING -Creates a building of type %1% +Creates a new %1% building # Conditions @@ -2300,13 +2303,24 @@ DESC_EMPIRE_AFFILIATION_EXCLUSIVE_NOT that does not belong only to an %1% of %2% empire -# this one is intentionally left empty DESC_SELF that is the source object DESC_SELF_NOT that is not the source object +DESC_HOMEWORLD + that is a homeworld + +DESC_HOMEWORLD_NOT + that is not a homeworld + +DESC_CAPITOL + that is an empire's capitol planet + +DESC_CAPITOL_NOT + that is not an empire's capitol planet + DESC_TYPE that is a %1% Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/Condition.cpp 2008-08-11 06:11:14 UTC (rev 2661) @@ -369,6 +369,54 @@ } /////////////////////////////////////////////////////////// +// Homeworld // +/////////////////////////////////////////////////////////// +Condition::Homeworld::Homeworld() +{} + +std::string Condition::Homeworld::Description(bool negated/* = false*/) const +{ + std::string description_str = "DESC_HOMEWORLD"; + if (negated) + description_str += "_NOT"; + return UserString(description_str); +} + +std::string Condition::Homeworld::Dump() const +{ + return DumpIndent() + "Homeworld\n"; +} + +bool Condition::Homeworld::Match(const UniverseObject* source, const UniverseObject* target) const +{ + return false; +} + +/////////////////////////////////////////////////////////// +// Capitol // +/////////////////////////////////////////////////////////// +Condition::Capitol::Capitol() +{} + +std::string Condition::Capitol::Description(bool negated/* = false*/) const +{ + std::string description_str = "DESC_CAPITOL"; + if (negated) + description_str += "_NOT"; + return UserString(description_str); +} + +std::string Condition::Capitol::Dump() const +{ + return DumpIndent() + "Capitol\n"; +} + +bool Condition::Capitol::Match(const UniverseObject* source, const UniverseObject* target) const +{ + return false; +} + +/////////////////////////////////////////////////////////// // Type // /////////////////////////////////////////////////////////// Condition::Type::Type(const ValueRef::ValueRefBase<UniverseObjectType>* type) : Modified: trunk/FreeOrion/universe/Condition.h =================================================================== --- trunk/FreeOrion/universe/Condition.h 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/Condition.h 2008-08-11 06:11:14 UTC (rev 2661) @@ -23,6 +23,8 @@ struct All; struct EmpireAffiliation; struct Self; + struct Homeworld; + struct Capitol; struct Type; struct Building; struct HasSpecial; @@ -171,6 +173,36 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Matches planets that are a homeworld. */ +struct Condition::Homeworld : Condition::ConditionBase +{ + Homeworld(); + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + +private: + virtual bool Match(const UniverseObject* source, const UniverseObject* target) const; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + +/** Matches planets that are an empire's capitol. */ +struct Condition::Capitol : Condition::ConditionBase +{ + Capitol(); + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + +private: + virtual bool Match(const UniverseObject* source, const UniverseObject* target) const; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Matches all objects that are of UniverseObjectType \a type. */ struct Condition::Type : Condition::ConditionBase { @@ -594,6 +626,18 @@ } template <class Archive> +void Condition::Homeworld::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase); +} + +template <class Archive> +void Condition::Capitol::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase); +} + +template <class Archive> void Condition::Type::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) Modified: trunk/FreeOrion/universe/ConditionParser1.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser1.cpp 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/ConditionParser1.cpp 2008-08-11 06:11:14 UTC (rev 2661) @@ -117,6 +117,8 @@ Rule all; OwnedByRule owned_by; Rule source; + Rule homeworld; + Rule capitol; NameParamRule building; PlanetTypeRule planet_type; PlanetSizeRule planet_size; @@ -145,6 +147,14 @@ str_p("source") [source.this_ = new_<Condition::Self>()]; + homeworld = + str_p("homeworld") + [homeworld.this_ = new_<Condition::Homeworld>()]; + + capitol = + str_p("capitol") + [capitol.this_ = new_<Condition::Capitol>()]; + building = (str_p("building") >> name_label >> name_p[building.name = arg1]) Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-11 06:11:14 UTC (rev 2661) @@ -476,6 +476,33 @@ /////////////////////////////////////////////////////////// +// SetEmpireCapitol // +/////////////////////////////////////////////////////////// +SetEmpireCapitol::SetEmpireCapitol() +{} + +void SetEmpireCapitol::Execute(const UniverseObject* source, UniverseObject* target) const +{ + if (const Planet* planet = universe_object_cast<const Planet*>(target)) { // verify that target object is a planet + const std::set<int>& owners = planet->Owners(); // get owner(s) + if (owners.size() == 1) // verify that there is only a single owner + if (Empire* empire = Empires().Lookup(*owners.begin())) // get that owner empire object + empire->SetCapitolID(planet->ID()); // make target planet the capitol of its owner empire + } +} + +std::string SetEmpireCapitol::Description() const +{ + return UserString("DESC_SET_EMPIRE_CAPITOL"); +} + +std::string SetEmpireCapitol::Dump() const +{ + return DumpIndent() + "SetEmpireCapitol\n"; +} + + +/////////////////////////////////////////////////////////// // SetPlanetType // /////////////////////////////////////////////////////////// SetPlanetType::SetPlanetType(const ValueRef::ValueRefBase<PlanetType>* type) : @@ -688,12 +715,13 @@ std::string CreateBuilding::Description() const { - return "!"; + return str(FlexibleFormat(UserString("DESC_CREATE_BUILDING")) + % UserString(m_type)); } std::string CreateBuilding::Dump() const { - return "@$"; + return DumpIndent() + "CreateBuilding type = " + m_type + "\n"; } Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/Effect.h 2008-08-11 06:11:14 UTC (rev 2661) @@ -23,6 +23,7 @@ class EffectBase; class SetMeter; class SetEmpireStockpile; + class SetEmpireCapitol; class SetPlanetType; class SetPlanetSize; class AddOwner; @@ -154,6 +155,23 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Makes the target planet the capitol of its owner's empire. If the target object is not a planet, does not have an owner, + or has more than one owner the effect does nothing. */ +class Effect::SetEmpireCapitol : public Effect::EffectBase +{ +public: + SetEmpireCapitol(); + + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual std::string Description() const; + virtual std::string Dump() const; + +private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Sets the planet type of the target to \a type. This has no effect on non-Planet targets. Note that changing the type of a PT_ASTEROID or PT_GASGIANT planet will also change its size to SZ_TINY or SZ_HUGE, respectively. Similarly, changing type to PT_ASTEROID or PT_GASGIANT will also cause the size to change to SZ_ASTEROID or @@ -441,6 +459,12 @@ } template <class Archive> +void Effect::SetEmpireCapitol::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase); +} + +template <class Archive> void Effect::SetPlanetType::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-11 04:13:37 UTC (rev 2660) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-11 06:11:14 UTC (rev 2661) @@ -107,6 +107,7 @@ SetMeterRule set_meter; SetOwnerStockpileRule set_owner_stockpile; + Rule set_owner_capitol; SetPlanetTypeRule set_planet_type; SetPlanetSizeRule set_planet_size; EmpireParamRule add_owner; @@ -163,6 +164,10 @@ >> value_label >> double_expr_p[set_owner_stockpile.value = arg1]) [set_owner_stockpile.this_ = new_<Effect::SetEmpireStockpile>(set_owner_stockpile.stockpile_type, set_owner_stockpile.value)]; + set_owner_capitol = + str_p("setownercapitol") + [set_owner_capitol.this_ = new_<Effect::SetEmpireCapitol>()]; + set_planet_type = (str_p("setplanettype") >> type_label >> planettype_expr_p[set_planet_type.type = arg1]) |
From: <geo...@us...> - 2008-08-13 08:07:22
|
Revision: 2662 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2662&view=rev Author: geoffthemedio Date: 2008-08-13 08:07:30 +0000 (Wed, 13 Aug 2008) Log Message: ----------- -Comitted Homeworld and Capitol condition matching code, which I apparently forgot to last time...? -Fixed BuildType enum names that were exposed to Python -Restricted displayed axial tilts for planets to minimize the appearance of graphical artefacts, some what fixing [ 2008042 ] Planet 3D render problem Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/python/PythonEnumWrapper.cpp trunk/FreeOrion/universe/Condition.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2008-08-11 06:11:14 UTC (rev 2661) +++ trunk/FreeOrion/UI/SidePanel.cpp 2008-08-13 08:07:30 UTC (rev 2662) @@ -505,7 +505,7 @@ { GG::Pt ul = UpperLeft(), lr = LowerRight(); // these values ensure that wierd GLUT-sphere artifacts do not show themselves - double axial_tilt = std::max(-75.0, std::min(static_cast<double>(m_planet.AxialTilt()), 88.0)); + double axial_tilt = std::max(-30.0, std::min(static_cast<double>(m_planet.AxialTilt()), 60.0)); RenderPlanet(ul + GG::Pt(Width() / 2, Height() / 2), Width(), m_surface_texture, m_initial_rotation, 1.0 / m_planet.RotationalPeriod(), axial_tilt, m_planet_data.shininess, m_star_type); if (m_atmosphere_texture) { Modified: trunk/FreeOrion/python/PythonEnumWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonEnumWrapper.cpp 2008-08-11 06:11:14 UTC (rev 2661) +++ trunk/FreeOrion/python/PythonEnumWrapper.cpp 2008-08-13 08:07:30 UTC (rev 2662) @@ -54,8 +54,8 @@ .value("complete", TS_COMPLETE) ; enum_<BuildType>("buildType") - .value("unresearchable", BT_BUILDING) - .value("researchable", BT_SHIP) + .value("building", BT_BUILDING) + .value("ship", BT_SHIP) ; enum_<ResourceType>("resourceType") .value("food", RE_FOOD) Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2008-08-11 06:11:14 UTC (rev 2661) +++ trunk/FreeOrion/universe/Condition.cpp 2008-08-13 08:07:30 UTC (rev 2662) @@ -389,6 +389,12 @@ bool Condition::Homeworld::Match(const UniverseObject* source, const UniverseObject* target) const { + // check if any empire's homeworld's ID is that target object's id. if it is, the target object is a homeworld. + int target_id = target->ID(); + const EmpireManager& empires = Empires(); + for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) + if (it->second->HomeworldID() == target_id) + return true; return false; } @@ -413,6 +419,12 @@ bool Condition::Capitol::Match(const UniverseObject* source, const UniverseObject* target) const { + // check if any empire's capitol's ID is that target object's id. if it is, the target object is a capitol. + int target_id = target->ID(); + const EmpireManager& empires = Empires(); + for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) + if (it->second->CapitolID() == target_id) + return true; return false; } |
From: <geo...@us...> - 2008-08-17 22:11:04
|
Revision: 2664 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2664&view=rev Author: geoffthemedio Date: 2008-08-17 22:11:12 +0000 (Sun, 17 Aug 2008) Log Message: ----------- -Stripped out most of the victory / defeat checking in the server turn processing. Partially replaced with a check if a player is victorious, which just sends out notification messages, but doesn't end the game. Currently players can't win just by killing off all opponents, but this will be added back later. -Reworked victory and defeat messages into a separate type so that victory and defeat can be announced without ending the game. This allows continued sandbox play after defeating enemies, and in combination with the previous point, makes a distinction between a player being eliminated and a player being defeated or being victorious... Neither defeat should not necessarily mean elimination. -Added a Victory effect and parser for it, allowing effects to give a player victory. This lets techs or buildings (or anything) give victory, and is currently the only way to achieve victory (just killing all enemies doesn't do it, at present) -Tweaked the server FSM to appropriately respond to new VICTORY_DEFEAT message type, and also to store and retrieve the set of previously-victorious empires in saved games. -TODO: re-add elimination of fully-defeated players. Just being defeated or having another empire be victorious doesn't end the game now, but losing all planets and ships should eliminate players for the next few versions, and perhaps indefinitely unless diplomacy is able to overcome a player losing everything. The ServerFSM alterations and related ServerApp changes might not be done in the best manner, as I was previously not familiar with this code. Unless I missed something, I think it makes sense now, however. Modified Paths: -------------- trunk/FreeOrion/AI/AIInterface.cpp trunk/FreeOrion/Empire/EmpireManager.h trunk/FreeOrion/client/ClientFSMEvents.h trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/client/human/HumanClientFSM.cpp trunk/FreeOrion/client/human/HumanClientFSM.h trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/network/Message.cpp trunk/FreeOrion/network/Message.h trunk/FreeOrion/server/SaveLoad.cpp trunk/FreeOrion/server/SaveLoad.h trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h trunk/FreeOrion/server/ServerFSM.cpp trunk/FreeOrion/server/ServerFSM.h trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/EffectParser.cpp trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/AI/AIInterface.cpp =================================================================== --- trunk/FreeOrion/AI/AIInterface.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/AI/AIInterface.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -270,8 +270,8 @@ const Universe& universe = AIClientApp::GetApp()->GetUniverse(); int empire_id = AIClientApp::GetApp()->EmpireID(); const Ship* ship = 0; - - // make sure all ships exist and are owned just by this player + + // make sure all ships exist and are owned just by this player for (std::vector<int>::const_iterator it = ship_ids.begin(); it != ship_ids.end(); ++it) { ship = universe.Object<Ship>(*it); if (!ship) { Modified: trunk/FreeOrion/Empire/EmpireManager.h =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/Empire/EmpireManager.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -64,7 +64,7 @@ bool EliminateEmpire(int id); private: - std::map<int, Empire*> m_empire_map; + std::map<int, Empire*> m_empire_map; friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/client/ClientFSMEvents.h =================================================================== --- trunk/FreeOrion/client/ClientFSMEvents.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/client/ClientFSMEvents.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -38,6 +38,7 @@ (CombatRoundUpdate) \ (CombatEnd) \ (PlayerChat) \ + (VictoryDefeat) \ (PlayerEliminated) \ (EndGame) Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -535,6 +535,7 @@ case Message::COMBAT_ROUND_UPDATE: m_fsm->process_event(CombatRoundUpdate(msg)); break; case Message::COMBAT_END: m_fsm->process_event(CombatEnd(msg)); break; case Message::HUMAN_PLAYER_CHAT: m_fsm->process_event(PlayerChat(msg)); break; + case Message::VICTORY_DEFEAT : m_fsm->process_event(VictoryDefeat(msg)); break; case Message::PLAYER_ELIMINATED: m_fsm->process_event(PlayerEliminated(msg)); break; case Message::END_GAME: m_fsm->process_event(::EndGame(msg)); break; default: Modified: trunk/FreeOrion/client/human/HumanClientFSM.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientFSM.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/client/human/HumanClientFSM.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -302,6 +302,23 @@ return transit<IntroMenu>(); } +boost::statechart::result PlayingGame::react(const VictoryDefeat& msg) +{ + if (TRACE_EXECUTION) Logger().debugStream() << "(HumanClientFSM) PlayingGame.VictoryDefeat"; + Message::VictoryOrDefeat victory_or_defeat; + std::string reason_string; + int empire_id; + ExtractMessageData(msg.m_message, victory_or_defeat, reason_string, empire_id); + + const Empire* empire = Empires().Lookup(empire_id); + std::string empire_name = UserString("UNKNOWN_EMPIRE"); + if (empire) + empire_name = empire->Name(); + + ClientUI::MessageBox(boost::io::str(FlexibleFormat(UserString(reason_string)) % empire_name)); + return discard_event(); +} + boost::statechart::result PlayingGame::react(const PlayerEliminated& msg) { if (TRACE_EXECUTION) Logger().debugStream() << "(HumanClientFSM) PlayingGame.PlayerEliminated"; @@ -329,16 +346,12 @@ reason_message = boost::io::str(boost::format(UserString("PLAYER_DISCONNECTED")) % reason_player_name); error = true; break; - case Message::YOU_ARE_DEFEATED: + case Message::YOU_ARE_ELIMINATED: if (Client().PlayerID() == Networking::HOST_PLAYER_ID) Client().m_server_process.Free(); Client().EndGame(true); reason_message = UserString("PLAYER_DEFEATED"); break; - case Message::LAST_OPPONENT_DEFEATED: - Client().EndGame(true); - reason_message = UserString("PLAYER_VICTORIOUS"); - break; } ClientUI::MessageBox(reason_message, error); ClientUI::MessageBox(UserString("SERVER_GAME_END")); Modified: trunk/FreeOrion/client/human/HumanClientFSM.h =================================================================== --- trunk/FreeOrion/client/human/HumanClientFSM.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/client/human/HumanClientFSM.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -291,6 +291,7 @@ typedef boost::mpl::list< boost::statechart::custom_reaction<Disconnection>, + boost::statechart::custom_reaction<VictoryDefeat>, boost::statechart::custom_reaction<PlayerEliminated>, boost::statechart::custom_reaction<EndGame>, boost::statechart::custom_reaction<ResetToIntroMenu> @@ -300,6 +301,7 @@ ~PlayingGame(); boost::statechart::result react(const Disconnection& d); + boost::statechart::result react(const VictoryDefeat& msg); boost::statechart::result react(const PlayerEliminated& msg); boost::statechart::result react(const EndGame& msg); boost::statechart::result react(const ResetToIntroMenu& msg); @@ -320,6 +322,7 @@ boost::statechart::custom_reaction<CombatStart>, boost::statechart::custom_reaction<GameStart>, boost::statechart::custom_reaction<SaveGame>, + boost::statechart::deferral<VictoryDefeat>, boost::statechart::deferral<PlayerEliminated>, boost::statechart::deferral<PlayerChat> > reactions; Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-17 22:11:12 UTC (rev 2664) @@ -48,6 +48,42 @@ NO No +EMPIRE +Empire + +ALL +All + +UNKNOWN_SYSTEM +Unknown System + +RENAME +Rename + +ENTER_NEW_NAME +Enter new name + +UNKNOWN_VALUE_SYMBOL +? + +ERROR +ERROR + +CHAT_WHISPER +whisper + +# used to generate names for new fleets when they are created +NEW_FLEET_NAME +New Fleet %1% + +NEW_FLEET_NAME_NO_NUMBER +New Fleet + + +########################## +# Status Update Messages # +########################## + NEW_GAME Generating Universe and AIs ... @@ -74,43 +110,15 @@ PLAYER_DEFEATED You are defeated. -PLAYER_VICTORIOUS -You are victorious. - -EMPIRE -Empire - EMPIRE_DEFEATED The %1% empire is no more. -ALL -All +UNKNOWN_EMPIRE +Unknown Empire -UNKNOWN_SYSTEM -Unknown System +LAST_OPPONENT_DEFEATED_VICTORY +Your last opponent has been defeated and you are victorious! -RENAME -Rename - -ENTER_NEW_NAME -Enter new name - -UNKNOWN_VALUE_SYMBOL -? - -ERROR -ERROR - -CHAT_WHISPER -whisper - -# used to generate names for new fleets when they are created -NEW_FLEET_NAME -New Fleet %1% - -NEW_FLEET_NAME_NO_NUMBER -New Fleet - ###################################### # Command Line and OptionsDB Options # ###################################### @@ -1507,48 +1515,7 @@ DESIGN_WND_CLEAR Clear Parts -# Ship Slot Types -SL_EXTERNAL -External - -SL_INTERNAL -Internal - - -# Ship Part Classes - -PC_SHORT_RANGE -Short Range - -PC_MISSILES -Missiles - -PC_FIGHTERS -Fighters - -PC_POINT_DEFENSE -Point Defense - -PC_SHIELD -Shields - -PC_ARMOUR -Armour - -PC_DETECTION -Detection - -PC_STEALTH -Stealth - -PC_FUEL -Fuel - -PC_COLONY -Colonization - - #################### # Encyclopedia # #################### @@ -1945,6 +1912,7 @@ UIT_SHIP_HULL Ship Hull + # TechTypes TT_THEORY @@ -1977,7 +1945,38 @@ trade +# Ship Slot Types +SL_EXTERNAL +External +SL_INTERNAL +Internal + + +# Ship Part Classes + +PC_SHORT_RANGE +Short Range +PC_MISSILES +Missiles +PC_FIGHTERS +Fighters +PC_POINT_DEFENSE +Point Defense +PC_SHIELD +Shields +PC_ARMOUR +Armour +PC_DETECTION +Detection +PC_STEALTH +Stealth +PC_FUEL +Fuel +PC_COLONY +Colonization + + ################################################ # ValueRef, Effect, and Condition Descriptions # ################################################ @@ -2250,6 +2249,9 @@ DESC_MOVE_TO Moves the object to the location of an object%1% +DESC_VICTORY +Causes the object's owner to win the game + # SetTechAvailability DESC_TECH_AND_ITEMS_AFFECTED Modified: trunk/FreeOrion/network/Message.cpp =================================================================== --- trunk/FreeOrion/network/Message.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/network/Message.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -339,22 +339,6 @@ return Message(Message::JOIN_GAME, -1, player_id, "ACK"); } -Message EndGameMessage(int receiver, Message::EndGameReason reason, const std::string& reason_player_name/* = ""*/) -{ - std::ostringstream os; - { - FREEORION_OARCHIVE_TYPE oa(os); - oa << BOOST_SERIALIZATION_NVP(reason) - << BOOST_SERIALIZATION_NVP(reason_player_name); - } - return Message(Message::END_GAME, -1, receiver, os.str()); -} - -Message VictoryMessage(int receiver) -{ - return Message(Message::END_GAME, -1, receiver, "VICTORY"); -} - Message TurnOrdersMessage(int sender, const OrderSet& orders) { std::ostringstream os; @@ -474,6 +458,18 @@ return Message(Message::HUMAN_PLAYER_CHAT, sender, receiver, msg); } +Message VictoryDefeatMessage(int receiver, Message::VictoryOrDefeat victory_or_defeat, const std::string& reason_string, int empire_id) +{ + std::ostringstream os; + { + FREEORION_OARCHIVE_TYPE oa(os); + oa << BOOST_SERIALIZATION_NVP(victory_or_defeat) + << BOOST_SERIALIZATION_NVP(reason_string) + << BOOST_SERIALIZATION_NVP(empire_id); + } + return Message(Message::VICTORY_DEFEAT, -1, receiver, os.str()); +} + Message PlayerEliminatedMessage(int receiver, int empire_id, const std::string& empire_name) { std::ostringstream os; @@ -485,7 +481,19 @@ return Message(Message::PLAYER_ELIMINATED, -1, receiver, os.str()); } +Message EndGameMessage(int receiver, Message::EndGameReason reason, const std::string& reason_player_name/* = ""*/) +{ + std::ostringstream os; + { + FREEORION_OARCHIVE_TYPE oa(os); + oa << BOOST_SERIALIZATION_NVP(reason) + << BOOST_SERIALIZATION_NVP(reason_player_name); + } + return Message(Message::END_GAME, -1, receiver, os.str()); +} + + //////////////////////////////////////////////// // Multiplayer Lobby Message named ctors //////////////////////////////////////////////// @@ -698,3 +706,18 @@ throw; } } + +void ExtractMessageData(const Message& msg, Message::VictoryOrDefeat& victory_or_defeat, std::string& reason_string, int& empire_id) +{ + try { + std::istringstream is(msg.Text()); + FREEORION_IARCHIVE_TYPE ia(is); + ia >> BOOST_SERIALIZATION_NVP(victory_or_defeat) + >> BOOST_SERIALIZATION_NVP(reason_string) + >> BOOST_SERIALIZATION_NVP(empire_id); + } catch (const boost::archive::archive_exception &e) { + std::cerr << "ExtractMessageData(const Message& msg, Message::VictoryOrDefeat victory_or_defeat, std::string& reason_string, int& empire_id) failed! " + << "Message:\n" << msg.Text() << std::endl; + throw; + } +} Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/network/Message.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -56,11 +56,12 @@ COMBAT_ROUND_UPDATE, ///< sent to clients when a combat round has been resolved COMBAT_END, ///< sent to clients when a combat is concluded HUMAN_PLAYER_CHAT, ///< sent when one player sends a chat message to another in multiplayer - PLAYER_ELIMINATED, ///< sent to all clients (except the eliminated player) when a player is eliminated from play REQUEST_NEW_OBJECT_ID, ///< sent by client to server requesting a new object ID. DISPATCH_NEW_OBJECT_ID, ///< sent by server to client with the new object ID. REQUEST_NEW_DESIGN_ID, ///< sent by client to server requesting a new design ID. DISPATCH_NEW_DESIGN_ID, ///< sent by server to client with the new design ID. + VICTORY_DEFEAT, ///< sent by server to all clients when one or more players have met victory or defeat conditions + PLAYER_ELIMINATED, ///< sent by server to all clients (except the eliminated player) when a player is eliminated END_GAME ///< sent by the server when the current game is to ending (see EndGameReason for the possible reasons this message is sent out) }; @@ -76,10 +77,14 @@ enum EndGameReason { HOST_DISCONNECTED, ///< the host player suddenly lost connection to the server NONHOST_DISCONNECTED, ///< a non-host player suddenly lost connection to the server - YOU_ARE_DEFEATED, ///< the receiving player is defeated - LAST_OPPONENT_DEFEATED ///< all the receiving player's opponents are defeated; the receiver has won + YOU_ARE_ELIMINATED ///< the receiving player is eliminated from the game }; + enum VictoryOrDefeat { + VICTORY, ///< a player or players have met a victory condition + DEFEAT ///< a player or players have met a defeat condition + }; + /** \name Structors */ //@{ Message(); ///< Default ctor. @@ -178,14 +183,6 @@ should only be sent by the server.*/ Message JoinAckMessage(int player_id); -/** creates an END_GAME message used to terminate an active game. Only END_GAME messages sent from the server are - considered valid.*/ -Message EndGameMessage(int receiver, Message::EndGameReason reason, const std::string& reason_player_name = ""); - -/** creates an END_GAME message indicating that the recipient has won the game. This message should only be sent by the - server.*/ -Message VictoryMessage(int receiver); - /** creates an TURN_ORDERS message. */ Message TurnOrdersMessage(int sender, const OrderSet& orders); @@ -229,11 +226,23 @@ /** creates a CHAT_MSG, which is sent to the server, and then from the server to a single recipient player */ Message SingleRecipientChatMessage(int sender, int receiver, const std::string& msg); -/** creates a PLAYER_ELIMINATED message, which is sent to all clients when a client is eliminated from play. +/** creates a VICTORY_DEFEAT message indicating that the recipient has won the game by meeting a victory condition. + The \a reason_string should be a stringtable entry name, not a human-readable string, so that each + player's client can look up and display a victory message in the player's selected language. The + \a winner_empire_ids and \a winner_empire_names should contain the names and ids of all empires that have + won; this will contain only a single empire if it has won alone, but could contain multiple empires if + an allied victory has occured. This message should only be sent by the server.*/ +Message VictoryDefeatMessage(int receiver, Message::VictoryOrDefeat victory_or_defeat, const std::string& reason_string, int empire_id); + +/** creates a PLAYER_ELIMINATED message, which is sent to all clients when a client is eliminated from play. This message should only be sent by the server.*/ Message PlayerEliminatedMessage(int receiver, int empire_id, const std::string& empire_name); +/** creates an END_GAME message used to terminate an active game. Only END_GAME messages sent from the server + are considered valid.*/ +Message EndGameMessage(int receiver, Message::EndGameReason reason, const std::string& reason_player_name = ""); + //////////////////////////////////////////////// // Multiplayer Lobby Message named ctors //////////////////////////////////////////////// @@ -293,4 +302,6 @@ void ExtractMessageData(const Message& msg, int& empire_id, std::string& empire_name); +void ExtractMessageData(const Message& msg, Message::VictoryOrDefeat& victory_or_defeat, std::string& reason_string, int& empire_id); + #endif // _Message_h_ Modified: trunk/FreeOrion/server/SaveLoad.cpp =================================================================== --- trunk/FreeOrion/server/SaveLoad.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/SaveLoad.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -21,21 +21,21 @@ #include <fstream> -void SaveGame(const std::string& filename, int current_turn, const std::vector<PlayerSaveGameData>& player_save_game_data, const Universe& universe) +void SaveGame(const std::string& filename, const ServerSaveGameData& server_save_game_data, const std::vector<PlayerSaveGameData>& player_save_game_data, const Universe& universe) { std::ofstream ofs(filename.c_str(), std::ios_base::binary); FREEORION_OARCHIVE_TYPE oa(ofs); - oa << BOOST_SERIALIZATION_NVP(current_turn); + oa << BOOST_SERIALIZATION_NVP(server_save_game_data); Universe::s_encoding_empire = ALL_EMPIRES; oa << BOOST_SERIALIZATION_NVP(player_save_game_data); Serialize(oa, universe); } -void LoadGame(const std::string& filename, int& current_turn, std::vector<PlayerSaveGameData>& player_save_game_data, Universe& universe) +void LoadGame(const std::string& filename, ServerSaveGameData& server_save_game_data, std::vector<PlayerSaveGameData>& player_save_game_data, Universe& universe) { std::ifstream ifs(filename.c_str(), std::ios_base::binary); FREEORION_IARCHIVE_TYPE ia(ifs); - ia >> BOOST_SERIALIZATION_NVP(current_turn); + ia >> BOOST_SERIALIZATION_NVP(server_save_game_data); Universe::s_encoding_empire = ALL_EMPIRES; ia >> BOOST_SERIALIZATION_NVP(player_save_game_data); Deserialize(ia, universe); Modified: trunk/FreeOrion/server/SaveLoad.h =================================================================== --- trunk/FreeOrion/server/SaveLoad.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/SaveLoad.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -6,12 +6,15 @@ #include <string> class PlayerSaveGameData; +class ServerSaveGameData; class Universe; /** Saves the provided data to savefile \a filename. */ -void SaveGame(const std::string& filename, int current_turn, const std::vector<PlayerSaveGameData>& player_save_game_data, const Universe& universe); +void SaveGame(const std::string& filename, const ServerSaveGameData& server_save_game_data, + const std::vector<PlayerSaveGameData>& player_save_game_data, const Universe& universe); /** Loads the indicated data from savefile \a filename. */ -void LoadGame(const std::string& filename, int& current_turn, std::vector<PlayerSaveGameData>& player_save_game_data, Universe& universe); +void LoadGame(const std::string& filename, ServerSaveGameData& server_save_game_data, + std::vector<PlayerSaveGameData>& player_save_game_data, Universe& universe); #endif Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -48,7 +48,19 @@ m_save_state_string(save_state_string) {} +//////////////////////////////////////////////// +// ServerSaveGameData +//////////////////////////////////////////////// +ServerSaveGameData::ServerSaveGameData() : + m_current_turn(-1), + m_victors() +{} +ServerSaveGameData::ServerSaveGameData(const int& current_turn, const std::set<int>& victors) : + m_current_turn(current_turn), + m_victors(victors) +{} + //////////////////////////////////////////////// // ServerApp //////////////////////////////////////////////// @@ -227,7 +239,7 @@ NewGameInit(setup_data->m_size, setup_data->m_shape, setup_data->m_age, setup_data->m_starlane_freq, setup_data->m_planet_density, setup_data->m_specials_freq, player_setup_data); } -void ServerApp::LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data) +void ServerApp::LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data, boost::shared_ptr<ServerSaveGameData> server_save_game_data) { std::set<int> unused_save_game_data; std::map<int, int> player_id_to_save_game_data_index; @@ -240,7 +252,7 @@ else unused_save_game_data.insert(i); } - LoadGameInit(player_save_game_data, player_id_to_save_game_data_index, unused_save_game_data); + LoadGameInit(player_save_game_data, player_id_to_save_game_data_index, unused_save_game_data, server_save_game_data); } void ServerApp::NewGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data) @@ -248,7 +260,7 @@ NewGameInit(lobby_data->m_size, lobby_data->m_shape, lobby_data->m_age, lobby_data->m_starlane_freq, lobby_data->m_planet_density, lobby_data->m_specials_freq, lobby_data->m_players); } -void ServerApp::LoadGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data, const std::vector<PlayerSaveGameData>& player_save_game_data) +void ServerApp::LoadGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data, const std::vector<PlayerSaveGameData>& player_save_game_data, boost::shared_ptr<ServerSaveGameData> server_save_game_data) { // multiplayer load std::set<int> used_save_game_data; @@ -270,7 +282,7 @@ unused_save_game_data.insert(i); } - LoadGameInit(player_save_game_data, player_id_to_save_game_data_index, unused_save_game_data); + LoadGameInit(player_save_game_data, player_id_to_save_game_data_index, unused_save_game_data, server_save_game_data); } void ServerApp::NewGameInit(int size, Shape shape, Age age, StarlaneFrequency starlane_freq, PlanetDensity planet_density, SpecialsFrequency specials_freq, @@ -278,6 +290,9 @@ { m_turn_sequence.clear(); + m_victors.clear(); + m_eliminated_players.clear(); + m_current_turn = BEFORE_FIRST_TURN; // every UniverseObject created before game starts will have m_created_on_turn BEFORE_FIRST_TURN m_universe.CreateUniverse(size, shape, age, starlane_freq, planet_density, specials_freq, m_networking.NumPlayers() - m_ai_clients.size(), m_ai_clients.size(), player_setup_data); @@ -304,18 +319,21 @@ int empire_id = GetPlayerEmpire(player_id)->EmpireID(); (*it)->SendMessage(GameStartMessage(player_id, m_single_player_game, empire_id, m_current_turn, m_empires, m_universe, players)); } - - m_losers.clear(); } void ServerApp::LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data, const std::map<int, int>& player_id_to_save_game_data_index, - std::set<int>& unused_save_game_data) + std::set<int>& unused_save_game_data, boost::shared_ptr<ServerSaveGameData> server_save_game_data) { assert(!player_save_game_data.empty()); m_turn_sequence.clear(); + m_victors = server_save_game_data->m_victors; + m_eliminated_players.clear(); + + m_current_turn = server_save_game_data->m_current_turn; + assert(m_networking.NumPlayers() == player_save_game_data.size()); assert(player_id_to_save_game_data_index.size() + unused_save_game_data.size() == player_save_game_data.size()); @@ -378,8 +396,6 @@ players, *orders, ui_data.get())); } } - - m_losers.clear(); } Empire* ServerApp::GetPlayerEmpire(int player_id) const @@ -441,6 +457,7 @@ Empire* empire; OrderSet* order_set; OrderSet::const_iterator order_it; + Universe& universe = GetUniverse(); // Now all orders, then process turns for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { @@ -485,7 +502,7 @@ // 2.a - if only one empire which tries to colonize (empire who don't are ignored) is armed, this empire wins the race // 2.b - if more than one empire is armed or all forces are unarmed, no one can colonize the planet for (ColonizeOrderMap::iterator it = colonize_order_map.begin(); it != colonize_order_map.end(); ++it) { - Planet *planet = GetUniverse().Object<Planet>(it->first); + Planet *planet = universe.Object<Planet>(it->first); // only one empire? if (it->second.size()==1) { @@ -493,13 +510,13 @@ empire = Empires().Lookup( it->second[0]->EmpireID() ); empire->AddSitRepEntry(CreatePlanetColonizedSitRep(planet->SystemID(), planet->ID())); } else { - const System *system = GetUniverse().Object<System>(planet->SystemID()); + const System *system = universe.Object<System>(planet->SystemID()); std::vector<const Fleet*> vec_fleet = system->FindObjects<Fleet>(); std::set<int> set_empire_with_military; for (unsigned int i=0;i<vec_fleet.size();i++) for (Fleet::const_iterator ship_it=vec_fleet[i]->begin();ship_it!=vec_fleet[i]->end();++ship_it) - if (GetUniverse().Object<Ship>(*ship_it)->IsArmed()) { + if (universe.Object<Ship>(*ship_it)->IsArmed()) { set_empire_with_military.insert(*vec_fleet[i]->Owners().begin()); break; } @@ -542,9 +559,9 @@ (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::FLEET_MOVEMENT, -1)); } - for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { // save for possible SitRep generation after moving... - const Fleet* fleet = GetUniverse().Object<Fleet>(it->first); + const Fleet* fleet = universe.Object<Fleet>(it->first); int eta = -1; if (fleet) eta = fleet->ETA().first; @@ -557,7 +574,10 @@ std::set<int> owners_set = fleet->Owners(); for (std::set<int>::const_iterator owners_it = owners_set.begin(); owners_it != owners_set.end(); ++owners_it) { empire = Empires().Lookup( *owners_it ); - empire->AddSitRepEntry(CreateFleetArrivedAtDestinationSitRep(fleet->SystemID(), fleet->ID())); + if (empire) + empire->AddSitRepEntry(CreateFleetArrivedAtDestinationSitRep(fleet->SystemID(), fleet->ID())); + else + Logger().errorStream() << "ServerApp::ProcessTurns couldn't find empire with id " << *owners_it << " to send a fleet arrival sitrep to for fleet " << fleet->ID(); } } } @@ -568,22 +588,22 @@ (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::COMBAT, -1)); } - std::vector<System*> sys_vec = GetUniverse().FindObjects<System>(); + std::vector<System*> sys_vec = universe.FindObjects<System>(); bool combat_happend = false; for (std::vector<System*>::iterator it = sys_vec.begin(); it != sys_vec.end(); ++it) { std::vector<CombatAssets> empire_combat_forces; System* system = *it; std::vector<Fleet*> flt_vec = system->FindObjects<Fleet>(); - if (flt_vec.empty()) continue; // skip systems with not fleets, as these can't have combat + if (flt_vec.empty()) continue; // skip systems with no fleets, as these can't have combat for (std::vector<Fleet*>::iterator flt_it = flt_vec.begin();flt_it != flt_vec.end(); ++flt_it) { Fleet* flt = *flt_it; // a fleet should belong only to one empire!? - if (1==flt->Owners().size()) { + if (1 == flt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*flt->Owners().begin()))); - if (ecf_it==empire_combat_forces.end()) { + if (ecf_it == empire_combat_forces.end()) { CombatAssets ca(Empires().Lookup(*flt->Owners().begin())); ca.fleets.push_back(flt); empire_combat_forces.push_back(ca); @@ -596,23 +616,23 @@ for (std::vector<Planet*>::iterator plt_it = plt_vec.begin();plt_it != plt_vec.end(); ++plt_it) { Planet* plt = *plt_it; // a planet should belong only to one empire!? - if (1==plt->Owners().size()) { + if (1 == plt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*plt->Owners().begin()))); if (ecf_it==empire_combat_forces.end()) { CombatAssets ca(Empires().Lookup(*plt->Owners().begin())); ca.planets.push_back(plt); empire_combat_forces.push_back(ca); - } - else + } else { (*ecf_it).planets.push_back(plt); + } } } if (empire_combat_forces.size() > 1) { combat_happend=true; CombatSystem combat_system; - combat_system.ResolveCombat(system->ID(),empire_combat_forces); + combat_system.ResolveCombat(system->ID(), empire_combat_forces); } } @@ -628,7 +648,7 @@ // execute all effects and update meters prior to production, research, etc. - GetUniverse().ApplyAllEffectsAndUpdateMeters(); + universe.ApplyAllEffectsAndUpdateMeters(); // Determine how much of each resource is available, and determine how to distribute it to planets or on queues @@ -656,13 +676,13 @@ // re-execute all meter-related effects after production, so that new UniverseObjects created during production // will have effects applied to them this turn, allowing (for example) ships to have max fuel meters greater than // 0 on the turn they are created. - GetUniverse().ApplyMeterEffectsAndUpdateMeters(); + universe.ApplyMeterEffectsAndUpdateMeters(); // regenerate empire system visibility, which is needed for some UniverseObject subclasses' PopGrowthProductionResearchPhase() - GetUniverse().RebuildEmpireViewSystemGraphs(); + universe.RebuildEmpireViewSystemGraphs(); // Population growth or loss, health meter growth, resource current meter growth - for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { it->second->PopGrowthProductionResearchPhase(); } @@ -670,7 +690,7 @@ // copy latest updated current meter values to initial current values, and initial current values // to previous values, so that clients will have this information based on values after all changes // that occured this turn. - for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { for (MeterType i = MeterType(0); i != NUM_METER_TYPES; i = MeterType(i + 1)) if (Meter* meter = it->second->GetMeter(i)) meter->BackPropegate(); @@ -678,7 +698,7 @@ // create sitreps for starved planets - std::vector<Planet*> plt_vec = GetUniverse().FindObjects<Planet>(); + std::vector<Planet*> plt_vec = universe.FindObjects<Planet>(); for (std::vector<Planet*>::iterator it = plt_vec.begin(); it!=plt_vec.end(); ++it) { if ((*it)->Owners().size() > 0 && (*it)->GetMeter(METER_POPULATION)->Current() <= 0.0) { // add some information to sitrep @@ -699,80 +719,21 @@ ++m_current_turn; - // indicate that the clients are waiting for their new Universes - for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { - (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::DOWNLOADING, -1)); - } + // check for victory conditions... - // check if all empires are still alive - std::map<int, int> eliminations; // map from player ids to empire ids - for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { - if (GetUniverse().FindObjects(OwnedVisitor<Planet>(it->first)).empty()) { // when you're out of planets, your game is over - int player_id = GetEmpirePlayerID(it->first); - for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { - if ((*player_it)->ID() == player_id) { - eliminations[player_id] = it->first; - break; - } - } - } - } - - // clean up defeated empires - for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { - // remove the empire from play - Universe::ObjectVec object_vec = GetUniverse().FindObjects(OwnedVisitor<UniverseObject>(it->second)); - for (unsigned int j = 0; j < object_vec.size(); ++j) { - object_vec[j]->RemoveOwner(it->second); - // TODO: Consider just removing ownership from Buildings, and making - // them capturable by colonizing a planet. - if (object_vec[j]->Owners().empty() && - (universe_object_cast<Building*>(object_vec[j]) || - universe_object_cast<Ship*>(object_vec[j]) || - universe_object_cast<Fleet*>(object_vec[j]))) - GetUniverse().Destroy(object_vec[j]->ID()); + // marked by Victory effect + const std::set<int>& marked_for_victory = universe.GetMarkedForVictory(); + for (std::set<int>::const_iterator it = marked_for_victory.begin(); it != marked_for_victory.end(); ++it) { + const UniverseObject* obj = universe.Object(*it); + if (!obj) continue; // perhaps it was destroyed? + const std::set<int>& owners = obj->Owners(); + if (owners.size() == 1) { + int empire_id = *owners.begin(); + if (Empire* empire = Empires().Lookup(empire_id)) + m_victors.insert(empire_id); } } - std::map<std::string, Process> processes_copy = m_ai_clients; - // notify all players of the eliminated players - for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { - for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { - if ((*player_it)->ID() == it->first) { - m_ai_clients.erase((*player_it)->PlayerName()); - (*player_it)->SendMessage(EndGameMessage((*player_it)->ID(), Message::YOU_ARE_DEFEATED)); - } else { - (*player_it)->SendMessage(PlayerEliminatedMessage((*player_it)->ID(), it->second, Empires().Lookup(it->second)->Name())); - } - } - } - - Sleep(1000); - - // dump connections to eliminated players, and remove server-side empire data - for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { - m_log_category.debugStream() << "ServerApp::ProcessTurns : Player " << it->first << " is marked as a loser and dumped"; - m_losers.insert(it->first); - m_networking.Disconnect(it->first); - m_ai_IDs.erase(it->first); - Empires().EliminateEmpire(it->second); - RemoveEmpireTurn(it->second); - } - - // determine if victory conditions exist - if (m_networking.NumPlayers() == 1) { // if there is only one player left, that player is the winner - m_log_category.debugStream() << "ServerApp::ProcessTurns : One player left -- sending victory notification and terminating."; - while (m_networking.NumPlayers() == 1) { - m_networking.SendMessage(EndGameMessage((*m_networking.established_begin())->ID(), Message::LAST_OPPONENT_DEFEATED)); - } - Sleep(2000); - Exit(0); - } else if (m_ai_IDs.size() == m_networking.NumPlayers()) { // if there are none but AI players left, we're done - m_log_category.debugStream() << "ServerApp::ProcessTurns : No human players left -- server terminating."; - Exit(0); - } - - // compile map of PlayerInfo for each player, indexed by player ID std::map<int, PlayerInfo> players; for (ServerNetworking::const_established_iterator it = m_networking.established_begin(); it != m_networking.established_end(); ++it) { Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/ServerApp.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -44,6 +44,22 @@ void serialize(Archive& ar, const unsigned int version); }; +/** contains data that must be retained by the server when saving and loading a game that isn't player data or + the universe */ +struct ServerSaveGameData +{ + ServerSaveGameData(); ///< default ctor + ServerSaveGameData(const int& current_turn, const std::set<int>& victors); + + int m_current_turn; + std::set<int> m_victors; ///< ids of players who have won the game + +private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** the application framework class for the FreeOrion server. */ class ServerApp { @@ -81,11 +97,18 @@ /** Processes all empires in the manager in the order that they are added. Will delete all pOrderSets assigned.*/ void ProcessTurns(); - void NewGameInit(boost::shared_ptr<SinglePlayerSetupData> setup_data); ///< intializes game universe, sends out initial game state to clients, and signals clients to start first turn - void LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data); ///< restores saved game universe, sends out game state and saved pending orders to clients, and signals clients to finish current turn + /** Intializes game universe, sends out initial game state to clients, and signals clients to start first turn */ + void NewGameInit(boost::shared_ptr<SinglePlayerSetupData> setup_data); - void NewGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data); ///< intializes game universe, sends out initial game state to clients, and signals clients to start first turn - void LoadGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data, const std::vector<PlayerSaveGameData>& player_save_game_data); ///< restores saved game universe, sends out game state and saved pending orders to clients, and signals clients to finish current turn + /** restores saved game universe, sends out game state and saved pending orders to clients, and signals clients to finish current turn. */ + void LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data, boost::shared_ptr<ServerSaveGameData> server_save_game_data); + + /** Intializes game universe, sends out initial game state to clients, and signals clients to start first turn */ + void NewGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data); + + /** Restores saved game universe, sends out game state and saved pending orders to clients, and signals clients to finish current turn. */ + void LoadGameInit(boost::shared_ptr<MultiplayerLobbyData> lobby_data, const std::vector<PlayerSaveGameData>& player_save_game_data, + boost::shared_ptr<ServerSaveGameData> server_save_game_data); //@} static ServerApp* GetApp(); ///< returns a ClientApp pointer to the singleton instance of the app @@ -98,11 +121,11 @@ const ServerApp& operator=(const ServerApp&); // disabled ServerApp(const ServerApp&); // disabled - void NewGameInit(int size, Shape shape, Age age, StarlaneFrequency starlane_freq, PlanetDensity planet_density, SpecialsFrequency specials_freq, - const std::map<int, PlayerSetupData>& player_setup_data); + void NewGameInit(int size, Shape shape, Age age, StarlaneFrequency starlane_freq, PlanetDensity planet_density, + SpecialsFrequency specials_freq, const std::map<int, PlayerSetupData>& player_setup_data); void LoadGameInit(const std::vector<PlayerSaveGameData>& player_save_game_data, const std::map<int, int>& player_id_to_save_game_data_index, - std::set<int>& unused_save_game_data); + std::set<int>& unused_save_game_data, boost::shared_ptr<ServerSaveGameData> server_save_game_data); void Run(); ///< initializes app state, then executes main event handler/render loop (Poll()) void CleanupAIs(); ///< cleans up AI processes @@ -141,7 +164,8 @@ // turn sequence map is used for turn processing. Each empire is added at the start of a game or reload and then the map maintains OrderSets for that turn std::map<int, OrderSet*> m_turn_sequence; - std::set<int> m_losers; ///< the IDs of players who have been eliminated during the normal course of the game + std::set<int> m_victors; ///< the IDs of players who have won the game + std::set<int> m_eliminated_players; ///< ids of players whose connections have been severed by the server after they were eliminated static ServerApp* s_app; @@ -169,5 +193,11 @@ & BOOST_SERIALIZATION_NVP(m_save_state_string); } +template <class Archive> +void ServerSaveGameData::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_current_turn) + & BOOST_SERIALIZATION_NVP(m_victors); +} + #endif // _ServerApp_h_ - Modified: trunk/FreeOrion/server/ServerFSM.cpp =================================================================== --- trunk/FreeOrion/server/ServerFSM.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/ServerFSM.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -16,10 +16,12 @@ { save_game_empire_data.clear(); std::vector<PlayerSaveGameData> player_save_game_data; - int current_turn; + ServerSaveGameData server_data; Universe universe; + LoadGame((GetLocalDir() / "save" / save_game_filename).native_file_string().c_str(), - current_turn, player_save_game_data, universe); + server_data, player_save_game_data, universe); + for (unsigned int i = 0; i < player_save_game_data.size(); ++i) { Empire* empire = player_save_game_data[i].m_empire; SaveGameEmpireData& data = save_game_empire_data[empire->EmpireID()]; @@ -90,7 +92,7 @@ Logger().debugStream() << "ServerFSM::HandleNonLobbyDisconnection : Host player disconnected; server terminating."; Sleep(2000); // HACK! Pause for a bit to let the player disconnected and end game messages propogate. m_server.Exit(1); - } else if (m_server.m_losers.find(id) == m_server.m_losers.end()) { // player abnormally disconnected during a regular game + } else if (m_server.m_eliminated_players.find(id) == m_server.m_eliminated_players.end()) { // player abnormally disconnected during a regular game Logger().debugStream() << "ServerFSM::HandleNonLobbyDisconnection : Lost connection to player #" << boost::lexical_cast<std::string>(id) << ", named \"" << player_connection->PlayerName() << "\"; server terminating."; std::string message = player_connection->PlayerName(); @@ -102,6 +104,8 @@ } } + // TODO: Add a way to have AIs play without humans... for AI debugging purposes + // independently of everything else, if there are no humans left, it's time to terminate if (m_server.m_networking.empty() || m_server.m_ai_clients.size() == m_server.m_networking.NumPlayers()) { Logger().debugStream() << "ServerFSM::HandleNonLobbyDisconnection : All human players disconnected; server terminating."; @@ -162,7 +166,8 @@ //////////////////////////////////////////////////////////// MPLobby::MPLobby(my_context c) : Base(c), - m_lobby_data (new MultiplayerLobbyData(true)) + m_lobby_data(new MultiplayerLobbyData(true)), + m_server_save_game_data(new ServerSaveGameData()) { if (TRACE_EXECUTION) Logger().debugStream() << "(ServerFSM) MPLobby"; ServerApp& server = Server(); @@ -346,11 +351,12 @@ } } else { LoadGame((GetLocalDir() / "save" / m_lobby_data->m_save_games[m_lobby_data->m_save_file_index]).native_file_string(), - server.m_current_turn, m_player_save_game_data, GetUniverse()); + *m_server_save_game_data, m_player_save_game_data, GetUniverse()); int expected_players = m_player_save_game_data.size(); int needed_AI_clients = expected_players - server.m_networking.NumPlayers(); if (!needed_AI_clients) { - server.LoadGameInit(m_lobby_data, m_player_save_game_data); + // have all needed AIs, so don't need to wait for MP Joiners, and can immediately start game + server.LoadGameInit(m_lobby_data, m_player_save_game_data, m_server_save_game_data); return transit<PlayingGame>(); } } @@ -361,8 +367,10 @@ return discard_event(); } + // copy locally stored data to common server fsm context so it can be retreived in WaitingForMPGameJoiners context<ServerFSM>().m_lobby_data = m_lobby_data; context<ServerFSM>().m_player_save_game_data = m_player_save_game_data; + context<ServerFSM>().m_server_save_game_data = m_server_save_game_data; return transit<WaitingForMPGameJoiners>(); } @@ -374,6 +382,7 @@ WaitingForSPGameJoiners::WaitingForSPGameJoiners(my_context c) : Base(c), m_setup_data(context<ServerFSM>().m_setup_data), + m_server_save_game_data(new ServerSaveGameData()), m_num_expected_players(0) { if (TRACE_EXECUTION) Logger().debugStream() << "(ServerFSM) WaitingForSPGameJoiners"; @@ -385,7 +394,8 @@ m_num_expected_players = m_setup_data->m_AIs + 1; server.CreateAIClients(std::vector<PlayerSetupData>(m_setup_data->m_AIs), m_expected_ai_player_names); } else { - LoadGame(m_setup_data->m_filename, server.m_current_turn, m_player_save_game_data, GetUniverse()); + LoadGame(m_setup_data->m_filename, *m_server_save_game_data, m_player_save_game_data, GetUniverse()); + assert(!m_player_save_game_data.empty()); m_num_expected_players = m_player_save_game_data.size(); server.CreateAIClients(std::vector<PlayerSetupData>(m_num_expected_players - 1), m_expected_ai_player_names); @@ -426,7 +436,7 @@ if (m_setup_data->m_new_game) server.NewGameInit(m_setup_data); else - server.LoadGameInit(m_player_save_game_data); + server.LoadGameInit(m_player_save_game_data, m_server_save_game_data); return transit<PlayingGame>(); } @@ -441,11 +451,14 @@ Base(c), m_lobby_data(context<ServerFSM>().m_lobby_data), m_player_save_game_data(context<ServerFSM>().m_player_save_game_data), + m_server_save_game_data(context<ServerFSM>().m_server_save_game_data), m_num_expected_players(0) { if (TRACE_EXECUTION) Logger().debugStream() << "(ServerFSM) WaitingForMPGameJoiners"; context<ServerFSM>().m_lobby_data.reset(); context<ServerFSM>().m_player_save_game_data.clear(); + context<ServerFSM>().m_server_save_game_data.reset(); + ServerApp& server = Server(); if (m_lobby_data->m_new_game) { m_num_expected_players = m_lobby_data->m_players.size(); @@ -496,7 +509,7 @@ if (m_player_save_game_data.empty()) server.NewGameInit(m_lobby_data); else - server.LoadGameInit(m_lobby_data, m_player_save_game_data); + server.LoadGameInit(m_lobby_data, m_player_save_game_data, m_server_save_game_data); return transit<PlayingGame>(); } @@ -703,7 +716,10 @@ m_players_responded.insert(message.SendingPlayer()); if (m_players_responded == m_needed_reponses) { - SaveGame(context<WaitingForTurnEnd>().m_save_filename, server.m_current_turn, m_player_save_game_data, GetUniverse()); + ServerSaveGameData server_data(server.m_current_turn, server.m_victors); + + SaveGame(context<WaitingForTurnEnd>().m_save_filename, server_data, m_player_save_game_data, GetUniverse()); + context<WaitingForTurnEnd>().m_save_filename = ""; return transit<WaitingForTurnEndIdle>(); } Modified: trunk/FreeOrion/server/ServerFSM.h =================================================================== --- trunk/FreeOrion/server/ServerFSM.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/server/ServerFSM.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -25,6 +25,7 @@ class SinglePlayerSetupData; class PlayerConnection; class PlayerSaveGameData; +class ServerSaveGameData; typedef boost::shared_ptr<PlayerConnection> PlayerConnectionPtr; // Non-Message events @@ -109,6 +110,7 @@ boost::shared_ptr<MultiplayerLobbyData> m_lobby_data; boost::shared_ptr<SinglePlayerSetupData> m_setup_data; std::vector<PlayerSaveGameData> m_player_save_game_data; + boost::shared_ptr<ServerSaveGameData> m_server_save_game_data; private: ServerApp& m_server; @@ -163,6 +165,7 @@ boost::shared_ptr<MultiplayerLobbyData> m_lobby_data; std::vector<PlayerSaveGameData> m_player_save_game_data; + boost::shared_ptr<ServerSaveGameData> m_server_save_game_data; SERVER_ACCESSOR }; @@ -186,6 +189,7 @@ boost::shared_ptr<SinglePlayerSetupData> m_setup_data; std::vector<PlayerSaveGameData> m_player_save_game_data; + boost::shared_ptr<ServerSaveGameData> m_server_save_game_data; std::set<std::string> m_expected_ai_player_names; int m_num_expected_players; @@ -211,6 +215,7 @@ boost::shared_ptr<MultiplayerLobbyData> m_lobby_data; std::vector<PlayerSaveGameData> m_player_save_game_data; + boost::shared_ptr<ServerSaveGameData> m_server_save_game_data; std::set<std::string> m_expected_ai_player_names; int m_num_expected_players; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -974,6 +974,28 @@ /////////////////////////////////////////////////////////// +// Victory // +/////////////////////////////////////////////////////////// +Victory::Victory() +{} + +void Victory::Execute(const UniverseObject* source, UniverseObject* target) const +{ + GetUniverse().EffectVictory(target->ID()); +} + +std::string Victory::Description() const +{ + return UserString("DESC_VICTORY"); +} + +std::string Victory::Dump() const +{ + return DumpIndent() + "Victory\n"; +} + + +/////////////////////////////////////////////////////////// // SetTechAvailability // /////////////////////////////////////////////////////////// SetTechAvailability::SetTechAvailability(const std::string& tech_name, const ValueRef::ValueRefBase<int>* empire_id, bool available, bool include_tech) : Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/universe/Effect.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -37,6 +37,7 @@ class SetTechAvailability; class SetEffectTarget; class MoveTo; + class Victory; } namespace ValueRef { @@ -383,7 +384,22 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Causes the owner empire of the target object to win the game. If the target object has multiple owners, nothing is done. */ +class Effect::Victory : public Effect::EffectBase +{ +public: + Victory(); + virtual void Execute(const UniverseObject* source, UniverseObject* target) const; + virtual std::string Description() const; + virtual std::string Dump() const; + +private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Sets the availability of tech \a tech_name to empire \a empire_id. If \a include_tech is true, the tech is fully available, just as if it were researched normally; otherwise, only the items that the tech includes are made available. Note that this means this Effect is intended also to be used to unlock buildings, ships, etc. The tech and/or its items are made available if \a available is true, or unavailable otherwise. */ @@ -542,6 +558,12 @@ } template <class Archive> +void Effect::Victory::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase); +} + +template <class Archive> void Effect::SetTechAvailability::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-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -116,6 +116,7 @@ CreateBuildingRule create_building; ConditionParamRule move_to; Rule destroy; + Rule victory; NameParamRule add_special; NameParamRule remove_special; SetStarTypeRule set_star_type; @@ -208,6 +209,10 @@ str_p("destroy") [destroy.this_ = new_<Effect::Destroy>()]; + victory = + str_p("victory") + [victory.this_ = new_<Effect::Victory>()]; + add_special = (str_p("addspecial") >> name_label >> name_p[add_special.name = arg1]) @@ -240,6 +245,7 @@ | remove_owner[effect_p.this_ = arg1] | move_to[effect_p.this_ = arg1] | destroy[effect_p.this_ = arg1] + | victory[effect_p.this_ = arg1] | add_special[effect_p.this_ = arg1] | remove_special[effect_p.this_ = arg1] | set_star_type[effect_p.this_ = arg1] Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-17 22:11:12 UTC (rev 2664) @@ -277,7 +277,7 @@ bool Universe::EdgeVisibilityFilter::CanSeeAtLeastOneSystem(const Empire* empire, int system1, int system2) { - return empire->HasExploredSystem(system1) || empire->HasExploredSystem(system2); + return empire && (empire->HasExploredSystem(system1) || empire->HasExploredSystem(system2)); } @@ -951,6 +951,7 @@ void Universe::ExecuteEffects(EffectsTargetsCausesMap& targets_causes_map) { m_marked_destroyed.clear(); + m_marked_for_victory.clear(); std::map<std::string, Effect::EffectsGroup::TargetSet> executed_nonstacking_effects; for (EffectsTargetsCausesMap::const_iterator targets_it = targets_causes_map.begin(); targets_it != targets_causes_map.end(); ++targets_it) { @@ -1173,6 +1174,11 @@ m_marked_destroyed.insert(id); } +void Universe::EffectVictory(int object_id) +{ + m_marked_for_victory.insert(object_id); +} + void Universe::HandleEmpireElimination(int empire_id) { //for (EffectAccountingMap::iterator obj_it = m_effect_accounting_map.begin(); obj_it != m_effect_accounting_map.end(); ++obj_it) { Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2008-08-13 11:04:10 UTC (rev 2663) +++ trunk/FreeOrion/universe/Universe.h 2008-08-17 22:11:12 UTC (rev 2664) @@ -196,6 +196,9 @@ in order effects were applied to the meter. */ const EffectAccountingMap& GetEffectAccountingMap() const {return m_effect_accounting_map;} + /... [truncated message content] |
From: <tz...@us...> - 2008-08-22 00:32:32
|
Revision: 2668 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2668&view=rev Author: tzlaine Date: 2008-08-22 00:32:43 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Removed unused variables to eliminate gcc warnings. Modified Paths: -------------- trunk/FreeOrion/combat/CombatSystem.cpp trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/combat/CombatSystem.cpp =================================================================== --- trunk/FreeOrion/combat/CombatSystem.cpp 2008-08-22 00:17:58 UTC (rev 2667) +++ trunk/FreeOrion/combat/CombatSystem.cpp 2008-08-22 00:32:43 UTC (rev 2668) @@ -178,9 +178,7 @@ log4cpp::Category::getRoot().debugStream() << "COMBAT resolution!"; #endif const double base_chance_to_retreat = 0.25; - const int defence_base_hit_points= 3; - #ifdef FREEORION_RELEASE ClockSeed(); #endif Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-22 00:17:58 UTC (rev 2667) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-22 00:32:43 UTC (rev 2668) @@ -729,7 +729,7 @@ const std::set<int>& owners = obj->Owners(); if (owners.size() == 1) { int empire_id = *owners.begin(); - if (Empire* empire = Empires().Lookup(empire_id)) + if (Empires().Lookup(empire_id)) m_victors.insert(empire_id); } } |
From: <geo...@us...> - 2008-08-24 05:13:34
|
Revision: 2671 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2671&view=rev Author: geoffthemedio Date: 2008-08-24 05:13:44 +0000 (Sun, 24 Aug 2008) Log Message: ----------- -Restored elimination of players who lose all fleets and planets -Fixed a crash during serialization of destroyed fleets whose empire had been eliminated -Added igrok to credits Modified Paths: -------------- trunk/FreeOrion/default/credits.xml trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Fleet.cpp Modified: trunk/FreeOrion/default/credits.xml =================================================================== --- trunk/FreeOrion/default/credits.xml 2008-08-22 01:21:38 UTC (rev 2670) +++ trunk/FreeOrion/default/credits.xml 2008-08-24 05:13:44 UTC (rev 2671) @@ -19,6 +19,7 @@ <PERSON name="qk-gen" nick="" task="Programming"/> <PERSON name="Adrian Schweizer" nick="LaplaceOperator" task="Programming"/> <PERSON name="Karl Chen" nick="quarl" task="Programming"/> + <PERSON name="Eliot Eshelman" nick="igrok" task="Programming"/> </GROUP> <GROUP name ="GAMEDESIGN"> <PERSON name="Samuel Knowlton" nick="Aquitaine" task="Game Design"/> Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-22 01:21:38 UTC (rev 2670) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-24 05:13:44 UTC (rev 2671) @@ -452,12 +452,25 @@ return true; } +namespace { + /** returns true if \a empire has been eliminated by the applicable definition of elimination. As of this writing, + elimination means having no ships and no fleets. */ + bool EmpireEliminated(const Empire* empire, const Universe& universe) { + if (!empire) + return false; + int empire_id = empire->EmpireID(); + return (universe.FindObjects(OwnedVisitor<Planet>(empire_id)).empty() && // no planets + universe.FindObjects(OwnedVisitor<Fleet>(empire_id)).empty()); // no fleets + } +} + void ServerApp::ProcessTurns() { Empire* empire; OrderSet* order_set; OrderSet::const_iterator order_it; Universe& universe = GetUniverse(); + EmpireManager& empires = Empires(); // Now all orders, then process turns for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { @@ -466,7 +479,7 @@ (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::PROCESSING_ORDERS, it->first)); } - empire = Empires().Lookup(it->first); + empire = empires.Lookup(it->first); empire->ClearSitRep(); order_set = it->second; @@ -507,7 +520,7 @@ // only one empire? if (it->second.size()==1) { it->second[0]->ServerExecute(); - empire = Empires().Lookup( it->second[0]->EmpireID() ); + empire = empires.Lookup( it->second[0]->EmpireID() ); empire->AddSitRepEntry(CreatePlanetColonizedSitRep(planet->SystemID(), planet->ID())); } else { const System *system = universe.Object<System>(planet->SystemID()); @@ -544,7 +557,7 @@ for (int i=0;i<static_cast<int>(it->second.size());i++) if (winner==i) { it->second[i]->ServerExecute(); - empire = Empires().Lookup( it->second[i]->EmpireID() ); + empire = empires.Lookup( it->second[i]->EmpireID() ); empire->AddSitRepEntry(CreatePlanetColonizedSitRep(planet->SystemID(), planet->ID())); } else @@ -573,7 +586,7 @@ if (eta == 1) { std::set<int> owners_set = fleet->Owners(); for (std::set<int>::const_iterator owners_it = owners_set.begin(); owners_it != owners_set.end(); ++owners_it) { - empire = Empires().Lookup( *owners_it ); + empire = empires.Lookup( *owners_it ); if (empire) empire->AddSitRepEntry(CreateFleetArrivedAtDestinationSitRep(fleet->SystemID(), fleet->ID())); else @@ -601,10 +614,10 @@ Fleet* flt = *flt_it; // a fleet should belong only to one empire!? if (1 == flt->Owners().size()) { - std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*flt->Owners().begin()))); + std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(empires.Lookup(*flt->Owners().begin()))); if (ecf_it == empire_combat_forces.end()) { - CombatAssets ca(Empires().Lookup(*flt->Owners().begin())); + CombatAssets ca(empires.Lookup(*flt->Owners().begin())); ca.fleets.push_back(flt); empire_combat_forces.push_back(ca); } @@ -617,10 +630,10 @@ Planet* plt = *plt_it; // a planet should belong only to one empire!? if (1 == plt->Owners().size()) { - std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(Empires().Lookup(*plt->Owners().begin()))); + std::vector<CombatAssets>::iterator ecf_it = std::find(empire_combat_forces.begin(),empire_combat_forces.end(),CombatAssetsOwner(empires.Lookup(*plt->Owners().begin()))); if (ecf_it==empire_combat_forces.end()) { - CombatAssets ca(Empires().Lookup(*plt->Owners().begin())); + CombatAssets ca(empires.Lookup(*plt->Owners().begin())); ca.planets.push_back(plt); empire_combat_forces.push_back(ca); } else { @@ -652,8 +665,8 @@ // Determine how much of each resource is available, and determine how to distribute it to planets or on queues - for (EmpireManager::iterator it = Empires().begin(); it != Empires().end(); ++it) { - Empire* empire = it->second; + for (EmpireManager::iterator it = empires.begin(); it != empires.end(); ++it) { + empire = it->second; empire->UpdateSupplyUnobstructedSystems(); empire->UpdateSystemSupplyRanges(); @@ -665,7 +678,7 @@ // consume distributed resources on queues for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { - Empire* empire = Empires().Lookup(it->first); + empire = empires.Lookup(it->first); empire->CheckResearchProgress(); empire->CheckProductionProgress(); empire->CheckTradeSocialProgress(); @@ -702,7 +715,7 @@ for (std::vector<Planet*>::iterator it = plt_vec.begin(); it!=plt_vec.end(); ++it) { if ((*it)->Owners().size() > 0 && (*it)->GetMeter(METER_POPULATION)->Current() <= 0.0) { // add some information to sitrep - Empire *empire = Empires().Lookup(*(*it)->Owners().begin()); + Empire *empire = empires.Lookup(*(*it)->Owners().begin()); empire->AddSitRepEntry(CreatePlanetStarvedToDeathSitRep((*it)->SystemID(), (*it)->ID())); (*it)->Reset(); } @@ -719,8 +732,19 @@ ++m_current_turn; + // compile map of PlayerInfo for each player, indexed by player ID + std::map<int, PlayerInfo> players; + for (ServerNetworking::const_established_iterator it = m_networking.established_begin(); it != m_networking.established_end(); ++it) { + players[(*it)->ID()] = PlayerInfo((*it)->PlayerName(), + GetPlayerEmpire((*it)->ID())->EmpireID(), + m_ai_IDs.find((*it)->ID()) != m_ai_IDs.end(), + (*it)->Host()); + } + + // check for victory conditions... + // marked by Victory effect const std::set<int>& marked_for_victory = universe.GetMarkedForVictory(); for (std::set<int>::const_iterator it = marked_for_victory.begin(); it != marked_for_victory.end(); ++it) { @@ -729,20 +753,77 @@ const std::set<int>& owners = obj->Owners(); if (owners.size() == 1) { int empire_id = *owners.begin(); - if (Empires().Lookup(empire_id)) - m_victors.insert(empire_id); + if (empire = empires.Lookup(empire_id)) + m_victors.insert(GetEmpirePlayerID(empire_id)); } } - // compile map of PlayerInfo for each player, indexed by player ID - std::map<int, PlayerInfo> players; - for (ServerNetworking::const_established_iterator it = m_networking.established_begin(); it != m_networking.established_end(); ++it) { - players[(*it)->ID()] = PlayerInfo((*it)->PlayerName(), - GetPlayerEmpire((*it)->ID())->EmpireID(), - m_ai_IDs.find((*it)->ID()) != m_ai_IDs.end(), - (*it)->Host()); + + + + // check for and clean up eliminated empires and players + std::map<int, int> eliminations; // map from player id to empire id of eliminated players + for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) { + empire = it->second; + if (!EmpireEliminated(empire, universe)) + continue; + + int elim_empire_id = it->first; + int elim_player_id = GetEmpirePlayerID(elim_empire_id); + eliminations[elim_player_id] = elim_empire_id; + + // remove eliminated empire's ownership of UniverseObjects + Universe::ObjectVec object_vec = GetUniverse().FindObjects(OwnedVisitor<UniverseObject>(elim_empire_id)); + for (Universe::ObjectVec::iterator obj_it = object_vec.begin(); obj_it != object_vec.end(); ++obj_it) + (*obj_it)->RemoveOwner(elim_empire_id); + + // notify all players of disconnection, and end game of eliminated player + for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { + boost::shared_ptr<PlayerConnection> pc = *player_it; + int cur_player_id = pc->ID(); + if (cur_player_id == elim_player_id) { + m_ai_clients.erase(pc->PlayerName()); + pc->SendMessage(EndGameMessage(elim_player_id, Message::YOU_ARE_ELIMINATED)); + } else { + pc->SendMessage(PlayerEliminatedMessage(cur_player_id, elim_empire_id, empire->Name())); + } + } } + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { + const std::set<int>& owners = it->second->Owners(); + if (owners.empty()) + Logger().debugStream() << "Object has no owners"; + else { + Logger().debugStream() << "Object owner: " << *(owners.begin()); + if (owners.size() > 1) { + std::set<int>::const_iterator qit = owners.begin(); + ++qit; + Logger().debugStream() << "... and: " << *qit; + } + } + } + + if (!eliminations.empty()) { + Sleep(1000); // time for elimination messages to propegate + + // dump connections to eliminated players, and remove server-side empire data + for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { + m_log_category.debugStream() << "ServerApp::ProcessTurns : Player " << it->first << " is eliminated and dumped"; + m_eliminated_players.insert(it->first); + m_networking.Disconnect(it->first); + m_ai_IDs.erase(it->first); + + empires.EliminateEmpire(it->second); + RemoveEmpireTurn(it->second); + } + } + + // indicate that the clients are waiting for their new Universes + for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { + (*player_it)->SendMessage(TurnProgressMessage((*player_it)->ID(), Message::DOWNLOADING, -1)); + } + // send new-turn updates to all players for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { int empire_id = GetPlayerEmpire((*player_it)->ID())->EmpireID(); Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-08-22 01:21:38 UTC (rev 2670) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-08-24 05:13:44 UTC (rev 2671) @@ -866,6 +866,9 @@ const std::set<int>& owners = Owners(); if (owners.size() == 1) fleet_owner = *(owners.begin()); + const Empire* empire = Empires().Lookup(fleet_owner); + if (!empire) // may occur for destroyed objects whose previous owner has since been eliminated + fleet_owner = -1; std::list<System*>::iterator end_it = std::find_if(m_travel_route.begin(), visible_end_it, boost::bind(&SystemNotReachable, _1, fleet_owner)); std::copy(m_travel_route.begin(), end_it, std::back_inserter(travel_route)); |
From: <geo...@us...> - 2008-08-24 07:12:23
|
Revision: 2672 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2672&view=rev Author: geoffthemedio Date: 2008-08-24 07:12:32 +0000 (Sun, 24 Aug 2008) Log Message: ----------- Added an Empire Defeated Sitrep type. Basically works, but empire name isn't being properly substituted into the displayed text, and I will need help from tzlaine to get this working. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/util/SitRepEntry.cpp trunk/FreeOrion/util/SitRepEntry.h trunk/FreeOrion/util/VarText.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-24 07:12:32 UTC (rev 2672) @@ -1794,7 +1794,7 @@ Building* building = new Building(m_id, m_production_queue[i].item.name, planet->ID()); int building_id = universe.Insert(building); planet->AddBuilding(building_id); - SitRepEntry *entry = CreateBuildingBuiltSitRep(m_production_queue[i].item.name, planet->ID()); + SitRepEntry* entry = CreateBuildingBuiltSitRep(m_production_queue[i].item.name, planet->ID()); AddSitRepEntry(entry); //Logger().debugStream() << "New Building created on turn: " << building->CreationTurn(); break; @@ -1838,7 +1838,7 @@ Logger().debugStream() << "New Ship created on turn: " << ship->CreationTurn(); // add sitrep - SitRepEntry *entry = CreateShipBuiltSitRep(ship_id, system->ID()); + SitRepEntry* entry = CreateShipBuiltSitRep(ship_id, system->ID()); AddSitRepEntry(entry); break; } Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/UI/ClientUI.cpp 2008-08-24 07:12:32 UTC (rev 2672) @@ -316,7 +316,8 @@ "SITREP_COMBAT_SYSTEM_NO_VICTOR", "SITREP_PLANET_LOST_STARVED_TO_DEATH", "SITREP_PLANET_COLONIZED", - "SITREP_FLEET_ARRIVED_AT_DESTINATION" + "SITREP_FLEET_ARRIVED_AT_DESTINATION", + "SITREP_EMPIRE_ELIMINATED" }; // command-line options void AddOptions(OptionsDB& db) Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-24 07:12:32 UTC (rev 2672) @@ -1678,6 +1678,8 @@ SITREP_FLEET_ARRIVED_AT_DESTINATION %fleet% has arrived at the %system% system and awaits further orders. +SITREP_EMPIRE_ELIMINATED +The %name% empire has been eliminated. #################### # Specials # Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-24 07:12:32 UTC (rev 2672) @@ -554,10 +554,10 @@ if(!winner_is_armed) winner = -1; // if the current winner isn't armed, a winner must be armed!!!! - for (int i=0;i<static_cast<int>(it->second.size());i++) - if (winner==i) { + for (int i = 0; i < static_cast<int>(it->second.size()); i++) + if (winner == i) { it->second[i]->ServerExecute(); - empire = empires.Lookup( it->second[i]->EmpireID() ); + empire = empires.Lookup(it->second[i]->EmpireID()); empire->AddSitRepEntry(CreatePlanetColonizedSitRep(planet->SystemID(), planet->ID())); } else @@ -586,7 +586,7 @@ if (eta == 1) { std::set<int> owners_set = fleet->Owners(); for (std::set<int>::const_iterator owners_it = owners_set.begin(); owners_it != owners_set.end(); ++owners_it) { - empire = empires.Lookup( *owners_it ); + empire = empires.Lookup(*owners_it); if (empire) empire->AddSitRepEntry(CreateFleetArrivedAtDestinationSitRep(fleet->SystemID(), fleet->ID())); else @@ -715,7 +715,7 @@ for (std::vector<Planet*>::iterator it = plt_vec.begin(); it!=plt_vec.end(); ++it) { if ((*it)->Owners().size() > 0 && (*it)->GetMeter(METER_POPULATION)->Current() <= 0.0) { // add some information to sitrep - Empire *empire = empires.Lookup(*(*it)->Owners().begin()); + Empire* empire = empires.Lookup(*(*it)->Owners().begin()); empire->AddSitRepEntry(CreatePlanetStarvedToDeathSitRep((*it)->SystemID(), (*it)->ID())); (*it)->Reset(); } @@ -753,14 +753,12 @@ const std::set<int>& owners = obj->Owners(); if (owners.size() == 1) { int empire_id = *owners.begin(); - if (empire = empires.Lookup(empire_id)) + if (empires.Lookup(empire_id)) m_victors.insert(GetEmpirePlayerID(empire_id)); } } - - // check for and clean up eliminated empires and players std::map<int, int> eliminations; // map from player id to empire id of eliminated players for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) { @@ -786,23 +784,12 @@ pc->SendMessage(EndGameMessage(elim_player_id, Message::YOU_ARE_ELIMINATED)); } else { pc->SendMessage(PlayerEliminatedMessage(cur_player_id, elim_empire_id, empire->Name())); + if (Empire* recipient_empire = GetPlayerEmpire(cur_player_id)) + recipient_empire->AddSitRepEntry(CreateEmpireEliminatedSitRep(empire->Name())); } } } - for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { - const std::set<int>& owners = it->second->Owners(); - if (owners.empty()) - Logger().debugStream() << "Object has no owners"; - else { - Logger().debugStream() << "Object owner: " << *(owners.begin()); - if (owners.size() > 1) { - std::set<int>::const_iterator qit = owners.begin(); - ++qit; - Logger().debugStream() << "... and: " << *qit; - } - } - } if (!eliminations.empty()) { Sleep(1000); // time for elimination messages to propegate Modified: trunk/FreeOrion/util/SitRepEntry.cpp =================================================================== --- trunk/FreeOrion/util/SitRepEntry.cpp 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/util/SitRepEntry.cpp 2008-08-24 07:12:32 UTC (rev 2672) @@ -5,129 +5,135 @@ const std::string SitRepEntry::SITREP_UPDATE_TAG = "SitRepUpdate"; -SitRepEntry *CreateTechResearchedSitRep( const std::string& tech_name ) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreateTechResearchedSitRep(const std::string& tech_name) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType( SitRepEntry::TECH_RESEARCHED ); + sitrep->SetType(SitRepEntry::TECH_RESEARCHED); - XMLElement techID_elem( VarText::TECH_ID_TAG ); - techID_elem.SetAttribute("value", tech_name); - pSitRep->GetVariables( ).AppendChild( techID_elem ); + XMLElement techID_elem(VarText::TECH_ID_TAG); + techID_elem.SetAttribute("value", tech_name); + sitrep->GetVariables().AppendChild(techID_elem); - return( pSitRep ); + return(sitrep); } - -SitRepEntry *CreateBaseBuiltSitRep( int system_id, int planet_id ) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); - pSitRep->SetType( SitRepEntry::BASE_BUILT ); +SitRepEntry* CreateBaseBuiltSitRep(int system_id, int planet_id) { + SitRepEntry* sitrep = new SitRepEntry(); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + sitrep->SetType(SitRepEntry::BASE_BUILT); - XMLElement planet_elem( VarText::PLANET_ID_TAG ); - planet_elem.SetAttribute("value", boost::lexical_cast<std::string>( planet_id )); - pSitRep->GetVariables( ).AppendChild( planet_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - return( pSitRep ); + XMLElement planet_elem(VarText::PLANET_ID_TAG); + planet_elem.SetAttribute("value", boost::lexical_cast<std::string>(planet_id)); + sitrep->GetVariables().AppendChild(planet_elem); + + return(sitrep); } -SitRepEntry *CreateShipBuiltSitRep( int ship_id, int system_id ) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreateShipBuiltSitRep(int ship_id, int system_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType( SitRepEntry::SHIP_BUILT ); + sitrep->SetType(SitRepEntry::SHIP_BUILT); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - XMLElement ship_elem( VarText::SHIP_ID_TAG ); - ship_elem.SetAttribute("value", boost::lexical_cast<std::string>( ship_id )); - pSitRep->GetVariables( ).AppendChild( ship_elem ); + XMLElement ship_elem(VarText::SHIP_ID_TAG); + ship_elem.SetAttribute("value", boost::lexical_cast<std::string>(ship_id)); + sitrep->GetVariables().AppendChild(ship_elem); - return( pSitRep ); + return(sitrep); } -SitRepEntry *CreateBuildingBuiltSitRep(const std::string& building_name, int planet_id) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreateBuildingBuiltSitRep(const std::string& building_name, int planet_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType( SitRepEntry::BUILDING_BUILT ); + sitrep->SetType(SitRepEntry::BUILDING_BUILT); - XMLElement planet_elem( VarText::PLANET_ID_TAG ); - planet_elem.SetAttribute("value", boost::lexical_cast<std::string>( planet_id )); - pSitRep->GetVariables( ).AppendChild( planet_elem ); + XMLElement planet_elem(VarText::PLANET_ID_TAG); + planet_elem.SetAttribute("value", boost::lexical_cast<std::string>(planet_id)); + sitrep->GetVariables().AppendChild(planet_elem); - XMLElement building_elem( VarText::BUILDING_ID_TAG ); - building_elem.SetAttribute("value", building_name); - pSitRep->GetVariables( ).AppendChild( building_elem ); + XMLElement building_elem(VarText::BUILDING_ID_TAG); + building_elem.SetAttribute("value", building_name); + sitrep->GetVariables().AppendChild(building_elem); - return( pSitRep ); + return(sitrep); } -SitRepEntry *CreateCombatSitRep(int empire_id, int victor_id, int system_id) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreateCombatSitRep(int empire_id, int victor_id, int system_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType(victor_id==-1? SitRepEntry::COMBAT_SYSTEM_NO_VICTOR - : (empire_id==victor_id?SitRepEntry::COMBAT_SYSTEM_WON : SitRepEntry::COMBAT_SYSTEM_LOST)); + sitrep->SetType(victor_id == -1 ? SitRepEntry::COMBAT_SYSTEM_NO_VICTOR + : (empire_id == victor_id ? SitRepEntry::COMBAT_SYSTEM_WON : SitRepEntry::COMBAT_SYSTEM_LOST)); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - return( pSitRep ); + return(sitrep); } -SitRepEntry *CreatePlanetStarvedToDeathSitRep(int system_id, int planet_id) -{ - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreatePlanetStarvedToDeathSitRep(int system_id, int planet_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType(SitRepEntry::PLANET_LOST_STARVED_TO_DEATH); + sitrep->SetType(SitRepEntry::PLANET_LOST_STARVED_TO_DEATH); - XMLElement planet_elem( VarText::PLANET_ID_TAG ); - planet_elem.SetAttribute("value", boost::lexical_cast<std::string>( planet_id )); - pSitRep->GetVariables( ).AppendChild( planet_elem ); + XMLElement planet_elem(VarText::PLANET_ID_TAG); + planet_elem.SetAttribute("value", boost::lexical_cast<std::string>(planet_id)); + sitrep->GetVariables().AppendChild(planet_elem); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - return( pSitRep ); + return(sitrep); } -SitRepEntry *CreatePlanetColonizedSitRep(int system_id, int planet_id) { - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreatePlanetColonizedSitRep(int system_id, int planet_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType(SitRepEntry::PLANET_COLONIZED); + sitrep->SetType(SitRepEntry::PLANET_COLONIZED); - XMLElement planet_elem( VarText::PLANET_ID_TAG ); - planet_elem.SetAttribute("value", boost::lexical_cast<std::string>( planet_id )); - pSitRep->GetVariables( ).AppendChild( planet_elem ); + XMLElement planet_elem(VarText::PLANET_ID_TAG); + planet_elem.SetAttribute("value", boost::lexical_cast<std::string>(planet_id)); + sitrep->GetVariables().AppendChild(planet_elem); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - return( pSitRep ); - } + return(sitrep); +} -SitRepEntry *CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id) { - SitRepEntry *pSitRep = new SitRepEntry( ); +SitRepEntry* CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id) { + SitRepEntry* sitrep = new SitRepEntry(); - pSitRep->SetType(SitRepEntry::FLEET_ARRIVED_AT_DESTINATION); + sitrep->SetType(SitRepEntry::FLEET_ARRIVED_AT_DESTINATION); - XMLElement fleet_elem( VarText::FLEET_ID_TAG ); - fleet_elem.SetAttribute("value", boost::lexical_cast<std::string>( fleet_id )); - pSitRep->GetVariables( ).AppendChild( fleet_elem ); + XMLElement fleet_elem(VarText::FLEET_ID_TAG); + fleet_elem.SetAttribute("value", boost::lexical_cast<std::string>(fleet_id)); + sitrep->GetVariables().AppendChild(fleet_elem); - XMLElement system_elem( VarText::SYSTEM_ID_TAG ); - system_elem.SetAttribute("value", boost::lexical_cast<std::string>( system_id )); - pSitRep->GetVariables( ).AppendChild( system_elem ); + XMLElement system_elem(VarText::SYSTEM_ID_TAG); + system_elem.SetAttribute("value", boost::lexical_cast<std::string>(system_id)); + sitrep->GetVariables().AppendChild(system_elem); - return( pSitRep ); + return(sitrep); } + +SitRepEntry* CreateEmpireEliminatedSitRep(const std::string& empire_name) { + SitRepEntry* sitrep = new SitRepEntry(); + + sitrep->SetType(SitRepEntry::EMPIRE_ELIMINATED); + + XMLElement name_elem("name"); + name_elem.SetAttribute("value", empire_name); + sitrep->GetVariables().AppendChild(name_elem); + + return(sitrep); +} Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/util/SitRepEntry.h 2008-08-24 07:12:32 UTC (rev 2672) @@ -22,7 +22,6 @@ class SitRepEntry : public VarText { public: - /** tag name of sitrep update */ static const std::string SITREP_UPDATE_TAG; @@ -43,6 +42,7 @@ PLANET_LOST_STARVED_TO_DEATH, PLANET_COLONIZED, FLEET_ARRIVED_AT_DESTINATION, + EMPIRE_ELIMINATED, NUM_SITREP_TYPES }; @@ -50,8 +50,8 @@ SitRepEntry() : m_type(INVALID_ENTRY_TYPE) {} ///< default ctor //@} - void SetType( EntryType type ) { m_type = type; } - EntryType GetType( ) { return m_type; } + void SetType(EntryType type) { m_type = type; } + EntryType GetType() { return m_type; } private: EntryType m_type; ///< the type of SitRep this is @@ -65,22 +65,24 @@ // Sitrep constructors - for each SitRep type, there is a global constructor function See implementation file for // examples -SitRepEntry *CreateTechResearchedSitRep(const std::string& tech_name); +SitRepEntry* CreateTechResearchedSitRep(const std::string& tech_name); -SitRepEntry *CreateBaseBuiltSitRep(int system_id, int planet_id); +SitRepEntry* CreateBaseBuiltSitRep(int system_id, int planet_id); -SitRepEntry *CreateShipBuiltSitRep(int ship_id, int system_id); +SitRepEntry* CreateShipBuiltSitRep(int ship_id, int system_id); -SitRepEntry *CreateBuildingBuiltSitRep(const std::string& building_name, int planet_id); +SitRepEntry* CreateBuildingBuiltSitRep(const std::string& building_name, int planet_id); -SitRepEntry *CreateCombatSitRep(int empire_id, int victor_id, int system_id); +SitRepEntry* CreateCombatSitRep(int empire_id, int victor_id, int system_id); -SitRepEntry *CreatePlanetStarvedToDeathSitRep(int system_id, int planet_id); +SitRepEntry* CreatePlanetStarvedToDeathSitRep(int system_id, int planet_id); -SitRepEntry *CreatePlanetColonizedSitRep(int system_id, int planet_id); +SitRepEntry* CreatePlanetColonizedSitRep(int system_id, int planet_id); -SitRepEntry *CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id); +SitRepEntry* CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id); +SitRepEntry* CreateEmpireEliminatedSitRep(const std::string& empire_name); + // template implementations template <class Archive> void SitRepEntry::serialize(Archive& ar, const unsigned int version) Modified: trunk/FreeOrion/util/VarText.cpp =================================================================== --- trunk/FreeOrion/util/VarText.cpp 2008-08-24 05:13:44 UTC (rev 2671) +++ trunk/FreeOrion/util/VarText.cpp 2008-08-24 07:12:32 UTC (rev 2672) @@ -73,7 +73,7 @@ } const XMLElement& m_variables; - std::string& m_str; + std::string& m_str; }; // sticks a sequence of characters onto the end of a std::string @@ -86,7 +86,6 @@ } std::string& m_str; }; - } // static(s) |
From: <geo...@us...> - 2008-08-25 06:07:46
|
Revision: 2673 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2673&view=rev Author: geoffthemedio Date: 2008-08-25 06:07:54 +0000 (Mon, 25 Aug 2008) Log Message: ----------- -Added very broken sitreps for victories. I can't figure out how to get the victory message text into the sitrep entry for victory at all (which has the empire name in the victory message which needs to go into the sitrep message string for victory) which is a more complicated case than the sitrep messages for empire elimination (which has the empire name directly going into the sitrep message string for victory) -Modified victory popups to specify type of victory -Added tracking of the type of a victory with a stringtable lookup string (which is used in the above features and issues) -Modified Victory effect to take a type string parameter in support of the previous point -Minor code layout / formatting adjustments Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/EffectParser.cpp trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/util/SitRepEntry.cpp trunk/FreeOrion/util/SitRepEntry.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/UI/ClientUI.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -317,92 +317,93 @@ "SITREP_PLANET_LOST_STARVED_TO_DEATH", "SITREP_PLANET_COLONIZED", "SITREP_FLEET_ARRIVED_AT_DESTINATION", - "SITREP_EMPIRE_ELIMINATED" + "SITREP_EMPIRE_ELIMINATED", + "SITREP_VICTORY" }; // command-line options void AddOptions(OptionsDB& db) { - db.Add("app-width", "OPTIONS_DB_APP_WIDTH", 1024, RangedValidator<int>(800, 2048)); - db.Add("app-height", "OPTIONS_DB_APP_HEIGHT", 768, RangedValidator<int>(600, 1536)); - db.Add('c', "color-depth", "OPTIONS_DB_COLOR_DEPTH", 32, RangedStepValidator<int>(8, 16, 32)); - db.Add("show-fps", "OPTIONS_DB_SHOW_FPS", false); - db.Add("limit-fps", "OPTIONS_DB_LIMIT_FPS", true); - db.Add("max-fps", "OPTIONS_DB_MAX_FPS", 60.0, RangedValidator<double>(10.0, 200.0)); + db.Add("app-width", "OPTIONS_DB_APP_WIDTH", 1024, RangedValidator<int>(800, 2048)); + db.Add("app-height", "OPTIONS_DB_APP_HEIGHT", 768, RangedValidator<int>(600, 1536)); + db.Add('c', "color-depth", "OPTIONS_DB_COLOR_DEPTH", 32, RangedStepValidator<int>(8, 16, 32)); + db.Add("show-fps", "OPTIONS_DB_SHOW_FPS", false); + db.Add("limit-fps", "OPTIONS_DB_LIMIT_FPS", true); + db.Add("max-fps", "OPTIONS_DB_MAX_FPS", 60.0, RangedValidator<double>(10.0, 200.0)); // sound - db.Add("UI.sound.enabled", "OPTIONS_DB_UI_SOUND_ENABLED", true, Validator<bool>()); - db.Add("UI.sound.volume", "OPTIONS_DB_UI_SOUND_VOLUME", 255, RangedValidator<int>(0, 255)); - db.Add<std::string>("UI.sound.button-rollover", "OPTIONS_DB_UI_SOUND_BUTTON_ROLLOVER", "button_rollover.wav"); - db.Add<std::string>("UI.sound.button-click", "OPTIONS_DB_UI_SOUND_BUTTON_CLICK", "button_click.wav"); - db.Add<std::string>("UI.sound.turn-button-click", "OPTIONS_DB_UI_SOUND_TURN_BUTTON_CLICK", "turn_button_click.wav"); - db.Add<std::string>("UI.sound.list-select", "OPTIONS_DB_UI_SOUND_LIST_SELECT", "list_select.wav"); - db.Add<std::string>("UI.sound.item-drop", "OPTIONS_DB_UI_SOUND_ITEM_DROP", "item_drop.wav"); - db.Add<std::string>("UI.sound.list-pulldown", "OPTIONS_DB_UI_SOUND_LIST_PULLDOWN", "list_pulldown.wav"); - db.Add<std::string>("UI.sound.text-typing", "OPTIONS_DB_UI_SOUND_TEXT_TYPING", "text_typing.wav"); - db.Add<std::string>("UI.sound.window-maximize", "OPTIONS_DB_UI_SOUND_WINDOW_MAXIMIZE", "window_maximize.wav"); - db.Add<std::string>("UI.sound.window-minimize", "OPTIONS_DB_UI_SOUND_WINDOW_MINIMIZE", "window_minimize.wav"); - db.Add<std::string>("UI.sound.window-close", "OPTIONS_DB_UI_SOUND_WINDOW_CLOSE", "window_close.wav"); - db.Add<std::string>("UI.sound.alert", "OPTIONS_DB_UI_SOUND_ALERT", "alert.wav"); - db.Add<std::string>("UI.sound.planet-button-click", "OPTIONS_DB_UI_SOUND_PLANET_BUTTON_CLICK", "button_click.wav"); - db.Add<std::string>("UI.sound.fleet-button-rollover", "OPTIONS_DB_UI_SOUND_FLEET_BUTTON_ROLLOVER", "fleet_button_rollover.wav"); - db.Add<std::string>("UI.sound.fleet-button-click", "OPTIONS_DB_UI_SOUND_FLEET_BUTTON_CLICK", "fleet_button_click.wav"); - db.Add<std::string>("UI.sound.system-icon-rollover", "OPTIONS_DB_UI_SOUND_SYSTEM_ICON_ROLLOVER", "fleet_button_rollover.wav"); - db.Add<std::string>("UI.sound.sidepanel-open", "OPTIONS_DB_UI_SOUND_SIDEPANEL_OPEN", "sidepanel_open.wav"); - db.Add<std::string>("UI.sound.farming-focus", "OPTIONS_DB_UI_SOUND_FARMING_FOCUS", "farm_select.wav"); - db.Add<std::string>("UI.sound.industry-focus", "OPTIONS_DB_UI_SOUND_INDUSTRY_FOCUS", "industry_select.wav"); - db.Add<std::string>("UI.sound.research-focus", "OPTIONS_DB_UI_SOUND_RESEARCH_FOCUS", "research_select.wav"); - db.Add<std::string>("UI.sound.mining-focus", "OPTIONS_DB_UI_SOUND_MINING_FOCUS", "mining_select.wav"); - db.Add<std::string>("UI.sound.trade-focus", "OPTIONS_DB_UI_SOUND_TRADE_FOCUS", "trade_select.wav"); - db.Add<std::string>("UI.sound.balanced-focus", "OPTIONS_DB_UI_SOUND_BALANCED_FOCUS", "balanced_select.wav"); + db.Add("UI.sound.enabled", "OPTIONS_DB_UI_SOUND_ENABLED", true, Validator<bool>()); + db.Add("UI.sound.volume", "OPTIONS_DB_UI_SOUND_VOLUME", 255, RangedValidator<int>(0, 255)); + db.Add<std::string>("UI.sound.button-rollover", "OPTIONS_DB_UI_SOUND_BUTTON_ROLLOVER", "button_rollover.wav"); + db.Add<std::string>("UI.sound.button-click", "OPTIONS_DB_UI_SOUND_BUTTON_CLICK", "button_click.wav"); + db.Add<std::string>("UI.sound.turn-button-click", "OPTIONS_DB_UI_SOUND_TURN_BUTTON_CLICK", "turn_button_click.wav"); + db.Add<std::string>("UI.sound.list-select", "OPTIONS_DB_UI_SOUND_LIST_SELECT", "list_select.wav"); + db.Add<std::string>("UI.sound.item-drop", "OPTIONS_DB_UI_SOUND_ITEM_DROP", "item_drop.wav"); + db.Add<std::string>("UI.sound.list-pulldown", "OPTIONS_DB_UI_SOUND_LIST_PULLDOWN", "list_pulldown.wav"); + db.Add<std::string>("UI.sound.text-typing", "OPTIONS_DB_UI_SOUND_TEXT_TYPING", "text_typing.wav"); + db.Add<std::string>("UI.sound.window-maximize", "OPTIONS_DB_UI_SOUND_WINDOW_MAXIMIZE", "window_maximize.wav"); + db.Add<std::string>("UI.sound.window-minimize", "OPTIONS_DB_UI_SOUND_WINDOW_MINIMIZE", "window_minimize.wav"); + db.Add<std::string>("UI.sound.window-close", "OPTIONS_DB_UI_SOUND_WINDOW_CLOSE", "window_close.wav"); + db.Add<std::string>("UI.sound.alert", "OPTIONS_DB_UI_SOUND_ALERT", "alert.wav"); + db.Add<std::string>("UI.sound.planet-button-click", "OPTIONS_DB_UI_SOUND_PLANET_BUTTON_CLICK", "button_click.wav"); + db.Add<std::string>("UI.sound.fleet-button-rollover", "OPTIONS_DB_UI_SOUND_FLEET_BUTTON_ROLLOVER", "fleet_button_rollover.wav"); + db.Add<std::string>("UI.sound.fleet-button-click", "OPTIONS_DB_UI_SOUND_FLEET_BUTTON_CLICK", "fleet_button_click.wav"); + db.Add<std::string>("UI.sound.system-icon-rollover", "OPTIONS_DB_UI_SOUND_SYSTEM_ICON_ROLLOVER", "fleet_button_rollover.wav"); + db.Add<std::string>("UI.sound.sidepanel-open", "OPTIONS_DB_UI_SOUND_SIDEPANEL_OPEN", "sidepanel_open.wav"); + db.Add<std::string>("UI.sound.farming-focus", "OPTIONS_DB_UI_SOUND_FARMING_FOCUS", "farm_select.wav"); + db.Add<std::string>("UI.sound.industry-focus", "OPTIONS_DB_UI_SOUND_INDUSTRY_FOCUS", "industry_select.wav"); + db.Add<std::string>("UI.sound.research-focus", "OPTIONS_DB_UI_SOUND_RESEARCH_FOCUS", "research_select.wav"); + db.Add<std::string>("UI.sound.mining-focus", "OPTIONS_DB_UI_SOUND_MINING_FOCUS", "mining_select.wav"); + db.Add<std::string>("UI.sound.trade-focus", "OPTIONS_DB_UI_SOUND_TRADE_FOCUS", "trade_select.wav"); + db.Add<std::string>("UI.sound.balanced-focus", "OPTIONS_DB_UI_SOUND_BALANCED_FOCUS", "balanced_select.wav"); // fonts - db.Add<std::string>("UI.font", "OPTIONS_DB_UI_FONT", "DejaVuSans.ttf"); - db.Add<std::string>("UI.font-bold", "OPTIONS_DB_UI_FONT_BOLD", "DejaVuSans-Bold.ttf"); - db.Add<std::string>("UI.font-italic", "OPTIONS_DB_UI_FONT_ITALIC", "DejaVuSans-Oblique.ttf"); - db.Add<std::string>("UI.font-bold-italic", "OPTIONS_DB_UI_FONT_BOLD_ITALIC", "DejaVuSans-BoldOblique.ttf"); - db.Add("UI.font-size", "OPTIONS_DB_UI_FONT_SIZE", 12, RangedValidator<int>(4, 40)); - db.Add<std::string>("UI.title-font", "OPTIONS_DB_UI_TITLE_FONT", "DejaVuSans.ttf"); - db.Add("UI.title-font-size", "OPTIONS_DB_UI_TITLE_FONT_SIZE", 12, RangedValidator<int>(4, 40)); + db.Add<std::string>("UI.font", "OPTIONS_DB_UI_FONT", "DejaVuSans.ttf"); + db.Add<std::string>("UI.font-bold", "OPTIONS_DB_UI_FONT_BOLD", "DejaVuSans-Bold.ttf"); + db.Add<std::string>("UI.font-italic", "OPTIONS_DB_UI_FONT_ITALIC", "DejaVuSans-Oblique.ttf"); + db.Add<std::string>("UI.font-bold-italic", "OPTIONS_DB_UI_FONT_BOLD_ITALIC", "DejaVuSans-BoldOblique.ttf"); + db.Add("UI.font-size", "OPTIONS_DB_UI_FONT_SIZE", 12, RangedValidator<int>(4, 40)); + db.Add<std::string>("UI.title-font", "OPTIONS_DB_UI_TITLE_FONT", "DejaVuSans.ttf"); + db.Add("UI.title-font-size", "OPTIONS_DB_UI_TITLE_FONT_SIZE", 12, RangedValidator<int>(4, 40)); // colors - db.Add("UI.wnd-color", "OPTIONS_DB_UI_WND_COLOR", StreamableColor(GG::Clr(0, 0, 0, 210)), Validator<StreamableColor>()); - db.Add("UI.text-color", "OPTIONS_DB_UI_TEXT_COLOR", StreamableColor(GG::Clr(255, 255, 255, 255)), Validator<StreamableColor>()); - db.Add("UI.ctrl-color", "OPTIONS_DB_UI_CTRL_COLOR", StreamableColor(GG::Clr(30, 30, 30, 255)), Validator<StreamableColor>()); - db.Add("UI.ctrl-border-color", "OPTIONS_DB_UI_CTRL_BORDER_COLOR", StreamableColor(GG::Clr(124, 124, 124, 255)), Validator<StreamableColor>()); - db.Add("UI.button-color", "OPTIONS_DB_UI_BUTTON_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.state-button-color", "OPTIONS_DB_UI_STATE_BUTTON_COLOR", StreamableColor(GG::Clr(0, 127, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.scroll-tab-color", "OPTIONS_DB_UI_SCROLL_TAB_COLOR", StreamableColor(GG::Clr(60, 60, 60, 255)), Validator<StreamableColor>()); - db.Add("UI.dropdownlist-interior-color", "OPTIONS_DB_UI_DROPDOWNLIST_INTERIOR_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.dropdownlist-arrow-color", "OPTIONS_DB_UI_DROPDOWNLIST_ARROW_COLOR", StreamableColor(GG::Clr(130, 130, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.edit-hilite", "OPTIONS_DB_UI_EDIT_HILITE", StreamableColor(GG::Clr(43, 81, 102, 255)), Validator<StreamableColor>()); - db.Add("UI.edit-interior", "OPTIONS_DB_UI_EDIT_INTERIOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.multiedit-interior", "OPTIONS_DB_UI_MULTIEDIT_INTERIOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.stat-increase-color", "OPTIONS_DB_UI_STAT_INCREASE_COLOR", StreamableColor(GG::Clr(0, 255, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.stat-decrease-color", "OPTIONS_DB_UI_STAT_DECREASE_COLOR", StreamableColor(GG::Clr(255, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.sidepanel-color", "OPTIONS_DB_UI_SIDEPANEL_COLOR", StreamableColor(GG::Clr(0, 0, 0, 220)), Validator<StreamableColor>()); - db.Add("UI.wnd-outer-border-color", "OPTIONS_DB_UI_WND_OUTER_BORDER_COLOR", StreamableColor(GG::Clr(64, 64, 64, 255)), Validator<StreamableColor>()); - db.Add("UI.wnd-border-color", "OPTIONS_DB_UI_WND_BORDER_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); - db.Add("UI.wnd-inner-border-color", "OPTIONS_DB_UI_WND_INNER_BORDER_COLOR", StreamableColor(GG::Clr(255, 255, 255, 255)), Validator<StreamableColor>()); - db.Add("UI.known-tech", "OPTIONS_DB_UI_KNOWN_TECH", StreamableColor(GG::Clr(72, 72, 72, 255)), Validator<StreamableColor>()); - db.Add("UI.known-tech-border", "OPTIONS_DB_UI_KNOWN_TECH_BORDER", StreamableColor(GG::Clr(164, 164, 164, 255)), Validator<StreamableColor>()); - db.Add("UI.researchable-tech", "OPTIONS_DB_UI_RESEARCHABLE_TECH", StreamableColor(GG::Clr(48, 48, 48, 255)), Validator<StreamableColor>()); - db.Add("UI.researchable-tech-border", "OPTIONS_DB_UI_RESEARCHABLE_TECH_BORDER", StreamableColor(GG::Clr(164, 164, 164, 255)), Validator<StreamableColor>()); - db.Add("UI.unresearchable-tech", "OPTIONS_DB_UI_UNRESEARCHABLE_TECH", StreamableColor(GG::Clr(30, 30, 30, 255)), Validator<StreamableColor>()); - db.Add("UI.unresearchable-tech-border", "OPTIONS_DB_UI_UNRESEARCHABLE_TECH_BORDER", StreamableColor(GG::Clr(86, 86, 86, 255)), Validator<StreamableColor>()); - db.Add("UI.tech-progress-background", "OPTIONS_DB_UI_TECH_PROGRESS_BACKGROUND", StreamableColor(GG::Clr(72, 72, 72, 255)), Validator<StreamableColor>()); - db.Add("UI.tech-progress", "OPTIONS_DB_UI_TECH_PROGRESS", StreamableColor(GG::Clr(40, 40, 40, 255)), Validator<StreamableColor>()); + db.Add("UI.wnd-color", "OPTIONS_DB_UI_WND_COLOR", StreamableColor(GG::Clr(0, 0, 0, 210)), Validator<StreamableColor>()); + db.Add("UI.text-color", "OPTIONS_DB_UI_TEXT_COLOR", StreamableColor(GG::Clr(255, 255, 255, 255)), Validator<StreamableColor>()); + db.Add("UI.ctrl-color", "OPTIONS_DB_UI_CTRL_COLOR", StreamableColor(GG::Clr(30, 30, 30, 255)), Validator<StreamableColor>()); + db.Add("UI.ctrl-border-color", "OPTIONS_DB_UI_CTRL_BORDER_COLOR", StreamableColor(GG::Clr(124, 124, 124, 255)), Validator<StreamableColor>()); + db.Add("UI.button-color", "OPTIONS_DB_UI_BUTTON_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.state-button-color", "OPTIONS_DB_UI_STATE_BUTTON_COLOR", StreamableColor(GG::Clr(0, 127, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.scroll-tab-color", "OPTIONS_DB_UI_SCROLL_TAB_COLOR", StreamableColor(GG::Clr(60, 60, 60, 255)), Validator<StreamableColor>()); + db.Add("UI.dropdownlist-interior-color", "OPTIONS_DB_UI_DROPDOWNLIST_INTERIOR_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.dropdownlist-arrow-color", "OPTIONS_DB_UI_DROPDOWNLIST_ARROW_COLOR", StreamableColor(GG::Clr(130, 130, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.edit-hilite", "OPTIONS_DB_UI_EDIT_HILITE", StreamableColor(GG::Clr(43, 81, 102, 255)), Validator<StreamableColor>()); + db.Add("UI.edit-interior", "OPTIONS_DB_UI_EDIT_INTERIOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.multiedit-interior", "OPTIONS_DB_UI_MULTIEDIT_INTERIOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.stat-increase-color", "OPTIONS_DB_UI_STAT_INCREASE_COLOR", StreamableColor(GG::Clr(0, 255, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.stat-decrease-color", "OPTIONS_DB_UI_STAT_DECREASE_COLOR", StreamableColor(GG::Clr(255, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.sidepanel-color", "OPTIONS_DB_UI_SIDEPANEL_COLOR", StreamableColor(GG::Clr(0, 0, 0, 220)), Validator<StreamableColor>()); + db.Add("UI.wnd-outer-border-color", "OPTIONS_DB_UI_WND_OUTER_BORDER_COLOR", StreamableColor(GG::Clr(64, 64, 64, 255)), Validator<StreamableColor>()); + db.Add("UI.wnd-border-color", "OPTIONS_DB_UI_WND_BORDER_COLOR", StreamableColor(GG::Clr(0, 0, 0, 255)), Validator<StreamableColor>()); + db.Add("UI.wnd-inner-border-color", "OPTIONS_DB_UI_WND_INNER_BORDER_COLOR", StreamableColor(GG::Clr(255, 255, 255, 255)), Validator<StreamableColor>()); + db.Add("UI.known-tech", "OPTIONS_DB_UI_KNOWN_TECH", StreamableColor(GG::Clr(72, 72, 72, 255)), Validator<StreamableColor>()); + db.Add("UI.known-tech-border", "OPTIONS_DB_UI_KNOWN_TECH_BORDER", StreamableColor(GG::Clr(164, 164, 164, 255)), Validator<StreamableColor>()); + db.Add("UI.researchable-tech", "OPTIONS_DB_UI_RESEARCHABLE_TECH", StreamableColor(GG::Clr(48, 48, 48, 255)), Validator<StreamableColor>()); + db.Add("UI.researchable-tech-border", "OPTIONS_DB_UI_RESEARCHABLE_TECH_BORDER", StreamableColor(GG::Clr(164, 164, 164, 255)), Validator<StreamableColor>()); + db.Add("UI.unresearchable-tech", "OPTIONS_DB_UI_UNRESEARCHABLE_TECH", StreamableColor(GG::Clr(30, 30, 30, 255)), Validator<StreamableColor>()); + db.Add("UI.unresearchable-tech-border", "OPTIONS_DB_UI_UNRESEARCHABLE_TECH_BORDER", StreamableColor(GG::Clr(86, 86, 86, 255)), Validator<StreamableColor>()); + db.Add("UI.tech-progress-background", "OPTIONS_DB_UI_TECH_PROGRESS_BACKGROUND", StreamableColor(GG::Clr(72, 72, 72, 255)), Validator<StreamableColor>()); + db.Add("UI.tech-progress", "OPTIONS_DB_UI_TECH_PROGRESS", StreamableColor(GG::Clr(40, 40, 40, 255)), Validator<StreamableColor>()); // misc - db.Add("UI.scroll-width", "OPTIONS_DB_UI_SCROLL_WIDTH", 14, RangedValidator<int>(8, 30)); - db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); - db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 1.0, RangedValidator<double>(0.2, 2)); - db.Add("UI.system-selection-indicator-size", "OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE", 2.0, RangedValidator<double>(0.5, 5)); + db.Add("UI.scroll-width", "OPTIONS_DB_UI_SCROLL_WIDTH", 14, RangedValidator<int>(8, 30)); + db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); + db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 1.0, RangedValidator<double>(0.2, 2)); + db.Add("UI.system-selection-indicator-size","OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE",2.0, RangedValidator<double>(0.5, 5)); // UI behavior - db.Add("UI.tooltip-delay", "OPTIONS_DB_UI_TOOLTIP_DELAY", 1000, RangedValidator<int>(0, 3000)); - db.Add("UI.multiple-fleet-windows", "OPTIONS_DB_UI_MULTIPLE_FLEET_WINDOWS", false); - db.Add("UI.fleet-autoselect", "OPTIONS_DB_UI_FLEET_AUTOSELECT", true); - db.Add("UI.window-quickclose", "OPTIONS_DB_UI_WINDOW_QUICKCLOSE", true); + db.Add("UI.tooltip-delay", "OPTIONS_DB_UI_TOOLTIP_DELAY", 1000, RangedValidator<int>(0, 3000)); + db.Add("UI.multiple-fleet-windows", "OPTIONS_DB_UI_MULTIPLE_FLEET_WINDOWS", false); + db.Add("UI.fleet-autoselect", "OPTIONS_DB_UI_FLEET_AUTOSELECT", true); + db.Add("UI.window-quickclose", "OPTIONS_DB_UI_WINDOW_QUICKCLOSE", true); } bool temp_bool = RegisterOptions(&AddOptions); } @@ -420,7 +421,7 @@ m_map_wnd->Hide(); } -ClientUI::~ClientUI() +ClientUI::~ClientUI() { delete m_map_wnd; s_the_UI = 0; @@ -487,9 +488,8 @@ } bool ClientUI::ZoomToEncyclopediaEntry(const std::string& str) -{ +{ // TODO: Zooming code - return false; } Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-25 06:07:54 UTC (rev 2673) @@ -1681,7 +1681,21 @@ SITREP_EMPIRE_ELIMINATED The %name% empire has been eliminated. +SITREP_VICTORY +%1% + #################### +# Victory / Defeat # +#################### + +TECH_VICTORY +The %1% empire has achived a technological victory. + +ALL_ENEMIES_ELIMINATED_VICTORY +The %1% empire has achived a sole-survivor victory. + + +#################### # Specials # #################### Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -52,11 +52,10 @@ // ServerSaveGameData //////////////////////////////////////////////// ServerSaveGameData::ServerSaveGameData() : - m_current_turn(-1), - m_victors() + m_current_turn(-1) {} -ServerSaveGameData::ServerSaveGameData(const int& current_turn, const std::set<int>& victors) : +ServerSaveGameData::ServerSaveGameData(const int& current_turn, const std::map<int, std::set<std::string> >& victors) : m_current_turn(current_turn), m_victors(victors) {} @@ -742,50 +741,92 @@ } - // check for victory conditions... + // check for eliminated empires and players + std::map<int, int> eliminations; // map from player id to empire id of eliminated players + for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) { + empire = it->second; + if (!EmpireEliminated(empire, universe)) + continue; + int elim_empire_id = it->first; + int elim_player_id = GetEmpirePlayerID(elim_empire_id); + eliminations[elim_player_id] = elim_empire_id; + } - // marked by Victory effect - const std::set<int>& marked_for_victory = universe.GetMarkedForVictory(); - for (std::set<int>::const_iterator it = marked_for_victory.begin(); it != marked_for_victory.end(); ++it) { - const UniverseObject* obj = universe.Object(*it); + + // check for victorious players + std::map<int, std::set<std::string> > new_victors; // map from player ID to set of victory reason strings + + // marked by Victory effect? + const std::multimap<int, std::string>& marked_for_victory = universe.GetMarkedForVictory(); + for (std::multimap<int, std::string>::const_iterator it = marked_for_victory.begin(); it != marked_for_victory.end(); ++it) { + const UniverseObject* obj = universe.Object(it->first); if (!obj) continue; // perhaps it was destroyed? const std::set<int>& owners = obj->Owners(); if (owners.size() == 1) { int empire_id = *owners.begin(); if (empires.Lookup(empire_id)) - m_victors.insert(GetEmpirePlayerID(empire_id)); + new_victors[GetEmpirePlayerID(empire_id)].insert(it->second); } } + // all enemies eliminated? + if (eliminations.size() == m_networking.NumPlayers() - 1) { + // only one player not eliminated. treat this as a win for the remaining player + ServerNetworking::established_iterator player_it = m_networking.established_begin(); + if (player_it != m_networking.established_end()) { + boost::shared_ptr<PlayerConnection> pc = *player_it; + int cur_player_id = pc->ID(); + if (eliminations.find(cur_player_id) == eliminations.end()) + new_victors[cur_player_id].insert("ALL_ENEMIES_ELIMINATED_VICTORY"); + } + } - // check for and clean up eliminated empires and players - std::map<int, int> eliminations; // map from player id to empire id of eliminated players - for (EmpireManager::const_iterator it = empires.begin(); it != empires.end(); ++it) { - empire = it->second; - if (!EmpireEliminated(empire, universe)) - continue; - int elim_empire_id = it->first; - int elim_player_id = GetEmpirePlayerID(elim_empire_id); - eliminations[elim_player_id] = elim_empire_id; + // check if any victors are new. (don't want to re-announce old victors each subsequent turn) + if (!new_victors.empty()) { + for (std::map<int, std::set<std::string> >::const_iterator it = new_victors.begin(); it != new_victors.end(); ++it) { + int victor_player_id = it->first; - // remove eliminated empire's ownership of UniverseObjects - Universe::ObjectVec object_vec = GetUniverse().FindObjects(OwnedVisitor<UniverseObject>(elim_empire_id)); - for (Universe::ObjectVec::iterator obj_it = object_vec.begin(); obj_it != object_vec.end(); ++obj_it) - (*obj_it)->RemoveOwner(elim_empire_id); + const std::set<std::string>& reasons = it->second; + for (std::set<std::string>::const_iterator reason_it = reasons.begin(); reason_it != reasons.end(); ++reason_it) { + std::string reason_string = *reason_it; - // notify all players of disconnection, and end game of eliminated player - for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { - boost::shared_ptr<PlayerConnection> pc = *player_it; - int cur_player_id = pc->ID(); - if (cur_player_id == elim_player_id) { - m_ai_clients.erase(pc->PlayerName()); - pc->SendMessage(EndGameMessage(elim_player_id, Message::YOU_ARE_ELIMINATED)); - } else { - pc->SendMessage(PlayerEliminatedMessage(cur_player_id, elim_empire_id, empire->Name())); - if (Empire* recipient_empire = GetPlayerEmpire(cur_player_id)) - recipient_empire->AddSitRepEntry(CreateEmpireEliminatedSitRep(empire->Name())); + // see if player has already won the game... + bool new_victory = false; + std::map<int, std::set<std::string> >::const_iterator vict_it = m_victors.find(victor_player_id); + if (vict_it == m_victors.end()) { + // player hasn't yet won, so victory is new + new_victory = true; + } else { + // player has won at least once, but also need to check of the type of victory is new + std::set<std::string>::const_iterator vict_type_it = vict_it->second.find(reason_string); + if (vict_type_it == vict_it->second.end()) + new_victory = true; + } + + if (new_victory) { + // record victory + m_victors[victor_player_id].insert(reason_string); + + empire = GetPlayerEmpire(victor_player_id); + if (!empire) { + Logger().errorStream() << "Trying to grant victory to a missing empire!"; + continue; + } + const std::string& victor_empire_name = empire->Name(); + int victor_empire_id = empire->EmpireID(); + + + // notify all players of victory + for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { + boost::shared_ptr<PlayerConnection> pc = *player_it; + int recipient_player_id = pc->ID(); + pc->SendMessage(VictoryDefeatMessage(recipient_player_id, Message::VICTORY, reason_string, victor_empire_id)); + if (Empire* recipient_empire = GetPlayerEmpire(recipient_player_id)) + recipient_empire->AddSitRepEntry(CreateVictorySitRep(reason_string, victor_empire_name)); + } + } } } } @@ -794,8 +835,40 @@ if (!eliminations.empty()) { Sleep(1000); // time for elimination messages to propegate + // inform all players of eliminations + for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { + int elim_player_id = it->first; + int elim_empire_id = it->second; + empire = empires.Lookup(elim_empire_id); + if (!empire) { + Logger().errorStream() << "Trying to eliminate a missing empire!"; + continue; + } + const std::string& elim_empire_name = empire->Name(); + + // notify all players of disconnection, and end game of eliminated player + for (ServerNetworking::const_established_iterator player_it = m_networking.established_begin(); player_it != m_networking.established_end(); ++player_it) { + boost::shared_ptr<PlayerConnection> pc = *player_it; + int recipient_player_id = pc->ID(); + if (recipient_player_id == elim_player_id) { + pc->SendMessage(EndGameMessage(recipient_player_id, Message::YOU_ARE_ELIMINATED)); + m_ai_clients.erase(pc->PlayerName()); // done now so that PlayerConnection doesn't need to be re-retreived when dumping connections + } else { + pc->SendMessage(PlayerEliminatedMessage(recipient_player_id, elim_empire_id, elim_empire_name)); // PlayerEliminatedMessage takes the eliminated empire id, not the eliminated player id, for unknown reasons, as of this writing + if (Empire* recipient_empire = GetPlayerEmpire(recipient_player_id)) + recipient_empire->AddSitRepEntry(CreateEmpireEliminatedSitRep(elim_empire_name)); + } + } + } + // dump connections to eliminated players, and remove server-side empire data for (std::map<int, int>::iterator it = eliminations.begin(); it != eliminations.end(); ++it) { + int elim_empire_id = it->second; + // remove eliminated empire's ownership of UniverseObjects + Universe::ObjectVec object_vec = GetUniverse().FindObjects(OwnedVisitor<UniverseObject>(elim_empire_id)); + for (Universe::ObjectVec::iterator obj_it = object_vec.begin(); obj_it != object_vec.end(); ++obj_it) + (*obj_it)->RemoveOwner(elim_empire_id); + m_log_category.debugStream() << "ServerApp::ProcessTurns : Player " << it->first << " is eliminated and dumped"; m_eliminated_players.insert(it->first); m_networking.Disconnect(it->first); Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/server/ServerApp.h 2008-08-25 06:07:54 UTC (rev 2673) @@ -48,11 +48,11 @@ the universe */ struct ServerSaveGameData { - ServerSaveGameData(); ///< default ctor - ServerSaveGameData(const int& current_turn, const std::set<int>& victors); + ServerSaveGameData(); ///< default ctor + ServerSaveGameData(const int& current_turn, const std::map<int, std::set<std::string> >& victors); - int m_current_turn; - std::set<int> m_victors; ///< ids of players who have won the game + int m_current_turn; + std::map<int, std::set<std::string> > m_victors; ///< for each player id, the victory types that player has achived private: friend class boost::serialization::access; @@ -164,8 +164,8 @@ // turn sequence map is used for turn processing. Each empire is added at the start of a game or reload and then the map maintains OrderSets for that turn std::map<int, OrderSet*> m_turn_sequence; - std::set<int> m_victors; ///< the IDs of players who have won the game - std::set<int> m_eliminated_players; ///< ids of players whose connections have been severed by the server after they were eliminated + std::map<int, std::set<std::string> > m_victors; ///< for each player id, the victory types that player has achived + std::set<int> m_eliminated_players; ///< ids of players whose connections have been severed by the server after they were eliminated static ServerApp* s_app; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/universe/Effect.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -976,12 +976,13 @@ /////////////////////////////////////////////////////////// // Victory // /////////////////////////////////////////////////////////// -Victory::Victory() +Victory::Victory(const std::string& reason_string) : + m_reason_string(reason_string) {} void Victory::Execute(const UniverseObject* source, UniverseObject* target) const { - GetUniverse().EffectVictory(target->ID()); + GetUniverse().EffectVictory(target->ID(), m_reason_string); } std::string Victory::Description() const @@ -991,7 +992,7 @@ std::string Victory::Dump() const { - return DumpIndent() + "Victory\n"; + return DumpIndent() + "Victory reason = \"" + m_reason_string + "\"\n"; } Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/universe/Effect.h 2008-08-25 06:07:54 UTC (rev 2673) @@ -388,13 +388,15 @@ class Effect::Victory : public Effect::EffectBase { public: - Victory(); + Victory(const std::string& reason_string); virtual void Execute(const UniverseObject* source, UniverseObject* target) const; virtual std::string Description() const; virtual std::string Dump() const; private: + std::string m_reason_string; + friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); @@ -560,7 +562,8 @@ template <class Archive> void Effect::Victory::serialize(Archive& ar, const unsigned int version) { - ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase); + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) + & BOOST_SERIALIZATION_NVP(m_reason_string); } template <class Archive> Modified: trunk/FreeOrion/universe/EffectParser.cpp =================================================================== --- trunk/FreeOrion/universe/EffectParser.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/universe/EffectParser.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -116,7 +116,7 @@ CreateBuildingRule create_building; ConditionParamRule move_to; Rule destroy; - Rule victory; + NameParamRule victory; NameParamRule add_special; NameParamRule remove_special; SetStarTypeRule set_star_type; @@ -128,6 +128,7 @@ ParamLabel empire_label; ParamLabel name_label; ParamLabel destination_label; + ParamLabel reason_label; }; EffectParserDefinition::EffectParserDefinition() : @@ -136,7 +137,8 @@ planetsize_label("size"), empire_label("empire"), name_label("name"), - destination_label("destination") + destination_label("destination"), + reason_label("reason") { set_meter = ((str_p("setmax")[set_meter.max_meter = val(true)] @@ -210,8 +212,9 @@ [destroy.this_ = new_<Effect::Destroy>()]; victory = - str_p("victory") - [victory.this_ = new_<Effect::Victory>()]; + (str_p("victory") + >> reason_label >> name_p[victory.name = arg1]) + [victory.this_ = new_<Effect::Victory>(victory.name)]; add_special = (str_p("addspecial") Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -1174,9 +1174,9 @@ m_marked_destroyed.insert(id); } -void Universe::EffectVictory(int object_id) +void Universe::EffectVictory(int object_id, const std::string& reason_string) { - m_marked_for_victory.insert(object_id); + m_marked_for_victory.insert(std::pair<int, std::string>(object_id, reason_string)); } void Universe::HandleEmpireElimination(int empire_id) Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/universe/Universe.h 2008-08-25 06:07:54 UTC (rev 2673) @@ -197,7 +197,7 @@ const EffectAccountingMap& GetEffectAccountingMap() const {return m_effect_accounting_map;} /** returns set of objects that have been marked by the Victory effect to grant their owners victory. */ - const std::set<int>& GetMarkedForVictory() const {return m_marked_for_victory;} + const std::multimap<int, std::string>& GetMarkedForVictory() const {return m_marked_for_victory;} mutable UniverseObjectDeleteSignalType UniverseObjectDeleteSignal; ///< the state changed signal object for this UniverseObject //@} @@ -270,7 +270,7 @@ void HandleEmpireElimination(int empire_id); ///< cleans up internal storage of now-invalidated empire ID - void EffectVictory(int object_id); ///< used by the Victory effect to mark an object to give it owner victory + void EffectVictory(int object_id, const std::string& reason_string); ///< used by the Victory effect to mark an object to give it owner victory /** sets whether to inhibit UniverseObjectSignals. Inhibits if \a inhibit is true, and (re)enables UniverseObjectSignals if \a inhibit is false. */ static void InhibitUniverseObjectSignals(bool inhibit = true); @@ -398,8 +398,8 @@ int m_last_allocated_object_id; int m_last_allocated_design_id; - std::set<int> m_marked_destroyed; ///< used while applying effects to cache objects that have been destroyed. this allows to-be-destroyed objects to remain undestroyed until all effects have been processed, which ensures that to-be-destroyed objects still exist when other effects need to access them as a source object - std::set<int> m_marked_for_victory; ///< used while applying effects to cache objects whose owner should be victorious. Victory testing is done separately from effects execution, so this needs to be stored temporarily... + std::set<int> m_marked_destroyed; ///< used while applying effects to cache objects that have been destroyed. this allows to-be-destroyed objects to remain undestroyed until all effects have been processed, which ensures that to-be-destroyed objects still exist when other effects need to access them as a source object + std::multimap<int, std::string> m_marked_for_victory; ///< used while applying effects to cache objects whose owner should be victorious. Victory testing is done separately from effects execution, so this needs to be stored temporarily... static double s_universe_width; static bool s_inhibit_universe_object_signals; Modified: trunk/FreeOrion/util/SitRepEntry.cpp =================================================================== --- trunk/FreeOrion/util/SitRepEntry.cpp 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/util/SitRepEntry.cpp 2008-08-25 06:07:54 UTC (rev 2673) @@ -137,3 +137,19 @@ return(sitrep); } + +SitRepEntry* CreateVictorySitRep(const std::string& reason_string, const std::string& empire_name) { + SitRepEntry* sitrep = new SitRepEntry(); + + sitrep->SetType(SitRepEntry::VICTORY); + + XMLElement reason_elem("reason"); + reason_elem.SetAttribute("value", reason_string); + sitrep->GetVariables().AppendChild(reason_elem); + + XMLElement name_elem("name"); + name_elem.SetAttribute("value", empire_name); + sitrep->GetVariables().AppendChild(name_elem); + + return(sitrep); +} Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2008-08-24 07:12:32 UTC (rev 2672) +++ trunk/FreeOrion/util/SitRepEntry.h 2008-08-25 06:07:54 UTC (rev 2673) @@ -43,6 +43,7 @@ PLANET_COLONIZED, FLEET_ARRIVED_AT_DESTINATION, EMPIRE_ELIMINATED, + VICTORY, NUM_SITREP_TYPES }; @@ -83,6 +84,8 @@ SitRepEntry* CreateEmpireEliminatedSitRep(const std::string& empire_name); +SitRepEntry* CreateVictorySitRep(const std::string& reason_string, const std::string& empire_name); + // template implementations template <class Archive> void SitRepEntry::serialize(Archive& ar, const unsigned int version) |
From: <geo...@us...> - 2008-08-25 08:35:03
|
Revision: 2674 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2674&view=rev Author: geoffthemedio Date: 2008-08-25 08:35:12 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Fixed [ 2008670 ] Fleet movement lines drawn incorrectly Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/python/PythonUniverseWrapper.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-25 06:07:54 UTC (rev 2673) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-25 08:35:12 UTC (rev 2674) @@ -120,6 +120,8 @@ const System* src; const System* dst; }; + + void (MapWnd::*SetFleetMovementLineFunc)(const Fleet*) = &MapWnd::SetFleetMovementLine; } //////////////////////////////////////////////////////////// @@ -925,11 +927,15 @@ // remove old fleet buttons for fleets not in systems - for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { + for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) DeleteChild(m_moving_fleet_buttons[i]); - } m_moving_fleet_buttons.clear(); + // disconnect old moving fleet statechangedsignal connections + for (std::vector<boost::signals::connection>::iterator it = m_fleet_state_change_signals.begin(); it != m_fleet_state_change_signals.end(); ++it) + it->disconnect(); + m_fleet_state_change_signals.clear(); + Universe::ObjectVec fleets = universe.FindObjects(MovingFleetVisitor()); typedef std::multimap<std::pair<double, double>, UniverseObject*> SortedFleetMap; SortedFleetMap position_sorted_fleets; @@ -960,8 +966,17 @@ for (std::vector<FleetButton*>::iterator it = m_moving_fleet_buttons.begin(); it != m_moving_fleet_buttons.end(); ++it) SetFleetMovementLine(*it); + // connect fleet change signals to update moving fleet movement lines, so that ordering moving fleets to move + // updates their displayed path + for (Universe::ObjectVec::const_iterator it = fleets.begin(); it != fleets.end(); ++it) { + const Fleet* moving_fleet = universe_object_cast<const Fleet*>(*it); + if (!moving_fleet) { + Logger().errorStream() << "MapWnd::InitTurn couldn't cast a (supposed) moving fleet pointer to a Fleet*"; + continue; + } + m_fleet_state_change_signals.push_back(GG::Connect(moving_fleet->StateChangedSignal, boost::bind(SetFleetMovementLineFunc, this, moving_fleet))); + } - MoveChildUp(m_side_panel); // set turn button to current turn Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2008-08-25 06:07:54 UTC (rev 2673) +++ trunk/FreeOrion/UI/MapWnd.h 2008-08-25 08:35:12 UTC (rev 2674) @@ -239,7 +239,9 @@ CUIEdit* m_chat_edit; //!< MP-chat input edit box std::vector<FleetButton*> m_moving_fleet_buttons; //!< moving fleets in the main map (SystemIcons contain stationary fleet buttons) + std::vector<boost::signals::connection> m_fleet_state_change_signals; + std::map<const Fleet*, MovementLineData> m_fleet_lines; //!< lines used for moving fleets in the main map std::map<const Fleet*, std::vector<FleetETAMapIndicator*> > m_fleet_eta_map_indicators; //!< indicators that appear adjacent to fleet move lines that indicate the eta for points on a move path Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2008-08-25 06:07:54 UTC (rev 2673) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2008-08-25 08:35:12 UTC (rev 2674) @@ -21,7 +21,7 @@ const System* (Universe::*UniverseGetSystem)(int) = &Universe::Object; const Building* (Universe::*UniverseGetBuilding)(int) = &Universe::Object; - void (Universe::*UpdateMeterEstimatesVoidFunc)(void) = &Universe::UpdateMeterEstimates; + void (Universe::*UpdateMeterEstimatesVoidFunc)(void) = &Universe::UpdateMeterEstimates; std::vector<int> LeastJumpsPath(const Universe* universe, int start_sys, int end_sys, int empire_id) { std::pair<std::list<System*>, int> path = universe->LeastJumpsPath(start_sys, end_sys, empire_id); @@ -30,7 +30,7 @@ retval.push_back((*it)->ID()); return retval; } - boost::function<std::vector<int>(const Universe*, int, int, int)> LeastJumpsFunc = &LeastJumpsPath; + boost::function<std::vector<int>(const Universe*, int, int, int)> LeastJumpsFunc = &LeastJumpsPath; const Meter* (UniverseObject::*ObjectGetMeter)(MeterType) const = &UniverseObject::GetMeter; @@ -54,7 +54,7 @@ unsigned int (HullType::*NumSlotsOfSlotType)(ShipSlotType) const = &HullType::NumSlots; } - namespace FreeOrionPython { +namespace FreeOrionPython { using boost::python::def; using boost::python::class_; using boost::python::bases; |
From: <geo...@us...> - 2008-08-25 09:02:55
|
Revision: 2675 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2675&view=rev Author: geoffthemedio Date: 2008-08-25 09:03:03 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Tweaked encyclopedia effects text Modified Paths: -------------- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2008-08-25 08:35:12 UTC (rev 2674) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2008-08-25 09:03:03 UTC (rev 2675) @@ -241,7 +241,8 @@ cost_units = UserString("ENC_PP"); general_type = UserString("ENC_SHIP_PART"); specific_type = UserString(boost::lexical_cast<std::string>(m_part->Class())); - detailed_description = UserString(m_part->Description()) + EffectsDescription(m_part->Effects()); + detailed_description = UserString(m_part->Description()) + + boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(m_part->Effects())); } else if (m_hull) { // Ship Hulls @@ -252,7 +253,8 @@ cost_units = UserString("ENC_PP"); general_type = UserString("ENC_SHIP_HULL"); // hulls have no specific types - detailed_description = UserString(m_hull->Description()) + EffectsDescription(m_hull->Effects()); + detailed_description = UserString(m_hull->Description()) + + boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(m_hull->Effects())); } else if (m_tech) { // Technologies @@ -306,7 +308,7 @@ % specific_type % general_type)); - m_cost_text->SetText(str(format(UserString("END_COST_AND_TURNS_STR")) + m_cost_text->SetText(str(format(UserString("ENC_COST_AND_TURNS_STR")) % static_cast<int>(cost + 0.5) % cost_units % turns)); Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-25 08:35:12 UTC (rev 2674) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-25 09:03:03 UTC (rev 2675) @@ -1282,10 +1282,10 @@ Navigation TECH_TOTAL_COST_STR -%1% RP / Turn @ %2% Turns +%2% Turns @ %1% RP / Turn TECH_TURN_COST_STR -%1% RP / Turn @ %2% Turns +%2% Turns @ %1% RP / Turn TECH_TURNS_LEFT_STR %1% Turns @@ -1556,12 +1556,12 @@ # %1% will be the max cost per turn (a number, the max amount that can be spent per turn on this thing) # %2% will be one of ENC_PP or END_RP, depending on what the thing shown costs to build / research # %3% will be the minimum number of turns it takes to produce or research the thing shown -END_COST_AND_TURNS_STR -%1% %2% / Turn @ %3% Turns +ENC_COST_AND_TURNS_STR +%3% Turns @ %1% %2% / Turn # autogenerated effects description. %1% will be the autogenerated effects text. This string should # provide an appropriate heading to appear before the autogenerated text. -END_EFFECTS_STR +ENC_EFFECTS_STR ''' <u>Effects</u> |
From: <geo...@us...> - 2008-08-30 06:19:41
|
Revision: 2676 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2676&view=rev Author: geoffthemedio Date: 2008-08-30 06:19:48 +0000 (Sat, 30 Aug 2008) Log Message: ----------- -Coloured starlanes along which an empire can exchange resources with the colour of that empire. Current this only lets each starlane have a single colour, so if multiple empires supply lines overlap, only one is shown. -Made client-side calculations of all empires resource and fleet supply use the client's player's known starlanes. Because the player doesn't know what starlanes other empires have explored, previously client-side calculation of fleet and resource supply exchange always resulted in no exchange possible, as the client has empty lists of explored systems of other empires. Now all empires' fleet supply and resource supply routes are shown on the map. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/default/specials.txt trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/util/SitRepEntry.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-30 06:19:48 UTC (rev 2676) @@ -70,7 +70,7 @@ } } } - + // sets the .spending, value for each Element in the queue. Only sets nonzero funding to // an Element if its ProductionItem is buildable this turn. Also determines total number // of spent PP (returning by reference in total_PPs_spent) @@ -944,32 +944,40 @@ for (Universe::ObjectVec::const_iterator it = owned_planets.begin(); it != owned_planets.end(); ++it) { const UniverseObject* obj = *it; - // check if object has a supply meter - const Meter* supply_meter = obj->GetMeter(METER_SUPPLY); - if (!supply_meter) continue; - // ensure object is within a system, from which it can distribute supplies int system_id = obj->SystemID(); if (system_id == UniverseObject::INVALID_OBJECT_ID) continue; // TODO: consider future special case if current object is itself a system + // check if object has a construction meter + if (const Meter* construction = obj->GetMeter(METER_CONSTRUCTION)) { + // get resource supply range for next turn for this object + int resource_supply_range = static_cast<int>(floor(obj->ProjectedCurrentMeter(METER_CONSTRUCTION) / 20.0)); - // for now, all planet can trasport supplies only one starlane jump - m_resource_supply_system_ranges[system_id] = 1; + // if this object can provide more resource supply range than the best previously checked object in this system, record its range as the new best for the system + std::map<int, int>::iterator system_it = m_resource_supply_system_ranges.find(system_id); // try to find a previous entry for this system's supply range + if (system_it == m_resource_supply_system_ranges.end() || resource_supply_range > system_it->second) // if there is no previous entry, or the previous entry is shorter than the new one, add or replace the entry + m_resource_supply_system_ranges[system_id] = resource_supply_range; + } + // check if object has a supply meter + if (const Meter* supply_meter = obj->GetMeter(METER_SUPPLY)) { + // get fleet supply range for next turn for this object + int fleet_supply_range = static_cast<int>(floor(obj->ProjectedCurrentMeter(METER_SUPPLY))); - // get fleet supply range for next turn for this object - int fleet_supply_range = static_cast<int>(floor(obj->ProjectedCurrentMeter(METER_SUPPLY))); - - // if this object can provide more supply than the best previously checked object in this system, record its range as the new best for the system - std::map<int, int>::iterator system_it = m_fleet_supply_system_ranges.find(system_id); // try to find a previous entry for this system's supply range - if (system_it == m_fleet_supply_system_ranges.end() || fleet_supply_range > system_it->second) { // if there is no previous entry, or the previous entry is shorter than the new one, add or replace the entry - m_fleet_supply_system_ranges[system_id] = fleet_supply_range; + // if this object can provide more supply than the best previously checked object in this system, record its range as the new best for the system + std::map<int, int>::iterator system_it = m_fleet_supply_system_ranges.find(system_id); // try to find a previous entry for this system's supply range + if (system_it == m_fleet_supply_system_ranges.end() || fleet_supply_range > system_it->second) // if there is no previous entry, or the previous entry is shorter than the new one, add or replace the entry + m_fleet_supply_system_ranges[system_id] = fleet_supply_range; } } } -void Empire::UpdateSupplyUnobstructedSystems() +void Empire::UpdateSupplyUnobstructedSystems() { + UpdateSupplyUnobstructedSystems(this->ExploredSystems()); +} + +void Empire::UpdateSupplyUnobstructedSystems(const std::set<int>& explored_systems) { m_supply_unobstructed_systems.clear(); @@ -982,7 +990,7 @@ // to be unobstructed, systems must both: // be explored by this empire... - if (m_explored_systems.find(system_id) == m_explored_systems.end()) + if (explored_systems.find(system_id) == explored_systems.end()) continue; // ...and ( contain a friendly fleet *or* not contain a hostile fleet ) @@ -991,7 +999,7 @@ for (std::vector<const Fleet*>::const_iterator it = fleets.begin(); it != fleets.end(); ++it) { const Fleet* fleet = *it; - // check if this emprie owns this fleet. + // check if this empire owns this fleet. if (fleet->OwnedBy(m_id)) { // this empire owns this fleet. the system is unobstructed regardless of what else is here blocked = false; @@ -1010,6 +1018,13 @@ void Empire::UpdateFleetSupply() { + UpdateFleetSupply(this->KnownStarlanes()); +} + +void Empire::UpdateFleetSupply(const std::map<int, std::set<int> >& starlanes) +{ + Logger().debugStream() << "updating Fleet Supply for " << Name() << " empire."; + m_fleet_supplyable_system_ids.clear(); m_fleet_supply_starlane_traversals.clear(); @@ -1036,11 +1051,17 @@ } // can propegate further, if adjacent systems have smaller supply range than one less than this system's range - const System* system = GetUniverse().Object<System>(cur_sys_id); - System::StarlaneMap starlanes = system->VisibleStarlanes(m_id); - for (System::StarlaneMap::const_iterator lane_it = starlanes.begin(); lane_it != starlanes.end(); ++lane_it) { - int lane_end_sys_id = lane_it->first; + std::map<int, std::set<int> >::const_iterator system_it = starlanes.find(cur_sys_id); + if (system_it == starlanes.end()) { + // no starlanes out of this system + ++sys_list_it; + continue; + } + const std::set<int>& starlane_ends = system_it->second; + for (std::set<int>::const_iterator lane_it = starlane_ends.begin(); lane_it != starlane_ends.end(); ++lane_it) { + int lane_end_sys_id = *lane_it; + if (m_supply_unobstructed_systems.find(lane_end_sys_id) == m_supply_unobstructed_systems.end()) continue; // can't propegate here // compare next system's supply range to this system's supply range. propegate if necessary. @@ -1072,6 +1093,13 @@ void Empire::UpdateResourceSupply() { + UpdateResourceSupply(this->KnownStarlanes()); +} + +void Empire::UpdateResourceSupply(const std::map<int, std::set<int> >& starlanes) +{ + Logger().debugStream() << "updating Resource Supply for " << Name() << " empire."; + // need to get a set of sets of systems that can exchange resources. some sets may be just one system, // in which resources can be exchanged between UniverseObjects producing or consuming them, but which // can't exchange with any other systems. @@ -1080,7 +1108,8 @@ m_resource_supply_starlane_traversals.clear(); - // map from system id to set of systems that are connected to it directly + // map from system id to set of systems that are supply-connected to it directly (which may involve + // multiple starlane jumps std::map<int, std::set<int> > supply_groups_map; // all systems that can supply another system or within themselves, or can be supplied by another system. @@ -1096,17 +1125,16 @@ for (std::set<int>::const_iterator source_sys_it = m_supply_unobstructed_systems.begin(); source_sys_it != m_supply_unobstructed_systems.end(); ++source_sys_it) { int source_sys_id = *source_sys_it; + // DEBUG + const UniverseObject* asdf = GetUniverse().Object(source_sys_id); + Logger().debugStream() << " .. unobstructed system : " << asdf->Name(); + // skip systems that don't have any supply to propegate. std::map<int, int>::const_iterator system_supply_it = m_resource_supply_system_ranges.find(source_sys_id); - if (system_supply_it == m_resource_supply_system_ranges.end() || system_supply_it->second == 0) + if (system_supply_it == m_resource_supply_system_ranges.end()) continue; - // skip systems that can't propegate supply, even if they have supply to propegate - std::set<int>::const_iterator unobstructed_systems_it = m_supply_unobstructed_systems.find(source_sys_id); - if (unobstructed_systems_it == m_supply_unobstructed_systems.end()) - continue; - // system can supply itself, so store this fact supply_groups_map[source_sys_id].insert(source_sys_id); @@ -1121,7 +1149,9 @@ // initialize with source supply range propegating_system_supply_ranges[source_sys_id] = system_supply_it->second; + Logger().debugStream() << " .. can propegate suppply " << system_supply_it->second << " jumps"; + // iterate through list of accessible systems, processing each in order it was added (like breadth first // search) adding adjacent systems as appropriate, until no systems are left able to further propregate std::list<int>::iterator sys_list_it = propegating_systems_list.begin(); @@ -1139,11 +1169,13 @@ } // attempt to propegate to unobstructed adjacent systems - const System* system = GetUniverse().Object<System>(cur_sys_id); - System::StarlaneMap starlanes = system->VisibleStarlanes(m_id); - for (System::StarlaneMap::const_iterator lane_it = starlanes.begin(); lane_it != starlanes.end(); ++lane_it) { - int lane_end_sys_id = lane_it->first; + std::map<int, std::set<int> >::const_iterator system_it = starlanes.find(cur_sys_id); + if (system_it == starlanes.end()) continue; // no starlanes out of this system + const std::set<int>& starlane_ends = system_it->second; + for (std::set<int>::const_iterator lane_it = starlane_ends.begin(); lane_it != starlane_ends.end(); ++lane_it) { + int lane_end_sys_id = *lane_it; + // ensure this adjacent system is unobstructed if (m_supply_unobstructed_systems.find(lane_end_sys_id) == m_supply_unobstructed_systems.end()) continue; // can't propegate here @@ -1185,6 +1217,12 @@ } } + // DEBUG + Logger().debugStream() << "supply traversals:"; + for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_starlane_traversals.begin(); it != m_resource_supply_starlane_traversals.end(); ++it) { + Logger().debugStream() << " ... from: " << GetUniverse().Object(it->first)->Name() << " to: " << GetUniverse().Object(it->second)->Name(); + } + if (supply_groups_map.empty()) return; // need to avoid going to boost graph stuff below, which doesn't seem to like being fed empty graphs... @@ -1258,6 +1296,17 @@ // copy sets in map into set of sets for (std::map<int, std::set<int> >::const_iterator map_it = component_sets_map.begin(); map_it != component_sets_map.end(); ++map_it) { m_resource_supply_groups.insert(map_it->second); + + // DEBUG! + Logger().debugStream() << "Set: "; + for (std::set<int>::const_iterator set_it = map_it->second.begin(); set_it != map_it->second.end(); ++set_it) { + const UniverseObject* obj = GetUniverse().Object(*set_it); + if (!obj) { + Logger().debugStream() << " ... missing object!"; + continue; + } + Logger().debugStream() << " ... " << obj->Name(); + } } } @@ -1319,6 +1368,25 @@ return m_explored_systems; } +const std::map<int, std::set<int> > Empire::KnownStarlanes() const +{ + // compile starlanes leading out of each system + std::map<int, std::set<int> > starlanes; + + std::vector<const System*> systems = GetUniverse().FindObjects<const System>(); + for (std::vector<const System*>::const_iterator it = systems.begin(); it != systems.end(); ++it) { + const System* system = *it; + int start_id = system->ID(); + System::StarlaneMap lanes = system->VisibleStarlanes(m_id); + for (System::StarlaneMap::const_iterator lane_it = lanes.begin(); lane_it != lanes.end(); ++lane_it) { + int end_id = lane_it->first; + starlanes[start_id].insert(end_id); + } + } + + return starlanes; +} + Empire::ShipDesignItr Empire::ShipDesignBegin() const { return m_ship_designs.begin(); Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/Empire/Empire.h 2008-08-30 06:19:48 UTC (rev 2676) @@ -204,17 +204,12 @@ void serialize(Archive& ar, const unsigned int version); }; -/** - * Class to maintain the state of a single empire. In both the client and server, Empires are managed by a subclass of - * EmpireManager, and can be accessed from other modules by using the EmpireManager::Lookup() method to obtain a pointer. - */ +/** Class to maintain the state of a single empire. In both the client and server, Empires are managed by a subclass of + * EmpireManager, and can be accessed from other modules by using the EmpireManager::Lookup() method to obtain a pointer. */ class Empire { public: - /** - * EmpireManagers must be friends so that they can have - * access to the constructor and keep it hidden from others - */ + // EmpireManagers must be friends so that they can have access to the constructor and keep it hidden from others friend class EmpireManager; /** \name Iterator Types */ //@{ @@ -289,11 +284,12 @@ const std::set<int>& SupplyUnobstructedSystems() const; ///< returns set of system ids that are able to propegate supply from one system to the next, or at which supply can be delivered to fleets if supply can reach the system from elsewhere /** modifies passed parameter, which is a map from system id to the range, in starlane jumps that the - * system can send supplies. - */ + * system can send supplies. */ void GetSystemSupplyRanges(std::map<int, int>& system_supply_ranges) const; const std::set<int>& ExploredSystems() const; ///< returns set of ids of systems that this empire has explored + const std::map<int, std::set<int> > + KnownStarlanes() const; ///< returns map from system id (start) to set of system ids (endpoints) of all starlanes known to this empire TechItr TechBegin() const; ///< starting iterator for techs this empire has researched TechItr TechEnd() const; ///< end iterator for techs @@ -323,8 +319,8 @@ void SetCapitolID(int id); ///< If the object with id \a id is a planet owned by this empire, sets that planet to be this empire's capitol, and otherwise does nothing /** Adds \a tech to the research queue, placing it before position \a pos. If \a tech is already in the queue, - it is moved to \a pos, then removed from its former position. If \a pos < 0 or queue.size() <= pos, \a tech - is placed at the end of the queue. If \a tech is already available, no action is taken. */ + * it is moved to \a pos, then removed from its former position. If \a pos < 0 or queue.size() <= pos, \a tech + * is placed at the end of the queue. If \a tech is already available, no action is taken. */ void PlaceTechInQueue(const Tech* tech, int pos = -1); void RemoveTechFromQueue(const Tech* tech); ///< Removes \a tech from the research queue, if it is in the research queue already. @@ -346,8 +342,8 @@ void RemoveBuildFromQueue(int index); ///< Removes the build at position \a index in the production queue, if such an index exists. /** Processes Builditems on queues of empires other than this empire, at the location with id \a location_id and, - as appropriate, adds them to the build queue of \a this empire, deletes them, or leaves them on the build - queue of their current empire */ + * as appropriate, adds them to the build queue of \a this empire, deletes them, or leaves them on the build + * queue of their current empire */ void ConquerBuildsAtLocation(int location_id); void AddTech(const std::string& name); ///< Inserts the given Tech into the Empire's list of available technologies. @@ -380,9 +376,12 @@ void RemoveShipDesign(int ship_design_id); ///< Removes the ShipDesign with the given id from the empire's set void UpdateSystemSupplyRanges(); ///< Calculates ranges that systems can send fleet and resource supplies. - void UpdateSupplyUnobstructedSystems(); ///< Calculates systems that can propegate supply (fleet or resource) - void UpdateFleetSupply(); ///< Calculates systems at which fleets of this empire can be supplied and starlane traversals used to do so. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. - void UpdateResourceSupply(); ///< Calculates groups of systems of this empire which can exchange resources and starlane traversals used to do so. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. + void UpdateSupplyUnobstructedSystems(const std::set<int>& explored_systems); ///< Calculates systems that can propegate supply (fleet or resource) using the specified set of \a explored_systems + void UpdateSupplyUnobstructedSystems(); ///< Calculates systems that can propegate supply using this empire's own / internal list of explored systems + void UpdateFleetSupply(const std::map<int, std::set<int> >& starlanes); ///< Calculates systems at which fleets of this empire can be supplied and starlane traversals used to do so, using the indicated \a starlanes but subject to obstruction of supply by various factors. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. + void UpdateFleetSupply(); ///< Calculates systems at which fleets of this empire can be supplied and starlane traversals used to do so using this empire's set of known starlanes. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. + void UpdateResourceSupply(const std::map<int, std::set<int> >& starlanes); ///< Calculates groups of systems of this empire which can exchange resources and the starlane traversals used to do so, using the indicated \a starlanes but subject to obstruction of supply propegation by various factors. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. + void UpdateResourceSupply(); ///< Calculates groups of systems of this empire which can exchange resources and starlane traversals used to do so using this empire's set of known starlanes. Call UpdateSystemSupplyRanges and UpdateSupplyUnobstructedSystems before calling this. /** Checks for production projects that have been completed, and places them at their respective * production sites. Which projects have been completed is determined by the results of @@ -609,7 +608,3 @@ } #endif // _Empire_h_ - - - - Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-30 06:19:48 UTC (rev 2676) @@ -121,7 +121,14 @@ const System* dst; }; + // disambiguate overloaded function with a function pointer void (MapWnd::*SetFleetMovementLineFunc)(const Fleet*) = &MapWnd::SetFleetMovementLine; + + const float STARLANE_GRAY = 127.0f / 255.0f; + const float STARLANE_ALPHA = 0.7f; + const double STARLANE_WIDTH = 2.5; + + const GG::Clr UNOWNED_STARLANE_GRAY_CLR = GG::Clr(128, 128, 128, 255); } //////////////////////////////////////////////////////////// @@ -254,8 +261,9 @@ m_zoom_factor(1.0), m_star_texture_coords(), m_starlane_vertices(), - m_starlane_supply_vertices(), - m_starlane_supply_colors(), + m_starlane_colors(), + m_starlane_fleet_supply_vertices(), + m_starlane_fleet_supply_colors(), m_drag_offset(-1, -1), m_dragged(false), m_current_owned_system(UniverseObject::INVALID_OBJECT_ID), @@ -739,15 +747,25 @@ // population is available for currently uncolonized planets UpdateMeterEstimates(); + const std::set<int>& this_player_explored_systems = empire->ExploredSystems(); + const std::map<int, std::set<int> > this_player_known_starlanes = empire->KnownStarlanes(); // determine sytems where fleets can deliver supply, and groups of systems that can exchange resources for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { - Empire* empire = it->second; - empire->UpdateSupplyUnobstructedSystems(); - empire->UpdateSystemSupplyRanges(); - empire->UpdateFleetSupply(); - empire->UpdateResourceSupply(); - empire->InitResourcePools(); + Empire* cur_empire = it->second; + + // use systems this client's player has explored for all empires, so that this client's player can + // see where other empires can probably propegate supply, even if this client's empire / player + // doesn't know what systems the other player has actually explored + cur_empire->UpdateSupplyUnobstructedSystems(this_player_explored_systems); + + cur_empire->UpdateSystemSupplyRanges(); + + // similarly, use this client's player's known starlanes to propegate all empires' supply + cur_empire->UpdateFleetSupply(this_player_known_starlanes); + cur_empire->UpdateResourceSupply(this_player_known_starlanes); + + cur_empire->InitResourcePools(); } @@ -783,6 +801,7 @@ std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_galaxy_gas_quad_vertices; std::vector<float> raw_star_texture_coords; std::vector<float> raw_starlane_vertices; + std::vector<unsigned char> raw_starlane_colors; std::vector<float> raw_starlane_supply_vertices; std::vector<unsigned char> raw_starlane_supply_colors; @@ -790,7 +809,8 @@ std::vector<System*> systems = universe.FindObjects<System>(); for (unsigned int i = 0; i < systems.size(); ++i) { // system - SystemIcon* icon = new SystemIcon(this, 0, 0, 10, systems[i]->ID()); + const System* start_system = systems[i]; + SystemIcon* icon = new SystemIcon(this, 0, 0, 10, start_system->ID()); { // See note above texture coords for why we're making coordinate // sets that are 2x too big. @@ -830,7 +850,7 @@ halo_vertices.push_back(icon_lr_y); } } - m_system_icons[systems[i]->ID()] = icon; + m_system_icons[start_system->ID()] = icon; icon->InstallEventFilter(this); AttachChild(icon); GG::Connect(icon->LeftClickedSignal, &MapWnd::SystemLeftClicked, this); @@ -842,24 +862,24 @@ // gaseous substance around system if (boost::shared_ptr<GG::Texture> gaseous_texture = - ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", systems[i]->ID())) { + ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", start_system->ID())) { glBindTexture(GL_TEXTURE_2D, gaseous_texture->OpenGLId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); const double GAS_SIZE = ClientUI::SystemIconSize() * 12.0; - const double ROTATION = systems[i]->ID() * 27.0; // arbitrary rotation in radians ("27.0" is just a number that produces pleasing results) + const double ROTATION = start_system->ID() * 27.0; // arbitrary rotation in radians ("27.0" is just a number that produces pleasing results) const double COS_THETA = std::cos(ROTATION); const double SIN_THETA = std::sin(ROTATION); // This rotates the upper left and lower right corners CCW ROTATION - // radians, around systems[i]. The initial upper left and lower + // radians, around start_system. The initial upper left and lower // right corners are (-GAS_SIZE, -GAS_SIZE) and (GAS_SIZE, // GAS_SIZE), in map coordinates respectively. See note above // texture coords for why we're making coordinate sets that are 2x // too big. - double gas_ul_x = systems[i]->X() + COS_THETA * -GAS_SIZE + SIN_THETA * GAS_SIZE; - double gas_ul_y = systems[i]->Y() - -SIN_THETA * -GAS_SIZE + COS_THETA * GAS_SIZE; - double gas_lr_x = systems[i]->X() + COS_THETA * GAS_SIZE + SIN_THETA * -GAS_SIZE; - double gas_lr_y = systems[i]->Y() - -SIN_THETA * GAS_SIZE + COS_THETA * -GAS_SIZE; + double gas_ul_x = start_system->X() + COS_THETA * -GAS_SIZE + SIN_THETA * GAS_SIZE; + double gas_ul_y = start_system->Y() - -SIN_THETA * -GAS_SIZE + COS_THETA * GAS_SIZE; + double gas_lr_x = start_system->X() + COS_THETA * GAS_SIZE + SIN_THETA * -GAS_SIZE; + double gas_lr_y = start_system->Y() - -SIN_THETA * GAS_SIZE + COS_THETA * -GAS_SIZE; std::vector<float>& gas_vertices = raw_galaxy_gas_quad_vertices[gaseous_texture]; gas_vertices.push_back(gas_lr_x); gas_vertices.push_back(gas_ul_y); @@ -872,19 +892,53 @@ } // system's starlanes - for (System::lane_iterator it = systems[i]->begin_lanes(); it != systems[i]->end_lanes(); ++it) { - if (!it->second) { - System* dest_system = universe.Object<System>(it->first); - if (starlane_pairs.insert(StarlaneData(systems[i], dest_system)).second) { - raw_starlane_vertices.push_back(systems[i]->X()); - raw_starlane_vertices.push_back(systems[i]->Y()); - raw_starlane_vertices.push_back(dest_system->X()); - raw_starlane_vertices.push_back(dest_system->Y()); + for (System::const_lane_iterator lane_it = start_system->begin_lanes(); lane_it != start_system->end_lanes(); ++lane_it) { + bool lane_is_wormhole = lane_it->second; + if (lane_is_wormhole) continue; // at present, not rendering wormholes + + const System* dest_system = universe.Object<System>(lane_it->first); + + // check that this land hasn't already been added by attempting to insert the ordered lane pair into a set. + // set::insert returns a pair, of which .second is a bool which is true if the key was inserted, and false + // if the set already contained the key. + if (!starlane_pairs.insert(StarlaneData(start_system, dest_system)).second) continue; + + raw_starlane_vertices.push_back(start_system->X()); + raw_starlane_vertices.push_back(start_system->Y()); + raw_starlane_vertices.push_back(dest_system->X()); + raw_starlane_vertices.push_back(dest_system->Y()); + + // determine colour(s) for lane based on which empire(s) can transfer resources along the lane. + // todo: multiple rendered lanes (one for each empire) when multiple empires use the same lane. + // todo: render potential but blocked lanes as well + + GG::Clr lane_colour = UNOWNED_STARLANE_GRAY_CLR; // default colour if no empires transfer + + for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { + empire = empire_it->second; + const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); + + std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); + std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); + + // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. + if (resource_supply_lanes.find(lane_forward) != resource_supply_lanes.end() || resource_supply_lanes.find(lane_backward) != resource_supply_lanes.end()) { + lane_colour = empire->Color(); + break; // found a colour for this lane, so can abort loop } } + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); } } + // Note these coordinates assume the texture is twice as large as it should // be. This allows us to use one set of texture coords for everything, even // though the star-halo textures must be rendered at sizes as much as twice @@ -905,9 +959,9 @@ // create animated lines indicating fleet supply flow for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { + empire = it->second; const std::set<std::pair<int, int> >& fleet_supply_lanes = empire->FleetSupplyStarlaneTraversals(); for (std::set<std::pair<int, int> >::const_iterator lane_it = fleet_supply_lanes.begin(); lane_it != fleet_supply_lanes.end(); ++lane_it) { - glColor(empire->Color()); const System* start_sys = universe.Object<System>(lane_it->first); const System* end_sys = universe.Object<System>(lane_it->second); raw_starlane_supply_vertices.push_back(start_sys->X()); @@ -989,6 +1043,7 @@ // HACK! The first time this SitRepPanel gets an update, the report row(s) are misaligned. I have no idea why, and // I am sick of dealing with it, so I'm forcing another update in order to force it to behave. m_sitrep_panel->Update(); + empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); if (empire && empire->NumSitRepEntries()) { AttachChild(m_sitrep_panel); MoveChildUp(m_sitrep_panel); @@ -1047,7 +1102,10 @@ DetachChild(m_side_panel); SelectSystem(m_side_panel->SystemID()); - empire->UpdateResourcePools(); + for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { + empire = it->second; + empire->UpdateResourcePools(); + } m_research_wnd->Update(); m_production_wnd->Update(); @@ -1094,6 +1152,7 @@ #endif m_star_texture_coords.m_name = 0; } + if (m_starlane_vertices.m_name) { #ifdef FREEORION_WIN32 glDeleteBuffersARB(1, &m_starlane_vertices.m_name); @@ -1102,24 +1161,35 @@ #endif m_starlane_vertices.m_name = 0; } - if (m_starlane_supply_vertices.m_name) { + + if (m_starlane_colors.m_name) { #ifdef FREEORION_WIN32 - glDeleteBuffersARB(1, &m_starlane_supply_vertices.m_name); + glDeleteBuffersARB(1, &m_starlane_colors.m_name); #else - glDeleteBuffers(1, &m_starlane_supply_vertices.m_name); + glDeleteBuffers(1, &m_starlane_colors.m_name); #endif - m_starlane_supply_vertices.m_name = 0; + m_starlane_colors.m_name = 0; } - if (m_starlane_supply_colors.m_name) { + + if (m_starlane_fleet_supply_vertices.m_name) { #ifdef FREEORION_WIN32 - glDeleteBuffersARB(1, &m_starlane_supply_colors.m_name); + glDeleteBuffersARB(1, &m_starlane_fleet_supply_vertices.m_name); #else - glDeleteBuffers(1, &m_starlane_supply_colors.m_name); + glDeleteBuffers(1, &m_starlane_fleet_supply_vertices.m_name); #endif - m_starlane_supply_colors.m_name = 0; + m_starlane_fleet_supply_vertices.m_name = 0; } + if (m_starlane_fleet_supply_colors.m_name) { +#ifdef FREEORION_WIN32 + glDeleteBuffersARB(1, &m_starlane_fleet_supply_colors.m_name); +#else + glDeleteBuffers(1, &m_starlane_fleet_supply_colors.m_name); +#endif + m_starlane_fleet_supply_colors.m_name = 0; + } + // create new buffers for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = raw_star_core_quad_vertices.begin(); @@ -1224,41 +1294,59 @@ #endif m_starlane_vertices.m_size = raw_starlane_vertices.size() / 2; } + if (!raw_starlane_colors.empty()) { +#ifdef FREEORION_WIN32 + glGenBuffersARB(1, &m_starlane_colors.m_name); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_colors.m_name); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, + raw_starlane_colors.size() * sizeof(unsigned char), + &raw_starlane_colors[0], + GL_STATIC_DRAW_ARB); +#else + glGenBuffers(1, &m_starlane_colors.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); + glBufferData(GL_ARRAY_BUFFER, + raw_starlane_colors.size() * sizeof(unsigned char), + &raw_starlane_colors[0], + GL_STATIC_DRAW); +#endif + m_starlane_colors.m_size = raw_starlane_colors.size() / 4; + } if (!raw_starlane_supply_vertices.empty()) { #ifdef FREEORION_WIN32 - glGenBuffersARB(1, &m_starlane_supply_vertices.m_name); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_supply_vertices.m_name); + glGenBuffersARB(1, &m_starlane_fleet_supply_vertices.m_name); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_vertices.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, raw_starlane_supply_vertices.size() * sizeof(float), &raw_starlane_supply_vertices[0], GL_STATIC_DRAW_ARB); #else - glGenBuffers(1, &m_starlane_supply_vertices.m_name); - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_supply_vertices.m_name); + glGenBuffers(1, &m_starlane_fleet_supply_vertices.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); glBufferData(GL_ARRAY_BUFFER, raw_starlane_supply_vertices.size() * sizeof(float), &raw_starlane_supply_vertices[0], GL_STATIC_DRAW); #endif - m_starlane_supply_vertices.m_size = raw_starlane_supply_vertices.size() / 2; + m_starlane_fleet_supply_vertices.m_size = raw_starlane_supply_vertices.size() / 2; } if (!raw_starlane_supply_colors.empty()) { #ifdef FREEORION_WIN32 - glGenBuffersARB(1, &m_starlane_supply_colors.m_name); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_supply_colors.m_name); + glGenBuffersARB(1, &m_starlane_fleet_supply_colors.m_name); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_colors.m_name); glBufferDataARB(GL_ARRAY_BUFFER_ARB, raw_starlane_supply_colors.size() * sizeof(unsigned char), &raw_starlane_supply_colors[0], GL_STATIC_DRAW_ARB); #else - glGenBuffers(1, &m_starlane_supply_colors.m_name); - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_supply_colors.m_name); + glGenBuffers(1, &m_starlane_fleet_supply_colors.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); glBufferData(GL_ARRAY_BUFFER, raw_starlane_supply_colors.size() * sizeof(unsigned char), &raw_starlane_supply_colors[0], GL_STATIC_DRAW); #endif - m_starlane_supply_colors.m_size = raw_starlane_supply_colors.size() / 4; + m_starlane_fleet_supply_colors.m_size = raw_starlane_supply_colors.size() / 4; } #ifdef FREEORION_WIN32 @@ -1819,26 +1907,29 @@ void MapWnd::RenderStarlanes() { - const float STARLANE_GRAY = 127.0f / 255.0f; - const float STARLANE_ALPHA = 0.7f; - const double STARLANE_WIDTH = 2.5; - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - if (m_starlane_vertices.m_name) { - glColor4f(STARLANE_GRAY, STARLANE_GRAY, STARLANE_GRAY, STARLANE_ALPHA); + if (m_starlane_vertices.m_name && m_starlane_colors.m_name) { + glLineStipple(1, 0xffff); + glLineWidth(STARLANE_WIDTH); + glEnableClientState(GL_COLOR_ARRAY); #ifdef FREEORION_WIN32 glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_vertices.m_name); #else glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); #endif glVertexPointer(2, GL_FLOAT, 0, 0); - glLineWidth(STARLANE_WIDTH); - glLineStipple(1, 0xffff); +#ifdef FREEORION_WIN32 + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_colors.m_name); +#else + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); +#endif + glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); glDrawArrays(GL_LINES, 0, m_starlane_vertices.m_size); + glDisableClientState(GL_COLOR_ARRAY); } - if (m_starlane_supply_vertices.m_name && m_starlane_supply_colors.m_name) { + if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name) { // render fleet supply lines const GLushort PATTERN = 0x8080; // = 1000000010000000 -> widely space small dots const int GLUSHORT_BIT_LENGTH = sizeof(GLushort) * 8; @@ -1849,18 +1940,18 @@ glLineWidth(STARLANE_WIDTH); glEnableClientState(GL_COLOR_ARRAY); #ifdef FREEORION_WIN32 - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_supply_vertices.m_name); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_vertices.m_name); #else - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_supply_vertices.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); #endif glVertexPointer(2, GL_FLOAT, 0, 0); #ifdef FREEORION_WIN32 - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_supply_colors.m_name); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_colors.m_name); #else - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_supply_colors.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); #endif glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); - glDrawArrays(GL_LINES, 0, m_starlane_supply_vertices.m_size); + glDrawArrays(GL_LINES, 0, m_starlane_fleet_supply_vertices.m_size); glDisableClientState(GL_COLOR_ARRAY); } Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/UI/MapWnd.h 2008-08-30 06:19:48 UTC (rev 2676) @@ -262,8 +262,9 @@ std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_galaxy_gas_quad_vertices; GLBuffer m_star_texture_coords; GLBuffer m_starlane_vertices; - GLBuffer m_starlane_supply_vertices; - GLBuffer m_starlane_supply_colors; + GLBuffer m_starlane_colors; + GLBuffer m_starlane_fleet_supply_vertices; + GLBuffer m_starlane_fleet_supply_colors; GG::Pt m_drag_offset; //!< distance the cursor is from the upper-left corner of the window during a drag ((-1, -1) if no drag is occurring) bool m_dragged; //!< tracks whether or not a drag occurs during a left button down sequence of events Modified: trunk/FreeOrion/default/specials.txt =================================================================== --- trunk/FreeOrion/default/specials.txt 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/default/specials.txt 2008-08-30 06:19:48 UTC (rev 2676) @@ -13,5 +13,6 @@ SetMaxIndustry value = Source.MaxIndustry + 5 SetMaxTrade value = Source.MaxTrade + 2 SetMaxSupply value = Source.MaxSupply + 2 + SetMaxConstruction value = Source.MaxConstruction + 20 ] graphic = "icons/specials_huge/homeworld.png" \ No newline at end of file Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/universe/Universe.cpp 2008-08-30 06:19:48 UTC (rev 2676) @@ -299,7 +299,7 @@ (this->source_object_id == right.source_object_id) && this->effects_group < right.effects_group); } - ///////////////////////////////////////////// +///////////////////////////////////////////// // struct Universe::EffectCause ///////////////////////////////////////////// Universe::EffectCause::EffectCause() : @@ -1859,7 +1859,7 @@ public: // determines whether a specified point is within the circumcircle of the triangle bool PointInCircumCircle(Delauney::DTPoint &p); - + const std::vector<int>& getVerts(); // getter DTTriangle(int vert1, int vert2, int vert3, std::vector<Delauney::DTPoint> &points); @@ -1882,7 +1882,7 @@ double a, Sx, Sy, b; double x1, x2, x3, y1, y2, y3; - if ( vert1 == vert2 || vert1 == vert3 || vert2 == vert3) + if (vert1 == vert2 || vert1 == vert3 || vert2 == vert3) throw std::runtime_error("Attempted to create Triangle with two of the same vertex indices."); verts = std::vector<int>(3); @@ -1902,18 +1902,18 @@ // calculate circumcircle and circumcentre of triangle a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2); - + Sx = 0.5 * ((x1 * x1 + y1 * y1) * (y2 - y3) + - (x2 * x2 + y2 * y2) * (y3 - y1) + - (x3 * x3 + y3 * y3) * (y1 - y2)); + (x2 * x2 + y2 * y2) * (y3 - y1) + + (x3 * x3 + y3 * y3) * (y1 - y2)); Sy = -0.5* ((x1 * x1 + y1 * y1) * (x2 - x3) + (x2 * x2 + y2 * y2) * (x3 - x1) + (x3 * x3 + y3 * y3) * (x1 - x2)); - b = ( (x1 * x1 + y1 * y1) * (x2 * y3 - x3 * y2) + - (x2 * x2 + y2 * y2) * (x3 * y1 - x1 * y3) + - (x3 * x3 + y3 * y3) * (x1 * y2 - x2 * y1)); + b = ((x1 * x1 + y1 * y1) * (x2 * y3 - x3 * y2) + + (x2 * x2 + y2 * y2) * (x3 * y1 - x1 * y3) + + (x3 * x3 + y3 * y3) * (x1 * y2 - x2 * y1)); // make sure nothing funky's going on... if (std::abs(a) < 0.01) @@ -1947,9 +1947,9 @@ int n, c, theSize, num, num2; // loop counters, storage for retreived size of a vector, temp storage std::list<Delauney::DTTriangle>::iterator itCur, itEnd; - std::list<Delauney::SortValInt>::iterator itCur2, itEnd2; + std::list<Delauney::SortValInt>::iterator itCur2, itEnd2; // vector of x and y positions of stars - std::vector<Delauney::DTPoint> points; + std::vector<Delauney::DTPoint> points; // pointer to main list of triangles algorithm works with. std::list<Delauney::DTTriangle> *triList; // list of indices in vector of points extracted from removed triangles that need to be retriangulated @@ -1961,10 +1961,10 @@ throw std::runtime_error("Attempted to run Delauney Triangulation on empty array of systems"); // extract systems positions, and store in vector. Can't use actual systems data since - // systems have position limitations which would interfere with algorithm + // systems have position limitations which would interfere with algorithm theSize = static_cast<int>(systems.size()); - for (n = 0; n < theSize; n++) { - points.push_back(Delauney::DTPoint(systems[n]->X(), systems[n]->Y())); + for (n = 0; n < theSize; n++) { + points.push_back(Delauney::DTPoint(systems[n]->X(), systems[n]->Y())); } // add points for covering triangle. the point positions should be big enough to form a triangle @@ -1973,7 +1973,7 @@ points.push_back(Delauney::DTPoint(2.0 * (Universe::UniverseWidth() + 1.0), -1.0)); points.push_back(Delauney::DTPoint(-1.0, 2.0 * (Universe::UniverseWidth() + 1.0))); - // initialize triList. algorithm adds and removes triangles from this list, and the resulting + // initialize triList. algorithm adds and removes triangles from this list, and the resulting // list is returned (so should be deleted externally) triList = new std::list<Delauney::DTTriangle>; @@ -1995,7 +1995,7 @@ // check if point to be added to triangulation is within the circumcircle for the current triangle if (tri.PointInCircumCircle(points[n])) { - // if so, insert the triangles vertices indices into the list. add in sorted position + // if so, insert the triangle's vertices' indices into the list. add in sorted position // based on angle of direction to current point n being inserted. don't add if doing // so would duplicate an index already in the list for (c = 0; c < 3; c++) { @@ -2020,15 +2020,14 @@ if (itCur2 == itEnd2) { // list is empty pointNumList.push_back(Delauney::SortValInt(num, mag)); - } - else { + } else { while (itCur2 != itEnd2) { if ((*itCur2).num == num) break; if ((*itCur2).sortVal > mag) { pointNumList.insert(itCur2, Delauney::SortValInt(num, mag)); break; - } + } itCur2++; } if (itCur2 == itEnd2) { @@ -2040,8 +2039,7 @@ // remove current triangle from list of triangles itCur = triList->erase(itCur); - } - else { + } else { // point not in circumcircle for this triangle // to go next triangle in list ++itCur; Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2008-08-25 09:03:03 UTC (rev 2675) +++ trunk/FreeOrion/util/SitRepEntry.h 2008-08-30 06:19:48 UTC (rev 2676) @@ -26,7 +26,7 @@ static const std::string SITREP_UPDATE_TAG; /** an enumeration of the types of entries - WARNING: make sure to update the LUT in UIClient.cpp which contain stringIDs for each type of SitRep + WARNING: make sure to update the LUT in ClientUI.cpp which contain stringIDs for each type of SitRep This LUT is in Client because the server has no need for it - it's a UI issue. This design in a way breaks the data-hiding feature of a class, but is needed because both clients and server share this code. It's better to have the discrepancy here than to bloat the server with data it will not use */ @@ -50,7 +50,7 @@ /** \name Structors */ //@{ SitRepEntry() : m_type(INVALID_ENTRY_TYPE) {} ///< default ctor //@} - + void SetType(EntryType type) { m_type = type; } EntryType GetType() { return m_type; } |
From: <geo...@us...> - 2008-08-30 22:15:28
|
Revision: 2677 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2677&view=rev Author: geoffthemedio Date: 2008-08-30 22:15:37 +0000 (Sat, 30 Aug 2008) Log Message: ----------- -Added half-length coloured starlanes when an empire could propegate resource supply to a system (given only range limits) but can't because the destination is obstructed (by not being explored or by an enemy fleet, for example) -Made the dark blue empire colour a bit darker blue, and the light blue empire colour (current default) a bit lighter, to make them easier to distinguish on the map. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/default/empire_colors.xml Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-30 06:19:48 UTC (rev 2676) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-30 22:15:37 UTC (rev 2677) @@ -1032,7 +1032,7 @@ std::map<int, int> propegating_fleet_supply_ranges = m_fleet_supply_system_ranges; // insert all systems that produce supply on their own into a list of systems to process - std::list<int> propegating_systems_list; // working list of systems to propegate supply from + std::list<int> propegating_systems_list; // working list of systems to propegate supply from for (std::map<int, int>::const_iterator it = propegating_fleet_supply_ranges.begin(); it != propegating_fleet_supply_ranges.end(); ++it) propegating_systems_list.push_back(it->first); @@ -1106,8 +1106,8 @@ m_resource_supply_groups.clear(); m_resource_supply_starlane_traversals.clear(); + m_resource_supply_obstructed_starlane_traversals.clear(); - // map from system id to set of systems that are supply-connected to it directly (which may involve // multiple starlane jumps std::map<int, std::set<int> > supply_groups_map; @@ -1149,7 +1149,7 @@ // initialize with source supply range propegating_system_supply_ranges[source_sys_id] = system_supply_it->second; - Logger().debugStream() << " .. can propegate suppply " << system_supply_it->second << " jumps"; + Logger().debugStream() << " ..... can propegate suppply " << system_supply_it->second << " jumps"; // iterate through list of accessible systems, processing each in order it was added (like breadth first @@ -1177,7 +1177,11 @@ int lane_end_sys_id = *lane_it; // ensure this adjacent system is unobstructed - if (m_supply_unobstructed_systems.find(lane_end_sys_id) == m_supply_unobstructed_systems.end()) continue; // can't propegate here + if (m_supply_unobstructed_systems.find(lane_end_sys_id) == m_supply_unobstructed_systems.end()) { + // can't propegate here + m_resource_supply_obstructed_starlane_traversals.insert(std::make_pair(cur_sys_id, lane_end_sys_id)); + continue; + } // compare next system's supply range to this system's supply range. propegate if necessary. std::map<int, int>::const_iterator lane_end_sys_it = propegating_system_supply_ranges.find(lane_end_sys_id); @@ -1218,11 +1222,23 @@ } // DEBUG - Logger().debugStream() << "supply traversals:"; + Logger().debugStream() << "resource supply traversals:"; for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_starlane_traversals.begin(); it != m_resource_supply_starlane_traversals.end(); ++it) { Logger().debugStream() << " ... from: " << GetUniverse().Object(it->first)->Name() << " to: " << GetUniverse().Object(it->second)->Name(); } + Logger().debugStream() << "obstructed resource supply traversals:"; + for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_obstructed_starlane_traversals.begin(); it != m_resource_supply_obstructed_starlane_traversals.end(); ++it) { + const UniverseObject* from = GetUniverse().Object(it->first); + const UniverseObject* to = GetUniverse().Object(it->second); + if (from && to) + Logger().debugStream() << " ... from: " << from->Name() << " to: " << to->Name(); + else if (from) + Logger().debugStream() << " ... from: " << from->Name() << " to id: " << it->second; + else + Logger().debugStream() << " ... from id: " << it->first << " to id: " << it->second; + } + if (supply_groups_map.empty()) return; // need to avoid going to boost graph stuff below, which doesn't seem to like being fed empty graphs... @@ -1335,6 +1351,11 @@ return m_resource_supply_starlane_traversals; } +const std::set<std::pair<int, int> >& Empire::ResourceSupplyOstructedStarlaneTraversals() const +{ + return m_resource_supply_obstructed_starlane_traversals; +} + const std::map<int, int>& Empire::ResourceSupplyRanges() const { return m_resource_supply_system_ranges; Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2008-08-30 06:19:48 UTC (rev 2676) +++ trunk/FreeOrion/Empire/Empire.h 2008-08-30 22:15:37 UTC (rev 2677) @@ -279,6 +279,7 @@ const std::set<std::set<int> >& ResourceSupplyGroups() const; ///< returns set of sets of systems that can share food, industry and minerals (systems in separate groups are blockaded or otherwise separated) const std::set<std::pair<int, int> >& ResourceSupplyStarlaneTraversals() const; ///< returns set of directed starlane traversals along which system resource exchange (food, industry, minerals) can flow. results are pairs of system ids of start and end of traversal + const std::set<std::pair<int, int> >& ResourceSupplyOstructedStarlaneTraversals() const; ///< returns set of directed starlane traversals along which system resources could flow for this empire, but which can't due to some obstruction in the destination system const std::map<int, int>& ResourceSupplyRanges() const; ///< returns map from system id to number of starlane jumps away the system can exchange resources const std::set<int>& SupplyUnobstructedSystems() const; ///< returns set of system ids that are able to propegate supply from one system to the next, or at which supply can be delivered to fleets if supply can reach the system from elsewhere @@ -504,16 +505,17 @@ */ double m_maintenance_total_cost; - std::map<std::string, int> m_ship_names_used; ///< map from name to number of times used + std::map<std::string, int> m_ship_names_used; ///< map from name to number of times used // cached calculation results, returned by reference - std::set<int> m_fleet_supplyable_system_ids; - std::set<std::pair<int, int> > m_fleet_supply_starlane_traversals; - std::map<int, int> m_fleet_supply_system_ranges; - std::set<std::set<int> > m_resource_supply_groups; - std::set<std::pair<int, int> > m_resource_supply_starlane_traversals; - std::map<int, int> m_resource_supply_system_ranges; - std::set<int> m_supply_unobstructed_systems; + std::set<int> m_fleet_supplyable_system_ids; ///< ids of systems where fleets can remain for a turn to be resupplied. computed and set by UpdateFleetSupply + std::set<std::pair<int, int> > m_fleet_supply_starlane_traversals; ///< ordered pairs of system ids between which a starlane runs that can be used to convey supply to fleets. + std::map<int, int> m_fleet_supply_system_ranges; ///< number of starlane jumps away from each system (by id) fleet supply can be conveyed. This is the number due to a system's contents conveying supply and is computed and set by UpdateSystemSupplyRanges + std::set<std::set<int> > m_resource_supply_groups; ///< sets of system ids that are connected by resource supply lines and are able to share resources between systems or between objects in systems + std::set<std::pair<int, int> > m_resource_supply_starlane_traversals; ///< ordered pairs of system ids between which a starlane runs that can be used to convey resources between systems + std::set<std::pair<int, int> > m_resource_supply_obstructed_starlane_traversals; ///< ordered pairs of system ids between which a starlane could be used to convey resources between system, but is not because something is obstructing the resource flow. That is, the resource flow isn't limited by range, but by something blocking its flow. + std::map<int, int> m_resource_supply_system_ranges; ///< number of starlane jumps away from each system (by id) that resources can be conveyed. + std::set<int> m_supply_unobstructed_systems; ///< ids of system that don't block supply (resource or fleet) from flowing friend class boost::serialization::access; Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-30 06:19:48 UTC (rev 2676) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-30 22:15:37 UTC (rev 2677) @@ -94,32 +94,10 @@ } #endif - //////////////////////////////////////////////// - // StarlaneData - //////////////////////////////////////////////// - /* Note that an order is imposed on the two systems the starlane spans. The - "source" system is the one with the lower pointer. This is so - StarlaneDatas can be stored in a std::set and duplicates will not be a - problem. */ - struct StarlaneData - { - StarlaneData() {} - StarlaneData(const System* src_system, const System* dst_system) : - src(std::min(src_system, dst_system)), - dst(std::max(src_system, dst_system)) - {} - bool operator<(const StarlaneData& rhs) const - { - if (src != rhs.src) - return src < rhs.src; - if (dst != rhs.dst) - return dst < rhs.dst; - return false; - } - private: - const System* src; - const System* dst; - }; + // returns an int-int pair that doesn't depend on the order of parameters + std::pair<int, int> UnorderedIntPair(int one, int two) { + return std::make_pair(std::min(one, two), std::max(one, two)); + } // disambiguate overloaded function with a function pointer void (MapWnd::*SetFleetMovementLineFunc)(const Fleet*) = &MapWnd::SetFleetMovementLine; @@ -805,7 +783,11 @@ std::vector<float> raw_starlane_supply_vertices; std::vector<unsigned char> raw_starlane_supply_colors; - std::set<StarlaneData> starlane_pairs; + std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates + std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately + + Logger().debugStream() << "====ADDING STARLANES===="; + std::vector<System*> systems = universe.FindObjects<System>(); for (unsigned int i = 0; i < systems.size(); ++i) { // system @@ -860,9 +842,11 @@ GG::Connect(icon->MouseLeavingSignal, &MapWnd::MouseLeavingSystem, this); GG::Connect(icon->FleetButtonClickedSignal, &MapWnd::FleetButtonLeftClicked, this); - // gaseous substance around system - if (boost::shared_ptr<GG::Texture> gaseous_texture = - ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", start_system->ID())) { + + Logger().debugStream() << " considering lanes from " << start_system->Name() << " (id: " << start_system->ID() << ")"; + + // gaseous substance around system + if (boost::shared_ptr<GG::Texture> gaseous_texture = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", start_system->ID())) { glBindTexture(GL_TEXTURE_2D, gaseous_texture->OpenGLId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); @@ -898,43 +882,105 @@ const System* dest_system = universe.Object<System>(lane_it->first); - // check that this land hasn't already been added by attempting to insert the ordered lane pair into a set. - // set::insert returns a pair, of which .second is a bool which is true if the key was inserted, and false - // if the set already contained the key. - if (!starlane_pairs.insert(StarlaneData(start_system, dest_system)).second) continue; - raw_starlane_vertices.push_back(start_system->X()); - raw_starlane_vertices.push_back(start_system->Y()); - raw_starlane_vertices.push_back(dest_system->X()); - raw_starlane_vertices.push_back(dest_system->Y()); + Logger().debugStream() << " considering lanes to " << dest_system->Name() << " (id: " << dest_system->ID() << ")"; - // determine colour(s) for lane based on which empire(s) can transfer resources along the lane. - // todo: multiple rendered lanes (one for each empire) when multiple empires use the same lane. - // todo: render potential but blocked lanes as well + Logger().debugStream() << "added starlanes:"; + for (std::set<std::pair<int, int> >::const_iterator it = rendered_starlanes.begin(); it != rendered_starlanes.end(); ++it) + Logger().debugStream() << " ... " << GetUniverse().Object(it->first)->Name() << " to " << GetUniverse().Object(it->second)->Name(); - GG::Clr lane_colour = UNOWNED_STARLANE_GRAY_CLR; // default colour if no empires transfer + Logger().debugStream() << "looking for " << start_system->Name() << " to " << dest_system->Name(); - for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { - empire = empire_it->second; - const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); + // render starlane between start and dest systems? - std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); - std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); + // check that this lane isn't already going to be rendered. skip it if it is. + if (rendered_starlanes.find(UnorderedIntPair(start_system->ID(), dest_system->ID())) == rendered_starlanes.end()) { + Logger().debugStream() << " ... lane not found."; + rendered_starlanes.insert(UnorderedIntPair(start_system->ID(), dest_system->ID())); - // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. - if (resource_supply_lanes.find(lane_forward) != resource_supply_lanes.end() || resource_supply_lanes.find(lane_backward) != resource_supply_lanes.end()) { - lane_colour = empire->Color(); - break; // found a colour for this lane, so can abort loop + raw_starlane_vertices.push_back(start_system->X()); + raw_starlane_vertices.push_back(start_system->Y()); + raw_starlane_vertices.push_back(dest_system->X()); + raw_starlane_vertices.push_back(dest_system->Y()); + + // determine colour(s) for lane based on which empire(s) can transfer resources along the lane. + // todo: multiple rendered lanes (one for each empire) when multiple empires use the same lane. + + GG::Clr lane_colour = UNOWNED_STARLANE_GRAY_CLR; // default colour if no empires transfer + + for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { + empire = empire_it->second; + const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); + + std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); + std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); + + // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. + if (resource_supply_lanes.find(lane_forward) != resource_supply_lanes.end() || resource_supply_lanes.find(lane_backward) != resource_supply_lanes.end()) { + lane_colour = empire->Color(); + Logger().debugStream() << "selected colour of empire " << empire->Name() << " for this full lane"; + break; + } } + + if (lane_colour == UNOWNED_STARLANE_GRAY_CLR) + Logger().debugStream() << "selected unowned gray colour for this full lane"; + + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); + + Logger().debugStream() << "adding full lane from " << start_system->Name() << " to " << dest_system->Name(); } - raw_starlane_colors.push_back(lane_colour.r); - raw_starlane_colors.push_back(lane_colour.g); - raw_starlane_colors.push_back(lane_colour.b); - raw_starlane_colors.push_back(lane_colour.a); - raw_starlane_colors.push_back(lane_colour.r); - raw_starlane_colors.push_back(lane_colour.g); - raw_starlane_colors.push_back(lane_colour.b); - raw_starlane_colors.push_back(lane_colour.a); + + + + // render half-starlane from the current start_system to the current dest_system? + + // check that this lane isn't already going to be rendered. skip it if it is. + if (rendered_half_starlanes.find(std::make_pair(start_system->ID(), dest_system->ID())) == rendered_half_starlanes.end()) { + // NOTE: this will never find a preexisting half lane + Logger().debugStream() << "half lane not found... considering possible half lanes to add"; + + // scan through possible empires to have a half-lane here and add a half-lane if one is found + + for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { + empire = empire_it->second; + const std::set<std::pair<int, int> >& resource_obstructed_supply_lanes = empire->ResourceSupplyOstructedStarlaneTraversals(); + + std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); + + // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. + if (resource_obstructed_supply_lanes.find(lane_forward) != resource_obstructed_supply_lanes.end()) { + // found an empire that has a half lane here, so add it. + rendered_half_starlanes.insert(std::make_pair(start_system->ID(), dest_system->ID())); // inserted as ordered pair, so both directions can have different half-lanes + + raw_starlane_vertices.push_back(start_system->X()); + raw_starlane_vertices.push_back(start_system->Y()); + raw_starlane_vertices.push_back((start_system->X() + dest_system->X()) * 0.5); // half way along starlane + raw_starlane_vertices.push_back((start_system->Y() + dest_system->Y()) * 0.5); + + const GG::Clr& lane_colour = empire->Color(); + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); + raw_starlane_colors.push_back(lane_colour.r); + raw_starlane_colors.push_back(lane_colour.g); + raw_starlane_colors.push_back(lane_colour.b); + raw_starlane_colors.push_back(lane_colour.a); + + Logger().debugStream() << "Adding half lane between " << start_system->Name() << " to " << dest_system->Name() << " with colour of empire " << empire->Name(); + + break; + } + } + } } } Modified: trunk/FreeOrion/default/empire_colors.xml =================================================================== --- trunk/FreeOrion/default/empire_colors.xml 2008-08-30 06:19:48 UTC (rev 2676) +++ trunk/FreeOrion/default/empire_colors.xml 2008-08-30 22:15:37 UTC (rev 2677) @@ -1,15 +1,15 @@ <?xml version="1.0"?> <XMLDoc> <GG::Clr> - <red>0</red> - <green>0</green> + <red>60</red> + <green>60</green> <blue>255</blue> <alpha>255</alpha> </GG::Clr> <GG::Clr> <red>0</red> <green>0</green> - <blue>140</blue> + <blue>120</blue> <alpha>255</alpha> </GG::Clr> <GG::Clr> |
From: <geo...@us...> - 2008-08-31 05:17:00
|
Revision: 2678 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2678&view=rev Author: geoffthemedio Date: 2008-08-31 05:17:09 +0000 (Sun, 31 Aug 2008) Log Message: ----------- -Added UI options for whether to draw fleet supply lines, whether to colour starlanes with empire colours if resources can be transported on those lanes, and how thick to draw starlanes and fleet supply lines. -Commented out some debug code in Empire Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-30 22:15:37 UTC (rev 2677) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-08-31 05:17:09 UTC (rev 2678) @@ -1125,9 +1125,9 @@ for (std::set<int>::const_iterator source_sys_it = m_supply_unobstructed_systems.begin(); source_sys_it != m_supply_unobstructed_systems.end(); ++source_sys_it) { int source_sys_id = *source_sys_it; - // DEBUG - const UniverseObject* asdf = GetUniverse().Object(source_sys_id); - Logger().debugStream() << " .. unobstructed system : " << asdf->Name(); + //// DEBUG + //const UniverseObject* asdf = GetUniverse().Object(source_sys_id); + //Logger().debugStream() << " .. unobstructed system : " << asdf->Name(); // skip systems that don't have any supply to propegate. std::map<int, int>::const_iterator system_supply_it = m_resource_supply_system_ranges.find(source_sys_id); @@ -1149,7 +1149,7 @@ // initialize with source supply range propegating_system_supply_ranges[source_sys_id] = system_supply_it->second; - Logger().debugStream() << " ..... can propegate suppply " << system_supply_it->second << " jumps"; + //Logger().debugStream() << " ..... can propegate suppply " << system_supply_it->second << " jumps"; // iterate through list of accessible systems, processing each in order it was added (like breadth first @@ -1221,24 +1221,24 @@ } } - // DEBUG - Logger().debugStream() << "resource supply traversals:"; - for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_starlane_traversals.begin(); it != m_resource_supply_starlane_traversals.end(); ++it) { - Logger().debugStream() << " ... from: " << GetUniverse().Object(it->first)->Name() << " to: " << GetUniverse().Object(it->second)->Name(); - } + //// DEBUG + //Logger().debugStream() << "resource supply traversals:"; + //for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_starlane_traversals.begin(); it != m_resource_supply_starlane_traversals.end(); ++it) { + // Logger().debugStream() << " ... from: " << GetUniverse().Object(it->first)->Name() << " to: " << GetUniverse().Object(it->second)->Name(); + //} + // + //Logger().debugStream() << "obstructed resource supply traversals:"; + //for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_obstructed_starlane_traversals.begin(); it != m_resource_supply_obstructed_starlane_traversals.end(); ++it) { + // const UniverseObject* from = GetUniverse().Object(it->first); + // const UniverseObject* to = GetUniverse().Object(it->second); + // if (from && to) + // Logger().debugStream() << " ... from: " << from->Name() << " to: " << to->Name(); + // else if (from) + // Logger().debugStream() << " ... from: " << from->Name() << " to id: " << it->second; + // else + // Logger().debugStream() << " ... from id: " << it->first << " to id: " << it->second; + //} - Logger().debugStream() << "obstructed resource supply traversals:"; - for (std::set<std::pair<int, int> >::const_iterator it = m_resource_supply_obstructed_starlane_traversals.begin(); it != m_resource_supply_obstructed_starlane_traversals.end(); ++it) { - const UniverseObject* from = GetUniverse().Object(it->first); - const UniverseObject* to = GetUniverse().Object(it->second); - if (from && to) - Logger().debugStream() << " ... from: " << from->Name() << " to: " << to->Name(); - else if (from) - Logger().debugStream() << " ... from: " << from->Name() << " to id: " << it->second; - else - Logger().debugStream() << " ... from id: " << it->first << " to id: " << it->second; - } - if (supply_groups_map.empty()) return; // need to avoid going to boost graph stuff below, which doesn't seem to like being fed empty graphs... @@ -1313,16 +1313,16 @@ for (std::map<int, std::set<int> >::const_iterator map_it = component_sets_map.begin(); map_it != component_sets_map.end(); ++map_it) { m_resource_supply_groups.insert(map_it->second); - // DEBUG! - Logger().debugStream() << "Set: "; - for (std::set<int>::const_iterator set_it = map_it->second.begin(); set_it != map_it->second.end(); ++set_it) { - const UniverseObject* obj = GetUniverse().Object(*set_it); - if (!obj) { - Logger().debugStream() << " ... missing object!"; - continue; - } - Logger().debugStream() << " ... " << obj->Name(); - } + //// DEBUG! + //Logger().debugStream() << "Set: "; + //for (std::set<int>::const_iterator set_it = map_it->second.begin(); set_it != map_it->second.end(); ++set_it) { + // const UniverseObject* obj = GetUniverse().Object(*set_it); + // if (!obj) { + // Logger().debugStream() << " ... missing object!"; + // continue; + // } + // Logger().debugStream() << " ... " << obj->Name(); + //} } } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-08-30 22:15:37 UTC (rev 2677) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-08-31 05:17:09 UTC (rev 2678) @@ -77,13 +77,18 @@ void AddOptions(OptionsDB& db) { - db.Add("UI.chat-hide-interval", "OPTIONS_DB_UI_CHAT_HIDE_INTERVAL", 10, RangedValidator<int>(0, 3600)); - db.Add("UI.chat-edit-history", "OPTIONS_DB_UI_CHAT_EDIT_HISTORY", 50, RangedValidator<int>(0, 1000)); - db.Add("UI.galaxy-gas-background", "OPTIONS_DB_GALAXY_MAP_GAS", true, Validator<bool>()); - db.Add("UI.optimized-system-rendering", "OPTIONS_DB_OPTIMIZED_SYSTEM_RENDERING", true, Validator<bool>()); + db.Add("UI.chat-hide-interval", "OPTIONS_DB_UI_CHAT_HIDE_INTERVAL", 10, RangedValidator<int>(0, 3600)); + db.Add("UI.chat-edit-history", "OPTIONS_DB_UI_CHAT_EDIT_HISTORY", 50, RangedValidator<int>(0, 1000)); + db.Add("UI.galaxy-gas-background", "OPTIONS_DB_GALAXY_MAP_GAS", true, Validator<bool>()); + db.Add("UI.optimized-system-rendering", "OPTIONS_DB_OPTIMIZED_SYSTEM_RENDERING", true, Validator<bool>()); + db.Add("UI.starlane-thickness", "OPTIONS_DB_STARLANE_THICKNESS", 2.5, RangedValidator<double>(0.1, 15.0)); + db.Add("UI.resource-starlane-colouring", "OPTIONS_DB_RESOURCE_STARLANE_COLOURING", true, Validator<bool>()); + db.Add("UI.fleet-supply-lines", "OPTIONS_DB_FLEET_SUPPLY_LINES", true, Validator<bool>()); + db.Add("UI.fleet-supply-line-width", "OPTIONS_DB_FLEET_SUPPLY_LINE_WIDTH", 3.0, RangedValidator<double>(0.1, 15.0)); } bool temp_bool = RegisterOptions(&AddOptions); + #ifndef FREEORION_RELEASE bool RequestRegressionTestDump() { @@ -104,9 +109,8 @@ const float STARLANE_GRAY = 127.0f / 255.0f; const float STARLANE_ALPHA = 0.7f; - const double STARLANE_WIDTH = 2.5; - const GG::Clr UNOWNED_STARLANE_GRAY_CLR = GG::Clr(128, 128, 128, 255); + const GG::Clr UNOWNED_STARLANE_GRAY_CLR = GG::Clr(72, 72, 72, 255); } //////////////////////////////////////////////////////////// @@ -786,7 +790,7 @@ std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately - Logger().debugStream() << "====ADDING STARLANES===="; + //Logger().debugStream() << "====ADDING STARLANES===="; std::vector<System*> systems = universe.FindObjects<System>(); for (unsigned int i = 0; i < systems.size(); ++i) { @@ -843,7 +847,7 @@ GG::Connect(icon->FleetButtonClickedSignal, &MapWnd::FleetButtonLeftClicked, this); - Logger().debugStream() << " considering lanes from " << start_system->Name() << " (id: " << start_system->ID() << ")"; + //Logger().debugStream() << " considering lanes from " << start_system->Name() << " (id: " << start_system->ID() << ")"; // gaseous substance around system if (boost::shared_ptr<GG::Texture> gaseous_texture = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", start_system->ID())) { @@ -883,19 +887,19 @@ const System* dest_system = universe.Object<System>(lane_it->first); - Logger().debugStream() << " considering lanes to " << dest_system->Name() << " (id: " << dest_system->ID() << ")"; + //Logger().debugStream() << " considering lanes to " << dest_system->Name() << " (id: " << dest_system->ID() << ")"; - Logger().debugStream() << "added starlanes:"; - for (std::set<std::pair<int, int> >::const_iterator it = rendered_starlanes.begin(); it != rendered_starlanes.end(); ++it) - Logger().debugStream() << " ... " << GetUniverse().Object(it->first)->Name() << " to " << GetUniverse().Object(it->second)->Name(); + //Logger().debugStream() << "added starlanes:"; + //for (std::set<std::pair<int, int> >::const_iterator it = rendered_starlanes.begin(); it != rendered_starlanes.end(); ++it) + // Logger().debugStream() << " ... " << GetUniverse().Object(it->first)->Name() << " to " << GetUniverse().Object(it->second)->Name(); - Logger().debugStream() << "looking for " << start_system->Name() << " to " << dest_system->Name(); + //Logger().debugStream() << "looking for " << start_system->Name() << " to " << dest_system->Name(); // render starlane between start and dest systems? // check that this lane isn't already going to be rendered. skip it if it is. if (rendered_starlanes.find(UnorderedIntPair(start_system->ID(), dest_system->ID())) == rendered_starlanes.end()) { - Logger().debugStream() << " ... lane not found."; + //Logger().debugStream() << " ... lane not found."; rendered_starlanes.insert(UnorderedIntPair(start_system->ID(), dest_system->ID())); raw_starlane_vertices.push_back(start_system->X()); @@ -908,23 +912,25 @@ GG::Clr lane_colour = UNOWNED_STARLANE_GRAY_CLR; // default colour if no empires transfer - for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { - empire = empire_it->second; - const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); + if (GetOptionsDB().Get<bool>("UI.resource-starlane-colouring")) { + for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { + empire = empire_it->second; + const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); - std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); - std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); + std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); + std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); - // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. - if (resource_supply_lanes.find(lane_forward) != resource_supply_lanes.end() || resource_supply_lanes.find(lane_backward) != resource_supply_lanes.end()) { - lane_colour = empire->Color(); - Logger().debugStream() << "selected colour of empire " << empire->Name() << " for this full lane"; - break; + // see if this lane exists in this empire's supply propegation lanes set. either direction accepted. + if (resource_supply_lanes.find(lane_forward) != resource_supply_lanes.end() || resource_supply_lanes.find(lane_backward) != resource_supply_lanes.end()) { + lane_colour = empire->Color(); + //Logger().debugStream() << "selected colour of empire " << empire->Name() << " for this full lane"; + break; + } } } - if (lane_colour == UNOWNED_STARLANE_GRAY_CLR) - Logger().debugStream() << "selected unowned gray colour for this full lane"; + //if (lane_colour == UNOWNED_STARLANE_GRAY_CLR) + // Logger().debugStream() << "selected unowned gray colour for this full lane"; raw_starlane_colors.push_back(lane_colour.r); raw_starlane_colors.push_back(lane_colour.g); @@ -935,17 +941,19 @@ raw_starlane_colors.push_back(lane_colour.b); raw_starlane_colors.push_back(lane_colour.a); - Logger().debugStream() << "adding full lane from " << start_system->Name() << " to " << dest_system->Name(); + //Logger().debugStream() << "adding full lane from " << start_system->Name() << " to " << dest_system->Name(); } // render half-starlane from the current start_system to the current dest_system? + if (!GetOptionsDB().Get<bool>("UI.resource-starlane-colouring")) + continue; // check that this lane isn't already going to be rendered. skip it if it is. if (rendered_half_starlanes.find(std::make_pair(start_system->ID(), dest_system->ID())) == rendered_half_starlanes.end()) { // NOTE: this will never find a preexisting half lane - Logger().debugStream() << "half lane not found... considering possible half lanes to add"; + //Logger().debugStream() << "half lane not found... considering possible half lanes to add"; // scan through possible empires to have a half-lane here and add a half-lane if one is found @@ -975,7 +983,7 @@ raw_starlane_colors.push_back(lane_colour.b); raw_starlane_colors.push_back(lane_colour.a); - Logger().debugStream() << "Adding half lane between " << start_system->Name() << " to " << dest_system->Name() << " with colour of empire " << empire->Name(); + //Logger().debugStream() << "Adding half lane between " << start_system->Name() << " to " << dest_system->Name() << " with colour of empire " << empire->Name(); break; } @@ -1957,7 +1965,7 @@ if (m_starlane_vertices.m_name && m_starlane_colors.m_name) { glLineStipple(1, 0xffff); - glLineWidth(STARLANE_WIDTH); + glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); glEnableClientState(GL_COLOR_ARRAY); #ifdef FREEORION_WIN32 glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_vertices.m_name); @@ -1975,15 +1983,15 @@ glDisableClientState(GL_COLOR_ARRAY); } - if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name) { + if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name && GetOptionsDB().Get<bool>("UI.fleet-supply-lines")) { // render fleet supply lines const GLushort PATTERN = 0x8080; // = 1000000010000000 -> widely space small dots const int GLUSHORT_BIT_LENGTH = sizeof(GLushort) * 8; const double RATE = 0.1; // slow crawl const int SHIFT = static_cast<int>(GG::GUI::GetGUI()->Ticks() * RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); - glLineStipple(static_cast<int>(STARLANE_WIDTH), STIPPLE); - glLineWidth(STARLANE_WIDTH); + glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); + glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); glEnableClientState(GL_COLOR_ARRAY); #ifdef FREEORION_WIN32 glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_starlane_fleet_supply_vertices.m_name); @@ -2006,8 +2014,7 @@ void MapWnd::RenderFleetMovementLines() { - const double STARLANE_WIDTH = 2.5; - glLineWidth(STARLANE_WIDTH); + glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); // standard movement line stipple const GLushort PATTERN = 0xF0F0; @@ -2017,7 +2024,7 @@ const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); // render standard movement lines - glLineStipple(static_cast<int>(STARLANE_WIDTH), STIPPLE); + glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.starlane-thickness")), STIPPLE); for (std::map<const Fleet*, MovementLineData>::const_iterator it = m_fleet_lines.begin(); it != m_fleet_lines.end(); ++it) RenderMovementLine(it->second); @@ -2030,7 +2037,7 @@ (PATTERN << PROJECTED_PATH_SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - PROJECTED_PATH_SHIFT)); //// render projected move liens - glLineStipple(static_cast<int>(STARLANE_WIDTH), PROJECTED_PATH_STIPPLE); + glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.starlane-thickness")), PROJECTED_PATH_STIPPLE); for (std::map<const Fleet*, MovementLineData>::const_iterator it = m_projected_fleet_lines.begin(); it != m_projected_fleet_lines.end(); ++it) RenderMovementLine(it->second); } Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2008-08-30 22:15:37 UTC (rev 2677) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2008-08-31 05:17:09 UTC (rev 2678) @@ -671,35 +671,35 @@ EndSection(); BeginSection(UserString("OPTIONS_SOUNDS")); BeginSection(UserString("OPTIONS_UI_SOUNDS")); - SoundFileOption("UI.sound.alert", UserString("OPTIONS_SOUND_ALERT")); - SoundFileOption("UI.sound.text-typing", UserString("OPTIONS_SOUND_TYPING")); + SoundFileOption("UI.sound.alert", UserString("OPTIONS_SOUND_ALERT")); + SoundFileOption("UI.sound.text-typing", UserString("OPTIONS_SOUND_TYPING")); EndSection(); BeginSection(UserString("OPTIONS_SOUND_WINDOW")); - SoundFileOption("UI.sound.window-close", UserString("OPTIONS_SOUND_CLOSE")); + SoundFileOption("UI.sound.window-close", UserString("OPTIONS_SOUND_CLOSE")); SoundFileOption("UI.sound.window-maximize", UserString("OPTIONS_SOUND_MAXIMIZE")); SoundFileOption("UI.sound.window-minimize", UserString("OPTIONS_SOUND_MINIMIZE")); - SoundFileOption("UI.sound.sidepanel-open", UserString("OPTIONS_SOUND_SIDEPANEL")); + SoundFileOption("UI.sound.sidepanel-open", UserString("OPTIONS_SOUND_SIDEPANEL")); EndSection(); BeginSection(UserString("OPTIONS_SOUND_LIST")); - SoundFileOption("UI.sound.item-drop", UserString("OPTIONS_SOUND_DROP")); - SoundFileOption("UI.sound.list-pulldown", UserString("OPTIONS_SOUND_PULLDOWN")); - SoundFileOption("UI.sound.list-select", UserString("OPTIONS_SOUND_SELECT")); + SoundFileOption("UI.sound.item-drop", UserString("OPTIONS_SOUND_DROP")); + SoundFileOption("UI.sound.list-pulldown", UserString("OPTIONS_SOUND_PULLDOWN")); + SoundFileOption("UI.sound.list-select", UserString("OPTIONS_SOUND_SELECT")); EndSection(); BeginSection(UserString("OPTIONS_SOUND_BUTTON")); - SoundFileOption("UI.sound.button-click", UserString("OPTIONS_SOUND_CLICK")); - SoundFileOption("UI.sound.button-rollover", UserString("OPTIONS_SOUND_ROLLOVER")); - SoundFileOption("UI.sound.fleet-button-click", UserString("OPTIONS_SOUND_FLEET_CLICK")); - SoundFileOption("UI.sound.fleet-button-rollover", UserString("OPTIONS_SOUND_FLEET_ROLLOVER")); - SoundFileOption("UI.sound.system-icon-rollover", UserString("OPTIONS_SOUND_SYSTEM_ROLLOVER")); - SoundFileOption("UI.sound.turn-button-click", UserString("OPTIONS_SOUND_TURN")); - SoundFileOption("UI.sound.planet-button-click", UserString("OPTIONS_SOUND_PLANET")); + SoundFileOption("UI.sound.button-click", UserString("OPTIONS_SOUND_CLICK")); + SoundFileOption("UI.sound.button-rollover", UserString("OPTIONS_SOUND_ROLLOVER")); + SoundFileOption("UI.sound.fleet-button-click", UserString("OPTIONS_SOUND_FLEET_CLICK")); + SoundFileOption("UI.sound.fleet-button-rollover", UserString("OPTIONS_SOUND_FLEET_ROLLOVER")); + SoundFileOption("UI.sound.system-icon-rollover", UserString("OPTIONS_SOUND_SYSTEM_ROLLOVER")); + SoundFileOption("UI.sound.turn-button-click", UserString("OPTIONS_SOUND_TURN")); + SoundFileOption("UI.sound.planet-button-click", UserString("OPTIONS_SOUND_PLANET")); EndSection(); BeginSection(UserString("OPTIONS_SOUND_FOCUS")); - SoundFileOption("UI.sound.balanced-focus", UserString("OPTIONS_SOUND_BALANCED")); - SoundFileOption("UI.sound.farming-focus", UserString("OPTIONS_SOUND_FARMING")); - SoundFileOption("UI.sound.industry-focus", UserString("OPTIONS_SOUND_INDUSTRY")); - SoundFileOption("UI.sound.mining-focus", UserString("OPTIONS_SOUND_MINING")); - SoundFileOption("UI.sound.research-focus", UserString("OPTIONS_SOUND_RESEARCH")); + SoundFileOption("UI.sound.balanced-focus", UserString("OPTIONS_SOUND_BALANCED")); + SoundFileOption("UI.sound.farming-focus", UserString("OPTIONS_SOUND_FARMING")); + SoundFileOption("UI.sound.industry-focus", UserString("OPTIONS_SOUND_INDUSTRY")); + SoundFileOption("UI.sound.mining-focus", UserString("OPTIONS_SOUND_MINING")); + SoundFileOption("UI.sound.research-focus", UserString("OPTIONS_SOUND_RESEARCH")); EndSection(); EndSection(); EndPage(); @@ -707,31 +707,35 @@ // UI settings tab BeginPage(UserString("OPTIONS_PAGE_UI")); BeginSection(UserString("OPTIONS_MISC_UI")); - BoolOption("UI.fleet-autoselect", UserString("OPTIONS_AUTOSELECT_FLEET")); - BoolOption("UI.multiple-fleet-windows", UserString("OPTIONS_MULTIPLE_FLEET_WNDS")); - BoolOption("UI.window-quickclose", UserString("OPTIONS_QUICK_CLOSE_WNDS")); - FileOption("stringtable-filename", UserString("OPTIONS_LANGUAGE"), GetSettingsDir(), std::make_pair(UserString("OPTIONS_LANGUAGE_FILE"), "*" + STRINGTABLE_FILE_SUFFIX), &ValidStringtableFile); - IntOption("UI.tooltip-delay", UserString("OPTIONS_TOOLTIP_DELAY")); + BoolOption("UI.fleet-autoselect", UserString("OPTIONS_AUTOSELECT_FLEET")); + BoolOption("UI.multiple-fleet-windows", UserString("OPTIONS_MULTIPLE_FLEET_WNDS")); + BoolOption("UI.window-quickclose", UserString("OPTIONS_QUICK_CLOSE_WNDS")); + FileOption("stringtable-filename", UserString("OPTIONS_LANGUAGE"), GetSettingsDir(), std::make_pair(UserString("OPTIONS_LANGUAGE_FILE"), "*" + STRINGTABLE_FILE_SUFFIX), &ValidStringtableFile); + IntOption("UI.tooltip-delay", UserString("OPTIONS_TOOLTIP_DELAY")); EndSection(); BeginSection(UserString("OPTIONS_FONTS")); - FontOption("UI.font", UserString("OPTIONS_FONT_TEXT")); - FontOption("UI.title-font", UserString("OPTIONS_FONT_TITLE")); + FontOption("UI.font", UserString("OPTIONS_FONT_TEXT")); + FontOption("UI.title-font", UserString("OPTIONS_FONT_TITLE")); EndSection(); BeginSection(UserString("OPTIONS_FONT_SIZES")); - IntOption("UI.font-size", UserString("OPTIONS_FONT_TEXT")); - IntOption("UI.title-font-size", UserString("OPTIONS_FONT_TITLE")); + IntOption("UI.font-size", UserString("OPTIONS_FONT_TEXT")); + IntOption("UI.title-font-size", UserString("OPTIONS_FONT_TITLE")); EndSection(); BeginSection(UserString("OPTIONS_TECH_SPACING")); DoubleOption("UI.tech-layout-horz-spacing", UserString("OPTIONS_HORIZONTAL")); DoubleOption("UI.tech-layout-vert-spacing", UserString("OPTIONS_VERTICAL")); EndSection(); BeginSection(UserString("OPTIONS_CHAT")); - IntOption("UI.chat-edit-history", UserString("OPTIONS_CHAT_HISTORY")); - IntOption("UI.chat-hide-interval", UserString("OPTIONS_CHAT_HIDE")); + IntOption("UI.chat-edit-history", UserString("OPTIONS_CHAT_HISTORY")); + IntOption("UI.chat-hide-interval", UserString("OPTIONS_CHAT_HIDE")); EndSection(); BeginSection(UserString("OPTIONS_GALAXY_MAP")); - BoolOption("UI.galaxy-gas-background", UserString("OPTIONS_GALAXY_MAP_GAS")); - BoolOption("UI.optimized-system-rendering", UserString("OPTIONS_OPTIMIZED_SYSTEM_RENDERING")); + BoolOption("UI.galaxy-gas-background", UserString("OPTIONS_GALAXY_MAP_GAS")); + BoolOption("UI.optimized-system-rendering", UserString("OPTIONS_OPTIMIZED_SYSTEM_RENDERING")); + DoubleOption("UI.starlane-thickness", UserString("OPTIONS_STARLANE_THICKNESS")); + BoolOption("UI.resource-starlane-colouring", UserString("OPTIONS_RESOURCE_STARLANE_COLOURING")); + BoolOption("UI.fleet-supply-lines", UserString("OPTIONS_FLEET_SUPPLY_LINES")); + DoubleOption("UI.fleet-supply-line-width", UserString("OPTIONS_FLEET_SUPPLY_LINE_WIDTH")); EndPage(); // Colors tab Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2008-08-30 22:15:37 UTC (rev 2677) +++ trunk/FreeOrion/default/eng_stringtable.txt 2008-08-31 05:17:09 UTC (rev 2678) @@ -156,6 +156,18 @@ OPTIONS_DB_OPTIMIZED_SYSTEM_RENDERING Use fancy optimized OpenGL 1.5 rendering for systems on galaxy map. May crash on older graphics hardware. +OPTIONS_DB_STARLANE_THICKNESS +Sets how wide to render starlanes in pixels. + +OPTIONS_DB_RESOURCE_STARLANE_COLOURING +Toggles whether to colour starlanes with empire colours if empires can exchange resources along each starlane. + +OPTIONS_DB_FLEET_SUPPLY_LINES +Toggles whether to show fleet supply lines with empire-coloured indica + +OPTIONS_DB_FLEET_SUPPLY_LINE_WIDTH +Sets how wide to render fleet supply lines. + OPTIONS_DB_FORCE_EXTERNAL_SERVER Force the client not to start a server, even when hosting a game on localhost, playing single player, etc. @@ -863,6 +875,18 @@ OPTIONS_OPTIMIZED_SYSTEM_RENDERING Optimized system rendering +OPTIONS_STARLANE_THICKNESS +Starlane thickness + +OPTIONS_RESOURCE_STARLANE_COLOURING +Resource starlane colouring + +OPTIONS_FLEET_SUPPLY_LINES +Fleet supply lines + +OPTIONS_FLEET_SUPPLY_LINE_WIDTH +Fleet supply line width + OPTIONS_MUSIC Music |
From: <geo...@us...> - 2008-09-01 06:53:54
|
Revision: 2680 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2680&view=rev Author: geoffthemedio Date: 2008-09-01 06:53:57 +0000 (Mon, 01 Sep 2008) Log Message: ----------- -Unexposed maxstockpile from Python, since it presently isn't used -Various minor whitespace-type tweaks Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/python/PythonEmpireWrapper.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/ResourceCenter.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-08-31 07:23:49 UTC (rev 2679) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-09-01 06:53:57 UTC (rev 2680) @@ -471,7 +471,7 @@ } const int TOO_MANY_TURNS = 500; // stop counting turns to completion after this long, to prevent seemingly endless loops - + if (EPSILON < PPs) { //Logger().debugStream() << "ProductionQueue::Update: Simulating future turns of production queue"; // simulate future turns in order to determine when the builditems in the queue will be finished @@ -483,7 +483,7 @@ for (unsigned int i = 0; i < sim_queue_original_indices.size(); ++i) { sim_queue_original_indices[i] = i; } - + // remove from simulated queue any items that can't be built due to not meeting their location conditions // might be better to re-check buildability each turn, but this would require creating a simulated universe // into which simulated completed buildings could be inserted, as well as spoofing the current turn, or @@ -492,14 +492,14 @@ // assume that building location conditions evaluated at the present turn apply indefinitely for (unsigned int i = 0; i < sim_queue.size(); ++i) { if (empire->BuildableItem(sim_queue[i].item, sim_queue[i].location)) continue; - - // remove unbuildable items from the simulated queue, since they'll never finish... + + // remove unbuildable items from the simulated queue, since they'll never finish... m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; // turns left is indeterminate for this item sim_queue.erase(sim_queue.begin() + i); sim_production_status.erase(sim_production_status.begin() + i); sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); } - + // cycle through items on queue, adding up their allotted PP until each is finished and removed from queue // until everything on queue has been finished, in order to calculate expected completion times while (!sim_queue.empty() && turns < TOO_MANY_TURNS) { @@ -508,16 +508,16 @@ //Logger().debugStream() << "ProductionQueue::Update: Calling SetProdQueueElementSpending for simulated queue"; SetProdQueueElementSpending(empire, PPs, sim_production_status, sim_queue, total_PPs_spent, projects_in_progress); - + // cycle through items on queue, apply one turn's PP towards items, remove items that are done for (unsigned int i = 0; i < sim_queue.size(); ++i) { double item_cost; int build_turns; boost::tie(item_cost, build_turns) = empire->ProductionCostAndTime(sim_queue[i].item); - + double& status = sim_production_status[i]; status += sim_queue[i].spending; - + if (item_cost * build_turns - EPSILON <= status) { sim_production_status[i] -= item_cost * build_turns; // might have spillover to next item in order, so don't set to exactly 0 if (sim_queue[i].remaining == m_queue[sim_queue_original_indices[i]].remaining) { @@ -531,17 +531,17 @@ sim_queue_original_indices.erase(sim_queue_original_indices.begin() + i--); } } - } - ++turns; + } + ++turns; } // loop while (!sim_queue.empty() && turns < TOO_MANY_TURNS) - + // mark rest of items on simulated queue (if any) as never to be finished for (unsigned int i = 0; i < sim_queue.size(); ++i) { if (sim_queue[i].remaining == m_queue[sim_queue_original_indices[i]].remaining) m_queue[sim_queue_original_indices[i]].turns_left_to_next_item = -1; m_queue[sim_queue_original_indices[i]].turns_left_to_completion = -1; } - + } else { // since there are so few PPs, indicate that the number of turns left is indeterminate by providing a number < 0 for (unsigned int i = 0; i < m_queue.size(); ++i) { @@ -1450,10 +1450,7 @@ double Empire::ResourceMaxStockpile(ResourceType type) const { - std::map<ResourceType, boost::shared_ptr<ResourcePool> >::const_iterator it = m_resource_pools.find(type); - if (it == m_resource_pools.end()) - throw std::invalid_argument("Empire::ResourceMaxStockpile passed invalid ResourceType"); - return it->second->MaxStockpile(); + return 0.0; // not yet implemented } double Empire::ResourceProduction(ResourceType type) const @@ -1492,10 +1489,7 @@ void Empire::SetResourceMaxStockpile(ResourceType resource_type, double max) { - std::map<ResourceType, boost::shared_ptr<ResourcePool> >::const_iterator it = m_resource_pools.find(resource_type); - if (it == m_resource_pools.end()) - throw std::invalid_argument("Empire::SetResourceMaxStockpile passed invalid ResourceType"); - return it->second->SetMaxStockpile(max); + return; // not yet implemented } void Empire::PlaceTechInQueue(const Tech* tech, int pos/* = -1*/) @@ -1981,9 +1975,9 @@ Universe::ObjectVec object_vec = GetUniverse().FindObjects(OwnedVisitor<UniverseObject>(m_id)); std::vector<ResourceCenter*> res_vec; std::vector<PopCenter*> pop_vec; + // determine if each object owned by this empire is a ResourceCenter and/or PopCenter (could be one, neither or both) - for (unsigned int i = 0; i < object_vec.size(); ++i) - { + for (unsigned int i = 0; i < object_vec.size(); ++i) { if (ResourceCenter* rc = dynamic_cast<ResourceCenter*>(object_vec[i])) res_vec.push_back(rc); if (PopCenter* pc = dynamic_cast<PopCenter*>(object_vec[i])) @@ -2070,15 +2064,15 @@ void Empire::UpdateFoodDistribution() { - Logger().debugStream() << "Food distribution for empire " << EmpireID(); + //Logger().debugStream() << "Food distribution for empire " << EmpireID(); m_resource_pools[RE_FOOD]->Update(); // recalculate total food production double available_food = m_resource_pools[RE_FOOD]->Available(); m_food_total_distributed = 0.0; - std::vector<PopCenter*> pop_centers = m_population_pool.PopCenters(); //GetUniverse().FindObjects(OwnedVisitor<PopCenter>(m_id)); + std::vector<PopCenter*> pop_centers = m_population_pool.PopCenters(); std::vector<PopCenter*>::iterator pop_it; - std::vector<ResourceCenter*> resource_centers = m_resource_pools[RE_FOOD]->ResourceCenters(); //GetUniverse().FindObjects(OwnedVisitor<ResourceCenter>(m_id)); + std::vector<ResourceCenter*> resource_centers = m_resource_pools[RE_FOOD]->ResourceCenters(); std::vector<ResourceCenter*>::iterator res_it; // compile map of food production of ResourceCenters, indexed by center's id @@ -2114,7 +2108,7 @@ available_food -= allocation; } - Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; + //Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; // second pass: give as much food as needed to PopCenters to maintain current population for (pop_it = pop_centers.begin(); pop_it != pop_centers.end() && available_food > 0.0; ++pop_it) { @@ -2135,7 +2129,7 @@ m_food_total_distributed += addition; } - Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; + //Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; // third pass: give as much food as needed to PopCenters to allow max possible growth for (pop_it = pop_centers.begin(); pop_it != pop_centers.end() && available_food > 0.0; ++pop_it) { @@ -2155,7 +2149,7 @@ m_food_total_distributed += addition; } - Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; + //Logger().debugStream() << "Empire::UpdateFoodDistribution: m_food_total_distributed: " << m_food_total_distributed; // after changing food distribution, population growth predictions may need to be redone Modified: trunk/FreeOrion/python/PythonEmpireWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonEmpireWrapper.cpp 2008-08-31 07:23:49 UTC (rev 2679) +++ trunk/FreeOrion/python/PythonEmpireWrapper.cpp 2008-09-01 06:53:57 UTC (rev 2680) @@ -99,7 +99,7 @@ .add_property("productionPoints", make_function(&Empire::ProductionPoints, return_value_policy<return_by_value>())) .def("resourceStockpile", &Empire::ResourceStockpile) - .def("resourceMaxStockpile", &Empire::ResourceMaxStockpile) + //.def("resourceMaxStockpile", &Empire::ResourceMaxStockpile) .def("resourceProduction", &Empire::ResourceProduction) .def("resourceAvailable", &Empire::ResourceAvailable) Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2008-08-31 07:23:49 UTC (rev 2679) +++ trunk/FreeOrion/server/ServerApp.cpp 2008-09-01 06:53:57 UTC (rev 2680) @@ -465,11 +465,9 @@ void ServerApp::ProcessTurns() { - Empire* empire; - OrderSet* order_set; - OrderSet::const_iterator order_it; - Universe& universe = GetUniverse(); - EmpireManager& empires = Empires(); + Empire* empire; + Universe& universe = GetUniverse(); + EmpireManager& empires = Empires(); // Now all orders, then process turns for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { @@ -480,10 +478,10 @@ empire = empires.Lookup(it->first); empire->ClearSitRep(); - order_set = it->second; + OrderSet* order_set = it->second; // execute order set - for (order_it = order_set->begin(); order_it != order_set->end(); ++order_it) { + for (OrderSet::const_iterator order_it = order_set->begin(); order_it != order_set->end(); ++order_it) { order_it->second->Execute(); } } @@ -492,11 +490,11 @@ typedef std::map<int, std::vector<boost::shared_ptr<FleetColonizeOrder> > > ColonizeOrderMap; ColonizeOrderMap colonize_order_map; for (std::map<int, OrderSet*>::iterator it = m_turn_sequence.begin(); it != m_turn_sequence.end(); ++it) { - order_set = it->second; + OrderSet* order_set = it->second; // filter FleetColonizeOrder and sort them per planet boost::shared_ptr<FleetColonizeOrder> order; - for (order_it = order_set->begin(); order_it != order_set->end(); ++order_it) { + for (OrderSet::const_iterator order_it = order_set->begin(); order_it != order_set->end(); ++order_it) { if ((order = boost::dynamic_pointer_cast<FleetColonizeOrder>(order_it->second))) { ColonizeOrderMap::iterator it = colonize_order_map.find(order->PlanetID()); if (it == colonize_order_map.end()) { @@ -537,7 +535,7 @@ int winner = 0; // is the current winner armed? bool winner_is_armed = set_empire_with_military.find(it->second[0]->EmpireID()) != set_empire_with_military.end(); - for (unsigned int i=1;i<it->second.size();i++) + for (unsigned int i = 1; i < it->second.size(); i++) // is this empire armed? if (set_empire_with_military.find(it->second[i]->EmpireID()) != set_empire_with_military.end()) { // if this empire is armed and the former winner too, noone can win Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2008-08-31 07:23:49 UTC (rev 2679) +++ trunk/FreeOrion/universe/ResourceCenter.h 2008-09-01 06:53:57 UTC (rev 2680) @@ -15,8 +15,7 @@ * * Planet is the most obvious class to inherit ResourceCenter, but other classes could be made from it as well * (e.g., a trade-ship or mining vessel, or a non-Planet UniverseObject- and PopCenter- derived object of some - * sort. - */ + * sort. */ class ResourceCenter { public: |
From: <tz...@us...> - 2008-11-15 17:09:41
|
Revision: 2681 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2681&view=rev Author: tzlaine Date: 2008-11-15 17:09:36 +0000 (Sat, 15 Nov 2008) Log Message: ----------- Updated code to accommodate changes in the Boost 1.36 API. Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/build_config.py trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/util/Directories.cpp trunk/FreeOrion/util/MultiplayerCommon.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/UI/ClientUI.cpp 2008-11-15 17:09:36 UTC (rev 2681) @@ -589,7 +589,7 @@ fs::directory_iterator end_it; for (fs::directory_iterator it(dir); it != end_it; ++it) { try { - if (fs::exists(*it) && !fs::is_directory(*it) && boost::algorithm::starts_with(it->leaf(), prefix)) + if (fs::exists(*it) && !fs::is_directory(*it) && boost::algorithm::starts_with(it->filename(), prefix)) textures.push_back(ClientUI::GetTexture(*it, mipmap)); } catch (const fs::filesystem_error& e) { // ignore files for which permission is denied, and rethrow other exceptions Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2008-11-15 17:09:36 UTC (rev 2681) @@ -512,7 +512,7 @@ for (fs::directory_iterator it(GetSettingsDir()); it != end_it; ++it) { try { if (fs::exists(*it)) { - std::string filename = it->leaf(); + std::string filename = it->filename(); if (boost::algorithm::ends_with(filename, FONT_SUFFIX)) filenames.insert(filename); } Modified: trunk/FreeOrion/build_config.py =================================================================== --- trunk/FreeOrion/build_config.py 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/build_config.py 2008-11-15 17:09:36 UTC (rev 2681) @@ -13,7 +13,7 @@ sdl_version = '1.2.7' -boost_version_string = '1.35' +boost_version_string = '1.36' def BoostStringToNumber(version_string): pieces = version_string.split('.') return str(int(pieces[0]) * 100000 + int(pieces[1]) * 100 + (3 <= len(pieces) and int(pieces[2]) or 0)) Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-11-15 17:09:36 UTC (rev 2681) @@ -598,7 +598,7 @@ fs::directory_iterator end_it; for (fs::directory_iterator it(save_dir); it != end_it; ++it) { if (!fs::is_directory(*it)) { - std::string filename = it->leaf(); + std::string filename = it->filename(); if (!new_game && filename.find(extension) == filename.size() - extension.size() && filename.find(save_filename.substr(0, save_filename.size() - 7)) == 0) { Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-11-15 17:09:36 UTC (rev 2681) @@ -10,8 +10,6 @@ #include "InhibitableSignal.h" -#include <boost/serialization/is_abstract.hpp> - #include <set> #include <string> #include <vector> @@ -179,7 +177,6 @@ template <class Archive> void serialize(Archive& ar, const unsigned int version); }; -BOOST_IS_ABSTRACT(UniverseObject) // template implementations template <class Iter> Modified: trunk/FreeOrion/util/Directories.cpp =================================================================== --- trunk/FreeOrion/util/Directories.cpp 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/util/Directories.cpp 2008-11-15 17:09:36 UTC (rev 2681) @@ -59,9 +59,9 @@ bool foundexec = false, foundresources = false; for (fs::directory_iterator diter(bundle_path); diter != dir_end; ++diter) { - if ((*diter).leaf() == "Executables") + if ((*diter).filename() == "Executables") foundexec = true; - else if ((*diter).leaf() == "Resources") + else if ((*diter).filename() == "Resources") foundresources = true; } // if nothing found. assume that we are in the Executables directory which may be the case during debugging Modified: trunk/FreeOrion/util/MultiplayerCommon.cpp =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.cpp 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/util/MultiplayerCommon.cpp 2008-11-15 17:09:36 UTC (rev 2681) @@ -237,8 +237,8 @@ fs::directory_iterator end_it; for (fs::directory_iterator it(save_dir); it != end_it; ++it) { try { - if (fs::exists(*it) && !fs::is_directory(*it) && it->leaf()[0] != '.') { - std::string filename = it->leaf(); + if (fs::exists(*it) && !fs::is_directory(*it) && it->filename()[0] != '.') { + std::string filename = it->filename(); // disallow filenames that begin with a dot, and filenames with spaces in them if (filename.find('.') != 0 && filename.find(' ') == std::string::npos && filename.find(MP_SAVE_FILE_EXTENSION) == filename.size() - MP_SAVE_FILE_EXTENSION.size()) { Modified: trunk/FreeOrion/util/Order.h =================================================================== --- trunk/FreeOrion/util/Order.h 2008-09-01 06:53:57 UTC (rev 2680) +++ trunk/FreeOrion/util/Order.h 2008-11-15 17:09:36 UTC (rev 2681) @@ -9,7 +9,6 @@ #include "../universe/ShipDesign.h" #include <boost/serialization/access.hpp> -#include <boost/serialization/is_abstract.hpp> #include <boost/serialization/nvp.hpp> #include <vector> @@ -71,7 +70,6 @@ void serialize(Archive& ar, const unsigned int version); }; -BOOST_IS_ABSTRACT(Order); ///////////////////////////////////////////////////// // RenameOrder |
From: <tz...@us...> - 2008-12-07 07:24:45
|
Revision: 2692 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2692&view=rev Author: tzlaine Date: 2008-12-07 07:24:41 +0000 (Sun, 07 Dec 2008) Log Message: ----------- Small changes to bring code into agreement with recent GG changes. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.h trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.h trunk/FreeOrion/client/human/HumanClientApp.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/CUIControls.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -913,15 +913,15 @@ int tab_width = GetOrientation() == GG::VERTICAL ? Value(Tab()->Height()) : Value(Tab()->Width()); GG::Pt ul, lr; if (GetOrientation() == GG::VERTICAL) { - ul.x = ((LR.x + UL.x) - LineWidth()) / 2; - lr.x = ul.x + LineWidth(); + ul.x = ((LR.x + UL.x) - static_cast<int>(LineWidth())) / 2; + lr.x = ul.x + static_cast<int>(LineWidth()); ul.y = UL.y + tab_width / 2; lr.y = LR.y - tab_width / 2; } else { ul.x = UL.x + tab_width / 2; lr.x = LR.x - tab_width / 2; - ul.y = ((LR.y + UL.y) - LineWidth()) / 2; - lr.y = ul.y + LineWidth(); + ul.y = ((LR.y + UL.y) - static_cast<int>(LineWidth())) / 2; + lr.y = ul.y + static_cast<int>(LineWidth()); } GG::FlatRectangle(ul, lr, GG::CLR_ZERO, border_color_to_use, 1); Tab()->OffsetMove(UpperLeft()); Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -1119,7 +1119,7 @@ HullBrowsedSignal; //!< a hull was browsed (clicked once) private: void DoLayout(); - void WndSelected(int index); + void WndSelected(std::size_t index); int m_empire_id; @@ -1267,7 +1267,7 @@ m_tabs->SizeMove(GG::Pt(left, top), ClientSize() - GG::Pt(LEFT_PAD, TOP_PAD)); } -void DesignWnd::BaseSelector::WndSelected(int index) { +void DesignWnd::BaseSelector::WndSelected(std::size_t index) { Reset(); } Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -38,9 +38,9 @@ initialized(false) {} - virtual bool WndHasBrowseInfo(const Wnd* wnd, int mode) const { + virtual bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const { const std::vector<Wnd::BrowseInfoMode>& browse_modes = wnd->BrowseModes(); - assert(0 <= mode && mode <= static_cast<int>(browse_modes.size())); + assert(mode <= browse_modes.size()); return true; } @@ -95,7 +95,7 @@ initialized = true; } - virtual void UpdateImpl(int mode, const Wnd* target) { + virtual void UpdateImpl(std::size_t mode, const Wnd* target) { if (!initialized) Initialize(); } @@ -535,14 +535,13 @@ m_pop_stat->SetValue(pop->ProjectedMeterPoints(METER_POPULATION)); m_health_stat->SetValue(pop->ProjectedMeterPoints(METER_HEALTH)); - // tooltips if (meter_map) { - boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>(new MeterBrowseWnd(METER_POPULATION, obj, *meter_map)); + boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd(new MeterBrowseWnd(METER_POPULATION, obj, *meter_map)); m_pop_stat->SetBrowseInfoWnd(browse_wnd); m_multi_icon_value_indicator->SetToolTip(METER_POPULATION, browse_wnd); - browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>(new MeterBrowseWnd(METER_HEALTH, obj, *meter_map)); + browse_wnd.reset(new MeterBrowseWnd(METER_HEALTH, obj, *meter_map)); m_health_stat->SetBrowseInfoWnd(browse_wnd); m_multi_icon_value_indicator->SetToolTip(METER_HEALTH, browse_wnd); } @@ -2212,9 +2211,9 @@ Resize(GG::Pt(TEXT_WIDTH + ICON_WIDTH, std::max(m_icon->Height(), ROW_HEIGHT + m_main_text->Height()))); } -bool IconTextBrowseWnd::WndHasBrowseInfo(const Wnd* wnd, int mode) const { +bool IconTextBrowseWnd::WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const { const std::vector<Wnd::BrowseInfoMode>& browse_modes = wnd->BrowseModes(); - assert(0 <= mode && mode <= static_cast<int>(browse_modes.size())); + assert(mode <= browse_modes.size()); return true; } Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/InfoPanels.h 2008-12-07 07:24:41 UTC (rev 2692) @@ -369,7 +369,7 @@ public: IconTextBrowseWnd(const boost::shared_ptr<GG::Texture> texture, const std::string& title_text, const std::string& main_text); - virtual bool WndHasBrowseInfo(const Wnd* wnd, int mode) const; + virtual bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const; virtual void Render(); private: Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -76,7 +76,7 @@ GG::Y offset(m_co); - offset -= (GG::GUI::GetGUI()->Ticks() - m_start_time)/40; + offset -= static_cast<int>((GG::GUI::GetGUI()->Ticks() - m_start_time)/40); int transparency = 255; Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -487,7 +487,7 @@ RenderStarfields(); - int interval = GetOptionsDB().Get<int>("UI.chat-hide-interval"); + unsigned int interval = GetOptionsDB().Get<int>("UI.chat-hide-interval"); if (!m_chat_edit->Visible() && g_chat_display_show_time && interval && (interval < (GG::GUI::GetGUI()->Ticks() - g_chat_display_show_time) / 1000)) { m_chat_display->Hide(); Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -234,7 +234,7 @@ m_saved_games_list->Disable(); if (!m_host) { - for (int i = 0; i < m_new_load_game_buttons->NumButtons(); ++i) { + for (std::size_t i = 0; i < m_new_load_game_buttons->NumButtons(); ++i) { m_new_load_game_buttons->DisableButton(i); } m_galaxy_setup_panel->Disable(); @@ -322,15 +322,15 @@ m_start_game_bn->Disable(!CanStart()); } -void MultiplayerLobbyWnd::NewLoadClicked(int idx) +void MultiplayerLobbyWnd::NewLoadClicked(std::size_t idx) { switch (idx) { - case 0: + case std::size_t(0): m_lobby_data.m_new_game = true; m_galaxy_setup_panel->Disable(false); m_saved_games_list->Disable(); break; - case 1: + case std::size_t(1): m_lobby_data.m_new_game = false; m_galaxy_setup_panel->Disable(); m_saved_games_list->Disable(false); Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.h =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2008-12-07 07:24:41 UTC (rev 2692) @@ -50,7 +50,7 @@ private: void Init(); - void NewLoadClicked(int idx); + void NewLoadClicked(std::size_t idx); void GalaxySetupPanelChanged(); void SaveGameChanged(GG::DropDownList::iterator it); void PreviewImageChanged(boost::shared_ptr<GG::Texture> new_image); Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -145,7 +145,7 @@ PopulateServerList(); } -void ServerConnectWnd::HostOrJoinClicked(int idx) +void ServerConnectWnd::HostOrJoinClicked(std::size_t idx) { EnableDisableControls(); } Modified: trunk/FreeOrion/UI/ServerConnectWnd.h =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.h 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/UI/ServerConnectWnd.h 2008-12-07 07:24:41 UTC (rev 2692) @@ -41,7 +41,7 @@ void Init(); void PopulateServerList(); void RefreshServerList(); - void HostOrJoinClicked(int idx); + void HostOrJoinClicked(std::size_t idx); void ServerSelected(const GG::ListBox::SelectionSet& selections); void IPAddressEdited(const std::string& str); void NameEdited(const std::string& str); Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-12-03 03:50:16 UTC (rev 2691) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2008-12-07 07:24:41 UTC (rev 2692) @@ -78,7 +78,7 @@ #endif //ENABLE_CRASH_BACKTRACE namespace { - const int SERVER_CONNECT_TIMEOUT = 30000; // in ms + const unsigned int SERVER_CONNECT_TIMEOUT = 30000; // in ms // command-line options void AddOptions(OptionsDB& db) @@ -202,7 +202,7 @@ bool failed = false; if (galaxy_wnd.EndedWithOk()) { - int start_time = Ticks(); + unsigned int start_time = Ticks(); while (!Networking().ConnectToLocalHostServer()) { if (SERVER_CONNECT_TIMEOUT < Ticks() - start_time) { ClientUI::MessageBox(UserString("ERR_CONNECT_TIMED_OUT"), true); @@ -253,7 +253,7 @@ } server_name = "localhost"; } - int start_time = Ticks(); + unsigned int start_time = Ticks(); while (!Networking().ConnectToServer(server_name)) { if (SERVER_CONNECT_TIMEOUT < Ticks() - start_time) { ClientUI::MessageBox(UserString("ERR_CONNECT_TIMED_OUT"), true); @@ -305,8 +305,7 @@ if (!GetOptionsDB().Get<bool>("force-external-server")) StartServer(); - int start_time = Ticks(); - const int SERVER_CONNECT_TIMEOUT = 30000; // in ms + unsigned int start_time = Ticks(); while (!Networking().ConnectToLocalHostServer()) { if (SERVER_CONNECT_TIMEOUT < Ticks() - start_time) { ClientUI::MessageBox(UserString("ERR_CONNECT_TIMED_OUT"), true); |
From: <geo...@us...> - 2008-12-07 22:22:22
|
Revision: 2693 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2693&view=rev Author: geoffthemedio Date: 2008-12-07 21:43:38 +0000 (Sun, 07 Dec 2008) Log Message: ----------- -Added a ship part icon submitted by Josh to ensure it doesn't get lost -Added a custom Version.cpp for MSVC 2005 since the scons-created one doesn't exist if not using scons. This replaces the odd-looking un-substituted text with something less odd-looking on the splash screen and window title bar -Switch error logging in Python AI to output as error instead of debug Modified Paths: -------------- trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj trunk/FreeOrion/python/PythonLoggingWrapper.cpp Added Paths: ----------- trunk/FreeOrion/default/data/art/icons/ship_parts/mass_driver.png trunk/FreeOrion/msvc2005/src/ trunk/FreeOrion/msvc2005/src/Version.cpp Property Changed: ---------------- trunk/FreeOrion/ Property changes on: trunk/FreeOrion ___________________________________________________________________ Modified: svn:ignore - patch_bak + patch_bak config.cache options.cache freeorion.exe freeorionca.exe freeoriond.exe alut.dll boost_python-vc80-mt-1_34.dll boost_python-vc80-mt-1_35.dll boost_python-vc80-mt-1_36.dll devil.dll GiGiOgre.dll GiGiOgrePlugin_OIS.dll glew32.dll ilu.dll ilut.dll jpeg.dll libexpat.dll libogg.dll libvorbis.dll libvorbisfile.dll log4cpp.dll msvcm80.dll msvcp80.dll msvcr80.dll OpenAL32.dll png.dll python25.dll SDL.dll wrap_oal.dll z.dll zlib1.dll Added: trunk/FreeOrion/default/data/art/icons/ship_parts/mass_driver.png =================================================================== (Binary files differ) Property changes on: trunk/FreeOrion/default/data/art/icons/ship_parts/mass_driver.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2008-12-07 07:24:41 UTC (rev 2692) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorion/freeorion.vcproj 2008-12-07 21:43:38 UTC (rev 2693) @@ -606,15 +606,8 @@ > </File> <File - RelativePath="..\..\..\util\Version.cpp.in" + RelativePath="..\..\src\Version.cpp" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - /> - </FileConfiguration> </File> <File RelativePath="..\..\..\util\Version.h" Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2008-12-07 07:24:41 UTC (rev 2692) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeorionca/freeorionca.vcproj 2008-12-07 21:43:38 UTC (rev 2693) @@ -290,10 +290,6 @@ > </File> <File - RelativePath="..\..\..\util\Version.h" - > - </File> - <File RelativePath="..\..\..\util\XMLDoc.cpp" > </File> Modified: trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj =================================================================== --- trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2008-12-07 07:24:41 UTC (rev 2692) +++ trunk/FreeOrion/msvc2005/FreeOrion/freeoriond/freeoriond.vcproj 2008-12-07 21:43:38 UTC (rev 2693) @@ -575,10 +575,6 @@ > </File> <File - RelativePath="..\..\..\util\Version.h" - > - </File> - <File RelativePath="..\..\..\util\XMLDoc.cpp" > </File> Added: trunk/FreeOrion/msvc2005/src/Version.cpp =================================================================== --- trunk/FreeOrion/msvc2005/src/Version.cpp (rev 0) +++ trunk/FreeOrion/msvc2005/src/Version.cpp 2008-12-07 21:43:38 UTC (rev 2693) @@ -0,0 +1,7 @@ +#include "../../util/Version.h" + +const std::string& FreeOrionVersionString() +{ + static const std::string retval = "Post-v0.3.10 [Development Build]"; + return retval; +} Modified: trunk/FreeOrion/python/PythonLoggingWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonLoggingWrapper.cpp 2008-12-07 07:24:41 UTC (rev 2692) +++ trunk/FreeOrion/python/PythonLoggingWrapper.cpp 2008-12-07 21:43:38 UTC (rev 2693) @@ -37,7 +37,7 @@ for (int i = 0; i < MAX_SINGLE_CHUNK_TEXT_SIZE; ++i) { if (text[i] == '\0') break; if (text[i] == '\n' || i == MAX_SINGLE_CHUNK_TEXT_SIZE - 1) { - Logger().debugStream() << error_buffer; + Logger().errorStream() << error_buffer; error_buffer = ""; } else { error_buffer += text[i]; |
From: <geo...@us...> - 2008-12-09 01:45:59
|
Revision: 2694 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2694&view=rev Author: geoffthemedio Date: 2008-12-09 01:45:55 +0000 (Tue, 09 Dec 2008) Log Message: ----------- -Applied modified version of patch by void to fix bug 2400471: Buildings are not added in the build queue -Whitespace grooming of starnames.txt -Increased max allowed resolution to 2560x1600 to fix feature request [ 2282320 ] Display at 2560x1600 Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/default/starnames.txt Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2008-12-07 21:43:38 UTC (rev 2693) +++ trunk/FreeOrion/Empire/Empire.cpp 2008-12-09 01:45:55 UTC (rev 2694) @@ -849,8 +849,10 @@ std::pair<double, int> Empire::ProductionCostAndTime(const ProductionQueue::ProductionItem& item) const { - if (item.build_type == BT_SHIP) - return ProductionCostAndTime(item.build_type, item.design_id); + if (item.build_type == BT_BUILDING) + return ProductionCostAndTime(BT_BUILDING, item.name); + else if (item.build_type == BT_SHIP) + return ProductionCostAndTime(BT_SHIP, item.design_id); else throw std::invalid_argument("Empire::ProductionCostAndTime was passed a ProductionItem with an invalid BuildType"); return std::make_pair(-1.0, -1); Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2008-12-07 21:43:38 UTC (rev 2693) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2008-12-09 01:45:55 UTC (rev 2694) @@ -889,8 +889,10 @@ if (selections.size() == 1) { GG::ListBox::iterator row = *selections.begin(); BuildType build_type = m_build_types[row]; - if (build_type == BT_SHIP) - DisplayIDedBuildItemSignal(m_build_types[row], boost::lexical_cast<int>((*row)->DragDropDataType())); + if (build_type == BT_BUILDING) + DisplayNamedBuildItemSignal(BT_BUILDING, (*row)->DragDropDataType()); + else if (build_type == BT_SHIP) + DisplayIDedBuildItemSignal(BT_SHIP, boost::lexical_cast<int>((*row)->DragDropDataType())); } } @@ -899,8 +901,10 @@ if ((*it)->Disabled()) return; BuildType build_type = m_build_types[it]; - if (build_type == BT_SHIP) - RequestIDedBuildItemSignal(build_type, boost::lexical_cast<int>((*it)->DragDropDataType()), 1); + if (build_type == BT_BUILDING) + RequestNamedBuildItemSignal(BT_BUILDING, (*it)->DragDropDataType(), 1); + else if (build_type == BT_SHIP) + RequestIDedBuildItemSignal(BT_SHIP, boost::lexical_cast<int>((*it)->DragDropDataType()), 1); } Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2008-12-07 21:43:38 UTC (rev 2693) +++ trunk/FreeOrion/UI/ClientUI.cpp 2008-12-09 01:45:55 UTC (rev 2694) @@ -355,12 +355,12 @@ // command-line options void AddOptions(OptionsDB& db) { - db.Add("app-width", "OPTIONS_DB_APP_WIDTH", 1024, RangedValidator<int>(800, 2048)); - db.Add("app-height", "OPTIONS_DB_APP_HEIGHT", 768, RangedValidator<int>(600, 1536)); - db.Add('c', "color-depth", "OPTIONS_DB_COLOR_DEPTH", 32, RangedStepValidator<int>(8, 16, 32)); + db.Add("app-width", "OPTIONS_DB_APP_WIDTH", 1024, RangedValidator<int>(800, 2560)); + db.Add("app-height", "OPTIONS_DB_APP_HEIGHT", 768, RangedValidator<int>(600, 1600)); + db.Add('c', "color-depth", "OPTIONS_DB_COLOR_DEPTH", 32, RangedStepValidator<int>(8, 16, 32)); db.Add("show-fps", "OPTIONS_DB_SHOW_FPS", false); db.Add("limit-fps", "OPTIONS_DB_LIMIT_FPS", true); - db.Add("max-fps", "OPTIONS_DB_MAX_FPS", 60.0, RangedValidator<double>(10.0, 200.0)); + db.Add("max-fps", "OPTIONS_DB_MAX_FPS", 60.0, RangedValidator<double>(10.0, 200.0)); // sound db.Add("UI.sound.enabled", "OPTIONS_DB_UI_SOUND_ENABLED", true, Validator<bool>()); @@ -389,11 +389,11 @@ db.Add<std::string>("UI.sound.balanced-focus", "OPTIONS_DB_UI_SOUND_BALANCED_FOCUS", "balanced_select.wav"); // fonts - db.Add<std::string>("UI.font", "OPTIONS_DB_UI_FONT", "DejaVuSans.ttf"); - db.Add<std::string>("UI.font-bold", "OPTIONS_DB_UI_FONT_BOLD", "DejaVuSans-Bold.ttf"); - db.Add("UI.font-size", "OPTIONS_DB_UI_FONT_SIZE", 12, RangedValidator<int>(4, 40)); - db.Add<std::string>("UI.title-font", "OPTIONS_DB_UI_TITLE_FONT", "DejaVuSans.ttf"); - db.Add("UI.title-font-size", "OPTIONS_DB_UI_TITLE_FONT_SIZE", 12, RangedValidator<int>(4, 40)); + db.Add<std::string>("UI.font", "OPTIONS_DB_UI_FONT", "DejaVuSans.ttf"); + db.Add<std::string>("UI.font-bold", "OPTIONS_DB_UI_FONT_BOLD", "DejaVuSans-Bold.ttf"); + db.Add("UI.font-size", "OPTIONS_DB_UI_FONT_SIZE", 12, RangedValidator<int>(4, 40)); + db.Add<std::string>("UI.title-font", "OPTIONS_DB_UI_TITLE_FONT", "DejaVuSans.ttf"); + db.Add("UI.title-font-size", "OPTIONS_DB_UI_TITLE_FONT_SIZE", 12, RangedValidator<int>(4, 40)); // colors db.Add("UI.wnd-color", "OPTIONS_DB_UI_WND_COLOR", StreamableColor(GG::Clr(0, 0, 0, 210)), Validator<StreamableColor>()); @@ -424,13 +424,13 @@ db.Add("UI.tech-progress", "OPTIONS_DB_UI_TECH_PROGRESS", StreamableColor(GG::Clr(40, 40, 40, 255)), Validator<StreamableColor>()); // misc - db.Add("UI.scroll-width", "OPTIONS_DB_UI_SCROLL_WIDTH", 14, RangedValidator<int>(8, 30)); - db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); - db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 1.0, RangedValidator<double>(0.2, 2)); - db.Add("UI.system-selection-indicator-size","OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE",2.0, RangedValidator<double>(0.5, 5)); + db.Add("UI.scroll-width", "OPTIONS_DB_UI_SCROLL_WIDTH", 14, RangedValidator<int>(8, 30)); + db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); + db.Add("UI.fleet-button-size", "OPTIONS_DB_UI_FLEET_BUTTON_SIZE", 1.0, RangedValidator<double>(0.2, 2)); + db.Add("UI.system-selection-indicator-size","OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE",2.0, RangedValidator<double>(0.5, 5)); // UI behavior - db.Add("UI.tooltip-delay", "OPTIONS_DB_UI_TOOLTIP_DELAY", 1000, RangedValidator<int>(0, 3000)); + db.Add("UI.tooltip-delay", "OPTIONS_DB_UI_TOOLTIP_DELAY", 1000, RangedValidator<int>(0, 3000)); db.Add("UI.multiple-fleet-windows", "OPTIONS_DB_UI_MULTIPLE_FLEET_WINDOWS", false); db.Add("UI.fleet-autoselect", "OPTIONS_DB_UI_FLEET_AUTOSELECT", true); db.Add("UI.window-quickclose", "OPTIONS_DB_UI_WINDOW_QUICKCLOSE", true); Modified: trunk/FreeOrion/default/starnames.txt =================================================================== --- trunk/FreeOrion/default/starnames.txt 2008-12-07 21:43:38 UTC (rev 2693) +++ trunk/FreeOrion/default/starnames.txt 2008-12-09 01:45:55 UTC (rev 2694) @@ -2,13 +2,13 @@ Achernar Acrux Acubens -Adams +Adams Adhara -Aegir +Aegir Agemem Agena Ahl -Airy +Airy Al Borak Albali Albireo @@ -50,7 +50,7 @@ Ancha Angstrom Ankaa -Ankh +Ankh Ansuz Antares Arcturus @@ -78,38 +78,38 @@ Axis Ayora Azha -Baade +Baade Baal-Samem Bacabs Bach Baer -Bahcall -Balder +Bahcall +Balder Barcia -Barnard +Barnard Baten Becrux Beid -Bell +Bell Bellatrix Benetnasch Berkano -Bessel +Bessel Betelgeuse Biham Bladehill -Bode -Bok -Bolton +Bode +Bok +Bolton Borealis Bradbury -Bragi +Bragi Brey Brog -Burbidge -Burke +Burbidge +Burke Caebeth -Cannon +Cannon Canopus Capella Caph @@ -120,7 +120,8 @@ Cebalrai Celaeno Centauri -Chandrasekhar +Chadwick +Chandrasekhar Chara Cheleb Cherruve @@ -128,7 +129,7 @@ Chih Nu Chort Coatlicue -Copernicus +Copernicus Cor Cormack Crawford @@ -140,14 +141,14 @@ Dar Deneb Denebola -Dicke +Dicke Diphda D'Korsh D'nebag Dnoces Doow-tsae Dosis -Draper +Draper Dreven Dubhe Dukalis @@ -155,14 +156,14 @@ Dvorak Edasich Edda -Eddington +Eddington Ehwaz Ekul Elased Electra Elnath Eltanin -Encke +Encke Enif Eos Ephyse @@ -175,22 +176,22 @@ Felix Fetter Fomalhaut -Fowler +Fowler Frack -Fraunhofer -Frey +Fraunhofer +Frey Furud Gacrux Galileo -Galle +Galle Gamab -Gamow +Gamow Garnet Garriot Gebo -Gefjon +Gefjon Gemroy -Giacconi +Giacconi Giausar Gienah Girtab @@ -208,7 +209,7 @@ Grue Gruis Grumium -Guth +Guth Gygax Hadar Hagalaz @@ -287,6 +288,7 @@ Maelas Maia Mallus +Mambo Mangaroa Mannaz Marfik @@ -309,12 +311,12 @@ Merops Mesa Mesarthim -Messier +Messier Miaplacidus Micojan Mier Mimosa -Minkowski +Minkowski Mintaka Mira Mirach @@ -342,7 +344,7 @@ Navi Needle Nekkar -Newton +Newton Nihal Nile Niyat @@ -364,15 +366,15 @@ Pawn Peacock Peel -Penrose -Penzias +Penrose +Penzias Perth Phact Phad Phecda Pherkad -Piazzi -Pickering +Piazzi +Pickering Plato Pleione Po @@ -388,40 +390,40 @@ Propus Pulcherrima Puppis -Ran +Ran Rangi Ras Rasalgethi Rastaban Raven -Reber +Reber Regor Regulus Rehua Reilsa Reynolds -Riccioli +Riccioli Rigel Ri-pog Rome Rook -Rossi +Rossi Rotanev Roua -Rubin +Rubin Ruchba Rukbat -Russell +Russell Sabik Sadalbari Sadalmelik Sadalsuud Sadatoni Sadr -Sagan +Sagan Saiph -Salpeter -Sandage +Salpeter +Sandage Sargas Satry Scarab @@ -434,17 +436,17 @@ Setag Seyfert Shade -Shapiro -Shapley +Shapiro +Shapley Shaula Sheliak Shelly Sheratan Silk Sirius -Sitter +Sitter Situla -Skadi +Skadi Skat Slipher Sopota @@ -452,7 +454,7 @@ Sparta Spica Sterope -Struve +Struve Styx Sualocin Suhail @@ -472,8 +474,8 @@ Tele Telemachus Teoblan -Thor -Thorne +Thor +Thorne Threshold Thuban Thurisaz @@ -482,7 +484,7 @@ Tigris Tirawa Tiwaz -Tombaugh +Tombaugh Tombstone Tork Tradamere @@ -492,22 +494,22 @@ Tusk Tycho Typhon -Tyr +Tyr Uch-Akip Uftivan Ull -Uluru +Uluru Unukalhai Ur Urania Uruz -Van Allen +Van Allen Vanant Vargas Vega Velorum Venice -Verrier +Verrier Vindemiatrix Vista Wasat @@ -515,14 +517,14 @@ Wazn Wedge Wei -Weizsacker +Weizsacker Wen-chang Wezen -Wheeler -Whipple -Wilson +Wheeler +Whipple +Wilson Winter -Wolf +Wolf Wraith Wunjo Xenos |
From: <geo...@us...> - 2008-12-12 06:48:23
|
Revision: 2698 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2698&view=rev Author: geoffthemedio Date: 2008-12-12 06:48:17 +0000 (Fri, 12 Dec 2008) Log Message: ----------- -Fixed some inconsistent forward declarations to remove warnings -Tweaked suppressed warnings in MSVC 2008 project files. Numerous unreferenced local variable, conversion loss of data warnings are now produced -Added preprocessor declarations to disable MS-deprecation warnings to replace specific warning number ignores that have been removed -Removed some seemingly unnecessary #include directives from Ship.cpp which hopefully won't cause any problems Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.h trunk/FreeOrion/UI/GalaxySetupWnd.h trunk/FreeOrion/UI/SidePanel.h trunk/FreeOrion/client/human/HumanClientApp.h trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj trunk/FreeOrion/msvc2008/FreeOrion/freeorionca/freeorionca.vcproj trunk/FreeOrion/msvc2008/FreeOrion/freeoriond/freeoriond.vcproj trunk/FreeOrion/network/Message.h trunk/FreeOrion/server/ServerFSM.h trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/ConditionParser1.cpp trunk/FreeOrion/universe/Effect.h trunk/FreeOrion/universe/Parser.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/UI/ClientUI.h =================================================================== --- trunk/FreeOrion/UI/ClientUI.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/UI/ClientUI.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -21,7 +21,7 @@ class TurnProgressWnd; class BuildingType; namespace GG { - class Clr; + struct Clr; class Font; class SubTexture; class Texture; Modified: trunk/FreeOrion/UI/GalaxySetupWnd.h =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/UI/GalaxySetupWnd.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -23,7 +23,7 @@ class CUIButton; class CUIStateButton; class EmpireColorSelector; -class GalaxySetupData; +struct GalaxySetupData; /** Encapsulates the galaxy setup options so that they may be reused in the GalaxySetupWnd and the MultiplayerLobbyWnd. */ class GalaxySetupPanel : public GG::Control Modified: trunk/FreeOrion/UI/SidePanel.h =================================================================== --- trunk/FreeOrion/UI/SidePanel.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/UI/SidePanel.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -18,7 +18,7 @@ class CUIScroll; class CUITextureButton; class RotatingPlanetControl; -class UniverseObjectVisitor; +struct UniverseObjectVisitor; class MultiIconValueIndicator; namespace GG { Modified: trunk/FreeOrion/client/human/HumanClientApp.h =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/client/human/HumanClientApp.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -18,7 +18,7 @@ #include <vector> -class HumanClientFSM; +struct HumanClientFSM; class MultiplayerLobbyWnd; /** the application framework class for the human player FreeOrion client. */ Modified: trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj =================================================================== --- trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/msvc2008/FreeOrion/freeorion/freeorion.vcproj 2008-12-12 06:48:17 UTC (rev 2698) @@ -44,7 +44,7 @@ Name="VCCLCompilerTool" Optimization="3" AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_36";C:\Python25\include;../../../GG/;../../include" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;GIGI_SDL_EXPORTS;FREEORION_BUILD_HUMAN;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;GIGI_SDL_EXPORTS;FREEORION_BUILD_HUMAN;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS" StringPooling="true" MinimalRebuild="true" RuntimeLibrary="2" @@ -55,7 +55,7 @@ UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="3" - DisableSpecificWarnings="4099;4251;4800;4267;4275;4244;4101;4258;4996;4312;4311" + DisableSpecificWarnings="4396;4251;4275;4099;4800" ShowIncludes="false" /> <Tool Modified: trunk/FreeOrion/msvc2008/FreeOrion/freeorionca/freeorionca.vcproj =================================================================== --- trunk/FreeOrion/msvc2008/FreeOrion/freeorionca/freeorionca.vcproj 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/msvc2008/FreeOrion/freeorionca/freeorionca.vcproj 2008-12-12 06:48:17 UTC (rev 2698) @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="3" AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_36";C:\Python25\include;../../../GG/" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;FREEORION_BUILD_AI;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;FREEORION_BUILD_AI;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS" StringPooling="true" MinimalRebuild="true" RuntimeLibrary="2" Modified: trunk/FreeOrion/msvc2008/FreeOrion/freeoriond/freeoriond.vcproj =================================================================== --- trunk/FreeOrion/msvc2008/FreeOrion/freeoriond/freeoriond.vcproj 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/msvc2008/FreeOrion/freeoriond/freeoriond.vcproj 2008-12-12 06:48:17 UTC (rev 2698) @@ -43,7 +43,7 @@ Name="VCCLCompilerTool" Optimization="3" AdditionalIncludeDirectories="../../../../include/;"../../../../Boost/include/boost-1_36";C:\Python25\include;../../../GG/;../../include" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;FREEORION_BUILD_SERVER;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;GIGI_EXPORTS;FREEORION_BUILD_SERVER;FREEORION_WIN32;BOOST_SIGNALS_STATIC_LINK;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS" StringPooling="true" MinimalRebuild="true" RuntimeLibrary="2" Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/network/Message.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -13,10 +13,10 @@ class EmpireManager; class Message; -class MultiplayerLobbyData; +struct MultiplayerLobbyData; class OrderSet; -class SaveGameUIData; -class SinglePlayerSetupData; +struct SaveGameUIData; +struct SinglePlayerSetupData; class Universe; class XMLDoc; struct PlayerInfo; Modified: trunk/FreeOrion/server/ServerFSM.h =================================================================== --- trunk/FreeOrion/server/ServerFSM.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/server/ServerFSM.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -20,9 +20,9 @@ #include <vector> -class MultiplayerLobbyData; +struct MultiplayerLobbyData; class ServerApp; -class SinglePlayerSetupData; +struct SinglePlayerSetupData; class PlayerConnection; class PlayerSaveGameData; class ServerSaveGameData; Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/Building.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -10,7 +10,7 @@ } class Planet; namespace Condition { - class ConditionBase; + struct ConditionBase; } enum CaptureResult; Modified: trunk/FreeOrion/universe/ConditionParser1.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser1.cpp 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/ConditionParser1.cpp 2008-12-12 06:48:17 UTC (rev 2698) @@ -25,7 +25,7 @@ rule<Scanner, ConditionClosure::context_t> condition1_p; namespace Condition { - class ConditionBase; + struct ConditionBase; } namespace { Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/Effect.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -14,7 +14,7 @@ class UniverseObject; namespace Condition { - class ConditionBase; + struct ConditionBase; typedef std::set<UniverseObject*> ObjectSet; } Modified: trunk/FreeOrion/universe/Parser.h =================================================================== --- trunk/FreeOrion/universe/Parser.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/Parser.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -23,7 +23,7 @@ // Forward Declarations // //////////////////////////////////////////////////////////// namespace Condition { - class ConditionBase; + struct ConditionBase; } namespace Effect { class EffectsGroup; Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/Ship.cpp 2008-12-12 06:48:17 UTC (rev 2698) @@ -6,15 +6,7 @@ #include "Predicates.h" #include "ShipDesign.h" -#include <log4cpp/Appender.hh> -#include <log4cpp/Category.hh> -#include <log4cpp/PatternLayout.hh> -#include <log4cpp/FileAppender.hh> -#include <boost/lexical_cast.hpp> -using boost::lexical_cast; -#include <stdexcept> - Ship::Ship() : m_design_id(INVALID_OBJECT_ID), m_fleet_id(INVALID_OBJECT_ID) Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/ShipDesign.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -13,7 +13,7 @@ #include "Enums.h" namespace Condition { - class ConditionBase; + struct ConditionBase; } namespace Effect { class EffectsGroup; Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2008-12-10 00:50:30 UTC (rev 2697) +++ trunk/FreeOrion/universe/Universe.h 2008-12-12 06:48:17 UTC (rev 2698) @@ -36,7 +36,7 @@ class Empire; struct UniverseObjectVisitor; class XMLElement; -struct ShipDesign; +class ShipDesign; class UniverseObject; class System; |