Subversion Repositories Kolibri OS

Rev

Rev 5315 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5315 Rev 5316
1
#include "rsgamelogic.h"
1
#include "rsgamelogic.h"
2
 
2
 
3
#include "rsgametext.h"
3
#include "rsgametext.h"
4
 
4
 
5
#include "rsgamemenu.h"
5
#include "rsgamemenu.h"
6
 
6
 
7
#include "rsgamedraw.h"
7
#include "rsgamedraw.h"
8
 
8
 
9
#include "rskos.h"
9
#include "rskos.h"
10
 
10
 
11
#include "rsgentex.h"
11
#include "rsgentex.h"
12
#include "rssoundgen.h"
12
#include "rssoundgen.h"
13
#include "rsnoise.h"
13
#include "rsnoise.h"
14
 
14
 
15
#include "rs/rsplatform.h"
15
#include "rs/rsplatform.h"
16
 
16
 
17
 
17
 
18
#ifdef RS_USE_C_LIBS // linux version
18
#ifdef RS_USE_C_LIBS // linux version
19
    #include 
19
    #include 
20
    #include  
20
    #include  
21
    #include 
21
    #include 
22
    
22
    
23
    #include "rs/rskeyboard.h"
23
    #include "rs/rskeyboard.h"
24
#endif
24
#endif
25
 
25
 
26
 
26
 
27
 
27
 
28
 
28
 
29
int next_rock_timer = 0;
29
int next_rock_timer = 0;
30
 
30
 
31
void next_stage_now() {
31
void next_stage_now() {
32
    game.stage_timer = 0;
32
    game.stage_timer = 0;
33
    game.stage++;
33
    game.stage++;
34
};
34
};
35
 
35
 
36
void next_stage_after(int t) {
36
void next_stage_after(int t) {
37
    if (game.stage_timer > t) {
37
    if (game.stage_timer > t) {
38
        next_stage_now();
38
        next_stage_now();
39
    };
39
    };
40
};
40
};
41
 
41
 
42
void next_stage_after_sec(int t) {
42
void next_stage_after_sec(int t) {
43
    next_stage_after(t*25);
43
    next_stage_after(t*25);
44
};
44
};
45
 
45
 
46
 
46
 
47
 
47
 
48
 
48
 
49
int check_collision(int obj1, int obj2) {
49
int check_collision(int obj1, int obj2) {
50
    // obj1 must be bullet 
50
    // obj1 must be bullet 
51
    // obj2 can be anything
51
    // obj2 can be anything
52
    
52
    
53
    if ( game.objs[obj1].obj_type == OBJ_BULLET ) {
53
    if ( game.objs[obj1].obj_type == OBJ_BULLET ) {
54
        
54
        
55
        if ( ( abs(game.objs[obj1].y - game.objs[obj2].y) < ( 4 + game.objs[obj2].radius ) ) 
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 ) )  ){
56
            && ( abs( (game.objs[obj1].x - 8) - game.objs[obj2].x) < ( 8 + game.objs[obj2].radius ) )  ){
57
            return 1;
57
            return 1;
58
        };
58
        };
59
        
59
        
60
    };
60
    };
61
    
61
    
62
    return 0;
62
    return 0;
63
    
63
    
64
};
64
};
65
 
65
 
66
int check_collision_with_player(int obj1) {
66
int check_collision_with_player(int obj1) {
67
    
67
    
68
    const int player_radius = 3;
68
    const int player_radius = 3;
69
    
69
    
70
    int obj_radius = game.objs[obj1].radius;
70
    int obj_radius = game.objs[obj1].radius;
71
//    if (game.objs[obj1].obj_type == OBJ_RED_BULLET) {
71
//    if (game.objs[obj1].obj_type == OBJ_RED_BULLET) {
72
//        obj_radius = 3;
72
//        obj_radius = 3;
73
//    };
73
//    };
74
    
74
    
75
//    if ( game.objs[obj1].obj_type == OBJ_RED_BULLET ) {
75
//    if ( game.objs[obj1].obj_type == OBJ_RED_BULLET ) {
76
        
76
        
77
        if ( ( abs(game.objs[obj1].y - game.player_y) < ( obj_radius + player_radius ) ) 
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 ) )  ){
78
            && ( abs( (game.objs[obj1].x ) - game.player_x) < ( obj_radius + 4 + player_radius ) )  ){
79
            return 1;
79
            return 1;
80
        };
