<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://oldwiki.devbox.themanaworld.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Modanung</id>
	<title>The Mana World - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://oldwiki.devbox.themanaworld.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Modanung"/>
	<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/wiki/Special:Contributions/Modanung"/>
	<updated>2026-05-06T02:15:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Image_dyeing&amp;diff=40581</id>
		<title>Development:Image dyeing</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Image_dyeing&amp;diff=40581"/>
		<updated>2016-07-03T23:40:12Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Simple colors and palettes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Simple colors and palettes==&lt;br /&gt;
&lt;br /&gt;
A pixel has a simple color if it is not black and if its non-zero RGB components are all equal. Or described in terms of the HSV color model: it has a hue divisible by 60, full saturation, and any value other than zero.&lt;br /&gt;
&lt;br /&gt;
There are seven simple colors:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;R&#039;&#039;&#039;ed&lt;br /&gt;
* &#039;&#039;&#039;G&#039;&#039;&#039;reen&lt;br /&gt;
* &#039;&#039;&#039;B&#039;&#039;&#039;lue&lt;br /&gt;
* &#039;&#039;&#039;C&#039;&#039;&#039;yan&lt;br /&gt;
* &#039;&#039;&#039;M&#039;&#039;&#039;agenta&lt;br /&gt;
* &#039;&#039;&#039;Y&#039;&#039;&#039;ellow&lt;br /&gt;
* &#039;&#039;&#039;W&#039;&#039;&#039;hite (gray, that is)&lt;br /&gt;
&lt;br /&gt;
For a given color, there are 255 different intensities (from 1 to 255). For RGB, the non-zero value is the intensity. For HSV, the volume is the intensity, scaled to 255.&lt;br /&gt;
&lt;br /&gt;
A palette is a sequence of RGB colors, for example &amp;lt;code&amp;gt;#8c4b41,da9041,ffff41&amp;lt;/code&amp;gt;. An intensity of 255 becomes color &amp;lt;code&amp;gt;#ffff41&amp;lt;/code&amp;gt;. An intensity of 0 is left unchanged (as black, &amp;lt;code&amp;gt;#000000&amp;lt;/code&amp;gt;). Intensities with no explicit color are linearly interpolated between the two closest value. Black is implicitly the first color of the palette. For example:&lt;br /&gt;
{|&lt;br /&gt;
! intensity&lt;br /&gt;
! color&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&amp;lt;code&amp;gt;#522C26&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|85&lt;br /&gt;
|&amp;lt;code&amp;gt;#8c4b41&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|100&lt;br /&gt;
|&amp;lt;code&amp;gt;#995741&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|170&lt;br /&gt;
|&amp;lt;code&amp;gt;#da9041&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Palettes can have from one to 255 colors.&lt;br /&gt;
&lt;br /&gt;
Pixels with complicated colors or without any dedicated palette are left unchanged by the dye process. The system can dye up to 1785 different colors.&lt;br /&gt;
&lt;br /&gt;
==Dye Channels==&lt;br /&gt;
===&#039;&#039;&#039;RGBCMYW&#039;&#039;&#039; Dyes===&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
 Single Channel Inline xml: image.png|R:#ColorCode&lt;br /&gt;
 Multi-Channel Inline xml: image.png|R:#ColorCode;B:#ColorCode&lt;br /&gt;
 Single Channel Preset xml: image.png|R&lt;br /&gt;
 Multi-Channel Preset xml: image.png|R;B&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;S&#039;&#039;&#039;wap dye===&lt;br /&gt;
This swaps a single specific color on a channel regardless of transparency for another&lt;br /&gt;
&lt;br /&gt;
Use: &lt;br /&gt;
 Inline xml: image.png|S:#StartingColor,#ResultColor;&lt;br /&gt;
 Preset xml: image.png|S &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 image.png|S:#FF0000,#00FF00; &lt;br /&gt;
 Starting color: #FF0000 (pure red)&lt;br /&gt;
 Result color: #00FF00 (pure green)&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;A&#039;&#039;&#039;lpha dye===&lt;br /&gt;
This swaps a single specific color on a channel taking transparency into account&lt;br /&gt;
&lt;br /&gt;
Use:&lt;br /&gt;
 Inline Xml: image.png|S:#StartingColor,#ResultColor;&lt;br /&gt;
 Preset Xml: image.png|S&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 image.png|S:#FF000088,#00FF0088;&lt;br /&gt;
 Starting color: #FF000088 (pure red with ~half transparency)&lt;br /&gt;
 Result color: #00FF0088 (pure green with ~half transparency)&lt;br /&gt;
&lt;br /&gt;
===One-channel example===&lt;br /&gt;
Here is a simple example taken from actual game data. The &amp;lt;code&amp;gt;data/monsters.xml&amp;lt;/code&amp;gt; file contains the descriptions of all the monsters. For black scorpions, the definition begins with&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;monster id=&amp;quot;1009&amp;quot; name=&amp;quot;Black scorpion&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;sprite&amp;gt;monster-scorpion.xml|#0d1313,435a5a,879999,ffffff&amp;lt;/sprite&amp;gt;&lt;br /&gt;
     &amp;lt;sound event=&amp;quot;hit&amp;quot;&amp;gt;scorpion-hit1.ogg&amp;lt;/sound&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;data/graphics/sprite/monster-scorpion.xml&amp;lt;/code&amp;gt; then describes the animation of any scorpion, whatever its color. It contains this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/monster-scorpion.png|W&amp;quot; width=&amp;quot;48&amp;quot; height=&amp;quot;45&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;monster-scorpion.png&amp;lt;/code&amp;gt; file is a grayscale image, hence the &#039;&#039;&#039;W&#039;&#039;&#039; color specifier, so that all its pixels are blackened (or dyed to brown or red for other species of scorpions). If it contained some non-gray pixels, these would not be recolored by the palette specified in the &amp;lt;code&amp;gt;monsters.xml&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
===Multi-channel example===&lt;br /&gt;
Here an example for multi-channel dyeing of an equipment sprite. This example recolors the gray sections of the image to green and the red sections to a gray-blue.&lt;br /&gt;
&lt;br /&gt;
head-devcap.xml:&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/head-devcap.png|W;R&amp;quot; width=&amp;quot;28&amp;quot; height=&amp;quot;19&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
items.xml:&lt;br /&gt;
 &amp;lt;sprite&amp;gt;head-devcap.xml|#22ff22,ffffff;#9999ff&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Designing graphics to be dyeable==&lt;br /&gt;
The easy way to make an existing graphic recolorable is to select the parts you want to be recolored and run it through a convert-to-greyscale filter and voilÃ , you have a recolorable &#039;W&#039; channel. For optimum results you should then adjust the levels of the grey area so that the darkest color is RGB 127, 127, 127 and the brightest color RGB 255, 255, 255. That way you can very simply define the darkest and the brightest color of the color ramp in items.xml.&lt;br /&gt;
&lt;br /&gt;
When you want to use another dye channel than &#039;W&#039; you can use &amp;quot;color channels&amp;quot; afterwards and remove one or two of the red, green and blue channel completely.&lt;br /&gt;
&lt;br /&gt;
==Test dyes without restarting Manaplus==&lt;br /&gt;
===In-Game===&lt;br /&gt;
You can reload some of the client-data by typing the following command into chat.&lt;br /&gt;
You may have to unequip items then use the command then equip them again.&lt;br /&gt;
 /cleangraphics&lt;br /&gt;
&lt;br /&gt;
===dyecmd===&lt;br /&gt;
After version 1.3.10.27 of manaplus: the dyecmd is supported.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
 dyecmd srcfile dyestring dstfile&lt;br /&gt;
 dyecmd srcdyestring dstfile&lt;br /&gt;
&lt;br /&gt;
examples:&lt;br /&gt;
 dyecmd cottonshirt.png W:#a4b2b2,ffffff test.png&lt;br /&gt;
 dyecmd &amp;quot;cottonshirt.png|W:#a4b2b2,ffffff&amp;quot; test2.png&lt;br /&gt;
&lt;br /&gt;
From Source&lt;br /&gt;
get manaplus source git clone https://bitbucket.org/akaras/manaplus.git&lt;br /&gt;
 autoreconf -i&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
 src/dyecmd&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40196</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40196"/>
		<updated>2016-02-17T01:46:08Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Gallery */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personal information ==&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Former pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://www.LucKeyProductions.nl www.LucKeyProductions.nl]&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Telegram:&#039;&#039;&#039; modanung&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/user/Modanung/library/TMW&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40195</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40195"/>
		<updated>2016-02-16T23:02:34Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Personal information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personal information ==&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Former pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://www.LucKeyProductions.nl www.LucKeyProductions.nl]&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Telegram:&#039;&#039;&#039; modanung&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/user/Modanung/library/TMW&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40194</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40194"/>
		<updated>2016-02-16T22:57:10Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Contact information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personal information ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Former pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://www.LucKeyProductions.nl www.LucKeyProductions.nl]&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Telegram:&#039;&#039;&#039; modanung&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/user/Modanung/library/TMW&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40193</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=40193"/>
		<updated>2016-02-16T22:56:06Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Personal information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personal information ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Former pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://www.LucKeyProductions.nl www.LucKeyProductions.nl]&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; f dot lindeijer at gmail dot com ...or... frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSN:&#039;&#039;&#039; modanung at hotmail dot com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GTalk:&#039;&#039;&#039; f dot lindeijer at gmail dot com&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/user/Modanung/library/TMW&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=23988</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=23988"/>
		<updated>2012-07-14T15:46:43Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Frode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personal information ==&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; f dot lindeijer at gmail dot com ...or... frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSN:&#039;&#039;&#039; modanung at hotmail dot com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GTalk:&#039;&#039;&#039; f dot lindeijer at gmail dot com&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/albums/y203/Modanung/&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=23987</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=23987"/>
		<updated>2012-07-14T15:46:34Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Frode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Frode ==&lt;br /&gt;
That&#039;s me&lt;br /&gt;
&lt;br /&gt;
== Personal information ==&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; f dot lindeijer at gmail dot com ...or... frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSN:&#039;&#039;&#039; modanung at hotmail dot com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GTalk:&#039;&#039;&#039; f dot lindeijer at gmail dot com&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/albums/y203/Modanung/&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=9772</id>
		<title>User:Modanung</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Modanung&amp;diff=9772"/>
		<updated>2008-07-17T21:00:54Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Frode ==&lt;br /&gt;
http://i6.photobucket.com/albums/y203/Modanung/M5110059_edit.jpg&lt;br /&gt;
&lt;br /&gt;
== Personal information ==&lt;br /&gt;
&#039;&#039;&#039;Full name:&#039;&#039;&#039; Frode Lindeijer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nickname:&#039;&#039;&#039; Modanung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Occupation:&#039;&#039;&#039; Pixel (and concept) artist for TMW&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Location:&#039;&#039;&#039; Groningen, Groningen, The Netherlands&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date of birth:&#039;&#039;&#039; 6th of July 1988&lt;br /&gt;
&lt;br /&gt;
== Contact information ==&lt;br /&gt;
&#039;&#039;&#039;E-mail:&#039;&#039;&#039; f dot lindeijer at gmail dot com ...or... frode at lindeijer dot nl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSN:&#039;&#039;&#039; modanung at hotmail dot com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GTalk:&#039;&#039;&#039; f dot lindeijer at gmail dot com&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Tulimshar street.jpg&lt;br /&gt;
Image:Leapmonster.jpg&lt;br /&gt;
Image:Woodenarmor.jpg&lt;br /&gt;
Image:Desert foodchain.jpg&lt;br /&gt;
Image:Tulimshar-wall.jpg&lt;br /&gt;
Image:Tulimshar-map.jpg&lt;br /&gt;
Image:Actionlayers.png&lt;br /&gt;
Image:Hairstyle mohawk.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Photobucket: http://s6.photobucket.com/albums/y203/Modanung/&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:Trebuchet2.png&amp;diff=8250</id>
		<title>File talk:Trebuchet2.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:Trebuchet2.png&amp;diff=8250"/>
		<updated>2007-12-17T23:28:54Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I made one of those a few years ago... about 1/5 of the scale as the one on the image. With a trough of about 2 meters, a beam of 3-4 meters and about 30-40 bricks as a counter weight. It could throw 5 kilo boulders or snowballs with a diameter of .5 meters about 45-50 meters away. [[User:Modanung|Modanung]] 00:28, 18 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:Trebuchet2.png&amp;diff=8249</id>
		<title>File talk:Trebuchet2.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:Trebuchet2.png&amp;diff=8249"/>
		<updated>2007-12-17T23:28:38Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I made one of those a few years ago... about 1/5 of the scale as the one on the image. With a trough of about 2 meters, a beam of 3-4 meters and about 30-40 bricks as a counter weight. It could throw 5 kilo boulders or snowballs with a diameter of .5 meters about 45-50 meters away.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_wind.png&amp;diff=7700</id>
		<title>File:Elements wind.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_wind.png&amp;diff=7700"/>
		<updated>2007-10-13T14:25:24Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Wind... air... what&amp;#039;s the difference.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Icon for the element air&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Elements&amp;diff=7699</id>
		<title>Archive:Elements</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Elements&amp;diff=7699"/>
		<updated>2007-10-13T14:24:48Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Changed element icons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
{{Gaps|&lt;br /&gt;
*Calculation of damage for sub-elements&lt;br /&gt;
}}&lt;br /&gt;
==Elements==&lt;br /&gt;
The main elements in the mana world are:&lt;br /&gt;
&lt;br /&gt;
[[Image:Elements_water.png]] Water&lt;br /&gt;
&lt;br /&gt;
[[Image:Elements_wind.png]] Air&lt;br /&gt;
&lt;br /&gt;
[[Image:Elements_fire.png]] Fire&lt;br /&gt;
&lt;br /&gt;
[[Image:Elements_earth.png]] Earth&lt;br /&gt;
&lt;br /&gt;
Every element got one element it is strong against and one it is weak against. These relationships form a circle:&lt;br /&gt;
&lt;br /&gt;
*Fire is extinguished by Water &lt;br /&gt;
*Water is absorbed by Earth &lt;br /&gt;
*Earth is eroded by Air &lt;br /&gt;
*Air is consumed by Fire &lt;br /&gt;
&lt;br /&gt;
Then there are four sub-elements:&lt;br /&gt;
*&#039;&#039;Air + Fire&#039;&#039; = Lightning&lt;br /&gt;
*&#039;&#039;Fire + Earth&#039;&#039; = Metal&lt;br /&gt;
*&#039;&#039;Earth + Water&#039;&#039; = Wood&lt;br /&gt;
*&#039;&#039;Water + Air&#039;&#039; = Ice&lt;br /&gt;
&lt;br /&gt;
==Elemental Effect on damage==&lt;br /&gt;
Elemental damage is mainly inflicted by magic attacks and magic weapons. Normal weapons inflict damage that is not modified by elements. &lt;br /&gt;
&lt;br /&gt;
Every being has an elemental damage modifier for each element. These modifiers are percentual modifiers that are applied to the elemental damage the being receives before the damage reductions by physical or magical defence are applied.&lt;br /&gt;
&lt;br /&gt;
The system allows &amp;quot;composite damage&amp;quot; attacks of unelemental and different elemental damages. When a being receives a hit by an obscure multi-elemental physical attack that gives 100 unelemental damage, 50 fire damage, 50 water damage, 50 air damage and 50 earth damage, each elemental part of the attack is modified individually. The results are added and then processed as one attack by the other damage calculation mechanics.&lt;br /&gt;
&lt;br /&gt;
==Elemental modifiers of player characters==&lt;br /&gt;
The elemental modifiers of player characters are influenced slightly by its race and mostly by its equipment. They can also be changed by temporary status effects. &lt;br /&gt;
&lt;br /&gt;
Every piece of defensive equipment that got an elemental property lowers damage received from the element it is strong against but on the other hand increases the damage received from the element it is weak against by an equal factor. This means that every resistance against one element is cancelled out by an equal weakness against another element. A &amp;quot;rainbow equipment set&amp;quot; that mixes pieces of all elements results in no resistance at all because all the resistances cancle each other out. That way a character can never be completely invulnerable.&lt;br /&gt;
&lt;br /&gt;
For calculating these resistances and weaknesses every defence item with an elemental property got an elemental property modifier that is a decimal number usually slightly larger than 1.0. All elemental damage of the element it is strong against is divided through this number and all elemental damage of the element it is weak against is multiplied with this number. The elemental property modifier is communicated to the player in the item description as a percentual modifier on both elements to make it easier for the player to understand the effect of the item.&lt;br /&gt;
&lt;br /&gt;
This system only covers the 4 main elements. The combined elements, lightning, metal, wood and ice, aren&#039;t covered in it yet.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Example&#039;&#039;&#039;: A mage robe of earth would, in addition to raising the characters earth magic skill, have an elemental modifier of &amp;quot;Earth 1.25&amp;quot;. This means it lower all received water damage by 20% (100% / 1.25) but increase all received air damage by 25% (100% * 1.25). &lt;br /&gt;
&lt;br /&gt;
All elemental damage modifiers are applied one after another. This means that the total elemental modifier of a character is the multiplication of all its elemental modifiers. As long as there are no items with an elemental modifier of 0.0 no total elemental modifier of a character can reach 0 and thus garant complete immunity against an element. And such items should not exist as they would result in a division by zero when calculating the damage of the element it creates a vulnerability for (infinite damage?).&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Example&#039;&#039;&#039;: A character wears two very powerful water items with a modifier of &amp;quot;Water 2.0&amp;quot; each and thus has two times a 50% resistance against fire and two times 100% more damage by earth. This does not result in 0% fire damage but in 25% fire damage (0.5 x 0.5 = 0.25) and doesn&#039;t mean 300% damage by earth but 400% damage (2.0 x 2.0 = 4.0). &lt;br /&gt;
&lt;br /&gt;
===Formula===&lt;br /&gt;
 Damage Modifier(element) = 100% * EP(element+1) / EP(element-1)&lt;br /&gt;
 EP(element) = product of the elemental property modifiers for the element.&lt;br /&gt;
&lt;br /&gt;
===Elemental resistances without coupling to an elemental weakness===&lt;br /&gt;
Equipment pieces or status effects that modify the resistance against one element without affecting the others (think &amp;quot;asbesto jacket&amp;quot; for fire resistance) are thinkable but should be rather the exception than the rule. &lt;br /&gt;
&lt;br /&gt;
===Elemental modifiers &amp;lt; 1.0===&lt;br /&gt;
Elemental modifiers smaller than one would result in less damage by the element it is weak against and more damage by the element it is strong against. Such items are technically possible in this system without any problems when the content designers need such an effect.&lt;br /&gt;
&lt;br /&gt;
==Elemental resistances and weaknesses of monsters==&lt;br /&gt;
I think we can take the freedom to set those arbitarily. In case of monsters that are clearly the incorporation of a specific element we should stay by the rule &amp;quot;strong against following element - weak against preceeding&amp;quot;, but in case of other monsters we can set the resistances as they seem plausible to us (a hay golem can be vulnerable against fire without being invulnerable to earth, for example).&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_wind.png&amp;diff=7698</id>
		<title>File:Elements wind.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_wind.png&amp;diff=7698"/>
		<updated>2007-10-13T14:21:43Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Icon for the element wind&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Icon for the element wind&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_water.png&amp;diff=7697</id>
		<title>File:Elements water.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_water.png&amp;diff=7697"/>
		<updated>2007-10-13T14:21:28Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Icon for the element water&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Icon for the element water&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_fire.png&amp;diff=7696</id>
		<title>File:Elements fire.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_fire.png&amp;diff=7696"/>
		<updated>2007-10-13T14:21:15Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Icon for the element fire&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Icon for the element fire&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_earth.png&amp;diff=7695</id>
		<title>File:Elements earth.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Elements_earth.png&amp;diff=7695"/>
		<updated>2007-10-13T14:20:53Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Icon for the element earth&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Icon for the element earth&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7677</id>
		<title>Talk:Argaes</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7677"/>
		<updated>2007-10-09T19:22:45Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I personally was thinking of this continent as pretty bare. Rocky with some ruins. The middle part being low and to the west and east the height would increase.&lt;br /&gt;
Watch out not to make a small enviroment too rich when it comes to variation in landscape. Desert, plains, forest, jungle AND mountains? I think that&#039;s way too much. I imagined this island to be a bit like Iceland. Mainly these parts of Iceland:&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Image:NesjavellirPowerPlant_edit2.jpg]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Image:Gr%C3%ADmsey_Iceland.JPG]&lt;br /&gt;
&lt;br /&gt;
Water in the middle and steep cliffs at the East and West coast.&lt;br /&gt;
Don&#039;t get me wrong, the map looks ok. But it&#039;s just way too much packed in a small enviroment if you ask me.&lt;br /&gt;
[[User:Modanung|Modanung]] 00:53, 13 September 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:I think such a landscape would result in pretty boring maps as there are few natural obstacles. --[[User:Crush|Crush]] 02:13, 13 September 2007 (CEST)&lt;br /&gt;
::Without mountains you can still have steep natural walls, just not that tall (1-3 tiles). And how about big slabs of rock and cravices? What&#039;s the difference between that and a desert? [[User:Modanung|Modanung]] 14:13, 26 September 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
[http://i6.photobucket.com/albums/y203/Modanung/argaes1.png Here&#039;s] a quick and rough concept of how I think the continent should look like. Pretty barren except for some low vegitation, maybe savannah-like (warm Iceland).&lt;br /&gt;
[[User:Modanung|Modanung]] 21:22, 9 October 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:Crush/Magic_System_Populous_3_style&amp;diff=7651</id>
		<title>User talk:Crush/Magic System Populous 3 style</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:Crush/Magic_System_Populous_3_style&amp;diff=7651"/>
		<updated>2007-10-05T09:39:18Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I&#039;d say the persistent area of effect spells stay at the same area. I would refer to spells that move with the player as aura spells. [[User:Modanung|Modanung]] 11:39, 5 October 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Attributes&amp;diff=7636</id>
		<title>Archive:Attributes</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Attributes&amp;diff=7636"/>
		<updated>2007-10-04T19:30:14Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Attributes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Category_gameconcept}}&lt;br /&gt;
{{Status_yellow}}&lt;br /&gt;
{{Gaps|&lt;br /&gt;
*Decide the exact role of intelligence and willpower in the magic system&lt;br /&gt;
*Decide on one skill system and delete the section about this question&lt;br /&gt;
*Formulas for more derived attributes that are important&lt;br /&gt;
*Nail down the attribute increase rules&lt;br /&gt;
}}&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
We have the following 5 attributes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: left; background-color: rgb(240,240,240);&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;text-align: left; background-color: rgb(240,240,240);&amp;quot; | General effect&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Strength&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
*damage with melee weapons&lt;br /&gt;
*inventory weight&lt;br /&gt;
*prerequisite for string-based ranged weapons&lt;br /&gt;
*prerequisite for heavy melee weapons&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Dexterity&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
*chance to hit&lt;br /&gt;
*chance to dodge&lt;br /&gt;
*damage with ranged weapons.&lt;br /&gt;
*prerequisite for elegant melee weapons&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Vitality&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
*maximum hit points&lt;br /&gt;
*hit point regeneration rate&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Intelligence&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Related to the magic system&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Willpower&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
Related to the magic system&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The effective value of attributes may never be below one. Even when modificators push it to zero or below the value used by formulas is always at least 1 to avoid divisions by zero.&lt;br /&gt;
&lt;br /&gt;
===Derived Attributes===&lt;br /&gt;
;Hit points: (vitality + 10) * (level + 10)&lt;br /&gt;
;Hit point regeneration: (vitality + 10)Â² hp per minute&lt;br /&gt;
&lt;br /&gt;
== Skills ==&lt;br /&gt;
&lt;br /&gt;
Interesting notes about possible skill systems were made at [[skill system]], [[skill system 2]] and at the [[master skill list]].&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;I think that the [[master skill list]] is still a nice proposal, but I think we should leave out the &amp;quot;Stat skills&amp;quot;.&#039;&#039; --[[User:BjÃ¸rn|BjÃ¸rn]] 11:53, 10 June 2006 (CEST)&lt;br /&gt;
::&#039;&#039;I tweaked the [[skill system 2]] propoal to work together with this article. I hope you like it better now. It shouldn&#039;t be left out because it is the first well thought out proposal for exp gain of skills. The &amp;quot;1 exp per action&amp;quot; concept of the [[skill system]] is just too simple to work. When you want to have some skills from the master skill list you should think about how the concepts of skill system 2 can be applied to those.&#039;&#039; --[[User:Crush|Crush]] 15:34, 31 August 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Deriving level from skills ===&lt;br /&gt;
&lt;br /&gt;
The character level depends mostly on the best skills of the character and less on the less good skills.&lt;br /&gt;
&lt;br /&gt;
We multiply the skill level by a factor based on to what extend the skill is one of your top skills, and devide the sum by a given amount. When n is the index of the skill in the list sorted on skill level, 0.9^n could be the factor. An example with 10 skills for a typically average trained character (with skills and level going from 1 to 100):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0  1.0 * 78 = 78.0&lt;br /&gt;
1  0.9 * 65 = 58.5&lt;br /&gt;
2  0.81 * 53 = 42.93&lt;br /&gt;
3  0.729 * 40 = 29.16&lt;br /&gt;
4  0.6561 * 40 = 26.244&lt;br /&gt;
5  0.59049 * 38 = 22.43862&lt;br /&gt;
6  0.531441 * 33 = 17.537553&lt;br /&gt;
7  0.4782969 * 23 = 11.0008287&lt;br /&gt;
8  0.43046721 * 20 = 8.6093442&lt;br /&gt;
9  0.387420489 * 15 = 5.811307335&lt;br /&gt;
&lt;br /&gt;
Sum of factors: 6.513215599&lt;br /&gt;
Sum of skills * factors: 300.231653235&lt;br /&gt;
Character level: 46.0957646298544 (level 46, 10% progression to next level)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the character level is used in any formulas it is always rounded down to the next lowest integer. Should the character lose skill levels for some reason the level will never be reduced. That way we don&#039;t have to deal with loss and regain of attribute increase points.&lt;br /&gt;
&lt;br /&gt;
The best thing the character can do to work towards the next level is to raise its highest skill. The downside to do this is that this will be the hardest thing to do because it will be exponentially harder to increase in a certain skill.&lt;br /&gt;
&lt;br /&gt;
=== From level to character attributes ===&lt;br /&gt;
&lt;br /&gt;
Every levelup the character receives a number of points that can be used to increase its attributes. Every point can at any time be exchanged in raising one attribute by one point. When we assume that every attribute starts at 10 and we have a maximum of 100 per attribute a maxed out character would need 450 points. When we assume that characters have a theoretical maximum of 100 levels then 4 points per levelup would be adequate.&lt;br /&gt;
&lt;br /&gt;
Crush has noted that he&#039;d like players to be able to decrease their attributes as well, in order to increase others and thereby allowing the players to &amp;quot;correct their mistakes&amp;quot; if they think they have previously made the wrong choices when distributing the points for their attributes. As a solution we could choose for a system where for each level increase, one or more points can be substracted before proceeding with distributing points amongst attributes.&lt;br /&gt;
&lt;br /&gt;
More refined, the idea is now that for each level increase you get a certain amount of &#039;-&#039; points and a certain amount of &#039;+&#039; points. The &#039;-&#039; points can be used to decrease an attribute, and results in the gain of a &#039;+&#039; point. &#039;+&#039; points can simply be used to increase an attribute. To make sure that players cannot collect &#039;-&#039; points in order to make big changes to their character attributes later, the maximum amount of &#039;-&#039; points that can be accumulated should be restricted.&lt;br /&gt;
&lt;br /&gt;
=== Attribute increase rules ===&lt;br /&gt;
{{Status_red}}&lt;br /&gt;
To avoid unbalanced characters players should have some restrictions when distributing the stat points. Without any restrictions a level 23 character could already have one stat maxed out under the conditions mentioned above. To make this impossible I would suggest to use one of the following restrictions (or a combination of several):&lt;br /&gt;
# The game design has to be made in a way that every character type needs a bit of every stat so unbalanced characters are unplayable (I would not suggest this because it is a) very hard to realize and b) very hard to combine with encouraging character specialisation)&lt;br /&gt;
# The highest attribute may not be higher than all other attributes together (not that good because it would work against single stat specialisation but not against double stat specialisation)&lt;br /&gt;
# Add a special penalty for unbalanced characters (I think this would just feel too artifical)&lt;br /&gt;
# Making attribute increase cost more points the higher the attribute is (That&#039;s the way Ragnarok Online does it. And as Ragnarok Online shows this works against maxing stats too early but not against one-sided characters)&lt;br /&gt;
# No attribute may be higher than the character level (would require all characters to start with all stats on 1)&lt;br /&gt;
# No attribute may be higher than double as high as the lowest attribute&lt;br /&gt;
# The difference between the lowest and the highest attribute may not be larger than the character level (I would favor this solution because it means more choices the further your character advances while inexperienced players with low characters have no possibilities to ruin their character and it is a good compromise between allowing specialisation and maintaining balanced characters)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I think number one isn&#039;t hard to realize at all. Diablo 1/2 did the same, you got like 5 points each level and of course you could choose to maximize one of your attributes, but this wasn&#039;t particularly useful. A very strong character (strength) isn&#039;t useful when it can&#039;t hit anything (dexterity) and neither when it has very low health (vitality) or is hit all the time (agility), and I think this should go for any case where you max out just one attribute. Another reason not to max out just one attribute was that many items came with a minimum demand on a certain attribute before you could equip them. The problem with most of the other restrictions (except 4 and 5 I&#039;d say), is that they&#039;re hard to communicate intuitively to the user.&#039;&#039; --[[User:BjÃ¸rn|BjÃ¸rn]] 14:03, 26 March 2007 (CEST)&lt;br /&gt;
:&#039;&#039;Remember that Diablo had a strict class system while we give the player much more freedom in character creation. Attributes are the only thing that separates a warrior from a mage. So when every attribute is important for every character it would be very easy to create omni-characters that can do everything.&#039;&#039; --[[User:Crush|Crush]] 23:42, 11 July 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7612</id>
		<title>Talk:Argaes</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7612"/>
		<updated>2007-09-26T12:22:54Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I personally was thinking of this continent as pretty bare. Rocky with some ruins. The middle part being low and to the west and east the height would increase.&lt;br /&gt;
