annotate src/xmlmap.d @ 3:a9af6ec19195

working map and tileset loading
author fred@reichbier.de
date Thu, 17 Jul 2008 21:34:53 +0200
parents fc2f936a961c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
1 module xmlmap;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
2
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
3 import tileset;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
4 import tilemap;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
5
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
6 import tango.text.xml.Document;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
7 import tango.text.convert.Integer;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
8 import tango.io.Stdout; // TODO
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
9 import tools;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
10 import imagecache;
3
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
11 import dsfml.system.all;
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
12 import Text = tango.text.Util;
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
13
2
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
14
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
15 alias XmlPath!(char).NodeSet NodeSet;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
16 alias Document!(char).Node NodeImpl;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
17 private char[] get_attribute(NodeSet node, char[] name) {
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
18 return node.attribute(name).nodes[0].value;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
19 }
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
20
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
21 Tileset parse_tileset(Cache cache, char[] content) {
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
22 auto tileset = new Tileset(cache);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
23
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
24 auto doc = new Document!(char);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
25 doc.parse(content);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
26 auto root = doc.query["tileset"];
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
27 auto nodes = root.child.nodes;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
28 foreach(NodeImpl tiles_node; nodes) {
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
29 tileset.add_tile(Integer.parse(tiles_node.getAttribute("id").value), tiles_node.getAttribute("filename").value);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
30 }
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
31 return tileset;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
32 }
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
33
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
34 Tilemap parse_map(Cache cache, char[] content) {
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
35 auto doc = new Document!(char);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
36 doc.parse(content);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
37 auto root = doc.query["map"];
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
38 int width = Integer.parse(get_attribute(root, "width"));
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
39 int height = Integer.parse(get_attribute(root, "height"));
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
40 Stdout.formatln("Width: {}, Height: {}", width, height);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
41 auto tiles_node = root.child.nodes[0];
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
42 char[] tileset_file = tiles_node.getAttribute("tileset").value;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
43 auto tilemap = new Tilemap(parse_tileset(cache, read_file_contents(tileset_file)), width, height, 32, 32); // TODO: variable tile size
3
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
44 int layer_id=0;
2
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
45 foreach(NodeImpl layer_node; tiles_node.query["layer"].nodes) {
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
46 int tile_width = Integer.parse(layer_node.getAttribute("tilewidth").value);
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
47 int tile_height = Integer.parse(layer_node.getAttribute("tileheight").value);
3
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
48 tilemap.layer_tsizes[layer_id] = Vector2i(tile_width, tile_height);
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
49 char[][] content_ = Text.delimit(Text.trim(layer_node.value), ",");
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
50 int i=0;
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
51 for(int x=0; x < width; x++) {
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
52 for(int y=0; y < height; y++) {
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
53 tilemap.map[layer_id][x][y] = Integer.parse(content_[i]);
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
54 i++;
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
55 }
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
56 }
a9af6ec19195 working map and tileset loading
fred@reichbier.de
parents: 2
diff changeset
57 layer_id++;
2
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
58 }
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
59 return tilemap;
fc2f936a961c basic loading, to be fixed
fred@reichbier.de
parents:
diff changeset
60 }