80
        };
81
        
81
        
82
//    };
82
//    };
83
    
83
    
84
    return 0;
84
    return 0;
85
    
85
    
86
};
86
};
87
 
87
 
88
void player_hit() {
88
void player_hit() {
89
    
89
    
90
    game.health--;
90
    game.health--;
91
    game.bg_color = COLOR_DARK_RED;
91
    game.bg_color = COLOR_DARK_RED;
92
    
92
    
93
    soundbuf_play( &game.sound_hit, 0 );
93
    soundbuf_play( &game.sound_hit, 0 );
94
 
94
 
95
    
95
    
96
    if (game.health < 1) {
96
    if (game.health < 1) {
97
        game.status = STATUS_MENU;
97
        game.status = STATUS_MENU;
98
        menu_open( MENU_GAME_OVER );
98
        menu_open( MENU_GAME_OVER );
99
        
99
        
100
        level_passed_score_str[1] = '0' + (game.score / 1000) % 10;
100
        level_passed_score_str[1] = '0' + (game.score / 1000) % 10;
101
        level_passed_score_str[2] = '0' + (game.score / 100) % 10;
101
        level_passed_score_str[2] = '0' + (game.score / 100) % 10;
102
        level_passed_score_str[3] = '0' + (game.score / 10) % 10;
102
        level_passed_score_str[3] = '0' + (game.score / 10) % 10;
103
        level_passed_score_str[4] = '0' + (game.score / 1) % 10;
103
        level_passed_score_str[4] = '0' + (game.score / 1) % 10;
104
        
104
        
105
    };
105
    };
106
    
106
    
107
};
107
};
108
 
108
 
109
 
109
 
