Subversion Repositories Kolibri OS

Rev

Rev 5340 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5281 ZblCoder 1
#include "smalllibc/kosSyst.h"
2
#include "smalllibc/kosFile.h"
5283 ZblCoder 3
#include "smalllibc/sprintf.h"
5281 ZblCoder 4
#include "smalllibc/func.h"
5276 ZblCoder 5
#include "render.h"
6
#include "image.h"
7
 
8
#define MODE_MENU		0
9
#define MODE_LEVELS		1
10
#define MODE_GAME		2
5297 ZblCoder 11
#define MODE_PAUSE		4
5276 ZblCoder 12
 
13
#define GAME_NONE		0
14
#define GAME_VICTORY	1
15
#define GAME_DEFEAT		2
16
 
17
#define MOUSE_LEFT		0
18
 
5287 ZblCoder 19
#define FIELD_NONE			0
20
#define FIELD_WATER			1
21
#define FIELD_GROUND		2
22
#define FIELD_BRICK			3
23
#define FIELD_WALL			4
24
#define FIELD_BOX			5
25
#define FIELD_MISSLE_0		6
26
#define FIELD_MISSLE_1		7
27
#define FIELD_MISSLE_2		8
28
#define FIELD_MISSLE_3		9
29
#define FIELD_HERO			10
30
#define FIELD_FINISH		11
31
#define FIELD_GUN_0			12
32
#define FIELD_GUN_1			13
33
#define FIELD_GUN_2			14
34
#define FIELD_GUN_3			15
35
#define FIELD_BOX_MISSLE_0	16
36
#define FIELD_BOX_MISSLE_1	17
37
#define FIELD_BOX_MISSLE_2	18
38
#define FIELD_BOX_MISSLE_3	19
5296 ZblCoder 39
#define FIELD_WALL_X		20
40
#define FIELD_WALL_H		21
41
#define FIELD_WALL_V		22
42
#define FIELD_BOX_WATER		23
43
#define FIELD_BRICK_DES		24
44
#define FIELD_CRATER		25
5287 ZblCoder 45
 
5276 ZblCoder 46
char* header = "Laser Tank";
5474 ZblCoder 47
bool w_redraw = true;
5276 ZblCoder 48
 
49
struct Level
50
{
5287 ZblCoder 51
	Byte fileds[16][16];
5276 ZblCoder 52
};
53
 
5287 ZblCoder 54
void pause(int time)
55
{
56
	kos_Pause(time);
57
	Byte keyCode;
5474 ZblCoder 58
	Dword buttons;
59
	int mX, mY;
5287 ZblCoder 60
	for (int i = 0; i < 10; ++i)
5474 ZblCoder 61
	{
5287 ZblCoder 62
		kos_GetKey(keyCode);
5474 ZblCoder 63
		kos_GetMouseState(buttons, mX, mY);
64
	}
5287 ZblCoder 65
}
66
 
5276 ZblCoder 67
Level *levels;
68
int levelCount = 0;
69
int levelIndex = 0;
5296 ZblCoder 70
int levelPage = 0;
5474 ZblCoder 71
float clickTime = 0;
5276 ZblCoder 72
 
73
RGBA img_tank[576];
74
RGB img_water[576];
5287 ZblCoder 75
RGB img_brick[11][576];
5276 ZblCoder 76
RGB img_waterbox[576];
77
RGB img_ground[576];
5296 ZblCoder 78
RGB img_crater[576];
5276 ZblCoder 79
RGB img_wall[576];
5296 ZblCoder 80
RGB img_wall_x[576];
81
RGB img_wall_h[576];
82
RGB img_wall_v[576];
5276 ZblCoder 83
RGB img_finish[576];
84
RGBA img_box[576];
85
RGBA img_laser[576];
5287 ZblCoder 86
RGB img_mirror[4][576];
5296 ZblCoder 87
RGBA img_mini_mirror[2304];
5276 ZblCoder 88
RGBA img_laser1[576];
89
RGBA img_laser2[576];
90
RGB img_brick1[576];
91
RGB img_menu[147456];
92
RGBA img_explosion[8064];
5287 ZblCoder 93
RGBA img_gun[576];
5296 ZblCoder 94
RGB img_gamebg[9216];
5297 ZblCoder 95
RGBA img_black[576];
5276 ZblCoder 96
 
5331 ZblCoder 97
RGB img_pandus[3][12];
98
 
5296 ZblCoder 99
RGBA img_number_box[2550];
100
RGBA img_numbers[3500];
101
RGBA img_button1[3249];
102
RGBA img_button_arrow[375];
5276 ZblCoder 103
 
5296 ZblCoder 104
RGB img_levels[147456];
105
 
5297 ZblCoder 106
RGB img_buttons[3][13053];
107
 
108
 
109
 
5276 ZblCoder 110
Player player;
111
 
112
CKosRender* renderPlayer;
113
CKosImage* objPlayer;
5297 ZblCoder 114
CKosImage* objPlayer1;
5276 ZblCoder 115
 
5296 ZblCoder 116
CKosRender* renderBox;
5331 ZblCoder 117
CKosRender* renderWater;
5296 ZblCoder 118
 
5276 ZblCoder 119
CKosImage* objLaser;
120
CKosImage* objLaser1;
121
CKosImage* objLaser2;
5296 ZblCoder 122
CKosImage* objMiniMirror;
5276 ZblCoder 123
CKosImage* objBox;
5287 ZblCoder 124
CKosImage* objGun;
5296 ZblCoder 125
CKosImage* objExplosion;
5276 ZblCoder 126
 
5297 ZblCoder 127
CKosImage* objblack;
128
 
5296 ZblCoder 129
CKosRender* renderLevels;
130
CKosImage* objnumber_box;
131
CKosImage* objnumbers;
5276 ZblCoder 132
 
5296 ZblCoder 133
CKosImage* objbutton1;
134
CKosImage* objbutton_arrow;
135
 
5276 ZblCoder 136
int gameMode = MODE_MENU;
137
int gameStatus = GAME_NONE;
138
 
139
void draw_window();
140
void openLevel(int index);
5287 ZblCoder 141
void Laser(Point pos, Point vec, RGB color);
5276 ZblCoder 142
 
143
bool CollRecrVsPoint(Point point, Rect rect)
144
{
145
	return (point.X > rect.X && point.Y > rect.Y && point.X < rect.X + rect.Width && point.Y < rect.Y + rect.Height);
146
}
147
 
148
struct Button
149
{
150
	Rect rect;
151
	char* caption;
152
	Button() {}
153
	Button(char* caption, Rect rect)
154
	{
155
		this->caption = caption;
156
		this->rect = rect;
157
	}
158
};
159
 
160
Button ToGame("Game", Rect(150, 258, 224, 50));
161
Button ToExit("Exit", Rect(150, 321, 224, 50));
162
 
163
struct LvlItem
164
{
5287 ZblCoder 165
	Byte s;
166
	Byte d;
5276 ZblCoder 167
	Byte l;
168
};
169
 
170
LvlItem level[16][16];
171
 
172
char GetField(Point position, bool din)
173
{
5331 ZblCoder 174
	if (position.X < 0 || position.Y < 0 || position.X > 15 || position.Y > 15)
175
		return FIELD_WALL;
176
 
5287 ZblCoder 177
	if (din && level[position.Y][position.X].d != FIELD_NONE)
5276 ZblCoder 178
		return level[position.Y][position.X].d;
179
	return level[position.Y][position.X].s;
180
}
181
 
5297 ZblCoder 182
void SetMode(int mode)
183
{
184
	gameMode = mode;
185
	draw_window();
5474 ZblCoder 186
 
187
	pause(40);
5297 ZblCoder 188
}
189
 
5331 ZblCoder 190
bool IsWater(Point pos)
191
{
192
	if (pos.X < 0 || pos.Y < 0 || pos.X > 15 || pos.Y > 15)
193
		return true;
194
 
195
	Byte code = GetField(pos, false);
196
	return (code == FIELD_WATER || code == FIELD_BOX_WATER);
197
}
198
 
