0d50402d087d3589644d365b5a05f6d95d0b426c
[supertux.git] / contrib / 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                             if(!Tiles.Contains(parser.IntegerValue))
34                                 Tiles.Add(parser.IntegerValue);
35                         } while(parser.Parse() 
36                                 && parser.Type == Parser.LispType.INTEGER);
37                         break;
38                     default:
39                         Console.WriteLine("Unknown section " + symbol);
40                         break;
41                 }
42             }
43         }
44     }
45 }
46
47 public class TileSet {
48     public ArrayList Tiles = new ArrayList();
49     public ArrayList TileGroups = new ArrayList();
50
51     public void Write(string filename) {
52         FileStream fs = new FileStream(filename, FileMode.Create);
53        
54         TextWriter tw = new StreamWriter(fs);
55         LispWriter writer = new LispWriter(tw);
56
57         writer.WriteComment("Generated by tiler");
58         writer.StartList("supertux-tiles");
59         foreach(TileGroup tilegroup in TileGroups) {
60             tilegroup.Write(writer);
61         }
62         foreach(Tile tile in Tiles) {
63             if(tile == null)
64                 continue;
65             if(tile.ID >= 0)
66                 tile.Write(writer);
67         }
68         writer.EndList("supertux-tiles");
69         tw.Close();
70         fs.Close();
71     }
72     
73     public void Parse(string filename) {
74         FileStream fs = new FileStream(filename, FileMode.Open);
75         StreamReader stream = new StreamReader(fs);
76
77         Lisp.Parser parser = new Lisp.Parser(stream);
78         parser.Parse();
79         if(parser.Type != Parser.LispType.START_LIST)
80             throw new Exception("Expected START_LIST");
81         parser.Parse();
82         if(parser.Type != Parser.LispType.SYMBOL)
83             throw new Exception("Expected symbol");
84         if(parser.SymbolValue != "supertux-tiles")
85             throw new Exception("not a supertux tile files but " +
86                     parser.SymbolValue);
87         ParseTiles(parser);
88
89         stream.Close();
90         fs.Close();
91     }
92
93     public void ParseTiles(Lisp.Parser parser) {
94         int d = parser.Depth;
95         while(parser.Parse() && parser.Depth >= d) {
96             if(parser.Depth == d && parser.Type != Parser.LispType.START_LIST) {
97                 Console.WriteLine("non-cons type in list...");
98                 continue;
99             }
100
101             if(parser.Depth == d+1) {
102                 if(parser.Type != Parser.LispType.SYMBOL) {
103                     throw new Exception("Expected symbol in list element");
104                 }
105                 switch(parser.SymbolValue) {
106                     case "properties":
107                         SkipList(parser);
108                         break;
109                     case "tilegroup":
110                         TileGroup tilegroup = new TileGroup();
111                         tilegroup.Parse(parser);
112                         TileGroups.Add(tilegroup);
113                         break;
114                     case "tile":
115                         Tile tile = new Tile();
116                         tile.Parse(parser);
117
118                         while(tile.ID >= Tiles.Count)
119                             Tiles.Add(null);
120                         Tiles[tile.ID] = tile;
121                         break;
122                     default:
123                         throw new Exception("Unexpected listentry: " +
124                                 parser.SymbolValue);
125                 }
126             }
127         }
128     }
129
130     private void SkipList(Lisp.Parser parser) {
131         int d = parser.Depth;
132         while(parser.Parse() && parser.Depth >= d)
133             ;
134     }
135 }
136