110
void GameProcess() {
110
void GameProcess() {
111
    
111
    
112
    if (game.status == STATUS_PLAYING) {
112
    if (game.status == STATUS_PLAYING) {
113
            
113
            
114
        int c_shoot_restore_delay = (6 + 2*game.stage_level);
114
        int c_shoot_restore_delay = (6 + 2*game.stage_level);
115
        int c_shoot_restore_period = (game.stage_level < 2) ? (3 + game.stage_level) : 5;
115
        int c_shoot_restore_period = (game.stage_level < 2) ? (3 + game.stage_level) : 5;
116
            
116
            
117
        // shoot
117
        // shoot
118
 
118
 
119
        if ( ( (game.shoot_keypressed) || (is_key_pressed(RS_ATTACK_KEY_MASK)) ) && (game.ammo>0) ) {
119
        if ( ( (game.shoot_keypressed) || (is_key_pressed(RS_ATTACK_KEY_MASK)) ) && (game.ammo>0) ) {
120
                
120
                
121
            game.shoot_delay ++;
121
            game.shoot_delay ++;
122
                
122
                
123
            if (game.shoot_delay > GAME_SHOOT_PERIOD) {
123
            if (game.shoot_delay > GAME_SHOOT_PERIOD) {
124
        
124
        
125
//                if (game.ammo > 0) {
125
//                if (game.ammo > 0) {
126
                    
126
                    
127
                    game.shoot_restore_delay = 0;
127
                    game.shoot_restore_delay = 0;
128
                    game.ammo--;
128
                    game.ammo--;
129
                    soundbuf_play(&game.sound_shoot, 0);
129
                    soundbuf_play(&game.sound_shoot, 0);
130
                    game_obj_add( game_obj( OBJ_BULLET, 0, 0, 0, game.player_x+5, game.player_y, 0, 0.0) );
130
                    game_obj_add( game_obj( OBJ_BULLET, 0, 0, 0, game.player_x+5, game.player_y, 0, 0.0) );
131
                    
131
                    
132
//                };
132
//                };
133
                
133
                
134
                game.shoot_delay = 1; // -= GAME_SHOOT_PERIOD;
134
                game.shoot_delay = 1; // -= GAME_SHOOT_PERIOD;
135
                
135
                
136
                
136
                
137
                
137
                
138
                game.shoot_keypressed = 0;
138
                game.shoot_keypressed = 0;
139
            
139
            
140
            };
140
            };
141
        }
141
        }
142
        else {
142
        else {
143
            
143
            
144
            if (game.ammo < GAME_AMMO_MAX) {
144
            if (game.ammo < GAME_AMMO_MAX) {
145
                game.shoot_restore_delay++;
145
                game.shoot_restore_delay++;
146
                
146
                
147
                if (game.shoot_restore_delay > c_shoot_restore_delay) {
147
                if (game.shoot_restore_delay > c_shoot_restore_delay) {
148
                        
148
                        
149
                    game.shoot_delay++;
149
                    game.shoot_delay++;
150
 
150
 
151
                    if (game.shoot_delay > c_shoot_restore_period) {
151
                    if (game.shoot_delay > c_shoot_restore_period) {
152
                        game.ammo++;
152
                        game.ammo++;
153
                        game.shoot_delay -= c_shoot_restore_period;
153
                        game.shoot_delay -= c_shoot_restore_period;
154
                    };
154
                    };
155
                    
155
                    
156
                };
156
                };
157
                
157
                
158
            };
158
            };
159
            
159
            
160
        };
160
        };
161
            
161
            
162
            
162
            
163
            
163
            
164
        
164
        
165
        int speed = 4;
165
        int speed = 4;
166
        int bullet_speed = 11;
166
        int bullet_speed = 11;
167
        int red_bullet_speed = 8;
167
        int red_bullet_speed = 8;
168
        int rock_speed = 6;
168
        int rock_speed = 6;
169
        
169
        
170
        game.player_x += speed * ( is_key_pressed(RS_ARROW_RIGHT_MASK) - is_key_pressed(RS_ARROW_LEFT_MASK) );
170
        game.player_x += speed * ( is_key_pressed(RS_ARROW_RIGHT_MASK) - is_key_pressed(RS_ARROW_LEFT_MASK) );
171
        game.player_y += speed * ( is_key_pressed(RS_ARROW_DOWN_MASK) - is_key_pressed(RS_ARROW_UP_MASK) );
171
        game.player_y += speed * ( is_key_pressed(RS_ARROW_DOWN_MASK) - is_key_pressed(RS_ARROW_UP_MASK) );
172
        
172
        
173
        game.player_x = rs_clamp_i(game.player_x, 15, GAME_WIDTH - 45);
173
        game.player_x = rs_clamp_i(game.player_x, 15, GAME_WIDTH - 45);
174
        game.player_y = rs_clamp_i(game.player_y, 15, GAME_HEIGHT - 45);
174
        game.player_y = rs_clamp_i(game.player_y, 15, GAME_HEIGHT - 45);
175
        
175
        
176
        game.tz += 1;
176
        game.tz += 1;
177
        
177
        
178
        
178
        
179
 
179
 
180
        int c_rocktimer_const = (game.stage_level < 4) ? (9 - 2*game.stage_level) : 4;
180
        int c_rocktimer_const = (game.stage_level < 4) ? (9 - 2*game.stage_level) : 4;
181
        int c_rocktimer_var = (game.stage_level < 6) ? (16 - 2*game.stage_level) : 6;
181
        int c_rocktimer_var = (game.stage_level < 6) ? (16 - 2*game.stage_level) : 6;
182
        
182
        
183
        
183
        
184
        
184
        
185
        game.stage_timer++;
185
        game.stage_timer++;
186
        
186
        
187
        if (game.stage == 0) {
187
        if (game.stage == 0) {
188
            
188
            
189
            // level start
189
            // level start
190
            
190
            
191
            next_stage_after_sec(3);
191
            next_stage_after_sec(3);
192
            
192
            
193
        }
193
        }
194
        
194
        
195
        else if (game.stage == 1) {
195
        else if (game.stage == 1) {
196
                
196
                
197
//            game.stage = 4;
197
//            game.stage = 4;
198
            
198
            
199
            // rocks
199
            // rocks
200
            next_rock_timer--;
200
            next_rock_timer--;
201
            if (next_rock_timer < 1) {
201
            if (next_rock_timer < 1) {
202
                next_rock_timer = c_rocktimer_const + rs_rand()%c_rocktimer_var;
202
                next_rock_timer = c_rocktimer_const + rs_rand()%c_rocktimer_var;
203
                //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 ) );
203
                //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 ) );
204
                
204
                
205
                int flagsin = 0;
205
                int flagsin = 0;
206
                if ( game.stage_level > 4 ) {
206
                if ( game.stage_level > 4 ) {
207
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
207
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
208
                        flagsin = OBJ_FLAG_SIN;
208
                        flagsin = OBJ_FLAG_SIN;
209
                    };
209
                    };
210
                };
210
                };
211
                
211
                
212
                game_obj_add( game_obj( OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , game.tex_rocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
212
                game_obj_add( game_obj( OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , game.tex_rocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
213
            };
213
            };
214
        
214
        
215
            next_stage_after_sec(12);
215
            next_stage_after_sec(12);
216
            
216
            
217
        }
217
        }
218
        
218
        
219
        if (game.stage == 2) {
219
        if (game.stage == 2) {
220
                
220
                
221
            BIT_SET (game.flags, GAME_FLAG_INSTRUCTIONS_PASSED);
221
            BIT_SET (game.flags, GAME_FLAG_INSTRUCTIONS_PASSED);
222
            
222
            
223
            next_stage_after_sec(4);
223
            next_stage_after_sec(4);
224
            
224
            
225
        }
225
        }
226
        
226
        
227
        else if (game.stage == 3) {
227
        else if (game.stage == 3) {
228
            
228
            
229
            // rocks
229
            // rocks
230
            next_rock_timer--;
230
            next_rock_timer--;
231
            if (next_rock_timer < 1) {
231
            if (next_rock_timer < 1) {
232
                next_rock_timer = c_rocktimer_const + 1 + rs_rand()%c_rocktimer_var;
232
                next_rock_timer = c_rocktimer_const + 1 + rs_rand()%c_rocktimer_var;
233
                //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 ) );
233
                //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 ) );
234
 
234
 
235
                int flagsin = 0;
235
                int flagsin = 0;
236
                if ( game.stage_level > 2 ) {
236
                if ( game.stage_level > 2 ) {
237
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
237
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
238
                        flagsin = OBJ_FLAG_SIN;
238
                        flagsin = OBJ_FLAG_SIN;
239
                    };
239
                    };
240
                };
240
                };
241
 
241
 
242
                game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY|flagsin, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
242
                game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY|flagsin, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) );
243
            };
243
            };
244
        
244
        
245
            next_stage_after_sec(16);
245
            next_stage_after_sec(16);
246
            
246
            
247
        }
247
        }
248
        
248
        
249
        else if (game.stage == 4) {
249
        else if (game.stage == 4) {
250
            
250
            
251
            next_stage_after_sec(4);
251
            next_stage_after_sec(4);
252
            
252
            
253
        }
253
        }
254
        
254
        
255
        else if (game.stage == 5) {
255
        else if (game.stage == 5) {
256
            
256
            
257
            // rocks
257
            // rocks
258
            next_rock_timer--;
258
            next_rock_timer--;
259
            if (next_rock_timer < 1) {
259
            if (next_rock_timer < 1) {
260
                next_rock_timer = 5;
260
                next_rock_timer = 5;
261
                //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 ) );
261
                //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 ) );
262
                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 ) );
262
                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 ) );
263
            };
263
            };
