changeset 5:f4b89014ad39

added moving figure stuff + animated sprites. not usable atm.
author fred@reichbier.de
date Sat, 19 Jul 2008 14:33:08 +0200
parents 292df259cc85
children 510541745cd1
files bin/gfx/README bin/gfx/f-1.png bin/gfx/f-10.png bin/gfx/f-11.png bin/gfx/f-12.png bin/gfx/f-2.png bin/gfx/f-3.png bin/gfx/f-4.png bin/gfx/f-5.png bin/gfx/f-6.png bin/gfx/f-7.png bin/gfx/f-8.png bin/gfx/f-9.png bin/gfx/mountain.png bin/gfx/spacecar-normal.png bin/gfx/spacecar-thrust1.png bin/gfx/spacecar-thrust2.png bin/gfx/water.png bin/map-example.xml bin/tileset-example.xml import/myrrdin/animatedsprite.d import/myrrdin/consumer.d import/myrrdin/imagecache.d import/myrrdin/movingfigure.d import/myrrdin/renderer.d import/myrrdin/sprite.d import/myrrdin/spriteconsumer.d import/myrrdin/test.d import/myrrdin/tileconsumer.d import/myrrdin/tilemap.d import/myrrdin/tileset.d import/myrrdin/tools.d import/myrrdin/viewconsumer.d import/myrrdin/xmlmap.d src/animatedsprite.d src/consumer.d src/imagecache.d src/renderer.d src/sprite.d src/spriteconsumer.d src/test.d src/tileconsumer.d src/tilemap.d src/tileset.d src/tools.d src/viewconsumer.d src/xmlmap.d
diffstat 47 files changed, 892 insertions(+), 518 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/gfx/README	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,3 @@
+Most of this graphics are from 'reiners Tileset': http://reinerstileset.4players.de/
+Many thanks, reiner :-)
+
Binary file bin/gfx/f-1.png has changed
Binary file bin/gfx/f-10.png has changed
Binary file bin/gfx/f-11.png has changed
Binary file bin/gfx/f-12.png has changed
Binary file bin/gfx/f-2.png has changed
Binary file bin/gfx/f-3.png has changed
Binary file bin/gfx/f-4.png has changed
Binary file bin/gfx/f-5.png has changed
Binary file bin/gfx/f-6.png has changed
Binary file bin/gfx/f-7.png has changed
Binary file bin/gfx/f-8.png has changed
Binary file bin/gfx/f-9.png has changed
Binary file bin/gfx/mountain.png has changed
Binary file bin/gfx/spacecar-normal.png has changed
Binary file bin/gfx/spacecar-thrust1.png has changed
Binary file bin/gfx/spacecar-thrust2.png has changed
Binary file bin/gfx/water.png has changed
--- a/bin/map-example.xml	Fri Jul 18 16:12:41 2008 +0200
+++ b/bin/map-example.xml	Sat Jul 19 14:33:08 2008 +0200
@@ -1,7 +1,10 @@
 <map version="1" width="36" height="10">
   <tiles tileset="tileset-example.xml">
     <layer tilewidth="32" tileheight="32">
-      1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1
+      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+    </layer>
+    <layer tilewidth="128" tileheight="128">
+            0,3
     </layer>
   </tiles>
 </map>
--- a/bin/tileset-example.xml	Fri Jul 18 16:12:41 2008 +0200
+++ b/bin/tileset-example.xml	Sat Jul 19 14:33:08 2008 +0200
@@ -1,4 +1,5 @@
 <tileset version="1">
