Mercurial > projects > myrrdin
diff import/myrrdin/xmlmap.d @ 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 | src/xmlmap.d@a9af6ec19195 |
children | 510541745cd1 |
line wrap: on
line diff
--- /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; +}