Skip to content

Commit

Permalink
Make the formula and Lua views of a unit coincide more closely
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
CelticMinstrel committed Mar 18, 2016
1 parent f02a038 commit 26a2638
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 9 deletions.
18 changes: 18 additions & 0 deletions data/test/scenarios/filter_this_unit.cfg
Expand Up @@ -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]
)}
86 changes: 77 additions & 9 deletions src/callable_objects.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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<std::string> traits = u_.get_traits_list();
std::vector<variant> res;
Expand All @@ -218,20 +221,71 @@ 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<std::string> recruits = u_.recruits();
std::vector<variant> res;

if(recruits.empty())
return variant( &res );

for (std::vector<std::string>::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<std::string> advances = u_.advances_to();
std::vector<variant> res;

if(advances.empty())
return variant( &res );

for (std::vector<std::string>::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<std::string, std::string>& states_map = u_.get_states();

return convert_map( states_map );
} else if(key == "side") {
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();
}
Expand All @@ -246,7 +300,7 @@ void unit_callable::get_inputs(std::vector<game_logic::formula_input>* 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));
Expand All @@ -256,13 +310,27 @@ void unit_callable::get_inputs(std::vector<game_logic::formula_input>* 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));
}

Expand Down
10 changes: 10 additions & 0 deletions src/scripting/game_lua_kernel.cpp
Expand Up @@ -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());
Expand All @@ -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());
Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions wml_test_schedule
Expand Up @@ -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
Expand Down

0 comments on commit 26a2638

Please sign in to comment.