Updated tilemanager to make it working with current libraries, by now works only...
[supertux.git] / tools / tilemanager / TileSet.cs
1 using System;
2 using System.IO;
3 using System.Collections;
4 using Lisp;
5
6 public class TileGroup {
7     public string Name;
8     public ArrayList Tiles = new ArrayList();
9
10     public void Write(LispWriter writer) {
11         writer.StartList("tilegroup");
12
13         writer.Write("name", Name);
14         writer.Write("tiles", Tiles);
15
16         writer.EndList("tilegroup");
17     }
18
19     public void Parse(Lisp.Parser parser) {
20         int d = parser.Depth;
21         while(parser.Parse() && parser.Depth >= d) {
22             if(parser.Depth == d+1) {
23                 if(parser.Type != Parser.LispType.SYMBOL)
24                     throw new Exception("expected SYMBOL");
25                 string symbol = parser.SymbolValue;
26                 parser.Parse();
27                 switch(symbol) {
28                     case "name":
29                         Name = parser.StringValue;
30                         break;
31                     case "tiles":
32                         do {
33                           Tiles.Add(parser.IntegerValue);
34                         } while(parser.Parse()
35                                 && parser.Type == Parser.LispType.INTEGER);
36                         break;
37                     default:
38                         Console.WriteLine("Unknown section " + symbol);
39                         break;
40                 }
41             }
42         }
43     }
44 }
45
46 public class TileSet {
47     private bool tooNew = false;
48
49     /// <summary>Whether version of tileset file is too new</summary>
50     public bool TooNew {
51         get {
52                 return tooNew;
53         }
54     }
55
56     public ArrayList Tiles = new ArrayList();
57     public ArrayList TileGroups = new ArrayList();
58
59     public void Write(string filename) {
60         FileStream fs = new FileStream(filename, FileMode.Create);
61
62         TextWriter tw = new StreamWriter(fs);
63         LispWriter writer = new LispWriter(tw);
64
65         writer.WriteComment("Generated by tiler");
66         writer.StartList("supertux-tiles");
67         foreach(TileGroup tilegroup in TileGroups) {
68             tilegroup.Write(writer);
69         }
70         foreach(Tile tile in Tiles) {
71             if(tile == null)
72                 continue;
73             if(tile.ID >= 0)
74                 tile.Write(writer);
75         }
76         writer.EndList("supertux-tiles");
77         tw.Close();
78         fs.Close();
79     }
80
81     public void Parse(string filename) {
82         FileStream fs = new FileStream(filename, FileMode.Open);
83         StreamReader stream = new StreamReader(fs);
84
85         Lisp.Parser parser = new Lisp.Parser(stream);
86         parser.Parse();
87         if(parser.Type != Parser.LispType.START_LIST)
88             throw new Exception("Expected START_LIST");
89         parser.Parse();
90         if(parser.Type != Parser.LispType.SYMBOL)
91             throw new Exception("Expected symbol");
92         if(parser.SymbolValue != "supertux-tiles")
93             throw new Exception("not a supertux tile files but " +
94                     parser.SymbolValue);
95         ParseTiles(parser);
96
97         stream.Close();
98         fs.Close();
99     }
100
101     public void ParseTiles(Lisp.Parser parser) {
102         tooNew = false;
103         int d = parser.Depth;
104         while(parser.Parse() && parser.Depth >= d) {
105             if(parser.Depth == d && parser.Type != Parser.LispType.START_LIST) {
106                 Console.WriteLine("non-cons type in list...");
107                 continue;
108             }
109
110             if(parser.Depth == d+1) {
111                 if(parser.Type != Parser.LispType.SYMBOL) {
112                     throw new Exception("Expected symbol in list element");
113                 }
114                 switch(parser.SymbolValue) {
115                     case "properties":
116                         SkipList(parser);
117                         break;
118                     case "tilegroup":
119                         TileGroup tilegroup = new TileGroup();
120                         tilegroup.Parse(parser);
121                         TileGroups.Add(tilegroup);
122                         break;
123                     case "tile":
124                         Tile tile = new Tile();
125                         tile.Parse(parser);
126
127                         while(tile.ID >= Tiles.Count)
128                             Tiles.Add(null);
129                         Tiles[tile.ID] = tile;
130                         break;
131                     case "tiles":
132                         SkipList(parser);
133                         tooNew = true;
134                         Console.WriteLine(
135                                 "Warning: new syntax of \"More tiles in one image\" file isn't currently supported");
136                         Console.WriteLine(
137                                 "And this means: YOU WON'T BE ABLE TO SAVE YOUR CHANGES !!!");
138                         break;
139                    default:
140                         throw new Exception("Unexpected listentry: " +
141                                 parser.SymbolValue);
142                 }
143             }
144         }
145     }
146
147     private void SkipList(Lisp.Parser parser) {
148         int d = parser.Depth;
149         while(parser.Parse() && parser.Depth >= d)
150             ;
151     }
152 }