1 /***************************************************************************
2 level.cpp - description
3 -------------------
4 begin : Fri Aug 31 2001
5 copyright : (C) 2001 by Giuseppe D'Aqu�
6 email : kumber@tiscalinet.it
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License, Version 2, as published by *
13 * the Free Software Foundation. *
14 * *
15 ***************************************************************************/
16
17 #include "dephine.h"
18 #include "entity.h"
19 #include "entity_all.h"
20 #include "entity_factory.h"
21 #include "entity_manager.h"
22 #include "surface_manager.h"
23 #include "level.h"
24 #include "levelmap.h"
25 #include "screen.h"
26 #include "sprite.h"
27
28 #include "sfx.h"
29 #include <vector>
30 //#include <map>
31 #include <fstream>
32
33 extern int glb_curr_id;
34
Level()35 Level::Level()
36 {
37
38 m_entities_matrix.resize(Epiconfig::instance()->get_map_size_x());
39
40 for(Uint32 i=0; i<Epiconfig::instance()->get_map_size_x(); i++)
41 {
42
43 m_entities_matrix[i].resize(Epiconfig::instance()->get_map_size_y());
44
45 }
46
47 for(Uint32 x=0; x<Epiconfig::instance()->get_map_size_x(); x++)
48 for(Uint32 y=0; y<Epiconfig::instance()->get_map_size_y(); y++)
49 {
50
51 m_entities_matrix[x][y] = 0;
52
53 }
54
55 Entity_Manager::instance()->reset();
56
57 m_acquired_keys=0;
58
59 m_min_score=0;
60
61 }
62
set_key(Uint32 key)63 void Level::set_key(Uint32 key)
64 {
65 m_acquired_keys=m_acquired_keys|key;
66 }
67
68
69
get_entity(Sint32 x,Sint32 y)70 Entity_Handle Level::get_entity(Sint32 x, Sint32 y)
71 {
72 if((x<0)||(y<0)||(x>=(Sint32)m_entities_matrix.size())||(y>=(Sint32)m_entities_matrix[0].size()))
73 {
74 return 0;
75 }
76 return m_entities_matrix[x][y];
77 }
78
get_entity(Sint32 x,Sint32 y,Direction d)79 Entity_Handle Level::get_entity(Sint32 x, Sint32 y, Direction d)
80 {
81 Sint32 dx, dy;
82
83 switch(d)
84 {
85 case STOP:
86 dx=0;
87 dy=0;
88 break;
89 case UP:
90 dx=0;
91 dy=-1;
92 break;
93 case UPRIGHT:
94 dx=1;
95 dy=-1;
96 break;
97 case RIGHT:
98 dx=1;
99 dy=0;
100 break;
101 case DOWNRIGHT:
102 dx=1;
103 dy=1;
104 break;
105 case DOWN:
106 dx=0;
107 dy=1;
108 break;
109 case DOWNLEFT:
110 dx=-1;
111 dy=1;
112 break;
113 case LEFT:
114 dx=-1;
115 dy=0;
116 break;
117 case UPLEFT:
118 dx=-1;
119 dy=-1;
120 break;
121
122 }
123
124 return get_entity(x+dx, y+dy);
125
126 }
127
get_entity(Sint32 x,Sint32 y,Direction d,Direction d1)128 Entity_Handle Level::get_entity(Sint32 x, Sint32 y, Direction d, Direction d1)
129 {
130 Sint32 dx, dy;
131
132 switch(d)
133 {
134 case STOP:
135 dx=0;
136 dy=0;
137 break;
138 case UP:
139 dx=0;
140 dy=-1;
141 break;
142 case UPRIGHT:
143 dx=1;
144 dy=-1;
145 break;
146 case RIGHT:
147 dx=1;
148 dy=0;
149 break;
150 case DOWNRIGHT:
151 dx=1;
152 dy=1;
153 break;
154 case DOWN:
155 dx=0;
156 dy=1;
157 break;
158 case DOWNLEFT:
159 dx=-1;
160 dy=1;
161 break;
162 case LEFT:
163 dx=-1;
164 dy=0;
165 break;
166 case UPLEFT:
167 dx=-1;
168 dy=-1;
169 break;
170
171 }
172
173 return get_entity(x+dx, y+dy, d1);
174
175 }
176
load_map(const char * map_path)177 void Level::load_map(const char* map_path)
178 {
179
180 Levelmap levelmap;
181 levelmap.load_map(map_path);
182 Uint32 i,j;
183 for(j=0; j<levelmap.get_size_y(); j++)
184 for(i=0; i<levelmap.get_size_x(); i++)
185 {
186 set_entity(levelmap.get_map_element(i,j),i,j);
187 }
188 m_exit->set_min_score(levelmap.get_min_score());
189 m_min_score=levelmap.get_min_score();
190 m_max_time=levelmap.get_max_time();
191 }
192
set_entity(Entity_Type type,Uint32 x,Uint32 y)193 void Level::set_entity(Entity_Type type, Uint32 x, Uint32 y)
194 {
195 if(type==UNKNOWN)
196 {
197 return;
198 }
199 Entity_Factory* entity_factory = Entity_Factory::instance();
200 Entity* entity = entity_factory->create_entity(type, this);
201 entity->set_initial_position(x,y);
202 set_entity(entity);
203
204 if(type == PLAYER)
205 {
206 m_player = (Entity_Player*)entity;
207 }
208 else if(type == EXIT)
209 {
210 m_exit = (Entity_Exit*) entity;
211 }
212
213 }
214
215
set_entity(Entity * ntt)216 void Level::set_entity(Entity* ntt)
217 {
218 //m_entities_list.push_back(Ntt_pointer(*ntt));
219 Entity_Handle e_handle = Entity_Manager::instance()->add_entity(ntt);
220 ntt->set_id(e_handle);
221 m_entities_matrix[ntt->get_position_x()][ntt->get_position_y()]=e_handle;
222 //DEBOUT("setting entity to "<<ntt->get_position_x()<<", "<<ntt->get_position_y()<<"\n");
223 }
224
get_size_x()225 Uint32 Level::get_size_x()
226 {
227 return Epiconfig::instance()->get_map_size_x();
228 }
229
get_size_y()230 Uint32 Level::get_size_y()
231 {
232 return Epiconfig::instance()->get_map_size_y();
233 }
234
get_entities_matrix()235 std::vector<std::vector<Entity_Handle> >& Level::get_entities_matrix()
236 {
237 return m_entities_matrix;
238 }
239
get_player()240 Entity_Player& Level::get_player()
241 {
242 return *m_player;
243 }
244
~Level()245 Level::~Level()
246 {
247 }
248
get_acquired_keys()249 Uint32 Level::get_acquired_keys()
250 {
251 return m_acquired_keys;
252 }
253
explode(Uint32 x,Uint32 y,Entity_Type transform_to)254 void Level::explode(Uint32 x, Uint32 y, Entity_Type transform_to)
255 {
256
257 Entity_Handle curr_ntt=get_entity(x,y);
258
259 if(curr_ntt != 0)
260 {
261 Entity* curr_entity = Entity_Manager::instance()->get_entity(curr_ntt);
262
263
264 if(curr_entity->exists())
265 {
266
267 bool result=curr_entity->explode();
268 if(result)
269 {
270 Entity_Explosion* explosion = new Entity_Explosion(this,x,y);
271
272 explosion->set_transform_to(transform_to);
273 explosion->set_initial_position(x, y);
274 set_entity(explosion);
275 }
276 }
277 else
278 {
279 Entity_Explosion* explosion = new Entity_Explosion(this,x,y);
280 explosion->set_transform_to(transform_to);
281 explosion->set_initial_position(x, y);
282 set_entity(explosion);
283 }
284 }
285 else
286 {
287 Entity_Explosion* explosion = new Entity_Explosion(this,x,y);
288 explosion->set_transform_to(transform_to);
289 explosion->set_initial_position(x, y);
290 set_entity(explosion);
291 }
292
293 }
294
get_min_score()295 Uint32 Level::get_min_score()
296 {
297 return m_min_score;
298 }
299
get_max_time()300 Uint32 Level::get_max_time()
301 {
302 return m_max_time;
303 }
304
305
306
player_push(Uint32 x,Uint32 y,Direction d)307 bool Level::player_push(Uint32 x, Uint32 y, Direction d)
308 {
309 Entity_Handle neigh_entity = this->get_entity(x, y, d);
310 if(neigh_entity!=0)
311 {
312 bool return_value = false;
313 switch(d)
314 {
315 case LEFT:
316 return_value = Entity_Manager::instance()->get_entity(neigh_entity)->player_pressing_right(this->get_entity(x,y,d,LEFT));
317 break;
318 case RIGHT:
319 return_value = Entity_Manager::instance()->get_entity(neigh_entity)->player_pressing_left(this->get_entity(x,y,d,RIGHT));
320 break;
321 case UP:
322 return_value = Entity_Manager::instance()->get_entity(neigh_entity)->player_pressing_down(this->get_entity(x,y,d,UP));
323 break;
324 case DOWN:
325 return_value = Entity_Manager::instance()->get_entity(neigh_entity)->player_pressing_up(this->get_entity(x,y,d,DOWN));
326 break;
327 default:
328 return_value = false;
329 }
330 return return_value;
331 }
332 return true;
333 }
334
335