- fixed badguys a little bit
[supertux.git] / src / tile.cpp
1 //
2 // C++ Implementation: tile
3 //
4 // Description: 
5 //
6 //
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2004
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12 #include "tile.h"
13 #include "assert.h"
14
15 TileManager* TileManager::instance_  = 0;
16
17 TileManager::TileManager()
18 {
19   std::string filename = datadir +  "images/tilesets/supertux.stgt"; 
20   load_tileset(filename);
21 }
22
23 void TileManager::load_tileset(std::string filename)
24 {
25   lisp_object_t* root_obj = lisp_read_from_file(filename);
26   
27   if (!root_obj)
28     st_abort("Couldn't load file", filename);
29
30   if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-tiles") == 0)
31     {
32       lisp_object_t* cur = lisp_cdr(root_obj);
33       int tileset_id = 0;
34
35       while(!lisp_nil_p(cur))
36         {
37           lisp_object_t* element = lisp_car(cur);
38
39           if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0)
40             {
41               Tile* tile = new Tile;
42               tile->id      = -1;
43               tile->solid   = false;
44               tile->brick   = false;
45               tile->ice     = false;      
46               tile->fullbox = false;          
47               tile->distro  = false;
48               tile->data    = 0;
49               tile->alpha   = 0;
50               tile->next_tile  = 0;
51               tile->next_tile2 = 0;
52               tile->anim_speed = 25;
53   
54               LispReader reader(lisp_cdr(element));
55               assert(reader.read_int("id",  &tile->id));
56               reader.read_bool("solid",     &tile->solid);
57               reader.read_bool("brick",     &tile->brick);
58               reader.read_bool("ice",       &tile->ice);           
59               reader.read_bool("fullbox",   &tile->fullbox);
60               reader.read_bool("distro",    &tile->distro);
61               reader.read_int("data",       (int*)&tile->data);
62               reader.read_int("alpha",      (int*)&tile->alpha);
63               reader.read_int("anim-speed", &tile->anim_speed);
64               reader.read_int("next-tile",  &tile->next_tile);
65               reader.read_int("next-tile2", &tile->next_tile2);
66               reader.read_string_vector("images",  &tile->filenames);
67
68               for(std::vector<std::string>::iterator it = tile->filenames.begin();
69                   it != tile->filenames.end();
70                   ++it)
71                 {
72                   texture_type cur_image;
73                   tile->images.push_back(cur_image);
74                   texture_load(&tile->images[tile->images.size()-1], 
75                                datadir +  "images/tilesets/" + (*it), 
76                                USE_ALPHA);
77                 }
78
79               if (tile->id + tileset_id >= int(tiles.size()))
80                 tiles.resize(tile->id + tileset_id+1);
81
82               tiles[tile->id + tileset_id] = tile;
83             }
84           else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0)
85             {
86               LispReader reader(lisp_cdr(element));
87               std::string filename;
88               reader.read_string("file",  &filename);
89               filename = datadir + "images/tilesets/" + filename; 
90               load_tileset(filename);
91             }
92           else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0)
93             {
94               LispReader reader(lisp_cdr(element));
95               reader.read_int("id",  &tileset_id);
96               tileset_id *= 1000;
97             }
98           else
99             {
100               puts("Unhandled symbol");
101             }
102
103           cur = lisp_cdr(cur);
104         }
105     }
106   else
107     {
108       assert(0);
109     }
110 }
111
112 // EOF //
113