-  <tile id="0" filename="grass.png" />
-  <tile id="1" filename="grass-stone-water-l.png" />
+  <tile id="1" filename="grass.png" />
+  <tile id="2" filename="grass-stone-water-l.png" />
+  <tile id="3" filename="mountain.png" />
 </tileset>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/animatedsprite.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,104 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module animatedsprite;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+class Frame {
+    Image image;
+    int length; // length in frames
+
+    this(Image image, int length) {
+	this.image = image;
+	this.length = length;
+    }	
+}
+
+class Animation {
+    public Frame[] frames;
+    private int current_frame_idx;
+    private Frame current_frame;
+    private int frame_counter;
+
+    this() {
+    
+    }
+
+    /* add a frame */
+    void add_frame(Image image, int length) {
+	this.frames ~= new Frame(image, length);
+    }
+
+    void add_frame(Frame frame) {
+	this.frames ~= frame;
+    }
+    
+    /* internal. you do not have to call it */
+    void play() {
+	this.current_frame = this.frames[0];
+	this.current_frame_idx = 0;
+    }
+
+    /* return the current image or null if the animation ended */
+    Image get_image() {
+	if(this.frame_counter >= this.current_frame.length) {
+	    this.frame_counter = 0;
+	    this.current_frame_idx++;
+	    if (this.frames.length <= this.current_frame_idx) {
+		// animation stop
+		return null;
+	    }
+	    this.current_frame = this.frames[this.current_frame_idx];
+	}
+	this.frame_counter++;
+	return this.current_frame.image;
+    }
+}
+
+class AnimatedSprite : Sprite {
+    private Animation current_animation = null;
+    private bool is_loop = false;
+
+    /* play an animation now. */
+    void play_animation(Animation animation, bool loop=false) {
+	this.current_animation = animation; 
+	this.is_loop = loop;
+	this.current_animation.play();
+    }
+
+    bool is_playing() {
+	return (this.current_animation !is null);
+    }
+
+    /* update everything. Perfect for an animated sprite */
+    void update() {
+	if(this.current_animation) {
+	    Image img = this.current_animation.get_image();
+	    if(img) {
+		this.setImage(img);
+	    }
+	    else if (this.is_loop) {
+		this.current_animation.play(); // is a loop, play again
+	    } else {
+		this.current_animation = null;
+	    }
+	}	    
+    }	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/consumer.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,48 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module consumer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import renderer;
+
+class Consumer {
+    protected Renderer renderer;
+
+    this(Renderer renderer) {
+	this.renderer = renderer;
+    }
+
+    /* handle the event `evt`. Return true if the event was handled and should not
+       be propagated any further, otherwise false */
+    bool handle_event(Event evt) {
+	return false;
+    }
+
+    /* draw all the content of this with this.app.draw(stuff) */
+    void draw() {
+
+    }
+
+    /* called for each loop iteration */
+    void loop_iteration() {
+    
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/imagecache.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,45 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module imagecache;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import tango.io.vfs.FileFolder;
+
+class Cache {
+    private FileFolder filefolder;
+    private Image[char[]] images;
+
+    this(char[] folder) {
+	this.filefolder = new FileFolder(folder, false);
+    }
+
+    void load(char[] real_filename, char[] seen_filename) {
+	this.images[seen_filename] = new Image();
+	this.images[seen_filename].loadFromFile(real_filename);
+    }
+
+    Image get_image(char[] filename) {
+	if (!(filename in this.images)) {
+	    this.load(this.filefolder.file(filename).toString(), filename);
+	}
+	return this.images[filename];
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/movingfigure.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,91 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module movingfigure;
+
+import Integer = tango.text.convert.Integer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import spriteconsumer;
+import animatedsprite;
+import renderer;
+import imagecache;
+
+class MovingAnimatedFigureConsumer : SpriteConsumer {
+    private Animation ani_left, ani_right, ani_up, ani_down;
+    public AnimatedSprite sprite;
+    private Input input;
+
+    this(Renderer renderer, Animation go_left, Animation go_right, Animation go_up, Animation go_down) {
+	super(renderer);
+	this.ani_left = go_left;
+	this.ani_right = go_right;
+	this.ani_up = go_up;
+	this.ani_down = go_down;
+	this.sprite = new AnimatedSprite;
+	this.add_sprite(sprite);
+	this.sprite.setImage(this.ani_down.frames[0].image);
+	this.input = this.renderer.app.getInput();
+    }
+
+    void draw() {
+	super.draw();
+    }
+
+    void loop_iteration() {
+	float x=0, y=0;
+	if(this.input.isKeyDown(KeyCode.LEFT)) x -= 1;
+	if(this.input.isKeyDown(KeyCode.RIGHT)) x += 1;
+	if(this.input.isKeyDown(KeyCode.UP)) y -= 1;
+	if(this.input.isKeyDown(KeyCode.DOWN)) y += 1;    
+	if(x != 0 || y != 0) {
+	    this.sprite.move(x, y);
+	    if (!this.sprite.is_playing()) {
+		if(x > 0) this.sprite.play_animation(this.ani_right);
+		if(x < 0) this.sprite.play_animation(this.ani_left);
+		if(y > 0) this.sprite.play_animation(this.ani_down);
+		if(y < 0) this.sprite.play_animation(this.ani_up);
+	    }
+	}
+    }
+}
+
+MovingAnimatedFigureConsumer load_charset(Renderer renderer, Cache cache, char[] prefix, char[] suffix, uint frame_duration=0) {
+    Image get_f(int id) {
+	return cache.get_image(prefix~Integer.toString(id)~suffix);
+    }
+    Animation up = new Animation;
+    up.add_frame(get_f(1), frame_duration);
+    up.add_frame(get_f(2), frame_duration);
+    up.add_frame(get_f(3), frame_duration);
+    Animation right = new Animation;
+    right.add_frame(get_f(4), frame_duration);
+    right.add_frame(get_f(5), frame_duration);
+    right.add_frame(get_f(6), frame_duration);
+    Animation down = new Animation;
+    down.add_frame(get_f(7), frame_duration);
+    down.add_frame(get_f(8), frame_duration);
+    down.add_frame(get_f(9), frame_duration);
+    Animation left = new Animation;
+    left.add_frame(get_f(10), frame_duration);
+    left.add_frame(get_f(11), frame_duration);
+    left.add_frame(get_f(12), frame_duration);
+    return new MovingAnimatedFigureConsumer(renderer, left, right, up, down);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/renderer.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,103 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module renderer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import consumer;
+import imagecache;
+import animatedsprite;
+
+class Renderer {
+    public RenderWindow app;
+    public Cache cache;
+    private Consumer[] draw_consumers;
+    private Consumer[] event_consumers;
+    
+    this(char[] title, int width, int height, int depth=32) {
+	this.app = new RenderWindow(VideoMode(width, height, depth), title);
+	this.app.setFramerateLimit(40);
+
+	this.cache = new Cache("."); // TODO
+    }
+
+    /* add a consumer for event handling and drawing */
+    void add_consumer(Consumer consumer) {
+	this.add_event_consumer(consumer);
+	this.add_draw_consumer(consumer);
+    }
+
+    /* add a consumer only for event handling */
+    void add_event_consumer(Consumer consumer) {
+	this.event_consumers ~= consumer;
+    }
+
+    /* add a consumer only for drawing */
+    void add_draw_consumer(Consumer consumer) {
+	this.draw_consumers ~= consumer;
+    }
+
+    /* use this instead of this.app.draw - it contains a hook for animated sprites */
+    void draw(AnimatedSprite obj) {
+	obj.update();
+	this.app.draw(obj);
+    }
+
+    void draw(IDrawable obj) {
+	this.app.draw(obj);
+    }
+
+    void draw(Sprite obj) {
+	if(cast(AnimatedSprite)obj !is null) {
+	    this.draw(cast(AnimatedSprite)obj);
+	}
+	else {
+	    this.app.draw(obj);
+	}
+    }
+
+    /* start the mainloop */
+    void mainloop() {
+	Event evt;
+
+	while(this.app.isOpened()) {
+	    // handle all events
+	    while(this.app.getEvent(evt)) {
+		if (evt.Type == Event.EventType.CLOSED) {
+		    this.app.close();
+		} else {
+		    foreach(Consumer consumer; this.event_consumers) {
+			if(consumer.handle_event(evt)) break;
+		    }
+		}		    
+	    }
+	    // loop iteration
+	    foreach(Consumer consumer; this.draw_consumers) {
+		consumer.loop_iteration();
+	    }
+	    // draw all
+	    foreach(Consumer consumer; this.draw_consumers) {
+		consumer.draw();
+	    }
+	    // display all
+	    this.app.display();
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/sprite.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,7 @@
+module sprite;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all : Sprite = SFSprite;
+
+import renderer;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/spriteconsumer.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,45 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module spriteconsumer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import animatedsprite;
+import consumer;
+import renderer;
+
+class SpriteConsumer : Consumer {
+    private Sprite[] sprites;
+
+    this(Renderer renderer) {
+	super(renderer);
+    }
+
+    void add_sprite(Sprite sprite) {
+	this.sprites ~= sprite;
+    }
+
+    void draw() {
+	 foreach(Sprite sprite; this.sprites) { 
+	    this.renderer.draw(sprite);
+	 }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/test.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,60 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module test;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import tileconsumer;
+import renderer;
+import consumer;
+import imagecache;
+import tilemap;
+import tileset;
+import xmlmap;
+import tools;
+import viewconsumer;
+import animatedsprite;
+import spriteconsumer;
+import movingfigure;
+
+int main(char[][] args) {
+    Cache cache = new Cache("gfx");
+    Tilemap map = parse_map(cache, read_file_contents("map-example.xml"));
+    Renderer render = new Renderer("Blubb", 600, 480, 32);
+//    render.add_consumer(new InteractiveViewConsumer(render));
+    TileConsumer consumer = new TileConsumer(render, map);
+    map.set_view(render.app.getView());
+    render.add_consumer(consumer);
+    render.add_consumer(load_charset(render, cache, "f-", ".png", 10)); 
+/*    SpriteConsumer c = new SpriteConsumer(render);
+    AnimatedSprite s = new AnimatedSprite;
+    s.setX(10);
+    s.setY(10);
+    Animation a = new Animation;
+    a.add_frame(map.tileset.tiles[0], 10);
+    a.add_frame(map.tileset.tiles[1], 10);
+//    s.setImage(map.tileset.tiles[0]);
+    s.play_animation(a, true);
+    c.add_sprite(s);
+    render.add_consumer(c);*/
+
+    render.mainloop();
+    return 0; 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/tileconsumer.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,55 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module tileconsumer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+import tango.io.Stdout;
+
+import consumer;
+import renderer;
+import tileset;
+import tilemap;
+
+class TileConsumer : Consumer {
+    public Tilemap map;
+
+    this(Renderer renderer, Tilemap map) {
+	super(renderer);
+	this.map = map;
+    }
+
+    void draw() {
+	 foreach(Sprite sprite; this.map.get_sprites()) {
+	    this.renderer.draw(sprite);
+	 }
+    }
+
+    bool handle_event(Event evt) {
+	if (evt.Type == Event.EventType.MOUSEBUTTONPRESSED) {
+	    Input input = this.renderer.app.getInput();
+	    Vector2i tile = this.map.real_to_tile(0, input.getMouseX(), input.getMouseY());
+	    if(this.map.has_tile(0, tile.x, tile.y)) {
+		Stdout.formatln("You clicked on the tile {}, {}", tile.x, tile.y);
+	    }
+	    return true;
+	}	    
+	return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/tilemap.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,101 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module tilemap;
+
+import tango.math.Math;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import tileset;
+import tango.io.Stdout;
+
+typedef Sprite[] SpriteArray;
+
+class Tilemap {
+    public int[int][int][int] map; // Layer: x: y: Tile-ID
+    public Vector2i[int] layer_tsizes; // Layer: Tile size
+    public Tileset tileset;
+    public int width, height, tilewidth, tileheight;
+    private View view;
+
+    this(Tileset tileset, int width, int height, int tilewidth, int tileheight) {
+	this.tileset = tileset;
+	this.width = width;
+	this.height = height;
+	this.tilewidth = tilewidth;
+	this.tileheight = tileheight;
+    }
+
+    /* set the view. you should do this if you use a sf::View */
+    void set_view(View view) {
+	this.view = view;
+    }
+
+    /* translate On-Screen -> With-View */
+    Vector2i translate_with_view(int real_x, int real_y) {
+	Vector2i vec = Vector2i(real_x, real_y);
+	if(this.view) {
+	    FloatRect rect = this.view.getRect();
+	    vec.x += rect.getLeft();
+	    vec.y += rect.getTop();
+	}
+	return vec;
+    }
+
+    Vector2i real_to_tile(int layer, int real_x, int real_y) {
+	Vector2i vec = this.translate_with_view(real_x, real_y);
+	return Vector2i(rndint(floor(vec.x / this.layer_tsizes[layer].x)), rndint(floor(vec.y / this.layer_tsizes[layer].y)));
+    }
+
+    Vector2i tile_to_real(int layer, int tile_x, int tile_y) {
+	return Vector2i(tile_x*this.layer_tsizes[layer].x, tile_y*this.layer_tsizes[layer].y);
+    }
+
+    bool has_tile(int layer, int x, int y) {
+	return (layer in this.map && x in this.map[layer] && y in this.map[layer][x]);
+    }
+
+    SpriteArray get_sprites() {
+	SpriteArray sprites;
+	Sprite sprite;
+	int layer_id=0;
+	Vector2i pos;
+	foreach(int[int][int] layer; map) {
+	    for(int x=0; x<width; x++) {
+		if(x in layer) {
+		    for(int y=0; y<height; y++) {
+			if(y in layer[x]) {
+			    if (layer[x][y] != 0) { // is no transparent tile?
+				sprite = new Sprite;
+				pos = tile_to_real(layer_id, x, y);
+				sprite.setX(pos.x);
+				sprite.setY(pos.y);
+				sprite.setImage(this.tileset.tiles[layer[x][y]]);
+				sprites ~= sprite;
+			    }
+			}
+		    }
+		}
+	    }
+	    layer_id++;
+	}
+	return sprites;	
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/tileset.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,39 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module tileset;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import imagecache;
+
+alias Image[int] TileList;
+
+class Tileset {
+    private Cache cache;
+    public TileList tiles;
+
+    this(Cache cache) {
+	this.cache = cache;	
+    }
+
+    void add_tile(int id, char[] filename) {
+	this.tiles[id] = this.cache.get_image(filename);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/tools.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,27 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module tools;
+
+import tango.io.File;
+
+char[] read_file_contents(char[] filename) {
+    auto file = new File (filename);
+    auto content = cast(char[]) file.read();
+
+    return content;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/viewconsumer.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,69 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module viewconsumer;
+
+import dsfml.window.all;
+import dsfml.system.all;
+import dsfml.graphics.all;
+
+import consumer;
+import renderer;
+import tango.io.Stdout;
+
+/* That is a consumer which sets and manipulates the render window view */
+class ViewConsumer : Consumer {
+    protected View view;
+
+    this(Renderer renderer) {
+	super(renderer);
+	// set the initial view
+	this.view = renderer.app.getView();
+	this.view.setFromRect(new FloatRect(0, 0, renderer.app.getWidth(), renderer.app.getHeight()));
+	this.update_view();
+    }
+
+    protected void update_view() {
+	this.renderer.app.setView(this.view);
+    }
+
+    void move_view(float x=0, float y=0) {
+	this.view.move(x, y);
+    }
+}
+
+class InteractiveViewConsumer : ViewConsumer {
+    this(Renderer renderer) {
+	super(renderer);
+    }
+
+    bool handle_event(Event evt) {
+	if (evt.Type == Event.EventType.KEYPRESSED) {
+	    float x=0, y=0;
+	    if(evt.Key.Code == KeyCode.LEFT) x -= 2;
+	    if(evt.Key.Code == KeyCode.RIGHT) x += 2;
+	    if(evt.Key.Code == KeyCode.UP) y -= 2;
+	    if(evt.Key.Code == KeyCode.DOWN) y += 2;
+	    if(x != 0 || y != 0) {
+		Stdout.formatln("{} fps", 1.0 / this.renderer.app.getFrameTime());
+		this.move_view(x, y);
+		return true;
+	    }
+	}
+	return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/import/myrrdin/xmlmap.d	Sat Jul 19 14:33:08 2008 +0200
@@ -0,0 +1,88 @@
+/*
+    This file is part of myrrdin.
+
+    myrrdin is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as 
+    published by the Free Software Foundation, either version 3 of 
+    the License, or (at your option) any later version.
+
+    myrrdin 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 Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public 
+    License along with myrrdin. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+module xmlmap;
+
+import tileset;
+import tilemap;
+
+import tango.text.xml.Document;
+import tango.text.convert.Integer;
+import tango.io.Stdout; // TODO
+import tools;
+import imagecache;
+import dsfml.system.all;
+import Text = tango.text.Util;
+static import tango.core.Exception;
+
+alias XmlPath!(char).NodeSet NodeSet;
+alias Document!(char).Node NodeImpl;
+private char[] get_attribute(NodeSet node, char[] name) {
+    return node.attribute(name).nodes[0].value;
+}
+
+Tileset parse_tileset(Cache cache, char[] content) {
+    auto tileset = new Tileset(cache);
+
+    auto doc = new Document!(char);
+    doc.parse(content);
+    auto root = doc.query["tileset"];   
+    auto nodes = root.child.nodes;
+    foreach(NodeImpl tiles_node; nodes) {
+	tileset.add_tile(Integer.parse(tiles_node.getAttribute("id").value), tiles_node.getAttribute("filename").value);
+    }
+    return tileset;
+}
+
+Tilemap parse_map(Cache cache, char[] content) {
+    auto doc = new Document!(char);
+    doc.parse(content);
+    auto root = doc.query["map"];
+    int width = Integer.parse(get_attribute(root, "width"));
+    int height = Integer.parse(get_attribute(root, "height"));
+    Stdout.formatln("Width: {}, Height: {}", width, height);
+    auto tiles_node = root.child.nodes[0];
+    char[] tileset_file = tiles_node.getAttribute("tileset").value;
+    auto tilemap = new Tilemap(parse_tileset(cache, read_file_contents(tileset_file)), width, height, 32, 32); // TODO: variable tile size
+    int layer_id=0;
+    foreach(NodeImpl layer_node; tiles_node.query["layer"].nodes) {
+	int tile_width = Integer.parse(layer_node.getAttribute("tilewidth").value);
+	int tile_height = Integer.parse(layer_node.getAttribute("tileheight").value);
+	tilemap.layer_tsizes[layer_id] = Vector2i(tile_width, tile_height);
+	char[][] content_ = Text.delimit(Text.trim(layer_node.value), ",");
+	int i=0;
+	bool running = true;
+	for(int x=0; x < width; x++) {
+	    for(int y=0; y < height; y++) {
+		try {
+		    tilemap.map[layer_id][x][y] = Integer.parse(content_[i]);
+		}
+		catch (tango.core.Exception.ArrayBoundsException) {
+		    // array out of bounds ... break
+		    running = false;
+		    break;
+		}
+		i++;
+	    }
+	    if(!running) {
+		break;
+	    }
+	}
+	layer_id++;
+    }
+    return tilemap;
+}
--- a/src/animatedsprite.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-module animatedsprite;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-class Frame {
-    Image image;
-    int length; // length in frames
-
-    this(Image image, int length) {
-	this.image = image;
-	this.length = length;
-    }	
-}
-
-class Animation {
-    private Frame[] frames;
-    private int current_frame_idx;
-    private Frame current_frame;
-    private int frame_counter;
-
-    this() {
-    
-    }
-
-    void add_frame(Image image, int length) {
-	this.frames ~= new Frame(image, length);
-    }
-
-    void play() {
-	this.current_frame = this.frames[0];
-	this.current_frame_idx = 0;
-    }
-
-    Image get_image() {
-	if(this.frame_counter >= this.current_frame.length) {
-	    this.frame_counter = 0;
-	    this.current_frame_idx++;
-	    if (this.frames.length <= this.current_frame_idx) {
-		// animation stop
-		return null;
-	    }
-	    this.current_frame = this.frames[this.current_frame_idx];
-	}
-	this.frame_counter++;
-	return this.current_frame.image;
-    }
-}
-
-class AnimatedSprite : Sprite {
-    private Animation current_animation = null;
-    private bool is_loop = false;
-
-    /* play an animation now. */
-    void play_animation(Animation animation, bool loop=false) {
-	this.current_animation = animation; 
-	this.is_loop = loop;
-	this.current_animation.play();
-    }
-
-    /* update everything. Perfect for an animated sprite */
-    void update() {
-	if(this.current_animation) {
-	    Image img = this.current_animation.get_image();
-	    if(img) {
-		this.setImage(img);
-	    }
-	    else if (this.is_loop) {
-		this.current_animation.play(); // is a loop, play again
-	    } else {
-		this.current_animation = null;
-	    }
-	}	    
-    }	
-}
--- a/src/consumer.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-module consumer;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import renderer;
-
-class Consumer {
-    protected Renderer renderer;
-
-    this(Renderer renderer) {
-	this.renderer = renderer;
-    }
-
-    /* handle the event `evt`. Return true if the event was handled and should not
-       be propagated any further, otherwise false */
-    bool handle_event(Event evt) {
-	return false;
-    }
-
-    /* draw all the content of this with this.app.draw(stuff) */
-    void draw() {
-
-    }
-}
--- a/src/imagecache.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-module imagecache;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import tango.io.vfs.FileFolder;
-
-class Cache {
-    private FileFolder filefolder;
-    private Image[char[]] images;
-
-    this(char[] folder) {
-	this.filefolder = new FileFolder(folder, false);
-    }
-
-    void load(char[] real_filename, char[] seen_filename) {
-	this.images[seen_filename] = new Image();
-	this.images[seen_filename].loadFromFile(real_filename);
-    }
-
-    Image get_image(char[] filename) {
-	if (!(filename in this.images)) {
-	    this.load(this.filefolder.file(filename).toString(), filename);
-	}
-	return this.images[filename];
-    }
-}
--- a/src/renderer.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-module renderer;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import consumer;
-import imagecache;
-import animatedsprite;
-
-class Renderer {
-    public RenderWindow app;
-    public Cache cache;
-    private Consumer[] draw_consumers;
-    private Consumer[] event_consumers;
-    
-    this(char[] title, int width, int height, int depth=32) {
-	this.app = new RenderWindow(VideoMode(width, height, depth), title);
-	this.app.setFramerateLimit(40);
-
-	this.cache = new Cache("."); // TODO
-    }
-
-    /* add a consumer for event handling and drawing */
-    void add_consumer(Consumer consumer) {
-	this.add_event_consumer(consumer);
-	this.add_draw_consumer(consumer);
-    }
-
-    /* add a consumer only for event handling */
-    void add_event_consumer(Consumer consumer) {
-	this.event_consumers ~= consumer;
-    }
-
-    /* add a consumer only for drawing */
-    void add_draw_consumer(Consumer consumer) {
-	this.draw_consumers ~= consumer;
-    }
-
-    /* use this instead of this.app.draw - it contains a hook for animated sprites */
-    void draw(AnimatedSprite obj) {
-	obj.update();
-	this.app.draw(obj);
-    }
-
-    void draw(IDrawable obj) {
-	this.app.draw(obj);
-    }
-
-    void draw(Sprite obj) {
-	if(cast(AnimatedSprite)obj !is null) {
-	    this.draw(cast(AnimatedSprite)obj);
-	}
-	else {
-	    this.app.draw(obj);
-	}
-    }
-
-    /* start the mainloop */
-    void mainloop() {
-	Event evt;
-
-	while(this.app.isOpened()) {
-	    // handle all events
-	    while(this.app.getEvent(evt)) {
-		if (evt.Type == Event.EventType.CLOSED) {
-		    this.app.close();
-		} else {
-		    foreach(Consumer consumer; this.event_consumers) {
-			if(consumer.handle_event(evt)) break;
-		    }
-		}		    
-	    }
-	    // draw all
-	    foreach(Consumer consumer; this.draw_consumers) {
-		consumer.draw();
-	    }
-	    // display all
-	    this.app.display();
-	}
-    }
-}
--- a/src/sprite.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-module sprite;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all : Sprite = SFSprite;
-
-import renderer;
--- a/src/spriteconsumer.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-module spriteconsumer;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import animatedsprite;
-import consumer;
-import renderer;
-
-class SpriteConsumer : Consumer {
-    private Sprite[] sprites;
-
-    this(Renderer renderer) {
-	super(renderer);
-    }
-
-    void add_sprite(Sprite sprite) {
-	this.sprites ~= sprite;
-    }
-
-    void draw() {
-	 foreach(Sprite sprite; this.sprites) { 
-	    this.renderer.draw(sprite);
-	 }
-    }
-}
-
--- a/src/test.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-module test;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import tileconsumer;
-import renderer;
-import consumer;
-import imagecache;
-import tilemap;
-import tileset;
-import xmlmap;
-import tools;
-import viewconsumer;
-import animatedsprite;
-import spriteconsumer;
-
-int main(char[][] args) {
-    Cache cache = new Cache("gfx");
-    Tilemap map = parse_map(cache, read_file_contents("map-example.xml"));
-    Renderer render = new Renderer("Blubb", 600, 480, 32);
-//    render.add_consumer(new InteractiveViewConsumer(render));
-//    TileConsumer consumer = new TileConsumer(render, map);
-//    render.add_consumer(consumer);
-    SpriteConsumer c = new SpriteConsumer(render);
-    AnimatedSprite s = new AnimatedSprite;
-    s.setX(10);
-    s.setY(10);
-    Animation a = new Animation;
-    a.add_frame(map.tileset.tiles[0], 10);
-    a.add_frame(map.tileset.tiles[1], 10);
-//    s.setImage(map.tileset.tiles[0]);
-    s.play_animation(a, true);
-    c.add_sprite(s);
-    render.add_consumer(c);
-
-    render.mainloop();
-    return 0; 
-}
--- a/src/tileconsumer.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-module tileconsumer;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import consumer;
-import renderer;
-import tileset;
-import tilemap;
-
-class TileConsumer : Consumer {
-    public Tilemap map;
-
-    this(Renderer renderer, Tilemap map) {
-	super(renderer);
-	this.map = map;
-    }
-
-    void draw() {
-	 foreach(Sprite sprite; this.map.get_sprites()) {
-	    this.renderer.draw(sprite);
-	 }
-    }
-}
--- a/src/tilemap.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-module tilemap;
-
-import tango.math.Math;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import tileset;
-
-typedef Sprite[] SpriteArray;
-
-class Tilemap {
-    public int[int][int][int] map; // Layer: x: y: Tile-ID
-    public Vector2i[int] layer_tsizes; // Layer: Tile size
-    public Tileset tileset;
-    public int width, height, tilewidth, tileheight;
-
-    this(Tileset tileset, int width, int height, int tilewidth, int tileheight) {
-	this.tileset = tileset;
-	this.width = width;
-	this.height = height;
-	this.tilewidth = tilewidth;
-	this.tileheight = tileheight;
-    }
-
-    Vector2i real_to_tile(int layer, int real_x, int real_y) {
-	return Vector2i(rndint(floor(real_x / this.layer_tsizes[layer].x)), rndint(floor(real_y / this.layer_tsizes[layer].y)));
-    }
-
-    Vector2i tile_to_real(int layer, int tile_x, int tile_y) {
-	return Vector2i(tile_x*this.layer_tsizes[layer].x, tile_y*this.layer_tsizes[layer].y);
-    }
-
-    SpriteArray get_sprites() {
-	SpriteArray sprites;
-	Sprite sprite;
-	int layer_id=0;
-	Vector2i pos;
-	foreach(int[int][int] layer; map) {
-	    for(int x=0; x<width; x++) {
-		if(x in layer) {
-		    for(int y=0; y<height; y++) {
-			if(y in layer[x]) {
-			    sprite = new Sprite;
-			    pos = tile_to_real(layer_id, x, y);
-			    sprite.setX(pos.x);
-			    sprite.setY(pos.y);
-			    sprite.setImage(this.tileset.tiles[layer[x][y]]);
-			    sprites ~= sprite;
-			}
-		    }
-		}
-	    }
-	    layer_id++;
-	}
-	return sprites;	
-    }
-}
--- a/src/tileset.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-module tileset;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import imagecache;
-
-alias Image[int] TileList;
-
-class Tileset {
-    private Cache cache;
-    public TileList tiles;
-
-    this(Cache cache) {
-	this.cache = cache;	
-    }
-
-    void add_tile(int id, char[] filename) {
-	this.tiles[id] = this.cache.get_image(filename);
-    }
-}
--- a/src/tools.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-module tools;
-
-import tango.io.File;
-
-char[] read_file_contents(char[] filename) {
-    auto file = new File (filename);
-    auto content = cast(char[]) file.read();
-
-    return content;
-}
--- a/src/viewconsumer.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-module viewconsumer;
-
-import dsfml.window.all;
-import dsfml.system.all;
-import dsfml.graphics.all;
-
-import consumer;
-import renderer;
-import tango.io.Stdout;
-
-/* That is a consumer which sets and manipulates the render window view */
-class ViewConsumer : Consumer {
-    protected View view;
-
-    this(Renderer renderer) {
-	super(renderer);
-	// set the initial view
-	this.view = renderer.app.getView();
-	this.view.setFromRect(new FloatRect(0, 0, renderer.app.getWidth(), renderer.app.getHeight()));
-	this.update_view();
-    }
-
-    protected void update_view() {
-	this.renderer.app.setView(this.view);
-    }
-
-    void move_view(float x=0, float y=0) {
-	this.view.move(x, y);
-    }
-}
-
-class InteractiveViewConsumer : ViewConsumer {
-    this(Renderer renderer) {
-	super(renderer);
-    }
-
-    bool handle_event(Event evt) {
-	if (evt.Type == Event.EventType.KEYPRESSED) {
-	    float x=0, y=0;
-	    if(evt.Key.Code == KeyCode.LEFT) x -= 2;
-	    if(evt.Key.Code == KeyCode.RIGHT) x += 2;
-	    if(evt.Key.Code == KeyCode.UP) y -= 2;
-	    if(evt.Key.Code == KeyCode.DOWN) y += 2;
-	    if(x != 0 || y != 0) {
-		Stdout.formatln("{} fps", 1.0 / this.renderer.app.getFrameTime());
-		this.move_view(x, y);
-		return true;
-	    }
-	}
-	return false;
-    }
-}
--- a/src/xmlmap.d	Fri Jul 18 16:12:41 2008 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-module xmlmap;
-
-import tileset;
-import tilemap;
-
-import tango.text.xml.Document;
-import tango.text.convert.Integer;
-import tango.io.Stdout; // TODO
-import tools;
-import imagecache;
-import dsfml.system.all;
-import Text = tango.text.Util;
-
-
-alias XmlPath!(char).NodeSet NodeSet;
-alias Document!(char).Node NodeImpl;
-private char[] get_attribute(NodeSet node, char[] name) {
-    return node.attribute(name).nodes[0].value;
-}
-
-Tileset parse_tileset(Cache cache, char[] content) {
-    auto tileset = new Tileset(cache);
-
-    auto doc = new Document!(char);
-    doc.parse(content);
-    auto root = doc.query["tileset"];   
-    auto nodes = root.child.nodes;
-    foreach(NodeImpl tiles_node; nodes) {
-	tileset.add_tile(Integer.parse(tiles_node.getAttribute("id").value), tiles_node.getAttribute("filename").value);
-    }
-    return tileset;
-}
-
-Tilemap parse_map(Cache cache, char[] content) {
-    auto doc = new Document!(char);
-    doc.parse(content);
-    auto root = doc.query["map"];
-    int width = Integer.parse(get_attribute(root, "width"));
-    int height = Integer.parse(get_attribute(root, "height"));
-    Stdout.formatln("Width: {}, Height: {}", width, height);
-    auto tiles_node = root.child.nodes[0];
-    char[] tileset_file = tiles_node.getAttribute("tileset").value;
-    auto tilemap = new Tilemap(parse_tileset(cache, read_file_contents(tileset_file)), width, height, 32, 32); // TODO: variable tile size
-    int layer_id=0;
-    foreach(NodeImpl layer_node; tiles_node.query["layer"].nodes) {
-	int tile_width = Integer.parse(layer_node.getAttribute("tilewidth").value);
-	int tile_height = Integer.parse(layer_node.getAttribute("tileheight").value);
-	tilemap.layer_tsizes[layer_id] = Vector2i(tile_width, tile_height);
-	char[][] content_ = Text.delimit(Text.trim(layer_node.value), ",");
-	int i=0;
-	for(int x=0; x < width; x++) {
-	    for(int y=0; y < height; y++) {
-		tilemap.map[layer_id][x][y] = Integer.parse(content_[i]);
-		i++;
-	    }
-	}
-	layer_id++;
-    }
-    return tilemap;
-}