Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2295 leency 1
//Leency 06.10.2011, Flood-it! v2.4, GPL
2276 leency 2
 
3
#include "lib\kolibri.h"
4
#include "lib\random.h"
5
 
6
#ifndef AUTOBUILD
7
#include "lang.h--"
8
#endif
9
 
10
system_colors sc;
11
proc_info Form;
12
dword stak[100]; //окно помощи
13
 
14
//уровни сложности
15
int DIFFICULTY_LEV_PARAMS[]={ 28, 14, 25,  //легко
16
                              17, 28, 50}; //тяжело
17
 
18
//по-умолчанию "легко"
19
int BLOCK_SIZE = 28; //размер квадратика
20
int BLOCKS_NUM = 14; //количество квадратиков по Х и по Y
21
int MAX_CLICKS = 25; //максимальное количество кликов до выигрыша
22
 
23
int CLICKS = 0;      //сколько ходов уже сделал игрок
24
 
25
#define USER_PANEL_WIDTH 119
26
 
27
//шесть цветов используется в игре для квадратиков, седьмой же (последний) для того,
28
//чтобы отметить квадратики в процессе заливки
29
dword FIELD_COLORS[]= {0xf18db6, 0x605ca8, 0xfddc80, 0xdc4a20, 0x46b1e2, 0x7e9d1e,   0x232323, 0};
30
char *BOARD_SIZES[]={ "S", "L", 0 };
31
 
32
 
33
#ifdef LANG_RUS
2283 leency 34
	char *BUTTON_CAPTIONS[]={ " ‡ ­®ў® [F2]", " Џ®¬®йм [F1]", " ‚л室 [Esc]", 0};
2276 leency 35
	char CLICKS_TEXT[]=" Љ«ЁЄЁ:   /";
36
	char LEVELS_TEXT[]="Џ®«Ґ:";
37
 
38
	char HELP_WINDOW_CAPTION[]="Џ®¬®йм";
39
	char *HELP_TEXT[]={	"Љ Є ЁЈа вм ў® Flood-it?",
40
	"",
41
	"‡ Ї®«­ЁвҐ Ї®«Ґ ®¤­Ё¬ 梥⮬ §  ®Ја ­ЁзҐ­­®Ґ зЁб«® 室®ў.",
42
	"€Ја  ­ зЁ­ Ґвбп б ўҐае­Ґ© «Ґў®© Є«ҐвЄЁ. ‚лЎҐаЁвҐ 梥в, ­ ¦ ў ­  ®¤Ё­ Ё§",
43
	"Єў ¤а вЁЄ®ў б«Ґў , Ё Є«ҐвЄЁ ®Єа бпвбп нвЁ¬ 梥⮬ - в Є ўл ЇаЁб®Ґ¤Ё­ЁвҐ",
44
	"б®бҐ¤­ЁҐ Є«ҐвЄЁ в®© ¦Ґ ®Єа бЄЁ. ‡ еў вЁвм Ї®«Ґ ­г¦­® §  ¬Ё­Ё¬ «м­®Ґ",
45
	"зЁб«® 室®ў. Џ®и Ј®ў п бва вҐЈЁп б Ё­вҐаҐб­л¬ ЇаЁ­жЁЇ®¬ - Ё§¬Ґ­Ёбм,",
2281 leency 46
	"зв®Ўл Ї®ЎҐ¤Ёвм!",
47
	"",
48
	"€Ја вм в Є¦Ґ ¬®¦­® Є« ўЁи ¬Ё:",
49
	"[Q] [W] [E]",
50
	"[A] [S] [D]",
51
	0};
2276 leency 52
#else
53
	char *BUTTON_CAPTIONS[]={ "New Game [F2]", "Help     [F1]", "Exit    [Esc]", 0};
54
	char CLICKS_TEXT[]="Clicks:   /";
55
	char LEVELS_TEXT[]="Board:";
56
 
57
	char HELP_WINDOW_CAPTION[]="Help";