264
        
264
        
265
            next_stage_after_sec(6);
265
            next_stage_after_sec(6);
266
            
266
            
267
        }
267
        }
268
        
268
        
269
        else if (game.stage == 6) {
269
        else if (game.stage == 6) {
270
            
270
            
271
            // mix rocks
271
            // mix rocks
272
            next_rock_timer--;
272
            next_rock_timer--;
273
            if (next_rock_timer < 1) {
273
            if (next_rock_timer < 1) {
274
                next_rock_timer = c_rocktimer_const + rs_rand()%(c_rocktimer_var-3);
274
                next_rock_timer = c_rocktimer_const + rs_rand()%(c_rocktimer_var-3);
275
                
275
                
276
                int flagsin = 0;
276
                int flagsin = 0;
277
                if ( game.stage_level > 3 ) {
277
                if ( game.stage_level > 3 ) {
278
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
278
                    if ( rs_rand()%1024 < (16*game.stage_level) ) {
279
                        flagsin = OBJ_FLAG_SIN;
279
                        flagsin = OBJ_FLAG_SIN;
280
                    };
280
                    };
281
                };
281
                };
282
                
282
                
283
                //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 ) );
283
                //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 ) );
284
                game_obj_add( game_obj( rs_rand()%1024 < 768 ? OBJ_MINIROCK : OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , 
284
                game_obj_add( game_obj( rs_rand()%1024 < 768 ? OBJ_MINIROCK : OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , 
285
                                       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 ) );
285
                                       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 ) );
286
            };
286
            };
287
        
287
        
288
            next_stage_after_sec(10);
288
            next_stage_after_sec(10);
289
            
289
            
290
        }
