<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dave</id>
	<title>The Battle for Wesnoth Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wesnoth.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dave"/>
	<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/Special:Contributions/Dave"/>
	<updated>2026-04-09T12:59:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Content_Server2011&amp;diff=40444</id>
		<title>SoC Ideas Content Server2011</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Content_Server2011&amp;diff=40444"/>
		<updated>2011-03-04T23:40:21Z</updated>

		<summary type="html">&lt;p&gt;Dave: Created page with '= Submitted proposals: =  {{#dpl:  |resultsheader=''There are %PAGES% submitted student proposals for this idea''  |oneresultheader=''There is 1 submitted student proposal for th…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Submitted proposals: =&lt;br /&gt;
&lt;br /&gt;
{{#dpl:&lt;br /&gt;
 |resultsheader=''There are %PAGES% submitted student proposals for this idea''&lt;br /&gt;
 |oneresultheader=''There is 1 submitted student proposal for this idea''&lt;br /&gt;
 |suppresserrors=true&lt;br /&gt;
 |noresultsheader=''There are no submitted student proposals for this idea''&lt;br /&gt;
 |category=Summer of Code 2011 Student Page&amp;amp;SoC Ideas IDEA NAME&lt;br /&gt;
 |notcategory=SoC 2011 Not Submitted To Google&lt;br /&gt;
 |include=#Description&lt;br /&gt;
 |mode=userformat&lt;br /&gt;
 |format=,,&amp;lt;br/&amp;gt;See [[%PAGE%|%TITLE%]] for more information.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Description=&lt;br /&gt;
&amp;lt;h2&amp;gt;Content Server Improvements&amp;lt;/h2&amp;gt;&lt;br /&gt;
The Wesnoth Content Server could be improved in a number of ways:&lt;br /&gt;
&lt;br /&gt;
 - Add a system for users to rate content and allow others to view the ratings; this rating system should be sophisticated enough to avoid being easily gamed.&lt;br /&gt;
 - Add a system to see richer details about content, showing screenshots, more descriptions, etc.&lt;br /&gt;
 - Allow users to write reviews of content.&lt;br /&gt;
 - Allow content to be flagged as inappropriate.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=UsingGooglePerformanceTools&amp;diff=40289</id>
		<title>UsingGooglePerformanceTools</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=UsingGooglePerformanceTools&amp;diff=40289"/>
		<updated>2011-02-06T14:04:09Z</updated>

		<summary type="html">&lt;p&gt;Dave: Created page with 'The Google performance tools are recommended for profiling Wesnoth's CPU and memory usage, especially on Linux.  [http://goog-perftools.sourceforge.net/doc/cpu_profiler.html] [ht…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Google performance tools are recommended for profiling Wesnoth's CPU and memory usage, especially on Linux.&lt;br /&gt;
&lt;br /&gt;
[http://goog-perftools.sourceforge.net/doc/cpu_profiler.html]&lt;br /&gt;
[http://goog-perftools.sourceforge.net/doc/heap_profiler.html]&lt;br /&gt;
&lt;br /&gt;
These performance tools are now shipped with Debian GNU/Linux and many other Linux-based systems.&lt;br /&gt;
&lt;br /&gt;
Wesnoth has been tested successfully using LD_PRELOAD to load the libraries in. Thus on Linux if you just want to profile a run of Wesnoth all you have to do is have the Google performance tools on your system and use something like this before running Wesnoth:&lt;br /&gt;
&lt;br /&gt;
export LD_PRELOAD=/path/to/libprofiler.so&lt;br /&gt;
export CPUPROFILE=./cpu-profile.dat&lt;br /&gt;
&lt;br /&gt;
To profile the CPU, or,&lt;br /&gt;
&lt;br /&gt;
export LD_PRELOAD=/path/to/libtcmalloc.so&lt;br /&gt;
export HEAPPROFILE=./heap-profile.dat&lt;br /&gt;
&lt;br /&gt;
To profile memory usage.&lt;br /&gt;
&lt;br /&gt;
Then run Wesnoth, exit it cleanly, and you should have a cpu-profile.dat or heap-profile.dat file. The memory profile actually dumps out profile files periodically as it runs.&lt;br /&gt;
&lt;br /&gt;
Then use,&lt;br /&gt;
&lt;br /&gt;
pprof /path/to/wesnoth/binary ./cpu-profile.dat&lt;br /&gt;
&lt;br /&gt;
To read a profile file. There are a number of commands you can run, but suggested is 'gv' to get graphical output.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DevelopersHome&amp;diff=40288</id>
		<title>DevelopersHome</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DevelopersHome&amp;diff=40288"/>
		<updated>2011-02-06T13:58:44Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Tools and Packaging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General Information =&lt;br /&gt;
* Links&lt;br /&gt;
** [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
** [http://cia.vc/stats/project/wesnoth Latest commits] - Up-to-date commit messages&lt;br /&gt;
&lt;br /&gt;
* Coding Guidelines&lt;br /&gt;
** [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
** [[CodingStandards]] - for programmers&lt;br /&gt;
** [[DeveloperGuide]] - for those who received SVN commit rights&lt;br /&gt;
&lt;br /&gt;
* Library documentation&lt;br /&gt;
** http://www.sgi.com/tech/stl/ - Standard Template Library&lt;br /&gt;
&lt;br /&gt;
= Tools and Packaging =&lt;br /&gt;
* Supporting Websites&lt;br /&gt;
** [[WesnothSVN]] - accessing the source code&lt;br /&gt;
** http://websvn.wesnoth.org/ Web-Access to svn - Gna! - websvn - &lt;br /&gt;
** http://gettext.wesnoth.org/ - gettext status&lt;br /&gt;
* Compiling and Building&lt;br /&gt;
** [[CompilingWesnoth]] - how to compile Battle for Wesnoth (it's not hard)&lt;br /&gt;
** [[SCons]]&lt;br /&gt;
** [[UsingAutotools]]&lt;br /&gt;
* Packaging and Releasing&lt;br /&gt;
** [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
** [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* Documentation&lt;br /&gt;
** [[Doxygen]] - Documentation generator&lt;br /&gt;
* More stuff&lt;br /&gt;
** [[ExternalUtilities]] (Wercator, CampGen, wmllint, etc.)&lt;br /&gt;
** [[MaintenanceTools]] WMLLint, WMLIndent and WMLScope&lt;br /&gt;
** [[UsingGooglePerformanceTools]] to profile Wesnoth CPU and memory usage.&lt;br /&gt;
&lt;br /&gt;
= I want to start coding, what can I do? =&lt;br /&gt;
* [[EasyCoding]] - Bugs and features that are easy to implement for new coders&lt;br /&gt;
* [[NotSoEasyCoding]] - Bugs and features which are doable but lacking someone working on them&lt;br /&gt;
* [[GettingStarted]]&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - summary of past often-repeated forum discussions&lt;br /&gt;
* [[Wesnoth_Acronyms_and_Slang]]&lt;br /&gt;
&lt;br /&gt;
= Game - Create content =&lt;br /&gt;
* [[BuildingScenarios]] and related useful forum discussions: &lt;br /&gt;
** [http://www.wesnoth.org/forum/viewtopic.php?t=4188 Beginning Campaign Development]&lt;br /&gt;
** [http://www.wesnoth.org/forum/viewtopic.php?t=4301 A Balancing Act]&lt;br /&gt;
* [[ReferenceWML]]&lt;br /&gt;
&lt;br /&gt;
= Code documentation =&lt;br /&gt;
* http://devdocs.wesnoth.org - generated code documentation&lt;br /&gt;
* AI&lt;br /&gt;
** [[AI_Module]] - guide to AI module (src/ai)&lt;br /&gt;
** [[FormulaAI]] - Guide to the experimental formula AI branch&lt;br /&gt;
* Themes&lt;br /&gt;
** [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* Multiplayer&lt;br /&gt;
** [[WesnothdDesign]] - Guide to the design of wesnothd, the multiplayer server.&lt;br /&gt;
* Gui2 - The new Gui-Framework&lt;br /&gt;
** [[GUIToolkit]]&lt;br /&gt;
** [[GUILayout]]&lt;br /&gt;
** [[GUIVariable]]&lt;br /&gt;
** Gui2 WML&lt;br /&gt;
*** [[GUICanvasWML]]&lt;br /&gt;
*** [[GUIToolkitWML]]&lt;br /&gt;
*** [[GUIWidgetDefinitionWML]]&lt;br /&gt;
*** [[GUIWidgetInstanceWML]]&lt;br /&gt;
*** [[GUIWindowDefinitionWML]]&lt;br /&gt;
* Savegames&lt;br /&gt;
** [[SavegameClassHierarchy]]&lt;br /&gt;
&lt;br /&gt;
= Communication, Feedback, Events =&lt;br /&gt;
* Gna! links&lt;br /&gt;
** http://bugs.wesnoth.org/ - Gna! - bugs and feature requests&lt;br /&gt;
** http://patches.wesnoth.org/ - Gna! - patches&lt;br /&gt;
&lt;br /&gt;
* Mailing lists&lt;br /&gt;
** https://mail.gna.org/listinfo/wesnoth-dev/ - wesnoth-dev&lt;br /&gt;
** https://mail.gna.org/listinfo/wesnoth-commits/ - wesnoth-commits&lt;br /&gt;
&lt;br /&gt;
* IRC&lt;br /&gt;
** [irc://irc.wesnoth.org/#wesnoth-dev freenode/#wesnoth-dev] - IRC (alias to irc.freenode.net)&lt;br /&gt;
** http://irclog.wesnoth.org/ - IRC logs&lt;br /&gt;
&lt;br /&gt;
* Forum - http://forum.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
* This wiki - http://www.wesnoth.org/wiki/Main_Page &lt;br /&gt;
&lt;br /&gt;
* FOSDEM&lt;br /&gt;
** [[Fosdem2008]]&lt;br /&gt;
** [[Fosdem2009]]&lt;br /&gt;
&lt;br /&gt;
* Google Summer of Code&lt;br /&gt;
** [[SummerOfCodeIdeas]] - Ideas for GSoC&lt;br /&gt;
** [[SoC_Information_for_Google]] - Our organization profile for Google&lt;br /&gt;
** [[SoC_People_to_bug_on_IRC]] - Who GSoC students can ask for help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous =&lt;br /&gt;
* [[DebugMode]] and [[CommandMode]] - in game debugging commands&lt;br /&gt;
* [http://www.wesnoth.org/units/trunk/animations.html Missing unit animations] - what's available and what's missing&lt;br /&gt;
* http://units.wesnoth.org/ - Unit reference&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_WML_Debugging&amp;diff=34827</id>
		<title>SoC Ideas WML Debugging</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_WML_Debugging&amp;diff=34827"/>
		<updated>2010-03-24T19:35:42Z</updated>

		<summary type="html">&lt;p&gt;Dave: Created page with '{{SoC2010Idea}}  = SoC Ideas: WML Debugging Support =  == Background ==  Wesnoth Markup Language (WML) is used to create most kinds of Wesnoth content: campaigns, scenarios, and …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SoC2010Idea}}&lt;br /&gt;
&lt;br /&gt;
= SoC Ideas: WML Debugging Support =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth Markup Language (WML) is used to create most kinds of Wesnoth content: campaigns, scenarios, and so forth. WML is a fairly powerful language, but its debugging features often make it difficult to debug. Incorrect WML typically results in cryptic error messages or unusual and difficult to understand misbehavior.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
&lt;br /&gt;
There are several possible steps in improving WML:&lt;br /&gt;
&lt;br /&gt;
- ensuring that any WML error results in an accurate line number for the error being displayed. This will require modifying the WML pre-processing system to properly map all expanded macros to their original lines. &lt;br /&gt;
- improving the quality of error messages: trying to map unterminated strings and tags back to their starting positions.&lt;br /&gt;
- schema system: a WML schema system would be developed which would enable WML documents to be validated to make sure they have correct attribute names with values that are formatted correctly.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Multiplayer_server&amp;diff=29282</id>
		<title>SoC Ideas Multiplayer server</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Multiplayer_server&amp;diff=29282"/>
		<updated>2009-03-25T18:41:34Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Required knowledge and talent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
Our multiplayer community is generally strong and healthy, but we believe its growth is limited by some problems in the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
==== General Description ====&lt;br /&gt;
The general idea of this project would be&lt;br /&gt;
* To study the current lobby,&lt;br /&gt;
* To develop ideas about how our multiplayer interface could evolve to allow it to scale to a much larger community&lt;br /&gt;
* And to implement as many of those changes as practical&lt;br /&gt;
&lt;br /&gt;
Some ideas that we had (but that are in no way mandatory):&lt;br /&gt;
* Having a simple room system? Again, inspired by IRC&lt;br /&gt;
* Having some way to find the type of games you are interested in. filtering by:&lt;br /&gt;
** game type&lt;br /&gt;
** number of free slots/players&lt;br /&gt;
** any other criteria you might find interesting&lt;br /&gt;
&lt;br /&gt;
Other ideas we are not yet convinced are good, but that are certainly worth studying (especially how the communities based around these concepts are different from ours)&lt;br /&gt;
* ranking players&lt;br /&gt;
* guilds&lt;br /&gt;
* official tournaments&lt;br /&gt;
* titles for players&lt;br /&gt;
* metaservers&lt;br /&gt;
* game matching when players are ranked (poker, bridge...)&lt;br /&gt;
&lt;br /&gt;
The scalability of the design (both in term of number of players, and in term of the possibility for players and developers to extend the concept) will be an important criterion.&lt;br /&gt;
&lt;br /&gt;
Administration/moderation problems and techniques should also be studied.&lt;br /&gt;
&lt;br /&gt;
Interaction with the Add-On server/forum should be explored.&lt;br /&gt;
&lt;br /&gt;
An additional feature that could be considered is more secure random number generation to prevent cheating. At the moment, random numbers are generated on the client side. Things could be changed&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* A fair amount of experience with C++ is required. Wesnoth uses some advanced C++ features and is heavily based on BOOST and STL. We can train you in some of the libraries used, but learning all of them would be a big hurdle.&lt;br /&gt;
* Experience with multiplayer games, in order to have a good idea of what multiplayer lobbies of other game look like, and (more importantly) a good idea of the social behaviours of multiple MP communities, how teams are formed in games and things like that.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
* A first milestone would be a presentation summarizing the different studies, and the proposed interface. preliminary informal stages would probably be desirable, to make sure the proposed idea is already a consensus within devs &lt;br /&gt;
** Study of other MP game-matching interfaces and functionalities&lt;br /&gt;
** Study of other MP communities&lt;br /&gt;
** Study of other MP moderation practices&lt;br /&gt;
** Study of the Wesnoth MP community, including needs, various opinions from different developers and players&lt;br /&gt;
* A second milestone would be the main code delivery. Code should be functional for it will be delivered in the next Wesnoth development release&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [[SummerOfCodeIdeas|Summer of Code Ideas]] - The root where all information regarding SoC is (or better should be) linked from.&lt;br /&gt;
* [[http://www.wesnoth.org/wiki/EasyCoding#GUI2_related_features]] Easy coding tasks regarding the GUI.&lt;br /&gt;
* [[http://wesnoth.org/wiki/GUIToolkit]] Main entry point for the new GUI.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=29210</id>
		<title>SoC Ideas Stats Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=29210"/>
		<updated>2009-03-24T18:19:25Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database available at this time, at [stats.wesnoth.org]&lt;br /&gt;
&lt;br /&gt;
This project would involve writing a stats reporting web site which would take the data from the MySQL database and produce reports in chart and table form. Campaign designers would be able to use these reports to gather feedback on their campaigns and get ideas for improvements.&lt;br /&gt;
&lt;br /&gt;
A student could largely make their choice of infrastructure for creating the Website -- whether they prefer Python, Perl, Ruby, PHP, etc. This is a great opportunity for someone who doesn't want to dive into hardcore C++ to make a valuable contribution to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
It maybe worth while to track stats from multiplayer games. It could provide useful insights. There are some major difficulties because Wesnoth does not record the outcome of multi-player games.&lt;br /&gt;
&lt;br /&gt;
== Database Details ==&lt;br /&gt;
&lt;br /&gt;
The MySQL database is created with these commands:&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE GAMES (game_id INT NOT NULL AUTO_INCREMENT, timestamp DATETIME NOT NULL, user_id CHAR (14) NOT NULL, serial CHAR (18) NOT NULL, platform CHAR(8), version CHAR (14), campaign CHAR(40), difficulty CHAR(20), gold INT, turns INT, scenario CHAR (40), start_turn INT, time INT, result ENUM ('victory', 'defeat', 'quit'), end_time INT, end_gold INT, end_turn INT, PRIMARY KEY (game_id));&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE SPECIAL_UNITS (game_id INT, name CHAR (40), level INT, experience INT, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE UNITS (game_id INT NOT NULL, level INT NOT NULL, type CHAR (30), count INT NOT NULL, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE)&lt;br /&gt;
&lt;br /&gt;
There is a page dumping a sample of data from each table in the database here: [[http://www.wesnoth.org/cgi-bin/stats/dump.pl]]&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
There is an example of a website which queries from the stats database here: [[http://www.wesnoth.org/cgi-bin/stats/usage-1.6.pl]] -- this website reports the number of Wesnoth scenarios that have been completed, each day since the release of Wesnoth 1.6.&lt;br /&gt;
&lt;br /&gt;
It is an interesting statistic, but what we want is a generic framework for building lots of different, interesting reports. For instance, someone might want to see how many people who use Windows have played, or how many people have been defeated in scenarios, or how many people have played a specific campaign. There are many possibilities, and we'd like a very user friendly framework which allows displaying many different interesting reports.&lt;br /&gt;
&lt;br /&gt;
== Aggregation ==&lt;br /&gt;
&lt;br /&gt;
An additional problem is that the framework can't afford to do a full table scan for every single query. That will just grow too expensive, especially as our database grows larger and larger. Instead, a proposal should work out a way to aggregate common queries into an 'aggregate' table. These aggregate tables would be computed periodically by a separate job.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=28874</id>
		<title>SoC Ideas Stats Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=28874"/>
		<updated>2009-03-20T05:27:55Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database available at this time, at [stats.wesnoth.org]&lt;br /&gt;
&lt;br /&gt;
This project would involve writing a stats reporting web site which would take the data from the MySQL database and produce reports in chart and table form. Campaign designers would be able to use these reports to gather feedback on their campaigns and get ideas for improvements.&lt;br /&gt;
&lt;br /&gt;
A student could largely make their choice of infrastructure for creating the Website -- whether they prefer Python, Perl, Ruby, PHP, etc. This is a great opportunity for someone who doesn't want to dive into hardcore C++ to make a valuable contribution to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
== Database Details ==&lt;br /&gt;
&lt;br /&gt;
The MySQL database is created with these commands:&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE GAMES (game_id INT NOT NULL AUTO_INCREMENT, timestamp DATETIME NOT NULL, user_id CHAR (14) NOT NULL, serial CHAR (18) NOT NULL, platform CHAR(8), version CHAR (14), campaign CHAR(40), difficulty CHAR(20), gold INT, turns INT, scenario CHAR (40), start_turn INT, time INT, result ENUM ('victory', 'defeat', 'quit'), end_time INT, end_gold INT, end_turn INT, PRIMARY KEY (game_id));&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE SPECIAL_UNITS (game_id INT, name CHAR (40), level INT, experience INT, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE UNITS (game_id INT NOT NULL, level INT NOT NULL, type CHAR (30), count INT NOT NULL, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE)&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=28873</id>
		<title>SoC Ideas Stats Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Stats_Server&amp;diff=28873"/>
		<updated>2009-03-20T05:27:29Z</updated>

		<summary type="html">&lt;p&gt;Dave: New page: Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database available at this time, at [stats.wesnoth.org]&lt;br /&gt;
&lt;br /&gt;
This project would involve writing a stats reporting web site which would take the data from the MySQL database and produce reports in chart and table form. Campaign designers would be able to use these reports to gather feedback on their campaigns and get ideas for improvements.&lt;br /&gt;
&lt;br /&gt;
A student could largely make their choice of infrastructure for creating the Website -- whether they prefer Python, Perl, Ruby, PHP, etc. This is a great opportunity for someone who doesn't want to dive into hardcore C++ to make a valuable contribution to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
== Database Details ==&lt;br /&gt;
&lt;br /&gt;
The MySQL database is created with these commands:&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE GAMES (game_id INT NOT NULL AUTO_INCREMENT, timestamp DATETIME NOT NULL, user_id CHAR (14) NOT NULL, serial CHAR (18) NOT NULL, platform CHAR(8), version CHAR (14), campaign CHAR(40), difficulty CHAR(20), gold INT, turns INT, scenario CHAR (40), start_turn INT, time INT, result ENUM ('victory', 'defeat', 'quit'), end_time INT, end_gold INT, end_turn INT, PRIMARY KEY (game_id));&lt;br /&gt;
CREATE TABLE SPECIAL_UNITS (game_id INT, name CHAR (40), level INT, experience INT, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE);&lt;br /&gt;
CREATE TABLE UNITS (game_id INT NOT NULL, level INT NOT NULL, type CHAR (30), count INT NOT NULL, FOREIGN KEY (game_id) REFERENCES GAMES(game_id) ON DELETE CASCADE)&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=28872</id>
		<title>SummerOfCodeIdeas</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=28872"/>
		<updated>2009-03-20T05:24:52Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a compilation of ideas from ML. Needs to be refined (more detailed description, deliverables, workload estimation?):&lt;br /&gt;
&lt;br /&gt;
== I want to be one of your Google Summer of Code students, what should I do... ==&lt;br /&gt;
&lt;br /&gt;
Here is a quick list of things to do to get you started&lt;br /&gt;
* Create an account on gna.org&lt;br /&gt;
* Create an account on the wesnoth forum, and tell an admin on the IRC channel to mark is as a GSoC Student account (Admins are boucman, Ivanovic, mordante, Shadow_Master, Sirp and Turuk)&lt;br /&gt;
* Join the irc channel (#wesnoth-dev on irc.freenode.net) and introduce yourself. We will not give formal interviews, but we will clearly favor people we have learned to know during the selection process (basically communication via IRC is mandatory for our project! it is the main way of &amp;quot;every day communication&amp;quot; for Wesnoth. For the same reason, it's also a good idea to regularly read the [http://wesnoth.debian.net/?C=M;O=A IRC logs].).&lt;br /&gt;
&lt;br /&gt;
* Start a wiki page about your idea, add a link on the bottom of this page and add this information on it:&lt;br /&gt;
** List your account names (gna, forum, irc nick) so that we can recognize you&lt;br /&gt;
** Fill the questionnaire on this page: [[SoC_Information_for_Google#Does_your_organization_have_an_application_template_you_would_like_to_see_students_use.3F_If_so.2C_please_provide_it_now.| List of questions to answer]]&lt;br /&gt;
** Detail your idea as much as possible, look at other students pages, and please give milestones and studies you've done&lt;br /&gt;
** Add a link to the page at the bottom of this page&lt;br /&gt;
&lt;br /&gt;
* Though not mandatory, it is highly advisable to go to the [[EasyCoding]] and [[NotSoEasyCoding]] pages and implement one of these ideas (or any idea of similar scope) so we have an idea how you work. Be sure to use your gna account when submitting these patches so we know who it is coming from. You can also implement some features from our feature request database at gna. When you implement something, also list it on your own page with a reference to the patch.&lt;br /&gt;
&lt;br /&gt;
* For working on Wesnoth you have to be able to compile trunk. To do so you should have a look at the [[WesnothSVN|page about svn]] and afterwards [[CompilingWesnoth|compile Wesnoth svn]].&lt;br /&gt;
&lt;br /&gt;
* Once you have everything done here and think your idea is okay, go to [http://groups.google.com/group/google-summer-of-code-announce/web/guide-to-the-gsoc-web-app-for-student-applicants page at google] to submit your application. You have to submit it before '''Date to be supplied later''' or you have no chance to get in!&lt;br /&gt;
&lt;br /&gt;
== List of Ideas for the Project (Suggestions from the wesnoth developers) ==&lt;br /&gt;
&lt;br /&gt;
Here is only a short description of possible Ideas we have, each has a page of its own with a more detailed version on it.&lt;br /&gt;
&lt;br /&gt;
=== Optimize implementation of WML for memory usage ===&lt;br /&gt;
&lt;br /&gt;
Based on this idea: [http://dave.wesnoth.org/?p=9] optimize WML to minimize its memory usage. High memory usage has been a problem for Wesnoth, and this project will aim to reduce it.&lt;br /&gt;
&lt;br /&gt;
=== Implement campaign statistics reports on stats.wesnoth.org ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database available at this time, at [http://stats.wesnoth.org].&lt;br /&gt;
&lt;br /&gt;
This project would involve writing a stats reporting web site which would take the data from the MySQL database and produce reports in chart and table form. Campaign designers would be able to use these reports to gather feedback on their campaigns and get ideas for improvements.&lt;br /&gt;
&lt;br /&gt;
A student could largely make their choice of infrastructure for creating the Website -- whether they prefer Python, Perl, Ruby, PHP, etc. This is a great opportunity for someone who doesn't want to dive into hardcore C++ to make a valuable contribution to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Stats Server]] - Full Version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
Our multiplayer community is generally strong and healthy, but we believe its growth is limited by some problems in the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Multiplayer server]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Addon server ===&lt;br /&gt;
Wesnoth has an addon server which offers users to upload user &lt;br /&gt;
made content (UMC). This allows all other users of Wesnoth&lt;br /&gt;
to easily download and install this content. The server was &lt;br /&gt;
originally written for user-made campaigns but contains a lot&lt;br /&gt;
more types of addons nowadays. Both the server side and the &lt;br /&gt;
client side need to be improved.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Addon Server]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== WML validation schemes ===&lt;br /&gt;
Wesnoth uses WML as basic data structure. Over the years&lt;br /&gt;
this language has evolved and got more complex. At the&lt;br /&gt;
moment the WML is validated at runtime and in case of a&lt;br /&gt;
problem the engine stops. With schemes these problems can&lt;br /&gt;
be validated when loading the WML, making it easier to find&lt;br /&gt;
problems before running into them.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Schemes]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Write a primitive library for Formula AI ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has always had a simple C++ based AI. David (our lead developer) has been working on a simple language to write AI in Wesnoth: [[FormulaAI]]&lt;br /&gt;
&lt;br /&gt;
The Wesnoth AI is used as an opponent in most campaigns, and as such is an important piece of code for the Wesnoth project. Unfortunately, because the skills required to understand and modify it are rather arcane, it is also one of the most neglected parts of the Wesnoth code. This is a place where a lot of research and useful work could be done. But keep in mind that [[WhyWritingAWesnothAIIsHard|writing an AI for Wesnoth is difficult]].&lt;br /&gt;
&lt;br /&gt;
Writing a whole AI is so complicated that we believe it can't be done in a single Summer of code. All proposals should keep that in mind and try to identify an interesting subset that would be workable in the limited time of a summer of code&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas FormulaAI]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Savegame reorganization ===&lt;br /&gt;
The savegame formats of Wesnoth for single player campaigns&lt;br /&gt;
and multiplayer differ from each other. And they are processed&lt;br /&gt;
differently as well. Now there is an additional request coming&lt;br /&gt;
up: Multiplayer campaigns. The task will be to unify the savegames&lt;br /&gt;
for all types of scenarios in order to provide a maintainable code&lt;br /&gt;
again.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Savegame]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Other possible ideas to be fleshed out ===&lt;br /&gt;
A MapGenerator rewrite - better scalable for outdoor maps, plus the possibility to define areas (similar to the caverns in the cave generator) etc.&lt;br /&gt;
&lt;br /&gt;
=== Make your own ideas ===&lt;br /&gt;
If you have your own idea the best thing is to join IRC wesnoth-dev at irc.freenode.net and discuss the idea with the developers there. If the developers think your idea is interesting and like the feature you can start to turn it into a full proposal. Once done discuss it again on IRC so the developers can accept your idea.&lt;br /&gt;
&lt;br /&gt;
== Information about our Project ==&lt;br /&gt;
The information we provided google with about our project can be looked up at the site [[SoC Information for Google]].&lt;br /&gt;
&lt;br /&gt;
Also see the [[DeveloperResources]] link (from the [[Project]] page).&lt;br /&gt;
&lt;br /&gt;
== People to bug on IRC ==&lt;br /&gt;
We have prepared a list of people with their &amp;quot;area of competence&amp;quot;. This is to give you an idea on which areas those people can be of help for you. Of course you should always just ask in the IRC chan, but those are the most likely ones to answer questions in the respective area. And here is the list:&lt;br /&gt;
&lt;br /&gt;
[[SoC People to bug on IRC]]&lt;br /&gt;
&lt;br /&gt;
== GSoC Student pages ==&lt;br /&gt;
&lt;br /&gt;
Please add a link to your wiki page below&lt;br /&gt;
&lt;br /&gt;
[[SummerOfCodeProposal_Velory| Velory - SoC Proposal]]&lt;br /&gt;
&lt;br /&gt;
[[SummerOfCodeProposal_AI_Improvement_Crab| Crab - SoC Proposal - AI Improvement]]&lt;br /&gt;
&lt;br /&gt;
[[SummerOfCodeProposal_Sparksteel | Sparksteel - Improving the AI engine design]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code|*]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_People_to_bug_on_IRC&amp;diff=28850</id>
		<title>SoC People to bug on IRC</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_People_to_bug_on_IRC&amp;diff=28850"/>
		<updated>2009-03-19T20:17:33Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== People to bug on IRC ==&lt;br /&gt;
We have prepared a list of people with their &amp;quot;area of competence&amp;quot;. This is to give you an idea on which areas those people can be of help for you. Of course you should always just ask in the IRC chan, but those are the most likely ones to answer questions in the respective area. And here is the list:&lt;br /&gt;
&lt;br /&gt;
=== boucman ===&lt;br /&gt;
As our &amp;quot;patch monkey&amp;quot; he accustomed to critiquing patches of every kind. Beside this, he knows many areas of the game due to working on applying patches. He is particularly used to answering question from new coders, and doesn't mind explaining trivial stuff. He was the one who started the &amp;quot;two patches, you're in&amp;quot; policy and the ReferenceWML part of the project.&lt;br /&gt;
&lt;br /&gt;
=== Daniel Franke (dfranke) ===&lt;br /&gt;
Daniel is the devteam's most recent addition, and has been primarily concerned with security auditing.  Bug him &amp;lt;i&amp;gt;privately&amp;lt;/i&amp;gt; if you think you've found a security issue.&lt;br /&gt;
&lt;br /&gt;
=== Dave alias Sirp ===&lt;br /&gt;
Sirp started Wesnoth and is our lead developer. He is currently our C++ expert and is also the one that is working on the new Formula AI. Any questions regarding the formula AI should be directed to him.&lt;br /&gt;
&lt;br /&gt;
=== Elias Pscherning (elias) ===&lt;br /&gt;
He wrote the original version of campgen and as such will know a lot about what is needed to to make such an editor work correctly. The work on a scenario editor might be based upon campgen and as such his knowledge will be really helpful.&lt;br /&gt;
&lt;br /&gt;
=== Eric S. Raymond (ESR) ===&lt;br /&gt;
ESR is our project toolsmith; he has written several tools that semi-automate various aspects of WML maintenance.  While most of our developers/designers concentrate on either the C++ core or WML but not both, he has a balanced understanding of both levels and may be helpful in helping students develop a grasp of the overall architecture.  Finally, he did the last overhaul of the Wesnoth UI and understands UI design principles; he is well-equipped to guide students working in that area.&lt;br /&gt;
&lt;br /&gt;
=== ilor ===&lt;br /&gt;
2008 GSoC student, worked on and maintains the new map editor in Wesnoth 1.5/1.6. Has some fairly recent experience with getting &amp;quot;in&amp;quot; the Wesnoth codebase.&lt;br /&gt;
&lt;br /&gt;
=== Karol Nowak (grzywacz) ===&lt;br /&gt;
Two years he participated at GSoC as a student, so he will understand the situation of GSoC students. Beside this he is our top expert on Wesnoth for embedded devices as he worked on the gp2x support.&lt;br /&gt;
&lt;br /&gt;
=== loonycyborg ===&lt;br /&gt;
Maintainer of Wesnoth's SCons build system and windows packager. Might also help out with other buildsystems.&lt;br /&gt;
&lt;br /&gt;
=== Mordante ===&lt;br /&gt;
Many of the possible projects involve the code for which he is an area expert. Also, many of the possible projects currently listed on the ideas page require GUI parts to work. Mordante is currently busy rewriting the old gui engine, he will be our expert there as well as already being our area expert for the terrain engine.&lt;br /&gt;
&lt;br /&gt;
=== Nils Kneuper (Ivanovic) ===&lt;br /&gt;
He is doing nothing special, he just does some &amp;quot;administrative work&amp;quot; like packaging fresh tarballs when it is time for them and works on setting up any kind of deadlines and timetables related to releasing. He has administrative powers in most areas, no matter if website, forum or IRC. Beside this he uploads translation updates, tries to communicate with the translation teams when it is required and translates a little bit himself every now and then. But in general he is not a real expert in anything, just has a look at things that come up and redirects people to the correct contacts.&lt;br /&gt;
&lt;br /&gt;
=== Noy ===&lt;br /&gt;
Noy is an oddity among developers; he's got no coding skills whatsoever and possesses a limited understanding of computers, which is illustrated by his difficulty operating a Mac. Instead, Noy makes his contribution in gameplay and multiplayer design, drawing upon his background in social sciences research, military strategy and playing games online, to understand the effects of development on the playing community behavior. Along with Soliton, Noy is a useful conduit to discuss any issues in this area; just don't ask him about revising the level of randomness in the game.&lt;br /&gt;
&lt;br /&gt;
=== Noyga ===&lt;br /&gt;
Another versatile developer, on the C++ side he doesn't concentrate on a particular area, did some tweaks to improve translations in some languages (like enabling the female forms for names in various place) but know quite well the C++ side of units, abilities and WML. On the WML side he's an expert.&lt;br /&gt;
&lt;br /&gt;
=== Sapient ===&lt;br /&gt;
This developer started working on the GUI and widgets, but recently he focused more on improving the internal mechanics of the WML engine such as variable look-ups and filtering. Sapient is not very active anymore but he does come one IRC in the evenings (U.S.A.). He has touched-up many areas of the code in small ways over time, thus he has a good general knowledge of the C++ code and also has worked a little on some python maintenance scripts. He keeps an eye on the quality of incoming C++... especially if you plan on making any changes to GUI or WML, Sapient will be reviewing it closely and with a critical eye.&lt;br /&gt;
&lt;br /&gt;
=== Shadow Master/ShikadiLord ===&lt;br /&gt;
He joined the development team very recently, but has enough knowledge to help newcomers with trivial questions about the code and/or the C++ language. His primary focuses are the various WML handlers, such as game events code. His knowledge of the WML language itself is also enough to answer most questions and solve most problems, but only if they are not related to multiplayer games. He also has some basic knowledge of the autotools machinery we use to configure Wesnoth for foreign computers.&lt;br /&gt;
&lt;br /&gt;
=== Dragonking ===&lt;br /&gt;
&lt;br /&gt;
He is one of our best Wesnoth players, and understands the various strategies well. He has also programmed much of the Wesnoth Formula AI system and understands it well.&lt;br /&gt;
&lt;br /&gt;
=== Soliton ===&lt;br /&gt;
He knows our MP server setup best. Beside this he has already done a lot of work on the MP server himself. So he probably has most knowledge about it and, being one of our MP-developers, might provide important help from the perspective of the MP player community and what is needed there.&lt;br /&gt;
&lt;br /&gt;
=== YogiHH or Piotr Cychowski (cycholka) ===&lt;br /&gt;
Since they are the two developers who know most about building under Windows, they will probably be really helpful. Either if the student comes from the Windows side, or to help test resulting work to make sure that it does work on Windows and, for the case that it does not, to show them where problems are.&lt;br /&gt;
&lt;br /&gt;
=== zookeeper or Mythological or Rhuvaen ===&lt;br /&gt;
As our leading WML experts those are to be contacted when it comes to anything related WML problems since they know this stuff best. They do maintain most of the campaigns and improve them whenever they have a good idea for changes.&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
[[SummerOfCodeIdeas|Summer of Code Ideas]] - The root where all information regarding SoC is (or better should be) linked from.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Information_for_Google&amp;diff=28567</id>
		<title>SoC Information for Google</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Information_for_Google&amp;diff=28567"/>
		<updated>2009-03-10T18:40:05Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Who will be your backup organization administrator? Please include Google Account information. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== SoC Information for Google ==&lt;br /&gt;
==== Describe your organization. ====&lt;br /&gt;
The Battle for Wesnoth, or simply Wesnoth, is a free turn based strategy game with role playing elements designed in June 2003 by David White (Sirp), who currently works at Google.&lt;br /&gt;
&lt;br /&gt;
The game's general [http://www.wesnoth.org/wiki/WesnothPhilosophy philosophy] (both for gameplay and coding) emphases simplicity. The core rules are meant to be easily learned but also provide interesting gameplay and diverse strategies. Strength of the project is reflected in application of  Wesnoth Markup Language (WML), which provides a simple language to easily customize scenarios. It has created a significant modding community that has generated a considerable amount of user content.&lt;br /&gt;
&lt;br /&gt;
The first stable release (1.0) was on October 2 2005, with the latest  stable release (1.6) anticipated in the next few weeks. According to Ohloh, a site that collects activity statistics on open-source projects, the Wesnoth development effort is in the top 2% of largest and most active projects.&lt;br /&gt;
&lt;br /&gt;
Wesnoth has grown substantially and is considered one of the largest open source games around.&lt;br /&gt;
* two servers (stable and developement) with a usual minimum load of more than a hundred players&lt;br /&gt;
* more than two thousands downloads a day&lt;br /&gt;
* 3 million downloads via sourceforge.net, many more via various mirrors of Linux Distributions&lt;br /&gt;
* best rated game at the [http://www.happypenguin.org/list?sort=avg_rating linux game tome]&lt;br /&gt;
* game of the year 2007 and 2008 at [http://www.linuxquestions.org/questions/2007-linuxquestions.org-members-choice-awards-79/open-source-game-of-the-year-610236/ linuxquestions.org]&lt;br /&gt;
* One of the top 20 rated projects on [http://freshmeat.net/stats/#rating Freshmeat] (currently 14th highest rating, and the highest rated game).&lt;br /&gt;
&lt;br /&gt;
Wesnoth's most notable features include;&lt;br /&gt;
* A mature project, but with active development and many improvements&lt;br /&gt;
* High quality artwork: both graphics and music&lt;br /&gt;
* Very well­-balanced by a tireless team of playtesters&lt;br /&gt;
* Fun, unique gameplay&lt;br /&gt;
* Even after five years of development, and a very solid, fun product has been created, there are still plenty of new developers, and the number of commits to SVN is still increasing&lt;br /&gt;
* Strong support of internationalization with many supported languages and thus experience in working with not native English speakers (more than half of our developers are not native English speakers)&lt;br /&gt;
&lt;br /&gt;
==== Why is your organization applying to participate in GSoC 2008? What do you hope to gain by participating?====&lt;br /&gt;
&lt;br /&gt;
Most of our developers have particular areas of interest in which they work. Though they are efficient in their areas, there are other, presently uncovered, areas of the code with a need for improvements but a high barrier to entry for casual contributors.&lt;br /&gt;
&lt;br /&gt;
If a student were dedicated to any of these uncovered areas, we believe that person could be brought up to speed relatively quickly and function as a peer of the existing developers.&lt;br /&gt;
&lt;br /&gt;
By bringing new people in and allowing them to be actively responsible for an area of code, we hope to kickstart some areas of the project that have lagged behind&lt;br /&gt;
&lt;br /&gt;
==== Did your organization participate in past GSoCs? If so, please summarize your involvement and the successes and challenges of your participation.====&lt;br /&gt;
Wesnoth participated in GSoC 2008 with four students. Out of these, two were great success (that is they became full-fledge developers before the actual start of GSoC), did huge improvement during GSoC (A new recruitment algorithm for the AI and the basic structure for a new level editor), and are still active developers in the Wesnoth community.&lt;br /&gt;
&lt;br /&gt;
Of the two other, one of them was very active for the first half of GSoC and provided some useful infrastructure for AI development that we plan to use this year in GSoC, but was much less active and didn't reach expectations for the second half of GSoC. The lesson we learned is that great students should be left on their own, that's the best way to have them work, but average students should be monitored much more closely than we did. If things seems to start to go wrong, it's important to react very quick, to meet with other mentors and get things back on track early.&lt;br /&gt;
&lt;br /&gt;
Timezone problems were also a serious barrier for student/mentor communication, and we will take that more seriously into account when pairing mentors and students&lt;br /&gt;
&lt;br /&gt;
For our other students, multiple problems collectively led to failure&lt;br /&gt;
* We should enforce IRC communication, E-mail is a barrier. This applies both for students and mentors. Both should be on IRC several hours a day, with a huge overlapping of the hours.&lt;br /&gt;
* We should be more strict about mid-term evaluation. If the student is slightly lacking at mid-term we should get the message clear that he needs to get back on track.&lt;br /&gt;
&lt;br /&gt;
==== If your organization has not previously participated in GSoC, have you applied in the past? If so, for what year(s)?====&lt;br /&gt;
&lt;br /&gt;
We only applied and participated in GSoC 2008&lt;br /&gt;
&lt;br /&gt;
==== Who will your organization administrator be? Please include Google Account information.====&lt;br /&gt;
Nils Kneuper (Ivanovic)&lt;br /&gt;
&lt;br /&gt;
crazy.ivanovic |ATTT| googlemail.com&lt;br /&gt;
&lt;br /&gt;
==== What license(s) does your project use?====&lt;br /&gt;
Our project is entirely GPL.&lt;br /&gt;
&lt;br /&gt;
All code is GPL.&lt;br /&gt;
&lt;br /&gt;
All art is GPL, 99% was made for the project, everything else was taken from content that was checked to be GPL.&lt;br /&gt;
&lt;br /&gt;
For more information on the licenses for the game and wiki, see [[Wesnoth:Copyrights]].&lt;br /&gt;
&lt;br /&gt;
==== What is the URL for your ideas page?====&lt;br /&gt;
Our main summer of code page is located at http://www.wesnoth.org/wiki/SummerOfCodeIdeas&lt;br /&gt;
&lt;br /&gt;
This page contains various coding ideas and the thought the development team has already given them.&lt;br /&gt;
&lt;br /&gt;
It also contains a list of the developers that are the most active on IRC and their domains of interest.&lt;br /&gt;
&lt;br /&gt;
==== What is the main development mailing list or forum for your organization?====&lt;br /&gt;
Regarding development, the most important discussions are also posted on &amp;quot;wesnoth-dev&amp;amp;#x40;gna.org&amp;quot;. Beside this some work happens at http://www.wesnoth.org/forum/. In particular, all art development takes place on the forum.&lt;br /&gt;
&lt;br /&gt;
Most work and discussions take place in our (logged) IRC channel ''#wesnoth-dev''.&lt;br /&gt;
&lt;br /&gt;
==== What is the main IRC channel for your organization?====&lt;br /&gt;
&lt;br /&gt;
All our IRC channels are on the ''freenode'' network&lt;br /&gt;
&lt;br /&gt;
* ''#wesnoth-dev'' is the main development channel, where most discussion takes place and students are required to be in regularly if accepted in our org for SoC&lt;br /&gt;
* ''#wesnoth'' is a generic channel for the community&lt;br /&gt;
* ''#wesnoth-mp'' is a separate channel for multiplayer games and balancing&lt;br /&gt;
&lt;br /&gt;
==== Does your organization have an application template you would like to see students use? If so, please provide it now.====&lt;br /&gt;
We plan mainly to meet potential students through our IRC channel, but the following questions are Wesnoth specific and are worth pondering for any student, even if we don't need a formal answer&lt;br /&gt;
&lt;br /&gt;
* Basics&lt;br /&gt;
** Write a small introduction to yourself.&lt;br /&gt;
** State your preferred email address.&lt;br /&gt;
** If you have chosen a nick for IRC and Wesnoth forums, what is it?&lt;br /&gt;
** Why do you want to participate in summer of code?&lt;br /&gt;
** What are you studying, subject, level and school? &lt;br /&gt;
&lt;br /&gt;
* Experience&lt;br /&gt;
** What programs/software have you worked on before?&lt;br /&gt;
** Have you developed software in a team environment before? (As opposed to hacking on something on your own)&lt;br /&gt;
** Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why?&lt;br /&gt;
** What development model would you use (e.g. keywords: V-model, XP programming, agile programming, iterative; with the help of prototyping, formal specifications, tests, etc).&lt;br /&gt;
** Open Source&lt;br /&gt;
*** Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement.&lt;br /&gt;
** Gaming experience&lt;br /&gt;
*** Are you a gamer?  If so...&lt;br /&gt;
*** What type of gamer are you?&lt;br /&gt;
*** What type of games? &lt;br /&gt;
*** What type of opponents do you prefer? &lt;br /&gt;
*** Are you more interested in story or gameplay?&lt;br /&gt;
*** Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer.&lt;br /&gt;
&lt;br /&gt;
We do not plan to favor Wesnoth players as such, but some particular projects require a good feeling for the game which is hard to get without having played intensively.&lt;br /&gt;
&lt;br /&gt;
* Communication skills&lt;br /&gt;
** Though most of our developers are not native English speakers, English is the project's working language.  Describe your fluency level in written English.&lt;br /&gt;
** Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough.&lt;br /&gt;
** Do you give constructive advice? &lt;br /&gt;
** Do you receive advice well? &lt;br /&gt;
** Are you good at sorting useful criticisms from useless ones?&lt;br /&gt;
&lt;br /&gt;
* Project&lt;br /&gt;
** Did you select a project from our list? If that is the case, what project did you select?&lt;br /&gt;
** If you have invented your own project, please describe the project and the scope.&lt;br /&gt;
** Why did you choose this project?&lt;br /&gt;
** Include an estimated timeline for your work on the project&lt;br /&gt;
** Include as much technical detail about your implementation as you can&lt;br /&gt;
** What do you expect to gain from this project?&lt;br /&gt;
** What would make you stay in the Wesnoth community after the conclusion of SOC? &lt;br /&gt;
&lt;br /&gt;
* Practical considerations&lt;br /&gt;
** Are you familiar with any of the following tools?&lt;br /&gt;
*** Subversion (used for all commits)&lt;br /&gt;
*** C++ (language used for all the normal source code)&lt;br /&gt;
*** Python (optional, mainly used for tools)&lt;br /&gt;
*** build environments (eg cmake/autotools/scons)&lt;br /&gt;
** Which tools do you normally use for development? Why do you use them?&lt;br /&gt;
** What programming languages are you fluent in?&lt;br /&gt;
** What spoken languages are you fluent in?&lt;br /&gt;
** At what hours are you awake and when will you be able to be in IRC (please specify in UTC)&lt;br /&gt;
** Would you mind talking with your mentor on telephone / internet phone? &lt;br /&gt;
&lt;br /&gt;
* Detailed answer (optional, but writing skill is a good predictor of ability to work on a programming team, so you will improve your chances by responding to this).&lt;br /&gt;
** Write a small essay (750-1000 words or more) explaining why you want to participate in a Wesnoth GSoC project. You can use the above questions as guides, but feel free to throw in more information if you feel it is relevant.&lt;br /&gt;
** What is your perception of 'open source'? Briefly explain what you think of the whole 'open source' concept, how you discovered open source, what you expect to gain/experience by participating in an open-source project. (Answer separately or as part of above mini-essay)&lt;br /&gt;
** What motivates or inspires you to write programs and develop software? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''''to be completed''''&lt;br /&gt;
&lt;br /&gt;
==== Who will be your backup organization administrator? Please include Google Account information.====&lt;br /&gt;
David White (davewx7@gmail.com) -- Link ID: sirp&lt;br /&gt;
&lt;br /&gt;
==== Who will your mentors be? Please include Google Account information.====&lt;br /&gt;
&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jeremy Rosen alias Boucman (boucman2|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Mark de Wever aka Mordante (mordante.wesnoth|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jörg Hinrichs alias YogiHH (joerghh.hinrichs|ATTT|googlemail.com)&lt;br /&gt;
&lt;br /&gt;
Patrick Parker a.k.a. &amp;quot;Sapient&amp;quot; (patrick.x99|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
==== What criteria did you use to select these individuals as mentors? Please be as specific as possible.====&lt;br /&gt;
&lt;br /&gt;
Our first criterion was that all the people had to be volunteers. According to other open source projects, being a SoC mentor takes a lot of time and the person has to be ready to spend quite some time with the student.&lt;br /&gt;
&lt;br /&gt;
Dave is the project leader and one of the most knowledgeable in C++. He has also written the Formula AI code which we plan to develop via the SoC. He is well known in our community for formulating simple but effective explanations for complicated topics, and has good design intuition. The growth of Wesnoth demonstrates his capacity to get other developers to work together and keep them involved in a thriving community.&lt;br /&gt;
&lt;br /&gt;
Boucman is one of the oldest active developers around. He has rewritten the whole animation engine and made it an easily pluggable system allowing artists to easily specify exactly how they want the units to appear. He also started many community oriented projects like the [http://wiki.wesnoth.org/UnsortedContrib Art Contribution] section of the wiki (now automated) and the [http://wiki.wesnoth.org/ReferenceWML WML Reference Manual]. He is responsible for dispatching and sorting the patches at http://patches.wesnoth.org and has created the new developer process we currently use. &lt;br /&gt;
&lt;br /&gt;
Mordante is one of the most active developers on our IRC channel. Not only has he done preliminary studies and coding in multiple areas that are candidates for Summer of Code ideas, he also is one of the coders with the best overview of the Wesnoth code. A large part of his work involves refactoring polishing existing code. Next to that he's very active with fixing bugs which leads him to all areas in the code base.&lt;br /&gt;
&lt;br /&gt;
YogiHH has been with the project for more than two years. He did a major refactoring to the gameplay engine and worked quite a bit on the multiplayer code. He also has been a professional trainer for C/C++, Java and C# for many years. Right now he works in a project where he serves as a mentor for a junior developer.&lt;br /&gt;
&lt;br /&gt;
All other developers listed in the ideas page are the leading capacities we do have for the respecting areas. Have a look at our list of people who to contact for which regards. In general all our developers will mentor all students. That is, questions should just be asked in our IRC channel, where basically every developer who has an idea can directly answer.&lt;br /&gt;
&lt;br /&gt;
When choosing the mentors, we have kept in mind that most developers can answer most technical questions, and we have chosen people that are well known for interacting with new-comers/external developers and can provide general guidance and design advice, more than people with specific technical knowledge.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing students?====&lt;br /&gt;
The first thing to do is to avoid this situation altogether. &lt;br /&gt;
&lt;br /&gt;
Wesnoth is a game, and as such has lots of developers that are not coders. In particular, artists are well known in the Wesnoth community for being very sensible about criticism and our community is used to people being sensible to critics. &lt;br /&gt;
&lt;br /&gt;
We will try to choose students that accept criticism and are able to filter constructive criticism from useless one. The Wesnoth developer community is used to judging people according to these criteria and the special title we are going to give to applicants will allow us to easily spot any such problems and discuss them before they grow out of control.&lt;br /&gt;
&lt;br /&gt;
If a student disappears, his mentor will be in charge of recontacting him to see what is going wrong (available time, tension with other developers, with members of the community etc...). Depending on the actual problem, the mentor and the student will have to agree on possible ways to defuse the problem.&lt;br /&gt;
&lt;br /&gt;
If a student disappears completely and there is no way to get back to him, there is little the project can do except salvaging whatever can be salvaged from the code (the students will have SVN write access, so most of the work will be committed either to trunk or to a specific branch) and find a core developer to take on the job. This will probably be slower and less effective for the project, but it's the best we can do.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing mentors?====&lt;br /&gt;
&lt;br /&gt;
All our mentors are long time developers that volunteered for the job, so we don't expect that to happen. We took the time to ask other former GSoC projects about the workload needed to be a mentor, and our mentors accepted the job knowing the amount of work it involved.&lt;br /&gt;
&lt;br /&gt;
However, should it happen, we would continue to mentor as a developer community the student until we find a new &amp;quot;official&amp;quot; mentor to take on the job.&lt;br /&gt;
&lt;br /&gt;
==== What steps will you take to encourage students to interact with your project's community before, during and after the program?====&lt;br /&gt;
&lt;br /&gt;
Wesnoth has a particularly healthy community, both for developers and for players. &lt;br /&gt;
&lt;br /&gt;
Our general policy regarding new coders has always been &amp;quot;two patch... you're in&amp;quot; In other word, anybody that is able to get two non-trivial patches applied is offered commit privileges.&lt;br /&gt;
&lt;br /&gt;
We have a developer responsible for applying patches and guiding new developers into our community. This is a well known and effective process we plan to apply to students, directing them to our [[EasyCoding]] pages (these project are usually a couple of hours long and has been chosen to provide easy access to code)&lt;br /&gt;
&lt;br /&gt;
Usually, patches go back and forth a couple of time, to make sure that all secondary things are in place (indenting, coding style, modified makefiles etc.) The idea is that coder education should take place before the coder gets commit rights, but that getting new coder in is one of the most important things to maintain our project alive.&lt;br /&gt;
&lt;br /&gt;
If the student is proactive and ready to join IRC, all the developers are usually very welcoming, and good at directing newcomers to quickly give useful results.&lt;br /&gt;
&lt;br /&gt;
We also plan to give a special forum title to any students. This will allow all forum members to tell them apart from normal users and give them read/write access to the developer only forums. This will also allow us to quickly spot any problem they might have interacting with the player community. We have a very mature developer community, but our player community is made of all sort of people of all age and education, and it can be rough at time.&lt;br /&gt;
&lt;br /&gt;
==== What will you do to ensure that your accepted students stick with the project after GSoC concludes?====&lt;br /&gt;
&lt;br /&gt;
Since our community has a history of having developers easily and quickly join, we expect the student to be a full-fledged developer quite fast (probably a little after the end of the bonding period). &lt;br /&gt;
&lt;br /&gt;
Thus there will be no &amp;quot;end of GSoC&amp;quot; transition. At the end of the Summer of code we expect the student to be responsible for the part he developed, and to continue taking care of it, just as other developers are responsible for their part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[SummerOfCodeIdeas|Summer of Code Ideas]] - The root where all information regarding SoC is (or better should be) linked from.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Multiplayer_server&amp;diff=28266</id>
		<title>SoC Ideas Multiplayer server</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SoC_Ideas_Multiplayer_server&amp;diff=28266"/>
		<updated>2009-02-15T19:38:24Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* General Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
Our multiplayer community is generally strong and healthy, but we believe its growth is limited by some problems in the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
==== General Description ====&lt;br /&gt;
The general idea of this project would be&lt;br /&gt;
* To study the current lobby,&lt;br /&gt;
* To develop ideas about how our multiplayer interface could evolve to allow it to scale to a much larger community&lt;br /&gt;
* And to implement as many of those changes as practical&lt;br /&gt;
&lt;br /&gt;
Some ideas that we had (but that are in no way mandatory):&lt;br /&gt;
* Having a simple way to register and authenticate nicknames, similar to what IRC offers. The point is not to have cryptographically safe logins, but to have something simple that gets the job done&lt;br /&gt;
* Having a simple room system? Again, inspired by IRC&lt;br /&gt;
* Having some way to find the type of games you are interested in. filtering by:&lt;br /&gt;
** game type&lt;br /&gt;
** number of free slots/players&lt;br /&gt;
** any other criteria you might find interesting&lt;br /&gt;
&lt;br /&gt;
Other ideas we are not yet convinced are good, but that are certainly worth studying (especially how the communities based around these concepts are different from ours)&lt;br /&gt;
* ranking players&lt;br /&gt;
* guilds&lt;br /&gt;
* official tournaments&lt;br /&gt;
* titles for players&lt;br /&gt;
* metaservers&lt;br /&gt;
* game matching when players are ranked (poker, bridge...)&lt;br /&gt;
&lt;br /&gt;
The scalability of the design (both in term of number of players, and in term of the possibility for players and developers to extend the concept) will be an important criterion.&lt;br /&gt;
&lt;br /&gt;
Administration/moderation problems and techniques should also be studied.&lt;br /&gt;
&lt;br /&gt;
Interaction with the Add-On server/forum should be explored.&lt;br /&gt;
&lt;br /&gt;
An additional feature that could be considered is more secure random number generation to prevent cheating. At the moment, random numbers are generated on the client side. Things could be changed&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* A fair amount of experience with C++ is required. Wesnoth uses some advanced C++ features and is heavily based on BOOST and SDL. We can train you in some of the libraries used, but learning all of them would be a big hurdle.&lt;br /&gt;
* Experience with multiplayer games, in order to have a good idea of what multiplayer lobbies of other game look like, and (more importantly) a good idea of the social behaviours of multiple MP communities, how teams are formed in games and things like that.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
* A first milestone would be a presentation summarizing the different studies, and the proposed interface. preliminary informal stages would probably be desirable, to make sure the proposed idea is already a consensus within devs &lt;br /&gt;
** Study of other MP game-matching interfaces and functionalities&lt;br /&gt;
** Study of other MP communities&lt;br /&gt;
** Study of other MP moderation practices&lt;br /&gt;
** Study of the Wesnoth MP community, including needs, various opinions from different developers and players&lt;br /&gt;
* A second milestone would be the main code delivery. Code should be functional for it will be delivered in the next Wesnoth development release&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
[[SummerOfCodeIdeas|Summer of Code Ideas]] - The root where all information regarding SoC is (or better should be) linked from.&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=28265</id>
		<title>SummerOfCodeIdeas</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=28265"/>
		<updated>2009-02-15T19:36:26Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a compilation of ideas from ML. Needs to be refined (more detailed description, deliverables, workload estimation?):&lt;br /&gt;
&lt;br /&gt;
== I want to be one of your Google Summer of Code students, what should I do... ==&lt;br /&gt;
&lt;br /&gt;
Here is a quick list of things to do to get you started&lt;br /&gt;
* Create an account on gna.org&lt;br /&gt;
* Create an account on the wesnoth forum&lt;br /&gt;
* Join the irc channel (#wesnoth-dev on irc.freenode.net) and introduce yourself. We will not give formal interviews, but we will clearly favor people we have learnt to know during the selection process&lt;br /&gt;
* Contact one of our SummerOfCode people (Ivanovic, Sirp, Boucman, Mordante) to have your forum nick marked as a Summer of code student&lt;br /&gt;
&lt;br /&gt;
* Start a wiki page about your idea, add a link on the bottom of this page and add this information on it:&lt;br /&gt;
** List your account names (gna, forum, irc nick) so that we can recognize you&lt;br /&gt;
** Fill the questionnaire on this page: [[SoC_Information_for_Google#Does_your_organization_have_an_application_template_you_would_like_to_see_students_use.3F_If_so.2C_please_provide_it_now.| List of questions to answer]]&lt;br /&gt;
** Detail your idea as much as possible, look at other students pages, and please give milestones and studies you've done&lt;br /&gt;
&lt;br /&gt;
* Though not mandatory, it is highly advisable to go to the [[EasyCoding]] and [[NotSoEasyCoding]] pages and implement one of these ideas (or any idea of similar scope) so we have an idea how you work. Be sure to use your gna account when submitting these patches so we know who it is coming from. You can also implement some features from our feature request database at gna. When you implement something, also list it on your own page with a reference to the patch.&lt;br /&gt;
&lt;br /&gt;
* For working on Wesnoth you have to be able to compile trunk. To do so you should have a look at the [[WesnothSVN|page about svn]] and afterwards [[CompilingWesnoth|compile Wesnoth svn]].&lt;br /&gt;
&lt;br /&gt;
* Once you have everything done here and think your idea is okay, go to [http://groups.google.com/group/google-summer-of-code-announce/web/guide-to-the-gsoc-web-app-for-student-applicants to page at google] to submit your application. You have to submit it before '''Date to be supplied later''' or you have no chance to get in!&lt;br /&gt;
&lt;br /&gt;
== List of Ideas for the Project (Suggestions from the wesnoth developers) ==&lt;br /&gt;
&lt;br /&gt;
Here is only a short description of possible Ideas we have, each has a page of its own with a more detailed version on it.&lt;br /&gt;
&lt;br /&gt;
=== Optimize implementation of WML for memory usage ===&lt;br /&gt;
&lt;br /&gt;
Based on this idea: [http://dave.wesnoth.org/?p=9] optimize WML to minimize its memory usage. High memory usage has been a problem for Wesnoth, and this project will aim to reduce it.&lt;br /&gt;
&lt;br /&gt;
=== Implement campaign statistics reports on stats.wesnoth.org ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has an infrastructure which records details of campaigns that players play into a centralized MySQL database. However, we only have rudimentary reports based on this MySQL database available at this time, at [http://stats.wesnoth.org].&lt;br /&gt;
&lt;br /&gt;
This project would involve writing a stats reporting web site which would take the data from the MySQL database and produce reports in chart and table form. Campaign designers would be able to use these reports to gather feedback on their campaigns and get ideas for improvements.&lt;br /&gt;
&lt;br /&gt;
A student could largely make their choice of infrastructure for creating the Website -- whether they prefer Python, Perl, Ruby, PHP, etc. This is a great opportunity for someone who doesn't want to dive into hardcore C++ to make a valuable contribution to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
=== Writing an AI based on the formula AI ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has always had a simple C++ based AI. David (our lead developer) has been working on a simple language to write AI in Wesnoth: [[FormulaAI]]&lt;br /&gt;
&lt;br /&gt;
The Wesnoth AI is used as an opponent in most campaigns, and as such is an important piece of code for the Wesnoth project. Unfortunately, because the skills required to understand and modify it are rather arcane, it is also one of the most neglected parts of the Wesnoth code. This is a place where a lot of research and useful work could be done. But keep in mind that [[WhyWritingAWesnothAIIsHard|writing an AI for Wesnoth is difficult]].&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas FormulaAI]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
Our multiplayer community is generally strong and healthy, but we believe its growth is limited by some problems in the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Multiplayer server]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Scenario/Campaign editor ===&lt;br /&gt;
&lt;br /&gt;
Currently, in order to create campaign or multiplayer scenarios, it is necessary to manually edit WML files - XML-like configuration files. The goal of this project would be to create a graphical editor to make the creative process easier.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Scenario and Campaign Editor]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Addon server ===&lt;br /&gt;
Wesnoth has an addon server which offers users to upload user &lt;br /&gt;
made content (UMC). This allows all other users of Wesnoth&lt;br /&gt;
to easily download and install this content. The server was &lt;br /&gt;
originally written for user-made campaigns but contains a lot&lt;br /&gt;
more types of addons nowadays. Both the server side and the &lt;br /&gt;
client side need to be improved.&lt;br /&gt;
&lt;br /&gt;
[[SoC Ideas Addon Server]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Map editor ===&lt;br /&gt;
The map editor in Wesnoth serves two goals, making it easy to create&lt;br /&gt;
a new map and helping the terrain artists to test their new terrains.&lt;br /&gt;
&lt;br /&gt;
[[SoC_Ideas_Map_Editor]] - Full version of the idea, with detailed information&lt;br /&gt;
&lt;br /&gt;
=== Other possible ideas to be fleshed out ===&lt;br /&gt;
A MapGenerator rewrite - better scalable for outdoor maps, plus the possibility to define areas (similar to the caverns in the cave generator) etc.&lt;br /&gt;
&lt;br /&gt;
=== Make your own ideas ===&lt;br /&gt;
If you have your own idea the best thing is to join IRC wesnoth-dev at irc.freenode.net and discuss the idea with the developers there. If the developers think your idea is interesting and like the feature you can start to turn it into a full proposal. Once done discuss it again on IRC so the developers can accept your idea.&lt;br /&gt;
&lt;br /&gt;
== Information about our Project ==&lt;br /&gt;
The information we provided google with about our project can be looked up at the site [[SoC Information for Google]].&lt;br /&gt;
&lt;br /&gt;
Also see the [[DeveloperResources]] link (from the [[Project]] page).&lt;br /&gt;
&lt;br /&gt;
== People to bug on IRC ==&lt;br /&gt;
We have prepared a list of people with their &amp;quot;area of competence&amp;quot;. This is to give you an idea on which areas those people can be of help for you. Of course you should always just ask in the IRC chan, but those are the most likely ones to answer questions in the respective area. And here is the list:&lt;br /&gt;
&lt;br /&gt;
[[SoC People to bug on IRC]]&lt;br /&gt;
&lt;br /&gt;
== GSoC Student Applicant Ideas == &lt;br /&gt;
&lt;br /&gt;
Every student interested to work on Wesnoth as part of Summer of Code should create a page of his own where several things should be listed. Here is a short list of what should be mentioned on the list (the more info for us, the better...):&lt;br /&gt;
&lt;br /&gt;
* Who are you? Please list your IRC and forum nickname in here and describe yourself so that we get you to know.&lt;br /&gt;
* What do you want to work on? Please flesh out your personal ideas, so that we get to know what you plan to work on.&lt;br /&gt;
* If you already submitted patches, please list those so that we have a reference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Summer of Code|*]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Wesnoth1.6Features&amp;diff=27358</id>
		<title>Wesnoth1.6Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Wesnoth1.6Features&amp;diff=27358"/>
		<updated>2008-11-10T20:10:29Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mordante ==&lt;br /&gt;
=== Will complete ===&lt;br /&gt;
* Add new dialog to show the transparent portraits Kitty made.&lt;br /&gt;
* Improvement to gold carry over (https://gna.org/bugs/?12227).&lt;br /&gt;
* UI sounds for the new widgets.&lt;br /&gt;
* Popups for new widgets.&lt;br /&gt;
* Improve campaign selection dialog (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=497655)&lt;br /&gt;
&lt;br /&gt;
=== Wants to complete ===&lt;br /&gt;
* Finish the new widgets (Won't be done before 1.6)&lt;br /&gt;
* Open bugs assigned to me&lt;br /&gt;
&lt;br /&gt;
=== Hopes to complete ===&lt;br /&gt;
* Open FRs assigned to me&lt;br /&gt;
&lt;br /&gt;
== Sapient ==&lt;br /&gt;
=== Wants to complete ===&lt;br /&gt;
* Allow math to be used in any WML tag (http://www.wesnoth.org/forum/viewtopic.php?p=317204#p317204)&lt;br /&gt;
&lt;br /&gt;
== zookeeper ==&lt;br /&gt;
=== Wants to complete ===&lt;br /&gt;
* Finalizing the gold carryover changes in mainline campaigns (as long as the maintainer doesn't oppose it, naturally) and rebalancing accordingly.&lt;br /&gt;
* Implementing a final version of the ai controller, and then deciding whether we want to use it across all/most the mainline campaigns or not.&lt;br /&gt;
&lt;br /&gt;
== esr ==&lt;br /&gt;
=== Am Done With ===&lt;br /&gt;
* Substantive changes to existing mainline campaigns.  As far as I am concerned, existing mainline WML could freeze for translation in 7 days (e.g. 9 Nov).&lt;br /&gt;
* I have no C++ core features planned for 1.6.&lt;br /&gt;
=== Will complete ===&lt;br /&gt;
* Custom music lists for all mainline scenarios that don't already have them&lt;br /&gt;
&lt;br /&gt;
=== Wants to complete ===&lt;br /&gt;
* Mainlining Delfador's Memoirs&lt;br /&gt;
=== Hopes to complete ===&lt;br /&gt;
* Get the bug count below 30&lt;br /&gt;
&lt;br /&gt;
== David ==&lt;br /&gt;
&lt;br /&gt;
=== Am Done With ===&lt;br /&gt;
* Fix bugs which make AI unplayable&lt;br /&gt;
&lt;br /&gt;
=== Wants to complete ===&lt;br /&gt;
* New stats system&lt;br /&gt;
* Sophisticated rooms system on mp server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BUGS / features that we would like to address ==&lt;br /&gt;
* The AI mess (https://mail.gna.org/public/wesnoth-dev/2008-10/msg00077.html)&lt;br /&gt;
** Update: Fixed by Sirp&lt;br /&gt;
* spawned/recruited Unit ID's in WML are no longer unique&lt;br /&gt;
** Update: Fixed by Sapient in r30685&lt;br /&gt;
* Multiplayer OOS / Replay corruption (https://mail.gna.org/public/wesnoth-dev/2008-10/msg00080.html)&lt;br /&gt;
* all the rest.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WhyWritingAWesnothAIIsHard&amp;diff=23839</id>
		<title>WhyWritingAWesnothAIIsHard</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WhyWritingAWesnothAIIsHard&amp;diff=23839"/>
		<updated>2008-03-19T19:41:14Z</updated>

		<summary type="html">&lt;p&gt;Dave: New page: = Why Writing a Wesnoth AI is Hard =  == Overview ==  I'm largely writing this in response to the number of people who have historically wanted to write a Wesnoth AI, as well as the number...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Why Writing a Wesnoth AI is Hard =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
I'm largely writing this in response to the number of people who have historically wanted to write a Wesnoth AI, as well as the number of students who are interested in developing an AI for Wesnoth as part of Summer of Code.&lt;br /&gt;
&lt;br /&gt;
Having an AI for Wesnoth is very useful, but one shouldn't underestimate its difficulty. Most traditional AI methods cannot be applied to Wesnoth, so it is necessary to use highly innovative solutions.&lt;br /&gt;
&lt;br /&gt;
Many people think that a very powerful AI for Wesnoth should be fairly easy. After all, computers can beat the world's best players in chess and backgammon, both of which are turned based games, so why not Wesnoth? This document will give an overview of why techniques used in chess and backgammon will not be near as successful in Wesnoth.&lt;br /&gt;
&lt;br /&gt;
== Wesnoth's flexibility hurts us ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth is very flexible. There are many different maps, of different sizes, and different units. Players can even add their own units. This makes it much more difficult to make a general AI.&lt;br /&gt;
&lt;br /&gt;
Computers are very good at chess because chess is played on a relatively small board, that is always the same, and the pieces always start in the same position. This means there are a relatively limited set of positions that the computer has to deal with, and in particular, the types of positions a computer has to deal with are very limited. Patterns such as three consecutive pawns in front of a castled king are common in chess, and so it is relatively easy for a chess evaluation engine to recognize such patterns and evaluate their strength.&lt;br /&gt;
&lt;br /&gt;
Wesnoth is much different. To even compare Wesnoth with chess, you would have to consider a chess program written for a chess game where the board can be any size and shape. It could have impassable squares in the middle. It could have corners that are inaccessible and so forth. Additionally, players could have various 'fantasy pieces' which are defined according to complex rules. Pieces that move like knights, but with extra steps. Pieces that can move likes knights and like bishops, and so forth.&lt;br /&gt;
&lt;br /&gt;
Such a program would not play near as well against skilled humans. Humans could adapt to the new pieces far more readily than a computer program can.&lt;br /&gt;
&lt;br /&gt;
But that still doesn't begin to approach the complexity of Wesnoth. Wesnoth has uncertain information, and random outcomes. Chess programs rely heavily on chess's deterministic nature. Wesnoth is more like backgammon in this way: you don't know what the outcome will be. But, backgammon has a tiny state space, while Wesnoth has a huge one.&lt;br /&gt;
&lt;br /&gt;
== Wesnoth's computational complexity ==&lt;br /&gt;
&lt;br /&gt;
The computational complexity of Wesnoth is immense compared to board games such as chess, backgammon, shogi, and go.&lt;br /&gt;
&lt;br /&gt;
If one considers a 30x20 map -- a typical size for a Wesnoth map -- and one considers 16 standard terrain types. This can be represented in 2400 bits of data. There are thus 2^2400 possible maps of this size. This is without even considering the many combinations of units that can be on the map, in different locations, in different states of health, and so forth. The number of possible positions is truly immense. The state space of Wesnoth certainly easily exceeds 10^1000, and probably 10^10000.&lt;br /&gt;
&lt;br /&gt;
This dwarfs the complexity of even Go, which has a state space complexity of 'only' around 10^171.&lt;br /&gt;
&lt;br /&gt;
The branching factor of Wesnoth is also huge. In most traditional board games, where much computational analysis has been done, typically a player moves one piece, then the other player moves a piece. In Wesnoth, one moves all their pieces, before the other player moves. Wesnoth also typically has many options as to where one can move a piece. It is not uncommon for a piece to have 20 or more tiles it can move to, and for a player to have a dozen or more pieces. Pieces can also choose to attack, and have a choice of weapon to attack with, and so forth. When an attack does occur, there are many possible results, based on number of strikes that land.&lt;br /&gt;
&lt;br /&gt;
The branching factor of Wesnoth is thus also huge. The game tree complexity of Wesnoth is incalculably large. Thinking ahead many moves is difficult.&lt;br /&gt;
&lt;br /&gt;
== Wesnoth as a fuzzy game ==&lt;br /&gt;
&lt;br /&gt;
Discrete analysis fails badly on Wesnoth because, though technically Wesnoth is a discrete game, there are so many positions that discrete analysis techniques fail.&lt;br /&gt;
&lt;br /&gt;
Fortunately, Wesnoth can be treated much like a continuous game, because many positions tend to be very similar to each other. Additionally, unlike discrete board games, it is not common that a very small wrong move in Wesnoth is disastrous.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WritingYourOwnAI&amp;diff=23834</id>
		<title>WritingYourOwnAI</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WritingYourOwnAI&amp;diff=23834"/>
		<updated>2008-03-19T18:28:49Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Writing your own AI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Writing your own AI ==&lt;br /&gt;
&lt;br /&gt;
Wesnoth supports a pluggable AI system that allows programmers to write their own AIs in C++ or Python.&lt;br /&gt;
You might like to look this over before starting: [[WhyWritingAWesnothAIIsHard]]&lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
&lt;br /&gt;
For information on the Python AI API look at [[ReferencePythonAPI]].&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
&lt;br /&gt;
The rest of this page describes the C++ AI API. To write an AI in C++, you need to derive a class from ''ai_interface'' (defined in '''ai.hpp'''), and implement the function ''play_turn()'' which will be called every time your AI is expected to play a turn.&lt;br /&gt;
&lt;br /&gt;
Class ''ai_interface'' contains three important functions&lt;br /&gt;
which allow you to execute the three basic types of move available in the game:&lt;br /&gt;
&lt;br /&gt;
* ''attack_enemy()'', which is used to order an attack on an enemy unit,&lt;br /&gt;
* ''move_unit()'', which is used to order a unit to move from one location to another, and&lt;br /&gt;
* ''recruit()'', which is used to recruit a new unit.&lt;br /&gt;
&lt;br /&gt;
Of course, to decide where units are to move and attack, you must have information about the state of the game - the dimensions and layout of the map, the locations and type of units on the map, the types of units your side can recruit, and information about your allies and enemies.&lt;br /&gt;
&lt;br /&gt;
Firstly, a type ''location'' is defined, which defines any location on the map.  It has members ''x'' and ''y''.  In '''pathfind.hpp''' there are a number of functions which will tell you useful things about locations -- whether two locations&lt;br /&gt;
are adjacent, all the locations adjacent to a certain location,&lt;br /&gt;
and the distance between locations.&lt;br /&gt;
&lt;br /&gt;
A type ''move_map'' is defined as a ''std::multimap&amp;lt;location,location&amp;gt;''.  Note that ''std::multimap'' is of course a standard C++ container, and cannot be documented here.  http://www.sgi.com/tech/stl/ is a good reference on standard C++ containers.  The purpose of a ''move_map'' is to show all the possible moves for a side.  It can either be a ''source -&amp;gt; destination'' map, which associates the locations of all the units a side has to all the possible places they can move to, or a ''destination -&amp;gt; source'' map, which associates all the locations all the units a side has can get to, to all the places they are now.&lt;br /&gt;
&lt;br /&gt;
The function ''calculate_possible_moves()'' is provided&lt;br /&gt;
as a useful utility function. It can give you maps for where all&lt;br /&gt;
your units can move, or where all your enemy's movements&lt;br /&gt;
can move when it's their turn. This is a very important&lt;br /&gt;
function to use to work out all the possible places your units can move to.&lt;br /&gt;
&lt;br /&gt;
''ai_interface'' also defines an ''info'' type.  This type contains a number of references to various game objects which you&lt;br /&gt;
will need access to in order to make moves.  The two most important of these objects are the unit map (unit_map units)&lt;br /&gt;
and the game map (gamemap map).&lt;br /&gt;
&lt;br /&gt;
The unit map is of type ''std::map&amp;lt;location,unit&amp;gt;''&lt;br /&gt;
and associates locations with units.  This object can be used to find the location of, and information about, every unit on the board.  See '''unit.hpp''' for a definition of the ''unit'' object.&lt;br /&gt;
&lt;br /&gt;
The game map allows you to inspect the dimensions and layout of the playing board.  Given a location, it can tell you the&lt;br /&gt;
terrain type at that location.  See '''map.hpp''' for a definition of this object.  You can combine this class with use of the functions in '''pathfind.hpp''' to find various&lt;br /&gt;
information about where units can move to.&lt;br /&gt;
&lt;br /&gt;
The team class (defined in '''team.hpp''') is also very important.  Each side is represented by a ''team'' object. The team object can tell you the gold balance of a team, which villages (note that internally, villages are often called 'towers') the team owns, what units the team can recruit,&lt;br /&gt;
and which other teams are this teams friends or enemies.&lt;br /&gt;
&lt;br /&gt;
The utility function ''current_team()'' can be used to get a reference to the team that your AI is in control of, but you&lt;br /&gt;
can also use the vector ''teams'' inside the info object to get a list of all teams.&lt;br /&gt;
&lt;br /&gt;
If you want to make your AI customizable within the configuration file, you can gain access to any parameters passed to your AI using ''team::ai_parameters()''.  This returns an object of type ''config'' (see '''config.hpp''').  These ''config'' objects are representations of WML document fragments.  When the user defines your side, if they put an [ai] tag inside it, everything inside the [ai] tag will be returned by ''team::ai_parameters()''.&lt;br /&gt;
&lt;br /&gt;
== Using your AI ==&lt;br /&gt;
&lt;br /&gt;
Finally, when you have your AI ready to go, you can add it to the ''create_ai()'' function in '''ai.cpp'''.  Suppose you called your class ''killer_ai'', you could add it like so:&lt;br /&gt;
&lt;br /&gt;
 if(name == &amp;quot;killer_ai&amp;quot;)&lt;br /&gt;
     return new killer_ai(info);&lt;br /&gt;
&lt;br /&gt;
Then, you can define a side to use your AI in [[ReferenceWML|WML]]:&lt;br /&gt;
&lt;br /&gt;
 ai_algorithm=killer_ai&lt;br /&gt;
&lt;br /&gt;
and when that side is created, it'll use your AI!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== An example ==&lt;br /&gt;
&lt;br /&gt;
Let us conclude with a small sample AI, called ''sample_ai''.  How should this AI behave?&lt;br /&gt;
&lt;br /&gt;
* First it should detect if there are any enemies in range,&lt;br /&gt;
and if there are it should attack them by moving onto the&lt;br /&gt;
best defensive terrain next to them.  Attacks should be made with the weapon for which damage*strikes*chance to hit is&lt;br /&gt;
the highest.&lt;br /&gt;
* If there are no enemies in range, it should move units onto villages that don't already belong to it.&lt;br /&gt;
* If there are no enemies or villages in range, it should move toward the enemy leader along the shortest possible route.&lt;br /&gt;
* At the end of its turn, it should recruit random units until it runs out of money or doesn't have any space.&lt;br /&gt;
&lt;br /&gt;
In the following example, I will place all functions in-line&lt;br /&gt;
rather than in the cpp file. To do this properly, of course you should put them in the cpp file.  The entire definition of this AI can be found in '''ai.cpp''' and '''ai.hpp''' in the source distribution.&lt;br /&gt;
&lt;br /&gt;
We start the definition,&lt;br /&gt;
&lt;br /&gt;
  class sample_ai : public ai_interface {&lt;br /&gt;
  public:&lt;br /&gt;
      sample_ai(info&amp;amp; i) : ai_interface(i) {}&lt;br /&gt;
&lt;br /&gt;
We have defined the constructor which takes an ''info'' object&lt;br /&gt;
and passes it straight onto ai_interface.  We don't need to&lt;br /&gt;
store anything ourselves in this simple AI.  (Although it would be fine to have data members if we wanted them.)&lt;br /&gt;
&lt;br /&gt;
Next we define the main function, ''play_turn()'':&lt;br /&gt;
&lt;br /&gt;
      void play_turn() {&lt;br /&gt;
          do_attacks();&lt;br /&gt;
          get_villages();&lt;br /&gt;
          do_moves();&lt;br /&gt;
          do_recruitment();&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
Just a series of calls to functions we are about to write which do the actual work.  Firstly, ''do_attacks()''. We start by&lt;br /&gt;
calculating all the moves our units can make:&lt;br /&gt;
&lt;br /&gt;
  private:&lt;br /&gt;
      void do_attacks() {&lt;br /&gt;
          std::map&amp;lt;location,paths&amp;gt; possible_moves;&lt;br /&gt;
          move_map srcdst, dstsrc;&lt;br /&gt;
          calculate_possible_moves(possible_moves,srcdst,dstsrc,false);&lt;br /&gt;
&lt;br /&gt;
Note that the ''possible_moves'' thing is of little direct interest.  It contains details of exactly which tiles the unit&lt;br /&gt;
moves along to get from one tile to another.  This is useful for the display to know about when it draws the unit moving, but as an AI programmer, it's not likely you'll ever care about&lt;br /&gt;
what it contains. Just pass it along to the ''move_unit()'' function so it can draw the unit moving along the correct path.&lt;br /&gt;
&lt;br /&gt;
The things we're interested in are ''srcdst'', and especially ''dstsrc'', which will tell us all the hexes our units can reach.&lt;br /&gt;
We want to check if any of these hexes are next to an enemy unit.  Let's walk over the units and see if we can reach any of them:&lt;br /&gt;
&lt;br /&gt;
          for(unit_map::const_iterator i = get_info().units.begin(); i != get_info().units.end(); ++i) {&lt;br /&gt;
              if(current_team().is_enemy(i-&amp;gt;second.side()) {&lt;br /&gt;
&lt;br /&gt;
We're iterating over all units, but we're only interested in units that are enemies of our side.  So, we access our team object, and ask if the side the unit is on is an enemy.  If it is, then we're interested in seeing if any of our units can move to a hex that's adjacent to the enemy unit.  We do this by getting the six locations around the enemy unit:&lt;br /&gt;
&lt;br /&gt;
                  location adjacent_tiles[6];&lt;br /&gt;
                  get_adjacent_tiles(i-&amp;gt;first,adjacent_tiles);&lt;br /&gt;
&lt;br /&gt;
This kind of call is very common in the game's code -- make an array of 6 locations, and fill them up with the locations adjacent to a certain location.  We actually want to find the position to attack from which gives our unit the best possible defense. So, we initialize some variables to find the best possible defense:&lt;br /&gt;
&lt;br /&gt;
                  int best_defense = -1;&lt;br /&gt;
                  std::pair&amp;lt;location,location&amp;gt; best_movement;&lt;br /&gt;
&lt;br /&gt;
The value of ''best_defense'' will of course be between 1 and 100, but we give it a value of -1 to mean 'not initialized', since we haven't found any possible attacks at all yet.  Variable ''best_movement'' will contain the destination/source pair that gives the best possible defense for our attacking unit.&lt;br /&gt;
&lt;br /&gt;
                  for(size_t n = 0; n != 6; ++n) {&lt;br /&gt;
                      typedef move_map::const_iterator Itor;&lt;br /&gt;
                      std::pair&amp;lt;Itor,Itor&amp;gt; range = dstsrc.equal_range(adjacent_tiles[n]);&lt;br /&gt;
&lt;br /&gt;
If you don't understand how ''equal_range'' works, then look up documentation on how the standard container multimap works.  ''range'' now refers to all the possible movements that can end&lt;br /&gt;
with our unit being at ''adjacent_tiles[n]''.  Let's iterate over all those movements, and find if any of them give a better defensive rating than our current best defense.  We'll start our iteration by creating some aliases that ensure we don't go crazy ;)&lt;br /&gt;
&lt;br /&gt;
                      while(range.first != range.second) {&lt;br /&gt;
                          const location&amp;amp; dst = range.first-&amp;gt;first;&lt;br /&gt;
                          const location&amp;amp; src = range.first-&amp;gt;second;&lt;br /&gt;
&lt;br /&gt;
Now let's find out about the unit that we're planning to send to this destination:&lt;br /&gt;
&lt;br /&gt;
                          const unit_map::const_iterator un = get_info().units.find(src);&lt;br /&gt;
                          assert(un != get_info().units.end());&lt;br /&gt;
&lt;br /&gt;
We can assume that the unit is in that location (hence the assert), because ''calculate_possible_moves()'' said that it's the possible source of a move.  Let's find out the type of terrain we're planning to move to:&lt;br /&gt;
&lt;br /&gt;
                          const gamemap::TERRAIN terrain = get_info().map.get_terrain(dst);&lt;br /&gt;
&lt;br /&gt;
Okay, so we have the unit, and we have the terrain, now we should be able to find out the unit's defensive rating on this terrain.&lt;br /&gt;
The ''unit'' class has a convenient ''defense_modifier()'' function which will tell us the chance of hitting that unit on a certain terrain.&lt;br /&gt;
&lt;br /&gt;
                          const int chance_to_hit = un-&amp;gt;second.defense_modifier(get_info().map,terrain);&lt;br /&gt;
&lt;br /&gt;
So, now we have all that, if it's the best chance to hit we've seen so far, or we haven't seen any other chances to hit at all, then we add it as our best option seen.&lt;br /&gt;
&lt;br /&gt;
                          if(best_defense == -1 || chance_to_hit &amp;lt; best_defense) {&lt;br /&gt;
                              best_defense = chance_to_hit;&lt;br /&gt;
                              best_movement = *range.first;&lt;br /&gt;
                          }&lt;br /&gt;
&lt;br /&gt;
That's it for these two loops. Iterate and close:&lt;br /&gt;
&lt;br /&gt;
                          ++range.first;&lt;br /&gt;
                      }&lt;br /&gt;
                  }&lt;br /&gt;
&lt;br /&gt;
Now if we found a possible move, best_defense will not be -1,&lt;br /&gt;
and the movement will be stored in ''best_movement''.  So, if ''best_defense'' is -1, we want to move from ''best_movement.second'' to ''best_movement.first''.&lt;br /&gt;
&lt;br /&gt;
                  if(best_defense != -1) {&lt;br /&gt;
                      move_unit(best_movement.second,best_movement.first,possible_moves);&lt;br /&gt;
&lt;br /&gt;
Remember that ''possible_moves'' thing?  That comes in useful here, where we have to give it to the display object so it can know the path to move the unit along.  This is the only time we need to touch it.&lt;br /&gt;
&lt;br /&gt;
Immediately after moving, we want to attack.  First we need to know which weapon to use.  We'll write a ''choose_weapon()''&lt;br /&gt;
function later which will choose our weapon.  It'll have to take the location of the attacker and the location of the defender, and it'll return an int referring to our weapon of choice.  For now we'll just make use of this function:&lt;br /&gt;
&lt;br /&gt;
                      const int weapon = choose_weapon(best_movement.first,i-&amp;gt;first);&lt;br /&gt;
                      attack_enemy(best_movement.first,i-&amp;gt;first,weapon);&lt;br /&gt;
&lt;br /&gt;
This will implement our attack.  What now?  We've attacked once, but we want to attack with as many units as we can attack with, right?  We can't use the same move_maps again, because they'll be invalid now that we've moved and attacked. What we'll do is we'll call ''do_attacks()'' all over again, recursively, and return immediately.  This way all our maps will be recalculated.&lt;br /&gt;
&lt;br /&gt;
                       do_attacks();&lt;br /&gt;
                       return;&lt;br /&gt;
                   }&lt;br /&gt;
               }&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
That's the entire function done.  It'll keep attacking while it finds attacks, and when it finally runs out of attacks to execute, it'll return nicely. Let's write that ''choose_weapon()'' function now:&lt;br /&gt;
&lt;br /&gt;
  int choose_weapon(const location&amp;amp; attacker, const location&amp;amp; defender) {&lt;br /&gt;
      const unit_map::const_iterator att = get_info().units.find(attacker);&lt;br /&gt;
      assert(att != get_info().units.end());&lt;br /&gt;
&lt;br /&gt;
      const std::vector&amp;lt;a ttack_type&amp;gt;&amp;amp; attacks = att-&amp;gt;second.attacks();&lt;br /&gt;
&lt;br /&gt;
unit contains a convenient ''attacks()'' function which returns a vector of all a unit's possible attacks.  We'll store the&lt;br /&gt;
best attack found so far, and iterate over all attacks:&lt;br /&gt;
&lt;br /&gt;
      int best_attack_rating = -1;&lt;br /&gt;
      int best_attack = -1;&lt;br /&gt;
      for(int n = 0; n != attacks.size(); ++n) {&lt;br /&gt;
&lt;br /&gt;
There is a nice function called ''evaluate_battle_stats()'' in '''actions.hpp''' which will give us all sorts of information about a potential battle. We make use of it here:&lt;br /&gt;
&lt;br /&gt;
          const battle_stats stats = evaluate_battle_stats(get_info().map,&lt;br /&gt;
                attacker, defender, n, get_info().units,&lt;br /&gt;
                get_info().state, get_info().gameinfo, 0, false);&lt;br /&gt;
&lt;br /&gt;
A rather complicated function call, but most of the parameters can be pulled straight from ''get_info()''.  The last two parameters are a little confusing.  The first one of these, ''attacker_terrain_override'', is used if we wanted to know what the combat would look like if the attacker was on different terrain to what it is on now.  If this is non-0, the function will assume the attacker is on the type of terrain given.  This is useful if you want to test the possibility of moving to many different hexes without actually moving there.  The last parameter is false, meaning that strings won't be included in the results.  Strings are useful for showing to a player in a dialog,&lt;br /&gt;
but not useful for an AI, and are expensive to calculate, so this should always be false from within AI algorithms.&lt;br /&gt;
&lt;br /&gt;
Let's use our stats to come up with a rating for this attack:&lt;br /&gt;
&lt;br /&gt;
           const int attack_rating = stats.damage_defender_takes*stats.nattacks*stats.chance_to_hit_defender;&lt;br /&gt;
&lt;br /&gt;
Now if this is the best attack, we can use it,&lt;br /&gt;
&lt;br /&gt;
           if(best_attack == -1 || attack_rating &amp;gt; best_attack_rating) {&lt;br /&gt;
               best_attack = n;&lt;br /&gt;
               best_attack_rating = attack_rating;&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       return best_attack;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Now we're done with that, we can move onto our ''get_villages()'' function.  We start off by calculating possible moves,&lt;br /&gt;
&lt;br /&gt;
  void get_villages() {&lt;br /&gt;
      std::map&amp;lt;location,paths&amp;gt; possible_moves;&lt;br /&gt;
      move_map srcdst, dstsrc;&lt;br /&gt;
      calculate_possible_moves(possible_moves,srcdst,dstsrc,false);&lt;br /&gt;
&lt;br /&gt;
Now it's a simple matter of iterating over possible destinations,&lt;br /&gt;
and seeing if they are villages not controlled by us:&lt;br /&gt;
&lt;br /&gt;
      for(move_map::const_iterator i = dstsrc.begin(); i != dstsrc.end(); ++i) {&lt;br /&gt;
          if(get_info().map.is_village(i-&amp;gt;first) &amp;amp;&amp;amp;&lt;br /&gt;
              current_team().owns_village(i-&amp;gt;first) == false) {&lt;br /&gt;
&lt;br /&gt;
First it checks whether the destination is a village.  The right side of the ''&amp;amp;&amp;amp;'' simply sees if our team owns the village at that location or not. If we don't own the village, we've found the movement we want to make, and we recurse and return.&lt;br /&gt;
&lt;br /&gt;
              move_unit(i-&amp;gt;second,i-&amp;gt;first,possible_moves);&lt;br /&gt;
              get_villages();&lt;br /&gt;
              return;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Just a couple more functions now.  Firstly, ''do_moves()'' is meant to move our units toward the enemy leader. Well, there may be multiple enemies and thus more than one leader, so we'll just go for the first enemy leader we can find.  We start off by trying to find the enemy leader:&lt;br /&gt;
&lt;br /&gt;
  void move_units() {&lt;br /&gt;
      unit_map::const_iterator leader;&lt;br /&gt;
      for(leader = get_info().units.begin(); leader != get_info().units.end(); ++leader) {&lt;br /&gt;
&lt;br /&gt;
A unit is a leader if it can recruit -- so we use the ''can_recruit()'' function to test if it's a leader.&lt;br /&gt;
&lt;br /&gt;
          if(leader-&amp;gt;second.can_recruit() &amp;amp;&amp;amp; current_team().is_enemy(leader-&amp;gt;second.side())) {&lt;br /&gt;
              break;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
We better have found an enemy leader, otherwise we'll just return...&lt;br /&gt;
&lt;br /&gt;
      if(leader == get_info().units.end())&lt;br /&gt;
          return;&lt;br /&gt;
&lt;br /&gt;
Now, let's find all our unit's possible moves:&lt;br /&gt;
&lt;br /&gt;
      std::map&amp;lt;location,paths&amp;gt; possible_moves;&lt;br /&gt;
      move_map srcdst, dstsrc;&lt;br /&gt;
      calculate_possible_moves(possible_moves,srcdst,dstsrc,false);&lt;br /&gt;
&lt;br /&gt;
We want to find the move that'll take us as close as possible to the enemy leader.  Let's make our variables to show us the best move so far,&lt;br /&gt;
&lt;br /&gt;
      int closest_distance = -1;&lt;br /&gt;
      std::pair&amp;lt;location,location&amp;gt; closest_move;&lt;br /&gt;
&lt;br /&gt;
Now iterate and find the destination closest to the enemy leader:&lt;br /&gt;
&lt;br /&gt;
      for(move_map::const_iterator i = dstsrc.begin(); i != dstsrc.end(); ++i) {&lt;br /&gt;
          const int distance = distance_between(i-&amp;gt;first,leader-&amp;gt;first);&lt;br /&gt;
          if(closest_distance == -1 || distance &amp;lt; closest_distance) {&lt;br /&gt;
              closest_distance = distance;&lt;br /&gt;
              closest_move = *i;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
If ''closest_distance'' is not -1, we've found a valid move that'll take one of our units toward the enemy leader.  We can make the move and recurse&lt;br /&gt;
&lt;br /&gt;
      if(closest_distance != -1) {&lt;br /&gt;
          move_unit(closest_move.second,closest_move.first,possible_moves);&lt;br /&gt;
          do_moves();&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Okay, all our movement functions are done!  Now all we've got left is the recruitment function. We start by getting the units that we can recruit.&lt;br /&gt;
&lt;br /&gt;
  void do_recruitment() {&lt;br /&gt;
      const std::set&amp;lt;std::string&amp;gt;&amp;amp; options = current_team().recruits();&lt;br /&gt;
&lt;br /&gt;
We can choose the number of a unit to recruit at random:&lt;br /&gt;
&lt;br /&gt;
      const int choice = (rand()%options.size());&lt;br /&gt;
      std::set&amp;lt;std::string&amp;gt;::const_iterator i = options.begin();&lt;br /&gt;
      std::advance(i,choice);&lt;br /&gt;
      const bool res = recruit(*i);&lt;br /&gt;
&lt;br /&gt;
And if the recruitment succeeds, we will try to recruit another unit,&lt;br /&gt;
&lt;br /&gt;
      if(res) {&lt;br /&gt;
          do_recruitment();&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
That's it! We've made our ''sample_ai''.  All we have to do is add it to ''create_ai'' in '''ai.cpp''' and we're done!&lt;br /&gt;
&lt;br /&gt;
== AI - specific parameters ==&lt;br /&gt;
&lt;br /&gt;
 wesnoth --multiplayer --controller1=ai --controller2=ai --algorithm1=z_ai --algorithm2=sample_ai&lt;br /&gt;
&lt;br /&gt;
Use the ''--nogui'' switch before ''--multiplayer'' to make the game run without displaying a GUI.  The winner will be reported on stdout.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[DeveloperResources]]&lt;br /&gt;
* [[PythonTestScript]] - Simple Python AI test script&lt;br /&gt;
&lt;br /&gt;
[[Category:Create]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23813</id>
		<title>WesnothdDesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23813"/>
		<updated>2008-03-19T01:59:04Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* The string_span class */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wesnothd Design =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This page documents the design of wesnothd, Wesnoth's multiplayer server. This document was written after I (Dave) re-designed wesnothd to try and make it more efficient.&lt;br /&gt;
&lt;br /&gt;
Wesnothd is a network server written in C++. It shares some of Wesnoth's code, in particular the networking code. Wesnothd manages requests from Wesnoth, that are sent in WML. It manages a lobby of players who can chat with each other, create games, join games, observe games, and so forth. Wesnothd maintains a list of games, users, and so forth. Wesnothd largely operates by relaying messages to the appropriate clients. For instance, if a player in a game makes a move, wesnothd will relay this to all clients who are participating in the game. Wesnothd may also perform appropriate filtering and so forth, and allows administrators to administer a game by kicking or banning users and so forth.&lt;br /&gt;
&lt;br /&gt;
== simple_wml ==&lt;br /&gt;
&lt;br /&gt;
Wesnothd originally used the same WML module, the config object, and serialization code as Wesnoth. This allowed code reuse and easy interoperability. However, Wesnoth's WML module is designed for ease of use by coders, and supports rich functionality, parsing user-written WML. This approach proved to be inefficient for wesnothd. config objects store all name/value pairs in attributes and element names as std::string objects. This typically means a dynamically allocated buffer for each and every name and value and element name. This leads to slow parsing as well as high memory use.&lt;br /&gt;
&lt;br /&gt;
Since wesnothd uses WML in a relatively limited way, a specialized WML parser and in-memory representation was developed, called simple_wml. Simple_wml can parse only a subset of WML: it assumes that all attribute values are surrounded by quotes, and that attributes are in lexicographical (alphabetical) order. This allows very quick parsing.&lt;br /&gt;
&lt;br /&gt;
Additionally, the in-memory representation has some limitations. It cannot perform near the same number of operations as config objects can.&lt;br /&gt;
&lt;br /&gt;
=== Documents vs nodes ===&lt;br /&gt;
&lt;br /&gt;
A config object is both a WML document and a node within a document. Simple_wml is different: there is a document object and a node object. A document automatically has a root node, and a node may create child nodes. Nodes may not be transferred between documents (except by swapping documents; see below).&lt;br /&gt;
&lt;br /&gt;
Nodes all track their parents, as well as the document that owns them. This approach allows for several important optimizations.&lt;br /&gt;
&lt;br /&gt;
=== The string_span class ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml defines a string_span class. A string_span is a portion of a string: a pointer to a buffer, and the size of the buffer. A string_span is not seen as owning the string it points into. Rather, it is an immutable 'view' of a part of a string.&lt;br /&gt;
&lt;br /&gt;
All attribute names and values and element names in simple_wml nodes are stored as string_spans. This often allows allocation to be minimized or avoided.&lt;br /&gt;
&lt;br /&gt;
=== Ownership semantics ===&lt;br /&gt;
&lt;br /&gt;
A document contains a vector with a list of all buffers it is considered to 'own'. These are buffers its nodes depend on (i.e. string_spans within the nodes refer to within these buffers). When the document is destroyed it will free these buffers.&lt;br /&gt;
&lt;br /&gt;
A document may be constructed by a text buffer or a gzip compressed buffer. The caller may transfer control of the buffer to the document. If it does not, the document will make a copy of the buffer. If the buffer is compressed, the document will make an uncompressed version. The buffer will be added as an owned buffer.&lt;br /&gt;
&lt;br /&gt;
The document will then parse the text buffer, creating nodes. All the nodes will initialize their string_spans for element and attribute values pointing into the text buffer being parsed.&lt;br /&gt;
&lt;br /&gt;
This means that when a WML document is parsed, it will only allocate the node objects. All strings will simply point into the buffer for the document.&lt;br /&gt;
&lt;br /&gt;
Of course, nodes within a WML document might be modified programmatically. Nodes have several methods for setting an attribute, which each have different ownership semantics for the buffers being set:&lt;br /&gt;
&lt;br /&gt;
set_attr(const char* name, const char* value): this function will take two C-style strings, and refer to them with string_spans. The strings are NOT copied. Rather, it is the responsibility of the caller to ensure that these buffers will remain valid throughout the lifetime of the document. This is most often ensured by using data in static memory as input. For instance, you might call some_node.set_attr(&amp;quot;has_object, &amp;quot;1&amp;quot;); Because you pass string literals in, you know the memory is guaranteed to be valid through the life of the program.&lt;br /&gt;
&lt;br /&gt;
This method is very efficient, since no allocation takes place&lt;br /&gt;
&lt;br /&gt;
set_attr_dup(const char* name, const char* value): this function will take two C-style strings. The name will be treated as in set_attr, but a copy will be made of the value. The buffer the copy is made in will be stored as an owned buffer of the document, and so will be destroyed when the document is destroyed.&lt;br /&gt;
&lt;br /&gt;
A copy of the name is not made, since having a dynamically generated name is not common, and usually one can use a string literal.&lt;br /&gt;
&lt;br /&gt;
set_attr_dup_name_and_value(const char* name, const char* value): This function works as above, but duplicates both the name and value.&lt;br /&gt;
&lt;br /&gt;
set_child(const char* name): this function creates a new child node and returns a reference to it. The name will be treated as in set_attr(), with no copy being made; it should be in static memory.&lt;br /&gt;
&lt;br /&gt;
It is also possible to duplicate a buffer and make it owned by the document manually. The document class contains a dup_string() method which duplicates a string buffer and stores it as owned by the document.&lt;br /&gt;
&lt;br /&gt;
=== Cool simple_wml optimizations ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml allows for some very nice optimizations. When a document is constructed by parsing, every node contains a string_span referring to the portion of the buffer that it was parsed from. Every node also keeps track of whether it has been modified since parsing or not. When a node is modified, it walks up its parents and marks each one as 'dirty' -- i.e. modified.&lt;br /&gt;
&lt;br /&gt;
When a simple_wml document is output, it will look and see if the root node is dirty. If the root node is not dirty, then the document has not been modified since parsing. We still have access to the buffer that the document was parsed from, so we can simply spit it back out, and do no work in emitting the document.&lt;br /&gt;
&lt;br /&gt;
Additionally, each node contains the portion of the buffer it was parsed from. If the document was modified, then nodes that are dirty will output themselves, but nodes that are not dirty will simply output the portion of the buffer they were parsed from.&lt;br /&gt;
&lt;br /&gt;
Also, when outputting, we generate a full, compact text document. The string_spans in the nodes will, after outputting themselves to the output buffer, be reassigned to point into the output buffer, instead of where they were pointing before. This means that after output is complete, all of our string_spans will be pointing into the output buffer. This means that all other buffers are no longer needed, and will be released by the document.&lt;br /&gt;
&lt;br /&gt;
A simple_wml document can also be queried for its compressed (gzipped) form, ready for sending over the network. If it is parsed from a gzipped buffer, it will keep a reference to this. If the document is not dirty, it will return this gzipped buffer. If it does not have the buffer, or is dirty, then it will generate the text output, compress it, and also cache the gzipped version.&lt;br /&gt;
&lt;br /&gt;
Documents support a compress operation which will store a gzipped buffer of the document, and delete the text buffer and all the nodes and any other buffers. The document will automatically re-construct the nodes if the root node is ever queried for in code. This is very useful if one wants to store a document and perhaps transmit it over the network but it's unlikely that further operations will be performend on the document.&lt;br /&gt;
&lt;br /&gt;
Documents support a swap() operation that allows the contents of two documents to be swapped. This is relatively inexpensive since it simply twiddles pointers. It is very useful, for instance, to populate a long-held document containing level data for a game with the game's definition sent by a client.&lt;br /&gt;
&lt;br /&gt;
This all implies that simple_wml is very efficient at being used to store WML portions sent by clients, and then re-transmit to other clients.&lt;br /&gt;
&lt;br /&gt;
=== simple_wml vs regular WML ===&lt;br /&gt;
&lt;br /&gt;
Performance tests show simple_wml to be MUCH faster than WML used in Wesnoth. Parsing a WML document is between 10 and 30 times faster with simple_wml. Of course, benefits of simple_wml include smart optimizations to try and avoid parsing and outputting at all when unnecessary.&lt;br /&gt;
&lt;br /&gt;
It should be noted though that simple_wml is 'simple' in that it is a stripped down, simplified version of WML. It itself is NOT 'simple' to use, and should never be considered for use in main Wesnoth code. It is very complicated to use, and should not be touched at all except by experienced C++ developers.&lt;br /&gt;
&lt;br /&gt;
== The network layer ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth network layer originally transmitted only config objects. One called send_data with a config object, and the network layer would serialize it and send it to the given socket. Unfortunately this is rather inefficient from a server's perspective, not least because it means that the config object will have to be serialized and compressed for each client. Additionally, of course, it ties one to config objects.&lt;br /&gt;
&lt;br /&gt;
The network layer was thus given additional 'raw' send functions, which allow one to send a raw buffer. Wesnothd uses this to get the gzipped version of documents and send them. Additionally, a flag was added to the network layer to make it receive in 'raw' mode too, allowing one to get a vector&amp;lt;char&amp;gt; containing a buffer which would then be used to construct a simple_wml document.&lt;br /&gt;
&lt;br /&gt;
=== Sharding the network layer ===&lt;br /&gt;
&lt;br /&gt;
The network layer was also refactored to make it scale better. The network layer uses blocking socket operations to send and receive data. Of course, it is intractable for the server to block when communicating with a client, so these operations are performed in worker threads. When one sends data, one places the data in a queue and sends a signal to a worker thread which wakes up and processes the queue. A pool of worker threads operate on the queue. Similarly this pool of threads handles incoming requests, using select() to block until data is available.&lt;br /&gt;
&lt;br /&gt;
This approach created performance problems with the queue that would have to be accessed from the main thread and from this pool of worker threads. A mutex would have to be locked, and many times threads would block on this mutex, all having to access the same queue.&lt;br /&gt;
&lt;br /&gt;
This problem was alleviated by sharding the system: A #define NUM_SHARDS was introduced. The recommended value for this macro is 7 when compiling wesnothd. Instead of one queue and mutex, an array of NUM_SHARDS queues and mutexes is kept. Every socket is hashed into one of these shards based on its memory address. There are also NUM_SHARDS pools of worker threads available. When the main thread queues data, it only has to lock the mutex for the shard it is accessing, meaning worker threads on other shards are not blocked. Similarly for receiving data. This greatly reduces contention amongst threads.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23812</id>
		<title>WesnothdDesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23812"/>
		<updated>2008-03-19T01:54:27Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wesnothd Design =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This page documents the design of wesnothd, Wesnoth's multiplayer server. This document was written after I (Dave) re-designed wesnothd to try and make it more efficient.&lt;br /&gt;
&lt;br /&gt;
Wesnothd is a network server written in C++. It shares some of Wesnoth's code, in particular the networking code. Wesnothd manages requests from Wesnoth, that are sent in WML. It manages a lobby of players who can chat with each other, create games, join games, observe games, and so forth. Wesnothd maintains a list of games, users, and so forth. Wesnothd largely operates by relaying messages to the appropriate clients. For instance, if a player in a game makes a move, wesnothd will relay this to all clients who are participating in the game. Wesnothd may also perform appropriate filtering and so forth, and allows administrators to administer a game by kicking or banning users and so forth.&lt;br /&gt;
&lt;br /&gt;
== simple_wml ==&lt;br /&gt;
&lt;br /&gt;
Wesnothd originally used the same WML module, the config object, and serialization code as Wesnoth. This allowed code reuse and easy interoperability. However, Wesnoth's WML module is designed for ease of use by coders, and supports rich functionality, parsing user-written WML. This approach proved to be inefficient for wesnothd. config objects store all name/value pairs in attributes and element names as std::string objects. This typically means a dynamically allocated buffer for each and every name and value and element name. This leads to slow parsing as well as high memory use.&lt;br /&gt;
&lt;br /&gt;
Since wesnothd uses WML in a relatively limited way, a specialized WML parser and in-memory representation was developed, called simple_wml. Simple_wml can parse only a subset of WML: it assumes that all attribute values are surrounded by quotes, and that attributes are in lexicographical (alphabetical) order. This allows very quick parsing.&lt;br /&gt;
&lt;br /&gt;
Additionally, the in-memory representation has some limitations. It cannot perform near the same number of operations as config objects can.&lt;br /&gt;
&lt;br /&gt;
=== Documents vs nodes ===&lt;br /&gt;
&lt;br /&gt;
A config object is both a WML document and a node within a document. Simple_wml is different: there is a document object and a node object. A document automatically has a root node, and a node may create child nodes. Nodes may not be transferred between documents (except by swapping documents; see below).&lt;br /&gt;
&lt;br /&gt;
Nodes all track their parents, as well as the document that owns them. This approach allows for several important optimizations.&lt;br /&gt;
&lt;br /&gt;
=== The string_span class ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml defines a string_span class. A string_span is a portion of a string: a pointer to a buffer, and the size of the buffer. A string_span is not seen as owning the string it points into. Rather, it is an immutable 'view' of a part of a string.&lt;br /&gt;
&lt;br /&gt;
All attributes and names in simple_wml nodes are stored as string_spans. This often allows allocation to be minimized or avoided.&lt;br /&gt;
&lt;br /&gt;
=== Ownership semantics ===&lt;br /&gt;
&lt;br /&gt;
A document contains a vector with a list of all buffers it is considered to 'own'. These are buffers its nodes depend on (i.e. string_spans within the nodes refer to within these buffers). When the document is destroyed it will free these buffers.&lt;br /&gt;
&lt;br /&gt;
A document may be constructed by a text buffer or a gzip compressed buffer. The caller may transfer control of the buffer to the document. If it does not, the document will make a copy of the buffer. If the buffer is compressed, the document will make an uncompressed version. The buffer will be added as an owned buffer.&lt;br /&gt;
&lt;br /&gt;
The document will then parse the text buffer, creating nodes. All the nodes will initialize their string_spans for element and attribute values pointing into the text buffer being parsed.&lt;br /&gt;
&lt;br /&gt;
This means that when a WML document is parsed, it will only allocate the node objects. All strings will simply point into the buffer for the document.&lt;br /&gt;
&lt;br /&gt;
Of course, nodes within a WML document might be modified programmatically. Nodes have several methods for setting an attribute, which each have different ownership semantics for the buffers being set:&lt;br /&gt;
&lt;br /&gt;
set_attr(const char* name, const char* value): this function will take two C-style strings, and refer to them with string_spans. The strings are NOT copied. Rather, it is the responsibility of the caller to ensure that these buffers will remain valid throughout the lifetime of the document. This is most often ensured by using data in static memory as input. For instance, you might call some_node.set_attr(&amp;quot;has_object, &amp;quot;1&amp;quot;); Because you pass string literals in, you know the memory is guaranteed to be valid through the life of the program.&lt;br /&gt;
&lt;br /&gt;
This method is very efficient, since no allocation takes place&lt;br /&gt;
&lt;br /&gt;
set_attr_dup(const char* name, const char* value): this function will take two C-style strings. The name will be treated as in set_attr, but a copy will be made of the value. The buffer the copy is made in will be stored as an owned buffer of the document, and so will be destroyed when the document is destroyed.&lt;br /&gt;
&lt;br /&gt;
A copy of the name is not made, since having a dynamically generated name is not common, and usually one can use a string literal.&lt;br /&gt;
&lt;br /&gt;
set_attr_dup_name_and_value(const char* name, const char* value): This function works as above, but duplicates both the name and value.&lt;br /&gt;
&lt;br /&gt;
set_child(const char* name): this function creates a new child node and returns a reference to it. The name will be treated as in set_attr(), with no copy being made; it should be in static memory.&lt;br /&gt;
&lt;br /&gt;
It is also possible to duplicate a buffer and make it owned by the document manually. The document class contains a dup_string() method which duplicates a string buffer and stores it as owned by the document.&lt;br /&gt;
&lt;br /&gt;
=== Cool simple_wml optimizations ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml allows for some very nice optimizations. When a document is constructed by parsing, every node contains a string_span referring to the portion of the buffer that it was parsed from. Every node also keeps track of whether it has been modified since parsing or not. When a node is modified, it walks up its parents and marks each one as 'dirty' -- i.e. modified.&lt;br /&gt;
&lt;br /&gt;
When a simple_wml document is output, it will look and see if the root node is dirty. If the root node is not dirty, then the document has not been modified since parsing. We still have access to the buffer that the document was parsed from, so we can simply spit it back out, and do no work in emitting the document.&lt;br /&gt;
&lt;br /&gt;
Additionally, each node contains the portion of the buffer it was parsed from. If the document was modified, then nodes that are dirty will output themselves, but nodes that are not dirty will simply output the portion of the buffer they were parsed from.&lt;br /&gt;
&lt;br /&gt;
Also, when outputting, we generate a full, compact text document. The string_spans in the nodes will, after outputting themselves to the output buffer, be reassigned to point into the output buffer, instead of where they were pointing before. This means that after output is complete, all of our string_spans will be pointing into the output buffer. This means that all other buffers are no longer needed, and will be released by the document.&lt;br /&gt;
&lt;br /&gt;
A simple_wml document can also be queried for its compressed (gzipped) form, ready for sending over the network. If it is parsed from a gzipped buffer, it will keep a reference to this. If the document is not dirty, it will return this gzipped buffer. If it does not have the buffer, or is dirty, then it will generate the text output, compress it, and also cache the gzipped version.&lt;br /&gt;
&lt;br /&gt;
Documents support a compress operation which will store a gzipped buffer of the document, and delete the text buffer and all the nodes and any other buffers. The document will automatically re-construct the nodes if the root node is ever queried for in code. This is very useful if one wants to store a document and perhaps transmit it over the network but it's unlikely that further operations will be performend on the document.&lt;br /&gt;
&lt;br /&gt;
Documents support a swap() operation that allows the contents of two documents to be swapped. This is relatively inexpensive since it simply twiddles pointers. It is very useful, for instance, to populate a long-held document containing level data for a game with the game's definition sent by a client.&lt;br /&gt;
&lt;br /&gt;
This all implies that simple_wml is very efficient at being used to store WML portions sent by clients, and then re-transmit to other clients.&lt;br /&gt;
&lt;br /&gt;
=== simple_wml vs regular WML ===&lt;br /&gt;
&lt;br /&gt;
Performance tests show simple_wml to be MUCH faster than WML used in Wesnoth. Parsing a WML document is between 10 and 30 times faster with simple_wml. Of course, benefits of simple_wml include smart optimizations to try and avoid parsing and outputting at all when unnecessary.&lt;br /&gt;
&lt;br /&gt;
It should be noted though that simple_wml is 'simple' in that it is a stripped down, simplified version of WML. It itself is NOT 'simple' to use, and should never be considered for use in main Wesnoth code. It is very complicated to use, and should not be touched at all except by experienced C++ developers.&lt;br /&gt;
&lt;br /&gt;
== The network layer ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth network layer originally transmitted only config objects. One called send_data with a config object, and the network layer would serialize it and send it to the given socket. Unfortunately this is rather inefficient from a server's perspective, not least because it means that the config object will have to be serialized and compressed for each client. Additionally, of course, it ties one to config objects.&lt;br /&gt;
&lt;br /&gt;
The network layer was thus given additional 'raw' send functions, which allow one to send a raw buffer. Wesnothd uses this to get the gzipped version of documents and send them. Additionally, a flag was added to the network layer to make it receive in 'raw' mode too, allowing one to get a vector&amp;lt;char&amp;gt; containing a buffer which would then be used to construct a simple_wml document.&lt;br /&gt;
&lt;br /&gt;
=== Sharding the network layer ===&lt;br /&gt;
&lt;br /&gt;
The network layer was also refactored to make it scale better. The network layer uses blocking socket operations to send and receive data. Of course, it is intractable for the server to block when communicating with a client, so these operations are performed in worker threads. When one sends data, one places the data in a queue and sends a signal to a worker thread which wakes up and processes the queue. A pool of worker threads operate on the queue. Similarly this pool of threads handles incoming requests, using select() to block until data is available.&lt;br /&gt;
&lt;br /&gt;
This approach created performance problems with the queue that would have to be accessed from the main thread and from this pool of worker threads. A mutex would have to be locked, and many times threads would block on this mutex, all having to access the same queue.&lt;br /&gt;
&lt;br /&gt;
This problem was alleviated by sharding the system: A #define NUM_SHARDS was introduced. The recommended value for this macro is 7 when compiling wesnothd. Instead of one queue and mutex, an array of NUM_SHARDS queues and mutexes is kept. Every socket is hashed into one of these shards based on its memory address. There are also NUM_SHARDS pools of worker threads available. When the main thread queues data, it only has to lock the mutex for the shard it is accessing, meaning worker threads on other shards are not blocked. Similarly for receiving data. This greatly reduces contention amongst threads.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23721</id>
		<title>WesnothdDesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23721"/>
		<updated>2008-03-17T06:48:04Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Cool simple_wml optimizations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wesnothd Design =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This page documents the design of wesnothd, Wesnoth's multiplayer server. This document was written after I (Dave) re-designed wesnothd to try and make it more efficient.&lt;br /&gt;
&lt;br /&gt;
Wesnothd is a network server written in C++. It shares some of Wesnoth's code, in particular the networking code. Wesnothd manages requests from Wesnoth, that are sent in WML. It manages a lobby of players who can chat with each other, create games, join games, observe games, and so forth. Wesnothd maintains a list of games, users, and so forth. Wesnothd largely operates by relaying messages to the appropriate clients. For instance, if a player in a game makes a move, wesnothd will relay this to all clients who are participating in the game. Wesnothd may also perform appropriate filtering and so forth, and allows administrators to administer a game by kicking or banning users and so forth.&lt;br /&gt;
&lt;br /&gt;
== simple_wml ==&lt;br /&gt;
&lt;br /&gt;
Wesnothd originally used the same WML module, the config object, and serialization code as Wesnoth. This allowed code reuse and easy interoperability. However, Wesnoth's WML module is designed for ease of use by coders, and supports rich functionality, parsing user-written WML. This approach proved to be inefficient for wesnothd. config objects store all name/value pairs in attributes and element names as std::string objects. This typically means a dynamically allocated buffer for each and every name and value and element name. This leads to slow parsing as well as high memory use.&lt;br /&gt;
&lt;br /&gt;
Since wesnothd uses WML in a relatively limited way, a specialized WML parser and in-memory representation was developed, called simple_wml. Simple_wml can parse only a subset of WML: it assumes that all attribute names are surrounded by quotes, and that attributes are in lexicographical (alphabetical) order. This allows very quick parsing.&lt;br /&gt;
&lt;br /&gt;
Additionally, the in-memory representation has some limitations. It cannot perform near the same number of operations as config objects can.&lt;br /&gt;
&lt;br /&gt;
=== Documents vs nodes ===&lt;br /&gt;
&lt;br /&gt;
A config object is both a WML document and a node within a document. Simple_wml is different: there is a document object and a node object. A document automatically has a root node, and a node may create child nodes. Nodes may not be transferred between documents (except by swapping documents; see below).&lt;br /&gt;
&lt;br /&gt;
Nodes all track their parents, as well as the document that owns them. This approach allows for several important optimizations.&lt;br /&gt;
&lt;br /&gt;
=== The string_span class ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml defines a string_span class. A string_span is a portion of a string: a pointer to a buffer, and the size of the buffer. A string_span is not seen as owning the string it points into. Rather, it is an immutable 'view' of a part of a string.&lt;br /&gt;
&lt;br /&gt;
All attributes and names in simple_wml nodes are stored as string_spans. This often allows allocation to be minimized or avoided.&lt;br /&gt;
&lt;br /&gt;
=== Ownership semantics ===&lt;br /&gt;
&lt;br /&gt;
A document contains a vector with a list of all buffers it is considered to 'own'. These are buffers its nodes depend on (i.e. string_spans within the nodes refer to within these buffers). When the document is destroyed it will free these buffers.&lt;br /&gt;
&lt;br /&gt;
A document may be constructed by a text buffer or a gzip compressed buffer. The caller may transfer control of the buffer to the document. If it does not, the document will make a copy of the buffer. If the buffer is compressed, the document will make an uncompressed version. The buffer will be added as an owned buffer.&lt;br /&gt;
&lt;br /&gt;
The document will then parse the text buffer, creating nodes. All the nodes will initialize their string_spans for element and attribute values pointing into the text buffer being parsed.&lt;br /&gt;
&lt;br /&gt;
This means that when a WML document is parsed, it will only allocate the node objects. All strings will simply point into the buffer for the document.&lt;br /&gt;
&lt;br /&gt;
Of course, nodes within a WML document might be modified programmatically. Nodes have several methods for setting an attribute, which each have different ownership semantics for the buffers being set:&lt;br /&gt;
&lt;br /&gt;
set_attr(const char* name, const char* value): this function will take two C-style strings, and refer to them with string_spans. The strings are NOT copied. Rather, it is the responsibility of the caller to ensure that these buffers will remain valid throughout the lifetime of the document. This is most often ensured by using data in static memory as input. For instance, you might call some_node.set_attr(&amp;quot;has_object, &amp;quot;1&amp;quot;); Because you pass string literals in, you know the memory is guaranteed to be valid through the life of the program.&lt;br /&gt;
&lt;br /&gt;
This method is very efficient, since no allocation takes place&lt;br /&gt;
&lt;br /&gt;
set_attr_dup(const char* name, const char* value): this function will take two C-style strings. The name will be treated as in set_attr, but a copy will be made of the value. The buffer the copy is made in will be stored as an owned buffer of the document, and so will be destroyed when the document is destroyed.&lt;br /&gt;
&lt;br /&gt;
A copy of the name is not made, since having a dynamically generated name is not common, and usually one can use a string literal.&lt;br /&gt;
&lt;br /&gt;
set_attr_dup_name_and_value(const char* name, const char* value): This function works as above, but duplicates both the name and value.&lt;br /&gt;
&lt;br /&gt;
set_child(const char* name): this function creates a new child node and returns a reference to it. The name will be treated as in set_attr(), with no copy being made; it should be in static memory.&lt;br /&gt;
&lt;br /&gt;
It is also possible to duplicate a buffer and make it owned by the document manually. The document class contains a dup_string() method which duplicates a string buffer and stores it as owned by the document.&lt;br /&gt;
&lt;br /&gt;
=== Cool simple_wml optimizations ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml allows for some very nice optimizations. When a document is constructed by parsing, every node contains a string_span referring to the portion of the buffer that it was parsed from. Every node also keeps track of whether it has been modified since parsing or not. When a node is modified, it walks up its parents and marks each one as 'dirty' -- i.e. modified.&lt;br /&gt;
&lt;br /&gt;
When a simple_wml document is output, it will look and see if the root node is dirty. If the root node is not dirty, then the document has not been modified since parsing. We still have access to the buffer that the document was parsed from, so we can simply spit it back out, and do no work in emitting the document.&lt;br /&gt;
&lt;br /&gt;
Additionally, each node contains the portion of the buffer it was parsed from. If the document was modified, then nodes that are dirty will output themselves, but nodes that are not dirty will simply output the portion of the buffer they were parsed from.&lt;br /&gt;
&lt;br /&gt;
Also, when outputting, we generate a full, compact text document. The string_spans in the nodes will, after outputting themselves to the output buffer, be reassigned to point into the output buffer, instead of where they were pointing before. This means that after output is complete, all of our string_spans will be pointing into the output buffer. This means that all other buffers are no longer needed, and will be released by the document.&lt;br /&gt;
&lt;br /&gt;
A simple_wml document can also be queried for its compressed (gzipped) form, ready for sending over the network. If it is parsed from a gzipped buffer, it will keep a reference to this. If the document is not dirty, it will return this gzipped buffer. If it does not have the buffer, or is dirty, then it will generate the text output, compress it, and also cache the gzipped version.&lt;br /&gt;
&lt;br /&gt;
Documents support a compress operation which will store a gzipped buffer of the document, and delete the text buffer and all the nodes and any other buffers. The document will automatically re-construct the nodes if the root node is ever queried for in code. This is very useful if one wants to store a document and perhaps transmit it over the network but it's unlikely that further operations will be performend on the document.&lt;br /&gt;
&lt;br /&gt;
Documents support a swap() operation that allows the contents of two documents to be swapped. This is relatively inexpensive since it simply twiddles pointers. It is very useful, for instance, to populate a long-held document containing level data for a game with the game's definition sent by a client.&lt;br /&gt;
&lt;br /&gt;
This all implies that simple_wml is very efficient at being used to store WML portions sent by clients, and then re-transmit to other clients.&lt;br /&gt;
&lt;br /&gt;
=== simple_wml vs regular WML ===&lt;br /&gt;
&lt;br /&gt;
Performance tests show simple_wml to be MUCH faster than WML used in Wesnoth. Parsing a WML document is between 10 and 30 times faster with simple_wml. Of course, benefits of simple_wml include smart optimizations to try and avoid parsing and outputting at all when unnecessary.&lt;br /&gt;
&lt;br /&gt;
It should be noted though that simple_wml is 'simple' in that it is a stripped down, simplified version of WML. It itself is NOT 'simple' to use, and should never be considered for use in main Wesnoth code. It is very complicated to use, and should not be touched at all except by experienced C++ developers.&lt;br /&gt;
&lt;br /&gt;
== The network layer ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth network layer originally transmitted only config objects. One called send_data with a config object, and the network layer would serialize it and send it to the given socket. Unfortunately this is rather inefficient from a server's perspective, not least because it means that the config object will have to be serialized and compressed for each client. Additionally, of course, it ties one to config objects.&lt;br /&gt;
&lt;br /&gt;
The network layer was thus given additional 'raw' send functions, which allow one to send a raw buffer. Wesnothd uses this to get the gzipped version of documents and send them. Additionally, a flag was added to the network layer to make it receive in 'raw' mode too, allowing one to get a vector&amp;lt;char&amp;gt; containing a buffer which would then be used to construct a simple_wml document.&lt;br /&gt;
&lt;br /&gt;
=== Sharding the network layer ===&lt;br /&gt;
&lt;br /&gt;
The network layer was also refactored to make it scale better. The network layer uses blocking socket operations to send and receive data. Of course, it is intractable for the server to block when communicating with a client, so these operations are performed in worker threads. When one sends data, one places the data in a queue and sends a signal to a worker thread which wakes up and processes the queue. A pool of worker threads operate on the queue. Similarly this pool of threads handles incoming requests, using select() to block until data is available.&lt;br /&gt;
&lt;br /&gt;
This approach created performance problems with the queue that would have to be accessed from the main thread and from this pool of worker threads. A mutex would have to be locked, and many times threads would block on this mutex, all having to access the same queue.&lt;br /&gt;
&lt;br /&gt;
This problem was alleviated by sharding the system: A #define NUM_SHARDS was introduced. The recommended value for this macro is 7 when compiling wesnothd. Instead of one queue and mutex, an array of NUM_SHARDS queues and mutexes is kept. Every socket is hashed into one of these shards based on its memory address. There are also NUM_SHARDS pools of worker threads available. When the main thread queues data, it only has to lock the mutex for the shard it is accessing, meaning worker threads on other shards are not blocked. Similarly for receiving data. This greatly reduces contention amongst threads.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23720</id>
		<title>WesnothdDesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothdDesign&amp;diff=23720"/>
		<updated>2008-03-17T06:44:30Z</updated>

		<summary type="html">&lt;p&gt;Dave: New page: = Wesnothd Design =  == Overview ==  This page documents the design of wesnothd, Wesnoth's multiplayer server. This document was written after I (Dave) re-designed wesnothd to try and make...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wesnothd Design =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This page documents the design of wesnothd, Wesnoth's multiplayer server. This document was written after I (Dave) re-designed wesnothd to try and make it more efficient.&lt;br /&gt;
&lt;br /&gt;
Wesnothd is a network server written in C++. It shares some of Wesnoth's code, in particular the networking code. Wesnothd manages requests from Wesnoth, that are sent in WML. It manages a lobby of players who can chat with each other, create games, join games, observe games, and so forth. Wesnothd maintains a list of games, users, and so forth. Wesnothd largely operates by relaying messages to the appropriate clients. For instance, if a player in a game makes a move, wesnothd will relay this to all clients who are participating in the game. Wesnothd may also perform appropriate filtering and so forth, and allows administrators to administer a game by kicking or banning users and so forth.&lt;br /&gt;
&lt;br /&gt;
== simple_wml ==&lt;br /&gt;
&lt;br /&gt;
Wesnothd originally used the same WML module, the config object, and serialization code as Wesnoth. This allowed code reuse and easy interoperability. However, Wesnoth's WML module is designed for ease of use by coders, and supports rich functionality, parsing user-written WML. This approach proved to be inefficient for wesnothd. config objects store all name/value pairs in attributes and element names as std::string objects. This typically means a dynamically allocated buffer for each and every name and value and element name. This leads to slow parsing as well as high memory use.&lt;br /&gt;
&lt;br /&gt;
Since wesnothd uses WML in a relatively limited way, a specialized WML parser and in-memory representation was developed, called simple_wml. Simple_wml can parse only a subset of WML: it assumes that all attribute names are surrounded by quotes, and that attributes are in lexicographical (alphabetical) order. This allows very quick parsing.&lt;br /&gt;
&lt;br /&gt;
Additionally, the in-memory representation has some limitations. It cannot perform near the same number of operations as config objects can.&lt;br /&gt;
&lt;br /&gt;
=== Documents vs nodes ===&lt;br /&gt;
&lt;br /&gt;
A config object is both a WML document and a node within a document. Simple_wml is different: there is a document object and a node object. A document automatically has a root node, and a node may create child nodes. Nodes may not be transferred between documents (except by swapping documents; see below).&lt;br /&gt;
&lt;br /&gt;
Nodes all track their parents, as well as the document that owns them. This approach allows for several important optimizations.&lt;br /&gt;
&lt;br /&gt;
=== The string_span class ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml defines a string_span class. A string_span is a portion of a string: a pointer to a buffer, and the size of the buffer. A string_span is not seen as owning the string it points into. Rather, it is an immutable 'view' of a part of a string.&lt;br /&gt;
&lt;br /&gt;
All attributes and names in simple_wml nodes are stored as string_spans. This often allows allocation to be minimized or avoided.&lt;br /&gt;
&lt;br /&gt;
=== Ownership semantics ===&lt;br /&gt;
&lt;br /&gt;
A document contains a vector with a list of all buffers it is considered to 'own'. These are buffers its nodes depend on (i.e. string_spans within the nodes refer to within these buffers). When the document is destroyed it will free these buffers.&lt;br /&gt;
&lt;br /&gt;
A document may be constructed by a text buffer or a gzip compressed buffer. The caller may transfer control of the buffer to the document. If it does not, the document will make a copy of the buffer. If the buffer is compressed, the document will make an uncompressed version. The buffer will be added as an owned buffer.&lt;br /&gt;
&lt;br /&gt;
The document will then parse the text buffer, creating nodes. All the nodes will initialize their string_spans for element and attribute values pointing into the text buffer being parsed.&lt;br /&gt;
&lt;br /&gt;
This means that when a WML document is parsed, it will only allocate the node objects. All strings will simply point into the buffer for the document.&lt;br /&gt;
&lt;br /&gt;
Of course, nodes within a WML document might be modified programmatically. Nodes have several methods for setting an attribute, which each have different ownership semantics for the buffers being set:&lt;br /&gt;
&lt;br /&gt;
set_attr(const char* name, const char* value): this function will take two C-style strings, and refer to them with string_spans. The strings are NOT copied. Rather, it is the responsibility of the caller to ensure that these buffers will remain valid throughout the lifetime of the document. This is most often ensured by using data in static memory as input. For instance, you might call some_node.set_attr(&amp;quot;has_object, &amp;quot;1&amp;quot;); Because you pass string literals in, you know the memory is guaranteed to be valid through the life of the program.&lt;br /&gt;
&lt;br /&gt;
This method is very efficient, since no allocation takes place&lt;br /&gt;
&lt;br /&gt;
set_attr_dup(const char* name, const char* value): this function will take two C-style strings. The name will be treated as in set_attr, but a copy will be made of the value. The buffer the copy is made in will be stored as an owned buffer of the document, and so will be destroyed when the document is destroyed.&lt;br /&gt;
&lt;br /&gt;
A copy of the name is not made, since having a dynamically generated name is not common, and usually one can use a string literal.&lt;br /&gt;
&lt;br /&gt;
set_attr_dup_name_and_value(const char* name, const char* value): This function works as above, but duplicates both the name and value.&lt;br /&gt;
&lt;br /&gt;
set_child(const char* name): this function creates a new child node and returns a reference to it. The name will be treated as in set_attr(), with no copy being made; it should be in static memory.&lt;br /&gt;
&lt;br /&gt;
It is also possible to duplicate a buffer and make it owned by the document manually. The document class contains a dup_string() method which duplicates a string buffer and stores it as owned by the document.&lt;br /&gt;
&lt;br /&gt;
=== Cool simple_wml optimizations ===&lt;br /&gt;
&lt;br /&gt;
Simple_wml allows for some very nice optimizations. When a document is constructed by parsing, every node contains a string_span referring to the portion of the buffer that it was parsed from. Every node also keeps track of whether it has been modified since parsing or not. When a node is modified, it walks up its parents and marks each one as 'dirty' -- i.e. modified.&lt;br /&gt;
&lt;br /&gt;
When a simple_wml document is output, it will look and see if the root node is dirty. If the root node is not dirty, then the document has not been modified since parsing. We still have access to the buffer that the document was parsed from, so we can simply spit it back out, and do no work in emitting the document.&lt;br /&gt;
&lt;br /&gt;
Additionally, each node contains the portion of the buffer it was parsed from. If the document was modified, then nodes that are dirty will output themselves, but nodes that are not dirty will simply output the portion of the buffer they were parsed from.&lt;br /&gt;
&lt;br /&gt;
Also, when outputting, we generate a full, compact text document. The string_spans in the nodes will, after outputting themselves to the output buffer, be reassigned to point into the output buffer, instead of where they were pointing before. This means that after output is complete, all of our string_spans will be pointing into the output buffer. This means that all other buffers are no longer needed, and will be released by the document.&lt;br /&gt;
&lt;br /&gt;
A simple_wml document can also be queried for its compressed (gzipped) form, ready for sending over the network. If it is parsed from a gzipped buffer, it will keep a reference to this. If the document is not dirty, it will return this gzipped buffer. If it does not have the buffer, or is dirty, then it will generate the text output, compress it, and also cache the gzipped version.&lt;br /&gt;
&lt;br /&gt;
Documents support a compress operation which will store a gzipped buffer of the document, and delete the text buffer and all the nodes and any other buffers. The document will automatically re-construct the nodes if the root node is ever queried for in code. This is very useful if one wants to store a document and perhaps transmit it over the network but it's unlikely that further operations will be performend on the document.&lt;br /&gt;
&lt;br /&gt;
This all implies that simple_wml is very efficient at being used to store WML portions sent by clients, and then re-transmit to other clients.&lt;br /&gt;
&lt;br /&gt;
=== simple_wml vs regular WML ===&lt;br /&gt;
&lt;br /&gt;
Performance tests show simple_wml to be MUCH faster than WML used in Wesnoth. Parsing a WML document is between 10 and 30 times faster with simple_wml. Of course, benefits of simple_wml include smart optimizations to try and avoid parsing and outputting at all when unnecessary.&lt;br /&gt;
&lt;br /&gt;
It should be noted though that simple_wml is 'simple' in that it is a stripped down, simplified version of WML. It itself is NOT 'simple' to use, and should never be considered for use in main Wesnoth code. It is very complicated to use, and should not be touched at all except by experienced C++ developers.&lt;br /&gt;
&lt;br /&gt;
== The network layer ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth network layer originally transmitted only config objects. One called send_data with a config object, and the network layer would serialize it and send it to the given socket. Unfortunately this is rather inefficient from a server's perspective, not least because it means that the config object will have to be serialized and compressed for each client. Additionally, of course, it ties one to config objects.&lt;br /&gt;
&lt;br /&gt;
The network layer was thus given additional 'raw' send functions, which allow one to send a raw buffer. Wesnothd uses this to get the gzipped version of documents and send them. Additionally, a flag was added to the network layer to make it receive in 'raw' mode too, allowing one to get a vector&amp;lt;char&amp;gt; containing a buffer which would then be used to construct a simple_wml document.&lt;br /&gt;
&lt;br /&gt;
=== Sharding the network layer ===&lt;br /&gt;
&lt;br /&gt;
The network layer was also refactored to make it scale better. The network layer uses blocking socket operations to send and receive data. Of course, it is intractable for the server to block when communicating with a client, so these operations are performed in worker threads. When one sends data, one places the data in a queue and sends a signal to a worker thread which wakes up and processes the queue. A pool of worker threads operate on the queue. Similarly this pool of threads handles incoming requests, using select() to block until data is available.&lt;br /&gt;
&lt;br /&gt;
This approach created performance problems with the queue that would have to be accessed from the main thread and from this pool of worker threads. A mutex would have to be locked, and many times threads would block on this mutex, all having to access the same queue.&lt;br /&gt;
&lt;br /&gt;
This problem was alleviated by sharding the system: A #define NUM_SHARDS was introduced. The recommended value for this macro is 7 when compiling wesnothd. Instead of one queue and mutex, an array of NUM_SHARDS queues and mutexes is kept. Every socket is hashed into one of these shards based on its memory address. There are also NUM_SHARDS pools of worker threads available. When the main thread queues data, it only has to lock the mutex for the shard it is accessing, meaning worker threads on other shards are not blocked. Similarly for receiving data. This greatly reduces contention amongst threads.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=23718</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=23718"/>
		<updated>2008-03-17T05:21:36Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Developer information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
What would you like to learn about Wesnoth in this wiki? [[Play]] it, [[create]] with it, [[support]] for it, [[project]] resources about it, [[credits]] of it.&lt;br /&gt;
&lt;br /&gt;
This is a page with starting points to exploring this wiki about The Battle for Wesnoth. In addition to the wiki, there's also a [http://www.wesnoth.org homepage], a [http://www.wesnoth.org/forum forum],  and a [http://gna.org/projects/wesnoth/ Gna project page].&lt;br /&gt;
&lt;br /&gt;
* [[Special:Categories|List of all page categories in this wiki]]&lt;br /&gt;
* [[Special:Allpages|List of all pages in this wiki]]&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[UsingSourceinstall]] - using GNU Source Installer to automate installation and upgrades from source (Unix-likes only)&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineCampaigns]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
* [[Replays]] - archive of replays new and old&lt;br /&gt;
* [[How to play...]] - learn more about various faction vs faction strategies&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://zapicm.freeshell.org Units] - Units advancement trees and stats&lt;br /&gt;
** [http://zapicm.freeshell.org/dev Development version]&lt;br /&gt;
** [http://zapicm.freeshell.org/stable Stable version]&lt;br /&gt;
** [http://server.wesnoth.org/~wesnoth/trunk Trunk version]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
** [http://www.wesnoth.org/wiki/Category:Factions] - list all user made factions&lt;br /&gt;
* [[Wesnoth_Acronyms_and_Slang|Wesnoth Acronyms and Slang]] - common wesnothian acronyms and slang explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
==== Scenarios &amp;amp; Campaigns ====&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[UMCSandbox]] - where you can do collaborative UMC development&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own single player campaigns&lt;br /&gt;
* [[MultiplayerCampaigns]] - how to make your own multiplayer campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
* [[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
&lt;br /&gt;
==== References ====&lt;br /&gt;
* [[ReferenceWML]] and [[AlphabeticalWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[ReferencePythonAPI]] - upcoming Python interface for AI&lt;br /&gt;
==== Tools &amp;amp; Utilities ====&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
==== Art related ====&lt;br /&gt;
* [[Create_Art#Art_Tutorials|Art Tutorials]] - help in creating art&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
* [[Tiles_Status]] - terrain tiles: proposed and in progress.&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna!&lt;br /&gt;
* [http://www.wesnoth.org/wiki/ReportingBugs#Guidelines_for_suggesting_features Guidelines for suggesting features] - To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothSVN]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[DeveloperGuide]] - for those who received SVN commit rights&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[FormulaAI]] - Guide to the experimental formula AI branch&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[EasyCoding]] - Bugs and features that are easy to implement for new coders&lt;br /&gt;
* [[NotSoEasyCoding]] - Bugs and features which are doable but lacking someone working on them&lt;br /&gt;
* [[WesnothGL]] - Guide to programming the Wesnoth OpenGL branch&lt;br /&gt;
* [[WesnothdDesign]] - Guide to the design of wesnothd, the multiplayer server.&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - completely unknown stats...&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [[WesnothFigures]] - notable figures of valorous and infamous deeds in Wesnoth&lt;br /&gt;
* [[WesnothReviews]] - third party reviews of Wesnoth&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
* [[Donate]] or [http://cafepress.com/wesnoth buy Wesnoth merchandise].&lt;br /&gt;
* [[Trailer]] - the Wesnoth trailer&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Map of Wesnoth player locations] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiHaiku]]&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;br /&gt;
* [[WikiMigration]] - we were looking for a replacement for our old wiki (and ended up using Mediawiki)&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewtopic.php?t=19462 Obsolete] - help in updating the wiki for v1.4&lt;br /&gt;
&lt;br /&gt;
[[Category:Wesnoth Wiki]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=EasyCoding&amp;diff=23401</id>
		<title>EasyCoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=EasyCoding&amp;diff=23401"/>
		<updated>2008-03-09T18:00:41Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* WML related features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Foreword ==&lt;br /&gt;
This page is here to document easy to do coding tasks. It is not here to double the feature request database, and should only be filled by people that know the code well enough to judge the difficulty of a given task. &lt;br /&gt;
&lt;br /&gt;
If you are such a person, you should feel free to edit this page.&lt;br /&gt;
&lt;br /&gt;
If you're not, you should post a feature request and discuss your idea on the forum or IRC. A coder with better knowledge of the code might give you the green light to add your feature here.&lt;br /&gt;
&lt;br /&gt;
Anybody should feel free to add &amp;quot;clues&amp;quot; to any tasks, that is entry points, traps to avoid, person to contact to discuss and so on.&lt;br /&gt;
&lt;br /&gt;
If you plan to work on a feature, write your name at the bottom of the feature, with the date. Note that if you are too long at working on a feature I'll &amp;quot;free&amp;quot; it back (that is if you're not working on it. If you have problems implementing it, just tell us....)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Boucman|Boucman]] 20:48, 3 October 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since bugs are sometimes a good opportunity to get a first idea of the code, i will add some here that are easy to fix as soon as i stumble upon them (the one i had in mind is fixed already ;-).&lt;br /&gt;
&lt;br /&gt;
--Yogi Bear, 28 February 2008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WML related features ==&lt;br /&gt;
&lt;br /&gt;
=== Side-specific results ===&lt;br /&gt;
Giving result=defeat or result=victory for specific sides. ([http://gna.org/bugs/index.php?4960 FR #4960])&lt;br /&gt;
=== Recall Event ===&lt;br /&gt;
WML event trigger for recalling (the current one triggers on both recalls and recruits) ([http://gna.org/bugs/index.php?3622 FR #3622]) (please read the comments of the report for a proper description of how this should work)&lt;br /&gt;
=== Enabling checking of damage dealt in WML ===&lt;br /&gt;
A WML variable should be set when triggering some combat-related events, allowing WML to know the amount of damage being dealt. ([http://gna.org/bugs/index.php?7673 FR #7673])&lt;br /&gt;
=== Support for leaderless multiplayergames ===&lt;br /&gt;
Add support for the WML key victory_when_enemies_defeated= in the scenario tag during multiplayergames. ([https://gna.org/bugs/index.php?8106 FR #8106])&lt;br /&gt;
== Improvements to FormulaAI ==&lt;br /&gt;
&lt;br /&gt;
Add new formula functions, or minor improvements to the formula language. Make it easier to debug the formula language.&lt;br /&gt;
=== Other Ideas ===&lt;br /&gt;
See [[FutureWML]]; some ideas there are easier than others.&lt;br /&gt;
&lt;br /&gt;
== GUI related features ==&lt;br /&gt;
=== Theme Changes ===&lt;br /&gt;
* show number of owned villages/total villages (FR: #3135) (--[[User:Alink|alink]] done but must update help, doc, tooltip...)&lt;br /&gt;
* allow custom themes to display values of WML variables ([http://gna.org/bugs/index.php?6209 FR #6209])&lt;br /&gt;
* hide the hourglass item from the statusbar when there is no timer&lt;br /&gt;
&lt;br /&gt;
=== Widget Changes ===&lt;br /&gt;
* show side number, name and team association information in the status table &lt;br /&gt;
* make games sortable in the lobby (open slots, total number of players, era, XP modifier, gold per village, fog/shroud) &lt;br /&gt;
* input history (chat, commands, ..), seek Sapient for more info and tips&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
=== More powerful village naming ===&lt;br /&gt;
'''Adding mountain names and other features to village names, having a second random name in village names'''&lt;br /&gt;
&lt;br /&gt;
Currently the village naming engine has a very good structure that could allow &lt;br /&gt;
more powerfull names to be generated. &lt;br /&gt;
Understanding how it works should be quite easy, and a few usefull improvements could be added.&lt;br /&gt;
&lt;br /&gt;
* Currently villages can use lake names and river names, this should be extended to other features like bridges, swamps, mountains etc...&lt;br /&gt;
* It would be nice to have a separate list of &amp;quot;first sylabus&amp;quot; and &amp;quot;last sylabus&amp;quot; for naming. That's not really needed in english, but some translations could use it&lt;br /&gt;
* Again, it is common to have villages with more than one &amp;quot;random&amp;quot; word in them. having a $name2 variable would be nice&lt;br /&gt;
&lt;br /&gt;
ACardboardRobot 2/2/07&lt;br /&gt;
&lt;br /&gt;
=== Debug Mode ===&lt;br /&gt;
* New debug command functionality (setting status.variables, possibly terrain, WML value display)&lt;br /&gt;
&lt;br /&gt;
== Bugs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
[[NotSoEasyCoding]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Committers]]&lt;br /&gt;
[[Category:Future]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23379</id>
		<title>SummerOfCodeIdeas</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23379"/>
		<updated>2008-03-09T17:04:58Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Describe your organization. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a compilation of ideas from ML. Needs to be refined (more detailed description, deliverables, workload estimation?):&lt;br /&gt;
&lt;br /&gt;
== I want to be one of your Google Summer of Code student, what should I do... ==&lt;br /&gt;
&lt;br /&gt;
wow wow wow&lt;br /&gt;
&lt;br /&gt;
Google hasn't announced the mentoring organisations yet and wesnoth might not be choosen at all.&lt;br /&gt;
&lt;br /&gt;
the following paragraph is here to have something ready if we are choosen as a mentoring organisation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is a quick list of things to do to get you started&lt;br /&gt;
* Create an account on gna.org&lt;br /&gt;
* Create an account on the wesnoth forum&lt;br /&gt;
* Join the irc channel (#wesnoth-dev on irc.freenode.net) and introduce yourself. We will not give formal interviews, but we will clearly favor people we have learnt to know during the selection process&lt;br /&gt;
* Contact one of our SummerOfCode people (Ivanovic, Sirp, Boucman, Mordante) to have your forum nick marked as a Summer of code student&lt;br /&gt;
* Start a wiki page about your idea, add a link on this page&lt;br /&gt;
** fill the questionnaire on this page&lt;br /&gt;
** detail your idea as much as possible, look at other students pages, and please give milestones and studies you've done&lt;br /&gt;
* Though not mandatory, it is highly advised to go to the [[EasyCoding]] and [[NotSoEasyCoding]] pages and implement one of these ideas (or any idea of similar scope) so we have an idea how you work. Be sure to use your gna account when submitting these patches so we know who it is coming from&lt;br /&gt;
&lt;br /&gt;
== Student proposals ==&lt;br /&gt;
''please add a link to the wiki page with your idea''&lt;br /&gt;
== List of Ideas for the Project (Suggestions from the wesnoth developers) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Writing an AI based on the formula AI ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has always had a simple C++ based AI. David (our lead developer) has been working on a simple language to write AI in Wesnoth [[WesnothFormulaAIBranch]]&lt;br /&gt;
&lt;br /&gt;
The Wesnoth AI is used as an opponent in most campaigns, and as such is an important piece of code for the Wesnoth project. Unfortunately it is also one of the most neglected piece of code and a place where a lot of research and work could be done&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to develop a new AI that would replace the original C++ AI. The main criterias we would want for this new AI are&lt;br /&gt;
&lt;br /&gt;
* ''Plugability :'' It should be trivial for any content maker to change the behavior of the AI in specific case. The exact cases are still to be defined but should typically include&lt;br /&gt;
** hardwiring the first few turns of the AI&lt;br /&gt;
** changing the recruitment pattern&lt;br /&gt;
** completely controlling a given unit (scenario unit)&lt;br /&gt;
** taking control then giving back control of a given unit&lt;br /&gt;
* ''tunability :'' It should be easy for a scenario author to specify the general behaviour of the enemy on a given scenario (aggressiveness, intrepidity...)&lt;br /&gt;
* ''specific behaviours :'' there are some typical behaviours that are not smart to win the scenario but are needed, such as guarding a given unit, a given position, wandering aimlessly, attacking randomly, always fleeing. The AI should implement such behaviours, and allow easy addition of new behaviours&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* ''A minimal knowledge of C++ is required, a good knowledge of C++ is desired :'' The formula AI framework is a work in progress and chances are high that some changes in the wesnoth code base will be needed. The wesnoth developer community is used to handle people that are familiar with coding but not C++, however the Formula AI framework uses advanced C++ features and a good knowledge of the language would avoid a major hurdle when plugging in new entries or functionalities for the AI&lt;br /&gt;
* ''Good social interaction with a large player community :'' A preliminary phase to coding any AI is to know the strategies and game pattern used by human players. This requires huge interaction with the player community. Our Gameplay Developers are open and can give some good starting points, but a big game experience and good interaction with the player community will greatly help in the study of the design&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
It is hard to give milestones at this point, but here are some ideas of what could be done&lt;br /&gt;
&lt;br /&gt;
* ''AI design description, and basic function library :'' This first deliverable aims to conclude the '''study and analysis''' part of the project : becoming familiar with the formula language, study of multiplayer strategies and of the need of scenario writers with regard to AI. We would like to have a description of the code structure of the AI, some basis of the play strategies it would use and how external scenario writers could configure it for the particular behaviour they need&lt;br /&gt;
* ''Main AI delivery :'' This milestone's aim is to deliver a working AI implementing the strategies described in the first phase. It would not have to systematically beat the standard C++ AI at this point, but should be able to play the game correctly (recruit, early deployment on villages, grouping units to attack, holding its ground, protecting weak/important units). Moreover most plug-in entries should be available and a test-case for these entries should be provided.&lt;br /&gt;
* ''Fine tunning and behaviour library :'' The third phase would validate the actual strategy of the AI. The AI should consistently beat the default C++ AI, and do fairly well against an average human player. At that stage a library of scenario behaviours should also be delivered. The AI does not need to be as efficient with all scenario tweaking, but should act correctly with regard to the particular behaviour desired.&lt;br /&gt;
&lt;br /&gt;
=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
When the development team met at FOSDEM, we had our multiplayer community, though it is strong and healthy, had its growth restrained by the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
==== General Description ====&lt;br /&gt;
The general idea of this project would be&lt;br /&gt;
* To study the current lobby,&lt;br /&gt;
* To present some ideas of evolutions both in interface and functionalities of our multiplayer interface to allow it to scale to a much larger community&lt;br /&gt;
* To present some well constructed thought on our MP community and how that interface would develop it&lt;br /&gt;
* Of course to implement those changes :)&lt;br /&gt;
&lt;br /&gt;
Some ideas that we had (but that are in no way mandatory)&lt;br /&gt;
* Having a simple way to register and authenticate nicknames, similar to what IRC offers. The point is not to have cryptographically safe logins, but to have something simple that gets the job done&lt;br /&gt;
* Having a simple room system? Again, inspired by IRC&lt;br /&gt;
* Having some way to find the type of games you are interested in.&lt;br /&gt;
** game type&lt;br /&gt;
** number of free slots/players&lt;br /&gt;
** any other criteria you might find interesting&lt;br /&gt;
&lt;br /&gt;
Other ideas we are not convinced are good, but that are certainly worth studying (especially how the communities based around these concepts are different from ours)&lt;br /&gt;
* ranking players&lt;br /&gt;
* guilds&lt;br /&gt;
* official tournaments&lt;br /&gt;
* titles for players&lt;br /&gt;
* metaservers&lt;br /&gt;
* game matching when players are ranked (poker, bridge...)&lt;br /&gt;
&lt;br /&gt;
The scalability of the project, both in term of number of players, and in term of the possibility for players and developers to extend the concept will be a valued criteria&lt;br /&gt;
&lt;br /&gt;
Administration/moderation problems and techniques should also be studied&lt;br /&gt;
&lt;br /&gt;
interaction with the Add-On server/forum might be an interesting field to expand to&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* A fair amount of experience with C++ is required. Wesnoth uses some advanced C++ features and is heavily based on BOOST and STL. We can train you in some of the libraries used, but learning all of them would be a big hurdle.&lt;br /&gt;
* Experience with multiplayer games, in order to have a good idea of what multiplayer lobbies of other game look like, and (more importantly) a good idea of the social behaviours of multiple MP communities, how teams are formed in games and things like that&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
* A first milestone would be a presentation summarizing the different studies, and the proposed interface. preliminary informal stages would probably be desirable, to make sure the proposed idea is already a consensus within devs &lt;br /&gt;
** Study of other MP game-matching interfaces and functionalities&lt;br /&gt;
** Study of other MP communities&lt;br /&gt;
** Study of other MP moderation practices&lt;br /&gt;
** Study of the Wesnoth MP community, including needs, various opinons from different developers and players&lt;br /&gt;
* A second milestone would be the main code delivery. Code should be functional for it will be delivered in the next Wesnoth development release&lt;br /&gt;
&lt;br /&gt;
=== Scenario/Campaign editor ===&lt;br /&gt;
&lt;br /&gt;
Currently, in order to create campaign or multiplayer scenarios, it is necessary to manually edit WML files - XML-like configuration files. The goal of this project would be to create a graphical editor allowing the same.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
A scenario editor for Wesnoth supporting everything possible by Wesnoth's engine would be a huge project, so the scope of the actual project would of course be limited - what exactly should be implemented would be decided by initial discussion. Implementation details and choice of language/tools would also be up to the student to choose. The main ideas would be for the scenario editor to be:&lt;br /&gt;
* cross-platform (at least Linux, OSX, Windows)&lt;br /&gt;
* easy to use (someone who tries reasonably hard should be able to create a simple scenario/campaign with it, even if not knowing WML)&lt;br /&gt;
* powerful (there already is a map editor coming with Wesnoth - the scenario editor will provide more/different things)&lt;br /&gt;
* extensible (also after the SoC project, it should be easy to add additional features)&lt;br /&gt;
&lt;br /&gt;
There exist at least two attempts at a scenario editor, an OSX-only one which shipped with early Wesnoth versions, and CampGen, an external tool written in WxPython. The student could look at them for ideas or even use one of them as base, but that should be discussed first. The below assumes a new application is developed from scratch (which likely will be much more motivating for the student than reviving an existing attempt). The actual things to be done would be:&lt;br /&gt;
&lt;br /&gt;
* Decide on a cross-platform GUI which would be best suited (Qt4, Wx, GTK, Wesnoth's builtin GUI (in that case, could maybe integrate with the existing map editor, but would have serious other problems), or others...).&lt;br /&gt;
* Decide on a platform/language to use (C++, Python, or others...). Wesnoth is written in C++, so it's what most developers would prefer, but as long as it can be expected to work on Linux, OSX and Windows, this is completely open.&lt;br /&gt;
* GUI design. This is the main part of the project. The editor should make it easy to create scenarios, so the GUI must not be confusing/hard to use.&lt;br /&gt;
* Decide on base features. [[ReferenceWML]] lists everything currently supported by WML. Theoretically, the scenario editor could support everything, but for the timeframe of the SoC project, it will be necessary to decide on the most important features and implement those.&lt;br /&gt;
** WML-centric or not? Two opposite views for such an editor would be to either strictly follow WML, as extreme case have one dialog for each WML element. Or on the other hand make a scenario creation tool which completely hides WML and then simply can export to WML, translating features as necessary. The final design likely would be somewhere in between.&lt;br /&gt;
** Ability to read existing WML? The editor will export to WML, but need to decide if it also should be able to read it.&lt;br /&gt;
** Built-in map editor? Wesnoth comes with a map editor, but it can only be used to define the terrain. The scenario editor has to allow placing events and units and other things, so it will need a way to display maps as well. Would be worth investigating if the existing C++ map-drawing code of Wesnoth can be re-used.&lt;br /&gt;
** Ability to enter custom WML code? For advanced users this might be nice, if it can integrate well.&lt;br /&gt;
** Story screen editor for campaigns?&lt;br /&gt;
** How powerful should the events editor be? WML basically is a turing complete language, so must decide what should be supported and how to present to the user.&lt;br /&gt;
** Custom unit animations?&lt;br /&gt;
** Custom multi-hex terrains?&lt;br /&gt;
* Extensibility (leave the possibility to extend the application with plugins for some of the above things, either with a plugin architecture or by making the source code modular enough)&lt;br /&gt;
* WML-export. The second major part besides designing and implementing all the GUI will be exporting the result to WML, and depending on some design choices this could prove more or less hard to do.&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++. Even in case the editor is not written in C++, it will be necessary to look at some parts of Wesnoth's source code (WML-parser, editor, ...) and understand them, possibly even integrate/re-use them.&lt;br /&gt;
* Ability/interest in GUI/application design. A not negligible part of the project likely will be spent designing various GUI dialogs.&lt;br /&gt;
* Prior use of level creation tools/modding tools. Knowing existing tools for other games will help a lot in the design phase, as many good ideas can be seen there. Not required though.&lt;br /&gt;
* Having played Wesnoth and knowing what scenarios look like would help. Someone who never played Wesnoth before would risk losing a lot of precious time playing the game instead of working :) But it's not required of course.&lt;br /&gt;
* Knowledge of WML. A candidate who already knows Wesnoth's WML could save the initial time studying it. (On the other hand, not knowing WML might mean less technical bias and might lead to an application which is easer to use for non-technical users.)&lt;br /&gt;
* Ability to interact with developers/users. Presenting GUI mockups and test versions and incorporating early user feedback likely will improve the end result a lot. The Wesnoth community is big enough that there should be quite some willing testers.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
The initial design will decide on many later things, and likely a lot of talking to developers and users will be necessary. But some general milestones I'd expect:&lt;br /&gt;
* Create a base test application in the chosen language/platform. This will not do much yet, maybe load some WML and display it as text. Try to package it for Linux, OSX and Windows (there will be help from the Wesnoth community, so no need to have access to all of them), and see if it can be expected to work. If a standard GUI like C++/Qt4 is used, this will be rather trivial. Something like Python/Wx or C#/.NET might take more time.&lt;br /&gt;
* Add ability to edit some very simple, maybe only textual properties of a scenario, and export to WML. It should already have base features like Save/Load/Undo, copy/paste, multiple documents, and so on. Depending on the chosen GUI this may be easy or already require some work.&lt;br /&gt;
* Finish design. Should list the intended features and demonstrate how the GUI will work.&lt;br /&gt;
* Start implementation, a natural milestone would be to make it possible to create and export a very simple, but playable scenario.&lt;br /&gt;
* Add more of the features (which ones and in which order depends on the design above, a detailed roadmap will be part of it).&lt;br /&gt;
&lt;br /&gt;
=== Addon server ===&lt;br /&gt;
Wesnoth has an addon server which offers users to upload user &lt;br /&gt;
made content (UMC). This allows all other users of Wesnoth&lt;br /&gt;
to easily download and install this content. The server was &lt;br /&gt;
originally written for user made campaigns but contains a lot&lt;br /&gt;
more types of addons nowadays. Both the server side and the &lt;br /&gt;
client side need to be improved.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
Neither the server nor the client side of the addon server have&lt;br /&gt;
seen much improvement over the years; both are overdue for a reworking.&lt;br /&gt;
The client side GUI needs polishing. For the&lt;br /&gt;
server side we would like to allow better integration with&lt;br /&gt;
various tools (such as wmllint), which improve the quality of the addons.&lt;br /&gt;
&lt;br /&gt;
===== Server side =====&lt;br /&gt;
The server code either needs to be updated or rewritten, the student is free to make this decision him or herself. The student may choose the language for the server, but because some of the code that needs to be integrated is Python we'll need to hear a specific justification for any other choice.&lt;br /&gt;
&lt;br /&gt;
* The server only needs to run on Linux systems. Cross-platform portability would be nice but isn't  required.&lt;br /&gt;
* At the moment there's a rudimentary integration with our translation project Wescamp. This needs to be improved. Upon uploading the new content needs to be send to Wescamp (via a svn commit). And the translations need to be fetched on a regular basis.&lt;br /&gt;
* We have various tools to check the WML code and also upgrade it to newer version. The addon server needs to be able to run those tools on the content.&lt;br /&gt;
&lt;br /&gt;
===== Client side =====&lt;br /&gt;
The client side needs improvements, there are two main clients&lt;br /&gt;
the ingame version and a standalone version in Python.&lt;br /&gt;
&lt;br /&gt;
* Upgrade the GUI. Mordante is working on a new GUI library which is intended to make it possible to make the wanted changes.&lt;br /&gt;
* Make it easier to see summary and status information on addons. At the moment a lot of new users download something and have no clue what kind of addon it is.&lt;br /&gt;
* Make it easier to see whether a newer version of the addon is on the server and update the addon.&lt;br /&gt;
* Make it easy to select which translations you want to download and also look for newer versions of the translations.&lt;br /&gt;
&lt;br /&gt;
====  Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++, the game is written in C++ and modifications need to be made there. &lt;br /&gt;
* Knowledge of Python, various tools have been written in Python which need to be integrated with the new server.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
* The first step is to determine what exactly needs to be done and determine in which language the server will be rewritten. This includes, but isn't limited to:&lt;br /&gt;
** Determine the exact feature set.&lt;br /&gt;
** Protocol changes needed.&lt;br /&gt;
** Methods to integrate with both the WML tools and Wescamp with the new server.&lt;br /&gt;
** Determine the GUI for the client side.&lt;br /&gt;
** Justify the choice of language.&lt;br /&gt;
* These points will need to be presented and discussed with the mentor(s).&lt;br /&gt;
* The next thing in to implement the feature set. The code needs to be fully functional and committed in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Map editor ===&lt;br /&gt;
The map editor in Wesnoth serves two goals, making it easy to create&lt;br /&gt;
a new map and helping the terrain artists to test their new terrains.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
The current editor hasn't been actively maintained for quite a while and the&lt;br /&gt;
quality of the code isn't up to par with the main game. The student&lt;br /&gt;
will either revive the current editor or start from scratch, the latter&lt;br /&gt;
will probably be easier. When rewriting from scratch the student can&lt;br /&gt;
pick the language of his/her liking as long as the result is crossplatform&lt;br /&gt;
(at least Linux/Windows/OS X). &lt;br /&gt;
&lt;br /&gt;
(Note: Unlike the add-on server, there is no specific code-integration reason to prefer Python for the editor rewrite in advance.  However. the project has been trying to reduce its dependence on other scripting languages in order to hold down overall maintenance complexity.  Thus, the student should be prepared to justify the choice of any language that is not Python or C++.)&lt;br /&gt;
&lt;br /&gt;
Some of the things the new/revived editor should be able to do:&lt;br /&gt;
* Include all features of the current editor. &lt;br /&gt;
* When rewritten, great care must be taken that the render engine works the same as the render engine in the main game. When rewritten in C++ it can simply use the game sources, otherwise the student needs to turn the main game C++ files into a library which can be called in the language the editor will be written in.&lt;br /&gt;
* The editor needs to be able to handle so called ''custom terrain'', these are terrains used in maps but not loaded by default.&lt;br /&gt;
* The editor needs to be able to reload the terrain graphics config files, this way terrain artist can test the changes to the config files without having to reload the editor.&lt;br /&gt;
* The current editor can generate random maps with help of a config file, which contains a generator definition. The editor can only use one generator hardcoded. This needs to be modified to be able to use every generator config the user has installed.&lt;br /&gt;
* Various ideas exist to help the artists to make it easier to tune their terrains and config files, this is a secondary goal. We think it will be too much work to do this in one summer.&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
* The current editor and the main game are written in C++ therefore knowledge of C++ is required. Even if the editor is rewritten in another language the render engine needs to be converted to a library. &lt;br /&gt;
* The student needs to be able to make a user friendly user interface.&lt;br /&gt;
* Depending on in which language and toolkit the editor is (re)written in the student will need to have skills in that language and toolkit. The current editor uses the SDL toolkit with our own widget toolkit.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
* The first step is to make a priority list of features. This means the student has to interact with the community and determine what is most wanted. &lt;br /&gt;
* From this list the student needs create a sublist of items he/she will be able to do within one summer.&lt;br /&gt;
* This needs to be presented and discussed with the mentor(s).&lt;br /&gt;
* The next thing in to implement the feature set. The code needs to be fully functional and committed in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Make your own ideas ===&lt;br /&gt;
If you have your own idea the best thing is to join IRC wesnoth-dev at irc.freenode.net and discuss the idea with the developers there. If the developers think your idea is interesting and like the feature you can start to turn it into a full proposal. Once done discuss it again on IRC so the developers can accept your idea.&lt;br /&gt;
&lt;br /&gt;
=== Other ideas to be fleshed out ===&lt;br /&gt;
* A MapGenerator rewrite - better scalable for outdoor maps, plus the possibility to define areas (similar to the caverns in the cave generator) etc.&lt;br /&gt;
&lt;br /&gt;
== Other info to provide for GSoC ==&lt;br /&gt;
==== Describe your organization. ====&lt;br /&gt;
The Battle for Wesnoth, or simply Wesnoth, is a free turn based strategy game with role playing elements designed in June 2003 by David White (Sirp). David currently works at Google.&lt;br /&gt;
&lt;br /&gt;
The first stable release (1.0) was on October 2 2005, the latest stable release (1.4) was on March 8 2008.&lt;br /&gt;
&lt;br /&gt;
* A turn­-based strategy game&lt;br /&gt;
* On a hexagonal board&lt;br /&gt;
* Role playing game style elements&lt;br /&gt;
* Single player and multiplayer modes&lt;br /&gt;
* Runs on a variety of platforms&lt;br /&gt;
* Highly customizable and 'moddable'&lt;br /&gt;
&lt;br /&gt;
What makes Wesnoth stand apart from the other open source games are the following aspects:&lt;br /&gt;
&lt;br /&gt;
* A large developer and player community&lt;br /&gt;
** two servers (stable and developement) with a usual minimum load of more than a hundred players&lt;br /&gt;
** more than two thousands downloads a day&lt;br /&gt;
* A mature project, but with active development and many improvements&lt;br /&gt;
* High quality artwork: both graphics and music&lt;br /&gt;
* Very well­-balanced by a tireless team of playtesters&lt;br /&gt;
* Fun, unique gameplay&lt;br /&gt;
* Even after five years of development, and a very solid, fun product has been created, there are still plenty of new developers, and the number of commits to SVN is still increasing&lt;br /&gt;
&lt;br /&gt;
The general [http://www.wesnoth.org/wiki/WesnothPhilosophy Philosophy] of the game (both for gameplay and coding) puts an emphasis on simplicity. The core rules are meant to be learnt easily but provide interesting gameplay and diverse strategies.&lt;br /&gt;
&lt;br /&gt;
On the other hand, Wesnoth scenarios provides a simple language to easily customize scenarios, which has lead to a huge modding community providing us with a wide amount of content.&lt;br /&gt;
&lt;br /&gt;
* Advanced C++, with some use of Boost&lt;br /&gt;
* The Simple Directmedia Layer (SDL) libraries: &lt;br /&gt;
* SDL, SDL_net, SDL_ttf, SDL_image&lt;br /&gt;
* gettext for internationalization&lt;br /&gt;
* Python to allow scriptable AIs&lt;br /&gt;
* Otherwise, most of Wesnoth's technology is “home grown”:&lt;br /&gt;
** WML : the scripting language used to write scenarios&lt;br /&gt;
** FormulaAI : our AI developement language&lt;br /&gt;
&lt;br /&gt;
* 2.1 million downloads via sourceforge.net, many more via various mirrors of Linux Distributions&lt;br /&gt;
* best rated game at the [http://www.happypenguin.org/list?sort=avg_rating linux game tome]&lt;br /&gt;
* game of the year 2007 at [http://www.linuxquestions.org/questions/2007-linuxquestions.org-members-choice-awards-79/open-source-game-of-the-year-610236/ linuxquestions.org]&lt;br /&gt;
* One of the top 20 rated projects on [http://freshmeat.net/stats/#rating Freshmeat] (currently 16th highest rating, and the highest rated game).&lt;br /&gt;
&lt;br /&gt;
==== Why is your organization applying to participate in GSoC 2008? What do you hope to gain by participating?====&lt;br /&gt;
&lt;br /&gt;
Most of our developers have particular areas of interest in which they work. Though they are efficient in their areas, there are other, presently uncovered, areas of the code with a need for improvements but a high barrier to entry for casual contributors.&lt;br /&gt;
&lt;br /&gt;
If a student were dedicated to any of these uncovered areas, we believe that person could be brought up to speed relatively quickly and function as a peer of the existing developers.&lt;br /&gt;
&lt;br /&gt;
By bringing new people in and allowing them to be actively responsible for an area of code, we hope to kickstart some areas of the project that have lagged behind&lt;br /&gt;
&lt;br /&gt;
==== Did your organization participate in past GSoCs? If so, please summarize your involvement and the successes and challenges of your participation.====&lt;br /&gt;
This is the first time the Wesnoth project has applied to Google SoC.&lt;br /&gt;
&lt;br /&gt;
==== If your organization has not previously participated in GSoC, have you applied in the past? If so, for what year(s)?====&lt;br /&gt;
&lt;br /&gt;
This is the first time the Wesnoth project has applied to Google SoC.&lt;br /&gt;
&lt;br /&gt;
==== Who will your organization administrator be? Please include Google Account information.====&lt;br /&gt;
Nils Kneuper aka Ivanovic&lt;br /&gt;
&lt;br /&gt;
crazy.ivanovic |ATTT| googlemail.com&lt;br /&gt;
&lt;br /&gt;
==== What license(s) does your project use?====&lt;br /&gt;
Our project is entirely GPL.&lt;br /&gt;
&lt;br /&gt;
All code is GPL.&lt;br /&gt;
&lt;br /&gt;
All art is GPL, 99% was made for the project, everything else was taken from content that was checked to be GPL.&lt;br /&gt;
&lt;br /&gt;
==== What is the URL for your ideas page?====&lt;br /&gt;
Our main summer of code page is located at http://www.wesnoth.org/wiki/SummerOfCodeIdeas&lt;br /&gt;
&lt;br /&gt;
This page contains various coding ideas and the thought the development team has already given them.&lt;br /&gt;
&lt;br /&gt;
It also contains a list of the developers that are the most active on IRC and their domains of interest.&lt;br /&gt;
&lt;br /&gt;
==== What is the main development mailing list or forum for your organization?====&lt;br /&gt;
Most development work takes place on &amp;quot;wesnoth-dev |ATTT| gna.org&amp;quot;. Beside this some work happens at http://www.wesnoth.org/forum/.&lt;br /&gt;
&lt;br /&gt;
in particular, all art developement takes place on the forum.&lt;br /&gt;
&lt;br /&gt;
==== What is the main IRC channel for your organization?====&lt;br /&gt;
&lt;br /&gt;
All our IRC channels are on the ''freenode'' network&lt;br /&gt;
&lt;br /&gt;
* ''#wesnoth-dev'' is the main development channel, where most discussion takes place&lt;br /&gt;
* ''#wesnoth'' is a generic channel for the community&lt;br /&gt;
* ''#wesnoth-mp'' is a separate channel for multiplayer games and balancing&lt;br /&gt;
&lt;br /&gt;
==== Does your organization have an application template you would like to see students use? If so, please provide it now.====&lt;br /&gt;
We plan mainly to meet potential students through our IRC channel, but the following questions are wesnoth-specific and are worth pondering for any student, even if we don't need a formal answer&lt;br /&gt;
&lt;br /&gt;
* Basics&lt;br /&gt;
** Just write a small introduction to yourself.&lt;br /&gt;
** State your preferred email address.&lt;br /&gt;
** If you have chosen a nick for IRC and Wesnoth forums, what is it?&lt;br /&gt;
** Why do you want to participate in summer of code?&lt;br /&gt;
** What are you studying, subject, level and school? &lt;br /&gt;
&lt;br /&gt;
* Experience&lt;br /&gt;
** What programs/software have you worked on before?&lt;br /&gt;
** Have you developed software in a team environment before? (As opposed to hacking on something on your own)&lt;br /&gt;
** Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why?&lt;br /&gt;
** What development model would you use (e.g. keywords: V-model, XP programming, agile programming, iterative; with the help of prototyping, formal specifications, tests, etc).&lt;br /&gt;
** Open Source&lt;br /&gt;
*** Are you already involved with any open source development project? If yes, please describe the project and the scope of your involvement.&lt;br /&gt;
** Gaming experience&lt;br /&gt;
*** Are you a gamer?  If so...&lt;br /&gt;
*** What type of gamer are you?&lt;br /&gt;
*** What type of games? &lt;br /&gt;
*** What type of opponents do you prefer? &lt;br /&gt;
*** Are you more interested in story or gameplay?&lt;br /&gt;
*** Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer.&lt;br /&gt;
&lt;br /&gt;
We do not plan to favor Wesnoth players as such, but some particular projects require a good feeling for the game which is hard to get without having played intensively.&lt;br /&gt;
&lt;br /&gt;
* Communication skills&lt;br /&gt;
** Though most of our developers are not native English speakers, English is the project's working language.  Describe your fluency level in written English.&lt;br /&gt;
** Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough.&lt;br /&gt;
** Do you give constructive advice? &lt;br /&gt;
** Do you receive advice well? &lt;br /&gt;
** Are you good at sorting useful criticisms from useless ones?&lt;br /&gt;
&lt;br /&gt;
* Project&lt;br /&gt;
** Did you select a project from our list? If that is the case, what project did you select?&lt;br /&gt;
** If you have invented your own project, please describe the project and the scope.&lt;br /&gt;
** Why did you choose this project?&lt;br /&gt;
** Include an estimated timeline for your work on the project&lt;br /&gt;
** Include as much technical detail about your implementation as you can&lt;br /&gt;
** What do you expect to gain from this project?&lt;br /&gt;
** What would make you stay in the Wesnoth community after the conclusion of SOC? &lt;br /&gt;
&lt;br /&gt;
* Practical considerations&lt;br /&gt;
** Are you familiar with any of the following tools?&lt;br /&gt;
*** Subversion&lt;br /&gt;
*** C++&lt;br /&gt;
*** Python&lt;br /&gt;
** Which tools do you normally use for development? Why do you use them?&lt;br /&gt;
** What programming languages are you fluent in?&lt;br /&gt;
** What spoken languages are you fluent in?&lt;br /&gt;
** At what hours are you awake (please specify in UTC)&lt;br /&gt;
** Would you mind talking with your mentor on telephone / internet phone? &lt;br /&gt;
&lt;br /&gt;
* Detailed answer (optional, but writing skill is a good predictor of ability to work on a programming team, so you will improve your chances by responding to this).&lt;br /&gt;
** Write a small essay (750-1000 words or more) explaining why you want to participate in a Wesnoth GSoC project. You can use the above questions as guides, but feel free to throw in more information if you feel it is relevant.&lt;br /&gt;
** What is your perception of 'open source'? Briefly explain what you think of the whole 'open source' concept, how you discovered open source, what you expect to gain/experience by participating in an open-source project. (Answer separately or as part of above mini-essay)&lt;br /&gt;
** What motivates or inspires you to write programs and develop software? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''''to be completed''''&lt;br /&gt;
&lt;br /&gt;
==== Who will be your backup organization administrator? Please include Google Account information.====&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
==== Who will your mentors be? Please include Google Account information.====&lt;br /&gt;
&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jeremy Rosen alias Boucman (boucman2|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Mark de Wever aka Mordante (mordante.wesnoth|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jörg Hinrichs alias YogiHH (joerghh.hinrichs|ATTT|googlemail.com)&lt;br /&gt;
&lt;br /&gt;
==== What criteria did you use to select these individuals as mentors? Please be as specific as possible.====&lt;br /&gt;
&lt;br /&gt;
Our first criterion was that all the people had to be volunteers. According to other open source projects, being a SoC mentor takes a lot of time and the person has to be ready to spend quite some time with the student.&lt;br /&gt;
&lt;br /&gt;
Dave is the project leader and one of the most knowledgeable in C++. He has also written the Formula AI code which we plan to develop via the SoC. He is well known in our community for formulating simple but effective explanations for complicated topics, and has good design intuition. The growth of Wesnoth demonstrates his capacity to get other developers to work together and keep them involved in a thriving community.&lt;br /&gt;
&lt;br /&gt;
Boucman is one of the oldest active developers around. He has rewritten the whole animation engine and made it an easily pluggable system allowing artists to easily specify exactly how they want the units to appear. He also started many community oriented projects like the [http://wiki.wesnoth.org/UnsortedContrib Art Contribution] section of the wiki (now automated) and the [http://wiki.wesnoth.org/ReferenceWML WML Reference Manual]. He is responsible for dispatching and sorting the patches at http://patches.wesnoth.org and has created the new developer process we currently use. &lt;br /&gt;
&lt;br /&gt;
Mordante is one of the most active developers on our IRC channel. Not only has he done preliminary studies and coding in multiple areas that are candidates for Summer of Code ideas, he also is one of the coders with the best overview of the Wesnoth code. A large part of his work involves refactoring polishing existing code. Next to that he's very active with fixing bugs which leads him to all areas in the code base.&lt;br /&gt;
&lt;br /&gt;
YogiHH has been with the project for more than two years. He did a major refactoring to the gameplay engine and worked quite a bit on the multiplayer code. He also has been a professional trainer for C/C++, Java and C# for many years. Right now he works in a project where he serves as a mentor for a junior developer.&lt;br /&gt;
&lt;br /&gt;
All other developers listed in the ideas page are the leading capacities we do have for the respecting areas. Have a look at our list of people who to contact for which regards. In general all our developers will mentor all students. That is, questions should just be asked in our IRC channel, where basically every developer who has an idea can directly answer.&lt;br /&gt;
&lt;br /&gt;
When choosing the mentors, we have kept in mind that most developers can answer most technical questions, and we have chosen people that are well known for interacting with new-comers/external developers and can provide general guidance and design advice, more than people with specific technical knowledge.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing students?====&lt;br /&gt;
The first thing to do is to avoid this situation altogether. &lt;br /&gt;
&lt;br /&gt;
Wesnoth is a game, and as such has lots of developers that are not coders. In particular, artists are well known in the Wesnoth community for being very sensible about criticism and our community is used to people being sensible to critics. &lt;br /&gt;
&lt;br /&gt;
We will try to choose students that accept criticism and are able to filter constructive criticism from useless one. The Wesnoth developer community is used to judging people according to these criteria and the special title we are going to give to applicants will allow us to easily spot any such problems and discuss them before they grow out of control.&lt;br /&gt;
&lt;br /&gt;
If a student disappears, his mentor will be in charge of recontacting him to see what is going wrong (available time, tension with other developers, with members of the community etc...). Depending on the actual problem, the mentor and the student will have to agree on possible ways to defuse the problem.&lt;br /&gt;
&lt;br /&gt;
If a student disappears completely and there is no way to get back to him, there is little the project can do except salvaging whatever can be salvaged from the code (the students will have SVN write access, so most of the work will be committed either to trunk or to a specific branch) and find a core developer to take on the job. This will probably be slower and less effective for the project, but it's the best we can do.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing mentors?====&lt;br /&gt;
&lt;br /&gt;
All our mentors are long time developers that volunteered for the job, so we don't expect that to happen. We took the time to ask other former GSoC projects about the workload needed to be a mentor, and our mentors accepted the job knowing the amount of work it involved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
However, should it happen, we would continue to mentor as a developper community the student until we find a new &amp;quot;official&amp;quot; mentor to take on the job.&lt;br /&gt;
&lt;br /&gt;
==== What steps will you take to encourage students to interact with your project's community before, during and after the program?====&lt;br /&gt;
&lt;br /&gt;
Wesnoth has a particularly healthy community, both for developers and for players. &lt;br /&gt;
&lt;br /&gt;
Our general policy regarding new coders has always been &amp;quot;two patch... you're in&amp;quot; In other word, anybody that is able to get two non-trivial patches applied is offered commit right.&lt;br /&gt;
&lt;br /&gt;
We have a developer responsible for applying patches and guiding new developers into our community. This is a well known and effective process we plan to apply to students, directing them to our [[EasyCoding]] pages (these project are usually a couple of hours long and has been chosen to provide easy access to code)&lt;br /&gt;
&lt;br /&gt;
Usually, patches go back and forth a couple of time, to make sure that all secondary things are in place (indenting, coding style, modified makefiles etc.) The idea is that coder education should take place before the coder gets commit rights, but that getting new coder in is one of the most important things to maintain our project alive.&lt;br /&gt;
&lt;br /&gt;
If the student is a little proactive and ready to join IRC, all the developers are usually very welcoming, and good at directing newcomers to quickly give useful results.&lt;br /&gt;
&lt;br /&gt;
We also plan to give a special forum title to any students. This will allow all forum members to tell them apart from normal users and give them read/write access to the developer only forums. This will also allow us to quickly spot any problem they might have interacting with the player community. We have a very mature developer community, but our player community is made of all sort of people of all age and education, and it can be rough at time.&lt;br /&gt;
&lt;br /&gt;
==== What will you do to ensure that your accepted students stick with the project after GSoC concludes?====&lt;br /&gt;
&lt;br /&gt;
Since our community has a history of having developers easily and quickly join, we expect the student to be a full-fledged developer quite fast (probably a little after the end of the bonding period). &lt;br /&gt;
&lt;br /&gt;
Thus there will be no &amp;quot;end of GSoC&amp;quot; transition. At the end of the Summer of code we expect the student to be responsible for the part he developed, and to continue taking care of it, like other developers are responsible for their part.&lt;br /&gt;
&lt;br /&gt;
''''TO BE COMPLETED''''&lt;br /&gt;
&lt;br /&gt;
== People to bug on IRC ==&lt;br /&gt;
Everybody feel free to edit/correct his entry!&lt;br /&gt;
&lt;br /&gt;
=== boucman ===&lt;br /&gt;
As our &amp;quot;patch monkey&amp;quot; he accustomed to critiquing patches of every kind. Beside this, he knows many areas of the game due to working on applying patches. He is particularly used to answering question from new coders, and doesn't mind explaining trivial stuff. He was the one who started the &amp;quot;two patches, you're in&amp;quot; policy and the ReferenceWML part of the project.&lt;br /&gt;
&lt;br /&gt;
=== Dave alias Sirp ===&lt;br /&gt;
Sirp started Wesnoth and is our lead developer. He is currently our C++ expert and is also the one that is working on the new Formula AI. Any questions regarding the formula AI should be directed to him.&lt;br /&gt;
&lt;br /&gt;
=== Elias Pscherning (elias) ===&lt;br /&gt;
He wrote the original version of campgen and as such will know a lot about what is needed to to make such an editor work correctly. The work on a scenario editor might be based upon campgen and as such his knowledge will be really helpful.&lt;br /&gt;
&lt;br /&gt;
=== Eric S. Raymond (ESR) ===&lt;br /&gt;
ESR is our project toolsmith; he has written several tools that semi-automate various aspects of WML maintenance.  While most of our developers/designers concentrate on either the C++ core or WML but not both, he has a balanced understanding of both levels and may be helpful in helping students develop a grasp of the overall architecture.  Finally, he did the last overhaul of the Wesnoth UI and understands UI design principles; he is well-equipped to guide students working in that area.&lt;br /&gt;
&lt;br /&gt;
=== Karol Nowak (grzywacz) ===&lt;br /&gt;
Last year he participated at GSoC as a student, so he will understand the situation of GSoC students. Beside this he is our top expert on embedded devices, and is actively working on the gp2x support.&lt;br /&gt;
&lt;br /&gt;
=== Mordante ===&lt;br /&gt;
Many of the possible projects involve the code for which he is an area expert. Also, many of the possible projects currently listed on the ideas page require GUI parts to work. Given that Mordante wants to tackle a rewrite of large parts of this, he will be our expert there as well as already being our area expert for the terrain engine.&lt;br /&gt;
&lt;br /&gt;
=== Nils Kneuper (Ivanovic) ===&lt;br /&gt;
He is doing nothing special, he just does some &amp;quot;administrative work&amp;quot; like packaging fresh tarballs when it is time for them and works on setting up any kind of deadlines and timetables related to releasing. He has administrative powers in most areas, no matter if website, forum or IRC. Beside this he uploads translation updates, tries to communicate with the translation teams when it is required and translates a little bit himself every now and then. But in general he is not a real expert in anything, just has a look at things that come up and redirects people to the correct contacts.&lt;br /&gt;
&lt;br /&gt;
=== Noy ===&lt;br /&gt;
Noy is an oddity among developers; he's got no coding skills whatsoever and possesses a limited understanding of computers, which is illustrated by his difficulty operating a Mac. Instead, Noy makes his contribution in gameplay and multiplayer design, drawing upon his background in social sciences research, military strategy and playing games online, to understand the effects of development on the playing community behavior. Along with Soliton, Noy is a useful conduit to discuss any issues in this area; just don't ask him about revising the level of randomness in the game.&lt;br /&gt;
&lt;br /&gt;
=== Noyga ===&lt;br /&gt;
Another versatile developer, on the C++ side he doesn't concentrate on a particular area, did some tweaks to improve translations in some languages (like enabling the female forms for names in various place) but know quite well the C++ side of units, abilities and WML. On the WML side he's an expert.&lt;br /&gt;
&lt;br /&gt;
=== Soliton ===&lt;br /&gt;
He knows our MP server setup best. Beside this he has already done a lot of work on the MP server himself. So he probably has most knowledge about it and, being one of our MP-developers, might provide important help from the perspective of the MP player community and what is needed there.&lt;br /&gt;
&lt;br /&gt;
=== YogiHH or Piotr Cychowski (cycholka) ===&lt;br /&gt;
Since they are the two developers who know most about building under Windows, they will probably be really helpful. Either if the student comes from the Windows side, or to help test resulting work to make sure that it does work on Windows and, for the case that it does not, to show them where problems are.&lt;br /&gt;
&lt;br /&gt;
=== zookeeper or Mythological or Rhuvaen ===&lt;br /&gt;
As our leading WML experts those are to be contacted when it comes to anything related WML problems since they know this stuff best. They do maintain most of the campaigns and improve them whenever they have a good idea for changes.&lt;br /&gt;
&lt;br /&gt;
[[Category:Future]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23378</id>
		<title>SummerOfCodeIdeas</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23378"/>
		<updated>2008-03-09T16:46:58Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Describe your organization. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a compilation of ideas from ML. Needs to be refined (more detailed description, deliverables, workload estimation?):&lt;br /&gt;
&lt;br /&gt;
== I want to be one of your Google Summer of Code student, what should I do... ==&lt;br /&gt;
&lt;br /&gt;
wow wow wow&lt;br /&gt;
&lt;br /&gt;
Google hasn't announced the mentoring organisations yet and wesnoth might not be choosen at all.&lt;br /&gt;
&lt;br /&gt;
the following paragraph is here to have something ready if we are choosen as a mentoring organisation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is a quick list of things to do to get you started&lt;br /&gt;
* Create an account on gna.org&lt;br /&gt;
* Create an account on the wesnoth forum&lt;br /&gt;
* Join the irc channel (#wesnoth-dev on irc.freenode.net) and introduce yourself. We will not give formal interviews, but we will clearly favor people we have learnt to know during the selection process&lt;br /&gt;
* Contact one of our SummerOfCode people (Ivanovic, Sirp, Boucman, Mordante) to have your forum nick marked as a Summer of code student&lt;br /&gt;
* Start a wiki page about your idea, add a link on this page&lt;br /&gt;
** fill the questionnaire on this page&lt;br /&gt;
** detail your idea as much as possible, look at other students pages, and please give milestones and studies you've done&lt;br /&gt;
* Though not mandatory, it is highly advised to go to the [[EasyCoding]] and [[NotSoEasyCoding]] pages and implement one of these ideas (or any idea of similar scope) so we have an idea how you work. Be sure to use your gna account when submitting these patches so we know who it is coming from&lt;br /&gt;
&lt;br /&gt;
== Student proposals ==&lt;br /&gt;
''please add a link to the wiki page with your idea''&lt;br /&gt;
== List of Ideas for the Project (Suggestions from the wesnoth developers) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Writing an AI based on the formula AI ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has always had a simple C++ based AI. David (our lead developer) has been working on a simple language to write AI in Wesnoth [[WesnothFormulaAIBranch]]&lt;br /&gt;
&lt;br /&gt;
The Wesnoth AI is used as an opponent in most campaigns, and as such is an important piece of code for the Wesnoth project. Unfortunately it is also one of the most neglected piece of code and a place where a lot of research and work could be done&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to develop a new AI that would replace the original C++ AI. The main criterias we would want for this new AI are&lt;br /&gt;
&lt;br /&gt;
* ''Plugability :'' It should be trivial for any content maker to change the behavior of the AI in specific case. The exact cases are still to be defined but should typically include&lt;br /&gt;
** hardwiring the first few turns of the AI&lt;br /&gt;
** changing the recruitment pattern&lt;br /&gt;
** completely controlling a given unit (scenario unit)&lt;br /&gt;
** taking control then giving back control of a given unit&lt;br /&gt;
* ''tunability :'' It should be easy for a scenario author to specify the general behaviour of the enemy on a given scenario (aggressiveness, intrepidity...)&lt;br /&gt;
* ''specific behaviours :'' there are some typical behaviours that are not smart to win the scenario but are needed, such as guarding a given unit, a given position, wandering aimlessly, attacking randomly, always fleeing. The AI should implement such behaviours, and allow easy addition of new behaviours&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* ''A minimal knowledge of C++ is required, a good knowledge of C++ is desired :'' The formula AI framework is a work in progress and chances are high that some changes in the wesnoth code base will be needed. The wesnoth developer community is used to handle people that are familiar with coding but not C++, however the Formula AI framework uses advanced C++ features and a good knowledge of the language would avoid a major hurdle when plugging in new entries or functionalities for the AI&lt;br /&gt;
* ''Good social interaction with a large player community :'' A preliminary phase to coding any AI is to know the strategies and game pattern used by human players. This requires huge interaction with the player community. Our Gameplay Developers are open and can give some good starting points, but a big game experience and good interaction with the player community will greatly help in the study of the design&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
It is hard to give milestones at this point, but here are some ideas of what could be done&lt;br /&gt;
&lt;br /&gt;
* ''AI design description, and basic function library :'' This first deliverable aims to conclude the '''study and analysis''' part of the project : becoming familiar with the formula language, study of multiplayer strategies and of the need of scenario writers with regard to AI. We would like to have a description of the code structure of the AI, some basis of the play strategies it would use and how external scenario writers could configure it for the particular behaviour they need&lt;br /&gt;
* ''Main AI delivery :'' This milestone's aim is to deliver a working AI implementing the strategies described in the first phase. It would not have to systematically beat the standard C++ AI at this point, but should be able to play the game correctly (recruit, early deployment on villages, grouping units to attack, holding its ground, protecting weak/important units). Moreover most plug-in entries should be available and a test-case for these entries should be provided.&lt;br /&gt;
* ''Fine tunning and behaviour library :'' The third phase would validate the actual strategy of the AI. The AI should consistently beat the default C++ AI, and do fairly well against an average human player. At that stage a library of scenario behaviours should also be delivered. The AI does not need to be as efficient with all scenario tweaking, but should act correctly with regard to the particular behaviour desired.&lt;br /&gt;
&lt;br /&gt;
=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
When the development team met at FOSDEM, we had our multiplayer community, though it is strong and healthy, had its growth restrained by the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
==== General Description ====&lt;br /&gt;
The general idea of this project would be&lt;br /&gt;
* To study the current lobby,&lt;br /&gt;
* To present some ideas of evolutions both in interface and functionalities of our multiplayer interface to allow it to scale to a much larger community&lt;br /&gt;
* To present some well constructed thought on our MP community and how that interface would develop it&lt;br /&gt;
* Of course to implement those changes :)&lt;br /&gt;
&lt;br /&gt;
Some ideas that we had (but that are in no way mandatory)&lt;br /&gt;
* Having a simple way to register and authenticate nicknames, similar to what IRC offers. The point is not to have cryptographically safe logins, but to have something simple that gets the job done&lt;br /&gt;
* Having a simple room system? Again, inspired by IRC&lt;br /&gt;
* Having some way to find the type of games you are interested in.&lt;br /&gt;
** game type&lt;br /&gt;
** number of free slots/players&lt;br /&gt;
** any other criteria you might find interesting&lt;br /&gt;
&lt;br /&gt;
Other ideas we are not convinced are good, but that are certainly worth studying (especially how the communities based around these concepts are different from ours)&lt;br /&gt;
* ranking players&lt;br /&gt;
* guilds&lt;br /&gt;
* official tournaments&lt;br /&gt;
* titles for players&lt;br /&gt;
* metaservers&lt;br /&gt;
* game matching when players are ranked (poker, bridge...)&lt;br /&gt;
&lt;br /&gt;
The scalability of the project, both in term of number of players, and in term of the possibility for players and developers to extend the concept will be a valued criteria&lt;br /&gt;
&lt;br /&gt;
Administration/moderation problems and techniques should also be studied&lt;br /&gt;
&lt;br /&gt;
interaction with the Add-On server/forum might be an interesting field to expand to&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* A fair amount of experience with C++ is required. Wesnoth uses some advanced C++ features and is heavily based on BOOST and STL. We can train you in some of the libraries used, but learning all of them would be a big hurdle.&lt;br /&gt;
* Experience with multiplayer games, in order to have a good idea of what multiplayer lobbies of other game look like, and (more importantly) a good idea of the social behaviours of multiple MP communities, how teams are formed in games and things like that&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
* A first milestone would be a presentation summarizing the different studies, and the proposed interface. preliminary informal stages would probably be desirable, to make sure the proposed idea is already a consensus within devs &lt;br /&gt;
** Study of other MP game-matching interfaces and functionalities&lt;br /&gt;
** Study of other MP communities&lt;br /&gt;
** Study of other MP moderation practices&lt;br /&gt;
** Study of the Wesnoth MP community, including needs, various opinons from different developers and players&lt;br /&gt;
* A second milestone would be the main code delivery. Code should be functional for it will be delivered in the next Wesnoth development release&lt;br /&gt;
&lt;br /&gt;
=== Scenario/Campaign editor ===&lt;br /&gt;
&lt;br /&gt;
Currently, in order to create campaign or multiplayer scenarios, it is necessary to manually edit WML files - XML-like configuration files. The goal of this project would be to create a graphical editor allowing the same.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
A scenario editor for Wesnoth supporting everything possible by Wesnoth's engine would be a huge project, so the scope of the actual project would of course be limited - what exactly should be implemented would be decided by initial discussion. Implementation details and choice of language/tools would also be up to the student to choose. The main ideas would be for the scenario editor to be:&lt;br /&gt;
* cross-platform (at least Linux, OSX, Windows)&lt;br /&gt;
* easy to use (someone who tries reasonably hard should be able to create a simple scenario/campaign with it, even if not knowing WML)&lt;br /&gt;
* powerful (there already is a map editor coming with Wesnoth - the scenario editor will provide more/different things)&lt;br /&gt;
* extensible (also after the SoC project, it should be easy to add additional features)&lt;br /&gt;
&lt;br /&gt;
There exist at least two attempts at a scenario editor, an OSX-only one which shipped with early Wesnoth versions, and CampGen, an external tool written in WxPython. The student could look at them for ideas or even use one of them as base, but that should be discussed first. The below assumes a new application is developed from scratch (which likely will be much more motivating for the student than reviving an existing attempt). The actual things to be done would be:&lt;br /&gt;
&lt;br /&gt;
* Decide on a cross-platform GUI which would be best suited (Qt4, Wx, GTK, Wesnoth's builtin GUI (in that case, could maybe integrate with the existing map editor, but would have serious other problems), or others...).&lt;br /&gt;
* Decide on a platform/language to use (C++, Python, or others...). Wesnoth is written in C++, so it's what most developers would prefer, but as long as it can be expected to work on Linux, OSX and Windows, this is completely open.&lt;br /&gt;
* GUI design. This is the main part of the project. The editor should make it easy to create scenarios, so the GUI must not be confusing/hard to use.&lt;br /&gt;
* Decide on base features. [[ReferenceWML]] lists everything currently supported by WML. Theoretically, the scenario editor could support everything, but for the timeframe of the SoC project, it will be necessary to decide on the most important features and implement those.&lt;br /&gt;
** WML-centric or not? Two opposite views for such an editor would be to either strictly follow WML, as extreme case have one dialog for each WML element. Or on the other hand make a scenario creation tool which completely hides WML and then simply can export to WML, translating features as necessary. The final design likely would be somewhere in between.&lt;br /&gt;
** Ability to read existing WML? The editor will export to WML, but need to decide if it also should be able to read it.&lt;br /&gt;
** Built-in map editor? Wesnoth comes with a map editor, but it can only be used to define the terrain. The scenario editor has to allow placing events and units and other things, so it will need a way to display maps as well. Would be worth investigating if the existing C++ map-drawing code of Wesnoth can be re-used.&lt;br /&gt;
** Ability to enter custom WML code? For advanced users this might be nice, if it can integrate well.&lt;br /&gt;
** Story screen editor for campaigns?&lt;br /&gt;
** How powerful should the events editor be? WML basically is a turing complete language, so must decide what should be supported and how to present to the user.&lt;br /&gt;
** Custom unit animations?&lt;br /&gt;
** Custom multi-hex terrains?&lt;br /&gt;
* Extensibility (leave the possibility to extend the application with plugins for some of the above things, either with a plugin architecture or by making the source code modular enough)&lt;br /&gt;
* WML-export. The second major part besides designing and implementing all the GUI will be exporting the result to WML, and depending on some design choices this could prove more or less hard to do.&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++. Even in case the editor is not written in C++, it will be necessary to look at some parts of Wesnoth's source code (WML-parser, editor, ...) and understand them, possibly even integrate/re-use them.&lt;br /&gt;
* Ability/interest in GUI/application design. A not negligible part of the project likely will be spent designing various GUI dialogs.&lt;br /&gt;
* Prior use of level creation tools/modding tools. Knowing existing tools for other games will help a lot in the design phase, as many good ideas can be seen there. Not required though.&lt;br /&gt;
* Having played Wesnoth and knowing what scenarios look like would help. Someone who never played Wesnoth before would risk losing a lot of precious time playing the game instead of working :) But it's not required of course.&lt;br /&gt;
* Knowledge of WML. A candidate who already knows Wesnoth's WML could save the initial time studying it. (On the other hand, not knowing WML might mean less technical bias and might lead to an application which is easer to use for non-technical users.)&lt;br /&gt;
* Ability to interact with developers/users. Presenting GUI mockups and test versions and incorporating early user feedback likely will improve the end result a lot. The Wesnoth community is big enough that there should be quite some willing testers.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
The initial design will decide on many later things, and likely a lot of talking to developers and users will be necessary. But some general milestones I'd expect:&lt;br /&gt;
* Create a base test application in the chosen language/platform. This will not do much yet, maybe load some WML and display it as text. Try to package it for Linux, OSX and Windows (there will be help from the Wesnoth community, so no need to have access to all of them), and see if it can be expected to work. If a standard GUI like C++/Qt4 is used, this will be rather trivial. Something like Python/Wx or C#/.NET might take more time.&lt;br /&gt;
* Add ability to edit some very simple, maybe only textual properties of a scenario, and export to WML. It should already have base features like Save/Load/Undo, copy/paste, multiple documents, and so on. Depending on the chosen GUI this may be easy or already require some work.&lt;br /&gt;
* Finish design. Should list the intended features and demonstrate how the GUI will work.&lt;br /&gt;
* Start implementation, a natural milestone would be to make it possible to create and export a very simple, but playable scenario.&lt;br /&gt;
* Add more of the features (which ones and in which order depends on the design above, a detailed roadmap will be part of it).&lt;br /&gt;
&lt;br /&gt;
=== Addon server ===&lt;br /&gt;
Wesnoth has an addon server which offers users to upload user &lt;br /&gt;
made content (UMC). This allows all other users of Wesnoth&lt;br /&gt;
to easily download and install this content. The server was &lt;br /&gt;
originally written for user made campaigns but contains a lot&lt;br /&gt;
more types of addons nowadays. Both the server side and the &lt;br /&gt;
client side need to be improved.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
Neither the server nor the client side of the addon server have&lt;br /&gt;
seen much improvement over the years; both are overdue for a reworking.&lt;br /&gt;
The client side GUI needs polishing. For the&lt;br /&gt;
server side we would like to allow better integration with&lt;br /&gt;
various tools (such as wmllint), which improve the quality of the addons.&lt;br /&gt;
&lt;br /&gt;
===== Server side =====&lt;br /&gt;
The server code either needs to be updated or rewritten, the student is free to make this decision him or herself. The student may choose the language for the server, but because some of the code that needs to be integrated is Python we'll need to hear a specific justification for any other choice.&lt;br /&gt;
&lt;br /&gt;
* The server only needs to run on Linux systems. Cross-platform portability would be nice but isn't  required.&lt;br /&gt;
* At the moment there's a rudimentary integration with our translation project Wescamp. This needs to be improved. Upon uploading the new content needs to be send to Wescamp (via a svn commit). And the translations need to be fetched on a regular basis.&lt;br /&gt;
* We have various tools to check the WML code and also upgrade it to newer version. The addon server needs to be able to run those tools on the content.&lt;br /&gt;
&lt;br /&gt;
===== Client side =====&lt;br /&gt;
The client side needs improvements, there are two main clients&lt;br /&gt;
the ingame version and a standalone version in Python.&lt;br /&gt;
&lt;br /&gt;
* Upgrade the GUI. Mordante is working on a new GUI library which is intended to make it possible to make the wanted changes.&lt;br /&gt;
* Make it easier to see summary and status information on addons. At the moment a lot of new users download something and have no clue what kind of addon it is.&lt;br /&gt;
* Make it easier to see whether a newer version of the addon is on the server and update the addon.&lt;br /&gt;
* Make it easy to select which translations you want to download and also look for newer versions of the translations.&lt;br /&gt;
&lt;br /&gt;
====  Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++, the game is written in C++ and modifications need to be made there. &lt;br /&gt;
* Knowledge of Python, various tools have been written in Python which need to be integrated with the new server.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
* The first step is to determine what exactly needs to be done and determine in which language the server will be rewritten. This includes, but isn't limited to:&lt;br /&gt;
** Determine the exact feature set.&lt;br /&gt;
** Protocol changes needed.&lt;br /&gt;
** Methods to integrate with both the WML tools and Wescamp with the new server.&lt;br /&gt;
** Determine the GUI for the client side.&lt;br /&gt;
** Justify the choice of language.&lt;br /&gt;
* These points will need to be presented and discussed with the mentor(s).&lt;br /&gt;
* The next thing in to implement the feature set. The code needs to be fully functional and committed in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Map editor ===&lt;br /&gt;
The map editor in Wesnoth serves two goals, making it easy to create&lt;br /&gt;
a new map and helping the terrain artists to test their new terrains.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
The current editor hasn't been actively maintained for quite a while and the&lt;br /&gt;
quality of the code isn't up to par with the main game. The student&lt;br /&gt;
will either revive the current editor or start from scratch, the latter&lt;br /&gt;
will probably be easier. When rewriting from scratch the student can&lt;br /&gt;
pick the language of his/her liking as long as the result is crossplatform&lt;br /&gt;
(at least Linux/Windows/OS X). &lt;br /&gt;
&lt;br /&gt;
(Note: Unlike the add-on server, there is no specific code-integration reason to prefer Python for the editor rewrite in advance.  However. the project has been trying to reduce its dependence on other scripting languages in order to hold down overall maintenance complexity.  Thus, the student should be prepared to justify the choice of any language that is not Python or C++.)&lt;br /&gt;
&lt;br /&gt;
Some of the things the new/revived editor should be able to do:&lt;br /&gt;
* Include all features of the current editor. &lt;br /&gt;
* When rewritten, great care must be taken that the render engine works the same as the render engine in the main game. When rewritten in C++ it can simply use the game sources, otherwise the student needs to turn the main game C++ files into a library which can be called in the language the editor will be written in.&lt;br /&gt;
* The editor needs to be able to handle so called ''custom terrain'', these are terrains used in maps but not loaded by default.&lt;br /&gt;
* The editor needs to be able to reload the terrain graphics config files, this way terrain artist can test the changes to the config files without having to reload the editor.&lt;br /&gt;
* The current editor can generate random maps with help of a config file, which contains a generator definition. The editor can only use one generator hardcoded. This needs to be modified to be able to use every generator config the user has installed.&lt;br /&gt;
* Various ideas exist to help the artists to make it easier to tune their terrains and config files, this is a secondary goal. We think it will be too much work to do this in one summer.&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
* The current editor and the main game are written in C++ therefore knowledge of C++ is required. Even if the editor is rewritten in another language the render engine needs to be converted to a library. &lt;br /&gt;
* The student needs to be able to make a user friendly user interface.&lt;br /&gt;
* Depending on in which language and toolkit the editor is (re)written in the student will need to have skills in that language and toolkit. The current editor uses the SDL toolkit with our own widget toolkit.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
* The first step is to make a priority list of features. This means the student has to interact with the community and determine what is most wanted. &lt;br /&gt;
* From this list the student needs create a sublist of items he/she will be able to do within one summer.&lt;br /&gt;
* This needs to be presented and discussed with the mentor(s).&lt;br /&gt;
* The next thing in to implement the feature set. The code needs to be fully functional and committed in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Make your own ideas ===&lt;br /&gt;
If you have your own idea the best thing is to join IRC wesnoth-dev at irc.freenode.net and discuss the idea with the developers there. If the developers think your idea is interesting and like the feature you can start to turn it into a full proposal. Once done discuss it again on IRC so the developers can accept your idea.&lt;br /&gt;
&lt;br /&gt;
=== Other ideas to be fleshed out ===&lt;br /&gt;
* A MapGenerator rewrite - better scalable for outdoor maps, plus the possibility to define areas (similar to the caverns in the cave generator) etc.&lt;br /&gt;
&lt;br /&gt;
== Other info to provide for GSoC ==&lt;br /&gt;
==== Describe your organization. ====&lt;br /&gt;
The Battle for Wesnoth, or simply Wesnoth, is a free turn based strategy game with role playing elements designed in June 2003 by David White (Sirp). David currently works at Google.&lt;br /&gt;
&lt;br /&gt;
The first stable release (1.0) was on October 2 2005, the latest stable release (1.4) was on March 8 2008.&lt;br /&gt;
&lt;br /&gt;
* A turn­-based strategy game&lt;br /&gt;
* On a hexagonal board&lt;br /&gt;
* Role playing game style elements&lt;br /&gt;
* Single player and multiplayer modes&lt;br /&gt;
* Runs on a variety of platforms&lt;br /&gt;
* Highly customizable and 'moddable'&lt;br /&gt;
&lt;br /&gt;
What makes Wesnoth stand apart from the other open source games are the following aspects:&lt;br /&gt;
&lt;br /&gt;
* A large developer and player community&lt;br /&gt;
** two servers (stable and developement) with a usual minimum load of more than a hundred players&lt;br /&gt;
** more than two thousands downloads a day&lt;br /&gt;
* A mature project, but with active development and many improvements&lt;br /&gt;
* High quality artwork: both graphics and music&lt;br /&gt;
* Very well­-balanced by a tireless team of playtesters&lt;br /&gt;
* Fun, unique gameplay&lt;br /&gt;
* Even after five years of development, and a very solid, fun product has been created, there are still plenty of new developers, and the number of commits to SVN is still increasing&lt;br /&gt;
&lt;br /&gt;
The general [http://www.wesnoth.org/wiki/WesnothPhilosophy Philosophy] of the game (both for gameplay and coding) puts an emphasis on simplicity. The core rules are meant to be learnt easily but provide interesting gameplay and diverse strategies.&lt;br /&gt;
&lt;br /&gt;
On the other hand, Wesnoth scenarios provides a simple language to easily customize scenarios, which has lead to a huge modding community providing us with a wide amount of content.&lt;br /&gt;
&lt;br /&gt;
* Advanced C++, with some use of Boost&lt;br /&gt;
* The Simple Directmedia Layer (SDL) libraries: &lt;br /&gt;
* SDL, SDL_net, SDL_ttf, SDL_image&lt;br /&gt;
* gettext for internationalization&lt;br /&gt;
* Python to allow scriptable AIs&lt;br /&gt;
* Otherwise, most of Wesnoth's technology is “home grown”:&lt;br /&gt;
** WML : the scripting language used to write scenarios&lt;br /&gt;
** FormulaAI : our AI developement language&lt;br /&gt;
&lt;br /&gt;
* 2.1 million downloads via sourceforge.net, many more via various mirrors of Linux Distributions&lt;br /&gt;
* best rated game at the [http://www.happypenguin.org/list?sort=avg_rating linux game tome]&lt;br /&gt;
* game of the year 2007 at [http://www.linuxquestions.org/questions/2007-linuxquestions.org-members-choice-awards-79/open-source-game-of-the-year-610236/ linuxquestions.org]&lt;br /&gt;
&lt;br /&gt;
==== Why is your organization applying to participate in GSoC 2008? What do you hope to gain by participating?====&lt;br /&gt;
&lt;br /&gt;
Most of our developers have particular areas of interest in which they work. Though they are efficient in their areas, there are other, presently uncovered, areas of the code with a need for improvements but a high barrier to entry for casual contributors.&lt;br /&gt;
&lt;br /&gt;
If a student were dedicated to any of these uncovered areas, we believe that person could be brought up to speed relatively quickly and function as a peer of the existing developers.&lt;br /&gt;
&lt;br /&gt;
By bringing new people in and allowing them to be actively responsible for an area of code, we hope to kickstart some areas of the project that have lagged behind&lt;br /&gt;
&lt;br /&gt;
==== Did your organization participate in past GSoCs? If so, please summarize your involvement and the successes and challenges of your participation.====&lt;br /&gt;
This is the first time the Wesnoth project has applied to Google SoC.&lt;br /&gt;
&lt;br /&gt;
==== If your organization has not previously participated in GSoC, have you applied in the past? If so, for what year(s)?====&lt;br /&gt;
&lt;br /&gt;
This is the first time the Wesnoth project has applied to Google SoC.&lt;br /&gt;
&lt;br /&gt;
==== Who will your organization administrator be? Please include Google Account information.====&lt;br /&gt;
Nils Kneuper aka Ivanovic&lt;br /&gt;
&lt;br /&gt;
crazy.ivanovic |ATTT| googlemail.com&lt;br /&gt;
&lt;br /&gt;
==== What license(s) does your project use?====&lt;br /&gt;
Our project is entirely GPL.&lt;br /&gt;
&lt;br /&gt;
All code is GPL.&lt;br /&gt;
&lt;br /&gt;
All art is GPL, 99% was made for the project, everything else was taken from content that was checked to be GPL.&lt;br /&gt;
&lt;br /&gt;
==== What is the URL for your ideas page?====&lt;br /&gt;
Our main summer of code page is located at http://www.wesnoth.org/wiki/SummerOfCodeIdeas&lt;br /&gt;
&lt;br /&gt;
This page contains various coding ideas and the thought the development team has already given them.&lt;br /&gt;
&lt;br /&gt;
It also contains a list of the developers that are the most active on IRC and their domains of interest.&lt;br /&gt;
&lt;br /&gt;
==== What is the main development mailing list or forum for your organization?====&lt;br /&gt;
Most development work takes place on &amp;quot;wesnoth-dev |ATTT| gna.org&amp;quot;. Beside this some work happens at http://www.wesnoth.org/forum/.&lt;br /&gt;
&lt;br /&gt;
in particular, all art developement takes place on the forum.&lt;br /&gt;
&lt;br /&gt;
==== What is the main IRC channel for your organization?====&lt;br /&gt;
&lt;br /&gt;
All our IRC channels are on the ''freenode'' network&lt;br /&gt;
&lt;br /&gt;
* ''#wesnoth-dev'' is the main development channel, where most discussion takes place&lt;br /&gt;
* ''#wesnoth'' is a generic channel for the community&lt;br /&gt;
* ''#wesnoth-mp'' is a separate channel for multiplayer games and balancing&lt;br /&gt;
&lt;br /&gt;
==== Does your organization have an application template you would like to see students use? If so, please provide it now.====&lt;br /&gt;
We plan mainly to meet potential students through our IRC channel, but the following questions are wesnoth-specific and are worth pondering for any student, even if we don't need a formal answer&lt;br /&gt;
&lt;br /&gt;
* Basics&lt;br /&gt;
** Just write a small introduction to yourself.&lt;br /&gt;
** State your preferred email address.&lt;br /&gt;
** If you have chosen a nick for IRC and Wesnoth forums, what is it?&lt;br /&gt;
** Why do you want to participate in summer of code?&lt;br /&gt;
** What are you studying, subject, level and school? &lt;br /&gt;
&lt;br /&gt;
* Experience&lt;br /&gt;
** What programs/software have you worked on before?&lt;br /&gt;
** Have you developed software in a team environment before? (As opposed to hacking on something on your own)&lt;br /&gt;
** Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why?&lt;br /&gt;
** What development model would you use (e.g. keywords: V-model, XP programming, agile programming, iterative; with the help of prototyping, formal specifications, tests, etc).&lt;br /&gt;
** Open Source&lt;br /&gt;
*** Are you already involved with any open source development project? If yes, please describe the project and the scope of your involvement.&lt;br /&gt;
** Gaming experience&lt;br /&gt;
*** Are you a gamer?  If so...&lt;br /&gt;
*** What type of gamer are you?&lt;br /&gt;
*** What type of games? &lt;br /&gt;
*** What type of opponents do you prefer? &lt;br /&gt;
*** Are you more interested in story or gameplay?&lt;br /&gt;
*** Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer.&lt;br /&gt;
&lt;br /&gt;
We do not plan to favor Wesnoth players as such, but some particular projects require a good feeling for the game which is hard to get without having played intensively.&lt;br /&gt;
&lt;br /&gt;
* Communication skills&lt;br /&gt;
** Though most of our developers are not native English speakers, English is the project's working language.  Describe your fluency level in written English.&lt;br /&gt;
** Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough.&lt;br /&gt;
** Do you give constructive advice? &lt;br /&gt;
** Do you receive advice well? &lt;br /&gt;
** Are you good at sorting useful criticisms from useless ones?&lt;br /&gt;
&lt;br /&gt;
* Project&lt;br /&gt;
** Did you select a project from our list? If that is the case, what project did you select?&lt;br /&gt;
** If you have invented your own project, please describe the project and the scope.&lt;br /&gt;
** Why did you choose this project?&lt;br /&gt;
** Include an estimated timeline for your work on the project&lt;br /&gt;
** Include as much technical detail about your implementation as you can&lt;br /&gt;
** What do you expect to gain from this project?&lt;br /&gt;
** What would make you stay in the Wesnoth community after the conclusion of SOC? &lt;br /&gt;
&lt;br /&gt;
* Practical considerations&lt;br /&gt;
** Are you familiar with any of the following tools?&lt;br /&gt;
*** Subversion&lt;br /&gt;
*** C++&lt;br /&gt;
*** Python&lt;br /&gt;
** Which tools do you normally use for development? Why do you use them?&lt;br /&gt;
** What programming languages are you fluent in?&lt;br /&gt;
** What spoken languages are you fluent in?&lt;br /&gt;
** At what hours are you awake (please specify in UTC)&lt;br /&gt;
** Would you mind talking with your mentor on telephone / internet phone? &lt;br /&gt;
&lt;br /&gt;
* Detailed answer (optional, but writing skill is a good predictor of ability to work on a programming team, so you will improve your chances by responding to this).&lt;br /&gt;
** Write a small essay (750-1000 words or more) explaining why you want to participate in a Wesnoth GSoC project. You can use the above questions as guides, but feel free to throw in more information if you feel it is relevant.&lt;br /&gt;
** What is your perception of 'open source'? Briefly explain what you think of the whole 'open source' concept, how you discovered open source, what you expect to gain/experience by participating in an open-source project. (Answer separately or as part of above mini-essay)&lt;br /&gt;
** What motivates or inspires you to write programs and develop software? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''''to be completed''''&lt;br /&gt;
&lt;br /&gt;
==== Who will be your backup organization administrator? Please include Google Account information.====&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
==== Who will your mentors be? Please include Google Account information.====&lt;br /&gt;
&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jeremy Rosen alias Boucman (boucman2|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Mark de Wever aka Mordante (mordante.wesnoth|ATTT|gmail.com)&lt;br /&gt;
&lt;br /&gt;
Jörg Hinrichs alias YogiHH (joerghh.hinrichs|ATTT|googlemail.com)&lt;br /&gt;
&lt;br /&gt;
==== What criteria did you use to select these individuals as mentors? Please be as specific as possible.====&lt;br /&gt;
&lt;br /&gt;
Our first criterion was that all the people had to be volunteers. According to other open source projects, being a SoC mentor takes a lot of time and the person has to be ready to spend quite some time with the student.&lt;br /&gt;
&lt;br /&gt;
Dave is the project leader and one of the most knowledgeable in C++. He has also written the Formula AI code which we plan to develop via the SoC. He is well known in our community for formulating simple but effective explanations for complicated topics, and has good design intuition. The growth of Wesnoth demonstrates his capacity to get other developers to work together and keep them involved in a thriving community.&lt;br /&gt;
&lt;br /&gt;
Boucman is one of the oldest active developers around. He has rewritten the whole animation engine and made it an easily pluggable system allowing artists to easily specify exactly how they want the units to appear. He also started many community oriented projects like the [http://wiki.wesnoth.org/UnsortedContrib Art Contribution] section of the wiki (now automated) and the [http://wiki.wesnoth.org/ReferenceWML WML Reference Manual]. He is responsible for dispatching and sorting the patches at http://patches.wesnoth.org and has created the new developer process we currently use. &lt;br /&gt;
&lt;br /&gt;
Mordante is one of the most active developers on our IRC channel. Not only has he done preliminary studies and coding in multiple areas that are candidates for Summer of Code ideas, he also is one of the coders with the best overview of the Wesnoth code. A large part of his work involves refactoring polishing existing code. Next to that he's very active with fixing bugs which leads him to all areas in the code base.&lt;br /&gt;
&lt;br /&gt;
YogiHH has been with the project for more than two years. He did a major refactoring to the gameplay engine and worked quite a bit on the multiplayer code. He also has been a professional trainer for C/C++, Java and C# for many years. Right now he works in a project where he serves as a mentor for a junior developer.&lt;br /&gt;
&lt;br /&gt;
All other developers listed in the ideas page are the leading capacities we do have for the respecting areas. Have a look at our list of people who to contact for which regards. In general all our developers will mentor all students. That is, questions should just be asked in our IRC channel, where basically every developer who has an idea can directly answer.&lt;br /&gt;
&lt;br /&gt;
When choosing the mentors, we have kept in mind that most developers can answer most technical questions, and we have chosen people that are well known for interacting with new-comers/external developers and can provide general guidance and design advice, more than people with specific technical knowledge.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing students?====&lt;br /&gt;
The first thing to do is to avoid this situation altogether. &lt;br /&gt;
&lt;br /&gt;
Wesnoth is a game, and as such has lots of developers that are not coders. In particular, artists are well known in the Wesnoth community for being very sensible about criticism and our community is used to people being sensible to critics. &lt;br /&gt;
&lt;br /&gt;
We will try to choose students that accept criticism and are able to filter constructive criticism from useless one. The Wesnoth developer community is used to judging people according to these criteria and the special title we are going to give to applicants will allow us to easily spot any such problems and discuss them before they grow out of control.&lt;br /&gt;
&lt;br /&gt;
If a student disappears, his mentor will be in charge of recontacting him to see what is going wrong (available time, tension with other developers, with members of the community etc...). Depending on the actual problem, the mentor and the student will have to agree on possible ways to defuse the problem.&lt;br /&gt;
&lt;br /&gt;
If a student disappears completely and there is no way to get back to him, there is little the project can do except salvaging whatever can be salvaged from the code (the students will have SVN write access, so most of the work will be committed either to trunk or to a specific branch) and find a core developer to take on the job. This will probably be slower and less effective for the project, but it's the best we can do.&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing mentors?====&lt;br /&gt;
&lt;br /&gt;
All our mentors are long time developers that volunteered for the job, so we don't expect that to happen. We took the time to ask other former GSoC projects about the workload needed to be a mentor, and our mentors accepted the job knowing the amount of work it involved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
However, should it happen, we would continue to mentor as a developper community the student until we find a new &amp;quot;official&amp;quot; mentor to take on the job.&lt;br /&gt;
&lt;br /&gt;
==== What steps will you take to encourage students to interact with your project's community before, during and after the program?====&lt;br /&gt;
&lt;br /&gt;
Wesnoth has a particularly healthy community, both for developers and for players. &lt;br /&gt;
&lt;br /&gt;
Our general policy regarding new coders has always been &amp;quot;two patch... you're in&amp;quot; In other word, anybody that is able to get two non-trivial patches applied is offered commit right.&lt;br /&gt;
&lt;br /&gt;
We have a developer responsible for applying patches and guiding new developers into our community. This is a well known and effective process we plan to apply to students, directing them to our [[EasyCoding]] pages (these project are usually a couple of hours long and has been chosen to provide easy access to code)&lt;br /&gt;
&lt;br /&gt;
Usually, patches go back and forth a couple of time, to make sure that all secondary things are in place (indenting, coding style, modified makefiles etc.) The idea is that coder education should take place before the coder gets commit rights, but that getting new coder in is one of the most important things to maintain our project alive.&lt;br /&gt;
&lt;br /&gt;
If the student is a little proactive and ready to join IRC, all the developers are usually very welcoming, and good at directing newcomers to quickly give useful results.&lt;br /&gt;
&lt;br /&gt;
We also plan to give a special forum title to any students. This will allow all forum members to tell them apart from normal users and give them read/write access to the developer only forums. This will also allow us to quickly spot any problem they might have interacting with the player community. We have a very mature developer community, but our player community is made of all sort of people of all age and education, and it can be rough at time.&lt;br /&gt;
&lt;br /&gt;
==== What will you do to ensure that your accepted students stick with the project after GSoC concludes?====&lt;br /&gt;
&lt;br /&gt;
Since our community has a history of having developers easily and quickly join, we expect the student to be a full-fledged developer quite fast (probably a little after the end of the bonding period). &lt;br /&gt;
&lt;br /&gt;
Thus there will be no &amp;quot;end of GSoC&amp;quot; transition. At the end of the Summer of code we expect the student to be responsible for the part he developed, and to continue taking care of it, like other developers are responsible for their part.&lt;br /&gt;
&lt;br /&gt;
''''TO BE COMPLETED''''&lt;br /&gt;
&lt;br /&gt;
== People to bug on IRC ==&lt;br /&gt;
Everybody feel free to edit/correct his entry!&lt;br /&gt;
&lt;br /&gt;
=== boucman ===&lt;br /&gt;
As our &amp;quot;patch monkey&amp;quot; he accustomed to critiquing patches of every kind. Beside this, he knows many areas of the game due to working on applying patches. He is particularly used to answering question from new coders, and doesn't mind explaining trivial stuff. He was the one who started the &amp;quot;two patches, you're in&amp;quot; policy and the ReferenceWML part of the project.&lt;br /&gt;
&lt;br /&gt;
=== Dave alias Sirp ===&lt;br /&gt;
Sirp started Wesnoth and is our lead developer. He is currently our C++ expert and is also the one that is working on the new Formula AI. Any questions regarding the formula AI should be directed to him.&lt;br /&gt;
&lt;br /&gt;
=== Elias Pscherning (elias) ===&lt;br /&gt;
He wrote the original version of campgen and as such will know a lot about what is needed to to make such an editor work correctly. The work on a scenario editor might be based upon campgen and as such his knowledge will be really helpful.&lt;br /&gt;
&lt;br /&gt;
=== Eric S. Raymond (ESR) ===&lt;br /&gt;
ESR is our project toolsmith; he has written several tools that semi-automate various aspects of WML maintenance.  While most of our developers/designers concentrate on either the C++ core or WML but not both, he has a balanced understanding of both levels and may be helpful in helping students develop a grasp of the overall architecture.  Finally, he did the last overhaul of the Wesnoth UI and understands UI design principles; he is well-equipped to guide students working in that area.&lt;br /&gt;
&lt;br /&gt;
=== Karol Nowak (grzywacz) ===&lt;br /&gt;
Last year he participated at GSoC as a student, so he will understand the situation of GSoC students. Beside this he is our top expert on embedded devices, and is actively working on the gp2x support.&lt;br /&gt;
&lt;br /&gt;
=== Mordante ===&lt;br /&gt;
Many of the possible projects involve the code for which he is an area expert. Also, many of the possible projects currently listed on the ideas page require GUI parts to work. Given that Mordante wants to tackle a rewrite of large parts of this, he will be our expert there as well as already being our area expert for the terrain engine.&lt;br /&gt;
&lt;br /&gt;
=== Nils Kneuper (Ivanovic) ===&lt;br /&gt;
He is doing nothing special, he just does some &amp;quot;administrative work&amp;quot; like packaging fresh tarballs when it is time for them and works on setting up any kind of deadlines and timetables related to releasing. He has administrative powers in most areas, no matter if website, forum or IRC. Beside this he uploads translation updates, tries to communicate with the translation teams when it is required and translates a little bit himself every now and then. But in general he is not a real expert in anything, just has a look at things that come up and redirects people to the correct contacts.&lt;br /&gt;
&lt;br /&gt;
=== Noy ===&lt;br /&gt;
Noy is an oddity among developers; he's got no coding skills whatsoever and possesses a limited understanding of computers, which is illustrated by his difficulty operating a Mac. Instead, Noy makes his contribution in gameplay and multiplayer design, drawing upon his background in social sciences research, military strategy and playing games online, to understand the effects of development on the playing community behavior. Along with Soliton, Noy is a useful conduit to discuss any issues in this area; just don't ask him about revising the level of randomness in the game.&lt;br /&gt;
&lt;br /&gt;
=== Noyga ===&lt;br /&gt;
Another versatile developer, on the C++ side he doesn't concentrate on a particular area, did some tweaks to improve translations in some languages (like enabling the female forms for names in various place) but know quite well the C++ side of units, abilities and WML. On the WML side he's an expert.&lt;br /&gt;
&lt;br /&gt;
=== Soliton ===&lt;br /&gt;
He knows our MP server setup best. Beside this he has already done a lot of work on the MP server himself. So he probably has most knowledge about it and, being one of our MP-developers, might provide important help from the perspective of the MP player community and what is needed there.&lt;br /&gt;
&lt;br /&gt;
=== YogiHH or Piotr Cychowski (cycholka) ===&lt;br /&gt;
Since they are the two developers who know most about building under Windows, they will probably be really helpful. Either if the student comes from the Windows side, or to help test resulting work to make sure that it does work on Windows and, for the case that it does not, to show them where problems are.&lt;br /&gt;
&lt;br /&gt;
=== zookeeper or Mythological or Rhuvaen ===&lt;br /&gt;
As our leading WML experts those are to be contacted when it comes to anything related WML problems since they know this stuff best. They do maintain most of the campaigns and improve them whenever they have a good idea for changes.&lt;br /&gt;
&lt;br /&gt;
[[Category:Future]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23070</id>
		<title>SummerOfCodeIdeas</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=SummerOfCodeIdeas&amp;diff=23070"/>
		<updated>2008-03-01T18:28:47Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Who will your mentors be? Please include Google Account information. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ideas for Google Summer of Code projects ==&lt;br /&gt;
&lt;br /&gt;
This is a compilation of ideas from ML. Needs to be refined (more detailed description, deliverables, workload estimation?):&lt;br /&gt;
&lt;br /&gt;
== List of Ideas for the Project ==&lt;br /&gt;
&lt;br /&gt;
=== Writing an AI based on the formula AI ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth has always had a simple C++ based AI. David (our lead developer) has been working on a simple language to write AI in Wesnoth ''link to formula AI page here'' &lt;br /&gt;
&lt;br /&gt;
The Wesnoth AI is used as an opponent in most campaigns, and as such is an important piece of code for the Wesnoth project. Unfortunately it is also one of the most neglected piece of code and a place where a lot of research and work could be done&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to develop a new AI that would replace the original C++ AI. The main criterias we would want for this new AI are&lt;br /&gt;
&lt;br /&gt;
* ''Plugability :'' It should be trivial for any content maker to change the behavior of the AI in specific case. The exact cases are still to be defined but should typically include&lt;br /&gt;
** hardwiring the first few turns of the AI&lt;br /&gt;
** changing the recruitment pattern&lt;br /&gt;
** completely controlling a given unit (scenario unit)&lt;br /&gt;
** taking control then giving back control of a given unit&lt;br /&gt;
* ''tunability :'' It should be easy for a scenario author to specify the general behaviour of the enemy on a given scenario (aggressiveness, intrepidity...)&lt;br /&gt;
* ''specific behaviours :'' there are some typical behaviours that are not smart to win the scenario but are needed, such as guarding a given unit, a given position, wandering aimlessly, attacking randomly, always fleeing. The AI should implement such behaviours, and allow easy addition of new behaviours&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* ''A minimal knowledge of C++ is required, a good knowledge of C++ is desired :'' The formula AI framework is a work in progress and chances are high that some changes in the wesnoth code base will be needed. The wesnoth developer community is used to handle people that are familiar with coding but not C++, however the Formula AI framework uses advanced C++ features and a good knowledge of the language would avoid a major hurdle when plugging in new entries or functionalities for the AI&lt;br /&gt;
* ''Good social interaction with a large player community :'' A preliminary phase to coding any AI is to know the strategies and game pattern used by human players. This requires huge interaction with the player community. Our Gameplay Developers are open and can give some good starting points, but a big game experience and good interaction with the player community will greatly help in the study of the design&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
It is hard to give milestones at this point, but here are some ideas of what could be done&lt;br /&gt;
&lt;br /&gt;
* ''AI design description, and basic function library :'' This first deliverable aims to conclude the '''study and analysis''' part of the project : becoming familiar with the formula language, study of multiplayer strategies and of the need of scenario writers with regard to AI. We would like to have a description of the code structure of the AI, some basis of the play strategies it would use and how external scenario writers could configure it for the particular behaviour they need&lt;br /&gt;
* ''Main AI delivery :'' This milestone's aim is to deliver a working AI implementing the strategies described in the first phase. It would not have to systematically beat the standard C++ AI at this point, but should be able to play the game correctly (recruit, early deployment on villages, grouping units to attack, holding its ground, protecting weak/important units). Moreover most plug-in entries should be available and a test-case for these entries should be provided.&lt;br /&gt;
* ''Fine tunning and behaviour library :'' The third phase would validate the actual strategy of the AI. The AI should consistently beat the default C++ AI, and do fairly well against an average human player. At that stage a library of scenario behaviours should also be delivered. The AI does not need to be as efficient with all scenario tweaking, but should act correctly with regard to the particular behaviour desired.&lt;br /&gt;
&lt;br /&gt;
=== Extending the Multiplayer server ===&lt;br /&gt;
&lt;br /&gt;
When the development team met at FOSDEM, we had our multiplayer community, though it is strong and healthy, had its growth restrained by the interface of the multiplayer lobby.&lt;br /&gt;
&lt;br /&gt;
==== General Description ====&lt;br /&gt;
The general idea of this project would be&lt;br /&gt;
* To study the current lobby,&lt;br /&gt;
* To present some ideas of evolutions both in interface and functionalities of our multiplayer interface to allow it to scale to a much larger community&lt;br /&gt;
* To present some well constructed thought on our MP community and how that interface would develop it&lt;br /&gt;
* Of course to implement those changes :)&lt;br /&gt;
&lt;br /&gt;
Some ideas that we had (but that are in no way mandatory)&lt;br /&gt;
* Having a simple way to register and authenticate nicknames, similar to what IRC offers. The point is not to have cryptographically safe logins, but to have something simple that gets the job done&lt;br /&gt;
* Having a simple room system? again inspired on IRC&lt;br /&gt;
* Having some way to find the type of games you are interested in.&lt;br /&gt;
** game type&lt;br /&gt;
** number of free slots/players&lt;br /&gt;
** any other criteria you might find interesting&lt;br /&gt;
&lt;br /&gt;
Other ideas we are not convinced are good, but that are certainly worth studying (especially how the communities based around these concepts are different from ours)&lt;br /&gt;
* ranking players&lt;br /&gt;
* guilds&lt;br /&gt;
* official tournaments&lt;br /&gt;
* titles for players&lt;br /&gt;
* metaservers&lt;br /&gt;
&lt;br /&gt;
The scalability of the project, both in term of number of players, and in term of the possibility for players and developers to extend the concept will be a valued criteria&lt;br /&gt;
&lt;br /&gt;
Administration/moderation problems and techniques should also be studied&lt;br /&gt;
&lt;br /&gt;
interaction with the Add-On server/forum might be an interesting field to expand to&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
&lt;br /&gt;
* A fair amount of experience on C++ is required. Wesnoth uses some advanced C++ features and is heavily based on BOOST and STL. We can train you in some of the libraries used, but learning all of them would be a big hurdle&lt;br /&gt;
* Various experience with multiplayer games, in order to have a good idea of what multiplayer lobbies of other game look like, and (more importantly) a good idea of the social behaviours of multiple MP communities, how teams are formed in games and things like that&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
&lt;br /&gt;
* A first milestone would be a presentation summarizing the different studies, and the proposed interface. preliminary informal stages would probably be desirable, to make sure the proposed idea is already a consensus within devs &lt;br /&gt;
** Study of other MP game-matching interfaces and functionalities&lt;br /&gt;
** Study of other MP communities&lt;br /&gt;
** Study of other MP moderation practices&lt;br /&gt;
** Study of the Wesnoth MP community, including needs, various opinons from different developers and players&lt;br /&gt;
* A second milestone would be the main code delivery. Code should be functional for it will be delivered in the next Wesnoth development release&lt;br /&gt;
&lt;br /&gt;
=== Scenario/Campaign editor ===&lt;br /&gt;
&lt;br /&gt;
Currently, in order to create campaign or multiplayer scenarios, it is necessary to manually edit WML files - XML-like configuration files. The goal of this project would be to create a graphical editor allowing the same.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
&lt;br /&gt;
A scenario editor for Wesnoth supporting everything possible by Wesnoth's engine would be a huge project, so the scope of the actual project would of course be limited - what exactly should be implemented would be decided by initial discussion. Implementation details and choice of language/tools would also be up to the student to choose. The main ideas would be for the scenario editor to be:&lt;br /&gt;
* cross-platform (at least Linux, OSX, Windows)&lt;br /&gt;
* easy to use (someone who tries reasonably hard should be able to create a simple scenario/campaign with it, even if not knowing WML)&lt;br /&gt;
* powerful (there already is a map editor coming with Wesnoth - the scenario editor will provide more/different things)&lt;br /&gt;
* extensible (also after the SoC project, it should be easy to add additional features)&lt;br /&gt;
&lt;br /&gt;
There exist at least two attempts at a scenario editor, an OSX-only one which shipped with early Wesnoth versions, and CampGen, an external tool written in WxPython. The student could look at them for ideas or even use one of them as base, but that should be discussed first. The below assumes a new application is developed from scratch (which likely will be much more motivating for the student than reviving an existing attempt). The actual things to be done would be:&lt;br /&gt;
&lt;br /&gt;
* Decide on a cross-platform GUI which would be best suited (Qt4, Wx, GTK, Wesnoth's builtin GUI (in that case, could maybe integrate with the existing map editor, but would have serious other problems), or others...).&lt;br /&gt;
* Decide on a platform/language to use (C++, Python, or others...). Wesnoth is written in C++, so it's what most developers would prefer, but as long as it can be expected to work on Linux, OSX and Windows, this is completely open.&lt;br /&gt;
* GUI design. This is the main part of the project. The editor should make it easy to create scenarios, so the GUI must not be confusing/hard to use.&lt;br /&gt;
* Decide on base features. [[ReferenceWML]] lists everything currently supported by WML. Theoretically, the scenario editor could support everything, but for the timeframe of the SoC project, it will be necessary to decide on the most important features and implement those.&lt;br /&gt;
** WML-centric or not? Two opposite views for such an editor would be to either strictly follow WML, as extreme case have one dialog for each WML element. Or on the other hand make a scenario creation tool which completely hides WML and then simply can export to WML, translating features as necessary. The final design likely would be somewhere in between.&lt;br /&gt;
** Ability to read existing WML? The editor will export to WML, but need to decide if it also should be able to read it.&lt;br /&gt;
** Built-in map editor? Wesnoth comes with a map editor, but it can only be used to define the terrain. The scenario editor has to allow placing events and units and other things, so it will need a way to display maps as well. Would be worth investigating if the existing C++ map-drawing code of Wesnoth can be re-used.&lt;br /&gt;
** Ability to enter custom WML code? For advanced users this might be nice, if it can integrate well.&lt;br /&gt;
** Story screen editor for campaigns?&lt;br /&gt;
** How powerful should the events editor be? WML basically is a turing complete language, so must decide what should be supported and how to present to the user.&lt;br /&gt;
** Custom unit animations?&lt;br /&gt;
** Custom multi-hex terrains?&lt;br /&gt;
* Extensibility (leave the possibility to extend the application with plugins for some of the above things, either with a plugin architecture or by making the source code modular enough)&lt;br /&gt;
* WML-export. The second major part besides designing and implementing all the GUI will be exporting the result to WML, and depending on some design choices this could prove more or less hard to do.&lt;br /&gt;
&lt;br /&gt;
==== Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++. Even in case the editor is not written in C++, it will be necessary to look at some parts of Wesnoth's source code (WML-parser, editor, ...) and understand them, possibly even integrate/re-use them.&lt;br /&gt;
* Ability/interest in GUI/application design. A not negligible part of the project likely will be spent designing various GUI dialogs.&lt;br /&gt;
* Prior use of level creation tools/modding tools. Knowing existing tools for other games will help a lot in the design phase, as many good ideas can be seen there. Not required though.&lt;br /&gt;
* Having played Wesnoth and knowing what scenarios look like would help. Someone who never played Wesnoth before would risk losing a lot of precious time playing the game instead of working :) But it's not required of course.&lt;br /&gt;
* Knowledge of WML. A candidate who already knows Wesnoth's WML could save the initial time studying it. (On the other hand, not knowing WML might mean less technical bias and might lead to an application which is easer to use for non-technical users.)&lt;br /&gt;
* Ability to interact with developers/users. Presenting GUI mockups and test versions and incorporating early user feedback likely will improve the end result a lot. The Wesnoth community is big enough that there should be quite some willing testers.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
The initial design will decide on many later things, and likely a lot of talking to developers and users will be necessary. But some general milestones I'd expect:&lt;br /&gt;
* Create a base test application in the chosen language/platform. This will not do much yet, maybe load some WML and display it as text. Try to package it for Linux, OSX and Windows (there will be help from the Wesnoth community, so no need to have access to all of them), and see if it can be expected to work. If a standard GUI like C++/Qt4 is used, this will be rather trivial. Something like Python/Wx or C#/.NET might take more time.&lt;br /&gt;
* Add ability to edit some very simple, maybe only textual properties of a scenario, and export to WML. It should already have base features like Save/Load/Undo, copy/paste, multiple documents, and so on. Depending on the chosen GUI this may be easy or already require some work.&lt;br /&gt;
* Finish design. Should list the intended features and demonstrate how the GUI will work.&lt;br /&gt;
* Start implementation, a natural milestone would be to make it possible to create and export a very simple, but playable scenario.&lt;br /&gt;
* Add more of the features (which ones and in which order depends on the design above, a detailed roadmap will be part of it).&lt;br /&gt;
&lt;br /&gt;
=== Addon server ===&lt;br /&gt;
Wesnoth has an addon server which offers users to upload user &lt;br /&gt;
made content (UMC). This allows all other users of Wesnoth&lt;br /&gt;
to easily download and install this content. The server was &lt;br /&gt;
originally written for user made campaigns but contains a lot&lt;br /&gt;
more types of addons nowadays. Both the server side and the &lt;br /&gt;
client side need to be improved.&lt;br /&gt;
&lt;br /&gt;
==== General description ====&lt;br /&gt;
Both the server and client side of the addon server haven't&lt;br /&gt;
been improved over the years and can use quite some improvements.&lt;br /&gt;
The client side GUI needs quite some improvements. For the&lt;br /&gt;
server side it's wanted to allow better integration with&lt;br /&gt;
various tools, which improve the quality of the addons.&lt;br /&gt;
&lt;br /&gt;
===== Server side =====&lt;br /&gt;
The server code either needs to be updated or rewritten, the&lt;br /&gt;
student is free to make this decision him or herself. The&lt;br /&gt;
student is free to choose the language for the server.&lt;br /&gt;
&lt;br /&gt;
* The server only needs to run on Linux systems, crossplatform would be nice but isn't  required.&lt;br /&gt;
* At the moment there's a rudimentary integration with our translation project Wescamp. This needs to be improved. Upon uploading the new content needs to be send to Wescamp (via a svn commit). And the translations need to be fetched on a regular basis.&lt;br /&gt;
* We have various tools to check the WML code and also upgrade it to newer version. The addon server needs to be able to run those tools on the content.&lt;br /&gt;
&lt;br /&gt;
===== Client side =====&lt;br /&gt;
The client side needs improvements, there are two main clients&lt;br /&gt;
the ingame version and a standalone version in Python.&lt;br /&gt;
&lt;br /&gt;
* Upgrade the GUI, Mordante is working on a new GUI library which is intended to make it possible to make the wanted changes.&lt;br /&gt;
* Make it easier to see what kind of addon it is, at the moment a lot of new users download something and have no clue what kind of addon it is.&lt;br /&gt;
* Make it easier to see whether a newer version of the addon is on the server and update the addon.&lt;br /&gt;
* Make it easy to select which translations you want to download and also look for newer versions of the translations.&lt;br /&gt;
&lt;br /&gt;
====  Required knowledge and talent ====&lt;br /&gt;
* Knowledge of C++, the game is written in C++ and modifications need to be made there. &lt;br /&gt;
* Knowlegde of Python, various tools have been written in Python which need to be intergrated with the new server.&lt;br /&gt;
&lt;br /&gt;
==== Milestones and deliverables ====&lt;br /&gt;
* The first step is to determine what exactly needs to be done and determine in which language the server will be rewritten. This includes, but isn't limited to:&lt;br /&gt;
** Determine the exact feature set.&lt;br /&gt;
** Protocol changes needed.&lt;br /&gt;
** Methods to integrate with both the WML tools and Wescamp with the new server.&lt;br /&gt;
** Determine the GUI for the client side.&lt;br /&gt;
* This needs to be presented and discussed with the mentor(s).&lt;br /&gt;
* The next thing in to implement the feature set. The code needs to be fully functional and committed in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Own ideas ===&lt;br /&gt;
If you have your own idea the best thing is to join &lt;br /&gt;
IRC wesnoth-dev at irc.freenode.net and discuss the&lt;br /&gt;
idea with the developers there. If the developers&lt;br /&gt;
think your idea is interesting and like the feature&lt;br /&gt;
you can start to turn it into a full proposal. Once &lt;br /&gt;
done discuss it again on IRC so the developers can &lt;br /&gt;
accept your idea.&lt;br /&gt;
&lt;br /&gt;
=== Other ideas to be fleshed out ===&lt;br /&gt;
* Working on the GUI engine (needs to be defined more precisely)&lt;br /&gt;
* The editor can use quite a revamp&lt;br /&gt;
* A MapGenerator rewrite - better scalable for outdoor maps, plus the possibility to define areas (similar to the caverns in the ave generator) etc.&lt;br /&gt;
&lt;br /&gt;
== Other info to provide for GSoC ==&lt;br /&gt;
==== Describe your organization. ====&lt;br /&gt;
&lt;br /&gt;
==== Why is your organization applying to participate in GSoC 2008? What do you hope to gain by participating?====&lt;br /&gt;
&lt;br /&gt;
Most of our developers have interesting areas in which they work. Though they are efficient in their areas, there are areas that are interesting but have a high barrier of entry.&lt;br /&gt;
&lt;br /&gt;
By having a student dedicated to any of these areas, we could quickly get someone up to date with that particular area, efficient, and responsible of this area.&lt;br /&gt;
&lt;br /&gt;
Basically, by getting new people in and making them actively responsible for an area of code we hope to kickstart some areas of the project that have lagged behind&lt;br /&gt;
&lt;br /&gt;
==== Did your organization participate in past GSoCs? If so, please summarize your involvement and the successes and challenges of your participation.====&lt;br /&gt;
This is the first time the Wesnoth projects applies to Google SoC&lt;br /&gt;
&lt;br /&gt;
==== If your organization has not previously participated in GSoC, have you applied in the past? If so, for what year(s)?====&lt;br /&gt;
&lt;br /&gt;
This is the first time the Wesnoth projects applies to Google SoC&lt;br /&gt;
&lt;br /&gt;
==== Who will your organization administrator be? Please include Google Account information.====&lt;br /&gt;
Nils Kneuper aka Ivanovic&lt;br /&gt;
&lt;br /&gt;
crazy.ivanovic |ATTT| googlemail.com&lt;br /&gt;
&lt;br /&gt;
==== What license(s) does your project use?====&lt;br /&gt;
Our project is entirely GPL.&lt;br /&gt;
&lt;br /&gt;
All code is GPL.&lt;br /&gt;
&lt;br /&gt;
All art is GPL, 99% was made for the project, everything was taken from content that was checked to be GPL.&lt;br /&gt;
&lt;br /&gt;
==== What is the URL for your ideas page?====&lt;br /&gt;
Our main summer of code  pages is located at http://www.wesnoth.org/wiki/SummerOfCodeIdeas&lt;br /&gt;
&lt;br /&gt;
This page contains various coding ideas and the thought the development team has already given them.&lt;br /&gt;
&lt;br /&gt;
It also contains a list of the developers that are the most active on IRC and their domain of interest.&lt;br /&gt;
&lt;br /&gt;
==== What is the main development mailing list or forum for your organization?====&lt;br /&gt;
Most development work takes place on &amp;quot;wesnoth-dev |ATTT| gna.org&amp;quot;. Beside this some work happens at http://www.wesnoth.org/forum/.&lt;br /&gt;
&lt;br /&gt;
in particular, all art developement takes place on the foum&lt;br /&gt;
&lt;br /&gt;
==== What is the main IRC channel for your organization?====&lt;br /&gt;
&lt;br /&gt;
All our IRC channels are on the ''freenode'' network&lt;br /&gt;
&lt;br /&gt;
* ''#wesnoth-dev'' is the main development channel, where most discussion takes place&lt;br /&gt;
* ''#wesnoth'' is a generic channel for the community&lt;br /&gt;
* ''#wesnoth-mp'' is a separate channel for multiplayer games and balancing&lt;br /&gt;
&lt;br /&gt;
==== Does your organization have an application template you would like to see students use? If so, please provide it now.====&lt;br /&gt;
We plan mainly to meet potential students through our IRC channel, but the following questions are wesnoth-specific and are worth pondering for any student, even if we don't need a formal answer&lt;br /&gt;
&lt;br /&gt;
* What type of gamer are you? What type of games? What type of opponent? Are you more interested in story or gameplay ? &lt;br /&gt;
* Are you good at interacting with other players ? Our developer community is quite nice, but the player community can be a bit rough.&lt;br /&gt;
* Do you give constructive advices? Do you receive advice well? Are you good at sorting useful criticism from useless ones?&lt;br /&gt;
&lt;br /&gt;
''''to be completed''''&lt;br /&gt;
&lt;br /&gt;
==== Who will be your backup organization administrator? Please include Google Account information.====&lt;br /&gt;
&lt;br /&gt;
Jeremy Rosen alias Boucman&lt;br /&gt;
&lt;br /&gt;
boucman2|ATTT|gmail.com&lt;br /&gt;
&lt;br /&gt;
==== Who will your mentors be? Please include Google Account information.====&lt;br /&gt;
&lt;br /&gt;
David White (davewx7@gmail.com)&lt;br /&gt;
&lt;br /&gt;
==== What criteria did you use to select these individuals as mentors? Please be as specific as possible.====&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing students?====&lt;br /&gt;
&lt;br /&gt;
==== What is your plan for dealing with disappearing mentors?====&lt;br /&gt;
&lt;br /&gt;
==== What steps will you take to encourage students to interact with your project's community before, during and after the program?====&lt;br /&gt;
&lt;br /&gt;
Wesnoth has a particularly healthy community, both for developers and for players. &lt;br /&gt;
&lt;br /&gt;
Our general policy regarding new coders has always been &amp;quot;two patch... you're in&amp;quot; In other word, anybody that is able to get two non-trivial patches applied is offered commit right.&lt;br /&gt;
&lt;br /&gt;
We have a developer responsible for applying patches and guiding new developers into our community. This is a well known and effective process we plan to apply to students, directing them to our [[EasyCoding]] pages (these project are usually a couple of hours long and has been chosen to provide easy access to code)&lt;br /&gt;
&lt;br /&gt;
Usually, patches go back and forth a couple of time, to make sure that all secondary things are in place (indenting, coding style, modified makefiles etc.) The idea is that coder education should take place before the coder gets commit rights, but that getting new coder in is one of the most important things to maintain our project alive.&lt;br /&gt;
&lt;br /&gt;
If the student is a little proactive and ready to join IRC, all the developers are usually very welcoming, and good at directing newcomers to quickly give useful results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We also plan to give a special forum title to any students. This will allow all forum members to tell them appart from normal users and give them read/write access to the developper only forums.&lt;br /&gt;
&lt;br /&gt;
This will also allow usto quickly spot any problem they might have interacting with the player community. We have a very mature developper community, but our player community is made of all sort of people of all age and education, and it can be rough at time.&lt;br /&gt;
&lt;br /&gt;
==== What will you do to ensure that your accepted students stick with the project after GSoC concludes?====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== People to bug on IRC, possible mentors ===&lt;br /&gt;
Everybody feel free to edit/correct his entry!&lt;br /&gt;
&lt;br /&gt;
==== Dave alias Sirp ====&lt;br /&gt;
&lt;br /&gt;
Sirp started Wesnoth and is our lead developper. He is currently our C++ expert and is also the one that is working on the new Formula AI. Any questions regarding the formula AI should be directed to him.&lt;br /&gt;
&lt;br /&gt;
==== Mordante ====&lt;br /&gt;
Many of the possible projects do at least partly go into the area of code where he knows most of. Plus many of the possible projects currently listed on the ideas page do require GUI parts to work, too. So if Mordante wants to tackle a rewrite of large parts of this, he will be our expert there as well as he already is our expert for the terrain engine (cf. editor / scenario editor works).&lt;br /&gt;
&lt;br /&gt;
==== Elias Pscherning (elias) ====&lt;br /&gt;
He has written the original version of campgen and as such will know a lot about what is needed to to make such an editor work correctly. The work on a scenario editor might be based upon campgen and as such make his knowledge really helpful.&lt;br /&gt;
&lt;br /&gt;
==== Karol Nowak (grzywacz) ====&lt;br /&gt;
Last year he was participating at GSoC as a student, so he knows at least this side of the medal. Beside this he is our top expert regarding embedded devices support since he is actively working on the gp2x support.&lt;br /&gt;
&lt;br /&gt;
==== boucman ====&lt;br /&gt;
As our &amp;quot;patch monkey&amp;quot; he has valuable knowledge in comments and critics for patches of every kind. Beside this he knows many areas of the game due to working on applying patches. He is particularly used to answer question from new coders, and doesn't mind explaining trivial stuff.&lt;br /&gt;
&lt;br /&gt;
He was the one who started the &amp;quot;two patches, you're in&amp;quot; policy and the ReferenceWML part of the project&lt;br /&gt;
&lt;br /&gt;
==== Soliton ====&lt;br /&gt;
He does know our mp server setup best. Beside this he already has done a lot of work on the mp server himself, too. So he probably has most knowledge about it and due to being one of our mp-developers might provide important help from the perspective of mp-community and what is needed there.&lt;br /&gt;
&lt;br /&gt;
==== zookeeper or Mythological or Rhuvaen ====&lt;br /&gt;
As our leading WML expert it would be good to have him in the list when it comes to WML specific problems. That is for work on the scenario editor he probably knows best what should be implemented in it and what is a usable way for things.&lt;br /&gt;
&lt;br /&gt;
==== YogiHH or Piotr Cychowski (cycholka) ====&lt;br /&gt;
Since they are the two developers who know most about building under Windows, they will probably be really helpful. Either if the student comes from the Windows side, or to help test resulting work to make sure that it does work on Windows and, for the case that it does not, to show them where problems are.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=WesnothPhilosophy&amp;diff=22984</id>
		<title>WesnothPhilosophy</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=WesnothPhilosophy&amp;diff=22984"/>
		<updated>2008-02-29T23:07:04Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Wesnoth Philosophy II: Where Next? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Needs update}}&lt;br /&gt;
== The History of, and Philosophy behind Wesnoth ==&lt;br /&gt;
&lt;br /&gt;
The 18th of December [2003] will mark six months since the first version of Battle for Wesnoth, version 0.1, was released.&lt;br /&gt;
&lt;br /&gt;
At this time, I feel it is appropriate to respond to something Bazarov said in another thread:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;am having a little difficulty understanding the core values of the game in the eyes of the creators. I think having an established, ordered list of these would help a lot in my attempts to help. A white paper of sorts. I don't think this should be done by voting, either; a clear, concise vision would be nice. Where does originality factor in? I, too, felt that the game's focus was on the units rather than the strategy, that the building of my colourful army was more important than the logic of any scenario.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We talk about the 'KISS [1] principle' here a lot, and I think that that is the most core&lt;br /&gt;
design principle used in Wesnoth. It was the key principle that enabled Wesnoth&lt;br /&gt;
to get off the ground, and it is the principle that has kept it alive since.&lt;br /&gt;
&lt;br /&gt;
First of all, the concept of 'KISS' is a software development principle.&lt;br /&gt;
Not a game-design principle. The idea of game rules being simple is not&lt;br /&gt;
necessarily a bad one, and can be linked to KISS in that game rules&lt;br /&gt;
that are simple to implement are often ones that most players would&lt;br /&gt;
consider 'simple'. However simple game rules are not directly related&lt;br /&gt;
to KISS, as many people on the forum mistakenly seem to have thought.&lt;br /&gt;
&lt;br /&gt;
When I was a teenager, I attempted to write games several times.&lt;br /&gt;
Some of them were playable, even impressive - especially considering&lt;br /&gt;
my resources and skill - but none of them were professional, and polished.&lt;br /&gt;
When I showed them to people, they would be impressed, and say&lt;br /&gt;
&amp;quot;this looks good&amp;quot;, but I knew that none of them would actually want to take&lt;br /&gt;
the game home and play it for themselves.&lt;br /&gt;
&lt;br /&gt;
My programming skills back then left alot of room for improvement.&lt;br /&gt;
I had a basic, self-taught knowledge of C and C++.&lt;br /&gt;
Then I went to college, and after that got a job programming,&lt;br /&gt;
where my skills improved immensely.&lt;br /&gt;
&lt;br /&gt;
In some of my spare time, I decided to try writing a game again.&lt;br /&gt;
What kind of game? Well, I was confident of my skills,&lt;br /&gt;
so I would write a complex game, using all the latest programming tools.&lt;br /&gt;
&lt;br /&gt;
I wanted to write a Civilization-like game, but with some major rule changes,&lt;br /&gt;
and a better AI. I had thought up sophisticated systems for everything.&lt;br /&gt;
The result? It failed before it even got started, collapsing in a mountain of&lt;br /&gt;
complexity.&lt;br /&gt;
&lt;br /&gt;
I gave up on writing a game for a long time after that.&lt;br /&gt;
I was busy with other things anyhow. But then one day, I played&lt;br /&gt;
a game that I had played when I was much younger, a Genesis game:&lt;br /&gt;
Master of Monsters. It was fun, lots of fun, yet it was simple.&lt;br /&gt;
Simple enough that I was confident I could program a game like it easily enough.&lt;br /&gt;
&lt;br /&gt;
I had analyzed that most Free games fall into one of two categories:&lt;br /&gt;
they are either boringly trivial, or they are insanely complex,&lt;br /&gt;
and never really get off the ground. I decided I would claim the middle ground:&lt;br /&gt;
make it simple enough to write, but substantial enough to be lots of fun.&lt;br /&gt;
It wouldn't be as ambitious as some things I wanted to write, but at&lt;br /&gt;
least it would work.&lt;br /&gt;
&lt;br /&gt;
But, I don't see the point of writing a Free game which is simply&lt;br /&gt;
a copy of a commercial game. My aim would be to write&lt;br /&gt;
something new, something better, something which borrows the best ideas&lt;br /&gt;
from a number of other games, and which adds new ideas of its own.&lt;br /&gt;
&lt;br /&gt;
The idea of KISS is that the feature must be easy enough to program&lt;br /&gt;
that before the programmer starts working on it, they have a very clear&lt;br /&gt;
and strong understanding of how they're going to make it work.&lt;br /&gt;
Not a 'yes I can do this but it is kinda complicated'.&lt;br /&gt;
Rather they should be thinking 'this is so stupid and simple that it's&lt;br /&gt;
really really easy for me to do'. So I decided on a simple rule for the&lt;br /&gt;
game: a feature would be added only if I knew immediately how to implement it.&lt;br /&gt;
I wouldn't make vague promises to myself about features that would be later added,&lt;br /&gt;
but which I had no idea how to do.&lt;br /&gt;
&lt;br /&gt;
I started with a few basic units, and two races: Orcs and Elves.&lt;br /&gt;
Elves had horsemen, which could advance to knights, archers which&lt;br /&gt;
could advance to rangers, and fighters which could advance to heroes.&lt;br /&gt;
&lt;br /&gt;
I considered different systems of advancement. Even considering&lt;br /&gt;
something which keeps track of the activity the unit undergoes,&lt;br /&gt;
and advances it in that area, but I rejected such a system for&lt;br /&gt;
something simple, something similiar to Master&lt;br /&gt;
of Monsters with the added choice of letting the player&lt;br /&gt;
choose what their unit advances into at some points.&lt;br /&gt;
&lt;br /&gt;
The focus would be around building your own army, and watching&lt;br /&gt;
it grow as its members became more experienced.&lt;br /&gt;
You would only have basic control over the advancement of&lt;br /&gt;
a particular member of the army, but you would decide what units go&lt;br /&gt;
into the army.&lt;br /&gt;
&lt;br /&gt;
I also fleshed out a very basic interface. There would be only a few commands:&lt;br /&gt;
to move a unit, and to attack with that unit, as well as to recruit and&lt;br /&gt;
recall units. I added in unit skills, which was something Master of Monsters&lt;br /&gt;
didn't have, but I made the skills occur implicitly -- healing would be&lt;br /&gt;
dispensed to all units around a specific unit for instance.&lt;br /&gt;
&lt;br /&gt;
Obviously, Wesnoth is a fantasy game, so it contains some implication of&lt;br /&gt;
spells/magic, however I have always disliked games that got deep&lt;br /&gt;
into sophisticated systems of spells.&lt;br /&gt;
&lt;br /&gt;
In Wesnoth, wars would be decided with sword and bow.&lt;br /&gt;
Mages would be involved too, of course, but warfare was to be&lt;br /&gt;
about guiding troops around strategically, not about which spell&lt;br /&gt;
to cast and where. So, from the beginning I decided&lt;br /&gt;
that all spells would be implicit, or simply a type of attack.&lt;br /&gt;
&lt;br /&gt;
This was a big divergence from Master of Monsters where&lt;br /&gt;
one spell could be cast every turn by each master at any place&lt;br /&gt;
on the battlefield. That was, in my opinion, one of the game's&lt;br /&gt;
worst features - if your enemy had advanced a unit on&lt;br /&gt;
the other side of the map, you could try to kill him with a spell.&lt;br /&gt;
&lt;br /&gt;
I also made the combat very simple. An example of this is the&lt;br /&gt;
way in which the chance to hit is calculated. I'm&lt;br /&gt;
wondering how many people know how the chance to hit is calculated&lt;br /&gt;
in Wesnoth? I thought it was alot more complex in&lt;br /&gt;
Master of Monsters until I studied how they did it.&lt;br /&gt;
&lt;br /&gt;
What I suspect most people would immediately consider for a&lt;br /&gt;
chance-to-hit system would be a formula that relies on the&lt;br /&gt;
attacker's skill with the weapon, and the defender's defensiveness,&lt;br /&gt;
as well as the terrain the defender is in.&lt;br /&gt;
&lt;br /&gt;
The way Wesnoth does it is in fact so insanely simple that&lt;br /&gt;
I suspect many people who did not know how it is done will&lt;br /&gt;
think 'what a naive, silly system!' when they read the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;The chance to hit is taken entirely from the defender's defensive rating in the terrain it is in.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, there is always 30% chance to hit Elves in forest,&lt;br /&gt;
and 60% chance to hit them in grassland. The attacker's skill doesn't come&lt;br /&gt;
into the equation.&lt;br /&gt;
&lt;br /&gt;
I decided it would add interesting strategy, though, if just&lt;br /&gt;
a very few weapons had a special attribute that would&lt;br /&gt;
guarantee them a certain chance to hit. I decided that was&lt;br /&gt;
an appropriate thing for magic, to differentiate it: so, I&lt;br /&gt;
decided that magic attacks would always have 70% chance to hit.&lt;br /&gt;
&lt;br /&gt;
For all my efforts though, and for all the people who say that&lt;br /&gt;
graphics are of little importance or unimportant, I don't&lt;br /&gt;
think that Wesnoth would have gotten anywhere if fmunoz hadn't&lt;br /&gt;
seen it, and drawn some very good graphics for it. The&lt;br /&gt;
graphics I had drawn were pathetic, but he drew some nice ones,&lt;br /&gt;
and added the undead and later humans to the game, as&lt;br /&gt;
well as doing some scenarios, and adding some very good ideas to the game.&lt;br /&gt;
&lt;br /&gt;
I think it's important for us to remember the KISS principle&lt;br /&gt;
as development continues. Remember: Wesnoth has not reached&lt;br /&gt;
1.0 yet. It's not a finished work. It could still fail.&lt;br /&gt;
Let's make it easy for it to succeed by keeping everything simple.&lt;br /&gt;
&lt;br /&gt;
Oh and how did I come up with the name 'Wesnoth'?&lt;br /&gt;
It was late at night, and I wanted to release version 0.1.&lt;br /&gt;
I muttered syllables to myself, until I came up with a pair&lt;br /&gt;
that sounded halfway reasonable: 'Wesnoth'.&lt;br /&gt;
&lt;br /&gt;
David&lt;br /&gt;
&lt;br /&gt;
[1] Keep It Simple, Stupid&lt;br /&gt;
&lt;br /&gt;
== More on the KISS principle ==&lt;br /&gt;
&lt;br /&gt;
The reason behind the KISS principle is fairly straightforward:&lt;br /&gt;
often programmers will be confronted with someone -&lt;br /&gt;
perhaps a user, perhaps a designer, perhaps themselves -&lt;br /&gt;
who wants them to implement something to work in a certain way.&lt;br /&gt;
Oftentimes the programmer can only just work their head around&lt;br /&gt;
all the requirements, and when they start implementing the feature,&lt;br /&gt;
they don't have a clear idea of how the entire feature&lt;br /&gt;
is to be implemented, because it's so complicated.&lt;br /&gt;
&lt;br /&gt;
Such a situation inevitably leads to low-quality and very buggy software.&lt;br /&gt;
&lt;br /&gt;
KISS intentionally has the 'stupid' part, because often&lt;br /&gt;
'architecture astronauts' as they're known come up with 'super&lt;br /&gt;
elegant generic designs' that to them are simple, and most&lt;br /&gt;
importantly, elegant. Elegance is nice, but in a real-world&lt;br /&gt;
situation, it doesn't defeat KISS. Without the 'stupid' part&lt;br /&gt;
in there, some people would claim that elegance and&lt;br /&gt;
simplicity are strongly related, and so their 'elegant'&lt;br /&gt;
design should be implemented.&lt;br /&gt;
&lt;br /&gt;
But no, it doesn't matter how elegant it is. If the coder can't&lt;br /&gt;
understand exactly how to do it, it's not KISS. A less&lt;br /&gt;
elegant design, one that is simple and stupid, should be used instead.&lt;br /&gt;
&lt;br /&gt;
So that's it I guess: if the implementer finds it very very easy&lt;br /&gt;
to do, then it's KISS. If they don't, it's not.&lt;br /&gt;
&lt;br /&gt;
This can be related back to game rules somewhat. One of the aims&lt;br /&gt;
of Wesnoth was to make a game with a pretty good AI.&lt;br /&gt;
One of the things I noticed about other games, was that they added&lt;br /&gt;
in alot of game rules that their users wanted, which&lt;br /&gt;
were very very difficult for the AIs of those games to use or understand.&lt;br /&gt;
&lt;br /&gt;
So, I decided I'd make a game where the rules were detailed&lt;br /&gt;
enough to be fun, but structured in a way that the AI can work with them.&lt;br /&gt;
&lt;br /&gt;
I think that's the best definition of KISS for game rules that&lt;br /&gt;
we will find: if it's very easy to implement, including&lt;br /&gt;
making the AI use the rules effectively, then it's KISS.&lt;br /&gt;
&lt;br /&gt;
This makes most but not all of our current game rules KISS.&lt;br /&gt;
In particular, special abilities involving auras&lt;br /&gt;
(leadership, healing, illumination) are not currently used at all&lt;br /&gt;
effectively by the AI. It might not be so complicated&lt;br /&gt;
for the AI to be able to use them though.&lt;br /&gt;
&lt;br /&gt;
Things like skirmish are very KISS, since the AI immediately&lt;br /&gt;
understands how to use it effectively.&lt;br /&gt;
&lt;br /&gt;
You'll note that originally, when Wesnoth consisted of&lt;br /&gt;
no multiplayer, and no campaigns other than Heir to the Throne,&lt;br /&gt;
it was structured so the AI would only control units that it can&lt;br /&gt;
use effectively: it didn't have access to any aura&lt;br /&gt;
effects, while it did have access to things like poison.&lt;br /&gt;
&lt;br /&gt;
This is the cornerstone of KISS: what is laughably easy for&lt;br /&gt;
a programmer to do is going to result in high quality,&lt;br /&gt;
bug-free software. What is 'simple' for users, or 'elegant'&lt;br /&gt;
for designers, but not easy for a programmer is not going&lt;br /&gt;
to result in high quality software.&lt;br /&gt;
&lt;br /&gt;
David&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wesnoth Philosophy II: Where Next? ==&lt;br /&gt;
&lt;br /&gt;
We had a section in here on where to take Wesnoth next, but it was written before 1.0 was released. That would make it rather out of date.&lt;br /&gt;
&lt;br /&gt;
Eric Raymond has pressured me to update this section. Interestingly, much of the above was based on some of Eric Raymond's writings.&lt;br /&gt;
&lt;br /&gt;
So, we are about to release Wesnoth 1.4. 1.4 will be a very solid, stable release, with an impressive list of features. Some people claimed that Wesnoth wasn't really ready for a 1.0 label back when we released 1.0. Any concerns that Wesnoth is not a stable, mature game should have been removed by 1.2 though, and certainly should be crushed by 1.4. The team has done an excellent job of building a very impressive product.&lt;br /&gt;
&lt;br /&gt;
Where to now? Onward and upward, of course! We already have a great game, and around that great game has developed a great community. Using the resources we now have available, we can continue to improve the game to be better and better. To make it more fun, faster, run on more platforms, more reliable, and support a wider variety of game elements.&lt;br /&gt;
&lt;br /&gt;
Of all suggestions to improve -- or perhaps I should say change -- Wesnoth, one of the most common, and certainly the most controversial, is to alter the gameplay in some way. To add a new gameplay feature, to add new unit special abilities, to alter unit stats, and so on and so forth. Are we planning to continue to make gameplay changes, and of what nature? Should we radically alter the game?&lt;br /&gt;
&lt;br /&gt;
We have a great game, that people enjoy. We don't plan to radically alter the core game mechanics. We will continue to tweak things of course -- and our gameplay balance developers have done an excellent job of balancing things out, and will continue to do so. The core game mechanics will remain the same. What we might do, however, is add a wider variety of feature support to the engine, to support more different user made campaigns and scenarios.&lt;br /&gt;
&lt;br /&gt;
A key part of Wesnoth's success is in keeping an open mind. No single developer, least of all me, has been able to consistently and accurately predict what is fun and what isn't. Instead, by developing a flexible platform that allows people to develop scenarios and campaigns on, users can make content which proves to be fun, or not. Our community has done an excellent job of creating fun content that I never imagined possible.&lt;br /&gt;
&lt;br /&gt;
We want to continue doing this. We want to make our engine more and more flexible, little by little. We want to take 'fringe elements' -- dramatically different gameplay styles that were only supportable by bizarre and convoluted WML -- and make the engine support them better.&lt;br /&gt;
&lt;br /&gt;
We have many plans for a variety of features to allow this. A better WML engine. A more flexible AI engine that will allow much greater customization.&lt;br /&gt;
&lt;br /&gt;
However, the core Wesnoth team does not intend to migrate Wesnoth to a fundamentally different play stle. But, that said, I think it would be a great idea for *someone* to. We have an excellent set of resources: great art, a good code base, and so forth. These resources could be re-used to make a 'civilization-style' hex game. Or a 'tactics' game (Wesnoth is already somewhat of a tactics game, but one could take this in different directions). Or more of a 'wargame'. For someone to do this would be excellent. If another great FLOSS game could be created with Wesnoth's resources, that would be great for the FLOSS gaming community. I, personally, would love to play such a game. :)&lt;br /&gt;
&lt;br /&gt;
Something else we want to address going forward is Wesnoth's performance. Wesnoth was originally created using an approach that was easy to develop with, but placed performance, in terms of time and space, as a secondary concern. It is still easily runnable on most desktop machines, but it doesn't run well on smaller devices. We have several developers who are highly committed to making Wesnoth run well on small devices. We plan to work hard on this, and make this happen.&lt;br /&gt;
&lt;br /&gt;
Finally, I think the best thing about Wesnoth is its community. I feel we should continue to foster and grow the community. We have recently had a &amp;quot;Wesnoth Conference&amp;quot; at FOSDEM, which ten Wesnoth developers and contributors attended. It would be excellent if we could organize such a thing again, perhaps on a larger scale.&lt;br /&gt;
&lt;br /&gt;
That said, I personally feel that attempting to raise money to fund such a thing is entirely within the spirit of the FLOSS community. We could, for instance, consider using (unintrusive) ads on our website to raise money, and then organize a conference, funding it with the money (including paying subsidies to anyone wanting to come, to help pay for their expenses).&lt;br /&gt;
&lt;br /&gt;
I must admit, that even after Wesnoth got 'off the ground', I was at times concerned about its chances of reaching a credible 1.0. Later I was concerned about its direction thereafter, especially with me becoming less involved with the project. I have been incredibly impressed by the development team and the community which has done an excellent job in developing Wesnoth. I am now very confident in Wesnoth's future.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[FrequentlyProposedIdeas]]&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewtopic.php?t=441 The History of, and Philosophy behind Wesnoth]&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewtopic.php?t=2190 Wesnoth Philosophy II: Where Next?]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=CodingStandards&amp;diff=22517</id>
		<title>CodingStandards</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=CodingStandards&amp;diff=22517"/>
		<updated>2008-02-24T16:16:21Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Naming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wesnoth uses modern/advanced C++ that is portable to Visual C++ 6 and GNU G++ 3.0+&lt;br /&gt;
&lt;br /&gt;
== Formatting ==&lt;br /&gt;
&lt;br /&gt;
When working on C++ for Wesnoth, indent your code with a tab character. After fully indenting, if you still need to line up the text with a specific character on the line above, you may further align it using space characters.&lt;br /&gt;
&lt;br /&gt;
You may use long lines.&lt;br /&gt;
&lt;br /&gt;
== Evil Evil Things To Avoid ==&lt;br /&gt;
&lt;br /&gt;
=== Avoid implicit conversions ===&lt;br /&gt;
&lt;br /&gt;
Make all constructors which only take one argument that is of a different type to the class 'explicit'.&lt;br /&gt;
&lt;br /&gt;
Do not use operator T() where T is a type to allow an implicit conversion to a different type.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
t_string(const std::string&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
This is very evil! It can cause many situations where a temporary t_string is implicitly created and then gets destroyed unexpectedly.&lt;br /&gt;
&lt;br /&gt;
=== Do not use non-private data members of classes ===&lt;br /&gt;
&lt;br /&gt;
It's okay to have a struct with all-public members, if that's what you want.&lt;br /&gt;
&lt;br /&gt;
However, once something is a class, with private data members, do not add public (or even protected) data members to the class. Doing this breaks encapsulation and can cause all kinds of confusing and evil things to happen.&lt;br /&gt;
&lt;br /&gt;
== Naming ==&lt;br /&gt;
&lt;br /&gt;
=== End Non-Public Members of Classes with an Underscore ===&lt;br /&gt;
&lt;br /&gt;
All non-public data members of classes should have their names terminated with an underscore, to show that they are a&lt;br /&gt;
class member. This makes for more readable code, once one is familiar with the convention.&lt;br /&gt;
&lt;br /&gt;
== Idioms ==&lt;br /&gt;
&lt;br /&gt;
=== Use References when a value may not be NULL ===&lt;br /&gt;
&lt;br /&gt;
If a value passed to a function can never be NULL, use a reference instead of a pointer. I.e.&lt;br /&gt;
&lt;br /&gt;
  void myfunction(Object&amp;amp; obj);&lt;br /&gt;
&lt;br /&gt;
rather than&lt;br /&gt;
&lt;br /&gt;
  void myfunction(Object* obj);&lt;br /&gt;
&lt;br /&gt;
This more clearly shows the user of the function that obj may never be NULL, &lt;br /&gt;
without them having to consult documentation or the implementation of the function.&lt;br /&gt;
&lt;br /&gt;
=== Use Const ===&lt;br /&gt;
&lt;br /&gt;
The 'const' feature of C++ allows interfaces to more clearly specify how they treat objects. &lt;br /&gt;
Always use const when you are not going to modify an object.&lt;br /&gt;
&lt;br /&gt;
I.e.&lt;br /&gt;
&lt;br /&gt;
  void myfunction(const Object&amp;amp; obj);&lt;br /&gt;
&lt;br /&gt;
demonstrates to the caller of myfunction() that obj will not be modified. &lt;br /&gt;
If myfunction may modify obj, then use&lt;br /&gt;
&lt;br /&gt;
  void myfunction(Object&amp;amp; obj);&lt;br /&gt;
&lt;br /&gt;
likewise, if a variable is not changed after initialization, make it const.&lt;br /&gt;
&lt;br /&gt;
=== Write Exception-Safe Code ===&lt;br /&gt;
&lt;br /&gt;
Wesnoth code should be exception-safe, even if you do not use exceptions directly. &lt;br /&gt;
That is, you should be able to assume that an exception is thrown almost anywhere &lt;br /&gt;
from within the code, with well-defined results (i.e. no resource leaks).&lt;br /&gt;
&lt;br /&gt;
Code that uses a pattern like,&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
  SDL_Surface* image = IMG_Load(&amp;quot;image.bmp&amp;quot;);&lt;br /&gt;
  ...some code, which uses 'image'...&lt;br /&gt;
  SDL_FreeSurface(image);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
is bad, because the code may throw an exception, and 'image' will never be freed. &lt;br /&gt;
Instead, use wrapper objects which free the object in their destructor.&lt;br /&gt;
&lt;br /&gt;
For SDL_Surface objects, use the &amp;lt;tt&amp;gt;surface&amp;lt;/tt&amp;gt; class. &lt;br /&gt;
So you could rewrite the above code,&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
  surface image(IMG_Load(&amp;quot;image.bmp&amp;quot;));&lt;br /&gt;
  ...some code, which uses 'image'...&lt;br /&gt;
  } ''the image is automatically freed here when 'image' is destroyed&lt;br /&gt;
&lt;br /&gt;
Instead of allocating memory directly using new[] or malloc(), &lt;br /&gt;
use language-provided containers, such as vector.&lt;br /&gt;
&lt;br /&gt;
=== Do not use sprintf ===&lt;br /&gt;
&lt;br /&gt;
Sprintf does not check whether or not it is writing past the end of the space allocated. &lt;br /&gt;
This is a security problem if someone other than the person running the game &lt;br /&gt;
can cause sprintf to write very long strings. &lt;br /&gt;
In Wesnoth this untrusted data could come potentially from other players &lt;br /&gt;
in a multiplayer game or from downloaded campaigns. &lt;br /&gt;
Instead you should use snprintf with the second argument being sizeof of the buffer &lt;br /&gt;
that will hold the result.&lt;br /&gt;
&lt;br /&gt;
== Standard C++ to avoid ==&lt;br /&gt;
&lt;br /&gt;
=== Respect for loop scoping of different platforms ===&lt;br /&gt;
&lt;br /&gt;
In the code,&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i != 100; ++i) {...}&lt;br /&gt;
&lt;br /&gt;
the variable 'i' is scoped within the for loop according to ISO/ANSI C++ and GNU G++. &lt;br /&gt;
However it is scoped within the surrounding scope according to Visual C++ 6.&lt;br /&gt;
&lt;br /&gt;
This means that the code,&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i != 100; ++i) {}&lt;br /&gt;
  for(int i = 0; i != 100; ++i) {}&lt;br /&gt;
&lt;br /&gt;
is illegal on VC++6, because i is defined twice, &lt;br /&gt;
although it is legal according to the standard, and GNU G++.&lt;br /&gt;
&lt;br /&gt;
On VC++6, the legal way to write it would be,&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i != 100; ++i) {}&lt;br /&gt;
  for(i = 0; i != 100; ++i) {}&lt;br /&gt;
&lt;br /&gt;
But this is illegal according to the standard, because 'i' is not defined in the second loop. &lt;br /&gt;
The correct way to write this code to conform to the standard and work on all platforms &lt;br /&gt;
is to simply abandon declaring variables in the initialization statement of a for loop &lt;br /&gt;
when the variable must be reused in the same scope,&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
  for(i = 0; i != 100; ++i) {}&lt;br /&gt;
  for(i = 0; i != 100; ++i) {}&lt;br /&gt;
&lt;br /&gt;
=== Do not use wstring ===&lt;br /&gt;
&lt;br /&gt;
The standard C++ wstring class, defined as a basic_string&amp;lt; wchar_t &amp;gt;, &lt;br /&gt;
does not exist in some platforms supported by Wesnoth. &lt;br /&gt;
Use wide_string, defined in language.hpp, instead. &lt;br /&gt;
wide_string is actually defined as a vector&amp;lt; wchar_t &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C legacy to be avoided ==&lt;br /&gt;
&lt;br /&gt;
=== Use the function templates minimum and maximum ===&lt;br /&gt;
&lt;br /&gt;
Standard C++ offers the function templates min and max to find the minimum and maximum &lt;br /&gt;
of two values on which operator&lt;br /&gt;
&amp;lt;&lt;br /&gt;
is defined. &lt;br /&gt;
Unfortunately, many hoops must be leapt through to get this working on VC++. &lt;br /&gt;
So, we do not use standard min and max. &lt;br /&gt;
Instead, we use minimum and maximum, defined in utils.hpp.&lt;br /&gt;
&lt;br /&gt;
Usage is fairly natural:&lt;br /&gt;
&lt;br /&gt;
  int i = minimum(x,y);&lt;br /&gt;
&lt;br /&gt;
Note that in the above example, if x is an unsigned integer, and y is a signed integer, &lt;br /&gt;
VC++ will have problems. &lt;br /&gt;
You must explicitly specify the version of minimum being called in such cases:&lt;br /&gt;
&lt;br /&gt;
  int i = minimum&amp;lt;int&amp;gt;(x,y);&lt;br /&gt;
&lt;br /&gt;
=== Use util::array instead of C-style Arrays ===&lt;br /&gt;
&lt;br /&gt;
C-style arrays are very efficient, but their interface is ugly. &lt;br /&gt;
Use util::array defined in array.hpp. &lt;br /&gt;
It is a wrapper for an array which has a C++ container-style interface. &lt;br /&gt;
If you need to, extend it to make it fit your needs.&lt;br /&gt;
&lt;br /&gt;
=== Do not use C-style casts ===&lt;br /&gt;
&lt;br /&gt;
The following code,&lt;br /&gt;
&lt;br /&gt;
  if(i-&amp;gt;second.side() == (size_t)player_number_) {&lt;br /&gt;
&lt;br /&gt;
is considered bad practice in C++ since a C-style cast is overpowered -- if types change around it could end up casting away constness, or performing an implementation-defined data reinterpretation (basically a C-style cast is a compiler generated combination of static_cast, reinterpret_cast, and const_cast).&lt;br /&gt;
&lt;br /&gt;
Good programming style is to use the least powerful tool available that does what you want. &lt;br /&gt;
For example,&lt;br /&gt;
&lt;br /&gt;
  if(i-&amp;gt;second.side() == static_cast&amp;lt;size_t&amp;gt;(player_number_)) {&lt;br /&gt;
&lt;br /&gt;
Alternatively, a constructor call may be used for non-builtin types.&lt;br /&gt;
&lt;br /&gt;
Note: there may be some obscure cases where a C-style cast is desirable, &lt;br /&gt;
such as converting a pointer to an integer type of unspecified size.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Document &amp;quot;config&amp;quot; preconditions and postconditions ===&lt;br /&gt;
&lt;br /&gt;
In the Wesnoth code you will commonly encounter a data container known as the &amp;quot;config&amp;quot;, &lt;br /&gt;
which contains heirarchical string data (such as WML contents or game settings). &lt;br /&gt;
The tagged &amp;quot;children&amp;quot; of the config and their string &amp;quot;attributes&amp;quot; are arranged &lt;br /&gt;
in an ordered and mapped format internally using STL.&lt;br /&gt;
&lt;br /&gt;
Because config data is utilized in so many ways and places,  it can be difficult to track across the scope of the entire program. You should document all public functions that take/return a config, specifying config content expectations (and updating any related entries in the [[ReferenceWML]] wiki pages). &lt;br /&gt;
In particular, if your function requires a config parameter, specify where/how the config should be created. This will be a great help to any future coders who need to call or modify your function.&lt;br /&gt;
&lt;br /&gt;
=== Doxygen ===&lt;br /&gt;
See [[Doxygen]] for tips on how to comment the code,&lt;br /&gt;
so that doxygen can nicely document it.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[HackingWesnoth]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Committers]]&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=21197</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=21197"/>
		<updated>2008-01-28T01:00:53Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Developer information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
What would you like to learn about Wesnoth in this wiki? [[Play]] it, [[create]] with it, [[support]] for it, [[project]] resources about it, [[credits]] of it.&lt;br /&gt;
&lt;br /&gt;
This is a page with starting points to exploring this wiki about The Battle for Wesnoth. In addition to the wiki, there's also a [http://www.wesnoth.org homepage], a [http://www.wesnoth.org/forum forum],  and a [http://gna.org/projects/wesnoth/ Gna project page].&lt;br /&gt;
&lt;br /&gt;
* [[Special:Categories|List of all page categories in this wiki]]&lt;br /&gt;
* [[Special:Allpages|List of all pages in this wiki]]&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[UsingSourceinstall]] - using GNU Source Installer to automate installation and upgrades from source (Unix-likes only)&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
* [[Replays]] - archive of replays new and old&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://zapicm.freeshell.org Units] - Units advancement trees and stats&lt;br /&gt;
** [http://zapicm.freeshell.org/dev Development version]&lt;br /&gt;
** [http://zapicm.freeshell.org/stable Stable version]&lt;br /&gt;
** [http://server.wesnoth.org/~wesnoth/trunk Trunk version]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
** [[Complete_Faction_List_%28unfinished%29]] - list all user made factions&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|Wesnoth Acronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
==== Scenarios &amp;amp; Campaigns ====&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own single player campaigns&lt;br /&gt;
* [[MultiplayerCampaigns]] - how to make your own multiplayer campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
* [[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
==== References ====&lt;br /&gt;
* [[ReferenceWML]] and [[AlphabeticalWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[ReferencePythonAPI]] - upcoming Python interface for AI&lt;br /&gt;
==== Tools &amp;amp; Utilities ====&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
==== Art related ====&lt;br /&gt;
* [[Create_Art#Art_Tutorials|Art Tutorials]] - help in creating art&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
* [[Tiles_Status]] - terrain tiles: proposed and in progress.&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna!&lt;br /&gt;
* [http://www.wesnoth.org/wiki/ReportingBugs#Guidelines_for_suggesting_features Guidelines for suggesting features] - To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothSVN]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[DeveloperGuide]] - for those who received SVN commit rights&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[WesnothFormulaAIBranch]] - Guide to the experimental formula AI branch&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
* [[EasyCoding]] - Bugs and features that are easy to implement for new coders&lt;br /&gt;
* [[NotSoEasyCoding]] - Bugs and features which are doable but lacking someone working on them&lt;br /&gt;
* [[WesnothGL]] - Guide to programming the Wesnoth OpenGL branch&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - completely unknown stats...&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [[WesnothFigures]] - notable figures of valorous and infamous deeds in Wesnoth&lt;br /&gt;
* [[WesnothReviews]] - third party reviews of Wesnoth&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
* [[Donate]] or [http://cafepress.com/wesnoth buy Wesnoth merchandise].&lt;br /&gt;
* [[Trailer]] - the Wesnoth trailer&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Map of Wesnoth player locations] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiHaiku]]&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;br /&gt;
* [[WikiMigration]] - we were looking for a replacement for our old wiki (and ended up using Mediawiki)&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewtopic.php?t=19462 Obsolete] - help in updating the wiki for v1.4&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Fosdem2008&amp;diff=20239</id>
		<title>Fosdem2008</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Fosdem2008&amp;diff=20239"/>
		<updated>2007-12-23T20:19:38Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General information ==&lt;br /&gt;
* Fosdem - http://fosdem.org/2008/&lt;br /&gt;
* Dave's talk (not scheduled yet) - http://fosdem.org/2008/schedule/events/240&lt;br /&gt;
&lt;br /&gt;
== Schedule/Plans ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &lt;br /&gt;
! Arrival&lt;br /&gt;
! Departure&lt;br /&gt;
! Accomodation&lt;br /&gt;
|-&lt;br /&gt;
| ettin&lt;br /&gt;
| 22, 9:15 (BRU)&lt;br /&gt;
| 24, 15:25 (BRU)&lt;br /&gt;
| Bruegel YH or CHAB&lt;br /&gt;
|-&lt;br /&gt;
| Ivanovic&lt;br /&gt;
| 22, lunchtime&lt;br /&gt;
| 25, lunchtime&lt;br /&gt;
| CHAB or *whatever*&lt;br /&gt;
|-&lt;br /&gt;
| David &amp;amp; Lisa&lt;br /&gt;
| 18, morning&lt;br /&gt;
| 25, morning&lt;br /&gt;
| Novotel Grand Place&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Fosdem2008&amp;diff=20237</id>
		<title>Fosdem2008</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Fosdem2008&amp;diff=20237"/>
		<updated>2007-12-23T20:14:04Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General information ==&lt;br /&gt;
* Fosdem - http://fosdem.org/2008/&lt;br /&gt;
* Dave's talk (not scheduled yet) - http://fosdem.org/2008/schedule/events/240&lt;br /&gt;
&lt;br /&gt;
== Schedule/Plans ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &lt;br /&gt;
! Arrival&lt;br /&gt;
! Departure&lt;br /&gt;
! Accomodation&lt;br /&gt;
|-&lt;br /&gt;
| ettin&lt;br /&gt;
| 22, 9:15 (BRU)&lt;br /&gt;
| 24, 15:25 (BRU)&lt;br /&gt;
| Bruegel YH or CHAB&lt;br /&gt;
|-&lt;br /&gt;
| Ivanovic&lt;br /&gt;
| 22, lunchtime&lt;br /&gt;
| 25, lunchtime&lt;br /&gt;
| CHAB or *whatever*&lt;br /&gt;
|-&lt;br /&gt;
| David &amp;amp; Lisa&lt;br /&gt;
| 18, morning&lt;br /&gt;
| 25, morning&lt;br /&gt;
| Novotel&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=18577</id>
		<title>Credits</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=Credits&amp;diff=18577"/>
		<updated>2007-10-08T16:37:50Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;float:right&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
__TOC__&lt;br /&gt;
|}&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
In July 2003, '''David White''' released the first version of Wesnoth. Since&lt;br /&gt;
then, many people have joined the project, contributing in very different ways.&lt;br /&gt;
&lt;br /&gt;
To make any changes to this list, please modify about.cfg in SVN or ask any&lt;br /&gt;
developer to do it for you.&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
=== Programming ===&lt;br /&gt;
* [mailto:dave_AXT_whitevine_dXoXt_net David White] (Sirp) - Heir to the Throne&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* Alfredo Beaumont (ziberpunk) - autotools&lt;br /&gt;
* Ali El Gariani (alink)&lt;br /&gt;
* András Salamon ([[User:Ott|ott]]) - QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* Benoît Timbert (Noyga)&lt;br /&gt;
* Bram Ridder (Morloth) - editor improvements&lt;br /&gt;
* [mailto:bruno_AT_wolff.to Bruno Wolff III] ([[User:bruno|bruno]]) - campaign web interface, bug fixing, minor coder&lt;br /&gt;
* Cédric Duval - coder, internationalization manager&lt;br /&gt;
* Dominic Bolin (Xan)&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* Eric S. Raymond (ESR) - macro and tools cleanup&lt;br /&gt;
* Guillaume Melquiond (silene) - coding, bug fixes&lt;br /&gt;
* Jérémy Rosen ([[User:Boucman|Boucman]]) - coder&lt;br /&gt;
* [mailto:mcnabb_AT_gravity.psu.edu John W. C. McNabb] (Darth Fool) - coder, graphics&lt;br /&gt;
* Jon Daniel (forcemstr) - coder, bug fixes&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH)&lt;br /&gt;
* [mailto:justin.zaun_AT_gmail.com Justin Zaun] (jzaun) - coder, scenario designer&lt;br /&gt;
* Karol Nowak (grzywacz) - bug fixes, sound sources, gp2x port&lt;br /&gt;
* [mailto:erl_AT_erl.se Kristoffer Erlandsson] (erl) - help system, editor&lt;br /&gt;
* Mark de Wever (Mordante/SkeletonCrew)&lt;br /&gt;
* Nicolas Weeger (Ryo) - Python API&lt;br /&gt;
* [mailto:patrick_x99(AT).hotmail.com Patrick Parker] ([[User:Sapient|Sapient]]) - improvements to user interface, WML engine, various features&lt;br /&gt;
* [mailto:philippe.plantier_AT_naema.org Philippe Plantier] ([[User:Ayin|Ayin]]) - several parts of the code, notably terrain graphics code&lt;br /&gt;
* Rusty Russell (rusty)&lt;br /&gt;
* [mailto:ydirson_AT_altern.org Yann Dirson] - gettext support, tinygui&lt;br /&gt;
=== General Purpose Administration and Coordination ===&lt;br /&gt;
* Crossbow/Miyo - administrator, release manager&lt;br /&gt;
* [mailto:isaac_AT_sindominio.net Isaac Clerencia] - Debian packager, release manager&lt;br /&gt;
* [mailto:Crazy-Ivanovic_AT_gmx.net Nils Kneuper] (Ivanovic) - administrator, release manager, internationalization manager, A Tale of Two Brothers, german translation&lt;br /&gt;
=== Artwork and Graphics ===&lt;br /&gt;
* Francisco Muñoz (fmunoz) - founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* Hogne Håskjold (frame/freim) - director of terrain art, made much of the current terrains (esp. mountains)&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]]) - terrain (esp Chasm, Cave, Water), sprite animations, various visual tweaks&lt;br /&gt;
* James Woo (Pickslide) - portraits (major focus on orcs and campaigns, especially UtBS, TEI, TSoF)&lt;br /&gt;
* Jason Lutes - portraits (major focus on humans, some campaign portraits)&lt;br /&gt;
* Lari Nieminen (zookeeper) - sprite animation, various visual tweaks&lt;br /&gt;
* Neoriceisgood - sprite creator and animator (major focus on drakes, dwarves, saurians)&lt;br /&gt;
* Pekka Aikio (pekka) - tiles, esp. castles, and attack icons&lt;br /&gt;
* Peter Geinitz (Shadow/Wayfarer) - sprite creator and animator&lt;br /&gt;
* Richard Kettering ([[User:Jetryl|Jetryl]]) - art director/slave, major focus on sprites, portraits, buildings, and icons&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* Alex Jarocha-Ernst (Jormungandr) - portraits&lt;br /&gt;
* Christophe Anjard (Christophe33) - made many of the old (c. v0.6) terrains, and some sprites for the dwarves&lt;br /&gt;
* Erkki Lonkainen (Eternal) - created and animated many replacement sprites (esp. ogre, orc assassin &amp;amp; spear units, and cockatrice)&lt;br /&gt;
* Johann de Venecia (Johann) - drew the new campaign story art for HttT&lt;br /&gt;
* Leonhard - made several of the new attack icons&lt;br /&gt;
* Mark Goodenough (Ranger M) - sprite animator&lt;br /&gt;
* Maximiliano Buis (Redeth) - Made nearly all of the idle animations, and some death animations (as of 1.3.1)&lt;br /&gt;
* Michael Gil de Muro (grp21) - portraits (for the campaign The Rise of Wesnoth)&lt;br /&gt;
* Moritz Göbelbecker (mog) - tiles, esp. swamp, encampment, ice, and work with lava/chasm&lt;br /&gt;
* Robert Bolin (Zebulon) - tiles, sprite editing and animations&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* Andrew James Patterson (Kamahawk) - sprites&lt;br /&gt;
* antwerpz - sprite creator/animator for old saurian units&lt;br /&gt;
* Diego Brea (Cobretti) - sprite creator/animator&lt;br /&gt;
* EEL (EELuminatus)&lt;br /&gt;
* Eli Dupree (Elvish Pillager) - sprites and animations&lt;br /&gt;
* Eric Holdos (Rev. V!)&lt;br /&gt;
* Gareth Miller (Gafgarion) - made some early sprites/tiles&lt;br /&gt;
* Gerald Clears (Smok'em Jags) - sprite animator&lt;br /&gt;
* James Barton (Sangel) - sprites&lt;br /&gt;
* Jami - rogue death animation&lt;br /&gt;
* Jesse Holland (Kestenvarn) - map illustrator, designed the current map for HttT&lt;br /&gt;
* Johanna Manninen (lohari) - edited tiles, ported freeciv tiles used in very early versions of wesnoth&lt;br /&gt;
* John Muccigrosso (Eponymous Archon) - made some early sprites, such as the human bowmen&lt;br /&gt;
* Michael Mielewczik (Mille) - sprite animator&lt;br /&gt;
* Mikko Kraft (Deserter) - sprite animator&lt;br /&gt;
* Slainte - made sprites for c. v0.6 mages, also made many of the old attack icons&lt;br /&gt;
* Stephen Stone (Disto) - sprite animator&lt;br /&gt;
* Svetac - made many of the old attack icons&lt;br /&gt;
* Tristan Millner (tatmf) - made portrait of dwarven fighter&lt;br /&gt;
* Zhukov - sprite animator&lt;br /&gt;
* Musketaquid - animated windmill / stone path&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* Mattias Westlund (West) - new color cursors&lt;br /&gt;
* Anton Ecker (Kaldred) - burnt villages&lt;br /&gt;
* Joe (battlestar) - - some scenery graphics including burnt tent.&lt;br /&gt;
* Daniel Borgmann (dborg) - semi-transparent map grid&lt;br /&gt;
* Evan Crook (Flametrooper) - sprite animator (TC conversion)&lt;br /&gt;
* Garrett Wessner (Stilgar) - gold coin pile&lt;br /&gt;
* Gideon Chia (Deonjo) - new units icon for general status bar&lt;br /&gt;
* Highhole - revised storm trident&lt;br /&gt;
* Irwin Ismail (Swordy) - original projectile/attack icon for chakram&lt;br /&gt;
* Jason Frailey (Valdroni) - scorpion portrait&lt;br /&gt;
* Jimmy Olsson (Azlan) - made old icons for windows version&lt;br /&gt;
* John-Robert Funck (XJaPaN) - sprite animator&lt;br /&gt;
* Jonatan Alamà (tin) - made red logo used until before v1.0&lt;br /&gt;
* Nicholas Kerpan (Thrawn) - human theif portrait&lt;br /&gt;
* Randall Walls (slightcrazed) - sprite animator&lt;br /&gt;
* Ignacio Riquelme Morelle (Shadow Master) - Shadows under units + color edits&lt;br /&gt;
* Phil Barber (thespaceinvader) - Shadows under units&lt;br /&gt;
=== Music ===&lt;br /&gt;
* Aleksi Aubry-Carlson (Aleksi) - music coordinator/composer&lt;br /&gt;
* Fredrik Lindroth&lt;br /&gt;
* Joseph Toscano (zhaymusic.com)&lt;br /&gt;
* Pau Congost&lt;br /&gt;
* Timothy Pinkham (TimothyP) - music coordinator/composer&lt;br /&gt;
=== Sound Effects ===&lt;br /&gt;
* Corey Woodworth (woodwizzle) - hit and die sounds&lt;br /&gt;
* J.W. Bjerk ([[User:Eleazar|Eleazar]])&lt;br /&gt;
* Lari Nieminen (zookeeper) - focus on attack, weapon and user interface sounds&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain (quartex) - Under the Burning Suns&lt;br /&gt;
* Benjamin Drieu&lt;br /&gt;
* Dacyn&lt;br /&gt;
* David White (Sirp) - Heir to the Throne&lt;br /&gt;
* Eric J. Mesoy (Circon) - A Tale of Two Brothers&lt;br /&gt;
* esci - Descent into Darkness&lt;br /&gt;
* Francisco Muñoz (fmunoz) - founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* James Spencer (Shade) - The Rise of Wesnoth&lt;br /&gt;
* Joseph Simmons (Turin) - The Eastern Invasion&lt;br /&gt;
* Justin Zaun (jzaun) - coder, scenario designer&lt;br /&gt;
* [mailto:Crazy-Ivanovic_AT_gmx.net Nils Kneuper] (Ivanovic) - A Tale of Two Brothers&lt;br /&gt;
* Scott Klempner - Heir to the Throne, The Rise of Wesnoth&lt;br /&gt;
* William Carey (aelius) - The South Guard&lt;br /&gt;
=== Multiplayer Maps and Balancing ===&lt;br /&gt;
* [mailto:dragonking_AT_o2.pl Bartek Waresiak] (Dragonking)&lt;br /&gt;
* Joshua Northey (Becephalus)&lt;br /&gt;
* Mike Quiñones (Doc Paterson)&lt;br /&gt;
* Peter Groen (pg)&lt;br /&gt;
* Richard S. (Noy)&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu)&lt;br /&gt;
* Soliton&lt;br /&gt;
* Tom Chance (telex4)&lt;br /&gt;
* [mailto:kleinfel_AT_wpi.edu Zack Kleinfeld] - multiplayer maps, unit balancing&lt;br /&gt;
=== Packagers ===&lt;br /&gt;
* Cyril Bouthors (CyrilB) - Debian packager, patron&lt;br /&gt;
* Darryl Dixon&lt;br /&gt;
* edge&lt;br /&gt;
* Isaac Clerencia - Debian packager&lt;br /&gt;
* Jay Hopping&lt;br /&gt;
* Laurent Wacrenier (lwa) - Mac OS X packager&lt;br /&gt;
* Jörg Hinrichs (Yogi Bear/YogiHH) - Windows packager&lt;br /&gt;
* Marcin Konicki (ahwayakchih) - BeOS packager&lt;br /&gt;
* Marcus Phillips (Sithrandel) - Mac OS X packager (for v1.0 and before)&lt;br /&gt;
* Mark Michelsen (skovbaer) - Slackware packager&lt;br /&gt;
* Vlad Glagolev (Stealth) - OpenBSD packager&lt;br /&gt;
=== Contributors ===&lt;br /&gt;
* Andrea Palmatè (afxgroup)&lt;br /&gt;
* Ben Anderman (crimson_penguin) - unit list&lt;br /&gt;
* Daniel Bruegmann&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
* Francesco Gigli (Jaramir)&lt;br /&gt;
* Frédéric Wagner&lt;br /&gt;
* Fredrik Wikstrom (salass00)&lt;br /&gt;
* Hans-Joachim Gurt (HaJo)&lt;br /&gt;
* Ignacio Riquelme Morelle (Shadow Master) - Test implementation of female leaders in multiplayer games&lt;br /&gt;
* J.R. Blain (Cowboy)&lt;br /&gt;
* Jan Zvánovec (jaz)&lt;br /&gt;
* Jeff Breidenbach (jab) - Bilinear interpolation&lt;br /&gt;
* Jim Carroll (Jimm)&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* John B. Messerly (jbm)&lt;br /&gt;
* Jonas Lihnell (Roze)&lt;br /&gt;
* Jonas Kölker&lt;br /&gt;
* [mailto:jorda_AT_ettin.org Jordà Polo] (ettin)&lt;br /&gt;
* Josef Reidinger (qk)&lt;br /&gt;
* Joshua Hudson&lt;br /&gt;
* Laurent Birtz&lt;br /&gt;
* Manuel Osório Binelo (manuelb)&lt;br /&gt;
* Martin Renold (maxy/martinxyz)&lt;br /&gt;
* Maksim Orlovich (SadEagle)&lt;br /&gt;
* Michael Schmahl&lt;br /&gt;
* Miguel Zapico (elricz)&lt;br /&gt;
* Paul Smedley (Creeping)&lt;br /&gt;
* Pauli Nieminen (coren/suokko)&lt;br /&gt;
* Petr Sobotka (Pietro)&lt;br /&gt;
* Priit Laes (plaes)&lt;br /&gt;
* Rocco J Carello (rogue)&lt;br /&gt;
* Sebastian Goll (afran)&lt;br /&gt;
* Serge Martin (EdB)&lt;br /&gt;
* Stéphane Gimenez (gim)&lt;br /&gt;
* Thomas Baumhauer (Baufo)&lt;br /&gt;
* Tomasz Sikorski (Tomsik)&lt;br /&gt;
* Zas&lt;br /&gt;
=== Internationalization Managers ===&lt;br /&gt;
* Cédric Duval - coder, internationalization manager&lt;br /&gt;
* David Philippi (Torangan) - internationalization manager, wescamp&lt;br /&gt;
* Mark Michelsen (skovbaer) - Slackware packager&lt;br /&gt;
* [mailto:Crazy-Ivanovic_AT_gmx.net Nils Kneuper] (Ivanovic) - administrator, release manager, internationalization manager, A Tale of Two Brothers, german translation&lt;br /&gt;
* [mailto:susanna.bjorverud_AT_telia.com Susanna Björverud] (sanna)&lt;br /&gt;
=== Afrikaans Translation ===&lt;br /&gt;
* András Salamon (ott) - QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* Erhard Eiselen&lt;br /&gt;
* Nico Oliver (nicoza)&lt;br /&gt;
* Renier Maritz&lt;br /&gt;
=== Basque Translation ===&lt;br /&gt;
* Alfredo Beaumont (ziberpunk) - autotools&lt;br /&gt;
* Julen Landa (genars)&lt;br /&gt;
* Mikel Olasagasti (Hey_neken)&lt;br /&gt;
=== Bulgarian Translation ===&lt;br /&gt;
* Anton Tsigularov (Atilla)&lt;br /&gt;
* Bono Nonchev&lt;br /&gt;
* Denica Mincheva (Deni)&lt;br /&gt;
* Georgi Dimitrov (oblak)&lt;br /&gt;
* Nikolay Vladimirov (Turki)&lt;br /&gt;
=== Catalan Translation ===&lt;br /&gt;
* Carles Company (brrr)&lt;br /&gt;
* Dan Rosàs Garcia (focks)&lt;br /&gt;
* Daniel López (Azazelo)&lt;br /&gt;
* Joan Queralt&lt;br /&gt;
* Jonatan Alamà (tin) - made red logo used until before v1.0&lt;br /&gt;
* [mailto:jorda_AT_ettin.org Jordà Polo] (ettin)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* Mark Recasens&lt;br /&gt;
* Pau Rul·lan Ferragut&lt;br /&gt;
* Roberto Garcia (Motxales)&lt;br /&gt;
=== Chinese Translation ===&lt;br /&gt;
* Huang huan (unicon)&lt;br /&gt;
* Huang Lechuan&lt;br /&gt;
=== Czech Translation ===&lt;br /&gt;
* Anežka Bubeníčková (Bubu)&lt;br /&gt;
* David Nečas (Yeti)&lt;br /&gt;
* Lukáš Faltýnek&lt;br /&gt;
* Martin Šín&lt;br /&gt;
* Mintaka&lt;br /&gt;
* [mailto:tapik_AT_buchtovi.cz Oto Buchta] ([[User:Tapik|tapik]])&lt;br /&gt;
* Petr Kopač (Ferda)&lt;br /&gt;
* Petr Kovár (Juans)&lt;br /&gt;
* Rudolf Orság&lt;br /&gt;
* Sofronius&lt;br /&gt;
* Vít Komárek&lt;br /&gt;
* Vít Krčál&lt;br /&gt;
* Vladimír Slávik&lt;br /&gt;
=== Danish Translation ===&lt;br /&gt;
* Anders K. Madsen (madsen)&lt;br /&gt;
* Ask Hjorth Larsen&lt;br /&gt;
* Bjarke Sørensen (basher)&lt;br /&gt;
* Jesper Fuglsang Wolff (ulven)&lt;br /&gt;
* Joe Hansen&lt;br /&gt;
* Kenneth Nielsen&lt;br /&gt;
* Mark Michelsen (skovbaer) - Slackware packager&lt;br /&gt;
* Mathias Bundgaard Svensson (freaken)&lt;br /&gt;
* Ole Laursen&lt;br /&gt;
=== Dutch Translation ===&lt;br /&gt;
* Arne Deprez&lt;br /&gt;
* Ernst Segers&lt;br /&gt;
* Foppe Benedictus&lt;br /&gt;
* Joeri Melis&lt;br /&gt;
* Koen Douterloigne&lt;br /&gt;
* Lala&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Pieter Vermeylen (Onne)&lt;br /&gt;
* Rob van der Vleugel&lt;br /&gt;
* Roel Thijs (Roel)&lt;br /&gt;
* Roger Koot&lt;br /&gt;
* Tobe Deprez&lt;br /&gt;
=== English (GB) Translation ===&lt;br /&gt;
* András Salamon (ott) - QA, bug fixing, subediting, game mechanics&lt;br /&gt;
* pjr&lt;br /&gt;
=== Esperanto Translation ===&lt;br /&gt;
* Aleksej Korgenkov (Grimpanto)&lt;br /&gt;
* Francesco Lorenzon (Likso)&lt;br /&gt;
* Ľubo Fajth&lt;br /&gt;
* Maarten Albrecht&lt;br /&gt;
* Rastislav Šarišský (Asto)&lt;br /&gt;
=== Estonian Translation ===&lt;br /&gt;
* Mart Tõnso&lt;br /&gt;
=== Filipino Translation ===&lt;br /&gt;
* Joset Anthony Zamora (sophie^)&lt;br /&gt;
=== Finnish Translation ===&lt;br /&gt;
* Ankka&lt;br /&gt;
* Jussi Rautio (jgrr)&lt;br /&gt;
* kko&lt;br /&gt;
* Matias Parmala&lt;br /&gt;
* Mikko Kraft (deserter)&lt;br /&gt;
* Niklas Laxström (Nikerabbit)&lt;br /&gt;
* paxed&lt;br /&gt;
* Samu Voutilainen (Smar)&lt;br /&gt;
=== French Translation ===&lt;br /&gt;
* Aurélien Brevers (Breversa)&lt;br /&gt;
* Arnaud Garoux (La vie en wose)&lt;br /&gt;
* Benoit Astruc&lt;br /&gt;
* Benoît Timbert (Noyga)&lt;br /&gt;
* Bruno Fève (PP)&lt;br /&gt;
* Cédric Duval - coder, internationalization manager&lt;br /&gt;
* Damien Jacquot&lt;br /&gt;
* DaringTremayne&lt;br /&gt;
* Florence Guettaa (inflow)&lt;br /&gt;
* François Mariage (Paquito)&lt;br /&gt;
* François Orieux&lt;br /&gt;
* Geoffroy Douillié ([[User:Gdou|gdou]])&lt;br /&gt;
* Gérard Bodin&lt;br /&gt;
* Guillaume Duwelz-Rebert&lt;br /&gt;
* [mailto:massart.guillaume_AT_wanadoo.fr Guillaume Massart] (Piou2fois)&lt;br /&gt;
* Guillaume Melquiond (silene) - coding, bug fixes&lt;br /&gt;
* Jean Privat (Tout)&lt;br /&gt;
* Jean-Luc Menut&lt;br /&gt;
* Jean-Luc Richard (Le Gnome)&lt;br /&gt;
* Jehan Hysseo (Jey)&lt;br /&gt;
* Jérémy Rosen (Boucman)&lt;br /&gt;
* Julien Moncel&lt;br /&gt;
* Julien Tailleur&lt;br /&gt;
* Michel Poléni (Thanatloc)&lt;br /&gt;
* Nicolas Boudin (Blurgk)&lt;br /&gt;
* [mailto:philippe.plantier_AT_naema.org Philippe Plantier] ([[User:Ayin|Ayin]]) - several parts of the code, notably terrain graphics code&lt;br /&gt;
* Pierre Rudloff&lt;br /&gt;
* Sébastien Raynaud (Galactic turkey)&lt;br /&gt;
* William Dupré&lt;br /&gt;
* [mailto:ydirson_AT_altern.org Yann Dirson] - gettext support, tinygui&lt;br /&gt;
=== Galician Translation ===&lt;br /&gt;
* Leandro Regueiro (unho)&lt;br /&gt;
=== German Translation ===&lt;br /&gt;
* Andre Schmidt (schmidta)&lt;br /&gt;
* Boris Stumm (quijote_)&lt;br /&gt;
* Christoph Berg (chrber) - translation maintainer&lt;br /&gt;
* Elias Pschernig (allefant)&lt;br /&gt;
* Gerfried Fuchs (Alfie)&lt;br /&gt;
* Jan Greve (Jan)&lt;br /&gt;
* Jan Heiner Laberenz (jan-heiner)&lt;br /&gt;
* Kai Ensenbach (Pingu)&lt;br /&gt;
* [mailto:Crazy-Ivanovic_AT_gmx.net Nils Kneuper] (Ivanovic)&lt;br /&gt;
* Ruben Philipp Wickenhäuser (The Very Uhu)&lt;br /&gt;
* Stephan Grochtmann (Schattenstephan)&lt;br /&gt;
* Uz-Valentin Friedrich&lt;br /&gt;
* vonHalenbach&lt;br /&gt;
=== Greek Translation ===&lt;br /&gt;
* Katerina Sykioti&lt;br /&gt;
* Konstantinos Egarhos&lt;br /&gt;
* Konstantinos Karasavvas&lt;br /&gt;
* Mik2303&lt;br /&gt;
* Spiros, Giorgis&lt;br /&gt;
* Alexander Alexiou (Santi)&lt;br /&gt;
* Harry Kaimenas&lt;br /&gt;
=== Hebrew Translation ===&lt;br /&gt;
* Oron Peled&lt;br /&gt;
* Ely Levy (Nakee)&lt;br /&gt;
=== Hungarian Translation ===&lt;br /&gt;
* adson&lt;br /&gt;
* Beer (Eddi)&lt;br /&gt;
* dentro&lt;br /&gt;
* Gilluin&lt;br /&gt;
* Kékkői László (BlackEvil)&lt;br /&gt;
* Kertész Csaba&lt;br /&gt;
* Khiraly&lt;br /&gt;
* Kovács Dániel&lt;br /&gt;
* krix&lt;br /&gt;
* Salamon András (ott)&lt;br /&gt;
* Széll Tamás (TomJoad)&lt;br /&gt;
=== Indonesian Translation ===&lt;br /&gt;
* Benny Lin&lt;br /&gt;
=== Italian Translation ===&lt;br /&gt;
* Alessio D'Ascanio (otaku)&lt;br /&gt;
* Americo Iacovizzi (DarkAmex)&lt;br /&gt;
* crys0000&lt;br /&gt;
* Eugenio Favalli (ElvenProgrammer)&lt;br /&gt;
* Federico Tomassetti&lt;br /&gt;
* Filippo Abbruzzo (Gwain)&lt;br /&gt;
* isazi&lt;br /&gt;
* Luciano Montanaro (Luciano)&lt;br /&gt;
* RokStar&lt;br /&gt;
=== Japanese Translation ===&lt;br /&gt;
* BlueStar&lt;br /&gt;
* いいむらなおき (amatubu) - Naoki Iimura&lt;br /&gt;
* [mailto:okyada_AT_gmail.com 岡田信人 - Nobuhito Okada]&lt;br /&gt;
* Q&lt;br /&gt;
* Takanobu Hirai&lt;br /&gt;
* Yuji Matsumoto&lt;br /&gt;
=== Korean Translation ===&lt;br /&gt;
* Kim Woong (Kazaya)&lt;br /&gt;
=== Latin Translation ===&lt;br /&gt;
* Mark Polo (mpolo)&lt;br /&gt;
=== Lithuanian Translation ===&lt;br /&gt;
* Andrius Štikonas (Mithrandir)&lt;br /&gt;
=== Norwegian Translation ===&lt;br /&gt;
* Asgeir Aakre (YbeRn00b)&lt;br /&gt;
* Gaute Jao (Bombadil)&lt;br /&gt;
* Hallvard Norheim Bø (Lysander)&lt;br /&gt;
* Håvard Korsvoll&lt;br /&gt;
* Erik J. Mesoy (Circon)&lt;br /&gt;
* Susanne Mesoy (Rarlgland)&lt;br /&gt;
=== Polish Translation ===&lt;br /&gt;
* Agata Chmiel&lt;br /&gt;
* Arkadiusz Danilecki (szopen)&lt;br /&gt;
* Artur R. Czechowski&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* BOrsuk&lt;br /&gt;
* Karol Nowak (grzywacz) - bug fixes, sound sources, gp2x port&lt;br /&gt;
* methinks&lt;br /&gt;
* Michał Jedynak (Artanis)&lt;br /&gt;
* Michał Ligowski (misiorysio)&lt;br /&gt;
* Paweł Stradomski&lt;br /&gt;
* Paweł Tomak&lt;br /&gt;
* Roman Polesek (rimskij)&lt;br /&gt;
* Zbigniew Banach (vonBureck)&lt;br /&gt;
=== Portuguese Translation ===&lt;br /&gt;
* Luis Passos&lt;br /&gt;
=== Portuguese (Brazil) Translation ===&lt;br /&gt;
* Ambra Viviani Loos&lt;br /&gt;
* Celso Goya&lt;br /&gt;
* [mailto:cbterra_AT_gmail.com Claudio Terra]&lt;br /&gt;
* Claus Aranha&lt;br /&gt;
* Di Teixeira (Moroder)&lt;br /&gt;
* Michel Loos&lt;br /&gt;
* Renato Cunha&lt;br /&gt;
* Ricardo Sodré Andrade&lt;br /&gt;
* Sérgio de Miranda Costa&lt;br /&gt;
* Tiago Souza (Salvador)&lt;br /&gt;
=== Russian Translation ===&lt;br /&gt;
* Alexandr Menovchicov&lt;br /&gt;
* Alexey Remizov&lt;br /&gt;
* Alexey Zakharchenko&lt;br /&gt;
* Anthony Kolesov&lt;br /&gt;
* Azamat Hackimov ([[User:Winterheart|winterheart]])&lt;br /&gt;
* Ilya Kaznacheev&lt;br /&gt;
* Ilya Kotov&lt;br /&gt;
* Roman Tuchin (Sankt)&lt;br /&gt;
* Vlad Glagolev&lt;br /&gt;
=== Serbian Translation ===&lt;br /&gt;
* Branko Kokanovic (kokan)&lt;br /&gt;
* [mailto:caslav_DOT_ilic_AT_gmx_DOT_net Caslav Ilic]&lt;br /&gt;
* [mailto:sreckotoroman_AT_gmail_DOT_com Srecko Toroman] (FreeCraft)&lt;br /&gt;
=== Slovak Translation ===&lt;br /&gt;
* Ivan Kovacs&lt;br /&gt;
* Martin Dzbor&lt;br /&gt;
* [[User:Viliam|Viliam Bur]]&lt;br /&gt;
=== Slovenian Translation ===&lt;br /&gt;
* Jaka Kranjc (lynx)&lt;br /&gt;
* Matej Repinc&lt;br /&gt;
=== Spanish Translation ===&lt;br /&gt;
* David Martínez Moreno&lt;br /&gt;
* Fernando Cerezal&lt;br /&gt;
* Flamma&lt;br /&gt;
* Francisco Muñoz (fmunoz) - founding artist and former lead artist, worked consistently on all aspects till around v0.7-0.9.&lt;br /&gt;
* Gabriel Rodríguez (Chewie)&lt;br /&gt;
* [mailto:shadowm2006_AT_gmail.com Ignacio]&lt;br /&gt;
* Iván Herrero (navitux)&lt;br /&gt;
* Jose Gordillo (kilder)&lt;br /&gt;
* Jose Manuel Gomez (joseg)&lt;br /&gt;
* Masacroso&lt;br /&gt;
* Martín R. Dapás&lt;br /&gt;
* Roberto Romero (sildur)&lt;br /&gt;
=== Swedish Translation ===&lt;br /&gt;
* Alexander Kjäll (capitol)&lt;br /&gt;
* Åse Petersson (tintin)&lt;br /&gt;
* Hugo Gerlach (Entrimo)&lt;br /&gt;
* Leo Danielson (Lugo Moll)&lt;br /&gt;
* Stefan Bergström (tephlon)&lt;br /&gt;
* [mailto:susanna.bjorverud_AT_telia.com Susanna Björverud] (sanna)&lt;br /&gt;
* wint3r&lt;br /&gt;
=== Turkish Translation ===&lt;br /&gt;
* Enes Akın (yekialem)&lt;br /&gt;
* İhsan Akın&lt;br /&gt;
* Kosif&lt;br /&gt;
* Pınar Yanardağ (moonquelle)&lt;br /&gt;
* Selim Farsakoğlu&lt;br /&gt;
=== Valencian (southern Catalan) Translation ===&lt;br /&gt;
* Mario Rodríguez (Mavorte)&lt;br /&gt;
* Robert Millan&lt;br /&gt;
=== Bots ===&lt;br /&gt;
* wesbot&lt;br /&gt;
== Two Brothers ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Eric J. Mesoy (Circon)&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Nils Kneuper (Ivanovic)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Arkadiusz Danileki (szopen)&lt;br /&gt;
* MadMax&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Bartek Waresiak (Dragonking)&lt;br /&gt;
* Christoph Berg (chrber)&lt;br /&gt;
== Descent Into Darkness ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* esci&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Thomas Baumhauer (Baufo)&lt;br /&gt;
== The Rise Of Wesnoth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* James Spencer (Shade)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological) - current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Michael Gil de Muro (grp21)&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* Ignacio Riquelme Morelle (shadowmaster)&lt;br /&gt;
== Liberty ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Prose-doctoring and preparation for mainline ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Eric S. Raymond (ESR) - current maintainer&lt;br /&gt;
* Lari Nieminen (zookeeper) - current maintainer&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Shadow&lt;br /&gt;
* Brendan Sellner&lt;br /&gt;
* Jason Lutes - portraits&lt;br /&gt;
* Syn_Err - story images&lt;br /&gt;
=== Translators ===&lt;br /&gt;
* David Philippi (Torangan)&lt;br /&gt;
== An Orcish Incursion ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Josh Parsons&lt;br /&gt;
=== Adaptation for mainline ===&lt;br /&gt;
* Eric S. Raymond&lt;br /&gt;
== Eastern Invasion ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological)&lt;br /&gt;
=== Campaign Epilog and Continuity ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
== Heir To The Throne ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* David White (Sirp)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Dimitar Ilccov (Mythological) - current maintainer&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Francisco Muñoz (fmunoz)&lt;br /&gt;
* Richard Kettering (Jetryl)&lt;br /&gt;
* Neoriceisgood&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Patrick Parker (Sapient) - WML assistance&lt;br /&gt;
== Sceptre of Fire ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Joseph Simmons (turin)&lt;br /&gt;
=== WML Assistance ===&lt;br /&gt;
* David Simmons (Dacyn)&lt;br /&gt;
* Eli Dupree (Elvish Pillager)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
* MadMax&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Asereje&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* John-Robert Funck (XJaPaN)&lt;br /&gt;
* Peter Geinitz (Wayfarer)&lt;br /&gt;
* Richard Kettering (Jetryl)&lt;br /&gt;
* RusHHouR - gold and coal piles&lt;br /&gt;
== Northern Rebirth ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Taurus&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Xandar86&lt;br /&gt;
* Richard Kettering (Jetryl)&lt;br /&gt;
* Nicholas Kerpan (Thrawn)&lt;br /&gt;
* Battlesquid&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Music ===&lt;br /&gt;
* West&lt;br /&gt;
=== Translators ===&lt;br /&gt;
* Placid (British-English)&lt;br /&gt;
* Belchion (German)&lt;br /&gt;
* vonHalenbach (German)&lt;br /&gt;
* Luciano (Italian)&lt;br /&gt;
* Gdou (French)&lt;br /&gt;
* Fopper (Dutch)&lt;br /&gt;
=== Code and Translation Assistance ===&lt;br /&gt;
* David Philippi (Torangan)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
== The South Guard ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Wintermute - current maintainer&lt;br /&gt;
* Lari Nieminen (zookeeper) - WML cleanup, bugfixing, polishing&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* William Carey (aelius)&lt;br /&gt;
* Shadow&lt;br /&gt;
* J.W. Bjerk (eleazar)&lt;br /&gt;
* Lari Nieminen (zookeeper)&lt;br /&gt;
== Son Of The Black Eye ==&lt;br /&gt;
=== Conception and Original Design ===&lt;br /&gt;
* Benjamin Drieu (Benj)&lt;br /&gt;
=== Prose, Grammatical and WML Assistance ===&lt;br /&gt;
* Eric S. Raymond (ESR)&lt;br /&gt;
=== Completion and Maintenance ===&lt;br /&gt;
* Taurus&lt;br /&gt;
== Under the Burning Suns ==&lt;br /&gt;
=== Campaign Design ===&lt;br /&gt;
* Asa Swain&lt;br /&gt;
=== Campaign Maintenance ===&lt;br /&gt;
* Jan Rietema (Rhuvaen)&lt;br /&gt;
=== Artwork and Graphics Design ===&lt;br /&gt;
* Sangel&lt;br /&gt;
* Richard Kettering (Jetryl)&lt;br /&gt;
* James Woo (Pickslide)&lt;br /&gt;
* Murray Cook (Zhukov)&lt;br /&gt;
* Scott Klempner&lt;br /&gt;
* Mikolaj Machowski (Emdot)&lt;br /&gt;
* Peter Geinitz (Shadow)&lt;br /&gt;
* Hogne Håskjold (Frame)&lt;br /&gt;
* Mark Goodenough (Ranger M)&lt;br /&gt;
* Javier Hoyos (Vendanna)&lt;br /&gt;
* J.W. Bjerk (Eleazar)&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* Mark Polo&lt;br /&gt;
* Isaac&lt;br /&gt;
* Ringcaat (Thorin N. Tatge)&lt;br /&gt;
{{Home}}&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=13074</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=13074"/>
		<updated>2006-12-07T22:31:58Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Developer information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://zapicm.freeshell.org Units] - Units advancement trees and stats&lt;br /&gt;
** [http://zapicm.freeshell.org/dev Development version]&lt;br /&gt;
** [http://zapicm.freeshell.org/stable Stable version]&lt;br /&gt;
** [http://zapicm.freeshell.org/trunk Trunk version]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
** [[Complete_Faction_List_%28unfinished%29]] - list all user made factions&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|Wesnoth Acronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] and [[AlphabeticalWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[ReferencePythonAPI]] - upcoming Python interface for AI&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own single player campaigns&lt;br /&gt;
* [[MultiplayerCampaigns]] - how to make your own multiplayer campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
* [[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[Create_Art#Art_Tutorials|Art Tutorials]] - help in creating art&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
* [[Tiles_Status]] - terrain tiles: proposed and in progress.&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothSVN]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
* [[EasyCoding]] - Bugs and features that are easy to implement for new coders&lt;br /&gt;
* [[WesnothGL]] - Guide to programming the Wesnoth OpenGL branch&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [[WesnothReviews]] - third party reviews of Wesnoth&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
* [[Donate]] or [http://cafepress.com/wesnoth buy Wesnoth merchandise].&lt;br /&gt;
* [[Trailer]] - the Wesnoth trailer&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Map of Wesnoth player locations] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiHaiku]]&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;br /&gt;
* [[WikiMigration]] - we were looking for a replacement for our old wiki (and ended up using Mediawiki)&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4399</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4399"/>
		<updated>2005-11-03T04:21:55Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Reference */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://wesnoth.slack.it/units.cgi Units] - Units stats and advance trees&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?page=frames Wesnoth Unit List]&lt;br /&gt;
** ([http://wesnoth.slack.it/units.cgi?page=list without frames])&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi Experience Tree]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?factions Factions]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?movetypes Movement, defense and resistance tables]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
**[[UnsortedContrib]] - Unsorted Contributions&lt;br /&gt;
**[[GameArt]] - Art for the main game&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|WesnothAcronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[ReferencePythonAPI]] - upcoming Python interface for AI&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
*[[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[CastleTutorial]] - how to create tileable castles and other castle-like tilesets&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothCVS]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
==== Ideas ====&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
* [[NewUnits]] - units that exist only in theory&lt;br /&gt;
* [[NewTerrains]] - tile status&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [[WesnothReviews]] - third party reviews of Wesnoth&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Wesnoth player's map] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiMigration]] - we are looking for a replacement&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4398</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4398"/>
		<updated>2005-11-03T04:17:35Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Reference */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://wesnoth.slack.it/units.cgi Units] - Units stats and advance trees&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?page=frames Wesnoth Unit List]&lt;br /&gt;
** ([http://wesnoth.slack.it/units.cgi?page=list without frames])&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi Experience Tree]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?factions Factions]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?movetypes Movement, defense and resistance tables]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
**[[UnsortedContrib]] - Unsorted Contributions&lt;br /&gt;
**[[GameArt]] - Art for the main game&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|WesnothAcronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[ComplaintsAboutWesnoth]] - common complaints from players about the design of Wesnoth with developer's response (either rationale or plans to resolve)&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[ReferencePythonAPI]] - upcoming Python interface for AI&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
*[[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[CastleTutorial]] - how to create tileable castles and other castle-like tilesets&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothCVS]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
==== Ideas ====&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
* [[NewUnits]] - units that exist only in theory&lt;br /&gt;
* [[NewTerrains]] - tile status&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [[WesnothReviews]] - third party reviews of Wesnoth&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Wesnoth player's map] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiMigration]] - we are looking for a replacement&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4163</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=4163"/>
		<updated>2005-10-18T23:49:32Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Tweaking the Game (Create) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ([[Play]]) ==&lt;br /&gt;
&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://wesnoth.slack.it/units.cgi Units] - Units stats and advance trees&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?page=frames Wesnoth Unit List]&lt;br /&gt;
** ([http://wesnoth.slack.it/units.cgi?page=list without frames])&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi Experience Tree]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?factions Factions]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?movetypes Movement, defense and resistance tables]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
**[[UnsortedContrib]] - Unsorted Contributions&lt;br /&gt;
**[[GameArt]] - Art for the main game&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|WesnothAcronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ([[Create]]) ==&lt;br /&gt;
&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
*[[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[CastleTutorial]] - how to create tileable castles and other castle-like tilesets&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
* [[UnitAnalysis]] - tool to analyze units&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothCVS]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
==== Ideas ====&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
* [[NewUnits]] - units that exist only in theory&lt;br /&gt;
* [[NewTerrains]] - tile status&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Wesnoth player's map] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiMigration]] - we are looking for a replacement&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3974</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3974"/>
		<updated>2005-10-11T01:45:20Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Available commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
'''/query &amp;lt;password&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
'''/query admin &amp;lt;passwd&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
'''/query metrics''' (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
'''/query status''': this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
'''/query kick &amp;lt;nick&amp;gt;''': this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
'''/query ban &amp;lt;ip-address&amp;gt;''': this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
'''/query ban &amp;lt;nick&amp;gt;''': this command will make the server refuse connections from the ip address used by the given nick. This is usually more convenient than having to work out the user's ip address and type it in&lt;br /&gt;
&lt;br /&gt;
'''/query ban''': running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
'''/query kban &amp;lt;nick&amp;gt;''': this command is equivalent to 'kick &amp;lt;nick&amp;gt;' 'ban &amp;lt;nick&amp;gt;' -- i.e. bans the user's ip address and disconnects them all in one go. The most common way to ban someone from the server.&lt;br /&gt;
&lt;br /&gt;
'''/query unban &amp;lt;ip-address&amp;gt;''': this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
'''/query msg &amp;lt;message&amp;gt;''': this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
'''/query ignore &amp;lt;nick&amp;gt;''' (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
&lt;br /&gt;
'''/query mute &amp;lt;nick&amp;gt;''': makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
&lt;br /&gt;
'''/query kban &amp;lt;nick&amp;gt;''': will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3529</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3529"/>
		<updated>2005-10-06T16:11:04Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Future extensions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
'''/query &amp;lt;password&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
'''/query admin &amp;lt;passwd&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
'''/query metrics''' (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
'''/query status''': this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
'''/query kick &amp;lt;nick&amp;gt;''': this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
'''/query ban &amp;lt;ip-address&amp;gt;''': this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
'''/query ban''': running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
'''/query unban &amp;lt;ip-address&amp;gt;''': this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
'''/query msg &amp;lt;message&amp;gt;''': this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
'''/query ignore &amp;lt;nick&amp;gt;''' (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
&lt;br /&gt;
'''/query mute &amp;lt;nick&amp;gt;''': makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
&lt;br /&gt;
'''/query kban &amp;lt;nick&amp;gt;''': will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3528</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3528"/>
		<updated>2005-10-06T16:10:39Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Available commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
'''/query &amp;lt;password&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
'''/query admin &amp;lt;passwd&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
'''/query metrics''' (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
'''/query status''': this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
'''/query kick &amp;lt;nick&amp;gt;''': this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
'''/query ban &amp;lt;ip-address&amp;gt;''': this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
'''/query ban''': running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
'''/query unban &amp;lt;ip-address&amp;gt;''': this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
'''/query msg &amp;lt;message&amp;gt;''': this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
/query ignore &amp;lt;nick&amp;gt; (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
&lt;br /&gt;
/query mute &amp;lt;nick&amp;gt;: makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
&lt;br /&gt;
/query kban &amp;lt;nick&amp;gt;: will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3527</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3527"/>
		<updated>2005-10-06T16:09:48Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
'''/query &amp;lt;password&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
'''/query admin &amp;lt;passwd&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
/query metrics (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
/query status: this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
/query kick &amp;lt;nick&amp;gt;: this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
/query ban &amp;lt;ip-address&amp;gt;: this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
/query ban: running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
/query unban &amp;lt;ip-address&amp;gt;: this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
/query msg &amp;lt;message&amp;gt;: this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
/query ignore &amp;lt;nick&amp;gt; (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
&lt;br /&gt;
/query mute &amp;lt;nick&amp;gt;: makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
&lt;br /&gt;
/query kban &amp;lt;nick&amp;gt;: will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3526</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3526"/>
		<updated>2005-10-06T16:09:00Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Future extensions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
/query &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
/query admin &amp;lt;passwd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
/query metrics (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
/query status: this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
/query kick &amp;lt;nick&amp;gt;: this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
/query ban &amp;lt;ip-address&amp;gt;: this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
/query ban: running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
/query unban &amp;lt;ip-address&amp;gt;: this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
/query msg &amp;lt;message&amp;gt;: this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
/query ignore &amp;lt;nick&amp;gt; (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
&lt;br /&gt;
/query mute &amp;lt;nick&amp;gt;: makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
&lt;br /&gt;
/query kban &amp;lt;nick&amp;gt;: will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3525</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3525"/>
		<updated>2005-10-06T16:08:42Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Available commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
/query &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
/query admin &amp;lt;passwd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
/query metrics (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
&lt;br /&gt;
/query status: this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
&lt;br /&gt;
/query kick &amp;lt;nick&amp;gt;: this command will disconnect the user with the given nick from the server&lt;br /&gt;
&lt;br /&gt;
/query ban &amp;lt;ip-address&amp;gt;: this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
&lt;br /&gt;
/query ban: running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
&lt;br /&gt;
/query unban &amp;lt;ip-address&amp;gt;: this command will remove the specified ip address from the ban list&lt;br /&gt;
&lt;br /&gt;
/query msg &amp;lt;message&amp;gt;: this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
/query ignore &amp;lt;nick&amp;gt; (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
/query mute &amp;lt;nick&amp;gt;: makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
/query kban &amp;lt;nick&amp;gt;: will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3524</id>
		<title>ServerAdministration</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ServerAdministration&amp;diff=3524"/>
		<updated>2005-10-06T16:08:03Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
The Wesnoth server, wesnothd provides a simple interface for administering the server from within the game itself.&lt;br /&gt;
&lt;br /&gt;
To issue an administrative command to the server, you must be connected to the server using Wesnoth, and in the lobby. Any text you type into the chat box that begins with '/query ' will be considered an administrative command instead of a normal chat message. It will not be relayed to other users, but instead treated as a command by the server.&lt;br /&gt;
&lt;br /&gt;
Most commands are not accessible to normal users. They are only accessible once you have authenticated yourself to the server as an administrator. The way to authenticate yourself as an administrator is to use the command,&lt;br /&gt;
&lt;br /&gt;
/query &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;password&amp;gt; is the administrative password to the server. The administrative password is specified as the passwd attribute in wesnothd.cfg. By convention, it will generally start with 'admin ' followed by the actual password, so the usual syntax to authenticate yourself is,&lt;br /&gt;
&lt;br /&gt;
/query admin &amp;lt;passwd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naturally the password for a server should be kept a secret. One danger is that if you forget to type '/query ' at the start of a command you may accidentally type the password in a chat message, and let all users on the server know it. If you do this, then notify an administrator who has access to the box as soon as possible, so they can reset the password in wesnothd.cfg. We may provide features to prevent this kind of accident in future versions.&lt;br /&gt;
&lt;br /&gt;
A message from the server should tell you that you have successfully authenticated yourself as an administrator. The server will recognize you as an administrator until the next time you log out of the server.&lt;br /&gt;
&lt;br /&gt;
== Available commands ==&lt;br /&gt;
&lt;br /&gt;
/query metrics (available to non-administrators): this command will show a simple metrics report of how the server has been performing&lt;br /&gt;
/query status: this command will show you a list of users connected to the server, with IP addresses, and how long they have been connected. Note that IP addresses of users are not available to non-administrators, and should be treated as confidential. Bans are always done by IP address, and so if you need to ban someone, running /query status to find their ip address is the first step.&lt;br /&gt;
/query kick &amp;lt;nick&amp;gt;: this command will disconnect the user with the given nick from the server&lt;br /&gt;
/query ban &amp;lt;ip-address&amp;gt;: this command will make the server refuse connections from the given ip address. A range of ip addresses can be specified by using wildcards, making it possible to easily ban entire subnets. (Obviously this is very powerful, so should be used carefully).&lt;br /&gt;
/query ban: running 'ban' without any parameters will show a list of currently banned ip addresses&lt;br /&gt;
/query unban &amp;lt;ip-address&amp;gt;: this command will remove the specified ip address from the ban list&lt;br /&gt;
/query msg &amp;lt;message&amp;gt;: this command will relay the message 'message' to all users on the server, even if they are in a game. The message will appear to come from 'server', so you should write your name as part of the message if it is necessary to show who it comes from.&lt;br /&gt;
&lt;br /&gt;
== Future extensions ==&lt;br /&gt;
&lt;br /&gt;
The current administrative interface is fairly primitive. We plan to provide some further extensions in the future, such as,&lt;br /&gt;
&lt;br /&gt;
/query ignore &amp;lt;nick&amp;gt; (available to non-administrators): ignores the user with the given nick.&lt;br /&gt;
/query mute &amp;lt;nick&amp;gt;: makes it so that any messages sent by the user with the given nick will not be received by any other user on the server unless they share an IP address with 'nick'. Any games created by 'nick' will likewise not be seen by other users. 'nick' may observe games but will not appear in the observer list, and players of the game will not see any messages they type.&lt;br /&gt;
/query kban &amp;lt;nick&amp;gt;: will ban the ip address of user 'nick' and will then kick the user&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=3523</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=3523"/>
		<updated>2005-10-06T15:46:11Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Reference */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [[ServerAdministration]] - commands that authenticated users can use to administer the server&lt;br /&gt;
* [http://wesnoth.slack.it/units.cgi Units] - Units stats and advance trees&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?page=frames Wesnoth Unit List]&lt;br /&gt;
** ([http://wesnoth.slack.it/units.cgi?page=list without frames])&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi Experience Tree]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?factions Factions]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?movetypes Movement, defense and resistance tables]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|WesnothAcronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ==&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
*[[BuildingUnits]] - how to make your own units&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[CastleTutorial]] - how to create tileable castles and other castle-like tilesets&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Gna&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothCVS]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
==== Ideas ====&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
* [[NewUnits]] - units that exist only in theory&lt;br /&gt;
* [[NewTerrains]] - tile status&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Wesnoth player's map] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiMigration]] - we are looking for a replacement&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ReportingBugs&amp;diff=3280</id>
		<title>ReportingBugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ReportingBugs&amp;diff=3280"/>
		<updated>2005-09-27T23:13:51Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Segfault */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Where to report bugs ==&lt;br /&gt;
The prefered way to report bugs it though our bug tracking system on Gna, but you can also post your problem to the forums.&lt;br /&gt;
* [http://bugs.wesnoth.org/ Wesnoth bugs page on Gna]&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewforum.php?f=4 Wesnoth forum - Technical Support]&lt;br /&gt;
&lt;br /&gt;
== Needed information ==&lt;br /&gt;
* What version of the game are you running?&lt;br /&gt;
* Have you built (from sources) the game by yourself? gcc/g++ version? SDL library versions?&lt;br /&gt;
* What operating system are you using? What version/release of that operating system?&lt;br /&gt;
* Can you reproduce the problem? If you can please provide steps to do it.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for reporting bugs ==&lt;br /&gt;
# First, please make sure the bug you are reporting has not already been fixed (consult http://changelog.wesnoth.org/ to see the history of changes to the game).&lt;br /&gt;
# If it hasn't been fixed yet, please check that the bug hasn't already been reported, by [https://savannah.nongnu.org/bugs/?func=search&amp;amp;group=wesnoth searching the bugs database].&lt;br /&gt;
# If your bug or feature request hasn't been fixed and has not yet been submitted, please go ahead and report it.&lt;br /&gt;
# Please post only one bug per bug report. If you have multiple bugs that are related, you can cross reference them.&lt;br /&gt;
&lt;br /&gt;
Note that feature requests should usually be discussed on the forums first, or they will generally be ignored until there is evidence that such a feature would be generally liked.&lt;br /&gt;
&lt;br /&gt;
Keep bug reports to the point, and make sure your bug is easily reproducible given the information you provide.  Clearly written, reproducible single bug reports will get attention before those reports that mix several different bugs into one report, or that are incomprehensible.&lt;br /&gt;
&lt;br /&gt;
If there is already an existing bug report, do not hesitate to add a comment with your details - this way we know when some bug is getting &amp;quot;popular&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Please login to Savannah before reporting bugs''&lt;br /&gt;
&lt;br /&gt;
An account at Savannah is free and takes very little time to set up. You can submit anonymous bug reports, but then you will have to keep an eye on the bug report in case developers ask for clarification, which will delay your bug being fixed.  If you login, you will receive notifications of any changes to your bug reports, which speeds things up considerably.&lt;br /&gt;
&lt;br /&gt;
=== In-play problems ===&lt;br /&gt;
If it is in-play problem that you can reproduce, save the game and send the savegame to us with details how to reproduce the problem from the savegame.&lt;br /&gt;
&lt;br /&gt;
=== Problems with scenarios ===&lt;br /&gt;
If it is a problem with a contributed scenario (like the ones on the Campaign Server), please report the problem to the maintainer of the scenario, not as a bug in Wesnoth itself.  Bugs in the [[MainlineScenarios]] should be reported in the bug tracker.&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer out-of-sync errors ===&lt;br /&gt;
* We need wesnoth stdout/stderr output from person who got the error (if you started wesnoth in terminal stdout/stderr is in that terminal).&lt;br /&gt;
* We need savegame from person who got the error.&lt;br /&gt;
* Savegame from some other player if possible.&lt;br /&gt;
* The person who got the error should report the bug, other players can then add their savegames to that bug.&lt;br /&gt;
&lt;br /&gt;
=== Segfault ===&lt;br /&gt;
* In Unix follow the instructions at [[DebuggingWesnoth]] to generate information to send to a developer.&lt;br /&gt;
* In NT based OS's (including Win2k, XP) you enable/configure core dumps by running 'drwtsn32', the location of the dumps can be changed there.&lt;br /&gt;
* In Mac OS X, you can enable Crash Reporter -- the output is a backtrace. Run Applications -&amp;gt; Utilities -&amp;gt; Console to see log output. See http://www.mozilla.org/mailnews/osxinfo.html for information on how to enable Crash Reporter.&lt;br /&gt;
&lt;br /&gt;
=== Sending savegames, screenshots, coredumps, etc ===&lt;br /&gt;
* Please compress the files (bzip2, gzip, zip).&lt;br /&gt;
* You can attach files if you submit your bug thru Savannah (512KB max size), else&lt;br /&gt;
* Put them on some web or ftp server where we can download them.&lt;br /&gt;
* You can attach files to forum posts.&lt;br /&gt;
* As a last resort you can send them via email to: [mailto:davidnwhite_AT_verizon.net]&lt;br /&gt;
&lt;br /&gt;
== Bug protocol ==&lt;br /&gt;
&lt;br /&gt;
* When adding a new bug, please choose either &amp;quot;Bug&amp;quot; or &amp;quot;Feature Request&amp;quot; as its Category; it may not be noticed if you leave the Category as &amp;quot;None&amp;quot;.&lt;br /&gt;
* We use the Status values &amp;quot;None&amp;quot; (awaiting action), &amp;quot;Fixed&amp;quot;, &amp;quot;Won't Fix&amp;quot;, &amp;quot;Invalid&amp;quot; (not a bug), &amp;quot;Works For Me&amp;quot; (unreproducible), or &amp;quot;Need Info&amp;quot;.&lt;br /&gt;
* A bug which is fixed is marked &amp;quot;Fixed&amp;quot; by a developer, probably the one committing the fix or reviewing it.&lt;br /&gt;
* A bug present in a release is marked &amp;quot;Closed&amp;quot; only upon a new release containing the fix.&lt;br /&gt;
* Any bug present only in [[WesnothCVS]] is marked &amp;quot;Closed&amp;quot; when it is fixed.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=ReportingBugs&amp;diff=3279</id>
		<title>ReportingBugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=ReportingBugs&amp;diff=3279"/>
		<updated>2005-09-27T23:12:03Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Segfault */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Where to report bugs ==&lt;br /&gt;
The prefered way to report bugs it though our bug tracking system on Gna, but you can also post your problem to the forums.&lt;br /&gt;
* [http://bugs.wesnoth.org/ Wesnoth bugs page on Gna]&lt;br /&gt;
* [http://www.wesnoth.org/forum/viewforum.php?f=4 Wesnoth forum - Technical Support]&lt;br /&gt;
&lt;br /&gt;
== Needed information ==&lt;br /&gt;
* What version of the game are you running?&lt;br /&gt;
* Have you built (from sources) the game by yourself? gcc/g++ version? SDL library versions?&lt;br /&gt;
* What operating system are you using? What version/release of that operating system?&lt;br /&gt;
* Can you reproduce the problem? If you can please provide steps to do it.&lt;br /&gt;
&lt;br /&gt;
== Guidelines for reporting bugs ==&lt;br /&gt;
# First, please make sure the bug you are reporting has not already been fixed (consult http://changelog.wesnoth.org/ to see the history of changes to the game).&lt;br /&gt;
# If it hasn't been fixed yet, please check that the bug hasn't already been reported, by [https://savannah.nongnu.org/bugs/?func=search&amp;amp;group=wesnoth searching the bugs database].&lt;br /&gt;
# If your bug or feature request hasn't been fixed and has not yet been submitted, please go ahead and report it.&lt;br /&gt;
# Please post only one bug per bug report. If you have multiple bugs that are related, you can cross reference them.&lt;br /&gt;
&lt;br /&gt;
Note that feature requests should usually be discussed on the forums first, or they will generally be ignored until there is evidence that such a feature would be generally liked.&lt;br /&gt;
&lt;br /&gt;
Keep bug reports to the point, and make sure your bug is easily reproducible given the information you provide.  Clearly written, reproducible single bug reports will get attention before those reports that mix several different bugs into one report, or that are incomprehensible.&lt;br /&gt;
&lt;br /&gt;
If there is already an existing bug report, do not hesitate to add a comment with your details - this way we know when some bug is getting &amp;quot;popular&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Please login to Savannah before reporting bugs''&lt;br /&gt;
&lt;br /&gt;
An account at Savannah is free and takes very little time to set up. You can submit anonymous bug reports, but then you will have to keep an eye on the bug report in case developers ask for clarification, which will delay your bug being fixed.  If you login, you will receive notifications of any changes to your bug reports, which speeds things up considerably.&lt;br /&gt;
&lt;br /&gt;
=== In-play problems ===&lt;br /&gt;
If it is in-play problem that you can reproduce, save the game and send the savegame to us with details how to reproduce the problem from the savegame.&lt;br /&gt;
&lt;br /&gt;
=== Problems with scenarios ===&lt;br /&gt;
If it is a problem with a contributed scenario (like the ones on the Campaign Server), please report the problem to the maintainer of the scenario, not as a bug in Wesnoth itself.  Bugs in the [[MainlineScenarios]] should be reported in the bug tracker.&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer out-of-sync errors ===&lt;br /&gt;
* We need wesnoth stdout/stderr output from person who got the error (if you started wesnoth in terminal stdout/stderr is in that terminal).&lt;br /&gt;
* We need savegame from person who got the error.&lt;br /&gt;
* Savegame from some other player if possible.&lt;br /&gt;
* The person who got the error should report the bug, other players can then add their savegames to that bug.&lt;br /&gt;
&lt;br /&gt;
=== Segfault ===&lt;br /&gt;
* In Unix follow the instructions at DebuggingWesnoth to generate information to send to a developer.&lt;br /&gt;
* In NT based OS's (including Win2k, XP) you enable/configure core dumps by running 'drwtsn32', the location of the dumps can be changed there.&lt;br /&gt;
* In Mac OS X, you can enable Crash Reporter -- the output is a backtrace. Run Applications -&amp;gt; Utilities -&amp;gt; Console to see log output. See http://www.mozilla.org/mailnews/osxinfo.html for information on how to enable Crash Reporter.&lt;br /&gt;
&lt;br /&gt;
=== Sending savegames, screenshots, coredumps, etc ===&lt;br /&gt;
* Please compress the files (bzip2, gzip, zip).&lt;br /&gt;
* You can attach files if you submit your bug thru Savannah (512KB max size), else&lt;br /&gt;
* Put them on some web or ftp server where we can download them.&lt;br /&gt;
* You can attach files to forum posts.&lt;br /&gt;
* As a last resort you can send them via email to: [mailto:davidnwhite_AT_verizon.net]&lt;br /&gt;
&lt;br /&gt;
== Bug protocol ==&lt;br /&gt;
&lt;br /&gt;
* When adding a new bug, please choose either &amp;quot;Bug&amp;quot; or &amp;quot;Feature Request&amp;quot; as its Category; it may not be noticed if you leave the Category as &amp;quot;None&amp;quot;.&lt;br /&gt;
* We use the Status values &amp;quot;None&amp;quot; (awaiting action), &amp;quot;Fixed&amp;quot;, &amp;quot;Won't Fix&amp;quot;, &amp;quot;Invalid&amp;quot; (not a bug), &amp;quot;Works For Me&amp;quot; (unreproducible), or &amp;quot;Need Info&amp;quot;.&lt;br /&gt;
* A bug which is fixed is marked &amp;quot;Fixed&amp;quot; by a developer, probably the one committing the fix or reviewing it.&lt;br /&gt;
* A bug present in a release is marked &amp;quot;Closed&amp;quot; only upon a new release containing the fix.&lt;br /&gt;
* Any bug present only in [[WesnothCVS]] is marked &amp;quot;Closed&amp;quot; when it is fixed.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DebuggingWesnoth&amp;diff=3278</id>
		<title>DebuggingWesnoth</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DebuggingWesnoth&amp;diff=3278"/>
		<updated>2005-09-27T22:51:16Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A common problem is that a user of Wesnoth has Wesnoth crash on them, but no developers can reproduce the problem, and so that makes it very difficult for us to fix it.&lt;br /&gt;
&lt;br /&gt;
Fortunately, if you are using GNU/Linux or another Unix-like system, have compiled Wesnoth yourself, and you have debugging symbols in (the default when compiling), or your packager has left debugging symbols in, you can do a little debugging yourself to send to a developer. Even a non-programmer can do enough to give a developer alot of clues about where Wesnoth is crashing.&lt;br /&gt;
&lt;br /&gt;
When a program crashes, if the system is configured correctly it will leave behind a 'core' file. A 'core' file contains the contents of memory [1] at the time the program crashed. However, many systems by default have the maximum size of cores set very low, or to 0, meaning that the system won't dump cores. So, before running Wesnoth, use the following command in the same terminal you plan to run Wesnoth from to make it so that cores will be always dumped, no matter how large they are.&lt;br /&gt;
&lt;br /&gt;
'''ulimit -c unlimited'''&lt;br /&gt;
&lt;br /&gt;
Then, run Wesnoth, and do whatever you have to do to make it crash. The last line of output should be something like,&lt;br /&gt;
&lt;br /&gt;
'''Segmentation Fault (core dumped)'''&lt;br /&gt;
&lt;br /&gt;
or perhaps,&lt;br /&gt;
&lt;br /&gt;
'''Aborted (core dumped)'''&lt;br /&gt;
&lt;br /&gt;
or something similiar. The core file will then be in the current working directory, and will either be called 'core' or 'core.&amp;lt;pid&amp;gt;' where &amp;lt;pid&amp;gt; is the process ID of Wesnoth before it crashed. You can of course list all cores in the current directory using,&lt;br /&gt;
&lt;br /&gt;
'''ls core*'''&lt;br /&gt;
&lt;br /&gt;
Now that you have your core, you can open it and see where Wesnoth crashed. To open it, you run gdb giving it the path to the Wesnoth binary as its first argument, and the core file as its second. The most common usage is,&lt;br /&gt;
&lt;br /&gt;
'''gdb ./wesnoth ./core'''&lt;br /&gt;
&lt;br /&gt;
This should run gdb, and print out alot of information which is generally of no consequence (unless there is an error message). gdb should give you a prompt, at which you can type the command,&lt;br /&gt;
&lt;br /&gt;
'''bt full'''&lt;br /&gt;
&lt;br /&gt;
This should make gdb print out what is known as a 'backtrace' -- a list of all the functions Wesnoth was in when it crashed. Copy everything that gdb printed out below where you typed bt full, and send it to a developer. It's a good idea if you keep the core file around, because the developer may need you to open it again with gdb to run some more commands.&lt;br /&gt;
&lt;br /&gt;
[1] 'core' is an old-fashioned Unix term for memory.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=DebuggingWesnoth&amp;diff=3277</id>
		<title>DebuggingWesnoth</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=DebuggingWesnoth&amp;diff=3277"/>
		<updated>2005-09-27T22:49:52Z</updated>

		<summary type="html">&lt;p&gt;Dave: Finding why Wesnoth crashed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A common problem is that a user of Wesnoth has Wesnoth crash on them, but no developers can reproduce the problem, and so that makes it very difficult for us to fix it.&lt;br /&gt;
&lt;br /&gt;
Fortunately, if you are using GNU/Linux or another Unix-like system, have compiled Wesnoth yourself, and you have debugging symbols in (the default when compiling), or your packager has left debugging symbols in, you can do a little debugging yourself to send to a developer. Even a non-programmer can do enough to give a developer alot of clues about where Wesnoth is crashing.&lt;br /&gt;
&lt;br /&gt;
When a program crashes, if the system is configured correctly it will leave behind a 'core' file. A 'core' file contains the contents of memory [1] at the time the program crashed. However, many systems by default have the maximum size of cores set very low, or to 0, meaning that the system won't dump cores. So, before running Wesnoth, use the following command in the same terminal you plan to run Wesnoth from to make it so that cores will be always dumped, no matter how large they are.&lt;br /&gt;
&lt;br /&gt;
'''ulimit -c unlimited'''&lt;br /&gt;
&lt;br /&gt;
Then, run Wesnoth, and do whatever you have to do to make it crash. The last line of output should be something like,&lt;br /&gt;
&lt;br /&gt;
'''Segmentation Fault (core dumped)'''&lt;br /&gt;
&lt;br /&gt;
or perhaps,&lt;br /&gt;
&lt;br /&gt;
'''Aborted (core dumped)'''&lt;br /&gt;
&lt;br /&gt;
or something similiar. The core file will then be in the current working directory, and will either be called 'core' or 'core.&amp;lt;pid&amp;gt;' where &amp;lt;pid&amp;gt; is the process ID of Wesnoth before it crashed. You can of course list all cores in the current directory using,&lt;br /&gt;
&lt;br /&gt;
'''ls core*'''&lt;br /&gt;
&lt;br /&gt;
Now that you have your core, you can open it and see where Wesnoth crashed. To open it, you run gdb giving it the path to the Wesnoth binary as its first argument, and the core file as its second. The most common usage is,&lt;br /&gt;
&lt;br /&gt;
'''gdb ./wesnoth ./core'''&lt;br /&gt;
&lt;br /&gt;
This should run gdb, and print out alot of information which is generally of no consequence (unless there is an error message). gdb should give you a prompt, at which you can type the command,&lt;br /&gt;
&lt;br /&gt;
'''bt'''&lt;br /&gt;
&lt;br /&gt;
This should make gdb print out what is known as a 'backtrace' -- a list of all the functions Wesnoth was in when it crashed. Copy everything that gdb printed out below where you typed bt, and send it to a developer. It's a good idea if you keep the core file around, because the developer may need you to open it again with gdb to run some more commands.&lt;br /&gt;
&lt;br /&gt;
[1] 'core' is an old-fashioned Unix term for memory.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=3276</id>
		<title>StartingPoints</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=StartingPoints&amp;diff=3276"/>
		<updated>2005-09-27T22:37:59Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* Compiling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Battle for Wesnoth is a turn-based fantasy strategy game.&lt;br /&gt;
&lt;br /&gt;
Defeat all enemy leaders using a well-chosen cadre of troops,&lt;br /&gt;
taking care to manage your resources of gold and villages.&lt;br /&gt;
All units have their own strengths and weaknesses; to win,&lt;br /&gt;
deploy your forces to their best advantage while&lt;br /&gt;
denying your foes the chance to do the same. As units gain&lt;br /&gt;
experience, they acquire new abilities and become more&lt;br /&gt;
powerful. Play in your own language and test your skill&lt;br /&gt;
against a smart computer opponent, or join Wesnoth's large&lt;br /&gt;
community of on-line players.&lt;br /&gt;
Create your own custom units, scenarios or campaigns,&lt;br /&gt;
and share them with others.&lt;br /&gt;
&lt;br /&gt;
Battle for Wesnoth is released under the&lt;br /&gt;
[http://www.gnu.org/licenses/licenses.html#GPL GPL].&lt;br /&gt;
Prebuilt packages are available for most operating systems,&lt;br /&gt;
including Windows, Mac OS X, and GNU/Linux, or you can build&lt;br /&gt;
your own from source code.&lt;br /&gt;
&lt;br /&gt;
== Getting the Game ==&lt;br /&gt;
==== Downloading ====&lt;br /&gt;
* [[Download]] - get the most recent source-files and many binaries&lt;br /&gt;
** [[WesnothBinaries]] - precompiled for GNU/Linux, BeOS, PDAs, ...&lt;br /&gt;
** [[WesnothBinariesLinux]] - precompiled for many GNU/Linux distributions&lt;br /&gt;
&lt;br /&gt;
==== Compiling ====&lt;br /&gt;
* [[CompilingWesnoth]] - on Unix, Mac, Windows, GNU/Linux, PDAs, ...&lt;br /&gt;
* [[DebuggingWesnoth]] - on GNU/Linux and Unix-like systems&lt;br /&gt;
* [[WesnothOnLinuxPDAs]] - on the Qtopia/OPIE and thepdaXrom/Zaurus C series&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
==== For New Players ====&lt;br /&gt;
* [[GettingStarted]] - read me first!&lt;br /&gt;
* [[WesnothManual]] - the rules&lt;br /&gt;
* [[MainlineScenarios]] - walkthroughs for the game-supplied campaigns&lt;br /&gt;
&lt;br /&gt;
==== For Not-So-New Players ====&lt;br /&gt;
* [[AdvancedTactics]] - beating the AI and other people&lt;br /&gt;
* [[MultiplayerServers]] - where to play against other people online&lt;br /&gt;
&lt;br /&gt;
==== Reference ====&lt;br /&gt;
* [[HotKeysSystem]] - keyboard shortcuts&lt;br /&gt;
* [[CommandMode]] - commands you can use in-game&lt;br /&gt;
* [http://wesnoth.slack.it/units.cgi Units] - Units stats and advance trees&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?page=frames Wesnoth Unit List]&lt;br /&gt;
** ([http://wesnoth.slack.it/units.cgi?page=list without frames])&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi Experience Tree]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?factions Factions]&lt;br /&gt;
** [http://wesnoth.slack.it/units.cgi?movetypes Movement, defense and resistance tables]&lt;br /&gt;
* [[RaceDescriptions]] - Elves, Humans, Dwarves, Orcs, Drakes, Undead, Others&lt;br /&gt;
* [[GraphicLibrary]] - unit and terrain images posted on the forums&lt;br /&gt;
* [[WesnothAcronyms|Wesnoth Acronyms (by category)]] - common wesnothian acronyms explained&lt;br /&gt;
* [[WesnothAcronyms(alphabetic)|WesnothAcronyms (alphabetic)]] - common wesnothian acronyms explained&lt;br /&gt;
&lt;br /&gt;
== Tweaking the Game ==&lt;br /&gt;
* [[UserScenarios]] - user-written scenarios, campaigns and game modifications&lt;br /&gt;
* [[ReferenceWML]] - all about Wesnoth Markup Language&lt;br /&gt;
* [[BuildingCampaigns]] - how to make your own campaigns&lt;br /&gt;
* [[BuildingScenarios]] - how to make your own scenarios&lt;br /&gt;
* [[WesnothMapEditor]] - summary of controls&lt;br /&gt;
* [[CastleTutorial]] - how to create tileable castles and other castle-like tilesets&lt;br /&gt;
* [[ExternalUtilities]] - scripts to help create scenarios, campaigns, and graphics&lt;br /&gt;
&lt;br /&gt;
== Improving the Game ==&lt;br /&gt;
* [[ReportingBugs]] - use Savannah&lt;br /&gt;
==== Developer information ====&lt;br /&gt;
* [[DeveloperResources]] - useful links&lt;br /&gt;
* [http://changelog.wesnoth.org Changelog] - the most recent changes made to the game&lt;br /&gt;
* [[WesnothCVS]] - accessing the source code&lt;br /&gt;
* [[HackingWesnoth]] - guide for programmers&lt;br /&gt;
* [[CodingStandards]] - for programmers&lt;br /&gt;
* [[UnitDescriptionRewriting]] - coordinating the revision&lt;br /&gt;
* [http://wesnoth.slack.it/missing.cgi Missing unit animations and sounds] - what's available and what's missing&lt;br /&gt;
* [[WritingYourOwnAI]] - write a C++ plugin&lt;br /&gt;
* [[ThemeSystem]] - customizing the screen layout for the game and the editor&lt;br /&gt;
* [[ReleasingWesnoth]] - steps to follow to release a new version&lt;br /&gt;
* [[WesnothPackagersGuide]] - guidelines for packaging Wesnoth for different platforms&lt;br /&gt;
* [[WesnothPreferences]]&lt;br /&gt;
&lt;br /&gt;
==== Game translations ====&lt;br /&gt;
* [[GettextForTranslators]] - how to translate Wesnoth under [[GetText]]&lt;br /&gt;
* [[WesnothTranslations]] - 11 complete, 2 almost complete, 7 more than halfway, 10 partial&lt;br /&gt;
* [[WesCamp]] - a project for translating user-made campaigns&lt;br /&gt;
&lt;br /&gt;
==== Ideas ====&lt;br /&gt;
* [[FrequentlyProposedIdeas]] - before you propose an idea, check here!&lt;br /&gt;
* [[NewUnits]] - units that exist only in theory&lt;br /&gt;
* [[NewTerrains]] - tile status&lt;br /&gt;
* To submit a feature request, use http://bugs.wesnoth.org&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
* [[WesnothPhilosophy]] - Dave on Wesnoth&lt;br /&gt;
* [[WesnothHistory]] - the Ages of Wesnoth&lt;br /&gt;
* [[WesnothGeography]] - description of Wesnoth and surrounding lands&lt;br /&gt;
* [irc://irc.wesnoth.org/wesnoth #wesnoth] - our IRC channel&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[UsefulLinks]]&lt;br /&gt;
* [[WesnothLSM]] - presentation at LSM&lt;br /&gt;
* [http://wesnoth.slack.it/?WesnothPlayerMap Wesnoth player's map] - add yourself to the map!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Battle_for_Wesnoth Wikipedia entry for Wesnoth]&lt;br /&gt;
* [[WikiMigration]] - we are looking for a replacement&lt;br /&gt;
&lt;br /&gt;
== About this Wiki ==&lt;br /&gt;
* [[Help:Editing|Editing]] - learn how to edit pages&lt;br /&gt;
* [[Sandbox]] - experiment with the wiki&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=HackingWesnoth&amp;diff=2609</id>
		<title>HackingWesnoth</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=HackingWesnoth&amp;diff=2609"/>
		<updated>2005-09-04T22:18:57Z</updated>

		<summary type="html">&lt;p&gt;Dave: /* C++ Quiz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page is designed to be a guide for aspiring Wesnoth programmers on what they need to do to be able to productively contribute to the Wesnoth code base.&lt;br /&gt;
&lt;br /&gt;
Wesnoth is written in C++, a large and complicated language. There are many C++ programmers, but they tend to have widely varying levels of skills and styles. This page is designed to be a guide as to the skillset needed to contribute to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
= C++ Quiz =&lt;br /&gt;
&lt;br /&gt;
Below is a short C++ quiz that assesses your skills in areas of C++ that are used alot in Wesnoth. If you know all the answers to the questions, you are probably ready to start working on the Wesnoth code base. If you know most of the answers to the questions, you can probably work on the Wesnoth code base with some oversight from the senior developers.&lt;br /&gt;
&lt;br /&gt;
(1) What is a virtual destructor? Why is it needed?&lt;br /&gt;
&lt;br /&gt;
(2) What does the standard class template auto_ptr do? What is its purpose?&lt;br /&gt;
&lt;br /&gt;
(3) What is a vector, and why would you use it?&lt;br /&gt;
&lt;br /&gt;
(4) What is a map, and why would you use it?&lt;br /&gt;
&lt;br /&gt;
(5) What are the differences between a reference and a pointer? When should each be used?&lt;br /&gt;
&lt;br /&gt;
(6) What is an iterator, and when is it used?&lt;br /&gt;
&lt;br /&gt;
(7) What are the memory areas in a C++ program, and what is the purpose of each?&lt;br /&gt;
&lt;br /&gt;
(8) What is a copy constructor, and what is an assignment operator? When must you define them in a class?&lt;br /&gt;
&lt;br /&gt;
= Wesnoth Coding Style =&lt;br /&gt;
&lt;br /&gt;
== Guideline 1: Don't prematurely optimize ==&lt;br /&gt;
&lt;br /&gt;
When I was a new and inexperienced coder, I read the following rather famous saying: &amp;quot;Premature optimization is the root of all evil.&amp;quot; -- Donald Knuth.&lt;br /&gt;
&lt;br /&gt;
While I wouldn't then -- and would be hesitant to now -- dispute the opinion of Donald Knuth on any programming topic, this absolute statement confused me. Premature optimization certainly doesn't sound like a wise thing to do, but it sounds somewhat obscure to be the root of all problems in programming. Had Knuth written this phrase after spending too long correcting problems caused by a programmer who was hell-bent on optimization at every turn?&lt;br /&gt;
&lt;br /&gt;
Now I realize that Knuth was correct. Time and time again programming problems spring from developers making their code too complicated because they are trying to optimize unnecessarily.&lt;br /&gt;
&lt;br /&gt;
By the [http://en.wikipedia.org/wiki/Pareto_principle Pareto Principle] we know that a minority of the code will occupy a majority of the running time. That is, perhaps 90% of the running time of the program will be spend executing just 5% of the code. It is thus generally unnecessary to apply many optimizations at all to most of the program. One can just write the code in a way that is the most readable and maintainable and forget about optimization altogether most of the time.&lt;br /&gt;
&lt;br /&gt;
Remember also, C++ compilers are good, and smart, and they can execute code fast. Most code will run fast enough, unless you go out of your way to make it run slowly.&lt;br /&gt;
&lt;br /&gt;
So, the first rule of Wesnoth programming is that unless you have a very good reason to think you need to optimize, do whatever is simplest and most maintainable.&lt;br /&gt;
&lt;br /&gt;
Many programmers seem to have an obsession with using the control C++ gives them to do all sorts of crazy things. Like make their own memory management routines, or write their own containers, and so forth. Simply, don't. It's possible to write good C++ code very fast using the standard components supplied as part of the language.&lt;br /&gt;
&lt;br /&gt;
This leads us to our next topic...&lt;br /&gt;
&lt;br /&gt;
== Guideline 2: Know the Standard containers and use them ==&lt;br /&gt;
&lt;br /&gt;
One of the best things about C++ is that the standard supplies some great containers. Always prefer to use them first to store data. That is,&lt;br /&gt;
&lt;br /&gt;
- prefer to use std::vector to store dynamic arrays&lt;br /&gt;
- prefer to use std::string to store strings (we also provide t_string for a translatable string -- it's based on std::basic_string, which std::string is also based on)&lt;br /&gt;
- prefer to use std::map to store key/value pairs&lt;br /&gt;
- prefer to use std::set to store sets of items (roughly equivalent to the mathematical concept of a set).&lt;br /&gt;
&lt;br /&gt;
There are other C++ containers, and you should know about all of them. A good source of documentation on the portion of the C++ standard library known as the Standard Template Library (STL) which contains the standard containers can be found [http://www.sgi.com/tech/stl/ here].&lt;br /&gt;
&lt;br /&gt;
By using the standard containers, you should almost never have to manually allocate and delete memory yourself by hand. The containers will automatically allocate and deallocate memory for you. This leads us to our next guideline...&lt;br /&gt;
&lt;br /&gt;
== Guideline 3: Use the resource acquisition is initialization (RAII) idiom ==&lt;br /&gt;
&lt;br /&gt;
In C, you might write some code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    char* mystring = (char*)malloc(n);&lt;br /&gt;
    /*some code, which manipulates mystring*/&lt;br /&gt;
    ...&lt;br /&gt;
    free(mystring);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code works, but is error prone. What if the code in the middle exited using a return statement, or a longjmp statement, or in C++, threw an exception? The memory allocated would never be cleaned up, and we would have a memory leak.&lt;br /&gt;
&lt;br /&gt;
Sure, you're a good programmer, and you probably make sure you're very careful about freeing the string. But what about when this function grows to be 100 lines long (and functions have a way of doing that), and then another programmer who isn't that familiar with the function is trying to fix a critical bug as quickly as they can, that requires adding an early return statement to this function? What about when someone is trying to read the code to scan for memory leaks? Once they see the malloc at the top, they will have to carefully read the entire function, to make sure it's all okay.&lt;br /&gt;
&lt;br /&gt;
Now if we had this C++ version instead,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    std::string mystring(n,'x');&lt;br /&gt;
    /*some code, which manipulates mystring*/&lt;br /&gt;
} //mystring is destroyed and memory automatically released&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
None of these problems can possibly happen. mystring will ''always'' be released at the end of the function.&lt;br /&gt;
&lt;br /&gt;
So, this just re-iterates how important C++ containers are, right? Well, yes, but it also shows us that we should always avoid code written like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    ...allocate resources...&lt;br /&gt;
    ...use resources&lt;br /&gt;
    ...release resources...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have code like this, you should put the resources in a class that will manage them and release them at the end of the function. If there is no class like that, then you should write one. This goes for all resources: memory, files, threads, and so forth.&lt;br /&gt;
&lt;br /&gt;
It might sound like a silly mistake that we're protecting against here, one that an experienced programmer wouldn't make. However, almost all programming bugs are due to 'silly mistakes'. This leads us to our next item...&lt;br /&gt;
&lt;br /&gt;
== Guideline 4: Lean on the compiler as heavily as you can ==&lt;br /&gt;
&lt;br /&gt;
Humans make mistakes. Even very stupid mistakes. Computers are as dumb as toast, but they are at least very very consistent.&lt;br /&gt;
&lt;br /&gt;
For Wesnoth, we try to write code that will make the compiler guard against mistakes as much as possible. The use of RAII as described above is one example of this: writing the code so the compiler and language rules will guarantee it's correct.&lt;br /&gt;
&lt;br /&gt;
There are some more ways to do this. One big way is to make all code const correct. That is, always define something as 'const' when it shouldn't change its value. If you have a pointer that is meant to be read only, define it as a const pointer. Then if the code is later changed so that your pointer changes the value, the compiler will produce an error.&lt;br /&gt;
&lt;br /&gt;
Another way is to avoid implicit conversions between objects, and always use the C++-style casts.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wesnoth.org/index.php?title=HackingWesnoth&amp;diff=2608</id>
		<title>HackingWesnoth</title>
		<link rel="alternate" type="text/html" href="https://wiki.wesnoth.org/index.php?title=HackingWesnoth&amp;diff=2608"/>
		<updated>2005-09-04T22:18:25Z</updated>

		<summary type="html">&lt;p&gt;Dave: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page is designed to be a guide for aspiring Wesnoth programmers on what they need to do to be able to productively contribute to the Wesnoth code base.&lt;br /&gt;
&lt;br /&gt;
Wesnoth is written in C++, a large and complicated language. There are many C++ programmers, but they tend to have widely varying levels of skills and styles. This page is designed to be a guide as to the skillset needed to contribute to Wesnoth.&lt;br /&gt;
&lt;br /&gt;
= C++ Quiz =&lt;br /&gt;
&lt;br /&gt;
Below is a short C++ quiz that assesses your skills in areas of C++ that are used alot in Wesnoth. If you know all the answers to the questions, you are probably ready to start working on the Wesnoth code base. If you know most of the answers to the questions, you can probably work on the Wesnoth code base with some oversight from the senior developers.&lt;br /&gt;
&lt;br /&gt;
(1) What is a virtual destructor? Why is it needed?&lt;br /&gt;
(2) What does the standard class template auto_ptr do? What is its purpose?&lt;br /&gt;
(3) What is a vector, and why would you use it?&lt;br /&gt;
(4) What is a map, and why would you use it?&lt;br /&gt;
(5) What are the differences between a reference and a pointer? When should each be used?&lt;br /&gt;
(6) What is an iterator, and when is it used?&lt;br /&gt;
(7) What are the memory areas in a C++ program, and what is the purpose of each?&lt;br /&gt;
(8) What is a copy constructor, and what is an assignment operator? When must you define them in a class?&lt;br /&gt;
&lt;br /&gt;
= Wesnoth Coding Style =&lt;br /&gt;
&lt;br /&gt;
== Guideline 1: Don't prematurely optimize ==&lt;br /&gt;
&lt;br /&gt;
When I was a new and inexperienced coder, I read the following rather famous saying: &amp;quot;Premature optimization is the root of all evil.&amp;quot; -- Donald Knuth.&lt;br /&gt;
&lt;br /&gt;
While I wouldn't then -- and would be hesitant to now -- dispute the opinion of Donald Knuth on any programming topic, this absolute statement confused me. Premature optimization certainly doesn't sound like a wise thing to do, but it sounds somewhat obscure to be the root of all problems in programming. Had Knuth written this phrase after spending too long correcting problems caused by a programmer who was hell-bent on optimization at every turn?&lt;br /&gt;
&lt;br /&gt;
Now I realize that Knuth was correct. Time and time again programming problems spring from developers making their code too complicated because they are trying to optimize unnecessarily.&lt;br /&gt;
&lt;br /&gt;
By the [http://en.wikipedia.org/wiki/Pareto_principle Pareto Principle] we know that a minority of the code will occupy a majority of the running time. That is, perhaps 90% of the running time of the program will be spend executing just 5% of the code. It is thus generally unnecessary to apply many optimizations at all to most of the program. One can just write the code in a way that is the most readable and maintainable and forget about optimization altogether most of the time.&lt;br /&gt;
&lt;br /&gt;
Remember also, C++ compilers are good, and smart, and they can execute code fast. Most code will run fast enough, unless you go out of your way to make it run slowly.&lt;br /&gt;
&lt;br /&gt;
So, the first rule of Wesnoth programming is that unless you have a very good reason to think you need to optimize, do whatever is simplest and most maintainable.&lt;br /&gt;
&lt;br /&gt;
Many programmers seem to have an obsession with using the control C++ gives them to do all sorts of crazy things. Like make their own memory management routines, or write their own containers, and so forth. Simply, don't. It's possible to write good C++ code very fast using the standard components supplied as part of the language.&lt;br /&gt;
&lt;br /&gt;
This leads us to our next topic...&lt;br /&gt;
&lt;br /&gt;
== Guideline 2: Know the Standard containers and use them ==&lt;br /&gt;
&lt;br /&gt;
One of the best things about C++ is that the standard supplies some great containers. Always prefer to use them first to store data. That is,&lt;br /&gt;
&lt;br /&gt;
- prefer to use std::vector to store dynamic arrays&lt;br /&gt;
- prefer to use std::string to store strings (we also provide t_string for a translatable string -- it's based on std::basic_string, which std::string is also based on)&lt;br /&gt;
- prefer to use std::map to store key/value pairs&lt;br /&gt;
- prefer to use std::set to store sets of items (roughly equivalent to the mathematical concept of a set).&lt;br /&gt;
&lt;br /&gt;
There are other C++ containers, and you should know about all of them. A good source of documentation on the portion of the C++ standard library known as the Standard Template Library (STL) which contains the standard containers can be found [http://www.sgi.com/tech/stl/ here].&lt;br /&gt;
&lt;br /&gt;
By using the standard containers, you should almost never have to manually allocate and delete memory yourself by hand. The containers will automatically allocate and deallocate memory for you. This leads us to our next guideline...&lt;br /&gt;
&lt;br /&gt;
== Guideline 3: Use the resource acquisition is initialization (RAII) idiom ==&lt;br /&gt;
&lt;br /&gt;
In C, you might write some code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    char* mystring = (char*)malloc(n);&lt;br /&gt;
    /*some code, which manipulates mystring*/&lt;br /&gt;
    ...&lt;br /&gt;
    free(mystring);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code works, but is error prone. What if the code in the middle exited using a return statement, or a longjmp statement, or in C++, threw an exception? The memory allocated would never be cleaned up, and we would have a memory leak.&lt;br /&gt;
&lt;br /&gt;
Sure, you're a good programmer, and you probably make sure you're very careful about freeing the string. But what about when this function grows to be 100 lines long (and functions have a way of doing that), and then another programmer who isn't that familiar with the function is trying to fix a critical bug as quickly as they can, that requires adding an early return statement to this function? What about when someone is trying to read the code to scan for memory leaks? Once they see the malloc at the top, they will have to carefully read the entire function, to make sure it's all okay.&lt;br /&gt;
&lt;br /&gt;
Now if we had this C++ version instead,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    std::string mystring(n,'x');&lt;br /&gt;
    /*some code, which manipulates mystring*/&lt;br /&gt;
} //mystring is destroyed and memory automatically released&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
None of these problems can possibly happen. mystring will ''always'' be released at the end of the function.&lt;br /&gt;
&lt;br /&gt;
So, this just re-iterates how important C++ containers are, right? Well, yes, but it also shows us that we should always avoid code written like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void myfunction()&lt;br /&gt;
{&lt;br /&gt;
    ...allocate resources...&lt;br /&gt;
    ...use resources&lt;br /&gt;
    ...release resources...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have code like this, you should put the resources in a class that will manage them and release them at the end of the function. If there is no class like that, then you should write one. This goes for all resources: memory, files, threads, and so forth.&lt;br /&gt;
&lt;br /&gt;
It might sound like a silly mistake that we're protecting against here, one that an experienced programmer wouldn't make. However, almost all programming bugs are due to 'silly mistakes'. This leads us to our next item...&lt;br /&gt;
&lt;br /&gt;
== Guideline 4: Lean on the compiler as heavily as you can ==&lt;br /&gt;
&lt;br /&gt;
Humans make mistakes. Even very stupid mistakes. Computers are as dumb as toast, but they are at least very very consistent.&lt;br /&gt;
&lt;br /&gt;
For Wesnoth, we try to write code that will make the compiler guard against mistakes as much as possible. The use of RAII as described above is one example of this: writing the code so the compiler and language rules will guarantee it's correct.&lt;br /&gt;
&lt;br /&gt;
There are some more ways to do this. One big way is to make all code const correct. That is, always define something as 'const' when it shouldn't change its value. If you have a pointer that is meant to be read only, define it as a const pointer. Then if the code is later changed so that your pointer changes the value, the compiler will produce an error.&lt;br /&gt;
&lt;br /&gt;
Another way is to avoid implicit conversions between objects, and always use the C++-style casts.&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
		
	</entry>
</feed>