199
void RenderPandus(Point pos)
200
{
201
	bool is[10];
202
	for (int y = 0; y < 3; ++y)
203
		for (int x = 0; x < 3; ++x)
204
			is[y * 3 + x + 1] = IsWater(pos + Point(x-1, y-1));
205
 
206
	if (!is[6])
207
	{
208
		if (!is[2] || is[3])
209
			renderWater->RenderImg((RGB*)img_pandus[0], Point(23, 0), 1, 12);
210
		else
211
			renderWater->RenderImg((RGB*)img_pandus[1], Point(23, 0), 1, 12);
212
 
213
		if (!is[8] || is[9])
214
			renderWater->RenderImg((RGB*)img_pandus[2], Point(23, 12), 1, 12);
215
		else
216
			renderWater->RenderImg((RGB*)img_pandus[1], Point(23, 12), 1, 12);
217
	}
218
 
219
	if (!is[2])
220
	{
221
		if (!is[4] || is[1])
222
			renderWater->RenderImg((RGB*)img_pandus[0], Point(0, 0), 12, 1);
223
		else
224
			renderWater->RenderImg((RGB*)img_pandus[1], Point(0, 0), 12, 1);
225
 
226
		if (!is[6] || is[3])
227
			renderWater->RenderImg((RGB*)img_pandus[2], Point(12, 0), 12, 1);
228
		else
229
			renderWater->RenderImg((RGB*)img_pandus[1], Point(12, 0), 12, 1);
230
	}
231
 
232
	if (!is[4])
233
	{
234
		if (!is[8] || is[7])
235
			renderWater->RenderImg((RGB*)img_pandus[2], Point(0, 12), 1, 12);
236
		else
237
			renderWater->RenderImg((RGB*)img_pandus[1], Point(0, 12), 1, 12);
238
 
239
		if (!is[2] || is[1])
240
			renderWater->RenderImg((RGB*)img_pandus[0], Point(0, 0), 1, 12);
241
		else
242
			renderWater->RenderImg((RGB*)img_pandus[1], Point(0, 0), 1, 12);
243
	}
244
 
245
	if (!is[8])
246
	{
247
		if (!is[6] || is[9])
248
			renderWater->RenderImg((RGB*)img_pandus[0], Point(12, 23), 12, 1);
249
		else
250
			renderWater->RenderImg((RGB*)img_pandus[1], Point(12, 23), 12, 1);
251
 
252
		if (!is[4] || is[7])
253
			renderWater->RenderImg((RGB*)img_pandus[2], Point(0, 23), 12, 1);
254
		else
255
			renderWater->RenderImg((RGB*)img_pandus[1], Point(0, 23), 12, 1);
256
	}
257
}
258
 
5276 ZblCoder 259
RGB* GetImg(Point position, bool din)
260
{
261
	switch (GetField(position, din))
262
	{
5287 ZblCoder 263
	case FIELD_WALL:
5276 ZblCoder 264
		return (RGB*)img_wall;
5296 ZblCoder 265
	case FIELD_WALL_X:
266
		return (RGB*)img_wall_x;
267
	case FIELD_WALL_H:
268
		return (RGB*)img_wall_h;
269
	case FIELD_WALL_V:
270
		return (RGB*)img_wall_v;
5287 ZblCoder 271
	case FIELD_MISSLE_0:
272
		return (RGB*)img_mirror[0];
273
	case FIELD_MISSLE_1:
274
		return (RGB*)img_mirror[1];
275
	case FIELD_MISSLE_2:
276
		return (RGB*)img_mirror[2];
277
	case FIELD_MISSLE_3:
278
		return (RGB*)img_mirror[3];
5296 ZblCoder 279
	case FIELD_BOX_MISSLE_0:
280
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
281
		objMiniMirror->Draw(Point(0, 0), 0, 0);
282
		return renderBox->buffer;
283
	case FIELD_BOX_MISSLE_1:
284
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
285
		objMiniMirror->Draw(Point(0, 0), 0, 1);
286
		return renderBox->buffer;
287
	case FIELD_BOX_MISSLE_2:
288
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
289
		objMiniMirror->Draw(Point(0, 0), 0, 2);
290
		return renderBox->buffer;
291
	case FIELD_BOX_MISSLE_3:
292
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
293
		objMiniMirror->Draw(Point(0, 0), 0, 3);
294
		return renderBox->buffer;
5287 ZblCoder 295
	case FIELD_GUN_0:
296
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
297
		objGun->Draw(Point(0, 0), 0);
298
		return renderBox->buffer;
299
	case FIELD_GUN_1:
300
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
301
		objGun->Draw(Point(0, 0), 90);
302
		return renderBox->buffer;
303
	case FIELD_GUN_2:
304
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
305
		objGun->Draw(Point(0, 0), 180);
306
		return renderBox->buffer;
307
	case FIELD_GUN_3:
308
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
309
		objGun->Draw(Point(0, 0), 270);
310
		return renderBox->buffer;
311
	case FIELD_GROUND:
5276 ZblCoder 312
		return (RGB*)img_ground;
5296 ZblCoder 313
	case FIELD_CRATER:
314
		return (RGB*)img_crater;
5287 ZblCoder 315
	case FIELD_BOX:
316
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
5276 ZblCoder 317
		objBox->Draw(Point(0, 0), 0);
318
		return renderBox->buffer;
5287 ZblCoder 319
	case FIELD_FINISH:
5276 ZblCoder 320
		return (RGB*)img_finish;
5287 ZblCoder 321
	case FIELD_BRICK:
322
		return (RGB*)img_brick[level[position.Y][position.X].l];
323
	case FIELD_BRICK_DES:
5276 ZblCoder 324
		return (RGB*)img_brick1;
5331 ZblCoder 325
	case FIELD_BOX_WATER:
326
	//	return (RGB*)img_waterbox;
327
		renderWater->RenderImg((RGB*)img_waterbox, Point(0, 0), 24, 24);
328
		RenderPandus(position);
329
		return renderWater->buffer;
330
	case FIELD_WATER:
331
		renderWater->RenderImg((RGB*)img_water, Point(0, 0), 24, 24);
332
		RenderPandus(position);
333
		return renderWater->buffer;
334
	//	return (RGB*)img_water;
5276 ZblCoder 335
	}
336
	return NULL;
337
}
338
 
5287 ZblCoder 339
Byte CollField(Point position)
340
{
341
	if (position.X < 0 || position.Y < 0 || position.X > 15 || position.Y > 15)
342
		return 0;
343
 
344
	switch (GetField(position, true))
345
	{
346
	case FIELD_NONE:
347
	case FIELD_WATER:
348
	case FIELD_GROUND:
5296 ZblCoder 349
	case FIELD_CRATER:
5287 ZblCoder 350
	case FIELD_BOX_WATER:
351
	case FIELD_BRICK_DES:
352
	case FIELD_FINISH:
353
		return 1;
354
	case FIELD_GUN_0:
355
		return FIELD_GUN_0;
356
	case FIELD_GUN_1:
357
		return FIELD_GUN_1;
358
	case FIELD_GUN_2:
359
		return FIELD_GUN_2;
360
	case FIELD_GUN_3:
361
		return FIELD_GUN_3;
362
	}
363
	return 0;
364
}
365
 
366
bool ExistGun1(Point position, Point vec, int gun)
367
{
368
	Point pos = position;
369
 
370
	Byte result = 1;
371
	while (result == 1)
372
	{
373
		pos = pos + vec;
374
		result = CollField(pos);
375
	}
376
	if (result == gun)
377
	{
378
		Laser(pos, vec * -1, (RGB)0x00CCFF);
379
		return true;
380
	}
381
	return false;
382
}
383
 
384
void ExistGun(Point position)
385
{
386
	if (ExistGun1(position, Point(1, 0), FIELD_GUN_2))
387
		return;
388
	if (ExistGun1(position, Point(0, 1), FIELD_GUN_3))
389
		return;
390
	if (ExistGun1(position, Point(-1, 0), FIELD_GUN_0))
391
		return;
392
	ExistGun1(position, Point(0, -1), FIELD_GUN_1);
393
}
394
 
5276 ZblCoder 395
void DrawElevent(Point position, bool din)
396
{
397
	kos_PutImage(GetImg(position, din), 24, 24, 24 * position.X, 24 * position.Y);
398
}
399
 
