Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8071 maxcodehac 1
#include 
2
#include 
3
#include 
8080 maxcodehac 4
#include 
8084 maxcodehac 5
#include 
8071 maxcodehac 6
 
8080 maxcodehac 7
#include "kolibri_libimg.h"
8
 
8071 maxcodehac 9
 
10
 
8084 maxcodehac 11
//EVENTS LOOK LIKE IN C--
12
#define evReDraw  1
13
#define evKey     2
14
#define evButton  3
15
#define evExit    4
16
#define evDesktop 5
17
#define evMouse   6
18
#define evIPC     7
19
#define evNetwork 8
20
#define evDebug   9
8071 maxcodehac 21
 
22
 
8084 maxcodehac 23
#define RESTART 99
24
 
25
#define b_color 0xbbbbbb
8071 maxcodehac 26
#define _size 4
27
#define bs 44
28
 
29
int field[_size][_size] = {
30
	{0, 0, 0, 1},
31
	{0, 0, 1, 0},
32
	{0, 0, 0, 1},
8072 maxcodehac 33
	{1, 0, 0, 0}
8084 maxcodehac 34
	/*{0, 0, 0, 0},
35
	{0, 0, 0, 0},
36
	{0, 0, 0, 0},
37
	{0, 0, 0, 0}*/
8071 maxcodehac 38
};
8084 maxcodehac 39
short vict = 0;
40
short debug_pr = 0;
8071 maxcodehac 41
 
8084 maxcodehac 42
char* title = "Fridge";
8071 maxcodehac 43
 
8084 maxcodehac 44
 
8080 maxcodehac 45
// PICTURES LOADING CODE
46
char temp_path[4096];
47
char* HOR;
48
char* VER;
49
 
50
 
51
char*   load_file_inmem(char* fname, int32_t* read_sz)
52
{
8084 maxcodehac 53
		FILE *f = fopen(fname, "rb");
54
		if (!f) {
55
			exit(1);
56
		}
57
		if (fseek(f, 0, SEEK_END)) {
58
			exit(1);
59
		}
60
		int filesize = ftell(f);
61
		rewind(f);
62
		char* fdata = malloc(filesize);
63
		if(!fdata) {
64
			exit(1);
65
		}
66
		*read_sz = fread(fdata, 1, filesize, f);
67
		if (ferror(f)) {
68
			exit(1);
69
		}
70
		fclose(f);
8080 maxcodehac 71
 
8084 maxcodehac 72
		return fdata;
8080 maxcodehac 73
}
74
 
75
 
76
void load_pict() {
8084 maxcodehac 77
		const int icon_rgb_size = bs*bs;
78
		char *image_data,
79
			 *filedata;
80
 
81
		strcpy(temp_path, "h.png");
8080 maxcodehac 82
 
8084 maxcodehac 83
		int32_t read_bytes;
84
		filedata = load_file_inmem(temp_path, &read_bytes);
85
		HOR = malloc(icon_rgb_size * 3);
86
 
87
		image_data = img_decode(filedata, read_bytes, 0);
88
 
89
		img_to_rgb2(image_data, HOR);
90
 
91
 
92
		strcpy(temp_path, "v.png");
8080 maxcodehac 93
 
8084 maxcodehac 94
		filedata = load_file_inmem(temp_path, &read_bytes);
95
		VER = malloc(icon_rgb_size * 3);
96
 
97
		image_data = img_decode(filedata, read_bytes, 0);
98
 
99
		img_to_rgb2(image_data, VER);
100
 
101
		img_destroy(image_data);
102
		free(filedata);
8080 maxcodehac 103
}
8084 maxcodehac 104
// END OF PICTURES LOAD CODE
8080 maxcodehac 105
 
106
 
107
 
8084 maxcodehac 108
void redraw_buttons() {
109
		for (int j = 5, yy = 0; yy<_size; j+=bs, yy++)
110
				for (int i = 15, xx = 0; xx<_size; i+=bs, xx++)
111
				{
112
					define_button(65536 * i + (bs-1), 65536 * j + (bs-1), ((xx+1)*10)+yy+1, b_color);
113
 
114
					if (field[yy][xx]) draw_bitmap(VER, i, j, bs, bs);
115
					else draw_bitmap(HOR, i, j, bs, bs);
116
				}
117
}
8080 maxcodehac 118
 
