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 |