Subversion Repositories Kolibri OS

Rev

Rev 5283 | Rev 5296 | 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
11
 
12
#define GAME_NONE		0
13
#define GAME_VICTORY	1
14
#define GAME_DEFEAT		2
15
 
16
#define MOUSE_LEFT		0
17
 
5287 ZblCoder 18
#define FIELD_NONE			0
19
#define FIELD_WATER			1
20
#define FIELD_GROUND		2
21
#define FIELD_BRICK			3
22
#define FIELD_WALL			4
23
#define FIELD_BOX			5
24
#define FIELD_MISSLE_0		6
25
#define FIELD_MISSLE_1		7
26
#define FIELD_MISSLE_2		8
27
#define FIELD_MISSLE_3		9
28
#define FIELD_HERO			10
29
#define FIELD_FINISH		11
30
#define FIELD_GUN_0			12
31
#define FIELD_GUN_1			13
32
#define FIELD_GUN_2			14
33
#define FIELD_GUN_3			15
34
#define FIELD_BOX_MISSLE_0	16
35
#define FIELD_BOX_MISSLE_1	17
36
#define FIELD_BOX_MISSLE_2	18
37
#define FIELD_BOX_MISSLE_3	19
38
#define FIELD_BRICK_DES		20
39
#define FIELD_BOX_WATER		21
40
 
41
 
5276 ZblCoder 42
char* header = "Laser Tank";
43
 
44
struct Level
45
{
5287 ZblCoder 46
	Byte fileds[16][16];
5276 ZblCoder 47
};
48
 
5287 ZblCoder 49
void pause(int time)
50
{
51
	kos_Pause(time);
52
	Byte keyCode;
53
	for (int i = 0; i < 10; ++i)
54
		kos_GetKey(keyCode);
55
}
56
 
5276 ZblCoder 57
Level *levels;
58
int levelCount = 0;
59
int levelIndex = 0;
60
 
61
RGBA img_tank[576];
62
RGB img_water[576];
5287 ZblCoder 63
RGB img_brick[11][576];
5276 ZblCoder 64
RGB img_waterbox[576];
65
RGB img_ground[576];
66
RGB img_wall[576];
67
RGB img_finish[576];
68
RGBA img_box[576];
69
RGBA img_laser[576];
5287 ZblCoder 70
RGB img_mirror[4][576];
71
RGBA img_mini_mirror[4][576];
5276 ZblCoder 72
RGBA img_laser1[576];
73
RGBA img_laser2[576];
74
RGB img_brick1[576];
75
RGB img_menu[147456];
76
RGBA img_explosion[8064];
5287 ZblCoder 77
RGBA img_gun[576];
5276 ZblCoder 78
 
79
RGB img_button[7500];
80
 
81
Player player;
82
 
83
CKosRender* renderPlayer;
84
CKosImage* objPlayer;
85
 
86
CKosRender* renderLaser;
87
CKosImage* objLaser;
88
CKosImage* objLaser1;
89
CKosImage* objLaser2;
90
 
91
CKosRender* renderMirror;
5287 ZblCoder 92
CKosImage* objMiniMirror[4];
5276 ZblCoder 93
 
94
CKosRender* renderBox;
95
CKosImage* objBox;
5287 ZblCoder 96
CKosImage* objGun;
5276 ZblCoder 97
 
98
CKosRender* renderExplosion;
99
CKosImage* objExplosion;
100
 
101
int gameMode = MODE_MENU;
102
int gameStatus = GAME_NONE;
103
 
104
void draw_window();
105
void openLevel(int index);
5287 ZblCoder 106
void Laser(Point pos, Point vec, RGB color);
5276 ZblCoder 107
 
108
bool CollRecrVsPoint(Point point, Rect rect)
109
{
110
	return (point.X > rect.X && point.Y > rect.Y && point.X < rect.X + rect.Width && point.Y < rect.Y + rect.Height);
111
}
112
 
113
struct Button
114
{
115
	Rect rect;
116
	char* caption;
117
	Button() {}
118
	Button(char* caption, Rect rect)
119
	{
120
		this->caption = caption;
121
		this->rect = rect;
122
	}
123
};
124
 
125
Button ToGame("Game", Rect(150, 258, 224, 50));
126
Button ToExit("Exit", Rect(150, 321, 224, 50));
127
 
128
struct LvlItem
129
{
5287 ZblCoder 130
	Byte s;
131
	Byte d;
5276 ZblCoder 132
	Byte l;
133
};
134
 
135
LvlItem level[16][16];
136
 
