Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5293 alpine 1
#include "rsgamelogic.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
 
27
 
28
 
29
int next_rock_timer = 0;
30
 
31
void next_stage_now() {
32
    game.stage_timer = 0;
33
    game.stage++;
34
};
35
 
36
void next_stage_after(int t) {
37
    if (game.stage_timer > t) {
38
        next_stage_now();
39
    };
40
};
41
 
42
void next_stage_after_sec(int t) {
43
    next_stage_after(t*25);
44
};
45
 
46
 
47
 
48
 
49
int check_collision(int obj1, int obj2) {
50
    // obj1 must be bullet
51
    // obj2 can be anything
52
 
53
    if ( game.objs[obj1].obj_type == OBJ_BULLET ) {
54
 
55
        if ( ( abs(game.objs[obj1].y - game.objs[obj2].y) < ( 4 + game.objs[obj2].radius ) )
56
            && ( abs( (game.objs[obj1].x - 8) - game.objs[obj2].x) < ( 8 + game.objs[obj2].radius ) )  ){
57
            return 1;
58
        };
59
 
60
    };
61
 
62
    return 0;
63
 
64
};
65
 
66
int check_collision_with_player(int obj1) {
67
 
68
    const int player_radius = 3;
69
 
70
    int obj_radius = game.objs[obj1].radius;
71
//    if (game.objs[obj1].obj_type == OBJ_RED_BULLET) {
72
//        obj_radius = 3;
73
//    };
74
 
75
//    if ( game.objs[obj1].obj_type == OBJ_RED_BULLET ) {
76
 
77
        if ( ( abs(game.objs[obj1].y - game.player_y) < ( obj_radius + player_radius ) )
78
            && ( abs( (game.objs[obj1].x ) - game.player_x) < ( obj_radius + 4 + player_radius ) )  ){
79
            return 1;
80
        };
81
 
82
//    };
83
 
84
    return 0;
85
 
86
};
87
 
88
void player_hit() {
89
 
90
    game.health--;
5298 alpine 91
    game.bg_color = COLOR_DARK_RED;
92
 
93
    soundbuf_play( &game.sound_hit );
5293 alpine 94
 
95
 
96
    if (game.health < 1) {
97
        game.status = STATUS_MENU;
98
        menu_open( MENU_GAME_OVER );
99
    };
100
 
101
};
102
 
103
 
