8ed5f249c99e6947c10c72ca7f586e0bbb876338
[supertux.git] / src / tile_manager.cpp
1 //  $Id$
2 //
3 //  SuperTux
4 //  Copyright (C) 2004 Tobias Glaesser <tobi.web@gmx.de>
5 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
6 //
7 //  This program is free software; you can redistribute it and/or
8 //  modify it under the terms of the GNU General Public License
9 //  as published by the Free Software Foundation; either version 2
10 //  of the License, or (at your option) any later version.
11 //
12 //  This program is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 //  GNU General Public License for more details.
16 //
17 //  You should have received a copy of the GNU General Public License
18 //  along with this program; if not, write to the Free Software
19 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 //  02111-1307, USA.
21 #include <config.h>
22
23 #include <memory>
24 #include <stdexcept>
25 #include <sstream>
26 #include <iostream>
27 #include <assert.h>
28 #include <SDL.h>
29 #include "video/drawing_context.hpp"
30 #include "log.hpp"
31 #include "lisp/lisp.hpp"
32 #include "lisp/parser.hpp"
33 #include "lisp/list_iterator.hpp"
34 #include "tile.hpp"
35 #include "tile_set.hpp"
36 #include "tile_manager.hpp"
37 #include "resources.hpp"
38
39 TileManager *tile_manager    = NULL;
40 TileSet     *current_tileset = NULL;
41
42 TileManager::TileManager()
43 {
44 }
45
46 TileManager::~TileManager()
47 {
48 }
49
50 TileSet* TileManager::get_tileset(const std::string &filename)
51 {
52   TileSets::const_iterator i = tilesets.find(filename);
53   if(i != tilesets.end())
54     return i->second;
55
56   std::auto_ptr<TileSet> tileset (new TileSet(filename));
57   tilesets.insert(std::make_pair(filename, tileset.get()));
58
59   return tileset.release();
60 }
61
62 TileSet* TileManager::parse_tileset_definition(const lisp::Lisp& reader)
63 {
64   std::auto_ptr<TileSet> result(new TileSet());
65
66   lisp::ListIterator iter(&reader);
67   while(iter.next()) {
68     const std::string& token = iter.item();
69     if(token != "tileset") {
70       log_warning << "Skipping unrecognized token \"" << token << "\" in tileset definition" << std::endl;
71       continue;
72     }
73     const lisp::Lisp* tileset_reader = iter.lisp();
74
75     std::string file; 
76     if (!tileset_reader->get("file", file)) {
77       log_warning << "Skipping tileset import without file name" << std::endl;
78       continue;
79     }
80
81     const TileSet *tileset = get_tileset(file);
82
83     uint32_t start  = 0;
84     uint32_t end    = std::numeric_limits<uint32_t>::max();
85     uint32_t offset = 0;
86     tileset_reader->get("start",  start);
87     tileset_reader->get("end",    end);
88     tileset_reader->get("offset", offset);
89
90     result->merge(tileset, start, end, offset);
91   }
92
93   return result.release();
94 }
95