5296 ZblCoder 400
void MoveElement(Point a, Point b, int element)
5276 ZblCoder 401
{
5287 ZblCoder 402
	level[a.Y][a.X].d = FIELD_NONE;
5296 ZblCoder 403
	DrawElevent(a, false);
5287 ZblCoder 404
	if (level[b.Y][b.X].s == FIELD_WATER)
5276 ZblCoder 405
	{
5296 ZblCoder 406
		if (element == FIELD_BOX)
5287 ZblCoder 407
			level[b.Y][b.X].s = FIELD_BOX_WATER;
5276 ZblCoder 408
	}
409
	else
5296 ZblCoder 410
		level[b.Y][b.X].d = element;
411
	DrawElevent(b, true);
5276 ZblCoder 412
}
413
 
5287 ZblCoder 414
void animation(Point vector, float angle, int obj)
5276 ZblCoder 415
{
416
	for (int i = 2; i < 23; ++i)
417
	{
418
		kos_WindowRedrawStatus(1);
5296 ZblCoder 419
 
5276 ZblCoder 420
		DrawElevent(player.position, false);
421
		DrawElevent(player.position + vector, false);
422
 
5296 ZblCoder 423
		renderPlayer->RenderImg(GetImg(player.position, false), vector * -i, 24, 24);
424
		renderPlayer->RenderImg(GetImg(player.position + vector, false), vector * -i + vector * 24, 24, 24);
425
 
5276 ZblCoder 426
		objPlayer->Draw(Point(0, 0), angle);
427
		renderPlayer->Draw(player.position * 24 + vector * i);
5287 ZblCoder 428
		if (level[player.position.Y + vector.Y][player.position.X + vector.X].d == obj)
5276 ZblCoder 429
		{
5296 ZblCoder 430
			//renderBox->RenderImg(GetImg(player.position + vector, true), Point(0, 0), 24, 24);
431
			renderBox->RenderImg(GetImg(player.position + vector, false), vector * -i, 24, 24);
432
			renderBox->RenderImg(GetImg(player.position + vector * 2, false), vector * -i + vector * 24, 24, 24);
5287 ZblCoder 433
			switch (obj)
434
			{
435
			case FIELD_GUN_0:
5296 ZblCoder 436
				objGun->Draw(Point(0, 0), 0);
5287 ZblCoder 437
				break;
438
			case FIELD_GUN_1:
5296 ZblCoder 439
				objGun->Draw(Point(0, 0), 90);
5287 ZblCoder 440
				break;
441
			case FIELD_GUN_2:
5296 ZblCoder 442
				objGun->Draw(Point(0, 0), 180);
5287 ZblCoder 443
				break;
444
			case FIELD_GUN_3:
5296 ZblCoder 445
				objGun->Draw(Point(0, 0), 270);
5287 ZblCoder 446
				break;
5296 ZblCoder 447
			case FIELD_BOX_MISSLE_0:
448
				objMiniMirror->Draw(Point(0, 0), 0, 0);
449
				break;
450
			case FIELD_BOX_MISSLE_1:
451
				objMiniMirror->Draw(Point(0, 0), 0, 1);
452
				break;
453
			case FIELD_BOX_MISSLE_2:
454
				objMiniMirror->Draw(Point(0, 0), 0, 2);
455
				break;
456
			case FIELD_BOX_MISSLE_3:
457
				objMiniMirror->Draw(Point(0, 0), 0, 3);
458
				break;
5287 ZblCoder 459
			case FIELD_BOX:
460
				objBox->Draw(Point(0, 0), 0);
461
			}
5276 ZblCoder 462
			renderBox->Draw((player.position + vector) * 24 + vector * i);
463
		}
464
		kos_WindowRedrawStatus(2);
5287 ZblCoder 465
		pause(1);
5276 ZblCoder 466
	}
467
 
5287 ZblCoder 468
	if (level[player.position.Y + vector.Y][player.position.X + vector.X].d == obj)
5296 ZblCoder 469
		MoveElement(player.position + vector, player.position + vector * 2, GetField(player.position + vector, true));
5276 ZblCoder 470
 
471
	DrawElevent(player.position, true);
472
	DrawElevent(player.position + vector, true);
473
	player.position = player.position + vector;
474
	//kos_PutImage(GetImg(player.position + vector), 24, 24, 24 * player.position.X, 24 * player.position.Y);
475
	renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
476
	objPlayer->Draw(Point(0, 0), angle);
477
	renderPlayer->Draw(player.position * 24);
5287 ZblCoder 478
	ExistGun(player.position);
5276 ZblCoder 479
}
480
 
5287 ZblCoder 481
void DrawLaser(Point position, int frame, RGB color)
5276 ZblCoder 482
{
5296 ZblCoder 483
	renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
484
	Byte code = GetField(position, true);
485
	if (code == FIELD_BOX_MISSLE_0 || code == FIELD_BOX_MISSLE_1 || code == FIELD_BOX_MISSLE_2 || code == FIELD_BOX_MISSLE_3)
486
		objMiniMirror->Draw(Point(0, 0), 0, code - FIELD_BOX_MISSLE_0);
5276 ZblCoder 487
	switch (frame)
488
	{
489
	case 1:
5287 ZblCoder 490
		objLaser->Draw(Point(0, 0), 0, color);
491
		break;
5276 ZblCoder 492
	case 2:
5287 ZblCoder 493
		objLaser->Draw(Point(0, 0), 90, color);
5276 ZblCoder 494
		break;
495
	case 3:
5287 ZblCoder 496
		objLaser2->Draw(Point(0, 0), 0, color);
5276 ZblCoder 497
		break;
498
	default:
5296 ZblCoder 499
		objLaser1->Draw(Point(0, 0), (float)frame, color);
5276 ZblCoder 500
	}
5296 ZblCoder 501
	renderBox->Draw(position * 24);
5276 ZblCoder 502
	level[position.Y][position.X].l = 1;
503
}
504
 
5296 ZblCoder 505
bool LaserMoveElement(Point position, Point vector, int code, RGB color)
506
{
507
	if (position + vector != player.position)
508
	{
509
		switch (GetField(position + vector, true))
510
		{
511
		case FIELD_GROUND:
512
		case FIELD_CRATER:
513
		case FIELD_WATER:
514
		case FIELD_BRICK_DES:
515
		case FIELD_BOX_WATER:
516
			for (int i = 2; i < 23; ++i)
517
			{
518
				renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
519
				if (vector.X != 0)
520
					objLaser->Draw((vector.X > 0) ? Point(i - 24, 0) : Point(24 - i, 0), 0, color);
521
				else
522
					objLaser->Draw((vector.Y > 0) ? Point(0, i - 24) : Point(0, 24 - i), 90, color);
523
				renderBox->Draw(position * 24);
524
 
525
				DrawElevent(position + vector, false);
526
 
527
				renderBox->RenderImg(GetImg(position, false), vector * -i, 24, 24);
528
				renderBox->RenderImg(GetImg(position + vector, false), vector * -i + vector * 24, 24, 24);
529
 
530
				switch (code)
531
				{
532
				case FIELD_GUN_0:
533
					objGun->Draw(Point(0, 0), 0);
534
					break;
535
				case FIELD_GUN_1:
536
					objGun->Draw(Point(0, 0), 90);
537
					break;
538
				case FIELD_GUN_2:
539
					objGun->Draw(Point(0, 0), 180);
540
					break;
541
				case FIELD_GUN_3:
542
					objGun->Draw(Point(0, 0), 270);
543
					break;
544
				case FIELD_BOX_MISSLE_0:
545
					objMiniMirror->Draw(Point(0, 0), 0, 0);
546
					break;
547
				case FIELD_BOX_MISSLE_1:
548
					objMiniMirror->Draw(Point(0, 0), 0, 1);
549
					break;
550
				case FIELD_BOX_MISSLE_2:
551
					objMiniMirror->Draw(Point(0, 0), 0, 2);
552
					break;
553
				case FIELD_BOX_MISSLE_3:
554
					objMiniMirror->Draw(Point(0, 0), 0, 3);
555
					break;
556
				case FIELD_BOX:
557
					objBox->Draw(Point(0, 0), 0);
558
				}
559
				renderBox->Draw((position)* 24 + vector * i);
560
				kos_Pause(1);
561
			}
562
			MoveElement(position, position + vector, code);
563
			return true;
564
		}
565
	}
566
	return false;
567
}
568
 
