<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Soldier</id>
	<title>The Battle for Wesnoth Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Soldier"/>
	<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/Special:Contributions/Soldier"/>
	<updated>2026-04-09T20:18:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WML_Utilities&amp;diff=30582</id>
		<title>WML Utilities</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WML_Utilities&amp;diff=30582"/>
		<updated>2009-05-22T22:32:44Z</updated>

		<summary type="html">&lt;p&gt;Soldier: /* Determining opposite coordinates */ bugfix s/ modulo for *0.5 then *2 which doesnt work in 1.6 due to floating point variables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Filter by Terrain ==&lt;br /&gt;
&lt;br /&gt;
 # Check whethers or not the terrain in the given coordinates is of the given&lt;br /&gt;
 # type or types. Filtering by terrain isn't possible directly.&lt;br /&gt;
 #&lt;br /&gt;
 # You can use it for example like this:&lt;br /&gt;
 #&lt;br /&gt;
 # [event]&lt;br /&gt;
 #     name=moveto&lt;br /&gt;
 #     first_time_only=no&lt;br /&gt;
 #&lt;br /&gt;
 #     {IF_TERRAIN $x1 $y1 Gg,Gs^Fp,Mm (&lt;br /&gt;
 #         [then]&lt;br /&gt;
 #             {DEBUG_MSG &amp;quot;Stepped on grassland, forest or mountains!&amp;quot;}&lt;br /&gt;
 #         [/then]&lt;br /&gt;
 #     )}&lt;br /&gt;
 # [/event]&amp;lt;br&amp;gt;&lt;br /&gt;
 #define IF_TERRAIN X Y TERRAIN CONTENTS&lt;br /&gt;
     [store_locations]&lt;br /&gt;
         x={X}&lt;br /&gt;
         y={Y}&lt;br /&gt;
         terrain={TERRAIN}&lt;br /&gt;
         variable=IF_TERRAIN_temp&lt;br /&gt;
     [/store_locations]&amp;lt;br&amp;gt; &lt;br /&gt;
     [if]&lt;br /&gt;
         [variable]&lt;br /&gt;
             name=IF_TERRAIN_temp.length&lt;br /&gt;
             not_equals=0&lt;br /&gt;
         [/variable]&amp;lt;br&amp;gt; &lt;br /&gt;
         {CONTENTS}&lt;br /&gt;
     [/if]&amp;lt;br&amp;gt; &lt;br /&gt;
     {CLEAR_VARIABLE IF_TERRAIN_temp}&lt;br /&gt;
 #enddef&lt;br /&gt;
&lt;br /&gt;
==Iterate==&lt;br /&gt;
&lt;br /&gt;
 # You can iterate through a range of numbers with this macro. The CONTENTS&lt;br /&gt;
 # are repeated with every iteration, and you can use the VAR variable to&lt;br /&gt;
 # insert the number of the current step into each iteration. Note that&lt;br /&gt;
 # when using this, you must iterate from a smaller number to the bigger&lt;br /&gt;
 # number, because the increment is always 1.&lt;br /&gt;
 #&lt;br /&gt;
 # Example that spawns a row of skeletons into the coordinates (4,5),&lt;br /&gt;
 # (5,5), (6,5), (7,5), (8,5) and (9,5):&lt;br /&gt;
 #&lt;br /&gt;
 # {ITERATE 4 9 i (&lt;br /&gt;
 #     [unit]&lt;br /&gt;
 #         type=Skeleton&lt;br /&gt;
 #         x=$i&lt;br /&gt;
 #         y=5&lt;br /&gt;
 #     [/unit]&lt;br /&gt;
 # )}&amp;lt;br&amp;gt;&lt;br /&gt;
 #define ITERATE FROM TO VAR CONTENTS&lt;br /&gt;
     {VARIABLE {VAR} {FROM}}&amp;lt;br&amp;gt;&lt;br /&gt;
     [while]&lt;br /&gt;
         [variable]&lt;br /&gt;
             name={VAR}&lt;br /&gt;
             less_than_equal_to={TO}&lt;br /&gt;
         [/variable]&amp;lt;br&amp;gt;&lt;br /&gt;
         [do]&lt;br /&gt;
             {CONTENTS}&amp;lt;br&amp;gt;&lt;br /&gt;
             {VARIABLE_OP {VAR} add 1}&lt;br /&gt;
         [/do]&lt;br /&gt;
     [/while]&lt;br /&gt;
 #enddef&lt;br /&gt;
