URL:
<http://gna.org/bugs/?19086>
Summary: [add_ai_behavior] problems
Project: Battle for Wesnoth
Submitted by: mattsc
Submitted on: Wed 30 Nov 2011 10:46:17 PM GMT
Category: Bug
Severity: 3 - Normal
Priority: 5 - Normal
Item Group: Artificial Intelligence
Status: None
Privacy: Public
Assigned to: None
Originator Email:
Open/Closed: Open
Discussion Lock: Any
Release: 1.9.9
Operating System: Mac OS 10.6.8
_______________________________________________________
Details:
(This isn't really an AI issue, it's more a Lua AI tag thing, but this seems
to be closest 'item group' from the list.)
The [add_ai_behavior] tag defined in lua/wml-tags.lua requires global
variable 'ca_counter' to be defined (e.g. in a preload event). There are
several issues with this:
* First of all, it is unnecessary, since this variable isn't used for
anything else but setting the behavior candidate action (BCA) id in this tag.
ca_counter gets incremented every time a BCA is added to the AI, and the id is
set to 'bca-' plus the ca_counter value
* As far as I can tell, the id is completely irrelevant for anything but
removing the BCA later with [modify_ai]. However, since it is set
automatically, it is not clear which BCA has which id, unless the order in
which they were defined is always known.
* Moreover, unless 'ca_counter' is also stored in a WML variable, its value
gets lost over save/load cycles, which means that several BCAs can have
identical id's, making deleting a specific BCA impossible (this is the real
bug, everything else are "inconveniences")
* Less importantly, the definition of [add_ai_behavior] contains several
unnecessary parameters that are passed to [modify_ai]
I suggest replacing the current tag with the version below, called
[alt_add_ai_behavior] for now, so that they can be tested next to each other.
The new tag fixes all of the above issues. It preserves the original behavior
of [add_ai_behavior], but in addition:
* An optional key 'bca_id' can be given, which will be used as the id for the
BCA, thus making deletion possible even if several BCAs are assigned to the
same unit.
* If key 'bca_id' is not set, it assigns id 'bca-'+unit.id. Thus, if only
one BCA is given to a unit, its id is always unique and known.
* There is no need any more to define global variable 'ca_counter' in the
preload event.
function wesnoth.wml_actions.alt_add_ai_behavior(cfg)
local unit = wesnoth.get_units(helper.get_child(cfg, "filter"))[1]
if not unit then
helper.wml_error("[add_ai_behavior]: no unit specified")
end
local side = cfg.side
local sticky = cfg.sticky or false
local loop_id = cfg.loop_id or "main_loop"
local eval = cfg.evaluation
local exec = cfg.execution
local bca_id = cfg.bca_id or ("bca-" .. unit.id)
local ux = unit.x -- @note: did I get it right that coordinates in
C++ differ by 1 from thos in-game(and in Lua)?
local uy = unit.y
if not side then
helper.wml_error("[add_ai_behavior]: no side attribute
given")
end
if not (eval and exec) then
helper.wml_error("[add_ai_behavior]: invalid
execution/evaluation handler(s)")
end
local path = "stage[" .. loop_id .. "].candidate_action[" .. bca_id
.. "]" -- bca: behavior candidate action
local conf = {
["side"] = side,
["action"] = "add",
["engine"] = "lua",
["path"] = path,
{"candidate_action", {
["id"] = bca_id,
["name"] = bca_id,
["engine"] = "lua",
["sticky"] = sticky,
["unit_x"] = ux,
["unit_y"] = uy,
["evaluation"] = eval,
["execution"] = exec
}}
}
wesnoth.wml_actions.modify_ai(conf)
--wesnoth.message("Adding a behavior")
end
_______________________________________________________
Reply to this item at:
<http://gna.org/bugs/?19086>
_______________________________________________
Message sent via/by Gna!
http://gna.org/
_______________________________________________
Wesnoth-bugs mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-bugs