Subversion Repositories Kolibri OS

Rev

Rev 5293 | Rev 5302 | 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 );
  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 ) ) {
  406.                 soundbuf_play( &game.sound_explosions[ rs_rand() % SOUND_EXPLOSIONS_COUNT ] );
  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.  
  422.  
  423.  
  424.