← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/spritemaps into lp:widelands

 

SirVer has proposed merging lp:~widelands-dev/widelands/spritemaps into lp:widelands.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1121982 in widelands: "Reduce video memory consumption by merging animation frames"
  https://bugs.launchpad.net/widelands/+bug/1121982

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/spritemaps/+merge/211225

This is the spritemap branch that contains improvements and refactorings that I need for the one_world initiative. So this merge request is a bit urgent as it blocks progress - review quickly please :).

- removes playercolor = true from conf files. An animation has playercolor when there is a _pc.png file for each frame.
- removes picture= and instead add a representative_frame() method to animations.
- Refactors animations and how they are handled in the code. Introduces two new kinds of animations (BlitsAnimation, PackedAnimation) that are 'packed', i.e. need another input format with less images and more pixel reuse. No animation has been changed as the packer scripts are still a bit buggy right now. This means the two new classes are currently unused and only one should really survive in the long run. 
- I saw some fuckups in the code - i.e. it seems to have undone some of the compatibility kills that hjd did, I tried to restore them whenever possible, not sure if I found all places.
- This branch is slow again in loading animations :(. I have some ideas how this can be fixed by loading graphics in a background thread.
- This branch might have bugs that where fixed in trunk - as mentioned merging into it did strange things. I believe this is due to criss-cross-merging in the branch in the past. Please report on sight, so we can fix them in trunk (again). 
-- 
https://code.launchpad.net/~widelands-dev/widelands/spritemaps/+merge/211225
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/spritemaps into lp:widelands.
=== modified file 'global/bobs/bar-ruin00/conf'
--- global/bobs/bar-ruin00/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/bar-ruin00/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=small
-picture=idle.png
 
 [idle]
 hotspot=34 22

=== modified file 'global/bobs/bar-ruin01/conf'
--- global/bobs/bar-ruin01/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/bar-ruin01/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=64 53

=== modified file 'global/bobs/bar-ruin02/conf'
--- global/bobs/bar-ruin02/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/bar-ruin02/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=medium
-picture=idle.png
 
 [idle]
 hotspot=43 43

=== modified file 'global/bobs/bar-ruin03/conf'
--- global/bobs/bar-ruin03/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/bar-ruin03/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=44 34

=== modified file 'global/bobs/debris00/conf'
--- global/bobs/debris00/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/debris00/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=small
-picture=idle.png
 
 [idle]
 hotspot=35 35

=== modified file 'global/bobs/debris01/conf'
--- global/bobs/debris01/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/debris01/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=small
-picture=idle.png
 
 [idle]
 hotspot=35 35

=== modified file 'global/bobs/debris02/conf'
--- global/bobs/debris02/conf	2008-11-26 14:23:04 +0000
+++ global/bobs/debris02/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=small
-picture=idle.png
 
 [idle]
 hotspot=35 35

=== modified file 'global/militarysites/barrier.barbarians/conf'
--- global/militarysites/barrier.barbarians/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/barrier.barbarians/conf	2014-03-16 21:52:17 +0000
@@ -14,5 +14,4 @@
 [idle]
 pics=../../../tribes/barbarians/barrier/barrier_i_??.png
 hotspot=45 66
-playercolor=true
 fps=10

=== modified file 'global/militarysites/castle.atlanteans/conf'
--- global/militarysites/castle.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/castle.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -14,4 +14,3 @@
 [idle]
 pics=../../../tribes/atlanteans/castle/castle_i_??.png
 hotspot=92 90
-playercolor=true

=== modified file 'global/militarysites/citadel.barbarians/conf'
--- global/militarysites/citadel.barbarians/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/citadel.barbarians/conf	2014-03-16 21:52:17 +0000
@@ -14,5 +14,4 @@
 [idle]
 pics=../../../tribes/barbarians/citadel/citadel_i_??.png
 hotspot=102 102
-playercolor=true
 fps=10

=== modified file 'global/militarysites/donjon.barbarians/conf'
--- global/militarysites/donjon.barbarians/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/donjon.barbarians/conf	2014-03-16 21:52:17 +0000
@@ -15,5 +15,4 @@
 [idle]
 pics=../../../tribes/barbarians/donjon/donjon_i_??.png
 hotspot=55 84
-playercolor=true
 fps=10

=== modified file 'global/militarysites/fortress.barbarians/conf'
--- global/militarysites/fortress.barbarians/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/fortress.barbarians/conf	2014-03-16 21:52:17 +0000
@@ -14,5 +14,4 @@
 [idle]
 pics=../../../tribes/barbarians/fortress/fortress_i_??.png
 hotspot=103 80
-playercolor=true
 fps=10

=== modified file 'global/militarysites/guardhall.atlanteans/conf'
--- global/militarysites/guardhall.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/guardhall.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -14,4 +14,3 @@
 [idle]
 pics=../../../tribes/atlanteans/guardhall/guardhall_i_??.png
 hotspot=58 65
-playercolor=true

=== modified file 'global/militarysites/guardhouse.atlanteans/conf'
--- global/militarysites/guardhouse.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/guardhouse.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -14,4 +14,3 @@
 [idle]
 pics=../../../tribes/atlanteans/guardhouse/guardhouse_i_??.png
 hotspot=35 42
-playercolor=true

=== modified file 'global/militarysites/high_tower.atlanteans/conf'
--- global/militarysites/high_tower.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/high_tower.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -15,4 +15,3 @@
 [idle]
 pics=../../../tribes/atlanteans/high_tower/high_tower_i_??.png
 hotspot=55 90
-playercolor=true

=== modified file 'global/militarysites/sentry.barbarians/conf'
--- global/militarysites/sentry.barbarians/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/sentry.barbarians/conf	2014-03-16 21:52:17 +0000
@@ -14,5 +14,4 @@
 [idle]
 pics=../../../tribes/barbarians/sentry/sentry_i_??.png
 hotspot=39 40
-playercolor=true
 fps=10

=== modified file 'global/militarysites/small_tower.atlanteans/conf'
--- global/militarysites/small_tower.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/small_tower.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -15,4 +15,3 @@
 [idle]
 pics=../../../tribes/atlanteans/small_tower/small_tower_i_??.png
 hotspot=41 63
-playercolor=true

=== modified file 'global/militarysites/tower.atlanteans/conf'
--- global/militarysites/tower.atlanteans/conf	2013-10-29 10:55:20 +0000
+++ global/militarysites/tower.atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -15,4 +15,3 @@
 [idle]
 pics=../../../tribes/atlanteans/tower/tower_i_??.png
 hotspot=55 70
-playercolor=true

=== modified file 'manual_test/richtext/test.py'
--- manual_test/richtext/test.py	2012-12-18 18:41:45 +0000
+++ manual_test/richtext/test.py	2014-03-16 21:52:17 +0000
@@ -8,8 +8,8 @@
 import unittest
 import time
 
+from PIL import Image
 from numpy.testing import assert_equal
-import Image
 import numpy as np
 
 import pyrt_render

=== modified file 'src/editor/editorinteractive.cc'
--- src/editor/editorinteractive.cc	2014-03-10 19:20:54 +0000
+++ src/editor/editorinteractive.cc	2014-03-16 21:52:17 +0000
@@ -162,7 +162,7 @@
 
 	// TODO: get rid of cleanup_for_load, it tends to be very messy
 	// Instead, delete and re-create the egbase.
-	egbase().cleanup_for_load(true, false);
+	egbase().cleanup_for_load();
 	m_history.reset();
 
 	std::unique_ptr<Widelands::Map_Loader> const ml(map.get_correct_loader(filename.c_str()));
@@ -627,7 +627,4 @@
 	eia.run();
 
 	editor.cleanup_objects();
-
-	g_gr->flush_animations();
-	g_anim.flush();
 }

=== modified file 'src/editor/ui_menus/editor_main_menu_new_map.cc'
--- src/editor/ui_menus/editor_main_menu_new_map.cc	2013-07-26 20:19:36 +0000
+++ src/editor/ui_menus/editor_main_menu_new_map.cc	2014-03-16 21:52:17 +0000
@@ -168,8 +168,7 @@
 	Widelands::Map              & map    = egbase.map();
 	UI::ProgressWindow loader;
 
-	// Clean all the stuff up, so we can load
-	egbase.cleanup_for_load(true, false);
+	egbase.cleanup_for_load();
 
 	if (strcmp(map.get_world_name(), m_worlds[m_currentworld].c_str()))
 		eia.change_world();

=== modified file 'src/editor/ui_menus/editor_main_menu_random_map.cc'
--- src/editor/ui_menus/editor_main_menu_random_map.cc	2013-07-26 20:19:36 +0000
+++ src/editor/ui_menus/editor_main_menu_random_map.cc	2014-03-16 21:52:17 +0000
@@ -461,8 +461,7 @@
 	Widelands::Map              & map    = egbase.map();
 	UI::ProgressWindow loader;
 
-	// Clean all the stuff up, so we can load
-	egbase.cleanup_for_load(true, false);
+	egbase.cleanup_for_load();
 
 	if (strcmp(map.get_world_name(), m_worlds[m_currentworld].c_str()))
 		eia.change_world();

