Subversion Repositories Kolibri OS

Rev

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