58
	char *HELP_TEXT[]={	"How to play Flood-it?",
59
	"",
60
	"Flood the whole board with one color within the allowed steps.",
61
	"You start from the top left corner and progress by selecting one",
2281 leency 62
	"of the colored buttons on the left. When you change your current area",
2276 leency 63
	"color, every adjacent square with the same color also changes, that",
64
	"way you can flood other areas of the board. Select from 3 sizes of",
65
	"the board and try to flood-it in the least amount of steps!",
2281 leency 66
	"Addictive and Fun!",
67
	"",
68
	"You can also play with keyboard:",
69
	"[Q] [W] [E]",
70
	"[A] [S] [D]",
71
	0};
2276 leency 72
#endif
73
 
74
 
2283 leency 75
unsigned char color_matrix[28*28]; //цвета для поля с квадратиками
2276 leency 76
 
2295 leency 77
unsigned char loss_matrix[14*14]={
2276 leency 78
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
80
2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
81
2, 3, 2, 2, 2, 3, 2, 3, 2, 2, 2, 3, 2, 2,
82
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
83
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
84
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
85
2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
86
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
87
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
88
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
89
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2,
90
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
92
};
93
 
2283 leency 94
unsigned char win_matrix[14*14]={
2276 leency 95
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
96
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
98
4, 1, 4, 1, 4, 1, 4, 4, 4, 1, 4, 4, 1, 4,
99
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4, 1, 4,
100
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4,
101
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
102
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
103
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
104
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
105
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
106
4, 4, 1, 4, 1, 4, 4, 1, 4, 1, 4, 4, 1, 4,
107
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
108
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
109
};
110
 
111
void main()
112
{
113
	int key, id;
114
 
115
	new_game();
116
 
117
	loop()
118
	{
119
		switch(WaitEvent())
120
		{
121
			case evButton:
122
				id = GetButtonID();
2282 leency 123
				IF (id==1) || (id==4) ExitProcess();
124
				IF (id==2) goto _NEW_GAME_MARK;
125
				IF (id==3) goto _HELP_MARK;
2283 leency 126
				IF (id>=100)
127
				{
128
					make_turn(id-100);
129
					break;
130
				}
2276 leency 131
				if (id>=10)
132
				{
133
					id=id-10*3;
134
 
2282 leency 135
					IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //выбран тот же размер
2276 leency 136
 
137
					BLOCK_SIZE = DIFFICULTY_LEV_PARAMS[id]; //размер квадратика
138
					BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[id+1]; //количество квадратиков по Х и по Y
139
					MAX_CLICKS = DIFFICULTY_LEV_PARAMS[id+2]; //максимальное количество кликов до выигрыша
140
 
141
					new_game();
142
 
143
					MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14);
144
				}
145
				break;
146
			case evKey:
147
				key = GetKey();
2282 leency 148
				IF (key==027) //Escape
2276 leency 149
					 ExitProcess();
2282 leency 150
				IF (key==050) //F1
2276 leency 151
				{
152
					_HELP_MARK:
153
						CreateThread(#help,#stak);
154
				}
2282 leency 155
				IF (key==051) //F2
2276 leency 156
				{
157
					_NEW_GAME_MARK:
158
						new_game();
159
						draw_clicks_num();
160
						draw_field();
161
				}
2282 leency 162
				IF (key==113) make_turn(0); //Q
163
				IF (key==119) make_turn(1); //W
164
				IF (key==101) make_turn(2); //E
165
				IF (key==097) make_turn(3); //A
166
				IF (key==115) make_turn(4); //S
167
				IF (key==100) make_turn(5); //D
2276 leency 168
				break;
169
			case evReDraw:
170
				draw_window();
171
		}
172
	}
173
}
174
 
175
 
2281 leency 176
void make_turn(int turn_id)
177
{
2282 leency 178
	IF (color_matrix[0]==turn_id) return; //если цвет первой фишки такой же, игнорируем бессмысленный ход
179
	IF (CLICKS>=MAX_CLICKS) return; //если игра закончена
2281 leency 180
 
181
	CLICKS++;
182
	draw_clicks_num();
183
 
184
	fill_field(turn_id);
185
	draw_field();
186
	check_for_end(); //если игра закончена
187
}
188
 
189
 
