lots of improvements all over the code.
[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 std::vector<TileGroup>* TileManager::tilegroups_  = 0;
17
18 TileManager::TileManager()
19 {
20   std::string filename = datadir +  "images/tilesets/supertux.stgt";
21   load_tileset(filename);
22 }
23
24 void TileManager::load_tileset(std::string filename)
25 {
26   lisp_object_t* root_obj = lisp_read_from_file(filename);
27
28   if (!root_obj)
29     st_abort("Couldn't load file", filename);
30
31   if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-tiles") == 0)
32     {
33       lisp_object_t* cur = lisp_cdr(root_obj);
34       int tileset_id = 0;
35
36       while(!lisp_nil_p(cur))
37         {
38           lisp_object_t* element = lisp_car(cur);
39
40           if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0)
41             {
42               std::vector<std::string> editor_filenames;
43              
44               Tile* tile = new Tile;
45               tile->id      = -1;
46               tile->solid   = false;
47               tile->brick   = false;
48               tile->ice     = false;
49               tile->fullbox = false;
50               tile->distro  = false;
51               tile->data    = 0;
52               tile->next_tile  = 0;
53               tile->anim_speed = 25;
54
55               LispReader reader(lisp_cdr(element));
56               assert(reader.read_int("id",  &tile->id));
57               reader.read_bool("solid",     &tile->solid);
58               reader.read_bool("brick",     &tile->brick);
59               reader.read_bool("ice",       &tile->ice);
60               reader.read_bool("fullbox",   &tile->fullbox);
61               reader.read_bool("distro",    &tile->distro);
62               reader.read_int("data",       &tile->data);
63               reader.read_int("anim-speed", &tile->anim_speed);
64               reader.read_int("next-tile",  &tile->next_tile);
65               reader.read_string_vector("images",  &tile->filenames);
66               reader.read_string_vector("editor-images", &editor_filenames);
67
68               for(std::vector<std::string>::iterator it = tile->
69                   filenames.begin();
70                   it != tile->filenames.end();
71                   ++it)
72                 {
73                   texture_type cur_image;
74                   tile->images.push_back(cur_image);
75                   texture_load(&tile->images[tile->images.size()-1],
76                                datadir +  "images/tilesets/" + (*it),
77                                USE_ALPHA);
78                 }
79               for(std::vector<std::string>::iterator it = editor_filenames.begin();
80                   it != editor_filenames.end();
81                   ++it)
82                 {
83                   texture_type cur_image;
84                   tile->editor_images.push_back(cur_image);
85                   texture_load(&tile->editor_images[tile->editor_images.size()-1],
86                                datadir +  "images/tilesets/" + (*it),
87                                USE_ALPHA);
88                 }
89                 
90               if (tile->id + tileset_id >= int(tiles.size())
91                  )
92                 tiles.resize(tile->id + tileset_id+1);
93
94               tiles[tile->id + tileset_id] = tile;
95             }
96           else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0)
97             {
98               LispReader reader(lisp_cdr(element));
99               std::string filename;
100               reader.read_string("file",  &filename);
101               filename = datadir + "images/tilesets/" + filename;
102               load_tileset(filename);
103             }
104           else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0)
105             {
106               TileGroup new_;
107               if(!tilegroups_)
108                 tilegroups_ = new std::vector<TileGroup>;
109               tilegroups_->push_back(new_);
110               LispReader reader(lisp_cdr(element));
111               tilegroups_->back().name;
112               reader.read_string("name",  &tilegroups_->back().name);
113               reader.read_int_vector("tiles", &tilegroups_->back().tiles);
114             }
115           else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0)
116             {
117               LispReader reader(lisp_cdr(element));
118               reader.read_int("id",  &tileset_id);
119               tileset_id *= 1000;
120             }
121           else
122             {
123               puts("Unhandled symbol");
124             }
125
126           cur = lisp_cdr(cur);
127         }
128     }
129   else
130     {
131       assert(0);
132     }
133 }
134
135 // EOF //
136