Subversion Repositories Kolibri OS

Rev

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
};