2276 leency 190
void draw_window()
191
{
192
	int i, j;
193
	#define BUTTON_SIZE 28
194
 
195
	sc.get();
196
 
197
	DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14, 0x74,sc.work,0,0,"Flood-it!");
198
 
199
	//проверяем не схлопнуто ли окно в заголовок
200
	GetProcessInfo(#Form, SelfInfo);
2295 leency 201
	IF (Form.status_window==4) return;
2276 leency 202
 
203
	//закрашиваем фон -> уменьшает перерисовку
204
	for (i=0;i<=4;i++)
205
	{
2282 leency 206
		IF (i<>4)
2276 leency 207
			DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work);
208
		else
209
			DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work_graph); //ободок
210
	}
211
	DrawBar(0,0, USER_PANEL_WIDTH-5, BLOCK_SIZE*BLOCKS_NUM+10, sc.work);
212
 
213
	//кнопочки заливки
214
	for (i=0;i<2;i++)
215
		for (j=0;j<3;j++)
216
			DefineButton(j*BUTTON_SIZE+17,i*BUTTON_SIZE+15,BUTTON_SIZE,BUTTON_SIZE, i*3+j+100,FIELD_COLORS[i*3+j]);
217
 
218
	//кнопочки действий
219
	for (j=0;j<3;j++)
220
	{
221
		DefineButton(17,j*25+120, 13*6+6, 20, j+2,sc.work_button);
222
		WriteText(17+4,j*25+127,0x80,sc.work_button_text,BUTTON_CAPTIONS[j],0);
223
	}
224
 
225
	//кнопочки выбора уровня сложности
