New grow and skid sounds from remaxim
[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 <limits>
28 #include <assert.h>
29 #include <SDL.h>
30 #include "video/drawing_context.hpp"
31 #include "log.hpp"
32 #include "lisp/lisp.hpp"
33 #include "lisp/parser.hpp"
34 #include "lisp/list_iterator.hpp"
35 #include "tile.hpp"
36 #include "tile_set.hpp"
37 #include "tile_manager.hpp"
38 #include "resources.hpp"
39
40 TileManager *tile_manager    = NULL;
41 TileSet     *current_tileset = NULL;
42
43 TileManager::TileManager()
44 {
45 }
46
47 TileManager::~TileManager()
48 {
49 }
50
51 TileSet* TileManager::get_tileset(const std::string &filename)
52 {
53   TileSets::const_iterator i = tilesets.find(filename);
54   if(i != tilesets.end())
55     return i->second;
56
57   std::auto_ptr<TileSet> tileset (new TileSet(filename));
58   tilesets.insert(std::make_pair(filename, tileset.get()));
59
60   return tileset.release();
61 }
62
63 TileSet* TileManager::parse_tileset_definition(const lisp::Lisp& reader)
64 {
65   std::auto_ptr<TileSet> result(new TileSet());
66
67   lisp::ListIterator iter(&reader);
68   while(iter.next()) {
69     const std::string& token = iter.item();
70     if(token != "tileset") {
71       log_warning << "Skipping unrecognized token \"" << token << "\" in tileset definition" << std::endl;
72       continue;
73     }
74     const lisp::Lisp* tileset_reader = iter.lisp();
75
76     std::string file; 
77     if (!tileset_reader->get("file", file)) {
78       log_warning << "Skipping tileset import without file name" << std::endl;
79       continue;
80     }
81
82     const TileSet *tileset = get_tileset(file);
83
84     uint32_t start  = 0;
85     uint32_t end    = std::numeric_limits<uint32_t>::max();
86     uint32_t offset = 0;
87     tileset_reader->get("start",  start);
88     tileset_reader->get("end",    end);
89     tileset_reader->get("offset", offset);
90
91     result->merge(tileset, start, end, offset);
92   }
93
94   return result.release();
95 }
96