137
char GetField(Point position, bool din)
138
{
5287 ZblCoder 139
	if (din && level[position.Y][position.X].d != FIELD_NONE)
5276 ZblCoder 140
		return level[position.Y][position.X].d;
141
	return level[position.Y][position.X].s;
142
}
143
 
144
RGB* GetImg(Point position, bool din)
145
{
146
	switch (GetField(position, din))
147
	{
5287 ZblCoder 148
	case FIELD_WALL:
5276 ZblCoder 149
		return (RGB*)img_wall;
5287 ZblCoder 150
	case FIELD_MISSLE_0:
151
		return (RGB*)img_mirror[0];
152
	case FIELD_MISSLE_1:
153
		return (RGB*)img_mirror[1];
154
	case FIELD_MISSLE_2:
155
		return (RGB*)img_mirror[2];
156
	case FIELD_MISSLE_3:
157
		return (RGB*)img_mirror[3];
158
	case FIELD_GUN_0:
159
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
160
		objGun->Draw(Point(0, 0), 0);
161
		return renderBox->buffer;
162
	case FIELD_GUN_1:
163
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
164
		objGun->Draw(Point(0, 0), 90);
165
		return renderBox->buffer;
166
	case FIELD_GUN_2:
167
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
168
		objGun->Draw(Point(0, 0), 180);
169
		return renderBox->buffer;
170
	case FIELD_GUN_3:
171
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
172
		objGun->Draw(Point(0, 0), 270);
173
		return renderBox->buffer;
174
	case FIELD_GROUND:
5276 ZblCoder 175
		return (RGB*)img_ground;
5287 ZblCoder 176
	case FIELD_BOX:
177
		renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
5276 ZblCoder 178
		objBox->Draw(Point(0, 0), 0);
179
		return renderBox->buffer;
180
	//	return (RGB*)img_box;
5287 ZblCoder 181
	case FIELD_FINISH:
5276 ZblCoder 182
		return (RGB*)img_finish;
5287 ZblCoder 183
	case FIELD_BRICK:
184
		return (RGB*)img_brick[level[position.Y][position.X].l];
185
	case FIELD_WATER:
5276 ZblCoder 186
		return (RGB*)img_water;
5287 ZblCoder 187
	case FIELD_BOX_WATER:
5276 ZblCoder 188
		return (RGB*)img_waterbox;
5287 ZblCoder 189
	case FIELD_BRICK_DES:
5276 ZblCoder 190
		return (RGB*)img_brick1;
191
	}
192
	return NULL;
193
}
194
 
5287 ZblCoder 195
Byte CollField(Point position)
196
{
197
	if (position.X < 0 || position.Y < 0 || position.X > 15 || position.Y > 15)
198
		return 0;
199
 
200
	switch (GetField(position, true))
201
	{
202
	case FIELD_NONE:
203
	case FIELD_WATER:
204
	case FIELD_GROUND:
205
	case FIELD_BOX_WATER:
206
	case FIELD_BRICK_DES:
207
	case FIELD_FINISH:
208
		return 1;
209
	case FIELD_GUN_0:
210
		return FIELD_GUN_0;
211
	case FIELD_GUN_1:
212
		return FIELD_GUN_1;
213
	case FIELD_GUN_2:
214
		return FIELD_GUN_2;
215
	case FIELD_GUN_3:
216
		return FIELD_GUN_3;
217
	}
218
	return 0;
219
}
220
 
221
bool ExistGun1(Point position, Point vec, int gun)
222
{
223
	rtlDebugOutString("ExistGun");
224
	Point pos = position;
225
 
226
	Byte result = 1;
227
	while (result == 1)
228
	{
229
		pos = pos + vec;
230
		result = CollField(pos);
231
	}
232
	if (result == gun)
233
	{
234
		Laser(pos, vec * -1, (RGB)0x00CCFF);
235
		return true;
236
	}
237
	return false;
238
}
239
 
240
void ExistGun(Point position)
241
{
242
	if (ExistGun1(position, Point(1, 0), FIELD_GUN_2))
243
		return;
244
	if (ExistGun1(position, Point(0, 1), FIELD_GUN_3))
245
		return;
246
	if (ExistGun1(position, Point(-1, 0), FIELD_GUN_0))
247
		return;
248
	ExistGun1(position, Point(0, -1), FIELD_GUN_1);
249
}
250
 
5276 ZblCoder 251
void DrawElevent(Point position, bool din)
252
{
253
	kos_PutImage(GetImg(position, din), 24, 24, 24 * position.X, 24 * position.Y);
254
}
255
 
