More aspects exposed to Lua(http://wiki.wesnoth.org/LuaAI)

This commit is contained in:
Dmitry Kovalenko 2011-06-07 09:29:03 +00:00
parent cea5fe7618
commit 65db78e77d
4 changed files with 112 additions and 17 deletions

View file

@ -195,29 +195,39 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd
[ai]
[aspect]
id=aggression
id=number_of_possible_recruits_to_force_recruit
engine=lua
value="0.34"
[/aspect]
[aspect]
id=attack_depth
id=passive_leader
engine=lua
value="2"
value="true"
[/aspect]
[aspect]
id=caution
id=passive_leader_shares_keep
engine=lua
value="0.35"
code="return true"
[/aspect]
[aspect]
id=leader_aggression
id=scout_village_targeting
engine=lua
value="0.36"
[/aspect]
[aspect]
id=leader_value
id=simple_targeting
engine=lua
value="0.37"
value="true"
[/aspect]
[aspect]
id=recruitment_ignore_bad_combat
engine=lua
value="false"
[/aspect]
[aspect]
id=recruitment_ignore_bad_movement
engine=lua
value="true"
[/aspect]
version=10710
[engine]
@ -257,11 +267,14 @@ end
function my_ai:do_moves()
wesnoth.message('Aggression: ' .. ai.get_aggression())
wesnoth.message('Att. depth: ' .. ai.get_attack_depth())
wesnoth.message('Caution: ' .. ai.get_caution())
wesnoth.message('Leader aggression: ' .. ai.get_leader_aggression())
wesnoth.message('Leader value: ' .. ai.get_leader_value())
wesnoth.message('Passive leader: ', tostring(ai.get_passive_leader()))
wesnoth.message('Passive leader shares keep: ', tostring(ai.get_passive_leader_shares_keep()))
wesnoth.message('Simple targeting: ', tostring(ai.get_simple_targeting()))
wesnoth.message('Scout village targ.: ' , ai.get_scout_village_targeting())
wesnoth.message('Recruit. ignore bc: ' , tostring(ai.get_recruitment_ignore_bad_combat()))
wesnoth.message('Recruit. ignore bm: ' , tostring(ai.get_recruitment_ignore_bad_movement()))
wesnoth.message('nofprtfr: ' , ai.get_number_of_possible_recruits_to_force_recruit())
my_leader = wesnoth.get_units({canrecruit = true, side = ai.side})[1]
x,y = ai.suitable_keep(my_leader)

View file

@ -405,7 +405,11 @@ public:
std::string value;
if (cfg.has_attribute("value"))
{
value = cfg["value"].str();
value = cfg["value"].str();
if (value == "yes") // @TODO for Nephro or Crab: get rid of this workaround
{
value = "true";
}
value = "return (" + value + ")";
}
else if (cfg.has_attribute("code"))

View file

@ -283,6 +283,56 @@ static int cfun_ai_get_leader_value(lua_State *L)
return 1;
}
static int cfun_ai_get_passive_leader(lua_State *L)
{
bool passive_leader = get_readonly_context(L).get_passive_leader();
lua_pushboolean(L, passive_leader);
return 1;
}
static int cfun_ai_get_passive_leader_shares_keep(lua_State *L)
{
bool passive_leader_shares_keep = get_readonly_context(L).get_passive_leader_shares_keep();
lua_pushboolean(L, passive_leader_shares_keep);
return 1;
}
static int cfun_ai_get_number_of_possible_recruits_to_force_recruit(lua_State *L)
{
double noprtfr = get_readonly_context(L).get_number_of_possible_recruits_to_force_recruit(); // @note: abbreviation
lua_pushnumber(L, noprtfr);
return 1;
}
static int cfun_ai_get_recruitment_ignore_bad_combat(lua_State *L)
{
bool recruitment_ignore_bad_combat = get_readonly_context(L).get_recruitment_ignore_bad_combat();
lua_pushboolean(L, recruitment_ignore_bad_combat);
return 1;
}
static int cfun_ai_get_recruitment_ignore_bad_movement(lua_State *L)
{
bool recruitment_ignore_bad_movement = get_readonly_context(L).get_recruitment_ignore_bad_movement();
lua_pushboolean(L, recruitment_ignore_bad_movement);
return 1;
}
static int cfun_ai_get_scout_village_targeting(lua_State *L)
{
double scout_village_targeting = get_readonly_context(L).get_scout_village_targeting();
lua_pushnumber(L, scout_village_targeting);
return 1;
}
static int cfun_ai_get_simple_targeting(lua_State *L)
{
bool simple_targeting = get_readonly_context(L).get_simple_targeting();
lua_pushboolean(L, simple_targeting);
return 1;
}
lua_ai_context* lua_ai_context::create(lua_State *L, char const *code, ai::engine_lua *engine)
{
int res_ai = luaL_loadstring(L, code);//stack size is now 1 [ -1: ai_context]
@ -307,6 +357,13 @@ lua_ai_context* lua_ai_context::create(lua_State *L, char const *code, ai::engin
{ "get_caution", &cfun_ai_get_caution },
{ "get_leader_aggression", &cfun_ai_get_leader_aggression },
{ "get_leader_value", &cfun_ai_get_leader_value },
{ "get_number_of_possible_recruits_to_force_recruit", &cfun_ai_get_number_of_possible_recruits_to_force_recruit},
{ "get_passive_leader", &cfun_ai_get_passive_leader},
{ "get_passive_leader_shares_keep", &cfun_ai_get_passive_leader_shares_keep},
{ "get_recruitment_ignore_bad_combat", &cfun_ai_get_recruitment_ignore_bad_combat},
{ "get_recruitment_ignore_bad_movement", &cfun_ai_get_recruitment_ignore_bad_movement},
{ "get_scout_village_targeting", &cfun_ai_get_scout_village_targeting},
{ "get_simple_targeting", &cfun_ai_get_simple_targeting},
{ "move", &cfun_ai_execute_move_partial },
{ "move_full", &cfun_ai_execute_move_full },
{ "recall", &cfun_ai_execute_recall },

View file

@ -364,16 +364,37 @@ static register_lua_aspect_factory< lua_aspect<double> >
static register_lua_aspect_factory< lua_aspect<int> >
attack_depth__lua_aspect_factory("attack_depth*lua_aspect");
static register_lua_aspect_factory< lua_aspect<double> >
caution__lua_aspect_factory("caution*lua_aspect");
static register_lua_aspect_factory< lua_aspect<double> >
leader_aggression__lua_aspect_factory("leader_aggression*lua_aspect");
static register_lua_aspect_factory< lua_aspect<double> >
leader_value__lua_aspect_factory("leader_value*lua_aspect");
static register_lua_aspect_factory< lua_aspect<double> >
number_of_possible_recruits_to_force_recruit__lua_aspect_factory("number_of_possible_recruits_to_force_recruit*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool> >
passive_leader__lua_aspect_factory("passive_leader*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool> >
passive_leader_shares_keep__lua_aspect_factory("passive_leader_shares_keep*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool> >
recruitment_ignore_bad_combat__lua_aspect_factory("recruitment_ignore_bad_combat*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool> >
recruitment_ignore_bad_movement__lua_aspect_factory("recruitment_ignore_bad_movement*lua_aspect");
static register_lua_aspect_factory< lua_aspect<double> >
scout_village_targeting__lua_aspect_factory("scout_village_targeting*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool> >
simple_targeting__lua_aspect_factory("simple_targeting*lua_aspect");
void registry::init()
{
}