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