256
void MoveBox(Point a, Point b)
257
{
5287 ZblCoder 258
	Byte code = GetField(a, true);
259
	level[a.Y][a.X].d = FIELD_NONE;
5276 ZblCoder 260
	DrawElevent(a, true);
5287 ZblCoder 261
	if (level[b.Y][b.X].s == FIELD_WATER)
5276 ZblCoder 262
	{
5287 ZblCoder 263
		if (code = FIELD_BOX)
264
			level[b.Y][b.X].s = FIELD_BOX_WATER;
5276 ZblCoder 265
		DrawElevent(b, true);
266
	}
267
	else
268
	{
5287 ZblCoder 269
		level[b.Y][b.X].d = code;
5276 ZblCoder 270
		DrawElevent(b, true);
271
	}
272
}
273
 
5287 ZblCoder 274
void animation(Point vector, float angle, int obj)
5276 ZblCoder 275
{
276
	for (int i = 2; i < 23; ++i)
277
	{
278
		kos_WindowRedrawStatus(1);
279
		DrawElevent(player.position, false);
280
		DrawElevent(player.position + vector, false);
281
 
282
		renderPlayer->RenderImg(GetImg(player.position, true), Point(0, 0), 24, 24);
283
		objPlayer->Draw(Point(0, 0), angle);
284
		renderPlayer->Draw(player.position * 24 + vector * i);
5287 ZblCoder 285
		if (level[player.position.Y + vector.Y][player.position.X + vector.X].d == obj)
5276 ZblCoder 286
		{
5287 ZblCoder 287
			renderBox->RenderImg(GetImg(player.position + vector, true), Point(0, 0), 24, 24);
288
			switch (obj)
289
			{
290
			case FIELD_GUN_0:
291
				objGun->Draw(Point(0, 0), 0);
292
				break;
293
			case FIELD_GUN_1:
294
				objGun->Draw(Point(0, 0), 90);
295
				break;
296
			case FIELD_GUN_2:
297
				objGun->Draw(Point(0, 0), 180);
298
				break;
299
			case FIELD_GUN_3:
300
				objGun->Draw(Point(0, 0), 270);
301
				break;
302
			case FIELD_BOX:
303
				objBox->Draw(Point(0, 0), 0);
304
			}
5276 ZblCoder 305
			renderBox->Draw((player.position + vector) * 24 + vector * i);
306
		}
307
		kos_WindowRedrawStatus(2);
5287 ZblCoder 308
		pause(1);
5276 ZblCoder 309
	}
310
 
5287 ZblCoder 311
	if (level[player.position.Y + vector.Y][player.position.X + vector.X].d == obj)
5276 ZblCoder 312
		MoveBox(player.position + vector, player.position + vector * 2);
313
 
314
	DrawElevent(player.position, true);
315
	DrawElevent(player.position + vector, true);
316
	player.position = player.position + vector;
317
	//kos_PutImage(GetImg(player.position + vector), 24, 24, 24 * player.position.X, 24 * player.position.Y);
318
	renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
319
	objPlayer->Draw(Point(0, 0), angle);
320
	renderPlayer->Draw(player.position * 24);
5287 ZblCoder 321
	ExistGun(player.position);
5276 ZblCoder 322
}
323
 
5287 ZblCoder 324
void DrawLaser(Point position, int frame, RGB color)
5276 ZblCoder 325
{
326
	renderLaser->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
327
	switch (frame)
328
	{
329
	case 1:
5287 ZblCoder 330
		objLaser->Draw(Point(0, 0), 0, color);
331
		break;
5276 ZblCoder 332
	case 2:
5287 ZblCoder 333
		objLaser->Draw(Point(0, 0), 90, color);
5276 ZblCoder 334
		break;
335
	case 3:
5287 ZblCoder 336
		objLaser2->Draw(Point(0, 0), 0, color);
5276 ZblCoder 337
		break;
338
	default:
5287 ZblCoder 339
		objLaser1->Draw(Point(-1, 0), (float)frame, color);
5276 ZblCoder 340
	}
341
	renderLaser->Draw(position * 24);
342
	level[position.Y][position.X].l = 1;
343
}
344
 