290
        }
291
        
291
        
292
        else if (game.stage == 7) {
292
        else if (game.stage == 7) {
293
            
293
            
294
            
294
            
295
            if (game.stage_timer > 3*25) {
295
            if (game.stage_timer > 3*25) {
296
                next_stage_now();
296
                next_stage_now();
297
                
297
                
298
                BIT_CLEAR(game.flags, GAME_FLAG_BOSS_DESTROYED);
298
                BIT_CLEAR(game.flags, GAME_FLAG_BOSS_DESTROYED);
299
                
299
                
300
                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 ) );
300
                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 ) );
301
                
301
                
302
            };
302
            };
303
            
303
            
304
        }
304
        }
305
        
305
        
306
        else if (game.stage == 8) {
306
        else if (game.stage == 8) {
307
                
307
                
308
            if ( IS_BIT_SET(game.flags, GAME_FLAG_BOSS_DESTROYED) ) {
308
            if ( IS_BIT_SET(game.flags, GAME_FLAG_BOSS_DESTROYED) ) {
309
                next_stage_now();
309
                next_stage_now();
310
            };
310
            };
311
            
311
            
312
        }
312
        }
313
        
313
        
314
        else if (game.stage == 9) {
314
        else if (game.stage == 9) {
315
            next_stage_after_sec(2);
315
            next_stage_after_sec(2);
316
        }                
316
        }                