5287 ZblCoder 569
void Laser(Point pos, Point vec, RGB color)
5276 ZblCoder 570
{
5287 ZblCoder 571
	Point vector = vec;
572
	Point position = pos + vector;
5276 ZblCoder 573
	bool en = true;
5287 ZblCoder 574
	Byte code;
575
	bool LaserGun = false;
576
 
5276 ZblCoder 577
	while (en)
578
	{
5287 ZblCoder 579
		code = GetField(position, true);
580
		switch (code)
5276 ZblCoder 581
		{
5287 ZblCoder 582
		case FIELD_BOX:
583
		case FIELD_GUN_0:
584
		case FIELD_GUN_1:
585
		case FIELD_GUN_2:
586
		case FIELD_GUN_3:
587
			if (code == FIELD_GUN_0 && vector == Point(-1, 0) || code == FIELD_GUN_1 && vector == Point(0, -1)
588
				|| code == FIELD_GUN_2 && vector == Point(1, 0) || code == FIELD_GUN_3 && vector == Point(0, 1))
589
			{
590
				for (int i = 2; i < 23; ++i)
591
					kos_Pause(1);
592
				for (int y = 0; y < 16; y++)
593
					for (int x = 0; x < 16; x++)
594
						if (level[y][x].l == 1)
595
						{
596
							DrawElevent(Point(x, y), true);
597
							level[y][x].l = 0;
598
						}
599
				for (int i = 0; i < 14; ++i)
600
				{
5296 ZblCoder 601
					renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
5287 ZblCoder 602
					objExplosion->Draw(Point(0, 0), 0, i);
5296 ZblCoder 603
					renderBox->Draw((position)* 24);
5287 ZblCoder 604
					pause(2);
605
				}
606
				level[position.Y][position.X].d = FIELD_NONE;
5296 ZblCoder 607
				if (level[position.Y][position.X].s == FIELD_GROUND)
608
					level[position.Y][position.X].s = FIELD_CRATER;
5287 ZblCoder 609
				draw_window();
610
				return;
611
			}
612
			else
5296 ZblCoder 613
			{
614
				if (!LaserMoveElement(position, vector, code, color))
5276 ZblCoder 615
				{
616
					for (int i = 2; i < 23; ++i)
5296 ZblCoder 617
						pause(1);
618
				}
619
				else
5287 ZblCoder 620
					LaserGun = true;
621
			}
5276 ZblCoder 622
			en = false;
623
			break;
5287 ZblCoder 624
		case FIELD_BRICK:
625
			for (int i = 0; i < 6; ++i)
5276 ZblCoder 626
			{
5287 ZblCoder 627
				level[position.Y][position.X].l += 1;
628
				if (level[position.Y][position.X].l == 11)
5276 ZblCoder 629
				{
5287 ZblCoder 630
					level[position.Y][position.X].s = FIELD_BRICK_DES;
631
					level[position.Y][position.X].l = 0;
632
					LaserGun = true;
5276 ZblCoder 633
				}
5287 ZblCoder 634
				DrawElevent(position, false);
635
				pause(5);
5276 ZblCoder 636
			}
637
			en = false;
638
			break;
5296 ZblCoder 639
		case FIELD_WALL_X:
640
			break;
641
		case FIELD_WALL_H:
642
			if (vector.X == 0)
643
			{
644
				for (int i = 2; i < 23; ++i)
645
					pause(1);
646
				en = false;
647
			}
648
			break;
649
		case FIELD_WALL_V:
650
			if (vector.Y == 0)
651
			{
652
				for (int i = 2; i < 23; ++i)
653
					pause(1);
654
				en = false;
655
			}
656
			break;
5287 ZblCoder 657
		case FIELD_GROUND:
5296 ZblCoder 658
		case FIELD_CRATER:
5287 ZblCoder 659
		case FIELD_WATER:
660
		case FIELD_FINISH:
661
		case FIELD_BRICK_DES:
662
		case FIELD_BOX_WATER:
5276 ZblCoder 663
			if (player.position == position)
664
			{
665
				for (int i = 2; i < 23; ++i)
666
					kos_Pause(1);
667
				for (int y = 0; y < 16; y++)
668
					for (int x = 0; x < 16; x++)
669
						if (level[y][x].l == 1)
670
						{
671
							DrawElevent(Point(x, y), true);
672
							level[y][x].l = 0;
673
						}
674
				for (int i = 0; i < 14; ++i)
675
				{
5296 ZblCoder 676
					renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
5276 ZblCoder 677
					objExplosion->Draw(Point(0, 0), 0, i);
5296 ZblCoder 678
					renderBox->Draw((position)* 24);
5287 ZblCoder 679
					pause(2);
5276 ZblCoder 680
				}
5296 ZblCoder 681
				level[player.position.Y][player.position.X].s = FIELD_CRATER;
5276 ZblCoder 682
				gameStatus = GAME_DEFEAT;
5297 ZblCoder 683
				SetMode(MODE_PAUSE);
5276 ZblCoder 684
				return;
685
			}
686
			else
687
			{
688
				if (level[position.Y][position.X].l == 1)
5287 ZblCoder 689
					DrawLaser(position, 3, color);
5276 ZblCoder 690
				else
5287 ZblCoder 691
					DrawLaser(position, (vector.X != 0) ? 1 : 2, color);
5276 ZblCoder 692
			}
693
			break;
5296 ZblCoder 694
		case FIELD_BOX_MISSLE_0:
5276 ZblCoder 695
			if (vector == Point(-1, 0) || vector == Point(0, -1))
696
			{
697
				vector = (vector.Y == -1) ? Point(1, 0) : Point(0, 1);
5287 ZblCoder 698
				DrawLaser(position, 0, color);
5276 ZblCoder 699
			}
700
			else
701
			{
5296 ZblCoder 702
				if (!LaserMoveElement(position, vector, code, color))
703
				{
704
					for (int i = 2; i < 23; ++i)
705
						pause(1);
706
				}
707
				else
708
					LaserGun = true;
5276 ZblCoder 709
				en = false;
710
			}
711
			break;
5296 ZblCoder 712
		case FIELD_BOX_MISSLE_1:
5276 ZblCoder 713
			if (vector == Point(0, -1) || vector == Point(1, 0))
714
			{
715
				vector = (vector.Y == -1) ? Point(-1, 0) : Point(0, 1);
5287 ZblCoder 716
				DrawLaser(position, 90, color);
5276 ZblCoder 717
			}
718
			else
719
			{
5296 ZblCoder 720
				if (!LaserMoveElement(position, vector, code, color))
721
				{
722
					for (int i = 2; i < 23; ++i)
723
						pause(1);
724
				}
725
				else
726
					LaserGun = true;
5276 ZblCoder 727
				en = false;
728
			}
729
			break;
5296 ZblCoder 730
		case FIELD_BOX_MISSLE_2:
731
			if (vector == Point(1, 0) || vector == Point(0, 1))
732
			{
733
				vector = (vector.Y == 1) ? Point(-1, 0) : Point(0, -1);
734
				DrawLaser(position, 180, color);
735
			}
736
			else
737
			{
738
				if (!LaserMoveElement(position, vector, code, color))
739
				{
740
					for (int i = 2; i < 23; ++i)
741
						pause(1);
742
				}
743
				else
744
					LaserGun = true;
745
				en = false;
746
			}
747
			break;
748
		case FIELD_BOX_MISSLE_3:
5276 ZblCoder 749
			if (vector == Point(-1, 0) || vector == Point(0, 1))
750
			{
751
				vector = (vector.Y == 1) ? Point(1, 0) : Point(0, -1);
5287 ZblCoder 752
				DrawLaser(position, 270, color);
5276 ZblCoder 753
			}
754
			else
755
			{
5296 ZblCoder 756
				if (!LaserMoveElement(position, vector, code, color))
757
				{
758
					for (int i = 2; i < 23; ++i)
759
						pause(1);
760
				}
761
				else
762
					LaserGun = true;
763
				en = false;
764
			}
765
			break;
766
		case FIELD_MISSLE_0:
767
			if (vector == Point(-1, 0) || vector == Point(0, -1))
768
			{
769
				vector = (vector.Y == -1) ? Point(1, 0) : Point(0, 1);
770
				DrawLaser(position, 0, color);
771
			}
772
			else
773
			{
5276 ZblCoder 774
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 775
					pause(1);
5276 ZblCoder 776
				en = false;
777
			}
778
			break;
5296 ZblCoder 779
		case FIELD_MISSLE_1:
780
			if (vector == Point(0, -1) || vector == Point(1, 0))
781
			{
782
				vector = (vector.Y == -1) ? Point(-1, 0) : Point(0, 1);
783
				DrawLaser(position, 90, color);
784
			}
785
			else
786
			{
787
				for (int i = 2; i < 23; ++i)
788
					pause(1);
789
				en = false;
790
			}
791
			break;
5287 ZblCoder 792
		case FIELD_MISSLE_2:
5276 ZblCoder 793
			if (vector == Point(1, 0) || vector == Point(0, 1))
794
			{
795
				vector = (vector.Y == 1) ? Point(-1, 0) : Point(0, -1);
5287 ZblCoder 796
				DrawLaser(position, 180, color);
5276 ZblCoder 797
			}
798
			else
799
			{
800
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 801
					pause(1);
5276 ZblCoder 802
				en = false;
803
			}
804
			break;
5296 ZblCoder 805
		case FIELD_MISSLE_3:
806
			if (vector == Point(-1, 0) || vector == Point(0, 1))
807
			{
808
				vector = (vector.Y == 1) ? Point(1, 0) : Point(0, -1);
809
				DrawLaser(position, 270, color);
810
			}
811
			else
812
			{
813
				for (int i = 2; i < 23; ++i)
814
					pause(1);
815
				en = false;
816
			}
817
			break;
5276 ZblCoder 818
		default:
819
			for (int i = 2; i < 23; ++i)
5287 ZblCoder 820
				pause(1);
5276 ZblCoder 821
			en = false;
822
		}
823
		position = position + vector;
824
	}
825
 
826
	for (int y = 0; y < 16; y++)
827
		for (int x = 0; x < 16; x++)
828
			if (level[y][x].l == 1)
829
			{
830
				DrawElevent(Point(x, y), true);
831
				level[y][x].l = 0;
832
			}
833
 
5287 ZblCoder 834
	if (LaserGun)
835
		ExistGun(player.position);
5276 ZblCoder 836
}
837
 
