Subversion Repositories Kolibri OS

Rev

Rev 5298 | Rev 5310 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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