317
        else if (game.stage == 10) {
317
        else if (game.stage == 10) {
318
            
318
            
319
            /*
319
            /*
320
            game.status = STATUS_MENU;
320
            game.status = STATUS_MENU;
321
            menu_open( MENU_LEVEL_PASSED );
321
            menu_open( MENU_LEVEL_PASSED );
322
        
322
        
323
            level_passed_score_str[1] = '0' + (game.score / 100) % 10;
323
            level_passed_score_str[1] = '0' + (game.score / 100) % 10;
324
            level_passed_score_str[2] = '0' + (game.score / 10) % 10;
324
            level_passed_score_str[2] = '0' + (game.score / 10) % 10;
325
            level_passed_score_str[3] = '0' + (game.score / 1) % 10;
325
            level_passed_score_str[3] = '0' + (game.score / 1) % 10;
326
            */
326
            */
327
            
327
            
328
            game.stage_level++;
328
            game.stage_level++;
329
            
329
            
330
            game.stage = 0;
330
            game.stage = 0;
331
            game.stage_timer = 0;
331
            game.stage_timer = 0;
332
            
332
            
333
        };
333
        };
334
        
334
        
335
        
335
        
336
        
336
        
337
        
337
        
338
 
338
 
339
        int i, j;
339
        int i, j;
340
        game_obj_t *obj;
340
        game_obj_t *obj;
341
        
341
        