838
void player_move(Point vector, float angle)
839
{
840
	if (player.vector == vector)
841
	{
5287 ZblCoder 842
		Byte code = GetField(player.position + vector, true);
843
		switch (code)
5276 ZblCoder 844
		{
5296 ZblCoder 845
		case FIELD_BOX_MISSLE_0:
846
		case FIELD_BOX_MISSLE_1:
847
		case FIELD_BOX_MISSLE_2:
848
		case FIELD_BOX_MISSLE_3:
849
			switch (GetField(player.position + vector * 2, true))
850
			{
851
			case FIELD_GROUND:
852
			case FIELD_CRATER:
853
			case FIELD_WATER:
854
			case FIELD_BOX_WATER:
855
			case FIELD_BRICK_DES:
856
				if (code == FIELD_BOX_MISSLE_0 && (vector == Point(1, 0) || vector == Point(0, 1))
857
					|| code == FIELD_BOX_MISSLE_1 && (vector == Point(-1, 0) || vector == Point(0, 1))
858
					|| code == FIELD_BOX_MISSLE_2 && (vector == Point(-1, 0) || vector == Point(0, -1))
859
					|| code == FIELD_BOX_MISSLE_3 && (vector == Point(1, 0) || vector == Point(0, -1))
860
					)
861
					animation(vector, angle, code);
862
				return;
863
			}
864
			break;
5287 ZblCoder 865
		case FIELD_GUN_0:
866
		case FIELD_GUN_1:
867
		case FIELD_GUN_2:
868
		case FIELD_GUN_3:
5296 ZblCoder 869
		case FIELD_BOX:
5276 ZblCoder 870
			switch (GetField(player.position + vector * 2, true))
871
			{
5287 ZblCoder 872
			case FIELD_GROUND:
5296 ZblCoder 873
			case FIELD_CRATER:
5287 ZblCoder 874
			case FIELD_WATER:
875
			case FIELD_BOX_WATER:
876
			case FIELD_BRICK_DES:
877
				animation(vector, angle, code);
5276 ZblCoder 878
				return;
879
			}
880
			break;
5287 ZblCoder 881
		case FIELD_FINISH:
5276 ZblCoder 882
			gameStatus = GAME_VICTORY;
5297 ZblCoder 883
			SetMode(MODE_PAUSE);
5276 ZblCoder 884
			draw_window();
885
			break;
5287 ZblCoder 886
		case FIELD_NONE:
887
		case FIELD_BRICK:
888
		case FIELD_WALL:
5296 ZblCoder 889
		case FIELD_WALL_H:
890
		case FIELD_WALL_V:
891
		case FIELD_WALL_X:
5287 ZblCoder 892
		case FIELD_WATER:
893
		case FIELD_MISSLE_0:
894
		case FIELD_MISSLE_1:
895
		case FIELD_MISSLE_2:
896
		case FIELD_MISSLE_3:
5276 ZblCoder 897
			break;
898
		default:
5287 ZblCoder 899
			animation(vector, angle, -1);
5276 ZblCoder 900
		}
901
	}
902
	else
903
	{
904
		int cnt;
905
		float addAngle;
906
		if (player.vector == vector * -1)
907
		{
908
			cnt = 48;
909
			addAngle = 3.5f;
910
		}
911
		else
912
		{
913
			cnt = 24;
914
			if (player.angle == 270 && angle == 0 || player.angle == 0 && angle == 270)
915
				addAngle = (player.angle == 0) ? -3.5f : 3.5f;
916
			else
917
				addAngle = (angle < player.angle) ? -3.5f : 3.5f;
918
		}
919
 
920
		for (int i = 1; i < cnt - 1; ++i)
921
		{
922
			player.angle += addAngle;
923
			renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
924
			objPlayer->Draw(Point(0, 0), player.angle);
925
			renderPlayer->Draw(player.position * 24);
5287 ZblCoder 926
			pause(1);
5276 ZblCoder 927
		}
928
 
929
		player.vector = vector;
930
		player.angle = angle;
931
 
932
		renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
933
		objPlayer->Draw(Point(0, 0), player.angle);
934
		renderPlayer->Draw(player.position * 24);
935
	}
936
}
937
 
