Subversion Repositories Kolibri OS

Rev

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