342
        for (i = 0; i < game.objs_count; i++) {
342
        for (i = 0; i < game.objs_count; i++) {
343
            
343
            
344
            obj = &(game.objs[i]);
344
            obj = &(game.objs[i]);
345
            
345
            
346
            if (obj->obj_type == OBJ_BULLET) {
346
            if (obj->obj_type == OBJ_BULLET) {
347
                    
347
                    
348
                obj->x += bullet_speed;
348
                obj->x += bullet_speed;
349
                if (obj->x > GAME_WIDTH) {
349
                if (obj->x > GAME_WIDTH) {
350
                    // destroy object
350
                    // destroy object
351
                    game_obj_remove(i);
351
                    game_obj_remove(i);
352
                    i--;
352
                    i--;
353
                    continue;
353
                    continue;
354
                };
354
                };
355
                
355
                
356
                for (j = 0; j < game.objs_count; j++) {
356
                for (j = 0; j < game.objs_count; j++) {
357
                    if (IS_BIT_SET(game.objs[j].flags, OBJ_FLAG_ENEMY)) {
357
                    if (IS_BIT_SET(game.objs[j].flags, OBJ_FLAG_ENEMY)) {
358
                        if (check_collision(i, j)) {
358
                        if (check_collision(i, j)) {
359
                            if (IS_BIT_SET( game.objs[j].flags, OBJ_FLAG_BOSS)) {
359
                            if (IS_BIT_SET( game.objs[j].flags, OBJ_FLAG_BOSS)) {
360
                                game.objs[j].tag--;
360
                                game.objs[j].tag--;
361
                                if (game.objs[j].tag < 1) {
361
                                if (game.objs[j].tag < 1) {
362
                                    BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
362
                                    BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
363
                                    BIT_SET( game.flags, GAME_FLAG_BOSS_DESTROYED );
363
                                    BIT_SET( game.flags, GAME_FLAG_BOSS_DESTROYED );
364
                                    game.score += 50;
364
                                    game.score += 50;
365
                                };
365
                                };
366
                            }
366
                            }
367
                            else {
367
                            else {
368
                                BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
368
                                BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED );
369
                                game.score += game.objs[j].obj_type == OBJ_ROCK ? 2 : 3;
369
                                game.score += game.objs[j].obj_type == OBJ_ROCK ? 2 : 3;
370
                            };
370
                            };
371
                            game_obj_remove(i); 
371
                            game_obj_remove(i); 
372
                            i--;
372
                            i--;
373
                            break; // continue parent loop
373
                            break; // continue parent loop
374
                        };
374
                        };
375
                    };
375
                    };
376
                };
376
                };
377
                
377
                
378
            }
378
            }
379
            
379
            
380
            else if (obj->obj_type == OBJ_RED_BULLET) {
380
            else if (obj->obj_type == OBJ_RED_BULLET) {
381
                
381
                
382
                obj->x -= red_bullet_speed;
382
                obj->x -= red_bullet_speed;
383
                if (obj->x < 4) {
383
                if (obj->x < 4) {
384
                    // destroy object
384
                    // destroy object
385
                    game_obj_remove(i);
385
                    game_obj_remove(i);
386
                    i--;
386
                    i--;
387
                    continue;
387
                    continue;
388
                };
388
                };
389
                
389
                
390
                if (check_collision_with_player(i)) {
390
                if (check_collision_with_player(i)) {
391
                    player_hit();
391
                    player_hit();
392
                    game_obj_remove(i);
392
                    game_obj_remove(i);
393
                    i--;
393
                    i--;
394
                    continue;
394
                    continue;
395
                };
395
                };
396
                
396
                
397
            }
397
            }
398
            
398
            
399
            else if (obj->obj_type == OBJ_EXPLOSION) {
399
            else if (obj->obj_type == OBJ_EXPLOSION) {
400
                
400
                
401
                obj->t++;
401
                obj->t++;
402
                if (obj->t >= EXPLOSIONS_COUNT) {
402
                if (obj->t >= EXPLOSIONS_COUNT) {
403
                    game_obj_remove(i);
403
                    game_obj_remove(i);
404
                    i--;
404
                    i--;
405
                    continue;
405
                    continue;
406
                };
406
                };
407
                
407
                
408
            }
408
            }
-
 
409
            
-
 
410
            else if (obj->obj_type == OBJ_HUGE_EXPLOSION) {
-
 
411
                
-
 
412
                obj->t++;
-
 
413
                if (obj->t >= HUGE_EXPLOSIONS_COUNT) {
-
 
414
                    game_obj_remove(i);
-
 
415
                    i--;
-
 
416
                    continue;
-
 
417
                };
-
 
418
                
-
 
419
            }
-
 
420
            
409
            else if ( (obj->obj_type == OBJ_ROCK) || (obj->obj_type == OBJ_MINIROCK) ) {
421
            else if ( (obj->obj_type == OBJ_ROCK) || (obj->obj_type == OBJ_MINIROCK) ) {
410
                
422
                
411
                obj->x -= rock_speed;
423
                obj->x -= rock_speed;
412
                if (obj->x < - obj->radius * 2) {
424
                if (obj->x < - obj->radius * 2) {
413
                    game_obj_remove(i);
425
                    game_obj_remove(i);
414
                    i--;
426
                    i--;
415
                    continue;
427
                    continue;
416
                };
428
                };
417
                
429
                
418
                if ( IS_BIT_SET(obj->flags, OBJ_FLAG_SIN) ) {
430
                if ( IS_BIT_SET(obj->flags, OBJ_FLAG_SIN) ) {
419
                    obj->f += 0.2;
431
                    obj->f += 0.2;
420
                    obj->y += 7.0 * sin(obj->f);
432
                    obj->y += 7.0 * sin(obj->f);
421
                };
433
                };
422
                
434
                
423
                if ( check_collision_with_player(i) ) {
435
                if ( check_collision_with_player(i) ) {
424
                    player_hit();
436
                    player_hit();
425
                    game_obj_remove(i);
437
                    game_obj_remove(i);
426
                    i--;
438
                    i--;
427
                    continue;
439
                    continue;
428
                };
440
                };
429
                
441
                
430
            }
442
            }
431
            else if ( obj->obj_type == OBJ_TURRET ) {
443
            else if ( obj->obj_type == OBJ_TURRET ) {
432
                
444
                
433
                if (obj->x > GAME_WIDTH*3/4) {
445
                if (obj->x > GAME_WIDTH*3/4) {
434
                    obj->x -= 2;
446
                    obj->x -= 2;
435
                }
447
                }
436
                else {
448
                else {
437
                    obj->f += 0.03;
449
                    obj->f += 0.03;
438
                    obj->y = GAME_HEIGHT * ( 0.5 + 0.3*sin(obj->f) );
450
                    obj->y = GAME_HEIGHT * ( 0.5 + 0.3*sin(obj->f) );
439
                };
451
                };
440
                
452
                
441
                if ( obj->x < GAME_WIDTH*4/5 ) {
453
                if ( obj->x < GAME_WIDTH*4/5 ) {
442
                    // turret shoot
454
                    // turret shoot
443
                    obj->t--;
455
                    obj->t--;
444
                    if (obj->t < 1) {
456
                    if (obj->t < 1) {
445
                        soundbuf_play(&game.sound_turret_shoot, 0);
457
                        soundbuf_play(&game.sound_turret_shoot, 0);
446
                        game_obj_add( game_obj( OBJ_RED_BULLET, 0, 0, 3, obj->x - 30, obj->y, 0, 0) );
458
                        game_obj_add( game_obj( OBJ_RED_BULLET, 0, 0, 3, obj->x - 5, obj->y, 0, 0) );
447
                        
459
                        
448
                        int c_const = (game.stage_level < 4) ? (10 - 2*game.stage_level) : 3;
460
                        int c_const = (game.stage_level < 4) ? (10 - 2*game.stage_level) : 3;
449
                        int c_var = (game.stage_level < 6) ? (20 - 3*game.stage_level) : 3;
461
                        int c_var = (game.stage_level < 6) ? (20 - 3*game.stage_level) : 3;
450
                        
462
                        
451
                        obj->t = c_const + rs_rand() % c_var;
463
                        obj->t = c_const + rs_rand() % c_var;
452
                        
464
                        
453
                        if ( (rs_rand()%1024) < 80 ) {
465
                        if ( (rs_rand()%1024) < 80 ) {
454
                            obj->t += 18;
466
                            obj->t += 18;
455
                        };
467
                        };
456
                        
468
                        
457
                    };
469
                    };
458
                };
470
                };
459
                
471
                
460
            };
472
            };
461
            
473
            
462
        };
474
        };
463
        
475
        
464
        
476
        
465
        
477
        
466
        for (i = 0; i < game.objs_count; i++) {
478
        for (i = 0; i < game.objs_count; i++) {
467
            if ( IS_BIT_SET( game.objs[i].flags, OBJ_FLAG_DESTROYED ) ) {
479
            if ( IS_BIT_SET( game.objs[i].flags, OBJ_FLAG_DESTROYED ) ) {
-
 
480
                    
-
 
481
                if (game.objs[i].obj_type == OBJ_TURRET) {
-
 
482
                    soundbuf_play( &game.sound_huge_explosion, 0 );
-
 
483
                    game_obj_add( game_obj( OBJ_HUGE_EXPLOSION, 0, 0, HUGE_EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) );
-
 
484
                }
-
 
485
                else {
468
                soundbuf_play( &game.sound_explosions[ rs_rand() % SOUND_EXPLOSIONS_COUNT ], 0 );
486
                    soundbuf_play( &game.sound_explosions[ rs_rand() % SOUND_EXPLOSIONS_COUNT ], 0 );
469
                game_obj_add( game_obj( OBJ_EXPLOSION, 0, 0, EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) );
487
                    game_obj_add( game_obj( OBJ_EXPLOSION, 0, 0, EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) );
-
 
488
                };
470
                game_obj_remove(i);
489
                game_obj_remove(i);
471
                i--;
490
                i--;
472
                
491
                
473
            };
492
            };
474
        };
493
        };
475
        
494
        
476
 
495
 
477
 
496
 
478
    };
497
    };
479
 
498
 
480
    game_draw();
499
    game_draw();
481
    
500
    
482
    if ( (game.status == STATUS_MENU) && (game.menu_index != MENU_PAUSE) ) {
501
    if ( (game.status == STATUS_MENU) && (game.menu_index != MENU_PAUSE) ) {
483
        soundbuf_loop_check( &game.sound_music );
502
        soundbuf_loop_check( &game.sound_music );
484
    };
503
    };
485
 
504
 
486
}
505
}