Watch out not to make a small enviroment too rich when it comes to variation in landscape. Desert, plains, forest, jungle AND mountains? I think that&#039;s way too much. I imagined this island to be a bit like Iceland. Mainly these parts of Iceland:&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:NesjavellirPowerPlant_edit2.jpg&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:Gr%C3%ADmsey_Iceland.JPG&lt;br /&gt;
&lt;br /&gt;
Water in the middle and steep cliffs at the East and West coast.&lt;br /&gt;
Don&#039;t get me wrong, the map looks ok. But it&#039;s just way too much packed in a small enviroment if you ask me.&lt;br /&gt;
[[User:Modanung|Modanung]] 00:53, 13 September 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:I think such a landscape would result in pretty boring maps as there are few natural obstacles. --[[User:Crush|Crush]] 02:13, 13 September 2007 (CEST)&lt;br /&gt;
::Without mountains you can still have steep natural walls, just not that tall (1-3 tiles). And how about big slabs of rock and cravices? What&#039;s the difference between that and a desert? [[User:Modanung|Modanung]] 14:13, 26 September 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7611</id>
		<title>Talk:Argaes</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7611"/>
		<updated>2007-09-26T12:13:40Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I personally was thinking of this continent as pretty bare. Rocky with some ruins. The middle part being low and to the west and east the height would increase.&lt;br /&gt;
Watch out not to make a small enviroment too rich when it comes to variation in landscape. Desert, plains, forest, jungle AND mountains? I think that&#039;s way too much. I imagined this island to be a bit like Iceland. Mainly these parts of Iceland:&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:NesjavellirPowerPlant_edit2.jpg&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:Gr%C3%ADmsey_Iceland.JPG&lt;br /&gt;
&lt;br /&gt;
Water in the middle and steep cliffs at the East and West coast.&lt;br /&gt;
Don&#039;t get me wrong, the map looks ok. But it&#039;s just way too much packed in a small enviroment if you ask me.&lt;br /&gt;
[[User:Modanung|Modanung]] 00:53, 13 September 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:I think such a landscape would result in pretty boring maps as there are few natural obstacles. --[[User:Crush|Crush]] 02:13, 13 September 2007 (CEST)&lt;br /&gt;
::Without mountains you can still have steep natural walls, just not that tall (1-3 tiles). And how about big slabs of rock and cravices? What&#039;s the difference between that and a desert?[[User:Modanung|Modanung]] 14:13, 26 September 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7580</id>
		<title>Talk:Argaes</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Argaes&amp;diff=7580"/>
		<updated>2007-09-12T22:53:13Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I personally was thinking of this continent as pretty bare. Rocky with some ruins. The middle part being low and to the west and east the height would increase.&lt;br /&gt;
Watch out not to make a small enviroment too rich when it comes to variation in landscape. Desert, plains, forest, jungle AND mountains? I think that&#039;s way too much. I imagined this island to be a bit like Iceland. Mainly these parts of Iceland:&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:NesjavellirPowerPlant_edit2.jpg&lt;br /&gt;
*http://en.wikipedia.org/wiki/Image:Gr%C3%ADmsey_Iceland.JPG&lt;br /&gt;
&lt;br /&gt;
Water in the middle and steep cliffs at the East and West coast.&lt;br /&gt;
Don&#039;t get me wrong, the map looks ok. But it&#039;s just way too much packed in a small enviroment if you ask me.&lt;br /&gt;
[[User:Modanung|Modanung]] 00:53, 13 September 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:Axltrozz&amp;diff=6113</id>
		<title>User talk:Axltrozz</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:Axltrozz&amp;diff=6113"/>
		<updated>2007-02-22T13:55:08Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Argh, preview&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You know there&#039;s something like a preview button on every wiki, right?&lt;br /&gt;
I doubt you do because you made a lot of changes in a short timespan. [[User:Modanung|Modanung]] 14:55, 22 February 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive_talk:Old_Races&amp;diff=5818</id>
		<title>Archive talk:Old Races</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive_talk:Old_Races&amp;diff=5818"/>
		<updated>2007-01-04T09:45:49Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Newline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I think this article is obsolete now that we decided to use the new [[races]] and the new [[backstory]] and should be deleted. --[[User:Crush|Crush]] 01:36, 4 January 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
I think it could be used for non-playable races. [[User:Modanung|Modanung]] 10:45, 4 January 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive_talk:Old_Races&amp;diff=5817</id>
		<title>Archive talk:Old Races</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive_talk:Old_Races&amp;diff=5817"/>
		<updated>2007-01-04T09:45:23Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I think this article is obsolete now that we decided to use the new [[races]] and the new [[backstory]] and should be deleted. --[[User:Crush|Crush]] 01:36, 4 January 2007 (CET)&lt;br /&gt;
I think it could be used for non-playable races. [[User:Modanung|Modanung]] 10:45, 4 January 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Time_system&amp;diff=5548</id>
		<title>Archive:Time system</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Time_system&amp;diff=5548"/>
		<updated>2006-12-06T21:26:00Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Udated a link (and added one with the previous edit)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_red}}&lt;br /&gt;
== Time system ==&lt;br /&gt;
&lt;br /&gt;
How long is a day in the Mana World, relative to a day in Earth time? Or does time pass in this world at all? These questions are to be answered later on...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Related Forum topics:&#039;&#039;&#039;&lt;br /&gt;
*http://forums.themanaworld.org/viewtopic.php?t=502&lt;br /&gt;
*http://forums.themanaworld.org/viewtopic.php?t=1434&lt;br /&gt;
&lt;br /&gt;
== Day/night system ==&lt;br /&gt;
Day and night system would allow the game to have a day state and a nocturnal state.&lt;br /&gt;
Giving the possibility to add multiple monster spawn sets. All point mentioned below are merely possible effects.&lt;br /&gt;
&lt;br /&gt;
Day would..&lt;br /&gt;
* Enable light mapping&lt;br /&gt;
* Enable Day time animals to appear&lt;br /&gt;
* Open all shops&lt;br /&gt;
* Give light magic more power&lt;br /&gt;
* Enable diurnal NPCs to appear&lt;br /&gt;
&lt;br /&gt;
Night would..&lt;br /&gt;
* Enable nocturnal animals to appear&lt;br /&gt;
* Make ghosts appear? (what kind of ghosts? creatures or playerghosts?)&lt;br /&gt;
* Allow players to commit burglary&lt;br /&gt;
* Make magic and fire look even cooler&lt;br /&gt;
* Maybe give access to places hidden in daylight (doors that show only in moonlight)&lt;br /&gt;
* Be the perfect time for a secret clan meeting&lt;br /&gt;
* Make darkness magic more powerful&lt;br /&gt;
* Enable nocturnal NPCs to appear&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Time_system&amp;diff=5547</id>
		<title>Archive:Time system</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Time_system&amp;diff=5547"/>
		<updated>2006-12-06T21:24:53Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Time system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_red}}&lt;br /&gt;
== Time system ==&lt;br /&gt;
&lt;br /&gt;
How long is a day in the Mana World, relative to a day in Earth time? Or does time pass in this world at all? These questions are to be answered later on...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Related Forum topics:&#039;&#039;&#039;&lt;br /&gt;
*http://themanaworld.org/phpBB2/viewtopic.php?t=502&lt;br /&gt;
*http://forums.themanaworld.org/viewtopic.php?t=1434&lt;br /&gt;
&lt;br /&gt;
== Day/night system ==&lt;br /&gt;
Day and night system would allow the game to have a day state and a nocturnal state.&lt;br /&gt;
Giving the possibility to add multiple monster spawn sets. All point mentioned below are merely possible effects.&lt;br /&gt;
&lt;br /&gt;
Day would..&lt;br /&gt;
* Enable light mapping&lt;br /&gt;
* Enable Day time animals to appear&lt;br /&gt;
* Open all shops&lt;br /&gt;
* Give light magic more power&lt;br /&gt;
* Enable diurnal NPCs to appear&lt;br /&gt;
&lt;br /&gt;
Night would..&lt;br /&gt;
* Enable nocturnal animals to appear&lt;br /&gt;
* Make ghosts appear? (what kind of ghosts? creatures or playerghosts?)&lt;br /&gt;
* Allow players to commit burglary&lt;br /&gt;
* Make magic and fire look even cooler&lt;br /&gt;
* Maybe give access to places hidden in daylight (doors that show only in moonlight)&lt;br /&gt;
* Be the perfect time for a secret clan meeting&lt;br /&gt;
* Make darkness magic more powerful&lt;br /&gt;
* Enable nocturnal NPCs to appear&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5369</id>
		<title>Archive:PvP Games</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5369"/>
		<updated>2006-11-06T16:54:38Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Fixed a typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_red}}&lt;br /&gt;
TMW should have some PvP minigame types.&lt;br /&gt;
This is a great way of competition and killing time and above that a whole lot of fun.&lt;br /&gt;
With every game players are able to place bets. Bets for money, items, pets, women or maybe even realestate if they feel really lucky. Most games can also be played just for fun, but involving bets makes it more exciting.&lt;br /&gt;
All games need at least 2 players to be played. Some could be played with up to 4 players.&lt;br /&gt;
&lt;br /&gt;
Add your own ideas for games we could implement if you miss something or come up with an idea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Out-in-the-field games==&lt;br /&gt;
These games can be played almost anywhere by challenging another player. After starting a game players automatically sit facing eachother with one tile in between them. In the middle lies the playing field where the cards are played, the dice are thrown or where the board is placed. Players walking by can magnify the playing field and follow the game. Ofcourse in case of a cardgame they cannot see the hand of the players if this is part of the rules.&lt;br /&gt;
&lt;br /&gt;
===Cardgames===&lt;br /&gt;
Players that have a pack of the same sort of cards can challenge one another to play a game of cards.&lt;br /&gt;
We could use a standard pack of cards and implement existing games.&lt;br /&gt;
&lt;br /&gt;
We could also (maybe aside from the normal pack) have a pack of cards we designed ourselves. Maybe a bit like Magic the Gathering?&lt;br /&gt;
&lt;br /&gt;
===Dicegames===&lt;br /&gt;
If one player has a set of dice he can challenge another player to play dice with him. Dicegames are merely based on luck.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* http://boardgames.about.com/cs/dicegames/tp/dice-games.htm&lt;br /&gt;
* http://www.realbeer.com/fun/games/dice.php&lt;br /&gt;
&lt;br /&gt;
===Combination games===&lt;br /&gt;
&lt;br /&gt;
Combination games involve both dice and classic cards. Both players should carry a pack of cards and one player needs a pack of dice.&lt;br /&gt;
&lt;br /&gt;
===Boardgames===&lt;br /&gt;
&lt;br /&gt;
To play board games one player needs to carry a board game with him.&lt;br /&gt;
Some examples are:&lt;br /&gt;
* Backgammon&lt;br /&gt;
* Chess&lt;br /&gt;
* Draughts&lt;br /&gt;
* Hnefatafl (Anglo-Norse Boardgame: http://en.wikipedia.org/wiki/Tafl_games)&lt;br /&gt;
* Reversi&lt;br /&gt;
&lt;br /&gt;
We could ofcourse also design our own boardgame. Also every region could have his very own boardgame. This would be designed by us, may it be based on an exsisting game. Every region would have an NPC called &amp;quot;[name] the [game] master&amp;quot; that can teach you about the boardgame. He is so masterfull he can play the game simultanious against a whole bunch of players. So they can all sit around and learn the game. If you win a best-out-of-three competition from the master you get a rulebook. You can buy the boardgame at the local (general) store.&lt;br /&gt;
&lt;br /&gt;
==Place-bound games==&lt;br /&gt;
These games can only be played at places where the facilities allow them to be played.&lt;br /&gt;
&lt;br /&gt;
===Darts===&lt;br /&gt;
In some inns there should be a dartboard (maybe our own version) so players could play darts. Throwing darts should take place in a special window. The player controls a cursor (with keyboard or mouse) and their dexterity influences their accuracy. There are two ways to do this:&lt;br /&gt;
The first way is to let the cursor sway around the spot where the player aims. The amount it sways and the speed with which it sways decrease with the dexterity&#039;s increase.&lt;br /&gt;
The other way is to have a stable cursor but have the dart fly in a slightly random direction. The randomness should decrease with the dexterity&#039;s increase. There is a circle around the target that shows the area in which the dart could end up.&lt;br /&gt;
&lt;br /&gt;
The first way leaves the player with more influence on the actual direction of the dart eventhough a low dexterity makes it harder to hit the spot he wants. He sees where the dart will hit the board before he presses the button, it&#039;s all about timing and reflexes. Whereas the other way the player should just be lucky with where the dart hits the board.&lt;br /&gt;
Players should be able to add a handicap for themselves if they want to make it a fair game. Setting your handicap to 10 should decrease your dexterity with 10 during the game.&lt;br /&gt;
 &lt;br /&gt;
:i think any game of skill is not a good idea in an online game because it would be too easy to program a perfect playing bot which plays for you. --[[User:Crush|Crush]] 20:51, 16 Sep 2005 (CEST)&lt;br /&gt;
::What are you suggesting? Luck-based games only? Don&#039;t you agree that would suck fried peanuts? You will always keep bots, and they should be deleted. We should just make it hard to write bots. [[User:Modanung|Modanung]] 00:50, 17 Sep 2005 (CEST)&lt;br /&gt;
:::how about strategy games like chess variants? Or card games that have a luck component and a strategical component? --[[User:Crush|Crush]] 03:19, 13 March 2006 (CET)&lt;br /&gt;
::::Well people could write a chess bot as well, right? And pure chance games are boring, if there&#039;s nothing else. Besides, if you know someone is a bot/cheater you won&#039;t play darts with him. [[User:Modanung|Modanung]] 18:15, 13 March 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
===Ringfights===&lt;br /&gt;
Ringfights take place in an arena or at a fightclub. Any place with something that looks like a boxing-ring will do.&lt;br /&gt;
In a ringfight two players fight eachother without any equipment or items. Players are not allowed (and not able) to use any form of magic either. So it is hand-to-hand combat only. The goal is to knock-out the other player. Knocking a player out is easiest if your strength is high and your opponents vitality low. You can try to block or evade attacks. Both need good timing. Blocking an attack is most effective whith a lot of strength, but still makes you lose some health. The higher your strength, the less health you lose when hit while blocking. Evading doesn&#039;t always succeed. The chance to evade an attack increases with your dexterity. If you evade an attack you recieve no damage at all.&lt;br /&gt;
If a player loses a match he is placed outside the arena with 1/4 of his maximum health. Even losers get some treatment after the match.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5368</id>
		<title>Archive:PvP Games</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5368"/>
		<updated>2006-11-06T16:54:13Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Ringfights */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_red}}&lt;br /&gt;