=== modified file 'src/editor/ui_menus/editor_tool_place_bob_options_menu.cc'
--- src/editor/ui_menus/editor_tool_place_bob_options_menu.cc	2013-07-31 16:48:47 +0000
+++ src/editor/ui_menus/editor_tool_place_bob_options_menu.cc	2014-03-16 21:52:17 +0000
@@ -62,9 +62,11 @@
 
 	uint32_t width = 0, height = 0;
 	for (int32_t j = 0; j < nr_bobs; ++j) {
-		const Image* pic = g_gr->images().get(world.get_bob_descr(j)->get_picture());
-		uint16_t w = pic->width();
-		uint16_t h = pic->height();
+		const Image& pic =
+			g_gr->animations().get_animation(world.get_bob_descr(j)->main_animation())
+				.representative_image(RGBColor(0, 0, 0));
+		uint16_t w = pic.width();
+		uint16_t h = pic.height();
 		if (w > width)
 			width = w;
 		if (h > height)
@@ -90,7 +92,8 @@
 		UI::Checkbox & cb = *new UI::Checkbox
 			(box,
 			 pos,
-			 g_gr->images().get(descr.get_picture()),
+			 &g_gr->animations().get_animation(descr.main_animation())
+				.representative_image(RGBColor(0, 0, 0)),
 			 critter_descr ? critter_descr->descname() : std::string());
 
 		cb.set_desired_size(width, height);

=== modified file 'src/editor/ui_menus/editor_tool_place_immovable_options_menu.cc'
--- src/editor/ui_menus/editor_tool_place_immovable_options_menu.cc	2013-07-31 16:48:47 +0000
+++ src/editor/ui_menus/editor_tool_place_immovable_options_menu.cc	2014-03-16 21:52:17 +0000
@@ -59,9 +59,10 @@
 	uint32_t width = 0, height = 0;
 	for (int32_t j = 0; j < nr_immovables; ++j) {
 		const Immovable_Descr & descr = *world.get_immovable_descr(j);
-		const Image* pic = g_gr->images().get(descr.get_picture());
-		uint16_t w = pic->width();
-		uint16_t h = pic->height();
+		const Image& pic = g_gr->animations().get_animation(descr.main_animation())
+				.representative_image(RGBColor(0, 0, 0));
+		uint16_t w = pic.width();
+		uint16_t h = pic.height();
 		if (w > width)
 			width  = w;
 		if (h > height)
@@ -92,7 +93,8 @@
 
 		UI::Checkbox & cb = *new UI::Checkbox
 			(box, pos,
-			 g_gr->images().get(world.get_immovable_descr(i)->get_picture()));
+			 &g_gr->animations().get_animation(world.get_immovable_descr(i)->main_animation())
+				.representative_image(RGBColor(0, 0, 0)));
 
 		cb.set_desired_size(width, height);
 		cb.set_state(m_pit.is_enabled(i));

=== modified file 'src/graphic/animation.cc'
--- src/graphic/animation.cc	2014-03-04 13:24:58 +0000
+++ src/graphic/animation.cc	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002, 2006-2010 by the Widelands Development Team
+ * Copyright (C) 2002, 2006-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,130 +19,556 @@
 
 #include "graphic/animation.h"
 
+#include <cassert>
 #include <cstdio>
+#include <limits>
+
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+#include <boost/lexical_cast.hpp>
 
 #include "constants.h"
+#include "container_iterate.h"
 #include "graphic/diranimations.h"
+#include "graphic/graphic.h"
+#include "graphic/image.h"
+#include "graphic/image_cache.h"
+#include "graphic/image_transformations.h"
+#include "graphic/surface.h"
+#include "graphic/surface_cache.h"
 #include "helper.h"
 #include "i18n.h"
+#include "io/filesystem/layered_filesystem.h"
+#include "log.h"
 #include "logic/bob.h"
+#include "logic/instances.h"  // For Map_Object_Descr.
 #include "profile/profile.h"
 #include "sound/sound_handler.h"
 #include "wexception.h"
 
-/// Find out if there is a sound effect registered for the animation's frame
-/// and try to play it. This is used to have sound effects that are tightly
-/// synchronized to an animation, for example when a geologist is shown
-/// hammering on rocks.
-///
-/// \par framenumber  The framenumber currently on display.
-///
-/// \note uint32_t animation is an ID number that starts at 1, not a vector
-///       index that starts at 0 !
-///
-/// \sa RenderTarget::drawanim
-void AnimationData::trigger_soundfx
-	(uint32_t framenumber, uint32_t stereo_position) const
-{
-	std::map<uint32_t, std::string>::const_iterator const sfx_cue =
-		sfx_cues.find(framenumber);
-	if (sfx_cue != sfx_cues.end())
+
+using namespace std;
+
+
+namespace  {
+
+// Parses a point from a string like 'p=x y' into p. Throws on error.
+void parse_point(const string& def, Point* p) {
+	vector<string> split_vector;
+	boost::split(split_vector, def, boost::is_any_of(" "));
+	if (split_vector.size() != 2)
+		throw wexception("Invalid point definition: %s", def.c_str());
+
+	p->x = boost::lexical_cast<int32_t>(split_vector[0]);
+	p->y = boost::lexical_cast<int32_t>(split_vector[1]);
+}
+
+// Parses a rect from a string like 'p=x y w h' into r. Throws on error.
+void parse_rect(const string& def, Rect* r) {
+	vector<string> split_vector;
+	boost::split(split_vector, def, boost::is_any_of(" "));
+	if (split_vector.size() != 4)
+		throw wexception("Invalid rect definition: %s", def.c_str());
+
+	r->x = boost::lexical_cast<int32_t>(split_vector[0]);
+	r->y = boost::lexical_cast<int32_t>(split_vector[1]);
+	r->w = boost::lexical_cast<uint32_t>(split_vector[2]);
+	r->h = boost::lexical_cast<uint32_t>(split_vector[3]);
+}
+
+/**
+ * An Image Implementation that draws a static animation into a surface.
+ */
+class AnimationImage : public Image {
+public:
+	AnimationImage
+		(const string& ghash, const Animation* anim, const RGBColor& clr)
+		: hash_(ghash), anim_(anim), clr_(clr) {}
+	virtual ~AnimationImage() {}
+
+	// Implements Image.
+	virtual uint16_t width() const {return anim_->width();}
+	virtual uint16_t height() const {return anim_->height();}
+	virtual const string& hash() const {return hash_;}
+	virtual Surface* surface() const {
+		SurfaceCache& surface_cache = g_gr->surfaces();
+		Surface* surf = surface_cache.get(hash_);
+		if (surf)
+			return surf;
+
+		// Blit the animation on a freshly wiped surface.
+		surf = Surface::create(width(), height());
+		surf->fill_rect(Rect(0, 0, surf->width(), surf->height()), RGBAColor(255, 255, 255, 0));
+		anim_->blit(0, Point(0, 0), Rect(0, 0, width(), height()), &clr_, surf);
+		surface_cache.insert(hash_, surf, true);
+
+		return surf;
+	}
+
+private:
+	const string hash_;
+	const Animation* const anim_;   // Not owned.
+	const RGBColor clr_;
+};
+
+struct SfxCues {
+	void read(const string & directory, Section & s);
+	void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const;
+
+private:
+	/// mapping of soundeffect name to frame number, indexed by frame number .
+	map<uint32_t, string> cues_;
+};
+
+/**
+ * Read mapping from frame numbers to sound effect names and load effects
+ */
+void SfxCues::read(const string & directory, Section & s)
+{
+	while (Section::Value * const v = s.get_next_val("sfx")) {
+		char * parameters = v->get_string(), * endp;
+		string fx_name;
+		unsigned long long int const value = strtoull(parameters, &endp, 0);
+		const uint32_t frame_number = value;
+		try {
+			if (endp == parameters or frame_number != value)
+				throw wexception("expected %s but found \"%s\"", "frame number", parameters);
+			parameters = endp;
+			force_skip(parameters);
+			fx_name = string(directory) + "/" + string(parameters);
+			g_sound_handler.load_fx_if_needed(directory, parameters, fx_name);
+			map<uint32_t, string>::const_iterator const it =
+				cues_.find(frame_number);
+			if (it != cues_.end())
+				throw wexception
+					("redefinition for frame %u to \"%s\" (previously defined to "
+					 "\"%s\")",
+					 frame_number, parameters, it->second.c_str());
+		} catch (const _wexception & e) {
+			throw wexception("sfx: %s", e.what());
+		}
+		cues_[frame_number] = parameters;
+	}
+}
+
+void SfxCues::trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const
+{
+	const map<uint32_t, string>::const_iterator sfx_cue = cues_.find(framenumber);
+	if (sfx_cue != cues_.end())
 		g_sound_handler.play_fx(sfx_cue->second, stereo_position, 1);
 }
 
 
-/*
-==============================================================================
-
-AnimationManager IMPLEMENTATION
-
-==============================================================================
-*/
-
-AnimationManager g_anim;
-
-/*
-===============
-Remove all animations
-===============
-*/
-void AnimationManager::flush()
-{
-	m_animations.clear();
-}
-
-/**
- * Read in basic information about the animation.
- * The graphics are loaded later by the graphics subsystem.
- *
- * Read in sound effects associated with the animation as well as the
- * framenumber on which the effect should be played
- *
- * The animation resides in the given directory and is described by the given
- * section.
- *
- * The sound effects reside in the given directory and are described by
- * the given section.
- *
- * This function looks for image files in this order:
- *    key 'pics', if present
- *    picnametempl, if not null
- *    \<sectionname\>_??.bmp
- *
- * \param directory     which directory to look in for image and sound files
- * \param s             conffile section to search for data on this animation
- * \param picnametempl  a template for the image names
-*/
-uint32_t AnimationManager::get
-	(char       const * const directory,
-	 Section          &       s,
-	 char       const *       picnametempl)
-{
-	m_animations.push_back(AnimationData());
-	uint32_t const id = m_animations.size();
-	AnimationData & ad = m_animations[id - 1];
-	ad.frametime = FRAME_LENGTH;
-	ad.hotspot.x = 0;
-	ad.hotspot.y = 0;
-	ad.picnametempl = "";
-
-	// Determine image name template
-
-	char templbuf[256];
-	if (char const * const pics = s.get_string("pics"))
-		picnametempl = pics;
-	else if (!picnametempl) {
-		snprintf(templbuf, sizeof(templbuf), "%s.png", s.get_name());
-		picnametempl = templbuf;
-	}
-	{
-		char pictempl[256];
-		snprintf(pictempl, sizeof(pictempl), "%s%s", directory, picnametempl);
-		assert(4 <= strlen(pictempl));
-		size_t const len = strlen(pictempl) - 4;
-		if (pictempl[len] == '.')
-			pictempl[len] = '\0'; // delete extension
-		ad.picnametempl = pictempl;
-	}
-
+/**
+ * Animation in blits-format; that is, a list of blit rectangles
+ * is maintained for every frame.
+ */
+class BlitsAnimation : public Animation {
+public:
+	BlitsAnimation(const string & directory, Section & s);
+	virtual ~BlitsAnimation() {}
+
+	// Implements Animation.
+	virtual uint16_t width() const {return width_;}
+	virtual uint16_t height() const {return height_;}
+	virtual uint16_t nr_frames() const {return frames_.size();}
+	virtual uint32_t frametime() const {return frametime_;}
+	virtual const Point& hotspot() const {return hotspot_;};
+	virtual const Image& representative_image(const RGBColor& clr) const;
+	void blit(uint32_t time, const Point&, const Rect& srcrc, const RGBColor* clr, Surface*) const;
+	virtual void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const;
+
+private:
+	struct Blit {
+		uint16_t srcx, srcy;
+		uint16_t w, h;
+		int16_t dstx, dsty;
+	};
+
+	// loaded from game data
+	string hash_;
+	vector<vector<Blit> > frames_;
+	uint32_t frametime_;
+	SfxCues sfx_cues_;
+	const Image * spritemap_;
+	const Image * spritemap_pc_;
+
+	// derived data
+	uint16_t width_, height_;
+	Point hotspot_;
+};
+
+BlitsAnimation::BlitsAnimation(const string & directory, Section & s) :
+	frametime_(FRAME_LENGTH)
+{
+	hash_ = directory + s.get_name();
+
+	sfx_cues_.read(directory, s);
+
+	const int32_t fps = s.get_int("fps");
+	if (fps < 0)
+		throw wexception("fps is %i, must be non-negative", fps);
+	if (fps > 0)
+		frametime_ = 1000 / fps;
+
+	// Load the graphis
+	string spritemap = directory + s.get_safe_string("spritemap");
+	spritemap_ = g_gr->images().get(spritemap + ".png");
+	if (g_fs->FileExists(spritemap + "_pc.png")) {
+		spritemap_pc_ = g_gr->images().get(spritemap + "_pc.png");
+	} else {
+		spritemap_pc_ = 0;
+	}
+
+	// Parse frames
+	const int32_t nrframes = s.get_int("nrframes");
+	if (nrframes <= 0)
+		throw wexception("nrframes must be at least 1");
+
+	int16_t minx = numeric_limits<int16_t>::max();
+	int16_t miny = numeric_limits<int16_t>::max();
+	int16_t maxx = numeric_limits<int16_t>::min();
+	int16_t maxy = numeric_limits<int16_t>::min();
+
+	for (int32_t framenr = 0; framenr < nrframes; ++framenr) {
+		vector<Blit> blits;
+		string framedata = s.get_safe_string(boost::lexical_cast<string>(framenr));
+		vector<string> blitsdata;
+		boost::split(blitsdata, framedata, boost::is_any_of(";"));
+
+		BOOST_FOREACH(const string & it, blitsdata) {
+			vector<string> coords;
+			boost::split(coords, it, boost::is_any_of(",@"));
+			if (coords.size() != 6)
+				throw wexception("blit code '%s' is malformed", it.c_str());
+
+			Blit blt;
+			blt.srcx = boost::lexical_cast<int16_t>(coords[0]);
+			blt.srcy = boost::lexical_cast<int16_t>(coords[1]);
+			blt.w = boost::lexical_cast<int16_t>(coords[2]);
+			blt.h = boost::lexical_cast<int16_t>(coords[3]);
+			blt.dstx = boost::lexical_cast<int16_t>(coords[4]);
+			blt.dsty = boost::lexical_cast<int16_t>(coords[5]);
+			blits.push_back(blt);
+
+			minx = min(blt.dstx, minx);
+			miny = min(blt.dsty, miny);
+			maxx = max<int>(blt.dstx + blt.w, maxx);
+			maxy = max<int>(blt.dsty + blt.h, maxy);
+		}
+
+		frames_.push_back(blits);
+	}
+
+	width_ = maxx - minx;
+	height_ = maxy - miny;
+	hotspot_ = Point(-minx, -miny);
+}
+
+void BlitsAnimation::trigger_soundfx(uint32_t time, uint32_t stereo_position) const
+{
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+	sfx_cues_.trigger_soundfx(framenumber, stereo_position);
+}
+
+const Image & BlitsAnimation::representative_image(const RGBColor& clr) const {
+	const string hash =
+		(boost::format("%s:%02x%02x%02x:animation_pic") % hash_ % static_cast<int>(clr.r) %
+		 static_cast<int>(clr.g) % static_cast<int>(clr.b))
+			.str();
+
+	ImageCache& image_cache = g_gr->images();
+	if (image_cache.has(hash))
+		return *image_cache.get(hash);
+
+	return *image_cache.insert(new AnimationImage(hash, this, clr));
+}
+
+void BlitsAnimation::blit
+	(uint32_t time, const Point & dst, const Rect & srcrc, const RGBColor * clr, Surface * target) const
+{
+	assert(target);
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+
+	const Image* use_image = spritemap_;
+	if (clr && spritemap_pc_) {
+		use_image = ImageTransformations::player_colored(*clr, spritemap_, spritemap_pc_);
+	}
+
+	BOOST_FOREACH(const Blit & blt, frames_[framenumber]) {
+		Rect framerect(blt.dstx + hotspot_.x, blt.dsty + hotspot_.y, blt.w, blt.h);
+		Rect bsrc(blt.srcx, blt.srcy, blt.w, blt.h);
+		Point bdst(dst.x + hotspot_.x + blt.dstx - srcrc.x, dst.y + hotspot_.y + blt.dsty - srcrc.y);
+
+		if (srcrc.x > framerect.x) {
+			if (srcrc.x >= framerect.x + int(framerect.w))
+				continue;
+			int16_t delta = srcrc.x - framerect.x;
+			framerect.x += delta;
+			framerect.w -= delta;
+			bsrc.x += delta;
+			bsrc.w -= delta;
+			bdst.x += delta;
+		}
+		if (srcrc.x + int(srcrc.w) <= framerect.x)
+			continue;
+		if (srcrc.x + int(srcrc.w) < framerect.x + int(framerect.w)) {
+			bsrc.w = srcrc.x + srcrc.w - framerect.x;
+		}
+
+		if (srcrc.y > framerect.y) {
+			if (srcrc.y >= framerect.y + int(framerect.h))
+				continue;
+			int16_t delta = srcrc.y - framerect.y;
+			framerect.y += delta;
+			framerect.h -= delta;
+			bsrc.y += delta;
+			bsrc.h -= delta;
+			bdst.y += delta;
+		}
+		if (srcrc.y + int(srcrc.h) <= framerect.y)
+			continue;
+		if (srcrc.y + int(srcrc.h) < framerect.y + int(framerect.h)) {
+			bsrc.h = srcrc.y + srcrc.h - framerect.y;
+		}
+
+		target->blit(bdst, use_image->surface(), bsrc);
+	}
+}
+
+
+/**
+ * Implements the Animation interface for a packed animation, that is an animation
+ * that is contained in a singular image (plus one for player color).
+ */
+class PackedAnimation : public Animation {
+public:
+	virtual ~PackedAnimation() {}
+	PackedAnimation(const string& directory, Section & s);
+
+	// Implements Animation.
+	virtual uint16_t width() const {return width_;}
+	virtual uint16_t height() const {return height_;}
+	virtual uint16_t nr_frames() const {return nr_frames_;}
+	virtual uint32_t frametime() const {return frametime_;}
+	virtual const Point& hotspot() const {return hotspot_;};
+	virtual const Image& representative_image(const RGBColor& clr) const;
+	void blit(uint32_t time, const Point&, const Rect& srcrc, const RGBColor* clr, Surface*) const;
+	virtual void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const;
+
+private:
+	struct Region {
+		Point target_offset;
+		uint16_t w, h;
+		vector<Point> source_offsets;  // indexed by frame nr.
+	};
+
+	uint16_t width_, height_;
+	uint16_t nr_frames_;
+	uint32_t frametime_;
+	Point hotspot_;
+	Point base_offset_;
+
+	const Image* image_;  // Not owned
+	const Image* pcmask_;  // Not owned
+	vector<Region> regions_;
+	string hash_;
+
+	SfxCues sfx_cues;
+};
+
+PackedAnimation::PackedAnimation(const string& directory, Section& s)
+		: width_(0), height_(0), nr_frames_(0), frametime_(FRAME_LENGTH), image_(NULL), pcmask_(NULL) {
+	hash_ = directory + s.get_name();
+
+	sfx_cues.read(directory, s);
+
+	const int32_t fps = s.get_int("fps");
+	if (fps < 0)
+		throw wexception("fps is %i, must be non-negative", fps);
+	if (fps > 0)
+		frametime_ = 1000 / fps;
+
+	hotspot_ = s.get_Point("hotspot");
+
+	// Load the graphis
+	string pic_fn = directory + s.get_safe_string("pics");
+	image_ = g_gr->images().get(pic_fn);
+	boost::replace_all(pic_fn, ".png", "");
+	if (g_fs->FileExists(pic_fn + "_pc.png")) {
+		pcmask_ = g_gr->images().get(pic_fn + "_pc.png");
+	}
+
+	// Parse dimensions.
+	Point p;
+	parse_point(s.get_string("dimensions"), &p);
+	width_ = p.x;
+	height_ = p.y;
+
+	// Parse base_offset.
+	parse_point(s.get_string("base_offset"), &base_offset_);
+
+	// Parse regions
+	NumberGlob glob("region_??");
+	string region_name;
+	while (glob.next(&region_name)) {
+		string value = s.get_string(region_name.c_str(), "");
+		if (value.empty())
+			break;
+
+		boost::trim(value);
+		vector<string> split_vector;
+		boost::split(split_vector, value, boost::is_any_of(":"));
+		if (split_vector.size() != 2)
+			throw wexception("%s: line is ill formatted. Should be <rect>:<offsets>", region_name.c_str());
+
+		vector<string> offset_strings;
+		boost::split(offset_strings, split_vector[1], boost::is_any_of(";"));
+		if (nr_frames_ && nr_frames_ != offset_strings.size())
+			throw wexception
+				("%s: region has different number of frames than previous (%i != %" PRIuS ").",
+				 region_name.c_str(), nr_frames_, offset_strings.size());
+		nr_frames_ = offset_strings.size();
+
+		Rect region_rect;
+		parse_rect(split_vector[0], &region_rect);
+
+		Region r;
+		r.target_offset.x = region_rect.x;
+		r.target_offset.y = region_rect.y;
+		r.w = region_rect.w;
+		r.h = region_rect.h;
+
+		BOOST_FOREACH(const string& offset_string, offset_strings) {
+			parse_point(offset_string, &p);
+			r.source_offsets.push_back(p);
+		}
+		regions_.push_back(r);
+	}
+
+	if (regions_.empty())  // No regions? Only one frame then.
+		nr_frames_ = 1;
+}
+
+void PackedAnimation::trigger_soundfx(uint32_t time, uint32_t stereo_position) const
+{
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+	sfx_cues.trigger_soundfx(framenumber, stereo_position);
+}
+
+const Image& PackedAnimation::representative_image(const RGBColor& clr) const {
+	const string hash =
+		(boost::format("%s:%02x%02x%02x:animation_pic") % hash_ % static_cast<int>(clr.r) %
+		 static_cast<int>(clr.g) % static_cast<int>(clr.b))
+			.str();
+
+	ImageCache& image_cache = g_gr->images();
+	if (image_cache.has(hash))
+		return *image_cache.get(hash);
+
+	return *image_cache.insert(new AnimationImage(hash, this, clr));
+}
+
+void PackedAnimation::blit
+	(uint32_t time, const Point& dst, const Rect& srcrc, const RGBColor* clr, Surface* target) const
+{
+	assert(target);
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+
+	const Image* use_image = image_;
+	if (clr && pcmask_) {
+		use_image = ImageTransformations::player_colored(*clr, image_, pcmask_);
+	}
+
+	target->blit
+		(dst, use_image->surface(), Rect(base_offset_.x + srcrc.x, base_offset_.y + srcrc.y, srcrc.w, srcrc.h));
+
+	BOOST_FOREACH(const Region& r, regions_) {
+		Rect rsrc = Rect(r.source_offsets[framenumber], r.w, r.h);
+		Point rdst = dst + r.target_offset - srcrc;
+
+		if (srcrc.x > r.target_offset.x) {
+			rdst.x += srcrc.x - r.target_offset.x;
+			rsrc.x += srcrc.x - r.target_offset.x;
+			rsrc.w -= srcrc.x - r.target_offset.x;
+			if (rsrc.w > r.w)
+				continue;
+		}
+		if (srcrc.y > r.target_offset.y) {
+			rdst.y += srcrc.y - r.target_offset.y;
+			rsrc.y += srcrc.y - r.target_offset.y;
+			rsrc.h -= srcrc.y - r.target_offset.y;
+			if (rsrc.h > r.h)
+				continue;
+		}
+		if (r.target_offset.x + rsrc.w > srcrc.x + srcrc.w) {
+			rsrc.w = srcrc.x + srcrc.w - r.target_offset.x;
+		}
+		if (r.target_offset.y + rsrc.h > srcrc.y + srcrc.h) {
+			rsrc.h = srcrc.y + srcrc.h - r.target_offset.y;
+		}
+
+		target->blit(rdst, use_image->surface(), rsrc);
+	}
+}
+
+/**
+ * Implements the Animation interface for an animation that is unpacked on disk, that
+ * is every frame and every pc color frame is an singular file on disk.
+ */
+class NonPackedAnimation : public Animation {
+public:
+	virtual ~NonPackedAnimation() {}
+	NonPackedAnimation(const string& directory, Section & s);
+
+	// Implements Animation.
+	virtual uint16_t width() const {return frames_[0]->width();}
+	virtual uint16_t height() const {return frames_[0]->height();}
+	virtual uint16_t nr_frames() const {return frames_.size();}
+	virtual uint32_t frametime() const {return frametime_;}
+	virtual const Point& hotspot() const {return hotspot_;};
+	virtual const Image& representative_image(const RGBColor& clr) const {return get_frame(0, &clr);}
+	void blit(uint32_t time, const Point&, const Rect& srcrc, const RGBColor* clr, Surface*) const;
+	virtual void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const;
+
+private:
+	// Returns the given frame image with the given clr (if not NULL).
+	const Image& get_frame(uint32_t time, const RGBColor* playercolor = NULL) const;
+
+	uint32_t frametime_;
+	Point hotspot_;
+	bool hasplrclrs_;
+
+	vector<const Image*> frames_;
+	vector<const Image*> pcmasks_;
+
+	/// mapping of soundeffect name to frame number, indexed by frame number .
+	map<uint32_t, string> sfx_cues;
+};
+
+NonPackedAnimation::NonPackedAnimation(const string& directory, Section& s)
+		: frametime_(FRAME_LENGTH),
+		  hasplrclrs_(false) {
 	// Read mapping from frame numbers to sound effect names and load effects
 	while (Section::Value * const v = s.get_next_val("sfx")) {
 		char * parameters = v->get_string(), * endp;
-		std::string fx_name;
+		string fx_name;
 		unsigned long long int const value = strtoull(parameters, &endp, 0);
-		uint32_t const frame_number = value;
+		const uint32_t frame_number = value;
 		try {
 			if (endp == parameters or frame_number != value)
-				throw wexception
-					("expected %s but found \"%s\"",
-					 "frame number", parameters);
+				throw wexception("expected %s but found \"%s\"", "frame number", parameters);
 			parameters = endp;
 			force_skip(parameters);
-			fx_name = std::string(directory) + "/" + std::string(parameters);
+
+			fx_name = string(directory) + "/" + string(parameters);
 			g_sound_handler.load_fx_if_needed(directory, parameters, fx_name);
-			std::map<uint32_t, std::string>::const_iterator const it =
-				ad.sfx_cues.find(frame_number);
-			if (it != ad.sfx_cues.end())
+			map<uint32_t, string>::const_iterator const it =
+				sfx_cues.find(frame_number);
+			if (it != sfx_cues.end())
 				throw wexception
 					("redefinition for frame %u to \"%s\" (previously defined to "
 					 "\"%s\")",
@@ -150,47 +576,101 @@
 		} catch (const _wexception & e) {
 			throw wexception("sfx: %s", e.what());
 		}
-		ad.sfx_cues[frame_number] = fx_name;
+		sfx_cues[frame_number] = fx_name;
 	}
 
-	ad.hasplrclrs = s.get_bool("playercolor", false);
-
 	int32_t const fps = s.get_int("fps");
 	if (fps < 0)
 		throw wexception("fps is %i, must be non-negative", fps);
 	if (fps > 0)
-		ad.frametime = 1000 / fps;
-
-	// TODO: Frames of varying size / hotspot?
-	ad.hotspot = s.get_Point("hotspot");
-
-	return id;
-}
-
-
-/*
-===============
-Return the number of animations.
-===============
-*/
-uint32_t AnimationManager::get_nranimations() const
-{
-	return m_animations.size();
-}
-
-
-/*
-===============
-Return AnimationData for this animation or throws if this id is unknown.
-===============
-*/
-const AnimationData& AnimationManager::get_animation(uint32_t id) const
-{
-	if (!id || id > m_animations.size())
-		throw wexception("Requested unknown animation with id: %i", id);
-
-	return m_animations[id - 1];
-}
+		frametime_ = 1000 / fps;
+
+	hotspot_ = s.get_Point("hotspot");
+
+	//  In the filename template, the last sequence of '?' characters (if any)
+	//  is replaced with a number, for example the template "idle_??" is
+	//  replaced with "idle_00". Then the code looks if there is a PNG with that
+	//  name, increments the number and continues . on until it can not find any
+	//  file. Then it is assumed that there are no more frames in the animation.
+	string picnametempl;
+	if (char const * const pics = s.get_string("pics")) {
+		picnametempl = directory + pics;
+	} else {
+		picnametempl = directory + s.get_name();
+	}
+	// Strip the .png extension if it has one.
+	boost::replace_all(picnametempl, ".png", "");
+
+	NumberGlob glob(picnametempl);
+	string filename_wo_ext;
+	while (glob.next(&filename_wo_ext)) {
+		const string filename = filename_wo_ext + ".png";
+		if (!g_fs->FileExists(filename))
+			break;
+
+		const Image* image = g_gr->images().get(filename);
+		if
+			(frames_.size() &&
+			 (frames_[0]->width() != image->width() or frames_[0]->height() != image->height()))
+					throw wexception
+						("wrong size: (%u, %u), should be (%u, %u) like the first frame",
+						 image->width(), image->height(), frames_[0]->width(), frames_[0]->height());
+		frames_.push_back(image);
+
+		//TODO Do not load playercolor mask as opengl texture or use it as
+		//     opengl texture.
+		const string pc_filename = filename_wo_ext + "_pc.png";
+		if (g_fs->FileExists(pc_filename)) {
+			hasplrclrs_ = true;
+			const Image* pc_image = g_gr->images().get(pc_filename);
+			if (frames_[0]->width() != pc_image->width() or frames_[0]->height() != pc_image->height())
+				throw wexception
+					("playercolor mask has wrong size: (%u, %u), should "
+					 "be (%u, %u) like the animation frame",
+					 pc_image->width(), pc_image->height(), frames_[0]->width(), frames_[0]->height());
+			pcmasks_.push_back(pc_image);
+		}
+	}
+
+	if (frames_.empty())
+		throw wexception("animation %s has no frames", picnametempl.c_str());
+
+	if (pcmasks_.size() and pcmasks_.size() != frames_.size())
+		throw wexception
+			("animation has %" PRIuS " frames but playercolor mask has %" PRIuS " frames",
+			 frames_.size(), pcmasks_.size());
+}
+
+void NonPackedAnimation::trigger_soundfx
+	(uint32_t time, uint32_t stereo_position) const {
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+	const map<uint32_t, string>::const_iterator sfx_cue = sfx_cues.find(framenumber);
+	if (sfx_cue != sfx_cues.end())
+		g_sound_handler.play_fx(sfx_cue->second, stereo_position, 1);
+}
+
+void NonPackedAnimation::blit
+	(uint32_t time, const Point& dst, const Rect& srcrc, const RGBColor* clr, Surface* target) const
+{
+	assert(target);
+
+	const Image& frame = get_frame(time, clr);
+	target->blit(dst, frame.surface(), srcrc);
+}
+
+const Image& NonPackedAnimation::get_frame(uint32_t time, const RGBColor* playercolor) const {
+	const uint32_t framenumber = time / frametime_ % nr_frames();
+	assert(framenumber < nr_frames());
+	const Image* original = frames_[framenumber];
+
+	if (!hasplrclrs_ || !playercolor)
+		return *original;
+
+	assert(frames_.size() == pcmasks_.size());
+	return *ImageTransformations::player_colored(*playercolor, original, pcmasks_[framenumber]);
+}
+
+}  // namespace
 
 
 /*
@@ -202,12 +682,12 @@
 */
 
 DirAnimations::DirAnimations
-	(uint32_t const dir1,
-	 uint32_t const dir2,
-	 uint32_t const dir3,
-	 uint32_t const dir4,
-	 uint32_t const dir5,
-	 uint32_t const dir6)
+	(uint32_t dir1,
+	 uint32_t dir2,
+	 uint32_t dir3,
+	 uint32_t dir4,
+	 uint32_t dir5,
+	 uint32_t dir6)
 {
 	m_animations[0] = dir1;
 	m_animations[1] = dir2;
@@ -218,77 +698,102 @@
 }
 
 
-/*
-===============
-Parse an animation from the given directory and config.
-sectnametempl is of the form "foowalk_??", where ?? will be replaced with
-nw, ne, e, se, sw and w to get the section names for the animations.
-
-If defaults is not zero, the additional sections are not actually necessary.
-If they don't exist, the data is taken from defaults and the bitmaps
-foowalk_??_nn.bmp are used.
-===============
-*/
+/**
+ * Load direction animations of the given name.
+ *
+ * If a section of the given name exists, it is expected to contain a 'dirpics'
+ * key and assorted information of the old direction animation format.
+ *
+ * Otherwise, sections with the names 'name_??', with ?? replaced
+ * by nw, ne, e, se, sw, and w are expected to exist and describe
+ * the corresponding animations.
+ *
+ * @param optional No error if animations do not exist
+ */
 void DirAnimations::parse
-	(Widelands::Map_Object_Descr &       b,
-	 const std::string           &       directory,
-	 Profile                     &       prof,
-	 char                  const * const sectnametempl,
-	 Section                     * const defaults)
+	(Widelands::Map_Object_Descr & b,
+	 const string & directory,
+	 Profile & prof,
+	 const string & name,
+	 bool optional,
+	 const string & default_dirpics)
 {
-	char dirpictempl[256];
-	char sectnamebase[256];
-	char * repl;
-
-	if (strchr(sectnametempl, '%'))
-		throw wexception("sectnametempl %s contains %%", sectnametempl);
-
-	snprintf(sectnamebase, sizeof(sectnamebase), "%s", sectnametempl);
-	repl = strstr(sectnamebase, "??");
-	if (!repl)
-		throw wexception
-			("DirAnimations section name template %s does not contain %%s",
-			 sectnametempl);
-
-	strncpy(repl, "%s", 2);
-
-	if
-		(char const * const string =
-		 defaults ? defaults->get_string("dirpics", nullptr) : nullptr)
-	{
-		snprintf(dirpictempl, sizeof(dirpictempl), "%s", string);
+	if (Section * section = prof.get_section(name)) {
+		// NOTE: deprecate this format eventually
+		char dirpictempl[256];
+		char * repl;
+
+		snprintf
+			(dirpictempl, sizeof(dirpictempl), "%s",
+			 section->get_string("dirpics", default_dirpics.c_str()));
 		repl = strstr(dirpictempl, "!!");
 		if (!repl)
 			throw wexception
 				("DirAnimations dirpics name templates %s does not contain !!",
 				 dirpictempl);
-
 		strncpy(repl, "%s", 2);
-	} else {
-		snprintf(dirpictempl, sizeof(dirpictempl), "%s_??.png", sectnamebase);
-	}
-
-	for (int32_t dir = 0; dir < 6; ++dir) {
-		static char const * const dirstrings[6] =
-			{"ne", "e", "se", "sw", "w", "nw"};
-		char sectname[300];
-
-		snprintf(sectname, sizeof(sectname), sectnamebase, dirstrings[dir]);
-
-		std::string const anim_name = sectname;
-
-		Section * s = prof.get_section(sectname);
-		if (!s) {
-			if (!defaults)
-				throw wexception
-					("Section [%s] missing and no default supplied",
-					 sectname);
-
-			s = defaults;
-		}
-
-		snprintf(sectname, sizeof(sectname), dirpictempl, dirstrings[dir]);
-		m_animations[dir] = g_anim.get(directory, *s, sectname);
-		b.add_animation(anim_name.c_str(), m_animations[dir]);
-	}
+
+		for (int32_t dir = 0; dir < 6; ++dir) {
+			static char const * const dirstrings[6] =
+				{"ne", "e", "se", "sw", "w", "nw"};
+
+			// Fake the section name here, so that the animation loading code is
+			// using the correct glob pattern to load the images from.
+			char pictempl[256];
+			snprintf(pictempl, sizeof(pictempl), dirpictempl, dirstrings[dir]);
+			section->set_name(pictempl);
+			m_animations[dir] = g_gr->animations().load(directory, *section);
+
+			char animname[256];
+			snprintf(animname, sizeof(animname), "%s_%s", name.c_str(), dirstrings[dir]);
+			b.add_animation(animname, m_animations[dir]);
+		}
+	} else {
+		for (int32_t dir = 0; dir < 6; ++dir) {
+			static char const * const dirstrings[6] =
+				{"ne", "e", "se", "sw", "w", "nw"};
+
+			char animname[256];
+			snprintf(animname, sizeof(animname), "%s_%s", name.c_str(), dirstrings[dir]);
+			Section * dirsection = prof.get_section(animname);
+			if (dirsection) {
+				m_animations[dir] = g_gr->animations().load(directory, *dirsection);
+				b.add_animation(animname, m_animations[dir]);
+			} else {
+				if (!optional)
+					throw wexception("DirAnimations: did not find section %s", animname);
+			}
+		}
+	}
+}
+
+
+/*
+==============================================================================
+
+AnimationManager IMPLEMENTATION
+
+==============================================================================
+*/
+
+uint32_t AnimationManager::load(const string& directory, Section & s) {
+	string format = s.get_string("format", "");
+	if (format == "blits") {
+		m_animations.push_back(new BlitsAnimation(directory, s));
+	} else if (s.get_bool("packed", false)) {
+		m_animations.push_back(new PackedAnimation(directory, s));
+	} else {
+		m_animations.push_back(new NonPackedAnimation(directory, s));
+	}
+	const uint32_t id = m_animations.size();
+
+	return id;
+}
+
+const Animation& AnimationManager::get_animation(uint32_t id) const
+{
+	if (!id || id > m_animations.size())
+		throw wexception("Requested unknown animation with id: %i", id);
+
+	return *m_animations[id - 1];
 }

=== modified file 'src/graphic/animation.h'
--- src/graphic/animation.h	2014-02-22 18:04:02 +0000
+++ src/graphic/animation.h	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002, 2006-2010 by the Widelands Development Team
+ * Copyright (C) 2002, 2006-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,59 +25,85 @@
 #include <string>
 #include <vector>
 
+#include <boost/utility.hpp>
+
 #include "point.h"
-
-namespace Widelands {struct Map_Object_Descr;}
-
-struct Profile;
+#include "rect.h"
+
+class Image;
+class Surface;
+struct RGBColor;
 struct Section;
 
-struct AnimationData {
-	uint32_t frametime;
-	Point hotspot;
-	bool hasplrclrs;
-	std::string picnametempl;
-
-	void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const;
-
-	/** mapping of soundeffect name to frame number, indexed by frame number
-	 * \sa AnimationManager::trigger_sfx */
-	std::map<uint32_t, std::string> sfx_cues;
+/**
+ * Representation of an Animation in the game. An animation is a looping set of
+ * image frames and their corresponding sound effects. This class makes no
+ * guarantees on how the graphics are represented in memory - but knows how to
+ * render itself at a given time to the given place.
+ *
+ * The dimensions of an animation is constant and can not change from frame to
+ * frame.
+ */
+class Animation : boost::noncopyable {
+public:
+	Animation() {}
+	virtual ~Animation() {}
+
+	/// The dimensions of this animation.
+	virtual uint16_t width() const = 0;
+	virtual uint16_t height() const = 0;
+
+	/// The number of animation frames of this animation.
+	virtual uint16_t nr_frames() const = 0;
+
+	/// The number of milliseconds each frame will be displayed.
+	virtual uint32_t frametime() const = 0;
+
+	/// The hotspot of this animation. Note that this is ignored when blitting,
+	/// so the caller has to adjust for the hotspot himself.
+	virtual const Point& hotspot() const = 0;
+
+	/// An image frame that shows a singular animation frame. This can be used in
+	/// the UI (e.g. buildingwindow to represent this image.
+	virtual const Image& representative_image(const RGBColor& clr) const = 0;
+
+	/// Blit the animation frame that should be displayed at the given time index
+	/// so that the given point is at the top left of the frame. Srcrc defines
+	/// the part of the animation that should be blitted. The 'clr' is the player
+	/// color used for blitting - the parameter can be NULL in which case the
+	/// neutral image will be blitted. The Surface is the target for the blit
+	/// operation and must be non-null.
+	virtual void blit(uint32_t time, const Point&, const Rect& srcrc, const RGBColor* clr, Surface*) const = 0;
+
+	/// Play the sound effect associated with this animation at the given time.
+	virtual void trigger_soundfx(uint32_t time, uint32_t stereo_position) const = 0;
 };
 
 /**
 * The animation manager manages a list of all active animations.
-* They are flushed after a game is finished and loaded at gfxload time by the
-* Game code.
-* get() only works properly before gfxload. This means that all animations must
-* be loaded before the game starts.
-*
-* Note that animation IDs are counted from 1, while the m_animations array is
-* counted from 0.
 */
-struct AnimationManager {
-	void flush();
-	uint32_t get
-		(const std::string & directory,
-		 Section           & s,
-		 char       const * picnametempl = nullptr)
-	{
-		return get(directory.c_str(), s, picnametempl);
-	}
-	uint32_t get
-		(char       const * directory,
-		 Section          &,
-		 char       const * picnametempl = nullptr);
+class AnimationManager {
+public:
+	/**
+	 * Loads an animation, graphics sound and everything.
+	 *
+	 * The animation resides in the given directory and is described by the
+	 * given section.
+	 *
+	 * This function looks for image files as defined by the 'pics' key. If this
+	 * is not present, it will try \<sectionname\>_??.png
+	 *
+	 * \param directory     which directory to look in for image and sound files
+	 * \param s             conffile section to search for data on this animation
+	*/
+	uint32_t load(const std::string & directory, Section& s);
 
-	// for use by the graphics subsystem
-	uint32_t get_nranimations() const;
-	const AnimationData& get_animation(uint32_t id) const;
+	/// Returns the animation with the given ID or throws an exception if it is
+	/// unknown.
+	const Animation& get_animation(uint32_t id) const;
 
 private:
-	std::vector<AnimationData> m_animations;
+	std::vector<Animation*> m_animations;
 };
 
-
-extern AnimationManager g_anim;
-
 #endif

=== removed file 'src/graphic/animation_gfx.cc'
--- src/graphic/animation_gfx.cc	2013-07-26 20:19:36 +0000
+++ src/graphic/animation_gfx.cc	1970-01-01 00:00:00 +0000
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2002-2004, 2006, 2009-2011 by the Widelands Development Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#include "graphic/animation_gfx.h"
-
-#include <cassert>
-
-#include <SDL.h>
-
-#include "graphic/animation.h"
-#include "graphic/image.h"
-#include "graphic/image_cache.h"
-#include "graphic/image_transformations.h"
-#include "io/filesystem/layered_filesystem.h"
-#include "log.h"
-#include "wexception.h"
-
-static const uint32_t nextensions = 2;
-static const char extensions[nextensions][5] = {".png", ".jpg"};
-AnimationGfx::AnimationGfx(const AnimationData& data, ImageCache* image_cache)
-	: m_hotspot(data.hotspot), m_hasplrclrs(data.hasplrclrs) {
-	//  In the filename template, the last sequence of '?' characters (if any)
-	//  is replaced with a number, for example the template "idle_??" is
-	//  replaced with "idle_00". Then the code looks if there is a file with
-	//  that name + any extension in the list above. Assuming that it finds a
-	//  file, it increments the number so that the filename is "idle_01" and
-	//  looks for a file with that name + extension, and so on until it can not
-	//  find any file. Then it is assumed that there are no more frames in the
-	//  animation.
-
-	//  Allocate a buffer for the filename. It must be large enough to hold the
-	//  image name template, the "_pc" (3 characters) part for playercolor
-	//  masks, the extension (4 characters including the dot) and the null
-	//  terminator. Copy the image name template into the buffer.
-	char filename[256];
-	std::string::size_type const picnametempl_size = data.picnametempl.size();
-	if (sizeof(filename) < picnametempl_size + 3 + 4 + 1)
-		throw wexception
-			("buffer too small (%lu) for image name template of size %lu\n",
-			 static_cast<long unsigned>(sizeof(filename)), static_cast<long unsigned>(picnametempl_size));
-	strcpy(filename, data.picnametempl.c_str());
-
-	//  Find out where in the image name template the number is. Search
-	//  backwards from the end.
-	char * const after_basename = filename + picnametempl_size;
-	char * last_digit = after_basename;
-	while (filename <= last_digit and *last_digit != '?')
-		--last_digit;
-	char * before_first_digit = last_digit;
-	while (filename <= before_first_digit and *before_first_digit == '?') {
-		*before_first_digit = '0';
-		--before_first_digit;
-	}
-	unsigned int width = 0, height = 0;
-
-	for (;;) {
-		// Load the base image
-		for (size_t extnr = 0;;) {
-			strcpy(after_basename, extensions[extnr]);
-			if (g_fs->FileExists(filename)) { //  Is the frame actually there?
-				try {
-					const Image* image = image_cache->get(filename);
-					if (width == 0) { //  This is the first frame.
-						width  = image->width();
-						height = image->height();
-					} else if (width != image->width() or height != image->height())
-						throw wexception
-							("wrong size: (%u, %u), should be (%u, %u) like the "
-							 "first frame",
-							 image->width(), image->height(), width, height);
-					//  Get a new AnimFrame.
-					m_frames.push_back(image);
-				} catch (const std::exception & e) {
-					throw wexception
-						("could not load animation frame %s: %s\n",
-						 filename, e.what());
-				}
-				//  Successfully loaded the frame.
-				break;  //  No need to look for files with other extensions.
-			} else if (++extnr == nextensions) //  Tried all extensions.
-				goto end;  //  This frame does not exist. No more frames in anim.
-		}
-
-		if (m_hasplrclrs) {
-			//TODO Do not load playercolor mask as opengl texture or use it as
-			//     opengl texture.
-			strcpy(after_basename, "_pc");
-			for (size_t extnr = 0;;) {
-				strcpy(after_basename + 3, extensions[extnr]);
-				if (g_fs->FileExists(filename)) {
-					try {
-						const Image* image = image_cache->get(filename);
-						if (width != image->width() or height != image->height())
-							throw wexception
-								("playercolor mask has wrong size: (%u, %u), should "
-								 "be (%u, %u) like the animation frame",
-								 image->width(), image->height(), width, height);
-						m_pcmasks.push_back(image);
-						break;
-					} catch (const std::exception & e) {
-						throw wexception
-							("error while reading \"%s\": %s", filename, e.what());
-					}
-				} else if (++extnr == nextensions) {
-					after_basename[3] = '\0'; //  cut off the extension
-					throw wexception("\"%s\" is missing", filename);
-				}
-			}
-		}
-
-		//  Increment the number in the filename.
-		for (char * digit_to_increment = last_digit;;) {
-			if (digit_to_increment == before_first_digit)
-				goto end; //  The number wrapped around to all zeros.
-			assert('0' <= *digit_to_increment);
-			assert(*digit_to_increment <= '9');
-			if (*digit_to_increment == '9') {
-				*digit_to_increment = '0';
-				--digit_to_increment;
-			} else {
-				++*digit_to_increment;
-				break;
-			}
-		}
-	}
-end:
-	if (m_frames.empty())
-		throw wexception
-			("animation %s has no frames", data.picnametempl.c_str());
-
-	if (m_pcmasks.size() and m_pcmasks.size() < m_frames.size())
-		throw wexception
-			("animation has %" PRIuS " frames but playercolor mask has only %" PRIuS " frames",
-			 m_frames.size(), m_pcmasks.size());
-}
-
-const Image& AnimationGfx::get_frame(size_t i, const RGBColor& playercolor) {
-	assert(i < nr_frames());
-
-	const Image& original = get_frame(i);
-	if (!m_hasplrclrs)
-		return original;
-
-	assert(m_frames.size() == m_pcmasks.size());
-
-	return *ImageTransformations::player_colored(playercolor, &original, m_pcmasks[i]);
-}
-
-const Image& AnimationGfx::get_frame(size_t i) const {
-	assert(i < nr_frames());
-	return *m_frames[i];
-}
-
-

=== removed file 'src/graphic/animation_gfx.h'
--- src/graphic/animation_gfx.h	2013-09-23 18:47:02 +0000
+++ src/graphic/animation_gfx.h	1970-01-01 00:00:00 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2002-2004, 2006-2010 by the Widelands Development Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#ifndef ANIMATION_GFX_H
-#define ANIMATION_GFX_H
-
-#include <cstddef>
-#include <vector>
-
-#include "point.h"
-
-class Image;
-class ImageCache;
-struct AnimationData;
-struct RGBColor;
-
-struct AnimationGfx { /// The graphics belonging to an animation.
-	AnimationGfx(const AnimationData& data, ImageCache*);
-
-	size_t nr_frames() const {return m_frames.size();}
-	const Point& hotspot() const {return m_hotspot;}
-	const Image& get_frame(size_t i, const RGBColor& playercolor);
-	const Image& get_frame(size_t i) const;
-
-private:
-	std::vector<const Image*> m_frames;
-	std::vector<const Image*> m_pcmasks;
-	Point m_hotspot;
-	bool m_hasplrclrs;
-};
-
-#endif

=== modified file 'src/graphic/diranimations.h'
--- src/graphic/diranimations.h	2014-02-22 18:04:02 +0000
+++ src/graphic/diranimations.h	2014-03-16 21:52:17 +0000
@@ -41,8 +41,9 @@
 		(Widelands::Map_Object_Descr &,
 		 const std::string           & directory,
 		 Profile                     &,
-		 char                  const * sectnametempl,
-		 Section                     * defaults    = nullptr);
+		 const std::string & name,
+		 bool optional = false,
+		 const std::string & default_dirpics = std::string());
 
 	uint32_t get_animation(Widelands::Direction const dir) const {
 		return m_animations[dir - 1];

=== modified file 'src/graphic/graphic.cc'
--- src/graphic/graphic.cc	2014-02-22 18:04:02 +0000
+++ src/graphic/graphic.cc	2014-03-16 21:52:17 +0000
@@ -31,7 +31,6 @@
 #include "constants.h"
 #include "container_iterate.h"
 #include "graphic/animation.h"
-#include "graphic/animation_gfx.h"
 #include "graphic/diranimations.h"
 #include "graphic/font_handler.h"
 #include "graphic/image.h"
@@ -53,7 +52,6 @@
 #include "upcast.h"
 #include "wexception.h"
 
-
 using namespace std;
 
 Graphic * g_gr;
@@ -69,7 +67,8 @@
 	m_update_fullscreen(true),
 	image_loader_(new ImageLoaderImpl()),
 	surface_cache_(create_surface_cache(TRANSIENT_SURFACE_CACHE_SIZE)),
-	image_cache_(create_image_cache(image_loader_.get(), surface_cache_.get()))
+	image_cache_(create_image_cache(image_loader_.get(), surface_cache_.get())),
+	animation_manager_(new AnimationManager())
 {
 	ImageTransformations::initialize();
 
@@ -326,7 +325,6 @@
 
 void Graphic::cleanup() {
 	flush_maptextures();
-	flush_animations();
 	surface_cache_->flush();
 	// TODO: this should really not be needed, but currently is :(
 	if (UI::g_fh)
@@ -447,13 +445,6 @@
 }
 
 
-/// flushes the animations in m_animations
-void Graphic::flush_animations() {
-	container_iterate_const(vector<AnimationGfx *>, m_animations, i)
-		delete *i.current;
-	m_animations.clear();
-}
-
 /**
  * Saves a pixel region to a png. This can be a file or part of a stream.
  *
@@ -549,8 +540,8 @@
  *
  * fnametempl is a filename with possible wildcard characters '?'. The function
  * fills the wildcards with decimal numbers to get the different frames of a
- * texture animation. For example, if fnametempl is "foo_??.bmp", it tries
- * "foo_00.bmp", "foo_01.bmp" etc...
+ * texture animation. For example, if fnametempl is "foo_??.png", it tries
+ * "foo_00.png", "foo_01.png" etc...
  * frametime is in milliseconds.
  * \return 0 if the texture couldn't be loaded.
  * \note Terrain textures are not reused, even if fnametempl matches.
@@ -589,54 +580,6 @@
 }
 
 /**
- * Load all animations that are registered with the AnimationManager
-*/
-void Graphic::load_animations() {
-	assert(m_animations.empty());
-
-	m_animations.reserve(g_anim.get_nranimations());
-}
-
-void Graphic::ensure_animation_loaded(uint32_t anim) {
-	if (anim >= m_animations.size()) {
-		m_animations.resize(anim + 1);
-	}
-	if (!m_animations.at(anim - 1))
-	{
-	  m_animations.at(anim - 1) =
-		  new AnimationGfx(g_anim.get_animation(anim), image_cache_.get());
-	}
-}
-
-/**
- * Return the number of frames in this animation
- */
-size_t Graphic::nr_frames(uint32_t anim)
-{
-	return get_animation(anim)->nr_frames();
-}
-
-/**
- * writes the size of an animation frame to w and h
-*/
-void Graphic::get_animation_size
-	(uint32_t anim, uint32_t time, uint32_t & w, uint32_t & h)
-{
-	const AnimationData& data = g_anim.get_animation(anim);
-	const AnimationGfx* gfx  =        get_animation(anim);
-
-	if (!gfx) {
-		log("WARNING: Animation %u does not exist\n", anim);
-		w = h = 0;
-	} else {
-		const Image& frame =
-			gfx->get_frame((time / data.frametime) % gfx->nr_frames());
-		w = frame.width();
-		h = frame.height();
-	}
-}
-
-/**
  * Save a screenshot to the given file.
 */
 void Graphic::screenshot(const string& fname) const
@@ -671,21 +614,6 @@
 }
 
 /**
- * Retrieve the animation with the given number.
- *
- * @param anim the number of the animation
- * @return the AnimationGfs object of the given number
- */
-AnimationGfx * Graphic::get_animation(uint32_t anim)
-{
-	if (!anim)
-		return nullptr;
-
-	ensure_animation_loaded(anim);
-	return m_animations[anim - 1];
-}
-
-/**
  * Retrieve the map texture with the given number
  * \return the actual texture data associated with the given ID.
  */

=== modified file 'src/graphic/graphic.h'
--- src/graphic/graphic.h	2013-10-29 07:51:14 +0000
+++ src/graphic/graphic.h	2014-03-16 21:52:17 +0000
@@ -32,15 +32,11 @@
 
 #define MAX_RECTS 20
 
-namespace UI {struct ProgressWindow;}
-
-struct AnimationGfx;
+class AnimationManager;
 class ImageLoaderImpl;
 class RenderTarget;
-class Screen;
 class Surface;
 class SurfaceCache;
-struct Road_Textures;
 struct SDL_Surface;
 class StreamWrite;
 struct Texture;
@@ -81,8 +77,8 @@
 /**
  * This class is a kind of Swiss Army knife for your graphics need. It
  * initializes the graphic system and provides access to resolutions. It has an
- * Image and a Surface cache and holds the data of all animations and the road
- * textures. It also offers functionality to save a screenshot.
+ * Animation, Image and Surface cache and owns the road textures. It also
+ * offers functionality to save a screenshot.
  */
 class Graphic {
 public:
@@ -107,10 +103,9 @@
 	bool need_update() const;
 	void refresh(bool force = true);
 
+	SurfaceCache& surfaces() const {return *surface_cache_.get();}
 	ImageCache& images() const {return *image_cache_.get();}
-	SurfaceCache& surfaces() const {return *surface_cache_.get();}
-
-	void flush_animations();
+	AnimationManager& animations() const {return *animation_manager_.get();}
 
 	void save_png(const Image*, StreamWrite*) const;
 
@@ -119,15 +114,8 @@
 	void animate_maptextures(uint32_t time);
 	void reset_texture_animation_reminder();
 
-	void load_animations();
-	void ensure_animation_loaded(uint32_t anim);
-	size_t nr_frames(uint32_t anim = 0);
-	uint32_t get_animation_frametime(uint32_t anim) const;
-	void get_animation_size (uint32_t anim, uint32_t time, uint32_t & w, uint32_t & h);
-
 	void screenshot(const std::string& fname) const;
 	Texture * get_maptexture_data(uint32_t id);
-	AnimationGfx * get_animation(uint32_t);
 
 	void set_world(std::string);
 	Surface& get_road_texture(int32_t roadtex);
@@ -176,13 +164,14 @@
 	/// Non-volatile cache of hardware independent images. The use the
 	/// surface_cache_ to cache their pixel data.
 	std::unique_ptr<ImageCache> image_cache_;
+	/// This holds all animations.
+	std::unique_ptr<AnimationManager> animation_manager_;
 
 	// The texture needed to draw roads.
 	std::unique_ptr<Surface> pic_road_normal_;
 	std::unique_ptr<Surface> pic_road_busy_;
 
 	std::vector<Texture *> m_maptextures;
-	std::vector<AnimationGfx *> m_animations;
 };
 
 extern Graphic * g_gr;

=== modified file 'src/graphic/render/gamerenderer.cc'
--- src/graphic/render/gamerenderer.cc	2014-02-22 18:04:02 +0000
+++ src/graphic/render/gamerenderer.cc	2014-03-16 21:52:17 +0000
@@ -133,16 +133,16 @@
 
 			if (isborder[F]) {
 				const Player & owner = m_egbase->player(owner_number[F]);
-				uint32_t const anim = owner.frontier_anim();
+				uint32_t const anim_idx = owner.frontier_anim();
 				if (vision[F])
-					m_dst->drawanim(pos[F], anim, 0, &owner);
+					m_dst->drawanim(pos[F], anim_idx, 0, &owner);
 				for (uint32_t d = 1; d < 4; ++d) {
 					if
 						((vision[F] || vision[d]) &&
 						 isborder[d] &&
 						 (owner_number[d] == owner_number[F] || !owner_number[d]))
 					{
-						m_dst->drawanim(middle(pos[F], pos[d]), anim, 0, &owner);
+						m_dst->drawanim(middle(pos[F], pos[d]), anim_idx, 0, &owner);
 					}
 				}
 			}
@@ -167,32 +167,34 @@
 					{
 						const Player::Constructionsite_Information & csinf = f_pl.constructionsite;
 						// draw the partly finished constructionsite
-						uint32_t anim;
+						uint32_t anim_idx;
 						try {
-							anim = csinf.becomes->get_animation("build");
+							anim_idx = csinf.becomes->get_animation("build");
 						} catch (Map_Object_Descr::Animation_Nonexistent &) {
 							try {
-								anim = csinf.becomes->get_animation("unoccupied");
+								anim_idx = csinf.becomes->get_animation("unoccupied");
 							} catch (Map_Object_Descr::Animation_Nonexistent) {
-								anim = csinf.becomes->get_animation("idle");
+								anim_idx = csinf.becomes->get_animation("idle");
 							}
 						}
-						const size_t nr_frames = g_gr->nr_frames(anim);
+						const Animation& anim = g_gr->animations().get_animation(anim_idx);
+						const size_t nr_frames = anim.nr_frames();
 						uint32_t cur_frame =
 							csinf.totaltime ? csinf.completedtime * nr_frames / csinf.totaltime : 0;
 						uint32_t tanim = cur_frame * FRAME_LENGTH;
-						uint32_t w, h;
-						g_gr->get_animation_size(anim, tanim, w, h);
+
+						const uint16_t w = anim.width();
+						const uint16_t h = anim.height();
 						uint32_t lines = h * csinf.completedtime * nr_frames;
 						if (csinf.totaltime)
 							lines /= csinf.totaltime;
 						assert(h * cur_frame <= lines);
-						lines -= h * cur_frame; //  This won't work if pictures have various sizes.
+						lines -= h * cur_frame;
 
 						if (cur_frame) // not the first frame
 							// draw the prev frame from top to where next image will be drawing
 							m_dst->drawanimrect
-								(pos[F], anim, tanim - FRAME_LENGTH, owner, Rect(Point(0, 0), w, h - lines));
+								(pos[F], anim_idx, tanim - FRAME_LENGTH, owner, Rect(Point(0, 0), w, h - lines));
 						else if (csinf.was) {
 							// Is the first frame, but there was another building here before,
 							// get its last build picture and draw it instead.
@@ -206,7 +208,7 @@
 								(pos[F], a, tanim - FRAME_LENGTH, owner, Rect(Point(0, 0), w, h - lines));
 						}
 						assert(lines <= h);
-						m_dst->drawanimrect(pos[F], anim, tanim, owner, Rect(Point(0, h - lines), w, lines));
+						m_dst->drawanimrect(pos[F], anim_idx, tanim, owner, Rect(Point(0, h - lines), w, lines));
 					} else if (upcast(const Building_Descr, building, map_object_descr)) {
 						// this is a building therefore we either draw unoccupied or idle animation
 						uint32_t pic;

=== modified file 'src/graphic/rendertarget.cc'
--- src/graphic/rendertarget.cc	2013-09-23 18:47:02 +0000
+++ src/graphic/rendertarget.cc	2014-03-16 21:52:17 +0000
@@ -20,7 +20,6 @@
 #include "graphic/rendertarget.h"
 
 #include "graphic/animation.h"
-#include "graphic/animation_gfx.h"
 #include "graphic/graphic.h"
 #include "graphic/image_transformations.h"
 #include "graphic/surface.h"
@@ -28,7 +27,6 @@
 #include "logic/player.h"
 #include "logic/tribe.h"
 #include "upcast.h"
-#include "vertex.h"
 #include "wui/mapviewpixelconstants.h"
 #include "wui/overlay_manager.h"
 
@@ -52,7 +50,7 @@
 /**
  * Sets an arbitrary drawing window.
  */
-void RenderTarget::set_window(const Rect & rc, const Point & ofs)
+void RenderTarget::set_window(const Rect& rc, const Point& ofs)
 {
 	m_rect = rc;
 	m_offset = ofs;
@@ -90,7 +88,7 @@
  * is not changed at all. Otherwise, the function returns true.
  */
 bool RenderTarget::enter_window
-	(const Rect & rc, Rect* previous, Point* prevofs)
+	(const Rect& rc, Rect* previous, Point* prevofs)
 {
 	Rect newrect = rc;
 
@@ -128,7 +126,7 @@
  * This functions draws a line in the target
  */
 void RenderTarget::draw_line
-	(int32_t const x1, int32_t const y1, int32_t const x2, int32_t const y2,
+	(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
 	 const RGBColor& color, uint8_t gwidth)
 {
 	m_surface->draw_line
@@ -140,20 +138,23 @@
 /**
  * Clip against window and pass those primitives along to the bitmap.
  */
-void RenderTarget::draw_rect(Rect r, const RGBColor& clr)
+void RenderTarget::draw_rect(const Rect& rect, const RGBColor& clr)
 {
+	Rect r(rect);
 	if (clip(r))
 		m_surface->draw_rect(r, clr);
 }
 
-void RenderTarget::fill_rect(Rect r, const RGBAColor& clr)
+void RenderTarget::fill_rect(const Rect& rect, const RGBAColor& clr)
 {
+	Rect r(rect);
 	if (clip(r))
 		m_surface->fill_rect(r, clr);
 }
 
-void RenderTarget::brighten_rect(Rect r, const int32_t factor)
+void RenderTarget::brighten_rect(const Rect& rect, int32_t factor)
 {
+	Rect r(rect);
 	if (clip(r))
 		m_surface->brighten_rect(r, factor);
 }
@@ -170,19 +171,27 @@
 	Point dstpoint(dst);
 
 	UI::correct_for_align(align, image->width(), image->height(), &dstpoint);
-	doblit(dstpoint, image, Rect(Point(0, 0), image->width(), image->height()), cm);
+
+	Rect srcrc(Point(0, 0), image->width(), image->height());
+
+	if (to_surface_geometry(&dstpoint, &srcrc))
+		m_surface->blit(dstpoint, image->surface(), srcrc, cm);
 }
 
 /**
  * Like \ref blit, but use only a sub-rectangle of the source image.
  */
 void RenderTarget::blitrect
-	(Point const dst, const Image* image, Rect const srcrc, Composite cm)
+	(const Point& dst, const Image* image, const Rect& gsrcrc, Composite cm)
 {
-	assert(0 <= srcrc.x);
-	assert(0 <= srcrc.y);
-
-	doblit(dst, image, srcrc, cm);
+	assert(0 <= gsrcrc.x);
+	assert(0 <= gsrcrc.y);
+
+	Rect srcrc(gsrcrc);
+	Point dstpt(dst);
+
+	if (to_surface_geometry(&dstpt, &srcrc))
+		m_surface->blit(dstpt, image->surface(), srcrc, cm);
 }
 
 /**
@@ -191,11 +200,13 @@
  * The pixel from ofs inside image is placed at the top-left corner of
  * the filled rectangle.
  */
-void RenderTarget::tile(Rect r, const Image* image, Point ofs, Composite cm)
+void RenderTarget::tile(const Rect& rect, const Image* image, const Point& gofs, Composite cm)
 {
 	int32_t srcw = image->width();
 	int32_t srch = image->height();
 
+	Rect r(rect);
+	Point ofs(gofs);
 	if (clip(r)) {
 		if (m_offset.x < 0)
 			ofs.x -= m_offset.x;
@@ -264,86 +275,37 @@
  * What if the game runs very slowly or very quickly?
  */
 void RenderTarget::drawanim
-	(Point                dst,
-	 uint32_t       const animation,
-	 uint32_t       const time,
-	 Player const * const player)
+	(const Point& dst, uint32_t animation, uint32_t time, const Player* player)
 {
-	const AnimationData& data = g_anim.get_animation(animation);
-	AnimationGfx        * const gfx  = g_gr-> get_animation(animation);
-	if (!gfx) {
-		log("WARNING: Animation %u does not exist\n", animation);
-		return;
-	}
-
-	// Get the frame and its data
-	uint32_t const framenumber = time / data.frametime % gfx->nr_frames();
-	const Image& frame =
-		player ? gfx->get_frame(framenumber, player->get_playercolor()) : gfx->get_frame(framenumber);
-
-	dst -= gfx->hotspot();
-
-	Rect srcrc(Point(0, 0), frame.width(), frame.height());
-
-	doblit(dst, &frame, srcrc);
+	const Animation& anim = g_gr->animations().get_animation(animation);
+
+	Point dstpt = dst - anim.hotspot();
+
+	Rect srcrc(Point(0, 0), anim.width(), anim.height());
+
+	if (to_surface_geometry(&dstpt, &srcrc))
+		anim.blit(time, dstpt, srcrc, player ? &player->get_playercolor() : NULL, m_surface);
 
 	//  Look if there is a sound effect registered for this frame and trigger
 	//  the effect (see Sound_Handler::stereo_position).
-	data.trigger_soundfx(framenumber, 128);
-}
-
-void RenderTarget::drawstatic
-	(Point                dst,
-	 uint32_t       const animation,
-	 Player const * const player)
-{
-	AnimationGfx        * const gfx  = g_gr-> get_animation(animation);
-	if (!gfx) {
-		log("WARNING: Animation %u does not exist\n", animation);
-		return;
-	}
-
-	// Get the frame and its data
-	const Image& frame = player ? gfx->get_frame(0, player->get_playercolor()) : gfx->get_frame(0);
-	const Image* dark_frame = ImageTransformations::change_luminosity(&frame, 1.22, true);
-
-	dst -= Point(frame.width() / 2, frame.height() / 2);
-	Rect srcrc(Point(0, 0), frame.width(), frame.height());
-	doblit(Rect(dst, 0, 0), dark_frame, srcrc);
+	anim.trigger_soundfx(time, 128);
 }
 
 /**
  * Draws a part of a frame of an animation at the given location
  */
 void RenderTarget::drawanimrect
-	(Point                dst,
-	 uint32_t       const animation,
-	 uint32_t       const time,
-	 Player const * const player,
-	 Rect                 srcrc)
+	(const Point& dst, uint32_t animation, uint32_t time, const Player* player, const Rect& gsrcrc)
 {
-	const AnimationData& data = g_anim.get_animation(animation);
-	AnimationGfx        * const gfx  = g_gr-> get_animation(animation);
-	if (!gfx) {
-		log("WARNING: Animation %u does not exist\n", animation);
-		return;
-	}
-
-	// Get the frame and its data
-	uint32_t const framenumber = time / data.frametime % gfx->nr_frames();
-	const Image& frame =
-		player ?
-		gfx->get_frame
-			(framenumber, player->get_playercolor())
-		:
-		gfx->get_frame
-			(framenumber);
-
-	dst -= g_gr->get_animation(animation)->hotspot();
-
-	dst += srcrc;
-
-	doblit(dst, &frame, srcrc);
+	const Animation& anim = g_gr->animations().get_animation(animation);
+
+	Point dstpt = dst - anim.hotspot();
+	dstpt += gsrcrc;
+
+	Rect srcrc(gsrcrc);
+
+	if (to_surface_geometry(&dstpt, &srcrc))
+		anim.blit(time, dstpt, srcrc, player ? &player->get_playercolor() : NULL, m_surface);
 }
 
 /**
@@ -403,54 +365,44 @@
 }
 
 /**
- * Clip against window and source bitmap, then call the Bitmap blit routine.
+ * Clip against window and source bitmap, returns false if blitting is
+ * unnecessary because image is not inside the target surface.
  */
-void RenderTarget::doblit
-	(Point dst, const Image* src, Rect srcrc, Composite cm)
+bool RenderTarget::to_surface_geometry(Point* dst, Rect* srcrc) const
 {
-	assert(0 <= srcrc.x);
-	assert(0 <= srcrc.y);
-	dst += m_offset;
+	assert(0 <= srcrc->x);
+	assert(0 <= srcrc->y);
+	*dst += m_offset;
 
 	// Clipping
-	if (dst.x < 0) {
-		if (srcrc.w <= static_cast<uint32_t>(-dst.x))
-			return;
-		srcrc.x -= dst.x;
-		srcrc.w += dst.x;
-		dst.x = 0;
-	}
-
-	if (dst.x + srcrc.w > m_rect.w) {
-		if (static_cast<int32_t>(m_rect.w) <= dst.x)
-			return;
-		srcrc.w = m_rect.w - dst.x;
-	}
-
-	if (dst.y < 0) {
-		if (srcrc.h <= static_cast<uint32_t>(-dst.y))
-			return;
-		srcrc.y -= dst.y;
-		srcrc.h += dst.y;
-		dst.y = 0;
-	}
-
-	if (dst.y + srcrc.h > m_rect.h) {
-		if (static_cast<int32_t>(m_rect.h) <= dst.y)
-			return;
-		srcrc.h = m_rect.h - dst.y;
-	}
-
-	// Also ensure srcrc is not bigger than src
-	// so opengl blits correctly
-	if (src->width() < srcrc.x + srcrc.w) {
-		srcrc.w = src->width() - srcrc.x;
-	}
-	if (src->height() < srcrc.y + srcrc.h) {
-		srcrc.h = src->height() - srcrc.y;
-	}
-
-	dst += m_rect;
-
-	m_surface->blit(dst, src->surface(), srcrc, cm);
+	if (dst->x < 0) {
+		if (srcrc->w <= static_cast<uint32_t>(-dst->x))
+			return false;
+		srcrc->x -= dst->x;
+		srcrc->w += dst->x;
+		dst->x = 0;
+	}
+
+	if (dst->x + srcrc->w > m_rect.w) {
+		if (static_cast<int32_t>(m_rect.w) <= dst->x)
+			return false;
+		srcrc->w = m_rect.w - dst->x;
+	}
+
+	if (dst->y < 0) {
+		if (srcrc->h <= static_cast<uint32_t>(-dst->y))
+			return false;
+		srcrc->y -= dst->y;
+		srcrc->h += dst->y;
+		dst->y = 0;
+	}
+
+	if (dst->y + srcrc->h > m_rect.h) {
+		if (static_cast<int32_t>(m_rect.h) <= dst->y)
+			return false;
+		srcrc->h = m_rect.h - dst->y;
+	}
+
+	*dst += m_rect;
+	return true;
 }

=== modified file 'src/graphic/rendertarget.h'
--- src/graphic/rendertarget.h	2014-02-22 18:04:02 +0000
+++ src/graphic/rendertarget.h	2014-03-16 21:52:17 +0000
@@ -52,50 +52,35 @@
 class RenderTarget {
 public:
 	RenderTarget(Surface*);
-	void set_window(const Rect & rc, const Point & ofs);
-	bool enter_window(const Rect & rc, Rect * previous, Point * prevofs);
+	void set_window(const Rect& rc, const Point& ofs);
+	bool enter_window(const Rect& rc, Rect* previous, Point* prevofs);
 
 	int32_t width() const;
 	int32_t height() const;
 
 	void draw_line
 		(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const RGBColor& color, uint8_t width = 1);
-	void draw_rect(Rect, const RGBColor&);
-	void fill_rect(Rect, const RGBAColor&);
-	void brighten_rect(Rect, int32_t factor);
+	void draw_rect(const Rect&, const RGBColor&);
+	void fill_rect(const Rect&, const RGBAColor&);
+	void brighten_rect(const Rect&, int32_t factor);
 
 	void blit(const Point& dst, const Image* image, Composite cm = CM_Normal, UI::Align = UI::Align_TopLeft);
-	void blitrect(Point dst, const Image* image, Rect src, Composite cm = CM_Normal);
-	void tile(Rect, const Image* image, Point ofs, Composite cm = CM_Normal);
-
-	void drawanim
-		(Point                     dst,
-		 uint32_t                  animation,
-		 uint32_t                  time,
-		 Widelands::Player const * = nullptr);
-
-	void drawstatic
-			(Point                     dst,
-			 uint32_t                  animation,
-			 Widelands::Player const * = nullptr);
-
+	void blitrect(const Point& dst, const Image* image, const Rect& src, Composite cm = CM_Normal);
+	void tile(const Rect&, const Image* image, const Point& ofs, Composite cm = CM_Normal);
+
+	void drawanim(const Point& dst, uint32_t animation, uint32_t time, const Widelands::Player* = 0);
 	void drawanimrect
-		(Point                     dst,
-		 uint32_t                  animation,
-		 uint32_t                  time,
-		 Widelands::Player const *,
-		 Rect                      srcrc);
+		(const Point& dst, uint32_t animation, uint32_t time, const Widelands::Player*, const Rect& srcrc);
 
 	void reset();
 
-	Surface* get_surface() {return m_surface;}
-	const Rect & get_rect() const {return m_rect;}
-	const Point & get_offset() const {return m_offset;}
+	Surface* get_surface() const {return m_surface;}
+	const Rect& get_rect() const {return m_rect;}
+	const Point& get_offset() const {return m_offset;}
 
 protected:
 	bool clip(Rect & r) const;
-
-	void doblit(Point dst, const Image* src, Rect srcrc, Composite cm = CM_Normal);
+	bool to_surface_geometry(Point* dst, Rect* srcrc) const;
 
 	///The target surface
 	Surface* m_surface;

=== modified file 'src/helper.cc'
--- src/helper.cc	2013-09-18 03:52:40 +0000
+++ src/helper.cc	2014-03-16 21:52:17 +0000
@@ -23,6 +23,9 @@
 #include <memory>
 #include <string>
 
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/format.hpp>
+#include <boost/lexical_cast.hpp>
 #include <boost/random.hpp>
 
 using namespace std;
@@ -31,13 +34,13 @@
 /// \note This ignores empty elements, so do not use this for example to split
 /// a string with newline characters into lines, because it would ignore empty
 /// lines.
-std::vector<std::string> split_string
-	(const std::string & s, char const * const separators)
+vector<string> split_string
+	(const string & s, char const * const separators)
 {
-	std::vector<std::string> result;
+	vector<string> result;
 	for
-		(std::string::size_type pos = 0, endpos;
-		 (pos = s.find_first_not_of(separators, pos)) != std::string::npos;
+		(string::size_type pos = 0, endpos;
+		 (pos = s.find_first_not_of(separators, pos)) != string::npos;
 		 pos = endpos)
 	{
 		endpos = s.find_first_of(separators, pos);
@@ -49,7 +52,7 @@
 /**
  * remove spaces at the beginning or the end of a string
  */
-void remove_spaces(std::string & s) {
+void remove_spaces(string & s) {
 	while (s[0] == ' ' or s[0] == '\t' or s[0] == '\n') s.erase(0, 1);
 
 	while (*s.rbegin() == ' '  or *s.rbegin() == '\t' or *s.rbegin() == '\n')
@@ -78,6 +81,34 @@
 		((k.sym >= SDLK_KP0)     && (k.sym <= SDLK_KP_EQUALS));
 }
 
+/**
+ * Implemantation for NumberGlob.
+ */
+NumberGlob::NumberGlob(const string& pictmp) : templ_(pictmp), cur_(0) {
+	int nchars = count(pictmp.begin(), pictmp.end(), '?');
+	fmtstr_ = "%0" + boost::lexical_cast<string>(nchars) + "i";
+
+	max_ = 1;
+	for (int i = 0; i < nchars; ++i) {
+		max_ *= 10;
+		replstr_ += "?";
+	}
+	max_ -= 1;
+}
+
+bool NumberGlob::next(string* s) {
+	if (cur_ > max_)
+		return false;
+
+	if (max_) {
+		*s = boost::replace_last_copy(templ_, replstr_, (boost::format(fmtstr_) % cur_).str());
+	} else {
+		*s = templ_;
+	}
+	++cur_;
+	return true;
+}
+
 static boost::mt19937 random_generator;
 string random_string(const string& chars, int nlen) {
 	boost::uniform_int<> index_dist(0, chars.size() - 1);

=== modified file 'src/helper.h'
--- src/helper.h	2014-03-11 20:05:28 +0000
+++ src/helper.h	2014-03-16 21:52:17 +0000
@@ -27,6 +27,7 @@
 #include <vector>
 
 #include <SDL_keyboard.h>
+#include <boost/utility.hpp>
 
 #include "wexception.h"
 
@@ -142,6 +143,23 @@
 
 bool is_printable(SDL_keysym k);
 
+/// A class that makes iteration over filename_?.png templates easy.
+class NumberGlob : boost::noncopyable {
+public:
+	typedef uint32_t type;
+	NumberGlob(const std::string& pictmp);
+
+	/// If there is a next filename, puts it in 's' and returns true.
+	bool next(std::string* s);
+
+private:
+	std::string templ_;
+	std::string fmtstr_;
+	std::string replstr_;
+	uint32_t cur_;
+	uint32_t max_;
+};
+
 /// Generate a random string of given size out of the given alphabet.
 std::string random_string(const std::string& chars, int nlen);
 

=== modified file 'src/logic/bob.cc'
--- src/logic/bob.cc	2014-03-04 13:24:58 +0000
+++ src/logic/bob.cc	2014-03-16 21:52:17 +0000
@@ -24,6 +24,7 @@
 #include "backtrace.h"
 #include "economy/route.h"
 #include "economy/transfer.h"
+#include "graphic/graphic.h"
 #include "graphic/rendertarget.h"
 #include "logic/checkstep.h"
 #include "logic/critter_bob.h"
@@ -42,6 +43,7 @@
 #include "wexception.h"
 #include "wui/mapviewpixelconstants.h"
 
+
 namespace Widelands {
 
 /**
@@ -70,14 +72,12 @@
 	 Tribe_Descr const * const tribe)
 	:
 	Map_Object_Descr(_name, _descname),
-	m_picture       (directory + global_s.get_string("picture", "menu.png")),
 	m_owner_tribe(tribe)
 {
 	{ //  global options
 		Section & idle_s = prof.get_safe_section("idle");
 
-		add_animation
-			("idle", g_anim.get (directory, idle_s, "idle.png"));
+		add_animation("idle", g_gr->animations().load(directory, idle_s));
 	}
 
 	// Parse attributes

=== modified file 'src/logic/bob.h'
--- src/logic/bob.h	2014-02-22 18:04:02 +0000
+++ src/logic/bob.h	2014-03-16 21:52:17 +0000
@@ -28,6 +28,8 @@
 #include "port.h"
 #include "logic/walkingdir.h"
 
+struct Profile;
+
 namespace Widelands {
 class Map;
 struct Route;
@@ -200,8 +202,6 @@
 		Bob & create(Editor_Game_Base &, Player * owner, const Coords &) const;
 		bool is_world_bob() const {return not m_owner_tribe;}
 
-		char const * get_picture() const {return m_picture.c_str();}
-
 		Tribe_Descr const * get_owner_tribe() const {
 			return m_owner_tribe;
 		}
@@ -212,7 +212,6 @@
 	protected:
 		virtual Bob & create_object() const = 0;
 
-		std::string         m_picture;
 		const Tribe_Descr * const m_owner_tribe; //  0 if world bob
 	};
 

=== modified file 'src/logic/building.cc'
--- src/logic/building.cc	2014-03-04 13:24:58 +0000
+++ src/logic/building.cc	2014-03-16 21:52:17 +0000
@@ -142,7 +142,7 @@
 			if (build_s->get_int("fps", -1) != -1)
 				throw wexception("fps defined for build animation!");
 			if (!is_animation_known("build"))
-				add_animation("build", g_anim.get(directory.c_str(), *build_s, nullptr));
+				add_animation("build", g_gr->animations().load(directory, *build_s));
 		}
 
 		// Get costs
@@ -168,13 +168,13 @@
 	{ //  parse basic animation data
 		Section & idle_s = prof.get_safe_section("idle");
 		if (!is_animation_known("idle"))
-			add_animation("idle", g_anim.get(directory.c_str(), idle_s, nullptr));
+			add_animation("idle", g_gr->animations().load(directory, idle_s));
 		if (Section * unoccupied = prof.get_section("unoccupied"))
 			if (!is_animation_known("unoccupied"))
-				add_animation("unoccupied", g_anim.get(directory.c_str(), *unoccupied, nullptr));
+				add_animation("unoccupied", g_gr->animations().load(directory, *unoccupied));
 		if (Section * empty = prof.get_section("empty"))
 			if (!is_animation_known("empty"))
-				add_animation("empty", g_anim.get(directory.c_str(), *empty, nullptr));
+				add_animation("empty", g_gr->animations().load(directory, *empty));
 	}
 
 	m_vision_range = global_s.get_int("vision_range");
@@ -919,23 +919,22 @@
 	 uint32_t throttle_time,
 	 uint32_t throttle_radius)
 {
-	const std::string & picnametempl =
-		g_anim.get_animation(descr().get_ui_anim()).picnametempl;
+	const std::string& img = g_gr->animations().get_animation
+		(descr().get_ui_anim()).representative_image(owner().get_playercolor()).hash();
 	std::string rt_description;
 	rt_description.reserve
-		(strlen("<rt image=") + picnametempl.size() + 1 +
+		(strlen("<rt image=") + img.size() + 1 +
 		 strlen("<p font-size=14 font-face=DejaVuSerif></p>") +
 		 description.size() +
 		 strlen("</rt>"));
 	rt_description  = "<rt image=";
-	rt_description += picnametempl;
+	rt_description += img;
 	{
 		std::string::iterator it = rt_description.end() - 1;
 		for (; it != rt_description.begin() and *it != '?'; --it) {}
 		for (;                                  *it == '?'; --it)
 			*it = '0';
 	}
-	rt_description += ".png";
 	rt_description += "><p font-size=14 font-face=DejaVuSerif>";
 	rt_description += description;
 	rt_description += "</p></rt>";

=== modified file 'src/logic/constructionsite.cc'
--- src/logic/constructionsite.cc	2014-03-09 18:29:48 +0000
+++ src/logic/constructionsite.cc	2014-03-16 21:52:17 +0000
@@ -52,8 +52,7 @@
 		Section & sec = prof.get_safe_section("idle_with_worker");
 		if (!is_animation_known("idle_with_worker"))
 			add_animation
-				("idle_with_worker",
-				 g_anim.get(directory.c_str(), sec, nullptr));
+				("idle_with_worker", g_gr->animations().load(directory, sec));
 	}
 }
 
@@ -363,24 +362,25 @@
 		m_info.completedtime += CONSTRUCTIONSITE_STEP_TIME + gametime - m_work_steptime;
 	}
 
-	uint32_t anim;
+	uint32_t anim_idx;
 	uint32_t cur_frame;
 	try {
-		anim = building().get_animation("build");
-	} catch (Map_Object_Descr::Animation_Nonexistent &) {
+		anim_idx = building().get_animation("build");
+	} catch (Map_Object_Descr::Animation_Nonexistent & e) {
 		try {
-			anim = building().get_animation("unoccupied");
+			anim_idx = building().get_animation("unoccupied");
 		} catch (Map_Object_Descr::Animation_Nonexistent) {
-			anim = building().get_animation("idle");
+			anim_idx = building().get_animation("idle");
 		}
 	}
-	const size_t nr_frames = g_gr->nr_frames(anim);
+	const Animation& anim = g_gr->animations().get_animation(anim_idx);
+	const size_t nr_frames = anim.nr_frames();
 	cur_frame = m_info.totaltime ? m_info.completedtime * nr_frames / m_info.totaltime : 0;
 	// Redefine tanim
 	tanim = cur_frame * FRAME_LENGTH;
 
-	uint32_t w, h;
-	g_gr->get_animation_size(anim, tanim, w, h);
+	const uint16_t w = anim.width();
+	const uint16_t h = anim.height();
 
 	uint32_t lines = h * m_info.completedtime * nr_frames;
 	if (m_info.totaltime)
@@ -390,27 +390,27 @@
 
 	if (cur_frame) //  not the first pic
 		//  draw the prev pic from top to where next image will be drawing
-		dst.drawanimrect(pos, anim, tanim - FRAME_LENGTH, get_owner(), Rect(Point(0, 0), w, h - lines));
+		dst.drawanimrect(pos, anim_idx, tanim - FRAME_LENGTH, get_owner(), Rect(Point(0, 0), w, h - lines));
 	else if (!m_old_buildings.empty()) {
 		Building_Index prev_idx = m_old_buildings.back();
 		const Building_Descr* prev_building = tribe().get_building_descr(prev_idx);
 		//  Is the first picture but there was another building here before,
 		//  get its most fitting picture and draw it instead.
-		uint32_t a;
+		uint32_t prev_building_anim_idx;
 		try {
-			a = prev_building->get_animation("unoccupied");
+			prev_building_anim_idx = prev_building->get_animation("unoccupied");
 		} catch (Map_Object_Descr::Animation_Nonexistent &) {
-			a = prev_building->get_animation("idle");
+			prev_building_anim_idx = prev_building->get_animation("idle");
 		}
-		uint32_t wa, ha;
-		g_gr->get_animation_size(a, tanim, wa, ha);
+		const Animation& prev_building_anim = g_gr->animations().get_animation(prev_building_anim_idx);
 		dst.drawanimrect
-			(pos, a, tanim - FRAME_LENGTH, get_owner(),
-			 Rect(Point(0, 0), wa, std::min(ha, h - lines)));
+			(pos, prev_building_anim_idx, tanim - FRAME_LENGTH, get_owner(),
+			 Rect
+			 (Point(0, 0), prev_building_anim.width(), std::min<int>(prev_building_anim.height(), h - lines)));
 	}
 
 	assert(lines <= h);
-	dst.drawanimrect(pos, anim, tanim, get_owner(), Rect(Point(0, h - lines), w, lines));
+	dst.drawanimrect(pos, anim_idx, tanim, get_owner(), Rect(Point(0, h - lines), w, lines));
 
 	// Draw help strings
 	draw_help(game, dst, coords, pos);

=== modified file 'src/logic/critter_bob.cc'
--- src/logic/critter_bob.cc	2014-03-04 13:24:58 +0000
+++ src/logic/critter_bob.cc	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2004, 2006-2010 by the Widelands Development Team
+ * Copyright (C) 2002-2004, 2006-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -132,12 +132,9 @@
 	Bob::Descr(_name, _descname, directory, prof, global_s, _tribe),
 	m_swimming(global_s.get_bool("swimming", false))
 {
-	m_walk_anims.parse
-		(*this,
-		 directory,
-		 prof,
-		 (name() + "_walk_??").c_str(),
-		 prof.get_section("walk"));
+	char defaultpics[256];
+	snprintf(defaultpics, sizeof(defaultpics), "%s_walk_!!_??.png", _name);
+	m_walk_anims.parse(*this, directory, prof, "walk", false, defaultpics);
 
 	while (Section::Value const * const v = global_s.get_next_val("program")) {
 		std::string program_name = v->get_string();

=== modified file 'src/logic/dismantlesite.cc'
--- src/logic/dismantlesite.cc	2014-02-22 16:49:17 +0000
+++ src/logic/dismantlesite.cc	2014-03-16 21:52:17 +0000
@@ -255,18 +255,19 @@
 	if (m_working)
 		completed_time += DISMANTLESITE_STEP_TIME + gametime - m_work_steptime;
 
-	uint32_t anim;
+	uint32_t anim_idx;
 	try {
-		anim = m_building->get_animation("unoccupied");
+		anim_idx = m_building->get_animation("unoccupied");
 	} catch (Map_Object_Descr::Animation_Nonexistent &) {
-		anim = m_building->get_animation("idle");
+		anim_idx = m_building->get_animation("idle");
 	}
-	uint32_t w, h;
-	g_gr->get_animation_size(anim, tanim, w, h);
+	const Animation& anim = g_gr->animations().get_animation(anim_idx);
+	const uint16_t w = anim.width();
+	const uint16_t h = anim.height();
 
 	uint32_t lines = h * completed_time / total_time;
 
-	dst.drawanimrect(pos, anim, tanim, get_owner(), Rect(Point(0, lines), w, h - lines));
+	dst.drawanimrect(pos, anim_idx, tanim, get_owner(), Rect(Point(0, lines), w, h - lines));
 
 	// Draw help strings
 	draw_help(game, dst, coords, pos);

=== modified file 'src/logic/editor_game_base.cc'
--- src/logic/editor_game_base.cc	2014-02-22 18:04:02 +0000
+++ src/logic/editor_game_base.cc	2014-03-16 21:52:17 +0000
@@ -274,7 +274,6 @@
 void Editor_Game_Base::load_graphics(UI::ProgressWindow & loader_ui)
 {
 	loader_ui.step(_("Loading world data"));
-	g_gr->flush_animations();
 
 	g_gr->set_world(m_map->get_world_name());
 	m_map->load_graphics(); // especially loads world data
@@ -285,8 +284,6 @@
 	}
 
 	// TODO: load player graphics? (maybe)
-
-	g_gr->load_animations();
 }
 
 /**
@@ -497,21 +494,9 @@
  *
  * make this object ready to load new data
  */
-void Editor_Game_Base::cleanup_for_load
-	(bool const flush_graphics, bool const flush_animations)
+void Editor_Game_Base::cleanup_for_load()
 {
 	cleanup_objects(); /// Clean all the stuff up, so we can load.
-
-	//  We do not flush the animations in the editor since all tribes are loaded
-	//  and animations can not change a lot, or?
-	//  And we especially do not flush anything, if nothing is loaded == dedicated server
-	if (g_gr) {
-		if (flush_animations)
-			g_anim.flush();
-		if (flush_graphics)
-			g_gr->flush_animations(); // flush all world animations
-	}
-
 	m_player_manager->cleanup();
 
 	if (m_map)

=== modified file 'src/logic/editor_game_base.h'
--- src/logic/editor_game_base.h	2014-02-22 18:04:02 +0000
+++ src/logic/editor_game_base.h	2014-03-16 21:52:17 +0000
@@ -95,8 +95,7 @@
 	void allocate_player_maps();
 	virtual void postload();
 	void load_graphics(UI::ProgressWindow & loader_ui);
-	virtual void cleanup_for_load
-		(bool flush_graphics = true, bool flush_animations = true);
+	virtual void cleanup_for_load();
 
 	void set_road(FCoords, uint8_t direction, uint8_t roadtype);
 

=== modified file 'src/logic/game.cc'
--- src/logic/game.cc	2014-03-03 20:50:30 +0000
+++ src/logic/game.cc	2014-03-16 21:52:17 +0000
@@ -586,9 +586,6 @@
 		delete get_ibase();
 		set_ibase(nullptr);
 
-		g_anim.flush();
-		g_gr->flush_animations();
-
 		m_state = gs_notrunning;
 	} else {
 		// dedicated server
@@ -649,12 +646,11 @@
  * \todo Get rid of this. Prefer to delete and recreate Game-style objects
  * Note that this needs fixes in the editor.
  */
-void Game::cleanup_for_load
-	(bool const flush_graphics, bool const flush_animations)
+void Game::cleanup_for_load()
 {
 	m_state = gs_notrunning;
 
-	Editor_Game_Base::cleanup_for_load(flush_graphics, flush_animations);
+	Editor_Game_Base::cleanup_for_load();
 	container_iterate_const(std::vector<Tribe_Descr *>, m_tribes, i)
 		delete *i.current;
 	m_tribes.clear();

=== modified file 'src/logic/game.h'
--- src/logic/game.h	2014-02-22 18:04:02 +0000
+++ src/logic/game.h	2014-03-16 21:52:17 +0000
@@ -129,8 +129,7 @@
 	bool is_loaded() {return m_state == gs_running;}
 	void end_dedicated_game();
 
-	void cleanup_for_load
-		(const bool flush_graphics = true, const bool flush_animations = true) override;
+	void cleanup_for_load();
 
 	// in-game logic
 	const Cmd_Queue & cmdqueue() const {return m_cmdqueue;}

=== modified file 'src/logic/immovable.cc'
--- src/logic/immovable.cc	2014-03-13 21:38:44 +0000
+++ src/logic/immovable.cc	2014-03-16 21:52:17 +0000
@@ -25,7 +25,6 @@
 #include <config.h>
 
 #include "container_iterate.h"
-#include "graphic/animation_gfx.h"
 #include "graphic/font_handler1.h"
 #include "graphic/graphic.h"
 #include "graphic/rendertarget.h"
@@ -158,7 +157,7 @@
  * Parse an immovable from its conf file.
  *
  * Section [global]:
- * picture (default = $NAME_00.bmp): name of picture used in editor
+ * picture (default = $NAME_00.png): name of picture used in editor
  * size = none|small|medium|big (default = none): influences build options
  *
  * Section [program] (optional)
@@ -174,7 +173,6 @@
 	 const World & world, Tribe_Descr const * const owner_tribe)
 :
 	Map_Object_Descr(_name, _descname),
-	m_picture       (directory + global_s.get_string("picture", "menu.png")),
 	m_size          (BaseImmovable::NONE),
 	m_owner_tribe   (owner_tribe)
 {
@@ -507,23 +505,24 @@
 			(&(*m_program)[m_program_ptr]);
 
 	const int32_t steptime = constructionact ? constructionact->buildtime() : 5000;
-	uint32_t total = m_anim_construction_total * steptime;
+
 	uint32_t done = 0;
-
 	if (m_anim_construction_done > 0) {
 		done = steptime * (m_anim_construction_done - 1);
 		done += std::min(steptime, game.get_gametime() - m_animstart);
 	}
 
+	uint32_t total = m_anim_construction_total * steptime;
 	if (done > total)
 		done = total;
 
-	const size_t nr_frames = g_gr->nr_frames(m_anim);
-	uint32_t frametime = g_anim.get_animation(m_anim).frametime;
+	const Animation& anim = g_gr->animations().get_animation(m_anim);
+	const size_t nr_frames = anim.nr_frames();
+	uint32_t frametime = g_gr->animations().get_animation(m_anim).frametime();
 	uint32_t units_per_frame = (total + nr_frames - 1) / nr_frames;
 	const size_t current_frame = done / units_per_frame;
-	uint32_t curw, curh;
-	g_gr->get_animation_size(m_anim, current_frame * frametime, curw, curh);
+	const uint16_t curw = anim.width();
+	const uint16_t curh = anim.height();
 
 	uint32_t lines = ((done % units_per_frame) * curh) / units_per_frame;
 
@@ -795,10 +794,7 @@
 			m_id = descr.get_animation(animation_name);
 		else {
 			m_id =
-				g_anim.get
-					(directory.c_str(),
-					 prof.get_safe_section(animation_name),
-					 nullptr);
+				g_gr->animations().load(directory, prof.get_safe_section(animation_name));
 
 			descr.add_animation(animation_name, m_id);
 		}
@@ -1136,10 +1132,7 @@
 			m_animid = descr.get_animation(animation_name);
 		else {
 			m_animid =
-				g_anim.get
-					(directory.c_str(),
-					 prof.get_safe_section(animation_name),
-					 nullptr);
+				g_gr->animations().load(directory, prof.get_safe_section(animation_name));
 
 			descr.add_animation(animation_name, m_animid);
 		}

=== modified file 'src/logic/immovable.h'
--- src/logic/immovable.h	2014-02-22 18:04:02 +0000
+++ src/logic/immovable.h	2014-03-16 21:52:17 +0000
@@ -96,7 +96,6 @@
 	~Immovable_Descr();
 
 	int32_t get_size() const {return m_size;}
-	char const * get_picture() const {return m_picture.c_str();}
 	ImmovableProgram const * get_program(const std::string &) const;
 
 	Immovable & create(Editor_Game_Base &, Coords) const;
@@ -109,9 +108,7 @@
 	const Buildcost & buildcost() const {return m_buildcost;}
 
 protected:
-	std::string m_picture;
 	int32_t     m_size;
-
 	Programs    m_programs;
 
 	/// The tribe to which this Immovable_Descr belongs or 0 if it is a

=== modified file 'src/logic/production_program.cc'
--- src/logic/production_program.cc	2014-03-07 09:22:06 +0000
+++ src/logic/production_program.cc	2014-03-16 21:52:17 +0000
@@ -26,6 +26,7 @@
 #include "economy/economy.h"
 #include "economy/flag.h"
 #include "economy/wares_queue.h"
+#include "graphic/graphic.h"
 #include "helper.h"
 #include "logic/checkstep.h"
 #include "logic/findimmovable.h"
@@ -736,10 +737,7 @@
 		if (descr.is_animation_known(animation_name))
 			m_id = descr.get_animation(animation_name);
 		else {
-			m_id = g_anim.get
-				(directory.c_str(),
-				 prof.get_safe_section(animation_name),
-				 nullptr);
+			m_id = g_gr->animations().load(directory.c_str(), prof.get_safe_section(animation_name));
 			descr.add_animation(animation_name, m_id);
 		}
 		if (not reached_end) { //  The next parameter is the duration.

=== modified file 'src/logic/replay.cc'
--- src/logic/replay.cc	2014-03-04 13:24:58 +0000
+++ src/logic/replay.cc	2014-03-16 21:52:17 +0000
@@ -239,7 +239,7 @@
 		throw wexception("Failed to save game for replay: %s", error.c_str());
 
 	log("Reloading the game from replay\n");
-	game.cleanup_for_load(true, true);
+	game.cleanup_for_load();
 	{
 		Game_Loader gl(m_filename + WLGF_SUFFIX, game);
 		gl.load_game();

=== modified file 'src/logic/ship.cc'
--- src/logic/ship.cc	2014-03-09 10:28:39 +0000
+++ src/logic/ship.cc	2014-03-16 21:52:17 +0000
@@ -26,6 +26,7 @@
 #include "economy/fleet.h"
 #include "economy/portdock.h"
 #include "economy/wares_queue.h"
+#include "graphic/graphic.h"
 #include "logic/constructionsite.h"
 #include "logic/findbob.h"
 #include "logic/game.h"
@@ -50,16 +51,11 @@
 	 const Tribe_Descr & gtribe)
 : Descr(given_name, gdescname, directory, prof, global_s, &gtribe)
 {
-	m_sail_anims.parse
-		(*this,
-		 directory,
-		 prof,
-		 (name() + "_sail_??").c_str(),
-		 prof.get_section("sail"));
+	m_sail_anims.parse(*this, directory, prof, "sail");
 
-		Section * sinking_s = prof.get_section("sinking");
-		if (sinking_s)
-			add_animation("sinking", g_anim.get (directory, *sinking_s, "sinking.png"));
+	Section * sinking_s = prof.get_section("sinking");
+	if (sinking_s)
+		add_animation("sinking", g_gr->animations().load(directory, *sinking_s));
 
 	m_capacity     = global_s.get_natural("capacity", 20);
 	m_vision_range = global_s.get_natural("vision_range", 7);

=== modified file 'src/logic/soldier.cc'
--- src/logic/soldier.cc	2014-03-07 15:35:50 +0000
+++ src/logic/soldier.cc	2014-03-16 21:52:17 +0000
@@ -194,8 +194,7 @@
 				anim_s = prof.get_safe_section((*i.current).c_str());
 
 			add_animation
-				((*i.current).c_str(),
-				 g_anim.get (directory, anim_s, "idle_00.png"));
+				((*i.current).c_str(), g_gr->animations().load(directory, anim_s));
 		}
 	} catch (const _wexception & e) {
 		throw game_data_error("%s : %s", anim_name, e.what());
@@ -556,17 +555,9 @@
 	(const Editor_Game_Base & game, RenderTarget & dst, const Point& pos) const
 {
 	if (const uint32_t anim = get_current_anim()) {
-
 		const Point drawpos = calc_drawpos(game, pos);
-
-		uint32_t w, h;
-		g_gr->get_animation_size
-			(anim,
-			 game.get_gametime() - get_animstart(),
-			 w,
-			 h);
-
-		draw_info_icon(dst, Point(drawpos.x, drawpos.y - h - 7), true);
+		draw_info_icon
+			(dst, Point(drawpos.x, drawpos.y - g_gr->animations().get_animation(anim).height() - 7), true);
 
 		draw_inner(game, dst, drawpos);
 	}

=== modified file 'src/logic/tribe.cc'
--- src/logic/tribe.cc	2014-03-12 20:57:36 +0000
+++ src/logic/tribe.cc	2014-03-16 21:52:17 +0000
@@ -23,6 +23,7 @@
 
 #include <boost/algorithm/string.hpp>
 
+#include "graphic/graphic.h"
 #include "helper.h"
 #include "i18n.h"
 #include "io/filesystem/disk_filesystem.h"
@@ -48,6 +49,7 @@
 #include "scripting/scripting.h"
 #include "upcast.h"
 
+
 using namespace std;
 
 namespace Widelands {
@@ -252,8 +254,7 @@
 					} catch (Nonexistent) {
 						m_anim_frontier.push_back
 							(std::pair<std::string, uint32_t>
-							 	(style_name,
-							 	 g_anim.get(path, *s, nullptr)));
+							 	(style_name, g_gr->animations().load(path, *s)));
 					}
 				}
 				if (m_anim_frontier.empty())
@@ -274,7 +275,7 @@
 						m_anim_flag.push_back
 							(std::pair<std::string, uint32_t>
 							 	(style_name,
-							 	 g_anim.get(path, *s, nullptr)));
+							 	 g_gr->animations().load(path, *s)));
 					}
 				}
 				if (m_anim_flag.empty())

=== modified file 'src/logic/ware_descr.cc'
--- src/logic/ware_descr.cc	2014-02-22 18:04:02 +0000
+++ src/logic/ware_descr.cc	2014-03-16 21:52:17 +0000
@@ -40,7 +40,7 @@
 	m_default_target_quantity =
 		global_s.get_positive("default_target_quantity", std::numeric_limits<uint32_t>::max());
 
-	add_animation("idle", g_anim.get(directory, prof.get_safe_section("idle")));
+	add_animation("idle", g_gr->animations().load(directory, prof.get_safe_section("idle")));
 
 	m_preciousness =
 		static_cast<uint8_t>(global_s.get_natural("preciousness", 0));

=== modified file 'src/logic/worker_descr.cc'
--- src/logic/worker_descr.cc	2014-03-12 20:57:36 +0000
+++ src/logic/worker_descr.cc	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2004, 2006-2010, 2012 by the Widelands Development Team
+ * Copyright (C) 2002-2004, 2006-2010, 2012-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -83,20 +83,11 @@
 	// If worker has a work animation load and add it.
 	Section * work_s = prof.get_section("work");
 	if (work_s)
-		add_animation("work", g_anim.get(directory, *work_s, "work.png"));
+		add_animation("work", g_gr->animations().load(directory, *work_s));
 
 	// Read the walking animations
-	m_walk_anims.parse
-		(*this, directory, prof, "walk_??", prof.get_section("walk"));
-
-	//  Soldiers have no walkload.
-	if (not global_s.has_val("max_hp_level"))
-		m_walkload_anims.parse
-			(*this,
-			 directory,
-			 prof,
-			 "walkload_??",
-			 prof.get_section("walkload"));
+	m_walk_anims.parse(*this, directory, prof, "walk");
+	m_walkload_anims.parse(*this, directory, prof, "walkload", true);
 
 	// Read the becomes and experience
 	if (char const * const becomes_name = global_s.get_string("becomes")) {

=== modified file 'src/logic/worker_program.cc'
--- src/logic/worker_program.cc	2014-03-04 09:57:26 +0000
+++ src/logic/worker_program.cc	2014-03-16 21:52:17 +0000
@@ -19,6 +19,7 @@
 
 #include "logic/worker_program.h"
 
+#include "graphic/graphic.h"
 #include "helper.h"
 #include "logic/findnode.h"
 #include "logic/game_data_error.h"
@@ -447,10 +448,8 @@
 		// dynamically allocate animations here
 		descr->add_animation
 			(cmd[1].c_str(),
-			 (g_anim.get
-			  	(parser->directory.c_str(),
-			  	 parser->prof->get_safe_section(cmd[1].c_str()),
-			  	 nullptr)));
+			 (g_gr->animations().load(parser->directory,
+			  	 parser->prof->get_safe_section(cmd[1].c_str()))));
 	}
 	act->iparam1 = descr->get_animation(cmd[1].c_str());
 

=== modified file 'src/profile/profile.cc'
--- src/profile/profile.cc	2014-02-22 18:04:02 +0000
+++ src/profile/profile.cc	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002, 2006-2010 by the Widelands Development Team
+ * Copyright (C) 2002, 2006-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -187,30 +187,29 @@
 */
 
 char const * Section::get_name() const {
-	return m_section_name;
+	return m_section_name.c_str();
+}
+void Section::set_name(const std::string& name) {
+	m_section_name = name;
 }
 
 Section::Section(Profile * const prof, const char * const name) :
-m_profile(prof), m_used(false), m_section_name(strdup(name)) {}
+m_profile(prof), m_used(false), m_section_name(name) {}
 
 Section::Section(const Section & o) :
 	m_profile     (o.m_profile),
 	m_used        (o.m_used),
-	m_section_name(strdup(o.m_section_name)),
+	m_section_name(o.m_section_name),
 	m_values      (o.m_values)
 {
 	assert(this != &o);
 }
 
-Section::~Section() {free(m_section_name);}
-
 Section & Section::operator= (const Section & o) {
 	if (this != &o) {
-		free(m_section_name);
-
 		m_profile      = o.m_profile;
 		m_used         = o.m_used;
-		m_section_name = strdup(o.m_section_name);
+		m_section_name = o.m_section_name;
 		m_values       = o.m_values;
 	}
 
@@ -368,6 +367,15 @@
 	return v->get_string();
 }
 
+/**
+ * Return the key value as a plain string or throw an exception if the key
+ * does not exist.
+ */
+const char * Section::get_safe_string(const std::string & name)
+{
+	return get_safe_string(name.c_str());
+}
+
 /** Section::get_safe_Coords(const char * const name)
  *
  * Return the key value as a Coords or throw an exception if the key
@@ -740,14 +748,14 @@
 /**
  * Retrieve the first section of the given name and mark it used.
  *
- * Args: name  name of the section
+ * @param name name of the section
  *
- * Returns: pointer to the section (or 0 if the section doesn't exist)
+ * @return pointer to the section (or 0 if the section doesn't exist)
  */
-Section * Profile::get_section(char const * const name)
+Section * Profile::get_section(const std::string & name)
 {
 	container_iterate(Section_list, m_sections, i)
-		if (!strcasecmp(i.current->get_name(), name)) {
+		if (!strcasecmp(i.current->get_name(), name.c_str())) {
 			i.current->mark_used();
 			return &*i.current;
 		}

=== modified file 'src/profile/profile.h'
--- src/profile/profile.h	2014-02-22 18:04:02 +0000
+++ src/profile/profile.h	2014-03-16 21:52:17 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002, 2006-2009 by the Widelands Development Team
+ * Copyright (C) 2002, 2006-2013 by the Widelands Development Team
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -20,6 +20,7 @@
 #ifndef PROFILE_H
 #define PROFILE_H
 
+#include <cstring>
 #include <vector>
 
 #include <boost/noncopyable.hpp>
@@ -95,7 +96,6 @@
 
 	Section(Profile *, char const * name);
 	Section(const Section &);
-	~Section();
 
 	Section & operator= (const Section &);
 
@@ -108,6 +108,7 @@
 	uint32_t get_num_values() const {return m_values.size();}
 
 	char const * get_name() const;
+	void set_name(const std::string&);
 
 	bool is_used() const;
 	void mark_used();
@@ -150,6 +151,7 @@
 		(const char * name);
 	const char *              get_safe_string
 		(const char * name);
+	const char * get_safe_string(const std::string & name);
 	Widelands::Coords         get_safe_Coords
 		(const char * name, Widelands::Extent);
 	Widelands::Player_Number  get_safe_Player_Number
@@ -208,7 +210,7 @@
 private:
 	Profile  * m_profile;
 	bool       m_used;
-	char     * m_section_name;
+	std::string m_section_name;
 	Value_list m_values;
 };
 
@@ -256,7 +258,7 @@
 		 bool used_only = true,
 		 FileSystem & = *g_fs);
 
-	Section * get_section     (char const * name);
+	Section * get_section     (const std::string & name);
 	Section & get_safe_section(const std::string & name);
 	Section & pull_section    (char const * name);
 	Section * get_next_section(char const * name = nullptr);

=== modified file 'src/ui_fsmenu/options.cc'
--- src/ui_fsmenu/options.cc	2014-03-16 19:16:46 +0000
+++ src/ui_fsmenu/options.cc	2014-03-16 21:52:17 +0000
@@ -28,6 +28,7 @@
 #include "graphic/graphic.h"
 #include "i18n.h"
 #include "io/filesystem/layered_filesystem.h"
+#include "libintl.h"
 #include "profile/profile.h"
 #include "save_handler.h"
 #include "sound/sound_handler.h"

=== modified file 'src/wui/buildingwindow.cc'
--- src/wui/buildingwindow.cc	2014-03-03 20:50:30 +0000
+++ src/wui/buildingwindow.cc	2014-03-16 21:52:17 +0000
@@ -23,6 +23,7 @@
 
 #include "graphic/graphic.h"
 #include "graphic/image.h"
+#include "graphic/image_transformations.h"
 #include "graphic/rendertarget.h"
 #include "logic/constructionsite.h"
 #include "logic/dismantlesite.h"
@@ -115,10 +116,11 @@
 {
 	UI::Window::draw(dst);
 
-	dst.drawstatic
-			(Point(get_inner_w() / 2, get_inner_h() / 2),
-			 building().get_ui_anim(),
-			 &building().owner());
+	const Animation& anim = g_gr->animations().get_animation(building().get_ui_anim());
+
+	const Image* dark_frame = ImageTransformations::change_luminosity
+		(&anim.representative_image(building().owner().get_playercolor()), 1.22, true);
+	dst.blit(Point(get_inner_w() / 2, get_inner_h() / 2), dark_frame, CM_Normal, UI::Align_Center);
 }
 
 /*

=== modified file 'src/wui/game_debug_ui.cc'
--- src/wui/game_debug_ui.cc	2014-03-05 11:59:09 +0000
+++ src/wui/game_debug_ui.cc	2014-03-16 21:52:17 +0000
@@ -343,10 +343,9 @@
 		switch (vision) {
 		case 0: str += "  never seen\n"; break;
 		case 1: {
-			std::string animation_name = "(none)";
+			std::string animation_name = "(no animation)";
 			if (player_field.map_object_descr[Widelands::TCoords<>::None]) {
-				animation_name = g_anim.get_animation
-					(player_field.map_object_descr[Widelands::TCoords<>::None]->main_animation()).picnametempl;
+				animation_name = "(seen an animation)";
 			}
 
 			snprintf

=== modified file 'tribes/atlanteans/armoursmith/conf'
--- tribes/atlanteans/armoursmith/conf	2014-02-25 14:45:19 +0000
+++ tribes/atlanteans/armoursmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=10 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/armoursmithy/conf'
--- tribes/atlanteans/armoursmithy/conf	2014-03-10 10:45:21 +0000
+++ tribes/atlanteans/armoursmithy/conf	2014-03-16 21:52:17 +0000
@@ -51,9 +51,7 @@
 [idle]
 pics=armoursmith_i_??.png
 hotspot=53 60
-playercolor=true
 
 [working]
 pics=armoursmith_i_??.png
 hotspot=53 60
-playercolor=true

=== modified file 'tribes/atlanteans/ashes/conf'
--- tribes/atlanteans/ashes/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/ashes/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=ashes_00.png
 
 [program]
 animate=idle 45000

=== modified file 'tribes/atlanteans/baker/conf'
--- tribes/atlanteans/baker/conf	2012-02-15 21:25:34 +0000
+++ tribes/atlanteans/baker/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/bakery/conf'
--- tribes/atlanteans/bakery/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/bakery/conf	2014-03-16 21:52:17 +0000
@@ -34,10 +34,8 @@
 [idle]
 pics=bakery_i_??.png  # ???
 hotspot=52 63
-playercolor=true
 
 [working]
 pics=bakery_b_??.png  # ???
 hotspot=52 75
-playercolor=true
 fps=20

=== modified file 'tribes/atlanteans/blackroot_farm/conf'
--- tribes/atlanteans/blackroot_farm/conf	2014-03-10 10:45:21 +0000
+++ tribes/atlanteans/blackroot_farm/conf	2014-03-16 21:52:17 +0000
@@ -39,4 +39,3 @@
 [idle]
 pics=blackroot_farm_i_??.png  # ???
 hotspot=74 60
-playercolor=true

=== modified file 'tribes/atlanteans/blackroot_farmer/conf'
--- tribes/atlanteans/blackroot_farmer/conf	2014-02-22 16:49:17 +0000
+++ tribes/atlanteans/blackroot_farmer/conf	2014-03-16 21:52:17 +0000
@@ -26,34 +26,28 @@
 [idle]
 pics=idle_??.png
 hotspot=9 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=13 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=13 24
-playercolor=true
 fps=10
 
 [planting]
 pics=plant_??.png
 hotspot=13 32
-playercolor=true
 fps=10
 
 [harvesting]
 pics=harvest_??.png
 hotspot=7 30
-playercolor=true
 fps=10
 
 [gathering]
 pics=gather_??.png
 hotspot=10 32
-playercolor=true
 fps=5

=== modified file 'tribes/atlanteans/blackrootfield_m/conf'
--- tribes/atlanteans/blackrootfield_m/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/blackrootfield_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=blackrootfield_m_00.png
 
 [program]
 animate=midd 50000

=== modified file 'tribes/atlanteans/blackrootfield_s/conf'
--- tribes/atlanteans/blackrootfield_s/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/blackrootfield_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=blackrootfield_s_00.png
 
 [program]
 animate=small 45000

=== modified file 'tribes/atlanteans/blackrootfield_t/conf'
--- tribes/atlanteans/blackrootfield_t/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/blackrootfield_t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=blackrootfield_t_00.png
 
 [program]
 animate=tiny 30000

=== modified file 'tribes/atlanteans/builder/conf'
--- tribes/atlanteans/builder/conf	2014-02-24 21:12:30 +0000
+++ tribes/atlanteans/builder/conf	2014-03-16 21:52:17 +0000
@@ -7,24 +7,20 @@
 [idle]
 pics=waiting_???.png
 hotspot=16 23
-playercolor=true
 fps=10
 
 [work]
 pics=work_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=6 22
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/burner/conf'
--- tribes/atlanteans/burner/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/burner/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=4 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/burners_house/conf'
--- tribes/atlanteans/burners_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/burners_house/conf	2014-03-16 21:52:17 +0000
@@ -32,9 +32,7 @@
 [idle]
 pics=burner_i_??.png
 hotspot=47 57
-playercolor=true
 
 [working]
 pics=burner_b_??.png
 hotspot=47 60
-playercolor=true

=== modified file 'tribes/atlanteans/carrier/conf'
--- tribes/atlanteans/carrier/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/carrier/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 pics=idle_??.png
 hotspot=13 24
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 25
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 25
 fps=10
-playercolor=true
\ No newline at end of file

=== modified file 'tribes/atlanteans/castle/conf'
--- tribes/atlanteans/castle/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/castle/conf	2014-03-16 21:52:17 +0000
@@ -25,4 +25,3 @@
 [idle]
 pics=castle_i_??.png
 hotspot=91 91
-playercolor=true

=== modified file 'tribes/atlanteans/coalmine/conf'
--- tribes/atlanteans/coalmine/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/coalmine/conf	2014-03-16 21:52:17 +0000
@@ -42,14 +42,11 @@
 [idle]
 pics=coalmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [working]
 pics=coalmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [empty]
 pics=coalmine_e_??.png
 hotspot=50 56
-playercolor=true

=== modified file 'tribes/atlanteans/conf'
--- tribes/atlanteans/conf	2014-03-10 09:15:02 +0000
+++ tribes/atlanteans/conf	2014-03-16 21:52:17 +0000
@@ -19,7 +19,6 @@
 name=frontier
 pics=pics/frontier_??.png
 hotspot=3 12
-playercolor=true
 
 # Not just a plain color, maybe a cross or some stribes
 [flag]
@@ -27,7 +26,6 @@
 pics=pics/flag_??.png
 hotspot=15 35
 fps=10
-playercolor=true
 
 [immovable types]
 ashes=_Ashes

=== modified file 'tribes/atlanteans/cornfield_m/conf'
--- tribes/atlanteans/cornfield_m/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/cornfield_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=cornfield_m_00.png
 
 [program]
 animate=midd 50000

=== modified file 'tribes/atlanteans/cornfield_s/conf'
--- tribes/atlanteans/cornfield_s/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/cornfield_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=cornfield_s_00.png
 
 [program]
 animate=small 45000

=== modified file 'tribes/atlanteans/cornfield_t/conf'
--- tribes/atlanteans/cornfield_t/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/cornfield_t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=cornfield_t_00.png
 
 [program]
 animate=tiny 30000

=== modified file 'tribes/atlanteans/crystalmine/conf'
--- tribes/atlanteans/crystalmine/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/crystalmine/conf	2014-03-16 21:52:17 +0000
@@ -86,14 +86,11 @@
 [idle]
 pics=crystalmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [working]
 pics=crystalmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [empty]
 pics=crystalmine_e_??.png
 hotspot=50 56
-playercolor=true

=== modified file 'tribes/atlanteans/destroyed_building/conf'
--- tribes/atlanteans/destroyed_building/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/destroyed_building/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=big
 program=program
-picture=fire_burn_00.png
 
 [program]
 animate=burn 30000

=== modified file 'tribes/atlanteans/dungeon/conf'
--- tribes/atlanteans/dungeon/conf	2014-03-10 10:45:21 +0000
+++ tribes/atlanteans/dungeon/conf	2014-03-16 21:52:17 +0000
@@ -77,4 +77,3 @@
 [idle]
 pics=dungeon_i_??.png  # ???
 hotspot=47 48
-playercolor=true

=== modified file 'tribes/atlanteans/farm/conf'
--- tribes/atlanteans/farm/conf	2014-03-10 10:45:21 +0000
+++ tribes/atlanteans/farm/conf	2014-03-16 21:52:17 +0000
@@ -41,4 +41,3 @@
 [idle]
 pics=farm_i_??.png  # ???
 hotspot=74 60
-playercolor=true

=== modified file 'tribes/atlanteans/farmer/conf'
--- tribes/atlanteans/farmer/conf	2014-02-22 16:49:17 +0000
+++ tribes/atlanteans/farmer/conf	2014-03-16 21:52:17 +0000
@@ -27,34 +27,28 @@
 [idle]
 pics=idle_??.png
 hotspot=10 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=18 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=18 23
-playercolor=true
 fps=10
 
 [planting]
 pics=plant_??.png
 hotspot=13 32
-playercolor=true
 fps=10
 
 [harvesting]
 pics=harvest_??.png
 hotspot=18 32
-playercolor=true
 fps=10
 
 [gathering]
 pics=gather_??.png
 hotspot=10 34
-playercolor=true
 fps=5

=== modified file 'tribes/atlanteans/fish_breeder/conf'
--- tribes/atlanteans/fish_breeder/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/fish_breeder/conf	2014-03-16 21:52:17 +0000
@@ -15,22 +15,18 @@
 [idle]
 pics=idle_??.png
 hotspot=8 22
-playercolor=true
 
 [freeing]
 pics=freeing_??.png
 hotspot=10 19
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=20

=== modified file 'tribes/atlanteans/fish_breeders_house/conf'
--- tribes/atlanteans/fish_breeders_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/fish_breeders_house/conf	2014-03-16 21:52:17 +0000
@@ -26,4 +26,3 @@
 [idle]
 pics=fish_breeder_i_??.png  # ???
 hotspot=34 42
-playercolor=true

=== modified file 'tribes/atlanteans/fisher/conf'
--- tribes/atlanteans/fisher/conf	2014-02-22 16:49:17 +0000
+++ tribes/atlanteans/fisher/conf	2014-03-16 21:52:17 +0000
@@ -18,22 +18,18 @@
 [idle]
 pics=idle_??.png
 hotspot=2 20
-playercolor=true
 
 [fishing]
 pics=fishing_??.png
 hotspot=10 21
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 21
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 20
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/fishers_house/conf'
--- tribes/atlanteans/fishers_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/fishers_house/conf	2014-03-16 21:52:17 +0000
@@ -25,4 +25,3 @@
 [idle]
 pics=fisher_i_??.png  # ???
 hotspot=34 42
-playercolor=true

=== modified file 'tribes/atlanteans/forester/conf'
--- tribes/atlanteans/forester/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/forester/conf	2014-03-16 21:52:17 +0000
@@ -17,34 +17,28 @@
 [idle]
 pics=idle_??.png
 hotspot=8 23
-playercolor=true
 
 [dig]
 pics=dig_??.png
 hotspot=5 23
 fps=5
-playercolor=true
 
 [crop]
 pics=plant_??.png
 hotspot=17 21
 fps=10
-playercolor=true
 
 [water]
 pics=water_??.png
 hotspot=18 25
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 23
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=10 23
 fps=10
-playercolor=true

=== modified file 'tribes/atlanteans/geologist/conf'
--- tribes/atlanteans/geologist/conf	2013-03-02 20:35:18 +0000
+++ tribes/atlanteans/geologist/conf	2014-03-16 21:52:17 +0000
@@ -23,23 +23,19 @@
 [idle]
 pics=idle_??.png
 hotspot=10 23
-playercolor=true
 fps=10
 
 [hacking]
 pics=hacking_??.png
 hotspot=12 20
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/goldmine/conf'
--- tribes/atlanteans/goldmine/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/goldmine/conf	2014-03-16 21:52:17 +0000
@@ -43,14 +43,11 @@
 [idle]
 pics=goldmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [working]
 pics=goldmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [empty]
 pics=goldmine_e_??.png
 hotspot=50 56
-playercolor=true

=== modified file 'tribes/atlanteans/goldweaver/conf'
--- tribes/atlanteans/goldweaver/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/goldweaver/conf	2014-03-16 21:52:17 +0000
@@ -32,9 +32,7 @@
 [idle]
 pics=goldweaver_i_??.png  # ???
 hotspot=33 64
-playercolor=true
 
 [working]
 pics=goldweaver_i_??.png  # ???
 hotspot=33 64
-playercolor=true

=== modified file 'tribes/atlanteans/guardhall/conf'
--- tribes/atlanteans/guardhall/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/guardhall/conf	2014-03-16 21:52:17 +0000
@@ -23,4 +23,3 @@
 [idle]
 pics=guardhall_i_??.png
 hotspot=58 72
-playercolor=true

=== modified file 'tribes/atlanteans/guardhouse/conf'
--- tribes/atlanteans/guardhouse/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/guardhouse/conf	2014-03-16 21:52:17 +0000
@@ -20,4 +20,3 @@
 [idle]
 pics=guardhouse_i_??.png
 hotspot=33 41
-playercolor=true

=== modified file 'tribes/atlanteans/headquarters/conf'
--- tribes/atlanteans/headquarters/conf	2013-03-02 20:35:18 +0000
+++ tribes/atlanteans/headquarters/conf	2014-03-16 21:52:17 +0000
@@ -8,4 +8,3 @@
 pics=headquarters_i_??.png
 # sfx=0 ../../../sound/spoken/warehouse-bringitin
 hotspot=81 110
-playercolor=true

=== modified file 'tribes/atlanteans/high_tower/conf'
--- tribes/atlanteans/high_tower/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/high_tower/conf	2014-03-16 21:52:17 +0000
@@ -23,4 +23,3 @@
 [idle]
 pics=high_tower_i_??.png
 hotspot=50 73
-playercolor=true

=== modified file 'tribes/atlanteans/horsebreeder/conf'
--- tribes/atlanteans/horsebreeder/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/horsebreeder/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=35 28
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=35 28
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/hunter/conf'
--- tribes/atlanteans/hunter/conf	2014-02-22 16:49:17 +0000
+++ tribes/atlanteans/hunter/conf	2014-03-16 21:52:17 +0000
@@ -16,17 +16,14 @@
 [idle]
 pics=shooting_??.png
 hotspot=6 29
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=14 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=13 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/hunters_house/conf'
--- tribes/atlanteans/hunters_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/hunters_house/conf	2014-03-16 21:52:17 +0000
@@ -25,4 +25,3 @@
 [idle]
 pics=hunter_i_??.png
 hotspot=36 44
-playercolor=true

=== modified file 'tribes/atlanteans/ironmine/conf'
--- tribes/atlanteans/ironmine/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/ironmine/conf	2014-03-16 21:52:17 +0000
@@ -43,14 +43,11 @@
 [idle]
 pics=ironmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [working]
 pics=ironmine_i_??.png
 hotspot=50 56
-playercolor=true
 
 [empty]
 pics=ironmine_e_??.png
 hotspot=50 56
-playercolor=true

=== modified file 'tribes/atlanteans/labyrinth/conf'
--- tribes/atlanteans/labyrinth/conf	2014-03-10 10:45:21 +0000
+++ tribes/atlanteans/labyrinth/conf	2014-03-16 21:52:17 +0000
@@ -91,4 +91,3 @@
 [idle]
 pics=labyrinth_i_??.png  # ???
 hotspot=80 88
-playercolor=true

=== modified file 'tribes/atlanteans/mill/conf'
--- tribes/atlanteans/mill/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/mill/conf	2014-03-16 21:52:17 +0000
@@ -50,10 +50,8 @@
 [idle]
 pics=mill_i_??.png
 hotspot=58 61
-playercolor=true
 
 [working]
 pics=mill_b_??.png # lets see the mill turn!
 hotspot=58 61
-playercolor=true
 fps=25

=== modified file 'tribes/atlanteans/miller/conf'
--- tribes/atlanteans/miller/conf	2011-01-17 22:19:08 +0000
+++ tribes/atlanteans/miller/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=4 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/miner/conf'
--- tribes/atlanteans/miner/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/miner/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=3 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=10 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/port/conf'
--- tribes/atlanteans/port/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/port/conf	2014-03-16 21:52:17 +0000
@@ -21,10 +21,8 @@
 [build]
 pics=port_b_??.png  # 4 frames
 hotspot=74 70
-playercolor=true
 
 [idle]
 pics=port_i_??.png  # 20 frames
 hotspot=74 70
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/quarry/conf'
--- tribes/atlanteans/quarry/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/quarry/conf	2014-03-16 21:52:17 +0000
@@ -25,4 +25,3 @@
 [idle]
 pics=quarry_i_??.png  # ???
 hotspot=40 45
-playercolor=true

=== modified file 'tribes/atlanteans/resi_coal1/conf'
--- tribes/atlanteans/resi_coal1/conf	2012-03-06 18:14:55 +0000
+++ tribes/atlanteans/resi_coal1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_coal2/conf'
--- tribes/atlanteans/resi_coal2/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/resi_coal2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_gold1/conf'
--- tribes/atlanteans/resi_gold1/conf	2012-03-06 18:14:55 +0000
+++ tribes/atlanteans/resi_gold1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_gold2/conf'
--- tribes/atlanteans/resi_gold2/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/resi_gold2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_granit1/conf'
--- tribes/atlanteans/resi_granit1/conf	2012-03-06 18:14:55 +0000
+++ tribes/atlanteans/resi_granit1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_granit2/conf'
--- tribes/atlanteans/resi_granit2/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/resi_granit2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_iron1/conf'
--- tribes/atlanteans/resi_iron1/conf	2012-03-06 18:14:55 +0000
+++ tribes/atlanteans/resi_iron1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_iron2/conf'
--- tribes/atlanteans/resi_iron2/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/resi_iron2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_none/conf'
--- tribes/atlanteans/resi_none/conf	2008-12-13 20:55:54 +0000
+++ tribes/atlanteans/resi_none/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/resi_water1/conf'
--- tribes/atlanteans/resi_water1/conf	2012-03-06 18:14:55 +0000
+++ tribes/atlanteans/resi_water1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/atlanteans/sawmill/conf'
--- tribes/atlanteans/sawmill/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/sawmill/conf	2014-03-16 21:52:17 +0000
@@ -32,10 +32,8 @@
 [idle]
 pics=sawmill_i_??.png  # ???
 hotspot=53 60
-playercolor=true
 
 [working]
 pics=sawmill_b_??.png  # ???
 hotspot=53 60
-playercolor=true
 fps=25

=== modified file 'tribes/atlanteans/sawyer/conf'
--- tribes/atlanteans/sawyer/conf	2014-02-24 21:12:30 +0000
+++ tribes/atlanteans/sawyer/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 31
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=16 31
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=16 31
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/scout/conf'
--- tribes/atlanteans/scout/conf	2014-02-24 21:12:30 +0000
+++ tribes/atlanteans/scout/conf	2014-03-16 21:52:17 +0000
@@ -11,17 +11,14 @@
 [idle]
 pics=idle_??.png
 hotspot=4 22
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/scouts_house/conf'
--- tribes/atlanteans/scouts_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/scouts_house/conf	2014-03-16 21:52:17 +0000
@@ -31,9 +31,7 @@
 [idle]
 pics=scouts_house_i_??.png  # ???
 hotspot=41 44
-playercolor=true
 
 [build]
 pics=scouts_house_b_??.png  # ???
 hotspot=41 44
-playercolor=true

=== modified file 'tribes/atlanteans/ship/conf'
--- tribes/atlanteans/ship/conf	2013-08-13 19:43:52 +0000
+++ tribes/atlanteans/ship/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=89 86
-playercolor=true
 fps=10
 
 [sail]
 dirpics=sail_!!_??.png
 hotspot=89 86
 fps=10
-playercolor=true
 
 [sinking]
 pics=sinking_??.png
 hotspot=89 86
-playercolor=false
 fps=7

=== modified file 'tribes/atlanteans/shipconstruction/conf'
--- tribes/atlanteans/shipconstruction/conf	2010-11-17 17:50:30 +0000
+++ tribes/atlanteans/shipconstruction/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=ship_i_00.png
 
 [buildcost]
 planks=10
@@ -14,4 +13,3 @@
 [idle]
 pics=ship-build_??.png
 hotspot=118 94
-playercolor=true

=== modified file 'tribes/atlanteans/shipwright/conf'
--- tribes/atlanteans/shipwright/conf	2013-03-02 20:35:18 +0000
+++ tribes/atlanteans/shipwright/conf	2014-03-16 21:52:17 +0000
@@ -18,17 +18,14 @@
 pics=idle_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=12 28
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=12 28
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=12 28
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/shipyard/conf'
--- tribes/atlanteans/shipyard/conf	2013-07-23 17:50:05 +0000
+++ tribes/atlanteans/shipyard/conf	2014-03-16 21:52:17 +0000
@@ -40,19 +40,15 @@
 [idle]
 pics=shipyard_i_??.png
 hotspot=53 66
-playercolor=true
 
 [build]
 pics=shipyard_b_??.png
 hotspot=53 66
-playercolor=true
 
 #[working]
 #pics=shipyard_i_??.png
 #hotspot=53 66
-#playercolor=true
 #
 #[outofhouse]
 #pics=shipyard_i_??.png
 #hotspot=53 66
-#playercolor=true

=== modified file 'tribes/atlanteans/small_tower/conf'
--- tribes/atlanteans/small_tower/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/small_tower/conf	2014-03-16 21:52:17 +0000
@@ -22,4 +22,3 @@
 [idle]
 pics=small_tower_i_??.png
 hotspot=42 65
-playercolor=true

=== modified file 'tribes/atlanteans/smelter/conf'
--- tribes/atlanteans/smelter/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/smelter/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=10 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=12 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=12 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/smelting_works/conf'
--- tribes/atlanteans/smelting_works/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/smelting_works/conf	2014-03-16 21:52:17 +0000
@@ -50,9 +50,7 @@
 [idle]
 pics=smelting_works_i_??.png  # ???
 hotspot=57 72
-playercolor=true
 
 [working]
 pics=smelting_works_i_??.png  # ???
 hotspot=57 72
-playercolor=true

=== modified file 'tribes/atlanteans/smoker/conf'
--- tribes/atlanteans/smoker/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/smoker/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=17 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=20 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_load_!!_??.png
 hotspot=20 24
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/smokery/conf'
--- tribes/atlanteans/smokery/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/smokery/conf	2014-03-16 21:52:17 +0000
@@ -52,10 +52,8 @@
 [idle]
 pics=smokery_i_??.png  # ???
 hotspot=53 58
-playercolor=true
 
 [working]
 pics=smokery_b_??.png  # ???
 hotspot=53 68
-playercolor=true
 fps=20

=== modified file 'tribes/atlanteans/soldier/conf'
--- tribes/atlanteans/soldier/conf	2012-03-14 21:05:00 +0000
+++ tribes/atlanteans/soldier/conf	2014-03-16 21:52:17 +0000
@@ -51,70 +51,58 @@
 pics=idle_??.png
 hotspot=10 36
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=20 34
 fps=10
-playercolor=true
 
 [atk_ok_e]
 pics=atk_ok_e_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [atk_fail_e]
 pics=atk_fail_e_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [eva_ok_e]
 pics=eva_ok_e_??.png
 hotspot=36 40
 fps=20
-playercolor=true
 
 [eva_fail_e]
 pics=eva_fail_e_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [atk_ok_w]
 pics=atk_ok_w_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [atk_fail_w]
 pics=atk_fail_w_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [eva_ok_w]
 pics=eva_ok_w_??.png
 hotspot=36 40
 fps=20
-playercolor=true
 
 [eva_fail_w]
 pics=eva_fail_w_??.png
 hotspot=36 40
 fps=10
-playercolor=true
 
 [die_w]
 pics=die_??.png
 hotspot=10 36
 fps=10
-playercolor=true
 
 [die_e]
 pics=die_??.png
 hotspot=10 36
 fps=10
-playercolor=true

=== modified file 'tribes/atlanteans/spiderfarm/conf'
--- tribes/atlanteans/spiderfarm/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/spiderfarm/conf	2014-03-16 21:52:17 +0000
@@ -31,9 +31,7 @@
 [idle]
 pics=spiderfarm_i_??.png  # ???
 hotspot=87 75
-playercolor=true
 
 [working]
 pics=spiderfarm_i_??.png  # ???
 hotspot=87 75
-playercolor=true

=== modified file 'tribes/atlanteans/stonecutter/conf'
--- tribes/atlanteans/stonecutter/conf	2014-03-03 20:50:30 +0000
+++ tribes/atlanteans/stonecutter/conf	2014-03-16 21:52:17 +0000
@@ -17,23 +17,19 @@
 [idle]
 pics=idle_??.png
 hotspot=7 20
-playercolor=true
 
 
 [hacking]
 pics=hacking_??.png
 hotspot=10 19
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 21
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/toolsmith/conf'
--- tribes/atlanteans/toolsmith/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/toolsmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=10 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/toolsmithy/conf'
--- tribes/atlanteans/toolsmithy/conf	2014-02-24 21:12:30 +0000
+++ tribes/atlanteans/toolsmithy/conf	2014-03-16 21:52:17 +0000
@@ -151,9 +151,7 @@
 [idle]
 pics=toolsmith_i_??.png
 hotspot=50 53
-playercolor=true
 
 [working]
 pics=toolsmith_i_??.png
 hotspot=50 53
-playercolor=true

=== modified file 'tribes/atlanteans/tower/conf'
--- tribes/atlanteans/tower/conf	2013-10-29 10:55:20 +0000
+++ tribes/atlanteans/tower/conf	2014-03-16 21:52:17 +0000
@@ -25,4 +25,3 @@
 [idle]
 pics=tower_i_??.png
 hotspot=55 60
-playercolor=true

=== modified file 'tribes/atlanteans/trainer/conf'
--- tribes/atlanteans/trainer/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/trainer/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=11 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=14 21
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=14 21
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/warehouse/conf'
--- tribes/atlanteans/warehouse/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/warehouse/conf	2014-03-16 21:52:17 +0000
@@ -17,4 +17,3 @@
 [idle]
 pics=warehouse_i_??.png  # ???
 hotspot=58 62
-playercolor=true

=== modified file 'tribes/atlanteans/weaponsmith/conf'
--- tribes/atlanteans/weaponsmith/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/weaponsmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=10 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/weaponsmithy/conf'
--- tribes/atlanteans/weaponsmithy/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/weaponsmithy/conf	2014-03-16 21:52:17 +0000
@@ -93,9 +93,7 @@
 [idle]
 pics=weaponsmith_i_??.png  # ???
 hotspot=50 58
-playercolor=true
 
 [working]
 pics=weaponsmith_i_??.png  # ???
 hotspot=50 58
-playercolor=true

=== modified file 'tribes/atlanteans/weaver/conf'
--- tribes/atlanteans/weaver/conf	2010-08-01 14:35:38 +0000
+++ tribes/atlanteans/weaver/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=2 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 22
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/weaving-mill/conf'
--- tribes/atlanteans/weaving-mill/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/weaving-mill/conf	2014-03-16 21:52:17 +0000
@@ -53,4 +53,3 @@
 [idle]
 pics=weaving_mill_i_??.png  # ???
 hotspot=65 69
-playercolor=true

=== modified file 'tribes/atlanteans/well/conf'
--- tribes/atlanteans/well/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/well/conf	2014-03-16 21:52:17 +0000
@@ -25,9 +25,7 @@
 [idle]
 pics=well_i_??.png  # ???
 hotspot=31 32
-playercolor=true
 
 [working]
 pics=well_i_??.png  # ???
 hotspot=31 32
-playercolor=true

=== modified file 'tribes/atlanteans/woodcutter/conf'
--- tribes/atlanteans/woodcutter/conf	2014-02-22 16:49:17 +0000
+++ tribes/atlanteans/woodcutter/conf	2014-03-16 21:52:17 +0000
@@ -18,22 +18,18 @@
 [sawing]
 pics=sawing_??.png
 hotspot=22 19
-playercolor=true
 fps=10
 
 [idle]
 pics=idle_??.png
 hotspot=8 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=16 31
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=13 29
-playercolor=true
 fps=10

=== modified file 'tribes/atlanteans/woodcutters_house/conf'
--- tribes/atlanteans/woodcutters_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/atlanteans/woodcutters_house/conf	2014-03-16 21:52:17 +0000
@@ -26,4 +26,3 @@
 [idle]
 pics=woodcutter_i_??.png
 hotspot=37 44
-playercolor=true

=== modified file 'tribes/barbarians/ashes/conf'
--- tribes/barbarians/ashes/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/ashes/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,4 @@
 program=program
-picture=ashes_00.png
-
 [program]
 animate=idle 45000
 remove=

=== modified file 'tribes/barbarians/axefactory/conf'
--- tribes/barbarians/axefactory/conf	2014-03-03 20:59:04 +0000
+++ tribes/barbarians/axefactory/conf	2014-03-16 21:52:17 +0000
@@ -70,20 +70,16 @@
 [build]
 pics=axefactory_b_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [unoccupied]
 pics=axefactory_u_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [idle]
 pics=axefactory_i_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [working]
 pics=axefactory_w_??.png  # ???
 hotspot=57 76
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/baker/conf'
--- tribes/barbarians/baker/conf	2012-02-15 21:25:34 +0000
+++ tribes/barbarians/baker/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/barrier/conf'
--- tribes/barbarians/barrier/conf	2013-10-29 10:55:20 +0000
+++ tribes/barbarians/barrier/conf	2014-03-16 21:52:17 +0000
@@ -20,7 +20,6 @@
 [idle]
 pics=barrier_i_??.png
 hotspot=44 62
-playercolor=true
 fps=10
 
 [build]

=== modified file 'tribes/barbarians/battlearena/conf'
--- tribes/barbarians/battlearena/conf	2014-03-12 19:11:45 +0000
+++ tribes/barbarians/battlearena/conf	2014-03-16 21:52:17 +0000
@@ -57,21 +57,17 @@
 [build]
 pics=battlearena_b_??.png
 hotspot=110 72
-playercolor=true
 
 [unoccupied]
 pics=battlearena_u_??.png
 hotspot=110 72
-playercolor=true
 
 [idle]
 pics=battlearena_i_??.png  # ???
 hotspot=110 72
-playercolor=true
 fps=10
 
 [working]
 pics=battlearena_w_??.png  # ???
 hotspot=110 72
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/blacksmith/conf'
--- tribes/barbarians/blacksmith/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/blacksmith/conf	2014-03-16 21:52:17 +0000
@@ -9,16 +9,13 @@
 [idle]
 pics=idle_??.png
 hotspot=6 28
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 24
-playercolor=true
 fps=15
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=11 24
-playercolor=true
-fps=15
\ No newline at end of file
+fps=15

=== modified file 'tribes/barbarians/brewer/conf'
--- tribes/barbarians/brewer/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/brewer/conf	2014-03-16 21:52:17 +0000
@@ -8,16 +8,13 @@
 [idle]
 pics=idle_??.png
 hotspot=7 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=12 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 24
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/builder/conf'
--- tribes/barbarians/builder/conf	2014-02-24 21:12:30 +0000
+++ tribes/barbarians/builder/conf	2014-03-16 21:52:17 +0000
@@ -7,24 +7,20 @@
 [idle]
 pics=waiting_???.png
 hotspot=11 21
-playercolor=true
 fps=10
 
 [work]
 pics=work_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=10 21
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=7 22
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/burner/conf'
--- tribes/barbarians/burner/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/burner/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=6 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/carrier/conf'
--- tribes/barbarians/carrier/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/carrier/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 pics=idle_??.png
 hotspot=14 21
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 19
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=7 22
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/cattlebreeder/conf'
--- tribes/barbarians/cattlebreeder/conf	2014-02-24 21:12:30 +0000
+++ tribes/barbarians/cattlebreeder/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=3 21
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=42 30
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=42 30
-playercolor=true
 fps=20

=== modified file 'tribes/barbarians/chief-miner/conf'
--- tribes/barbarians/chief-miner/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/chief-miner/conf	2014-03-16 21:52:17 +0000
@@ -5,16 +5,13 @@
 [idle]
 pics=idle_??.png
 hotspot=3 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/citadel/conf'
--- tribes/barbarians/citadel/conf	2013-10-29 10:55:20 +0000
+++ tribes/barbarians/citadel/conf	2014-03-16 21:52:17 +0000
@@ -35,5 +35,4 @@
 [idle]
 pics=citadel_i_??.png
 hotspot=102 102
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/coalmine/conf'
--- tribes/barbarians/coalmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/coalmine/conf	2014-03-16 21:52:17 +0000
@@ -33,19 +33,15 @@
 [idle]
 pics=coalmine_i_??.png
 hotspot=21 36
-playercolor=true
 
 [build]
 pics=coalmine_b_??.png
 hotspot=21 36
-playercolor=true
 
 [working]
 pics=coalmine_w_??.png
 hotspot=21 36
-playercolor=true
 
 [empty]
 pics=coalmine_e_??.png
 hotspot=21 36
-playercolor=true

=== modified file 'tribes/barbarians/conf'
--- tribes/barbarians/conf	2014-03-12 19:11:45 +0000
+++ tribes/barbarians/conf	2014-03-16 21:52:17 +0000
@@ -19,7 +19,6 @@
 name=frontier
 pics=pics/frontier_??.png
 hotspot=1 19
-playercolor=true
 
 
 [flag]
@@ -27,7 +26,6 @@
 pics=pics/flag_??.png
 hotspot=10 38
 fps=5
-playercolor=true
 
 [immovable types]
 ashes=_Ashes

=== modified file 'tribes/barbarians/deep_coalmine/conf'
--- tribes/barbarians/deep_coalmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deep_coalmine/conf	2014-03-16 21:52:17 +0000
@@ -39,19 +39,15 @@
 [idle]
 pics=deep_coalmine_i_??.png
 hotspot=21 37
-playercolor=true
 
 [build]
 pics=deep_coalmine_b_??.png
 hotspot=21 37
-playercolor=true
 
 [working]
 pics=deep_coalmine_w_??.png
 hotspot=21 37
-playercolor=true
 
 [empty]
 pics=deep_coalmine_e_??.png
 hotspot=21 37
-playercolor=true

=== modified file 'tribes/barbarians/deep_goldmine/conf'
--- tribes/barbarians/deep_goldmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deep_goldmine/conf	2014-03-16 21:52:17 +0000
@@ -39,19 +39,15 @@
 [idle]
 pics=deep_goldmine_i_??.png
 hotspot=21 37
-playercolor=true
 
 [build]
 pics=deep_goldmine_b_??.png
 hotspot=21 37
-playercolor=true
 
 [working]
 pics=deep_goldmine_w_??.png
 hotspot=21 37
-playercolor=true
 
 [empty]
 pics=deep_goldmine_e_??.png
 hotspot=21 37
-playercolor=true

=== modified file 'tribes/barbarians/deep_oremine/conf'
--- tribes/barbarians/deep_oremine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deep_oremine/conf	2014-03-16 21:52:17 +0000
@@ -39,19 +39,15 @@
 [build]
 pics=deep_oremine_b_??.png
 hotspot=21 37
-playercolor=true
 
 [idle]
 pics=deep_oremine_i_??.png
 hotspot=21 37
-playercolor=true
 
 [working]
 pics=deep_oremine_w_??.png
 hotspot=21 37
-playercolor=true
 
 [empty]
 pics=deep_oremine_e_??.png
 hotspot=21 37
-playercolor=true

=== modified file 'tribes/barbarians/deeper_coalmine/conf'
--- tribes/barbarians/deeper_coalmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deeper_coalmine/conf	2014-03-16 21:52:17 +0000
@@ -38,19 +38,15 @@
 [idle]
 pics=deeper_coalmine_i_??.png
 hotspot=60 37
-playercolor=true
 
 [working]
 pics=deeper_coalmine_w_??.png
 hotspot=60 37
-playercolor=true
 
 [build]
 pics=deeper_coalmine_b_??.png
 hotspot=60 37
-playercolor=true
 
 [empty]
 pics=deeper_coalmine_e_??.png
 hotspot=60 37
-playercolor=true

=== modified file 'tribes/barbarians/deeper_goldmine/conf'
--- tribes/barbarians/deeper_goldmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deeper_goldmine/conf	2014-03-16 21:52:17 +0000
@@ -38,19 +38,15 @@
 [idle]
 pics=deeper_goldmine_i_??.png
 hotspot=60 37
-playercolor=true
 
 [working]
 pics=deeper_goldmine_w_??.png
 hotspot=60 37
-playercolor=true
 
 [build]
 pics=deeper_goldmine_b_??.png
 hotspot=60 37
-playercolor=true
 
 [empty]
 pics=deeper_goldmine_e_??.png
 hotspot=60 37
-playercolor=true

=== modified file 'tribes/barbarians/deeper_oremine/conf'
--- tribes/barbarians/deeper_oremine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/deeper_oremine/conf	2014-03-16 21:52:17 +0000
@@ -41,19 +41,15 @@
 [idle]
 pics=deeper_oremine_i_??.png
 hotspot=60 37
-playercolor=true
 
 [working]
 pics=deeper_oremine_w_??.png
 hotspot=60 37
-playercolor=true
 
 [build]
 pics=deeper_oremine_b_??.png
 hotspot=60 37
-playercolor=true
 
 [empty]
 pics=deeper_oremine_e_??.png
 hotspot=60 37
-playercolor=true

=== modified file 'tribes/barbarians/destroyed_building/conf'
--- tribes/barbarians/destroyed_building/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/destroyed_building/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=big
 program=program
-picture=fire_burn_00.png
 
 [program]
 animate=burn 30000

=== modified file 'tribes/barbarians/donjon/conf'
--- tribes/barbarians/donjon/conf	2013-10-29 10:55:20 +0000
+++ tribes/barbarians/donjon/conf	2014-03-16 21:52:17 +0000
@@ -27,7 +27,6 @@
 [idle]
 pics=donjon_i_??.png
 hotspot=48 84
-playercolor=true
 fps=10
 
 [unoccupied]

=== modified file 'tribes/barbarians/farmer/conf'
--- tribes/barbarians/farmer/conf	2014-02-22 16:49:17 +0000
+++ tribes/barbarians/farmer/conf	2014-03-16 21:52:17 +0000
@@ -27,34 +27,28 @@
 [idle]
 pics=idle_??.png
 hotspot=10 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=18 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=16 23
-playercolor=true
 fps=10
 
 [planting]
 pics=plant_??.png
 hotspot=14 25
-playercolor=true
 fps=10
 
 [harvesting]
 pics=harvest_??.png
 hotspot=19 23
-playercolor=true
 fps=10
 
 [gathering]
 pics=gather_??.png
 hotspot=9 23
-playercolor=true
 fps=5

=== modified file 'tribes/barbarians/ferner/conf'
--- tribes/barbarians/ferner/conf	2014-03-12 19:11:45 +0000
+++ tribes/barbarians/ferner/conf	2014-03-16 21:52:17 +0000
@@ -26,28 +26,23 @@
 [idle]
 pics=idle_??.png
 hotspot=-4 11
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=7 23
-playercolor=true
 fps=10
 
 [reedplanting]
 pics=plantreed_??.png
 hotspot=10 21
-playercolor=true
 fps=10
 
 [harvesting]
 pics=harvest_??.png
 hotspot=10 22
-playercolor=true
 fps=5

=== modified file 'tribes/barbarians/field0/conf'
--- tribes/barbarians/field0/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/field0/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0m_00.png
 
 [program]
 animate=midd 50000

=== modified file 'tribes/barbarians/field0s/conf'
--- tribes/barbarians/field0s/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/field0s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0s_00.png
 
 [program]
 animate=small 45000

=== modified file 'tribes/barbarians/field0t/conf'
--- tribes/barbarians/field0t/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/field0t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0t_00.png
 
 [program]
 animate=tiny 30000

=== modified file 'tribes/barbarians/field1/conf'
--- tribes/barbarians/field1/conf	2009-11-12 13:49:04 +0000
+++ tribes/barbarians/field1/conf	2014-03-16 21:52:17 +0000
@@ -11,5 +11,5 @@
 transform=field2
 
 [idle]
-pics=field1_??.bmp
+pics=field1_??
 hotspot=15 18

=== modified file 'tribes/barbarians/field2/conf'
--- tribes/barbarians/field2/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/field2/conf	2014-03-16 21:52:17 +0000
@@ -5,5 +5,5 @@
 remove=
 
 [idle]
-pics=field2_??.bmp
+pics=field2_??.png
 hotspot=15 18

=== modified file 'tribes/barbarians/fisher/conf'
--- tribes/barbarians/fisher/conf	2014-03-03 20:50:30 +0000
+++ tribes/barbarians/fisher/conf	2014-03-16 21:52:17 +0000
@@ -18,17 +18,14 @@
 [idle]
 pics=fishing_??.png
 hotspot=9 39
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 38
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=10 38
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/fortress/conf'
--- tribes/barbarians/fortress/conf	2013-10-29 10:55:20 +0000
+++ tribes/barbarians/fortress/conf	2014-03-16 21:52:17 +0000
@@ -33,5 +33,4 @@
 [idle]
 pics=fortress_i_??.png
 hotspot=103 80
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/gamekeeper/conf'
--- tribes/barbarians/gamekeeper/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/gamekeeper/conf	2014-03-16 21:52:17 +0000
@@ -17,24 +17,20 @@
 pics=releasein_??.png
 hotspot=15 22
 fps=5
-playercolor=true
 
 [releaseout]
 pics=releaseout_??.png
 hotspot=15 22
 fps=5
-playercolor=true
 
 [idle]
 pics=idle_??.png
 hotspot=14 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=15 22
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png

=== removed file 'tribes/barbarians/gamekeeper/idle_00_pc.png'
Binary files tribes/barbarians/gamekeeper/idle_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/idle_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_00_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_01_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_02_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_03_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_04_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_05_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_06_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_07_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_08_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releasein_09_pc.png'
Binary files tribes/barbarians/gamekeeper/releasein_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releasein_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_00_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_01_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_02_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_03_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_04_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_05_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_06_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_07_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_08_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/releaseout_09_pc.png'
Binary files tribes/barbarians/gamekeeper/releaseout_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/releaseout_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_e_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_e_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_e_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_ne_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_ne_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_ne_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_nw_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_nw_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_nw_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_se_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_se_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_se_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_sw_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_sw_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_sw_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_00_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_01_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_01_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_01_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_02_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_02_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_02_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_03_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_03_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_03_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_04_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_04_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_04_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_05_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_05_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_05_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_06_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_06_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_06_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_07_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_07_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_07_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_08_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_08_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_08_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_09_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_09_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_09_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_10_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_10_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_10_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_11_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_11_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_11_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_12_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_12_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_12_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_13_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_13_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_13_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_14_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_14_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_14_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_15_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_15_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_15_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_16_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_16_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_16_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_17_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_17_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_17_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_18_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_18_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_18_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walk_w_19_pc.png'
Binary files tribes/barbarians/gamekeeper/walk_w_19_pc.png	2010-08-01 14:35:38 +0000 and tribes/barbarians/gamekeeper/walk_w_19_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_e_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_e_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_e_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_ne_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_ne_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_ne_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_nw_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_nw_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_nw_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_se_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_se_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_se_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_sw_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_sw_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_sw_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'tribes/barbarians/gamekeeper/walkload_w_00_pc.png'
Binary files tribes/barbarians/gamekeeper/walkload_w_00_pc.png	2009-09-28 21:04:09 +0000 and tribes/barbarians/gamekeeper/walkload_w_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== modified file 'tribes/barbarians/geologist/conf'
--- tribes/barbarians/geologist/conf	2013-03-02 20:35:18 +0000
+++ tribes/barbarians/geologist/conf	2014-03-16 21:52:17 +0000
@@ -24,22 +24,18 @@
 pics=idle_??.png
 hotspot=9 21
 fps=10
-playercolor=true
 
 [hacking]
 pics=hacking_??.png
 hotspot=11 18
 fps=10
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 21
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 21
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/goldmine/conf'
--- tribes/barbarians/goldmine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/goldmine/conf	2014-03-16 21:52:17 +0000
@@ -34,19 +34,15 @@
 [idle]
 pics=goldmine_i_??.png
 hotspot=21 36
-playercolor=true
 
 [build]
 pics=goldmine_b_??.png
 hotspot=21 36
-playercolor=true
 
 [working]
 pics=goldmine_w_??.png
 hotspot=21 36
-playercolor=true
 
 [empty]
 pics=goldmine_e_??.png
 hotspot=21 36
-playercolor=true

=== modified file 'tribes/barbarians/granitemine/conf'
--- tribes/barbarians/granitemine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/granitemine/conf	2014-03-16 21:52:17 +0000
@@ -31,19 +31,15 @@
 [idle]
 pics=granitemine_i_??.png
 hotspot=42 35
-playercolor=true
 
 [working]
 pics=granitemine_w_??.png
 hotspot=42 35
-playercolor=true
 
 [build]
 pics=granitemine_b_??.png
 hotspot=42 35
-playercolor=true
 
 [empty]
 pics=granitemine_e_??.png
 hotspot=42 35
-playercolor=true

=== modified file 'tribes/barbarians/headquarters/conf'
--- tribes/barbarians/headquarters/conf	2013-03-02 20:35:18 +0000
+++ tribes/barbarians/headquarters/conf	2014-03-16 21:52:17 +0000
@@ -12,5 +12,4 @@
 pics=headquarters_i_??.png
 # sfx=0 ../../../sound/spoken/warehouse-bringitin
 hotspot=90 96
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/headquarters_interim/conf'
--- tribes/barbarians/headquarters_interim/conf	2012-03-14 21:36:03 +0000
+++ tribes/barbarians/headquarters_interim/conf	2014-03-16 21:52:17 +0000
@@ -10,4 +10,3 @@
 [idle]
 pics=headquarters_interim_i_??.png
 hotspot=64 106
-playercolor=true

=== modified file 'tribes/barbarians/helmsmith/conf'
--- tribes/barbarians/helmsmith/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/helmsmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=4 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 21
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=7 21
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/helmsmithy/conf'
--- tribes/barbarians/helmsmithy/conf	2014-02-25 14:45:19 +0000
+++ tribes/barbarians/helmsmithy/conf	2014-03-16 21:52:17 +0000
@@ -64,20 +64,16 @@
 [idle]
 pics=helmsmithy_i_??.png  # ???
 hotspot=65 83
-playercolor=true
 
 [build]
 pics=helmsmithy_b_??.png  # ???
 hotspot=65 83
-playercolor=true
 
 [unoccupied]
 pics=helmsmithy_u_??.png  # ???
 hotspot=65 83
-playercolor=true
 
 [working]
 pics=helmsmithy_w_??.png  # ???
 hotspot=65 83
-playercolor=true
 fps=20

=== modified file 'tribes/barbarians/hunter/conf'
--- tribes/barbarians/hunter/conf	2014-02-22 16:49:17 +0000
+++ tribes/barbarians/hunter/conf	2014-03-16 21:52:17 +0000
@@ -16,17 +16,14 @@
 [idle]
 pics=idle_??.png
 hotspot=13 26
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/innkeeper/conf'
--- tribes/barbarians/innkeeper/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/innkeeper/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=9 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=10 24
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/lime-burner/conf'
--- tribes/barbarians/lime-burner/conf	2012-02-15 21:25:34 +0000
+++ tribes/barbarians/lime-burner/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 pics=idle_??.png
 hotspot=4 23
 fps=1
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 23
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 27
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/lumberjack/conf'
--- tribes/barbarians/lumberjack/conf	2014-02-22 16:49:17 +0000
+++ tribes/barbarians/lumberjack/conf	2014-03-16 21:52:17 +0000
@@ -20,21 +20,17 @@
 pics=hacking_??.png
 hotspot=19 17
 fps=10
-playercolor=true
 
 [idle]
 pics=idle_??.png
 hotspot=5 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 22
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=10 21
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/mask/conf'
--- tribes/barbarians/mask/conf	2014-02-25 14:45:19 +0000
+++ tribes/barbarians/mask/conf	2014-03-16 21:52:17 +0000
@@ -5,4 +5,3 @@
 [idle]
 pics=idle.png
 hotspot=7 10
-playercolor=true

=== modified file 'tribes/barbarians/master-blacksmith/conf'
--- tribes/barbarians/master-blacksmith/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/master-blacksmith/conf	2014-03-16 21:52:17 +0000
@@ -3,16 +3,13 @@
 [idle]
 pics=idle_??.png
 hotspot=3 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/master-brewer/conf'
--- tribes/barbarians/master-brewer/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/master-brewer/conf	2014-03-16 21:52:17 +0000
@@ -3,16 +3,13 @@
 [idle]
 pics=idle_??.png
 hotspot=8 26
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=15 26
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 24
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/master-miner/conf'
--- tribes/barbarians/master-miner/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/master-miner/conf	2014-03-16 21:52:17 +0000
@@ -3,16 +3,13 @@
 [idle]
 pics=idle_??.png
 hotspot=3 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/metalworks/conf'
--- tribes/barbarians/metalworks/conf	2014-03-12 19:11:45 +0000
+++ tribes/barbarians/metalworks/conf	2014-03-16 21:52:17 +0000
@@ -143,20 +143,16 @@
 [build]
 pics=metalworks_b_??.png
 hotspot=57 76
-playercolor=true
 
 [unoccupied]
 pics=metalworks_u_??.png
 hotspot=57 76
-playercolor=true
 
 [idle]
 pics=metalworks_i_??.png
 hotspot=57 76
-playercolor=true
 
 [working]
 pics=metalworks_w_??.png
 hotspot=57 76
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/miner/conf'
--- tribes/barbarians/miner/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/miner/conf	2014-03-16 21:52:17 +0000
@@ -13,11 +13,9 @@
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 23
-playercolor=true
 fps=10

=== removed file 'tribes/barbarians/miner/idle_00_pc.png'
Binary files tribes/barbarians/miner/idle_00_pc.png	2010-05-07 04:39:42 +0000 and tribes/barbarians/miner/idle_00_pc.png	1970-01-01 00:00:00 +0000 differ
=== modified file 'tribes/barbarians/oremine/conf'
--- tribes/barbarians/oremine/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/oremine/conf	2014-03-16 21:52:17 +0000
@@ -34,19 +34,15 @@
 [idle]
 pics=oremine_i_??.png
 hotspot=21 36
-playercolor=true
 
 [build]
 pics=oremine_b_??.png
 hotspot=21 36
-playercolor=true
 
 [working]
 pics=oremine_w_??.png
 hotspot=21 36
-playercolor=true
 
 [empty]
 pics=oremine_e_??.png
 hotspot=21 36
-playercolor=true

=== modified file 'tribes/barbarians/port/conf'
--- tribes/barbarians/port/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/port/conf	2014-03-16 21:52:17 +0000
@@ -27,5 +27,4 @@
 [idle]
 pics=port_i_??.png  # 20 frames
 hotspot=67 80
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/ranger/conf'
--- tribes/barbarians/ranger/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/ranger/conf	2014-03-16 21:52:17 +0000
@@ -17,34 +17,28 @@
 [idle]
 pics=idle_??.png
 hotspot=11 23
-playercolor=true
 
 [dig]
 pics=dig_??.png
 hotspot=12 24
 fps=5
-playercolor=true
 
 [crop]
 pics=plant_??.png
 hotspot=18 24
 fps=10
-playercolor=true
 
 [water]
 pics=water_??.png
 hotspot=19 25
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 23
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 23
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/reed0/conf'
--- tribes/barbarians/reed0/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/reed0/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0m_00.png
 
 [program]
 animate=midd 40000

=== modified file 'tribes/barbarians/reed0s/conf'
--- tribes/barbarians/reed0s/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/reed0s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0s_00.png
 
 [program]
 animate=small 28000

=== modified file 'tribes/barbarians/reed0t/conf'
--- tribes/barbarians/reed0t/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/reed0t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0t_00.png
 
 [program]
 animate=tiny 22000

=== modified file 'tribes/barbarians/resi_coal1/conf'
--- tribes/barbarians/resi_coal1/conf	2012-03-06 18:14:55 +0000
+++ tribes/barbarians/resi_coal1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_coal2/conf'
--- tribes/barbarians/resi_coal2/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/resi_coal2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_gold1/conf'
--- tribes/barbarians/resi_gold1/conf	2012-03-06 18:14:55 +0000
+++ tribes/barbarians/resi_gold1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_gold2/conf'
--- tribes/barbarians/resi_gold2/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/resi_gold2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_granit1/conf'
--- tribes/barbarians/resi_granit1/conf	2012-03-06 18:14:55 +0000
+++ tribes/barbarians/resi_granit1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_granit2/conf'
--- tribes/barbarians/resi_granit2/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/resi_granit2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_iron1/conf'
--- tribes/barbarians/resi_iron1/conf	2012-03-06 18:14:55 +0000
+++ tribes/barbarians/resi_iron1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_iron2/conf'
--- tribes/barbarians/resi_iron2/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/resi_iron2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_none/conf'
--- tribes/barbarians/resi_none/conf	2008-12-13 20:55:54 +0000
+++ tribes/barbarians/resi_none/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/resi_water1/conf'
--- tribes/barbarians/resi_water1/conf	2012-03-06 18:14:55 +0000
+++ tribes/barbarians/resi_water1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/barbarians/scout/conf'
--- tribes/barbarians/scout/conf	2014-02-24 21:12:30 +0000
+++ tribes/barbarians/scout/conf	2014-03-16 21:52:17 +0000
@@ -12,16 +12,13 @@
 pics=idle_??.png
 hotspot=4 23
 fps=10
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 25
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 25
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/sentry/conf'
--- tribes/barbarians/sentry/conf	2013-10-29 10:55:20 +0000
+++ tribes/barbarians/sentry/conf	2014-03-16 21:52:17 +0000
@@ -18,7 +18,6 @@
 [idle]
 pics=sentry_i_??.png
 hotspot=39 40
-playercolor=true
 fps=10
 
 [build]

=== modified file 'tribes/barbarians/ship/conf'
--- tribes/barbarians/ship/conf	2013-05-26 09:23:29 +0000
+++ tribes/barbarians/ship/conf	2014-03-16 21:52:17 +0000
@@ -6,11 +6,9 @@
 [idle]
 pics=ship_i_??.png
 hotspot=115 76
-playercolor=true
 fps=10
 
 [sail]
 dirpics=sail_!!_??.png
 hotspot=115 76
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/shipconstruction/conf'
--- tribes/barbarians/shipconstruction/conf	2012-02-20 15:54:26 +0000
+++ tribes/barbarians/shipconstruction/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=build_06.png
 
 [buildcost]
 blackwood=10
@@ -14,4 +13,3 @@
 [idle]
 pics=build_??.png
 hotspot=115 82
-playercolor=true

=== modified file 'tribes/barbarians/shipwright/conf'
--- tribes/barbarians/shipwright/conf	2013-03-02 20:35:18 +0000
+++ tribes/barbarians/shipwright/conf	2014-03-16 21:52:17 +0000
@@ -18,23 +18,19 @@
 pics=work_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=11 26
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 22
-playercolor=true
 fps=10
 
 [idle]
 pics=idle_??.png
 hotspot=11 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/shipyard/conf'
--- tribes/barbarians/shipyard/conf	2013-07-23 17:50:05 +0000
+++ tribes/barbarians/shipyard/conf	2014-03-16 21:52:17 +0000
@@ -40,19 +40,15 @@
 [idle]
 pics=work_??.png
 hotspot=62 48
-playercolor=true
 
 [build]
 pics=build_??.png
 hotspot=62 48
-playercolor=true
 
 [working]
 pics=work_??.png
 hotspot=62 48
-playercolor=true
 
 [unoccupied]
 pics=vacant_??.png
 hotspot=62 48
-playercolor=true

=== modified file 'tribes/barbarians/smelter/conf'
--- tribes/barbarians/smelter/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/smelter/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=7 21
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=18 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 27
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/soldier/conf'
--- tribes/barbarians/soldier/conf	2012-03-14 21:05:00 +0000
+++ tribes/barbarians/soldier/conf	2014-03-16 21:52:17 +0000
@@ -52,71 +52,59 @@
 [idle]
 pics=idle_??.png
 hotspot=16 31
-playercolor=true
 fps=5
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=16 31
 fps=10
-playercolor=true
 
 [atk_ok_e]
 pics=atk_ok_e_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [atk_fail_e]
 pics=atk_fail_e_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [eva_ok_e]
 pics=eva_ok_e_??.png
 hotspot=18 34
-playercolor=true
 fps=20
 
 [eva_fail_e]
 pics=eva_fail_e_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [atk_ok_w]
 pics=atk_ok_w_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [atk_fail_w]
 pics=atk_fail_w_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [eva_ok_w]
 pics=eva_ok_w_??.png
 hotspot=18 34
-playercolor=true
 fps=20
 
 [eva_fail_w]
 pics=eva_fail_w_??.png
 hotspot=30 36
-playercolor=true
 fps=10
 
 [die_w]
 pics=die_??.png
 hotspot=16 31
-playercolor=true
 fps=20
 
 [die_e]
 pics=die_??.png
 hotspot=16 31
-playercolor=true
 fps=20

=== modified file 'tribes/barbarians/stonemason/conf'
--- tribes/barbarians/stonemason/conf	2014-03-03 20:50:30 +0000
+++ tribes/barbarians/stonemason/conf	2014-03-16 21:52:17 +0000
@@ -18,22 +18,18 @@
 pics=idle_??.png
 hotspot=8 21
 fps=10
-playercolor=true
 
 [hacking]
 pics=hacking_??.png
 hotspot=8 25
 fps=10
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 24
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=7 22
 fps=10
-playercolor=true

=== modified file 'tribes/barbarians/trainer/conf'
--- tribes/barbarians/trainer/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/trainer/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=4 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/trainingscamp/conf'
--- tribes/barbarians/trainingscamp/conf	2014-03-10 10:45:21 +0000
+++ tribes/barbarians/trainingscamp/conf	2014-03-16 21:52:17 +0000
@@ -121,5 +121,4 @@
 [idle]
 pics=trainingscamp_i_??.png  # ???
 hotspot=110 75
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/warhelmet/conf'
--- tribes/barbarians/warhelmet/conf	2014-02-25 14:45:19 +0000
+++ tribes/barbarians/warhelmet/conf	2014-03-16 21:52:17 +0000
@@ -4,4 +4,3 @@
 [idle]
 pics=idle.png
 hotspot=7 12
-playercolor=true

=== modified file 'tribes/barbarians/warmill/conf'
--- tribes/barbarians/warmill/conf	2014-03-03 20:59:04 +0000
+++ tribes/barbarians/warmill/conf	2014-03-16 21:52:17 +0000
@@ -107,20 +107,16 @@
 [build]
 pics=warmill_b_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [unoccupied]
 pics=warmill_u_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [idle]
 pics=warmill_i_??.png  # ???
 hotspot=57 76
-playercolor=true
 
 [working]
 pics=warmill_w_??.png  # ???
 hotspot=57 76
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/weaver/conf'
--- tribes/barbarians/weaver/conf	2010-08-01 14:35:38 +0000
+++ tribes/barbarians/weaver/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 28
-playercolor=true
 fps=10

=== modified file 'tribes/barbarians/well/conf'
--- tribes/barbarians/well/conf	2013-07-22 11:45:41 +0000
+++ tribes/barbarians/well/conf	2014-03-16 21:52:17 +0000
@@ -25,14 +25,11 @@
 [idle]
 pics=well_i_??.png
 hotspot=19 33
-playercolor=true
 
 [working]
 pics=well_w_??.png
 hotspot=19 33
-playercolor=true
 
 [build]
 pics=well_b_??.png
 hotspot=19 33
-playercolor=true

=== modified file 'tribes/empire/armoursmith/conf'
--- tribes/empire/armoursmith/conf	2014-02-25 14:45:19 +0000
+++ tribes/empire/armoursmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=8 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/armoursmithy/conf'
--- tribes/empire/armoursmithy/conf	2014-02-25 14:45:19 +0000
+++ tribes/empire/armoursmithy/conf	2014-03-16 21:52:17 +0000
@@ -77,7 +77,6 @@
 [idle]
 pics=armory_i_??.png  # ???
 hotspot=50 62
-playercolor=true
 
 [build]
 pics=armory_b_??.png  # ???
@@ -86,5 +85,4 @@
 [working]
 pics=armory_w_??.png  # ???
 hotspot=50 62
-playercolor=true
 fps=5

=== modified file 'tribes/empire/ashes/conf'
--- tribes/empire/ashes/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/ashes/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=ashes_00.png
 
 [program]
 animate=idle 45000

=== modified file 'tribes/empire/baker/conf'
--- tribes/empire/baker/conf	2012-02-15 21:25:34 +0000
+++ tribes/empire/baker/conf	2014-03-16 21:52:17 +0000
@@ -7,14 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 26
-playercolor=true
 
 [walk]
+dirpics=walk_!!_??.png
 hotspot=14 27
-playercolor=true
 fps=10
 
 [walkload]
+dirpics=walkload_!!_??.png
 hotspot=14 27
-playercolor=true
 fps=10

=== modified file 'tribes/empire/brewer/conf'
--- tribes/empire/brewer/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/brewer/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=8 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=14 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=10 22
-playercolor=true
 fps=10

=== modified file 'tribes/empire/builder/conf'
--- tribes/empire/builder/conf	2014-02-24 21:12:30 +0000
+++ tribes/empire/builder/conf	2014-03-16 21:52:17 +0000
@@ -7,24 +7,20 @@
 [idle]
 pics=waiting_???.png
 hotspot=13 21
-playercolor=true
 fps=10
 
 [work]
 pics=work_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=11 21
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=11 23
-playercolor=true
 fps=10

=== modified file 'tribes/empire/burner/conf'
--- tribes/empire/burner/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/burner/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=11 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=21 28
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=17 27
-playercolor=true
 fps=10

=== modified file 'tribes/empire/carpenter/conf'
--- tribes/empire/carpenter/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/carpenter/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=7 29
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 30
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=11 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/carrier/conf'
--- tribes/empire/carrier/conf	2010-08-01 14:35:38 +0000
+++ tribes/empire/carrier/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 pics=idle_??.png
 hotspot=7 22
 fps=10
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=7 20
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 22
 fps=10
-playercolor=true

=== modified file 'tribes/empire/conf'
--- tribes/empire/conf	2014-03-10 09:15:02 +0000
+++ tribes/empire/conf	2014-03-16 21:52:17 +0000
@@ -19,7 +19,6 @@
 name=frontier
 pics=pics/frontier_??.png
 hotspot=1 19
-playercolor=true
 
 # Not just a plain color, maybe a cross or some stribes
 [flag]
@@ -27,7 +26,6 @@
 pics=pics/flag_??.png
 hotspot=14 38
 fps=10
-playercolor=true
 
 [immovable types]
 ashes=_Ashes

=== modified file 'tribes/empire/destroyed_building/conf'
--- tribes/empire/destroyed_building/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/destroyed_building/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=big
 program=program
-picture=fire_burn_00.png
 
 [program]
 animate=burn 30000

=== modified file 'tribes/empire/donkeybreeder/conf'
--- tribes/empire/donkeybreeder/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/donkeybreeder/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=19 23
-playercolor=true
 fps=20
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=28 26
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=28 26
-playercolor=true
 fps=20

=== modified file 'tribes/empire/farmer/conf'
--- tribes/empire/farmer/conf	2014-02-22 16:49:17 +0000
+++ tribes/empire/farmer/conf	2014-03-16 21:52:17 +0000
@@ -27,34 +27,28 @@
 [idle]
 pics=idle_??.png
 hotspot=10 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=18 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=18 24
-playercolor=true
 fps=10
 
 [planting]
 pics=plant_??.png
 hotspot=14 25
-playercolor=true
 fps=10
 
 [harvesting]
 pics=harvest_??.png
 hotspot=19 24
-playercolor=true
 fps=10
 
 [gathering]
 pics=gather_??.png
 hotspot=10 23
-playercolor=true
 fps=5

=== modified file 'tribes/empire/field0/conf'
--- tribes/empire/field0/conf	2010-08-01 14:35:38 +0000
+++ tribes/empire/field0/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0m_00.png
 
 [program]
 animate=midd 50000

=== modified file 'tribes/empire/field0s/conf'
--- tribes/empire/field0s/conf	2010-08-01 14:35:38 +0000
+++ tribes/empire/field0s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0s_00.png
 
 [program]
 animate=small 45000

=== modified file 'tribes/empire/field0t/conf'
--- tribes/empire/field0t/conf	2010-08-01 14:35:38 +0000
+++ tribes/empire/field0t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=field0t_00.png
 
 [program]
 animate=tiny 30000

=== modified file 'tribes/empire/fisher/conf'
--- tribes/empire/fisher/conf	2014-03-03 20:50:30 +0000
+++ tribes/empire/fisher/conf	2014-03-16 21:52:17 +0000
@@ -18,23 +18,19 @@
 [idle]
 pics=idle_??.png
 hotspot=7 38
-playercolor=true
 fps=10
 
 [fishing]
 pics=fishing_??.png
 hotspot=9 39
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 38
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=10 38
-playercolor=true
 fps=20

=== modified file 'tribes/empire/forester/conf'
--- tribes/empire/forester/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/forester/conf	2014-03-16 21:52:17 +0000
@@ -17,34 +17,28 @@
 [idle]
 pics=idle_??.png
 hotspot=3 23
-playercolor=true
 
 [dig]
 pics=dig_??.png
 hotspot=5 24
 fps=5
-playercolor=true
 
 [crop]
 pics=plant_??.png
 hotspot=18 23
 fps=10
-playercolor=true
 
 [water]
 pics=water_??.png
 hotspot=18 26
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 23
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=10 23
 fps=10
-playercolor=true

=== modified file 'tribes/empire/geologist/conf'
--- tribes/empire/geologist/conf	2013-03-02 20:35:18 +0000
+++ tribes/empire/geologist/conf	2014-03-16 21:52:17 +0000
@@ -24,22 +24,18 @@
 pics=idle_??.png
 hotspot=9 21
 fps=10
-playercolor=true
 
 [hacking]
 pics=hacking_??.png
 hotspot=11 18
 fps=10
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 21
 fps=10
-playercolor=true
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 21
 fps=10
-playercolor=true

=== modified file 'tribes/empire/headquarters_shipwreck/conf'
--- tribes/empire/headquarters_shipwreck/conf	2013-03-02 20:35:18 +0000
+++ tribes/empire/headquarters_shipwreck/conf	2014-03-16 21:52:17 +0000
@@ -8,4 +8,3 @@
 # sfx=0 ../../../sound/spoken/warehouse-bringitin
 pics=headquarters_shipwreck_i_??.png
 hotspot=93 40
-playercolor=true

=== modified file 'tribes/empire/helm/conf'
--- tribes/empire/helm/conf	2014-02-25 14:45:19 +0000
+++ tribes/empire/helm/conf	2014-03-16 21:52:17 +0000
@@ -7,5 +7,4 @@
 
 [idle]
 pics=idle_??.png
-playercolor=true
 hotspot=5 10

=== modified file 'tribes/empire/hunter/conf'
--- tribes/empire/hunter/conf	2014-02-22 16:49:17 +0000
+++ tribes/empire/hunter/conf	2014-03-16 21:52:17 +0000
@@ -16,17 +16,14 @@
 [idle]
 pics=idle_??.png
 hotspot=10 21
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 32
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 32
-playercolor=true
 fps=10

=== modified file 'tribes/empire/innkeeper/conf'
--- tribes/empire/innkeeper/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/innkeeper/conf	2014-03-16 21:52:17 +0000
@@ -7,17 +7,14 @@
 [idle]
 pics=idle_??.png
 hotspot=4 26
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10

=== modified file 'tribes/empire/lumberjack/conf'
--- tribes/empire/lumberjack/conf	2014-02-22 16:49:17 +0000
+++ tribes/empire/lumberjack/conf	2014-03-16 21:52:17 +0000
@@ -19,23 +19,19 @@
 [hacking]
 pics=hacking_??.png
 hotspot=23 23
-playercolor=true
 fps=10
 
 [idle]
 pics=idle_??.png
 hotspot=6 24
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 22
-playercolor=true
 fps=10

=== modified file 'tribes/empire/master-miner/conf'
--- tribes/empire/master-miner/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/master-miner/conf	2014-03-16 21:52:17 +0000
@@ -3,16 +3,13 @@
 [idle]
 pics=idle_??.png
 hotspot=7 22
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=10 22
-playercolor=true
 fps=10

=== modified file 'tribes/empire/mill/conf'
--- tribes/empire/mill/conf	2013-07-23 13:40:00 +0000
+++ tribes/empire/mill/conf	2014-03-16 21:52:17 +0000
@@ -34,10 +34,8 @@
 [idle]
 pics=windmill_i_??.png  # ???
 hotspot=41 87
-playercolor=true
 
 [working]
 pics=windmill_w_??.png  # lets see the mill turn!
 hotspot=41 87
-playercolor=true
 fps=25

=== modified file 'tribes/empire/miller/conf'
--- tribes/empire/miller/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/miller/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=5 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/miner/conf'
--- tribes/empire/miner/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/miner/conf	2014-03-16 21:52:17 +0000
@@ -9,16 +9,13 @@
 [idle]
 pics=idle_??.png
 hotspot=3 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=7 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/pig-breeder/conf'
--- tribes/empire/pig-breeder/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/pig-breeder/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=16 29
-playercolor=true
 fps=20
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=27 29
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=27 29
-playercolor=true
 fps=20

=== modified file 'tribes/empire/port/conf'
--- tribes/empire/port/conf	2013-07-23 13:40:00 +0000
+++ tribes/empire/port/conf	2014-03-16 21:52:17 +0000
@@ -22,10 +22,8 @@
 [build]
 pics=port_b_??.png  # 4 frames
 hotspot=74 96
-playercolor=true
 
 [idle]
 pics=port_i_??.png  # 20 frames
 hotspot=74 96
-playercolor=true
 fps=10

=== modified file 'tribes/empire/resi_coal1/conf'
--- tribes/empire/resi_coal1/conf	2012-03-06 18:14:55 +0000
+++ tribes/empire/resi_coal1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_coal2/conf'
--- tribes/empire/resi_coal2/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/resi_coal2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_gold1/conf'
--- tribes/empire/resi_gold1/conf	2012-03-06 18:14:55 +0000
+++ tribes/empire/resi_gold1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_gold2/conf'
--- tribes/empire/resi_gold2/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/resi_gold2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_granit1/conf'
--- tribes/empire/resi_granit1/conf	2012-03-06 18:14:55 +0000
+++ tribes/empire/resi_granit1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_granit2/conf'
--- tribes/empire/resi_granit2/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/resi_granit2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_iron1/conf'
--- tribes/empire/resi_iron1/conf	2012-03-06 18:14:55 +0000
+++ tribes/empire/resi_iron1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_iron2/conf'
--- tribes/empire/resi_iron2/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/resi_iron2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_none/conf'
--- tribes/empire/resi_none/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/resi_none/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/resi_water1/conf'
--- tribes/empire/resi_water1/conf	2012-03-06 18:14:55 +0000
+++ tribes/empire/resi_water1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=resi_00.png
 attrib=resi
 
 [program]

=== modified file 'tribes/empire/scout/conf'
--- tribes/empire/scout/conf	2014-02-24 21:12:30 +0000
+++ tribes/empire/scout/conf	2014-03-16 21:52:17 +0000
@@ -11,17 +11,14 @@
 [idle]
 pics=idle_??.png
 hotspot=4 22
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/scouts_house/conf'
--- tribes/empire/scouts_house/conf	2013-07-23 13:40:00 +0000
+++ tribes/empire/scouts_house/conf	2014-03-16 21:52:17 +0000
@@ -27,7 +27,6 @@
 [idle]
 pics=scouts_house_i_??.png
 hotspot=50 53
-playercolor=true
 fps=10
 
 [build]

=== modified file 'tribes/empire/shepherd/conf'
--- tribes/empire/shepherd/conf	2012-02-15 21:25:34 +0000
+++ tribes/empire/shepherd/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=16 29
-playercolor=true
 fps=20
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=26 30
-playercolor=true
 fps=20
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=26 30
-playercolor=true
 fps=20

=== modified file 'tribes/empire/ship/conf'
--- tribes/empire/ship/conf	2013-05-26 09:23:29 +0000
+++ tribes/empire/ship/conf	2014-03-16 21:52:17 +0000
@@ -6,11 +6,9 @@
 [idle]
 pics=ship_i_??.png
 hotspot=115 100
-playercolor=true
 fps=10
 
 [sail]
 dirpics=sail_!!_??.png
 hotspot=115 100
 fps=10
-playercolor=true

=== modified file 'tribes/empire/shipconstruction/conf'
--- tribes/empire/shipconstruction/conf	2012-02-26 21:51:25 +0000
+++ tribes/empire/shipconstruction/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=idle_00.png
 
 [buildcost]
 wood=10
@@ -14,4 +13,3 @@
 [idle]
 pics=ship-build_??.png
 hotspot=115 78
-playercolor=true

=== modified file 'tribes/empire/shipwright/conf'
--- tribes/empire/shipwright/conf	2013-03-02 20:35:18 +0000
+++ tribes/empire/shipwright/conf	2014-03-16 21:52:17 +0000
@@ -18,23 +18,19 @@
 pics=work_??.png
 sfx=0 ../../../sound/hammering/hammering
 hotspot=12 27
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=11 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=9 22
-playercolor=true
 fps=10
 
 [idle]
 pics=idle_??.png
 hotspot=13 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/shipyard/conf'
--- tribes/empire/shipyard/conf	2013-07-23 17:50:05 +0000
+++ tribes/empire/shipyard/conf	2014-03-16 21:52:17 +0000
@@ -40,19 +40,15 @@
 [idle]
 pics=work_??.png
 hotspot=50 63
-playercolor=true
 
 [build]
 pics=build_??.png
 hotspot=50 63
-playercolor=true
 
 [working]
 pics=work_??.png
 hotspot=50 63
-playercolor=true
 
 [unoccupied]
 pics=vacant_??.png
 hotspot=50 63
-playercolor=true

=== modified file 'tribes/empire/smelter/conf'
--- tribes/empire/smelter/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/smelter/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=4 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=18 25
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 22
-playercolor=true
 fps=10

=== modified file 'tribes/empire/soldier/conf'
--- tribes/empire/soldier/conf	2012-03-14 21:05:00 +0000
+++ tribes/empire/soldier/conf	2014-03-16 21:52:17 +0000
@@ -55,70 +55,58 @@
 pics=idle_??.png
 hotspot=10 36
 fps=5
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=10 36
 fps=10
-playercolor=true
 
 [atk_ok_e]
 pics=atk_ok_e_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [atk_fail_e]
 pics=atk_fail_e_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [eva_ok_e]
 pics=eva_ok_e_??.png
 hotspot=30 36
 fps=20
-playercolor=true
 
 [eva_fail_e]
 pics=eva_fail_e_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [atk_ok_w]
 pics=atk_ok_w_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [atk_fail_w]
 pics=atk_fail_w_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [eva_ok_w]
 pics=eva_ok_w_??.png
 hotspot=30 36
 fps=20
-playercolor=true
 
 [eva_fail_w]
 pics=eva_fail_w_??.png
 hotspot=30 36
 fps=10
-playercolor=true
 
 [die_w]
 pics=die_??.png
 hotspot=10 36
 fps=10
-playercolor=true
 
 [die_e]
 pics=die_??.png
 hotspot=10 36
 fps=10
-playercolor=true

=== modified file 'tribes/empire/stonemason/conf'
--- tribes/empire/stonemason/conf	2014-03-03 20:50:30 +0000
+++ tribes/empire/stonemason/conf	2014-03-16 21:52:17 +0000
@@ -27,23 +27,19 @@
 [idle]
 pics=idle_??.png
 hotspot=9 23
-playercolor=true
 fps=10
 
 [hacking]
 pics=hacking_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 22
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 25
-playercolor=true
 fps=10

=== modified file 'tribes/empire/toolsmith/conf'
--- tribes/empire/toolsmith/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/toolsmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=8 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/trainer/conf'
--- tribes/empire/trainer/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/trainer/conf	2014-03-16 21:52:17 +0000
@@ -6,16 +6,13 @@
 [idle]
 pics=idle_??.png
 hotspot=6 23
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=9 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walk_!!_??.png
 hotspot=9 23
-playercolor=true
 fps=10

=== modified file 'tribes/empire/vinefarmer/conf'
--- tribes/empire/vinefarmer/conf	2014-02-22 16:49:17 +0000
+++ tribes/empire/vinefarmer/conf	2014-03-16 21:52:17 +0000
@@ -27,34 +27,28 @@
 [idle]
 pics=idle_??.png
 hotspot=4 23
-playercolor=true
 
 [dig]
 pics=dig_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [plant]
 pics=plant_??.png
 hotspot=15 23
-playercolor=true
 fps=10
 
 [gather]
 pics=gather_??.png
 hotspot=9 22
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 23
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/weaponsmith/conf'
--- tribes/empire/weaponsmith/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/weaponsmith/conf	2014-03-16 21:52:17 +0000
@@ -7,16 +7,13 @@
 [idle]
 pics=idle_??.png
 hotspot=8 24
-playercolor=true
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=8 24
-playercolor=true
 fps=10

=== modified file 'tribes/empire/weaver/conf'
--- tribes/empire/weaver/conf	2011-10-03 15:51:56 +0000
+++ tribes/empire/weaver/conf	2014-03-16 21:52:17 +0000
@@ -6,17 +6,14 @@
 [idle]
 pics=idle_??.png
 hotspot=4 26
-playercolor=true
 fps=10
 
 [walk]
 dirpics=walk_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10
 
 [walkload]
 dirpics=walkload_!!_??.png
 hotspot=6 26
-playercolor=true
 fps=10

=== modified file 'tribes/empire/weaving-mill/conf'
--- tribes/empire/weaving-mill/conf	2013-07-23 13:40:00 +0000
+++ tribes/empire/weaving-mill/conf	2014-03-16 21:52:17 +0000
@@ -41,5 +41,4 @@
 [working]
 pics=weaving_mill_w_??.png  # ???
 hotspot=65 62
-playercolor=true
 fps=5

=== modified file 'tribes/empire/wine0/conf'
--- tribes/empire/wine0/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/wine0/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=medium
 program=program
-picture=wine0m_00.png
 
 [program]
 animate=midd 40000

=== modified file 'tribes/empire/wine0s/conf'
--- tribes/empire/wine0s/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/wine0s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=medium
 program=program
-picture=wine0s_00.png
 
 [program]
 animate=small 28000

=== modified file 'tribes/empire/wine0t/conf'
--- tribes/empire/wine0t/conf	2008-12-13 20:55:54 +0000
+++ tribes/empire/wine0t/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=medium
 program=program
-picture=wine0t_00.png
 
 [program]
 animate=tiny 22000

=== modified file 'utils/crop_animation.py'
--- utils/crop_animation.py	2010-11-15 21:23:02 +0000
+++ utils/crop_animation.py	2014-03-16 21:52:17 +0000
@@ -51,6 +51,7 @@
     else:
         filepattern=section['dirpics']
 
+    # TODO(sirver): playercolor is never used in the conf files anymore. remove this.
     use_playercolor=False
     if 'playercolor' in section and \
        section['playercolor'].upper().strip()=="TRUE":
@@ -225,8 +226,8 @@
                         fname=section[2]['dirpics']
                     if ('pics' in sec[2] and sec[2]['pics']==fname) or \
                        ('dirpics' in sec[2] and sec[2]['dirpics']==fname):
-                        # Simply go through the lines of the section and 
-                        # search for hotspot= if found replace the line. It 
+                        # Simply go through the lines of the section and
+                        # search for hotspot= if found replace the line. It
                         # will be written to the conf file a the end
                         for i in range(sec[0], sec[1]+1):
                             #print i,

=== added file 'utils/make_spritemap.py'
--- utils/make_spritemap.py	1970-01-01 00:00:00 +0000
+++ utils/make_spritemap.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,767 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+import argparse
+import math
+import md5
+import os
+import re
+import subprocess
+import sys
+
+from scipy import ndimage
+import numpy as np
+
+import pywi.animation
+import pywi.config
+import pywi.packing
+
+
+# Consider an additional fragment/rectangle to be beneficial if it saves this many pixels in image data
+FRAGMENT_COST = 32
+
+def macr_exact_bruteforce(bitmask, lower_range=None, upper_range=None, FRAGMENT_COST=FRAGMENT_COST):
+    """
+    Compute a Minimum Average Cost Rectangle among all rectangles with lower left corner in lower_range
+    and upper right corner in upper_range, by computing the cost of all possible rectangles.
+
+    Returns (cost, rectangle)
+
+    Note: Returns a rectangle with cost strictly greater than FRAGMENT_COST + 1 if bitmask contains
+    no set pixels.
+    """
+    if bitmask.shape[0] * bitmask.shape[1] > 4000:
+        raise Exception('macr_exact_bruteforce called on a large bitmask')
+
+    lower_range = lower_range or ((0, 0), bitmask.shape)
+    upper_range = upper_range or ((0, 0), bitmask.shape)
+    lower_ext = tuple(np.subtract(lower_range[1], lower_range[0]))
+    upper_ext = tuple(np.subtract(upper_range[1], upper_range[0]))
+    cum0 = bitmask.cumsum(0)
+    cum1 = bitmask.cumsum(1)
+    cum01 = cum0.cumsum(1)
+
+    tr = cum01[upper_range[0][0]:upper_range[1][0], upper_range[0][1]:upper_range[1][1]]
+    tr = np.tile(tr.reshape((1,1) + upper_ext), lower_ext + (1,1))
+    tl = (cum01 - cum0)[upper_range[0][0]:upper_range[1][0], lower_range[0][1]:lower_range[1][1]]
+    tl = np.tile(tl.transpose().reshape((1, lower_ext[1], upper_ext[0], 1)), (lower_ext[0], 1, 1, upper_ext[1]))
+    br = (cum01 - cum1)[lower_range[0][0]:lower_range[1][0], upper_range[0][1]:upper_range[1][1]]
+    br = np.tile(br.reshape((lower_ext[0], 1, 1, upper_ext[1])), (1, lower_ext[1], upper_ext[0], 1))
+    bl = (cum01 - cum0 - cum1 + bitmask)[lower_range[0][0]:lower_range[1][0], lower_range[0][1]:lower_range[1][1]]
+    bl = np.tile(bl.reshape(lower_ext + (1,1)), (1,1) + upper_ext)
+
+    indices = np.indices(lower_ext + upper_ext)
+    covered = (tr - tl - br + bl) * ((indices[2] >= indices[0]) & (indices[3] >= indices[1]))
+
+    cost = (
+        ((upper_range[0][0] - lower_range[0][0]) + indices[2] - indices[0] + 1) *
+        ((upper_range[0][1] - lower_range[0][1]) + indices[3] - indices[1] + 1)
+    )
+    cost = FRAGMENT_COST + np.fmax(cost, 1)
+    #print cost
+
+    avg_cost = cost / np.fmax(covered, 0.1)
+    #print avg_cost
+    argmin_local = np.unravel_index(np.argmin(avg_cost), avg_cost.shape)
+    argmin = (
+        argmin_local[0] + lower_range[0][0],
+        argmin_local[1] + lower_range[0][1],
+        argmin_local[2] + upper_range[0][0] + 1,
+        argmin_local[3] + upper_range[0][1] + 1
+    )
+    return avg_cost[argmin_local], argmin
+
+def minimum_average_cost_rectangle(bitmask, FRAGMENT_COST=FRAGMENT_COST):
+    """
+    Compute a rectangle that minimizes (FRAGMENT_COST + Area) / (Pixels Covered in bitmask)
+
+    Returns (cost, rectangle)
+    """
+    return macr_exact_bruteforce(bitmask, FRAGMENT_COST=FRAGMENT_COST)
+
+    # Setup tiling hierarchy
+    MAX_TILES = 16
+    AVG_COST_INF = FRAGMENT_COST + 2
+
+    tileshapes = []
+    remaindershape = bitmask.shape
+    while remaindershape[0] > MAX_TILES or remaindershape[1] > MAX_TILES:
+        tiles = tuple([
+            int(math.ceil(rs ** (1.0 / int(math.ceil(math.log(rs, MAX_TILES))))))
+            for rs in remaindershape
+        ])
+        tileshapes.append(tiles)
+        remaindershape = tuple([
+            (rs + ts - 1) / ts
+            for ts, rs in zip(tiles, remaindershape)
+        ])
+    tileshapes.append(remaindershape)
+    shape = tuple(np.prod(tileshapes, 0))
+    print 'original:', bitmask.shape, 'shapes:', tileshapes, 'total shape:', shape
+    if shape != bitmask.shape:
+        extend = np.zeros(shape)
+        extend[:bitmask.shape[0], :bitmask.shape[1]] = bitmask
+        bitmask = extend
+
+def minimum_average_cost_grow(bitmask, rectangle):
+    """
+    Find the best way to grow the given rectangle in one direction only,
+    in terms of (Increased Area) / (Additionally Covered Pixels in bitmask).
+
+    Returns (cost, rectangle), where cost is None if no additional pixels can be covered.
+    """
+    best_cost = None
+    best_rectangle = rectangle
+    height = rectangle[2] - rectangle[0]
+    width = rectangle[3] - rectangle[1]
+
+    # grow positive in axis 1
+    additional = bitmask[rectangle[0]:rectangle[2], rectangle[3]:].sum(0).cumsum()
+    if additional.shape[0]:
+        cost = np.arange(height, (additional.shape[0] + 1) * height, height, np.float)
+        inv = additional / cost # avoid division by zero
+        best = inv.argmax()
+        if inv[best] > 0:
+            best_cost = 1.0 / inv[best]
+            best_rectangle = (rectangle[0], rectangle[1], rectangle[2], rectangle[3] + 1 + best)
+
+    # grow negative in axis 1
+    additional = bitmask[rectangle[0]:rectangle[2], :rectangle[1]].sum(0)[::-1].cumsum()
+    if additional.shape[0]:
+        cost = np.arange(height, (additional.shape[0] + 1) * height, height, np.float)
+        inv = additional / cost # avoid division by zero
+        best = inv.argmax()
+        if inv[best] > 0 and (best_cost is None or best_cost > 1.0 / inv[best]):
+            best_cost = 1.0 / inv[best]
+            best_rectangle = (rectangle[0], rectangle[1] - 1 - best, rectangle[2], rectangle[3])
+
+    # grow positive in axis 0
+    additional = bitmask[rectangle[2]:, rectangle[1]:rectangle[3]].sum(1).cumsum()
+    if additional.shape[0]:
+        cost = np.arange(width, (additional.shape[0] + 1) * width, width, np.float)
+        inv = additional / cost # avoid division by zero
+        best = inv.argmax()
+        if inv[best] > 0 and (best_cost is None or best_cost > 1.0 / inv[best]):
+            best_cost = 1.0 / inv[best]
+            best_rectangle = (rectangle[0], rectangle[1], rectangle[2] + 1 + best, rectangle[3])
+
+    # grow negative in axis 1
+    additional = bitmask[:rectangle[0], rectangle[1]:rectangle[3]].sum(1)[::-1].cumsum()
+    if additional.shape[0]:
+        cost = np.arange(width, (additional.shape[0] + 1) * width, width, np.float)
+        inv = additional / cost # avoid division by zero
+        best = inv.argmax()
+        if inv[best] > 0 and (best_cost is None or best_cost > 1.0 / inv[best]):
+            best_cost = 1.0 / inv[best]
+            best_rectangle = (rectangle[0] - 1 - best, rectangle[1], rectangle[2], rectangle[3])
+
+    return (best_cost, best_rectangle)
+
+def draw_bitmask(bitmask):
+    for y in range(bitmask.shape[0]):
+        print ''.join([(' ', '*')[cell] for cell in bitmask[y]])
+
+def bitmask_from_rectangle(shape, rectangle):
+    idx = np.indices(shape)
+    return np.logical_and(
+        np.logical_and(idx[0] >= rectangle[0], idx[0] < rectangle[2]),
+        np.logical_and(idx[1] >= rectangle[1], idx[1] < rectangle[3])
+    )
+
+def draw_rectangles_over_bitmask(bitmask, rectangles):
+    if rectangles:
+        coverage = np.max(
+            [np.where(bitmask_from_rectangle(bitmask.shape, rect), num+1, 0) for num, rect in enumerate(rectangles)],
+            axis=0
+        )
+    else:
+        coverage = np.zeros(bitmask.shape)
+    for bmrow, crow in zip(bitmask, coverage):
+        print ''.join([str(c) if c > 0 else '*' if b else ' ' for b, c in zip(bmrow, crow)])
+
+def draw_frame_diffs(frames):
+    npframes = np.array([frame.pic for frame in frames])
+    any_not_transparent = np.any(npframes[:,:,:,3] != 0, axis=0)
+    all_equal_not_transparent = np.logical_and(
+        npframes[0,:,:,3] != 0,
+        np.all(np.all(npframes[0:1,:,:,:] == npframes, axis=-1), axis=0)
+    )
+    for eqrow, ntrow in zip(all_equal_not_transparent, any_not_transparent):
+        print ''.join(['.' if eq else '*' if nt else ' ' for eq, nt in zip(eqrow, ntrow)])
+
+def rectangle_cost(rectangle, FRAGMENT_COST=FRAGMENT_COST):
+    return FRAGMENT_COST + (rectangle[2] - rectangle[0]) * (rectangle[3] - rectangle[1])
+
+def compute_rectangle_covering(bitmask, FRAGMENT_COST=FRAGMENT_COST):
+    """
+    Given a bitmask of pixels, find a list of rectangles that covers all pixels of the mask that are set to true,
+    with a goal of minimizing Total Area of Covering Rectangles + FRAGMENT_COST * Number of Covering Rectangles.
+
+    Returns (cost, list of rectangles)
+    """
+    # This implements the simple set cover heuristic,
+    # i.e. it greedily covers pixels by adding a rectangle with minimum cost
+    # per covered pixel, or by extending an existing rectangle.
+    rectangles = []
+    indices = np.indices(bitmask.shape)
+    remainder = bitmask
+    while np.count_nonzero(remainder) != 0:
+        new_rectangle_score, new_rectangle = minimum_average_cost_rectangle(
+            remainder,
+            FRAGMENT_COST=FRAGMENT_COST
+        )
+        best_score = new_rectangle_score
+        best_rectangles = rectangles + [new_rectangle]
+
+        for idx, rect in enumerate(rectangles):
+            grow_score, grow_rect = minimum_average_cost_grow(remainder, rect)
+            if grow_score is not None and grow_score <= best_score:
+                best_score = grow_score
+                best_rectangles = rectangles[:idx] + rectangles[idx + 1:] + [grow_rect]
+
+        #print 'best score', best_score
+        #print 'rectangles:', best_rectangles
+
+        rectangles = best_rectangles
+        remainder = np.logical_and(
+            remainder,
+            np.logical_or(
+                np.logical_or(indices[0] < rectangles[-1][0], indices[0] >= rectangles[-1][2]),
+                np.logical_or(indices[1] < rectangles[-1][1], indices[1] >= rectangles[-1][3])
+            )
+        )
+    return sum([rectangle_cost(rect, FRAGMENT_COST=FRAGMENT_COST) for rect in rectangles]), rectangles
+
+def build_frame_group_rectangle_covering(frames, FRAGMENT_COST=FRAGMENT_COST):
+    """
+    Given a list of frames, find a shared base picture based on the first frame,
+    as well as individual deltas.
+
+    Returns (cost, base_pic, base_pic_rect, [frame_rectangles])
+    """
+    shape = frames[0].pic.shape
+    all_opaque_mask = np.all([frame.pic[:,:,3] == 255 for frame in frames], 0)
+    base_pic_mask = frames[0].pic[:,:,3] != 0
+    for frame in frames[1:]:
+        base_pic_mask &= np.all(frame.pic == frames[0].pic, -1) | all_opaque_mask
+    p = np.argwhere(base_pic_mask)
+    base_pic_min = np.min(p, 0)
+    base_pic_max = np.max(p, 0)
+    base_pic_rect = (base_pic_min[0], base_pic_min[1], base_pic_max[0] + 1, base_pic_max[1] + 1)
+    base_pic_cost = rectangle_cost(base_pic_rect, FRAGMENT_COST=FRAGMENT_COST)
+    base_pic = np.where(np.reshape(base_pic_mask, (shape[0], shape[1], 1)), frames[0].pic, 0)
+
+    total_cost = base_pic_cost
+    frame_rectangles = []
+    for frame in frames:
+        delta_mask = (frame.pic[:,:,3] != 0) & np.any(frame.pic != base_pic, -1)
+        cost, rectangles = compute_rectangle_covering(delta_mask, FRAGMENT_COST=FRAGMENT_COST)
+        total_cost += cost
+        frame_rectangles.append(rectangles)
+
+    return (total_cost, base_pic, base_pic_rect, [frame_rectangles])
+
+def build_frame_group_regions(frames):
+    """
+    Given a list of frame, identify variable subregions
+    and split frames into blits accordingly
+
+    Return (avgcost, list of list of ((x, y), pic, pc_pic))
+    """
+    pc = frames[0].pc_pic is not None
+    regions = []
+
+    if len(frames) > 1:
+        # Find the regions that are not equal over all frames
+        followers = np.asarray([frame.pic for frame in frames[1:]])
+        diff = np.any(np.any(frames[0].pic != followers, 3), 0)
+        if pc:
+            followers_pc = np.asarray([frame.pc_pic for frame in frames[1:]])
+            diff = diff | np.any(np.any(frames[0].pc_pic != followers_pc, 3) & followers[:,:,:,3] != 0, 0)
+
+        #TODO: use rectangle covering instead, once it becomes more efficient
+        label_img, nlabels = ndimage.label(diff)
+        for i in range(1, nlabels + 1):
+            ys, xs = np.where(label_img == i)
+            regions.append((ys.min(), xs.min(), ys.max() + 1, xs.max() + 1))
+    else:
+        diff = np.zeros(frames[0].pic.shape[:2], np.bool)
+
+    base_pic_mask = frames[0].pic[:,:,3] != 0 & ~diff
+    for region in regions:
+        base_pic_mask[region[0]:region[2], region[1]:region[3]] = False
+
+    ys, xs = np.where(base_pic_mask)
+    cost = 0
+    base_pic_rect = None
+    if len(ys) and len(xs):
+        base_pic_rect = (ys.min(), xs.min(), ys.max() + 1, xs.max() + 1)
+        base_pic_base = frames[0].pic.copy()
+        base_pic_base[:,:,3] = np.choose(base_pic_mask, [0, base_pic_base[:,:,3]])
+        base_pic = base_pic_base[base_pic_rect[0]:base_pic_rect[2], base_pic_rect[1]:base_pic_rect[3]]
+        if pc:
+            base_pic_pc = frames[0].pc_pic[base_pic_rect[0]:base_pic_rect[2], base_pic_rect[1]:base_pic_rect[3]]
+        else:
+            base_pic_pc = None
+        cost = rectangle_cost(base_pic_rect)
+
+    newframes = []
+    for frame in frames:
+        newframe = [((base_pic_rect[0], base_pic_rect[1]), base_pic, base_pic_pc)] if base_pic_rect else []
+        for region in regions:
+            pic = frame.pic[region[0]:region[2], region[1]:region[3]]
+            if pc:
+                pc_pic = frame.pc_pic[region[0]:region[2], region[1]:region[3]]
+            else:
+                pc_pic = None
+            newframe.append(((region[0], region[1]), pic, pc_pic))
+            cost += rectangle_cost(region)
+        newframes.append(newframe)
+
+    return (float(cost) / len(frames), newframes)
+
+
+def do_optimize_greedy(frames):
+    """
+    Find a packing of the frame into frame groups.
+
+    Return list of lists of ((x, y), pic, pc_pic), one list for the blits of each frame.
+
+    Frame groups are optimized together, either based on a simple region heuristic,
+    or with a slightly more complicated rectangle covering technique.
+
+    We add frames to candidate frame groups greedily as long as the average cost per frame
+    decreases. As a heuristic, frames with high pixel overlap are combined first.
+    """
+    MAXREJECT = 10
+    uncovered = [idx for idx in xrange(len(frames))]
+    covered_frames = [None for frame in frames]
+    framegroups = []
+    total_cost = 0
+
+    print 'pack_frames_greedy: packing', len(frames), 'frames'
+    while uncovered:
+        leader = uncovered[0]
+        del uncovered[0]
+        print ' start new framegroup with leader', leader,
+        avgcost, newframes = build_frame_group_regions([frames[leader]])
+        print 'cost', avgcost
+
+        leader_pic = frames[leader].pic
+        trials = zip(uncovered, [
+            np.count_nonzero(np.all(leader_pic == frames[u].pic, -1))
+            for u in uncovered
+        ])
+        trials.sort(key=lambda t: -t[1])
+
+        followers = []
+        rejections = 0
+        for trial, nrcommonpix in trials:
+            try_frames = [leader] + followers + [trial]
+            print '  try adding %d with %d common pixels for %s...' % (
+                trial, nrcommonpix, try_frames
+            ),
+            new_avgcost, newframes_try = build_frame_group_regions(
+                [frames[i] for i in try_frames]
+            )
+            print 'avgcost', new_avgcost,
+            if new_avgcost > avgcost:
+                rejections += 1
+                if rejections >= MAXREJECT:
+                    print 'reject and stop'
+                    break
+                else:
+                    print 'reject'
+            else:
+                print 'add'
+                avgcost = new_avgcost
+                newframes = newframes_try
+                followers.append(trial)
+                uncovered.remove(trial)
+                rejections = 0
+
+        print ' adding framegroup', [leader] + followers, 'avgcost', avgcost
+
+        for framenr, newframe in zip([leader] + followers, newframes):
+            covered_frames[framenr] = newframe
+
+    return covered_frames
+
+#############################################
+#############################################
+#############################################
+
+
+def copy_blits_animation(anim, chunksets):
+    """
+    Copy the given animation (which must be of type AnimationBlits)
+    into a new animation using the given chunksets
+    """
+    if chunksets[anim.has_player_color] is None:
+        chunksets[anim.has_player_color] = pywi.animation.ChunkSet(anim.has_player_color)
+    chunkset = chunksets[anim.has_player_color]
+    return anim.copy(chunkset)
+
+
+def optimize_bbox(animations, chunksets, args):
+    """
+    Joint optimization of the given animations using a simple bounding box routine
+    """
+    print 'Running bbox optimization...'
+    new_animations = {}
+    for name in sorted(animations.iterkeys()):
+        anim = animations[name]
+        if chunksets[anim.has_player_color] is None:
+            chunksets[anim.has_player_color] = pywi.animation.ChunkSet(anim.has_player_color)
+        chunkset = chunksets[anim.has_player_color]
+        new_anim = pywi.animation.AnimationBlits(chunkset)
+        new_anim.options.update(anim.options)
+        if not args.reopt and type(anim) == pywi.animation.AnimationBlits:
+            print 'Copying %s' % (name)
+            for frame in anim.frames:
+                blits = []
+                for blit in frame:
+                    chunk = chunkset.make_chunk(
+                        blit.chunk.pic, blit.chunk.pc_pic,
+                        (0,0) + blit.chunk.pic.shape[0:2]
+                    )
+                    blits.append(pywi.animation.Blit(chunk, blit.offset))
+                new_anim.append_frame(blits)
+        else:
+            print 'Optimizing %s' % (name)
+            for idx in xrange(anim.get_nrframes()):
+                frame = anim.get_frame(idx)
+                pic_mask = frame.pic[:,:,3] != 0
+                p = np.argwhere(pic_mask)
+                pic_min = np.min(p, 0)
+                pic_max = np.max(p, 0)
+                bbox_rect = (pic_min[0], pic_min[1], pic_max[0] + 1, pic_max[1] + 1)
+                chunk = chunkset.make_chunk(frame.pic, frame.pc_pic, bbox_rect)
+                offset = (pic_min[0] - anim.hotspot[0], pic_min[1] - anim.hotspot[1])
+                new_anim.append_frame([pywi.animation.Blit(chunk, offset)])
+        new_animations[name] = new_anim
+    return new_animations
+
+def do_crossframe_optimization(animations, chunkset, optimizer):
+    """
+    Helper function in which animations have already been reduced
+    to those that should be (re-)optimized, and either all animations
+    are pc or all are non-pc.
+
+    Aligns all frames of all animations, and submits them together
+    to the optimizer. The optimizer takes a list of FullFrame tuples
+    and returns a list of (offset, pic, pc_pic) tuple lists, one list for each frame.
+    """
+    pc = chunkset.has_player_color
+
+    # Step 1: Align all frames of all animations
+    frame_min = (1000,1000)
+    frame_max = (-1000,-1000)
+    for anim in animations.itervalues():
+        frame_min = (
+            min(frame_min[0], -anim.hotspot[0]),
+            min(frame_min[1], -anim.hotspot[1])
+        )
+        frame_max = (
+            max(frame_max[0], anim.shape[0] - anim.hotspot[0]),
+            max(frame_max[1], anim.shape[1] - anim.hotspot[1])
+        )
+    shape = (frame_max[0] - frame_min[0], frame_max[1] - frame_min[1])
+    hotspot = (-frame_min[0], -frame_min[1])
+
+    frames = []
+    for name in sorted(animations.iterkeys()):
+        anim = animations[name]
+        rect = (
+            hotspot[0] - anim.hotspot[0],
+            hotspot[1] - anim.hotspot[1],
+            hotspot[0] - anim.hotspot[0] + anim.shape[0],
+            hotspot[1] - anim.hotspot[1] + anim.shape[1]
+        )
+        for framenr in xrange(anim.get_nrframes()):
+            frame = anim.get_frame(framenr)
+            pic = np.zeros(shape + (4,), np.uint8)
+            pic[rect[0]:rect[2], rect[1]:rect[3]] = frame.pic
+            if pc:
+                pc_pic = np.zeros(shape + (4,), np.uint8)
+                pc_pic[rect[0]:rect[2], rect[1]:rect[3]] = frame.pc_pic
+            else:
+                pc_pic = None
+            frames.append((name, framenr, pywi.animation.FullFrame(pic, pc_pic)))
+
+    # Step 2: Perform the actual optimization
+    optimized = optimizer([frame[2] for frame in frames])
+
+    # Step 3: Recreate animations
+    new_animations = {}
+    for name, anim in animations.iteritems():
+        new_anim = pywi.animation.AnimationBlits(chunkset)
+        new_anim.options.update(anim.options)
+        new_animations[name] = new_anim
+
+    for oldframe, newframe in zip(frames, optimized):
+        blits = []
+        for blit in newframe:
+            chunk = chunkset.make_chunk(
+                blit[1], blit[2],
+                (0,0) + blit[1].shape[0:2]
+            )
+            blits.append(pywi.animation.Blit(chunk, (blit[0][0] - hotspot[0], blit[0][1] - hotspot[1])))
+        assert new_animations[oldframe[0]].get_nrframes() == oldframe[1]
+        new_animations[oldframe[0]].append_frame(blits)
+
+    return new_animations
+
+def optimize_greedy(animations, chunksets, args):
+    """
+    Joint optimization of the given animations, using a greedy set cover
+    heuristic to 'cover' animation frames by packed groups.
+    """
+    new_animations = {}
+    if not args.reopt:
+        for name in sorted(animations.iterkeys()):
+            anim = animations[name]
+            if type(anim) == pywi.animation.AnimationBlits:
+                print 'Copying %s' % (name)
+                new_animations[name] = copy_blits_animation(anim, chunksets)
+                del animations[name]
+
+    pc_animations = dict([
+        (name, anim) for name, anim in animations.iteritems() if anim.has_player_color
+    ])
+    nonpc_animations = dict([
+        (name, anim) for name, anim in animations.iteritems() if not anim.has_player_color
+    ])
+
+    if pc_animations:
+        print 'Running greedy optimization for pc animations...'
+        if chunksets[True] is None:
+            chunksets[True] = pywi.animation.ChunkSet(True)
+        new_animations.update(do_crossframe_optimization(
+            pc_animations, chunksets[True], do_optimize_greedy
+        ))
+    if nonpc_animations:
+        print 'Running greedy optimization for non-pc animations...'
+        if chunksets[False] is None:
+            chunksets[False] = pywi.animation.ChunkSet(False)
+        new_animations.update(do_crossframe_optimization(
+            nonpc_animations, chunksets[False], do_optimize_greedy
+        ))
+    return new_animations
+
+def compute_animations_hash(animations):
+    """
+    Compute a hash of animation data that should be independent of
+    any form of optimization.
+    """
+    m = md5.new()
+    m.update('%d' % len(animations))
+    for name in sorted(animations.keys()):
+        anim = animations[name]
+        m.update('=%s:%s:%d;%s;%d' % (
+            name, anim.has_player_color, len(anim.options),
+            ':'.join(['%s=%s' % (key, anim.options[key]) for key in sorted(anim.options.keys())]),
+            anim.get_nrframes()
+        ))
+        for idx in xrange(anim.get_nrframes()):
+            m.update(':')
+            frame = anim.get_frame(idx)
+            for y in xrange(frame.pic.shape[0]):
+                for x in xrange(frame.pic.shape[1]):
+                    if frame.pic[y,x,3] != 0:
+                        m.update('.%d,%d.%d.%d.%d.%d' % (
+                            y - anim.hotspot[0], x - anim.hotspot[1],
+                            frame.pic[y,x,0], frame.pic[y,x,1], frame.pic[y,x,2], frame.pic[y,x,3]
+                        ))
+                        if frame.pc_pic is not None:
+                            m.update('.%d.%d.%d' % (frame.pc_pic[y,x,0], frame.pc_pic[y,x,1], frame.pc_pic[y,x,2]))
+    return m.hexdigest()
+
+def add_animation(arg):
+    try:
+        m = re.match(r'(\w+),(\d+),(\d+)$', arg)
+        return (m.group(1), int(m.group(3)), int(m.group(2)))
+    except:
+        raise argparse.ArgumentTypeError('must be of the form "<name>,<x>,<y>", where x,y is the hotspot')
+
+# TODO(sirver): support for dirpics
+def parse_args():
+    p = argparse.ArgumentParser(description=
+        """
+        Transform the animation pictures found in the given directory
+        into a (possibly optimized) spritemap.
+        """
+    )
+
+    p.add_argument(
+        'directory', type=str, default='.',
+        help=''
+    )
+    p.add_argument(
+        '-a', '--add', action='append', type=add_animation, metavar='name,x,y',
+        default=[],
+        help='Add an animation of the given name and with the given hotspot from <name>_??.png and <name>_??_pc.png files'
+    )
+    p.add_argument(
+        '-i', '--in-place', action='store_true',
+        help="Reuse the same filename for new spritemap if a spritemap already exists"
+    )
+    p.add_argument(
+        '-o', '--optimize', type=str, choices=['bbox', 'greedy'], default='bbox',
+        help="Frame optimization routine ('bbox' is very fast, but 'greedy' can give better results)"
+    )
+    p.add_argument(
+        '-r', '--reopt', action='store_true',
+        help="Re-optimize also those animations that are already in spritemap format"
+    )
+    p.add_argument(
+        '-d', '--dry-run', action='store_true',
+        help="Perform all optimizations, but do not write the final result"
+    )
+    p.add_argument(
+        '-b', '--bzr', action='store_true',
+        help="Automatically remove old files from Bazaar and add new ones"
+    )
+
+    return p.parse_args()
+
+def error(msg):
+    print >>sys.stderr, msg
+    sys.exit(1)
+
+def main():
+    args = parse_args()
+
+    context = pywi.animation.Context()
+    animations = {}
+    if os.path.exists(args.directory + '/conf'):
+        with open(args.directory + '/conf', 'r') as filp:
+            print 'Loading existing conf file...'
+            conf = pywi.config.read(filp)
+        sections_to_remove = []
+        for name, section in conf.itersections():
+            if 'dirpics' not in section:
+                if 'pics' not in section and 'spritemap' not in section:
+                    continue
+                if name in animations:
+                    error('conf file contains multiply defined animation')
+                print 'Loading animation %s...' % (name)
+                animations[name] = pywi.animation.load_section(args.directory, section, context)
+            else:
+                print 'Loading legacy diranimations %s_!!...' % (name)
+                animations.update(pywi.animation.load_legacy_diranims(args.directory, name, section, context))
+                sections_to_remove.append(name)
+        for name in sections_to_remove:
+            conf.remove_section(name)
+    else:
+        conf = pywi.config.File()
+
+    for name, y, x in args.add:
+        if name in animations:
+            error('Trying to add animation %s, but name already exists' % (name))
+        print 'Loading added animation %s...' % (name)
+        anim = pywi.animation.load_glob(args.directory + '/%s_??.png' % (name))
+        anim.hotspot = (y,x)
+        animations[name] = anim
+
+    if not animations:
+        print 'No animations loaded.'
+        sys.exit()
+
+    orighash = compute_animations_hash(animations)
+    origcost = sum([anim.get_cost(FRAGMENT_COST) for anim in animations.itervalues()])
+    print 'Loaded %d animation with %d frames of cost %d, hash %s' % (
+        len(animations),
+        sum([anim.get_nrframes() for anim in animations.itervalues()]),
+        origcost, orighash
+    )
+
+    chunksets = [None, None]
+    if args.optimize == 'bbox':
+        animations = optimize_bbox(animations, chunksets, args)
+    elif args.optimize == 'greedy':
+        animations = optimize_greedy(animations, chunksets, args)
+    else:
+        error('Unknown optimization method %s' % (arg.optimize))
+
+    # This is perhaps a bit of an excessive way for achieving this,
+    # but re-copy all animations in sorted order. The intention of this
+    # is to make the resulting spritemaps be more stable when the same
+    # directory is re-optimized
+    chunksets = [None, None]
+    animations = dict([
+        (name, copy_blits_animation(animations[name], chunksets))
+        for name in sorted(animations.iterkeys())
+    ])
+
+    newhash = compute_animations_hash(animations)
+    newcost = 0
+    for chunkset in chunksets:
+        if chunkset is not None:
+            newcost += chunkset.get_cost(FRAGMENT_COST)
+    print 'Resulting animations of cost %d, hash %s' % (newcost, newhash)
+    if newhash != orighash:
+        print 'ERROR: Animations incorrectly modified'
+        sys.exit(1)
+
+    spritemap_names = set()
+    created_files = set()
+    for idx, chunkset in enumerate(chunksets):
+        if chunkset is None:
+            continue
+        rects = [(chunk.pic.shape[0], chunk.pic.shape[1]) for chunk in chunkset.chunks]
+        chunk_area = sum([r[0] * r[1] for r in rects])
+        print 'Packing chunks of area %d pixels' % (chunk_area)
+        ext0, ext1, offsets = pywi.packing.pack(rects)
+        packed_area = ext0 * ext1
+        overhead = float(packed_area - chunk_area) / chunk_area * 100
+        print '  packed into %dx%d = %d pixels (%.1f%% overhead)' % (
+            ext1, ext0, packed_area, overhead)
+        chunkset.assign_packing(ext0, ext1, offsets)
+
+        if not args.dry_run:
+            spritemap = None
+            if args.in_place:
+                possible_names = context.spritemap_names.difference(spritemap_names)
+                if possible_names:
+                    spritemap = possible_names.pop()
+
+            if spritemap is None:
+                n = 0
+                while (os.path.exists(args.directory + '/spritemap' + str(n) + '.png') or
+                    os.path.exists(args.directory + '/spritemap' + str(n) + '_pc.png')):
+                    n += 1
+                spritemap = 'spritemap%d' % (n)
+
+            spritemap_names.add(spritemap)
+            print 'Writing spritemap file %s.png...' % (spritemap)
+            chunkset.write_images(args.directory, spritemap)
+            created_files.add(os.path.abspath(args.directory + '/' + spritemap + '.png'))
+            if chunkset.has_player_color:
+                created_files.add(os.path.abspath(args.directory + '/' + spritemap + '_pc.png'))
+
+    if not args.dry_run:
+        for name, anim in animations.iteritems():
+            print 'Writing animation %s...' % (name)
+            s = conf.make_section(name)
+            anim.write(args.directory, s)
+
+        with open(args.directory + '/conf', 'w') as filp:
+            print 'Writing conf data to %s...' % (args.directory + '/conf')
+            conf.write(filp)
+
+        if args.bzr:
+            read_files = set([
+                os.path.abspath(fn) for fn in context.filenames
+            ])
+            print 'Adding and removing files from Bazaar...'
+            remove_files = read_files.difference(created_files)
+            if remove_files:
+                subprocess.call(['bzr', 'remove'] + list(remove_files))
+            add_files = created_files.difference(read_files)
+            if add_files:
+                subprocess.call(['bzr', 'add'] + list(add_files))
+
+
+if __name__ == '__main__':
+    main()

=== added directory 'utils/pywi'
=== added file 'utils/pywi/__init__.py'
--- utils/pywi/__init__.py	1970-01-01 00:00:00 +0000
+++ utils/pywi/__init__.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,4 @@
+"""
+Python modules for manipulating Widelands data files
+and other helper classes.
+"""

=== added file 'utils/pywi/animation.py'
--- utils/pywi/animation.py	1970-01-01 00:00:00 +0000
+++ utils/pywi/animation.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,435 @@
+"""
+Helper functions for reading and writing animations in
+the various formats understood by Widelands
+"""
+
+from glob import glob
+import collections
+import os
+import re
+
+from PIL import Image
+import numpy as np
+
+import pywi.config
+
+FullFrame = collections.namedtuple('FullFrame', ('pic', 'pc_pic'))
+
+_re_point = re.compile('(\\d+)\\s+(\\d+)$')
+_re_blit = re.compile(r'(\d+),(\d+),(\d+),(\d+)@(-?\d+),(-?\d+)$')
+
+
+class Context(object):
+    def __init__(self):
+        self.filenames = set()
+        self.spritemap_names = set()
+
+class Animation(object):
+    """
+    Base class for various Animation representations.
+    Note that all coordinates are in a numpy-friendly format,
+    that is, rows come first.
+    """
+    def __init__(self):
+        self.options = {}
+        self.shape = None
+        self.hotspot = None
+        self.has_player_color = False
+
+    def get_nrframes(self):
+        """
+        Return the number of frames in this animation
+        """
+        raise NotImplemented()
+
+    def get_frame(self, nr):
+        """
+        Get a FullFrame object for the given frame number
+        """
+        raise NotImplemented()
+
+    def get_cost(self, rectcost):
+        raise NotImplemented()
+
+class AnimationFullFrames(Animation):
+    """
+    Animation represented by full pictures for each frame
+    """
+    def __init__(self, frames=None):
+        super(AnimationFullFrames, self).__init__()
+        self.frames = frames or []
+        if self.frames:
+            self.shape = self.frames[0].pic.shape[:2]
+            self.hotspot = (0,0)
+            self.has_player_color = False if self.frames[0].pc_pic is None else True
+
+    def get_nrframes(self):
+        return len(self.frames)
+
+    def get_frame(self, nr):
+        return self.frames[nr]
+
+    def get_cost(self, rectcost):
+        return len(self.frames) * (rectcost + self.shape[0] * self.shape[1])
+
+
+class Chunk(object):
+    def __init__(self, pic, pc_pic=None):
+        self.pic = pic
+        self.pc_pic = pc_pic
+        self.spritemap_ofs = None
+
+    def __lt__(self, other):
+        """Orders by area."""
+        return (
+            (self.pic.shape[0] * self.pic.shape[1], self.pic.shape[0], self.pic.shape[1]) <
+            (other.pic.shape[0] * other.pic.shape[1], other.pic.shape[0], other.pic.shape[1]))
+
+
+Blit = collections.namedtuple('Blit', ('chunk', 'offset'))
+
+class ChunkSet(object):
+    def __init__(self, has_player_color):
+        self.has_player_color = has_player_color
+        self._chunks = []
+        self.packing_shape = None
+        self.spritemap_name = None
+
+    def make_chunk(self, base_pic, base_pc_pic, rect):
+        pic = base_pic[rect[0]:rect[2], rect[1]:rect[3]]
+        if (base_pc_pic is not None) != self.has_player_color:
+            raise Exception('inconsistent whether chunks have player color or not')
+        if base_pc_pic is not None:
+            pc_pic = base_pc_pic[rect[0]:rect[2], rect[1]:rect[3]]
+        else:
+            pc_pic = None
+        for chunk in self._chunks:
+            if chunk.pic.shape != pic.shape:
+                continue
+            if not np.all(chunk.pic == pic):
+                continue
+            if pc_pic is not None and not np.all(chunk.pc_pic == pc_pic):
+                continue
+            return chunk
+        chunk = Chunk(pic, pc_pic)
+        self._chunks.append(chunk)
+        self._chunks.sort(reverse=True)
+        self.packing_shape = None
+        self.spritemap_name = None
+        return chunk
+
+    @property
+    def chunks(self):
+        return self._chunks
+
+    def assign_packing(self, h, w, offsets):
+        self.packing_shape = (h, w)
+        for chunk, offset in zip(self.chunks, offsets):
+            chunk.spritemap_ofs = offset
+
+    def get_cost(self, rectcost):
+        return sum([rectcost + chunk.pic.shape[0] * chunk.pic.shape[1] for chunk in self.chunks])
+
+    def write_images(self, directory, spritemap_name):
+        pic = np.zeros(self.packing_shape + (4,), np.uint8)
+        if self.has_player_color:
+            pc_pic = np.zeros(self.packing_shape + (4,), np.uint8)
+        for chunk in self.chunks:
+            pic[chunk.spritemap_ofs[0]:chunk.spritemap_ofs[0] + chunk.pic.shape[0],
+                chunk.spritemap_ofs[1]:chunk.spritemap_ofs[1] + chunk.pic.shape[1]] = chunk.pic
+            if self.has_player_color:
+                pc_pic[chunk.spritemap_ofs[0]:chunk.spritemap_ofs[0] + chunk.pic.shape[0],
+                       chunk.spritemap_ofs[1]:chunk.spritemap_ofs[1] + chunk.pic.shape[1]] = chunk.pc_pic
+
+        self.spritemap_name = spritemap_name
+        Image.fromarray(pic).save(directory + '/' + spritemap_name + '.png')
+        if self.has_player_color:
+            Image.fromarray(pc_pic[:,:,0]).save(directory + '/' + spritemap_name + '_pc.png')
+
+
+class AnimationBlits(Animation):
+    def __init__(self, chunkset):
+        super(AnimationBlits, self).__init__()
+        self.chunkset = chunkset
+        self.frames = []
+        self.has_player_color = chunkset.has_player_color
+        self.shape = (0, 0)
+        self.hotspot = (0, 0)
+        self.bbox = (0, 0, 0, 0)
+
+    def append_frame(self, blits):
+        self.frames.append(blits)
+        bbox = (
+            min([blit.offset[0] for blit in blits]),
+            min([blit.offset[1] for blit in blits]),
+            max([blit.offset[0] + blit.chunk.pic.shape[0] for blit in blits]),
+            max([blit.offset[1] + blit.chunk.pic.shape[1] for blit in blits]),
+        )
+        self.bbox = (
+            min(self.bbox[0], bbox[0]),
+            min(self.bbox[1], bbox[1]),
+            max(self.bbox[2], bbox[2]),
+            max(self.bbox[3], bbox[3]),
+        )
+        self.shape = (self.bbox[2] - self.bbox[0], self.bbox[3] - self.bbox[1])
+        self.hotspot = (-self.bbox[0], -self.bbox[1])
+
+    def get_nrframes(self):
+        return len(self.frames)
+
+    def get_frame(self, idx):
+        frame = self.frames[idx]
+        pic = np.zeros(self.shape + (4,))
+        if self.has_player_color:
+            pc_pic = np.zeros(self.shape + (4,))
+        else:
+            pc_pic = None
+
+        for blit in frame:
+            destrect = (
+                blit.offset[0] + self.hotspot[0],
+                blit.offset[1] + self.hotspot[1],
+                blit.offset[0] + self.hotspot[0] + blit.chunk.pic.shape[0],
+                blit.offset[1] + self.hotspot[1] + blit.chunk.pic.shape[1],
+            )
+            pic[destrect[0]:destrect[2], destrect[1]:destrect[3]] = blit.chunk.pic
+            if pc_pic is not None:
+                pc_pic[destrect[0]:destrect[2], destrect[1]:destrect[3]] = blit.chunk.pc_pic
+
+        return FullFrame(pic, pc_pic)
+
+    def get_cost(self, rectcost):
+        chunks = []
+        for frame in self.frames:
+            for blit in frame:
+                for chunk in chunks:
+                    if chunk is blit.chunk:
+                        break
+                else:
+                    chunks.append(blit.chunk)
+        return sum([
+            rectcost + chunk.pic.shape[0] * chunk.pic.shape[1]
+            for chunk in chunks
+        ])
+
+    def write(self, directory, conf_section):
+        for key, value in self.options.iteritems():
+            conf_section.set(key, value)
+        conf_section.set('format', 'blits')
+        conf_section.set('nrframes', str(len(self.frames)))
+        conf_section.set('spritemap', self.chunkset.spritemap_name)
+        for idx, blits in enumerate(self.frames):
+            conf_section.set(
+                '%d' % (idx),
+                ';'.join([
+                    '%d,%d,%d,%d@%d,%d' % (
+                        blit.chunk.spritemap_ofs[1], blit.chunk.spritemap_ofs[0],
+                        blit.chunk.pic.shape[1], blit.chunk.pic.shape[0],
+                        blit.offset[1], blit.offset[0]
+                    )
+                    for blit in self.frames[idx]
+                ])
+            )
+
+    def copy(self, chunkset):
+        """
+        Create a copy of this animation that stores its chunk in the given chunkset
+        """
+        if chunkset.has_player_color != self.has_player_color:
+            raise Exception('AnimationBlits.copy: inconsistent has_player_color')
+        new_anim = AnimationBlits(chunkset)
+        new_anim.options.update(self.options)
+        for frame in self.frames:
+            blits = []
+            for blit in frame:
+                chunk = chunkset.make_chunk(
+                    blit.chunk.pic, blit.chunk.pc_pic,
+                    (0,0) + blit.chunk.pic.shape[0:2]
+                )
+                blits.append(Blit(chunk, blit.offset))
+            new_anim.append_frame(blits)
+        return new_anim
+
+    @staticmethod
+    def load(directory, section_dict, context=None):
+        spritemap_name = section_dict.pop('spritemap')
+        nrframes = int(section_dict.pop('nrframes'))
+
+        fn = directory + '/' + spritemap_name + '.png'
+        spritemap = np.asarray(Image.open(fn))
+        if context is not None:
+            context.filenames.add(fn)
+            context.spritemap_names.add(spritemap_name)
+
+        fn = directory + '/' + spritemap_name + '_pc.png'
+        has_player_color = os.path.exists(fn)
+        if has_player_color:
+            spritemap_pc = np.asarray(Image.open(fn))
+            if context is not None:
+                context.filenames.add(fn)
+            if len(spritemap_pc.shape) == 2:
+                rgba = np.zeros(spritemap_pc.shape + (4,))
+                rgba[:,:,0] = spritemap_pc
+                rgba[:,:,1] = spritemap_pc
+                rgba[:,:,2] = spritemap_pc
+                rgba[:,:,3] = 255
+                spritemap_pc = rgba
+        else:
+            spritemap_pc = None
+
+        chunkset = ChunkSet(has_player_color)
+        anim = AnimationBlits(chunkset)
+        for framenr in xrange(nrframes):
+            blitdescrs = [
+                [int(s) for s in _re_blit.match(blit).groups()]
+                for blit in section_dict.pop(str(framenr)).split(';')
+            ]
+            blits = []
+            for blitdescr in blitdescrs:
+                chunk = chunkset.make_chunk(
+                    spritemap, spritemap_pc,
+                    (blitdescr[1], blitdescr[0], blitdescr[1] + blitdescr[3], blitdescr[0] + blitdescr[2])
+                )
+                blits.append(Blit(chunk, (blitdescr[5], blitdescr[4])))
+            anim.append_frame(blits)
+
+        return anim
+
+
+def load_glob(filename_glob, context=None):
+    """
+    Load an animation from a list of image files matching
+    the given glob pattern.
+    """
+    rv = []
+
+    def _load(fn, seen_shape):
+        if context is not None:
+            context.filenames.add(fn)
+        img = np.asarray(Image.open(fn).convert("RGBA"))
+        assert len(img.shape) == 3
+
+        if seen_shape and seen_shape != img.shape:
+            raise Exception('Frame %s has different dimensions from previous frames' % (fn))
+        return img
+
+    seen_shape = None
+    have_pc = None
+    for idx, fn in enumerate(sorted(glob(filename_glob))):
+        pic = _load(fn, seen_shape)
+        if seen_shape is None:
+            seen_shape = pic.shape
+        pc_fn = os.path.splitext(fn)[0] + "_pc.png"
+        pc_exists = os.path.exists(pc_fn)
+        if have_pc is None:
+            have_pc = pc_exists
+        elif have_pc != pc_exists:
+            raise Exception('Either all frames or none of the frames must have a pc image')
+        if pc_exists:
+            pc_pic = _load(pc_fn, seen_shape)
+        else:
+            pc_pic = None
+
+        rv.append(FullFrame(pic, pc_pic))
+
+    return AnimationFullFrames(rv)
+
+def load_packed(directory, section_dict, context=None):
+    pics = section_dict.pop('pics')
+    hotspot = tuple(reversed([int(x) for x in section_dict.pop('hotspot').split()]))
+    dims = tuple(reversed([int(x) for x in section_dict.pop('dimensions').split()]))
+    base_offset = tuple(reversed([int(x) for x in section_dict.pop('base_offset').split()]))
+
+    fn = directory + '/' + pics
+    spritemap = np.asarray(Image.open(fn))
+    if context is not None:
+        context.filenames.add(fn)
+        context.spritemap_names.add(pics.replace('.png', ''))
+
+    fn = directory + '/' + pics.replace('.png', '_pc.png')
+    has_player_color = os.path.exists(fn)
+    if has_player_color:
+        spritemap_pc = np.asarray(Image.open(fn))
+        if context is not None:
+            context.filenames.add(fn)
+        if len(spritemap_pc.shape) == 2:
+            rgba = np.zeros(spritemap_pc.shape + (4,))
+            rgba[:,:,0] = spritemap_pc
+            rgba[:,:,1] = spritemap_pc
+            rgba[:,:,2] = spritemap_pc
+            rgba[:,:,3] = 255
+            spritemap_pc = rgba
+    else:
+        spritemap_pc = None
+
+    nrframes = 1
+    regions = []
+    for name in section_dict.keys():
+        if not name.startswith('region_'):
+            continue
+        region_descr = section_dict.pop(name).split(':')
+        region = (tuple([int(x) for x in region_descr[0].split()]), [
+            tuple([int(x) for x in frame.split()])
+            for frame in region_descr[1].split(';')
+        ])
+        if not regions:
+            nrframes = len(region[1])
+        else:
+            if nrframes != len(region[1]):
+                raise Exception('inconsistent number of frames in packed=true animation')
+        regions.append(region)
+
+    chunkset = ChunkSet(has_player_color)
+    anim = AnimationBlits(chunkset)
+
+    base_chunk = chunkset.make_chunk(
+        spritemap, spritemap_pc,
+        (base_offset[0], base_offset[1], base_offset[0] + dims[0], base_offset[1] + dims[1])
+    )
+    for framenr in xrange(nrframes):
+        blits = [Blit(base_chunk, (-hotspot[0], -hotspot[1]))]
+        for region in regions:
+            ofs = (region[1][framenr][1], region[1][framenr][0])
+            chunk = chunkset.make_chunk(
+                spritemap, spritemap_pc,
+                (ofs[0], ofs[1], ofs[0] + region[0][3], ofs[1] + region[0][2])
+            )
+            blits.append(Blit(chunk, (region[0][1] - hotspot[0], region[0][0] - hotspot[1])))
+        anim.append_frame(blits)
+
+    return anim
+
+def load_section(directory, section, context=None):
+    d = dict([(key, value) for key, value in section.iterentries()])
+    format = d.pop('format', None)
+    typ = 2 if format == 'blits' else 1 if d.pop('packed', 'false').lower() == 'true' else 0
+    if typ == 0:
+        pics = d.pop('pics')
+        anim = load_glob(directory + '/' + pics, context)
+        anim.hotspot = tuple([int(v) for v in _re_point.match(d.pop('hotspot')).groups()[::-1]])
+    elif typ == 2:
+        anim = AnimationBlits.load(directory, d, context)
+    elif typ == 1:
+        anim = load_packed(directory, d, context)
+    else:
+        raise Exception('cannot load this type of animation yet')
+    anim.options.update(d)
+    return anim
+
+def load_legacy_diranims(directory, name, section, context=None):
+    d = dict([(key, value) for key, value in section.iterentries()])
+    dirpics = d.pop('dirpics')
+    hotspot = tuple([int(v) for v in _re_point.match(d.pop('hotspot')).groups()[::-1]])
+    animations = {}
+    for direction in ['e', 'ne', 'nw', 'w', 'sw', 'se']:
+        anim = load_glob(directory + '/' + dirpics.replace('!!', direction), context)
+        anim.hotspot = hotspot
+        anim.options.update(d)
+        animations['%s_%s' % (name, direction)] = anim
+    return animations
+
+def load_conf(directory, anim, context=None):
+    with open(directory + '/conf', 'r') as filp:
+        conf = pywi.config.read(filp)
+    section = conf.get_section(anim)
+    return load_section(directory, section, context)

=== added file 'utils/pywi/config.py'
--- utils/pywi/config.py	1970-01-01 00:00:00 +0000
+++ utils/pywi/config.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,184 @@
+"""
+Read and write Widelands-style conf files
+"""
+
+# TODO(sirver): This should be used for the Website as well.
+
+import collections
+import re
+
+SECTION=1
+ENTRY=2
+
+Line = collections.namedtuple('Line', ('text', 'type', 'key', 'value'))
+
+_re_section = re.compile('\[(.+?)\]')
+_re_entry = re.compile('(\\S+?)\\s*=_?\\s*([^#]*)')
+
+class Section(object):
+    def __init__(self, file, line):
+        self.file = file
+        self.line = line
+
+    def __getitem__(self, key):
+        for line in self.file.lines[self.line:]:
+            if line.type == SECTION:
+                break
+            if line.type == ENTRY:
+                if line.key == key:
+                    return line.value
+        raise KeyError('key "%s" not found' % (key))
+
+    def __contains__(self, key):
+        for line in self.file.lines[self.line:]:
+            if line.type == SECTION:
+                break
+            if line.type == ENTRY and line.key == key:
+                return True
+        return False
+
+    def iterentries(self):
+        for line in self.file.lines[self.line:]:
+            if line.type == SECTION:
+                break
+            if line.type == ENTRY:
+                yield line.key, line.value
+
+    def set(self, key, value):
+        lastnonempty = -1
+        for ofs, line in enumerate(self.file.lines[self.line:]):
+            if line.type == ENTRY:
+                if line.key == key:
+                    self.file.lines[self.line + ofs] = self.file._parse_line(
+                        '%s = %s' % (key, value)
+                    )
+                    ofs += 1
+                    while ofs < len(self.file.lines) - self.line:
+                        line = self.file.lines[self.line + ofs]
+                        if line.type == SECTION:
+                            break
+                        if line.type == ENTRY and line.key == key:
+                            self.file.remove_line(self.line + ofs)
+                        else:
+                            ofs += 1
+                    return
+
+            if line.type == SECTION:
+                break
+            if line.text:
+                lastnonempty = ofs
+        self.file.insert_line(self.line + lastnonempty + 1, '%s = %s' % (key, value))
+
+class File(object):
+    """
+    Represent a Widelands-style conf file.
+
+    This class stores the original source of the file,
+    thus preserving comments and formatting where possible.
+    """
+    def __init__(self):
+        self.lines = []
+        self._sections = {}
+
+    def write(self, filp):
+        for line in self.lines:
+            print >>filp, line.text
+
+    def insert_line(self, where, line):
+        """
+        Pre-parse and insert the given line
+        """
+        if where < 0:
+            where = len(self.lines) + where
+        self.lines.insert(where, self._parse_line(line))
+        new_sections = {}
+        for key, section in self._sections.iteritems():
+            if where >= key:
+                new_sections[key] = section
+            else:
+                section.line = key + 1
+                new_sections[key + 1] = section
+        self._sections = new_sections
+
+    def remove_line(self, where):
+        if where < 0:
+            where = len(self.lines) + where
+        del self.lines[where]
+        new_sections = {}
+        for key, section in self._sections.iteritems():
+            if where == key - 1:
+                section.line = None
+            elif where < key - 1:
+                section.line = key - 1
+                new_sections[key - 1] = section
+        self._sections = new_sections
+
+    def _parse_line(self, line):
+        line = line.strip()
+        if not line or line[0] == '#':
+            return Line(line, 0, None, None)
+
+        if line[0] == '[':
+            m = _re_section.match(line)
+            if not m:
+                raise Exception('incomplete section definition')
+            return Line(line, SECTION, None, m.group(1))
+
+        m = _re_entry.match(line)
+        if m:
+            return Line(line, ENTRY, m.group(1).strip(), m.group(2).strip())
+
+        raise Exception('failed to parse line')
+
+    def get_section(self, name):
+        for idx, line in enumerate(self.lines):
+            if line.type == SECTION and line.value == name:
+                if idx not in self._sections:
+                    self._sections[idx + 1] = Section(self, idx + 1)
+                return self._sections[idx + 1]
+        raise Exception('section "%s" not found' % (name))
+
+    def make_section(self, name):
+        for idx, line in enumerate(self.lines):
+            if line.type == SECTION and line.value == name:
+                idx += 1
+                while idx < len(self.lines) and self.lines[idx].type != SECTION:
+                    self.remove_line(idx)
+                self.insert_line(idx, '')
+                if idx not in self._sections:
+                    self._sections[idx] = Section(self, idx)
+                return self._sections[idx]
+        if self.lines and self.lines[-1].text:
+            self.insert_line(len(self.lines), '')
+        self.insert_line(len(self.lines), '[%s]' % (name))
+        self._sections[len(self.lines)] = Section(self, len(self.lines))
+        return self._sections[len(self.lines)]
+
+    def remove_section(self, name):
+        for idx, line in enumerate(self.lines):
+            if line.type == SECTION and line.value == name:
+                self.remove_line(idx)
+                while idx < len(self.lines) and self.lines[idx].type != SECTION:
+                    self.remove_line(idx)
+                return
+        raise KeyError("no section '%s' found" % (name))
+
+    def itersections(self):
+        """
+        Iterate through (name, section) pairs
+        """
+        for idx, line in enumerate(self.lines):
+            if line.type == SECTION:
+                if idx + 1 not in self._sections:
+                    self._sections[idx + 1] = Section(self, idx + 1)
+                yield (line.value, self._sections[idx + 1])
+
+
+def read(filp):
+    """
+    Read the given file object as a Widelands-style conf file.
+    """
+    f = File()
+    for line in filp:
+        f.insert_line(len(f.lines), line)
+    return f

=== added file 'utils/pywi/packing.py'
--- utils/pywi/packing.py	1970-01-01 00:00:00 +0000
+++ utils/pywi/packing.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,101 @@
+"""
+Algorithms for rectangle packing
+"""
+
+
+class Packer(object):
+    """
+    The basic algorithm implemented here is 2D bin packing in a tree with some
+    cleverness (for example not knowing the prior size of the final image. The
+    best description of the algorithm I found is here
+    http://codeincomplete.com/posts/2011/5/7/bin_packing/.
+    """
+
+    def fit(self, blocks):
+        self.root = { "x": 0, "y": 0, "w": blocks[0].w, "h": blocks[0].h, "used": False }
+        self.blocks = blocks
+        for b in blocks:
+            node = self.find_node(self.root, b.w, b.h)
+            if node:
+                b.node = self.split_node(node, b.w, b.h)
+            else:
+                b.node = self.grow_node(b.w, b.h);
+            assert(b.node)
+
+
+    def find_node(self, root, w, h):
+        if root["used"]:
+            return self.find_node(root["right"], w, h) or self.find_node(root["down"], w, h)
+        if (w <= root["w"] and h <= root["h"]):
+            return root
+
+    def split_node(self, node, w, h):
+        node['used'] = True
+        node['down'] = { "x": node["x"], "y": node["y"] + h, "w": node["w"], "h": node["h"] - h, "used": False }
+        node['right'] = { "x": node["x"] + w, "y": node["y"], "w": node["w"] - w, "h": h, "used": False};
+        return node
+
+    def grow_node(self, w, h):
+        can_grow_down = w <= self.root["w"]
+        can_grow_right = h <= self.root["h"]
+
+        assert can_grow_down or can_grow_right
+
+        # Grow to stay 'squarish'
+        should_grow_right = can_grow_right and (self.root["h"] >= (self.root["w"] + w))
+        should_grow_down = can_grow_down and (self.root["w"] >= (self.root["h"] + h))
+
+        if (should_grow_right):
+          return self.grow_right(w, h);
+        elif (should_grow_down):
+          return self.grow_down(w, h);
+        elif (can_grow_right):
+          return self.grow_right(w, h);
+        elif (can_grow_down):
+         return self.grow_down(w, h);
+        # Damn, no space for this. Should never happen.
+        assert(0)
+
+    def grow_right(self, w, h):
+        self.root = {
+                'used': True,
+                'x': 0, 'y': 0, 'w': self.root['w'] + w, 'h': self.root['h'], 'down': self.root,
+                'right': { 'x': self.root["w"], 'y': 0, 'w': w, 'h': self.root['h'], 'used': False },
+                }
+        node = self.find_node(self.root, w, h)
+        if node:
+            return self.split_node(node, w, h)
+
+    def grow_down(self, w, h):
+        self.root = {
+                'used': True,
+                'x': 0, 'y': 0, 'w': self.root['w'], 'h': self.root['h'] + h, 'right': self.root,
+                'down': { 'x': 0, 'y': self.root["h"], 'w': self.root["w"], 'h': h, 'used': False },
+                }
+        node = self.find_node(self.root, w, h)
+        if node:
+            return self.split_node(node, w, h)
+
+    def get_result(self):
+        return [
+            (b.node['x'], b.node['y'])
+            for b in self.blocks
+        ]
+
+class Block(object):
+    def __init__(self, w, h):
+        self.w = w
+        self.h = h
+        self.node = None
+
+def pack(rectangles):
+    """
+    Given a list of (w, h) tuples describing rectangle sizes,
+    determine a packing of those rectangles.
+
+    Returns a tuple (w, h, offsets), where offsets is a list
+    of (x, y) tuples describing where to put the given rectangles.
+    """
+    p = Packer()
+    p.fit([Block(r[0], r[1]) for r in rectangles])
+    return (p.root['w'], p.root['h'], p.get_result())

=== added file 'utils/pywi/tests.py'
--- utils/pywi/tests.py	1970-01-01 00:00:00 +0000
+++ utils/pywi/tests.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+"""
+Tests for various pywi modules
+"""
+
+import os
+import StringIO
+import unittest
+
+source_dir = os.path.dirname(os.path.abspath(__file__))
+root_dir = os.path.normpath(source_dir + '/../..')
+
+import animation
+import config
+
+class TestConfig(unittest.TestCase):
+    def sample_text(self):
+        return """
+key = this is global
+
+[section]
+foo=bar # comment
+# comment
+baz= quux
+"""
+
+    def test_read(self):
+        c = config.read(StringIO.StringIO(self.sample_text()))
+        s = c.get_section('section')
+        self.assertEqual(s['foo'], 'bar')
+        self.assertEqual(s['baz'], 'quux')
+        self.assertFalse('none' in s)
+
+    def test_itersections(self):
+        c = config.read(StringIO.StringIO(self.sample_text()))
+        self.assertEqual([name for name, section in c.itersections()], ['section'])
+
+    def test_modify(self):
+        c = config.read(StringIO.StringIO(self.sample_text()))
+        s = c.get_section('section')
+        s.set('foo', 'other')
+        s.set('tst', 'blah')
+        self.assertEqual(s['foo'], 'other')
+        self.assertEqual(s['tst'], 'blah')
+        stringio = StringIO.StringIO()
+        c.write(stringio)
+        c = config.read(StringIO.StringIO(stringio.getvalue()))
+        s = c.get_section('section')
+        self.assertEqual(s['foo'], 'other')
+        self.assertEqual(s['baz'], 'quux')
+        self.assertEqual(s['tst'], 'blah')
+
+    def test_remove_section(self):
+        c = config.read(StringIO.StringIO(self.sample_text()))
+        s = c.make_section('other')
+        s.set('x', 'y')
+        c.remove_section('other')
+        self.assertEqual([name for name, section in c.itersections()], ['section'])
+        s = c.get_section('section')
+        self.assertItemsEqual([(k,v) for k,v in s.iterentries()], [('foo', 'bar'), ('baz', 'quux')])
+
+    def test_make_section(self):
+        c = config.read(StringIO.StringIO(self.sample_text()))
+        s = c.make_section('section')
+        self.assertEqual([(k,v) for k,v in s.iterentries()], [])
+        s.set('foo', 'written')
+        s2 = c.make_section('new')
+        s2.set('bar', 'baz')
+        stringio = StringIO.StringIO()
+        c.write(stringio)
+        c = config.read(StringIO.StringIO(stringio.getvalue()))
+        s = c.get_section('section')
+        self.assertItemsEqual([(k,v) for k,v in s.iterentries()], [('foo', 'written')])
+        s2 = c.get_section('new')
+        self.assertItemsEqual([(k,v) for k,v in s2.iterentries()], [('bar', 'baz')])
+
+    def test_makers(self):
+        c = config.File()
+        s1 = c.make_section('sec1')
+        s1.set('0', '0')
+        s1.set('1', '1')
+        s2 = c.make_section('sec2')
+        s2.set('a', 'a')
+        s2.set('b', 'b')
+        self.assertItemsEqual([(k,v) for k,v in s1.iterentries()], [('0', '0'), ('1', '1')])
+        self.assertItemsEqual([(k,v) for k,v in s2.iterentries()], [('a', 'a'), ('b', 'b')])
+        stringio = StringIO.StringIO()
+        c.write(stringio)
+        c = config.read(StringIO.StringIO(stringio.getvalue()))
+        s1 = c.get_section('sec1')
+        s2 = c.get_section('sec2')
+        self.assertItemsEqual([(k,v) for k,v in s1.iterentries()], [('0', '0'), ('1', '1')])
+        self.assertItemsEqual([(k,v) for k,v in s2.iterentries()], [('a', 'a'), ('b', 'b')])
+
+class TestAnimation(unittest.TestCase):
+    def test_load_conf(self):
+        # This needs to be updated when the game data changes
+        tests = [
+            {
+                'directory': root_dir + '/tribes/barbarians/carrier',
+                'animation': 'idle',
+                'shape': (28, 21),
+                'hotspot': (21, 14),
+                'has_player_color': True,
+                'nrframes': 100,
+            },
+        ]
+
+        for test in tests:
+            anim = animation.load_conf(test['directory'], test['animation'])
+            self.assertEqual(anim.shape, test['shape'])
+            self.assertEqual(anim.has_player_color, test['has_player_color'])
+            self.assertEqual(anim.get_nrframes(), test['nrframes'])
+
+
+if __name__ == '__main__':
+    unittest.main()

=== added file 'utils/test/test_make_spritemap.py'
--- utils/test/test_make_spritemap.py	1970-01-01 00:00:00 +0000
+++ utils/test/test_make_spritemap.py	2014-03-16 21:52:17 +0000
@@ -0,0 +1,161 @@
+#!/usr/bin/env python
+
+import numpy as np
+import os
+import sys
+import unittest
+
+sys.path.append(os.path.normpath(os.path.dirname(os.path.abspath(__file__)) + '/..'))
+import make_spritemap
+
+class TestMinimumAverageCostRectangle(unittest.TestCase):
+    def test_case1(self):
+        FRAGMENT_COST = 4
+        bitmask = np.array([
+            [False, False, True],
+            [False, False, False],
+            [True, False, False],
+            [True, False, False]
+        ])
+        cost, rectangle = make_spritemap.minimum_average_cost_rectangle(bitmask, FRAGMENT_COST=FRAGMENT_COST)
+        self.assertEqual(rectangle, (2, 0, 4, 1))
+        self.assertAlmostEqual(cost, (FRAGMENT_COST + 2) / 2.0)
+
+class TestMinimumAverageCostGrow(unittest.TestCase):
+    def test_basic_right(self):
+        bitmask = np.array([
+            [False, False, False, False],
+            [False, False, False, False],
+            [False, True,  True,  False],
+            [False, True,  False, False],
+            [False, False, False, False],
+        ])
+        cost, rectangle = make_spritemap.minimum_average_cost_grow(bitmask, (2, 1, 4, 2))
+        self.assertEqual(rectangle, (2, 1, 4, 3))
+        self.assertAlmostEqual(cost, 2.0)
+
+        cost, rectangle = make_spritemap.minimum_average_cost_grow(bitmask, (2, 1, 4, 3))
+        self.assertEqual(rectangle, (2, 1, 4, 3))
+        self.assertEqual(cost, None)
+
+    def test_basic_left(self):
+        bitmask = np.array([
+            [False, False, False, False],
+            [False, False, False, False],
+            [False, True,  False, False],
+            [True,  False, False, False],
+            [False, False, False, False],
+        ])
+        cost, rectangle = make_spritemap.minimum_average_cost_grow(bitmask, (2, 3, 4, 4))
+        self.assertEqual(rectangle, (2, 0, 4, 4))
+        self.assertAlmostEqual(cost, 3.0)
+
+    def test_basic_vertical(self):
+        bitmask = np.array([
+            [False, True,  False, False],
+            [False, False, False, False],
+            [False, True,  False, False],
+            [False, False, False, True],
+            [False, False, False, False],
+        ])
+        cost, rectangle = make_spritemap.minimum_average_cost_grow(bitmask, (3, 1, 4, 2))
+        self.assertEqual(rectangle, (2, 1, 4, 2))
+        self.assertAlmostEqual(cost, 1.0)
+
+        bitmask = np.array([
+            [False, True,  False, False],
+            [False, False, False, False],
+            [False, False, False, False],
+            [False, True,  False, False],
+            [False, False, False, False],
+        ])
+        cost, rectangle = make_spritemap.minimum_average_cost_grow(bitmask, (2, 1, 3, 2))
+        self.assertEqual(rectangle, (2, 1, 4, 2))
+        self.assertAlmostEqual(cost, 1.0)
+
+
+class TestComputeRectangleCovering(unittest.TestCase):
+    def test_basic(self):
+        """
+        Tests a case where the optimal solution consists of a single
+        minimum average cost rectangle.
+        """
+        FRAGMENT_COST = 4
+        bitmask = np.array([
+            [False, False, False, False],
+            [False, False, False, False],
+            [False, True,  True,  False],
+            [False, True,  False, False],
+            [False, False, False, False],
+        ])
+        cost, rectangles = make_spritemap.compute_rectangle_covering(
+            bitmask,
+            FRAGMENT_COST=FRAGMENT_COST
+        )
+        self.assertEqual(cost, FRAGMENT_COST + 4)
+        self.assertItemsEqual(rectangles, [(2, 1, 4, 3)])
+
+    def test_grow(self):
+        """
+        Tests a case where the optimal solution can be found
+        by growing the initial minimum average cost rectangle.
+        """
+        FRAGMENT_COST = 4
+        bitmask = np.array([
+            [False, False, False, False, False, False],
+            [False, False, False, False, False, False],
+            [False, True,  True,  False, False, False],
+            [False, True,  False, False, False, False],
+            [False, True,  False, False, False, False],
+            [False, True,  False, False, False, False],
+            [False, False, False, False, False, False],
+        ])
+        cost, rectangles = make_spritemap.compute_rectangle_covering(
+            bitmask,
+            FRAGMENT_COST=FRAGMENT_COST
+        )
+        self.assertEqual(cost, FRAGMENT_COST + 8)
+        self.assertItemsEqual(rectangles, [(2, 1, 6, 3)])
+
+    def test_nogrow(self):
+        """
+        Similar to test_grow, but tests a situation in which
+        growing the initial rectangle is in fact not optimal.
+        """
+        FRAGMENT_COST = 4
+        bitmask = np.array([
+            [False, False, False, False, False, False],
+            [False, False, False, False, False, False],
+            [False, True,  True,  True,  False, False],
+            [False, True,  False, False, False, False],
+            [False, True,  False, False, False, False],
+            [False, True,  False, False, False, False],
+            [False, False, False, False, False, False],
+        ])
+        cost, rectangles = make_spritemap.compute_rectangle_covering(
+            bitmask,
+            FRAGMENT_COST=FRAGMENT_COST
+        )
+        self.assertEqual(cost, 2 * FRAGMENT_COST + 6)
+        self.assertItemsEqual(rectangles, [(2, 1, 6, 2), (2, 2, 3, 4)])
+
+    def test_diag_growth_bug(self):
+        """
+        Regression test for a silly bug.
+        """
+        FRAGMENT_COST = 4
+        bitmask = np.array([
+            [True,  False, False, False],
+            [False, False, False, False],
+            [False, False, False, False],
+            [False, False, False, True],
+        ])
+        cost, rectangles = make_spritemap.compute_rectangle_covering(
+            bitmask,
+            FRAGMENT_COST=FRAGMENT_COST
+        )
+        self.assertEqual(cost, 2 * FRAGMENT_COST + 2)
+        self.assertItemsEqual(rectangles, [(0, 0, 1, 1), (3, 3, 4, 4)])
+
+if __name__ == '__main__':
+    unittest.main()

=== modified file 'worlds/blackland/bush1/conf'
--- worlds/blackland/bush1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/bush1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 9

=== modified file 'worlds/blackland/bush2/conf'
--- worlds/blackland/bush2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/bush2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 9

=== modified file 'worlds/blackland/bush3/conf'
--- worlds/blackland/bush3/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/bush3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=11 14

=== modified file 'worlds/blackland/bush4/conf'
--- worlds/blackland/bush4/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/bush4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 10

=== modified file 'worlds/blackland/bush5/conf'
--- worlds/blackland/bush5/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/bush5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=14 13

=== modified file 'worlds/blackland/cactus1/conf'
--- worlds/blackland/cactus1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/cactus1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 71

=== modified file 'worlds/blackland/cactus2/conf'
--- worlds/blackland/cactus2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/cactus2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=17 25

=== modified file 'worlds/blackland/deadtree1/conf'
--- worlds/blackland/deadtree1/conf	2008-12-15 08:21:26 +0000
+++ worlds/blackland/deadtree1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=25 56

=== modified file 'worlds/blackland/deadtree2/conf'
--- worlds/blackland/deadtree2/conf	2008-12-15 08:21:26 +0000
+++ worlds/blackland/deadtree2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=27 56

=== modified file 'worlds/blackland/deadtree3/conf'
--- worlds/blackland/deadtree3/conf	2008-12-15 08:21:26 +0000
+++ worlds/blackland/deadtree3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/blackland/deadtree4/conf'
--- worlds/blackland/deadtree4/conf	2008-12-15 08:21:26 +0000
+++ worlds/blackland/deadtree4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/blackland/duck/conf'
--- worlds/blackland/duck/conf	2010-03-17 22:59:02 +0000
+++ worlds/blackland/duck/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 swimming=1  # defaults to 0, is only in the water?
-picture=duck_00.png
 
 [idle]
 pics=duck_??.png

=== modified file 'worlds/blackland/grass1/conf'
--- worlds/blackland/grass1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/grass1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 20

=== modified file 'worlds/blackland/grass2/conf'
--- worlds/blackland/grass2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/grass2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 16

=== modified file 'worlds/blackland/grass3/conf'
--- worlds/blackland/grass3/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/grass3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 11

=== modified file 'worlds/blackland/mushroom1/conf'
--- worlds/blackland/mushroom1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/mushroom1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=6 9

=== modified file 'worlds/blackland/mushroom2/conf'
--- worlds/blackland/mushroom2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/mushroom2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 7

=== modified file 'worlds/blackland/pebble1/conf'
--- worlds/blackland/pebble1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 4

=== modified file 'worlds/blackland/pebble2/conf'
--- worlds/blackland/pebble2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 9

=== modified file 'worlds/blackland/pebble3/conf'
--- worlds/blackland/pebble3/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 9

=== modified file 'worlds/blackland/pebble4/conf'
--- worlds/blackland/pebble4/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 5

=== modified file 'worlds/blackland/pebble5/conf'
--- worlds/blackland/pebble5/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=9 6

=== modified file 'worlds/blackland/pebble6/conf'
--- worlds/blackland/pebble6/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/pebble6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 13

=== modified file 'worlds/blackland/sheep/conf'
--- worlds/blackland/sheep/conf	2010-03-17 22:59:02 +0000
+++ worlds/blackland/sheep/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 attrib=eatable
 program=remove
-picture=sheep_00.png
 
 [remove]
 0=remove

=== modified file 'worlds/blackland/skeleton1/conf'
--- worlds/blackland/skeleton1/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/skeleton1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/blackland/skeleton2/conf'
--- worlds/blackland/skeleton2/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/skeleton2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=26 32

=== modified file 'worlds/blackland/skeleton3/conf'
--- worlds/blackland/skeleton3/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/skeleton3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=47 69

=== modified file 'worlds/blackland/sstones1/conf'
--- worlds/blackland/sstones1/conf	2011-08-23 13:26:16 +0000
+++ worlds/blackland/sstones1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=18 50

=== modified file 'worlds/blackland/sstones2/conf'
--- worlds/blackland/sstones2/conf	2011-08-10 20:17:24 +0000
+++ worlds/blackland/sstones2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=20 38

=== modified file 'worlds/blackland/sstones3/conf'
--- worlds/blackland/sstones3/conf	2011-08-10 20:17:24 +0000
+++ worlds/blackland/sstones3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=25 28

=== modified file 'worlds/blackland/sstones4/conf'
--- worlds/blackland/sstones4/conf	2011-08-10 20:17:24 +0000
+++ worlds/blackland/sstones4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=11 74

=== modified file 'worlds/blackland/sstones5/conf'
--- worlds/blackland/sstones5/conf	2011-08-10 20:17:24 +0000
+++ worlds/blackland/sstones5/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=37 27

=== modified file 'worlds/blackland/sstones6/conf'
--- worlds/blackland/sstones6/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/sstones6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/blackland/sstones7/conf'
--- worlds/blackland/sstones7/conf	2008-11-26 14:23:04 +0000
+++ worlds/blackland/sstones7/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/blackland/stones1/conf'
--- worlds/blackland/stones1/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones1/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/stones2/conf'
--- worlds/blackland/stones2/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones2/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/stones3/conf'
--- worlds/blackland/stones3/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones3/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/stones4/conf'
--- worlds/blackland/stones4/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones4/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/stones5/conf'
--- worlds/blackland/stones5/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones5/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/stones6/conf'
--- worlds/blackland/stones6/conf	2011-08-28 03:33:47 +0000
+++ worlds/blackland/stones6/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=30 75

=== modified file 'worlds/blackland/tree1/conf'
--- worlds/blackland/tree1/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree1/conf	2014-03-16 21:52:17 +0000
@@ -13,7 +13,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree1_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree1_m/conf'
--- worlds/blackland/tree1_m/conf	2009-09-12 10:54:47 +0000
+++ worlds/blackland/tree1_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree1_m_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree1_s/conf'
--- worlds/blackland/tree1_s/conf	2009-09-12 10:54:47 +0000
+++ worlds/blackland/tree1_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree1_s_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree1_t/conf'
--- worlds/blackland/tree1_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree1_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree1_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree2/conf'
--- worlds/blackland/tree2/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree2/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree2_00.png
 
 [terrain affinity]
 strand=      128

=== modified file 'worlds/blackland/tree2_m/conf'
--- worlds/blackland/tree2_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree2_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree2_m_00.png
 
 [terrain affinity]
 strand=      128

=== modified file 'worlds/blackland/tree2_s/conf'
--- worlds/blackland/tree2_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree2_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree2_s_00.png
 
 [terrain affinity]
 strand=      128

=== modified file 'worlds/blackland/tree2_t/conf'
--- worlds/blackland/tree2_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree2_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree2_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree3/conf'
--- worlds/blackland/tree3/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree3/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree3_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree3_m/conf'
--- worlds/blackland/tree3_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree3_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree3_m_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree3_s/conf'
--- worlds/blackland/tree3_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree3_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree3_s_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree3_t/conf'
--- worlds/blackland/tree3_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree3_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree3_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree4/conf'
--- worlds/blackland/tree4/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree4/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree4_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree4_m/conf'
--- worlds/blackland/tree4_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree4_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree4_m_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree4_s/conf'
--- worlds/blackland/tree4_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree4_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree4_s_00.png
 
 [terrain affinity]
 strand=       16

=== modified file 'worlds/blackland/tree4_t/conf'
--- worlds/blackland/tree4_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree4_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree4_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree5/conf'
--- worlds/blackland/tree5/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree5/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree5_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree5_m/conf'
--- worlds/blackland/tree5_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree5_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree5_m_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree5_s/conf'
--- worlds/blackland/tree5_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree5_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree5_s_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree5_t/conf'
--- worlds/blackland/tree5_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree5_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree5_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree6/conf'
--- worlds/blackland/tree6/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree6/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree6_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree6_m/conf'
--- worlds/blackland/tree6_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree6_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree6_m_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree6_s/conf'
--- worlds/blackland/tree6_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree6_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree6_s_00.png
 
 [terrain affinity]
 strand=       10

=== modified file 'worlds/blackland/tree6_t/conf'
--- worlds/blackland/tree6_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree6_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree6_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree7/conf'
--- worlds/blackland/tree7/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree7/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree7_00.png
 
 [terrain affinity]
 strand=        2

=== modified file 'worlds/blackland/tree7_m/conf'
--- worlds/blackland/tree7_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree7_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree7_m_00.png
 
 [terrain affinity]
 strand=        2

=== modified file 'worlds/blackland/tree7_s/conf'
--- worlds/blackland/tree7_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree7_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree7_s_00.png
 
 [terrain affinity]
 strand=        2

=== modified file 'worlds/blackland/tree7_t/conf'
--- worlds/blackland/tree7_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree7_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree7_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/blackland/tree8/conf'
--- worlds/blackland/tree8/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree8/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=tree8_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree8_m/conf'
--- worlds/blackland/tree8_m/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree8_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree8_m_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree8_s/conf'
--- worlds/blackland/tree8_s/conf	2009-09-15 21:47:42 +0000
+++ worlds/blackland/tree8_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=tree8_s_00.png
 
 [terrain affinity]
 strand=       32

=== modified file 'worlds/blackland/tree8_t/conf'
--- worlds/blackland/tree8_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/blackland/tree8_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=tree8_t_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/bush1/conf'
--- worlds/desert/bush1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/bush1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 9

=== modified file 'worlds/desert/bush4/conf'
--- worlds/desert/bush4/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/bush4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 10

=== modified file 'worlds/desert/bush5/conf'
--- worlds/desert/bush5/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/bush5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=14 13

=== modified file 'worlds/desert/cactus1/conf'
--- worlds/desert/cactus1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/cactus1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 71

=== modified file 'worlds/desert/cactus2/conf'
--- worlds/desert/cactus2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/cactus2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 71

=== modified file 'worlds/desert/cactus3/conf'
--- worlds/desert/cactus3/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/cactus3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 71

=== modified file 'worlds/desert/cactus4/conf'
--- worlds/desert/cactus4/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/cactus4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=17 25

=== modified file 'worlds/desert/deadtree1/conf'
--- worlds/desert/deadtree1/conf	2008-12-15 08:21:26 +0000
+++ worlds/desert/deadtree1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=25 56

=== modified file 'worlds/desert/deadtree2/conf'
--- worlds/desert/deadtree2/conf	2008-12-15 08:21:26 +0000
+++ worlds/desert/deadtree2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=27 56

=== modified file 'worlds/desert/deadtree3/conf'
--- worlds/desert/deadtree3/conf	2008-12-15 08:21:26 +0000
+++ worlds/desert/deadtree3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/desert/deadtree4/conf'
--- worlds/desert/deadtree4/conf	2008-12-15 08:21:26 +0000
+++ worlds/desert/deadtree4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/desert/duck/conf'
--- worlds/desert/duck/conf	2010-03-17 23:06:07 +0000
+++ worlds/desert/duck/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 swimming=1
-picture=duck_00.png
 
 [idle]
 pics=duck_??.png

=== modified file 'worlds/desert/grass1/conf'
--- worlds/desert/grass1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/grass1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 20

=== modified file 'worlds/desert/grass2/conf'
--- worlds/desert/grass2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/grass2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 16

=== modified file 'worlds/desert/grass3/conf'
--- worlds/desert/grass3/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/grass3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 11

=== modified file 'worlds/desert/mushroom1/conf'
--- worlds/desert/mushroom1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/mushroom1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=6 9

=== modified file 'worlds/desert/mushroom2/conf'
--- worlds/desert/mushroom2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/mushroom2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 7

=== modified file 'worlds/desert/pebble1/conf'
--- worlds/desert/pebble1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 4

=== modified file 'worlds/desert/pebble2/conf'
--- worlds/desert/pebble2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 9

=== modified file 'worlds/desert/pebble3/conf'
--- worlds/desert/pebble3/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 9

=== modified file 'worlds/desert/pebble4/conf'
--- worlds/desert/pebble4/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 5

=== modified file 'worlds/desert/pebble5/conf'
--- worlds/desert/pebble5/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=9 6

=== modified file 'worlds/desert/pebble6/conf'
--- worlds/desert/pebble6/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/pebble6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 13

=== modified file 'worlds/desert/ruin1/conf'
--- worlds/desert/ruin1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/ruin1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/ruin2/conf'
--- worlds/desert/ruin2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/ruin2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/ruin3/conf'
--- worlds/desert/ruin3/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/ruin3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/ruin4/conf'
--- worlds/desert/ruin4/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/ruin4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/ruin5/conf'
--- worlds/desert/ruin5/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/ruin5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/sheep/conf'
--- worlds/desert/sheep/conf	2010-03-17 23:06:07 +0000
+++ worlds/desert/sheep/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 attrib=eatable
 program=remove
-picture=sheep_00.png
 
 [remove]
 0=remove

=== modified file 'worlds/desert/skeleton1/conf'
--- worlds/desert/skeleton1/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/skeleton1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/desert/skeleton2/conf'
--- worlds/desert/skeleton2/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/skeleton2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=47 69

=== modified file 'worlds/desert/skeleton3/conf'
--- worlds/desert/skeleton3/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/skeleton3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=26 32

=== modified file 'worlds/desert/skeleton4/conf'
--- worlds/desert/skeleton4/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/skeleton4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=26 32

=== modified file 'worlds/desert/sstones1/conf'
--- worlds/desert/sstones1/conf	2011-08-23 13:26:16 +0000
+++ worlds/desert/sstones1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=18 49

=== modified file 'worlds/desert/sstones2/conf'
--- worlds/desert/sstones2/conf	2011-08-10 20:17:24 +0000
+++ worlds/desert/sstones2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=20 38

=== modified file 'worlds/desert/sstones3/conf'
--- worlds/desert/sstones3/conf	2011-08-10 20:17:24 +0000
+++ worlds/desert/sstones3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=25 28

=== modified file 'worlds/desert/sstones4/conf'
--- worlds/desert/sstones4/conf	2011-08-10 20:17:24 +0000
+++ worlds/desert/sstones4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=11 73

=== modified file 'worlds/desert/sstones5/conf'
--- worlds/desert/sstones5/conf	2011-08-10 20:17:24 +0000
+++ worlds/desert/sstones5/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=37 27

=== modified file 'worlds/desert/sstones6/conf'
--- worlds/desert/sstones6/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/sstones6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/desert/sstones7/conf'
--- worlds/desert/sstones7/conf	2008-11-26 14:23:04 +0000
+++ worlds/desert/sstones7/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/desert/stones1/conf'
--- worlds/desert/stones1/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones1/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 82

=== modified file 'worlds/desert/stones2/conf'
--- worlds/desert/stones2/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones2/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=36 86

=== modified file 'worlds/desert/stones3/conf'
--- worlds/desert/stones3/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones3/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=39 90

=== modified file 'worlds/desert/stones4/conf'
--- worlds/desert/stones4/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones4/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=40 84

=== modified file 'worlds/desert/stones5/conf'
--- worlds/desert/stones5/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones5/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 89

=== modified file 'worlds/desert/stones6/conf'
--- worlds/desert/stones6/conf	2011-08-09 20:56:36 +0000
+++ worlds/desert/stones6/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 91

=== modified file 'worlds/desert/tree1/conf'
--- worlds/desert/tree1/conf	2009-03-19 13:55:50 +0000
+++ worlds/desert/tree1/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=             20

=== modified file 'worlds/desert/tree1_m/conf'
--- worlds/desert/tree1_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree1_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree1_00.png
 
 [terrain affinity]
 desert1=             20

=== modified file 'worlds/desert/tree1_s/conf'
--- worlds/desert/tree1_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree1_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree1_00.png
 
 [terrain affinity]
 desert1=             20

=== modified file 'worlds/desert/tree1_t/conf'
--- worlds/desert/tree1_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree1_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree1_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree2/conf'
--- worlds/desert/tree2/conf	2009-03-19 13:55:50 +0000
+++ worlds/desert/tree2/conf	2014-03-16 21:52:17 +0000
@@ -12,7 +12,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=             10

=== modified file 'worlds/desert/tree2_m/conf'
--- worlds/desert/tree2_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree2_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree2_00.png
 
 [terrain affinity]
 desert1=             10

=== modified file 'worlds/desert/tree2_s/conf'
--- worlds/desert/tree2_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree2_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree2_00.png
 
 [terrain affinity]
 desert1=             10

=== modified file 'worlds/desert/tree2_t/conf'
--- worlds/desert/tree2_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree2_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree2_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree3/conf'
--- worlds/desert/tree3/conf	2010-03-17 23:06:07 +0000
+++ worlds/desert/tree3/conf	2014-03-16 21:52:17 +0000
@@ -12,7 +12,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=             15

=== modified file 'worlds/desert/tree3_m/conf'
--- worlds/desert/tree3_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree3_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree3_00.png
 
 [terrain affinity]
 desert1=             15

=== modified file 'worlds/desert/tree3_s/conf'
--- worlds/desert/tree3_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree3_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree3_00.png
 
 [terrain affinity]
 desert1=             15

=== modified file 'worlds/desert/tree3_t/conf'
--- worlds/desert/tree3_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree3_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree3_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree4/conf'
--- worlds/desert/tree4/conf	2009-03-19 13:55:50 +0000
+++ worlds/desert/tree4/conf	2014-03-16 21:52:17 +0000
@@ -17,7 +17,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree4_m/conf'
--- worlds/desert/tree4_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree4_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree4_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree4_s/conf'
--- worlds/desert/tree4_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree4_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree4_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree4_t/conf'
--- worlds/desert/tree4_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree4_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree4_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree5/conf'
--- worlds/desert/tree5/conf	2009-03-19 13:55:50 +0000
+++ worlds/desert/tree5/conf	2014-03-16 21:52:17 +0000
@@ -15,7 +15,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree5_m/conf'
--- worlds/desert/tree5_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree5_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree5_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree5_s/conf'
--- worlds/desert/tree5_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree5_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree5_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree5_t/conf'
--- worlds/desert/tree5_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree5_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree5_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree6/conf'
--- worlds/desert/tree6/conf	2009-03-19 13:55:50 +0000
+++ worlds/desert/tree6/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree6_m/conf'
--- worlds/desert/tree6_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree6_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree6_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree6_s/conf'
--- worlds/desert/tree6_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree6_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree6_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree6_t/conf'
--- worlds/desert/tree6_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree6_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree6_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree7/conf'
--- worlds/desert/tree7/conf	2010-03-17 23:06:07 +0000
+++ worlds/desert/tree7/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree7_m/conf'
--- worlds/desert/tree7_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree7_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree7_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree7_s/conf'
--- worlds/desert/tree7_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree7_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree7_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree7_t/conf'
--- worlds/desert/tree7_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree7_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree7_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/desert/tree8/conf'
--- worlds/desert/tree8/conf	2010-03-17 23:06:07 +0000
+++ worlds/desert/tree8/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree8_m/conf'
--- worlds/desert/tree8_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree8_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree8_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree8_s/conf'
--- worlds/desert/tree8_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/desert/tree8_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree8_00.png
 
 [terrain affinity]
 desert1=              2

=== modified file 'worlds/desert/tree8_t/conf'
--- worlds/desert/tree8_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/desert/tree8_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree8_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/bush1/conf'
--- worlds/greenland/bush1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/bush1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 9

=== modified file 'worlds/greenland/bush2/conf'
--- worlds/greenland/bush2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/bush2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 9

=== modified file 'worlds/greenland/bush3/conf'
--- worlds/greenland/bush3/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/bush3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=11 14

=== modified file 'worlds/greenland/bush4/conf'
--- worlds/greenland/bush4/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/bush4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 10

=== modified file 'worlds/greenland/bush5/conf'
--- worlds/greenland/bush5/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/bush5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=14 13

=== modified file 'worlds/greenland/cactus1/conf'
--- worlds/greenland/cactus1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/cactus1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 71

=== modified file 'worlds/greenland/cactus2/conf'
--- worlds/greenland/cactus2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/cactus2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=17 25

=== modified file 'worlds/greenland/deadtree1/conf'
--- worlds/greenland/deadtree1/conf	2009-02-04 13:22:15 +0000
+++ worlds/greenland/deadtree1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=25 56

=== modified file 'worlds/greenland/deadtree2/conf'
--- worlds/greenland/deadtree2/conf	2009-02-04 13:22:15 +0000
+++ worlds/greenland/deadtree2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=27 56

=== modified file 'worlds/greenland/deadtree3/conf'
--- worlds/greenland/deadtree3/conf	2009-02-04 13:22:15 +0000
+++ worlds/greenland/deadtree3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/greenland/deadtree4/conf'
--- worlds/greenland/deadtree4/conf	2009-02-04 13:22:15 +0000
+++ worlds/greenland/deadtree4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/greenland/duck/conf'
--- worlds/greenland/duck/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/duck/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 swimming=1
-picture=duck_00.png
 
 [idle]
 pics=duck_??.png

=== modified file 'worlds/greenland/fallentree/conf'
--- worlds/greenland/fallentree/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/fallentree/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=fallentree_00.png
 
 [program]
 animate=dead 30000

=== modified file 'worlds/greenland/grass1/conf'
--- worlds/greenland/grass1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/grass1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 20

=== modified file 'worlds/greenland/grass2/conf'
--- worlds/greenland/grass2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/grass2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 16

=== modified file 'worlds/greenland/grass3/conf'
--- worlds/greenland/grass3/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/grass3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 11

=== modified file 'worlds/greenland/mushroom1/conf'
--- worlds/greenland/mushroom1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/mushroom1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=6 9

=== modified file 'worlds/greenland/mushroom2/conf'
--- worlds/greenland/mushroom2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/mushroom2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 7

=== modified file 'worlds/greenland/pebble1/conf'
--- worlds/greenland/pebble1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 4

=== modified file 'worlds/greenland/pebble2/conf'
--- worlds/greenland/pebble2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 9

=== modified file 'worlds/greenland/pebble3/conf'
--- worlds/greenland/pebble3/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 9

=== modified file 'worlds/greenland/pebble4/conf'
--- worlds/greenland/pebble4/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 5

=== modified file 'worlds/greenland/pebble5/conf'
--- worlds/greenland/pebble5/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=9 6

=== modified file 'worlds/greenland/pebble6/conf'
--- worlds/greenland/pebble6/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/pebble6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 13

=== modified file 'worlds/greenland/sheep/conf'
--- worlds/greenland/sheep/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/sheep/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 attrib=eatable
 program=remove
-picture=sheep_00.png
 
 [remove]
 0=remove

=== modified file 'worlds/greenland/skeleton1/conf'
--- worlds/greenland/skeleton1/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/skeleton1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/greenland/skeleton2/conf'
--- worlds/greenland/skeleton2/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/skeleton2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=26 32

=== modified file 'worlds/greenland/skeleton3/conf'
--- worlds/greenland/skeleton3/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/skeleton3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=47 69

=== modified file 'worlds/greenland/sstones1/conf'
--- worlds/greenland/sstones1/conf	2011-08-23 13:26:16 +0000
+++ worlds/greenland/sstones1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=18 50

=== modified file 'worlds/greenland/sstones2/conf'
--- worlds/greenland/sstones2/conf	2011-08-10 20:17:24 +0000
+++ worlds/greenland/sstones2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=20 38

=== modified file 'worlds/greenland/sstones3/conf'
--- worlds/greenland/sstones3/conf	2011-08-10 20:17:24 +0000
+++ worlds/greenland/sstones3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=25 28

=== modified file 'worlds/greenland/sstones4/conf'
--- worlds/greenland/sstones4/conf	2011-08-10 20:17:24 +0000
+++ worlds/greenland/sstones4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=11 74

=== modified file 'worlds/greenland/sstones5/conf'
--- worlds/greenland/sstones5/conf	2011-08-10 20:17:24 +0000
+++ worlds/greenland/sstones5/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=37 27

=== modified file 'worlds/greenland/sstones6/conf'
--- worlds/greenland/sstones6/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/sstones6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/greenland/sstones7/conf'
--- worlds/greenland/sstones7/conf	2008-11-26 14:23:04 +0000
+++ worlds/greenland/sstones7/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/greenland/stones1/conf'
--- worlds/greenland/stones1/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones1/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=39 82

=== modified file 'worlds/greenland/stones2/conf'
--- worlds/greenland/stones2/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones2/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=36 86

=== modified file 'worlds/greenland/stones3/conf'
--- worlds/greenland/stones3/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones3/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=40 89

=== modified file 'worlds/greenland/stones4/conf'
--- worlds/greenland/stones4/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones4/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=42 84

=== modified file 'worlds/greenland/stones5/conf'
--- worlds/greenland/stones5/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones5/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=40 89

=== modified file 'worlds/greenland/stones6/conf'
--- worlds/greenland/stones6/conf	2011-08-09 22:56:01 +0000
+++ worlds/greenland/stones6/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 91

=== modified file 'worlds/greenland/tree1/conf'
--- worlds/greenland/tree1/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree1/conf	2014-03-16 21:52:17 +0000
@@ -14,7 +14,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=    100

=== modified file 'worlds/greenland/tree1_m/conf'
--- worlds/greenland/tree1_m/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree1_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree1_00.png
 
 [terrain affinity]
 steppe=    100

=== modified file 'worlds/greenland/tree1_s/conf'
--- worlds/greenland/tree1_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree1_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree1_00.png
 
 [terrain affinity]
 steppe=    100

=== modified file 'worlds/greenland/tree1_t/conf'
--- worlds/greenland/tree1_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree1_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree1_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree2/conf'
--- worlds/greenland/tree2/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree2/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree2_m/conf'
--- worlds/greenland/tree2_m/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree2_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree2_00.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree2_s/conf'
--- worlds/greenland/tree2_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree2_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree2_00.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree2_t/conf'
--- worlds/greenland/tree2_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree2_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree2_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree3/conf'
--- worlds/greenland/tree3/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree3/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree3_m/conf'
--- worlds/greenland/tree3_m/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree3_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree3_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree3_s/conf'
--- worlds/greenland/tree3_s/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree3_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree3_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree3_t/conf'
--- worlds/greenland/tree3_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree3_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree3_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree4/conf'
--- worlds/greenland/tree4/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree4/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree4_m/conf'
--- worlds/greenland/tree4_m/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree4_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree4_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree4_s/conf'
--- worlds/greenland/tree4_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree4_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree4_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree4_t/conf'
--- worlds/greenland/tree4_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree4_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree4_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree5/conf'
--- worlds/greenland/tree5/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree5/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree5_m/conf'
--- worlds/greenland/tree5_m/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree5_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree5_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree5_s/conf'
--- worlds/greenland/tree5_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree5_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree5_00.png
 
 [terrain affinity]
 steppe=     3

=== modified file 'worlds/greenland/tree5_t/conf'
--- worlds/greenland/tree5_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree5_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree5_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree6/conf'
--- worlds/greenland/tree6/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree6/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree6_m/conf'
--- worlds/greenland/tree6_m/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree6_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree6_00.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree6_s/conf'
--- worlds/greenland/tree6_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree6_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree6_00.png
 
 [terrain affinity]
 steppe=    120

=== modified file 'worlds/greenland/tree6_t/conf'
--- worlds/greenland/tree6_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree6_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree6_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree7/conf'
--- worlds/greenland/tree7/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree7/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=     200

=== modified file 'worlds/greenland/tree7_m/conf'
--- worlds/greenland/tree7_m/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree7_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree7_00.png
 
 [terrain affinity]
 steppe=     200

=== modified file 'worlds/greenland/tree7_s/conf'
--- worlds/greenland/tree7_s/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree7_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree7_00.png
 
 [terrain affinity]
 steppe=     200

=== modified file 'worlds/greenland/tree7_t/conf'
--- worlds/greenland/tree7_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree7_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree7_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/greenland/tree8/conf'
--- worlds/greenland/tree8/conf	2010-03-17 22:19:10 +0000
+++ worlds/greenland/tree8/conf	2014-03-16 21:52:17 +0000
@@ -11,7 +11,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 steppe=     196

=== modified file 'worlds/greenland/tree8_m/conf'
--- worlds/greenland/tree8_m/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree8_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree8_00.png
 
 [terrain affinity]
 steppe=     196

=== modified file 'worlds/greenland/tree8_s/conf'
--- worlds/greenland/tree8_s/conf	2009-03-09 17:18:24 +0000
+++ worlds/greenland/tree8_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree8_00.png
 
 [terrain affinity]
 steppe=     196

=== modified file 'worlds/greenland/tree8_t/conf'
--- worlds/greenland/tree8_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/greenland/tree8_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree8_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/bush1/conf'
--- worlds/winterland/bush1/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/bush1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 9

=== modified file 'worlds/winterland/bush2/conf'
--- worlds/winterland/bush2/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/bush2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 9

=== modified file 'worlds/winterland/bush3/conf'
--- worlds/winterland/bush3/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/bush3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=11 14

=== modified file 'worlds/winterland/bush4/conf'
--- worlds/winterland/bush4/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/bush4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=12 10

=== modified file 'worlds/winterland/bush5/conf'
--- worlds/winterland/bush5/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/bush5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=14 13

=== modified file 'worlds/winterland/deadtree1/conf'
--- worlds/winterland/deadtree1/conf	2008-12-15 08:21:26 +0000
+++ worlds/winterland/deadtree1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=25 56

=== modified file 'worlds/winterland/deadtree2/conf'
--- worlds/winterland/deadtree2/conf	2008-12-15 08:21:26 +0000
+++ worlds/winterland/deadtree2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=27 56

=== modified file 'worlds/winterland/deadtree3/conf'
--- worlds/winterland/deadtree3/conf	2008-12-15 08:21:26 +0000
+++ worlds/winterland/deadtree3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/winterland/deadtree4/conf'
--- worlds/winterland/deadtree4/conf	2008-12-15 08:21:26 +0000
+++ worlds/winterland/deadtree4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=idle.png
 
 [idle]
 hotspot=23 61

=== modified file 'worlds/winterland/duck/conf'
--- worlds/winterland/duck/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/duck/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 swimming=1
-picture=duck_00.png
 
 [idle]
 pics=duck_??.png

=== modified file 'worlds/winterland/grass1/conf'
--- worlds/winterland/grass1/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/grass1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 20

=== modified file 'worlds/winterland/grass2/conf'
--- worlds/winterland/grass2/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/grass2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 16

=== modified file 'worlds/winterland/grass3/conf'
--- worlds/winterland/grass3/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/grass3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=10 11

=== modified file 'worlds/winterland/mushroom1/conf'
--- worlds/winterland/mushroom1/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/mushroom1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=6 9

=== modified file 'worlds/winterland/mushroom2/conf'
--- worlds/winterland/mushroom2/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/mushroom2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 7

=== modified file 'worlds/winterland/pebble1/conf'
--- worlds/winterland/pebble1/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 4

=== modified file 'worlds/winterland/pebble2/conf'
--- worlds/winterland/pebble2/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 9

=== modified file 'worlds/winterland/pebble3/conf'
--- worlds/winterland/pebble3/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=3 9

=== modified file 'worlds/winterland/pebble4/conf'
--- worlds/winterland/pebble4/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble4/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=5 5

=== modified file 'worlds/winterland/pebble5/conf'
--- worlds/winterland/pebble5/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble5/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=9 6

=== modified file 'worlds/winterland/pebble6/conf'
--- worlds/winterland/pebble6/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/pebble6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=8 13

=== modified file 'worlds/winterland/sheep/conf'
--- worlds/winterland/sheep/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/sheep/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 attrib=eatable
 program=remove
-picture=sheep_00.png
 
 [remove]
 0=remove

=== modified file 'worlds/winterland/skeleton1/conf'
--- worlds/winterland/skeleton1/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/skeleton1/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=29 36

=== modified file 'worlds/winterland/skeleton2/conf'
--- worlds/winterland/skeleton2/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/skeleton2/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=26 32

=== modified file 'worlds/winterland/skeleton3/conf'
--- worlds/winterland/skeleton3/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/skeleton3/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=47 69

=== modified file 'worlds/winterland/snowman/conf'
--- worlds/winterland/snowman/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/snowman/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=9 24

=== modified file 'worlds/winterland/sstones1/conf'
--- worlds/winterland/sstones1/conf	2011-08-23 13:26:16 +0000
+++ worlds/winterland/sstones1/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=20 52

=== modified file 'worlds/winterland/sstones2/conf'
--- worlds/winterland/sstones2/conf	2011-08-10 20:17:24 +0000
+++ worlds/winterland/sstones2/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=20 38

=== modified file 'worlds/winterland/sstones3/conf'
--- worlds/winterland/sstones3/conf	2011-08-10 20:17:24 +0000
+++ worlds/winterland/sstones3/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=25 28

=== modified file 'worlds/winterland/sstones4/conf'
--- worlds/winterland/sstones4/conf	2011-08-21 12:02:42 +0000
+++ worlds/winterland/sstones4/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=12 75

=== modified file 'worlds/winterland/sstones5/conf'
--- worlds/winterland/sstones5/conf	2011-08-10 20:17:24 +0000
+++ worlds/winterland/sstones5/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 size=big
-picture=idle.png
 
 [idle]
 hotspot=37 27

=== modified file 'worlds/winterland/sstones6/conf'
--- worlds/winterland/sstones6/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/sstones6/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/winterland/sstones7/conf'
--- worlds/winterland/sstones7/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/sstones7/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=7 63

=== modified file 'worlds/winterland/stones1/conf'
--- worlds/winterland/stones1/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones1/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 83

=== modified file 'worlds/winterland/stones2/conf'
--- worlds/winterland/stones2/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones2/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=38 86

=== modified file 'worlds/winterland/stones3/conf'
--- worlds/winterland/stones3/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones3/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=42 89

=== modified file 'worlds/winterland/stones4/conf'
--- worlds/winterland/stones4/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones4/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=44 84

=== modified file 'worlds/winterland/stones5/conf'
--- worlds/winterland/stones5/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones5/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=42 92

=== modified file 'worlds/winterland/stones6/conf'
--- worlds/winterland/stones6/conf	2011-08-09 22:56:01 +0000
+++ worlds/winterland/stones6/conf	2014-03-16 21:52:17 +0000
@@ -1,7 +1,6 @@
 size=big
 attrib=stone
 program=shrink
-picture=idle.png
 
 [idle]
 hotspot=39 90

=== modified file 'worlds/winterland/track/conf'
--- worlds/winterland/track/conf	2008-11-26 14:23:04 +0000
+++ worlds/winterland/track/conf	2014-03-16 21:52:17 +0000
@@ -1,4 +1,3 @@
-picture=idle.png
 
 [idle]
 hotspot=30 15

=== modified file 'worlds/winterland/tree1/conf'
--- worlds/winterland/tree1/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree1/conf	2014-03-16 21:52:17 +0000
@@ -13,7 +13,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree1_m/conf'
--- worlds/winterland/tree1_m/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree1_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree1_00.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree1_s/conf'
--- worlds/winterland/tree1_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree1_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree1_00.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree1_t/conf'
--- worlds/winterland/tree1_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree1_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree1_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree2/conf'
--- worlds/winterland/tree2/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree2/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree2_m/conf'
--- worlds/winterland/tree2_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree2_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree2_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree2_s/conf'
--- worlds/winterland/tree2_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree2_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree2_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree2_t/conf'
--- worlds/winterland/tree2_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree2_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree2_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree3/conf'
--- worlds/winterland/tree3/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree3/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree3_m/conf'
--- worlds/winterland/tree3_m/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree3_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree3_00.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree3_s/conf'
--- worlds/winterland/tree3_s/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree3_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree3_00.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree3_t/conf'
--- worlds/winterland/tree3_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree3_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree3_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree4/conf'
--- worlds/winterland/tree4/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree4/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree4_m/conf'
--- worlds/winterland/tree4_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree4_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree4_00.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree4_s/conf'
--- worlds/winterland/tree4_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree4_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree4_00.png
 
 [terrain affinity]
 ice_flows=      8

=== modified file 'worlds/winterland/tree4_t/conf'
--- worlds/winterland/tree4_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree4_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree4_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree5/conf'
--- worlds/winterland/tree5/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree5/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree5_m/conf'
--- worlds/winterland/tree5_m/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree5_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree5_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree5_s/conf'
--- worlds/winterland/tree5_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree5_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree5_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree5_t/conf'
--- worlds/winterland/tree5_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree5_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree5_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree6/conf'
--- worlds/winterland/tree6/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree6/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree6_m/conf'
--- worlds/winterland/tree6_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree6_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree6_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree6_s/conf'
--- worlds/winterland/tree6_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree6_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree6_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree6_t/conf'
--- worlds/winterland/tree6_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree6_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree6_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree7/conf'
--- worlds/winterland/tree7/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree7/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree7_m/conf'
--- worlds/winterland/tree7_m/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree7_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree7_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree7_s/conf'
--- worlds/winterland/tree7_s/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree7_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree7_00.png
 
 [terrain affinity]
 ice_flows=      2

=== modified file 'worlds/winterland/tree7_t/conf'
--- worlds/winterland/tree7_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree7_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree7_00.png
 attrib=seed
 
 [terrain affinity]

=== modified file 'worlds/winterland/tree8/conf'
--- worlds/winterland/tree8/conf	2010-03-17 23:07:50 +0000
+++ worlds/winterland/tree8/conf	2014-03-16 21:52:17 +0000
@@ -10,7 +10,6 @@
 attrib=tree
 program=program
 program=fall
-picture=idle_0.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree8_m/conf'
--- worlds/winterland/tree8_m/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree8_m/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s3tree8_00.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree8_s/conf'
--- worlds/winterland/tree8_s/conf	2009-04-08 20:41:07 +0000
+++ worlds/winterland/tree8_s/conf	2014-03-16 21:52:17 +0000
@@ -1,6 +1,5 @@
 size=small
 program=program
-picture=s2tree8_00.png
 
 [terrain affinity]
 ice_flows=     10

=== modified file 'worlds/winterland/tree8_t/conf'
--- worlds/winterland/tree8_t/conf	2010-07-30 22:07:24 +0000
+++ worlds/winterland/tree8_t/conf	2014-03-16 21:52:17 +0000
@@ -1,5 +1,4 @@
 program=program
-picture=s1tree8_00.png
 attrib=seed
 
 [terrain affinity]


Follow ups