&lt;br /&gt;
== Adding unit overlays with a filter instead of (x,y) ==&lt;br /&gt;
&lt;br /&gt;
 # UNIT_OVERLAY adds an overlay to a unit, taking in a standard filter&lt;br /&gt;
 #&lt;br /&gt;
 # Example that gives all spearmen a book:&lt;br /&gt;
 # {UNIT_OVERLAY type=Spearman items/book1.png}&lt;br /&gt;
 &lt;br /&gt;
 #define UNIT_OVERLAY FILTER IMG&lt;br /&gt;
     [store_unit]&lt;br /&gt;
         [filter]&lt;br /&gt;
             {FILTER}&lt;br /&gt;
         [/filter]&lt;br /&gt;
         variable=UNIT_OVERLAY_store&lt;br /&gt;
         kill=no&lt;br /&gt;
     [/store_unit]&lt;br /&gt;
     {FOREACH UNIT_OVERLAY_store UNIT_OVERLAY_i}&lt;br /&gt;
 	{VARIABLE_OP UNIT_OVERLAY_tempx format $UNIT_OVERLAY_store[$UNIT_OVERLAY_i].x}&lt;br /&gt;
 	{VARIABLE_OP UNIT_OVERLAY_tempy format $UNIT_OVERLAY_store[$UNIT_OVERLAY_i].y}&lt;br /&gt;
         [unit_overlay]&lt;br /&gt;
             x=$UNIT_OVERLAY_tempx&lt;br /&gt;
             y=$UNIT_OVERLAY_tempy&lt;br /&gt;
 		image={IMG}&lt;br /&gt;
         [/unit_overlay]&lt;br /&gt;
     {NEXT UNIT_OVERLAY_i}&lt;br /&gt;
     {CLEAR_VARIABLE UNIT_OVERLAY_store}&lt;br /&gt;
 #enddef&lt;br /&gt;