TMW should have some PvP minigame types.&lt;br /&gt;
This is a great way of competition and killing time and above that a whole lot of fun.&lt;br /&gt;
With every game players are able to place bets. Bets for money, items, pets, women or maybe even realestate if they feel really lucky. Most games can also be played just for fun, but involving bets makes it more exciting.&lt;br /&gt;
All games need at least 2 players to be played. Some could be played with up to 4 players.&lt;br /&gt;
&lt;br /&gt;
Add your own ideas for games we could implement if you miss something or come up with an idea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Out-in-the-field games==&lt;br /&gt;
These games can be played almost anywhere by Challenging another player. After starting a game players automatically sit facing eachother with one tile in between them. In the middle lies the playing field where the cards are played, the dice are thrown or where the board is placed. Players walking by can magnify the playing field and follow the game. Ofcourse in case of a cardgame they cannot see the hand of the players if this is part of the rules.&lt;br /&gt;
&lt;br /&gt;
===Cardgames===&lt;br /&gt;
Players that have a pack of the same sort of cards can challenge one another to play a game of cards.&lt;br /&gt;
We could use a standard pack of cards and implement existing games.&lt;br /&gt;
&lt;br /&gt;
We could also (maybe aside from the normal pack) have a pack of cards we designed ourselves. Maybe a bit like Magic the Gathering?&lt;br /&gt;
&lt;br /&gt;
===Dicegames===&lt;br /&gt;
If one player has a set of dice he can challenge another player to play dice with him. Dicegames are merely based on luck.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* http://boardgames.about.com/cs/dicegames/tp/dice-games.htm&lt;br /&gt;
* http://www.realbeer.com/fun/games/dice.php&lt;br /&gt;
&lt;br /&gt;
===Combination games===&lt;br /&gt;
&lt;br /&gt;
Combination games involve both dice and classic cards. Both players should carry a pack of cards and one player needs a pack of dice.&lt;br /&gt;
&lt;br /&gt;
===Boardgames===&lt;br /&gt;
&lt;br /&gt;
To play board games one player needs to carry a board game with him.&lt;br /&gt;
Some examples are:&lt;br /&gt;
* Backgammon&lt;br /&gt;
* Chess&lt;br /&gt;
* Draughts&lt;br /&gt;
* Hnefatafl (Anglo-Norse Boardgame: http://en.wikipedia.org/wiki/Tafl_games)&lt;br /&gt;
* Reversi&lt;br /&gt;
&lt;br /&gt;
We could ofcourse also design our own boardgame. Also every region could have his very own boardgame. This would be designed by us, may it be based on an exsisting game. Every region would have an NPC called &amp;quot;[name] the [game] master&amp;quot; that can teach you about the boardgame. He is so masterfull he can play the game simultanious against a whole bunch of players. So they can all sit around and learn the game. If you win a best-out-of-three competition from the master you get a rulebook. You can buy the boardgame at the local (general) store.&lt;br /&gt;
&lt;br /&gt;
==Place-bound games==&lt;br /&gt;
These games can only be played at places where the facilities allow them to be played.&lt;br /&gt;
&lt;br /&gt;
===Darts===&lt;br /&gt;
In some inns there should be a dartboard (maybe our own version) so players could play darts. Throwing darts should take place in a special window. The player controls a cursor (with keyboard or mouse) and their dexterity influences their accuracy. There are two ways to do this:&lt;br /&gt;
The first way is to let the cursor sway around the spot where the player aims. The amount it sways and the speed with which it sways decrease with the dexterity&#039;s increase.&lt;br /&gt;
The other way is to have a stable cursor but have the dart fly in a slightly random direction. The randomness should decrease with the dexterity&#039;s increase. There is a circle around the target that shows the area in which the dart could end up.&lt;br /&gt;
&lt;br /&gt;
The first way leaves the player with more influence on the actual direction of the dart eventhough a low dexterity makes it harder to hit the spot he wants. He sees where the dart will hit the board before he presses the button, it&#039;s all about timing and reflexes. Whereas the other way the player should just be lucky with where the dart hits the board.&lt;br /&gt;
Players should be able to add a handicap for themselves if they want to make it a fair game. Setting your handicap to 10 should decrease your dexterity with 10 during the game.&lt;br /&gt;
 &lt;br /&gt;
:i think any game of skill is not a good idea in an online game because it would be too easy to program a perfect playing bot which plays for you. --[[User:Crush|Crush]] 20:51, 16 Sep 2005 (CEST)&lt;br /&gt;
::What are you suggesting? Luck-based games only? Don&#039;t you agree that would suck fried peanuts? You will always keep bots, and they should be deleted. We should just make it hard to write bots. [[User:Modanung|Modanung]] 00:50, 17 Sep 2005 (CEST)&lt;br /&gt;
:::how about strategy games like chess variants? Or card games that have a luck component and a strategical component? --[[User:Crush|Crush]] 03:19, 13 March 2006 (CET)&lt;br /&gt;
::::Well people could write a chess bot as well, right? And pure chance games are boring, if there&#039;s nothing else. Besides, if you know someone is a bot/cheater you won&#039;t play darts with him. [[User:Modanung|Modanung]] 18:15, 13 March 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
===Ringfights===&lt;br /&gt;
Ringfights take place in an arena or at a fightclub. Any place with something that looks like a boxing-ring will do.&lt;br /&gt;
In a ringfight two players fight eachother without any equipment or items. Players are not allowed (and not able) to use any form of magic either. So it is hand-to-hand combat only. The goal is to knock-out the other player. Knocking a player out is easiest if your strength is high and your opponents vitality low. You can try to block or evade attacks. Both need good timing. Blocking an attack is most effective whith a lot of strength, but still makes you lose some health. The higher your strength, the less health you lose when hit while blocking. Evading doesn&#039;t always succeed. The chance to evade an attack increases with your dexterity. If you evade an attack you recieve no damage at all.&lt;br /&gt;
If a player loses a match he is placed outside the arena with 1/4 of his maximum health. Even losers get some treatment after the match.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5367</id>
		<title>Archive:PvP Games</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:PvP_Games&amp;diff=5367"/>
		<updated>2006-11-06T16:52:37Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Changed the broken link into a different one&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_red}}&lt;br /&gt;
TMW should have some PvP minigame types.&lt;br /&gt;
This is a great way of competition and killing time and above that a whole lot of fun.&lt;br /&gt;
With every game players are able to place bets. Bets for money, items, pets, women or maybe even realestate if they feel really lucky. Most games can also be played just for fun, but involving bets makes it more exciting.&lt;br /&gt;
All games need at least 2 players to be played. Some could be played with up to 4 players.&lt;br /&gt;
&lt;br /&gt;
Add your own ideas for games we could implement if you miss something or come up with an idea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Out-in-the-field games==&lt;br /&gt;
These games can be played almost anywhere by Challenging another player. After starting a game players automatically sit facing eachother with one tile in between them. In the middle lies the playing field where the cards are played, the dice are thrown or where the board is placed. Players walking by can magnify the playing field and follow the game. Ofcourse in case of a cardgame they cannot see the hand of the players if this is part of the rules.&lt;br /&gt;
&lt;br /&gt;
===Cardgames===&lt;br /&gt;
Players that have a pack of the same sort of cards can challenge one another to play a game of cards.&lt;br /&gt;
We could use a standard pack of cards and implement existing games.&lt;br /&gt;
&lt;br /&gt;
We could also (maybe aside from the normal pack) have a pack of cards we designed ourselves. Maybe a bit like Magic the Gathering?&lt;br /&gt;
&lt;br /&gt;
===Dicegames===&lt;br /&gt;
If one player has a set of dice he can challenge another player to play dice with him. Dicegames are merely based on luck.&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
&lt;br /&gt;
* http://boardgames.about.com/cs/dicegames/tp/dice-games.htm&lt;br /&gt;
* http://www.realbeer.com/fun/games/dice.php&lt;br /&gt;
&lt;br /&gt;
===Combination games===&lt;br /&gt;
&lt;br /&gt;
Combination games involve both dice and classic cards. Both players should carry a pack of cards and one player needs a pack of dice.&lt;br /&gt;
&lt;br /&gt;
===Boardgames===&lt;br /&gt;
&lt;br /&gt;
To play board games one player needs to carry a board game with him.&lt;br /&gt;
Some examples are:&lt;br /&gt;
* Backgammon&lt;br /&gt;
* Chess&lt;br /&gt;
* Draughts&lt;br /&gt;
* Hnefatafl (Anglo-Norse Boardgame: http://en.wikipedia.org/wiki/Tafl_games)&lt;br /&gt;
* Reversi&lt;br /&gt;
&lt;br /&gt;
We could ofcourse also design our own boardgame. Also every region could have his very own boardgame. This would be designed by us, may it be based on an exsisting game. Every region would have an NPC called &amp;quot;[name] the [game] master&amp;quot; that can teach you about the boardgame. He is so masterfull he can play the game simultanious against a whole bunch of players. So they can all sit around and learn the game. If you win a best-out-of-three competition from the master you get a rulebook. You can buy the boardgame at the local (general) store.&lt;br /&gt;
&lt;br /&gt;
==Place-bound games==&lt;br /&gt;
These games can only be played at places where the facilities allow them to be played.&lt;br /&gt;
&lt;br /&gt;
===Darts===&lt;br /&gt;
In some inns there should be a dartboard (maybe our own version) so players could play darts. Throwing darts should take place in a special window. The player controls a cursor (with keyboard or mouse) and their dexterity influences their accuracy. There are two ways to do this:&lt;br /&gt;
The first way is to let the cursor sway around the spot where the player aims. The amount it sways and the speed with which it sways decrease with the dexterity&#039;s increase.&lt;br /&gt;
The other way is to have a stable cursor but have the dart fly in a slightly random direction. The randomness should decrease with the dexterity&#039;s increase. There is a circle around the target that shows the area in which the dart could end up.&lt;br /&gt;
&lt;br /&gt;
The first way leaves the player with more influence on the actual direction of the dart eventhough a low dexterity makes it harder to hit the spot he wants. He sees where the dart will hit the board before he presses the button, it&#039;s all about timing and reflexes. Whereas the other way the player should just be lucky with where the dart hits the board.&lt;br /&gt;
Players should be able to add a handicap for themselves if they want to make it a fair game. Setting your handicap to 10 should decrease your dexterity with 10 during the game.&lt;br /&gt;
 &lt;br /&gt;
:i think any game of skill is not a good idea in an online game because it would be too easy to program a perfect playing bot which plays for you. --[[User:Crush|Crush]] 20:51, 16 Sep 2005 (CEST)&lt;br /&gt;
::What are you suggesting? Luck-based games only? Don&#039;t you agree that would suck fried peanuts? You will always keep bots, and they should be deleted. We should just make it hard to write bots. [[User:Modanung|Modanung]] 00:50, 17 Sep 2005 (CEST)&lt;br /&gt;
:::how about strategy games like chess variants? Or card games that have a luck component and a strategical component? --[[User:Crush|Crush]] 03:19, 13 March 2006 (CET)&lt;br /&gt;
::::Well people could write a chess bot as well, right? And pure chance games are boring, if there&#039;s nothing else. Besides, if you know someone is a bot/cheater you won&#039;t play darts with him. [[User:Modanung|Modanung]] 18:15, 13 March 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
==Ringfights==&lt;br /&gt;
Ringfights take place in an arena or at a fightclub. Any place with something that looks like a boxing-ring will do.&lt;br /&gt;
In a ringfight two players fight eachother without any equipment or items. Players are not allowed (and not able) to use any form of magic either. So it is hand-to-hand combat only. The goal is to knock-out the other player. Knocking a player out is easiest if your strength is high and your opponents vitality low. You can try to block or evade attacks. Both need good timing. Blocking an attack is most effective whith a lot of strength, but still makes you lose some health. The higher your strength, the less health you lose when hit while blocking. Evading doesn&#039;t always succeed. The chance to evade an attack increases with your dexterity. If you evade an attack you recieve no damage at all.&lt;br /&gt;
If a player loses a match he is placed outside the arena with 1/4 of his maximum health. Even losers get some treatment after the match.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=5323</id>
		<title>Classic:Maps</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=5323"/>
		<updated>2006-10-28T13:02:58Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Existing maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_green}}&lt;br /&gt;
== Guidelines ==&lt;br /&gt;
&lt;br /&gt;
You can build a map for TMW using [http://mapeditor.org Tiled]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Size:&#039;&#039;&#039; around 200x200 tiles is good in practice, though the theoretical maximum is 2048x2048&lt;br /&gt;
* &#039;&#039;&#039;Tile size:&#039;&#039;&#039; 32x32&lt;br /&gt;
* &#039;&#039;&#039;Map border:&#039;&#039;&#039; you have to leave an empty border around the map of at least 20 tiles&lt;br /&gt;
* &#039;&#039;&#039;Walls/players proportions:&#039;&#039;&#039; a normal door for a player is 2 tiles in height&lt;br /&gt;
* &#039;&#039;&#039;Indoor/Outdoor proportions:&#039;&#039;&#039; it is not required that inside view of buildings has to fit the size in outside view&lt;br /&gt;
* &#039;&#039;&#039;Path reference:&#039;&#039;&#039; please use tmw folder structure to keep references to tilesets working&lt;br /&gt;
* &#039;&#039;&#039;Transparent color:&#039;&#039;&#039; tilesets use alpha so no need to set a transparent color&lt;br /&gt;
* &#039;&#039;&#039;Layers:&#039;&#039;&#039; each map uses 4 layers: ground, objects, over and collision (names are only suggested)&lt;br /&gt;
** &#039;&#039;Ground:&#039;&#039; used for everything below items and beings.&lt;br /&gt;
** &#039;&#039;Objects:&#039;&#039; this layer is drawn simultaneously with items and beings, where tiles above a being are drawn below the being and tiles below the being are drawn above. Hence this layer is suitable for adding static objects to a map like plants or statues.&lt;br /&gt;
** &#039;&#039;Over:&#039;&#039; usually used for walls or high objects. Each tile in this layer is always above items and beings.&lt;br /&gt;
** &#039;&#039;Collision:&#039;&#039; this is a special layer for which you have to use the collision tileset. Use the &#039;X&#039; tile where you want a tile to be unwalkable. Be careful that even if a tile is not reachable, but it&#039;s walkable, the server can spawn monsters there, so you won&#039;t be able to reach them, or you can cause weird situations. For example fill a wall with &#039;X&#039; tiles, not only the borders, or you could have monsters spawning inside the wall.&lt;br /&gt;
&lt;br /&gt;
In a good style of mapping, please always use the lowest layer as possible (this is also in the interests of perfomance, since it keeps down overdraw).&lt;br /&gt;
&lt;br /&gt;
==Existing maps==&lt;br /&gt;
&lt;br /&gt;
Here a list of all existing maps:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Filename&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| new_1-1.tmx.gz&lt;br /&gt;
| Desert south of Tulimshar&lt;br /&gt;
|-&lt;br /&gt;
| new_2-1.tmx.gz&lt;br /&gt;
| Desert Mine, level 1&lt;br /&gt;
|-&lt;br /&gt;
| new_3-1.tmx.gz&lt;br /&gt;
| Tulimshar City, outdoor&lt;br /&gt;
|-&lt;br /&gt;
| new_4-1.tmx.gz&lt;br /&gt;
| Hermits Cave, level 1 (Bat Cave)&lt;br /&gt;
|-&lt;br /&gt;
| new_5-1.tmx.gz&lt;br /&gt;
| Desert Mine, level 2&lt;br /&gt;
|-&lt;br /&gt;
| new_6-1.tmx.gz&lt;br /&gt;
| PvP Arena&lt;br /&gt;
|-&lt;br /&gt;
| new_7-1.tmx.gz&lt;br /&gt;
| Desert southeast of Tulimshar (Snake map)&lt;br /&gt;
|-&lt;br /&gt;
| new_8-1.tmx.gz&lt;br /&gt;
| Tulimshar City, indoor&lt;br /&gt;
|-&lt;br /&gt;
| new_9-1.tmx.gz&lt;br /&gt;
| Woodland, northwest (Red Mushroom Map)&lt;br /&gt;
|-&lt;br /&gt;
| new_10-1.tmx.gz&lt;br /&gt;
| Snow field (Rudolph Slime + Santa Slime map)&lt;br /&gt;
|-&lt;br /&gt;
| new_11-1.tmx.gz&lt;br /&gt;
| Snow Town, outdoor&lt;br /&gt;
|-&lt;br /&gt;
| new_12-1.tmx.gz&lt;br /&gt;
| Snow Cave&lt;br /&gt;
|-&lt;br /&gt;
| new_13-1.tmx.gz&lt;br /&gt;
| Snow Town, indoor&lt;br /&gt;
|-&lt;br /&gt;
| new_14-1.tmx.gz&lt;br /&gt;
| Woodland, southwest (Pink Mushroom Map)&lt;br /&gt;
|-&lt;br /&gt;
| new_15-1.tmx.gz&lt;br /&gt;
| Palm beach southwest of Tulimshar (transition to woodland)&lt;br /&gt;
|-&lt;br /&gt;
| new_16-1.tmx.gz&lt;br /&gt;
| Woodland, southeast (Fluffy Map, transition to desert)&lt;br /&gt;
|-&lt;br /&gt;
| new_17-1.tmx.gz&lt;br /&gt;
| Hermits Cave, level 2 (Lamp snake cave)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How to map ==&lt;br /&gt;
&lt;br /&gt;
When you want to make maps for tmw but you don&#039;t know how to start, read the [[Mapping Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Ideas for new maps ==&lt;br /&gt;
&lt;br /&gt;
I suggest a village in the woods. You know, elders and shops. And tales about what &lt;br /&gt;
is lurking within. And more quests.&lt;br /&gt;
&lt;br /&gt;
== Errors on existing maps ==&lt;br /&gt;
&lt;br /&gt;
If you encounter a map error, big or small, please add it to this list so that eventually a mapper can pick it up and include it the next time the map gets updated. Also feel free to add suggestions.&lt;br /&gt;
&lt;br /&gt;
Grey errors have been fixed but the fixed map file has not been released yet.&lt;br /&gt;
&lt;br /&gt;
==== The desert area below town (1-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Tulimshar (3-1) ====&lt;br /&gt;
&lt;br /&gt;
* The large empty area at 44,34 in new_3-1 is reserved for the city&#039;s &amp;quot;palace&amp;quot;, but we need a tile artist to start drawing the necessary tiles for this.&lt;br /&gt;
&lt;br /&gt;
==== Desert Cave Level 2 (5-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in current version)&lt;br /&gt;
&lt;br /&gt;
==== The Eastern Desert (?) (7-1) ====&lt;br /&gt;
&lt;br /&gt;
* Contains 2 cave entrances that lead to yet to determine caves.&lt;br /&gt;
* Exit to the south east determined?&lt;br /&gt;
&lt;br /&gt;
==== Casino (8-1) ====&lt;br /&gt;
&lt;br /&gt;
just this: http://img129.imageshack.us/img129/6658/casinobugih7.png&lt;br /&gt;
&lt;br /&gt;
==== Woodland (9-1) ====&lt;br /&gt;
&lt;br /&gt;
One picture is worth a thousand words: [[Image:Woodland_bug.png|100px]]&lt;br /&gt;
&lt;br /&gt;
==== Snow Field ====&lt;br /&gt;
&lt;br /&gt;
This tile here is soild (and also the wrong tile)&amp;lt;br&amp;gt;&lt;br /&gt;
http://i97.photobucket.com/albums/l231/QOAL/snow_field_map_error.png&lt;br /&gt;
&lt;br /&gt;
==== Bat Cave ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Snow town ====&lt;br /&gt;
&lt;br /&gt;
There is an error on the map as shown on the picture.&amp;lt;br&amp;gt;&lt;br /&gt;
A few of the rock face edge tiles are walk through with the soild tiles as the next tile.&amp;lt;br&amp;gt;&lt;br /&gt;
http://i97.photobucket.com/albums/l231/QOAL/ice_village_map_error.png&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=5285</id>
		<title>Classic:Maps</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=5285"/>
		<updated>2006-10-17T16:20:14Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Reverted spam edit by Moira&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_green}}&lt;br /&gt;