938
void key_press(int key)
939
{
5474 ZblCoder 940
	sProcessInfo sPI;
941
	kos_ProcessInfo(&sPI);
942
	if (sPI.rawData[70] & 0x04)
943
		return;
5276 ZblCoder 944
	//rtlDebugOutString(ftoa(key));
5474 ZblCoder 945
 
5276 ZblCoder 946
	switch (gameMode)
947
	{
948
	case MODE_MENU:
5338 ZblCoder 949
		if (key == 27)
5296 ZblCoder 950
			kos_ExitApp();
5338 ZblCoder 951
 
952
		if (key == 13 || key == 32)
953
			SetMode(MODE_LEVELS);
5276 ZblCoder 954
		break;
955
	case MODE_LEVELS:
5338 ZblCoder 956
		if (key == 27)
5296 ZblCoder 957
			SetMode(MODE_MENU);
5338 ZblCoder 958
 
959
		if (levelPage > 0 && key == 183)
960
		{
961
			levelIndex -= 30;
962
			draw_window();
963
		}
964
		else
965
			if (levelPage < (int)(levelCount / 30) && key == 184)
966
			{
967
				levelIndex += 30;
968
				if (levelIndex >= levelCount)
969
					levelIndex = levelCount - 1;
970
				draw_window();
971
			}
972
 
973
	// 179, 100   D Right
974
		if ((key == 179 || key == 100) && (levelIndex + 1) < levelCount)
975
		{
976
			levelIndex++;
977
			draw_window();
978
		}
979
	// 176, 97    A  Left
980
		if ((key == 176 || key == 97) && levelIndex > 0)
981
		{
982
			levelIndex--;
983
			draw_window();
984
		}
985
	// 119, 178: W Up
986
		if ((key == 119 || key == 178) && (levelIndex - 6) >= 0)
987
		{
988
			levelIndex -= 6;
989
			draw_window();
990
		}
991
	// 177, 115    S Down
992
		if ((key == 177 || key == 115) && (levelIndex + 6) < levelCount)
993
		{
994
			levelIndex += 6;
995
			draw_window();
996
		}
997
 
998
		if (key == 13 || key == 32)
999
		{
1000
			openLevel(levelIndex);
1001
			SetMode(MODE_GAME);
1002
		}
1003
 
5276 ZblCoder 1004
		break;
5338 ZblCoder 1005
	case MODE_PAUSE:
1006
		if (key == 27)
1007
			SetMode(MODE_LEVELS);
5474 ZblCoder 1008
		else
1009
			if ((key == 32 || key == 13) && (gameStatus == GAME_NONE || (gameStatus == GAME_VICTORY && levelIndex < (levelCount - 1))))
1010
			{
1011
				if (gameStatus == GAME_VICTORY)
1012
					openLevel(levelIndex + 1);
1013
				SetMode(MODE_GAME);
1014
			}
1015
			else
1016
				if (key == 114)
1017
				{
1018
					openLevel(levelIndex);
1019
					SetMode(MODE_GAME);
1020
				}
5338 ZblCoder 1021
		break;
5276 ZblCoder 1022
	case MODE_GAME:
1023
		switch (key)
1024
		{
1025
		case 119: // Up
1026
		case 178: // W
1027
			if (gameStatus == GAME_NONE)
1028
				player_move(Point(0, -1), 270);
1029
			break;
1030
		case 177: // Down
1031
		case 115: // S
1032
			if (gameStatus == GAME_NONE)
1033
				player_move(Point(0, 1), 90);
1034
			break;
1035
		case 176: // Left
1036
		case 97:  // A
1037
			if (gameStatus == GAME_NONE)
1038
				player_move(Point(-1, 0), 180);
1039
			break;
1040
		case 179: // Right
1041
		case 100: // D
1042
			if (gameStatus == GAME_NONE)
1043
				player_move(Point(1, 0), 0);
1044
			break;
1045
		case 32: // Space
1046
			if (gameStatus == GAME_NONE)
5287 ZblCoder 1047
				Laser(player.position, player.vector, (RGB)0x00FF00);
5276 ZblCoder 1048
			break;
1049
		case 13:
5331 ZblCoder 1050
			//rtlDebugOutString(ftoa(rtlRand()));
5296 ZblCoder 1051
 
5287 ZblCoder 1052
		//	openLevel(levelIndex + 1);
5276 ZblCoder 1053
			if (gameStatus == GAME_VICTORY)
1054
				openLevel(levelIndex + 1);
1055
			else
1056
				if (gameStatus == GAME_DEFEAT)
1057
					openLevel(levelIndex);
5296 ZblCoder 1058
 
5276 ZblCoder 1059
			break;
5296 ZblCoder 1060
		case 27:
5297 ZblCoder 1061
			SetMode(MODE_PAUSE);
5276 ZblCoder 1062
		}
1063
		break;
1064
	}
1065
}
1066
 
1067
void MousePress(int button, Point position)
1068
{
1069
	//rtlDebugOutString("Mouse");
1070
	//rtlDebugOutString(ftoa(position.X));
1071
	//rtlDebugOutString(ftoa(position.Y));
5296 ZblCoder 1072
	Point level_pos = Point(0, 0);
5276 ZblCoder 1073
	switch (gameMode)
1074
	{
1075
	case MODE_MENU:
1076
		if (CollRecrVsPoint(position, ToGame.rect))
5296 ZblCoder 1077
			SetMode(MODE_LEVELS);
5276 ZblCoder 1078
		if (CollRecrVsPoint(position, ToExit.rect))
1079
			kos_ExitApp();
1080
		break;
1081
	case MODE_LEVELS:
5296 ZblCoder 1082
		if (CollRecrVsPoint(position, ToExit.rect))
1083
			SetMode(MODE_MENU);
1084
		else
1085
		if (levelPage > 0 && CollRecrVsPoint(position, Rect(9, 318, 57, 57)))
1086
		{
5338 ZblCoder 1087
			levelIndex -= 30;
5296 ZblCoder 1088
			draw_window();
1089
		}
1090
		else
5338 ZblCoder 1091
			if (levelPage < (int)(levelCount / 30) && CollRecrVsPoint(position, Rect(70, 318, 57, 57)))
5296 ZblCoder 1092
		{
5338 ZblCoder 1093
			levelIndex += 30;
1094
			if (levelIndex >= levelCount)
1095
				levelIndex = levelCount - 1;
5296 ZblCoder 1096
			draw_window();
1097
		}
1098
		else
1099
		{
5338 ZblCoder 1100
			levelPage = (int)(levelIndex / 30);
5296 ZblCoder 1101
			for (int i = levelPage * 30; i < min(levelCount, (levelPage + 1) * 30); i++)
1102
			{
5276 ZblCoder 1103
 
5296 ZblCoder 1104
				if (i % 6 == 0 && i != levelPage * 30)
1105
				{
1106
					level_pos.X = 0;
1107
					level_pos.Y++;
1108
				}
1109
				if (CollRecrVsPoint(position, Rect(11 + level_pos.X * 62, 11 + 61 * level_pos.Y, 51, 50)))
1110
				{
1111
					openLevel(i);
1112
					//rtlDebugOutString(ftoa(i));
1113
					SetMode(MODE_GAME);
1114
					return;
1115
				}
1116
				level_pos.X++;
1117
			}
1118
		}
5276 ZblCoder 1119
		break;
5297 ZblCoder 1120
	case MODE_PAUSE:
1121
		if (CollRecrVsPoint(position, Rect(77, 318, 229, 57)))
1122
			SetMode(MODE_LEVELS);
1123
		else
1124
			if (CollRecrVsPoint(position, Rect(77, 255, 229, 57)))
1125
			{
1126
				openLevel(levelIndex);
1127
				SetMode(MODE_GAME);
1128
			}
1129
			else
5338 ZblCoder 1130
				if (CollRecrVsPoint(position, Rect(77, 192, 229, 57)) && (gameStatus == GAME_NONE || (gameStatus == GAME_VICTORY && levelIndex < (levelCount - 1))))
5297 ZblCoder 1131
				{
1132
					if (gameStatus == GAME_VICTORY)
1133
						openLevel(levelIndex + 1);
1134
					SetMode(MODE_GAME);
1135
				}
5276 ZblCoder 1136
	case MODE_GAME:
1137
 
1138
		break;
1139
	}
1140
}
1141
 
5296 ZblCoder 1142
void draw_level_number(Point position, int number, RGB color) // 0x252317
1143
{
1144
	if (number > 99)
1145
	{
1146
		objnumbers->Draw(position + Point(4, 12), 0, (int)(number / 100), color);
1147
		objnumbers->Draw(position + Point(18, 12), 0, (int)((number % 100) / 10), color);
1148
		objnumbers->Draw(position + Point(32, 12), 0, (int)(number % 10), color);
1149
	}
1150
	else
1151
		if (number > 9)
1152
		{
1153
			objnumbers->Draw(position + Point(11, 12), 0, (int)((number % 100) / 10), color);
1154
			objnumbers->Draw(position + Point(25, 12), 0, (int)(number % 10), color);
1155
		}
1156
		else
1157
			if (number < 10)
1158
				objnumbers->Draw(position + Point(18, 12), 0, number, color);
1159
}
1160
 