5287 ZblCoder 345
void Laser(Point pos, Point vec, RGB color)
5276 ZblCoder 346
{
5287 ZblCoder 347
	Point vector = vec;
348
	Point position = pos + vector;
5276 ZblCoder 349
	bool en = true;
5287 ZblCoder 350
	Byte code;
351
	bool LaserGun = false;
352
 
5276 ZblCoder 353
	while (en)
354
	{
5287 ZblCoder 355
		code = GetField(position, true);
356
		switch (code)
5276 ZblCoder 357
		{
5287 ZblCoder 358
		case FIELD_BOX:
359
		case FIELD_GUN_0:
360
		case FIELD_GUN_1:
361
		case FIELD_GUN_2:
362
		case FIELD_GUN_3:
363
			if (code == FIELD_GUN_0 && vector == Point(-1, 0) || code == FIELD_GUN_1 && vector == Point(0, -1)
364
				|| code == FIELD_GUN_2 && vector == Point(1, 0) || code == FIELD_GUN_3 && vector == Point(0, 1))
365
			{
366
				for (int i = 2; i < 23; ++i)
367
					kos_Pause(1);
368
				for (int y = 0; y < 16; y++)
369
					for (int x = 0; x < 16; x++)
370
						if (level[y][x].l == 1)
371
						{
372
							DrawElevent(Point(x, y), true);
373
							level[y][x].l = 0;
374
						}
375
				for (int i = 0; i < 14; ++i)
376
				{
377
					renderExplosion->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
378
					objExplosion->Draw(Point(0, 0), 0, i);
379
					renderExplosion->Draw((position)* 24);
380
					pause(2);
381
				}
382
				level[position.Y][position.X].d = FIELD_NONE;
383
				draw_window();
384
				return;
385
			}
386
			else
5276 ZblCoder 387
			if (position + vector != player.position)
388
				switch (GetField(position + vector, true))
389
				{
5287 ZblCoder 390
				case FIELD_GROUND:
391
				case FIELD_WATER:
392
				case FIELD_BRICK_DES:
393
				case FIELD_BOX_WATER:
5276 ZblCoder 394
					for (int i = 2; i < 23; ++i)
395
					{
396
						DrawElevent(position, false);
397
						DrawElevent(position + vector, true);
5287 ZblCoder 398
						DrawLaser(position, (vector.X != 0) ? 1 : 2, color);
399
						renderBox->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
400
						switch (code)
401
						{
402
						case FIELD_GUN_0:
403
							objGun->Draw(Point(0, 0), 0);
404
							break;
405
						case FIELD_GUN_1:
406
							objGun->Draw(Point(0, 0), 90);
407
							break;
408
						case FIELD_GUN_2:
409
							objGun->Draw(Point(0, 0), 180);
410
							break;
411
						case FIELD_GUN_3:
412
							objGun->Draw(Point(0, 0), 270);
413
							break;
414
						case FIELD_BOX:
415
							objBox->Draw(Point(0, 0), 0);
416
						}
5276 ZblCoder 417
						renderBox->Draw((position) * 24 + vector * i);
418
						kos_Pause(1);
419
					}
420
					MoveBox(position, position + vector);
5287 ZblCoder 421
					LaserGun = true;
422
			}
5276 ZblCoder 423
			en = false;
424
			break;
5287 ZblCoder 425
		case FIELD_BRICK:
426
			for (int i = 0; i < 6; ++i)
5276 ZblCoder 427
			{
5287 ZblCoder 428
				level[position.Y][position.X].l += 1;
429
				if (level[position.Y][position.X].l == 11)
5276 ZblCoder 430
				{
5287 ZblCoder 431
					level[position.Y][position.X].s = FIELD_BRICK_DES;
432
					level[position.Y][position.X].l = 0;
433
					LaserGun = true;
5276 ZblCoder 434
				}
5287 ZblCoder 435
				DrawElevent(position, false);
436
				pause(5);
5276 ZblCoder 437
			}
438
			en = false;
439
			break;
5287 ZblCoder 440
		case FIELD_GROUND:
441
		case FIELD_WATER:
442
		case FIELD_FINISH:
443
		case FIELD_BRICK_DES:
444
		case FIELD_BOX_WATER:
5276 ZblCoder 445
			if (player.position == position)
446
			{
447
				for (int i = 2; i < 23; ++i)
448
					kos_Pause(1);
449
				for (int y = 0; y < 16; y++)
450
					for (int x = 0; x < 16; x++)
451
						if (level[y][x].l == 1)
452
						{
453
							DrawElevent(Point(x, y), true);
454
							level[y][x].l = 0;
455
						}
456
				for (int i = 0; i < 14; ++i)
457
				{
458
					renderExplosion->RenderImg(GetImg(position, false), Point(0, 0), 24, 24);
459
					objExplosion->Draw(Point(0, 0), 0, i);
460
					renderExplosion->Draw((position)* 24);
5287 ZblCoder 461
					pause(2);
5276 ZblCoder 462
				}
463
				gameStatus = GAME_DEFEAT;
464
				draw_window();
465
				return;
466
			}
467
			else
468
			{
469
				if (level[position.Y][position.X].l == 1)
5287 ZblCoder 470
					DrawLaser(position, 3, color);
5276 ZblCoder 471
				else
5287 ZblCoder 472
					DrawLaser(position, (vector.X != 0) ? 1 : 2, color);
5276 ZblCoder 473
			}
474
			break;
5287 ZblCoder 475
		case FIELD_MISSLE_0:
5276 ZblCoder 476
			if (vector == Point(-1, 0) || vector == Point(0, -1))
477
			{
478
				vector = (vector.Y == -1) ? Point(1, 0) : Point(0, 1);
5287 ZblCoder 479
				DrawLaser(position, 0, color);
5276 ZblCoder 480
			}
481
			else
482
			{
483
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 484
					pause(1);
5276 ZblCoder 485
				en = false;
486
			}
487
			break;
5287 ZblCoder 488
		case FIELD_MISSLE_1:
5276 ZblCoder 489
			if (vector == Point(0, -1) || vector == Point(1, 0))
490
			{
491
				vector = (vector.Y == -1) ? Point(-1, 0) : Point(0, 1);
5287 ZblCoder 492
				DrawLaser(position, 90, color);
5276 ZblCoder 493
			}
494
			else
495
			{
496
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 497
					pause(1);
5276 ZblCoder 498
				en = false;
499
			}
500
			break;
5287 ZblCoder 501
		case FIELD_MISSLE_3:
5276 ZblCoder 502
			if (vector == Point(-1, 0) || vector == Point(0, 1))
503
			{
504
				vector = (vector.Y == 1) ? Point(1, 0) : Point(0, -1);
5287 ZblCoder 505
				DrawLaser(position, 270, color);
5276 ZblCoder 506
			}
507
			else
508
			{
509
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 510
					pause(1);
5276 ZblCoder 511
				en = false;
512
			}
513
			break;
5287 ZblCoder 514
		case FIELD_MISSLE_2:
5276 ZblCoder 515
			if (vector == Point(1, 0) || vector == Point(0, 1))
516
			{
517
				vector = (vector.Y == 1) ? Point(-1, 0) : Point(0, -1);
5287 ZblCoder 518
				DrawLaser(position, 180, color);
5276 ZblCoder 519
			}
520
			else
521
			{
522
				for (int i = 2; i < 23; ++i)
5287 ZblCoder 523
					pause(1);
5276 ZblCoder 524
				en = false;
525
			}
526
			break;
527
		default:
528
			for (int i = 2; i < 23; ++i)
5287 ZblCoder 529
				pause(1);
5276 ZblCoder 530
			en = false;
531
		}
532
		position = position + vector;
533
	}
534
 
535
	for (int y = 0; y < 16; y++)
536
		for (int x = 0; x < 16; x++)
537
			if (level[y][x].l == 1)
538
			{
539
				DrawElevent(Point(x, y), true);
540
				level[y][x].l = 0;
541
			}
542
 
5287 ZblCoder 543
	if (LaserGun)
544
		ExistGun(player.position);
5276 ZblCoder 545
}
546
 
