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