104
void GameProcess() {
105
 
106
    if (game.status == STATUS_PLAYING) {
107
 
108
        // shoot
109
 
110
        if ( ( (game.shoot_keypressed) || (is_key_pressed(RS_ATTACK_KEY_MASK)) ) && (game.ammo>0) ) {
111
 
112
            game.shoot_delay ++;
113
 
114
            if (game.shoot_delay > GAME_SHOOT_PERIOD) {
115
 
116
//                if (game.ammo > 0) {
117
 
118
                    game.shoot_restore_delay = 0;
119
                    game.ammo--;
120
                    soundbuf_play(&game.sound_test1);
121
                    game_obj_add( game_obj( OBJ_BULLET, 0, 0, 0, game.player_x+5, game.player_y, 0, 0.0) );
122
 
123
//                };
124
 
125
                game.shoot_delay -= GAME_SHOOT_PERIOD;
126
                game.shoot_keypressed = 0;
127
 
128
            };
129
        }
130
        else {
131
 
132
            if (game.ammo < GAME_AMMO_MAX) {
133
                game.shoot_restore_delay++;
134
 
135
                if (game.shoot_restore_delay > GAME_SHOOT_PERIOD * 2) {
136
 
137
                    game.shoot_delay++;
138
 
139
                    if (game.shoot_delay > GAME_SHOOT_PERIOD) {
140
                        game.ammo++;
141
                        game.shoot_delay -= GAME_SHOOT_PERIOD;
142
                    };
143
 
144
                };
145
 
146
            };
147
 
148
        };
149
 
150
 
151
 
152
 
153
        int speed = 4;
154
        int bullet_speed = 11;
155
        int red_bullet_speed = 8;
156
        int rock_speed = 6;
157
 
158
        game.player_x += speed * ( is_key_pressed(RS_ARROW_RIGHT_MASK) - is_key_pressed(RS_ARROW_LEFT_MASK) );
159
        game.player_y += speed * ( is_key_pressed(RS_ARROW_DOWN_MASK) - is_key_pressed(RS_ARROW_UP_MASK) );
160
 
161
        game.player_x = rs_clamp_i(game.player_x, 5, GAME_WIDTH-25);
162
        game.player_y = rs_clamp_i(game.player_y, 5, GAME_HEIGHT - 25);
163
 
164
        game.tz += 1;
165
 
166
 
167
 
168
 
169
 
170
 
171
        game.stage_timer++;
172
 
173
        if (game.stage == 0) {
174
 
175
            // level start
176
 
177
            next_stage_after_sec(3);
178
 
179
        }
180
 
181
        else if (game.stage == 1) {
182
 
183
//            game.stage = 4;
184
 
185
            // rocks
186
            next_rock_timer--;
187
            if (next_rock_timer < 1) {
188
                next_rock_timer = 9 + rs_rand()%16;
189
                //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) );
190
                game_obj_add( game_obj( OBJ_ROCK, OBJ_FLAG_ENEMY, rs_rand() % ROCKS_COUNT , game.tex_rocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
191
            };
192
 
193
            next_stage_after_sec(12);
194
 
195
        }
196
 
197
        if (game.stage == 2) {
198
 
199
            next_stage_after_sec(4);
200
 
201
        }
202
 
203
        else if (game.stage == 3) {
204
 
205
            // rocks
206
            next_rock_timer--;
207
            if (next_rock_timer < 1) {
208
                next_rock_timer = 10 + rs_rand()%16;
209
                //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) );
210
                game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
211
            };
212
 
213
            next_stage_after_sec(16);
214
 
215
        }
216
 
217
        else if (game.stage == 4) {
218
 
219
            next_stage_after_sec(4);
220
 
221
        }
222
 
223
        else if (game.stage == 5) {
224
 
225
            // rocks
226
            next_rock_timer--;
227
            if (next_rock_timer < 1) {
228
                next_rock_timer = 5;
229
                //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) );
230
                game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY | OBJ_FLAG_SIN, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, GAME_HEIGHT/8, 0, 0.0 ) );
231
            };
232
 
233
            next_stage_after_sec(6);
234
 
235
        }
236
 
237
        else if (game.stage == 6) {
238
 
239
            // mix rocks
240
            next_rock_timer--;
241
            if (next_rock_timer < 1) {
242
                next_rock_timer = 9 + rs_rand()%12;
243
                //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) );
244
                game_obj_add( game_obj( rs_rand()%1024 < 768 ? OBJ_MINIROCK : OBJ_ROCK, OBJ_FLAG_ENEMY, rs_rand() % ROCKS_COUNT ,
245
                                       rs_rand()%1024 < 768 ? game.tex_minirocks[0].w/2 : game.tex_rocks[0].w/2, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
246
            };
247
 
248
            next_stage_after_sec(10);
249
 
250
        }
251
 
252
        else if (game.stage == 7) {
253
 
254
 
255
            if (game.stage_timer > 3*25) {
256
                next_stage_now();
257
 
258
                game_obj_add( game_obj( OBJ_TURRET, OBJ_FLAG_ENEMY | OBJ_FLAG_BOSS, 60, game.tex_rocks[0].w/2, GAME_WIDTH+60, GAME_HEIGHT/2, 0, 0.0 ) );
259
 
260
            };
261
 
262
        }
263
 
264
        else if (game.stage == 8) {
265
 
266
            if ( IS_BIT_SET(game.flags, GAME_FLAG_BOSS_DESTROYED) ) {
267
                next_stage_now();
268
            };
269
 
270
        }
271
 
272
        else if (game.stage == 9) {
273
            next_stage_after_sec(2);
274
        }
275
        else if (game.stage == 10) {
276
 
277
            game.status = STATUS_MENU;
278
            menu_open( MENU_LEVEL_PASSED );
279
 
280
            level_passed_score_str[1] = '0' + (game.score / 100) % 10;
281
            level_passed_score_str[2] = '0' + (game.score / 10) % 10;
282
            level_passed_score_str[3] = '0' + (game.score / 1) % 10;
283
 
284
        };
285
 
286
 
287
 
288
 
289
 
290
        int i, j;
291
        game_obj_t *obj;
292
 
293
        for (i = 0; i < game.objs_count; i++) {
294
 
295
            obj = &(game.objs[i]);
296
 
297
            if (obj->obj_type == OBJ_BULLET) {
298
 
299
                obj->x += bullet_speed;
300
                if (obj->x > GAME_WIDTH) {
301
                    // destroy object
302
                    game_obj_remove(i);
303
                    i--;
304
                    continue;
305
                };
306
 
307
                for (j = 0; j < game.objs_count; j++) {
308
                    if (IS_BIT_SET(game.objs[j].flags, OBJ_FLAG_ENEMY)) {
309
                        if (check_collision(i, j)) {
310
                            if (IS_BIT_SET( game.objs[j].flags, OBJ_FLAG_BOSS)) {
311
                                game.objs[j].tag--;
312
                                if (game.objs[j].tag < 1) {
313
                                    BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
314
                                    BIT_SET( game.flags, GAME_FLAG_BOSS_DESTROYED );
315
                                    game.score += 50;
316
                                };
317
                            }
318
                            else {
319
                                BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
320
                                game.score += game.objs[j].obj_type == OBJ_ROCK ? 2 : 3;
321
                            };
322
                            game_obj_remove(i);
323
                            i--;
324
                            break; // continue parent loop
325
                        };
326
                    };
327
                };
328
 
329
            }
330
 
331
            else if (obj->obj_type == OBJ_RED_BULLET) {
332
 
333
                obj->x -= red_bullet_speed;
334
                if (obj->x < 4) {
335
                    // destroy object
336
                    game_obj_remove(i);
337
                    i--;
338
                    continue;
339
                };
340
 
341
                if (check_collision_with_player(i)) {
342
                    player_hit();
343
                    game_obj_remove(i);
344
                    i--;
345
                    continue;
346
                };
347
 
348
            }
349
 
350
            else if (obj->obj_type == OBJ_EXPLOSION) {
351
 
352
                obj->t++;
353
                if (obj->t >= EXPLOSIONS_COUNT) {
354
                    game_obj_remove(i);
355
                    i--;
356
                    continue;
357
                };
358
 
359
            }
360
            else if ( (obj->obj_type == OBJ_ROCK) || (obj->obj_type == OBJ_MINIROCK) ) {
361
 
362
                obj->x -= rock_speed;
363
                if (obj->x < - obj->radius * 2) {
364
                    game_obj_remove(i);
365
                    i--;
366
                    continue;
367
                };
368
 
369
                if ( IS_BIT_SET(obj->flags, OBJ_FLAG_SIN) ) {
370
                    obj->f += 0.2;
371
                    obj->y += 7.0 * sin(obj->f);
372
                };
373
 
374
                if ( check_collision_with_player(i) ) {
375
                    player_hit();
376
                    game_obj_remove(i);
377
                    i--;
378
                    continue;
379
                };
380
 
381
            }
382
            else if ( obj->obj_type == OBJ_TURRET ) {
383
 
384
                if (obj->x > GAME_WIDTH*3/4) {
385
                    obj->x -= 2;
386
                }
387
                else {
388
                    obj->f += 0.03;
389
                    obj->y = GAME_HEIGHT * ( 0.5 + 0.3*sin(obj->f) );
390
                };
391
 
392
                obj->t--;
393
                if (obj->t < 1) {
394
                    game_obj_add( game_obj( OBJ_RED_BULLET, 0, 0, 3, obj->x - 30, obj->y, 0, 0) );
395
                    obj->t = 10 + rs_rand() % 20;
396
                };
397
 
398
            };
399
 
400
        };
401
 
402
 
403
 
404
        for (i = 0; i < game.objs_count; i++) {
405
            if ( IS_BIT_SET( game.objs[i].flags, OBJ_FLAG_DESTROYED ) ) {
5298 alpine 406
                soundbuf_play( &game.sound_explosions[ rs_rand() % SOUND_EXPLOSIONS_COUNT ] );
5293 alpine 407
                game_obj_add( game_obj( OBJ_EXPLOSION, 0, 0, EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) );
408
                game_obj_remove(i);
409
                i--;
410
 
411
            };
412
        };
413
 
414
 
415
 
416
    };
417
 
418
    game_draw();
419
 
420
}
421