547
void player_move(Point vector, float angle)
548
{
549
	if (player.vector == vector)
550
	{
5287 ZblCoder 551
		Byte code = GetField(player.position + vector, true);
552
		switch (code)
5276 ZblCoder 553
		{
5287 ZblCoder 554
		case FIELD_GUN_0:
555
		case FIELD_GUN_1:
556
		case FIELD_GUN_2:
557
		case FIELD_GUN_3:
558
		case FIELD_BOX:
5276 ZblCoder 559
			switch (GetField(player.position + vector * 2, true))
560
			{
5287 ZblCoder 561
			case FIELD_GROUND:
562
			case FIELD_WATER:
563
			case FIELD_BOX_WATER:
564
			case FIELD_BRICK_DES:
565
				animation(vector, angle, code);
5276 ZblCoder 566
				return;
567
			}
568
			break;
5287 ZblCoder 569
		case FIELD_FINISH:
5276 ZblCoder 570
			gameStatus = GAME_VICTORY;
571
			draw_window();
572
			break;
5287 ZblCoder 573
		case FIELD_NONE:
574
		case FIELD_BRICK:
575
		case FIELD_WALL:
576
		case FIELD_WATER:
577
		case FIELD_MISSLE_0:
578
		case FIELD_MISSLE_1:
579
		case FIELD_MISSLE_2:
580
		case FIELD_MISSLE_3:
5276 ZblCoder 581
			break;
582
		default:
5287 ZblCoder 583
			animation(vector, angle, -1);
5276 ZblCoder 584
		}
585
	}
586
	else
587
	{
588
		int cnt;
589
		float addAngle;
590
		if (player.vector == vector * -1)
591
		{
592
			cnt = 48;
593
			addAngle = 3.5f;
594
		}
595
		else
596
		{
597
			cnt = 24;
598
			if (player.angle == 270 && angle == 0 || player.angle == 0 && angle == 270)
599
				addAngle = (player.angle == 0) ? -3.5f : 3.5f;
600
			else
601
				addAngle = (angle < player.angle) ? -3.5f : 3.5f;
602
		}
603
 
604
		for (int i = 1; i < cnt - 1; ++i)
605
		{
606
			player.angle += addAngle;
607
			renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
608
			objPlayer->Draw(Point(0, 0), player.angle);
609
			renderPlayer->Draw(player.position * 24);
5287 ZblCoder 610
			pause(1);
5276 ZblCoder 611
		}
612
 
613
		player.vector = vector;
614
		player.angle = angle;
615
 
616
		renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
617
		objPlayer->Draw(Point(0, 0), player.angle);
618
		renderPlayer->Draw(player.position * 24);
619
	}
620
}
621
 