226
	WriteText(17,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,sc.work_text,#LEVELS_TEXT,0);
227
	for (j=0;j<2;j++)
228
	{
229
		DefineButton(j*25+56,BLOCKS_NUM*BLOCK_SIZE-20, 20,20, j+10,sc.work_button);
230
 
2282 leency 231
		IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080;
2276 leency 232
			else EDI=sc.work_button_text;
233
 
234
		WriteText(j*25+56+8,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
235
		WriteText(j*25+56+9,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
236
	}
237
 
238
	draw_clicks_num();
239
 
240
	draw_field();
241
 
242
}
243
 
244
 
245
void new_game()
246
{
2283 leency 247
	int i;
2276 leency 248
 
249
	CLICKS = 0;
250
 
2283 leency 251
	for (i=0;i
252
			color_matrix[i] = random(6);
2276 leency 253
}
254
 
255
 
256
void fill_field(int new_color_id)
257
{
2283 leency 258
	int i, j,
2276 leency 259
	old_color_id=color_matrix[0],
260
	restart;
261
	#define MARKED 6
262
 
263
	color_matrix[0]=MARKED;
264
 
265
	_RESTART_MARK:
266
 
267
	restart=0;
268
 
269
	for (i=0;i
270
		for (j=0;j
271
		{
2282 leency 272
			IF (color_matrix[i*BLOCKS_NUM+j]<>old_color_id) continue; //если фишка не нужного цвета идём дальше
273
			IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее
2276 leency 274
 
2282 leency 275
			IF (j>0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим левый
276
			IF (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим верхний
277
			IF (j
278
			IF (i
2276 leency 279
 
2282 leency 280
			IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) restart=1; //если фишку отметили, то потом цикл нужно будет прокрутить сначала - мож ещё чё отметим
2276 leency 281
		}
2282 leency 282
	IF (restart) goto _RESTART_MARK;
2276 leency 283
 
2283 leency 284
	for (i=0;i
285
			IF (color_matrix[i]==MARKED) color_matrix[i]=new_color_id;
2276 leency 286
}
287
 
288
 
289
int check_for_end()
290
{
291
	int i, j, ii, jj;
292
 
293
	if (CLICKS>=MAX_CLICKS) //если проигрыш
294
	{
2282 leency 295
		IF (CLICKS==MAX_CLICKS) //выигрышь на последнем ходе
2276 leency 296
		{
2283 leency 297
			for (i=0;i
2295 leency 298
					IF (color_matrix[i]<>color_matrix[0]) goto _loss_MARK;
2276 leency 299
			goto _WIN_MARK;
300
		}
301
 
2295 leency 302
		_loss_MARK:
2276 leency 303
 
304
		for (i=0;i<14;i++)
305
			for (j=0;j<14;j++)
306
			{
2282 leency 307
				IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0])
2276 leency 308
				{
309
					ii=i;
310
					jj=j;
311
				}
312
				else
313
				{
314
					ii=i*2;
315
					jj=j*2;
316
				}
2295 leency 317
				color_matrix[ii*BLOCKS_NUM+jj]=loss_matrix[i*14+j];
318
				color_matrix[ii+1*BLOCKS_NUM+jj]=loss_matrix[i*14+j];
319
				color_matrix[ii*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j];
320
				color_matrix[ii+1*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j];
2276 leency 321
				draw_field();
322
				//Pause(5);
323
			}
324
 
325
		return 1;
326
	}
327
 
2283 leency 328
	for (i=0;i
329
			IF (color_matrix[i]<>color_matrix[0]) return 0;
2276 leency 330
 
331
	//всё поле одного цвета и фишек меньше MAX_CLICKS -> победа
332
 
333
	_WIN_MARK:
334
 
335
	for (i=0;i<25;i++)
336
	{
337
		new_game();
338
		draw_field();
339
		Pause(7);
340
	}
341
 
342
	CLICKS=MAX_CLICKS;
343
 
344
	for (i=0;i<14;i++)
345
		for (j=0;j<14;j++)
346
		{
2282 leency 347
			IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //заливка для полей разного размера разная
2276 leency 348
			{
349
				ii=i;
350
				jj=j;
351
			}
352
			else
353
			{
354
				ii=i*2;
355
				jj=j*2;
356
			}
357
			color_matrix[ii*BLOCKS_NUM+jj]=win_matrix[i*14+j];
358
			color_matrix[ii+1*BLOCKS_NUM+jj]=win_matrix[i*14+j];
359
			color_matrix[ii*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
360
			color_matrix[ii+1*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
361
			draw_field();
362
			//Pause(5);
363
		}
364
	return 1;
365
}
366
 
367
 
368
void draw_clicks_num()
369
{
370
	#define TEXT_X 21
371
	#define TEXT_Y 92
372
 
373
	DrawBar(8*6+TEXT_X, TEXT_Y, 6*2,9, sc.work);
374
 
375
	WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,#CLICKS_TEXT,0);
376
 
2282 leency 377
	IF (CLICKS<10) EBX=9*6+TEXT_X;
2276 leency 378
		else EBX=8*6+TEXT_X;
379
 
380
	WriteText(EBX,TEXT_Y,0x80,sc.work_text,IntToStr(CLICKS),0);
381
 
382
	WriteText(11*6+TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(MAX_CLICKS),0);
383
}
384
 
385
 
386
void draw_field()
387
{
388
	int i, j;
389
	int color_id;
390
 
391
	for (i=0;i
392
		for (j=0;j
393
		{
394
			color_id = color_matrix[i*BLOCKS_NUM+j];
395
			DrawBar(j*BLOCK_SIZE+USER_PANEL_WIDTH, i*BLOCK_SIZE+5, BLOCK_SIZE,BLOCK_SIZE, FIELD_COLORS[color_id]);
396
		}
397
}
398
 
399
 
400
void help()
401
{
402
	int i;
403
 
404
	loop()
405
	switch (WaitEvent())
406
	{
407
		CASE evButton:
2282 leency 408
				IF (GetButtonID()==1) ExitProcess();
2276 leency 409
				break;
410
		CASE evKey:
2282 leency 411
				IF (GetKey()==27) ExitProcess(); //Esc
2276 leency 412
				break;
413
		CASE evReDraw:
414
				for (i=0; HELP_TEXT[i]<>0; i++;) {};
415
 
2281 leency 416
				DefineAndDrawWindow(500,200,450,i*13+44,0x34,sc.work,0,0,#HELP_WINDOW_CAPTION);
2276 leency 417
 
418
				WriteText(6,12,0x80,sc.work_text,HELP_TEXT[0],0); //это для жирного шрифта
419
				for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(5,i*13+12,0x80,sc.work_text,HELP_TEXT[i],0);
420
	}
421
}
422
 
423
 
424
stop: