<?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=Silene</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=Silene"/>
	<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/wiki/Special:Contributions/Silene"/>
	<updated>2026-05-06T02:34:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=8108</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=8108"/>
		<updated>2007-11-09T20:41:15Z</updated>

		<summary type="html">&lt;p&gt;Silene: Added link to image recoloring&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| cellspacing=&amp;quot;3&amp;quot; cellpadding=&amp;quot;3&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:Tmw logo.png|100px]]&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #e0c8b8; color: #000; background-color: #faeee6&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
== Project information ==&lt;br /&gt;
* [[Project description]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[Developers]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[System requirements]]&lt;br /&gt;
* [[Roadmap]]&lt;br /&gt;
* [[Ports]]&lt;br /&gt;
* [http://themanaworld.svn.sourceforge.net/viewvc/themanaworld/tmw/trunk/ChangeLog?view=markup ChangeLog from SVN trunk]&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
&lt;br /&gt;
* [[Getting started]]&lt;br /&gt;
* [[Dependencies]]&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;
* [[Config settings]]&lt;br /&gt;
&lt;br /&gt;
==== Organization ====&lt;br /&gt;
&lt;br /&gt;
* [[Suggestions]]&lt;br /&gt;
* [[Bugs]]&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;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #c9c9ff; color: #000; background-color: #f3f3ff&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
=== In Progress ===&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;World:&#039;&#039;&#039; [[Backstory]], [[Geography]], [[Creatures]], [[Organizations]], [[Elements]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Game:&#039;&#039;&#039; [[Game systems]], [[Creature proposal]], [[Weapons]], [[Realtime action combat protocol|Realtime combat]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Graphics:&#039;&#039;&#039; [[Assignments]], [[Concept art]], [[Playerset development|Playersets]], [[Hairset development|Hairsets]], [[:Special:Newimages|New Images]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;GUI / Interface:&#039;&#039;&#039; [[GUI development]], [[Menu interface system]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Sound:&#039;&#039;&#039; [[SFX|SoundFX]], [[Music]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Server:&#039;&#039;&#039; [[Server development]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;RFCs:&#039;&#039;&#039; [[Rendering]], [[Action layers]], [[Improvement of the collision layer system|Collision system]], [[Being movement system|Movement system]], [[Logging]], [[Party system]]&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Game:&#039;&#039;&#039; [[Map development]], [[NPC development]], [[eAthena Scripting Standards]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Graphics:&#039;&#039;&#039; [[Guidelines]], [[Equipment development|Equipment sheets]], [[Tileset development|Tilesets]], [[Monsterset development|Monster sheets]], [[Particle engine]], [[Image dyeing]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;GUI / Interface:&#039;&#039;&#039; [[Keyboard usage]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;RFCs:&#039;&#039;&#039; [[Animations]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;General:&#039;&#039;&#039; [[Joining the project]], [[Making a new release]], [[Hacking]], [[Translations]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Documentation:&#039;&#039;&#039; [http://themanaworld.org/tmwdox/ Client], [http://themanaworld.org/tmwservdox/ Server]&lt;br /&gt;
&lt;br /&gt;
=== Outdated ===&lt;br /&gt;
&lt;br /&gt;
:[[Important NPCs]], [[Finished NPCs]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border: 1px solid #C58917; color: #000; background-color: #FFE87C&amp;quot; valign=&amp;quot;top&amp;quot; colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
== Currently active sections on the wiki==&lt;br /&gt;
*[[User:Crush/Wiki_Cleanup|Game system cleanup]]&lt;br /&gt;
*[[Backstory|Prehistory of the mana world]]&lt;br /&gt;
*[[Argaes|Argaes, the first continent]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__ __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Image_dyeing&amp;diff=8107</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=8107"/>
		<updated>2007-11-09T20:40:06Z</updated>

		<summary type="html">&lt;p&gt;Silene: Description of image recoloring&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.&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 values of pixels (from components equal to 1 to components equal to 255). For gray pixels, this is actually their intensity.&lt;br /&gt;
&lt;br /&gt;
All the pixels of a given color can be dyed with a particular palette. A palette is a sequence of RGB colors, e.g. &amp;lt;tt&amp;gt;8c4b41,da9041,ffff41&amp;lt;/tt&amp;gt;. Pixels of value 255 are transformed to color &amp;lt;tt&amp;gt;ffff41&amp;lt;/tt&amp;gt;. Pixels of value 0 (unavailable) are left unchanged to black, that is &amp;lt;tt&amp;gt;000000&amp;lt;/tt&amp;gt;. Other colors are applied to equally-spaced pixel values between these extreme values, so &amp;lt;tt&amp;gt;8c4b41&amp;lt;/tt&amp;gt; to value 85, and &amp;lt;tt&amp;gt;da9041&amp;lt;/tt&amp;gt; to value 170.&lt;br /&gt;
&lt;br /&gt;
The color sequence can have from one color to 255 colors. For values with no explicit color, the associated color is linearly interpolated between the two closest value.&lt;br /&gt;
&lt;br /&gt;
Pixels with complicated colors or without any dedicated palette are left unchanged by image recoloring. At most, the system allows to dye 1785 sets of pixels in an image independently.&lt;br /&gt;
&lt;br /&gt;
== Specifying palettes ==&lt;br /&gt;
&lt;br /&gt;
Whenever an image (usually a &amp;lt;tt&amp;gt;.png&amp;lt;/tt&amp;gt; file) is specified in a &amp;lt;tt&amp;gt;.xml&amp;lt;/tt&amp;gt; file, a palette can be appended to its name. The image is then automatically dyed on loading. For example, if one changes an image resource from &amp;lt;tt&amp;gt;foo.png&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;foo.png|W:#ffff00&amp;lt;/tt&amp;gt;, then all the gray pixels of &amp;lt;tt&amp;gt;test.png&amp;lt;/tt&amp;gt; will be replaced by shades of yellow, proportionally to their intensity.&lt;br /&gt;
&lt;br /&gt;
Several palettes (one per simple color) can be appended to an image. For example, green and red pixels are recolored independently for image &amp;lt;tt&amp;gt;foo.png|G:palette1;R:palette2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Palettes can either be specified as the name of a file containing a palette (format not yet defined) or directly defined as a color sequence. A sharp symbol &#039;&#039;&#039;#&#039;&#039;&#039; is prepended to this sequence, so that the system understands that the colors are embedded in the resource name.&lt;br /&gt;
&lt;br /&gt;
== Dyeing sprites ==&lt;br /&gt;
&lt;br /&gt;
When indicating the dyeable colors in an image, some palettes can be left unspecified. For example, the resource name &amp;lt;tt&amp;gt;foo.png|G;R:palette1;Y&amp;lt;/tt&amp;gt; means that green, red, and yellow, pixels of the image have to be dyed. But no palettes are specified for green and yellow pixels.&lt;br /&gt;
&lt;br /&gt;
These palettes will be specified at a higher level. If the &amp;lt;tt&amp;gt;foo.png&amp;lt;/tt&amp;gt; file is part of a sprite description named &amp;lt;tt&amp;gt;bar.xml&amp;lt;/tt&amp;gt;. Then palette specifications can be appended to the file name, e.g. &amp;lt;tt&amp;gt;bar.xml|palette2;palette3&amp;lt;/tt&amp;gt;. These additional palettes are then propagated to any image loaded by &amp;lt;tt&amp;gt;bar.xml&amp;lt;/tt&amp;gt; with unspecified palettes. So the &amp;lt;tt&amp;gt;foo.png&amp;lt;/tt&amp;gt; is finally recolored with the dye &amp;lt;tt&amp;gt;G:palette2;R:palette1;Y:palette3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here is a simple example taken from actual game data. The &amp;lt;tt&amp;gt;data/monsters.xml&amp;lt;/tt&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;tt&amp;gt;data/graphics/sprite/monster-scorpion.xml&amp;lt;/tt&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;tt&amp;gt;monster-scorpion.png&amp;lt;/tt&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;tt&amp;gt;monsters.xml&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
== Implementation remark ==&lt;br /&gt;
&lt;br /&gt;
Palettes have to be specified as part of the image and sprite resource names, so that they can be properly cached. If they were not, there would be collisions: All the recolored sprites would have the same color, the first one to be put in the cache for a given sprite definition. Since they are part of the resource names, they may as well be part of the filenames written in &amp;lt;tt&amp;gt;.xml&amp;lt;/tt&amp;gt; files.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7364</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7364"/>
		<updated>2007-08-18T12:14:17Z</updated>

		<summary type="html">&lt;p&gt;Silene: Mentioned potfiles.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Status_yellow}}&lt;br /&gt;
Translations in The Mana World are handled by the&lt;br /&gt;
[http://www.gnu.org/software/gettext/ gettext] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[http://www.gnu.org/software/gettext/manual/gettext.html manual] for&lt;br /&gt;
additional details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
If you are not using the configure script, you need to tell your&lt;br /&gt;
compiler to set two macros. The &amp;lt;tt&amp;gt;ENABLE_NLS&amp;lt;/tt&amp;gt; macro should be 1.&lt;br /&gt;
The &amp;lt;tt&amp;gt;LOCALEDIR&amp;lt;/tt&amp;gt; macro should point to a directory structure&lt;br /&gt;
&amp;lt;tt&amp;gt;xy/LC_MESSAGES/tmw.mo&amp;lt;/tt&amp;gt; you created. The &amp;lt;tt&amp;gt;tmw.mo&amp;lt;/tt&amp;gt; file&lt;br /&gt;
is obtained by running the &amp;lt;tt&amp;gt;msgfmt&amp;lt;/tt&amp;gt; tool.&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
When creating a translation for a not yet supported language, get the&lt;br /&gt;
identifier of your language, as defined by ISO 639. It is usually two&lt;br /&gt;
letter long. Let us suppose it is &#039;&#039;xy&#039;&#039;. Copy the &amp;lt;tt&amp;gt;po/tmw.pot&amp;lt;/tt&amp;gt;&lt;br /&gt;
to &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;, and add &amp;lt;tt&amp;gt;xy&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;po/LINGUAS&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. That is all.&lt;br /&gt;
&lt;br /&gt;
Now you can use your favorite text editor to modify the &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. There are also a few dedicated editors. For example, gtranslator in&lt;br /&gt;
Gnome and kbabel in KDE. The &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; format is simple: on one&lt;br /&gt;
&#039;&#039;msgid&#039;&#039; line, you read the original English sentence, on the next&lt;br /&gt;
&#039;&#039;msgstr&#039;&#039; line, you write your translation. The encoding of your file&lt;br /&gt;
should be UTF-8, as it is the internal format of the game, and we do not&lt;br /&gt;
want it to waste time on converting between different charsets.&lt;br /&gt;
&lt;br /&gt;
From time to time, modifications to the English strings will be merged&lt;br /&gt;
to your &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; file. When it happens, translate the new empty&lt;br /&gt;
entries, and modify the old entries marked as &#039;&#039;fuzzy&#039;&#039;. Then submit the&lt;br /&gt;
new file.&lt;br /&gt;
&lt;br /&gt;
Sentences containing percent characters (especially when preceded by the&lt;br /&gt;
&#039;&#039;c-format&#039;&#039; comment) need special care. They start special sequences that&lt;br /&gt;
ends with a letter. The game will replace them by words (&amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt;) or&lt;br /&gt;
numbers (&amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt;) or some other things. As a consequence, their order&lt;br /&gt;
need to be strictly respected in order not to crash the game. If&lt;br /&gt;
respecting the order makes it impossible to translate in your language,&lt;br /&gt;
you can use positional markers instead:&lt;br /&gt;
&lt;br /&gt;
  #, c-format&lt;br /&gt;
  msgid &amp;quot;%s owns %s in one language&amp;quot;&lt;br /&gt;
  msgstr &amp;quot;%2$s is owned by %1$s in another language&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
When you just needs the translation of a literal string (one given between&lt;br /&gt;
quotes), you can use the underscore macro.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(_(&amp;quot;For long swords, size does matter.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
If you are in a context where you cannot execute this macro, you can delay&lt;br /&gt;
the translation. Using a macro is still mandatory so that the strings can&lt;br /&gt;
automatically be extracted for translators.&lt;br /&gt;
&lt;br /&gt;
  static char const *msg = N_(&amp;quot;For long swords, size does matter.&amp;quot;);&lt;br /&gt;
  ...&lt;br /&gt;
  displayToUser(gettext(msg));&lt;br /&gt;
&lt;br /&gt;
A point has to be stressed: Using the &amp;lt;tt&amp;gt;_()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;N_()&amp;lt;/tt&amp;gt; macros on&lt;br /&gt;
anything else than a literal string, e.g. a variable or an expression, is&lt;br /&gt;
plain wrong.&lt;br /&gt;
&lt;br /&gt;
You should also avoid crafting sentences by concatenating words, as it makes&lt;br /&gt;
it impossible to translate.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(std::string(id1) + _(&amp;quot; owns &amp;quot;) + id2);  # bad&lt;br /&gt;
  displayToUser(strprintf(_(&amp;quot;%s owns %s&amp;quot;), id1, id2);   # good&lt;br /&gt;
&lt;br /&gt;
Log messages and messages for internal errors (e.g. not caused by the user)&lt;br /&gt;
should not be translated. They will usually be sent back as bug-reports,&lt;br /&gt;
and we want to understand them.&lt;br /&gt;
&lt;br /&gt;
Files containing translatable strings must have their name listed in&lt;br /&gt;
&amp;lt;tt&amp;gt;po/POTFILES.IN&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;br /&gt;
&lt;br /&gt;
As &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.pot&amp;lt;/tt&amp;gt; files indicate at which positions the&lt;br /&gt;
strings were extracted, adding or removing a single line to a source file&lt;br /&gt;
would be enough to completely modify all the files of the &amp;lt;tt&amp;gt;po&amp;lt;/tt&amp;gt;&lt;br /&gt;
directory. As a consequence, a developer should never update the&lt;br /&gt;
translations after modifying a source file, so as to not pollute the&lt;br /&gt;
svn repository.&lt;br /&gt;
&lt;br /&gt;
When preparing a release, during string freeze, one single developer (it&lt;br /&gt;
does not have to be always the same one, but it can help in case of&lt;br /&gt;
gettext version discrepancies) should be chosen to run&lt;br /&gt;
&lt;br /&gt;
  cd po ; make update-po&lt;br /&gt;
&lt;br /&gt;
and commit the resulting modifications. Then, just before releasing, once&lt;br /&gt;
translators have sent or committed their modifications to &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
files, it should be run again, so that packagers have access to updated&lt;br /&gt;
files.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7322</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7322"/>
		<updated>2007-08-07T06:54:20Z</updated>

		<summary type="html">&lt;p&gt;Silene: A few additional comments on gettext&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translations in The Mana World are handled by the&lt;br /&gt;
[http://www.gnu.org/software/gettext/ gettext] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[http://www.gnu.org/software/gettext/manual/gettext.html manual] for&lt;br /&gt;
additional details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
If you are not using the configure script, you need to tell your&lt;br /&gt;
compiler to set two macros. The &amp;lt;tt&amp;gt;ENABLE_NLS&amp;lt;/tt&amp;gt; macro should be 1.&lt;br /&gt;
The &amp;lt;tt&amp;gt;LOCALEDIR&amp;lt;/tt&amp;gt; macro should point to a directory structure&lt;br /&gt;
&amp;lt;tt&amp;gt;xy/LC_MESSAGES/tmw.mo&amp;lt;/tt&amp;gt; you created. The &amp;lt;tt&amp;gt;tmw.mo&amp;lt;/tt&amp;gt; file&lt;br /&gt;
is obtained by running the &amp;lt;tt&amp;gt;msgfmt&amp;lt;/tt&amp;gt; tool.&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
When creating a translation for a not yet supported language, get the&lt;br /&gt;
identifier of your language, as defined by ISO 639. It is usually two&lt;br /&gt;
letter long. Let us suppose it is &#039;&#039;xy&#039;&#039;. Copy the &amp;lt;tt&amp;gt;po/tmw.pot&amp;lt;/tt&amp;gt;&lt;br /&gt;
to &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;, and add &amp;lt;tt&amp;gt;xy&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;po/LINGUAS&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. That is all.&lt;br /&gt;
&lt;br /&gt;
Now you can use your favorite text editor to modify the &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. There are also a few dedicated editors. For example, gtranslator in&lt;br /&gt;
Gnome and kbabel in KDE. The &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; format is simple: on one&lt;br /&gt;
&#039;&#039;msgid&#039;&#039; line, you read the original English sentence, on the next&lt;br /&gt;
&#039;&#039;msgstr&#039;&#039; line, you write your translation. The encoding of your file&lt;br /&gt;
should be UTF-8, as it is the internal format of the game, and we do not&lt;br /&gt;
want it to waste time on converting between different charsets.&lt;br /&gt;
&lt;br /&gt;
From time to time, modifications to the English strings will be merged&lt;br /&gt;
to your &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; file. When it happens, translate the new empty&lt;br /&gt;
entries, and modify the old entries marked as &#039;&#039;fuzzy&#039;&#039;. Then submit the&lt;br /&gt;
new file.&lt;br /&gt;
&lt;br /&gt;
Sentences containing percent characters (especially when preceded by the&lt;br /&gt;
&#039;&#039;c-format&#039;&#039; comment) need special care. They start special sequences that&lt;br /&gt;
ends with a letter. The game will replace them by words (&amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt;) or&lt;br /&gt;
numbers (&amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt;) or some other things. As a consequence, their order&lt;br /&gt;
need to be strictly respected in order not to crash the game. If&lt;br /&gt;
respecting the order makes it impossible to translate in your language,&lt;br /&gt;
you can use positional markers instead:&lt;br /&gt;
&lt;br /&gt;
  #, c-format&lt;br /&gt;
  msgid &amp;quot;%s owns %s in one language&amp;quot;&lt;br /&gt;
  msgstr &amp;quot;%2$s is owned by %1$s in another language&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
When you just needs the translation of a literal string (one given between&lt;br /&gt;
quotes), you can use the underscore macro.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(_(&amp;quot;For long swords, size does matter.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
If you are in a context where you cannot execute this macro, you can delay&lt;br /&gt;
the translation. Using a macro is still mandatory so that the strings can&lt;br /&gt;
automatically be extracted for translators.&lt;br /&gt;
&lt;br /&gt;
  static char const *msg = N_(&amp;quot;For long swords, size does matter.&amp;quot;);&lt;br /&gt;
  ...&lt;br /&gt;
  displayToUser(gettext(msg));&lt;br /&gt;
&lt;br /&gt;
A point has to be stressed: Using the &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;N_&amp;lt;/tt&amp;gt; macros on&lt;br /&gt;
anything else than a literal string, e.g. a variable or an expression, is&lt;br /&gt;
plain wrong.&lt;br /&gt;
&lt;br /&gt;
You should also avoid crafting sentences by concatening words, as it makes&lt;br /&gt;
it impossible to translate.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(std::string(id1) + _(&amp;quot; owns &amp;quot;) + id2);  # bad&lt;br /&gt;
  displayToUser(strprintf(_(&amp;quot;%s owns %s&amp;quot;), id1, id2);   # good&lt;br /&gt;
&lt;br /&gt;
Log messages and messages for internal errors (e.g. not caused by the user)&lt;br /&gt;
should not be translated. They will usually be sent back as bug-reports,&lt;br /&gt;
and we want to understand them.&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;br /&gt;
&lt;br /&gt;
As &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.pot&amp;lt;/tt&amp;gt; files indicate at which positions the&lt;br /&gt;
strings were extracted, adding or removing a single line to a source file&lt;br /&gt;
would be enough to completely modify all the files of the &amp;lt;tt&amp;gt;po&amp;lt;/tt&amp;gt;&lt;br /&gt;
directory. As a consequence, a developer should never update the&lt;br /&gt;
translations after modifying a source file, so as to not pollute the&lt;br /&gt;
svn repository.&lt;br /&gt;
&lt;br /&gt;
When preparing a release, during string freeze, one single developer (it&lt;br /&gt;
does not have to be always the same one, but it can help in case of&lt;br /&gt;
gettext version discrepancies) should be chosen to run&lt;br /&gt;
&lt;br /&gt;
  cd po ; make update-po&lt;br /&gt;
&lt;br /&gt;
and commit the resulting modifications. Then, just before releasing, once&lt;br /&gt;
translators have sent or committed their modifications to &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
files, it should be run again, so that packagers have access to updated&lt;br /&gt;
files.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=7313</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Main_Page&amp;diff=7313"/>
		<updated>2007-08-06T12:51:43Z</updated>

		<summary type="html">&lt;p&gt;Silene: Added link to gettext documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| cellspacing=&amp;quot;3&amp;quot; cellpadding=&amp;quot;3&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:Tmw logo.png|100px]]&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: color: #000;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: color: #000;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #C58917; color: #000; background-color: #FFE87C&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
=== Top Priority Projects! ===&lt;br /&gt;
Please direct your primary attention to these pages:&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:[[Backstory]], [[Things to do]], [[Roadmap]], [[Assignments]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #E8A317; color: #000; background-color: #FFF380&amp;quot;|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
=== Important Projects ===&lt;br /&gt;
These pages are important, but not top priority. You should focus on these second:&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:[[Geography]], [[Concept art]], [[Monsterset development|Monsters]], [[Tileset development|Tilesets]], [[Creatures]], [[Action layers]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #e0c8b8; color: #000; background-color: #faeee6&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
== Project information ==&lt;br /&gt;
* [[Project description]]&lt;br /&gt;
* [[Screenshots]]&lt;br /&gt;
* [[Developers]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[System requirements]]&lt;br /&gt;
* [[Roadmap]]&lt;br /&gt;
* [[Ports]]&lt;br /&gt;
* [http://themanaworld.svn.sourceforge.net/viewvc/themanaworld/tmw/trunk/ChangeLog?view=markup ChangeLog from SVN trunk]&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
&lt;br /&gt;
* [[Getting started]]&lt;br /&gt;
* [[Dependencies]]&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;
* [[Config settings]]&lt;br /&gt;
&lt;br /&gt;
==== Organization ====&lt;br /&gt;
&lt;br /&gt;
* [[Suggestions]]&lt;br /&gt;
* [[Bugs]]&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;
|width=&amp;quot;50%&amp;quot; style=&amp;quot;border: 1px solid #c9c9ff; color: #000; background-color: #f3f3ff&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
=== In Progress ===&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;World:&#039;&#039;&#039; [[Backstory]], [[Geography]], [[Creatures]], [[Organizations]], [[Elements]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Game:&#039;&#039;&#039; [[Game systems]], [[Creature proposal]], [[Weapons]], [[Realtime action combat protocol|Realtime combat]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Graphics:&#039;&#039;&#039; [[Assignments]], [[Concept art]], [[Playerset development|Playersets]], [[Hairset development|Hairsets]], [[:Special:Newimages|New Images]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;GUI / Interface:&#039;&#039;&#039; [[GUI development]], [[Menu interface system]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Sound:&#039;&#039;&#039; [[SFX|SoundFX]], [[Music]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Server:&#039;&#039;&#039; [[Server development]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;RFCs:&#039;&#039;&#039; [[Rendering]], [[Action layers]], [[Improvement of the collision layer system|Collision system]], [[Being movement system|Movement system]], [[Logging]], [[Party system]]&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Game:&#039;&#039;&#039; [[Map development]], [[NPC development]], [[eAthena Scripting Standards]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Graphics:&#039;&#039;&#039; [[Guidelines]], [[Equipment development|Equipment sheets]], [[Tileset development|Tilesets]], [[Monsterset development|Monster sheets]], [[Particle engine]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;GUI / Interface:&#039;&#039;&#039; [[Keyboard usage]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;RFCs:&#039;&#039;&#039; [[Animations]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;General:&#039;&#039;&#039; [[Joining the project]], [[Making a new release]], [[Hacking]], [[Translations]]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Documentation:&#039;&#039;&#039; [http://themanaworld.org/tmwdox/ Client], [http://themanaworld.org/tmwservdox/ Server]&lt;br /&gt;
&lt;br /&gt;
=== Outdated ===&lt;br /&gt;
&lt;br /&gt;
:[[Important NPCs]], [[Finished NPCs]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__ __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7312</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7312"/>
		<updated>2007-08-06T12:49:59Z</updated>

		<summary type="html">&lt;p&gt;Silene: Added part about managing translations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translations in The Mana World are handled by the&lt;br /&gt;
[http://www.gnu.org/software/gettext/ gettext] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[http://www.gnu.org/software/gettext/manual/gettext.html manual] for&lt;br /&gt;
additional details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
When creating a translation for a not yet supported language, get the&lt;br /&gt;
identifier of your language, as defined by ISO 639. It is usually two&lt;br /&gt;
letter long. Let us suppose it is &#039;&#039;xy&#039;&#039;. Copy the &amp;lt;tt&amp;gt;po/tmw.pot&amp;lt;/tt&amp;gt;&lt;br /&gt;
to &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;, and add &amp;lt;tt&amp;gt;xy&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;po/LINGUAS&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. That is all.&lt;br /&gt;
&lt;br /&gt;
Now you can use your favorite text editor to modify the &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. There are also a few dedicated editors. For example, gtranslator in&lt;br /&gt;
Gnome and kbabel in KDE. The &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; format is simple: on one&lt;br /&gt;
&#039;&#039;msgid&#039;&#039; line, you read the original English sentence, on the next&lt;br /&gt;
&#039;&#039;msgstr&#039;&#039; line, you write your translation.&lt;br /&gt;
&lt;br /&gt;
From time to time, modifications to the English strings will be merged&lt;br /&gt;
to your &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; file. When it happens, translate the new empty&lt;br /&gt;
entries, and modify the old entries marked as &#039;&#039;fuzzy&#039;&#039;. Then submit the&lt;br /&gt;
new file.&lt;br /&gt;
&lt;br /&gt;
Sentences containing percent characters (especially when preceded by the&lt;br /&gt;
&#039;&#039;c-format&#039;&#039; comment) need special care. They start special sequences that&lt;br /&gt;
ends with a letter. The game will replace them by words (&amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt;) or&lt;br /&gt;
numbers (&amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt;) or some other things. As a consequence, their order&lt;br /&gt;
need to be strictly respected in order not to crash the game. If&lt;br /&gt;
respecting the order makes it impossible to translate in your language,&lt;br /&gt;
you can use positional markers instead:&lt;br /&gt;
&lt;br /&gt;
  #, c-format&lt;br /&gt;
  msgid &amp;quot;%s owns %s in one language&amp;quot;&lt;br /&gt;
  msgstr &amp;quot;%2$s is owned by %1$s in another language&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
When you just needs the translation of a literal string (one given between&lt;br /&gt;
quotes), you can use the underscore macro.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(_(&amp;quot;For long swords, size does matter.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
If you are in a context where you cannot execute this macro, you can delay&lt;br /&gt;
the translation. Using a macro is still mandatory so that the strings can&lt;br /&gt;
automatically be extracted for translators.&lt;br /&gt;
&lt;br /&gt;
  static char const *msg = N_(&amp;quot;For long swords, size does matter.&amp;quot;);&lt;br /&gt;
  ...&lt;br /&gt;
  displayToUser(gettext(msg));&lt;br /&gt;
&lt;br /&gt;
A point has to be stressed: Using the &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;N_&amp;lt;/tt&amp;gt; macros on&lt;br /&gt;
anything else than a literal string, e.g. a variable or an expression, is&lt;br /&gt;
plain wrong.&lt;br /&gt;
&lt;br /&gt;
You should also avoid crafting sentences by concatening words, as it makes&lt;br /&gt;
it impossible to translate.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(std::string(id1) + _(&amp;quot; owns &amp;quot;) + id2);  # bad&lt;br /&gt;
  displayToUser(strprintf(_(&amp;quot;%s owns %s&amp;quot;), id1, id2);   # good&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;br /&gt;
&lt;br /&gt;
As &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.pot&amp;lt;/tt&amp;gt; files indicate at which positions the&lt;br /&gt;
strings were extracted, adding or removing a single line to a source file&lt;br /&gt;
would be enough to completely modify all the files of the &amp;lt;tt&amp;gt;po&amp;lt;/tt&amp;gt;&lt;br /&gt;
directory. As a consequence, a developer should never update the&lt;br /&gt;
translations after modifying a source file, so as to not pollute the&lt;br /&gt;
svn repository.&lt;br /&gt;
&lt;br /&gt;
When preparing a release, during string freeze, one single developer (it&lt;br /&gt;
does not have to be always the same one, but it can help in case of&lt;br /&gt;
gettext version discrepancies) should be chosen to run&lt;br /&gt;
&lt;br /&gt;
  cd po ; make update-po&lt;br /&gt;
&lt;br /&gt;
and commit the resulting modifications. Then, just before releasing, once&lt;br /&gt;
translators have sent or committed their modifications to &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
files, it should be run again, so that packagers have access to updated&lt;br /&gt;
files.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7311</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7311"/>
		<updated>2007-08-06T10:29:28Z</updated>

		<summary type="html">&lt;p&gt;Silene: Added part for developers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translations in The Mana World are handled by the&lt;br /&gt;
[http://www.gnu.org/software/gettext/ gettext] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[http://www.gnu.org/software/gettext/manual/gettext.html manual] for&lt;br /&gt;
additional details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
When creating a translation for a not yet supported language, get the&lt;br /&gt;
identifier of your language, as defined by ISO 639. It is usually two&lt;br /&gt;
letter long. Let us suppose it is &#039;&#039;xy&#039;&#039;. Copy the &amp;lt;tt&amp;gt;po/tmw.pot&amp;lt;/tt&amp;gt;&lt;br /&gt;
to &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;, and add &amp;lt;tt&amp;gt;xy&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;po/LINGUAS&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. That is all.&lt;br /&gt;
&lt;br /&gt;
Now you can use your favorite text editor to modify the &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. There are also a few dedicated editors. For example, gtranslator in&lt;br /&gt;
Gnome and kbabel in KDE. The &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; format is simple: on one&lt;br /&gt;
&#039;&#039;msgid&#039;&#039; line, you read the original English sentence, on the next&lt;br /&gt;
&#039;&#039;msgstr&#039;&#039; line, you write your translation.&lt;br /&gt;
&lt;br /&gt;
From time to time, modifications to the English strings will be merged&lt;br /&gt;
to your &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; file. When it happens, translate the new empty&lt;br /&gt;
entries, and modify the old entries marked as &#039;&#039;fuzzy&#039;&#039;. Then submit the&lt;br /&gt;
new file.&lt;br /&gt;
&lt;br /&gt;
Sentences containing percent characters (especially when preceded by the&lt;br /&gt;
&#039;&#039;c-format&#039;&#039; comment) need special care. They start special sequences that&lt;br /&gt;
ends with a letter. The game will replace them by words (&amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt;) or&lt;br /&gt;
numbers (&amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt;) or some other things. As a consequence, their order&lt;br /&gt;
need to be strictly respected in order not to crash the game. If&lt;br /&gt;
respecting the order makes it impossible to translate in your language,&lt;br /&gt;
you can use positional markers instead:&lt;br /&gt;
&lt;br /&gt;
  #, c-format&lt;br /&gt;
  msgid &amp;quot;%s owns %s in one language&amp;quot;&lt;br /&gt;
  msgstr &amp;quot;%2$s is owned by %1$s in another language&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
When you just needs the translation of a literal string (one given between&lt;br /&gt;
quotes), you can use the underscore macro.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(_(&amp;quot;For long swords, size does matter.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
If you are in a context where you cannot execute this macro, you can delay&lt;br /&gt;
the translation. Using a macro is still mandatory so that the strings can&lt;br /&gt;
automatically be extracted for translators.&lt;br /&gt;
&lt;br /&gt;
  static char const *msg = N_(&amp;quot;For long swords, size does matter.&amp;quot;);&lt;br /&gt;
  ...&lt;br /&gt;
  displayToUser(gettext(msg));&lt;br /&gt;
&lt;br /&gt;
A point has to be stressed: Using the &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;N_&amp;lt;/tt&amp;gt; macros on&lt;br /&gt;
anything else than a literal string, e.g. a variable or an expression, is&lt;br /&gt;
plain wrong.&lt;br /&gt;
&lt;br /&gt;
You should also avoid crafting sentences by concatening words, as it makes&lt;br /&gt;
it impossible to translate.&lt;br /&gt;
&lt;br /&gt;
  displayToUser(std::string(id1) + _(&amp;quot; owns &amp;quot;) + id2);  # bad&lt;br /&gt;
  displayToUser(strprintf(_(&amp;quot;%s owns %s&amp;quot;), id1, id2);   # good&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7310</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7310"/>
		<updated>2007-08-06T09:54:02Z</updated>

		<summary type="html">&lt;p&gt;Silene: The part for translators&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translations in The Mana World are handled by the&lt;br /&gt;
[http://www.gnu.org/software/gettext/ gettext] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[http://www.gnu.org/software/gettext/manual/gettext.html manual] for&lt;br /&gt;
additional details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
When creating a translation for a not yet supported language, get the&lt;br /&gt;
identifier of your language, as defined by ISO 639. It is usually two&lt;br /&gt;
letter long. Let us suppose it is &#039;&#039;xy&#039;&#039;. Copy the &amp;lt;tt&amp;gt;po/tmw.pot&amp;lt;/tt&amp;gt;&lt;br /&gt;
to &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;, and add &amp;lt;tt&amp;gt;xy&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;po/LINGUAS&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. That is all.&lt;br /&gt;
&lt;br /&gt;
Now you can use your favorite text editor to modify the &amp;lt;tt&amp;gt;po/xy.po&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. There are also a few dedicated editors. For example, gtranslator in&lt;br /&gt;
Gnome and kbabel in KDE. The &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; format is simple: on one&lt;br /&gt;
&#039;&#039;msgid&#039;&#039; line, you read the original English sentence, on the next&lt;br /&gt;
&#039;&#039;msgstr&#039;&#039; line, you write your translation.&lt;br /&gt;
&lt;br /&gt;
From time to time, modifications to the English strings will be merged&lt;br /&gt;
to your &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; file. When it happens, translate the new empty&lt;br /&gt;
entries, and modify the old entries marked as &#039;&#039;fuzzy&#039;&#039;. Then submit the&lt;br /&gt;
new file.&lt;br /&gt;
&lt;br /&gt;
Sentences containing percent characters (especially when preceded by the&lt;br /&gt;
&#039;&#039;c-format&#039;&#039; comment) need special care. They start special sequences that&lt;br /&gt;
ends with a letter. The game will replace them by words (&amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt;) or&lt;br /&gt;
numbers (&amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt;) or some other things. As a consequence, their order&lt;br /&gt;
need to be strictly respected in order not to crash the game. If&lt;br /&gt;
respecting the order makes it impossible to translate in your language,&lt;br /&gt;
you can use positional markers instead:&lt;br /&gt;
&lt;br /&gt;
  #, c-format&lt;br /&gt;
  msgid &amp;quot;%s owns %s in one language&amp;quot;&lt;br /&gt;
  msgstr &amp;quot;%2$s is owned by %1$s in another language&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7309</id>
		<title>Archive:Translations</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Translations&amp;diff=7309"/>
		<updated>2007-08-06T09:06:34Z</updated>

		<summary type="html">&lt;p&gt;Silene: First part of a gettext-dedicated page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translations in The Mana World are handled by the&lt;br /&gt;
[[http://www.gnu.org/software/gettext/ gettext]] system. This page&lt;br /&gt;
presents an overwiew in the context of the game. Please refer to the&lt;br /&gt;
[[http://www.gnu.org/software/gettext/manual/gettext.html manual]] for&lt;br /&gt;
more details.&lt;br /&gt;
&lt;br /&gt;
== Gettext for users ==&lt;br /&gt;
&lt;br /&gt;
Translations are supposed to work out-of-the-box. If they are not,&lt;br /&gt;
complain to the maintainer of your binary package. This section is&lt;br /&gt;
dedicated to users compiling &amp;lt;tt&amp;gt;tmw&amp;lt;/tt&amp;gt; themselves.&lt;br /&gt;
&lt;br /&gt;
When configuring, the script should tell you that Native Language&lt;br /&gt;
Support (NLS) is enabled. It just requires the presence of gettext on&lt;br /&gt;
your computer. From there, just compile and install like you usually&lt;br /&gt;
do, and it should work just fine. You just need to have properly set up&lt;br /&gt;
your system with respect to locales. If console applications, e.g.&lt;br /&gt;
&amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;, are translated, then The Mana World will also be.&lt;br /&gt;
&lt;br /&gt;
Note that the &#039;&#039;install&#039;&#039; part is mandatory for gettext to work. You&lt;br /&gt;
cannot run the program from your compilation directory and expect it to&lt;br /&gt;
be translated. Here is a work around:&lt;br /&gt;
&lt;br /&gt;
  ./configure --localedir=$PWD/locale    # plus your special options&lt;br /&gt;
  make                                   # compile as usual&lt;br /&gt;
  cd po ; make install                   # whenever your .po file is modified&lt;br /&gt;
&lt;br /&gt;
== Gettext for translators ==&lt;br /&gt;
&lt;br /&gt;
== Gettext for developers ==&lt;br /&gt;
&lt;br /&gt;
== Gettext for translation manager ==&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Joining_the_project&amp;diff=7220</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=7220"/>
		<updated>2007-07-28T12:38:51Z</updated>

		<summary type="html">&lt;p&gt;Silene: &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. &lt;br /&gt;
&lt;br /&gt;
But keep in mind that we do have a quality standard and will not add game content that isn&#039;t good enough in the teams opinion. Also it might be good to ask what is needed and what is being worked on to make sure that you aren&#039;t wasting your 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. For the currently used eAthena client, check out &amp;lt;code&amp;gt;tmw/branches/0.0&amp;lt;/code&amp;gt;. For the new client/server combination, check out both &amp;lt;code&amp;gt;tmwserv/trunk&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tmw/trunk&amp;lt;/code&amp;gt;. See our [https://sourceforge.net/svn/?group_id=106790 Subversion project page] about how to do this. Try to browse the source to see if you can get a bit familiar with them.&lt;br /&gt;
&lt;br /&gt;
When you are searching for something you could do you should check our bug- and task tracking system on http://mantis.themanaworld.org. It lists a lot of small and large problems on many different areas. Just pick one that interests you.&lt;br /&gt;
&lt;br /&gt;
Your first contributions could be in the form of patches submitted to the SourceForge patches tracker or the developer mailing list. Please check the [[Hacking|hacking guidelines]] before writing your patches. If it turns out you like the project and you want to keep contributing for a long period, we&#039;ll consider giving you write access to subversion 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>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Combat_system&amp;diff=7126</id>
		<title>Archive:Combat system</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Combat_system&amp;diff=7126"/>
		<updated>2007-07-12T09:30:23Z</updated>

		<summary type="html">&lt;p&gt;Silene: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Category_gameconcept}}&lt;br /&gt;
{{Category_programming}}&lt;br /&gt;
{{Status_outdated}}&lt;br /&gt;
== &#039;&#039;&#039;Does it work?&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m convinced that the greater majority of the developers of TMW are looking for a free-form style of combat that set SoM apart from other RPGs of its class. This system requires skill and alertness on the part of the player, as well as preparedness and training on the part of the character in order for fights to succeed. It also engages the player in combat, by giving him total control over his character&#039;s actions.&lt;br /&gt;
&lt;br /&gt;
The real issue with a realtime combat system is feasibility and server traffic. Our theoretical server has about 1mbps upstream, so we have to make packets as small and infrequent as possible.&lt;br /&gt;
&lt;br /&gt;
When a player gives a command to the game, such as cast spell, move left, use potion, etc. A packet of data is sent to the server. The client can requlate actions so that no more than 1 can be performed every 500ms, so as to prevent high downstream server traffic. A player command packet contains 1 variable, a short integer which is the ID of the given command. A packet of this size takes approximately 2 bytes of space.&lt;br /&gt;
&lt;br /&gt;
The server takes this command and interprets it into character movement. When the servers clock cycle reaches a certain interval (250ms for example), it builds an update packet for each player. This update packet contains information on each Being &#039;&#039;&#039;within the player&#039;s viewpoint only&#039;&#039;&#039;- it&#039;s position(x,y) as well as the action that being is currently performing. The client recieves this data, then interprets it into a visual model. The size of a packet like this (containing 3 short intergers) is approximately 6 bytes per onscreen character.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Math Time:&#039;&#039;&#039;&lt;br /&gt;
In a heavy load area (50 characters), the update packet contains 300 bytes of data.&lt;br /&gt;
&lt;br /&gt;
We are able to send 1,048,576 bytes per second, or 262,144 per quarter second on our projected server limit. This equates to serving up to 873 high traffic area players per quarter-second without a flaw. If the number of players increases beyond the server&#039;s capacity, the server&#039;s response interval can be cut in half to accomidate twice as many high-traffic players. Needless to say, this packet rate and size is small enough to run easily on even the slowest modems.&lt;br /&gt;
&lt;br /&gt;
In a more common scenario, however, the player will only need about 10 active characters onscreen, which means 60 bytes per packet, or 4369 players supported by the server under this method, and all within the projected server limit (which means no lag, at least not serverside).&lt;br /&gt;
&lt;br /&gt;
:If this page gets rewritten, it should take into account a lot more things into its calculations. In particular, if you consider the IP+UDP+enet overhead and the seven monsters walking around a player on average, you have to add at the very least 100 bytes at each tick and for each player. So for the high traffic area example, you are down to 650 players. And for the more common scenario, you are down to 1600 players. And with the 100ms tick of the current tmwserv, you are down to 250 players and 650 players respectively. [[User:Silene|silene]] 11:30, 12 July 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
As you can see, this method is more than able to cope with realtime combat, and a player feels only a quarter of a second delay &#039;&#039;&#039;maximum&#039;&#039;&#039; before his command executes on his own screen and on everyone elses. That&#039;s an acceptable delay to trade for realtime combat.&lt;br /&gt;
&lt;br /&gt;
:This delay has to take into account the communications. Assuming 75ms communications and four ticks per second, you get 275ms on average and 400ms on maximum. With the current tmwserv, it is 200ms on average and 250ms on maximum. [[User:Silene|silene]] 11:30, 12 July 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== &#039;&#039;&#039;This is it&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
Ok, so here&#039;s the breakdown of the real time, active, directly controlled combat.&lt;br /&gt;
&lt;br /&gt;
Movement - players move when they send a command to move. There are two types of move command-initial movement and end movement. An initial movement packet tells the server to start moving the player until the end movement packet is recieved. This is sent when the key (or mouse click) is first pressed. The second is the end movement packet. The end movement packet tells the server to stop moving the character at a regular rate. This way, movement can be smooth and continuous, rather than pixel by pixel, like some have suggested it will end up.&lt;br /&gt;
&lt;br /&gt;
First off, players have a bar in the screen that measures time, since the last attack. When the player presses the attack key, and the bar is full, he makes an attack (there are no intermediate attacks, to reduce downstream server traffic).&lt;br /&gt;
&lt;br /&gt;
Charge attacks exist too. To execte a charge attack, the player can hold a button. when the button is pressed, the server gets a start message. When it is released, he sends another attack message. The server calculates the amount of time between the two packets, then executes the corresponding charge attack. There are 10 attacks for each weapon type, and they are learned at weapon skill levels that are multiples of 10. Also, to perform a charge attack, the player must be wielding a weapon of the correct type, and that weapon must be built with synthesis up to level X. (see the EquipmentSystem for more information on weapon synthesis). While charging, the player moves a bit slower than normal.&lt;br /&gt;
&lt;br /&gt;
When the player wishes to use a spell, he opens the context ring menu, (spacebar or right click with the mouse), selects the proper spell, then chooses the appropriate target within range (be it an area or a being). The player then goes through a short spellcasting animation, during which time he can be interrupted by a critical attack (10% or more of his HP in damage). After that, the spell is cast and executed. Spell casting is also regulated by the time bar, however, some spells may cause a freeze longer than normal after being cast. This depends on the specific spell, as well as the caster&#039;s magic level (higher mastery = lower freeze)&lt;br /&gt;
&lt;br /&gt;
While I personally believe the mouse is one of the great evils of computer gaming, some members of the team feel that it is a necessary evil to include in the system. For this purpose, I&#039;ve created a list of mouse controls and corresponding keyboard controls.&lt;br /&gt;
&lt;br /&gt;
 Move   - Hold the left mouse button in the general area of the screen you want to&lt;br /&gt;
          move. The character will follow the mouse to that point.&lt;br /&gt;
 Attack - a fast click near the player causes him to attack.&lt;br /&gt;
 Charge - holding the mouse directly over the character for a moment causes him to&lt;br /&gt;
          start charging. To move while charging, drag the mouse away from the&lt;br /&gt;
          player without letting go of the left button.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not totally sure about how the mouse controlled model will work, but we can edit it as needed to ensure that it engages players in the same way as keyboard control.&lt;br /&gt;
&lt;br /&gt;
On a final note, some have expressed concern with lag issues as associated with our current system. The main argument is that if a long lag hits, players will be at the whim of monsters without a chance to respond. However, since the client and server will be sending packets constantly back and forth (for movement, attack, or even when idle) it is easy to fix the system such that monsters cannot attack a player who has not sent an update packet in the last 2 seconds or so (remembering that monsters, like players, can only attack twice a second at best, and usually only once). This will avoid players having to worry about death simply because of lag.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:Silene&amp;diff=4745</id>
		<title>User:Silene</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:Silene&amp;diff=4745"/>
		<updated>2006-08-26T22:08:08Z</updated>

		<summary type="html">&lt;p&gt;Silene: A few details about myself&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am mainly a C++ programmer and I am working on an old Linux platform. I enjoy contributing to 2D free software games, going from one project to another depending on my mood.&lt;br /&gt;
&lt;br /&gt;
I heavily contributed to [http://www.wesnoth.org/ Battle for Wesnoth], till the first stable release (1.0) got out. I then worked on [http://www.freeciv.org/ Freeciv]. Nowadays, I am helping with the programming of the [http://www.themanaworld.org/ Mana World] own server. On the serious side, I am also one of the authors of a [http://www.boost.org/ Boost] library. My name can be found in the changelogs of several other projects, [http://gcc.gnu.org/ GCC] for example.&lt;br /&gt;
&lt;br /&gt;
In the real life, I am finishing a PhD thesis on formal certification of numerical applications. The [http://lipforge.ens-lyon.fr/www/gappa/ Gappa] tool resulted from this work; it was essential in designing the [http://lipforge.ens-lyon.fr/www/crlibm/ CRlibm] project. More details on myself can be found on my [http://perso.ens-lyon.fr/guillaume.melquiond/ homepage]. You can contact me at [mailto:guillaume.melquiond@gmail.com guillaume.melquiond@gmail.com] if you ever need to.&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Developers&amp;diff=4742</id>
		<title>Development:Developers</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Developers&amp;diff=4742"/>
		<updated>2006-08-26T21:25:04Z</updated>

		<summary type="html">&lt;p&gt;Silene: Going with my real name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Active ==&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; style=&amp;quot;border-bottom: 2px solid #efdead&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;150px&amp;quot; align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;200px&amp;quot; align=&amp;quot;left&amp;quot; | Occupation&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;150px&amp;quot; align=&amp;quot;left&amp;quot; | Location&lt;br /&gt;
&lt;br /&gt;
{{dev1| [[User:Bear|Bear]]                       | Scripter | USA}}&lt;br /&gt;
{{dev2| [[User:Bertram|Bertram]]                 | Programmer, Debian package maintainer | France}}&lt;br /&gt;
{{dev1| [[User:BjÃ¸rn|BjÃ¸rn Lindeijer]]           | Lead Programmer | The Netherlands}}&lt;br /&gt;
{{dev2| [[User:Crush|Crush]]                     | Pixel artist, mapper, programmer | Germany}}&lt;br /&gt;
{{dev1| [[User:deviexx|deviexx]]                 | Content manager | }}&lt;br /&gt;
{{dev2| [[User:Doener|Doener]]                   | Programmer | Germany}}&lt;br /&gt;
{{dev1| [[User:ElvenProgrammer|ElvenProgrammer]] | Project leader, programmer | Italy}}&lt;br /&gt;
{{dev2| [[User:Irukard|Irukard]]                 | Pixel artist | Poland}}&lt;br /&gt;
{{dev1| [[User:maci|maci]]                       | User support | Germany}}&lt;br /&gt;
{{dev2| [[User:hackgrid|Matt]]                   | Blabbering idiot | Germany}}&lt;br /&gt;
{{dev1| [[User:Modanung|Modanung]]               | Pixel artist, concept artist | The Netherlands}}&lt;br /&gt;
{{dev2| [[User:Nym|nym]]                         | Programmer | Australia}}&lt;br /&gt;
{{dev1| [[User:Pajarico|Pajarico]]               | Art, writer | Spain}}&lt;br /&gt;
{{dev2| [[User:Pauan|Pauan]]                     | Graphics artist | USA}}&lt;br /&gt;
{{dev1| [[User:Platyna|Platyna]]                 | Slackware package maintainer | Poland}}&lt;br /&gt;
{{dev2| [[User:Rotonen|Rotonen]]                 | Head of art, story and music | Finland}}&lt;br /&gt;
{{dev1| [[User:Silene|Guillaume Melquiond (Silene)]] | Programmer | France}}&lt;br /&gt;
{{dev2| [[User:Talaroc|Talaroc]]                 | Pixel artist | }}&lt;br /&gt;
{{dev1| [[User:Tuxtgz|Tuxtgz]]                   | Webinterface-Programmer|Germany}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired ==&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; style=&amp;quot;border-bottom: 2px solid #efdead&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;75px&amp;quot; align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;200px&amp;quot; align=&amp;quot;left&amp;quot; | Occupation&lt;br /&gt;
! style=&amp;quot;background:#efdead;&amp;quot; width=&amp;quot;200px&amp;quot; align=&amp;quot;left&amp;quot; | Location&lt;br /&gt;
&lt;br /&gt;
{{dev1| [[User:Gagaofdeath|Andrej Sinicyn]]      | Programmer | Germany}}&lt;br /&gt;
{{dev2| [[User:Catfish_Man|Catfish_Man]]         | Mac port | USA}}&lt;br /&gt;
{{dev1| [[User:Clef|Clef]]                       | Pixel artist | }}&lt;br /&gt;
{{dev2| [[User:Demon|Demon]]                     | Pixel artist | }}&lt;br /&gt;
{{dev1| [[User:Golgo|Golgo]]                     | Pixel artist | }}&lt;br /&gt;
{{dev2| [[User:Javila|Javila]]                   | Programmer | Brazil}}&lt;br /&gt;
{{dev1| [[User:kindjal|kindjal]]                 | Programmer | France, currently Italy}}&lt;br /&gt;
{{dev2| [[User:Kinetic|Kinetic]]                 | Pixel artist | USA}}&lt;br /&gt;
{{dev1| [[User:Kyokai|Kyokai]]                   | Game systems designer | }}&lt;br /&gt;
{{dev2| [[User:Maester Pixel|Maester Pixel]]     | Pixel artist | USA}}&lt;br /&gt;
{{dev1| [[User:Magick|Magick]]                   | Musician | }}&lt;br /&gt;
{{dev2| [[User:Mkael|Mkael]]                     | Concept artist | Finland}}&lt;br /&gt;
{{dev1| [[User:Mra|Mra]]                         | Programmer | Germany}}&lt;br /&gt;
{{dev2| [[User:Neko-mon|Neko-mon]]               | Pixel artist | Brazil}}&lt;br /&gt;
{{dev1| [[User:Sora|Sora]]                       | Pixel artist | Poland}}&lt;br /&gt;
{{dev2| [[User:Sull|Sull]]                       | Pixel artist | Canada}}&lt;br /&gt;
{{dev1| [[User:Usiu|Usiu]]                       | Programmer | Poland}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:ManaWorldMap.jpg&amp;diff=4740</id>
		<title>File talk:ManaWorldMap.jpg</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=File_talk:ManaWorldMap.jpg&amp;diff=4740"/>
		<updated>2006-08-26T20:12:50Z</updated>

		<summary type="html">&lt;p&gt;Silene: Comments on the Manaworld map&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have several concerns about this map. The biggest is the river system. Fact: water flows from mountain sources to the sea by following the strongest slope. As a consequence,&lt;br /&gt;
* Rivers don&#039;t go from the sea to the sea.&lt;br /&gt;
* Rivers do not run alongside the coasts.&lt;br /&gt;
* Deltas exist only when the ground is really flat.&lt;br /&gt;
* Water does not flow out of a lake by the same point it flows in it.&lt;br /&gt;
On the positive side, I find that the land masses are well balanced.&lt;br /&gt;
--[[User:Silene|silene]] 22:12, 26 August 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Communication_protocol&amp;diff=4674</id>
		<title>Archive:Communication protocol</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Communication_protocol&amp;diff=4674"/>
		<updated>2006-08-14T21:00:34Z</updated>

		<summary type="html">&lt;p&gt;Silene: Added connect messages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here be documented our own communication protocol. For the latest list of all messages and their contents, see [http://svn.sourceforge.net/viewcvs.cgi/themanaworld/tmwserv/trunk/src/defines.h?view=markup defines.h].&lt;br /&gt;
&lt;br /&gt;
== Server structure ==&lt;br /&gt;
&lt;br /&gt;
When we talk about the server, we mean the combination of several services that will run in parallel. The &#039;&#039;account server&#039;&#039; handles player accounts and their characters. The &#039;&#039;game server&#039;&#039; handles the maps, beings and items. Finally the &#039;&#039;chat server&#039;&#039; handles chat channels. In order to eventually balance the load on processing and bandwidth, and also to be prepared for hardware failures, we envision the possibility to run multiple of the same server.&lt;br /&gt;
&lt;br /&gt;
== Login sequence ==&lt;br /&gt;
&lt;br /&gt;
The client starts with connecting to the account server. This server allows the client to register or login, to manage the characters in an account and to select a character to play.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1a. PAMSG_REGISTER { L version, &amp;quot;username&amp;quot;, &amp;quot;password&amp;quot;, &amp;quot;email&amp;quot; }&lt;br /&gt;
    APMSG_REGISTER_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
1b. PAMSG_LOGIN { L version, &amp;quot;username&amp;quot;, &amp;quot;password&amp;quot; }&lt;br /&gt;
    APMSG_LOGIN_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
    (for each char)&lt;br /&gt;
    APMSG_CHAR_INFO { B slot, S name, B gender, B hair style, B hair color,&lt;br /&gt;
                      B level, W money, W*6 stats }&lt;br /&gt;
&lt;br /&gt;
2a. PAMSG_UNREGISTER { }&lt;br /&gt;
    APMSG_UNREGISTER_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
2b. PAMSG_LOGOUT { }&lt;br /&gt;
    APMSG_LOGOUT_RESPONSE { 0 }&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
2c. PAMSG_CHAR_SELECT { index }&lt;br /&gt;
    APMSG_CHAR_SELECT_RESPONSE { 0, token, &amp;quot;gameserver&amp;quot;, W port, &amp;quot;chatserver&amp;quot;, W port }&lt;br /&gt;
    PGMSG_CONNECT { token }&lt;br /&gt;
    GPMSG_CONNECT_RESPONSE { 0 }&lt;br /&gt;
    PCMSG_CONNECT { token }&lt;br /&gt;
    CPMSG_CONNECT_RESPONSE { 0 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Movement and combat ==&lt;br /&gt;
&lt;br /&gt;
Protocol in development, see article about the [[being movement system]].&lt;br /&gt;
&lt;br /&gt;
=== Switching maps ===&lt;br /&gt;
&lt;br /&gt;
While walking around the player will come upon locations that bring him to other maps. It is possible that the new map is hosted on another game server. Since the game servers are not connected to each other, they will ask the account server for the details of the other server and for a magic token. This information will then be sent to the client along with the map change message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1a. (if the map is not on the same map server)&lt;br /&gt;
    GAMSG_PLAYER_MAP_CHANGE { newmap }&lt;br /&gt;
    AGMSG_PLAYER_MAP_CHANGE_REPONSE { 0, token, &amp;quot;gameserver&amp;quot;, W port }&lt;br /&gt;
&lt;br /&gt;
    GPMSG_PLAYER_MAP_CHANGE { &amp;quot;mapname&amp;quot;, x, y, B new server [, token, &amp;quot;gameserver&amp;quot;, W port] }&lt;br /&gt;
&lt;br /&gt;
    (if the map is not on the same map server)&lt;br /&gt;
    PGMSG_CONNECT { token }&lt;br /&gt;
    GPMSG_CONNECT_RESPONSE { 0 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chatting ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1a. PCMSG_CHAT { &amp;quot;message&amp;quot;, channel }&lt;br /&gt;
1b. PCMSG_ANNOUNCE { &amp;quot;annoucement&amp;quot; }&lt;br /&gt;
1c. PCMSG_PRIVMSG { &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
2a. CPMSG_ERROR { error }&lt;br /&gt;
2b. CPMSG_ANNOUNCEMENT { &amp;quot;annoucement&amp;quot; }&lt;br /&gt;
2c. CPMSG_PRIVMSG { &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
2d. CPMSG_PUBMSG { channel, &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Maybe it would be nicer to have the annoucements simply occur on a special dedicated channel. This would make implementation easier. Also, I think it&#039;s fine to also send a username for these messages.&#039;&#039; --[[User:BjÃ¸rn|BjÃ¸rn]] 12:44, 26 July 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Communication_protocol&amp;diff=4534</id>
		<title>Archive:Communication protocol</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Archive:Communication_protocol&amp;diff=4534"/>
		<updated>2006-07-26T18:44:05Z</updated>

		<summary type="html">&lt;p&gt;Silene: Fixing discrepancies between the code and the wiki (and hence deprecating a note)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here be documented our own communication protocol. For the latest list of all messages and their contents, see [http://svn.sourceforge.net/viewcvs.cgi/themanaworld/tmwserv/trunk/src/defines.h?view=markup defines.h].&lt;br /&gt;
&lt;br /&gt;
== Login sequence ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1a. PAMSG_REGISTER { &amp;quot;version&amp;quot;, &amp;quot;username&amp;quot;, &amp;quot;password&amp;quot;, &amp;quot;email&amp;quot; }&lt;br /&gt;
    APMSG_REGISTER_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
1b. PAMSG_LOGIN { &amp;quot;version&amp;quot;, &amp;quot;username&amp;quot;, &amp;quot;password&amp;quot; }&lt;br /&gt;
    APMSG_UNREGISTER_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
2a. PAMSG_UNREGISTER { }&lt;br /&gt;
    APMSG_UNREGISTER_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
2b. PAMSG_LOGOUT { }&lt;br /&gt;
    APMSG_LOGOUT_RESPONSE { 0 }&lt;br /&gt;
&lt;br /&gt;
2c. PAMSG_CHAR_LIST { }&lt;br /&gt;
    APMSG_CHAR_LIST_RESPONSE B number, { B index, S name, B gender, B hair style, B hair color,&lt;br /&gt;
                                         B level, W money, W*6 stats, S mapname, W*2 position }&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;It has been decided that a separate request for the character list is not necessary. The list will be sent automatically after a succesful login.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We probably do not need the index byte for each character. The list can be assumed to be contiguous and characters can be referred to with the index they have in the list.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Why is the version a string? It&#039;s only for checking compatibility, right?&#039;&#039; --[[User:BjÃ¸rn|BjÃ¸rn]] 12:47, 26 July 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Movement and combat ==&lt;br /&gt;
&lt;br /&gt;
Protocol in development, see article about the [[being movement system]].&lt;br /&gt;
&lt;br /&gt;
== Chatting ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1a. PCMSG_CHAT { &amp;quot;message&amp;quot;, channel }&lt;br /&gt;
1b. PCMSG_ANNOUNCE { &amp;quot;annoucement&amp;quot; }&lt;br /&gt;
1c. PCMSG_PRIVMSG { &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
2a. CPMSG_ERROR { error }&lt;br /&gt;
2b. CPMSG_ANNOUNCEMENT { &amp;quot;annoucement&amp;quot; }&lt;br /&gt;
2c. CPMSG_PRIVMSG { &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
2d. CPMSG_PUBMSG { channel, &amp;quot;username&amp;quot;, &amp;quot;message&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Maybe it would be nicer to have the annoucements and errors simply occur or special dedicated channels. This would make implementation easier. Also, I think it&#039;s fine to also send a username for these messages.&#039;&#039; --[[User:BjÃ¸rn|BjÃ¸rn]] 12:44, 26 July 2006 (CEST)&lt;/div&gt;</summary>
		<author><name>Silene</name></author>
	</entry>
</feed>