622
void SetMode(int mode)
623
{
624
	gameMode = mode;
625
	draw_window();
626
}
627
 
628
void key_press(int key)
629
{
630
	//rtlDebugOutString(ftoa(key));
631
 
632
	switch (gameMode)
633
	{
634
	case MODE_MENU:
635
 
636
		break;
637
	case MODE_LEVELS:
638
 
639
		break;
640
	case MODE_GAME:
641
		switch (key)
642
		{
643
		case 119: // Up
644
		case 178: // W
645
			if (gameStatus == GAME_NONE)
646
				player_move(Point(0, -1), 270);
647
			break;
648
		case 177: // Down
649
		case 115: // S
650
			if (gameStatus == GAME_NONE)
651
				player_move(Point(0, 1), 90);
652
			break;
653
		case 176: // Left
654
		case 97:  // A
655
			if (gameStatus == GAME_NONE)
656
				player_move(Point(-1, 0), 180);
657
			break;
658
		case 179: // Right
659
		case 100: // D
660
			if (gameStatus == GAME_NONE)
661
				player_move(Point(1, 0), 0);
662
			break;
663
		case 32: // Space
664
			if (gameStatus == GAME_NONE)
5287 ZblCoder 665
				Laser(player.position, player.vector, (RGB)0x00FF00);
5276 ZblCoder 666
			break;
667
		case 13:
5287 ZblCoder 668
		//	openLevel(levelIndex + 1);
5276 ZblCoder 669
			if (gameStatus == GAME_VICTORY)
670
				openLevel(levelIndex + 1);
671
			else
672
				if (gameStatus == GAME_DEFEAT)
673
					openLevel(levelIndex);
674
			break;
675
		}
676
		break;
677
	}
678
}
679
 
680
void MousePress(int button, Point position)
681
{
682
	//rtlDebugOutString("Mouse");
683
	//rtlDebugOutString(ftoa(position.X));
684
	//rtlDebugOutString(ftoa(position.Y));
685
 
686
	switch (gameMode)
687
	{
688
	case MODE_MENU:
689
		if (CollRecrVsPoint(position, ToGame.rect))
690
			SetMode(MODE_GAME);
691
		if (CollRecrVsPoint(position, ToExit.rect))
692
			kos_ExitApp();
693
		break;
694
	case MODE_LEVELS:
695
 
696
		break;
697
	case MODE_GAME:
698
 
699
		break;
700
	}
701
}
702
 
