From: <geo...@us...> - 2015-02-06 11:44:31
|
Revision: 7911 http://sourceforge.net/p/freeorion/code/7911 Author: geoffthemedio Date: 2015-02-06 11:44:28 +0000 (Fri, 06 Feb 2015) Log Message: ----------- -Patch by vincele adding right-click popup command to objects list to set planet focus. -Added vincele to credits. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp trunk/FreeOrion/default/credits.xml trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-02-05 18:04:41 UTC (rev 7910) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-02-06 11:44:28 UTC (rev 7911) @@ -7,6 +7,7 @@ #include "../client/human/HumanClientApp.h" #include "../util/i18n.h" #include "../util/Logger.h" +#include "../util/Order.h" #include "../util/ModeratorAction.h" #include "../Empire/Empire.h" #include "../Empire/EmpireManager.h" @@ -24,6 +25,8 @@ #include <GG/DrawUtil.h> #include <GG/Layout.h> +#include <sstream> + std::vector<std::string> SpecialNames(); namespace { @@ -2211,6 +2214,9 @@ if (app->GetClientType() == Networking::CLIENT_TYPE_HUMAN_MODERATOR) moderator = true; + // Right click on an unselected row should automatically select it + m_list_box->SelectRow(it); + // create popup menu with object commands in it GG::MenuItem menu_contents; menu_contents.next_level.push_back(GG::MenuItem(UserString("DUMP"), 1, false, false)); @@ -2220,10 +2226,35 @@ if (!obj) return; + const int MENUITEM_SET_FOCUS_BASE = 20; + int menuitem_id = MENUITEM_SET_FOCUS_BASE; + std::map<std::string, int> all_foci; UniverseObjectType type = obj->ObjectType(); - if (type == OBJ_PLANET) + if (type == OBJ_PLANET) { menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_PLANET_SUITABILITY"), 2, false, false)); + const GG::ListBox::SelectionSet sel = m_list_box->Selections(); + for (GG::ListBox::SelectionSet::const_iterator it = sel.begin(); it != sel.end(); ++it) { + ObjectRow *row = dynamic_cast<ObjectRow *>(**it); + if (row) { + TemporaryPtr<Planet> one_planet = GetPlanet(row->ObjectID()); + if (one_planet && one_planet->OwnedBy(app->EmpireID())) { + std::vector<std::string> planet_foci = one_planet->AvailableFoci(); + for (std::vector<std::string>::iterator it = planet_foci.begin(); it != planet_foci.end(); ++it) + all_foci[*it]++; + } + } + } + GG::MenuItem focusMenuItem(UserString("MENUITEM_SET_FOCUS"), 3, false, false); + for (std::map<std::string, int>::iterator it = all_foci.begin(); it != all_foci.end(); ++it) { + menuitem_id++; + std::stringstream out; + out << UserString(it->first) << " (" << it->second << ")"; + focusMenuItem.next_level.push_back(GG::MenuItem(out.str(), menuitem_id, false, false)); + } + if (menuitem_id > MENUITEM_SET_FOCUS_BASE) + menu_contents.next_level.push_back(focusMenuItem); + } // moderator actions... if (moderator) { menu_contents.next_level.push_back(GG::MenuItem(UserString("MOD_DESTROY"), 10, false, false)); @@ -2243,6 +2274,10 @@ ClientUI::GetClientUI()->ZoomToPlanetPedia(object_id); break; } + case 3: { + // should never happen, Set Focus parent menu item is disabled + break; + } case 10: { net.SendMessage(ModeratorActionMessage(app->PlayerID(), Moderator::DestroyUniverseObject(object_id))); break; @@ -2251,9 +2286,28 @@ net.SendMessage(ModeratorActionMessage(app->PlayerID(), Moderator::SetOwner(object_id, ALL_EMPIRES))); break; } - default: + default: { + int id = popup.MenuID(); + if (id > MENUITEM_SET_FOCUS_BASE && id <= menuitem_id) { + std::map<std::string, int>::iterator it = all_foci.begin(); + std::advance(it, id - MENUITEM_SET_FOCUS_BASE - 1); + std::string focus = it->first; + const GG::ListBox::SelectionSet sel = m_list_box->Selections(); + for (GG::ListBox::SelectionSet::const_iterator it = sel.begin(); it != sel.end(); ++it) { + ObjectRow *row = dynamic_cast<ObjectRow *>(**it); + if (row) { + TemporaryPtr<Planet> one_planet = GetPlanet(row->ObjectID()); + if (one_planet && one_planet->OwnedBy(app->EmpireID())) { + one_planet->SetFocus(focus); + app->Orders().IssueOrder(OrderPtr(new ChangeFocusOrder(app->EmpireID(), one_planet->ID(), focus))); + } + } + } + } + Refresh(); break; } + } } } Modified: trunk/FreeOrion/default/credits.xml =================================================================== --- trunk/FreeOrion/default/credits.xml 2015-02-05 18:04:41 UTC (rev 7910) +++ trunk/FreeOrion/default/credits.xml 2015-02-06 11:44:28 UTC (rev 7911) @@ -56,6 +56,7 @@ <PERSON name="" nick="Vegavis" task="Programming"/> <PERSON name="" nick="Mitten.O" task="Programming"/> <PERSON name="Mark de Ruijter" nick="Eloque" task="Programming"/> + <PERSON name="Vincent Legoll" nick="vincele" task="Programming"/> </GROUP> <GROUP name="GAMEDESIGN and CONTENT"> <PERSON name="Krum Stanoev" nick="" task="Game Design"/> Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-02-05 18:04:41 UTC (rev 7910) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-02-06 11:44:28 UTC (rev 7911) @@ -2408,6 +2408,9 @@ PL_APPARENT_STEALTH_DOES_NOT_EXCEED_DETECTION Latest known stealth is out of date. Actual stealth exceeds [[DETECTION_TITLE]] or local [[DETECTION_RANGE_TITLE]] is excessively impaired. +MENUITEM_SET_FOCUS +Set focus + ## Resources Panel ########## RP_FOCUS_TOOLTIP |
From: <geo...@us...> - 2015-02-08 19:18:37
|
Revision: 7914 http://sourceforge.net/p/freeorion/code/7914 Author: geoffthemedio Date: 2015-02-08 19:18:27 +0000 (Sun, 08 Feb 2015) Log Message: ----------- -Added unimplemented string complex valuerefs for tech and species empire stuff. -Partly added parsing for new valuerefs. -Further split token lists. Modified Paths: -------------- trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj.filters trunk/FreeOrion/parse/Lexer.cpp trunk/FreeOrion/parse/Lexer.h trunk/FreeOrion/parse/StringValueRefParser.cpp trunk/FreeOrion/parse/Tokens.cpp trunk/FreeOrion/parse/Tokens.h trunk/FreeOrion/parse/ValueRefParserImpl.h trunk/FreeOrion/universe/ValueRef.cpp Added Paths: ----------- trunk/FreeOrion/parse/StringComplexValueRefParser.cpp Modified: trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj =================================================================== --- trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj 2015-02-08 19:18:27 UTC (rev 7914) @@ -79,7 +79,7 @@ <DebugInformationFormat> </DebugInformationFormat> <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> - <AdditionalOptions>/MP5 %(AdditionalOptions)</AdditionalOptions> + <AdditionalOptions>/MP3 %(AdditionalOptions)</AdditionalOptions> </ClCompile> <Link> <SubSystem>Console</SubSystem> @@ -141,6 +141,7 @@ <ClCompile Include="..\..\parse\SpecialsParser.cpp" /> <ClCompile Include="..\..\parse\SpeciesParser.cpp" /> <ClCompile Include="..\..\parse\StarTypeValueRefParser.cpp" /> + <ClCompile Include="..\..\parse\StringComplexValueRefParser.cpp" /> <ClCompile Include="..\..\parse\StringValueRefParser.cpp" /> <ClCompile Include="..\..\parse\TechsParser.cpp" /> <ClCompile Include="..\..\parse\Tokens.cpp" /> Modified: trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj.filters 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/msvc2010/Parsers/Parsers.vcxproj.filters 2015-02-08 19:18:27 UTC (rev 7914) @@ -161,6 +161,9 @@ <ClCompile Include="..\..\parse\DoubleComplexValueRefParser.cpp"> <Filter>Source Files\parse</Filter> </ClCompile> + <ClCompile Include="..\..\parse\StringComplexValueRefParser.cpp"> + <Filter>Source Files\parse</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\parse\ConditionParser.h"> Modified: trunk/FreeOrion/parse/Lexer.cpp =================================================================== --- trunk/FreeOrion/parse/Lexer.cpp 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/Lexer.cpp 2015-02-08 19:18:27 UTC (rev 7914) @@ -49,6 +49,11 @@ BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_7) BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_8) BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_9) + BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_10) + BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_11) + BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_12) + BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_13) + BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_14) #undef DEFINE_TOKEN error_token("\\S+?") @@ -101,6 +106,11 @@ BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_7) BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_8) BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_9) + BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_10) + BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_11) + BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_12) + BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_13) + BOOST_PP_SEQ_FOR_EACH(REGISTER_TOKEN, _, TOKEN_SEQ_14) #undef REGISTER_TOKEN self Modified: trunk/FreeOrion/parse/Lexer.h =================================================================== --- trunk/FreeOrion/parse/Lexer.h 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/Lexer.h 2015-02-08 19:18:27 UTC (rev 7914) @@ -62,6 +62,11 @@ BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_7) BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_8) BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_9) + BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_10) + BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_11) + BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_12) + BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_13) + BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_14) #undef DECLARE_TOKEN //@} Added: trunk/FreeOrion/parse/StringComplexValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/StringComplexValueRefParser.cpp (rev 0) +++ trunk/FreeOrion/parse/StringComplexValueRefParser.cpp 2015-02-08 19:18:27 UTC (rev 7914) @@ -0,0 +1,271 @@ +#include "ValueRefParserImpl.h" + +namespace parse { + struct string_complex_parser_rules { + string_complex_parser_rules() { + qi::_1_type _1; + qi::_a_type _a; + qi::_b_type _b; + qi::_c_type _c; + qi::_d_type _d; + qi::_e_type _e; + qi::_f_type _f; + qi::_val_type _val; + using phoenix::construct; + using phoenix::new_; + + const parse::lexer& tok = parse::lexer::instance(); + const int_rule& simple_int = int_simple(); + const parse::value_ref_parser_rule<std::string>::type& string_value_ref = parse::value_ref_parser<std::string>(); + + + lowest_cost_enqueued_tech + = tok.LowestCostEnqueuedTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + highest_cost_enqueued_tech + = tok.HighestCostEnqueuedTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + top_priority_enqueued_tech + = tok.TopPriorityEnqueuedTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + most_spent_enqueued_tech + = tok.MostSpentEnqueuedTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + random_enqueued_tech + = tok.RandomEnqueuedTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + lowest_cost_researchable_tech + = tok.LowestCostResearchableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + highest_cost_researchable_tech + = tok.HighestCostResearchableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + top_priority_researchable_tech + = tok.TopPriorityResearchableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + most_spent_researchable_tech + = tok.MostSpentResearchableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + random_researchable_tech + = tok.RandomResearchableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + random_complete_tech + = tok.RandomCompleteTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + lowest_cost_transferrable_tech + = tok.LowestCostTransferrableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + > parse::label(Empire_token) > simple_int [ _c = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + highest_cost_transferrable_tech + = tok.HighestCostTransferrableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + > parse::label(Empire_token) > simple_int [ _c = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + top_priority_transferrable_tech + = tok.TopPriorityTransferrableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + > parse::label(Empire_token) > simple_int [ _c = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + most_spent_transferrable_tech + = tok.MostSpentTransferrableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + > parse::label(Empire_token) > simple_int [ _c = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + random_transferrable_tech + = tok.RandomTransferrableTech_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + > parse::label(Empire_token) > simple_int [ _c = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + most_populous_species + = tok.MostPopulousSpecies_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + most_happy_species + = tok.MostHappySpecies_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + least_happy_species + = tok.LeastHappySpecies_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + ramdom_colonizable_species + = tok.RandomColonizableSpecies_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + random_controlled_species + = tok.RandomControlledSpecies_ [ _a = construct<std::string>(_1) ] + > parse::label(Empire_token) > simple_int [ _b = _1 ] + [ _val = new_<ValueRef::ComplexVariable<std::string> >(_a, _b, _c, _f, _d, _e) ] + ; + + start + = lowest_cost_enqueued_tech + | highest_cost_enqueued_tech + | top_priority_enqueued_tech + | most_spent_enqueued_tech + | random_enqueued_tech + + | lowest_cost_researchable_tech + | highest_cost_researchable_tech + | top_priority_researchable_tech + | most_spent_researchable_tech + | random_researchable_tech + + | random_complete_tech + + | lowest_cost_transferrable_tech + | highest_cost_transferrable_tech + | top_priority_transferrable_tech + | most_spent_transferrable_tech + | random_transferrable_tech + + | most_populous_species + | most_happy_species + | least_happy_species + | ramdom_colonizable_species + | random_controlled_species + ; + + lowest_cost_enqueued_tech.name("LowestCostEnqueuedTech"); + highest_cost_enqueued_tech.name("HighestCostEnqueuedTech"); + top_priority_enqueued_tech.name("TopPriorityEnqueuedTech"); + most_spent_enqueued_tech.name("MostSpentEnqueuedTech"); + random_enqueued_tech.name("RandomEnqueuedTech"); + + lowest_cost_researchable_tech.name("LowestCostResearchableTech"); + highest_cost_researchable_tech.name("HighestCostesearchableTech"); + top_priority_researchable_tech.name("TopPriorityResearchableTech"); + most_spent_researchable_tech.name("MostSpentResearchableTech"); + random_researchable_tech.name("RandomResearchableTech"); + + random_complete_tech.name("RandomCompleteTech"); + + lowest_cost_transferrable_tech.name("LowestCostTransferrableTech"); + highest_cost_transferrable_tech.name("HighestCostTransferrableTech"); + top_priority_transferrable_tech.name("TopPriorityTransferrableTech"); + most_spent_transferrable_tech.name("MostSpentTransferrableTech"); + random_transferrable_tech.name("RandomTransferrableTech"); + + most_populous_species.name("MostPopulousSpecies"); + most_happy_species.name("MostHappySpecies"); + least_happy_species.name("LeastHappySpecies"); + ramdom_colonizable_species.name("RandomColonizableSpecies"); + random_controlled_species.name("RandomControlledSpecies"); + +#if DEBUG_DOUBLE_COMPLEX_PARSERS + debug(lowest_cost_enqueued_tech); + debug(highest_cost_enqueued_tech); + debug(top_priority_enqueued_tech); + debug(most_spent_enqueued_tech); + debug(random_enqueued_tech); + + debug(lowest_cost_researchable_tech); + debug(highest_cost_researchable_tech); + debug(top_priority_researchable_tech); + debug(most_spent_researchable_tech); + debug(random_researchable_tech); + + debug(random_complete_tech); + + debug(lowest_cost_transferrable_tech); + debug(highest_cost_transferrable_tech); + debug(top_priority_transferrable_tech); + debug(most_spent_transferrable_tech); + debug(random_transferrable_tech); + + debug(most_populous_species); + debug(most_happy_species); + debug(least_happy_species); + debug(ramdom_colonizable_species); + debug(random_controlled_species); +#endif + } + + complex_variable_rule<std::string>::type lowest_cost_enqueued_tech; + complex_variable_rule<std::string>::type highest_cost_enqueued_tech; + complex_variable_rule<std::string>::type top_priority_enqueued_tech; + complex_variable_rule<std::string>::type most_spent_enqueued_tech; + complex_variable_rule<std::string>::type random_enqueued_tech; + + complex_variable_rule<std::string>::type lowest_cost_researchable_tech; + complex_variable_rule<std::string>::type highest_cost_researchable_tech; + complex_variable_rule<std::string>::type top_priority_researchable_tech; + complex_variable_rule<std::string>::type most_spent_researchable_tech; + complex_variable_rule<std::string>::type random_researchable_tech; + + complex_variable_rule<std::string>::type random_complete_tech; + + complex_variable_rule<std::string>::type lowest_cost_transferrable_tech; + complex_variable_rule<std::string>::type highest_cost_transferrable_tech; + complex_variable_rule<std::string>::type top_priority_transferrable_tech; + complex_variable_rule<std::string>::type most_spent_transferrable_tech; + complex_variable_rule<std::string>::type random_transferrable_tech; + + complex_variable_rule<std::string>::type most_populous_species; + complex_variable_rule<std::string>::type most_happy_species; + complex_variable_rule<std::string>::type least_happy_species; + complex_variable_rule<std::string>::type ramdom_colonizable_species; + complex_variable_rule<std::string>::type random_controlled_species; + + complex_variable_rule<std::string>::type start; + }; + + namespace detail { + string_complex_parser_rules string_complex_parser; + } +} + +const complex_variable_rule<std::string>::type& string_var_complex() +{ return parse::detail::string_complex_parser.start; } Modified: trunk/FreeOrion/parse/StringValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/StringValueRefParser.cpp 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/StringValueRefParser.cpp 2015-02-08 19:18:27 UTC (rev 7914) @@ -16,11 +16,6 @@ | tok.BuildingType_ | tok.Focus_ | tok.PreferredFocus_ - | tok.OwnerLeastExpensiveEnqueuedTech_ - | tok.OwnerMostExpensiveEnqueuedTech_ - | tok.OwnerMostRPCostLeftEnqueuedTech_ - | tok.OwnerMostRPSpentEnqueuedTech_ - | tok.OwnerTopPriorityEnqueuedTech_ ; constant Modified: trunk/FreeOrion/parse/Tokens.cpp =================================================================== --- trunk/FreeOrion/parse/Tokens.cpp 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/Tokens.cpp 2015-02-08 19:18:27 UTC (rev 7914) @@ -13,4 +13,9 @@ BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_7) BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_8) BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_9) +BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_10) +BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_11) +BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_12) +BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_13) +BOOST_PP_SEQ_FOR_EACH(DEFINE_TOKEN, _, TOKEN_SEQ_14) #undef DEFINE_TOKEN Modified: trunk/FreeOrion/parse/Tokens.h =================================================================== --- trunk/FreeOrion/parse/Tokens.h 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/Tokens.h 2015-02-08 19:18:27 UTC (rev 7914) @@ -35,7 +35,9 @@ (Blue) \ (Bombard) \ (Bomber) \ - (BuildCost) \ + (BuildCost) + +#define TOKEN_SEQ_2 \ (Building) \ (BuildingTypesOwned) \ (BuildingType) \ @@ -72,7 +74,7 @@ (CreationTurn) \ (CurrentTurn) -#define TOKEN_SEQ_2 \ +#define TOKEN_SEQ_3 \ (Damage) \ (Data) \ (Defense) \ @@ -105,7 +107,7 @@ (ExploredByEmpire) \ (External) -#define TOKEN_SEQ_3 \ +#define TOKEN_SEQ_4 \ (Field) \ (FieldType) \ (Fighters) \ @@ -131,7 +133,9 @@ (GalaxyStarlaneFrequency) \ (Gameplay_Description) \ (GasGiant) \ - (General) \ + (General) + +#define TOKEN_SEQ_5 \ (GenerateSitrepMessage) \ (GiveEmpireTech) \ (Good) \ @@ -141,6 +145,9 @@ (HasSpecialSinceTurn) \ (HasTag) \ (High) \ + (HighestCostEnqueuedTech) \ + (HighestCostResearchableTech) \ + (HighestCostTransferrableTech) \ (Homeworld) \ (Hostile) \ (Huge) \ @@ -159,16 +166,20 @@ (Keymap) \ (Keys) -#define TOKEN_SEQ_4 \ +#define TOKEN_SEQ_6 \ (Label) \ (Large) \ (LastTurnBattleHere) \ (LastTurnActiveInBattle) \ (LaunchRate) \ + (LeastHappySpecies) \ (LocalCandidate) \ (Location) \ (Log) \ (Low) \ + (LowestCostEnqueuedTech) \ + (LowestCostResearchableTech) \ + (LowestCostTransferrableTech) \ (Max) \ (MaxDefense) \ (MaxFuel) \ @@ -183,12 +194,19 @@ (Meter) \ (Min) \ (MinimumNumberOf) \ - (Missiles) \ + (Missiles) + +#define TOKEN_SEQ_7 \ (Mode) \ (Model) \ (ModeNumberOf) \ (Monster) \ (MonsterFleet) \ + (MostHappySpecies) \ + (MostPopulousSpecies) \ + (MostSpentEnqueuedTech) \ + (MostSpentResearchableTech) \ + (MostSpentTransferrableTech) \ (MountableSlotTypes) \ (MoveInOrbit) \ (MoveTo) \ @@ -212,7 +230,7 @@ (NumberOf) \ (NumShips) \ -#define TOKEN_SEQ_5 \ +#define TOKEN_SEQ_8 \ (Object) \ (ObjectType) \ (Ocean) \ @@ -226,18 +244,15 @@ (OwnedBy) \ (Owner) \ (OwnerHasTech) \ - (OwnerLeastExpensiveEnqueuedTech) \ - (OwnerMostExpensiveEnqueuedTech) \ - (OwnerMostRPCostLeftEnqueuedTech) \ - (OwnerMostRPSpentEnqueuedTech) \ - (OwnerTopPriorityEnqueuedTech) \ (OwnerTradeStockpile) \ (Parameters) \ (Part) \ (PartCapacity) \ (PartDamage) \ (PartClass) \ - (PartName) \ + (PartName) + +#define TOKEN_SEQ_9 \ (Parts) \ (PartClassInShipDesign) \ (PartsInShipDesign) \ @@ -266,10 +281,16 @@ (Progress) \ (Property) -#define TOKEN_SEQ_6 \ +#define TOKEN_SEQ_10 \ (Radiated) \ (Radius) \ (Random) \ + (RandomColonizableSpecies) \ + (RandomCompleteTech) \ + (RandomControlledSpecies) \ + (RandomEnqueuedTech) \ + (RandomResearchableTech) \ + (RandomTransferrableTech) \ (RandomNumber) \ (Range) \ (Reason) \ @@ -288,7 +309,9 @@ (RMS) \ (ROF) \ (RootCandidate) \ - (Scope) \ + (Scope) + +#define TOKEN_SEQ_11 \ (SetAggressive) \ (SetAntiFighterDamage) \ (SetAntiShipDamage) \ @@ -321,7 +344,7 @@ (SetPlanetType) \ (SetPopulation) -#define TOKEN_SEQ_7 \ +#define TOKEN_SEQ_12 \ (SetRange) \ (SetRebelTroops) \ (SetResearch) \ @@ -363,7 +386,7 @@ (Size) \ (SizeAsDouble) -#define TOKEN_SEQ_8 \ +#define TOKEN_SEQ_13 \ (Slot) \ (Slots) \ (SlotType) \ @@ -403,7 +426,7 @@ (System) \ (SystemID) -#define TOKEN_SEQ_9 \ +#define TOKEN_SEQ_14 \ (Tag) \ (Tags) \ (Target) \ @@ -420,6 +443,9 @@ (TheEmpire) \ (Theory) \ (Tiny) \ + (TopPriorityEnqueuedTech) \ + (TopPriorityResearchableTech) \ + (TopPriorityTransferrableTech) \ (Toxic) \ (Trade) \ (TradeStockpile) \ @@ -456,6 +482,12 @@ BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_7) BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_8) BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_9) +BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_10) +BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_11) +BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_12) +BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_13) +BOOST_PP_SEQ_FOR_EACH(DECLARE_TOKEN, _, TOKEN_SEQ_14) + #undef DECLARE_TOKEN Modified: trunk/FreeOrion/parse/ValueRefParserImpl.h =================================================================== --- trunk/FreeOrion/parse/ValueRefParserImpl.h 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/parse/ValueRefParserImpl.h 2015-02-08 19:18:27 UTC (rev 7914) @@ -210,23 +210,24 @@ ; } -const reference_token_rule& variable_scope(); -const name_token_rule& container_type(); -const int_rule& int_constant(); -const name_token_rule& int_bound_variable_name(); -const variable_rule<int>::type& int_bound_variable(); -const name_token_rule& int_free_variable_name(); -const variable_rule<int>::type& int_free_variable(); -const statistic_rule<int>::type& int_var_statistic(); -const complex_variable_rule<int>::type& int_var_complex(); -const int_rule& int_simple(); -const double_rule& double_constant(); -const name_token_rule& double_bound_variable_name(); -const variable_rule<double>::type& double_bound_variable(); -const name_token_rule& double_free_variable_name(); -const variable_rule<double>::type& double_free_variable(); -const statistic_rule<double>::type& double_var_statistic(); -const complex_variable_rule<double>::type& double_var_complex(); +const reference_token_rule& variable_scope(); +const name_token_rule& container_type(); +const int_rule& int_constant(); +const name_token_rule& int_bound_variable_name(); +const variable_rule<int>::type& int_bound_variable(); +const name_token_rule& int_free_variable_name(); +const variable_rule<int>::type& int_free_variable(); +const statistic_rule<int>::type& int_var_statistic(); +const complex_variable_rule<int>::type& int_var_complex(); +const int_rule& int_simple(); +const double_rule& double_constant(); +const name_token_rule& double_bound_variable_name(); +const variable_rule<double>::type& double_bound_variable(); +const name_token_rule& double_free_variable_name(); +const variable_rule<double>::type& double_free_variable(); +const statistic_rule<double>::type& double_var_statistic(); +const complex_variable_rule<double>::type& double_var_complex(); +const complex_variable_rule<std::string>::type& string_var_complex(); template <typename T> void initialize_bound_variable_parser( Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-02-08 14:44:16 UTC (rev 7913) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-02-08 19:18:27 UTC (rev 7914) @@ -1410,8 +1410,182 @@ template <> std::string ComplexVariable<std::string>::Eval(const ScriptingContext& context) const - { return ""; } + { + const std::string& variable_name = m_property_name.back(); + // unindexed empire properties + if (variable_name == "LowestCostEnqueuedTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "HighestCostEnqueuedTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "TopPriorityEnqueuedTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "MostSpentEnqueuedTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomEnqueuedTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "LowestCostResearchableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "HighestCostResearchableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "TopPriorityResearchableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "MostSpentResearchableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomResearchableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomCompleteTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "LowestCostTransferrableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "HighestCostTransferrableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "TopPriorityTransferrableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "MostSpentTransferrableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomTransferrableTech") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "MostPopulousSpecies") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "MostHappySpecies") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "LeastHappySpecies") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomColonizableSpecies") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } else if (variable_name == "RandomControlledSpecies") { + int empire_id = ALL_EMPIRES; + if (m_int_ref1) { + empire_id = m_int_ref1->Eval(context); + if (empire_id == ALL_EMPIRES) + return ""; + } + + } + return ""; + } + #undef IF_CURRENT_VALUE } |
From: <geo...@us...> - 2015-02-11 07:07:35
|
Revision: 7924 http://sourceforge.net/p/freeorion/code/7924 Author: geoffthemedio Date: 2015-02-11 07:07:33 +0000 (Wed, 11 Feb 2015) Log Message: ----------- -Removed the "property =" variant of Statistic, leaving just the "value = (ValueRef)" variant (and the valueless Count and If statistic types) -Maked the int and double forms of Statistic parsing consistent -Consolidated the parameters to the Statistic parser so it just takes one rule which is defined at the calling level to accept various options for the value property of the Statistic (instead of passing many possible value rules) -Switched to using >> instead of > to create the bound variable parser to avoid potential ambiguous cases parse failures with the double rule accepting an int expression. Modified Paths: -------------- trunk/FreeOrion/default/empire_statistics.txt trunk/FreeOrion/parse/DoubleValueRefParser.cpp trunk/FreeOrion/parse/IntValueRefParser.cpp trunk/FreeOrion/parse/PlanetEnvironmentValueRefParser.cpp trunk/FreeOrion/parse/PlanetSizeValueRefParser.cpp trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp trunk/FreeOrion/parse/StarTypeValueRefParser.cpp trunk/FreeOrion/parse/StringValueRefParser.cpp trunk/FreeOrion/parse/UniverseObjectTypeValueRefParser.cpp trunk/FreeOrion/parse/ValueRefParserImpl.h trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/default/empire_statistics.txt =================================================================== --- trunk/FreeOrion/default/empire_statistics.txt 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/default/empire_statistics.txt 2015-02-11 07:07:33 UTC (rev 7924) @@ -1,11 +1,11 @@ Statistic name = "PP_OUTPUT" value = - Sum property = Industry condition = And [ + Sum value = LocalCandidate.Industry condition = And [ Planet OwnedBy empire = Source.Owner ] Statistic name = "RP_OUTPUT" value = - Sum property = Research condition = And [ + Sum value = LocalCandidate.Research condition = And [ Planet OwnedBy empire = Source.Owner ] @@ -89,13 +89,16 @@ Planet OwnedBy empire = Source.Owner ] +*/ // The following currently causes a crash upon parsing Statistic name = "STATISTICS_TEST_3" value = - 1.0 + MAX Value = JumpsBetween object = source.SystemID object = LocalCandidate.SystemID - condition = And [ - Planet - OwnedBy empire = Source.Owner - ] + 1.0 + MAX value = + JumpsBetween + object = Source.SystemID + object = LocalCandidate.SystemID + condition = And [ + Planet + OwnedBy empire = Source.Owner + ] -*/ Modified: trunk/FreeOrion/parse/DoubleValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/DoubleValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/DoubleValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -71,21 +71,20 @@ [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] ; - bound_variable - = ( - variable_scope() [ _b = _1 ] > '.' // determines reference type from explicit use of Source, Target, LocalCandiate, or RootCandidate in expression - > -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') - > ( - bound_variable_name [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::Variable<double> >(_b, _a) ] - | int_bound_variable_name() [ push_back(_a, construct<std::string>(_1)), - _val = new_<ValueRef::StaticCast<int, double> >(new_<ValueRef::Variable<int> >(_b, _a)) ] - ) - ) - ; + initialize_bound_variable_parser<double>(bound_variable, bound_variable_name); - initialize_numeric_statistic_parser<double>(statistic, statistic_1, statistic_2, statistic_3, - bound_variable_name, constant, free_variable, bound_variable, double_var_complex()); + statistic_sub_value_ref + = constant + | free_variable + | bound_variable + | int_bound_variable_cast + | double_var_complex() + | int_complex_variable_cast + ; + + initialize_numeric_statistic_parser<double>(statistic, statistic_1, statistic_2, + statistic_sub_value_ref); + initialize_expression_parsers<double>(function_expr, exponential_expr, multiplicative_expr, @@ -93,11 +92,15 @@ expr, primary_expr); - int_statistic + int_bound_variable_cast + = int_bound_variable() [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] + ; + + int_statistic_cast = int_var_statistic() [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] ; - int_complex_variable + int_complex_variable_cast = int_var_complex() [ _val = new_<ValueRef::StaticCast<int, double> >(_1) ] ; @@ -106,10 +109,11 @@ | constant | free_variable | bound_variable + | int_bound_variable_cast | statistic - | int_statistic - | int_complex_variable + | int_statistic_cast | double_var_complex() + | int_complex_variable_cast ; bound_variable_name.name("real number bound variable name (e.g., Population)"); @@ -118,8 +122,9 @@ free_variable.name("free real number variable"); bound_variable.name("real number bound variable"); statistic.name("real number statistic"); - int_statistic.name("integer statistic"); - int_complex_variable.name("integer complex variable"); + int_statistic_cast.name("integer statistic"); + int_complex_variable_cast.name("integer complex variable"); + int_bound_variable_cast.name("integer bound variable"); function_expr.name("real number function expression"); exponential_expr.name("real number exponential expression"); multiplicative_expr.name("real number multiplication expression"); @@ -134,8 +139,9 @@ debug(free_variable); debug(bound_variable); debug(statistic); - debug(int_statistic); - debug(int_complex_variable); + debug(int_statistic_cast); + debug(int_complex_variable_cast); + debug(int_complex_variable_cast); debug(double_complex_variable); debug(negate_expr); debug(multiplicative_expr); @@ -157,10 +163,11 @@ variable_rule bound_variable; statistic_rule statistic_1; statistic_rule statistic_2; - statistic_rule statistic_3; statistic_rule statistic; - rule int_statistic; - rule int_complex_variable; + rule statistic_sub_value_ref; + rule int_bound_variable_cast; + rule int_statistic_cast; + rule int_complex_variable_cast; expression_rule function_expr; expression_rule exponential_expr; expression_rule multiplicative_expr; Modified: trunk/FreeOrion/parse/IntValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/IntValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/IntValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -102,14 +102,15 @@ int_parser_rules() { const int_rule& simple = int_simple(); - const variable_rule& bound_variable = int_bound_variable(); - const name_token_rule& bound_variable_name = int_bound_variable_name(); - const int_rule& constant = int_constant(); - const variable_rule& free_variable = int_free_variable(); + statistic_sub_value_ref + = simple + //| int_var_complex + ; - initialize_numeric_statistic_parser<int>(statistic, statistic_1, statistic_2, statistic_3, - bound_variable_name, constant, free_variable, bound_variable, int_var_complex()); + initialize_numeric_statistic_parser<int>(statistic, statistic_1, statistic_2, + statistic_sub_value_ref); + initialize_expression_parsers<int>(function_expr, exponential_expr, multiplicative_expr, @@ -149,8 +150,8 @@ statistic_rule statistic_1; statistic_rule statistic_2; - statistic_rule statistic_3; statistic_rule statistic; + rule statistic_sub_value_ref; expression_rule function_expr; expression_rule exponential_expr; expression_rule multiplicative_expr; Modified: trunk/FreeOrion/parse/PlanetEnvironmentValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/PlanetEnvironmentValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/PlanetEnvironmentValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -15,16 +15,22 @@ const parse::lexer& tok = parse::lexer::instance(); variable_name - %= tok.PlanetEnvironment_ + %= tok.PlanetEnvironment_ ; constant - = parse::enum_parser<PlanetEnvironment>() [ _val = new_<ValueRef::Constant<PlanetEnvironment> >(_1) ] + = parse::enum_parser<PlanetEnvironment>() [ _val = new_<ValueRef::Constant<PlanetEnvironment> >(_1) ] ; initialize_bound_variable_parser<PlanetEnvironment>(bound_variable, variable_name); - initialize_nonnumeric_statistic_parser<PlanetEnvironment>(statistic, variable_name); + statistic_sub_value_ref + = constant + | bound_variable + ; + + initialize_nonnumeric_statistic_parser<PlanetEnvironment>(statistic, statistic_sub_value_ref); + primary_expr %= constant | bound_variable @@ -46,15 +52,16 @@ #endif } - typedef parse::value_ref_parser_rule<PlanetEnvironment>::type rule; - typedef variable_rule<PlanetEnvironment>::type variable_rule; - typedef statistic_rule<PlanetEnvironment>::type statistic_rule; + typedef parse::value_ref_parser_rule<PlanetEnvironment>::type rule; + typedef variable_rule<PlanetEnvironment>::type variable_rule; + typedef statistic_rule<PlanetEnvironment>::type statistic_rule; name_token_rule variable_name; - rule constant; - variable_rule bound_variable; - statistic_rule statistic; - rule primary_expr; + rule constant; + variable_rule bound_variable; + rule statistic_sub_value_ref; + statistic_rule statistic; + rule primary_expr; }; } Modified: trunk/FreeOrion/parse/PlanetSizeValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/PlanetSizeValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/PlanetSizeValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -25,8 +25,14 @@ ; initialize_bound_variable_parser<PlanetSize>(bound_variable, variable_name); - initialize_nonnumeric_statistic_parser<PlanetSize>(statistic, variable_name); + statistic_sub_value_ref + = constant + | bound_variable + ; + + initialize_nonnumeric_statistic_parser<PlanetSize>(statistic, statistic_sub_value_ref); + primary_expr %= constant | bound_variable @@ -48,15 +54,16 @@ #endif } - typedef parse::value_ref_parser_rule<PlanetSize>::type rule; - typedef variable_rule<PlanetSize>::type variable_rule; - typedef statistic_rule<PlanetSize>::type statistic_rule; + typedef parse::value_ref_parser_rule<PlanetSize>::type rule; + typedef variable_rule<PlanetSize>::type variable_rule; + typedef statistic_rule<PlanetSize>::type statistic_rule; name_token_rule variable_name; - rule constant; - variable_rule bound_variable; - statistic_rule statistic; - rule primary_expr; + rule constant; + variable_rule bound_variable; + rule statistic_sub_value_ref; + statistic_rule statistic; + rule primary_expr; }; } Modified: trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/PlanetTypeValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -28,8 +28,14 @@ ; initialize_bound_variable_parser<PlanetType>(bound_variable, variable_name); - initialize_nonnumeric_statistic_parser<PlanetType>(statistic, variable_name); + statistic_sub_value_ref + = constant + | bound_variable + ; + + initialize_nonnumeric_statistic_parser<PlanetType>(statistic, statistic_sub_value_ref); + primary_expr %= constant | bound_variable @@ -51,13 +57,14 @@ #endif } - typedef parse::value_ref_parser_rule<PlanetType>::type rule; - typedef variable_rule<PlanetType>::type variable_rule; - typedef statistic_rule<PlanetType>::type statistic_rule; + typedef parse::value_ref_parser_rule<PlanetType>::type rule; + typedef variable_rule<PlanetType>::type variable_rule; + typedef statistic_rule<PlanetType>::type statistic_rule; name_token_rule variable_name; rule constant; variable_rule bound_variable; + rule statistic_sub_value_ref; statistic_rule statistic; rule primary_expr; }; Modified: trunk/FreeOrion/parse/StarTypeValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/StarTypeValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/StarTypeValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -25,8 +25,14 @@ ; initialize_bound_variable_parser<StarType>(bound_variable, variable_name); - initialize_nonnumeric_statistic_parser<StarType>(statistic, variable_name); + statistic_sub_value_ref + = constant + | bound_variable + ; + + initialize_nonnumeric_statistic_parser<StarType>(statistic, statistic_sub_value_ref); + primary_expr %= constant | bound_variable @@ -48,15 +54,16 @@ #endif } - typedef parse::value_ref_parser_rule<StarType>::type rule; - typedef variable_rule<StarType>::type variable_rule; - typedef statistic_rule<StarType>::type statistic_rule; + typedef parse::value_ref_parser_rule<StarType>::type rule; + typedef variable_rule<StarType>::type variable_rule; + typedef statistic_rule<StarType>::type statistic_rule; name_token_rule variable_name; - rule constant; - variable_rule bound_variable; - statistic_rule statistic; - rule primary_expr; + rule constant; + variable_rule bound_variable; + rule statistic_sub_value_ref; + statistic_rule statistic; + rule primary_expr; }; } Modified: trunk/FreeOrion/parse/StringValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/StringValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/StringValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -28,8 +28,15 @@ ; initialize_bound_variable_parser<std::string>(bound_variable, bound_variable_name); - initialize_nonnumeric_statistic_parser<std::string>(statistic, bound_variable_name); + statistic_sub_value_ref + = constant + | bound_variable + | free_variable + ; + + initialize_nonnumeric_statistic_parser<std::string>(statistic, statistic_sub_value_ref); + expr %= constant | free_variable @@ -62,6 +69,7 @@ rule constant; rule free_variable; variable_rule bound_variable; + rule statistic_sub_value_ref; statistic_rule statistic; rule expr; rule primary_expr; Modified: trunk/FreeOrion/parse/UniverseObjectTypeValueRefParser.cpp =================================================================== --- trunk/FreeOrion/parse/UniverseObjectTypeValueRefParser.cpp 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/UniverseObjectTypeValueRefParser.cpp 2015-02-11 07:07:33 UTC (rev 7924) @@ -23,8 +23,14 @@ ; initialize_bound_variable_parser<UniverseObjectType>(bound_variable, variable_name); - initialize_nonnumeric_statistic_parser<UniverseObjectType>(statistic, variable_name); + statistic_sub_value_ref + = constant + | bound_variable + ; + + initialize_nonnumeric_statistic_parser<UniverseObjectType>(statistic, statistic_sub_value_ref); + primary_expr %= constant | bound_variable @@ -46,15 +52,16 @@ #endif } - typedef parse::value_ref_parser_rule<UniverseObjectType>::type rule; - typedef variable_rule<UniverseObjectType>::type variable_rule; - typedef statistic_rule<UniverseObjectType>::type statistic_rule; + typedef parse::value_ref_parser_rule<UniverseObjectType>::type rule; + typedef variable_rule<UniverseObjectType>::type variable_rule; + typedef statistic_rule<UniverseObjectType>::type statistic_rule; name_token_rule variable_name; - rule constant; - variable_rule bound_variable; - statistic_rule statistic; - rule primary_expr; + rule constant; + variable_rule bound_variable; + rule statistic_sub_value_ref; + statistic_rule statistic; + rule primary_expr; }; } Modified: trunk/FreeOrion/parse/ValueRefParserImpl.h =================================================================== --- trunk/FreeOrion/parse/ValueRefParserImpl.h 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/parse/ValueRefParserImpl.h 2015-02-11 07:07:33 UTC (rev 7924) @@ -60,9 +60,8 @@ parse::token_iterator, ValueRef::Statistic<T>* (), qi::locals< - std::vector<std::string>, - ValueRef::StatisticType, - ValueRef::ValueRefBase<T>* + ValueRef::ValueRefBase<T>*, + ValueRef::StatisticType >, parse::skipper_type > type; @@ -243,9 +242,9 @@ using phoenix::push_back; bound_variable - = variable_scope() [ _b = _1 ] > '.' - > -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') - > variable_name [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::Variable<T> >(_b, _a) ] + = variable_scope() [ _b = _1 ] >> '.' + >>-(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') + >> variable_name [ push_back(_a, construct<std::string>(_1)), _val = new_<ValueRef::Variable<T> >(_b, _a) ] ; } @@ -254,12 +253,7 @@ typename statistic_rule<T>::type& statistic, typename statistic_rule<T>::type& statistic_1, typename statistic_rule<T>::type& statistic_2, - typename statistic_rule<T>::type& statistic_3, - const name_token_rule& variable_name, - const typename parse::value_ref_parser_rule<T>::type& constant, - const typename variable_rule<T>::type& free_variable, - const typename variable_rule<T>::type& bound_variable, - const typename variable_rule<T>::type& complex_variable + const typename parse::value_ref_parser_rule<T>::type& value_ref ) { const parse::lexer& tok = parse::lexer::instance(); @@ -267,7 +261,6 @@ qi::_1_type _1; qi::_a_type _a; qi::_b_type _b; - qi::_c_type _c; qi::_val_type _val; using phoenix::construct; using phoenix::new_; @@ -282,36 +275,21 @@ statistic_2 = parse::enum_parser<ValueRef::StatisticType>() [ _b = _1 ] - >> parse::label(Property_token) - >> -(container_type() [ push_back(_a, construct<std::string>(_1)) ] >> '.') - >> variable_name [ push_back(_a, construct<std::string>(_1)) ] + >> parse::label(Value_token) > value_ref [ _a = _1 ] // >> operator used here to avoid amiguity with min/max parser functions > parse::label(Condition_token) > parse::detail::condition_parser [ _val = new_<ValueRef::Statistic<T> >(_a, _b, _1) ] ; - statistic_3 - = parse::enum_parser<ValueRef::StatisticType>() [ _b = _1 ] - >> parse::label(Value_token) - >> ( constant [_c = _1 ] // match only a subset of ValueRef types here, because parsing as a top-level - | free_variable [_c = _1 ] // ValueRef here causes deadlocks on parser init on some systems - | bound_variable [_c = _1 ] // todo: try allowing parsing of complex variables here - | complex_variable[_c = _1 ] - ) - > parse::label(Condition_token) > parse::detail::condition_parser - [ _val = new_<ValueRef::Statistic<T> >(_c, _b, _1) ] - ; - statistic - %= statistic_1 + = statistic_1 | statistic_2 - | statistic_3 ; } template <typename T> void initialize_nonnumeric_statistic_parser( typename statistic_rule<T>::type& statistic, - const name_token_rule& variable_name) + const typename parse::value_ref_parser_rule<T>::type& value_ref) { const parse::lexer& tok = parse::lexer::instance(); @@ -325,10 +303,8 @@ statistic = tok.Mode_ [ _b = ValueRef::MODE ] - >> parse::label(Property_token) - >> -(container_type() [ push_back(_a, construct<std::string>(_1)) ] > '.') - >> variable_name [ push_back(_a, construct<std::string>(_1)) ] - >> parse::label(Condition_token) >> parse::detail::condition_parser + > parse::label(Value_token) > value_ref [ _a = _1 ] + > parse::label(Condition_token) > parse::detail::condition_parser [ _val = new_<ValueRef::Statistic<T> >(_a, _b, _1) ] ; } Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2015-02-11 04:24:54 UTC (rev 7923) +++ trunk/FreeOrion/universe/ValueRef.h 2015-02-11 07:07:33 UTC (rev 7924) @@ -182,9 +182,6 @@ template <class T> struct FO_COMMON_API ValueRef::Statistic : public ValueRef::Variable<T> { - Statistic(const std::vector<std::string>& property_name, - StatisticType stat_type, - const Condition::ConditionBase* sampling_condition); Statistic(const ValueRef::ValueRefBase<T>* value_ref, StatisticType stat_type, const Condition::ConditionBase* sampling_condition); @@ -588,16 +585,6 @@ // Statistic // /////////////////////////////////////////////////////////// template <class T> -ValueRef::Statistic<T>::Statistic(const std::vector<std::string>& property_name, - StatisticType stat_type, - const Condition::ConditionBase* sampling_condition) : - Variable<T>(ValueRef::NON_OBJECT_REFERENCE, property_name), - m_stat_type(stat_type), - m_sampling_condition(sampling_condition), - m_value_ref(0) -{} - -template <class T> ValueRef::Statistic<T>::Statistic(const ValueRef::ValueRefBase<T>* value_ref, StatisticType stat_type, const Condition::ConditionBase* sampling_condition) : @@ -625,8 +612,6 @@ if (m_stat_type != rhs_.m_stat_type) return false; - if (this->m_property_name != rhs_.m_property_name) - return false; if (this->m_value_ref != rhs_.m_value_ref) return false; @@ -659,25 +644,14 @@ std::map<TemporaryPtr<const UniverseObject>, T>& object_property_values) const { object_property_values.clear(); - //Logger().debugStream() << "ValueRef::Statistic<T>::GetObjectPropertyValues source: " << source->Dump() - // << " sampling condition: " << m_sampling_condition->Dump() - // << " property name final: " << this->PropertyName().back(); if (m_value_ref) { - // evaluate a full ValueRef with each condition match as the LocalCandidate + // evaluate ValueRef with each condition match as the LocalCandidate + // TODO: Can / should this be paralleized? for (Condition::ObjectSet::const_iterator it = objects.begin(); it != objects.end(); ++it) { T property_value = m_value_ref->Eval(ScriptingContext(context, *it)); object_property_values[*it] = property_value; } - } else { - // evaluate a simple property on each condition-match - ReferenceType original_ref_type = this->m_ref_type; - this->m_ref_type = ValueRef::CONDITION_LOCAL_CANDIDATE_REFERENCE; - for (Condition::ObjectSet::const_iterator it = objects.begin(); it != objects.end(); ++it) { - T property_value = this->Variable<T>::Eval(ScriptingContext(context, *it)); - object_property_values[*it] = property_value; - } - this->m_ref_type = original_ref_type; } } |
From: <geo...@us...> - 2015-02-13 12:28:01
|
Revision: 7931 http://sourceforge.net/p/freeorion/code/7931 Author: geoffthemedio Date: 2015-02-13 12:27:53 +0000 (Fri, 13 Feb 2015) Log Message: ----------- -Empire interface adjustments for getting various techs relevant an empire, and some related implementation -Related ValueRef implementation Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2015-02-13 11:37:22 UTC (rev 7930) +++ trunk/FreeOrion/Empire/Empire.cpp 2015-02-13 12:27:53 UTC (rev 7931) @@ -235,6 +235,13 @@ float ResearchQueue::TotalRPsSpent() const { return m_total_RPs_spent; } +std::vector<std::string> ResearchQueue::AllEnqueuedProjects() const { + std::vector<std::string> retval; + for (const_iterator it = begin(); it != end(); ++it) + retval.push_back(it->name); + return retval; +} + bool ResearchQueue::empty() const { return !m_queue.size(); } @@ -1296,7 +1303,7 @@ return TS_UNRESEARCHABLE; } -const std::string& Empire::TopPriorityEnqueuedTech(bool only_consider_available_techs/* = false*/) const { +const std::string& Empire::TopPriorityEnqueuedTech() const { if (m_research_queue.empty()) return EMPTY_STRING; ResearchQueue::const_iterator it = m_research_queue.begin(); @@ -1304,7 +1311,7 @@ return tech; } -const std::string& Empire::MostExpensiveEnqueuedTech(bool only_consider_available_techs/* = false*/) const { +const std::string& Empire::MostExpensiveEnqueuedTech() const { if (m_research_queue.empty()) return EMPTY_STRING; float biggest_cost = -99999.9f; // arbitrary small number @@ -1328,7 +1335,7 @@ return EMPTY_STRING; } -const std::string& Empire::LeastExpensiveEnqueuedTech(bool only_consider_available_techs/* = false*/) const { +const std::string& Empire::LeastExpensiveEnqueuedTech() const { if (m_research_queue.empty()) return EMPTY_STRING; float smallest_cost = 999999.9f; // arbitrary large number @@ -1352,7 +1359,7 @@ return EMPTY_STRING; } -const std::string& Empire::MostRPSpentEnqueuedTech(bool only_consider_available_techs/* = false*/) const { +const std::string& Empire::MostRPSpentEnqueuedTech() const { float most_spent = -999999.9f; // arbitrary small number std::map<std::string, float>::const_iterator best_it = m_research_progress.end(); @@ -1374,7 +1381,7 @@ return EMPTY_STRING; } -const std::string& Empire::MostRPCostLeftEnqueuedTech(bool only_consider_available_techs/* = false*/) const { +const std::string& Empire::MostRPCostLeftEnqueuedTech() const { float most_left = -999999.9f; // arbitrary small number std::map<std::string, float>::const_iterator best_it = m_research_progress.end(); @@ -1404,6 +1411,32 @@ return EMPTY_STRING; } +const std::string& Empire::TopPriorityResearchableTech() const { + if (m_research_queue.empty()) + return EMPTY_STRING; + for (ResearchQueue::const_iterator it = m_research_queue.begin(); it != m_research_queue.end(); ++it) { + if (this->ResearchableTech(it->name)) + return it->name; + } + return EMPTY_STRING; +} + +const std::string& Empire::MostExpensiveResearchableTech() const { + return EMPTY_STRING; +} + +const std::string& Empire::LeastExpensiveResearchableTech() const { + return EMPTY_STRING; +} + +const std::string& Empire::MostRPSpentResearchableTech() const { + return EMPTY_STRING; +} + +const std::string& Empire::MostRPCostLeftResearchableTech() const { + return EMPTY_STRING; +} + const std::set<std::string>& Empire::AvailableBuildingTypes() const { return m_available_building_types; } Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2015-02-13 11:37:22 UTC (rev 7930) +++ trunk/FreeOrion/Empire/Empire.h 2015-02-13 12:27:53 UTC (rev 7931) @@ -78,10 +78,11 @@ //@} /** \name Accessors */ //@{ - bool InQueue(const std::string& tech_name) const; ///< Returns true iff \a tech is in this queue. - int ProjectsInProgress() const; ///< Returns the number of research projects currently (perhaps partially) funded. - float TotalRPsSpent() const; ///< Returns the number of RPs currently spent on the projects in this queue. - int EmpireID() const { return m_empire_id; } + bool InQueue(const std::string& tech_name) const;///< Returns true iff \a tech is in this queue. + int ProjectsInProgress() const; ///< Returns the number of research projects currently (perhaps partially) funded. + float TotalRPsSpent() const; ///< Returns the number of RPs currently spent on the projects in this queue. + int EmpireID() const { return m_empire_id; } + std::vector<std::string> AllEnqueuedProjects() const; // STL container-like interface bool empty() const; @@ -305,12 +306,18 @@ const std::set<std::string>& AvailableShipParts() const; ///< Returns the set of ship part names this empire that the empire can currently build const std::set<std::string>& AvailableShipHulls() const; ///< Returns the set of ship hull names that that the empire can currently build - const std::string& TopPriorityEnqueuedTech(bool only_consider_available_techs = false) const; - const std::string& MostExpensiveEnqueuedTech(bool only_consider_available_techs = false) const; - const std::string& LeastExpensiveEnqueuedTech(bool only_consider_available_techs = false) const; - const std::string& MostRPSpentEnqueuedTech(bool only_consider_available_techs = false) const; - const std::string& MostRPCostLeftEnqueuedTech(bool only_consider_available_techs = false) const; + const std::string& TopPriorityEnqueuedTech() const; + const std::string& MostExpensiveEnqueuedTech() const; + const std::string& LeastExpensiveEnqueuedTech() const; + const std::string& MostRPSpentEnqueuedTech() const; + const std::string& MostRPCostLeftEnqueuedTech() const; + const std::string& TopPriorityResearchableTech() const; + const std::string& MostExpensiveResearchableTech() const; + const std::string& LeastExpensiveResearchableTech() const; + const std::string& MostRPSpentResearchableTech() const; + const std::string& MostRPCostLeftResearchableTech() const; + const Meter* GetMeter(const std::string& name) const; std::map<std::string, Meter>::const_iterator meter_begin() const { return m_meters.begin(); } std::map<std::string, Meter>::const_iterator meter_end() const { return m_meters.end(); } Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2015-02-13 11:37:22 UTC (rev 7930) +++ trunk/FreeOrion/universe/Condition.cpp 2015-02-13 12:27:53 UTC (rev 7931) @@ -782,7 +782,7 @@ // Most conditions match objects independently of the other objects being // tested, but the number parameter for NumberOf conditions makes things // more complicated. In order to match some number of the potential - // matchs property, both the matches and non_matches need to be checked + // matches property, both the matches and non_matches need to be checked // against the subcondition, and the total number of subcondition matches // counted. // Then, when searching NON_MATCHES, non_matches may be moved into matches Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-02-13 11:37:22 UTC (rev 7930) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-02-13 12:27:53 UTC (rev 7931) @@ -801,31 +801,31 @@ const Empire* empire = Empires().Lookup(object->Owner()); if (!empire) return ""; - return empire->LeastExpensiveEnqueuedTech(true); + return empire->LeastExpensiveEnqueuedTech(); } else if (property_name == "OwnerMostExpensiveEnqueuedTech") { const Empire* empire = Empires().Lookup(object->Owner()); if (!empire) return ""; - return empire->MostExpensiveEnqueuedTech(true); + return empire->MostExpensiveEnqueuedTech(); } else if (property_name == "OwnerMostRPCostLeftEnqueuedTech") { const Empire* empire = Empires().Lookup(object->Owner()); if (!empire) return ""; - return empire->MostRPCostLeftEnqueuedTech(true); + return empire->MostRPCostLeftEnqueuedTech(); } else if (property_name == "OwnerMostRPSpentEnqueuedTech") { const Empire* empire = Empires().Lookup(object->Owner()); if (!empire) return ""; - return empire->MostRPSpentEnqueuedTech(true); + return empire->MostRPSpentEnqueuedTech(); } else if (property_name == "OwnerTopPriorityEnqueuedTech") { const Empire* empire = Empires().Lookup(object->Owner()); if (!empire) return ""; - return empire->TopPriorityEnqueuedTech(true); + return empire->TopPriorityEnqueuedTech(); } Logger().errorStream() << "Variable<std::string>::Eval unrecognized object property: " << TraceReference(m_property_name, m_ref_type, context); @@ -1421,7 +1421,12 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->LeastExpensiveEnqueuedTech(); + } else if (variable_name == "HighestCostEnqueuedTech") { int empire_id = ALL_EMPIRES; if (m_int_ref1) { @@ -1429,6 +1434,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->MostExpensiveEnqueuedTech(); } else if (variable_name == "TopPriorityEnqueuedTech") { int empire_id = ALL_EMPIRES; @@ -1437,6 +1446,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->TopPriorityEnqueuedTech(); } else if (variable_name == "MostSpentEnqueuedTech") { int empire_id = ALL_EMPIRES; @@ -1445,6 +1458,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->MostRPSpentEnqueuedTech(); } else if (variable_name == "RandomEnqueuedTech") { int empire_id = ALL_EMPIRES; @@ -1453,6 +1470,18 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + // get all techs on queue, randomly pick one + const ResearchQueue& queue = empire->GetResearchQueue(); + std::vector<std::string> all_enqueued_techs = queue.AllEnqueuedProjects(); + if (all_enqueued_techs.empty()) + return ""; + std::vector<std::string>::const_iterator tech_it = all_enqueued_techs.begin(); + std::size_t idx = RandSmallInt(0, static_cast<int>(all_enqueued_techs.size()) - 1); + std::advance(tech_it, idx); + return *tech_it; } else if (variable_name == "LowestCostResearchableTech") { int empire_id = ALL_EMPIRES; @@ -1461,6 +1490,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->LeastExpensiveResearchableTech(); } else if (variable_name == "HighestCostResearchableTech") { int empire_id = ALL_EMPIRES; @@ -1469,6 +1502,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->MostExpensiveResearchableTech(); } else if (variable_name == "TopPriorityResearchableTech") { int empire_id = ALL_EMPIRES; @@ -1477,6 +1514,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->TopPriorityResearchableTech(); } else if (variable_name == "MostSpentResearchableTech") { int empire_id = ALL_EMPIRES; @@ -1485,6 +1526,10 @@ if (empire_id == ALL_EMPIRES) return ""; } + const Empire* empire = EmpireManager().Lookup(empire_id); + if (!empire) + return ""; + return empire->MostExpensiveResearchableTech(); } else if (variable_name == "RandomResearchableTech") { int empire_id = ALL_EMPIRES; |
From: <dil...@us...> - 2015-02-15 19:07:26
|
Revision: 7944 http://sourceforge.net/p/freeorion/code/7944 Author: dilvish-fo Date: 2015-02-15 19:07:24 +0000 (Sun, 15 Feb 2015) Log Message: ----------- patch with some further AI visibility cleanup, including visibility related adjustments to the python universe wrapper Modified Paths: -------------- trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/python/PythonUniverseWrapper.cpp Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2015-02-15 19:03:37 UTC (rev 7943) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2015-02-15 19:07:24 UTC (rev 7944) @@ -140,13 +140,11 @@ visibility_info = ['%s: %s' % (vis.name, turn) for vis, turn in visibility_turn_list] print "*** system ID %d ( %s ) ; previously %s, new visibility turns info: %s " % (cur_system_id, sys_name, pre_vis, visibility_info) status_str = "*** system ID %d ( %s ) ; " % (cur_system_id, sys_name) - have_been_visible = dict_from_map(universe.getVisibilityTurnsMap(cur_system_id, empire_id)).get(fo.visibility.partial, 0) > 0 - #print "previous visTurns result: %s"% ([val for val in universe.getVisibilityTurns(cur_system_id, empire_id)], ) - #print "new visTurns result: %s"% (dictFromMap( universe.getVisibilityTurnsMap(cur_system_id, empire_id)), ) + has_been_visible = dict_from_map(universe.getVisibilityTurnsMap(cur_system_id, empire_id)).get(fo.visibility.partial, 0) > 0 is_connected = universe.systemsConnected(cur_system_id, home_system_id, -1) # self.empire_id) - status_str += " -- is %s partially visible " % (["not", ""][have_been_visible]) + status_str += " -- is %s partially visible " % (["not", ""][has_been_visible]) status_str += " -- is %s visibly connected to homesystem " % (["not", ""][is_connected]) - if have_been_visible: + if has_been_visible: sys_status = foAI.foAIstate.systemStatus.setdefault(cur_system_id, {}) foAI.foAIstate.visInteriorSystemIDs[cur_system_id] = 1 if cur_system_id in foAI.foAIstate.visBorderSystemIDs: Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-02-15 19:03:37 UTC (rev 7943) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-02-15 19:07:24 UTC (rev 7944) @@ -155,35 +155,6 @@ } boost::function<std::map<int,double> (const Universe&, int, int)> SystemNeighborsMapFunc = &SystemNeighborsMapP; - int VisibilityP(const Universe& universe, int object_id, int empire_id = ALL_EMPIRES) { - int retval; - //std::vector<int> retval; - try { - retval = universe.GetObjectVisibilityByEmpire(object_id, empire_id); - return retval; - } catch (...) { - } - return INVALID_VISIBILITY; - } - boost::function<int (const Universe&, int, int)> VisibilityFunc = &VisibilityP; - - std::vector<int> VisibilityTurnsP(const Universe& universe, int object_id, int empire_id = ALL_EMPIRES) { - Universe::VisibilityTurnMap vismap; - std::vector<int> retval; - //std::vector<int> retval; - try { - vismap = universe.GetObjectVisibilityTurnMapByEmpire(object_id, empire_id); - retval.push_back(vismap[VIS_NO_VISIBILITY]); - retval.push_back(vismap[VIS_BASIC_VISIBILITY]); - retval.push_back(vismap[VIS_PARTIAL_VISIBILITY]); - retval.push_back(vismap[VIS_FULL_VISIBILITY]); - return retval; - } catch (...) { - } - return retval; - } - boost::function<std::vector<int> (const Universe&, int, int)> VisibilityTurnsFunc = &VisibilityTurnsP; - const Meter* (UniverseObject::*ObjectGetMeter)(MeterType) const = &UniverseObject::GetMeter; const std::map<MeterType, Meter>& (UniverseObject::*ObjectMeters)(void) const = &UniverseObject::Meters; @@ -277,9 +248,6 @@ class_<std::map<int, double> >("IntDblMap") .def(boost::python::map_indexing_suite<std::map<int, double>,true >()) ; - class_<std::map<int, Visibility> >("IntVisibilityMap") - .def(boost::python::map_indexing_suite<std::map<int, Visibility>,true >()) - ; class_<std::map<Visibility,int> >("VisibilityIntMap") .def(boost::python::map_indexing_suite<std::map<Visibility, int>, true>()) ; @@ -354,28 +322,13 @@ return_value_policy<return_by_value>(), boost::mpl::vector<std::map<int, double>, const Universe&, int, int>() )) - .def("getVisibilityMap", make_function( - &Universe::GetObjectVisibilityByEmpire, - return_value_policy<return_by_value>() - )) .def("getVisibilityTurnsMap", make_function( &Universe::GetObjectVisibilityTurnMapByEmpire, return_value_policy<return_by_value>() )) - .def("getVisibilityTurns", make_function( - VisibilityTurnsFunc, - return_value_policy<return_by_value>(), - boost::mpl::vector<std::vector<int>, const Universe&, int, int>() - )) - .def("getVisibility", make_function( - VisibilityFunc, - return_value_policy<return_by_value>(), - boost::mpl::vector<int, const Universe&, int, int>() - )) - .def("getVisibilityMap", make_function( &Universe::GetObjectVisibilityByEmpire, return_value_policy<return_by_value>() )) |
From: <dil...@us...> - 2015-02-17 00:07:04
|
Revision: 7953 http://sourceforge.net/p/freeorion/code/7953 Author: dilvish-fo Date: 2015-02-17 00:06:57 +0000 (Tue, 17 Feb 2015) Log Message: ----------- changed some used of GetValueString to Get<std::string> for some recent testing-related options whose normal type is a string. Modified Paths: -------------- trunk/FreeOrion/AI/AIInterface.cpp trunk/FreeOrion/AI/PythonAI.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/AI/AIInterface.cpp =================================================================== --- trunk/FreeOrion/AI/AIInterface.cpp 2015-02-16 21:31:55 UTC (rev 7952) +++ trunk/FreeOrion/AI/AIInterface.cpp 2015-02-17 00:06:57 UTC (rev 7953) @@ -160,10 +160,10 @@ { return AIClientApp::GetApp()->CurrentTurn(); } std::string GetAIConfigStr() - { return GetOptionsDB().GetValueString("ai-config"); } + { return GetOptionsDB().Get<std::string>("ai-config"); } std::string GetAIDir() - { return (GetResourceDir() / GetOptionsDB().GetValueString("ai-path")).string(); } + { return (GetResourceDir() / GetOptionsDB().Get<std::string>("ai-path")).string(); } const GalaxySetupData& GetGalaxySetupData() { return AIClientApp::GetApp()->GetGalaxySetupData(); } Modified: trunk/FreeOrion/AI/PythonAI.cpp =================================================================== --- trunk/FreeOrion/AI/PythonAI.cpp 2015-02-16 21:31:55 UTC (rev 7952) +++ trunk/FreeOrion/AI/PythonAI.cpp 2015-02-17 00:06:57 UTC (rev 7953) @@ -285,7 +285,7 @@ try { // tell Python the path in which to locate AI script file - std::string AI_path = (GetResourceDir() / GetOptionsDB().GetValueString("ai-path")).string(); + std::string AI_path = (GetResourceDir() / GetOptionsDB().Get<std::string>("ai-path")).string(); std::string path_command = "sys.path.append(r'" + AI_path + "')"; object ignored = exec(path_command.c_str(), s_main_namespace, s_main_namespace); Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2015-02-16 21:31:55 UTC (rev 7952) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2015-02-17 00:06:57 UTC (rev 7953) @@ -343,8 +343,8 @@ #endif std::vector<std::string> args; - std::string ai_config = GetOptionsDB().GetValueString("ai-config"); - std::string ai_path = GetOptionsDB().GetValueString("ai-path"); + std::string ai_config = GetOptionsDB().Get<std::string>("ai-config"); + std::string ai_path = GetOptionsDB().Get<std::string>("ai-path"); args.push_back("\"" + SERVER_CLIENT_EXE + "\""); args.push_back("--resource-dir"); args.push_back("\"" + GetOptionsDB().Get<std::string>("resource-dir") + "\""); Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2015-02-16 21:31:55 UTC (rev 7952) +++ trunk/FreeOrion/server/ServerApp.cpp 2015-02-17 00:06:57 UTC (rev 7953) @@ -216,7 +216,7 @@ return; } - std::string ai_config = GetOptionsDB().GetValueString("ai-config"); + std::string ai_config = GetOptionsDB().Get<std::string>("ai-config"); // TODO: add other command line args to AI client invocation as needed std::vector<std::string> args; args.push_back("\"" + AI_CLIENT_EXE + "\""); @@ -231,9 +231,9 @@ args.push_back("--binary-serialization"); args.push_back(GetOptionsDB().GetValueString("binary-serialization")); args.push_back("--ai-path"); - args.push_back(GetOptionsDB().GetValueString("ai-path")); + args.push_back(GetOptionsDB().Get<std::string>("ai-path")); Logger().debugStream() << "starting " << AI_CLIENT_EXE << " with GameSetup.ai-aggression set to " << max_aggression; - Logger().debugStream() << "ai-path set to '" << GetOptionsDB().GetValueString("ai-path") << "'"; + Logger().debugStream() << "ai-path set to '" << GetOptionsDB().Get<std::string>("ai-path") << "'"; if (!ai_config.empty()) { args.push_back("--ai-config"); args.push_back(ai_config); |
From: <dil...@us...> - 2015-02-18 05:46:45
|
Revision: 7958 http://sourceforge.net/p/freeorion/code/7958 Author: dilvish-fo Date: 2015-02-18 05:46:42 +0000 (Wed, 18 Feb 2015) Log Message: ----------- augmented python interface for ship parts and hulls Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/python/PythonUniverseWrapper.cpp Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-17 21:06:15 UTC (rev 7957) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-18 05:46:42 UTC (rev 7958) @@ -346,6 +346,11 @@ isList=["", is1, is2, is3, is4, is5] ar1, ar2, ar3, ar4, ar5 = "AR_STD_PLATE", "AR_ZORTRIUM_PLATE", "AR_DIAMOND_PLATE", "AR_XENTRONIUM_PLATE", "AR_NEUTRONIUM_PLATE" arList = ["", ar1, ar2, ar3, ar4, ar5] + + #testhull = fo.getHullType("SH_BASIC_MEDIUM") + #print "testhull: %s, structure: %.1f ; stealth: %.1f ; slots: %s" % (testhull.name, testhull.structure, testhull.stealth, [slot.name for slot in testhull.slots]) + #testpart = fo.getPartType(srb2%4) + #print "testpart: %s, class: %s ; capacity: %.1f ; slottypes: %s" % (testpart.partClass.name, testpart.name, testpart.capacity, [slot.name for slot in testpart.mountableSlotTypes]) if foAI.foAIstate.aggression in [fo.aggression.beginner, fo.aggression.turtle]: maxEM= 8 Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-02-17 21:06:15 UTC (rev 7957) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-02-18 05:46:42 UTC (rev 7958) @@ -449,7 +449,9 @@ class_<PartType, noncopyable>("partType", no_init) .add_property("name", make_function(&PartType::Name, return_value_policy<copy_const_reference>())) - .add_property("class", &PartType::Class) + .add_property("partClass", &PartType::Class) + .add_property("capacity", &PartType::Capacity) + .add_property("mountableSlotTypes", make_function(&PartType::MountableSlotTypes,return_value_policy<return_by_value>())) .def("productionCost", &PartType::ProductionCost) .def("productionTime", &PartType::ProductionTime) .def("canMountInSlotType", &PartType::CanMountInSlotType) @@ -459,6 +461,10 @@ class_<HullType, noncopyable>("hullType", no_init) .add_property("name", make_function(&HullType::Name, return_value_policy<copy_const_reference>())) .add_property("numSlots", make_function(NumSlotsTotal, return_value_policy<return_by_value>())) + .add_property("structure", &HullType::Structure) + .add_property("stealth", &HullType::Stealth) + .add_property("fuel", &HullType::Fuel) + .add_property("starlaneSpeed", &HullType::StarlaneSpeed) .def("numSlotsOfSlotType", NumSlotsOfSlotType) .add_property("slots", make_function( HullSlotsFunc, |
From: <dil...@us...> - 2015-02-18 06:19:57
|
Revision: 7960 http://sourceforge.net/p/freeorion/code/7960 Author: dilvish-fo Date: 2015-02-18 06:19:49 +0000 (Wed, 18 Feb 2015) Log Message: ----------- added empire availableShipParts and availableShipHulls to AI python interface Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/python/PythonEmpireWrapper.cpp Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-18 05:58:23 UTC (rev 7959) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2015-02-18 06:19:49 UTC (rev 7960) @@ -347,10 +347,13 @@ ar1, ar2, ar3, ar4, ar5 = "AR_STD_PLATE", "AR_ZORTRIUM_PLATE", "AR_DIAMOND_PLATE", "AR_XENTRONIUM_PLATE", "AR_NEUTRONIUM_PLATE" arList = ["", ar1, ar2, ar3, ar4, ar5] - #testhull = fo.getHullType("SH_BASIC_MEDIUM") - #print "testhull: %s, structure: %.1f ; stealth: %.1f ; slots: %s" % (testhull.name, testhull.structure, testhull.stealth, [slot.name for slot in testhull.slots]) - #testpart = fo.getPartType(srb2%4) - #print "testpart: %s, class: %s ; capacity: %.1f ; slottypes: %s" % (testpart.name, testpart.partClass.name, testpart.capacity, [slot.name for slot in testpart.mountableSlotTypes]) + empire = fo.getEmpire() + print "Available Hulls: %s" % ([hull for hull in empire.availableShipHulls]) + print "Available Ship Parts: %s" % ([hull for hull in empire.availableShipParts]) + testhull = fo.getHullType("SH_BASIC_MEDIUM") + print "testhull: %s, structure: %.1f ; stealth: %.1f ; slots: %s" % (testhull.name, testhull.structure, testhull.stealth, [slot.name for slot in testhull.slots]) + testpart = fo.getPartType(srb2%4) + print "testpart: %s, class: %s ; capacity: %.1f ; slottypes: %s" % (testpart.name, testpart.partClass.name, testpart.capacity, [slot.name for slot in testpart.mountableSlotTypes]) if foAI.foAIstate.aggression in [fo.aggression.beginner, fo.aggression.turtle]: maxEM= 8 Modified: trunk/FreeOrion/python/PythonEmpireWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonEmpireWrapper.cpp 2015-02-18 05:58:23 UTC (rev 7959) +++ trunk/FreeOrion/python/PythonEmpireWrapper.cpp 2015-02-18 06:19:49 UTC (rev 7960) @@ -350,6 +350,8 @@ .def("shipDesignAvailable", &Empire::ShipDesignAvailable) .add_property("allShipDesigns", make_function(&Empire::ShipDesigns, return_value_policy<return_by_value>())) .add_property("availableShipDesigns", make_function(&Empire::AvailableShipDesigns, return_value_policy<return_by_value>())) + .add_property("availableShipParts", make_function(&Empire::AvailableShipParts, return_value_policy<copy_const_reference>())) + .add_property("availableShipHulls", make_function(&Empire::AvailableShipHulls, return_value_policy<copy_const_reference>())) .add_property("productionQueue", make_function(&Empire::GetProductionQueue, return_internal_reference<>())) .def("productionCostAndTime", make_function( ProductionCostAndTimeFunc, |
From: <geo...@us...> - 2015-02-23 12:13:20
|
Revision: 7977 http://sourceforge.net/p/freeorion/code/7977 Author: geoffthemedio Date: 2015-02-23 12:13:12 +0000 (Mon, 23 Feb 2015) Log Message: ----------- Slightly edited patch by vincele adjusting turns for which sitreps are shown when clicking prev / next. Modified Paths: -------------- trunk/FreeOrion/UI/SitRepPanel.cpp trunk/FreeOrion/UI/SitRepPanel.h trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/SitRepPanel.cpp =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.cpp 2015-02-22 14:14:13 UTC (rev 7976) +++ trunk/FreeOrion/UI/SitRepPanel.cpp 2015-02-23 12:13:12 UTC (rev 7977) @@ -345,16 +345,80 @@ } } +namespace { + /* Sort empire's sitreps for each turn */ + std::map<int, std::list<SitRepEntry> > GetSitRepsSortedByTurn(int empire_id, std::set<std::string> hidden_sitrep_templates) { + std::map<int, std::list<SitRepEntry> > turns; + bool verbose_sitrep = GetOptionsDB().Get<bool>("verbose-sitrep"); + std::set<Empire*> sr_empires; + Empire* empire = Empires().Lookup(empire_id); + if (empire) { + sr_empires.insert(empire); + } else { + // Moderator mode, sort sitreps from all empires + EmpireManager& empires = Empires(); + for (EmpireManager::iterator it = empires.begin(); it != empires.end(); ++it) + sr_empires.insert(it->second); + } + for (std::set<Empire*>::iterator it = sr_empires.begin(); it != sr_empires.end(); it++) { + for (Empire::SitRepItr sitrep_it = (*it)->SitRepBegin(); sitrep_it != (*it)->SitRepEnd(); ++sitrep_it) { + if (!verbose_sitrep) { + if (!sitrep_it->Validate()) + continue; + } + if (hidden_sitrep_templates.find(sitrep_it->GetTemplateString()) != hidden_sitrep_templates.end()) + continue; + turns[sitrep_it->GetTurn()].push_back(*sitrep_it); + } + } + return turns; + } +} + +int SitRepPanel::GetNextNonEmptySitrepsTurn(const std::map<int, std::list<SitRepEntry> >& turns, int turn, bool forward) const { + // All sitreps filtered out ? + if (turns.size() == 0) + return INVALID_GAME_TURN; + // Only one turn with visible sitreps + if (turns.size() == 1) + return turns.begin()->first; + // Before first turn with visible sitreps + if (turn < turns.begin()->first) + return turns.begin()->first; + // After last turn with visible sitreps + if (turn > (--turns.end())->first) + return (--turns.end())->first; + + // Search a suitable turn + std::map<int, std::list<SitRepEntry> >::const_iterator it = turns.find(turn); + if (it != turns.end()) { + int step = forward ? 1 : -1; + + for (std::advance(it, step); it != turns.end(); std::advance(it, step)) { + if (it->second.size() > 0) + return it->first; + } + } + + // Not found, choose a default value + int ret = forward ? (--turns.end())->first : turns.begin()->first; + if (turn != ret || turns.find(ret) == turns.end()) + ret = turns.begin()->first; + return ret; +} + void SitRepPanel::CloseClicked() { ClosingSignal(); } void SitRepPanel::PrevClicked() { - m_showing_turn = std::max(1, m_showing_turn - 1); + std::map<int, std::list<SitRepEntry> > turns = GetSitRepsSortedByTurn(HumanClientApp::GetApp()->EmpireID(), m_hidden_sitrep_templates); + m_showing_turn = GetNextNonEmptySitrepsTurn(turns, m_showing_turn, false); Update(); } void SitRepPanel::NextClicked() { - m_showing_turn = std::min(CurrentTurn(), std::max(1, m_showing_turn + 1)); + std::map<int, std::list<SitRepEntry> > turns = GetSitRepsSortedByTurn(HumanClientApp::GetApp()->EmpireID(), m_hidden_sitrep_templates); + m_showing_turn = GetNextNonEmptySitrepsTurn(turns, m_showing_turn, true); Update(); } @@ -424,56 +488,32 @@ Update(); } -void SitRepPanel::GetTurnSitrepsFromEmpire(std::list<SitRepEntry>& append_list, int empire_id) const { - // get id(s) of empires to get sitreps for - std::vector<int> empire_ids; - if (empire_id != ALL_EMPIRES) { - if (Empires().Lookup(empire_id)) - empire_ids.push_back(empire_id); - } else { - for (EmpireManager::iterator it = Empires().begin(); it != Empires().end(); ++it) - empire_ids.push_back(it->first); - } - - for (std::vector<int>::const_iterator it = empire_ids.begin(); it != empire_ids.end(); ++it) { - const Empire* empire = Empires().Lookup(*it); - if (!empire) - continue; - - // loop through sitreps and add to current list - for (Empire::SitRepItr sitrep_it = empire->SitRepBegin(); - sitrep_it != empire->SitRepEnd(); ++sitrep_it) - { - if (!GetOptionsDB().Get<bool>("verbose-sitrep")) { - if (!sitrep_it->Validate()) - continue; - } - if (m_showing_turn != INVALID_GAME_TURN && m_showing_turn != sitrep_it->GetTurn()) - continue; - if (m_hidden_sitrep_templates.find(sitrep_it->GetTemplateString()) != m_hidden_sitrep_templates.end()) - continue; - append_list.push_back(*sitrep_it); - } - } -} - void SitRepPanel::Update() { Logger().debugStream() << "SitRepPanel::Update()"; m_sitreps_lb->Clear(); + // Get back to sane default if (m_showing_turn == INVALID_GAME_TURN) - this->SetName(UserString("SITREP_PANEL_TITLE")); - else - this->SetName(boost::io::str(FlexibleFormat(UserString("SITREP_PANEL_TITLE_TURN")) % m_showing_turn)); + m_showing_turn = 1; - // get sitrep entries for this client's player empire, or for all empires // if this client is an observer or moderator. // todo: double check that no-empire players are actually moderator or // observers, instead of just passing the client empire id. + std::map<int, std::list<SitRepEntry> > turns = GetSitRepsSortedByTurn(HumanClientApp::GetApp()->EmpireID(), m_hidden_sitrep_templates); + std::list<SitRepEntry> currentTurnSitreps; - GetTurnSitrepsFromEmpire(currentTurnSitreps, HumanClientApp::GetApp()->EmpireID()); + if (turns.find(m_showing_turn) != turns.end()) + currentTurnSitreps = turns[m_showing_turn]; + if (currentTurnSitreps.size() == 0) { + m_showing_turn = GetNextNonEmptySitrepsTurn(turns, m_showing_turn, false); + currentTurnSitreps = turns[m_showing_turn]; + } + if (m_showing_turn < 1) + this->SetName(UserString("SITREP_PANEL_TITLE")); + else + this->SetName(boost::io::str(FlexibleFormat(UserString("SITREP_PANEL_TITLE_TURN")) % m_showing_turn)); // order sitreps for display std::vector<SitRepEntry> orderedSitreps; @@ -504,20 +544,22 @@ sitrep_it != orderedSitreps.end(); sitrep_it++) { m_sitreps_lb->Insert(new SitRepRow(width, GG::Y(ClientUI::Pts()*2), *sitrep_it)); } - // if at first turn, disable back button - if (CurrentTurn() >= 1 && m_showing_turn > 1) { + // if at first turn with visible sitreps, disable back button + int firstTurnWithSR = GetNextNonEmptySitrepsTurn(turns, m_showing_turn, false); + if ((m_showing_turn < 1) || (turns.size() < 2) || (m_showing_turn == firstTurnWithSR)) { + m_prev_turn_button->Disable(); + } else { m_prev_turn_button->Disable(false); - } else { - m_prev_turn_button->Disable(); } - // if at current turn, disable forward button - if (CurrentTurn() >= 1 && m_showing_turn < CurrentTurn()) { + // if at last turn with visible sitreps, disable forward button + int lastTurnWithSR = GetNextNonEmptySitrepsTurn(turns, m_showing_turn, true); + if ((turns.size() < 2) || (m_showing_turn == lastTurnWithSR)) { + m_next_turn_button->Disable(); + m_last_turn_button->Disable(); + } else { m_next_turn_button->Disable(false); m_last_turn_button->Disable(false); - } else { - m_next_turn_button->Disable(); - m_last_turn_button->Disable(); } } @@ -532,33 +574,6 @@ } int SitRepPanel::NumVisibleSitrepsThisTurn() const { - int count = 0; - - int client_empire_id = HumanClientApp::GetApp()->EmpireID(); - - // which empires to count sitreps for? - std::vector<int> empire_ids; - if (HumanClientApp::GetApp()->Empires().Lookup(client_empire_id)) { - empire_ids.push_back(client_empire_id); - } else { - for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) - empire_ids.push_back(it->first); - } - - for (std::vector<int>::const_iterator empire_it = empire_ids.begin(); - empire_it != empire_ids.end(); ++empire_it) - { - const Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(*empire_it); - if (!empire) - continue; - - for (Empire::SitRepItr sitrep_it = empire->SitRepBegin(); sitrep_it != empire->SitRepEnd(); ++sitrep_it) { - if (CurrentTurn() != sitrep_it->GetTurn()) - continue; - if (m_hidden_sitrep_templates.find(sitrep_it->GetTemplateString()) != m_hidden_sitrep_templates.end()) - continue; - ++count; - } - } - return count; + std::map<int, std::list<SitRepEntry> > turns = GetSitRepsSortedByTurn(HumanClientApp::GetApp()->EmpireID(), m_hidden_sitrep_templates); + return turns[CurrentTurn()].size(); } Modified: trunk/FreeOrion/UI/SitRepPanel.h =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.h 2015-02-22 14:14:13 UTC (rev 7976) +++ trunk/FreeOrion/UI/SitRepPanel.h 2015-02-23 12:13:12 UTC (rev 7977) @@ -43,7 +43,8 @@ void DoLayout(); - void GetTurnSitrepsFromEmpire(std::list<SitRepEntry>& append_list, int empire_id) const; + int GetNextNonEmptySitrepsTurn(const std::map<int, std::list<SitRepEntry> >& turns, + int turn, bool forward) const; ///< Return next turn with sitreps GG::ListBox* m_sitreps_lb; GG::Button* m_prev_turn_button; Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-02-22 14:14:13 UTC (rev 7976) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-02-23 12:13:12 UTC (rev 7977) @@ -4006,7 +4006,7 @@ #Window title#### SITREP_PANEL_TITLE -Situation Report +Situation Report - Initial turn SITREP_PANEL_TITLE_TURN Situation Report - Turn %1% |
From: <ve...@us...> - 2015-02-27 14:28:57
|
Revision: 7982 http://sourceforge.net/p/freeorion/code/7982 Author: vezzra Date: 2015-02-27 14:28:54 +0000 (Fri, 27 Feb 2015) Log Message: ----------- Removed obsolete code from UniverseGenerator.h & UniverseGenerator.cpp Modified Paths: -------------- trunk/FreeOrion/universe/UniverseGenerator.cpp trunk/FreeOrion/universe/UniverseGenerator.h Added Paths: ----------- trunk/FreeOrion/python/server/ Modified: trunk/FreeOrion/universe/UniverseGenerator.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseGenerator.cpp 2015-02-25 08:41:39 UTC (rev 7981) +++ trunk/FreeOrion/universe/UniverseGenerator.cpp 2015-02-27 14:28:54 UTC (rev 7982) @@ -1,32 +1,32 @@ #include "UniverseGenerator.h" -#include "../util/OptionsDB.h" +//#include "../util/OptionsDB.h" #include "../util/Directories.h" #include "../util/Random.h" #include "../util/i18n.h" #include "../util/Logger.h" -#include "../util/MultiplayerCommon.h" +//#include "../util/MultiplayerCommon.h" #include "../parse/Parse.h" #include "../Empire/Empire.h" #include "../Empire/EmpireManager.h" -#include "Building.h" -#include "Fleet.h" +//#include "Building.h" +//#include "Fleet.h" #include "Planet.h" -#include "Ship.h" -#include "ShipDesign.h" +//#include "Ship.h" +//#include "ShipDesign.h" #include "System.h" -#include "Field.h" -#include "UniverseObject.h" -#include "Effect.h" -#include "Predicates.h" -#include "Special.h" +//#include "Field.h" +//#include "UniverseObject.h" +//#include "Effect.h" +//#include "Predicates.h" +//#include "Special.h" #include "Species.h" #include "ValueRef.h" -#include <boost/algorithm/string/classification.hpp> -#include <boost/algorithm/string/split.hpp> -#include <boost/filesystem/fstream.hpp> +//#include <boost/algorithm/string/classification.hpp> +//#include <boost/algorithm/string/split.hpp> +//#include <boost/filesystem/fstream.hpp> DataTableMap& UniverseDataTables() { @@ -42,7 +42,6 @@ namespace { const double PI = 3.141592653589793; - SmallIntDistType g_hundred_dist = SmallIntDist(1, 100); // a linear distribution [1, 100] used in most universe generation const int MAX_ATTEMPTS_PLACE_SYSTEM = 100; double CalcNewPosNearestNeighbour(double x, double y, const std::vector<SystemPosition>& positions) @@ -733,62 +732,7 @@ { return MonsterFleetPlanManager::GetMonsterFleetPlanManager(); } }; -///////////////////////////// -// ItemSpecManager // -///////////////////////////// namespace { - class ItemSpecManager { - public: - typedef std::vector<ItemSpec>::const_iterator iterator; - iterator begin() const { return m_items.begin(); } - iterator end() const { return m_items.end(); } - /** Adds unlocked items in this manager to the specified \a empire - * using that Empire's UnlockItem function. */ - void AddItemsToEmpire(Empire* empire) const; - /** returns the instance of this singleton class; you should use the - * free function GetItemSpecManager() instead */ - static const ItemSpecManager& GetItemSpecManager(); - private: - ItemSpecManager(); - std::vector<ItemSpec> m_items; - static ItemSpecManager* s_instance; - }; - // static(s) - ItemSpecManager* ItemSpecManager::s_instance = 0; - - const ItemSpecManager& ItemSpecManager::GetItemSpecManager() { - static ItemSpecManager manager; - return manager; - } - - ItemSpecManager::ItemSpecManager() { - if (s_instance) - throw std::runtime_error("Attempted to create more than one ItemSpecManager."); - - s_instance = this; - - Logger().debugStream() << "Initializing ItemSpecManager"; - - parse::items(GetResourceDir() / "preunlocked_items.txt", m_items); - -#ifdef OUTPUT_ITEM_SPECS_LIST - Logger().debugStream() << "Starting Unlocked Item Specs:"; - for (iterator it = begin(); it != end(); ++it) { - const ItemSpec& item = *it; - Logger().debugStream() << " ... " << boost::lexical_cast<std::string>(item.type) << " : " << item.name; - } -#endif - } - - void ItemSpecManager::AddItemsToEmpire(Empire* empire) const { - if (!empire) - return; - for (iterator it = begin(); it != end(); ++it) - empire->UnlockItem(*it); - } -}; - -namespace { /** Used by GenerateStarlanes. Determines if two systems are connected by * maxLaneJumps or less edges on graph. */ bool ConnectedWithin(int system1, int system2, int maxLaneJumps, std::vector<std::set<int> >& laneSetArray) { @@ -1133,371 +1077,6 @@ } } -void SetActiveMetersToTargetMaxCurrentValues(ObjectMap& object_map) { - std::map<MeterType, MeterType> meters; - meters[METER_POPULATION] = METER_TARGET_POPULATION; - meters[METER_INDUSTRY] = METER_TARGET_INDUSTRY; - meters[METER_RESEARCH] = METER_TARGET_RESEARCH; - meters[METER_TRADE] = METER_TARGET_TRADE; - meters[METER_CONSTRUCTION] = METER_TARGET_CONSTRUCTION; - meters[METER_FUEL] = METER_MAX_FUEL; - meters[METER_SHIELD] = METER_MAX_SHIELD; - meters[METER_STRUCTURE] = METER_MAX_STRUCTURE; - meters[METER_DEFENSE] = METER_MAX_DEFENSE; - meters[METER_TROOPS] = METER_MAX_TROOPS; - meters[METER_SUPPLY] = METER_MAX_SUPPLY; - - // check for each pair of meter types. if both exist, set active - // meter current value equal to target meter current value. - for (ObjectMap::iterator<> it = object_map.begin(); it != object_map.end(); ++it) { - for (std::map<MeterType, MeterType>::const_iterator meter_it = meters.begin(); meter_it != meters.end(); ++meter_it) - if (Meter* meter = it->GetMeter(meter_it->first)) - if (Meter* targetmax_meter = it->GetMeter(meter_it->second)) - meter->SetCurrent(targetmax_meter->Current()); - } -} - -void SetNativePopulationValues(ObjectMap& object_map) { - for (ObjectMap::iterator<> it = object_map.begin(); it != object_map.end(); ++it) { - Meter* meter = it->GetMeter(METER_POPULATION); - Meter* targetmax_meter = it->GetMeter(METER_TARGET_POPULATION); - // only applies to unowned planets - if (meter && targetmax_meter && it->Unowned()) { - double r = RandZeroToOne(); - double factor = (0.1<r)?r:0.1; - meter->SetCurrent(targetmax_meter->Current() * factor); - } - } -} - -void AddStartingSpecials(Universe& universe, GalaxySetupOption specials_freq) { - Logger().debugStream() << "AddStartingSpecials"; - - double special_chance = UniverseDataTables()["SpecialsFrequency"][0][specials_freq] / 10000.0; - if (special_chance == 0.0) - return; - - const std::vector<std::string> special_names = SpecialNames(); - if (special_names.empty()) - return; - - // initialize count of how many of each special has been added - std::map<std::string, int> specials_added; - for (std::vector<std::string>::const_iterator special_it = special_names.begin(); - special_it != special_names.end(); ++special_it) - { - specials_added[*special_it] = 0; - if (const Special* special = GetSpecial(*special_it)) { - Logger().debugStream() << "Special " << *special_it << " has spawnrate " << special->SpawnRate(); - } - } - - // attempt to apply a special to every object by finding a special that can - // be applied to it and hasn't been added too many times, and then attempt - // to add that special by testing its spawn rate - const double add_attempt_repeat_prob = 0.08; // a small chance to try more than one special at an object - for (ObjectMap::iterator<> obj_it = universe.Objects().begin(); obj_it != universe.Objects().end(); ++obj_it) { - - // for this object, find a suitable special. Start by making a new random order - // in which to consider specials - std::list<std::string> orig_special_names (special_names.begin(), special_names.end()); - std::vector<std::string> new_specials_order (special_names.size()); - std::list< std::string >::iterator next_it; - //Logger().debugStream() << " Considering object " << obj_it->Name() << " and choosing new specials order"; - while (orig_special_names.size() > 0) { - next_it = orig_special_names.begin(); - advance(next_it, RandSmallInt(0, orig_special_names.size()-1)); - new_specials_order.push_back(*next_it); - orig_special_names.erase(next_it); - } - - for (std::vector< std::string >::iterator special_name_it = new_specials_order.begin(); - special_name_it != new_specials_order.end(); special_name_it++) { - const std::string& special_name = *special_name_it; - const Special* special = GetSpecial(special_name); - //Logger().debugStream() << " Considering special " << special_name; - - bool special_add_attempted = false; - - // test if too many of this special have already been added - if (special && specials_added[special_name] < special->SpawnLimit()) { - // test if this special can be spawned on this object. If - // there is no location condition, assume this special can't - // be spawned automatically - const Condition::ConditionBase* location_test = special->Location(); - if (location_test && location_test->Eval(*obj_it)) { - // special can be placed here - - // test random chance to place this special - double this_special_chance = std::max(0.0, special_chance * special->SpawnRate()); - if (RandZeroToOne() < this_special_chance) { - // spawn special - specials_added[special_name]++; - obj_it->AddSpecial(special_name); - Logger().debugStream() << "Special " << special_name << " added to " << obj_it->Name(); - - // kludges for planet appearance changes for particular specials - if (special_name == "TIDAL_LOCK_SPECIAL") { - if (TemporaryPtr<Planet> planet = boost::dynamic_pointer_cast<Planet>(*obj_it)) - planet->SetRotationalPeriod(Day(planet->OrbitalPeriod())); - } else if (special_name == "SLOW_ROTATION_SPECIAL") { - if (TemporaryPtr<Planet> planet = boost::dynamic_pointer_cast<Planet>(*obj_it)) - planet->SetRotationalPeriod(planet->RotationalPeriod() * 10.0); - } else if (special_name == "HIGH_AXIAL_TILT_SPECIAL") { - if (TemporaryPtr<Planet> planet = boost::dynamic_pointer_cast<Planet>(*obj_it)) - planet->SetHighAxialTilt(); - } - } - special_add_attempted = true; - } else { - //Logger().debugStream() << "... ... cannot be added here"; - } - } else { - //Logger().debugStream() << "... ... has been added " << specials_added[special_name] << " times, which is >= the limit of " << special->SpawnLimit(); - } - - // stop attempting to add specials here? Give a small chance to try more than one special - if (special_add_attempted && RandZeroToOne() > add_attempt_repeat_prob) - break; - } - } - std::list<std::string> growth_specials; - UserStringList("GROWTH_SPECIALS_LIST", growth_specials); - Logger().debugStream() << "Growth Special Summary:"; - for (std::list< std::string >::iterator specials_it = growth_specials.begin(); - specials_it != growth_specials.end(); ++specials_it) { - Logger().debugStream() << "... Applied Special: " << *specials_it << " to " << specials_added[*specials_it] << " planets"; - } -} - -namespace { - static const Condition::Not homeworld_jumps_filter( - new Condition::WithinStarlaneJumps( - new ValueRef::Constant<int>(1), - new Condition::Homeworld() - ) - ); -} - -void GenerateNatives(Universe& universe, GalaxySetupOption freq) { - Logger().debugStream() << "GenerateNatives"; - - int inverse_native_chance = UniverseDataTables()["NativeFrequency"][0][freq]; - double native_chance(0.0); - if (inverse_native_chance > 0) - native_chance = 1.0 / static_cast<double>(inverse_native_chance); - else - return; - - SpeciesManager& species_manager = GetSpeciesManager(); - std::map<std::string, int> species_summary; - - std::vector<TemporaryPtr<Planet> > planet_vec = Objects().FindObjects<Planet>(); - Condition::ObjectSet planet_set(planet_vec.size()); - for (std::vector<TemporaryPtr<Planet> >::iterator it = planet_vec.begin(); - it != planet_vec.end(); ++it) - { planet_set.push_back(*it); } - - // select only planets far away from player homeworlds - Condition::ObjectSet native_safe_planet_set; - native_safe_planet_set.reserve(planet_set.size()); - homeworld_jumps_filter.Eval(native_safe_planet_set, planet_set); - Logger().debugStream() << "Number of planets far enough from players for natives to be allowed: " << native_safe_planet_set.size(); - if (native_safe_planet_set.empty()) - return; - - Logger().debugStream() << "Species that can be added as natives:"; - for (SpeciesManager::native_iterator species_it = species_manager.native_begin(); - species_it != species_manager.native_end(); ++species_it) - { Logger().debugStream() << "... " << species_it->first; } - - std::vector<TemporaryPtr<Planet> > native_safe_planets; - for (Condition::ObjectSet::iterator it = native_safe_planet_set.begin(); it != native_safe_planet_set.end(); ++it) - if (TemporaryPtr<const Planet> planet = boost::dynamic_pointer_cast<const Planet>(*it)) - native_safe_planets.push_back(boost::const_pointer_cast<Planet>(planet)); - - // randomly add species to planets - for (std::vector<TemporaryPtr<Planet> >::iterator it = native_safe_planets.begin(); it != native_safe_planets.end(); ++it) { - if (RandZeroToOne() > native_chance) - continue; - - TemporaryPtr<Planet> planet = *it; - PlanetType planet_type = planet->Type(); - Logger().debugStream() << "Attempting to add natives to planet " << planet->Name() << " of type " << planet_type; - - // find species that like this planet type - std::vector<std::string> suitable_species; - for (SpeciesManager::native_iterator species_it = species_manager.native_begin(); - species_it != species_manager.native_end(); ++species_it) - { - if (species_it->second->GetPlanetEnvironment(planet_type) == PE_GOOD) - suitable_species.push_back(species_it->first); - } - if (suitable_species.empty()) { - Logger().debugStream() << "... no suitable native species found (with good environment on this planet)"; - continue; - } - Logger().debugStream() << " ... " << suitable_species.size() << " native species are appropriate for this planet"; - - // pick a species and assign to the planet - int species_idx = RandSmallInt(0, suitable_species.size() - 1); - const std::string& species_name = suitable_species.at(species_idx); - planet->SetSpecies(species_name); - species_summary[species_name]++; - - // set planet as a homeworld for that species - if (Species* species = species_manager.GetSpecies(species_name)) - species->AddHomeworld(planet->ID()); - - // find a focus to give planets by default. use first defined available focus. - std::vector<std::string> available_foci = planet->AvailableFoci(); - if (!available_foci.empty()) { - planet->SetFocus(*available_foci.begin()); - Logger().debugStream() << "Set focus to " << *available_foci.begin(); - } else { - Logger().debugStream() << "No foci available for this planet! (" << planet->ObjectType() << ")"; - } - - Logger().debugStream() << "Added native " << species_name << " to planet " << planet->Name(); - } - - Logger().debugStream() << "Natives Placement Summary, with "<< species_summary.size() << " native species selected from " - << std::distance(species_manager.native_begin(),species_manager.native_end()) << " total native species possible"; - for (std::map< std::string, int >::iterator species_it = species_summary.begin(); - species_it != species_summary.end(); ++species_it) { - if (species_it->second > 0) { - Logger().debugStream() << "... Settled Natives: " << species_it->first << " with " << species_it->second << " planets"; - } - } -} - -void GenerateSpaceMonsters(Universe& universe, GalaxySetupOption freq) { - Logger().debugStream() << "GenerateSpaceMonsters"; - - // get overall universe chance for monster generation in a system - int inverse_monster_chance = UniverseDataTables()["MonsterFrequency"][0][freq]; - Logger().debugStream() << "Universe::GenerateSpaceMonsters(" << boost::lexical_cast<std::string>(freq) - << ") inverse monster chance: " << inverse_monster_chance; - double monster_chance(0.0); - if (inverse_monster_chance > 0) - monster_chance = 1.0 / static_cast<double>(inverse_monster_chance); - else - return; - Logger().debugStream() << "Default monster spawn chance: " << monster_chance; - - // sets of monsters to generate - const MonsterFleetPlanManager& monster_manager = GetMonsterFleetPlanManager(); - if (monster_manager.NumMonsters() < 1) - return; - - // ship designs (including monsters) - const PredefinedShipDesignManager& predefined_design_manager = GetPredefinedShipDesignManager(); - - // possible locations to generate monsters - std::vector<TemporaryPtr<System> > system_vec = Objects().FindObjects<System>(); - if (system_vec.empty()) - return; - - // initialize count of how many of each monster fleet plan has been created - std::map<MonsterFleetPlanManager::iterator, int> monster_fleets_created; - for (MonsterFleetPlanManager::iterator monster_plan_it = monster_manager.begin(); - monster_plan_it != monster_manager.end(); ++monster_plan_it) - { monster_fleets_created[monster_plan_it] = 0; } - - // for each system, find a monster whose location condition allows the - // system, which hasn't already been added too many times, and then attempt - // to add that monster by testing the spawn rate chance - MonsterFleetPlanManager::iterator monster_plan_it = monster_manager.begin(); - for (std::vector<TemporaryPtr<System> >::iterator sys_it = system_vec.begin(); - sys_it != system_vec.end(); ++sys_it) - { - //Logger().debugStream() << "Attempting to add monster at system " << system->Name(); - TemporaryPtr<System> system = *sys_it; - - // for this system, find a suitable monster fleet plan - const MonsterFleetPlanManager::iterator initial_monster_plan_it = monster_plan_it; - while (true) { - const MonsterFleetPlan* plan = *monster_plan_it; - //Logger().debugStream() << "... considering monster plan " << plan->Name(); - - bool monster_add_attempted = false; - - // test if too many of this fleet have already been created - if (monster_fleets_created[monster_plan_it] < plan->SpawnLimit()) { - // test if this monster fleet plan can be spawned at this - // location. if there is no location condition, assume there - // is no restriction on this monster's spawn location. - const Condition::ConditionBase* location_test = plan->Location(); - if (!location_test || location_test->Eval(system)) { - //Logger().debugStream() << "... ... can be placed here"; - // monster can be placed here. - - // test random chance to place this monster fleet - double this_monster_fleet_chance = std::max(0.0, monster_chance * plan->SpawnRate()); - //Logger().debugStream() << "... ... chance: " << this_monster_fleet_chance; - if (RandZeroToOne() < this_monster_fleet_chance) { - //Logger().debugStream() << "... ... passed random chance test"; - - // spawn monster fleet - monster_fleets_created[monster_plan_it]++; - - const std::vector<std::string>& monsters = plan->ShipDesigns(); - if (monsters.empty()) - break; - - // create fleet for monsters - const std::string& fleet_name = UserString("MONSTERS"); - TemporaryPtr<Fleet> fleet = universe.CreateFleet(fleet_name, system->X(), system->Y(), ALL_EMPIRES); - if (!fleet) { - Logger().errorStream() << "unable to create new fleet for monsters!"; - return; - } - system->Insert(fleet); - - // create ships and add to fleet - for (std::vector<std::string>::const_iterator monster_it = monsters.begin(); - monster_it != monsters.end(); ++monster_it) - { - int design_id = predefined_design_manager.GetDesignID(*monster_it); - if (design_id == ShipDesign::INVALID_DESIGN_ID) { - Logger().errorStream() << "Couldn't find space monster with name " << *monster_it; - continue; - } - - // create new monster ship - TemporaryPtr<Ship> ship = universe.CreateShip(ALL_EMPIRES, design_id, "", ALL_EMPIRES); - system->Insert(ship); - - ship->Rename(NewMonsterName()); - - fleet->AddShip(ship->ID()); - ship->SetFleetID(fleet->ID()); - } - } else { - //Logger().debugStream() << "... ... failed random chance test. skipping system."; - // monster was acceptable for this location, but - // failed chance test. no monsters here. - } - monster_add_attempted = true; - } else { - //Logger().debugStream() << "... ... cannot be placed here"; - } - } else { - //Logger().debugStream() << "... ... has been placed " << monster_fleets_created[monster_plan_it] << " times, which is >= the limit of " << plan->SpawnLimit(); - } - - // increment monster plan iterator - monster_plan_it++; - if (monster_plan_it == monster_manager.end()) - monster_plan_it = monster_manager.begin(); - - // stop attempting to add monsters here? - if (monster_plan_it == initial_monster_plan_it || monster_add_attempted) - break; - } - } -} - void GenerateStarlanes(GalaxySetupOption freq) { if (freq == GALAXY_SETUP_NONE) return; @@ -1610,135 +1189,54 @@ } // end while } - // add the starlane to the stars + // add the starlane to the stars for (n = 0; n < numSys; ++n) { const std::set<int>& lanes = laneSetArray[n]; for (std::set<int>::const_iterator it = lanes.begin(); it != lanes.end(); ++it) sys_vec[n]->AddStarlane(sys_vec[*it]->ID()); // System::AddStarlane() expects a system ID } - + Logger().debugStream() << "Initializing System Graph"; GetUniverse().InitializeSystemGraph(); } -void GenerateHomeworlds(Universe& universe, int players, std::vector<int>& homeworld_planet_ids) { - homeworld_planet_ids.clear(); +void SetActiveMetersToTargetMaxCurrentValues(ObjectMap& object_map) { + std::map<MeterType, MeterType> meters; + meters[METER_POPULATION] = METER_TARGET_POPULATION; + meters[METER_INDUSTRY] = METER_TARGET_INDUSTRY; + meters[METER_RESEARCH] = METER_TARGET_RESEARCH; + meters[METER_TRADE] = METER_TARGET_TRADE; + meters[METER_CONSTRUCTION] = METER_TARGET_CONSTRUCTION; + meters[METER_FUEL] = METER_MAX_FUEL; + meters[METER_SHIELD] = METER_MAX_SHIELD; + meters[METER_STRUCTURE] = METER_MAX_STRUCTURE; + meters[METER_DEFENSE] = METER_MAX_DEFENSE; + meters[METER_TROOPS] = METER_MAX_TROOPS; + meters[METER_SUPPLY] = METER_MAX_SUPPLY; - std::vector<TemporaryPtr<System> > sys_vec = Objects().FindObjects<System>(); - //Logger().debugStream() << "Universe::GenerateHomeworlds sys_vec:"; - //for (std::vector<TemporaryPtr<System> >::const_iterator it = sys_vec.begin(); it != sys_vec.end(); ++it) { - // TemporaryPtr<const System> sys = *it; - // Logger().debugStream() << "... sys ptr: " << sys << " name: " << (sys ? sys->Name() : "no system!?") << " id: " << (sys ? boost::lexical_cast<std::string>(sys->ID()) : "none?!"); - //} - - if (sys_vec.empty()) - throw std::runtime_error("Attempted to generate homeworlds in an empty galaxy."); - - for (int i = 0; i < players; ++i) { - int system_index; - TemporaryPtr<System> system; - - // make sure it has planets and it's not too close to the other homeworlds - bool too_close = true; - int attempts = 0; - do { - too_close = false; - system_index = RandSmallInt(0, static_cast<int>(sys_vec.size()) - 1); - //Logger().debugStream() << "Universe::GenerateHomeworlds trying to put homeworld on system with index: " << system_index; - system = sys_vec[system_index]; - //Logger().debugStream() << "... system name: " << (system ? system->Name() : "no system!?") << " id: " << (system ? boost::lexical_cast<std::string>(system->ID()) : "none?!"); - - for (unsigned int j = 0; j < homeworld_planet_ids.size(); ++j) { - //Logger().debugStream() << "Universe::GenerateHomeworlds checking previously-existing homeworld with id " << homeworld_planet_ids[j]; - TemporaryPtr<Planet> homeworld = GetPlanet(homeworld_planet_ids[j]); - if (!homeworld) { - //Logger().errorStream() << "couldn't find homeworld!"; - continue; - } - - TemporaryPtr<System> existing_system = GetSystem(homeworld->SystemID()); - if (!existing_system) { - //Logger().errorStream() << "couldn't find existing system!"; - continue; - } - - double x_dist = existing_system->X() - system->X(); - double y_dist = existing_system->Y() - system->Y(); - if (x_dist * x_dist + y_dist * y_dist < MIN_HOME_SYSTEM_SEPARATION * MIN_HOME_SYSTEM_SEPARATION) { - too_close = true; - break; - } - } - } while ((!system->Orbits() || system->PlanetIDs().empty() || too_close) && ++attempts < 50); - - sys_vec.erase(sys_vec.begin() + system_index); - - // find a place to put the homeworld, and replace whatever planet is there already - int home_orbit = -1; - - if (system->PlanetIDs().empty()) { - home_orbit = 0; - } else { - // find empty orbit? - for (int o = 0; o < system->Orbits(); ++o) { - if (system->PlanetInOrbit(o) == INVALID_OBJECT_ID) { - home_orbit = o; - break; - } - } - if (home_orbit == -1) { - // no free orbit, so need to clear one. - int sacrificial_planet = system->PlanetInOrbit(0); - system->Remove(sacrificial_planet); - universe.Delete(sacrificial_planet); - home_orbit = 0; - } - } - - TemporaryPtr<Planet> planet = universe.CreatePlanet(PT_TERRAN, SZ_MEDIUM); - std::string planet_name = system->Name() + " " + RomanNumber(home_orbit + 1); - planet->Rename(planet_name); - system->Insert(TemporaryPtr<UniverseObject>(planet), home_orbit); - - homeworld_planet_ids.push_back(planet->ID()); + // check for each pair of meter types. if both exist, set active + // meter current value equal to target meter current value. + for (ObjectMap::iterator<> it = object_map.begin(); it != object_map.end(); ++it) { + for (std::map<MeterType, MeterType>::const_iterator meter_it = meters.begin(); meter_it != meters.end(); ++meter_it) + if (Meter* meter = it->GetMeter(meter_it->first)) + if (Meter* targetmax_meter = it->GetMeter(meter_it->second)) + meter->SetCurrent(targetmax_meter->Current()); } } -void NamePlanets(Universe& universe) { - std::vector<TemporaryPtr<System> > sys_vec = Objects().FindObjects<System>(); - for (ObjectMap::iterator<System> sys_it = Objects().begin<System>(); - sys_it != Objects().end<System>(); ++sys_it) - { - TemporaryPtr<System> system = *sys_it; - std::vector<TemporaryPtr<Planet> > planets = Objects().FindObjects<Planet>(system->PlanetIDs()); - - for (std::vector<TemporaryPtr<Planet> >::iterator planet_it = planets.begin(); - planet_it != planets.end(); ++planet_it) - { - TemporaryPtr<Planet> planet = *planet_it; - - if (planet->Type() == PT_ASTEROIDS) { - std::string name = boost::io::str(FlexibleFormat(UserString("PL_ASTEROID_BELT_OF_SYSTEM")) % - system->Name()); - planet->Rename(name); - } else { - int orbit = system->OrbitOfPlanet(planet->ID()); - planet->Rename(system->Name() + " " + RomanNumber(orbit+1)); - } +void SetNativePopulationValues(ObjectMap& object_map) { + for (ObjectMap::iterator<> it = object_map.begin(); it != object_map.end(); ++it) { + Meter* meter = it->GetMeter(METER_POPULATION); + Meter* targetmax_meter = it->GetMeter(METER_TARGET_POPULATION); + // only applies to unowned planets + if (meter && targetmax_meter && it->Unowned()) { + double r = RandZeroToOne(); + double factor = (0.1<r)?r:0.1; + meter->SetCurrent(targetmax_meter->Current() * factor); } } } -void GenerateFields(Universe& universe, GalaxySetupOption freq) { - //const FieldType* storm_type = GetFieldType("ION_STORM"); - //if (!storm_type) { - // Logger().errorStream() << "AddFields couldn't find storm field type!"; - // return; - //} - //TemporaryPtr<Field> field = new Field(storm_type->Name(), 0.0, 0.0, 100.0); - //Insert(field); -} - bool SetEmpireHomeworld(Empire* empire, int planet_id, std::string species_name) { // get home planet and system, check if they exist TemporaryPtr<Planet> home_planet = GetPlanet(planet_id); Modified: trunk/FreeOrion/universe/UniverseGenerator.h =================================================================== --- trunk/FreeOrion/universe/UniverseGenerator.h 2015-02-25 08:41:39 UTC (rev 7981) +++ trunk/FreeOrion/universe/UniverseGenerator.h 2015-02-27 14:28:54 UTC (rev 7982) @@ -121,28 +121,9 @@ * their target values. */ void SetNativePopulationValues(ObjectMap& object_map); -/** Adds start-of-game specials to objects. */ -void AddStartingSpecials(Universe& universe, GalaxySetupOption specials_freq); - -/** Adds non-empire-affiliated native populations to planets. */ -void GenerateNatives(Universe& universe, GalaxySetupOption freq); - -/** Adds space monsters to systems. */ -void GenerateSpaceMonsters(Universe& universe, GalaxySetupOption freq); - /** Creates starlanes and adds them systems already generated. */ void GenerateStarlanes(GalaxySetupOption freq); -/** Picks systems to host homeworlds, generates planets for them, stores - * the ID's of the homeworld planets into the homeworld vector. */ -void GenerateHomeworlds(Universe& universe, int players, std::vector<int>& homeworld_planet_ids); - -/** Names the planets in each system, based on the system's name. */ -void NamePlanets(Universe& universe); - -/** Creates some initial fields in universe. */ -void GenerateFields(Universe& universe, GalaxySetupOption freq); - /** Sets empire homeworld * This includes setting ownership, capital, species, * preferred environment (planet type) for the species */ |
From: <geo...@us...> - 2015-02-28 11:32:26
|
Revision: 7987 http://sourceforge.net/p/freeorion/code/7987 Author: geoffthemedio Date: 2015-02-28 11:32:24 +0000 (Sat, 28 Feb 2015) Log Message: ----------- Small patch by Chriss adjusting CMakeLists.txt files for new location of PythonUniverseGenerator source files. Modified Paths: -------------- trunk/FreeOrion/CMakeLists.txt trunk/FreeOrion/server/CMakeLists.txt Modified: trunk/FreeOrion/CMakeLists.txt =================================================================== --- trunk/FreeOrion/CMakeLists.txt 2015-02-28 10:03:38 UTC (rev 7986) +++ trunk/FreeOrion/CMakeLists.txt 2015-02-28 11:32:24 UTC (rev 7987) @@ -150,7 +150,7 @@ universe/Planet.h universe/PopCenter.h universe/Predicates.h - universe/PythonUniverseGenerator.h + python/server/PythonUniverseGenerator.h universe/ResourceCenter.h universe/ShipDesign.h universe/Ship.h Modified: trunk/FreeOrion/server/CMakeLists.txt =================================================================== --- trunk/FreeOrion/server/CMakeLists.txt 2015-02-28 10:03:38 UTC (rev 7986) +++ trunk/FreeOrion/server/CMakeLists.txt 2015-02-28 11:32:24 UTC (rev 7987) @@ -47,7 +47,7 @@ ../python/PythonEnumWrapper.cpp ../python/PythonLoggingWrapper.cpp ../python/PythonUniverseWrapper.cpp - ../universe/PythonUniverseGenerator.cpp + ../python/server/PythonUniverseGenerator.cpp ../universe/UniverseGenerator.cpp ) |
From: <ve...@us...> - 2015-03-01 21:18:14
|
Revision: 7990 http://sourceforge.net/p/freeorion/code/7990 Author: vezzra Date: 2015-03-01 21:18:12 +0000 (Sun, 01 Mar 2015) Log Message: ----------- Restructure/refactor Python universe generation interface, continued - Moved Python engine/framework init, cleanup and helper functions into new module PythonFramework Modified Paths: -------------- trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj trunk/FreeOrion/python/server/PythonUniverseGenerator.cpp Added Paths: ----------- trunk/FreeOrion/python/server/PythonFramework.cpp trunk/FreeOrion/python/server/PythonFramework.h Modified: trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj =================================================================== --- trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj 2015-03-01 21:18:03 UTC (rev 7989) +++ trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj 2015-03-01 21:18:12 UTC (rev 7990) @@ -334,6 +334,7 @@ 82D2D9A41838C8340011C212 /* ConditionParser6.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 82D2D9A21838C8340011C212 /* ConditionParser6.cpp */; }; 82D563D71A6AEBD6007E1131 /* DoubleComplexValueRefParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 82D563D51A6AEBD6007E1131 /* DoubleComplexValueRefParser.cpp */; }; 82D7B5A01AA3666F00A85842 /* PythonServerWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 82D7B59E1AA3666F00A85842 /* PythonServerWrapper.cpp */; }; + 82D7B5A31AA37C9000A85842 /* PythonFramework.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 82D7B5A11AA37C9000A85842 /* PythonFramework.cpp */; }; 82E5238F192FE8CE001E2374 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E5238E192FE8CE001E2374 /* AppKit.framework */; }; 82E52391192FE90F001E2374 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E52390192FE90F001E2374 /* IOKit.framework */; }; 82E52398192FE99D001E2374 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E52392192FE99C001E2374 /* Carbon.framework */; }; @@ -1159,6 +1160,8 @@ 82D68C6E15F4F720006B772D /* ShipPartStatsParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShipPartStatsParser.h; sourceTree = "<group>"; }; 82D7B59E1AA3666F00A85842 /* PythonServerWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PythonServerWrapper.cpp; sourceTree = "<group>"; }; 82D7B59F1AA3666F00A85842 /* PythonServerWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PythonServerWrapper.h; sourceTree = "<group>"; }; + 82D7B5A11AA37C9000A85842 /* PythonFramework.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PythonFramework.cpp; sourceTree = "<group>"; }; + 82D7B5A21AA37C9000A85842 /* PythonFramework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PythonFramework.h; sourceTree = "<group>"; }; 82E250AD19C2317700F0E2F2 /* libGLEW.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGLEW.a; sourceTree = "<group>"; }; 82E5238E192FE8CE001E2374 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 82E52390192FE90F001E2374 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; @@ -2136,6 +2139,8 @@ 824CE19F1AA0C28A00111CD9 /* PythonUniverseGenerator.h */, 82D7B59E1AA3666F00A85842 /* PythonServerWrapper.cpp */, 82D7B59F1AA3666F00A85842 /* PythonServerWrapper.h */, + 82D7B5A11AA37C9000A85842 /* PythonFramework.cpp */, + 82D7B5A21AA37C9000A85842 /* PythonFramework.h */, ); path = server; sourceTree = "<group>"; @@ -2708,6 +2713,7 @@ 47FAB6780A98D8A600F0AF3F /* ServerApp.cpp in Sources */, 471032540CEF6C9700A7DF2B /* ServerNetworking.cpp in Sources */, 82D7B5A01AA3666F00A85842 /* PythonServerWrapper.cpp in Sources */, + 82D7B5A31AA37C9000A85842 /* PythonFramework.cpp in Sources */, 471032600CEF6D0D00A7DF2B /* ServerFSM.cpp in Sources */, 2F60967E12EEB1AE00F58913 /* MessageQueue.cpp in Sources */, 2F6096CE12EF046500F58913 /* ClientApp.cpp in Sources */, Added: trunk/FreeOrion/python/server/PythonFramework.cpp =================================================================== --- trunk/FreeOrion/python/server/PythonFramework.cpp (rev 0) +++ trunk/FreeOrion/python/server/PythonFramework.cpp 2015-03-01 21:18:12 UTC (rev 7990) @@ -0,0 +1,142 @@ +#include "PythonFramework.h" + +#include "../../util/Directories.h" +#include "../../util/Logger.h" + +#include "../PythonWrappers.h" + +#include <boost/lexical_cast.hpp> +#include <boost/python.hpp> +#include <boost/python/list.hpp> +#include <boost/python/tuple.hpp> +#include <boost/python/extract.hpp> +#include <boost/date_time/posix_time/time_formatters.hpp> + +#ifdef FREEORION_MACOSX +#include <sys/param.h> +#endif + +using boost::python::object; +using boost::python::import; +using boost::python::error_already_set; +using boost::python::exec; +using boost::python::dict; +using boost::python::list; +using boost::python::tuple; +using boost::python::make_tuple; +using boost::python::extract; +using boost::python::len; + + +// Python module for logging functions +BOOST_PYTHON_MODULE(fo_logger) { + FreeOrionPython::WrapLogger(); +} + +namespace { + // Some helper objects needed to initialize and run the + // Python interface +#ifdef FREEORION_MACOSX + static char s_python_home[MAXPATHLEN]; + static char s_python_program_name[MAXPATHLEN]; +#endif + static dict s_python_namespace = dict(); +} + +bool PythonInit() { + Logger().debugStream() << "Initializing Python interface"; + + try { +#ifdef FREEORION_MACOSX + // There have been recurring issues on OSX to get FO to use the + // Python framework shipped with the app (instead of falling back + // on the ones provided by the system). These API calls have been + // added in an attempt to solve the problems. Not sure if they + // are really required, but better save than sorry.. ;) + strcpy(s_python_home, GetPythonHome().string().c_str()); + Py_SetPythonHome(s_python_home); + Logger().debugStream() << "Python home set to " << Py_GetPythonHome(); + strcpy(s_python_program_name, (GetPythonHome() / "Python").string().c_str()); + Py_SetProgramName(s_python_program_name); + Logger().debugStream() << "Python program name set to " << Py_GetProgramFullPath(); +#endif + // initializes Python interpreter, allowing Python functions to be called from C++ + Py_Initialize(); + Logger().debugStream() << "Python initialized"; + Logger().debugStream() << "Python version: " << Py_GetVersion(); + Logger().debugStream() << "Python prefix: " << Py_GetPrefix(); + Logger().debugStream() << "Python module search path: " << Py_GetPath(); + Logger().debugStream() << "Initializing C++ interfaces for Python"; + initfo_logger(); // allows the "fo_logger" C++ module to be imported within Python code + } + catch (...) { + Logger().errorStream() << "Unable to initialize Python interpreter"; + return false; + } + + try { + // get main namespace, needed to run other interpreted code + object py_main = import("__main__"); + s_python_namespace = extract<dict>(py_main.attr("__dict__")); + } + catch (error_already_set err) { + Logger().errorStream() << "Unable to set up main namespace in Python"; + PyErr_Print(); + return false; + } + + // set up logging by redirecting stdout and stderr to exposed logging functions + std::string script = "import sys\n" + "import fo_logger\n" + "class dbgLogger:\n" + " def write(self, msg):\n" + " fo_logger.log(msg)\n" + "class errLogger:\n" + " def write(self, msg):\n" + " fo_logger.error(msg)\n" + "sys.stdout = dbgLogger()\n" + "sys.stderr = errLogger()\n" + "print ('Python stdout and stderr redirected')"; + if (!PythonExecScript(script)) { + Logger().errorStream() << "Unable to redirect Python stdout and stderr"; + return false; + } + + Logger().debugStream() << "Python interface successfully initialized!"; + return true; +} + +bool PythonExecScript(const std::string script) { + try { object ignored = exec(script.c_str(), s_python_namespace, s_python_namespace); } + catch (error_already_set err) { + PyErr_Print(); + return false; + } + return true; +} + +bool PythonSetCurrentDir(const std::string dir) { + std::string script = "import os\n" + "os.chdir(r'" + dir + "')\n" + "print 'Python current directory set to', os.getcwd()"; + if (!PythonExecScript(script)) { + Logger().errorStream() << "Unable to set Python current directory"; + return false; + } + return true; +} + +bool PythonAddToSysPath(const std::string dir) { + std::string command = "sys.path.append(r'" + dir + "')"; + if (!PythonExecScript(command)) { + Logger().errorStream() << "Unable to set universe generator script dir"; + return false; + } + return true; +} + +void PythonCleanup() { + Py_Finalize(); + s_python_namespace = dict(); // TODO: is that really necessary? + Logger().debugStream() << "Cleaned up Python interface"; +} Added: trunk/FreeOrion/python/server/PythonFramework.h =================================================================== --- trunk/FreeOrion/python/server/PythonFramework.h (rev 0) +++ trunk/FreeOrion/python/server/PythonFramework.h 2015-03-01 21:18:12 UTC (rev 7990) @@ -0,0 +1,24 @@ +#ifndef __FreeOrion__PythonFramework__ +#define __FreeOrion__PythonFramework__ + +#include <string> + + +// Initializes und runs the Python interpreter +// Prepares the Python environment +bool PythonInit(); + +// Executes a Python script +bool PythonExecScript(const std::string script); + +// Sets Python current work directory +bool PythonSetCurrentDir(const std::string dir); + +// Adds directory to Python sys.patch +bool PythonAddToSysPath(const std::string dir); + +// Stops Python interpreter and releases its resources +void PythonCleanup(); + + +#endif /* defined(__FreeOrion__PythonFramework__) */ Modified: trunk/FreeOrion/python/server/PythonUniverseGenerator.cpp =================================================================== --- trunk/FreeOrion/python/server/PythonUniverseGenerator.cpp 2015-03-01 21:18:03 UTC (rev 7989) +++ trunk/FreeOrion/python/server/PythonUniverseGenerator.cpp 2015-03-01 21:18:12 UTC (rev 7990) @@ -1,29 +1,16 @@ #include "PythonUniverseGenerator.h" -#include "../../universe/Condition.h" -#include "../../universe/Species.h" -#include "../../universe/Special.h" -#include "../../universe/System.h" -#include "../../universe/Planet.h" -#include "../../universe/Building.h" #include "../../universe/ShipDesign.h" -#include "../../universe/Fleet.h" -#include "../../universe/Ship.h" -#include "../../universe/Tech.h" #include "../../server/ServerApp.h" #include "../../util/Directories.h" #include "../../util/Logger.h" #include "../../util/Random.h" -#include "../../util/i18n.h" #include "../../util/OptionsDB.h" -#include "../../parse/Parse.h" -#include "../../Empire/Empire.h" -#include "../../Empire/EmpireManager.h" - #include "../PythonSetWrapper.h" #include "../PythonWrappers.h" +#include "PythonFramework.h" #include "PythonServerWrapper.h" #include <vector> @@ -33,8 +20,6 @@ #include <boost/lexical_cast.hpp> #include <boost/python.hpp> -#include <boost/python/suite/indexing/vector_indexing_suite.hpp> -#include <boost/python/suite/indexing/map_indexing_suite.hpp> #include <boost/python/list.hpp> #include <boost/python/tuple.hpp> #include <boost/python/extract.hpp> @@ -55,9 +40,6 @@ using boost::python::return_by_value; using boost::python::return_internal_reference; -using boost::python::vector_indexing_suite; -using boost::python::map_indexing_suite; - using boost::python::object; using boost::python::import; using boost::python::error_already_set; @@ -84,11 +66,6 @@ } -// Python module for logging functions -BOOST_PYTHON_MODULE(fo_logger) { - FreeOrionPython::WrapLogger(); -} - // Python module providing the universe generator API BOOST_PYTHON_MODULE(fo_universe_generator) { def("get_galaxy_setup_data", GetGalaxySetupDataQ, return_value_policy<reference_existing_object>()); @@ -101,107 +78,33 @@ namespace { - // Some helper objects needed to initialize and run the - // Python interface. Don't know if or why they have to - // be exactly this way, more or less copied them over - // from the Python AI interface. -#ifdef FREEORION_MACOSX - static char s_python_home[MAXPATHLEN]; - static char s_python_program_name[MAXPATHLEN]; -#endif - static dict s_python_namespace = dict(); - static object s_python_module = object(); + // Global reference to imported Python universe generator module + static object s_python_module = object(); - // Helper function for executing a Python script - bool PythonExecScript(const std::string script) { - try { object ignored = exec(script.c_str(), s_python_namespace, s_python_namespace); } - catch (error_already_set err) { - PyErr_Print(); + // Prepares Python interpreter and environment + bool PreparePythonEnvironment() { + // Setup and run Python interpreter + if (!PythonInit()) return false; - } - return true; - } - // Initializes und runs the Python interpreter - // Prepares the Python environment - void PythonInit() { - Logger().debugStream() << "Initializing universe generator Python interface"; - + // Allow the "fo_universe_generator" C++ module to be imported within Python code try { -#ifdef FREEORION_MACOSX - // There have been recurring issues on OSX to get FO to use the - // Python framework shipped with the app (instead of falling back - // on the ones provided by the system). These API calls have been - // added in an attempt to solve the problems. Not sure if they - // are really required, but better save than sorry.. ;) - strcpy(s_python_home, GetPythonHome().string().c_str()); - Py_SetPythonHome(s_python_home); - Logger().debugStream() << "Python home set to " << Py_GetPythonHome(); - strcpy(s_python_program_name, (GetPythonHome() / "Python").string().c_str()); - Py_SetProgramName(s_python_program_name); - Logger().debugStream() << "Python program name set to " << Py_GetProgramFullPath(); -#endif - // initializes Python interpreter, allowing Python functions to be called from C++ - Py_Initialize(); - Logger().debugStream() << "Python initialized"; - Logger().debugStream() << "Python version: " << Py_GetVersion(); - Logger().debugStream() << "Python prefix: " << Py_GetPrefix(); - Logger().debugStream() << "Python module search path: " << Py_GetPath(); - Logger().debugStream() << "Initializing C++ interfaces for Python"; - initfo_logger(); // allows the "fo_logger" C++ module to be imported within Python code - initfo_universe_generator(); // allows the "fo_universe_generator" C++ module to be imported within Python code + initfo_universe_generator(); } catch (...) { - Logger().errorStream() << "Unable to initialize Python interpreter"; - return; + Logger().errorStream() << "Unable to initialize fo_universe_generator interface"; + return false; } - try { - // get main namespace, needed to run other interpreted code - object py_main = import("__main__"); - s_python_namespace = extract<dict>(py_main.attr("__dict__")); - } - catch (error_already_set err) { - Logger().errorStream() << "Unable to set up main namespace in Python"; - PyErr_Print(); - return; - } - - // set up logging by redirecting stdout and stderr to exposed logging functions - std::string script = "import sys\n" - "import fo_logger\n" - "class dbgLogger:\n" - " def write(self, msg):\n" - " fo_logger.log(msg)\n" - "class errLogger:\n" - " def write(self, msg):\n" - " fo_logger.error(msg)\n" - "sys.stdout = dbgLogger()\n" - "sys.stderr = errLogger()\n" - "print ('Python stdout and stderr redirected')"; - if (!PythonExecScript(script)) { - Logger().errorStream() << "Unable to redirect Python stdout and stderr"; - return; - } - - // set Python current work directory to directory containing - // the universe generation Python scripts + // Set Python current work directory to directory containing + // the universe generation Python scripts... std::string universe_generation_script_dir = GetResourceDir().string() + "/universe_generation"; - script = "import os\n" - "os.chdir(r'" + universe_generation_script_dir + "')\n" - "print 'Python current directory set to', os.getcwd()"; - if (!PythonExecScript(script)) { - Logger().errorStream() << "Unable to set Python current directory"; - return; - } + if (!PythonSetCurrentDir(universe_generation_script_dir)) + return false; + // ...and also add it to Pythons sys.path to make sure Python will find our scripts + if (!PythonAddToSysPath(universe_generation_script_dir)) + return false; - // tell Python the path in which to locate universe generator script file - std::string command = "sys.path.append(r'" + universe_generation_script_dir + "')"; - if (!PythonExecScript(command)) { - Logger().errorStream() << "Unable to set universe generator script dir"; - return; - } - try { // import universe generator script file s_python_module = import("universe_generator"); @@ -209,20 +112,12 @@ catch (error_already_set err) { Logger().errorStream() << "Unable to import universe generator script"; PyErr_Print(); - return; + return false; } - Logger().debugStream() << "Python interface successfully initialized!"; + return true; } - void PythonCleanup() { - // stops Python interpreter and release its resources - Py_Finalize(); - s_python_namespace = dict(); - s_python_module = object(); - Logger().debugStream() << "Cleaned up universe generator Python interface"; - } - // Wraps call to the Python universe generator error report function std::vector<std::string> PythonErrorReport() { std::vector<std::string> err_list; @@ -294,8 +189,8 @@ Seed(seed); Logger().debugStream() << "GenerateUniverse with seed: " << seed; - // Setup and run Python interpreter - PythonInit(); + // Fire up Python + PreparePythonEnvironment(); // Reset the universe object for a new universe universe.ResetUniverse(); @@ -310,6 +205,8 @@ // Stop and clean up Python interpreter PythonCleanup(); + // Release resources (TODO: is that really necessary?) + s_python_module = object(); Logger().debugStream() << "Applying first turn effects and updating meters"; |
From: <geo...@us...> - 2015-03-02 20:57:24
|
Revision: 7994 http://sourceforge.net/p/freeorion/code/7994 Author: geoffthemedio Date: 2015-03-02 20:57:13 +0000 (Mon, 02 Mar 2015) Log Message: ----------- -Big patch by Mitten.O, adding graphical combat summary -MSVC project file adjustments by me Modified Paths: -------------- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp trunk/FreeOrion/UI/EncyclopediaDetailPanel.h trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/client/human/CMakeLists.txt trunk/FreeOrion/combat/CombatLogManager.cpp trunk/FreeOrion/combat/CombatLogManager.h trunk/FreeOrion/default/stringtables/en.txt trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters Added Paths: ----------- trunk/FreeOrion/UI/CombatReport/ trunk/FreeOrion/UI/CombatReport/CombatLogWnd.cpp trunk/FreeOrion/UI/CombatReport/CombatLogWnd.h trunk/FreeOrion/UI/CombatReport/CombatReportData.cpp trunk/FreeOrion/UI/CombatReport/CombatReportData.h trunk/FreeOrion/UI/CombatReport/CombatReportWnd.cpp trunk/FreeOrion/UI/CombatReport/CombatReportWnd.h trunk/FreeOrion/UI/CombatReport/GraphicalSummary.cpp trunk/FreeOrion/UI/CombatReport/GraphicalSummary.h Added: trunk/FreeOrion/UI/CombatReport/CombatLogWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatLogWnd.cpp (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatLogWnd.cpp 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,185 @@ +#include "CombatLogWnd.h" + +#include "../../client/human/HumanClientApp.h" +#include "../../combat/CombatLogManager.h" +#include "../../combat/CombatEvents.h" +#include "../../universe/System.h" +#include "../../util/AppInterface.h" +#include "../../util/i18n.h" +#include "../../util/Logger.h" +#include "../../universe/UniverseObject.h" +#include "../../Empire/Empire.h" + +namespace { + +const std::string EMPTY_STRING; + +std::map<int, int> CountByOwner(const std::set<int>& objects) { + std::map<int, int> objects_per_owner; + for (std::set<int>::const_iterator it = objects.begin(); it != objects.end(); ++it) { + TemporaryPtr<const UniverseObject> object = Objects().Object(*it); + if (object && ( + object->ObjectType() == OBJ_SHIP || ( + object->GetMeter(METER_POPULATION) && + object->CurrentMeterValue(METER_POPULATION) > 0.0))) + { + int owner_id = object->Owner(); + if (objects_per_owner.find(owner_id) == objects_per_owner.end()) + objects_per_owner[owner_id] = 0; + ++objects_per_owner[owner_id]; + } + } + return objects_per_owner; +} + +std::string CountsToText(const std::map<int, int>& count_per_empire, std::string delimiter = ", ") { + std::stringstream ss; + for (std::map<int,int>::const_iterator it = count_per_empire.begin(); it != count_per_empire.end(); ) { + std::string owner_string = UserString("NEUTRAL"); + if (const Empire* owner = Empires().Lookup(it->first)) + owner_string = GG::RgbaTag(owner->Color()) + owner->Name() + "</rgba>"; + ss << owner_string << ": " << it->second; + ++it; + if (it != count_per_empire.end()) + ss << delimiter; + } + return ss.str(); +} + +const std::string& LinkTag(UniverseObjectType obj_type) { + switch (obj_type) { + case OBJ_SHIP: + return VarText::SHIP_ID_TAG; + break; + case OBJ_FLEET: + return VarText::FLEET_ID_TAG; + break; + case OBJ_PLANET: + return VarText::PLANET_ID_TAG; + break; + case OBJ_BUILDING: + return VarText::BUILDING_ID_TAG; + break; + case OBJ_SYSTEM: + return VarText::SYSTEM_ID_TAG; + break; + case OBJ_FIELD: + default: + return EMPTY_STRING; + } +} + +/// Creates a link tag of the appropriate type for object_id, +/// with the content being the public name from the point of view of client_empire_id. +/// Returns not_found if object_id is not found. +std::string PublicNameLink(int client_empire_id, int object_id, std::string not_found) { + TemporaryPtr<const UniverseObject> object = GetUniverseObject(object_id); + if (object) { + const std::string& name = object->PublicName(client_empire_id); + const std::string& tag = LinkTag(object->ObjectType()); + return LinkTaggedIDText(tag, object_id, name); + } else { + return not_found; + } +} + +class ColorByOwner: public LinkDecorator { +public: + virtual std::string Decorate(const std::string& object_id_str, const std::string& content) const { + GG::Clr color = ClientUI::DefaultLinkColor(); + const Empire* empire = 0; + + // get object indicated by object_id, and then get object's owner, if any + int object_id = CastStringToInt(object_id_str); + TemporaryPtr<const UniverseObject> object = Objects().Object(object_id); + if (object && !object->Unowned()) + empire = Empires().Lookup(object->Owner()); + if (empire) + color = empire->Color(); + + return GG::RgbaTag(color) + content + "</rgba>"; + } +}; + +} + + +CombatLogWnd::CombatLogWnd(): + CUILinkTextMultiEdit("", GG::MULTI_WORDBREAK | GG::MULTI_READ_ONLY) +{ + SetDecorator(VarText::SHIP_ID_TAG, new ColorByOwner()); + SetDecorator(VarText::PLANET_ID_TAG, new ColorByOwner()); +} + +void CombatLogWnd::SetLog(int log_id) { + std::stringstream detailed_description; + bool available = CombatLogAvailable(log_id); + if (!available) { + Logger().errorStream() << "EncyclopediaDetailPanel::Refresh couldn't find combat log with id: " << log_id; + return; + } + const CombatLog& log = GetCombatLog(log_id); + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + + std::string name = UserString("ENC_COMBAT_LOG"); + boost::shared_ptr<GG::Texture> texture = ClientUI::GetTexture(ClientUI::ArtDir() / "/icons/sitrep/combat.png", true); + std::string general_type = UserString("ENC_COMBAT_LOG"); + + TemporaryPtr<const System> system = GetSystem(log.system_id); + const std::string& sys_name = (system ? system->PublicName(client_empire_id) : UserString("ERROR")); + + detailed_description << str(FlexibleFormat(UserString("ENC_COMBAT_LOG_DESCRIPTION_STR")) + % LinkTaggedIDText(VarText::SYSTEM_ID_TAG, log.system_id, sys_name) + % log.turn) + "\n"; + + detailed_description <<"\n"+ UserString("COMBAT_INITIAL_FORCES") + "\n" + CountsToText(CountByOwner(log.object_ids))+"\n"; + + for ( std::vector<CombatEventPtr>::const_iterator it = log.combat_events.begin(); + it != log.combat_events.end(); ++it ) + { + const BoutBeginEvent* bout_begin = dynamic_cast<BoutBeginEvent*>(it->get()); + const AttackEvent* attack = dynamic_cast<AttackEvent*>(it->get()); + const IncapacitationEvent* incapacitation = dynamic_cast<IncapacitationEvent*>(it->get()); + if ( bout_begin ) { + detailed_description << str(FlexibleFormat(UserString("ENC_ROUND_BEGIN")) % bout_begin->bout) + "\n"; + } else if ( attack ) { + std::string attacker_link = PublicNameLink(client_empire_id, attack->attacker_id, UserString("ENC_COMBAT_UNKNOWN_OBJECT")); + std::string target_link = PublicNameLink(client_empire_id, attack->target_id, UserString("ENC_COMBAT_UNKNOWN_OBJECT")); + + const std::string& template_str = UserString("ENC_COMBAT_ATTACK_STR"); + + detailed_description << str(FlexibleFormat(template_str) + % attacker_link + % target_link + % attack->damage + % attack->bout + % attack->round) + "\n"; + } else if ( incapacitation ) { + TemporaryPtr<const UniverseObject> object = GetUniverseObject(incapacitation->object_id); + std::string template_str; + if ( !object ) { + template_str = UserString("ENC_COMBAT_UNKNOWN_DESTROYED_STR"); + } else if ( object->ObjectType() == OBJ_PLANET ) { + template_str = UserString("ENC_COMBAT_PLANET_INCAPACITATED_STR"); + } else { + template_str = UserString("ENC_COMBAT_DESTROYED_STR"); + } + const std::string object_link = PublicNameLink ( client_empire_id, incapacitation->object_id, UserString ( "ENC_COMBAT_UNKNOWN_OBJECT" ) ); + + int owner_id = object?object->Owner():ALL_EMPIRES; + std::string owner_string = " "; + if ( owner_id != ALL_EMPIRES ) { + Empire* owner = Empires().Lookup(owner_id); + if ( owner ) { + owner_string += owner->Name() + " "; + } + } + + detailed_description << str(FlexibleFormat(template_str) % owner_string % object_link) + "\n"; + } + } + + detailed_description << "\n" + UserString("COMBAT_SUMMARY_DESTROYED") + "\n" + CountsToText(CountByOwner(log.destroyed_object_ids)); + + SetText(detailed_description.str()); +} Added: trunk/FreeOrion/UI/CombatReport/CombatLogWnd.h =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatLogWnd.h (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatLogWnd.h 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,15 @@ +#ifndef COMBATLOGWND_H +#define COMBATLOGWND_H + +#include "../CUIControls.h" + +/// Displays a textual log of combat events +class CombatLogWnd : public CUILinkTextMultiEdit { +public: + CombatLogWnd(); + + /// Set which log to show + void SetLog(int log_id); +}; + +#endif // COMBATLOGWND_H Added: trunk/FreeOrion/UI/CombatReport/CombatReportData.cpp =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatReportData.cpp (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatReportData.cpp 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,103 @@ +#include "CombatReportData.h" +#include "../../combat/CombatEvents.h" +#include "../../combat/CombatLogManager.h" +#include "../../universe/UniverseObject.h" +#include "../../util/AppInterface.h" +#include "../../util/i18n.h" +#include "../../util/Logger.h" +#include "../Empire/EmpireManager.h" +#include "../Empire/Empire.h" + +#include <GG/ClrConstants.h> + +namespace { + /// Return id of empire or ALL_EMPIRES if null + int SafeEmpireId(const Empire* empire) { + if(empire) { + return empire->EmpireID(); + } else { + return ALL_EMPIRES; + } + } +} + + +ParticipantSummary::ParticipantSummary(): + object_id(INVALID_OBJECT_ID), + empire_id(ALL_EMPIRES), + current_health(-1), + max_health(-1) {} + +ParticipantSummary::ParticipantSummary(int object_id, int empire_id, const CombatParticipantState& state): + object_id(object_id), + empire_id(empire_id), + current_health(-1), + max_health(-1) { + current_health = state.current_health; + max_health = state.max_health; +} + + +CombatSummary::CombatSummary(): + empire(0), + total_current_health(-1) {} + +CombatSummary::CombatSummary(int empire_id): + empire(Empires().Lookup(empire_id)), + total_current_health(0) {} + +GG::Clr CombatSummary::SideColor() const { + if(empire) { + return empire->Color(); + } else { + return GG::CLR_WHITE; + } +} + +std::string CombatSummary::SideName() const { + if(empire) { + return empire->Name(); + } else { + return UserString("NEUTRAL"); + } +} + +unsigned int CombatSummary::DestroyedUnits() const +{ + unsigned count = 0; + for (UnitSummaries::const_iterator it = unit_summaries.begin(); it != unit_summaries.end(); ++it) { + if((*it)->current_health <= 0.0f && (*it)->max_health > 0.0f) { + ++count; + } + } + return count; +} + + +void CombatSummary::AddUnit(int unit_id, const CombatParticipantState& state) { + unit_summaries.push_back(boost::make_shared<ParticipantSummary>(unit_id, SafeEmpireId(empire), state) ); + total_current_health += std::max(unit_summaries.back()->current_health, 0.0f); + total_max_health += std::max(unit_summaries.back()->max_health, 0.0f); + + max_current_health = std::max( max_current_health, unit_summaries.back()->current_health ); + max_max_health = std::max( max_max_health, unit_summaries.back()->max_health ); +} + + +// First by max health, then by current health. +// This will group similar ships, then order them by current health +static bool ParticipantCompare(const CombatSummary::ParticipantSummaryPtr& one, const CombatSummary::ParticipantSummaryPtr& two) { + if(one->max_health > two->max_health) { + return true; + } else if (two->max_health > one->max_health) { + return false; + } else if (one->current_health > two->current_health) { + return true; + } else { + return false; + } +} + +void CombatSummary::Sort() { + std::sort(unit_summaries.begin(), unit_summaries.end(), ParticipantCompare); +} Added: trunk/FreeOrion/UI/CombatReport/CombatReportData.h =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatReportData.h (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatReportData.h 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,66 @@ +#ifndef COMBATREPORTDATA_H +#define COMBATREPORTDATA_H + +#include "../universe/TemporaryPtr.h" + +#include <GG/Clr.h> + +#include <vector> + +class AttackEvent; +class CombatParticipantState; +class Empire; +class UniverseObject; + +// Data on what happened on single object in the combat +struct ParticipantSummary { + int object_id; + int empire_id; + std::vector<AttackEvent*> attacks; + std::vector<AttackEvent*> attacks_against; + + float current_health; + float max_health; + + ParticipantSummary(); + + ParticipantSummary(int object_id, int empire_id, const CombatParticipantState& state); +}; + +// A summary of what happened to a side in the combat +// (an empire or neutral) +struct CombatSummary { +public: + // Should be auto_ptr, but don't have c++11 + typedef boost::shared_ptr<ParticipantSummary> ParticipantSummaryPtr; + // Participant summaries have vectors inside them, + // so we don't want to have to copy them around while sorting + // therefore we store them with pointers + typedef std::vector< ParticipantSummaryPtr > UnitSummaries; + + Empire* empire; + UnitSummaries unit_summaries; + float total_current_health; + float total_max_health; + float max_max_health; + float max_current_health; + + CombatSummary(); + + CombatSummary(int empire_id); + + GG::Clr SideColor() const; + + std::string SideName() const; + + unsigned DestroyedUnits() const; + + // Adds a summary of a unit to the summary of its side + // and aggregates its data. + void AddUnit(int unit_id, const CombatParticipantState& state); + + // Sorts the units of this side in some sensible fashion + void Sort(); +}; + +#endif // COMBATREPORTDATA_H Added: trunk/FreeOrion/UI/CombatReport/CombatReportWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatReportWnd.cpp (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatReportWnd.cpp 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,95 @@ +#include "CombatReportWnd.h" +#include "../ClientUI.h" +#include "../CUIControls.h" +#include "../../util/i18n.h" +#include "../../util/Logger.h" + +#include "CombatReportData.h" +#include "GraphicalSummary.h" +#include "CombatLogWnd.h" + +#include <GG/TabWnd.h> + +namespace { + GG::X COMBAT_LOG_WIDTH(400); + GG::Y COMBAT_LOG_HEIGHT(300); + + GG::X RESIZE_MARGIN_X(4); + GG::Y RESIZE_MARGIN_Y(4); +} + +// The implementation class for CombatReportWnd +class CombatReportWnd::CombatReportPrivate { +public: + CombatReportPrivate (CombatReportWnd& wnd): + m_wnd(wnd), + m_tabs(new GG::TabWnd(GG::X0, GG::Y0, GG::X1, GG::Y1, ClientUI::GetFont(), ClientUI::CtrlColor(), ClientUI::TextColor())), + m_graphical(new GraphicalSummaryWnd()), + m_log(new CombatLogWnd()){ + m_tabs->AddWnd(m_graphical, UserString("COMBAT_SUMMARY")); + m_tabs->AddWnd(m_log, UserString("COMBAT_LOG")); + m_wnd.AttachChild(m_tabs); + m_wnd.GridLayout(); + } + + void SetLog ( int log_id ) { + m_graphical->SetLog(log_id); + m_log->SetLog(log_id); + } + + void DoLayout() { + m_graphical->DoLayout(); + } +private: + CombatReportWnd& m_wnd; + GG::TabWnd* m_tabs; + GraphicalSummaryWnd* m_graphical; //< Graphical summary + CombatLogWnd* m_log; //< Detailed log + + void SetFocus(int id){ + Logger().debugStream() << "SetFocus " << id; + } + + void RectangleEnter(int data) { + Logger().debugStream() << "RectangleHover " << data; + SetFocus(data); + } +}; + + +CombatReportWnd::CombatReportWnd ( ) : +CUIWnd ( UserString("COMBAT_REPORT_TITLE"), + GG::X(150), GG::Y(50), COMBAT_LOG_WIDTH, COMBAT_LOG_HEIGHT, + GG::INTERACTIVE | GG::RESIZABLE | GG::DRAGABLE | GG::ONTOP | CLOSABLE + ), +m_impl(new CombatReportPrivate(*this) ){ + +} + +CombatReportWnd::~CombatReportWnd() +{ } + + +void CombatReportWnd::SetLog ( int log_id ) { + m_impl->SetLog(log_id); +} + +GG::Pt CombatReportWnd::ClientLowerRight() const { + GG::Pt lr = CUIWnd::ClientLowerRight(); + lr.x -= RESIZE_MARGIN_X; + lr.y -= RESIZE_MARGIN_Y; + return lr; +} + +void CombatReportWnd::CloseClicked() { + Hide(); +} + +void CombatReportWnd::SizeMove(const GG::Pt& ul, const GG::Pt& lr) +{ + CUIWnd::SizeMove(ul, lr); + m_impl->DoLayout(); +} + + + Added: trunk/FreeOrion/UI/CombatReport/CombatReportWnd.h =================================================================== --- trunk/FreeOrion/UI/CombatReport/CombatReportWnd.h (rev 0) +++ trunk/FreeOrion/UI/CombatReport/CombatReportWnd.h 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,29 @@ +#ifndef COMBATREPORTDLG_H +#define COMBATREPORTDLG_H + +#include "../UI/CUIWnd.h" + +#include <boost/scoped_ptr.hpp> + +/// Shows a report on a combat +class CombatReportWnd : public CUIWnd { +public: + CombatReportWnd (); + // Must have explicit destructor since CombatReportPrivate is incomplete here + virtual ~CombatReportWnd(); + + /// Sets which combat to show. + void SetLog( int log_id ); + + virtual GG::Pt ClientLowerRight() const; + virtual void CloseClicked(); + + virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); + +private: + class CombatReportPrivate; + + boost::scoped_ptr<CombatReportPrivate> m_impl; +}; + +#endif // COMBATREPORTDLG_H Added: trunk/FreeOrion/UI/CombatReport/GraphicalSummary.cpp =================================================================== --- trunk/FreeOrion/UI/CombatReport/GraphicalSummary.cpp (rev 0) +++ trunk/FreeOrion/UI/CombatReport/GraphicalSummary.cpp 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,699 @@ +#include "GraphicalSummary.h" + +#include "../CUIControls.h" +#include "../CUIDrawUtil.h" +#include "../../client/ClientApp.h" +#include "../../Empire/Empire.h" +#include "../../universe/UniverseObject.h" +#include "../../util/i18n.h" +#include "../../util/Logger.h" +#include "../../util/OptionsDB.h" +#include "../../combat/CombatLogManager.h" + +#include <GG/ClrConstants.h> +#include <GG/DrawUtil.h> +#include <GG/Layout.h> + +#include <boost/format.hpp> + +namespace { + // These margins determine how we avoid drawing children on top of the + // bevel in the lower right corner. + GG::X BEVEL_MARGIN_X(6); + GG::Y BEVEL_MARGIN_Y(12); + + // The height of the space where the display option buttons are put + GG::Y OPTION_BAR_HEIGHT(25); + // The height of option buttons + GG::Y OPTION_BUTTON_HEIGHT(20); + GG::X OPTION_BUTTON_PADDING(8); + + // How much space to leave for the y axis + GG::X AXIS_WIDTH(10); + // How much space to leave for the axis + // at the bottom of a SideBar + GG::Y AXIS_HEIGHT(10); + + // Space arounf the labels of the axes + GG::X Y_AXIS_LABEL_MARGIN(3); + GG::Y X_AXIS_LABEL_MARGIN(8); + + // Margin between participant bars and whatever is above the side bars top + GG::Y PARTICIPANT_BAR_UP_MARGIN(5); + + // Space between side boxes + GG::Y SIDE_BOX_MARGIN(8); + + int MIN_SIDE_BAR_WIDTH = 100; + int MIN_SIDE_BAR_HEIGHT = 40; + + const float EPSILON = 0.00001; + + const std::string OPTIONS_ROOT = "UI.combat.summary.graph."; + + const std::string TOGGLE_BAR_HEIGHT_PROPORTIONAL = "bar_height_proportional"; + const std::string TOGGLE_BAR_WIDTH_PROPORTIONAL = "bar_width_proportional"; + const std::string TOGGLE_BAR_HEALTH_SMOOTH = "bar_health_smooth"; + const std::string TOGGLE_GRAPH_HEIGHT_PROPORTIONAL = "graph_height_proportional"; + + // command-line options + void AddOptions(OptionsDB& db) { + db.Add<bool>(OPTIONS_ROOT + TOGGLE_BAR_HEIGHT_PROPORTIONAL, + UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_BAR_HEIGHT_PROPORTIONAL"), + false); + db.Add<bool>(OPTIONS_ROOT + TOGGLE_BAR_WIDTH_PROPORTIONAL, + UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_BAR_WIDTH_PROPORTIONAL"), + true); + db.Add<bool>(OPTIONS_ROOT + TOGGLE_BAR_HEALTH_SMOOTH, + UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_BAR_HEALTH_SMOOTH"), + true); + db.Add<bool>(OPTIONS_ROOT + TOGGLE_GRAPH_HEIGHT_PROPORTIONAL, + UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_GRAPH_HEIGHT_PROPORTIONAL"), + false); + + db.Add<StreamableColor>("UI.combat.summary.dead-color", UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_DEAD_COLOR"), StreamableColor(GG::Clr(128, 0, 0, 255))); + db.Add<StreamableColor>("UI.combat.summary.wound-color", UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_WOUND_COLOR"), StreamableColor(GG::CLR_RED)); + db.Add<StreamableColor>("UI.combat.summary.health-color", UserStringNop("OPTIONS_DB_UI_COMBAT_SUMMARY_HEALTH_COLOR"), StreamableColor(GG::CLR_GREEN)); + } + bool temp_bool = RegisterOptions(&AddOptions); + + // Removes the space taken up by axes of a sidebox from size. + GG::Pt AdjustForAxes(const GG::Pt& size) { + GG::Pt adjusted(size); + adjusted.x = std::max( GG::X0, size.x - AXIS_WIDTH - Y_AXIS_LABEL_MARGIN); + adjusted.y = std::max( GG::Y0, size.y - AXIS_HEIGHT - X_AXIS_LABEL_MARGIN - PARTICIPANT_BAR_UP_MARGIN); + return adjusted; + } + + template<typename T> + T interpolate(double modifier, const T& value1, const T& value2) { + return static_cast<T>(modifier*value1 + (1.0 - modifier)*value2); + } +} + +class BarSizer { +public: + typedef std::map<int, CombatSummary> CombatSummaryMap; + + BarSizer( const CombatSummaryMap& combat_summaries , const GG::Pt& available_size): + m_max_total_max_health(-1.0f), + m_max_units_on_a_side(-1), + m_sum_of_max_max_healths(0), + m_summaries(combat_summaries), + m_available_space(available_size) { + // We want to measure health on a single scale that shows as much as possible + // while fitting the data of both sides. + // Therefore we make the side with more health fill the window + for(std::map<int, CombatSummary>::const_iterator it = combat_summaries.begin(); it != combat_summaries.end(); ++it ) { + m_max_total_max_health = std::max( it->second.total_max_health, m_max_total_max_health ); + m_max_units_on_a_side = std::max( static_cast<int>(it->second.unit_summaries.size()), m_max_units_on_a_side ); + m_sum_of_max_max_healths += it->second.max_max_health; + } + assert(m_max_total_max_health > 0); + } + + GG::Pt GetBarSize( const ParticipantSummary& participant ) const { + GG::Pt total_space = GetSideBarSize(participant.empire_id); + + total_space = AdjustForAxes(total_space); + + CombatSummaryMap::const_iterator side_summary_it = m_summaries.find(participant.empire_id); + + if( side_summary_it == m_summaries.end() ) { + Logger().errorStream() << "The empire of the object " << participant.object_id + << " is not known to be in this battle. (empire_id = " << participant.empire_id << ")"; + return GG::Pt(GG::X(10), GG::Y(10)); + } + + const CombatSummary& side_summary = side_summary_it->second; + + GG::X width; + if( participant.current_health > 0.0 ) { + width = CalculateAliveWidth( participant, total_space ); + } else { + width = CalculateDeadWidth( participant, total_space ); + } + GG::Y height; + if( Get( TOGGLE_BAR_HEIGHT_PROPORTIONAL) ) { + height = ( (participant.max_health / side_summary.max_max_health) * total_space.y ); + } else { + height = total_space.y; + } + + return GG::Pt(width, height); + } + + GG::X CalculateAliveWidth( const ParticipantSummary& participant, const GG::Pt& total_space ) const { + if(Get(TOGGLE_BAR_WIDTH_PROPORTIONAL)) { + return GG::X( (participant.current_health / m_max_total_max_health) * total_space.x ); + } else { + return GG::X( total_space.x / m_max_units_on_a_side ); + } + } + + GG::X CalculateDeadWidth( const ParticipantSummary& participant, const GG::Pt& total_space) const { + if( Get(TOGGLE_BAR_WIDTH_PROPORTIONAL) ) { + return GG::X( (participant.max_health / m_max_total_max_health) * total_space.x ); + } else { + return GG::X( total_space.x / m_max_units_on_a_side ); + } + } + + GG::Pt GetSideBarSize(const Empire* empire ) const { + return GetSideBarSize( empire ? empire->EmpireID() : ALL_EMPIRES ); + } + + void SetAvailableSize(GG::Pt size) { + m_available_space = size; + } + + bool Get(const std::string& option) const { + return GetOptionsDB().Get<bool>(OPTIONS_ROOT + option); + } + + void Set(const std::string& option, bool value) { + GetOptionsDB().Set(OPTIONS_ROOT + option, value); + GetOptionsDB().Commit(); + } + +private: + float m_max_total_max_health; + int m_max_units_on_a_side; + float m_sum_of_max_max_healths; + const CombatSummaryMap& m_summaries; + GG::Pt m_available_space; + + bool m_use_relative_side_bar_heights; + + GG::Pt GetSideBarSize( int empire_id ) const{ + GG::Pt bar_size = m_available_space - GG::Pt(BEVEL_MARGIN_X, BEVEL_MARGIN_Y + static_cast<int>(m_summaries.size()) * SIDE_BOX_MARGIN); + + CombatSummaryMap::const_iterator summary_it = m_summaries.find(empire_id); + + if ( Get(TOGGLE_GRAPH_HEIGHT_PROPORTIONAL) && summary_it != m_summaries.end() ) { + bar_size.y *= summary_it->second.max_max_health / m_sum_of_max_max_healths; + } else { + bar_size.y = bar_size.y / static_cast<int>(m_summaries.size()); + } + + bar_size.x = std::max(GG::X(MIN_SIDE_BAR_WIDTH), bar_size.x); + bar_size.y = std::max(GG::Y(MIN_SIDE_BAR_HEIGHT), bar_size.y); + + return bar_size; + } +}; + +/// A Bar tha shows the health of a single battle participant +class ParticipantBar : public GG::Wnd { +public: + ParticipantBar(const ParticipantSummary& participant, const BarSizer& sizer): + GG::Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE), + m_participant(participant), + m_sizer(sizer), + m_hovered(false) + { + TemporaryPtr<UniverseObject> object = Objects().Object(participant.object_id); + if(object) { + SetBrowseText(object->PublicName(ClientApp::GetApp()->EmpireID()) + " " + boost::lexical_cast<std::string>(participant.current_health) + "/" + + boost::lexical_cast<std::string>(participant.max_health) + ); + } + SetBrowseModeTime(300); + + OptionsDB& options = GetOptionsDB(); + m_dead_color = options.Get<StreamableColor>("UI.combat.summary.dead-color").ToClr(); + m_wound_color = options.Get<StreamableColor>("UI.combat.summary.wound-color").ToClr(); + m_health_color = options.Get<StreamableColor>("UI.combat.summary.health-color").ToClr(); + } + + virtual void Render() { + + GG::Clr base_color = Alive() ? m_wound_color : m_dead_color; + + // Always draw the red background, health will cover it + GG::FlatRectangle(ClientUpperLeft(), ClientLowerRight(), base_color, m_hovered ? GG::CLR_WHITE : GG::CLR_BLACK, 1); + + if( m_sizer.Get( TOGGLE_BAR_HEALTH_SMOOTH ) ) { + // Use a smooth colour change based health display. + if (Alive()) { + double health_percentage = 1.0 * m_participant.current_health / m_participant.max_health; + + GG::Clr mixed_color(interpolate(health_percentage, m_health_color.r, m_wound_color.r), + interpolate(health_percentage, m_health_color.g, m_wound_color.g), + interpolate(health_percentage, m_health_color.b, m_wound_color.b), + interpolate(health_percentage, m_health_color.a, m_wound_color.a)); + GG::FlatRectangle(ClientUpperLeft(), ClientLowerRight(), mixed_color, GG::CLR_ZERO, 1); + } + } else { + if(Alive()) { + GG::Y health_height( (m_participant.current_health / m_participant.max_health) * Value(ClientHeight()) ); + GG::FlatRectangle(GG::Pt(ClientUpperLeft().x, ClientLowerRight().y - health_height), ClientLowerRight(), m_health_color, GG::CLR_ZERO, 1); + } + } + } + + virtual void MouseEnter(const GG::Pt& pt, GG::Flags< GG::ModKey > mod_keys) { + m_hovered = true; + } + + virtual void MouseLeave() { + m_hovered = false; + } + + /// Resizes the bar to have a width and height based on the + /// current and maximal health of the participant. + void DoLayout() { + Resize(m_sizer.GetBarSize(m_participant)); + } + + /// Moves the bottom left of the bar to \a pt + void MoveBottomTo(GG::Pt pt) { + pt.y -= Height(); + MoveTo(pt); + } + + /// Tells whether this participant is still alive + bool Alive() const { + return m_participant.current_health > 0.0; + } +private: + const ParticipantSummary& m_participant; + const BarSizer& m_sizer; + bool m_hovered; + GG::Clr m_dead_color; + GG::Clr m_wound_color; + GG::Clr m_health_color; +}; + +/// A Bar that shows the aggregate health of a side, +/// and the statuses of all its units +class SideBar : public GG::Wnd { +public: + SideBar(const CombatSummary& combat_summary, const BarSizer& sizer): + GG::Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE), + m_side_summary(combat_summary), + m_x_axis_label(0), + m_sizer(sizer){ + + GG::Clr axis_label_color = combat_summary.SideColor(); + + m_x_axis_label = new CUILabel( (boost::format( UserString("COMBAT_FLEET_HEALTH_AXIS_LABEL") ) + % combat_summary.SideName() + % static_cast<int>(combat_summary.total_current_health) + % static_cast<int>(combat_summary.total_max_health)).str(), GG::FORMAT_LEFT); + m_x_axis_label->SetColor(axis_label_color); + AttachChild(m_x_axis_label); + + m_y_axis_label = new CUILabel(UserString("COMBAT_UNIT_HEALTH_AXIS_LABEL")); + m_y_axis_label->SetColor(axis_label_color); + AttachChild(m_y_axis_label); + + m_dead_label = new CUILabel( (boost::format(UserString("COMBAT_DESTROYED_LABEL")) % m_side_summary.DestroyedUnits() ).str(), GG::FORMAT_RIGHT); + m_dead_label->SetColor(axis_label_color); + AttachChild(m_dead_label); + + MakeBars(); + } + + void MakeBars() { + for(CombatSummary::UnitSummaries::const_iterator it = m_side_summary.unit_summaries.begin(); + it != m_side_summary.unit_summaries.end(); + ++it) { + if((*it)->max_health > 0) { + m_participant_bars.push_back(new ParticipantBar(**it, m_sizer)); + AttachChild(m_participant_bars.back()); + } + } + DoLayout(); + } + + void DoLayout() { + + + GG::Pt bar_size = m_sizer.GetSideBarSize(m_side_summary.empire); + if( bar_size != Size() ) { + Resize(bar_size); + } + + GG::Pt alive_ll = GG::Pt(GG::X0, GG::Y0); + alive_ll.y += ClientHeight(); + GG::Pt dead_lr = ClientSize(); + + for(std::vector<ParticipantBar*>::const_iterator it = m_participant_bars.begin(); + it != m_participant_bars.end(); + ++it) + { + ParticipantBar* bar = *it; + bar->DoLayout(); + if(bar->Alive()) { + bar->MoveBottomTo(alive_ll); + alive_ll.x += bar->Width(); + } else { + dead_lr.x -= bar->Width(); + bar->MoveBottomTo(dead_lr); + } + } + + m_x_axis_label->MoveTo(GG::Pt(GG::X0, Height() - m_x_axis_label->Height())); + m_y_axis_label->MoveTo(GG::Pt(-m_y_axis_label->MinUsableSize().x / 2 - AXIS_WIDTH, Height()/2 - m_y_axis_label->Height()/2)); + m_dead_label->MoveTo(GG::Pt(ClientWidth() - m_dead_label->Width(), Height() - m_dead_label->Height())); + } + + void DrawArrow(GG::Pt begin, GG::Pt end) { + double head_width = 5.0; + // A vector (math) of the arrow we wish to draw + GG::Pt direction = end - begin; + double length = sqrt(1.0*(Value(direction.x)*Value(direction.x) + + Value(direction.y)*Value(direction.y))); + if (length == 0) { + return; + } + + // The point in the main line of the arrow, + // paraller to which the head ends + // \. + // \. + // --------h--> + // /. + // /. + // h is at the handle + GG::Pt handle; + // How much to move off the handle to get to + // the end point of one of the head lines + GG::X delta_x; + GG::Y delta_y; + + if(direction.x != 0 && direction.y != 0) { + // In a skewed arrow we need + // a bit of geometry to figure out the head + double x = Value(direction.x); + double y = Value(direction.y); + double normalizer = head_width / sqrt(1 + x*x / (y*y)); + delta_x = GG::X(normalizer); + delta_y = GG::Y(- x / y * normalizer); + + handle = end - GG::Pt((head_width / length) * direction.x, (head_width / length) * direction.y); + } else if (direction.x == 0) { + // Vertical arrow + handle = end; + handle.y -= boost::math::sign(Value(direction.y))*GG::Y(head_width); + delta_x = GG::X(head_width); + delta_y = GG::Y0; + } else { + //horizontal arrow + handle = end; + handle.x -= boost::math::sign(Value(direction.x)) * GG::X(head_width); + delta_x = GG::X0; + delta_y = GG::Y(head_width); + } + + GG::Pt left_head = handle; + GG::Pt right_head = handle; + + left_head.x += delta_x; + left_head.y += delta_y; + // The other line is on the opposite side of the handle + right_head.x -= delta_x; + right_head.y -= delta_y; + + GG::glColor(GG::CLR_WHITE); + glDisable(GL_TEXTURE_2D); + glLineWidth(2); + glBegin(GL_LINES); + GG::glVertex(begin); + GG::glVertex(end); + GG::glVertex(end); + GG::glVertex(left_head); + GG::glVertex(end); + GG::glVertex(right_head); + glEnd(); + glEnable(GL_TEXTURE_2D); + } + + virtual void Render() { + // Draw the axes outside th3e client area + GG::Pt begin(ClientUpperLeft().x - AXIS_WIDTH/2, ClientLowerRight().y + AXIS_HEIGHT/2); + GG::Pt x_end(ClientLowerRight().x, begin.y); + GG::Pt y_end(begin.x, ClientUpperLeft().y); + DrawArrow(begin, x_end); + DrawArrow(begin, y_end); + } + + virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr) { + GG::Wnd::SizeMove(ul, lr); + DoLayout(); + } + + GG::Pt RelativeClientUpperLeft() const { + GG::Pt ul(AXIS_WIDTH + m_y_axis_label->MinUsableSize().x + Y_AXIS_LABEL_MARGIN, GG::Y0); + return ul; + } + + virtual GG::Pt ClientUpperLeft() const { + return GG::Wnd::UpperLeft() + RelativeClientUpperLeft(); + } + + virtual GG::Pt ClientLowerRight() const { + // The axes are considered to be outside the client area. + GG::Pt lr = GG::Wnd::ClientLowerRight(); + lr.y -= AXIS_HEIGHT; + lr.y -= m_x_axis_label->Height() + X_AXIS_LABEL_MARGIN; + return lr; + } + +private: + const CombatSummary& m_side_summary; + std::vector<ParticipantBar*> m_participant_bars; + CUILabel* m_x_axis_label; + CUILabel* m_y_axis_label; + CUILabel* m_dead_label; + const BarSizer& m_sizer; + + float MaxMaxHealth() { + float max_health = -1; + for(CombatSummary::UnitSummaries::const_iterator it = m_side_summary.unit_summaries.begin(); + it != m_side_summary.unit_summaries.end(); + ++it) { + max_health = std::max(max_health, (*it)->max_health); + } + return max_health; + } +}; + +/// A Bar that contains the display options +class OptionsBar : public GG::Wnd { + struct ToggleData; +public: + boost::signals2::signal<void ()> ChangedSignal; + + OptionsBar(boost::scoped_ptr<BarSizer>& sizer): + GG::Wnd(), + m_sizer(sizer) { + m_toggles.push_back(new ToggleData(UserString("COMBAT_SUMMARY_PARTICIPANT_RELATIVE"), + UserString("COMBAT_SUMMARY_PARTICIPANT_EQUAL"), + UserString("COMBAT_SUMMARY_PARTICIPANT_RELATIVE_TIP"), + UserString("COMBAT_SUMMARY_PARTICIPANT_EQUAL_TIP"), + TOGGLE_BAR_WIDTH_PROPORTIONAL, + &m_sizer, + this + ) ); + m_toggles.push_back(new ToggleData(UserString("COMBAT_SUMMARY_HEALTH_SMOOTH"), + UserString("COMBAT_SUMMARY_HEALTH_BAR"), + UserString("COMBAT_SUMMARY_HEALTH_SMOOTH_TIP"), + UserString("COMBAT_SUMMARY_HEALTH_BAR_TIP"), + TOGGLE_BAR_HEALTH_SMOOTH, + &m_sizer, + this + ) ); + m_toggles.push_back(new ToggleData(UserString("COMBAT_SUMMARY_BAR_HEIGHT_PROPORTIONAL"), + UserString("COMBAT_SUMMARY_BAR_HEIGHT_EQUAL"), + UserString("COMBAT_SUMMARY_BAR_HEIGHT_PROPORTIONAL_TIP"), + UserString("COMBAT_SUMMARY_BAR_HEIGHT_EQUAL_TIP"), + TOGGLE_BAR_HEIGHT_PROPORTIONAL, + &m_sizer, + this + ) ); + m_toggles.push_back(new ToggleData(UserString("COMBAT_SUMMARY_GRAPH_HEIGHT_PROPORTIONAL"), + UserString("COMBAT_SUMMARY_GRAPH_HEIGHT_EQUAL"), + UserString("COMBAT_SUMMARY_GRAPH_HEIGHT_PROPORTIONAL_TIP"), + UserString("COMBAT_SUMMARY_GRAPH_HEIGHT_EQUAL_TIP"), + TOGGLE_GRAPH_HEIGHT_PROPORTIONAL, + &m_sizer, + this + ) ); + DoLayout(); + } + + virtual ~OptionsBar() { + for(std::vector<ToggleData*>::iterator it = m_toggles.begin(); it != m_toggles.end(); ++it) { + delete *it; + } + m_toggles.clear(); + } + + void DoLayout() { + boost::shared_ptr<GG::Font> cui_font = ClientUI::GetFont(); + + GG::Pt pos(GG::X(0), GG::Y(0)); + for(std::vector<ToggleData*>::iterator it = m_toggles.begin(); it != m_toggles.end(); ++it) { + ToggleData& toggle = **it; + toggle.button->Resize( GG::Pt( cui_font->TextExtent(toggle.button->Text(), GG::FORMAT_LEFT).x + OPTION_BUTTON_PADDING, OPTION_BUTTON_HEIGHT ) ); + toggle.button->MoveTo(pos); + pos.x += toggle.button->Width() + OPTION_BUTTON_PADDING; + } + } + +private: + boost::scoped_ptr<BarSizer>& m_sizer; + std::vector<ToggleData*> m_toggles; + + struct ToggleData : public boost::signals2::trackable { + typedef bool (BarSizer::*ToggleGetter)() const; + typedef void (BarSizer::*ToggleSetter)(bool value); + + std::string label_true; + std::string label_false; + std::string tip_true; + std::string tip_false; + std::string option_key; + boost::scoped_ptr<BarSizer>* sizer; + OptionsBar* parent; + CUIButton* button; + + void Toggle() { + SetValue(!GetValue()); + } + + void SetValue(bool value) { + (**sizer).Set(option_key, value); + button->SetText(value?label_true:label_false); + button->SetBrowseText(value?tip_true:tip_false); + parent->DoLayout(); + parent->ChangedSignal(); + } + + bool GetValue() const { + return (**sizer).Get(option_key); + } + + ToggleData(const std::string& label_true, const std::string& label_false, + const std::string& tip_true, const std::string& tip_false, + std::string option_key, + boost::scoped_ptr<BarSizer>* sizer, OptionsBar* parent): + label_true(label_true), label_false(label_false), + tip_true(tip_true), tip_false(tip_false), + option_key(option_key), + sizer(sizer), parent(parent), button(0) + { + button = new CUIButton("-"); + parent->AttachChild(button); + GG::Connect(button->LeftClickedSignal, &ToggleData::Toggle, this); + SetValue(GetValue()); + } + }; +}; + + +GraphicalSummaryWnd::GraphicalSummaryWnd() : + GG::Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE), + m_sizer(0), + m_options_bar(0){ + } + +void GraphicalSummaryWnd::SetLog(int log_id) { + MakeSummaries(log_id); +} + +void GraphicalSummaryWnd::DoLayout() { + GG::Pt ul(GG::X0, SIDE_BOX_MARGIN); + + if(!m_options_bar) { + m_options_bar = new OptionsBar(m_sizer); + AttachChild(m_options_bar); + GG::Connect( m_options_bar->ChangedSignal, &GraphicalSummaryWnd::DoLayout, this ); + } + + m_options_bar->Resize( GG::Pt( ClientWidth(), OPTION_BAR_HEIGHT ) ); + + GG::Pt space_for_bars = ClientSize(); + space_for_bars.y -= m_options_bar->Height(); + + m_sizer->SetAvailableSize(space_for_bars); + m_options_bar->DoLayout(); + + for(std::vector<SideBar*>::iterator it = m_side_boxes.begin(); it != m_side_boxes.end(); ++it ) { + SideBar* box = *it; + box->MoveTo(ul); + box->DoLayout(); + ul.y += box->Height() + SIDE_BOX_MARGIN; + } + + m_options_bar->MoveTo(GG::Pt(GG::X(10), ClientSize().y - m_options_bar->Height() )); +} + +void GraphicalSummaryWnd::Render() +{ + GG::Pt one(GG::X(2), GG::Y1); + AngledCornerRectangle(UpperLeft(), LowerRight() - one, ClientUI::CtrlColor(), GG::CLR_ZERO, + 8, 1, false, true); +} + + +void GraphicalSummaryWnd::MakeSummaries(int log_id) { + m_summaries.clear(); + if(!CombatLogAvailable(log_id)) { + Logger().errorStream() << "CombatReportWnd::CombatReportPrivate::MakeSummaries: Could not find log: " << log_id; + } else { + const CombatLog& log = GetCombatLog(log_id); + for( std::set<int>::const_iterator it = log.object_ids.begin(); it != log.object_ids.end(); ++it) { + TemporaryPtr<UniverseObject> object = Objects().Object(*it); + if(object) { + int owner_id = object->Owner(); + int object_id = object->ID(); + if( m_summaries.find(owner_id) == m_summaries.end() ) { + m_summaries.insert( std::map<int, CombatSummary>::value_type(owner_id,CombatSummary(owner_id)) ); + } + std::map<int, CombatParticipantState>::const_iterator it = log.participant_states.find(object_id); + if ( it != log.participant_states.end() ) { + m_summaries[owner_id].AddUnit(object_id, it->second); + } else { + Logger().errorStream() << "Participant state missing from log. Object id: " << object_id << " log id: " << log_id; + } + } + } + + for(std::map<int, CombatSummary>::iterator it = m_summaries.begin(); it != m_summaries.end(); ++it ) { + Logger().debugStream() << "MakeSummaries: empire " << it->first + << " total health: " << it->second.total_current_health + << " max health: " << it->second.total_max_health + << " units: " << it->second.unit_summaries.size(); + } + } + + GenerateGraph(); +} + +void GraphicalSummaryWnd::DeleteSideBars() { + for(std::vector<SideBar*>::iterator it = m_side_boxes.begin(); + it != m_side_boxes.end(); + ++it) { + DeleteChild(*it); + } + m_side_boxes.clear(); +} + +void GraphicalSummaryWnd::GenerateGraph() { + DeleteSideBars(); + + m_sizer.reset(new BarSizer(m_summaries, ClientSize())); + + for(std::map<int, CombatSummary>::iterator it = m_summaries.begin(); it != m_summaries.end(); ++it ) { + if ( it->second.total_max_health > EPSILON ) { + it->second.Sort(); + SideBar* box = new SideBar(it->second, *m_sizer); + m_side_boxes.push_back(box); + AttachChild(box); + } + } + DoLayout(); +} Added: trunk/FreeOrion/UI/CombatReport/GraphicalSummary.h =================================================================== --- trunk/FreeOrion/UI/CombatReport/GraphicalSummary.h (rev 0) +++ trunk/FreeOrion/UI/CombatReport/GraphicalSummary.h 2015-03-02 20:57:13 UTC (rev 7994) @@ -0,0 +1,37 @@ +#ifndef GRAPHICALSUMMARY_H +#define GRAPHICALSUMMARY_H + +#include "CombatReportData.h" + +#include <GG/Wnd.h> + +class BarSizer; +class SideBar; +class OptionsBar; + +/// Shows a graphical summary of the battle results +class GraphicalSummaryWnd : public GG::Wnd { +public: + GraphicalSummaryWnd(); + + /// Sets the log to show + void SetLog(int log_id); + + /// Position and sizes things appropriately + void DoLayout(); + + virtual void Render(); +private: + std::vector<SideBar*> m_side_boxes; + std::map<int, CombatSummary> m_summaries; + boost::scoped_ptr<BarSizer> m_sizer; + OptionsBar* m_options_bar; // Is a child window->GG handles memory + + void MakeSummaries(int log_id); + + void DeleteSideBars(); + + void GenerateGraph(); +}; + +#endif // GRAPHICALSUMMARY_H Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2015-03-02 18:32:30 UTC (rev 7993) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2015-03-02 20:57:13 UTC (rev 7994) @@ -52,7 +52,6 @@ const std::string INCOMPLETE_DESIGN = "incomplete design"; const std::string UNIVERSE_OBJECT = "universe object"; const std::string PLANET_SUITABILITY_REPORT = "planet suitability report"; - const std::string COMBAT_LOG = "combat log"; const std::string GRAPH = "data graph"; } @@ -62,12 +61,6 @@ return encyclopedia; } - std::string LinkTaggedText(const std::string& tag, const std::string& stringtable_entry) - { return "<" + tag + " " + stringtable_entry + ">" + UserString(stringtable_entry) + "</" + tag + ">"; } - - std::string LinkTaggedIDText(const std::string& tag, int id, const std::string& text) - { return "<" + tag + " " + boost::lexical_cast<std::string>(id) + ">" + text + "</" + tag + ">"; } - void GetSortedPediaDirEntires(const std::string& dir_name, std::multimap<std::string, std::pair<std::string, @@ -400,24 +393,6 @@ description += str(FlexibleFormat(desc_string) % d); } - - class ColorByOwner: public LinkDecorator { - public: - virtual std::string Decorate(const std::string& object_id_str, const std::string& content) const { - GG::Clr color = ClientUI::DefaultLinkColor(); - const Empire* empire = 0; - - // get object indicated by object_id, and then get object's owner, if any - int object_id = CastStringToInt(object_id_str); - TemporaryPtr<const UniverseObject> object = Objects().Object(object_id); - if (object && !object->Unowned()) - empire = Empires().Lookup(object->Owner()); - if (empire) - color = empire->Color(); - - return GG::RgbaTag(color) + content + "</rgba>"; - } - }; } namespace { @@ -497,8 +472,6 @@ GG::Connect(m_index_button->LeftClickedSignal, &EncyclopediaDetailPanel::OnIndex, this); GG::Connect(m_back_button->LeftClickedSignal, &EncyclopediaDetailPanel::OnBack, this); GG::Connect(m_next_button->LeftClickedSignal, &EncyclopediaDetailPanel::OnNext, this); - desc_box->SetDecorator(VarText::SHIP_ID_TAG, new ColorByOwner()); - desc_box->SetDecorator(VarText::PLANET_ID_TAG, new ColorByOwner()); m_description_box = desc_box; m_description_box->SetColor(GG::CLR_ZERO); m_description_box->SetInteriorColor(ClientUI::CtrlColor()); @@ -909,32 +882,6 @@ } } - const std::string& LinkTag(UniverseObjectType obj_type) { - switch (obj_type) { - case OBJ_SHIP: return VarText::SHIP_ID_TAG; break; - case OBJ_FLEET: return VarText::FLEET_ID_TAG; break; - case OBJ_PLANET: return VarText::PLANET_ID_TAG; break; - case OBJ_BUILDING: return VarText::BUILDING_ID_TAG; break; - case OBJ_SYSTEM: return VarText::SYSTEM_ID_TAG; break; - case OBJ_FIELD: - default: return EMPTY_STRING; - } - } - - /// Creates a link tag of the appropriate type for object_id, - /// with the content being the public name from the point of view of client_empire_id. - /// Returns not_found if object_id is not found. - std::string PublicNameLink(int client_empire_id, int object_id, std::string not_found) { - TemporaryPtr<const UniverseObject> object = GetUniverseObject(object_id); - if (object) { - const std::string& name = object->PublicName(client_empire_id); - const std::string& tag = LinkTag(object->ObjectType()); - return LinkTaggedIDText(tag, object_id, name); - } else { - return not_found; - } - } - void RefreshDetailPanelPediaTag( const std::string& item_type, const std::string& item_name, std::string& name, boost::shared_ptr<GG::Texture>& texture, boost::shared_ptr<GG::Texture>& other_texture, int& turns, @@ -2272,115 +2219,6 @@ GetUniverse().UpdateMeterEstimates(planet_id); } - std::map<int, int> CountByOwner(const std::set<int>& objects) { - std::map<int, int> objects_per_owner; - for (std::set<int>::const_iterator it = objects.begin(); it != objects.end(); ++it) { - TemporaryPtr<const UniverseObject> object = Objects().Object(*it); - if (object && ( - object->ObjectType() == OBJ_SHIP || ( - object->GetMeter(METER_POPULATION) && - object->CurrentMeterValue(METER_POPULATION) > 0.0))) - { - int owner_id = object->Owner(); - if (objects_per_owner.find(owner_id) == objects_per_owner.end()) - objects_per_owner[owner_id] = 0; - ++objects_per_owner[owner_id]; - } - } - return objects_per_owner; - } - - std::string CountsToText(const std::map<int, int>& count_per_empire, std::string delimiter = ", ") { - std::stringstream ss; - for (std::map<int,int>::const_iterator it = count_per_empire.begin(); it != count_per_empire.end(); ) { - std::string owner_string = UserString("NEUTRAL"); - if (const Empire* owner = Empires().Lookup(it->first)) - owner_string = GG::RgbaTag(owner->Color()) + owner->Name() + "</rgba>"; - ss << owner_string << ": " << it->second; - ++it; - if (it != count_per_empire.end()) - ss << delimiter; - } - return ss.str(); - } - - void RefreshDetailPanelCombatTag( const std::string& item_type, const std::string& item_name, - std::string& name, boost::shared_ptr<GG::Texture>& texture, - boost::shared_ptr<GG::Texture>& other_texture, int& turns, - float& cost, std::string& cost_units, std::string& general_type, - std::string& specific_type, std::string& detailed_description, - GG::Clr& color) - { - int log_id = boost::lexical_cast<int>(item_name); - bool available = CombatLogAvailable(log_id); - if (!available) { - Logger().errorStream() << "EncyclopediaDetailPanel::Refresh couldn't find combat log with id: " << item_name; - return; - } - const CombatLog& log = GetCombatLog(log_id); - int client_empire_id = HumanClientApp::GetApp()->EmpireID(); - - name = UserString("ENC_COMBAT_LOG"); - texture = ClientUI::GetTexture(ClientUI::ArtDir() / "/icons/sitrep/combat.png", true); - general_type = UserString("ENC_COMBAT_LOG"); - - TemporaryPtr<const System> system = GetSystem(log.system_id); - const std::string& sys_name = (system ? system->PublicName(client_empire_id) : UserString("ERROR")); - - detailed_description = str(FlexibleFormat(UserString("ENC_COMBAT_LOG_DESCRIPTION_STR")) - % LinkTaggedIDText(VarText::SYSTEM_ID_TAG, log.system_id, sys_name) - % log.turn) + "\n"; - - detailed_description += "\n"+ UserString("COMBAT_INITIAL_FORCES") + "\n" + CountsToText(CountByOwner(log.object_ids))+"\n"; - - for ( std::vector<CombatEventPtr>::const_iterator it = log.combat_events.begin(); - it != log.combat_events.end(); ++it ) - { - const BoutBeginEvent* bout_begin = dynamic_cast<BoutBeginEvent*>(it->get()); - const AttackEvent* attack = dynamic_cast<AttackEvent*>(it->get()); - const IncapacitationEvent* incapacitation = dynamic_cast<IncapacitationEvent*>(it->get()); - if ( bout_begin ) { - detailed_description += str(FlexibleFormat(UserString("ENC_ROUND_BEGIN")) % bout_begin->bout) + "\n"; - } else if ( attack ) { - std::string attacker_link = PublicNameLink(client_empire_id, attack->attacker_id, UserString("ENC_COMBAT_UNKNOWN_OBJECT")); - std::string target_link = PublicNameLink(client_empire_id, attack->target_id, UserString("ENC_COMBAT_UNKNOWN_OBJECT")); - - const std::string& template_str = UserString("ENC_COMBAT_ATTACK_STR"); - - detailed_description += str(FlexibleFormat(template_str) - % attacker_link - % target_link - % attack->damage - % attack->bout - % attack->round) + "\n"; - } else if ( incapacitation ) { - TemporaryPtr<const UniverseObject> object = GetUniverseObject(incapacitation->object_id); - std::string template_str; - if ( !object ) { - template_str = UserString("ENC_COMBAT_UNKNOWN_DESTROYED_STR"); - } else if ( object->ObjectType() == OBJ_PLANET ) { - template_str = UserString("ENC_COMBAT_PLANET_INCAPACITATED_STR"); - } else { - template_str = UserString("ENC_COMBAT_DESTROYED_STR"); - } - const std::string object_link = PublicNameLink ( client_empire_id, incapacitation->object_id, UserString ( "ENC_COMBAT_UNKNOWN_OBJECT" ) ); - - int owner_id = object?object->Owner():ALL_EMPIRES; - std::string owner_string = " "; - if ( owner_id != ALL_EMPIRES ) { - Empire* owner = Empires().Lookup(owner_id); - if ( owner ) { - owner_string += owner->Name() + " "; - } - } - - detailed_description += str(FlexibleFormat(template_str) % owner_string % object_link) + "\n"; - } - } - - detailed_description += "\n" + UserString("COMBAT_SUMMARY_DESTROYED") + "\n" + CountsToText(CountByOwner(log.destroyed_object_ids)); - } - void GetRefreshDetailPanelInfo( const std::string& item_type, const std::string& item_name, std::string& name, boost::shared_ptr<GG::Texture>& texture, boost::shared_ptr<GG::Texture>& other_texture, int& turns, @@ -2445,10 +2283,6 @@ RefreshDetailPanelSuitabilityTag( item_type, item_name, name, texture, other_texture, turns, cost, cost_units, general_type, specific_type, detailed_description, color); - } else if (item_type == COMBAT_LOG) { - RefreshDetailPanelCombatTag( item_type, item_name, - name, texture, other_texture, turns, cost, cost_units, - general_type, specific_type, detailed_description, color); } else if (item_type == TextLinker::GRAPH_TAG) { // should be handled externally... } @@ -2639,20 +2473,6 @@ AddItem(PLANET_SUITABILITY_REPORT, boost::lexical_cast<std::string>(planet_id)); } -void EncyclopediaDetailPanel::SetCombatLog(int log_id) { - int current_item_id = -1; - if (m_items_it != m_items.end()) { - try { - current_item_id = boost::lexical_cast<int>(m_items_it... [truncated message content] |
From: <geo...@us...> - 2015-03-03 11:13:27
|
Revision: 7996 http://sourceforge.net/p/freeorion/code/7996 Author: geoffthemedio Date: 2015-03-03 11:13:25 +0000 (Tue, 03 Mar 2015) Log Message: ----------- -Added MultiEdit::TextInput override, to fix issue where keyboard input to a nominally read-only MultiEdit (eg. chat display) was being added to the Wnd's text because it was being handled in Edit::TextInput which is unaware of MultiEdit flags such as GG::MULTI_READ_ONLY. -Grooming Modified Paths: -------------- trunk/FreeOrion/GG/GG/MultiEdit.h trunk/FreeOrion/GG/GG/Wnd.h trunk/FreeOrion/GG/src/Edit.cpp trunk/FreeOrion/GG/src/MultiEdit.cpp trunk/FreeOrion/GG/src/SDL/SDLGUI.cpp trunk/FreeOrion/GG/src/Wnd.cpp trunk/FreeOrion/UI/ChatWnd.cpp Modified: trunk/FreeOrion/GG/GG/MultiEdit.h =================================================================== --- trunk/FreeOrion/GG/GG/MultiEdit.h 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/GG/MultiEdit.h 2015-03-03 11:13:25 UTC (rev 7996) @@ -197,6 +197,7 @@ virtual void LDrag(const Pt& pt, const Pt& move, Flags<ModKey> mod_keys); virtual void MouseWheel(const Pt& pt, int move, Flags<ModKey> mod_keys); virtual void KeyPress(Key key, boost::uint32_t key_code_point, Flags<ModKey> mod_keys); + virtual void TextInput(const std::string* text); /** Recreates the vertical and horizontal scrolls as needed. */ void RecreateScrolls(); Modified: trunk/FreeOrion/GG/GG/Wnd.h =================================================================== --- trunk/FreeOrion/GG/GG/Wnd.h 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/GG/Wnd.h 2015-03-03 11:13:25 UTC (rev 7996) @@ -837,7 +837,7 @@ /** Respond to text input regardless of the method. Focus window only. A window may receive TextInput() messages passed up to it from its children. */ - virtual void TextInput (const std::string* text); + virtual void TextInput(const std::string* text); /** Respond to this window gaining the input focus. */ virtual void GainingFocus(); Modified: trunk/FreeOrion/GG/src/Edit.cpp =================================================================== --- trunk/FreeOrion/GG/src/Edit.cpp 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/src/Edit.cpp 2015-03-03 11:13:25 UTC (rev 7996) @@ -338,33 +338,33 @@ X xpos = ScreenToWindow(pt).x - PIXEL_MARGIN; // x coord for mouse position within text space CPSize idx = CharIndexOf(xpos); if (m_in_double_click_mode) { - std::pair<CPSize, CPSize> word_indices = - GetDoubleButtonDownDragWordIndices(idx); - if (word_indices.first == word_indices.second) { - if (idx < m_double_click_cursor_pos.first) { - m_cursor_pos.second = idx; - m_cursor_pos.first = m_double_click_cursor_pos.second; - } else if (m_double_click_cursor_pos.second < idx) { - m_cursor_pos.second = idx; - m_cursor_pos.first = m_double_click_cursor_pos.first; - } else { - m_cursor_pos = m_double_click_cursor_pos; - } + std::pair<CPSize, CPSize> word_indices = + GetDoubleButtonDownDragWordIndices(idx); + if (word_indices.first == word_indices.second) { + if (idx < m_double_click_cursor_pos.first) { + m_cursor_pos.second = idx; + m_cursor_pos.first = m_double_click_cursor_pos.second; + } else if (m_double_click_cursor_pos.second < idx) { + m_cursor_pos.second = idx; + m_cursor_pos.first = m_double_click_cursor_pos.first; } else { - if (word_indices.first <= m_double_click_cursor_pos.first) { - m_cursor_pos.second = word_indices.first; - m_cursor_pos.first = m_double_click_cursor_pos.second; - } else { - m_cursor_pos.second = word_indices.second; - m_cursor_pos.first = m_double_click_cursor_pos.first; - } + m_cursor_pos = m_double_click_cursor_pos; } } else { - // when a single-click drag occurs, move m_cursor_pos.second to where the mouse is, which selects a range of characters - m_cursor_pos.second = idx; - if (xpos < 0 || Size().x - 2 * PIXEL_MARGIN < xpos) // if we're dragging past the currently visible text - AdjustView(); + if (word_indices.first <= m_double_click_cursor_pos.first) { + m_cursor_pos.second = word_indices.first; + m_cursor_pos.first = m_double_click_cursor_pos.second; + } else { + m_cursor_pos.second = word_indices.second; + m_cursor_pos.first = m_double_click_cursor_pos.first; + } } + } else { + // when a single-click drag occurs, move m_cursor_pos.second to where the mouse is, which selects a range of characters + m_cursor_pos.second = idx; + if (xpos < 0 || Size().x - 2 * PIXEL_MARGIN < xpos) // if we're dragging past the currently visible text + AdjustView(); + } } void Edit::LButtonUp(const Pt& pt, Flags<ModKey> mod_keys) @@ -375,122 +375,125 @@ void Edit::KeyPress(Key key, boost::uint32_t key_code_point, Flags<ModKey> mod_keys) { - if (!Disabled()) { - bool shift_down = mod_keys & (MOD_KEY_LSHIFT | MOD_KEY_RSHIFT); - bool emit_signal = false; - bool numlock_on = mod_keys & MOD_KEY_NUM; + if (Disabled()) { + TextControl::KeyPress(key, key_code_point, mod_keys); + return; + } - if (!numlock_on) { - // convert keypad keys into corresponding non-number keys - switch (key) { - case GGK_KP0: key = GGK_INSERT; break; - case GGK_KP1: key = GGK_END; break; - case GGK_KP2: key = GGK_DOWN; break; - case GGK_KP3: key = GGK_PAGEDOWN; break; - case GGK_KP4: key = GGK_LEFT; break; - case GGK_KP5: break; - case GGK_KP6: key = GGK_RIGHT; break; - case GGK_KP7: key = GGK_HOME; break; - case GGK_KP8: key = GGK_UP; break; - case GGK_KP9: key = GGK_PAGEUP; break; - case GGK_KP_PERIOD: key = GGK_DELETE; break; - default: break; - } + bool shift_down = mod_keys & (MOD_KEY_LSHIFT | MOD_KEY_RSHIFT); + bool emit_signal = false; + bool numlock_on = mod_keys & MOD_KEY_NUM; + + if (!numlock_on) { + // convert keypad keys into corresponding non-number keys + switch (key) { + case GGK_KP0: key = GGK_INSERT; break; + case GGK_KP1: key = GGK_END; break; + case GGK_KP2: key = GGK_DOWN; break; + case GGK_KP3: key = GGK_PAGEDOWN; break; + case GGK_KP4: key = GGK_LEFT; break; + case GGK_KP5: break; + case GGK_KP6: key = GGK_RIGHT; break; + case GGK_KP7: key = GGK_HOME; break; + case GGK_KP8: key = GGK_UP; break; + case GGK_KP9: key = GGK_PAGEUP; break; + case GGK_KP_PERIOD: key = GGK_DELETE; break; + default: break; } - switch (key) { - case GGK_HOME: - m_first_char_shown = CP0; - if (shift_down) - m_cursor_pos.second = CP0; - else - m_cursor_pos.second = m_cursor_pos.first = CP0; - break; - case GGK_LEFT: - if (MultiSelected() && !shift_down) { - m_cursor_pos.second = m_cursor_pos.first = std::min(m_cursor_pos.first, m_cursor_pos.second); - } else if (0 < m_cursor_pos.second) { + } + + switch (key) { + case GGK_HOME: + m_first_char_shown = CP0; + if (shift_down) + m_cursor_pos.second = CP0; + else + m_cursor_pos.second = m_cursor_pos.first = CP0; + break; + case GGK_LEFT: + if (MultiSelected() && !shift_down) { + m_cursor_pos.second = m_cursor_pos.first = std::min(m_cursor_pos.first, m_cursor_pos.second); + } else if (0 < m_cursor_pos.second) { + --m_cursor_pos.second; + X extent = GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent; + while (0 < m_cursor_pos.second && extent == GetLineData()[0].char_data[Value(m_cursor_pos.second - 1)].extent) --m_cursor_pos.second; - X extent = GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent; - while (0 < m_cursor_pos.second && extent == GetLineData()[0].char_data[Value(m_cursor_pos.second - 1)].extent) - --m_cursor_pos.second; - if (!shift_down) - m_cursor_pos.first = m_cursor_pos.second; - } - AdjustView(); - break; - case GGK_RIGHT: - if (MultiSelected() && !shift_down) { - m_cursor_pos.second = m_cursor_pos.first = std::max(m_cursor_pos.first, m_cursor_pos.second); - } else if (m_cursor_pos.second < Length()) { - X extent = GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent; - while (m_cursor_pos.second < Length() && extent == GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent) - ++m_cursor_pos.second; - if (!shift_down) - m_cursor_pos.first = m_cursor_pos.second; - } - AdjustView(); - break; - case GGK_END: - if (shift_down) - m_cursor_pos.second = Length(); - else - m_cursor_pos.second = m_cursor_pos.first = Length(); - AdjustView(); - break; - case GGK_BACKSPACE: - if (MultiSelected()) { - ClearSelected(); - emit_signal = true; - } else if (0 < m_cursor_pos.first) { - m_cursor_pos.second = --m_cursor_pos.first; - Erase(0, m_cursor_pos.first); - emit_signal = true; - } - AdjustView(); - break; - case GGK_DELETE: - if (MultiSelected()) { - ClearSelected(); - emit_signal = true; - } else if (m_cursor_pos.first < Length()) { - Erase(m_cursor_pos.first); - emit_signal = true; - } - AdjustView(); - break; - case GGK_RETURN: - case GGK_KP_ENTER: - FocusUpdateSignal(Text()); - TextControl::KeyPress(key, key_code_point, mod_keys); - m_recently_edited = false; - break; - default: - // Do actual text input in TextInput. - break; + if (!shift_down) + m_cursor_pos.first = m_cursor_pos.second; } - if (emit_signal) - EditedSignal(Text()); - } else { + AdjustView(); + break; + case GGK_RIGHT: + if (MultiSelected() && !shift_down) { + m_cursor_pos.second = m_cursor_pos.first = std::max(m_cursor_pos.first, m_cursor_pos.second); + } else if (m_cursor_pos.second < Length()) { + X extent = GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent; + while (m_cursor_pos.second < Length() && extent == GetLineData()[0].char_data[Value(m_cursor_pos.second)].extent) + ++m_cursor_pos.second; + if (!shift_down) + m_cursor_pos.first = m_cursor_pos.second; + } + AdjustView(); + break; + case GGK_END: + if (shift_down) + m_cursor_pos.second = Length(); + else + m_cursor_pos.second = m_cursor_pos.first = Length(); + AdjustView(); + break; + case GGK_BACKSPACE: + if (MultiSelected()) { + ClearSelected(); + emit_signal = true; + } else if (0 < m_cursor_pos.first) { + m_cursor_pos.second = --m_cursor_pos.first; + Erase(0, m_cursor_pos.first); + emit_signal = true; + } + AdjustView(); + break; + case GGK_DELETE: + if (MultiSelected()) { + ClearSelected(); + emit_signal = true; + } else if (m_cursor_pos.first < Length()) { + Erase(m_cursor_pos.first); + emit_signal = true; + } + AdjustView(); + break; + case GGK_RETURN: + case GGK_KP_ENTER: + FocusUpdateSignal(Text()); TextControl::KeyPress(key, key_code_point, mod_keys); + m_recently_edited = false; + break; + default: + // Do actual text input in TextInput. + break; } + + if (emit_signal) + EditedSignal(Text()); } -void Edit::TextInput (const std::string* text) { - if (text == NULL) { +void Edit::TextInput(const std::string* text) { + if (Disabled()) { + TextControl::TextInput(text); return; } - if (MultiSelected()) { - ClearSelected(); - } - Insert (0, m_cursor_pos.first, *text); + + if (!text || !Interactive()) + return; + + AcceptPastedText(*text); + m_cursor_pos.second = ++m_cursor_pos.first; - if (LastVisibleChar() <= m_cursor_pos.first) { + if (LastVisibleChar() <= m_cursor_pos.first) AdjustView(); - } - EditedSignal(Text()); } - void Edit::GainingFocus() { m_recently_edited = false; } Modified: trunk/FreeOrion/GG/src/MultiEdit.cpp =================================================================== --- trunk/FreeOrion/GG/src/MultiEdit.cpp 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/src/MultiEdit.cpp 2015-03-03 11:13:25 UTC (rev 7996) @@ -974,6 +974,18 @@ EditedSignal(Text()); } +void MultiEdit::TextInput(const std::string* text) { + if (Disabled()) { + TextControl::TextInput(text); + return; + } + + if (!text || !Interactive() || m_style & MULTI_READ_ONLY) + return; + + Edit::TextInput(text); +} + void MultiEdit::RecreateScrolls() { delete m_vscroll; Modified: trunk/FreeOrion/GG/src/SDL/SDLGUI.cpp =================================================================== --- trunk/FreeOrion/GG/src/SDL/SDLGUI.cpp 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/src/SDL/SDLGUI.cpp 2015-03-03 11:13:25 UTC (rev 7996) @@ -686,13 +686,16 @@ send_to_gg = true; gg_event = (event.type == SDL_KEYDOWN) ? KEYPRESS : KEYRELEASE; break; + case SDL_TEXTINPUT: - RelayTextInput(event.text, mouse_pos); + RelayTextInput(event.text, mouse_pos); // calls HandleGGEvent repeated to process break; + case SDL_MOUSEMOTION: send_to_gg = true; gg_event = MOUSEMOVE; break; + case SDL_MOUSEBUTTONDOWN: send_to_gg = true; switch (event.button.button) { @@ -702,6 +705,7 @@ } mod_keys = GetSDLModKeys(); break; + case SDL_MOUSEBUTTONUP: send_to_gg = true; switch (event.button.button) { @@ -711,19 +715,21 @@ } mod_keys = GetSDLModKeys(); break; + case SDL_MOUSEWHEEL: send_to_gg = true; gg_event = MOUSEWHEEL; mouse_rel = Pt(X(event.wheel.x), Y(event.wheel.y)); mod_keys = GetSDLModKeys(); break; + case SDL_WINDOWEVENT: send_to_gg = false; switch (event.window.event) { case SDL_WINDOWEVENT_SIZE_CHANGED: // Alt-tabbing and other things give dubious resize events while in fullscreen mode. // ignore them - if(!m_fullscreen) { + if (!m_fullscreen) { m_app_width = X(event.window.data1); m_app_height = Y(event.window.data2); } @@ -735,7 +741,7 @@ case SDL_WINDOWEVENT_RESIZED: // Alt-tabbing and other things give dubious resize events while in fullscreen mode. // ignore them - if(!m_fullscreen) { + if (!m_fullscreen) { WindowResizedSignal (X (event.window.data1), Y (event.window.data2)); } break; @@ -843,7 +849,8 @@ } } -std::vector<std::string> SDLGUI::GetSupportedResolutions() const { +std::vector<std::string> SDLGUI::GetSupportedResolutions() const +{ std::vector<std::string> mode_vec; unsigned valid_mode_count = SDL_GetNumDisplayModes(m_display_id); @@ -865,12 +872,11 @@ return mode_vec; } -Pt SDLGUI::GetDefaultResolution (int display_id) { - return GetDefaultResolutionStatic(display_id); -} +Pt SDLGUI::GetDefaultResolution (int display_id) +{ return GetDefaultResolutionStatic(display_id); } -Pt SDLGUI::GetDefaultResolutionStatic (int display_id) { - +Pt SDLGUI::GetDefaultResolutionStatic(int display_id) +{ // Must initialize sdl here to be able to query the default screen resolution if (!SDL_WasInit(SDL_INIT_VIDEO)) { if(SDL_Init(SDL_INIT_VIDEO) < 0) { @@ -885,21 +891,22 @@ return resolution; } - -void SDLGUI::RelayTextInput (const SDL_TextInputEvent& text, GG::Pt mouse_pos) { +void SDLGUI::RelayTextInput(const SDL_TextInputEvent& text, GG::Pt mouse_pos) +{ const char *current = text.text; const char *last = current; - //text is zero terminated, find the end - while (*last) { - ++last; - } - std::string text_string (current, last); - while (current != last) { - HandleGGEvent(TEXTINPUT, GGK_UNKNOWN, utf8::next (current, last), Flags<ModKey>(), mouse_pos, Pt (X0, Y0), &text_string); - } + // text is zero terminated, find the end + while (*last) + { ++last; } + std::string text_string(current, last); + + // pass each utf-8 character as a separate event + while (current != last) + { HandleGGEvent(TEXTINPUT, GGK_UNKNOWN, utf8::next(current, last), Flags<ModKey>(), mouse_pos, Pt (X0, Y0), &text_string); } } -void SDLGUI::ResetFramebuffer() { +void SDLGUI::ResetFramebuffer() +{ m_framebuffer.reset(NULL); if (m_fake_mode_change && m_fullscreen) { try { @@ -911,11 +918,11 @@ } } -void SDLGUI::Enter2DMode() { - Enter2DModeImpl(Value(AppWidth()), Value(AppHeight())); -} +void SDLGUI::Enter2DMode() +{ Enter2DModeImpl(Value(AppWidth()), Value(AppHeight())); } -void SDLGUI::Exit2DMode() { +void SDLGUI::Exit2DMode() +{ glMatrixMode(GL_MODELVIEW); glPopMatrix(); @@ -925,6 +932,5 @@ glPopAttrib(); } -bool SDLGUI::FramebuffersAvailable() const { - return GLEW_EXT_framebuffer_object && GLEW_EXT_packed_depth_stencil; -} +bool SDLGUI::FramebuffersAvailable() const +{ return GLEW_EXT_framebuffer_object && GLEW_EXT_packed_depth_stencil; } Modified: trunk/FreeOrion/GG/src/Wnd.cpp =================================================================== --- trunk/FreeOrion/GG/src/Wnd.cpp 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/GG/src/Wnd.cpp 2015-03-03 11:13:25 UTC (rev 7996) @@ -1010,16 +1010,18 @@ void Wnd::KeyRelease(Key key, boost::uint32_t key_code_point, Flags<ModKey> mod_keys) { if (!Interactive()) ForwardEventToParent(); } -void Wnd::TextInput (const std::string* text) +void Wnd::TextInput(const std::string* text) { if (!Interactive()) ForwardEventToParent(); } +void Wnd::GainingFocus() +{} -void Wnd::GainingFocus() {} +void Wnd::LosingFocus() +{} -void Wnd::LosingFocus() {} +void Wnd::TimerFiring(unsigned int ticks, Timer* timer) +{} -void Wnd::TimerFiring(unsigned int ticks, Timer* timer) {} - bool Wnd::EventFilter(Wnd* w, const WndEvent& event) { return false; } Modified: trunk/FreeOrion/UI/ChatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ChatWnd.cpp 2015-03-03 11:08:40 UTC (rev 7995) +++ trunk/FreeOrion/UI/ChatWnd.cpp 2015-03-03 11:13:25 UTC (rev 7996) @@ -270,7 +270,7 @@ // MessageWnd // //////////////////// MessageWnd::MessageWnd(GG::X x, GG::Y y, GG::X w, GG::Y h) : - CUIWnd(UserString("MESSAGES_PANEL_TITLE"), x, y, w, h, GG::INTERACTIVE | GG::DRAGABLE | GG::ONTOP | GG::RESIZABLE | CLOSABLE | PINABLE ), + CUIWnd(UserString("MESSAGES_PANEL_TITLE"), x, y, w, h, GG::INTERACTIVE | GG::DRAGABLE | GG::ONTOP | GG::RESIZABLE | CLOSABLE | PINABLE), m_display(0), m_edit(0), m_display_show_time(0), |
From: <geo...@us...> - 2015-03-03 14:11:29
|
Revision: 8001 http://sourceforge.net/p/freeorion/code/8001 Author: geoffthemedio Date: 2015-03-03 14:11:22 +0000 (Tue, 03 Mar 2015) Log Message: ----------- Made EmpireManager constructor private, and added friend classes to ClientApp and ServerApp, to prevent accidental construction of a temporary EmpireManager when it is intended to get the local app's main one. Modified Paths: -------------- trunk/FreeOrion/Empire/EmpireManager.cpp trunk/FreeOrion/Empire/EmpireManager.h trunk/FreeOrion/python/PythonUniverseWrapper.cpp Modified: trunk/FreeOrion/Empire/EmpireManager.cpp =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.cpp 2015-03-03 13:15:02 UTC (rev 8000) +++ trunk/FreeOrion/Empire/EmpireManager.cpp 2015-03-03 14:11:22 UTC (rev 8001) @@ -27,6 +27,9 @@ diplo_status(status) {} +EmpireManager::EmpireManager() +{} + EmpireManager::~EmpireManager() { Clear(); } Modified: trunk/FreeOrion/Empire/EmpireManager.h =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.h 2015-03-03 13:15:02 UTC (rev 8000) +++ trunk/FreeOrion/Empire/EmpireManager.h 2015-03-03 14:11:22 UTC (rev 8001) @@ -100,6 +100,8 @@ mutable DiploSignalType DiplomaticMessageChangedSignal; private: + EmpireManager(); + /** Adds the given empire to the manager. */ void InsertEmpire(Empire* empire); void GetDiplomaticMessagesToSerialize(std::map<std::pair<int, int>, DiplomaticMessage>& messages, @@ -110,6 +112,9 @@ std::map<std::pair<int, int>, DiplomaticStatus> m_empire_diplomatic_statuses; std::map<std::pair<int, int>, DiplomaticMessage>m_diplomatic_messages; + friend class ClientApp; + friend class ServerApp; + friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-03-03 13:15:02 UTC (rev 8000) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2015-03-03 14:11:22 UTC (rev 8001) @@ -266,13 +266,13 @@ .def(boost::python::map_indexing_suite<Ship::PartMeterMap>()) ; - /////////////// - // Meter // /////////////// - class_<Meter, noncopyable>("meter", no_init) - .add_property("current", &Meter::Current) - .add_property("initial", &Meter::Initial) - .add_property("dump", &Meter::Dump) + // Meter // + /////////////// + class_<Meter, noncopyable>("meter", no_init) + .add_property("current", &Meter::Current) + .add_property("initial", &Meter::Initial) + .add_property("dump", &Meter::Dump) ; //////////////////// |
From: <geo...@us...> - 2015-03-04 10:28:00
|
Revision: 8010 http://sourceforge.net/p/freeorion/code/8010 Author: geoffthemedio Date: 2015-03-04 10:27:52 +0000 (Wed, 04 Mar 2015) Log Message: ----------- Added some extra planet-type related objectwnd columns, similar to Dilvish's suggestion, but using the existing userstring lookup string case mechanism to avoid needed to add another direct string valueref property. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-04 02:26:06 UTC (rev 8009) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-04 10:27:52 UTC (rev 8010) @@ -105,9 +105,12 @@ col_types[UserStringNop("LAST_TURN_ACTIVE_IN_BATTLE")] =StringCastedValueRef<int>("LastTurnActiveInBattle"); col_types[UserStringNop("SIZE_AS_DOUBLE")] = StringCastedValueRef<double>("SizeAsDouble"); - col_types[UserStringNop("DISTANCE_FROM_ORIGINAL_TYPE")]=StringCastedValueRef<double>("DistanceFromOriginalType"); col_types[UserStringNop("NEXT_TURN_POP_GROWTH")] = StringCastedValueRef<double>("NextTurnPopGrowth"); + col_types[UserStringNop("DISTANCE_FROM_ORIGINAL_TYPE")]=StringCastedValueRef<double>("DistanceFromOriginalType"); + col_types[UserStringNop("PLANET_TYPE")] = UserStringCastedValueRef<PlanetType>("PlanetType"); + col_types[UserStringNop("ORIGINAL_TYPE")] = UserStringCastedValueRef<PlanetType>("OriginalType"); + col_types[UserStringNop("NEXT_TOWARDS_ORIGINAL_TYPE")]= UserStringCastedValueRef<PlanetType>("NextCloserToOriginalPlanetType"); for (MeterType meter = MeterType(0); meter <= METER_STARLANE_SPEED; Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-03-04 02:26:06 UTC (rev 8009) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-03-04 10:27:52 UTC (rev 8010) @@ -4034,6 +4034,15 @@ DISTANCE_FROM_ORIGINAL_TYPE Distance From Original Planet Type +PLANET_TYPE +Planet Type + +ORIGINAL_TYPE +Original Planet Type + +NEXT_TOWARDS_ORIGINAL_TYPE +Next Towards Original Type + NEXT_TURN_POP_GROWTH Next Turn Population Growth |
From: <geo...@us...> - 2015-03-04 21:54:43
|
Revision: 8015 http://sourceforge.net/p/freeorion/code/8015 Author: geoffthemedio Date: 2015-03-04 21:54:40 +0000 (Wed, 04 Mar 2015) Log Message: ----------- Added some additional userstring stringcasted objectwnd columns. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-04 20:09:05 UTC (rev 8014) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-04 21:54:40 UTC (rev 8015) @@ -112,6 +112,10 @@ col_types[UserStringNop("ORIGINAL_TYPE")] = UserStringCastedValueRef<PlanetType>("OriginalType"); col_types[UserStringNop("NEXT_TOWARDS_ORIGINAL_TYPE")]= UserStringCastedValueRef<PlanetType>("NextCloserToOriginalPlanetType"); + col_types[UserStringNop("PLANET_SIZE")] = UserStringCastedValueRef<PlanetSize>("PlanetSize"); + col_types[UserStringNop("PLANET_ENVIRONMENT")] = UserStringCastedValueRef<PlanetEnvironment>("PlanetEnvironment"); + //col_types[UserStringNop("OBJECT_TYPE2")] = UserStringCastedValueRef<UniverseObjectType>("ObjectType"); + col_types[UserStringNop("STAR_TYPE")] = UserStringCastedValueRef<StarType>("StarType"); for (MeterType meter = MeterType(0); meter <= METER_STARLANE_SPEED; meter = MeterType(meter + 1)) Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-03-04 20:09:05 UTC (rev 8014) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-03-04 21:54:40 UTC (rev 8015) @@ -4043,6 +4043,15 @@ NEXT_TOWARDS_ORIGINAL_TYPE Next Towards Original Planet Type +PLANET_SIZE +Planet Size + +PLANET_ENVIRONMENT +Planet Environment + +STAR_TYPE +Star Type + NEXT_TURN_POP_GROWTH Next Turn Population Growth |
From: <geo...@us...> - 2015-03-04 22:48:06
|
Revision: 8016 http://sourceforge.net/p/freeorion/code/8016 Author: geoffthemedio Date: 2015-03-04 22:48:04 +0000 (Wed, 04 Mar 2015) Log Message: ----------- Edited patch by vincele moving filename to path conversion code into a function. Modified Paths: -------------- trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/client/human/chmain.cpp trunk/FreeOrion/server/SaveLoad.cpp trunk/FreeOrion/util/Directories.cpp trunk/FreeOrion/util/Directories.h trunk/FreeOrion/util/StringTable.cpp Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -108,14 +108,7 @@ // putting this in try-catch block prevents crash with error output along the lines of: // main() caught exception(std::exception): boost::filesystem::path: invalid name ":" in path: ":\FreeOrion\default" try { -#if defined(_WIN32) - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(file.begin(), file.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(file); -#endif + fs::path path = FilenameToPath(file); return boost::algorithm::ends_with(file, STRINGTABLE_FILE_SUFFIX) && fs::exists(path) && !fs::is_directory(path); } catch (std::exception ex) { @@ -127,14 +120,7 @@ // putting this in try-catch block prevents crash with error output along the lines of: // main() caught exception(std::exception): boost::filesystem::path: invalid name ":" in path: ":\FreeOrion\default" try { -#if defined(_WIN32) - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(file.begin(), file.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(file); -#endif + fs::path path = FilenameToPath(file); return boost::algorithm::ends_with(file, FONT_FILE_SUFFIX) && fs::exists(path) && !fs::is_directory(path); } catch (std::exception ex) { @@ -146,14 +132,7 @@ // putting this in try-catch block prevents crash with error output along the lines of: // main() caught exception(std::exception): boost::filesystem::path: invalid name ":" in path: ":\FreeOrion\default" try { -#if defined(_WIN32) - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(file.begin(), file.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(file); -#endif + fs::path path = FilenameToPath(file); return boost::algorithm::ends_with(file, MUSIC_FILE_SUFFIX) && fs::exists(path) && !fs::is_directory(path); } catch (std::exception ex) { @@ -165,14 +144,7 @@ // putting this in try-catch block prevents crash with error output along the lines of: // main() caught exception(std::exception): boost::filesystem::path: invalid name ":" in path: ":\FreeOrion\default" try { -#if defined(_WIN32) - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(file.begin(), file.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(file); -#endif + fs::path path = FilenameToPath(file); return boost::algorithm::ends_with(file, SOUND_FILE_SUFFIX) && fs::exists(path) && !fs::is_directory(path); } catch (std::exception ex) { @@ -184,14 +156,7 @@ // putting this in try-catch block prevents crash with error output along the lines of: // main() caught exception(std::exception): boost::filesystem::path: invalid name ":" in path: ":\FreeOrion\default" try { -#if defined(_WIN32) - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(file.begin(), file.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(file); -#endif + fs::path path = FilenameToPath(file); return fs::exists(path) && fs::is_directory(path); } catch (std::exception ex) { } Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -555,14 +555,7 @@ Logger().debugStream() << "HumanClientApp::LoadSinglePlayerGame"; if (!filename.empty()) { -#if defined(FREEORION_WIN32) - boost::filesystem::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - boost::filesystem::path file_path(file_name_native); -#else - boost::filesystem::path file_path(filename); -#endif - if (!exists(file_path)) { + if (!exists(FilenameToPath(filename))) { std::string msg = "HumanClientApp::LoadSinglePlayerGame() given a nonexistent file \"" + filename + "\" to load; aborting."; Logger().fatalStream() << msg; Modified: trunk/FreeOrion/client/human/chmain.cpp =================================================================== --- trunk/FreeOrion/client/human/chmain.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/client/human/chmain.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -156,16 +156,8 @@ !boost::filesystem::exists(GetResourceDir() / "data" / "art" / "misc" / "missing.png")) { Logger().debugStream() << "Default Resources directory missing or does not contain expected files. Cannot start game."; - - std::string path_string; -#if defined(FREEORION_WIN32) - boost::filesystem::path::string_type path_string_native = GetResourceDir().native(); - utf8::utf16to8(path_string_native.begin(), path_string_native.end(), std::back_inserter(path_string)); -#else - path_string = GetResourceDir().string(); -#endif throw std::runtime_error("Unable to load game resources at default location: " + - path_string + " : Install may be broken."); + PathString(GetResourceDir()) + " : Install may be broken."); } } Modified: trunk/FreeOrion/server/SaveLoad.cpp =================================================================== --- trunk/FreeOrion/server/SaveLoad.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/server/SaveLoad.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -108,14 +108,7 @@ CompileSaveGamePreviewData(server_save_game_data, player_save_game_data, empire_save_game_data, save_preview_data); try { -#ifdef FREEORION_WIN32 - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(filename); -#endif + fs::path path = FilenameToPath(filename); // A relative path should be relative to the save directory. if (path.is_relative()) { path = GetSaveDir()/path; @@ -185,14 +178,7 @@ universe.Clear(); try { -#ifdef FREEORION_WIN32 - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(filename); -#endif + const fs::path path = FilenameToPath(filename); fs::ifstream ifs(path, std::ios_base::binary); if (!ifs) @@ -274,14 +260,7 @@ SaveGamePreviewData ignored_save_preview_data; try { -#ifdef FREEORION_WIN32 - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(filename); -#endif + fs::path path = FilenameToPath(filename); fs::ifstream ifs(path, std::ios_base::binary); if (!ifs) @@ -318,14 +297,7 @@ GalaxySetupData ignored_galaxy_setup_data; try { -#ifdef FREEORION_WIN32 - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(filename); -#endif + fs::path path = FilenameToPath(filename); fs::ifstream ifs(path, std::ios_base::binary); if (!ifs) @@ -368,14 +340,7 @@ GalaxySetupData ignored_galaxy_setup_data; try { -#ifdef FREEORION_WIN32 - // convert UTF-8 file name to UTF-16 - fs::path::string_type file_name_native; - utf8::utf8to16(filename.begin(), filename.end(), std::back_inserter(file_name_native)); - fs::path path = fs::path(file_name_native); -#else - fs::path path = fs::path(filename); -#endif + fs::path path = FilenameToPath(filename); Logger().debugStream() << "LoadEmpireSaveGameData: filename: " << filename << " path:" << path; fs::ifstream ifs(path, std::ios_base::binary); Modified: trunk/FreeOrion/util/Directories.cpp =================================================================== --- trunk/FreeOrion/util/Directories.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/util/Directories.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -269,16 +269,8 @@ void InitBinDir(const std::string& argv0) { try { -#if defined(FREEORION_WIN32) - // convert UTF-8 to UTF-16 - boost::filesystem::path::string_type binary_native; - utf8::utf8to16(argv0.begin(), argv0.end(), std::back_inserter(binary_native)); - fs::path binary_file = fs::system_complete(fs::path(binary_native)); -#else - fs::path binary_file = fs::system_complete(fs::path(argv0)); -#endif + fs::path binary_file = fs::system_complete(FilenameToPath(argv0)); bin_dir = binary_file.branch_path(); - } catch (fs::filesystem_error err) { bin_dir = fs::initial_path(); } @@ -289,25 +281,15 @@ #endif const fs::path GetResourceDir() { - // if resource dir option has been set, use specified location. otherwise, + // if resource dir option has been set, use specified location. otherwise, // use default location std::string options_resource_dir = GetOptionsDB().Get<std::string>("resource-dir"); -#if defined(FREEORION_WIN32) - // convert UTF-8 directory string to UTF-16 - boost::filesystem::path::string_type directory_native; - utf8::utf8to16(options_resource_dir.begin(), options_resource_dir.end(), std::back_inserter(directory_native)); - // verify directory validity. if not, try again with default - if (fs::is_directory(fs::path(directory_native)) && fs::exists(fs::path(directory_native))) - return fs::path(directory_native); - options_resource_dir = GetOptionsDB().GetDefault<std::string>("resource-dir"); - utf8::utf8to16(options_resource_dir.begin(), options_resource_dir.end(), std::back_inserter(directory_native)); - return fs::path(directory_native); -#else - if (options_resource_dir.empty() || !fs::is_directory(fs::path(options_resource_dir)) || !fs::exists(fs::path(options_resource_dir))) - return fs::path(GetOptionsDB().GetDefault<std::string>("resource-dir")); + fs::path dir = FilenameToPath(options_resource_dir); + + if (options_resource_dir.empty() || !fs::is_directory(dir) || !fs::exists(dir)) + return FilenameToPath(GetOptionsDB().GetDefault<std::string>("resource-dir")); else - return fs::path(options_resource_dir); -#endif + return dir; } const fs::path GetConfigPath() { @@ -321,14 +303,7 @@ std::string options_save_dir = GetOptionsDB().Get<std::string>("save-dir"); if (options_save_dir.empty()) options_save_dir = GetOptionsDB().GetDefault<std::string>("save-dir"); -#if defined(FREEORION_WIN32) - // convert UTF-8 directory string to UTF-16 - boost::filesystem::path::string_type directory_native; - utf8::utf8to16(options_save_dir.begin(), options_save_dir.end(), std::back_inserter(directory_native)); - return fs::path(directory_native); -#else - return fs::path(options_save_dir); -#endif + return FilenameToPath(options_save_dir); } fs::path RelativePath(const fs::path& from, const fs::path& to) { @@ -363,6 +338,17 @@ #endif } +const fs::path FilenameToPath(const std::string& path_str) { +#if defined(FREEORION_WIN32) + // convert UTF-8 directory string to UTF-16 + boost::filesystem::path::string_type directory_native; + utf8::utf8to16(path_str.begin(), path_str.end(), std::back_inserter(directory_native)); + return fs::path(directory_native); +#else + return fs::path(path_str); +#endif +} + std::string FilenameTimestamp() { boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%Y%m%d_%H%M%S"); std::stringstream date_stream; Modified: trunk/FreeOrion/util/Directories.h =================================================================== --- trunk/FreeOrion/util/Directories.h 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/util/Directories.h 2015-03-04 22:48:04 UTC (rev 8016) @@ -21,6 +21,8 @@ * <li>This directory is the only one that can be considered writable!</ul> */ FO_COMMON_API const boost::filesystem::path GetUserDir(); +FO_COMMON_API const boost::filesystem::path FilenameToPath(const std::string& path_str); + /** Returns the directory that contains all game content files, such as string * table files, in-game tech, building, special, etc. definition files, and * graphics files. */ Modified: trunk/FreeOrion/util/StringTable.cpp =================================================================== --- trunk/FreeOrion/util/StringTable.cpp 2015-03-04 21:54:40 UTC (rev 8015) +++ trunk/FreeOrion/util/StringTable.cpp 2015-03-04 22:48:04 UTC (rev 8016) @@ -1,6 +1,7 @@ #include "StringTable.h" #include "Logger.h" +#include "Directories.h" #include <GG/utf8/checked.h> @@ -61,15 +62,8 @@ } } - void StringTable_::Load() { -#ifndef FREEORION_WIN32 - boost::filesystem::path path(m_filename); -#else - boost::filesystem::path::string_type native_filename; - utf8::utf8to16(m_filename.begin(), m_filename.end(), std::back_inserter(native_filename)); - boost::filesystem::path path(native_filename); -#endif + boost::filesystem::path path = FilenameToPath(m_filename); std::string file_contents; bool read_success = read_file(path, file_contents); |
From: <dil...@us...> - 2015-03-14 22:58:04
|
Revision: 8037 http://sourceforge.net/p/freeorion/code/8037 Author: dilvish-fo Date: 2015-03-14 22:58:02 +0000 (Sat, 14 Mar 2015) Log Message: ----------- made multiplayer galaxy setup AI starting species selection deterministic if galaxy seed is left blank, to faciliate AI testing Modified Paths: -------------- trunk/FreeOrion/server/ServerFSM.cpp trunk/FreeOrion/universe/Species.cpp trunk/FreeOrion/universe/Species.h Modified: trunk/FreeOrion/server/ServerFSM.cpp =================================================================== --- trunk/FreeOrion/server/ServerFSM.cpp 2015-03-14 22:54:23 UTC (rev 8036) +++ trunk/FreeOrion/server/ServerFSM.cpp 2015-03-14 22:58:02 UTC (rev 8037) @@ -443,7 +443,10 @@ player_setup_data.m_client_type = client_type; player_setup_data.m_empire_name = GenerateEmpireName(m_lobby_data->m_players); player_setup_data.m_empire_color = GetUnusedEmpireColour(m_lobby_data->m_players); - player_setup_data.m_starting_species_name = sm.RandomPlayableSpeciesName(); + if (m_lobby_data->m_seed!="") + player_setup_data.m_starting_species_name = sm.RandomPlayableSpeciesName(); + else + player_setup_data.m_starting_species_name = sm.SequentialPlayableSpeciesName(player_id); // after setting all details, push into lobby data m_lobby_data->m_players.push_back(std::make_pair(player_id, player_setup_data)); @@ -593,8 +596,12 @@ psd.m_player_name = UserString("AI_PLAYER") + "_" + boost::lexical_cast<std::string>(AI_count++); if (psd.m_empire_name.empty()) psd.m_empire_name = GenerateEmpireName(m_lobby_data->m_players); - if (psd.m_starting_species_name.empty()) - psd.m_starting_species_name = GetSpeciesManager().RandomPlayableSpeciesName(); + if (psd.m_starting_species_name.empty()) { + if (m_lobby_data->m_seed!="") + psd.m_starting_species_name = GetSpeciesManager().RandomPlayableSpeciesName(); + else + psd.m_starting_species_name = GetSpeciesManager().SequentialPlayableSpeciesName(AI_count); + } } else if (psd.m_client_type == Networking::CLIENT_TYPE_HUMAN_PLAYER) { if (psd.m_empire_color == GG::Clr(0, 0, 0, 0)) Modified: trunk/FreeOrion/universe/Species.cpp =================================================================== --- trunk/FreeOrion/universe/Species.cpp 2015-03-14 22:54:23 UTC (rev 8036) +++ trunk/FreeOrion/universe/Species.cpp 2015-03-14 22:58:02 UTC (rev 8037) @@ -382,6 +382,18 @@ return it->first; } +const std::string& SpeciesManager::SequentialPlayableSpeciesName(int id) const { + if (NumPlayableSpecies() <= 0) + return EMPTY_STRING; + + int species_idx = id % NumPlayableSpecies(); + DebugLogger() << "SpeciesManager::SequentialPlayableSpeciesName has " << NumPlayableSpecies() << " and is given id " << id << " yielding index " << species_idx; + playable_iterator it = playable_begin(); + std::advance(it, species_idx); + return it->first; +} + + void SpeciesManager::ClearSpeciesHomeworlds() { for (std::map<std::string, Species*>::iterator it = m_species.begin(); it != m_species.end(); ++it) it->second->SetHomeworlds(std::set<int>()); Modified: trunk/FreeOrion/universe/Species.h =================================================================== --- trunk/FreeOrion/universe/Species.h 2015-03-14 22:54:23 UTC (rev 8036) +++ trunk/FreeOrion/universe/Species.h 2015-03-14 22:58:02 UTC (rev 8037) @@ -242,6 +242,7 @@ /** returns the name of a playable species in this manager, or an empty * string if there are no playable species. */ const std::string& RandomPlayableSpeciesName() const; + const std::string& SequentialPlayableSpeciesName(int id) const; /** returns a map from species name to a set of object IDs that are the * homeworld(s) of that species in the current game. */ |
From: <dil...@us...> - 2015-03-15 01:34:31
|
Revision: 8038 http://sourceforge.net/p/freeorion/code/8038 Author: dilvish-fo Date: 2015-03-15 01:34:23 +0000 (Sun, 15 Mar 2015) Log Message: ----------- added three condition choices to the ObjectListWnd, specifically directed to helping players locate desirable planets. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-14 22:58:02 UTC (rev 8037) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-15 01:34:23 UTC (rev 8038) @@ -39,6 +39,8 @@ default_columns_widths.push_back(std::make_pair("OBJECT_TYPE", 5*12)); default_columns_widths.push_back(std::make_pair("OWNER", 10*12)); default_columns_widths.push_back(std::make_pair("SPECIES", 8*12)); + default_columns_widths.push_back(std::make_pair("PLANET_TYPE", 8*12)); + default_columns_widths.push_back(std::make_pair("SIZE_AS_DOUBLE", 8*12)); for (unsigned int i = default_columns_widths.size(); i < NUM_COLUMNS; ++i) default_columns_widths.push_back(std::make_pair("", 8*12)); // arbitrary default width @@ -209,6 +211,9 @@ const std::string FOCUSTYPE_CONDITION(UserStringNop("CONDITION_FOCUSTYPE")); const std::string STARTYPE_CONDITION(UserStringNop("CONDITION_STARTYPE")); const std::string METERVALUE_CONDITION(UserStringNop("CONDITION_METERVALUE")); + const std::string HASGROWTHSPECIAL_CONDITION(UserStringNop("CONDITION_HAS_GROWTH_SPECIAL")); + const std::string GGWITHPTYPE_CONDITION(UserStringNop("CONDITION_PTYPE_W_GG")); + const std::string ASTWITHPTYPE_CONDITION(UserStringNop("CONDITION_PTYPE_W_AST")); template <class enumT> ValueRef::ValueRefBase<enumT>* CopyEnumValueRef(const ValueRef::ValueRefBase<enumT>* const value_ref) { @@ -218,20 +223,8 @@ return new ValueRef::Constant<enumT>(enumT(-1)); } - Condition::ConditionBase* CopyCondition(const Condition::ConditionBase* const condition) { - if (dynamic_cast<const Condition::Source* const>(condition)) { - return new Condition::Source(); + std::map<std::string, std::string> object_list_cond_description_map; - } else if (dynamic_cast<const Condition::Homeworld* const>(condition)) { - return new Condition::Homeworld(); - - } else if (dynamic_cast<const Condition::Building* const>(condition)) { - - } - - return new Condition::All(); - } - const std::string& ConditionClassName(const Condition::ConditionBase* const condition) { if (dynamic_cast<const Condition::All* const>(condition)) return ALL_CONDITION; @@ -281,7 +274,12 @@ return STARTYPE_CONDITION; else if (dynamic_cast<const Condition::MeterValue* const>(condition)) return METERVALUE_CONDITION; - else return EMPTY_STRING; + + std::map< std::string, std::string >::iterator desc_it = object_list_cond_description_map.find(condition->Description()); + if (desc_it != object_list_cond_description_map.end()) + return desc_it->second; + + return EMPTY_STRING; } template <typename enumT> @@ -296,23 +294,24 @@ //////////////////////////////////////////////// // ConditionWidget //////////////////////////////////////////////// +const GG::X CONDITION_WIDGET_WIDTH(380); + class ConditionWidget : public GG::Control { public: ConditionWidget(GG::X x, GG::Y y, const Condition::ConditionBase* initial_condition = 0) : - GG::Control(x, y, GG::X(380), GG::Y1, GG::INTERACTIVE), + GG::Control(x, y, CONDITION_WIDGET_WIDTH, GG::Y1, GG::INTERACTIVE), m_class_drop(0), m_string_drop(0), m_param_spin1(0), m_param_spin2(0) { - Condition::ConditionBase* init_condition = 0; if (!initial_condition) { - init_condition = new Condition::All(); + Condition::ConditionBase* init_condition = new Condition::All(); + Init(init_condition); + delete init_condition; } else { - init_condition = CopyCondition(initial_condition); + Init(initial_condition); } - Init(init_condition); - delete init_condition; } ~ConditionWidget() { @@ -370,6 +369,58 @@ } else if (condition_key == HASSPECIAL_CONDITION) { return new Condition::HasSpecial(GetString()); + } else if (condition_key == HASGROWTHSPECIAL_CONDITION) { + std::vector< const Condition::ConditionBase*> operands; + // determine sitrep order + std::istringstream template_stream(UserString("GROWTH_SPECIALS_LIST")); + for (std::istream_iterator<std::string> stream_it = std::istream_iterator<std::string>(template_stream); + stream_it != std::istream_iterator<std::string>(); stream_it++) + { + operands.push_back(new Condition::HasSpecial(*stream_it)); + } + Condition::Or* this_cond = new Condition::Or(operands); + object_list_cond_description_map[this_cond->Description()] = HASGROWTHSPECIAL_CONDITION; + return this_cond; + + } else if (condition_key == ASTWITHPTYPE_CONDITION) { // And [Planet PlanetType PT_ASTEROIDS ContainedBy And [System Contains PlanetType X]] + std::vector< const Condition::ConditionBase*> operands1; + operands1.push_back( new Condition::Type( new ValueRef::Constant<UniverseObjectType> (OBJ_PLANET)) ); + const std::string& text = GetString(); + if (text == "Any") { + std::vector<const ValueRef::ValueRefBase<PlanetType>*> copytype; + copytype.push_back( new ValueRef::Constant<PlanetType>(PT_ASTEROIDS)); + operands1.push_back( new Condition::Not(new Condition::PlanetType(copytype))); + } else + operands1.push_back( new Condition::PlanetType(GetEnumValueRefVec< ::PlanetType>())); + std::vector< const Condition::ConditionBase*> operands2; + operands2.push_back( new Condition::Type( new ValueRef::Constant<UniverseObjectType> (OBJ_SYSTEM))); + std::vector<const ValueRef::ValueRefBase<PlanetType>*> maintype; + maintype.push_back( new ValueRef::Constant<PlanetType>(PT_ASTEROIDS)); + operands2.push_back( new Condition::Contains( new Condition::PlanetType(maintype))); + operands1.push_back(new Condition::ContainedBy(new Condition::And(operands2))); + Condition::And* this_cond = new Condition::And(operands1); + object_list_cond_description_map[this_cond->Description()] = ASTWITHPTYPE_CONDITION; + return this_cond; + + } else if (condition_key == GGWITHPTYPE_CONDITION) { // And [Planet PlanetType PT_GASGIANT ContainedBy And [System Contains PlanetType X]] + std::vector< const Condition::ConditionBase*> operands1; + const std::string& text = GetString(); + if (text == "Any") { + std::vector<const ValueRef::ValueRefBase<PlanetType>*> copytype; + copytype.push_back( new ValueRef::Constant<PlanetType>(PT_GASGIANT)); + operands1.push_back( new Condition::Not(new Condition::PlanetType(copytype))); + } else + operands1.push_back( new Condition::PlanetType(GetEnumValueRefVec< ::PlanetType>())); + std::vector< const Condition::ConditionBase*> operands2; + operands2.push_back( new Condition::Type( new ValueRef::Constant<UniverseObjectType> (OBJ_SYSTEM))); + std::vector<const ValueRef::ValueRefBase<PlanetType>*> maintype; + maintype.push_back( new ValueRef::Constant<PlanetType>(PT_GASGIANT)); + operands2.push_back( new Condition::Contains( new Condition::PlanetType(maintype))); + operands1.push_back(new Condition::ContainedBy(new Condition::And(operands2))); + Condition::And* this_cond = new Condition::And(operands1); + object_list_cond_description_map[this_cond->Description()] = GGWITHPTYPE_CONDITION; + return this_cond; + } else if (condition_key == HASTAG_CONDITION) { return new Condition::HasTag(GetString()); @@ -526,13 +577,19 @@ } GG::X DropListWidth() const + { return GG::X(ClientUI::Pts()*18); } + + GG::X ParamsDropListWidth() const + { return CONDITION_WIDGET_WIDTH - DropListWidth(); } + + GG::X SpinDropListWidth() const { return GG::X(ClientUI::Pts()*16); } GG::Y DropListHeight() const { return GG::Y(ClientUI::Pts() + 4); } int DropListDropHeight() const - { return 10; } + { return 12; } void Init(const Condition::ConditionBase* init_condition) { // fill droplist with basic types of conditions and select appropriate row @@ -542,15 +599,16 @@ AttachChild(m_class_drop); std::vector<std::string> row_keys; - row_keys.push_back(ALL_CONDITION); row_keys.push_back(EMPIREAFFILIATION_CONDITION); - row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); - row_keys.push_back(HOMEWORLD_CONDITION); row_keys.push_back(CAPITAL_CONDITION); + row_keys.push_back(ALL_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); + row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(HASGROWTHSPECIAL_CONDITION); + row_keys.push_back(GGWITHPTYPE_CONDITION); row_keys.push_back(ASTWITHPTYPE_CONDITION); + row_keys.push_back(FOCUSTYPE_CONDITION); row_keys.push_back(STARTYPE_CONDITION); + row_keys.push_back(HASTAG_CONDITION); row_keys.push_back(SPECIES_CONDITION); + row_keys.push_back(HASSPECIAL_CONDITION); row_keys.push_back(EMPIREAFFILIATION_CONDITION); row_keys.push_back(MONSTER_CONDITION); row_keys.push_back(ARMED_CONDITION); row_keys.push_back(STATIONARY_CONDITION); row_keys.push_back(CANPRODUCESHIPS_CONDITION); - row_keys.push_back(CANCOLONIZE_CONDITION); row_keys.push_back(HASSPECIAL_CONDITION); - row_keys.push_back(HASTAG_CONDITION); row_keys.push_back(SPECIES_CONDITION); - row_keys.push_back(FOCUSTYPE_CONDITION); row_keys.push_back(STARTYPE_CONDITION); - row_keys.push_back(METERVALUE_CONDITION); + row_keys.push_back(CANCOLONIZE_CONDITION); row_keys.push_back(HOMEWORLD_CONDITION); + row_keys.push_back(METERVALUE_CONDITION); row_keys.push_back(CAPITAL_CONDITION); SetMinSize(m_class_drop->Size()); GG::ListBox::iterator select_row_it = m_class_drop->end(); @@ -609,7 +667,8 @@ condition_key == STATIONARY_CONDITION || condition_key == CANPRODUCESHIPS_CONDITION || condition_key == CANCOLONIZE_CONDITION || - condition_key == MONSTER_CONDITION) + condition_key == MONSTER_CONDITION || + condition_key == HASGROWTHSPECIAL_CONDITION) { // no params param_widget_top += m_class_drop->Height(); @@ -620,7 +679,7 @@ // droplist of valid species m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -639,7 +698,7 @@ // droplist of valid specials m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -658,7 +717,7 @@ // droplist of valid tags m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -687,7 +746,7 @@ // droplist of valid sizes m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -707,11 +766,13 @@ if (!m_string_drop->Empty()) m_string_drop->Select(0); - } else if (condition_key == PLANETTYPE_CONDITION) { + } else if (condition_key == PLANETTYPE_CONDITION || + condition_key == GGWITHPTYPE_CONDITION || + condition_key == ASTWITHPTYPE_CONDITION ) { // droplist of valid types m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); std::vector< ::PlanetType> planet_types; @@ -720,6 +781,8 @@ std::vector<std::string> type_strings = StringsFromEnums(planet_types); GG::ListBox::iterator row_it = m_string_drop->end(); + if (condition_key == GGWITHPTYPE_CONDITION || condition_key == ASTWITHPTYPE_CONDITION ) + row_it = m_string_drop->Insert(new StringRow("Any", GG::Y(ClientUI::Pts()), false)); for (std::vector<std::string>::iterator string_it = type_strings.begin(); string_it != type_strings.end(); ++string_it) { @@ -733,7 +796,7 @@ // droplist of valid types m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -757,7 +820,7 @@ // droplist of valid foci m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -785,7 +848,7 @@ // droplist of meter types m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(ParamsDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_left = GG::X0; param_widget_top = m_string_drop->Height() + GG::Y(Value(PAD)); @@ -807,13 +870,13 @@ m_param_spin1 = new CUISpin<int>(0, 1, 0, 1000, true); m_param_spin1->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_param_spin1->Resize(GG::Pt(DropListWidth(), m_param_spin1->Height())); + m_param_spin1->Resize(GG::Pt(SpinDropListWidth(), m_param_spin1->Height())); AttachChild(m_param_spin1); - param_widget_left = DropListWidth() + PAD; + param_widget_left = SpinDropListWidth() + PAD; m_param_spin2 = new CUISpin<int>(0, 1, 0, 1000, true); m_param_spin2->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_param_spin2->Resize(GG::Pt(DropListWidth(), m_param_spin2->Height())); + m_param_spin2->Resize(GG::Pt(SpinDropListWidth(), m_param_spin2->Height())); AttachChild(m_param_spin2); param_widget_top += m_param_spin1->Height(); @@ -821,7 +884,7 @@ // droplist of empires m_string_drop = new CUIDropDownList(DropListDropHeight()); m_string_drop->MoveTo(GG::Pt(param_widget_left, param_widget_top)); - m_string_drop->Resize(GG::Pt(DropListWidth(), DropListHeight())); + m_string_drop->Resize(GG::Pt(SpinDropListWidth(), DropListHeight())); AttachChild(m_string_drop); param_widget_top += m_string_drop->Height(); @@ -945,7 +1008,7 @@ // TODO: Add multiple condition widgets initialized for input condition - m_condition_widget = new ConditionWidget(GG::X(3), m_filters_layout->Height() + GG::Y(3)); + m_condition_widget = new ConditionWidget(GG::X(3), m_filters_layout->Height() + GG::Y(3), condition_filter); m_cancel_button = new CUIButton(UserString("CANCEL")); m_apply_button = new CUIButton(UserString("APPLY")); Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-03-14 22:58:02 UTC (rev 8037) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-03-15 01:34:23 UTC (rev 8038) @@ -3403,11 +3403,6 @@ Against enemy attack %21$.1f and shields %22$.1f: %23$.f (%24$.2f per PP) ''' - - - - - ENC_UNLOCKED_BY '''<u>Unlocked By Techs:</u> @@ -3822,7 +3817,7 @@ AI_ERROR_MSG AI_Error: AI script error -# Functional list; do not translate. Used for logging during universe creation +# Functional list; do not translate. Used for logging during universe creation and for an ObjectListWnd condition GROWTH_SPECIALS_LIST '''CRYSTALS_SPECIAL FRUIT_SPECIAL @@ -4123,6 +4118,15 @@ CONDITION_METERVALUE Object Property Value +CONDITION_HAS_GROWTH_SPECIAL +Has Any Growth Special + +CONDITION_PTYPE_W_GG +Gas Giant with Planet of type + +CONDITION_PTYPE_W_AST +Asteroids with Planet of type + ############################################################# #### S I T R E P #### ############################################################# |
From: <dil...@us...> - 2015-03-15 01:42:18
|
Revision: 8039 http://sourceforge.net/p/freeorion/code/8039 Author: dilvish-fo Date: 2015-03-15 01:42:16 +0000 (Sun, 15 Mar 2015) Log Message: ----------- adjusted ObjectListWnd code to use UserString to get text for "Any" Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp trunk/FreeOrion/default/stringtables/en.txt Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-15 01:34:23 UTC (rev 8038) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2015-03-15 01:42:16 UTC (rev 8039) @@ -386,7 +386,7 @@ std::vector< const Condition::ConditionBase*> operands1; operands1.push_back( new Condition::Type( new ValueRef::Constant<UniverseObjectType> (OBJ_PLANET)) ); const std::string& text = GetString(); - if (text == "Any") { + if (text == UserString("CONDITION_ANY")) { std::vector<const ValueRef::ValueRefBase<PlanetType>*> copytype; copytype.push_back( new ValueRef::Constant<PlanetType>(PT_ASTEROIDS)); operands1.push_back( new Condition::Not(new Condition::PlanetType(copytype))); @@ -405,7 +405,7 @@ } else if (condition_key == GGWITHPTYPE_CONDITION) { // And [Planet PlanetType PT_GASGIANT ContainedBy And [System Contains PlanetType X]] std::vector< const Condition::ConditionBase*> operands1; const std::string& text = GetString(); - if (text == "Any") { + if (text == UserString("CONDITION_ANY")) { std::vector<const ValueRef::ValueRefBase<PlanetType>*> copytype; copytype.push_back( new ValueRef::Constant<PlanetType>(PT_GASGIANT)); operands1.push_back( new Condition::Not(new Condition::PlanetType(copytype))); @@ -782,7 +782,7 @@ GG::ListBox::iterator row_it = m_string_drop->end(); if (condition_key == GGWITHPTYPE_CONDITION || condition_key == ASTWITHPTYPE_CONDITION ) - row_it = m_string_drop->Insert(new StringRow("Any", GG::Y(ClientUI::Pts()), false)); + row_it = m_string_drop->Insert(new StringRow(UserString("CONDITION_ANY"), GG::Y(ClientUI::Pts()), false)); for (std::vector<std::string>::iterator string_it = type_strings.begin(); string_it != type_strings.end(); ++string_it) { Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-03-15 01:34:23 UTC (rev 8038) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-03-15 01:42:16 UTC (rev 8039) @@ -4127,6 +4127,9 @@ CONDITION_PTYPE_W_AST Asteroids with Planet of type +CONDITION_ANY +Any + ############################################################# #### S I T R E P #### ############################################################# |
From: <ma...@us...> - 2015-03-19 21:58:47
|
Revision: 8046 http://sourceforge.net/p/freeorion/code/8046 Author: matgb Date: 2015-03-19 21:58:39 +0000 (Thu, 19 Mar 2015) Log Message: ----------- Adding Sitrep for Artificial Black Hole creation and fixing previous error Modified Paths: -------------- trunk/FreeOrion/default/buildings.txt trunk/FreeOrion/default/stringtables/en.txt Removed Paths: ------------- trunk/FreeOrion/blackholegen.patch Deleted: trunk/FreeOrion/blackholegen.patch =================================================================== --- trunk/FreeOrion/blackholegen.patch 2015-03-18 22:38:06 UTC (rev 8045) +++ trunk/FreeOrion/blackholegen.patch 2015-03-19 21:58:39 UTC (rev 8046) @@ -1,50 +0,0 @@ -Index: default/buildings.txt -=================================================================== ---- default/buildings.txt (revision 8044) -+++ default/buildings.txt (working copy) -@@ -804,7 +805,14 @@ - System - ] - activation = Star type = Red -- effects = SetStarType type = BlackHole -+ effects = [ -+ SetStarType type = BlackHole -+ GenerateSitRepMessage -+ message = "EFFECT_BLACKHOLE" -+ icon = "icons/building/blackhole.png" -+ parameters = tag = "planet" data = Source.SystemID -+ empire = Source.Owner -+ ] - - EffectsGroup - scope = Source -Index: default/stringtables/en.txt -=================================================================== ---- default/stringtables/en.txt (revision 8044) -+++ default/stringtables/en.txt (working copy) -@@ -4178,11 +4178,13 @@ - SITREP_PLANET_CAPTURED - SITREP_PLANET_COLONIZED - SITREP_NEW_COLONY_ESTABLISHED -+SITREP_POP_THRESHOLD - SITREP_PLANET_BOMBARDED_AT_SYSTEM - SITREP_UNOWNED_PLANET_BOMBARDED_AT_SYSTEM - EFFECT_CONC_CAMP_COMLETE - EFFECT_GAIAN_TERRAFORM - EFFECT_TERRAFORM -+EFFECT_BLACKHOLE - EFFECT_TAME_MONSTER_HATCHED - EFFECT_TAME_MONSTER_MATURED - SITREP_BUILDING_BUILT -@@ -4490,6 +4492,11 @@ - EFFECT_TERRAFORM_LABEL - Terraform - -+EFFECT_BLACKHOLE -+%planet% has been collapsed to create a Black Hole. -+EFFECT_TERRAFORM_LABEL -+Black Hole -+ - EFFECT_STARVATION - Famine struck %planet%. - EFFECT_STARVATION_LABEL Modified: trunk/FreeOrion/default/buildings.txt =================================================================== --- trunk/FreeOrion/default/buildings.txt 2015-03-18 22:38:06 UTC (rev 8045) +++ trunk/FreeOrion/default/buildings.txt 2015-03-19 21:58:39 UTC (rev 8046) @@ -804,7 +804,14 @@ System ] activation = Star type = Red - effects = SetStarType type = BlackHole + effects = [ + SetStarType type = BlackHole + GenerateSitRepMessage + message = "EFFECT_BLACKHOLE" + icon = "icons/building/blackhole.png" + parameters = tag = "planet" data = Source.SystemID + empire = Source.Owner + ] EffectsGroup scope = Source Modified: trunk/FreeOrion/default/stringtables/en.txt =================================================================== --- trunk/FreeOrion/default/stringtables/en.txt 2015-03-18 22:38:06 UTC (rev 8045) +++ trunk/FreeOrion/default/stringtables/en.txt 2015-03-19 21:58:39 UTC (rev 8046) @@ -4178,11 +4178,13 @@ SITREP_PLANET_CAPTURED SITREP_PLANET_COLONIZED SITREP_NEW_COLONY_ESTABLISHED +SITREP_POP_THRESHOLD SITREP_PLANET_BOMBARDED_AT_SYSTEM SITREP_UNOWNED_PLANET_BOMBARDED_AT_SYSTEM EFFECT_CONC_CAMP_COMLETE EFFECT_GAIAN_TERRAFORM EFFECT_TERRAFORM +EFFECT_BLACKHOLE EFFECT_TAME_MONSTER_HATCHED EFFECT_TAME_MONSTER_MATURED SITREP_BUILDING_BUILT @@ -4490,6 +4492,11 @@ EFFECT_TERRAFORM_LABEL Terraform +EFFECT_BLACKHOLE +%planet% has been collapsed to create a Black Hole. +EFFECT_TERRAFORM_LABEL +Black Hole + EFFECT_STARVATION Famine struck %planet%. EFFECT_STARVATION_LABEL |