== Guidelines ==&lt;br /&gt;
&lt;br /&gt;
You can build a map for TMW using [http://mapeditor.org Tiled]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Size:&#039;&#039;&#039; around 200x200 tiles is good in practice, though the theoretical maximum is 2048x2048&lt;br /&gt;
* &#039;&#039;&#039;Tile size:&#039;&#039;&#039; 32x32&lt;br /&gt;
* &#039;&#039;&#039;Map border:&#039;&#039;&#039; you have to leave an empty border around the map of at least 20 tiles&lt;br /&gt;
* &#039;&#039;&#039;Walls/players proportions:&#039;&#039;&#039; a normal door for a player is 2 tiles in height&lt;br /&gt;
* &#039;&#039;&#039;Indoor/Outdoor proportions:&#039;&#039;&#039; it is not required that inside view of buildings has to fit the size in outside view&lt;br /&gt;
* &#039;&#039;&#039;Path reference:&#039;&#039;&#039; please use tmw folder structure to keep references to tilesets working&lt;br /&gt;
* &#039;&#039;&#039;Transparent color:&#039;&#039;&#039; tilesets use alpha so no need to set a transparent color&lt;br /&gt;
* &#039;&#039;&#039;Layers:&#039;&#039;&#039; each map uses 4 layers: ground, objects, over and collision (names are only suggested)&lt;br /&gt;
** &#039;&#039;Ground:&#039;&#039; used for everything below items and beings.&lt;br /&gt;
** &#039;&#039;Objects:&#039;&#039; this layer is drawn simultaneously with items and beings, where tiles above a being are drawn below the being and tiles below the being are drawn above. Hence this layer is suitable for adding static objects to a map like plants or statues.&lt;br /&gt;
** &#039;&#039;Over:&#039;&#039; usually used for walls or high objects. Each tile in this layer is always above items and beings.&lt;br /&gt;
** &#039;&#039;Collision:&#039;&#039; this is a special layer for which you have to use the collision tileset. Use the &#039;X&#039; tile where you want a tile to be unwalkable. Be careful that even if a tile is not reachable, but it&#039;s walkable, the server can spawn monsters there, so you won&#039;t be able to reach them, or you can cause weird situations. For example fill a wall with &#039;X&#039; tiles, not only the borders, or you could have monsters spawning inside the wall.&lt;br /&gt;
&lt;br /&gt;
In a good style of mapping, please always use the lowest layer as possible (this is also in the interests of perfomance, since it keeps down overdraw).&lt;br /&gt;
&lt;br /&gt;
== How to map ==&lt;br /&gt;
&lt;br /&gt;
When you want to make maps for tmw but you don&#039;t know how to start, read the [[Mapping Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Ideas for new maps ==&lt;br /&gt;
&lt;br /&gt;
I suggest a village in the woods. You know, elders and shops. And tales about what &lt;br /&gt;
is lurking within. And more quests.&lt;br /&gt;
&lt;br /&gt;
== Errors on existing maps ==&lt;br /&gt;
&lt;br /&gt;
If you encounter a map error, big or small, please add it to this list so that eventually a mapper can pick it up and include it the next time the map gets updated. Also feel free to add suggestions.&lt;br /&gt;
&lt;br /&gt;
Grey errors have been fixed but the fixed map file has not been released yet.&lt;br /&gt;
&lt;br /&gt;
==== The desert area below town (1-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Tulimshar (3-1) ====&lt;br /&gt;
&lt;br /&gt;
* The large empty area at 44,34 in new_3-1 is reserved for the city&#039;s &amp;quot;palace&amp;quot;, but we need a tile artist to start drawing the necessary tiles for this.&lt;br /&gt;
&lt;br /&gt;
==== Desert Cave Level 2 (5-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in current version)&lt;br /&gt;
&lt;br /&gt;
==== The Eastern Desert (?) (7-1) ====&lt;br /&gt;
&lt;br /&gt;
* Contains 2 cave entrances that lead to yet to determine caves.&lt;br /&gt;
* Exit to the south east determined?&lt;br /&gt;
&lt;br /&gt;
==== Casino (8-1) ====&lt;br /&gt;
&lt;br /&gt;
just this: http://img129.imageshack.us/img129/6658/casinobugih7.png&lt;br /&gt;
&lt;br /&gt;
==== Woodland (9-1) ====&lt;br /&gt;
&lt;br /&gt;
One picture is worth a thousand words: [[Image:Woodland_bug.png|100px]]&lt;br /&gt;
&lt;br /&gt;
==== Snow Field ====&lt;br /&gt;
&lt;br /&gt;
This tile here is soild (and also the wrong tile)&amp;lt;br&amp;gt;&lt;br /&gt;
http://i97.photobucket.com/albums/l231/QOAL/snow_field_map_error.png&lt;br /&gt;
&lt;br /&gt;
==== Bat Cave ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Snow town ====&lt;br /&gt;
&lt;br /&gt;
There is an error on the map as shown on the picture.&amp;lt;br&amp;gt;&lt;br /&gt;
A few of the rock face edge tiles are walk through with the soild tiles as the next tile.&amp;lt;br&amp;gt;&lt;br /&gt;
http://i97.photobucket.com/albums/l231/QOAL/ice_village_map_error.png&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Kingdoms&amp;diff=5066</id>
		<title>Kingdoms</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Kingdoms&amp;diff=5066"/>
		<updated>2006-09-19T17:58:27Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Water race homeland; underwater or on the surface? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_construction|come to the IRC channel #tmwart on irc.freenode.net}}&lt;br /&gt;
== Regions ==&lt;br /&gt;
&lt;br /&gt;
===Homelands of the Races===&lt;br /&gt;
It should be assumed that the eight, single-element races will have a crystal located somewhere in the heart of thier native lands.  They have all in their own way, taken up retainership to these crystals, which are now much smaller than they originally had been; the countless shards are scattered throughout the world.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Region&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Terrain&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Native race&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Regional&amp;amp;nbsp;element&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| Tulimshar&lt;br /&gt;
| Desert&lt;br /&gt;
| Demon&lt;br /&gt;
| N/A&lt;br /&gt;
| The great desert of Tulimshar is the largest in the world, serving as natural protection from most invaders.  These harsh conditions also make life in the Tulimshar area quite challenging, for outsiders and natives alike.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;--comments--&#039;&#039;&lt;br /&gt;
| Tundra&lt;br /&gt;
| Human&lt;br /&gt;
| N/A&lt;br /&gt;
| Home of the humans &lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| --&lt;br /&gt;
| &#039;&#039;--comments--&#039;&#039;&lt;br /&gt;
| Space&lt;br /&gt;
| --&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Wasteland, ancient Junkyard&lt;br /&gt;
| Chelonan&lt;br /&gt;
| Time&lt;br /&gt;
| A conglomeration of barren land and broken machinery.&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Caverns&lt;br /&gt;
| Talpan&lt;br /&gt;
| Earth&lt;br /&gt;
| A maze of caverns and open valleys through the southeast mountains.&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Above the clouds?&lt;br /&gt;
| Daedalon &lt;br /&gt;
| Light&lt;br /&gt;
| A place where land meets sky in an isolated setting, surrounded by a sea of clouds; A resort village / tourism should be their primary economic hinge.&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| --&lt;br /&gt;
| &#039;&#039;--comments--&#039;&#039;&lt;br /&gt;
| Darkness&lt;br /&gt;
| --&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Volcanic Plain&lt;br /&gt;
| Ifriton&lt;br /&gt;
| Fire&lt;br /&gt;
| A large plain with lava rivers and lakes, small volcanos and basalt cliffs.&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Underwater &#039;&#039;(--comments--)&#039;&#039;&lt;br /&gt;
| Tritan&lt;br /&gt;
| Water&lt;br /&gt;
| --&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Canyon w/windy chasm&lt;br /&gt;
| Sparron&lt;br /&gt;
| Air&lt;br /&gt;
| --&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== old location / region names &amp;amp; descriptions ==&lt;br /&gt;
Please consider when viewing this and the following &#039;Landforms&#039; sections, how incompatible most ideas are with the current [[Backstory]] and with the map in progress, by Pauan.  In short, this is here for retrospective.  We want to salvage what we can from these original ideas from the [[World backstory proposal 1|old story concept]]. &lt;br /&gt;
===Other regions===&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Region&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Terrain&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Key Locations&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; align=&amp;quot;left&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| [[Gispaa Island]]&lt;br /&gt;
| Volcano Island&lt;br /&gt;
| Crystal of Fire&lt;br /&gt;
| A small volcanic island.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sonbrand]]&lt;br /&gt;
| Urbanized Island&lt;br /&gt;
| Great Library&lt;br /&gt;
| Island of Scholars&lt;br /&gt;
|-&lt;br /&gt;
| [[Frenshya Plains]]&lt;br /&gt;
| Plains&lt;br /&gt;
| &lt;br /&gt;
| A well watered plain between the Kaisei River and the southern seas. Mostly farmland or pastures.&lt;br /&gt;
|-&lt;br /&gt;
| [[Xartune]]&lt;br /&gt;
| Forests, Meadows &lt;br /&gt;
| [[Shimris]], [[Macabre]], [[Woodland Village]] &lt;br /&gt;
| An overgrown jungle continent to the northwest&lt;br /&gt;
|-&lt;br /&gt;
| [[KaziKazi]]&lt;br /&gt;
| Tundra &lt;br /&gt;
| [[Gloriana]], [[Desert of Glass]]&lt;br /&gt;
| KaziKazi is the coldest and most unforgiving terrain in the Mana world. &lt;br /&gt;
|-&lt;br /&gt;
| [[Gasaro]]&lt;br /&gt;
| Grassland, Canyons &lt;br /&gt;
| &lt;br /&gt;
| A region to the south upon the island of the same name. Gasaro is for a large part empty grasslands, spotted with some canyons and dunes.&lt;br /&gt;
|-&lt;br /&gt;
| [[Gaeas Hearth]]&lt;br /&gt;
| Jungle &lt;br /&gt;
| &lt;br /&gt;
| At the heart of the world, a dense bastion of mana energy.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Landforms ==&lt;br /&gt;
Center:&amp;lt;br&amp;gt;&lt;br /&gt;
* None.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;North:&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Sea of Dissonance]] - A perpetual, powerful ocean current combined with deadly shoals make this northern sea almost intraversable.&lt;br /&gt;
* [[Gloriana]] - A northern continent of snow and ice. Only inhabited by nomads.&lt;br /&gt;
North-east:&amp;lt;br&amp;gt;&lt;br /&gt;
* None.&lt;br /&gt;
North-west:&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Motetshi]] - The last unexplored continent, due to its place beyond a number of harsh shoals and the [Sea of Dissonance].&lt;br /&gt;
* [[Amplar Deadlands]] - A large, poisonous muck on the edge of [[Motetshi]]. Another deterrent to tourists of the region.&lt;br /&gt;
* [[Moori Isthmus]] - A tiny land bridge that connects [[Xartune]] to [[The Great Continent]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;South:&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Sea of Abbana]] - connects to port city of Abanna to the rest of its neighbors via ocean.&lt;br /&gt;
* [[OsiruSea]] - A small body of water that separates the island of [Gasaro] from the rest of [[The Great Continent]].&lt;br /&gt;
* [[Merene Archipelago]] - A collection of nearly 100 small islands in the southern [[Sea of Abbana]].&lt;br /&gt;
South-east:&amp;lt;br&amp;gt;&lt;br /&gt;
* None.&lt;br /&gt;
South-west:&amp;lt;br&amp;gt;&lt;br /&gt;
* None.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;East:&amp;lt;br&amp;gt;&lt;br /&gt;
* None.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;West:&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Kaisei River]] - A river flowing west from the mountains near [GeonsCrater] to the [[Sea of Abbana]] and the [[Sea of Dissonance]].&lt;br /&gt;
* [[Kaisei River Delta]] - An outlet of the Kaisei River that forms a large marsh. An ancient civilization thrived here which is believed to be a precursor to the civilization at [[Tulimshar]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Anywhere: (not categorized)&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Gispaa Island]] - A small volcanic island, upon which the [[Temple of Fire]] sits.&lt;br /&gt;
* [[Blachet Sea]] - The sea beneath Aerol, usually a calm one.&lt;br /&gt;
* [[Collis Forest]] - A large deciduous forest that separates [[Shaede]] from the rest of [[The Great Continent]].&lt;br /&gt;
* [[Ivari Sea]] - The sea surrounding Veshrin. Filled with pirates and dangerous storms, due to its proximity with the [[Sea of Dissonance]].&lt;br /&gt;
* [[Issa Marsh]] - A marsh at the edge of [[Collis Forest]]. Valuable and interesting wildlife thrives there, but the terrain is treacherous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Sea of Dissonance]], [[Motetshi]], [[Amplar Deadlands]], [[Moori Isthmus]], [[Sea of Abbana]], [[OsiruSea]], [[Merene Archipelago]], [[Kaisei River]], [[Kaisei River Delta]], [[Gispaa Island]], [[Blachet Sea]], [[Collis Forest]], [[Ivari Sea]], [[Issa Marsh]], [[Collis Forest]], [[Astra]], [[Shaede]], [[Aerol]], [[Geons Crater]], [[Tempus Keshlam]], [[Tonori]], [[Gispaa Island]], [[Gaeas Hearth]], [[Gasaro]], [[KaziKazi]], [[Frenshya Plains]], [[Xartune]], [[Toukai]], [[Shimris]], [[Abbana]], [[Sonbrand]], [[Mudoha]], [[Macabre]], [[Woodland Village]], [[Gloriana]]&lt;br /&gt;
&lt;br /&gt;
==Questions &amp;amp; Comments About New World Map==&lt;br /&gt;
&lt;br /&gt;
===human homeland===&lt;br /&gt;
Dabe and Pauan discussed swapping demons to Tulimshar and humans to the &amp;quot;other&amp;quot; side of the continent, which is a snow region.  This was mostly for graphical / environmental obviousness.. (red skin in snow would look dumb and it seems to fit the desert setting..)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Would anyone have any problems with this change?&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;If it&#039;s an acceptable change, what should we call the human&#039;s snow kingdom?&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;Gloriana&#039; was already intended to be a snow region and I sort of like the name.  My second choice, just because I like the name; &#039;Sonbrand&#039; - [[User:Dabe|Dabe]] 23:57, 18 September 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
===Water race homeland; underwater or on the surface?===&lt;br /&gt;
The issue of placing the Tritan raised a question about playability underwater.  Though there are a number of ways we could implement something like this, the question remains, &amp;quot;Should the water race&#039;s homeland be submerged, requiring foreign race&#039;s to use a waterbreath ability/item of some kind..?&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I vote for an underwater town of some sort, regardless of the diving / swimming method - [[User:Dabe|Dabe]] 00:16, 19 September 2006 (CEST) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Surely underwater, accesible by e.g. swimming skill... --[[User:Yosuhara|Yosuhara]] 18:09, 19 September 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
It would not be logical for a waterbreathing race to build a city under a dome filled with air. I think it should be reachable for both Tritans and non-Tritans. Therefor I think we should either have a land based Tritan homeland or SCUBA-gears (or something limilar). I would prefer the Tritan homeland to consist of a lot of island with walkable shallows for non-tritans and more direct swimming for Tritans and skilled swimmers. [[User:Modanung|Modanung]] 19:58, 19 September 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Joining_the_project&amp;diff=4900</id>
		<title>Development:Joining the project</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Joining_the_project&amp;diff=4900"/>
		<updated>2006-09-10T20:28:28Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;So you want to join this project, but you have little or no idea how to get into? The Mana World development team is not a closed circle like other projects. You needn&#039;t apply to anyone or ask for &amp;quot;being taken into the team&amp;quot;. You don&#039;t have to ask for permission to work on something or wait for someone to assign a task to you. A team member is basically everyone who volunteers to do something for the project. We do have a quality standard, and will not add game content that isn&#039;t good enough to the teams opinion. Also it might be good first to ask what is needed and what is being worked on to prevent people from wasting their time.&lt;br /&gt;
&lt;br /&gt;
This page should provide you with the necessary starting points. It can always be rather difficult to know what to start with, especially when you&#039;re just jumping in. However, any help is most welcome and with some time you should be able to decide what you want to work on yourself.&lt;br /&gt;
&lt;br /&gt;
== General organisation ==&lt;br /&gt;
&lt;br /&gt;
To know what is currently happening or what could be worked on, we have a few important pages on the wiki. The [[roadmap]] provides a planning for upcoming releases, where sometimes tasks are assigned or listed to be picked up by somebody. There is a [[bugs|bugs page]] holding a list of known problems which are generally free for anybody to look into. Finally there is the [[suggestions|suggestions page]] where anybody can put his wishlist for the game, and where anybody can look for inspiration when looking for something to do.&lt;br /&gt;
&lt;br /&gt;
These pages and others are linked from the organisation section on the [[Main Page|main page]].&lt;br /&gt;
&lt;br /&gt;
It is very important for you to be available for discussion with other developers on [http://forums.themanaworld.org/viewtopic.php?t=747 our IRC channels] from time to time, as we do most of our discussions there. We also have two important mailing lists, one for development discussion and one that shows all changes made to the source code, that you should subscribe to:&lt;br /&gt;
&lt;br /&gt;
* http://lists.sourceforge.net/lists/listinfo/themanaworld-devel&amp;lt;br&amp;gt;The developers mailing list where discussion about the project happens.&lt;br /&gt;
* http://lists.sourceforge.net/lists/listinfo/themanaworld-commit&amp;lt;br&amp;gt;The commit mailing list, so that you can easily stay up to date about the latest change to the source code.&lt;br /&gt;
&lt;br /&gt;
Finally, although not required, you are invited to visit our forums:&lt;br /&gt;
&lt;br /&gt;
* http://forums.themanaworld.org/&lt;br /&gt;
&lt;br /&gt;
== Programmers ==&lt;br /&gt;
&lt;br /&gt;
Our current projects include the existing client which is used with eAthena (a Ragnarok Online server emulator), and a new client/server combination which isn&#039;t used yet but is being worked on. Hence, check out both the Subversion module &amp;lt;code&amp;gt;tmw&amp;lt;/code&amp;gt; as the module &amp;lt;code&amp;gt;tmwserv&amp;lt;/code&amp;gt;. Try to browse the source to see if you can get a bit familiar with them.&lt;br /&gt;
&lt;br /&gt;
Your first contributions could be in the form of patches submitted to the SourceForge patches tracker. If it turns out you like the project and you want to keep contributing for a long period, we&#039;ll consider adding you to the official team and from then on you can commit your changes to the source yourself.&lt;br /&gt;
&lt;br /&gt;
== Artists ==&lt;br /&gt;
&lt;br /&gt;
Our graphic design team can always use help. May it be just an inventory icon, a [[Monsterset development|new monster]] or a [[Tileset development|complete Tileset]]. Improving existing graphics is also always welcome. When you want to do a task, then you should announce it on the [http://forums.themanaworld.org/viewforum.php?f=8 Graphic Development Forum], post regular updates there and add yourself to the [[Assignments]] Page. But be sure to read our [[Guidelines|style guidelines]] first.&lt;br /&gt;
&lt;br /&gt;
You should also hang out on our graphic design channel #tmwart [http://forums.themanaworld.org/viewtopic.php?t=747]. It is good for a little brainstorming session or for showing small pieces of work you don&#039;t want to show to the whole community yet.&lt;br /&gt;
&lt;br /&gt;
== Mappers ==&lt;br /&gt;
&lt;br /&gt;
Creating maps is a task that does not require much experience but is a great way to add more value to the game. More information about how to map can be found on the article [[Mapping Tutorial]]. Be sure to check out our [[Map development|Map development guidelines]], too.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Tmw_races.png&amp;diff=4888</id>
		<title>File:Tmw races.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Tmw_races.png&amp;diff=4888"/>
		<updated>2006-09-10T15:13:08Z</updated>

		<summary type="html">&lt;p&gt;Modanung: The races for the Mana World as fitting the world&amp;#039;s backstory. By &amp;#039;Modanung&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The races for the Mana World as fitting the world&#039;s backstory. By &#039;Modanung&#039;&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=4683</id>
		<title>Classic:Maps</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=4683"/>
		<updated>2006-08-15T22:34:37Z</updated>

		<summary type="html">&lt;p&gt;Modanung: My name is inferior in this case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_green}}&lt;br /&gt;
== Guidelines ==&lt;br /&gt;
&lt;br /&gt;
You can build a map for TMW using [http://tiled.rpgdx.net Tiled]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Size:&#039;&#039;&#039; around 200x200 tiles is good in practice, though the theoretical maximum is 2048x2048&lt;br /&gt;
* &#039;&#039;&#039;Tile size:&#039;&#039;&#039; 32x32&lt;br /&gt;
* &#039;&#039;&#039;Map border:&#039;&#039;&#039; you have to leave an empty border around the map of at least 20 tiles&lt;br /&gt;
* &#039;&#039;&#039;Walls/players proportions:&#039;&#039;&#039; a normal door for a player is 2 tiles in height&lt;br /&gt;
* &#039;&#039;&#039;Indoor/Outdoor proportions:&#039;&#039;&#039; it is not required that inside view of buildings has to fit the size in outside view&lt;br /&gt;
* &#039;&#039;&#039;Path reference:&#039;&#039;&#039; please use tmw folder structure to keep references to tilesets working&lt;br /&gt;
* &#039;&#039;&#039;Transparent color:&#039;&#039;&#039; tilesets use alpha so no need to set a transparent color&lt;br /&gt;
* &#039;&#039;&#039;Layers:&#039;&#039;&#039; each map uses 4 layers: ground, objects, over and collision (names are only suggested)&lt;br /&gt;
** &#039;&#039;Ground:&#039;&#039; used for everything below items and beings.&lt;br /&gt;
** &#039;&#039;Objects:&#039;&#039; this layer is drawn simultaneously with items and beings, where tiles above a being are drawn below the being and tiles below the being are drawn above. Hence this layer is suitable for adding static objects to a map like plants or statues.&lt;br /&gt;
** &#039;&#039;Over:&#039;&#039; usually used for walls or high objects. Each tile in this layer is always above items and beings.&lt;br /&gt;
** &#039;&#039;Collision:&#039;&#039; this is a special layer for which you have to use the collision tileset. Use the &#039;X&#039; tile where you want a tile to be unwalkable. Be careful that even if a tile is not reachable, but it&#039;s walkable, the server can spawn monsters there, so you won&#039;t be able to reach them, or you can cause weird situations. For example fill a wall with &#039;X&#039; tiles, not only the borders, or you could have monsters spawning inside the wall.&lt;br /&gt;
* TMW doesn&#039;t support layer data compression, so disable it in Tiled: Edit -&amp;gt; Preferences -&amp;gt; Saving -&amp;gt; Compress layer data should not be checked&lt;br /&gt;
&lt;br /&gt;
In a good style of mapping, please always use the lowest layer as possible (this is also in the interests of perfomance, since it keeps down overdraw).&lt;br /&gt;
&lt;br /&gt;
== How to map ==&lt;br /&gt;
&lt;br /&gt;
When you want to make maps for tmw but you don&#039;t know how to start, read the [[Mapping Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Ideas for new maps ==&lt;br /&gt;
&lt;br /&gt;
I suggest a village in the woods. You know, elders and shops. And tales about what &lt;br /&gt;
is lurking within. And more quests.&lt;br /&gt;
&lt;br /&gt;
== Errors on existing maps ==&lt;br /&gt;
&lt;br /&gt;
If you encounter a map error, big or small, please add it to this list so that eventually a mapper can pick it up and include it the next time the map gets updated. Also feel free to add suggestions.&lt;br /&gt;
&lt;br /&gt;
Grey errors have been fixed but the fixed map file has not been released yet.&lt;br /&gt;
&lt;br /&gt;
==== The desert area below town (1-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Tulimshar (3-1) ====&lt;br /&gt;
&lt;br /&gt;
* The large empty area at 44,34 in new_3-1 is reserved for the city&#039;s &amp;quot;palace&amp;quot;, but we need a tile artist to start drawing the necessary tiles for this.&lt;br /&gt;
&lt;br /&gt;
==== Desert Cave Level 2 (5-1) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray;&amp;quot;&amp;gt;&lt;br /&gt;
* [45:31] Tile incorrectly not covering sprites&lt;br /&gt;
* [59:89] Tile incorrectly covering sprites&amp;lt;/span&amp;gt;&lt;br /&gt;
* [85:65] Monsters sometimes appear/walk on the lake near&lt;br /&gt;
&lt;br /&gt;
==== The Eastern Desert (?) (7-1) ====&lt;br /&gt;
&lt;br /&gt;
* Contains 2 cave entrances that lead to yet to determine caves.&lt;br /&gt;
* Exit to the south east determined?&lt;br /&gt;
&lt;br /&gt;
==== Casino (8-1) ====&lt;br /&gt;
&lt;br /&gt;
just this: http://img129.imageshack.us/img129/6658/casinobugih7.png&lt;br /&gt;
&lt;br /&gt;
==== Woodland (9-1) ====&lt;br /&gt;
&lt;br /&gt;
One picture is worth a thousand words: [[Image:Woodland_bug.png|100px]]&lt;br /&gt;
&lt;br /&gt;
==== Snow Field ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Bat Cave ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Snow town ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray;&amp;quot;&amp;gt;You can walk on the roof at [64,70] (This is already fixed in SVN)&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=4681</id>
		<title>Classic:Maps</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Classic:Maps&amp;diff=4681"/>
		<updated>2006-08-15T17:36:39Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Map bug already fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_green}}&lt;br /&gt;
== Guidelines ==&lt;br /&gt;
&lt;br /&gt;
You can build a map for TMW using [http://tiled.rpgdx.net Tiled]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Size:&#039;&#039;&#039; around 200x200 tiles is good in practice, though the theoretical maximum is 2048x2048&lt;br /&gt;
* &#039;&#039;&#039;Tile size:&#039;&#039;&#039; 32x32&lt;br /&gt;
* &#039;&#039;&#039;Map border:&#039;&#039;&#039; you have to leave an empty border around the map of at least 20 tiles&lt;br /&gt;
* &#039;&#039;&#039;Walls/players proportions:&#039;&#039;&#039; a normal door for a player is 2 tiles in height&lt;br /&gt;
* &#039;&#039;&#039;Indoor/Outdoor proportions:&#039;&#039;&#039; it is not required that inside view of buildings has to fit the size in outside view&lt;br /&gt;
* &#039;&#039;&#039;Path reference:&#039;&#039;&#039; please use tmw folder structure to keep references to tilesets working&lt;br /&gt;
* &#039;&#039;&#039;Transparent color:&#039;&#039;&#039; tilesets use alpha so no need to set a transparent color&lt;br /&gt;
* &#039;&#039;&#039;Layers:&#039;&#039;&#039; each map uses 4 layers: ground, objects, over and collision (names are only suggested)&lt;br /&gt;
** &#039;&#039;Ground:&#039;&#039; used for everything below items and beings.&lt;br /&gt;
** &#039;&#039;Objects:&#039;&#039; this layer is drawn simultaneously with items and beings, where tiles above a being are drawn below the being and tiles below the being are drawn above. Hence this layer is suitable for adding static objects to a map like plants or statues.&lt;br /&gt;
** &#039;&#039;Over:&#039;&#039; usually used for walls or high objects. Each tile in this layer is always above items and beings.&lt;br /&gt;
** &#039;&#039;Collision:&#039;&#039; this is a special layer for which you have to use the collision tileset. Use the &#039;X&#039; tile where you want a tile to be unwalkable. Be careful that even if a tile is not reachable, but it&#039;s walkable, the server can spawn monsters there, so you won&#039;t be able to reach them, or you can cause weird situations. For example fill a wall with &#039;X&#039; tiles, not only the borders, or you could have monsters spawning inside the wall.&lt;br /&gt;
* TMW doesn&#039;t support layer data compression, so disable it in Tiled: Edit -&amp;gt; Preferences -&amp;gt; Saving -&amp;gt; Compress layer data should not be checked&lt;br /&gt;
&lt;br /&gt;
In a good style of mapping, please always use the lowest layer as possible (this is also in the interests of perfomance, since it keeps down overdraw).&lt;br /&gt;
&lt;br /&gt;
== How to map ==&lt;br /&gt;
&lt;br /&gt;
When you want to make maps for tmw but you don&#039;t know how to start, read the [[Mapping Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Ideas for new maps ==&lt;br /&gt;
&lt;br /&gt;
I suggest a village in the woods. You know, elders and shops. And tales about what &lt;br /&gt;
is lurking within. And more quests.&lt;br /&gt;
&lt;br /&gt;
== Errors on existing maps ==&lt;br /&gt;
&lt;br /&gt;
If you encounter a map error, big or small, please add it to this list so that eventually a mapper can pick it up and include it the next time the map gets updated. Also feel free to add suggestions.&lt;br /&gt;
&lt;br /&gt;
Grey errors have been fixed but the fixed map file has not been released yet.&lt;br /&gt;
&lt;br /&gt;
==== The desert area below town (1-1) ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Tulimshar (3-1) ====&lt;br /&gt;
&lt;br /&gt;
* The large empty area at 44,34 in new_3-1 is reserved for the city&#039;s &amp;quot;palace&amp;quot;, but we need a tile artist to start drawing the necessary tiles for this.&lt;br /&gt;
&lt;br /&gt;
==== Desert Cave Level 2 (5-1) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray;&amp;quot;&amp;gt;&lt;br /&gt;
* [45:31] Tile incorrectly not covering sprites&lt;br /&gt;
* [59:89] Tile incorrectly covering sprites&amp;lt;/span&amp;gt;&lt;br /&gt;
* [85:65] Monsters sometimes appear/walk on the lake near&lt;br /&gt;
&lt;br /&gt;
==== The Eastern Desert (?) (7-1) ====&lt;br /&gt;
&lt;br /&gt;
* Contains 2 cave entrances that lead to yet to determine caves.&lt;br /&gt;
* Exit to the south east determined?&lt;br /&gt;
&lt;br /&gt;
==== Casino (8-1) ====&lt;br /&gt;
&lt;br /&gt;
just this: http://img129.imageshack.us/img129/6658/casinobugih7.png&lt;br /&gt;
&lt;br /&gt;
==== Woodland (9-1) ====&lt;br /&gt;
&lt;br /&gt;
One picture is worth a thousand words: [[Image:Woodland_bug.png|100px]]&lt;br /&gt;
&lt;br /&gt;
==== Snow Field ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Bat Cave ====&lt;br /&gt;
&lt;br /&gt;
(no bugs reported in the current version)&lt;br /&gt;
&lt;br /&gt;
==== Snow town ====&lt;br /&gt;
&lt;br /&gt;
You can walk on the roof at [64,70] (This is already fixed in SVN. [[User:Modanung|Modanung]] 19:36, 15 August 2006 (CEST))&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:HABARI&amp;diff=4627</id>
		<title>User talk:HABARI</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:HABARI&amp;diff=4627"/>
		<updated>2006-08-08T13:54:50Z</updated>

		<summary type="html">&lt;p&gt;Modanung: *sigh* Wiki noobs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When editing the wiki you can use the preview button to see the result of your changes without comitting them.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Player_Groups&amp;diff=4594</id>
		<title>Player Groups</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Player_Groups&amp;diff=4594"/>
		<updated>2006-08-07T11:56:25Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Did a little style cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please, try not to be chaotic when editing, try to keep the format, and don&#039;t create derived articles for your guilds. Here you have enough space to make your guilds. --[[User:Pajarico|Pajarico]] 11:01, 23 July 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== MUG (Macintosh Users Guild) ==&lt;br /&gt;
* Leader: TencheDesign (Not Tenche anymore)&lt;br /&gt;
* Lafaboune-G5&lt;br /&gt;
* godHead-G5&lt;br /&gt;
* Pudri-G4&lt;br /&gt;
* Criptos - G4&lt;br /&gt;
* Trucker-G3&lt;br /&gt;
&lt;br /&gt;
== Grey Mana ==&lt;br /&gt;
Announcing the new clan &amp;quot;Grey Mana&amp;quot;. Its members so far are:&lt;br /&gt;
* Leader: Dfert (soon to be DeathJoker but it will still be me)&lt;br /&gt;
* Moi1392-Knight&lt;br /&gt;
* Vally8-Knight&lt;br /&gt;
* Edix-knight&lt;br /&gt;
* Sanjd-Ranger&lt;br /&gt;
* Pete-Marksman&lt;br /&gt;
* Medicated-Wonderer&lt;br /&gt;
* Vince Armoire-Knight&lt;br /&gt;
* Yanl-Barbarian&lt;br /&gt;
* Shouto-Swordsmen&lt;br /&gt;
&lt;br /&gt;
There are a number of brave men that the Grey Mana will give our respect to: Gorch, the entire MUG guild and any of the admins.&lt;br /&gt;
&lt;br /&gt;
The perks of this clan are: inter guild loans and the support of anyone in the guild.&lt;br /&gt;
&lt;br /&gt;
Ther Rules of conduct are:&lt;br /&gt;
* Any guild member must be respectfull to ANY person as long as they do not disrespect the clan or its members. OR is a member of an opposing clan (none yet).&lt;br /&gt;
* There will be no tolerence to member that refuse to help other clan member.&lt;br /&gt;
* We Will remain peacefull unless our services are requested and a reward is offerded.&lt;br /&gt;
&lt;br /&gt;
Would love to join the Grey Mana Name- Haggar Level- 25 send me a message if im able to.&lt;br /&gt;
&lt;br /&gt;
== The Elders Council ==&lt;br /&gt;
The first created guild on The Mana World. You must have been playing for at least 4 versions of The Mana World in order to join. PM Magick to register.&lt;br /&gt;
* Leader-Magick&lt;br /&gt;
&lt;br /&gt;
== Teh Masonaries ==&lt;br /&gt;
* Leaders: Teh Akroh and Deviexx&lt;br /&gt;
&lt;br /&gt;
== THE MANA  WARRIORS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Our duty is to protect the Mana World from evil&#039;&#039;&#039;&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
*Be respectful to other ones&lt;br /&gt;
*Figth when ever posible to win level&lt;br /&gt;
*Help other players&lt;br /&gt;
*Answer when you are called&lt;br /&gt;
*Help other members when figthing against monsters&lt;br /&gt;
*Attack the ones that are not respectful with other players&lt;br /&gt;
*Encourage other ones to join us&lt;br /&gt;
*Say you are one of us when you log on&lt;br /&gt;
*Respect people with a higher level&lt;br /&gt;
*So far we have no enemies to destroy&lt;br /&gt;
 &lt;br /&gt;
===How to join the Mana Warriors===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Anyone&#039;&#039;&#039; can join the clan&lt;br /&gt;
*Just follow the rules and you can be one of us&lt;br /&gt;
*Put your name on the member list&lt;br /&gt;
&lt;br /&gt;
===More info===&lt;br /&gt;
*We have a meeting point next to the miners , our warriors can join there when wanting to talk to other warrior for help or advice.&lt;br /&gt;
* We will do the best we can to help other warriors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Members===&lt;br /&gt;
*JAMBO&lt;br /&gt;
*HABARI&lt;br /&gt;
*HABARI 2&lt;br /&gt;
*yomatsu&lt;br /&gt;
*smolik&lt;br /&gt;
*Tobias&lt;br /&gt;
*ellokofonker (Tole)&lt;br /&gt;
*Valquiria&lt;br /&gt;
*Shandokan&lt;br /&gt;
*Longshot&lt;br /&gt;
*maximus&lt;br /&gt;
*MiRz&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=4568</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=4568"/>
		<updated>2006-08-05T12:17:38Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Added races page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| cellspacing=&amp;quot;3&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;border: 1px solid lightgrey;&amp;quot;|&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
| style=&amp;quot;vertical-align: center; text-align: center; padding: 0px 20px 0px 20px; font-style: italic;&amp;quot;|Welcome to The Mana World wiki! This wiki is meant to provide information to our players, to provide an easy way to contribute to the development of certain parts of the game and to improve collaboration between people on the development team. We hope you will find what you are looking for. To be able to edit you have to login, but signing up is free and requires no activation.&lt;br /&gt;
|[[Image:World_sketch_by_Kyokai.jpg|100px]]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #e0c8b8; color: #000; background-color: #faeee6&amp;quot;|&lt;br /&gt;
== Project information ==&lt;br /&gt;
* [[Project description]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[Getting started]]&lt;br /&gt;
* [[Developers]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[Dependencies]]&lt;br /&gt;
* [[System requirements]]&lt;br /&gt;
* [[Roadmap]]&lt;br /&gt;
* [[Ports]]&lt;br /&gt;
* [http://svn.sourceforge.net/viewcvs.cgi/themanaworld/tmw/trunk/ChangeLog?view=markup ChangeLog from SVN trunk]&lt;br /&gt;
&lt;br /&gt;
==== References ====&lt;br /&gt;
&lt;br /&gt;
* [[Servers]]&lt;br /&gt;
* [[Guilds]]&lt;br /&gt;
* [[Stats]]&lt;br /&gt;
* [[Monster reference]]&lt;br /&gt;
* [[Item reference]]&lt;br /&gt;
&lt;br /&gt;
==== Organization ====&lt;br /&gt;
&lt;br /&gt;
* [[Suggestions]]&lt;br /&gt;
* [[Bugs]]&lt;br /&gt;
* [[Design document]]&lt;br /&gt;
* [http://themanaworld.org/archive/galerie.php Gallery]&lt;br /&gt;
* [[Developer meetings]]&lt;br /&gt;
* [[Quotes]]&lt;br /&gt;
* [[Summer 2005 real life developer meeting]]&lt;br /&gt;
&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #c9c9ff; color: #000; background-color: #f3f3ff&amp;quot;|&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;World&#039;&#039;&#039;&lt;br /&gt;
:[[World geography]], [[World backstory]], [[Organisations]], [[Races]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Game&#039;&#039;&#039;&lt;br /&gt;
:[[Game systems]], [[Map development]], [[NPC development]], [[Important NPCs]], [[Finished NPCs]], [[Creature proposal]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graphics&#039;&#039;&#039; ([[:Special:Newimages|New images gallery]])&lt;br /&gt;
:[[Assignments]], [[Concept art]], [[Guidelines]], [[Tileset development|Tilesets]], [[Playerset]], [[Itemset development|Itemsets]], [[Monsterset development|Monstersets]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GUI / Interface&#039;&#039;&#039;&lt;br /&gt;
:[[GUI development]], [[Menu interface system]], [[Keyboard usage]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sound&#039;&#039;&#039;&lt;br /&gt;
:[[SFX]], [[Music]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
:[[Server development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RFCs&#039;&#039;&#039;&lt;br /&gt;
:[[Rendering]], [[Action layers]], [[Animations]], [[Improvement of the collision layer system]], [[Being movement system]], [[Logging]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
:[[Joining the project]], [[Making a new release]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__ __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4552</id>
		<title>Development:Animations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4552"/>
		<updated>2006-08-04T00:27:52Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Added gender variable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
Each animation will be defined by an xml document, here follows an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;player&amp;quot; action=&amp;quot;stand&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/player_male_base.png&amp;quot; width=&amp;quot;64&amp;quot; height=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;36&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;54&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;19&amp;quot; end=&amp;quot;24&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;37&amp;quot; end=&amp;quot;42&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;55&amp;quot; end=&amp;quot;60&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;sit&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;25&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;43&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;61&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;8&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;26&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;44&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;62&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;attack&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;9&amp;quot; end=&amp;quot;12&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;27&amp;quot; end=&amp;quot;30&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;45&amp;quot; end=&amp;quot;48&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;63&amp;quot; end=&amp;quot;66&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you want to load the playerset you just load player.xml and it takes care of loading all related images. Of course delays are defined in milliseconds.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sprite&amp;amp;gt; ===&lt;br /&gt;
A sprite is an object which can carry several animations, hence we call the root element the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt;. The sprite got two optional properties &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt;. These are required when there are multiple very similar versions of a sprite in one spriteset. One example for this are the hairset spritesets. &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; defines the number of variants in the spriteset and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt; how many sprites are between the first sprites of the variants. When defining multiple variants you only define the animation sequences of the first variant. the engine then shifts the index parameters when it wants anotherone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;action&amp;amp;gt; ===&lt;br /&gt;
collection of the animation in different directions that belong to an action the character can perform. the properties are the imageset the animation phases are taken from and the name of the action. &lt;br /&gt;
&lt;br /&gt;
possible names:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               use-item&lt;br /&gt;
                   |&lt;br /&gt;
  attack-bow  cast-magic&lt;br /&gt;
       |           |&lt;br /&gt;
 attack-stab  attack-throw&lt;br /&gt;
         \     /       &lt;br /&gt;
run   attack-swing   sleeping   dead&lt;br /&gt;
 |          |           |        | &lt;br /&gt;
walk     attack        sit      hurt&lt;br /&gt;
   \        \          /         /&lt;br /&gt;
               stand&lt;br /&gt;
                 |&lt;br /&gt;
        (no name attribute)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this table also specifies the substitution precedence. when a specific name is requested but it is not defined the next lower name is used instead.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Defines an animation sequence that should be displayed when the sprite object faces in a specific direction (attribute &amp;quot;direction&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
the possible directions are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
up&lt;br /&gt;
down&lt;br /&gt;
left&lt;br /&gt;
right&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when a specific direction isn&#039;t provided, the first defined direction is used instead. this can be overridden by defining an animation with the direction &amp;quot;default&amp;quot; for this action.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;&amp;lt;animation&amp;gt;&amp;lt;/code&amp;gt; has one or more &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; child elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;frame&amp;amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
each of them defines one frame of the animation. the required properties are &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; and optional &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; defines the index of the graphic on the spriteset. &lt;br /&gt;
&lt;br /&gt;
an optional property is &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. every frame is displayed for &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; millisecounds and then replaced by the next frame in sequence. when the last frame is reached the sequence starts with the first frame again. when no delay is specified (or specified as &amp;quot;0&amp;quot;) the animation doesn&#039;t continue when this &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; is reached.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; element can optionally have the properties &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; to specify an offset from the default drawing position for that frame. This allows the animation of for example the hairset (or any equipment) to reuse the same frames with different offsets.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sequence&amp;amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; tag does not only define one animation phase but multiple phases. Its properties are &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; which are all required. The delay is the delay in ms between each phase. the properties &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; define the first and the last index of the animation sequence on the spritesheet.&lt;br /&gt;
&lt;br /&gt;
== Suggested additions ==&lt;br /&gt;
&lt;br /&gt;
=== multiple delays in a &amp;amp;lt;frame&amp;amp;gt; with start and end attribute ===&lt;br /&gt;
in the bow animation I&#039;ve chosen a shortcut to specify different delays for different frames. I am undecided yet whether this is a nice feature or whether it&#039;ll be better to require multiple &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; elements in such cases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;random&amp;amp;gt; childtag for &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Also, it includes an experimental suggestion on specifying that a random frame should be chosen. This should also have an exclude_current_frame thingy, to make sure a frame isn&#039;t shown twice or more in a row. Sometimes this may be wanted though.&lt;br /&gt;
&lt;br /&gt;
=== sequences based on default sequences ===&lt;br /&gt;
After reflecting on this idea (and the above suggestion) I think a first issue to solve is to reduce the amount of duplicated definitions. For example, at the moment every monster uses the exact same frame size and animation frames. Hence, it would be interesting if the defined sprite could take the actual imageset it uses as a parameter instead of specifying this on its own. This way we can define a monster like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Red Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-red-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defining an empty imageset (without &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute) will make the engine require this imageset to be passed as a parameter whenever the spriteset is referenced.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not convinced yet that the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; attribute of the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt; element is really necessary. I think I would prefer each sprite to be defined in its own file. However it could be attractive to define multiple things in the same file, but in that case I think we will have to read everything when the client is launched, and only graphics and imagesets can be created lazily (only when necessary). Because the other data consists of just numbers and strings, this should not be really a problem.&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal of hairstyles by Modanung ==&lt;br /&gt;
&lt;br /&gt;
I think the current system with an xml file for every hairstyle with an index and offset defined for every frame is a bit too much. It also takes a lot of work to correct small errors and to add new hairstyles that may have a different frame size and with it a different offset.&lt;br /&gt;
I suggest we split hairstyles up in three catagories:&lt;br /&gt;
* Static hairstyles&lt;br /&gt;
* Standard animated hairstyles&lt;br /&gt;
* Special case hairstyles&lt;br /&gt;
On top of the current system we need a variable that defines which gender can use which hairstyles, in every hairstyle&#039;s xml-file.&lt;br /&gt;
===Static hairstyles===&lt;br /&gt;
These are hairstyles which only have one frame for each direction and death, so five. All current hairstyles would be static hairstyles. Every individual static hairstyle needs nothing more to be defined then their bitmap, their size and their offset for each direction.&lt;br /&gt;
The offset for each seperate frame would be defined in a shared file (say hairoffsets.xml), this summed with the individual hairstyle&#039;s offset is the offset for that single frame with that hairstyle. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle1.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;static_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gender=&amp;quot;male&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle1.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairoffsets.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-25&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;4&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Standard animated hairstyles===&lt;br /&gt;
These are hairstyles that can be compared with hair in SoM or Chrono Trigger, they move as you walk and attack. They have three frames for each direction and death, so thirteen frames all together. These three frames can be devided in a relaxed frame and two extremes. Those two extremes either being up and down or left and right, depending on the hair style. A heavily greased Evil look would wobble up and down as you walk and a pony talk would wave from left to right.&lt;br /&gt;
Standard animated hairstyles hairstyles use the same offset as static ones only they have a different file for defining the frames.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle2.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;animated_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gender=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle2.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
animated_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;9&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Special case hairstyles===&lt;br /&gt;
And then there are the odd ones, the hairstyles that need a little more freedom. Hairstyles that people want to make wave in the wind, even when the player stands still. Or a birdnest hairstyle with nestlings that constantly open and close their mouth in a random frequency nomatter what you do. I&#039;ll take as example a Medusa hairstyle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle3.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=0&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gender=&amp;quot;female&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle3.png&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;offsetX=&amp;quot;-5&amp;quot; offsetY =&amp;quot;-10&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;7&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;8&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;9&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;10&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;11&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;12&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This hairstyle showes a bunch of snakes on your head that always wave &#039;n wobble unless you&#039;re dead. The animation rolls asychronusly with the attack and walking animations and it also moves when you stand still. But the offsets are in sync. Special hairstyles might also use their own offsets ofcourse&lt;br /&gt;
I think this pretty much finished my proposal.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4368</id>
		<title>Development:Animations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4368"/>
		<updated>2006-07-22T13:00:02Z</updated>

		<summary type="html">&lt;p&gt;Modanung: /* Special case hairstyles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
Each animation will be defined by an xml document, here follows an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;player&amp;quot; action=&amp;quot;stand&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/player_male_base.png&amp;quot; width=&amp;quot;64&amp;quot; height=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;36&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;54&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;19&amp;quot; end=&amp;quot;24&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;37&amp;quot; end=&amp;quot;42&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;55&amp;quot; end=&amp;quot;60&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;sit&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;25&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;43&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;61&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;8&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;26&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;44&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;62&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;attack&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;9&amp;quot; end=&amp;quot;12&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;27&amp;quot; end=&amp;quot;30&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;45&amp;quot; end=&amp;quot;48&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;63&amp;quot; end=&amp;quot;66&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you want to load the playerset you just load player.xml and it takes care of loading all related images. Of course delays are defined in milliseconds.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sprite&amp;amp;gt; ===&lt;br /&gt;
A sprite is an object which can carry several animations, hence we call the root element the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt;. The sprite got two optional properties &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt;. These are required when there are multiple very similar versions of a sprite in one spriteset. One example for this are the hairset spritesets. &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; defines the number of variants in the spriteset and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt; how many sprites are between the first sprites of the variants. When defining multiple variants you only define the animation sequences of the first variant. the engine then shifts the index parameters when it wants anotherone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;action&amp;amp;gt; ===&lt;br /&gt;
collection of the animation in different directions that belong to an action the character can perform. the properties are the imageset the animation phases are taken from and the name of the action. &lt;br /&gt;
&lt;br /&gt;
possible names:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               use-item&lt;br /&gt;
                   |&lt;br /&gt;
  attack-bow  cast-magic&lt;br /&gt;
       |           |&lt;br /&gt;
 attack-stab  attack-throw&lt;br /&gt;
         \     /       &lt;br /&gt;
run   attack-swing   sleeping   dead&lt;br /&gt;
 |          |           |        | &lt;br /&gt;
walk     attack        sit      hurt&lt;br /&gt;
   \        \          /         /&lt;br /&gt;
               stand&lt;br /&gt;
                 |&lt;br /&gt;
        (no name attribute)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this table also specifies the substitution precedence. when a specific name is requested but it is not defined the next lower name is used instead.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Defines an animation sequence that should be displayed when the sprite object faces in a specific direction (attribute &amp;quot;direction&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
the possible directions are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
up&lt;br /&gt;
down&lt;br /&gt;
left&lt;br /&gt;
right&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when a specific direction isn&#039;t provided, the first defined direction is used instead. this can be overridden by defining an animation with the direction &amp;quot;default&amp;quot; for this action.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;&amp;lt;animation&amp;gt;&amp;lt;/code&amp;gt; has one or more &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; child elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;frame&amp;amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
each of them defines one frame of the animation. the required properties are &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; and optional &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; defines the index of the graphic on the spriteset. &lt;br /&gt;
&lt;br /&gt;
an optional property is &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. every frame is displayed for &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; millisecounds and then replaced by the next frame in sequence. when the last frame is reached the sequence starts with the first frame again. when no delay is specified (or specified as &amp;quot;0&amp;quot;) the animation doesn&#039;t continue when this &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; is reached.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; element can optionally have the properties &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; to specify an offset from the default drawing position for that frame. This allows the animation of for example the hairset (or any equipment) to reuse the same frames with different offsets.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sequence&amp;amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; tag does not only define one animation phase but multiple phases. Its properties are &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; which are all required. The delay is the delay in ms between each phase. the properties &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; define the first and the last index of the animation sequence on the spritesheet.&lt;br /&gt;
&lt;br /&gt;
== Suggested additions ==&lt;br /&gt;
&lt;br /&gt;
=== multiple delays in a &amp;amp;lt;frame&amp;amp;gt; with start and end attribute ===&lt;br /&gt;
in the bow animation I&#039;ve chosen a shortcut to specify different delays for different frames. I am undecided yet whether this is a nice feature or whether it&#039;ll be better to require multiple &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; elements in such cases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;random&amp;amp;gt; childtag for &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Also, it includes an experimental suggestion on specifying that a random frame should be chosen. This should also have an exclude_current_frame thingy, to make sure a frame isn&#039;t shown twice or more in a row. Sometimes this may be wanted though.&lt;br /&gt;
&lt;br /&gt;
=== sequences based on default sequences ===&lt;br /&gt;
After reflecting on this idea (and the above suggestion) I think a first issue to solve is to reduce the amount of duplicated definitions. For example, at the moment every monster uses the exact same frame size and animation frames. Hence, it would be interesting if the defined sprite could take the actual imageset it uses as a parameter instead of specifying this on its own. This way we can define a monster like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Red Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-red-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defining an empty imageset (without &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute) will make the engine require this imageset to be passed as a parameter whenever the spriteset is referenced.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not convinced yet that the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; attribute of the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt; element is really necessary. I think I would prefer each sprite to be defined in its own file. However it could be attractive to define multiple things in the same file, but in that case I think we will have to read everything when the client is launched, and only graphics and imagesets can be created lazily (only when necessary). Because the other data consists of just numbers and strings, this should not be really a problem.&lt;br /&gt;
&lt;br /&gt;
== An implementation idea by Peoro ==&lt;br /&gt;
&lt;br /&gt;
An idea to manage the animations should be a class based on a timer which choose automatically the current frame.&lt;br /&gt;
Who needs animations (players, monsters and npcs) has only to start the animanion and to request the frame to draw it.&lt;br /&gt;
Each instance of Animation class keep its own start-time (or a personal timer), its total time, number of frames, and the time of every frame.&lt;br /&gt;
The Animation class has to provide at least a function to start the animation and another one to get the current frame; other usefull functions should pause and restart the animation and allow to jump to a random frame.&lt;br /&gt;
&lt;br /&gt;
Here a simple example of a prototype of an Animation class:&lt;br /&gt;
(I mutilated my original Animation class to simplify and summarize it cutting a lot of other functions and vars and using the most possible of standard items)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
    int nframes;&lt;br /&gt;
    Img **frames;&lt;br /&gt;
    int *times;&lt;br /&gt;
    int totalTime;&lt;br /&gt;
    int startTime;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    Animation ( int n, Img **i, int *t )&lt;br /&gt;
    {&lt;br /&gt;
        int c;&lt;br /&gt;
    	&lt;br /&gt;
        nframes = n;&lt;br /&gt;
        frames = new Img* [n];&lt;br /&gt;
        times = new int [n];&lt;br /&gt;
        totalTime = 0;&lt;br /&gt;
        &lt;br /&gt;
        for ( c = 0; c &amp;lt; n; c ++ ) {&lt;br /&gt;
            frames[c] = i[c];&lt;br /&gt;
            times[c] = t[c];&lt;br /&gt;
            totalTime += t[c];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    inline void start ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        startTime = t;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img *getFrame ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        int i;&lt;br /&gt;
        int it&lt;br /&gt;
        &lt;br /&gt;
        if ( ! totalTime ) {&lt;br /&gt;
            t = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            t = (t-startTime) % totalTime;&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        // searches the current frame&lt;br /&gt;
        for ( i = 0, it = 0; (it + times[i]) &amp;lt; t; i ++, it += times[i] );&lt;br /&gt;
        &lt;br /&gt;
        return frames[i];&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here how to use this class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Img * imgs [] = { img1, img2, img3 };&lt;br /&gt;
int times [] = { 20, 20, 30 };&lt;br /&gt;
&lt;br /&gt;
Animation a ( 3, imgs, times );&lt;br /&gt;
&lt;br /&gt;
a.start ( );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( a.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An advantage of this class is that the animation speed is indipendent to FPS and it&#039;s very easy to use.&lt;br /&gt;
&lt;br /&gt;
This is a simple way to manage a lot of animations for who needs more than one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class AnimationsList&lt;br /&gt;
{&lt;br /&gt;
    // ltstr is only a const char* comparison function&lt;br /&gt;
    map&amp;lt;const char*, Animation*, ltstr&amp;gt; animations;&lt;br /&gt;
    int startTime;       // now Animation::startTime is no more usefull&lt;br /&gt;
    Animation *currentAnimation;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    AnimationsList ( ) : currentAnimation(0) { }&lt;br /&gt;
    &lt;br /&gt;
    inline void addAnimation ( const char *n, Animation *a )&lt;br /&gt;
    {&lt;br /&gt;
        animations[n] = a;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int setAnimation ( const char *n, int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
	map&amp;lt;const char*, Animation*, ltstr&amp;gt;::iterator ai;&lt;br /&gt;
        Animation *a;&lt;br /&gt;
        &lt;br /&gt;
	ai = animations.find ( n );&lt;br /&gt;
	&lt;br /&gt;
	if ( ai == animations.end() ) {&lt;br /&gt;
                // error... animation not found&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
	a = ai-&amp;gt;second;&lt;br /&gt;
        &lt;br /&gt;
        if ( currentAnimation != a ) {&lt;br /&gt;
            a-&amp;gt;start ( );&lt;br /&gt;
            currentAnimation = a;&lt;br /&gt;
            startTime = t;&lt;br /&gt;
	}&lt;br /&gt;
        &lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img * getFrame ( )&lt;br /&gt;
    {&lt;br /&gt;
        if ( currentAnimation ) {&lt;br /&gt;
            return currentAnimation-&amp;gt;getFrame ( );&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a multimap instead the map it&#039;s possible to keep more than an animation bind to the same string. This would be a good way to make AnimationsList choose a random animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And here how to use AnimationsList class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AnimationsList al;&lt;br /&gt;
&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot;, anim1 );&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;north&amp;quot;, anim2 );&lt;br /&gt;
al.addAnimation ( &amp;quot;anim3&amp;quot;, anim3 );&lt;br /&gt;
&lt;br /&gt;
al.setAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( al.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope not to had make a mistake writing... Anyway these are only theorical bases.&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal by Doener ==&lt;br /&gt;
&lt;br /&gt;
This proposal is incomplete regarding how new sequences are added to the&lt;br /&gt;
Animation (which is not the right name for this type of class *g*)... Anyway,&lt;br /&gt;
you should get the idea...&lt;br /&gt;
The Frame class encapsulates images and are used to create a single linked list that&lt;br /&gt;
creates an animation. The idea behind the linked list is that you can easily create loops,&lt;br /&gt;
by having the last element of the animation pointing to the first one. Also, you can easily&lt;br /&gt;
prepend a &amp;quot;starting animation&amp;quot; before the loop, like in an animation of a running player.&lt;br /&gt;
He starts out with one animation and then loops the real running... The Animation class is&lt;br /&gt;
responsible for mapping animation names to their starting frame and for disposing the encapsulating&lt;br /&gt;
Frame objects, thus a std::map and a std::list is used to keep track of those objects.&lt;br /&gt;
The next frame is simply calculated from the time that has passed since the last run of the&lt;br /&gt;
logic method. The case that a whole animation loop can be skipped is not taken into consideration,&lt;br /&gt;
because a) we cannot do this with frames linked together arbitrarily and b) animations will probably&lt;br /&gt;
take around 100ms or longer, ie. we&#039;d have less than 10fps for that case to happen and then &lt;br /&gt;
there&#039;s nothing left to gain by that simple optimization anymore anyway ;)&lt;br /&gt;
&lt;br /&gt;
For the linked list features, of course the xml format needs to be adjusted to support that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Frame class, stored information about frames in an animation&lt;br /&gt;
 */&lt;br /&gt;
struct Frame&lt;br /&gt;
{&lt;br /&gt;
	Image *mImg;  // Image for this frame&lt;br /&gt;
	int mDelay;   // Time in ms for how long this frame is shown&lt;br /&gt;
	Frame *mNext; // Next frame in sequence&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
	public:&lt;br /&gt;
		Animation():mCurrentFrame(0);&lt;br /&gt;
		~Animation();&lt;br /&gt;
&lt;br /&gt;
		void setSequence(const std::string &amp;amp;);&lt;br /&gt;
&lt;br /&gt;
		void logic(int timePassed);&lt;br /&gt;
&lt;br /&gt;
		Image* getCurrentImage()&lt;br /&gt;
			{ return mCurrentFrame ? mCurrentFrame-&amp;gt;mImg : 0; }&lt;br /&gt;
&lt;br /&gt;
	private:&lt;br /&gt;
		Frame *mCurrentFrame;&lt;br /&gt;
		typedef std::map&amp;lt;std::string,Frame*&amp;gt; FrameMap;&lt;br /&gt;
		typedef FrameMap::iterator FrameMapIterator;&lt;br /&gt;
		FrameMap mStartFrames;&lt;br /&gt;
		std::list&amp;lt;Frame*&amp;gt; mFrames;&lt;br /&gt;
		int mRemain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Animation::~Animation()&lt;br /&gt;
{&lt;br /&gt;
	for_each(mFrames.begin(), mFrames.end(), make_dtor(mFrames));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::setSequence(const std::string &amp;amp;name)&lt;br /&gt;
{&lt;br /&gt;
	FrameMapIterator i = mStartFrames.find(name);&lt;br /&gt;
	mCurrentFrame = (i == mStartFrames.end()) ? 0 : i-&amp;gt;second;&lt;br /&gt;
	mRemain = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::logic(int timePassed)&lt;br /&gt;
{&lt;br /&gt;
	mRemain += timePassed;&lt;br /&gt;
	while (mRemain &amp;gt;= mCurrentFrame-&amp;gt;mDelay) {&lt;br /&gt;
		mRemain -= mCurrentFrame-&amp;gt;mDelay;&lt;br /&gt;
		mCurrentFrame = mCurrentFrame-&amp;gt;mNext;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal of hairstyles by Modanung ==&lt;br /&gt;
&lt;br /&gt;
I think the current system with an xml file for every hairstyle with an index and offset defined for every frame is a bit too mutch. It also takes a lot of work to correct small errors and to add new hairstyles that may have a different frame size and with it a different offset.&lt;br /&gt;
I suggest we split hairstyles up in three catagories:&lt;br /&gt;
* Static hairstyles&lt;br /&gt;
* Standard animated hairstyles&lt;br /&gt;
* Special case hairstyles&lt;br /&gt;
===Static hairstyles===&lt;br /&gt;
These are hairstyles which only have one frame for each direction and death, so five. All current hairstyles would be static hairstyles. Every individual static hairstyle needs nothing more to be defined then their bitmap, their size and their offset for each direction.&lt;br /&gt;
The offset for each seperate frame would be defined in a shared file (say hairoffsets.xml), this summed with the individual hairstyle&#039;s offset is the offset for that single frame with that hairstyle. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle1.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;static_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle1.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairoffsets.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-25&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;4&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Standard animated hairstyles===&lt;br /&gt;
These are hairstyles that can be compared with hair in SoM or Chrono Trigger, they move as you walk and attack. They have three frames for each direction and death, so thirteen frames all together. These three frames can be devided in a relaxed frame and two extremes. Those two extremes either being up and down or left and right, depending on the hair style. A heavily greased Evil look would wobble up and down as you walk and a pony talk would wave from left to right.&lt;br /&gt;
Standard animated hairstyles hairstyles use the same offset as static ones only they have a different file for defining the frames.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle2.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;animated_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle2.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
animated_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;9&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Special case hairstyles===&lt;br /&gt;
And then there are the odd ones, the hairstyles that need a little more freedom. Hairstyles that people want to make wave in the wind, even when the player stands still. Or a birdnest hairstyle with nestlings that constantly open and close their mouth in a random frequency nomatter what you do. I&#039;ll take as example a Medusa hairstyle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle3.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=0&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle3.png&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;offsetX=&amp;quot;-5&amp;quot; offsetY =&amp;quot;-10&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;7&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;8&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;9&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;10&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;11&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;12&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This hairstyle showes a bunch of snakes on your head that always wave &#039;n wobble unless you&#039;re dead. The animation rolls asychronusly with the attack and walking animations and it also moves when you stand still. But the offsets are in sync. Special hairstyles might also use their own offsets ofcourse&lt;br /&gt;
I think this pretty much finished my proposal.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4365</id>
		<title>Development:Animations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4365"/>
		<updated>2006-07-22T12:57:54Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Finished hairstyle animation proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
Each animation will be defined by an xml document, here follows an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;player&amp;quot; action=&amp;quot;stand&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/player_male_base.png&amp;quot; width=&amp;quot;64&amp;quot; height=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;36&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;54&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;19&amp;quot; end=&amp;quot;24&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;37&amp;quot; end=&amp;quot;42&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;55&amp;quot; end=&amp;quot;60&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;sit&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;25&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;43&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;61&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;8&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;26&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;44&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;62&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;attack&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;9&amp;quot; end=&amp;quot;12&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;27&amp;quot; end=&amp;quot;30&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;45&amp;quot; end=&amp;quot;48&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;63&amp;quot; end=&amp;quot;66&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you want to load the playerset you just load player.xml and it takes care of loading all related images. Of course delays are defined in milliseconds.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sprite&amp;amp;gt; ===&lt;br /&gt;
A sprite is an object which can carry several animations, hence we call the root element the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt;. The sprite got two optional properties &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt;. These are required when there are multiple very similar versions of a sprite in one spriteset. One example for this are the hairset spritesets. &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; defines the number of variants in the spriteset and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt; how many sprites are between the first sprites of the variants. When defining multiple variants you only define the animation sequences of the first variant. the engine then shifts the index parameters when it wants anotherone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;action&amp;amp;gt; ===&lt;br /&gt;
collection of the animation in different directions that belong to an action the character can perform. the properties are the imageset the animation phases are taken from and the name of the action. &lt;br /&gt;
&lt;br /&gt;
possible names:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               use-item&lt;br /&gt;
                   |&lt;br /&gt;
  attack-bow  cast-magic&lt;br /&gt;
       |           |&lt;br /&gt;
 attack-stab  attack-throw&lt;br /&gt;
         \     /       &lt;br /&gt;
run   attack-swing   sleeping   dead&lt;br /&gt;
 |          |           |        | &lt;br /&gt;
walk     attack        sit      hurt&lt;br /&gt;
   \        \          /         /&lt;br /&gt;
               stand&lt;br /&gt;
                 |&lt;br /&gt;
        (no name attribute)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this table also specifies the substitution precedence. when a specific name is requested but it is not defined the next lower name is used instead.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Defines an animation sequence that should be displayed when the sprite object faces in a specific direction (attribute &amp;quot;direction&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
the possible directions are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
up&lt;br /&gt;
down&lt;br /&gt;
left&lt;br /&gt;
right&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when a specific direction isn&#039;t provided, the first defined direction is used instead. this can be overridden by defining an animation with the direction &amp;quot;default&amp;quot; for this action.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;&amp;lt;animation&amp;gt;&amp;lt;/code&amp;gt; has one or more &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; child elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;frame&amp;amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
each of them defines one frame of the animation. the required properties are &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; and optional &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; defines the index of the graphic on the spriteset. &lt;br /&gt;
&lt;br /&gt;
an optional property is &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. every frame is displayed for &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; millisecounds and then replaced by the next frame in sequence. when the last frame is reached the sequence starts with the first frame again. when no delay is specified (or specified as &amp;quot;0&amp;quot;) the animation doesn&#039;t continue when this &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; is reached.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; element can optionally have the properties &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; to specify an offset from the default drawing position for that frame. This allows the animation of for example the hairset (or any equipment) to reuse the same frames with different offsets.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sequence&amp;amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; tag does not only define one animation phase but multiple phases. Its properties are &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; which are all required. The delay is the delay in ms between each phase. the properties &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; define the first and the last index of the animation sequence on the spritesheet.&lt;br /&gt;
&lt;br /&gt;
== Suggested additions ==&lt;br /&gt;
&lt;br /&gt;
=== multiple delays in a &amp;amp;lt;frame&amp;amp;gt; with start and end attribute ===&lt;br /&gt;
in the bow animation I&#039;ve chosen a shortcut to specify different delays for different frames. I am undecided yet whether this is a nice feature or whether it&#039;ll be better to require multiple &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; elements in such cases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;random&amp;amp;gt; childtag for &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Also, it includes an experimental suggestion on specifying that a random frame should be chosen. This should also have an exclude_current_frame thingy, to make sure a frame isn&#039;t shown twice or more in a row. Sometimes this may be wanted though.&lt;br /&gt;
&lt;br /&gt;
=== sequences based on default sequences ===&lt;br /&gt;
After reflecting on this idea (and the above suggestion) I think a first issue to solve is to reduce the amount of duplicated definitions. For example, at the moment every monster uses the exact same frame size and animation frames. Hence, it would be interesting if the defined sprite could take the actual imageset it uses as a parameter instead of specifying this on its own. This way we can define a monster like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Red Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-red-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defining an empty imageset (without &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute) will make the engine require this imageset to be passed as a parameter whenever the spriteset is referenced.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not convinced yet that the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; attribute of the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt; element is really necessary. I think I would prefer each sprite to be defined in its own file. However it could be attractive to define multiple things in the same file, but in that case I think we will have to read everything when the client is launched, and only graphics and imagesets can be created lazily (only when necessary). Because the other data consists of just numbers and strings, this should not be really a problem.&lt;br /&gt;
&lt;br /&gt;
== An implementation idea by Peoro ==&lt;br /&gt;
&lt;br /&gt;
An idea to manage the animations should be a class based on a timer which choose automatically the current frame.&lt;br /&gt;
Who needs animations (players, monsters and npcs) has only to start the animanion and to request the frame to draw it.&lt;br /&gt;
Each instance of Animation class keep its own start-time (or a personal timer), its total time, number of frames, and the time of every frame.&lt;br /&gt;
The Animation class has to provide at least a function to start the animation and another one to get the current frame; other usefull functions should pause and restart the animation and allow to jump to a random frame.&lt;br /&gt;
&lt;br /&gt;
Here a simple example of a prototype of an Animation class:&lt;br /&gt;
(I mutilated my original Animation class to simplify and summarize it cutting a lot of other functions and vars and using the most possible of standard items)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
    int nframes;&lt;br /&gt;
    Img **frames;&lt;br /&gt;
    int *times;&lt;br /&gt;
    int totalTime;&lt;br /&gt;
    int startTime;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    Animation ( int n, Img **i, int *t )&lt;br /&gt;
    {&lt;br /&gt;
        int c;&lt;br /&gt;
    	&lt;br /&gt;
        nframes = n;&lt;br /&gt;
        frames = new Img* [n];&lt;br /&gt;
        times = new int [n];&lt;br /&gt;
        totalTime = 0;&lt;br /&gt;
        &lt;br /&gt;
        for ( c = 0; c &amp;lt; n; c ++ ) {&lt;br /&gt;
            frames[c] = i[c];&lt;br /&gt;
            times[c] = t[c];&lt;br /&gt;
            totalTime += t[c];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    inline void start ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        startTime = t;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img *getFrame ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        int i;&lt;br /&gt;
        int it&lt;br /&gt;
        &lt;br /&gt;
        if ( ! totalTime ) {&lt;br /&gt;
            t = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            t = (t-startTime) % totalTime;&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        // searches the current frame&lt;br /&gt;
        for ( i = 0, it = 0; (it + times[i]) &amp;lt; t; i ++, it += times[i] );&lt;br /&gt;
        &lt;br /&gt;
        return frames[i];&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here how to use this class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Img * imgs [] = { img1, img2, img3 };&lt;br /&gt;
int times [] = { 20, 20, 30 };&lt;br /&gt;
&lt;br /&gt;
Animation a ( 3, imgs, times );&lt;br /&gt;
&lt;br /&gt;
a.start ( );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( a.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An advantage of this class is that the animation speed is indipendent to FPS and it&#039;s very easy to use.&lt;br /&gt;
&lt;br /&gt;
This is a simple way to manage a lot of animations for who needs more than one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class AnimationsList&lt;br /&gt;
{&lt;br /&gt;
    // ltstr is only a const char* comparison function&lt;br /&gt;
    map&amp;lt;const char*, Animation*, ltstr&amp;gt; animations;&lt;br /&gt;
    int startTime;       // now Animation::startTime is no more usefull&lt;br /&gt;
    Animation *currentAnimation;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    AnimationsList ( ) : currentAnimation(0) { }&lt;br /&gt;
    &lt;br /&gt;
    inline void addAnimation ( const char *n, Animation *a )&lt;br /&gt;
    {&lt;br /&gt;
        animations[n] = a;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int setAnimation ( const char *n, int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
	map&amp;lt;const char*, Animation*, ltstr&amp;gt;::iterator ai;&lt;br /&gt;
        Animation *a;&lt;br /&gt;
        &lt;br /&gt;
	ai = animations.find ( n );&lt;br /&gt;
	&lt;br /&gt;
	if ( ai == animations.end() ) {&lt;br /&gt;
                // error... animation not found&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
	a = ai-&amp;gt;second;&lt;br /&gt;
        &lt;br /&gt;
        if ( currentAnimation != a ) {&lt;br /&gt;
            a-&amp;gt;start ( );&lt;br /&gt;
            currentAnimation = a;&lt;br /&gt;
            startTime = t;&lt;br /&gt;
	}&lt;br /&gt;
        &lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img * getFrame ( )&lt;br /&gt;
    {&lt;br /&gt;
        if ( currentAnimation ) {&lt;br /&gt;
            return currentAnimation-&amp;gt;getFrame ( );&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a multimap instead the map it&#039;s possible to keep more than an animation bind to the same string. This would be a good way to make AnimationsList choose a random animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And here how to use AnimationsList class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AnimationsList al;&lt;br /&gt;
&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot;, anim1 );&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;north&amp;quot;, anim2 );&lt;br /&gt;
al.addAnimation ( &amp;quot;anim3&amp;quot;, anim3 );&lt;br /&gt;
&lt;br /&gt;
al.setAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( al.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope not to had make a mistake writing... Anyway these are only theorical bases.&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal by Doener ==&lt;br /&gt;
&lt;br /&gt;
This proposal is incomplete regarding how new sequences are added to the&lt;br /&gt;
Animation (which is not the right name for this type of class *g*)... Anyway,&lt;br /&gt;
you should get the idea...&lt;br /&gt;
The Frame class encapsulates images and are used to create a single linked list that&lt;br /&gt;
creates an animation. The idea behind the linked list is that you can easily create loops,&lt;br /&gt;
by having the last element of the animation pointing to the first one. Also, you can easily&lt;br /&gt;
prepend a &amp;quot;starting animation&amp;quot; before the loop, like in an animation of a running player.&lt;br /&gt;
He starts out with one animation and then loops the real running... The Animation class is&lt;br /&gt;
responsible for mapping animation names to their starting frame and for disposing the encapsulating&lt;br /&gt;
Frame objects, thus a std::map and a std::list is used to keep track of those objects.&lt;br /&gt;
The next frame is simply calculated from the time that has passed since the last run of the&lt;br /&gt;
logic method. The case that a whole animation loop can be skipped is not taken into consideration,&lt;br /&gt;
because a) we cannot do this with frames linked together arbitrarily and b) animations will probably&lt;br /&gt;
take around 100ms or longer, ie. we&#039;d have less than 10fps for that case to happen and then &lt;br /&gt;
there&#039;s nothing left to gain by that simple optimization anymore anyway ;)&lt;br /&gt;
&lt;br /&gt;
For the linked list features, of course the xml format needs to be adjusted to support that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Frame class, stored information about frames in an animation&lt;br /&gt;
 */&lt;br /&gt;
struct Frame&lt;br /&gt;
{&lt;br /&gt;
	Image *mImg;  // Image for this frame&lt;br /&gt;
	int mDelay;   // Time in ms for how long this frame is shown&lt;br /&gt;
	Frame *mNext; // Next frame in sequence&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
	public:&lt;br /&gt;
		Animation():mCurrentFrame(0);&lt;br /&gt;
		~Animation();&lt;br /&gt;
&lt;br /&gt;
		void setSequence(const std::string &amp;amp;);&lt;br /&gt;
&lt;br /&gt;
		void logic(int timePassed);&lt;br /&gt;
&lt;br /&gt;
		Image* getCurrentImage()&lt;br /&gt;
			{ return mCurrentFrame ? mCurrentFrame-&amp;gt;mImg : 0; }&lt;br /&gt;
&lt;br /&gt;
	private:&lt;br /&gt;
		Frame *mCurrentFrame;&lt;br /&gt;
		typedef std::map&amp;lt;std::string,Frame*&amp;gt; FrameMap;&lt;br /&gt;
		typedef FrameMap::iterator FrameMapIterator;&lt;br /&gt;
		FrameMap mStartFrames;&lt;br /&gt;
		std::list&amp;lt;Frame*&amp;gt; mFrames;&lt;br /&gt;
		int mRemain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Animation::~Animation()&lt;br /&gt;
{&lt;br /&gt;
	for_each(mFrames.begin(), mFrames.end(), make_dtor(mFrames));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::setSequence(const std::string &amp;amp;name)&lt;br /&gt;
{&lt;br /&gt;
	FrameMapIterator i = mStartFrames.find(name);&lt;br /&gt;
	mCurrentFrame = (i == mStartFrames.end()) ? 0 : i-&amp;gt;second;&lt;br /&gt;
	mRemain = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::logic(int timePassed)&lt;br /&gt;
{&lt;br /&gt;
	mRemain += timePassed;&lt;br /&gt;
	while (mRemain &amp;gt;= mCurrentFrame-&amp;gt;mDelay) {&lt;br /&gt;
		mRemain -= mCurrentFrame-&amp;gt;mDelay;&lt;br /&gt;
		mCurrentFrame = mCurrentFrame-&amp;gt;mNext;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal of hairstyles by Modanung ==&lt;br /&gt;
&lt;br /&gt;
I think the current system with an xml file for every hairstyle with an index and offset defined for every frame is a bit too mutch. It also takes a lot of work to correct small errors and to add new hairstyles that may have a different frame size and with it a different offset.&lt;br /&gt;
I suggest we split hairstyles up in three catagories:&lt;br /&gt;
* Static hairstyles&lt;br /&gt;
* Standard animated hairstyles&lt;br /&gt;
* Special case hairstyles&lt;br /&gt;
===Static hairstyles===&lt;br /&gt;
These are hairstyles which only have one frame for each direction and death, so five. All current hairstyles would be static hairstyles. Every individual static hairstyle needs nothing more to be defined then their bitmap, their size and their offset for each direction.&lt;br /&gt;
The offset for each seperate frame would be defined in a shared file (say hairoffsets.xml), this summed with the individual hairstyle&#039;s offset is the offset for that single frame with that hairstyle. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle1.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;static_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle1.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairoffsets.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;-1&amp;quot; offsetY =&amp;quot;-25&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;1&amp;quot; offsetY =&amp;quot;-29&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-28&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;-29&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
static_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;4&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Standard animated hairstyles===&lt;br /&gt;
These are hairstyles that can be compared with hair in SoM or Chrono Trigger, they move as you walk and attack. They have three frames for each direction and death, so thirteen frames all together. These three frames can be devided in a relaxed frame and two extremes. Those two extremes either being up and down or left and right, depending on the hair style. A heavily greased Evil look would wobble up and down as you walk and a pony talk would wave from left to right.&lt;br /&gt;
Standard animated hairstyles hairstyles use the same offset as static ones only they have a different file for defining the frames.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle2.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=&amp;quot;animated_hairstyles_frames.xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle2.png&amp;quot; width=&amp;quot;40&amp;quot; height=&amp;quot;40&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;offsetX=&amp;quot;0&amp;quot; offsetY =&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
animated_hairstyles_frames.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;9&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;75&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
...etc...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Special case hairstyles===&lt;br /&gt;
And then there are the odd ones, the hairstyles that need a little more freedom. Hairstyles that people want to make wave in the wind, even when the player stands still. Or a birdnest hairstyle with nestlings that constantly open and close their mouth in a random frequency nomatter what you do. I&#039;ll take as example a Medusa hairstyle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hairstyle3.xml&lt;br /&gt;
&amp;lt;offsetfile=&amp;quot;hairoffsets.xml&amp;quot;, framefile=0&amp;gt;&lt;br /&gt;
&amp;lt;sprite variants=&amp;quot;10&amp;quot; variant_offset=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/hairstyle3.png&amp;quot; width=&amp;quot;50&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;offsetX=&amp;quot;-5&amp;quot; offsetY =&amp;quot;-10&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;0&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;7&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;8&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;9&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;10&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	  &amp;lt;frame index=&amp;quot;11&amp;quot; delay=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;animation direction=&amp;quot;default&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;frame index=&amp;quot;12&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/animation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This hairstyle showes a bunch of snakes on your head that always wave &#039;n wobble unless you&#039;re dead. It moves asychronusly with the attack and walking animations and it also moves when you stand still. Special hairstyles might also use their own offsets ofcourse&lt;br /&gt;
I think this pretty much finished my proposal.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4337</id>
		<title>Development:Animations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4337"/>
		<updated>2006-07-21T15:45:17Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
Each animation will be defined by an xml document, here follows an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;player&amp;quot; action=&amp;quot;stand&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/player_male_base.png&amp;quot; width=&amp;quot;64&amp;quot; height=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;36&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;54&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;19&amp;quot; end=&amp;quot;24&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;37&amp;quot; end=&amp;quot;42&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;55&amp;quot; end=&amp;quot;60&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;sit&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;25&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;43&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;61&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;8&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;26&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;44&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;62&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;attack&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;9&amp;quot; end=&amp;quot;12&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;27&amp;quot; end=&amp;quot;30&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;45&amp;quot; end=&amp;quot;48&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;63&amp;quot; end=&amp;quot;66&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you want to load the playerset you just load player.xml and it takes care of loading all related images. Of course delays are defined in milliseconds.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sprite&amp;amp;gt; ===&lt;br /&gt;
A sprite is an object which can carry several animations, hence we call the root element the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt;. The sprite got two optional properties &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt;. These are required when there are multiple very similar versions of a sprite in one spriteset. One example for this are the hairset spritesets. &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; defines the number of variants in the spriteset and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt; how many sprites are between the first sprites of the variants. When defining multiple variants you only define the animation sequences of the first variant. the engine then shifts the index parameters when it wants anotherone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;action&amp;amp;gt; ===&lt;br /&gt;
collection of the animation in different directions that belong to an action the character can perform. the properties are the imageset the animation phases are taken from and the name of the action. &lt;br /&gt;
&lt;br /&gt;
possible names:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               use-item&lt;br /&gt;
                   |&lt;br /&gt;
  attack-bow  cast-magic&lt;br /&gt;
       |           |&lt;br /&gt;
 attack-stab  attack-throw&lt;br /&gt;
         \     /       &lt;br /&gt;
run   attack-swing   sleeping   dead&lt;br /&gt;
 |          |           |        | &lt;br /&gt;
walk     attack        sit      hurt&lt;br /&gt;
   \        \          /         /&lt;br /&gt;
               stand&lt;br /&gt;
                 |&lt;br /&gt;
        (no name attribute)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this table also specifies the substitution precedence. when a specific name is requested but it is not defined the next lower name is used instead.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Defines an animation sequence that should be displayed when the sprite object faces in a specific direction (attribute &amp;quot;direction&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
the possible directions are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
up&lt;br /&gt;
down&lt;br /&gt;
left&lt;br /&gt;
right&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when a specific direction isn&#039;t provided, the first defined direction is used instead. this can be overridden by defining an animation with the direction &amp;quot;default&amp;quot; for this action.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;&amp;lt;animation&amp;gt;&amp;lt;/code&amp;gt; has one or more &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; child elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;frame&amp;amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
each of them defines one frame of the animation. the required properties are &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; and optional &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; defines the index of the graphic on the spriteset. &lt;br /&gt;
&lt;br /&gt;
an optional property is &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. every frame is displayed for &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; millisecounds and then replaced by the next frame in sequence. when the last frame is reached the sequence starts with the first frame again. when no delay is specified (or specified as &amp;quot;0&amp;quot;) the animation doesn&#039;t continue when this &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; is reached.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; element can optionally have the properties &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; to specify an offset from the default drawing position for that frame. This allows the animation of for example the hairset (or any equipment) to reuse the same frames with different offsets.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sequence&amp;amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; tag does not only define one animation phase but multiple phases. Its properties are &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; which are all required. The delay is the delay in ms between each phase. the properties &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; define the first and the last index of the animation sequence on the spritesheet.&lt;br /&gt;
&lt;br /&gt;
== Suggested additions ==&lt;br /&gt;
&lt;br /&gt;
=== multiple delays in a &amp;amp;lt;frame&amp;amp;gt; with start and end attribute ===&lt;br /&gt;
in the bow animation I&#039;ve chosen a shortcut to specify different delays for different frames. I am undecided yet whether this is a nice feature or whether it&#039;ll be better to require multiple &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; elements in such cases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;random&amp;amp;gt; childtag for &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Also, it includes an experimental suggestion on specifying that a random frame should be chosen. This should also have an exclude_current_frame thingy, to make sure a frame isn&#039;t shown twice or more in a row. Sometimes this may be wanted though.&lt;br /&gt;
&lt;br /&gt;
=== sequences based on default sequences ===&lt;br /&gt;
After reflecting on this idea (and the above suggestion) I think a first issue to solve is to reduce the amount of duplicated definitions. For example, at the moment every monster uses the exact same frame size and animation frames. Hence, it would be interesting if the defined sprite could take the actual imageset it uses as a parameter instead of specifying this on its own. This way we can define a monster like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Red Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-red-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defining an empty imageset (without &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute) will make the engine require this imageset to be passed as a parameter whenever the spriteset is referenced.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not convinced yet that the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; attribute of the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt; element is really necessary. I think I would prefer each sprite to be defined in its own file. However it could be attractive to define multiple things in the same file, but in that case I think we will have to read everything when the client is launched, and only graphics and imagesets can be created lazily (only when necessary). Because the other data consists of just numbers and strings, this should not be really a problem.&lt;br /&gt;
&lt;br /&gt;
== An implementation idea by Peoro ==&lt;br /&gt;
&lt;br /&gt;
An idea to manage the animations should be a class based on a timer which choose automatically the current frame.&lt;br /&gt;
Who needs animations (players, monsters and npcs) has only to start the animanion and to request the frame to draw it.&lt;br /&gt;
Each instance of Animation class keep its own start-time (or a personal timer), its total time, number of frames, and the time of every frame.&lt;br /&gt;
The Animation class has to provide at least a function to start the animation and another one to get the current frame; other usefull functions should pause and restart the animation and allow to jump to a random frame.&lt;br /&gt;
&lt;br /&gt;
Here a simple example of a prototype of an Animation class:&lt;br /&gt;
(I mutilated my original Animation class to simplify and summarize it cutting a lot of other functions and vars and using the most possible of standard items)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
    int nframes;&lt;br /&gt;
    Img **frames;&lt;br /&gt;
    int *times;&lt;br /&gt;
    int totalTime;&lt;br /&gt;
    int startTime;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    Animation ( int n, Img **i, int *t )&lt;br /&gt;
    {&lt;br /&gt;
        int c;&lt;br /&gt;
    	&lt;br /&gt;
        nframes = n;&lt;br /&gt;
        frames = new Img* [n];&lt;br /&gt;
        times = new int [n];&lt;br /&gt;
        totalTime = 0;&lt;br /&gt;
        &lt;br /&gt;
        for ( c = 0; c &amp;lt; n; c ++ ) {&lt;br /&gt;
            frames[c] = i[c];&lt;br /&gt;
            times[c] = t[c];&lt;br /&gt;
            totalTime += t[c];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    inline void start ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        startTime = t;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img *getFrame ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        int i;&lt;br /&gt;
        int it&lt;br /&gt;
        &lt;br /&gt;
        if ( ! totalTime ) {&lt;br /&gt;
            t = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            t = (t-startTime) % totalTime;&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        // searches the current frame&lt;br /&gt;
        for ( i = 0, it = 0; (it + times[i]) &amp;lt; t; i ++, it += times[i] );&lt;br /&gt;
        &lt;br /&gt;
        return frames[i];&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here how to use this class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Img * imgs [] = { img1, img2, img3 };&lt;br /&gt;
int times [] = { 20, 20, 30 };&lt;br /&gt;
&lt;br /&gt;
Animation a ( 3, imgs, times );&lt;br /&gt;
&lt;br /&gt;
a.start ( );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( a.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An advantage of this class is that the animation speed is indipendent to FPS and it&#039;s very easy to use.&lt;br /&gt;
&lt;br /&gt;
This is a simple way to manage a lot of animations for who needs more than one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class AnimationsList&lt;br /&gt;
{&lt;br /&gt;
    // ltstr is only a const char* comparison function&lt;br /&gt;
    map&amp;lt;const char*, Animation*, ltstr&amp;gt; animations;&lt;br /&gt;
    int startTime;       // now Animation::startTime is no more usefull&lt;br /&gt;
    Animation *currentAnimation;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    AnimationsList ( ) : currentAnimation(0) { }&lt;br /&gt;
    &lt;br /&gt;
    inline void addAnimation ( const char *n, Animation *a )&lt;br /&gt;
    {&lt;br /&gt;
        animations[n] = a;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int setAnimation ( const char *n, int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
	map&amp;lt;const char*, Animation*, ltstr&amp;gt;::iterator ai;&lt;br /&gt;
        Animation *a;&lt;br /&gt;
        &lt;br /&gt;
	ai = animations.find ( n );&lt;br /&gt;
	&lt;br /&gt;
	if ( ai == animations.end() ) {&lt;br /&gt;
                // error... animation not found&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
	a = ai-&amp;gt;second;&lt;br /&gt;
        &lt;br /&gt;
        if ( currentAnimation != a ) {&lt;br /&gt;
            a-&amp;gt;start ( );&lt;br /&gt;
            currentAnimation = a;&lt;br /&gt;
            startTime = t;&lt;br /&gt;
	}&lt;br /&gt;
        &lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img * getFrame ( )&lt;br /&gt;
    {&lt;br /&gt;
        if ( currentAnimation ) {&lt;br /&gt;
            return currentAnimation-&amp;gt;getFrame ( );&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a multimap instead the map it&#039;s possible to keep more than an animation bind to the same string. This would be a good way to make AnimationsList choose a random animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And here how to use AnimationsList class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AnimationsList al;&lt;br /&gt;
&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot;, anim1 );&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;north&amp;quot;, anim2 );&lt;br /&gt;
al.addAnimation ( &amp;quot;anim3&amp;quot;, anim3 );&lt;br /&gt;
&lt;br /&gt;
al.setAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( al.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope not to had make a mistake writing... Anyway these are only theorical bases.&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal by Doener ==&lt;br /&gt;
&lt;br /&gt;
This proposal is incomplete regarding how new sequences are added to the&lt;br /&gt;
Animation (which is not the right name for this type of class *g*)... Anyway,&lt;br /&gt;
you should get the idea...&lt;br /&gt;
The Frame class encapsulates images and are used to create a single linked list that&lt;br /&gt;
creates an animation. The idea behind the linked list is that you can easily create loops,&lt;br /&gt;
by having the last element of the animation pointing to the first one. Also, you can easily&lt;br /&gt;
prepend a &amp;quot;starting animation&amp;quot; before the loop, like in an animation of a running player.&lt;br /&gt;
He starts out with one animation and then loops the real running... The Animation class is&lt;br /&gt;
responsible for mapping animation names to their starting frame and for disposing the encapsulating&lt;br /&gt;
Frame objects, thus a std::map and a std::list is used to keep track of those objects.&lt;br /&gt;
The next frame is simply calculated from the time that has passed since the last run of the&lt;br /&gt;
logic method. The case that a whole animation loop can be skipped is not taken into consideration,&lt;br /&gt;
because a) we cannot do this with frames linked together arbitrarily and b) animations will probably&lt;br /&gt;
take around 100ms or longer, ie. we&#039;d have less than 10fps for that case to happen and then &lt;br /&gt;
there&#039;s nothing left to gain by that simple optimization anymore anyway ;)&lt;br /&gt;
&lt;br /&gt;
For the linked list features, of course the xml format needs to be adjusted to support that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Frame class, stored information about frames in an animation&lt;br /&gt;
 */&lt;br /&gt;
struct Frame&lt;br /&gt;
{&lt;br /&gt;
	Image *mImg;  // Image for this frame&lt;br /&gt;
	int mDelay;   // Time in ms for how long this frame is shown&lt;br /&gt;
	Frame *mNext; // Next frame in sequence&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
	public:&lt;br /&gt;
		Animation():mCurrentFrame(0);&lt;br /&gt;
		~Animation();&lt;br /&gt;
&lt;br /&gt;
		void setSequence(const std::string &amp;amp;);&lt;br /&gt;
&lt;br /&gt;
		void logic(int timePassed);&lt;br /&gt;
&lt;br /&gt;
		Image* getCurrentImage()&lt;br /&gt;
			{ return mCurrentFrame ? mCurrentFrame-&amp;gt;mImg : 0; }&lt;br /&gt;
&lt;br /&gt;
	private:&lt;br /&gt;
		Frame *mCurrentFrame;&lt;br /&gt;
		typedef std::map&amp;lt;std::string,Frame*&amp;gt; FrameMap;&lt;br /&gt;
		typedef FrameMap::iterator FrameMapIterator;&lt;br /&gt;
		FrameMap mStartFrames;&lt;br /&gt;
		std::list&amp;lt;Frame*&amp;gt; mFrames;&lt;br /&gt;
		int mRemain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Animation::~Animation()&lt;br /&gt;
{&lt;br /&gt;
	for_each(mFrames.begin(), mFrames.end(), make_dtor(mFrames));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::setSequence(const std::string &amp;amp;name)&lt;br /&gt;
{&lt;br /&gt;
	FrameMapIterator i = mStartFrames.find(name);&lt;br /&gt;
	mCurrentFrame = (i == mStartFrames.end()) ? 0 : i-&amp;gt;second;&lt;br /&gt;
	mRemain = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::logic(int timePassed)&lt;br /&gt;
{&lt;br /&gt;
	mRemain += timePassed;&lt;br /&gt;
	while (mRemain &amp;gt;= mCurrentFrame-&amp;gt;mDelay) {&lt;br /&gt;
		mRemain -= mCurrentFrame-&amp;gt;mDelay;&lt;br /&gt;
		mCurrentFrame = mCurrentFrame-&amp;gt;mNext;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal of hairstyles by Modanung ==&lt;br /&gt;
&lt;br /&gt;
I think the current system with an xml file for every hairstyle with an index and offset defined for every frame is a bit too mutch. It also takes a lot of work to correct small errors and to add new hairstyles that may have a different frame size and with it a different offset.&lt;br /&gt;
I suggest we split hairstyles up in three catagories:&lt;br /&gt;
* Static hairstyles&lt;br /&gt;
* Standard animated hairstyles&lt;br /&gt;
* Special case hairstyles&lt;br /&gt;
===Static hairstyles===&lt;br /&gt;
These are hairstyles which only have one frame for each direction, for every animation. All current hairstyles would be static hairstyles. Every individual static hairstyle needs nothing more to be defined then their bitmap, their size and their offset for each direction.&lt;br /&gt;
The offset for each seperate frame would be defined in a shared file (say hairoffsets.xml), this summed with the indicidual hairstyle&#039;s offset is the offset for that single frame with that hairstyle. &lt;br /&gt;
...To be finished...&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4336</id>
		<title>Development:Animations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Animations&amp;diff=4336"/>
		<updated>2006-07-21T15:33:43Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Exclude_current_frame thingy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
Each animation will be defined by an xml document, here follows an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;player&amp;quot; action=&amp;quot;stand&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;imageset name=&amp;quot;base&amp;quot; src=&amp;quot;graphics/sprites/player_male_base.png&amp;quot; width=&amp;quot;64&amp;quot; height=&amp;quot;64&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;stand&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;36&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;54&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;walk&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;1&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;2&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;3&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;4&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;5&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;frame index=&amp;quot;6&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;19&amp;quot; end=&amp;quot;24&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;37&amp;quot; end=&amp;quot;42&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;55&amp;quot; end=&amp;quot;60&amp;quot; delay=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;sit&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;25&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;43&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		 &amp;lt;frame index=&amp;quot;61&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;dead&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;8&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;26&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;44&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
		  &amp;lt;frame index=&amp;quot;62&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;action name=&amp;quot;attack&amp;quot; imageset=&amp;quot;base&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;down&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;9&amp;quot; end=&amp;quot;12&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;27&amp;quot; end=&amp;quot;30&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;up&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;45&amp;quot; end=&amp;quot;48&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
		&amp;lt;animation direction=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;sequence start=&amp;quot;63&amp;quot; end=&amp;quot;66&amp;quot; delay=&amp;quot;100&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/animation&amp;gt;&lt;br /&gt;
	&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you want to load the playerset you just load player.xml and it takes care of loading all related images. Of course delays are defined in milliseconds.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sprite&amp;amp;gt; ===&lt;br /&gt;
A sprite is an object which can carry several animations, hence we call the root element the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt;. The sprite got two optional properties &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt;. These are required when there are multiple very similar versions of a sprite in one spriteset. One example for this are the hairset spritesets. &amp;lt;code&amp;gt;variants&amp;lt;/code&amp;gt; defines the number of variants in the spriteset and &amp;lt;code&amp;gt;variant_offset&amp;lt;/code&amp;gt; how many sprites are between the first sprites of the variants. When defining multiple variants you only define the animation sequences of the first variant. the engine then shifts the index parameters when it wants anotherone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;action&amp;amp;gt; ===&lt;br /&gt;
collection of the animation in different directions that belong to an action the character can perform. the properties are the imageset the animation phases are taken from and the name of the action. &lt;br /&gt;
&lt;br /&gt;
possible names:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
               use-item&lt;br /&gt;
                   |&lt;br /&gt;
  attack-bow  cast-magic&lt;br /&gt;
       |           |&lt;br /&gt;
 attack-stab  attack-throw&lt;br /&gt;
         \     /       &lt;br /&gt;
run   attack-swing   sleeping   dead&lt;br /&gt;
 |          |           |        | &lt;br /&gt;
walk     attack        sit      hurt&lt;br /&gt;
   \        \          /         /&lt;br /&gt;
               stand&lt;br /&gt;
                 |&lt;br /&gt;
        (no name attribute)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this table also specifies the substitution precedence. when a specific name is requested but it is not defined the next lower name is used instead.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Defines an animation sequence that should be displayed when the sprite object faces in a specific direction (attribute &amp;quot;direction&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
the possible directions are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
up&lt;br /&gt;
down&lt;br /&gt;
left&lt;br /&gt;
right&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when a specific direction isn&#039;t provided, the first defined direction is used instead. this can be overridden by defining an animation with the direction &amp;quot;default&amp;quot; for this action.&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;&amp;lt;animation&amp;gt;&amp;lt;/code&amp;gt; has one or more &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; child elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;frame&amp;amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
each of them defines one frame of the animation. the required properties are &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; and optional &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; defines the index of the graphic on the spriteset. &lt;br /&gt;
&lt;br /&gt;
an optional property is &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. every frame is displayed for &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; millisecounds and then replaced by the next frame in sequence. when the last frame is reached the sequence starts with the first frame again. when no delay is specified (or specified as &amp;quot;0&amp;quot;) the animation doesn&#039;t continue when this &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; is reached.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; element can optionally have the properties &amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt; to specify an offset from the default drawing position for that frame. This allows the animation of for example the hairset (or any equipment) to reuse the same frames with different offsets.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;sequence&amp;amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; tag does not only define one animation phase but multiple phases. Its properties are &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; which are all required. The delay is the delay in ms between each phase. the properties &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; define the first and the last index of the animation sequence on the spritesheet.&lt;br /&gt;
&lt;br /&gt;
== Suggested additions ==&lt;br /&gt;
&lt;br /&gt;
=== multiple delays in a &amp;amp;lt;frame&amp;amp;gt; with start and end attribute ===&lt;br /&gt;
in the bow animation I&#039;ve chosen a shortcut to specify different delays for different frames. I am undecided yet whether this is a nice feature or whether it&#039;ll be better to require multiple &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; elements in such cases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;lt;random&amp;amp;gt; childtag for &amp;amp;lt;animation&amp;amp;gt; ===&lt;br /&gt;
Also, it includes an experimental suggestion on specifying that a random frame should be chosen. This should also have an exclude_current_frame thingy, to make sure a frame isn&#039;t shown twice or more in a row. Sometimes this may be wanted though.&lt;br /&gt;
&lt;br /&gt;
=== sequences based on default sequences ===&lt;br /&gt;
After reflecting on this idea (and the above suggestion) I think a first issue to solve is to reduce the amount of duplicated definitions. For example, at the moment every monster uses the exact same frame size and animation frames. Hence, it would be interesting if the defined sprite could take the actual imageset it uses as a parameter instead of specifying this on its own. This way we can define a monster like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;sprite name=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;imageset name=&amp;quot;base&amp;quot; /&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/sprite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;being name=&amp;quot;Red Scorpion&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;sprite ref=&amp;quot;monster-walking-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;with-imageset name=&amp;quot;base&amp;quot; src=&amp;quot;scorpion-red-base.png&amp;quot; width=&amp;quot;60&amp;quot; height=&amp;quot;60&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/sprite&amp;gt;&lt;br /&gt;
&amp;lt;/being&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defining an empty imageset (without &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute) will make the engine require this imageset to be passed as a parameter whenever the spriteset is referenced.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not convinced yet that the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; attribute of the &amp;lt;code&amp;gt;sprite&amp;lt;/code&amp;gt; element is really necessary. I think I would prefer each sprite to be defined in its own file. However it could be attractive to define multiple things in the same file, but in that case I think we will have to read everything when the client is launched, and only graphics and imagesets can be created lazily (only when necessary). Because the other data consists of just numbers and strings, this should not be really a problem.&lt;br /&gt;
&lt;br /&gt;
== An implementation idea by Peoro ==&lt;br /&gt;
&lt;br /&gt;
An idea to manage the animations should be a class based on a timer which choose automatically the current frame.&lt;br /&gt;
Who needs animations (players, monsters and npcs) has only to start the animanion and to request the frame to draw it.&lt;br /&gt;
Each instance of Animation class keep its own start-time (or a personal timer), its total time, number of frames, and the time of every frame.&lt;br /&gt;
The Animation class has to provide at least a function to start the animation and another one to get the current frame; other usefull functions should pause and restart the animation and allow to jump to a random frame.&lt;br /&gt;
&lt;br /&gt;
Here a simple example of a prototype of an Animation class:&lt;br /&gt;
(I mutilated my original Animation class to simplify and summarize it cutting a lot of other functions and vars and using the most possible of standard items)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
    int nframes;&lt;br /&gt;
    Img **frames;&lt;br /&gt;
    int *times;&lt;br /&gt;
    int totalTime;&lt;br /&gt;
    int startTime;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    Animation ( int n, Img **i, int *t )&lt;br /&gt;
    {&lt;br /&gt;
        int c;&lt;br /&gt;
    	&lt;br /&gt;
        nframes = n;&lt;br /&gt;
        frames = new Img* [n];&lt;br /&gt;
        times = new int [n];&lt;br /&gt;
        totalTime = 0;&lt;br /&gt;
        &lt;br /&gt;
        for ( c = 0; c &amp;lt; n; c ++ ) {&lt;br /&gt;
            frames[c] = i[c];&lt;br /&gt;
            times[c] = t[c];&lt;br /&gt;
            totalTime += t[c];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    inline void start ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        startTime = t;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img *getFrame ( int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
        int i;&lt;br /&gt;
        int it&lt;br /&gt;
        &lt;br /&gt;
        if ( ! totalTime ) {&lt;br /&gt;
            t = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            t = (t-startTime) % totalTime;&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        // searches the current frame&lt;br /&gt;
        for ( i = 0, it = 0; (it + times[i]) &amp;lt; t; i ++, it += times[i] );&lt;br /&gt;
        &lt;br /&gt;
        return frames[i];&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And here how to use this class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Img * imgs [] = { img1, img2, img3 };&lt;br /&gt;
int times [] = { 20, 20, 30 };&lt;br /&gt;
&lt;br /&gt;
Animation a ( 3, imgs, times );&lt;br /&gt;
&lt;br /&gt;
a.start ( );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( a.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An advantage of this class is that the animation speed is indipendent to FPS and it&#039;s very easy to use.&lt;br /&gt;
&lt;br /&gt;
This is a simple way to manage a lot of animations for who needs more than one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class AnimationsList&lt;br /&gt;
{&lt;br /&gt;
    // ltstr is only a const char* comparison function&lt;br /&gt;
    map&amp;lt;const char*, Animation*, ltstr&amp;gt; animations;&lt;br /&gt;
    int startTime;       // now Animation::startTime is no more usefull&lt;br /&gt;
    Animation *currentAnimation;&lt;br /&gt;
    &lt;br /&gt;
public:&lt;br /&gt;
    AnimationsList ( ) : currentAnimation(0) { }&lt;br /&gt;
    &lt;br /&gt;
    inline void addAnimation ( const char *n, Animation *a )&lt;br /&gt;
    {&lt;br /&gt;
        animations[n] = a;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int setAnimation ( const char *n, int t = clock() )&lt;br /&gt;
    {&lt;br /&gt;
	map&amp;lt;const char*, Animation*, ltstr&amp;gt;::iterator ai;&lt;br /&gt;
        Animation *a;&lt;br /&gt;
        &lt;br /&gt;
	ai = animations.find ( n );&lt;br /&gt;
	&lt;br /&gt;
	if ( ai == animations.end() ) {&lt;br /&gt;
                // error... animation not found&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
	a = ai-&amp;gt;second;&lt;br /&gt;
        &lt;br /&gt;
        if ( currentAnimation != a ) {&lt;br /&gt;
            a-&amp;gt;start ( );&lt;br /&gt;
            currentAnimation = a;&lt;br /&gt;
            startTime = t;&lt;br /&gt;
	}&lt;br /&gt;
        &lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Img * getFrame ( )&lt;br /&gt;
    {&lt;br /&gt;
        if ( currentAnimation ) {&lt;br /&gt;
            return currentAnimation-&amp;gt;getFrame ( );&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using a multimap instead the map it&#039;s possible to keep more than an animation bind to the same string. This would be a good way to make AnimationsList choose a random animation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And here how to use AnimationsList class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AnimationsList al;&lt;br /&gt;
&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot;, anim1 );&lt;br /&gt;
al.addAnimation ( &amp;quot;walking&amp;quot; &amp;quot;north&amp;quot;, anim2 );&lt;br /&gt;
al.addAnimation ( &amp;quot;anim3&amp;quot;, anim3 );&lt;br /&gt;
&lt;br /&gt;
al.setAnimation ( &amp;quot;walking&amp;quot; &amp;quot;south&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
while ( 1 ) {&lt;br /&gt;
    draw ( al.getFrame() );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope not to had make a mistake writing... Anyway these are only theorical bases.&lt;br /&gt;
&lt;br /&gt;
== Implementation proposal by Doener ==&lt;br /&gt;
&lt;br /&gt;
This proposal is incomplete regarding how new sequences are added to the&lt;br /&gt;
Animation (which is not the right name for this type of class *g*)... Anyway,&lt;br /&gt;
you should get the idea...&lt;br /&gt;
The Frame class encapsulates images and are used to create a single linked list that&lt;br /&gt;
creates an animation. The idea behind the linked list is that you can easily create loops,&lt;br /&gt;
by having the last element of the animation pointing to the first one. Also, you can easily&lt;br /&gt;
prepend a &amp;quot;starting animation&amp;quot; before the loop, like in an animation of a running player.&lt;br /&gt;
He starts out with one animation and then loops the real running... The Animation class is&lt;br /&gt;
responsible for mapping animation names to their starting frame and for disposing the encapsulating&lt;br /&gt;
Frame objects, thus a std::map and a std::list is used to keep track of those objects.&lt;br /&gt;
The next frame is simply calculated from the time that has passed since the last run of the&lt;br /&gt;
logic method. The case that a whole animation loop can be skipped is not taken into consideration,&lt;br /&gt;
because a) we cannot do this with frames linked together arbitrarily and b) animations will probably&lt;br /&gt;
take around 100ms or longer, ie. we&#039;d have less than 10fps for that case to happen and then &lt;br /&gt;
there&#039;s nothing left to gain by that simple optimization anymore anyway ;)&lt;br /&gt;
&lt;br /&gt;
For the linked list features, of course the xml format needs to be adjusted to support that.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Frame class, stored information about frames in an animation&lt;br /&gt;
 */&lt;br /&gt;
struct Frame&lt;br /&gt;
{&lt;br /&gt;
	Image *mImg;  // Image for this frame&lt;br /&gt;
	int mDelay;   // Time in ms for how long this frame is shown&lt;br /&gt;
	Frame *mNext; // Next frame in sequence&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Animation&lt;br /&gt;
{&lt;br /&gt;
	public:&lt;br /&gt;
		Animation():mCurrentFrame(0);&lt;br /&gt;
		~Animation();&lt;br /&gt;
&lt;br /&gt;
		void setSequence(const std::string &amp;amp;);&lt;br /&gt;
&lt;br /&gt;
		void logic(int timePassed);&lt;br /&gt;
&lt;br /&gt;
		Image* getCurrentImage()&lt;br /&gt;
			{ return mCurrentFrame ? mCurrentFrame-&amp;gt;mImg : 0; }&lt;br /&gt;
&lt;br /&gt;
	private:&lt;br /&gt;
		Frame *mCurrentFrame;&lt;br /&gt;
		typedef std::map&amp;lt;std::string,Frame*&amp;gt; FrameMap;&lt;br /&gt;
		typedef FrameMap::iterator FrameMapIterator;&lt;br /&gt;
		FrameMap mStartFrames;&lt;br /&gt;
		std::list&amp;lt;Frame*&amp;gt; mFrames;&lt;br /&gt;
		int mRemain;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Animation::~Animation()&lt;br /&gt;
{&lt;br /&gt;
	for_each(mFrames.begin(), mFrames.end(), make_dtor(mFrames));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::setSequence(const std::string &amp;amp;name)&lt;br /&gt;
{&lt;br /&gt;
	FrameMapIterator i = mStartFrames.find(name);&lt;br /&gt;
	mCurrentFrame = (i == mStartFrames.end()) ? 0 : i-&amp;gt;second;&lt;br /&gt;
	mRemain = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animation::logic(int timePassed)&lt;br /&gt;
{&lt;br /&gt;
	mRemain += timePassed;&lt;br /&gt;
	while (mRemain &amp;gt;= mCurrentFrame-&amp;gt;mDelay) {&lt;br /&gt;
		mRemain -= mCurrentFrame-&amp;gt;mDelay;&lt;br /&gt;
		mCurrentFrame = mCurrentFrame-&amp;gt;mNext;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Guidelines&amp;diff=4323</id>
		<title>Development:Guidelines</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Guidelines&amp;diff=4323"/>
		<updated>2006-07-17T16:36:32Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Zoggle&amp;#039;s site seems to be down.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== In general ==&lt;br /&gt;
*Don&#039;t be afraid to show us your unfinished pieces, we are there to guide and help you through the process.&lt;br /&gt;
*If possible, hang around the #tmwart channel on irc.freenode.net 24/7.&lt;br /&gt;
*When you&#039;re available / doing work on tmw related stuff, please contact me on the previously mentioned channel.&lt;br /&gt;
*We&#039;re soon going to have a centralized repository for all the art related stuff where we&#039;re going to archive all of your versions, so you can just start to contribute there without the need to track down a dev. The details on the repository and the preferred version numbering are coming soon. EDIT(20050419): Ask me for details, it&#039;s up now.&lt;br /&gt;
*Preferred formats: .png and .ogg&lt;br /&gt;
&lt;br /&gt;
== Concerning conceptual art ==&lt;br /&gt;
*You can always come up with new ideas to present to the team. Actually that&#039;s preferred and we like that.&lt;br /&gt;
*With conceptual art you might want to define important places, capture the generic atmosphere, look, and color scheme of a certain place or define the looks of an important NPC.&lt;br /&gt;
&lt;br /&gt;
== Concerning tiles ==&lt;br /&gt;
*We REALLY need a LOT of these, so if you think you can do ANYTHING, please give it a shot.&lt;br /&gt;
&lt;br /&gt;
*Especially on these actively seek out our attention so we can assign new tasks to you. The fact that we won&#039;t contact you personally every day doesn&#039;t mean we don&#039;t need your efforts.&lt;br /&gt;
&lt;br /&gt;
*You can find the technical specifications of tilesets here: [[Tileset development]]&lt;br /&gt;
&lt;br /&gt;
*Please keep in mind that a mapper has got only 3 layers: 2 of them are always displayed below players and monsters while the other one is displayed always above. The lowest layer is usually used for ground tiles/walls, and since the limited number of layers, ground tiles should be non-transparent even if this increase a lot the number of tiles in a tileset. Transparent tiles should be only used for objects you can place in different places with different backgrounds such as plants, barrels, ... It is preferrable that cups, and food and whatever else stands on a table is drawn with the table tile below it. Paintings shouldn&#039;t have transparent borders, but wall behind them. (if you plan to use for example paintings in different tileset, save them elsewhere as transparent objects and then reapply them to another tile).&lt;br /&gt;
&lt;br /&gt;
*Although we prefer high quality tiles over low quality ones, please keep in mind that we try to resemble the look of old SNES games. So please try not to make the tiles too realistic. This mean please don&#039;t use textures you get from reality, such a picture of a wooden piece and use it for your tiles. We strongly encourage you to manually pixelate every tile and avoid to use gradients or filters such as blur too excessive.&lt;br /&gt;
&lt;br /&gt;
*All the tileset should use some coherence:&lt;br /&gt;
**The direction of the light: south-west for outdoor tilesets (of course there will be exceptions: different (or special) areas could have a different direction of light to give it a subtle different feeling, such as lava caves with subtle orange light from the bottom, and deep in the dark forest with glowing mushrooms), diffuse light for indoor tilesets diffused light is nice, but overusage could lead into problems with contrast between the inside and the outside.&lt;br /&gt;
**The perspective: top-down 45Â° view angle (if in doubt, take a look at current screenshots or search for Secret of Mana screenshots).&lt;br /&gt;
**The proportions: a character is one tile wide and two tiles high.&lt;br /&gt;
**The color style: try to use the same color palette for the whole tileset. the selection of color is important for the feeling of the tileset. weak colors with a high amount of grey for example are good for a sad and cold feeling while bright colors create a happy and warm atmosphere. whatever atmosphere you choose: it should be consistent through the whole tileset. avoid using weird &amp;quot;alien&amp;quot; colors (keep saturation low :P). &lt;br /&gt;
**The tiles in one tileset should be able to be put together in as many different ways as possible to allow the mapper to express his creativity. This is the base requirement for:&lt;br /&gt;
*** Borders between different heights: http://www.enterbrain.co.jp/digifami/digiweb/dot_teck/3nen/05/8.gif&lt;br /&gt;
***Fences http://www.enterbrain.co.jp/digifami/digiweb/dot_teck/3nen/04/053.gif http://www.enterbrain.co.jp/digifami/digiweb/dot_teck/3nen/04/052.gif http://www.enterbrain.co.jp/digifami/digiweb/dot_teck/3nen/04/054.gif&lt;br /&gt;
(please note that the above pictures are only for demonstrational purpose. they are copyrighted and not part of the mana world project).&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
When you are not very experienced at creating pixel art, you should take a look at the following tutorials. You can learn many interesting tricks from them.&lt;br /&gt;
&lt;br /&gt;
*[http://www.petesqbsite.com/sections/tutorials/tuts/tsugumo/ So You Want To Be A Pixel Artist] by Tsugumo.&lt;br /&gt;
*[http://translate.google.com/translate?u=http%3A%2F%2Fwww.enterbrain.co.jp%2Fdigifami%2Fdigiweb%2Fdot_teck%2F3nen%2F3_01.html&amp;amp;langpair=ja%7Cen&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;prev=%2Flanguage_tools Enterbrains Tutorial (translated from Japanese by Google)]. all the above images have been taken from this tutorial.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Player_Groups&amp;diff=4322</id>
		<title>Talk:Player Groups</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Talk:Player_Groups&amp;diff=4322"/>
		<updated>2006-07-15T10:15:44Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I want to create a guild, to be accepted, nedd my permission, how much nedd to pay? I pay max 1kk to create the guild, the current members:&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;BraziL-ElitE&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; [ Guild Name ]&lt;br /&gt;
BraziL-KnighT [LeadeR]&lt;br /&gt;
BraziL-DiablehI [Member]&lt;br /&gt;
BraziL-FaldeoN [Member]&lt;br /&gt;
BraziL_BruninhU [Member]&lt;br /&gt;
BraziL-Ryane [Future Female Player]&lt;br /&gt;
&lt;br /&gt;
Well we don&#039;t have a guild system yet. So guilds can just be created by getting people together and naming your little gang. No need for paying anyone. [[User:Modanung|Modanung]] 12:15, 15 July 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Playersets&amp;diff=4298</id>
		<title>Development:Playersets</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Playersets&amp;diff=4298"/>
		<updated>2006-06-20T16:23:08Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Updated information on the female playerset&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
&lt;br /&gt;
== General specs ==&lt;br /&gt;
* &#039;&#039;&#039;Frame size:&#039;&#039;&#039; 32x64&lt;br /&gt;
* &#039;&#039;&#039;Color depth:&#039;&#039;&#039; 32 bpp (including alpha layer)&lt;br /&gt;
* &#039;&#039;&#039;Directions:&#039;&#039;&#039; 4 (north, south, east, west)&lt;br /&gt;
* Action list&lt;br /&gt;
** Current basic needs&lt;br /&gt;
*** Standing (1 frame)&lt;br /&gt;
*** Death (1 frame)&lt;br /&gt;
*** Sitting (1 frame)&lt;br /&gt;
*** Walking (6 frames)&lt;br /&gt;
*** Attacking with punch/single-hand thrusting weapon&lt;br /&gt;
*** Attacking with bow&lt;br /&gt;
*** Casting spell&lt;br /&gt;
**Extra sequences&lt;br /&gt;
*** Running (6 frames)&lt;br /&gt;
*** Skim-floating (amulet movement) (3 frames)&lt;br /&gt;
*** Waving (3 frames)&lt;br /&gt;
*** Picking up item (3 frames)&lt;br /&gt;
*** Getting hit (2 frames)&lt;br /&gt;
*** Attacking with single-hand slashing weapon&lt;br /&gt;
*** Attacking with two-hand thrusting weapon&lt;br /&gt;
*** Attacking with thrown weapon&lt;br /&gt;
*** Attacking with two-hand slashing weapon&lt;br /&gt;
*** Attacking with two-hand smashing weapon&lt;br /&gt;
*** Targeting spell on self&lt;br /&gt;
*** Targeting area of effect spell&lt;br /&gt;
*** Targeting spell on single target&lt;br /&gt;
&lt;br /&gt;
== Current state of development ==&lt;br /&gt;
&lt;br /&gt;
The male spriteset with all the animations that are currently needed is finally completed now. Thanks to all the artists who contributed to this fine piece of art. The next big challenge will be the female spriteset.&lt;br /&gt;
&lt;br /&gt;
When the players will gain additional posibilities like using spells or skills or when we will implement new ways of moving (like swimming or climbing) we will have to work on the spritesets again.&lt;br /&gt;
&lt;br /&gt;
=== Current Male Playerset by Talaroc and Modanung ===&lt;br /&gt;
&lt;br /&gt;
[[Image:Player-sheet.png | thumb | 600px]]&lt;br /&gt;
&lt;br /&gt;
=== Current Female Playerset by Modanung ===&lt;br /&gt;
&lt;br /&gt;
[[Image:Player-sheet-female.png | thumb | 600px]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Femsprite_2.png]]&lt;br /&gt;
&lt;br /&gt;
== Drafts and Suggestions ==&lt;br /&gt;
&lt;br /&gt;
=== [[User:moltheni|moltheni]]&#039;s modifications ===&lt;br /&gt;
26/07 &lt;br /&gt;
*I think eyes are too much big, what do you think of these? &amp;lt;br&amp;gt;&lt;br /&gt;
http://lev.altervista.org/tmw_eyes.GIF &lt;br /&gt;
*I&#039;ve also made three &#039;getting hit&#039; frames &amp;lt;br&amp;gt;&lt;br /&gt;
http://lev.altervista.org/tmw_chara_getting_hit.GIF &amp;lt;br&amp;gt;&lt;br /&gt;
08/08 &lt;br /&gt;
*I&#039;ve tried to improve the side standing pose and walkin animation (two versions of the walk, short or long arms..), I still haven&#039;t colored them :P &amp;lt;br&amp;gt;&lt;br /&gt;
http://lev.altervista.org/tmw_charasidestand.GIF standing pose&amp;lt;br&amp;gt;&lt;br /&gt;
http://lev.altervista.org/tmw_charasidewalk.GIF walks&lt;br /&gt;
&lt;br /&gt;
=== Old animation by Talaroc ===&lt;br /&gt;
&lt;br /&gt;
The first (on the left) image is the &amp;quot;standing&amp;quot; sprite.&lt;br /&gt;
&lt;br /&gt;
[[Image:Playerset south talaroc.png]] [[Image:South walk by talaroc animated.gif]]&lt;br /&gt;
&lt;br /&gt;
=== Sprite mods by Kyokai ===&lt;br /&gt;
&lt;br /&gt;
http://img109.exs.cx/img109/9112/kyokai7yv.png My character for TMW (someday)&lt;br /&gt;
http://img76.exs.cx/img76/6519/kirin7bf.png The NPC KirinDekagen&lt;br /&gt;
&lt;br /&gt;
=== Necromus ===&lt;br /&gt;
&lt;br /&gt;
http://www.filehigh.com/serve.php?u=1823&amp;amp;i=5825&amp;amp;t=.gif&lt;br /&gt;
&lt;br /&gt;
Side view walking frame (incomplete).&lt;br /&gt;
&lt;br /&gt;
=== Old animation by Neko-mon ===&lt;br /&gt;
&lt;br /&gt;
http://www.geocities.com/cless_alv/walking4.gif&lt;br /&gt;
http://www.lindeijer.nl/~bjorn/walking3_6frames.gif&lt;br /&gt;
http://www.lindeijer.nl/~bjorn/walking3_4frames.gif&lt;br /&gt;
&lt;br /&gt;
12, 6 and 4 frame versions.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
* [[User:BjÃ¸rn|BjÃ¸rn]]: I&#039;ve made the 6 frame versions by simply deleting all even frames in your animation. In my opinion it&#039;s still a fine animation and it&#039;s saving quite a bit of work. For the 4 frame version I have created a single neutral stand frame and used the two leg extremes, so it&#039;s actually only 3 different images.&lt;br /&gt;
&lt;br /&gt;
* [[User:Neko-mon|Neko-mon]]: I made little fixes in the 12 frames image.&lt;br /&gt;
&lt;br /&gt;
* [[User:moltheni|moltheni]]: Can I make some sprites too? If you tell me what is needed (and what others are doing) I can help!&amp;lt;br&amp;gt;p.s.: Aren&#039;t the eyes of the sidewalk sprites too much.. ehm... on the bottom (sorry for the english)?&amp;lt;br&amp;gt;and the shadow of the legs of the back-standing-pose-frame is inverted.&lt;br /&gt;
&lt;br /&gt;
* [[User:Bear|Bear]]:If you want to do something in Graphics, contact Rotonen, OR you can ask me about a few things. It might not be my part to lead graphics, but it would be good to get some monsters done. *just a critic* :D&lt;br /&gt;
&lt;br /&gt;
* [[User:ElvenProgrammer|ElvenProgrammer]]: moltheni, you can contact me as well. Feel free to propose improvements to the spriteset by Talaroc, especially on side walking and sit pose.&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File:Player-sheet.png&amp;diff=4297</id>
		<title>File:Player-sheet.png</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File:Player-sheet.png&amp;diff=4297"/>
		<updated>2006-06-20T16:16:31Z</updated>

		<summary type="html">&lt;p&gt;Modanung: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Male player spriteset by Talaroc, Jetryl and Modanung.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Project_description&amp;diff=4262</id>
		<title>Project description</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Project_description&amp;diff=4262"/>
		<updated>2006-06-07T09:37:42Z</updated>

		<summary type="html">&lt;p&gt;Modanung: Reverted Ohmygushdud0&amp;#039;s changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
The Mana World is a project that tries to create a free and open source MMORPG game with the looks of &amp;quot;old-fashioned&amp;quot; 2D RPG games such as those released for the SNES / Super Famicom in the early 90&#039;s. The game itself will be free to download and will also have no monthly fee.&lt;br /&gt;
&lt;br /&gt;
The Mana World aims to be a unique place for people to interact by not only fighting but also forming a community, a microcosm inside the game. Although the game is dynamic and does not have a linear story, it should include background story such as countries, tribes, culture, climate, etc. Quests should lead to other quests. Quests should also encourage forming groups/parties so as to promote the community feel.&lt;br /&gt;
&lt;br /&gt;
Additionally, the developers care about cross compilable source code and efficient resource management in order to make the game playable on as many platforms and operating systems as possible. Low end hardware such as x86 PIIs or G3 PPCs should be the minimum requirement.&lt;/div&gt;</summary>
		<author><name>Modanung</name></author>
	</entry>
</feed>