8084 maxcodehac 119
void draw_game_window(){
120
		BeginDraw();
121
		DrawWindow(215,100,220, 220,title,b_color,0x34);
122
		redraw_buttons();
123
		EndDraw();
124
}
8080 maxcodehac 125
 
126
 
8084 maxcodehac 127
 
128
static inline
129
void draw_text_sysNEW(const char *text, int x, int y, int len, int fontType, color_t color)
130
{
131
		__asm__ __volatile__(
132
		"int $0x40"
133
		::"a"(4),"d"(text),
134
		  "b"((x << 16) | y),
135
		  "S"(len),"c"(fontType<<24+color)
136
		 :"memory");
8080 maxcodehac 137
}
138
 
8084 maxcodehac 139
void SetUp() {
140
		for (int y = 0; y<_size; y++)
141
					for (int x = 0; x<_size; x++)
142
					{
143
						field[x][y] = rand() % 2;
144
					}
8071 maxcodehac 145
}
146
 
8084 maxcodehac 147
void draw_victory_window() {
148
		BeginDraw();
149
		DrawWindow(215,100,220, 220,title,b_color,0x34);
8071 maxcodehac 150
 
8084 maxcodehac 151
		draw_text_sysNEW("Ну вы, и", 10, 10, strlen("Ну вы, и"), 0xB1, 0x000000);
152
		draw_text_sysNEW("медвежатник,", 10, 50, strlen("Ну вы, и медвежатник,"), 0xB1, 0x000000);
153
		draw_text_sysNEW("Шеф!", 12, 90, strlen("Шеф!"), 0xB1, 0x000000);
8071 maxcodehac 154
 
8084 maxcodehac 155
		if (debug_pr) {
156
			printf("Fridge: Very great!\n");
157
			debug_pr = 0;
158
		}
8071 maxcodehac 159
 
8084 maxcodehac 160
		define_button(65536 * ((220/2)-(50)) + 140, 65536 * 140 + 25+12, RESTART, 0x9A9A9A);
161
		draw_text_sysNEW("Заново", 80, 145, strlen("Заново"), 0xB1, 0x000000);
162
		EndDraw();
8071 maxcodehac 163
}
164
 
8084 maxcodehac 165
 
166
 
167
void Button() {
168
		int id = get_os_button();
169
		if (id == 1) exit(0); else
170
		if (id == RESTART) {
171
			SetUp();
172
			vict = 0;
173
			draw_game_window();
174
		} else
8071 maxcodehac 175
		{
8084 maxcodehac 176
			int x = (id/10)-1;
177
			int y = (id%10)-1;
178
 
179
			for (int i = 0; i<_size; i++)
180
				if (field[i][x]) field[i][x] = 0; else field[i][x] = 1;
181
 
182
			for (int i = 0; i<_size; i++)
183
				if (field[y][i]) field[y][i] = 0; else field[y][i] = 1;
8081 maxcodehac 184
 
8084 maxcodehac 185
			if (field[y][x]) field[y][x] = 0; else field[y][x] = 1;
186
 
187
			redraw_buttons();
8071 maxcodehac 188
		}
189
}
8084 maxcodehac 190
 
191
 
192
int fridge_opened() {
193
		int fr_op = 0;
194
		for (int y = 0; y<_size; y++)
195
				for (int x = 0; x<_size; x++)
196
				{
197
					fr_op += field[x][y];
198
				}
199
		if (fr_op == 0) return 1;
200
		return 0;
201
}
202
 
203
 
204
int main()
205
{
206
		srand(time(0));
207
 
208
		if (kolibri_libimg_init() == -1)
209
		{
210
			printf("Can not load libimg.obj!\n");
211
			exit(1);
212
		}
213
		load_pict();
214
 
215
		draw_game_window();
216
		while(1)
217
		{
218
			switch(get_os_event())
219
			{
220
				case evButton:
221
					Button();
222
					if (fridge_opened()) {
223
						vict = 1;
224
						debug_pr = 1;
225
						draw_victory_window();
226
					}
227
					break;
228
 
229
				case evKey:
230
					get_key();
231
					break;
232
 
233
				case evReDraw:
234
					if (!vict) draw_game_window();
235
					else draw_victory_window();
236
					break;
237
			}
238
		}
239
}