&lt;br /&gt;
== Determining opposite coordinates ==&lt;br /&gt;
&lt;br /&gt;
 # Using this, you can determine the coordinates on the &amp;quot;opposite side&amp;quot; of a&lt;br /&gt;
 # central hex, relative to another hex adjacent to it. What this really means&lt;br /&gt;
 # is illustrated below:&lt;br /&gt;
 #       __            __            __&lt;br /&gt;
 #    __/  \__      __/2 \__      __/  \__&lt;br /&gt;
 #   /  \__/1 \    /  \__/  \    /2 \__/  \    C: central point&lt;br /&gt;
 #   \__/C \__/    \__/C \__/    \__/C \__/    1: the hex to &amp;quot;mirror&amp;quot;&lt;br /&gt;
 #   /2 \__/  \    /  \__/  \    /  \__/1 \    2: the result&lt;br /&gt;
 #   \__/  \__/    \__/1 \__/    \__/  \__/&lt;br /&gt;
 #      \__/          \__/          \__/&lt;br /&gt;
 #&lt;br /&gt;
 # The coordinates of the central point are given in {CENTER_X} and {CENTER_Y},&lt;br /&gt;
 # and the coordinates of hex 1 in {X} and {Y}. The coordinates of hex 2 are&lt;br /&gt;
 # then stored in {VAR}, which will have member variables x and y.&lt;br /&gt;
 #&lt;br /&gt;
 # Note that this uses the IF macro given earlier on this page.&amp;lt;br&amp;gt;&lt;br /&gt;
 #define OPPOSITE_SIDE CENTER_X CENTER_Y X Y VAR&lt;br /&gt;
     {VARIABLE x_odd {X}}&amp;lt;br&amp;gt;&lt;br /&gt;
     {VARIABLE_OP x_odd modulo 2}&amp;lt;br&amp;gt;&lt;br /&gt;
     {VARIABLE c_x {CENTER_X}}&lt;br /&gt;
     {VARIABLE c_y {CENTER_Y}}&lt;br /&gt;
     {VARIABLE s_x {X}}&lt;br /&gt;
     {VARIABLE s_y {Y}}&amp;lt;br&amp;gt;&lt;br /&gt;
     {VARIABLE result_x {CENTER_X}}&lt;br /&gt;
     {VARIABLE result_y {CENTER_Y}}&amp;lt;br&amp;gt;&lt;br /&gt;
     {IF_VAR s_x greater_than $c_x (&lt;br /&gt;
         [then]&lt;br /&gt;
             {VARIABLE_OP result_x add -1}&lt;br /&gt;
         [/then]&lt;br /&gt;
     )}&amp;lt;br&amp;gt;&lt;br /&gt;
     {IF_VAR s_x less_than $c_x (&lt;br /&gt;
         [then]&lt;br /&gt;
             {VARIABLE_OP result_x add 1}&lt;br /&gt;
         [/then]&lt;br /&gt;
     )}&amp;lt;br&amp;gt;&lt;br /&gt;
     {IF_VAR s_x equals $c_x (&lt;br /&gt;
         [then]&lt;br /&gt;
             {IF_VAR s_y less_than $c_y (&lt;br /&gt;
                 [then]&lt;br /&gt;
                     {VARIABLE_OP result_y add 1}&lt;br /&gt;
                 [/then]&lt;br /&gt;
             )}&amp;lt;br&amp;gt;&lt;br /&gt;
             {IF_VAR s_y greater_than $c_y (&lt;br /&gt;
                 [then]&lt;br /&gt;
                     {VARIABLE_OP result_y add -1}&lt;br /&gt;
                 [/then]&lt;br /&gt;
             )}&lt;br /&gt;
         [/then]&lt;br /&gt;
     )}&amp;lt;br&amp;gt;&lt;br /&gt;
     {IF_VAR x_odd equals 1 (&lt;br /&gt;
         [then]&lt;br /&gt;
             {IF_VAR s_y equals $c_y (&lt;br /&gt;
                 [then]&lt;br /&gt;
                     {VARIABLE_OP result_y add 1}&lt;br /&gt;
                 [/then]&lt;br /&gt;
             )}&lt;br /&gt;
         [/then]&amp;lt;br&amp;gt;&lt;br /&gt;
         [else]&lt;br /&gt;
             {IF_VAR s_y equals $c_y (&lt;br /&gt;
                 [then]&lt;br /&gt;
                     {VARIABLE_OP result_y add -1}&lt;br /&gt;
                 [/then]&lt;br /&gt;
             )}&lt;br /&gt;
         [/else]&lt;br /&gt;
     )}&lt;br /&gt;
     {VARIABLE {VAR}.x $result_x}&lt;br /&gt;
     {VARIABLE {VAR}.y $result_y}&amp;lt;br&amp;gt;&lt;br /&gt;
     {CLEAR_VARIABLE c_x}&lt;br /&gt;
     {CLEAR_VARIABLE c_y}&lt;br /&gt;
     {CLEAR_VARIABLE s_x}&lt;br /&gt;
     {CLEAR_VARIABLE s_y}&lt;br /&gt;
     {CLEAR_VARIABLE result_x}&lt;br /&gt;
     {CLEAR_VARIABLE result_y}&lt;br /&gt;
     {CLEAR_VARIABLE x_odd}&lt;br /&gt;
 #enddef&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[UsefulWMLFragments]]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: UsefulWMLFragments]]&lt;/div&gt;</summary>
		<author><name>Soldier</name></author>
		
	</entry>
</feed>