5276 ZblCoder 1161
void draw_window(void)
1162
{
5474 ZblCoder 1163
	if (w_redraw)
1164
	{
1165
		kos_WindowRedrawStatus(1);
1166
 
1167
		//kos_DefineAndDrawWindow(50, 50, 640, 506 - 22 + kos_GetSkinHeight(), 0x74, 0xEEEEEE, 0, 0, (Dword)windowTitle);
1168
 
1169
		kos_DefineAndDrawWindow(10, 40, 384 + 9, 384 + 25, 0x74, 0x444444, 0, 0, (Dword)header);
1170
		kos_WindowRedrawStatus(2);
1171
		w_redraw = false;
1172
	}
1173
 
5296 ZblCoder 1174
	Point level_pos = Point(0, 0);
5276 ZblCoder 1175
	switch (gameMode)
1176
	{
1177
	case MODE_MENU:
1178
		kos_PutImage((RGB*)img_menu, 384, 384, 0, 0);
1179
 
1180
	//	kos_PutImage((RGB*)img_button, 150, 50, ToGame.rect.X, ToGame.rect.Y);
1181
 
1182
 
1183
		break;
1184
	case MODE_LEVELS:
5296 ZblCoder 1185
		renderLevels->RenderImg(img_levels, Point(0, 0), 384, 384);
5338 ZblCoder 1186
 
1187
		levelPage = (int)(levelIndex / 30);
5296 ZblCoder 1188
		for (int i = levelPage * 30; i < min(levelCount, (levelPage + 1) * 30); i++)
1189
		{
1190
			if (i % 6 == 0 && i != levelPage * 30)
1191
			{
1192
				level_pos.X = 0;
1193
				level_pos.Y++;
1194
			}
5338 ZblCoder 1195
			if (levelIndex != i)
1196
			{
1197
				objnumber_box->Draw(Point(11 + level_pos.X * 62, 11 + 61 * level_pos.Y), 0);
1198
				draw_level_number(Point(11 + level_pos.X * 62, 11 + 61 * level_pos.Y), i + 1, (RGB)0x252317);
1199
			}
1200
			else
1201
			{
1202
				objnumber_box->Draw(Point(11 + level_pos.X * 62, 11 + 61 * level_pos.Y), 0, (RGB)0xAA0000);
1203
				draw_level_number(Point(11 + level_pos.X * 62, 11 + 61 * level_pos.Y), i + 1, (RGB)0xAA0000);
1204
			}
5276 ZblCoder 1205
 
5296 ZblCoder 1206
			level_pos.X++;
1207
		}
1208
 
1209
		if (levelPage > 0)
1210
		{
1211
			objbutton1->Draw(Point(9, 318), 0);
1212
			objbutton_arrow->Draw(Point(24, 338), 0);
1213
		}
1214
 
1215
		if (levelPage < (int)(levelCount / 30))
1216
		{
1217
			objbutton1->Draw(Point(70, 318), 0);
1218
			objbutton_arrow->Draw(Point(89, 339), 180);
1219
		}
1220
 
1221
		renderLevels->Draw(Point(0, 0));
5297 ZblCoder 1222
		//kos_PutImage((RGB*)img_ground, 24, 24, 100, 100);
1223
		break;
1224
	case MODE_PAUSE:
1225
			for (int y = 0; y < 4; y++)
1226
				for (int x = 0; x < 4; x++)
1227
					renderLevels->RenderImg((RGB*)img_gamebg, Point(96 * x, 96 * y), 96, 96);
5296 ZblCoder 1228
 
5297 ZblCoder 1229
			for (int y = 0; y < 16; y++)
1230
				for (int x = 0; x < 16; x++)
1231
					if (level[y][x].s != FIELD_NONE)
1232
						renderLevels->RenderImg(GetImg(Point(x, y), true), Point(24 * x, 24 * y), 24, 24);
1233
 
1234
			switch (gameStatus)
1235
			{
1236
			case GAME_NONE:
1237
				objPlayer1->Draw(player.position * 24, player.angle);
1238
				break;
1239
			case GAME_VICTORY:
1240
				kos_WriteTextToWindow(30, 10, 0x80, 0xFFFFFF, "VICTORY", 0);
1241
				break;
1242
			case GAME_DEFEAT:
1243
				kos_WriteTextToWindow(30, 10, 0x80, 0xFFFFFF, "DEFEAT", 0);
1244
				break;
1245
			}
1246
 
1247
			for (int y = 0; y < 16; y++)
1248
				for (int x = 0; x < 16; x++)
1249
					objblack->Draw(Point(24 * x, 24 * y), 0);
1250
 
5338 ZblCoder 1251
			if (gameStatus == GAME_NONE || (gameStatus == GAME_VICTORY && levelIndex < (levelCount - 1)))
5297 ZblCoder 1252
				renderLevels->RenderImg((RGB*)img_buttons[1], Point(77, 192), 229, 57);
1253
			renderLevels->RenderImg((RGB*)img_buttons[2], Point(77, 255), 229, 57);
1254
			renderLevels->RenderImg((RGB*)img_buttons[0], Point(77, 318), 229, 57);
1255
 
1256
			renderLevels->Draw(Point(0, 0));
5276 ZblCoder 1257
		break;
1258
	case MODE_GAME:
5296 ZblCoder 1259
		for (int y = 0; y < 4; y++)
1260
			for (int x = 0; x < 4; x++)
1261
				kos_PutImage((RGB*)img_gamebg, 96, 96, 96 * x, 96 * y);
1262
 
5276 ZblCoder 1263
		for (int y = 0; y < 16; y++)
1264
			for (int x = 0; x < 16; x++)
5287 ZblCoder 1265
				if (level[y][x].s != FIELD_NONE)
5297 ZblCoder 1266
					kos_PutImage(GetImg(Point(x, y), true), 24, 24, 24 * x, 24 * y);
5276 ZblCoder 1267
 
5297 ZblCoder 1268
		if(gameStatus != GAME_DEFEAT)
5276 ZblCoder 1269
		{
1270
			renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
1271
			objPlayer->Draw(Point(0, 0), player.angle);
1272
			renderPlayer->Draw(player.position * 24);
1273
		}
1274
	break;
1275
	}
1276
}
1277
 
1278
void LevelsLoad()
1279
{
1280
	char *cPtr;
1281
	cPtr = strrchr(kosExePath, '/');
1282
 
1283
	if (cPtr == NULL)
1284
	{
1285
		rtlDebugOutString("Invalid path to executable.");
1286
		return;
1287
	}
1288
	cPtr[1] = 0;
5296 ZblCoder 1289
	strcpy(cPtr + 1, "data.lvl");
5276 ZblCoder 1290
 
1291
	CKosFile *file = new CKosFile(kosExePath);
1292
 
1293
	Byte block[256];
1294
	while (file->Read(block, 256) == 256)
1295
	{
1296
		levelCount++;
1297
	}
1298
	//levelCount++;
5331 ZblCoder 1299
	//rtlDebugOutString(ftoa(levelCount));
5276 ZblCoder 1300
 
1301
	levels = new Level[levelCount];
1302
 
1303
	file->Seek(0, SEEK_SET);
1304
	for (int i = 0; i < levelCount; ++i)
1305
	{
1306
		file->Read(block, 256);
1307
		int k = 0;
1308
 
1309
		for (int y = 0; y < 16; y++)
1310
			for (int x = 0; x < 16; x++)
1311
			{
5287 ZblCoder 1312
				levels[i].fileds[y][x] = block[k];
5276 ZblCoder 1313
				k++;
1314
			}
1315
	}
1316
}
1317
 
1318
void openLevel(int index)
1319
{
1320
	levelIndex = index;
1321
	for (int y = 0; y < 16; y++)
1322
		for (int x = 0; x < 16; x++)
1323
		{
1324
			level[y][x].s = levels[index].fileds[y][x];
5287 ZblCoder 1325
			level[y][x].d = FIELD_NONE;
5276 ZblCoder 1326
			level[y][x].l = 0;
1327
			switch (levels[index].fileds[y][x])
1328
			{
5287 ZblCoder 1329
			case FIELD_BOX:
1330
			case FIELD_GUN_0:
1331
			case FIELD_GUN_1:
1332
			case FIELD_GUN_2:
1333
			case FIELD_GUN_3:
5296 ZblCoder 1334
			case FIELD_BOX_MISSLE_0:
1335
			case FIELD_BOX_MISSLE_1:
1336
			case FIELD_BOX_MISSLE_2:
1337
			case FIELD_BOX_MISSLE_3:
5287 ZblCoder 1338
				level[y][x].s = FIELD_GROUND;
1339
				level[y][x].d = levels[index].fileds[y][x];
5276 ZblCoder 1340
				break;
5287 ZblCoder 1341
			case FIELD_HERO:
5276 ZblCoder 1342
				player = Player(Point(x, y));
5287 ZblCoder 1343
				level[y][x].s = FIELD_GROUND;
5276 ZblCoder 1344
				break;
5287 ZblCoder 1345
			case FIELD_BRICK:
1346
				level[y][x].l = 0;
5276 ZblCoder 1347
				break;
1348
			}
1349
		}
1350
	gameStatus = GAME_NONE;
1351
	draw_window();
1352
}
1353
 
