Rev 5316 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5225 | alpine | 1 | #include "rsgame.h" |
2 | |||
3 | #include "rsgametext.h" |
||
4 | |||
5 | #include "rsgamemenu.h" |
||
6 | |||
7 | #include "rsgamedraw.h" |
||
8 | |||
9 | #include "rskos.h" |
||
10 | |||
11 | #include "rsgentex.h" |
||
12 | #include "rssoundgen.h" |
||
13 | #include "rsnoise.h" |
||
14 | |||
15 | #include "rs/rsplatform.h" |
||
16 | |||
17 | |||
18 | #ifdef RS_USE_C_LIBS // linux version |
||
19 | #include |
||
20 | #include |
||
21 | #include |
||
22 | |||
23 | #include "rs/rskeyboard.h" |
||
24 | #endif |
||
25 | |||
26 | |||
5243 | alpine | 27 | |
5225 | alpine | 28 | rs_game_t game; |
29 | |||
30 | |||
5291 | alpine | 31 | game_obj_t game_obj(int obj_type, int flags, int tag, int radius, float x, float y, int t, float f) { |
32 | game_obj_t obj; |
||
33 | obj.obj_type = obj_type; |
||
34 | obj.flags = flags; |
||
35 | obj.tag = tag; |
||
36 | obj.radius = radius; |
||
37 | obj.x = x; |
||
38 | obj.y = y; |
||
39 | obj.t = t; |
||
40 | obj.f = f; |
||
41 | return obj; |
||
42 | }; |
||
43 | |||
44 | int game_obj_add(game_obj_t obj) { |
||
45 | if (game.objs_count < GAME_OBJS_MAX_COUNT) { |
||
46 | game.objs[game.objs_count++] = obj; |
||
47 | return game.objs_count-1; |
||
48 | }; |
||
49 | #ifdef RS_LINUX |
||
50 | DEBUG10("Error, max objects count is reached"); |
||
51 | #endif |
||
52 | return 0; // Max objects count is reached |
||
53 | }; |
||
54 | |||
55 | void game_obj_remove(int index) { |
||
56 | if (index == game.objs_count - 1) { |
||
57 | game.objs_count--; |
||
58 | return; |
||
59 | }; |
||
60 | game.objs[index] = game.objs[ game.objs_count-1 ]; |
||
61 | game.objs_count--; |
||
62 | }; |
||
63 | |||
64 | |||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | |||
71 | |||
5225 | alpine | 72 | void texture_init(rs_texture_t *tex, int w, int h) { |
73 | tex->status = 1; |
||
74 | tex->w = w; |
||
75 | tex->h = h; |
||
76 | tex->data = malloc(w*h*4); // BGRA BGRA |
||
77 | }; |
||
78 | |||
79 | void texture_free(rs_texture_t *tex) { |
||
80 | free(tex->data); |
||
81 | tex->status = 0; |
||
82 | }; |
||
83 | |||
84 | void texture_clear(rs_texture_t *tex, unsigned int color) { |
||
85 | int i; |
||
86 | for (i = 0; i < tex->w * tex->h; i++) { |
||
87 | *((unsigned int*)(&tex->data[i*4])) = color; |
||
88 | }; |
||
89 | }; |
||
90 | |||
91 | void texture_draw(rs_texture_t *dest, rs_texture_t *src, int x, int y, int mode) { |
||
92 | |||
93 | int i; // y |
||
94 | int j; // x |
||
95 | int k; // color component |
||
96 | |||
97 | int istart = (y < 0) ? -y : 0; |
||
98 | int iend = src->h - (( (y + src->h) > dest->h) ? (y + src->h - dest->h) : 0); |
||
99 | |||
100 | int jstart = (x < 0) ? -x : 0; |
||
101 | int jend = src->w - (( (x + src->w) > dest->w) ? (x + src->w - dest->w) : 0); |
||
102 | |||
103 | int ishift = 0; |
||
104 | int jshift = 0; |
||
105 | |||
106 | float a; // alpha value |
||
107 | |||
108 | if (mode & DRAW_TILED_FLAG) { |
||
109 | jshift = x; |
||
110 | ishift = y; |
||
111 | x = y = istart = jstart = 0; |
||
112 | iend = dest->h; |
||
113 | jend = dest->w; |
||
114 | }; |
||
115 | |||
116 | mode = mode & DRAW_MODE_MASK; |
||
117 | |||
118 | int modvalue = (src->w*src->h*4); |
||
119 | |||
120 | if (mode == DRAW_MODE_REPLACE) { |
||
121 | for (i = istart; i < iend; i++) { |
||
122 | for (j = jstart; j < jend; j++) { |
||
123 | for (k = 0; k < 4; k++) { |
||
124 | dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = src->data[ (4*(i*src->w + j) + k) % modvalue ]; |
||
125 | }; |
||
126 | }; |
||
127 | }; |
||
128 | } |
||
129 | else if (mode == DRAW_MODE_ADDITIVE) { |
||
130 | for (i = istart; i < iend; i++) { |
||
131 | for (j = jstart; j < jend; j++) { |
||
132 | for (k = 0; k < 3; k++) { // Alpha channel is not added |
||
133 | dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = |
||
134 | clamp_byte( dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] + src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue] ); |
||
135 | }; |
||
136 | }; |
||
137 | }; |
||
138 | } |
||
139 | else if (mode == DRAW_MODE_ALPHA) { |
||
140 | for (i = istart; i < iend; i++) { |
||
141 | for (j = jstart; j < jend; j++) { |
||
142 | for (k = 0; k < 3; k++) { |
||
143 | a = (1.0 * src->data[ (4*(i*src->w + j) + 3) % modvalue ] / 255.0); |
||
144 | dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = |
||
145 | (unsigned char) ( (1.0-a) * dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] |
||
146 | + a*src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue] ); |
||
147 | }; |
||
148 | }; |
||
149 | }; |
||
150 | }; |
||
151 | |||
152 | }; |
||
153 | |||
154 | |||
155 | |||
156 | void texture_set_pixel(rs_texture_t *tex, int x, int y, unsigned int color) { |
||
157 | *((unsigned int*) &tex->data[ 4 * ( (y)*tex->w + (x) ) + 0 ]) = color; |
||
158 | }; |
||
159 | |||
160 | void texture_draw_vline(rs_texture_t *tex, int x, int y, int l, unsigned int color) { |
||
161 | int i; |
||
162 | if (y+l >= tex->h) { |
||
163 | l = tex->h - y; |
||
164 | }; |
||
5291 | alpine | 165 | |
166 | if (x < 0) { |
||
167 | return; |
||
168 | }; |
||
169 | |||
170 | if (x >= tex->w) { |
||
171 | return; |
||
172 | }; |
||
173 | |||
5225 | alpine | 174 | for (i = 0; i < l; i++) { |
175 | *((unsigned int*) &tex->data[ 4 * ( (y+i)*tex->w + (x) ) + 0 ]) = color; |
||
176 | }; |
||
177 | }; |
||
178 | |||
179 | |||
180 | |||
181 | void soundbuf_init(rs_soundbuf_t *snd, int length_samples) { |
||
182 | snd->status = 1; |
||
183 | snd->length_samples = length_samples; |
||
184 | snd->data = malloc(length_samples*2); |
||
185 | rskos_snd_create_buffer(&snd->hbuf, snd->data, length_samples); |
||
186 | }; |
||
187 | |||
5298 | alpine | 188 | void soundbuf_update(rs_soundbuf_t *snd) { |
189 | rskos_snd_update_buffer(&snd->hbuf, snd->data, snd->length_samples); |
||
190 | }; |
||
191 | |||
5225 | alpine | 192 | void soundbuf_free(rs_soundbuf_t *snd) { |
193 | snd->status = 0; |
||
194 | free(snd->data); |
||
195 | }; |
||
196 | |||
197 | void soundbuf_fill(rs_soundbuf_t *snd, int amp, int freq_div) { |
||
198 | int i; |
||
199 | for (i = 0; i < snd->length_samples; i++) { |
||
200 | snd->data[i] = -amp/2 + amp/2*( ( (i % freq_div) > freq_div/2 ) ? 1 : 0 ); |
||
201 | }; |
||
202 | rskos_snd_update_buffer(&snd->hbuf, snd->data, snd->length_samples); |
||
203 | }; |
||
204 | |||
205 | void soundbuf_sin(rs_soundbuf_t *snd, float freq) { |
||
206 | int i; |
||
5310 | alpine | 207 | int amp = 19000; |
5225 | alpine | 208 | for (i = 0; i < snd->length_samples; i++) { |
209 | snd->data[i] = ( 1.0 - 1.0*i/snd->length_samples ) * sin(freq*i) * amp; |
||
210 | }; |
||
211 | rskos_snd_update_buffer(&snd->hbuf, snd->data, snd->length_samples); |
||
212 | }; |
||
213 | |||
214 | void soundbuf_sin_fade(rs_soundbuf_t *snd, float freq) { |
||
215 | int i; |
||
5310 | alpine | 216 | int amp = 19000; |
5225 | alpine | 217 | for (i = 0; i < snd->length_samples; i++) { |
218 | snd->data[i] = ( 1.0 - 1.0*i/snd->length_samples ) * sin( ( (1.0 - 0.48*i/snd->length_samples) * freq ) *i) * amp; |
||
219 | }; |
||
5243 | alpine | 220 | |
5225 | alpine | 221 | rskos_snd_update_buffer(&snd->hbuf, snd->data, snd->length_samples); |
222 | }; |
||
223 | |||
5302 | alpine | 224 | void soundbuf_play(rs_soundbuf_t *snd, int mode) { |
225 | rskos_snd_play(&snd->hbuf, mode); |
||
5225 | alpine | 226 | }; |
227 | |||
228 | void soundbuf_stop(rs_soundbuf_t *snd) { |
||
229 | rskos_snd_stop(&snd->hbuf); |
||
230 | }; |
||
231 | |||
5302 | alpine | 232 | void soundbuf_loop_check(rs_soundbuf_t *snd) { |
233 | rskos_snd_check_loop(&snd->hbuf); |
||
234 | }; |
||
5225 | alpine | 235 | |
236 | |||
5302 | alpine | 237 | |
5225 | alpine | 238 | unsigned char clamp_byte(int value) { |
239 | value = value * (1 - (value >> 31)); // negative to zero |
||
240 | return (value > 255) ? 255 : value; |
||
241 | }; |
||
242 | |||
243 | |||
244 | void game_reg_init() { |
||
5291 | alpine | 245 | |
246 | game.player_x = 0; |
||
247 | game.player_y = 0; |
||
5225 | alpine | 248 | game.tz = 0; |
5298 | alpine | 249 | |
250 | game.bg_color = COLOR_BLACK; |
||
5225 | alpine | 251 | |
5291 | alpine | 252 | game.objs = malloc( sizeof(game_obj_t) * GAME_OBJS_MAX_COUNT ); |
5225 | alpine | 253 | |
254 | game.status = STATUS_MENU; |
||
255 | |||
256 | game.window_scale = 2; |
||
5243 | alpine | 257 | #ifndef RS_KOS |
5225 | alpine | 258 | game.window_scale = 3; |
5243 | alpine | 259 | window_scale_str[3] = '3'; |
5225 | alpine | 260 | #endif |
261 | |||
262 | game.keyboard_state = 0; |
||
263 | |||
264 | game.menu_index = 0; |
||
265 | game.menu_item_index = 0; |
||
266 | }; |
||
267 | |||
268 | |||
269 | int is_key_pressed(int mask) { |
||
270 | return IS_BIT_SET(game.keyboard_state, mask) ? 1 : 0; |
||
271 | }; |
||
272 | |||
273 | |||
5291 | alpine | 274 | int seed = 0; |
275 | |||
276 | unsigned short rs_rand() { |
||
277 | seed += 1000; |
||
278 | seed %= 56789; |
||
5225 | alpine | 279 | |
5291 | alpine | 280 | // from here, http://www.cplusplus.com/forum/general/85758/ |
281 | // koef. changed |
||
282 | int n = rskos_get_time() + seed * 57 * 5; // no *2 |
||
283 | n = (n << 13) ^ n; |
||
284 | return (n * (n * n * 15731 + 789221) + 1376312589) & 0xFFFF; |
||
285 | |||
286 | }; |
||
5225 | alpine | 287 | |
288 | |||
289 | |||
290 | |||
291 | void GameInit() { |
||
292 | |||
293 | game_reg_init(); |
||
294 | |||
295 | game.scaled_framebuffer = malloc(GAME_WIDTH*game.window_scale * GAME_HEIGHT*game.window_scale * 3); |
||
296 | DEBUG10f("scaled framebuffer: %d (window_scale = %d) \n", game.window_scale * GAME_WIDTH * GAME_HEIGHT * 3, game.window_scale); |
||
297 | |||
298 | game_font_init(); |
||
299 | |||
300 | texture_init(&game.framebuffer, GAME_WIDTH, GAME_HEIGHT); |
||
301 | |||
302 | texture_init(&game.tex, 64, 64); |
||
303 | rs_gen_init(1, 64); |
||
304 | rs_gen_func_set(0, 0.0); |
||
305 | rs_gen_func_cell(0, 1200, 10, NULL, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0); |
||
306 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
307 | rs_gen_func_posterize(0, 5); |
||
308 | rs_gen_tex_out_rgba(0, 0, 0, -1, 1.0, 1.0, 1.0, 1.0); |
||
309 | memcpy(game.tex.data, rs_gen_reg.tex_out, 64*64*4 ); |
||
310 | rs_gen_term(); |
||
311 | |||
312 | texture_init(&game.tex_clouds, 128, 128); |
||
313 | rs_gen_init(1, 128); |
||
314 | rs_gen_func_perlin(0, 8, 5, 0.5, 1100); |
||
315 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
316 | rs_gen_func_posterize(0, 4); |
||
317 | rs_gen_func_normalize(0, 0.0, 0.50); |
||
318 | rs_gen_tex_out_rgba(0, 0, 0, -1, 0.9, 0.7, 0.5, 1.0); |
||
319 | memcpy(game.tex_clouds.data, rs_gen_reg.tex_out, 128*128*4 ); |
||
320 | rs_gen_term(); |
||
321 | |||
322 | texture_init(&game.tex_ground, GAME_WIDTH, 50); |
||
323 | |||
324 | |||
325 | |||
326 | int ship_size = 8; |
||
327 | |||
328 | // 16x8 |
||
329 | |||
330 | unsigned char tex_ship1_mask[] = { 0x10, 0x58, 0x7C, 0x7C, 0x3E, 0x1E, 0xBE, 0xFE }; |
||
331 | unsigned char tex_ship2_mask[] = { 0x7C, 0x7C, 0x7E, 0x7E, 0x3C, 0x3C, 0x1C, 0x18 }; |
||
332 | unsigned char tex_ship1_overlay_mask[] = { 0x10, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x8C, 0x84 }; |
||
333 | unsigned char tex_ship2_overlay_mask[] = { 0x00, 0x00, 0x20, 0x20, 0x30, 0x30, 0x10, 0x10 }; |
||
334 | |||
335 | texture_init(&game.tex_ship[0], ship_size, ship_size); |
||
336 | rs_gen_init(2, ship_size); |
||
337 | rs_gen_func_perlin(0, 8, 5, 0.5, 111); |
||
338 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
339 | rs_gen_func_posterize(0, 2); |
||
340 | rs_gen_func_mult_add_value(0, 0, 0.3, 0.7); |
||
341 | |||
342 | rs_gen_func_set(1, 1.0); |
||
343 | rs_gen_func_apply_mask(1, tex_ship1_mask); |
||
344 | // rs_gen_func_mult_add_value(1, 1, 0.8, 0.2); |
||
345 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.8, 0.65, 0.66, 1.0); |
||
346 | memcpy(game.tex_ship[0].data, rs_gen_reg.tex_out, ship_size*ship_size*4 ); |
||
347 | rs_gen_term(); |
||
348 | |||
349 | texture_init(&game.tex_ship[1], ship_size, ship_size); |
||
350 | rs_gen_init(2, ship_size); |
||
351 | rs_gen_func_perlin(0, 8, 5, 0.5, 1100); |
||
352 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
353 | rs_gen_func_posterize(0, 2); |
||
354 | rs_gen_func_mult_add_value(0, 0, 0.1, 0.9); |
||
355 | |||
356 | rs_gen_func_set(1, 1.0); |
||
357 | rs_gen_func_apply_mask(1, tex_ship1_overlay_mask); |
||
358 | // rs_gen_func_mult_add_value(1, 1, 0.8, 0.2); |
||
359 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.4, 0.3, 0.3, 1.0); |
||
360 | memcpy(game.tex_ship[1].data, rs_gen_reg.tex_out, ship_size*ship_size*4 ); |
||
361 | rs_gen_term(); |
||
362 | |||
363 | |||
364 | texture_init(&game.tex_ship[2], ship_size, ship_size); |
||
365 | rs_gen_init(2, ship_size); |
||
366 | rs_gen_func_perlin(0, 8, 5, 0.5, 111); |
||
367 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
368 | rs_gen_func_posterize(0, 2); |
||
369 | rs_gen_func_mult_add_value(0, 0, 0.3, 0.7); |
||
370 | // rs_gen_func_set(0, 1.0); |
||
371 | rs_gen_func_set(1, 1.0); |
||
372 | rs_gen_func_apply_mask(1, tex_ship2_mask); |
||
373 | // rs_gen_func_mult_add_value(1, 1, 0.8, 0.2); |
||
374 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.8, 0.65, 0.66, 1.0); |
||
375 | memcpy(game.tex_ship[2].data, rs_gen_reg.tex_out, ship_size*ship_size*4 ); |
||
376 | rs_gen_term(); |
||
377 | |||
378 | texture_init(&game.tex_ship[3], ship_size, ship_size); |
||
379 | rs_gen_init(2, ship_size); |
||
380 | rs_gen_func_perlin(0, 8, 5, 0.5, 1100); |
||
381 | rs_gen_func_normalize(0, 0.0, 1.0); |
||
382 | rs_gen_func_posterize(0, 2); |
||
383 | rs_gen_func_mult_add_value(0, 0, 0.1, 0.9); |
||
384 | |||
385 | rs_gen_func_set(1, 1.0); |
||
386 | rs_gen_func_apply_mask(1, tex_ship2_overlay_mask); |
||
387 | // rs_gen_func_mult_add_value(1, 1, 0.8, 0.2); |
||
388 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.4, 0.3, 0.2, 1.0); |
||
389 | memcpy(game.tex_ship[3].data, rs_gen_reg.tex_out, ship_size*ship_size*4 ); |
||
390 | rs_gen_term(); |
||
391 | |||
392 | |||
393 | texture_init(&game.tex_gui_line, GAME_WIDTH, 13); |
||
394 | int i; |
||
395 | for (i = 0; i < GAME_WIDTH*13; i++) { |
||
396 | ( (unsigned int*) (game.tex_gui_line.data)) [i] = 0x668899AA; |
||
397 | }; |
||
398 | |||
399 | |||
400 | int rock_size = 32; |
||
401 | rs_gen_init(3, rock_size); |
||
402 | for (i = 0; i < ROCKS_COUNT; i++) { |
||
403 | |||
404 | texture_init(&(game.tex_rocks[i]), rock_size, rock_size); |
||
5291 | alpine | 405 | |
5225 | alpine | 406 | rs_gen_func_set(0, 0.0); |
407 | rs_gen_func_radial(0, 0.5, 0.5, 0.5, 0.75, 2.5 + i%5); |
||
408 | |||
409 | rs_gen_func_perlin(2, 33, 4, 0.5, 350+i); |
||
410 | rs_gen_func_normalize(2, 0.0, 1.0); |
||
411 | rs_gen_func_posterize(2, 4); |
||
412 | |||
413 | rs_gen_func_cell(1, 410+i, 50, NULL, -2.0, 1.0, 1.0, 1.0, 0.0, 1.0); |
||
414 | rs_gen_func_posterize(1, 2); |
||
415 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
416 | rs_gen_func_add(1, 1, 2, 1.0, 0.5); |
||
417 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
418 | rs_gen_func_posterize(1, 4); |
||
419 | |||
420 | rs_gen_func_add(1, 0, 1, 1.0, 1.0); |
||
421 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
422 | rs_gen_func_mult(1, 0, 1); |
||
423 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
424 | rs_gen_func_posterize(1, 4); |
||
425 | rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0); |
||
426 | rs_gen_tex_out_rgba(1, 1, 1, -1, 0.5+ 0.03*(i%2), 0.7+ 0.03*(i%3) , 0.9, 1.0); |
||
427 | |||
428 | memcpy(game.tex_rocks[i].data, rs_gen_reg.tex_out, rock_size*rock_size*4 ); |
||
429 | }; |
||
430 | rs_gen_term(); |
||
431 | |||
5291 | alpine | 432 | |
433 | rock_size = 16; |
||
434 | rs_gen_init(3, rock_size); |
||
435 | for (i = 0; i < MINIROCKS_COUNT; i++) { |
||
436 | |||
437 | texture_init(&(game.tex_minirocks[i]), rock_size, rock_size); |
||
5225 | alpine | 438 | |
5291 | alpine | 439 | rs_gen_func_set(0, 0.0); |
440 | rs_gen_func_radial(0, 0.5, 0.5, 0.5, 0.75, 2.5 + i%5); |
||
441 | |||
442 | rs_gen_func_perlin(2, 33, 4, 0.5, 350+i); |
||
443 | rs_gen_func_normalize(2, 0.0, 1.0); |
||
444 | rs_gen_func_posterize(2, 4); |
||
445 | |||
446 | rs_gen_func_cell(1, 410+i, 50, NULL, -2.0, 1.0, 1.0, 1.0, 0.0, 1.0); |
||
447 | rs_gen_func_posterize(1, 2); |
||
448 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
449 | rs_gen_func_add(1, 1, 2, 1.0, 0.5); |
||
450 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
451 | rs_gen_func_posterize(1, 4); |
||
452 | |||
453 | rs_gen_func_add(1, 0, 1, 1.0, 1.0); |
||
454 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
455 | rs_gen_func_mult(1, 0, 1); |
||
456 | rs_gen_func_normalize(1, 0.0, 1.0); |
||
457 | rs_gen_func_posterize(1, 4); |
||
458 | rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0); |
||
459 | rs_gen_tex_out_rgba(1, 1, 1, -1, 0.7+ 0.01*(i%2), 0.7+ 0.01*(i%3) , 0.65, 1.0); |
||
460 | |||
461 | memcpy(game.tex_minirocks[i].data, rs_gen_reg.tex_out, rock_size*rock_size*4 ); |
||
462 | }; |
||
463 | rs_gen_term(); |
||
464 | |||
465 | |||
466 | |||
467 | |||
468 | rs_gen_init(3, EXPLOSION_RADIUS*2); |
||
469 | for (i = 0; i < EXPLOSIONS_COUNT; i++) { |
||
470 | |||
471 | texture_init(&(game.tex_explosions[i]), EXPLOSION_RADIUS*2, EXPLOSION_RADIUS*2); |
||
472 | |||
473 | rs_gen_func_set(0, 1.0); |
||
474 | // rs_gen_func_radial(0, 0.5, 0.5, 0.3 + 0.5*i/EXPLOSION_FRAMES_COUNT, 0.975, 4.0); |
||
475 | // rs_gen_func_set(0, 1.0); |
||
476 | |||
5316 | alpine | 477 | rs_gen_func_perlin(2, 10 + i, 7, 0.5, 100 + i*1000); |
478 | rs_gen_func_normalize(2, 0.0, 1.0); |
||
479 | |||
5291 | alpine | 480 | rs_gen_func_set(1, 0.0); |
481 | rs_gen_func_radial(1, 0.5, 0.5, 0.1 + 0.4*i/EXPLOSIONS_COUNT, 1.0 - 1.0*i/EXPLOSIONS_COUNT, 2.5 + i%5); |
||
5316 | alpine | 482 | |
483 | rs_gen_func_add(0, 0, 2, 1.0, -0.8); |
||
5291 | alpine | 484 | |
485 | rs_gen_tex_out_rgba_set( 0.0, 0.0, 0.0, 0.0); |
||
5316 | alpine | 486 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.5*i/EXPLOSIONS_COUNT, 1.0 - 0.7*i/EXPLOSIONS_COUNT, 1.0, 1.0); |
5291 | alpine | 487 | |
488 | memcpy(game.tex_explosions[i].data, rs_gen_reg.tex_out, EXPLOSION_RADIUS*2*EXPLOSION_RADIUS*2*4 ); |
||
489 | }; |
||
490 | rs_gen_term(); |
||
491 | |||
492 | |||
5316 | alpine | 493 | |
494 | rs_gen_init(3, HUGE_EXPLOSION_RADIUS*2); |
||
495 | for (i = 0; i < HUGE_EXPLOSIONS_COUNT; i++) { |
||
496 | |||
497 | texture_init(&(game.tex_huge_explosions[i]), HUGE_EXPLOSION_RADIUS*2, HUGE_EXPLOSION_RADIUS*2); |
||
5291 | alpine | 498 | |
5316 | alpine | 499 | rs_gen_func_set(0, 1.0); |
500 | // rs_gen_func_radial(0, 0.5, 0.5, 0.3 + 0.5*i/EXPLOSION_FRAMES_COUNT, 0.975, 4.0); |
||
501 | // rs_gen_func_set(0, 1.0); |
||
502 | |||
503 | rs_gen_func_perlin(2, 10 + i, 7, 0.5, 500 + i*2000); |
||
504 | rs_gen_func_normalize(2, 0.0, 1.0); |
||
505 | |||
506 | rs_gen_func_set(1, 0.0); |
||
507 | rs_gen_func_radial(1, 0.5, 0.5, 0.1 + 0.4*i/HUGE_EXPLOSIONS_COUNT, 1.0 - 1.0*i/HUGE_EXPLOSIONS_COUNT, 2.5 + i%5); |
||
508 | |||
509 | rs_gen_func_add(0, 0, 2, 1.0, -0.8); |
||
510 | |||
511 | rs_gen_tex_out_rgba_set( 0.0, 0.0, 0.0, 0.0); |
||
512 | rs_gen_tex_out_rgba(0, 0, 0, 1, 0.88*i/HUGE_EXPLOSIONS_COUNT, 0.8 - 0.8*i/HUGE_EXPLOSIONS_COUNT, 1.0, 1.0); |
||
513 | |||
514 | memcpy(game.tex_huge_explosions[i].data, rs_gen_reg.tex_out, HUGE_EXPLOSION_RADIUS*2*HUGE_EXPLOSION_RADIUS*2*4 ); |
||
515 | }; |
||
516 | rs_gen_term(); |
||
517 | |||
518 | |||
519 | |||
5243 | alpine | 520 | #ifndef RS_KOS |
5302 | alpine | 521 | rs_audio_init(RS_AUDIO_FMT_MONO16, RS_AUDIO_FREQ_16000, 2); |
5225 | alpine | 522 | #endif |
523 | |||
5315 | alpine | 524 | soundbuf_init(&game.sound_shoot, 1536); |
525 | |||
526 | rs_sgen_init(2, game.sound_shoot.length_samples); |
||
5310 | alpine | 527 | rs_sgen_func_pm(1, 2900.0, 1.70, 65.0, 17.0, 1.0); |
528 | rs_sgen_func_normalize(1, 0.6); |
||
529 | // rs_sgen_func_lowpass(0, 1, 1.0, 0.0, 4.0); |
||
530 | rs_sgen_func_highpass(0, 1, 1.0, 0.0, 3.0); |
||
5225 | alpine | 531 | |
5310 | alpine | 532 | rs_sgen_wave_out(0); |
533 | |||
5315 | alpine | 534 | memcpy(game.sound_shoot.data, (unsigned char*) rs_sgen_reg.wave_out, game.sound_shoot.length_samples*2 ); |
5310 | alpine | 535 | |
536 | rs_sgen_term(); |
||
5315 | alpine | 537 | soundbuf_update(&game.sound_shoot); |
5310 | alpine | 538 | |
539 | |||
540 | |||
5315 | alpine | 541 | soundbuf_init(&game.sound_turret_shoot, 4096); |
542 | rs_sgen_init(2, game.sound_turret_shoot.length_samples); |
||
543 | rs_sgen_func_pm(1, 227.0, 4.70, 555.0, 150.0, 0.01); |
||
544 | rs_sgen_func_normalize(1, 0.6); |
||
545 | // rs_sgen_func_highpass(0, 1, 1.0, 0.0, 3.0); |
||
546 | rs_sgen_func_lowpass(0, 1, 1.0, 0.0, 3.0); |
||
547 | |||
548 | rs_sgen_wave_out(0); |
||
549 | |||
550 | memcpy(game.sound_turret_shoot.data, (unsigned char*) rs_sgen_reg.wave_out, game.sound_turret_shoot.length_samples*2 ); |
||
551 | |||
552 | rs_sgen_term(); |
||
553 | soundbuf_update(&game.sound_turret_shoot); |
||
5310 | alpine | 554 | |
555 | |||
5315 | alpine | 556 | |
5310 | alpine | 557 | |
558 | |||
559 | |||
560 | |||
5315 | alpine | 561 | |
5310 | alpine | 562 | |
5225 | alpine | 563 | soundbuf_init(&game.sound_test2, 1024); |
564 | //soundbuf_fill(&game.sound_test2, 8, 40); |
||
565 | soundbuf_sin(&game.sound_test2, 0.48); |
||
566 | |||
567 | soundbuf_init(&game.sound_test3, 1024); |
||
568 | //soundbuf_fill(&game.sound_test3, 12, 60); |
||
569 | soundbuf_sin(&game.sound_test3, 0.24); |
||
570 | |||
571 | |||
5298 | alpine | 572 | |
573 | |||
574 | |||
575 | int soundlen = 55000; |
||
576 | |||
577 | // int freqs[SOUND_EXPLOSIONS_COUNT] = { 440, 523, 587, 698, 783, 880, 1046, 1174 }; |
||
578 | |||
579 | for (i = 0; i < SOUND_EXPLOSIONS_COUNT; i++) { |
||
580 | |||
581 | soundbuf_init(&game.sound_explosions[i], soundlen); |
||
582 | |||
583 | rs_sgen_init(3, soundlen); |
||
584 | |||
585 | rs_sgen_func_noise(2, 1000); |
||
586 | //rs_sgen_func_phaser(0, 2, 0.9, 15.2 + 1.0*i/SOUND_EXPLOSIONS_COUNT, 6.0, 3.0, 2000.0, 1.73); |
||
587 | rs_sgen_func_phaser(0, 2, 0.9, 16.2 + 0.5*i/SOUND_EXPLOSIONS_COUNT, 6.0, 3.0, 900.0, 0.93); |
||
588 | rs_sgen_func_normalize(0, 1.0); |
||
589 | |||
590 | rs_sgen_func_lowpass(2, 0, 0.6, 0.0, 20.0); |
||
5310 | alpine | 591 | rs_sgen_func_normalize(2, 0.5); |
5298 | alpine | 592 | |
593 | rs_sgen_wave_out(2); |
||
594 | |||
595 | memcpy(game.sound_explosions[i].data, (unsigned char*) rs_sgen_reg.wave_out, soundlen*2); |
||
596 | soundbuf_update(&game.sound_explosions[i]); |
||
597 | |||
598 | rs_sgen_term(); |
||
599 | |||
600 | }; |
||
5316 | alpine | 601 | |
602 | |||
603 | |||
604 | soundlen = 95000; |
||
605 | |||
606 | soundbuf_init(&game.sound_huge_explosion, soundlen); |
||
5298 | alpine | 607 | |
5316 | alpine | 608 | rs_sgen_init(3, soundlen); |
609 | |||
610 | rs_sgen_func_noise(2, 1000); |
||
611 | //rs_sgen_func_phaser(0, 2, 0.9, 15.2 + 1.0*i/SOUND_EXPLOSIONS_COUNT, 6.0, 3.0, 2000.0, 1.73); |
||
612 | rs_sgen_func_phaser(0, 2, 0.9, 16.2 + 0.5, 6.0, 3.0, 100.0, 0.53); |
||
613 | rs_sgen_func_normalize(0, 1.0); |
||
614 | |||
615 | rs_sgen_func_lowpass(2, 0, 0.8, 0.0, 10.0); |
||
616 | rs_sgen_func_normalize(2, 0.5); |
||
617 | |||
618 | rs_sgen_wave_out(2); |
||
619 | |||
620 | memcpy(game.sound_huge_explosion.data, (unsigned char*) rs_sgen_reg.wave_out, soundlen*2); |
||
621 | soundbuf_update(&game.sound_huge_explosion); |
||
622 | |||
623 | rs_sgen_term(); |
||
624 | |||
625 | |||
626 | |||
627 | |||
628 | |||
629 | |||
630 | |||
631 | |||
632 | |||
5298 | alpine | 633 | soundlen = 17888; |
634 | |||
635 | soundbuf_init(&game.sound_hit, soundlen); |
||
636 | |||
637 | rs_sgen_init(3, soundlen); |
||
638 | |||
639 | rs_sgen_func_noise(2, 1000); |
||
640 | rs_sgen_func_phaser(0, 2, 0.9, 11.5, 16.0, 13.0, 1300.0, 1.93); |
||
641 | rs_sgen_func_normalize(0, 1.0); |
||
642 | |||
643 | rs_sgen_func_highpass(2, 0, 1.0, 0.3, 20.0); |
||
5310 | alpine | 644 | rs_sgen_func_normalize(2, 0.5); |
5298 | alpine | 645 | |
646 | rs_sgen_wave_out(2); |
||
647 | |||
648 | memcpy(game.sound_hit.data, (unsigned char*) rs_sgen_reg.wave_out, soundlen*2); |
||
649 | soundbuf_update(&game.sound_hit); |
||
650 | |||
651 | rs_sgen_term(); |
||
5302 | alpine | 652 | |
653 | |||
654 | |||
5298 | alpine | 655 | |
5302 | alpine | 656 | #define NOTE(i) ( 3 << ( (i)/12) ) / ( 24 - ( (i) % 12) ) |
657 | int amp = 70; |
||
658 | int t_shift = 0; |
||
659 | int t; |
||
660 | |||
661 | soundlen = 128 * 1024; |
||
662 | |||
663 | |||
664 | |||
665 | soundbuf_init(&game.sound_music, soundlen); |
||
666 | |||
667 | for (t = t_shift; t < soundlen+t_shift; t++) { |
||
668 | game.sound_music.data[t-t_shift] = (0xFF & |
||
669 | ( |
||
670 | ((t>>11) | (t>>7) | ( t>>5) | (t)) |
||
671 | |||
672 | ) |
||
673 | ) * amp; |
||
674 | }; |
||
675 | |||
676 | soundbuf_update(&game.sound_music); |
||
677 | |||
678 | |||
679 | |||
5315 | alpine | 680 | // int d[4] = { 5, 6, 1, 2 }; |
5302 | alpine | 681 | |
682 | |||
5315 | alpine | 683 | // soundbuf_init(&game.sound_music2, soundlen); |
684 | // |
||
685 | // for (t = t_shift; t < soundlen+t_shift; t++) { |
||
686 | // |
||
687 | //// y = 1 + (t & 16383); |
||
688 | //// x = (t * c[ (t>>13) & 3 ] / 24) & 127; |
||
689 | // |
||
690 | // game.sound_music2.data[t-t_shift] = (0xFF & |
||
691 | // ( |
||
692 | // //( t*5 & t >> 7 ) | ( t*2 & t >> 10 ) |
||
693 | // |
||
694 | // // ( ((t*t*t/1000000 + t) % 127) | t>>4 | t>>5 | (t%127) ) + ( (t>>16) | t ) |
||
695 | // |
||
696 | //// ((t>>11) | (t>>7) | ( t>>5) | (t)) |
||
697 | //// //+ |
||
698 | //// //(( (t*5) >>12) & ( (t*3)>>19)) |
||
699 | // |
||
700 | //// (3000 / y) * 35 |
||
701 | //// + x*y*40000 |
||
702 | //// + ( ( ((t>>8) & (t>>10)) | (t >> 14) | x) & 63 ) |
||
703 | // |
||
704 | // // ( ((6 * t / d[ (t>>13) & 15 ] ) & 127) * 10000 ) |
||
705 | // //|( ( t>>3 ) ) |
||
706 | // |
||
707 | // (t*NOTE( d[ (t>>13) & 3 ] )*10000) |
||
708 | // | ((t>>6)*20000) |
||
709 | // |
||
710 | // ) |
||
711 | // |
||
712 | // ) * amp; |
||
713 | // }; |
||
714 | // |
||
715 | // soundbuf_update(&game.sound_music2); |
||
5302 | alpine | 716 | |
717 | |||
718 | soundbuf_play( &game.sound_music, SND_MODE_LOOP ); |
||
719 | |||
720 | |||
5225 | alpine | 721 | }; |
722 | |||
723 | |||
724 | void GameTerm() { |
||
725 | |||
726 | |||
5291 | alpine | 727 | DEBUG10("--- Game Term ---"); |
5225 | alpine | 728 | |
5243 | alpine | 729 | #ifndef RS_KOS |
5225 | alpine | 730 | rs_audio_term(); |
731 | #endif |
||
732 | |||
733 | game_font_term(); |
||
734 | |||
735 | free(game.scaled_framebuffer); |
||
736 | |||
5291 | alpine | 737 | free(game.objs); |
738 | |||
5225 | alpine | 739 | texture_free(&game.framebuffer); |
740 | texture_free(&game.tex); |
||
741 | texture_free(&game.tex_clouds); |
||
742 | texture_free(&game.tex_ground); |
||
743 | |||
744 | texture_free(&game.tex_gui_line); |
||
745 | |||
746 | int i; |
||
747 | for (i = 0; i < ROCKS_COUNT; i++) { |
||
748 | texture_free(&game.tex_rocks[i]); |
||
749 | }; |
||
750 | |||
5316 | alpine | 751 | soundbuf_free(&game.sound_huge_explosion); |
5315 | alpine | 752 | soundbuf_free(&game.sound_hit); |
753 | soundbuf_free(&game.sound_music); |
||
754 | |||
755 | for (i = 0; i < SOUND_EXPLOSIONS_COUNT; i++) { |
||
756 | soundbuf_free(&game.sound_explosions[i]); |
||
757 | }; |
||
758 | |||
759 | |||
760 | soundbuf_free(&game.sound_shoot); |
||
761 | soundbuf_free(&game.sound_turret_shoot); |
||
5225 | alpine | 762 | soundbuf_free(&game.sound_test2); |
763 | soundbuf_free(&game.sound_test3); |
||
764 | |||
765 | |||
766 | }; |
||
767 | |||
768 | // ------------ #Event Functions ------------ |
||
769 | |||
770 | |||
771 | |||
772 | |||
773 | |||
774 | |||
5298 | alpine | 775 | void GameKeyDown(int key) { |
5225 | alpine | 776 | |
777 | |||
778 | switch (key) { |
||
779 | case RS_KEY_LEFT: |
||
780 | BIT_SET(game.keyboard_state, RS_ARROW_LEFT_MASK); |
||
781 | break; |
||
782 | case RS_KEY_RIGHT: |
||
783 | BIT_SET(game.keyboard_state, RS_ARROW_RIGHT_MASK); |
||
784 | break; |
||
785 | case RS_KEY_UP: |
||
786 | BIT_SET(game.keyboard_state, RS_ARROW_UP_MASK); |
||
787 | break; |
||
788 | case RS_KEY_DOWN: |
||
789 | BIT_SET(game.keyboard_state, RS_ARROW_DOWN_MASK); |
||
790 | break; |
||
791 | case RS_KEY_A: |
||
792 | BIT_SET(game.keyboard_state, RS_ATTACK_KEY_MASK); |
||
793 | game.shoot_keypressed = 1; |
||
5302 | alpine | 794 | |
795 | // soundbuf_loop_check( &game.sound_music ); |
||
796 | |||
5225 | alpine | 797 | break; |
5302 | alpine | 798 | |
799 | |||
800 | |||
5315 | alpine | 801 | case RS_KEY_SPACE: |
5316 | alpine | 802 | soundbuf_play( &game.sound_huge_explosion, 0 ); |
5315 | alpine | 803 | break; |
5302 | alpine | 804 | |
5310 | alpine | 805 | #ifdef RS_LINUX |
806 | |||
807 | case RS_KEY_Z: |
||
5315 | alpine | 808 | // soundbuf_stop( &game.sound_music ); |
809 | // soundbuf_play( &game.sound_music2, 0 ); |
||
810 | game.stage = 7; |
||
5310 | alpine | 811 | break; |
812 | |||
813 | #endif |
||
5302 | alpine | 814 | |
815 | |||
816 | |||
5225 | alpine | 817 | }; |
818 | |||
819 | |||
820 | if (game.status == STATUS_MENU) { |
||
821 | |||
822 | switch (key) { |
||
823 | case RS_KEY_LEFT: |
||
824 | BIT_SET(game.keyboard_state, RS_ARROW_LEFT_MASK); |
||
825 | |||
826 | if ( (game.menu_index == MENU_SETTINGS) && (game.menu_item_index == MENU_ITEM_WINDOW_SCALE) ) { |
||
827 | game_change_window_scale(-1); |
||
5243 | alpine | 828 | game_ding(1); |
5225 | alpine | 829 | }; |
830 | |||
831 | //PlayBuffer(hBuff, 0); |
||
832 | break; |
||
833 | case RS_KEY_RIGHT: |
||
834 | BIT_SET(game.keyboard_state, RS_ARROW_RIGHT_MASK); |
||
835 | |||
836 | if ( (game.menu_index == MENU_SETTINGS) && (game.menu_item_index == MENU_ITEM_WINDOW_SCALE) ) { |
||
837 | game_change_window_scale(1); |
||
5243 | alpine | 838 | game_ding(1); |
5225 | alpine | 839 | }; |
840 | |||
841 | //StopBuffer(hBuff); |
||
842 | break; |
||
843 | case RS_KEY_UP: |
||
844 | BIT_SET(game.keyboard_state, RS_ARROW_UP_MASK); |
||
845 | menu_cursor_up(); |
||
846 | //ResetBuffer(hBuff, 0); |
||
847 | break; |
||
848 | case RS_KEY_DOWN: |
||
849 | BIT_SET(game.keyboard_state, RS_ARROW_DOWN_MASK); |
||
850 | menu_cursor_down(); |
||
851 | break; |
||
852 | case RS_KEY_RETURN: |
||
853 | menu_cursor_click(); |
||
854 | break; |
||
855 | case RS_KEY_ESCAPE: |
||
5310 | alpine | 856 | if (game.menu_index != MENU_PAUSE) { |
857 | menu_open(0); |
||
858 | } |
||
859 | else { |
||
860 | game.status = STATUS_PLAYING; |
||
861 | return; |
||
862 | }; |
||
5225 | alpine | 863 | break; |
864 | }; |
||
865 | |||
866 | }; |
||
867 | |||
868 | if (game.status == STATUS_PLAYING) { |
||
869 | switch (key) { |
||
870 | |||
871 | case RS_KEY_ESCAPE: |
||
872 | game.status = STATUS_MENU; |
||
5310 | alpine | 873 | menu_open(MENU_PAUSE); |
5225 | alpine | 874 | break; |
5291 | alpine | 875 | case RS_KEY_SPACE: |
5225 | alpine | 876 | |
877 | |||
5291 | alpine | 878 | //game_obj_add( game_obj( OBJ_EXPLOSION, 0, 0, 0, game.tx + 80, game.ty - 10, 0, 0.0 ) ); |
879 | |||
880 | // game_obj_add( game_obj( OBJ_ROCK, 0, 0, 32, game.tx + 80, game.ty - 10, 0, 0.0 ) ); |
||
881 | |||
5225 | alpine | 882 | break; |
883 | |||
884 | }; |
||
885 | }; |
||
886 | |||
887 | }; |
||
888 | |||
889 | void GameKeyUp(int key) { |
||
890 | |||
891 | switch (key) { |
||
892 | case RS_KEY_LEFT: |
||
893 | BIT_CLEAR(game.keyboard_state, RS_ARROW_LEFT_MASK); |
||
894 | break; |
||
895 | case RS_KEY_RIGHT: |
||
896 | BIT_CLEAR(game.keyboard_state, RS_ARROW_RIGHT_MASK); |
||
897 | break; |
||
898 | case RS_KEY_UP: |
||
899 | BIT_CLEAR(game.keyboard_state, RS_ARROW_UP_MASK); |
||
900 | break; |
||
901 | case RS_KEY_DOWN: |
||
902 | BIT_CLEAR(game.keyboard_state, RS_ARROW_DOWN_MASK); |
||
903 | break; |
||
904 | case RS_KEY_A: |
||
905 | BIT_CLEAR(game.keyboard_state, RS_ATTACK_KEY_MASK); |
||
906 | break; |
||
907 | }; |
||
908 | |||
909 | }; |
||
910 | |||
5243 | alpine | 911 | void GameMouseDown(int x, int y) { |
5291 | alpine | 912 | // game.tx = x; |
913 | // game.ty = y; |
||
5243 | alpine | 914 | DEBUG10f("Mouse Down %d, %d \n", x, y); |
915 | }; |
||
5225 | alpine | 916 | |
5243 | alpine | 917 | void GameMouseUp(int x, int y) { |
918 | // |
||
919 | }; |
||
920 | |||
921 | |||
5225 | alpine | 922 | void game_change_window_scale(int d) { |
923 | int scale = window_scale_str[3] - '0'; |
||
924 | |||
925 | unsigned int w; |
||
926 | unsigned int h; |
||
927 | rskos_get_screen_size(&w, &h); |
||
928 | |||
929 | int max_scale = (w-20)/GAME_WIDTH; |
||
930 | if ( (h-20)/GAME_HEIGHT < max_scale ) { |
||
931 | max_scale = (h-20)/GAME_HEIGHT; |
||
932 | }; |
||
933 | |||
934 | scale += d; |
||
935 | if ( scale > max_scale) { |
||
936 | scale = 1; |
||
937 | } |
||
938 | else if (scale < 1) { |
||
939 | scale = max_scale; |
||
940 | }; |
||
941 | |||
942 | game.window_scale = scale; |
||
943 | |||
944 | free(game.scaled_framebuffer); |
||
945 | game.scaled_framebuffer = malloc(GAME_WIDTH*game.window_scale * GAME_HEIGHT*game.window_scale * 3); |
||
946 | |||
947 | |||
948 | rskos_resize_window( GAME_WIDTH * scale, GAME_HEIGHT * scale ); |
||
949 | |||
950 | window_scale_str[3] = scale + '0'; |
||
5243 | alpine | 951 | |
952 | |||
953 | |||
5225 | alpine | 954 | }; |
955 | |||
956 | void game_ding(int i) { |
||
957 | |||
958 | switch (i) { |
||
959 | case 0: |
||
5302 | alpine | 960 | soundbuf_play(&game.sound_test2, 0); |
5225 | alpine | 961 | break; |
962 | case 1: |
||
5302 | alpine | 963 | soundbuf_play(&game.sound_test3, 0); |
5225 | alpine | 964 | break; |
965 | }; |
||
966 | |||
967 | };>>>>>>><>>>>>>>><>>>>>>>>>>>>>>>>>>> |