From 26a2638f2cce0fd66dddc5b26eb9707c06c99c7d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 25 Feb 2016 14:51:56 -0500 Subject: [PATCH] Make the formula and Lua views of a unit coincide more closely Several keys were either missing or misnamed in the formula view. These have been changed to match the Lua and WML names for the keys. This affects canrecruit, moves, and max_moves, as well as status. In addition, a large number of keys were missing entirely from the formula view. Most of these keys have now been added and can be accessed from formulas. A few that have little use in filters (such as image_mods or profile) are still missing. The Lua view missed a few keys that the formula view did provide. Although these could in principle have been obtained by using the special __cfg key, they have now been added to the Lua view anyway. --- data/test/scenarios/filter_this_unit.cfg | 18 +++++ src/callable_objects.cpp | 86 +++++++++++++++++++++--- src/scripting/game_lua_kernel.cpp | 10 +++ wml_test_schedule | 1 + 4 files changed, 106 insertions(+), 9 deletions(-) diff --git a/data/test/scenarios/filter_this_unit.cfg b/data/test/scenarios/filter_this_unit.cfg index 78c6541f7af0..f1053459e1e3 100644 --- a/data/test/scenarios/filter_this_unit.cfg +++ b/data/test/scenarios/filter_this_unit.cfg @@ -58,3 +58,21 @@ )} [/event] )} + +{GENERIC_UNIT_TEST filter_this_unit_fai_short ( + [event] + name=prestart + [modify_unit] + [filter] + id=bob + [/filter] + moves=3 + [/modify_unit] + {RETURN ( + [have_unit] + id=bob + formula="moves < max_moves" + [/have_unit] + )} + [/event] +)} diff --git a/src/callable_objects.cpp b/src/callable_objects.cpp index c3b6eebd3c2b..0518d7ddf339 100644 --- a/src/callable_objects.cpp +++ b/src/callable_objects.cpp @@ -167,7 +167,7 @@ variant unit_callable::get_value(const std::string& key) const return variant(u_.name()); } else if(key == "usage") { return variant(u_.usage()); - } else if(key == "leader") { + } else if(key == "leader" || key == "canrecruit") { return variant(u_.can_recruit()); } else if(key == "undead") { return variant(u_.get_state("not_living") ? 1 : 0); @@ -198,14 +198,17 @@ variant unit_callable::get_value(const std::string& key) const return variant(u_.experience()); } else if(key == "max_experience") { return variant(u_.max_experience()); - } else if(key == "level") { + } else if(key == "level" || key == "full") { + // This allows writing "upkeep == full" return variant(u_.level()); - } else if(key == "total_movement") { + } else if(key == "total_movement" || key == "max_moves") { return variant(u_.total_movement()); - } else if(key == "movement_left") { + } else if(key == "movement_left" || key == "moves") { return variant(u_.movement_left()); } else if(key == "attacks_left") { return variant(u_.attacks_left()); + } else if(key == "max_attacks") { + return variant(u_.max_attacks()); } else if(key == "traits") { const std::vector traits = u_.get_traits_list(); std::vector res; @@ -218,7 +221,31 @@ variant unit_callable::get_value(const std::string& key) const res.push_back( variant(*it) ); } return variant( &res ); - } else if(key == "states") { + } else if(key == "extra_recruit") { + const std::vector recruits = u_.recruits(); + std::vector res; + + if(recruits.empty()) + return variant( &res ); + + for (std::vector::const_iterator it = recruits.begin(); it != recruits.end(); ++it) + { + res.push_back( variant(*it) ); + } + return variant( &res ); + } else if(key == "advances_to") { + const std::vector advances = u_.advances_to(); + std::vector res; + + if(advances.empty()) + return variant( &res ); + + for (std::vector::const_iterator it = advances.begin(); it != advances.end(); ++it) + { + res.push_back( variant(*it) ); + } + return variant( &res ); + } else if(key == "states" || key == "status") { const std::map& states_map = u_.get_states(); return convert_map( states_map ); @@ -226,12 +253,39 @@ variant unit_callable::get_value(const std::string& key) const return variant(u_.side()-1); } else if(key == "cost") { return variant(u_.cost()); + } else if(key == "upkeep") { + return variant(u_.upkeep()); + } else if(key == "loyal") { + // So we can write "upkeep == loyal" + return variant(0); + } else if(key == "hidden") { + return variant(u_.get_hidden()); + } else if(key == "petrified") { + return variant(u_.incapacitated()); + } else if(key == "resting") { + return variant(u_.resting()); + } else if(key == "role") { + return variant(u_.get_role()); + } else if(key == "race") { + return variant(u_.race()->id()); + } else if(key == "gender") { + return variant(gender_string(u_.gender())); + } else if(key == "variation") { + return variant(u_.variation()); + } else if(key == "zoc") { + return variant(u_.get_emit_zoc()); + } else if(key == "alignment") { + return variant(u_.alignment().to_string()); + } else if(key == "facing") { + return variant(map_location::write_direction(u_.facing())); } else if(key == "vars") { if(u_.formula_manager().formula_vars()) { return variant(u_.formula_manager().formula_vars().get()); } else { return variant(); } + } else if(key == "n" || key == "s" || key == "ne" || key == "se" || key == "nw" || key == "sw" || key == "lawful" || key == "neutral" || key == "chaotic" || key == "liminal" || key == "male" || key == "female") { + return variant(key); } else { return variant(); } @@ -246,7 +300,7 @@ void unit_callable::get_inputs(std::vector* inputs) c inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("name", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("leader", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("canrecruit", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("undead", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("traits", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("attacks", FORMULA_READ_ONLY)); @@ -256,13 +310,27 @@ void unit_callable::get_inputs(std::vector* inputs) c inputs->push_back(game_logic::formula_input("experience", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("max_experience", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("level", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("total_movement", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("movement_left", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("moves", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("max_moves", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("attacks_left", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("max_attacks", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("side", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("states", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("extra_recruit", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("advances_to", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("status", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("cost", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("usage", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("upkeep", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("hidden", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("petrified", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("resting", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("role", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("race", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("gender", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("variation", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("zoc", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("alignment", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("facing", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("vars", FORMULA_READ_ONLY)); } diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 960f605dd7a9..19a896572a46 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -290,6 +290,7 @@ static int impl_unit_get(lua_State *L) return_string_attrib("id", u.id()); return_string_attrib("type", u.type_id()); return_string_attrib("image_mods", u.effect_image_mods()); + return_string_attrib("usage", u.usage()); return_int_attrib("hitpoints", u.hitpoints()); return_int_attrib("max_hitpoints", u.max_hitpoints()); return_int_attrib("experience", u.experience()); @@ -302,6 +303,7 @@ static int impl_unit_get(lua_State *L) return_tstring_attrib("name", u.name()); return_bool_attrib("canrecruit", u.can_recruit()); return_int_attrib("level", u.level()); + return_int_attrib("cost", u.cost()); return_vector_string_attrib("extra_recruit", u.recruits()); return_vector_string_attrib("advances_to", u.advances_to()); @@ -332,6 +334,14 @@ static int impl_unit_get(lua_State *L) lua_push(L, u.overlays()); return 1; } + if (strcmp(m, "traits") == 0) { + lua_push(L, u.get_ability_list()); + return 1; + } + if (strcmp(m, "abilities") == 0) { + lua_push(L, u.get_traits_list()); + return 1; + } if (strcmp(m, "status") == 0) { lua_createtable(L, 1, 0); lua_pushvalue(L, 1); diff --git a/wml_test_schedule b/wml_test_schedule index dfd008841617..9dacdd8fee05 100644 --- a/wml_test_schedule +++ b/wml_test_schedule @@ -147,6 +147,7 @@ 0 filter_this_unit_wml 0 filter_this_unit_tl 0 filter_this_unit_fai +0 filter_this_unit_fai_short # Interrupt tag tests 0 check_interrupts_break 0 check_interrupts_return