703
void draw_window(void)
704
{
705
	kos_WindowRedrawStatus(1);
706
	kos_DefineAndDrawWindow(10, 40, 384 + 9, 384 + 25, 0x33, 0x444444, 0, 0, (Dword)header);
707
 
708
	switch (gameMode)
709
	{
710
	case MODE_MENU:
711
		kos_PutImage((RGB*)img_menu, 384, 384, 0, 0);
712
 
713
	//	kos_PutImage((RGB*)img_button, 150, 50, ToGame.rect.X, ToGame.rect.Y);
714
 
715
 
716
		break;
717
	case MODE_LEVELS:
718
 
719
		break;
720
	case MODE_GAME:
721
		for (int y = 0; y < 16; y++)
722
			for (int x = 0; x < 16; x++)
723
			{
5287 ZblCoder 724
				if (level[y][x].s != FIELD_NONE)
5276 ZblCoder 725
					kos_PutImage(GetImg(Point(x, y), true), 24, 24, 24 * x, 24 * y);
5287 ZblCoder 726
				if (level[y][x].d == FIELD_BOX)
5276 ZblCoder 727
				{
728
					renderBox->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
729
					objBox->Draw(Point(0, 0), 0);
730
					renderBox->Draw(Point(x, y) * 24);
731
				}
732
			}
733
 
734
		switch (gameStatus)
735
		{
736
		case GAME_NONE:
737
			renderPlayer->RenderImg(GetImg(player.position, false), Point(0, 0), 24, 24);
738
			objPlayer->Draw(Point(0, 0), player.angle);
739
			renderPlayer->Draw(player.position * 24);
740
			break;
741
		case GAME_VICTORY:
742
			kos_WriteTextToWindow(30, 10, 0x80, 0xFFFFFF, "VICTORY", 0);
743
			break;
744
		case GAME_DEFEAT:
745
			kos_WriteTextToWindow(30, 10, 0x80, 0xFFFFFF, "DEFEAT", 0);
746
			break;
747
		}
748
	break;
749
	}
750
	kos_WindowRedrawStatus(2);
751
}
752
 
753
void LevelsLoad()
754
{
755
	char *cPtr;
756
	cPtr = strrchr(kosExePath, '/');
757
 
758
	if (cPtr == NULL)
759
	{
760
		rtlDebugOutString("Invalid path to executable.");
761
		return;
762
	}
763
	cPtr[1] = 0;
764
	strcpy(cPtr + 1, "levels.lvl");
765
 
766
	CKosFile *file = new CKosFile(kosExePath);
767
 
768
	Byte block[256];
769
	while (file->Read(block, 256) == 256)
770
	{
771
		levelCount++;
772
	}
773
	//levelCount++;
774
	rtlDebugOutString(ftoa(levelCount));
775
 
776
	levels = new Level[levelCount];
777
 
778
	file->Seek(0, SEEK_SET);
779
	for (int i = 0; i < levelCount; ++i)
780
	{
781
		file->Read(block, 256);
782
		int k = 0;
783
 
784
		for (int y = 0; y < 16; y++)
785
			for (int x = 0; x < 16; x++)
786
			{
5287 ZblCoder 787
				levels[i].fileds[y][x] = block[k];
5276 ZblCoder 788
				k++;
789
			}
790
	}
791
}
792
 
793
void openLevel(int index)
794
{
795
	levelIndex = index;
796
	for (int y = 0; y < 16; y++)
797
		for (int x = 0; x < 16; x++)
798
		{
799
			level[y][x].s = levels[index].fileds[y][x];
5287 ZblCoder 800
			level[y][x].d = FIELD_NONE;
5276 ZblCoder 801
			level[y][x].l = 0;
802
			switch (levels[index].fileds[y][x])
803
			{
5287 ZblCoder 804
			case FIELD_BOX:
805
			case FIELD_GUN_0:
806
			case FIELD_GUN_1:
807
			case FIELD_GUN_2:
808
			case FIELD_GUN_3:
809
				level[y][x].s = FIELD_GROUND;
810
				level[y][x].d = levels[index].fileds[y][x];
5276 ZblCoder 811
				break;
5287 ZblCoder 812
			case FIELD_HERO:
5276 ZblCoder 813
				player = Player(Point(x, y));
5287 ZblCoder 814
				level[y][x].s = FIELD_GROUND;
5276 ZblCoder 815
				break;
5287 ZblCoder 816
			case FIELD_BRICK:
817
				level[y][x].l = 0;
5276 ZblCoder 818
				break;
819
			}
820
		}
821
	gameStatus = GAME_NONE;
822
	draw_window();
823
}
824
 
