Rewriting macros as tags
Moderator: Forum Moderators
Rewriting macros as tags
I'd like to go through all the mainline macros that can be used in events and rewrite them in Lua as action tags. I think tags are easier to read than macros, and Lua makes it easy to replace them. I'd like some feedback as to how I might approach this project. I could do one of the following things:
Obviously, some macros don't use action tags, so they can't be converted. I also will not convert macros like SET_OBJECTIVES, UNIT, and VARIABLE, where the tag provided by the engine does the job I want to do.
After that, I can maybe do the same thing with FrankenWML.
So what do you think? Would there be enough interest to get this into mainline?
- Try to get it into mainline. If I do this, I'll have to focus on 1.9 rather than 1.8.
- Try to get it into Wesnoth Lua Pack.
- Make it my own separate add-on. This would mean I can use my own coding convention, so I can use spaces for indentation.
Obviously, some macros don't use action tags, so they can't be converted. I also will not convert macros like SET_OBJECTIVES, UNIT, and VARIABLE, where the tag provided by the engine does the job I want to do.
After that, I can maybe do the same thing with FrankenWML.
So what do you think? Would there be enough interest to get this into mainline?
Re: Rewriting macros as tags
There's definitely some macros which should IMO be converted to lua tags, but nowhere near all. Lua code is still harder to read and understand than WML, so maintaining the macros/tags is inevitably a bit harder if they're written in lua rather than WML, because far fewer people know lua, whereas WML is usually pretty easy to understand.
The things I'd most like to see would be a [modify_unit] tag:
Also, a [move_unit] tag to replace the MOVE_UNIT macro would be nice.
So, I'm sure I'd gladly put tags like these in mainline. Commonly used macros like MODIFY_UNIT or MOVE_UNIT which have a reasonably complicated implementation are a good idea to convert to tags, but I don't want to overdo it and start converting all simple action-WML-containing macros to tags.
The things I'd most like to see would be a [modify_unit] tag:
Code: Select all
[modify_unit]
[filter]
id=Konrad
[/filter]
hitpoints=12 # sets unit.HP to 12
moves=0 # sets unit.moves to 0
[status]
poisoned=yes # sets unit.status.poisoned to yes
[/status]
[/modify_unit]
So, I'm sure I'd gladly put tags like these in mainline. Commonly used macros like MODIFY_UNIT or MOVE_UNIT which have a reasonably complicated implementation are a good idea to convert to tags, but I don't want to overdo it and start converting all simple action-WML-containing macros to tags.
Re: Rewriting macros as tags
Well, modify_unit as I had envisioned it was also smart enough to handle unit_type advancements correctly (by setting type= attribute), the use of percent notations, self reference via $this_unit, etc.
But, that version would be a good starting point I guess.
But, that version would be a good starting point I guess.
http://www.wesnoth.org/wiki/User:Sapient... "Looks like your skills saved us again. Uh, well at least, they saved Soarin's apple pie."
-
- Inactive Developer
- Posts: 2461
- Joined: August 15th, 2008, 8:46 pm
- Location: Germany
Re: Rewriting macros as tags
(I'm always impressed by the ambitiousness of people announcing what they're gonna do in the wesnoth forum...)
If you want to get them mainline'd submit them as patches.
Hm, my add-on features a custom modify_unit tag with syntax
intended to provide backwards compatibility
There's one in the lua pack but I'm afraid its author has disappeared and it also isn't "good code" imo.
If you want to get them mainline'd submit them as patches.
Hm, my add-on features a custom modify_unit tag with syntax
Code: Select all
{VARIABLE some_var experience}
[modify_unit]
side,canrecruit=1,yes
variables=$some_var|,status.petrified
values=1,yes
[/modify_unit]
Code: Select all
#ifdef MODIFY_UNIT
#undef MODIFY_UNIT
#endif
#define MODIFY_UNIT FILTER VARIABLES VALUES
[modify_unit]
{FILTER}
variables={VARIABLES}
values={VALUES}
[/modify_unit]
#enddef
projects (BfW 1.12):
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
Re: Rewriting macros as tags
Wow, good response! Here's my plan so far: I'll start by making an add-on for 1.9. I'll also try to maintain a version for 1.8. If I need to make patches, I'll copy stuff from the add-on. I'll work on the more complex macros first, as Zookeeper suggested, since they're more in demand. I'll also consider everyone's suggestions for [modify_unit] when I get to that.
I would think Lua would be easier to maintain than WML because it's more flexible. Also, I found it much easier to learn Lua than WML. Maybe my programmer brain is more accepting of procedural/object-oriented languages than markup.zookeeper wrote:There's definitely some macros which should IMO be converted to lua tags, but nowhere near all. Lua code is still harder to read and understand than WML, so maintaining the macros/tags is inevitably a bit harder if they're written in lua rather than WML, because far fewer people know lua, whereas WML is usually pretty easy to understand.
Re: Rewriting macros as tags
I think the first thing to do when considering whether a macro should be turned into a lua tag is to grep for the macro in all the mainline campaigns and see how much it's really used. If there's a complicated macro which is used in just a couple of places, then I don't think it's worth the trouble. However, if it's used a lot (like MOVE_UNIT and MODIFY_UNIT) then it sounds like a good idea.Luther wrote:Wow, good response! Here's my plan so far: I'll start by making an add-on for 1.9. I'll also try to maintain a version for 1.8. If I need to make patches, I'll copy stuff from the add-on. I'll work on the more complex macros first, as Zookeeper suggested, since they're more in demand.
Well, sure, I guess it's a matter of what one is used to. However, do note that a lot of WML authors don't know lua; when you convert a WML macro to a lua tag, the burden of maintenance partially shifts from the people who know WML to the people who know lua. For example, I can easily fix problems in WML macros or revise and extend them when needed, but I don't know lua enough to locate subtle bugs in other peoples' code; if MOVE_UNIT breaks, I can fix it, but if [move_unit] breaks, someone else has to do it.Luther wrote:I would think Lua would be easier to maintain than WML because it's more flexible. Also, I found it much easier to learn Lua than WML. Maybe my programmer brain is more accepting of procedural/object-oriented languages than markup.zookeeper wrote:There's definitely some macros which should IMO be converted to lua tags, but nowhere near all. Lua code is still harder to read and understand than WML, so maintaining the macros/tags is inevitably a bit harder if they're written in lua rather than WML, because far fewer people know lua, whereas WML is usually pretty easy to understand.
Of course, one could argue that there's currently more developers who know lua well than developers who know WML well. It might be the case or it might not, I don't really know.
Re: Rewriting macros as tags
I forgot to ask earlier: Do I have to submit each tag as a separate patch?Anonymissimus wrote: If you want to get them mainline'd submit them as patches.
Also, any tips on how to test new tags as I write them?
And BTW, I also want to work on some of the tags in FutureWML.
-
- Inactive Developer
- Posts: 2461
- Joined: August 15th, 2008, 8:46 pm
- Location: Germany
Re: Rewriting macros as tags
I'd do.Luther wrote: I forgot to ask earlier: Do I have to submit each tag as a separate patch?
I've submitted a patch for modify_unit, I hope you weren't working on it...
If you need to ask, how are you going to write new tags then... ?Also, any tips on how to test new tags as I write them?
e.g.:
Spoiler:
projects (BfW 1.12):
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
Re: Rewriting macros as tags
I've looked into modify_unit, and it looks like the hardest part would be deciding exactly how this tag should behave. The examples I've seen imply that the user's code should simply overwrite what's already in the unit. That's fine, but if you want really robust behavior, you're going to need some more complex syntax. We'll have to make a decision on this to make sure we're on the same page. Here's the complex version as I envision it:Anonymissimus wrote: I've submitted a patch for modify_unit, I hope you weren't working on it...
- To avoid name conflicts, [modify_unit] should not take arbitrary code at its top level.
- [filter] Standard unit filter.
- remove_keys= Takes a comma-separated list of keys to be deleted.
- [add_wml] Any keys of this tag are written directly to the unit. Any subtags are appended to the unit as-is.
- [remove_tag] Removes entire tags from the unit.
- name= Name of the tag(s) to be removed. If omitted, tags of any name may be removed.
- index= The number of a specific subtag to remove, with the first one being 0. If 'name' is provided, it will only count through tags of that name.
- [filter_wml] Only tags matching this filter will be removed.
- [modify_tag] Takes the same key and subtags as [modify_unit] (except [filter] becomes [filter_wml]), and recursively modifies the subtags. Also takes name= and index= keys as in [remove_tag].
I had to ask because any tag that takes arbitrary code is bound to have more test cases than I can think of off the top of my head.Anonymissimus wrote:If you need to ask, how are you going to write new tags then... ?Also, any tips on how to test new tags as I write them?
Re: Rewriting macros as tags
no, [set_variables] should be used for the class of modifications you described above as "arbitrary"; stored units, on the other hand, have many well-defined attributes and are organized in what is certainly a non-arbitrary structure.
http://www.wesnoth.org/wiki/User:Sapient... "Looks like your skills saved us again. Uh, well at least, they saved Soarin's apple pie."
Re: Rewriting macros as tags
I was under the impression that WML authors can add whatever data they want to a unit. Is there something else I need to read up on?
Re: Rewriting macros as tags
Arbitrary data was only allowed inside the [variables] tag, but this wasn't enforced. Now, it is.
- Pentarctagon
- Project Manager
- Posts: 5599
- Joined: March 22nd, 2009, 10:50 pm
- Location: Earth (occasionally)
Re: Rewriting macros as tags
the FOREACH/NEXT macros would be one of the best candidates to rewrite into a single tag since it would be both easy to do and is probably one of the 'worst looking' macros.
99 little bugs in the code, 99 little bugs
take one down, patch it around
-2,147,483,648 little bugs in the code
take one down, patch it around
-2,147,483,648 little bugs in the code
-
- Inactive Developer
- Posts: 2461
- Joined: August 15th, 2008, 8:46 pm
- Location: Germany
Re: Rewriting macros as tags
My mind is twisted while trying to envision what it would look like. You expect to deliver an arbitrary code block, the body wml, to be executed as an argument to a function; I doubt it's possible. It's rather a case where you should actually use a macro instead of a function.
projects (BfW 1.12):
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
A Simple Campaign: campaign draft for wml starters • Plan Your Advancements: mp mod
The Earth's Gut: sp campaign • Settlers of Wesnoth: mp scenario • Wesnoth Lua Pack: lua tags and utils
updated to 1.8 and handed over: A Gryphon's Tale: sp campaign
Re: Rewriting macros as tags
Maybe something like this?
Code: Select all
[foreach]
array=stored_units
index=i # default i,j,k...
[if]
[variable]
name=$stored_units[$i].race
not_equals=spartan
[/variable]
[then]
[continue]
# skip to next iteration
[/continue]
[/then]
[/if]
[message]
id=$stored_units[$i].id
message="This is SPARTA!!!"
[/message]
[break]
# terminate loop
[/break]
[/foreach]
http://www.wesnoth.org/wiki/User:Sapient... "Looks like your skills saved us again. Uh, well at least, they saved Soarin's apple pie."