1354
void kos_Main()
1355
{
5338 ZblCoder 1356
	//rtlDebugOutString(" ");
1357
	//rtlDebugOutString("kos_Main");
5276 ZblCoder 1358
	char *cPtr;
1359
	cPtr = strrchr(kosExePath, '/');
1360
	// проверка ;)
1361
	if (cPtr == NULL)
1362
	{
1363
		rtlDebugOutString("Invalid path to executable.");
1364
		return;
1365
	}
1366
	cPtr[1] = 0;
5296 ZblCoder 1367
	strcpy(cPtr + 1, "data01.pak");
5276 ZblCoder 1368
 
1369
	CKosFile *file = new CKosFile(kosExePath);
1370
 
1371
	file->LoadTex((Byte*)img_box, 4, 24, 24);
5287 ZblCoder 1372
	for (int i = 0; i < 11; ++i)
1373
		file->LoadTex((Byte*)img_brick[i], 3, 24, 24);
1374
	file->LoadTex((Byte*)img_brick1, 3, 24, 24);
5276 ZblCoder 1375
	file->LoadTex((Byte*)img_finish, 3, 24, 24);
1376
	file->LoadTex((Byte*)img_ground, 3, 24, 24);
1377
	file->LoadTex((Byte*)img_laser, 4, 24, 24);
1378
	file->LoadTex((Byte*)img_laser1, 4, 24, 24);
1379
	file->LoadTex((Byte*)img_laser2, 4, 24, 24);
1380
 
5287 ZblCoder 1381
	for (int i = 0; i < 4; ++i)
1382
		file->LoadTex((Byte*)img_mirror[i], 3, 24, 24);
5276 ZblCoder 1383
 
5296 ZblCoder 1384
	//for (int i = 0; i < 4; ++i)
1385
	file->LoadTex((Byte*)img_mini_mirror, 4, 24, 96);
5276 ZblCoder 1386
 
1387
	file->LoadTex((Byte*)img_tank, 4, 24, 24);
1388
	file->LoadTex((Byte*)img_wall, 3, 24, 24);
1389
	file->LoadTex((Byte*)img_water, 3, 24, 24);
1390
	file->LoadTex((Byte*)img_waterbox, 3, 24, 24);
1391
	file->LoadTex((Byte*)img_menu, 3, 384, 384);
1392
	file->LoadTex((Byte*)img_explosion, 4, 24, 336);
5287 ZblCoder 1393
	file->LoadTex((Byte*)img_gun, 4, 24, 24);
5296 ZblCoder 1394
	file->LoadTex((Byte*)img_gamebg, 3, 96, 96);
5331 ZblCoder 1395
 
5276 ZblCoder 1396
 
1397
	delete file;
1398
 
5296 ZblCoder 1399
	strcpy(cPtr + 1, "data02.pak");
1400
 
1401
	file = new CKosFile(kosExePath);
1402
 
1403
	file->LoadTex((Byte*)img_levels, 3, 384, 384);
5331 ZblCoder 1404
 
1405
	for (int i = 0; i < 3; ++i)
1406
		file->LoadTex((Byte*)img_pandus[i], 3, 12, 1);
1407
 
5296 ZblCoder 1408
	file->LoadTex((Byte*)img_number_box, 4, 51, 50);
1409
	file->LoadTex((Byte*)img_numbers, 4, 14, 250);
1410
 
1411
	file->LoadTex((Byte*)img_button1, 4, 57, 57);
1412
	file->LoadTex((Byte*)img_button_arrow, 4, 25, 15);
1413
 
1414
	file->LoadTex((Byte*)img_wall_h, 3, 24, 24);
1415
	file->LoadTex((Byte*)img_wall_v, 3, 24, 24);
1416
	file->LoadTex((Byte*)img_wall_x, 3, 24, 24);
1417
 
1418
	file->LoadTex((Byte*)img_crater, 3, 24, 24);
5297 ZblCoder 1419
 
1420
	file->LoadTex((Byte*)img_black, 4, 24, 24);
1421
 
1422
	for (int i = 0; i < 3; ++i)
1423
		file->LoadTex((Byte*)img_buttons[i], 3, 229, 57);
1424
 
5331 ZblCoder 1425
 
5296 ZblCoder 1426
	delete file;
1427
 
5276 ZblCoder 1428
	renderPlayer = new CKosRender(24, 24);
1429
	objPlayer = new CKosImage(renderPlayer, (RGBA*)img_tank, 24, 24);
1430
 
5331 ZblCoder 1431
	renderWater = new CKosRender(24, 24);
1432
 
5296 ZblCoder 1433
	renderBox = new CKosRender(24, 24);
1434
	objLaser = new CKosImage(renderBox, (RGBA*)img_laser, 24, 24);
5276 ZblCoder 1435
	objLaser->SetMode(DRAW_ALPHA_ADD);
5296 ZblCoder 1436
	objLaser1 = new CKosImage(renderBox, (RGBA*)img_laser1, 24, 24);
5276 ZblCoder 1437
	objLaser1->SetMode(DRAW_ALPHA_ADD);
5296 ZblCoder 1438
	objLaser2 = new CKosImage(renderBox, (RGBA*)img_laser2, 24, 24);
5276 ZblCoder 1439
	objLaser2->SetMode(DRAW_ALPHA_ADD);
1440
 
5296 ZblCoder 1441
	//for (int i = 0; i < 4; ++i)
1442
	objMiniMirror = new CKosImage(renderBox, (RGBA*)img_mini_mirror, 24, 24);
1443
	objMiniMirror->SetFrameSize(24, 24);
5276 ZblCoder 1444
 
1445
	objBox = new CKosImage(renderBox, (RGBA*)img_box, 24, 24);
5287 ZblCoder 1446
	objGun = new CKosImage(renderBox, (RGBA*)img_gun, 24, 24);
5276 ZblCoder 1447
 
5296 ZblCoder 1448
	objExplosion = new CKosImage(renderBox, (RGBA*)img_explosion, 24, 24);
5276 ZblCoder 1449
	objExplosion->SetFrameSize(24, 24);
1450
 
5296 ZblCoder 1451
	renderLevels = new CKosRender(384, 384);
5297 ZblCoder 1452
 
1453
	objPlayer1 = new CKosImage(renderLevels, (RGBA*)img_tank, 24, 24);
5296 ZblCoder 1454
	objnumber_box = new CKosImage(renderLevels, (RGBA*)img_number_box, 51, 50);
1455
	objnumbers = new CKosImage(renderLevels, (RGBA*)img_numbers, 14, 25);
1456
	objnumbers->SetFrameSize(14, 25);
1457
 
1458
	objbutton1 = new CKosImage(renderLevels, (RGBA*)img_button1, 57, 57);
1459
	objbutton_arrow = new CKosImage(renderLevels, (RGBA*)img_button_arrow, 25, 15);
5297 ZblCoder 1460
 
1461
	objblack = new CKosImage(renderLevels, (RGBA*)img_black, 24, 24);
5296 ZblCoder 1462
 
5276 ZblCoder 1463
	LevelsLoad();
1464
 
1465
	openLevel(0);
1466
 
1467
	kos_SetMaskForEvents(0x27);
1468
	for (;;)
1469
	{
1470
		switch (kos_WaitForEvent())
1471
		{
1472
		case 1:
5474 ZblCoder 1473
			w_redraw = true;
5276 ZblCoder 1474
			draw_window();
1475
			break;
1476
		case 2:
1477
			Byte keyCode;
1478
			kos_GetKey(keyCode);
1479
			key_press(keyCode);
1480
			break;
1481
		case 3:
1482
			kos_ExitApp();
1483
			break;
1484
		case 6:
1485
			Dword buttons;
1486
			int mX, mY;
1487
			kos_GetMouseState(buttons, mX, mY);
1488
			if (buttons & 1)
1489
				MousePress(MOUSE_LEFT, Point(mX, mY));
1490
			break;
1491
		}
1492
	}
1493
}