825
void kos_Main()
826
{
827
	rtlDebugOutString(" ");
828
	rtlDebugOutString("kos_Main");
829
	char *cPtr;
830
	cPtr = strrchr(kosExePath, '/');
831
	// проверка ;)
832
	if (cPtr == NULL)
833
	{
834
		rtlDebugOutString("Invalid path to executable.");
835
		return;
836
	}
837
	cPtr[1] = 0;
838
	strcpy(cPtr + 1, "arh.pak");
839
 
840
	CKosFile *file = new CKosFile(kosExePath);
841
 
842
	file->LoadTex((Byte*)img_box, 4, 24, 24);
5287 ZblCoder 843
	for (int i = 0; i < 11; ++i)
844
		file->LoadTex((Byte*)img_brick[i], 3, 24, 24);
845
	file->LoadTex((Byte*)img_brick1, 3, 24, 24);
5276 ZblCoder 846
	file->LoadTex((Byte*)img_finish, 3, 24, 24);
847
	file->LoadTex((Byte*)img_ground, 3, 24, 24);
848
	file->LoadTex((Byte*)img_laser, 4, 24, 24);
849
	file->LoadTex((Byte*)img_laser1, 4, 24, 24);
850
	file->LoadTex((Byte*)img_laser2, 4, 24, 24);
851
 
5287 ZblCoder 852
	for (int i = 0; i < 4; ++i)
853
		file->LoadTex((Byte*)img_mirror[i], 3, 24, 24);
5276 ZblCoder 854
 
5287 ZblCoder 855
	for (int i = 0; i < 4; ++i)
856
		file->LoadTex((Byte*)img_mini_mirror[4], 4, 24, 24);
5276 ZblCoder 857
 
858
	file->LoadTex((Byte*)img_tank, 4, 24, 24);
859
	file->LoadTex((Byte*)img_wall, 3, 24, 24);
860
	file->LoadTex((Byte*)img_water, 3, 24, 24);
861
	file->LoadTex((Byte*)img_waterbox, 3, 24, 24);
862
	file->LoadTex((Byte*)img_menu, 3, 384, 384);
863
	file->LoadTex((Byte*)img_button, 3, 150, 50);
864
	file->LoadTex((Byte*)img_explosion, 4, 24, 336);
5287 ZblCoder 865
	file->LoadTex((Byte*)img_gun, 4, 24, 24);
5276 ZblCoder 866
 
867
	delete file;
868
 
869
	renderPlayer = new CKosRender(24, 24);
870
	objPlayer = new CKosImage(renderPlayer, (RGBA*)img_tank, 24, 24);
871
 
872
	renderLaser = new CKosRender(24, 24);
873
	objLaser = new CKosImage(renderLaser, (RGBA*)img_laser, 24, 24);
874
	objLaser->SetMode(DRAW_ALPHA_ADD);
875
	objLaser1 = new CKosImage(renderLaser, (RGBA*)img_laser1, 24, 24);
876
	objLaser1->SetMode(DRAW_ALPHA_ADD);
877
	objLaser2 = new CKosImage(renderLaser, (RGBA*)img_laser2, 24, 24);
878
	objLaser2->SetMode(DRAW_ALPHA_ADD);
879
 
880
	renderMirror = new CKosRender(24, 24);
881
 
5287 ZblCoder 882
	for (int i = 0; i < 4; ++i)
883
		objMiniMirror[i] = new CKosImage(renderMirror, (RGBA*)img_mini_mirror[i], 24, 24);
5276 ZblCoder 884
 
885
	renderBox = new CKosRender(24, 24);
886
	objBox = new CKosImage(renderBox, (RGBA*)img_box, 24, 24);
5287 ZblCoder 887
	objGun = new CKosImage(renderBox, (RGBA*)img_gun, 24, 24);
5276 ZblCoder 888
 
889
	renderExplosion = new CKosRender(24, 24);
890
	objExplosion = new CKosImage(renderExplosion, (RGBA*)img_explosion, 24, 24);
891
	objExplosion->SetFrameSize(24, 24);
892
 
893
	LevelsLoad();
894
 
895
	openLevel(0);
896
 
897
	kos_SetMaskForEvents(0x27);
898
	for (;;)
899
	{
900
		switch (kos_WaitForEvent())
901
		{
902
		case 1:
903
			draw_window();
904
			break;
905
		case 2:
906
			Byte keyCode;
907
			kos_GetKey(keyCode);
908
			key_press(keyCode);
909
			break;
910
		case 3:
911
			kos_ExitApp();
912
			break;
913
		case 6:
914
			Dword buttons;
915
			int mX, mY;
916
			kos_GetMouseState(buttons, mX, mY);
917
			if (buttons & 1)
918
				MousePress(MOUSE_LEFT, Point(mX, mY));
919
			break;
920
		}
921
	}
922
}