Subversion Repositories NedoOS

Rev

Rev 956 | Rev 960 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. #ifndef GAMELOOPC
  2. #define GAMELOOPC
  3. //#include "sprite_pool.c"
  4. //#include "engine.c"
  5. //#include <evo.h>
  6. //#include "dialogs.c"
  7. #include "bytecode.h"
  8. #include "level1.c"
  9. #include "level3.c"
  10. #include "level4.c"
  11. #include "interpreter.c"
  12.  
  13. #define LEFT KEY_5
  14. #define RIGHT KEY_8
  15. #define DOWN KEY_6
  16. #define UP KEY_7
  17. #define FIRE KEY_SPACE
  18.  
  19. static u8 i, j;
  20. static void init_level(u8 pal, char *fn);
  21.  
  22. void game_loop();
  23.  
  24. static void start_level(u8 pal, char *fn, u8 *name)
  25. {
  26.     u8 c;
  27.     music_stop();
  28.     player.y = STARTY/*321*/;
  29.     flush_sprites();
  30.     init_text();
  31.     swap_screen();
  32.     text_y = 24/*29*/;
  33.     text_x = 20;
  34.     put_str("Girls are praying...");
  35.  
  36.     text_y = 10;
  37.     text_x = 3;
  38.     put_str("Lives: ");
  39.     put_num(hp);
  40.     text_y = 11;
  41.     text_x = 3;
  42.     put_str("Score: ");
  43.     put_num(score);
  44.  
  45.     text_y = 2;
  46.     text_x = 20 - strlen(name) / 2;
  47.     put_slow_str(name);
  48.  
  49.     text_x = 10;
  50.     text_y = 5;
  51.     draw_face(REIMU_FACE);
  52.     text_y--;
  53.     text_x += 5;
  54. //swap_screen();
  55.  
  56.     for (c = 0; c < 50; c++)
  57.         swap_screen();
  58. //swap_screen();
  59.     draw_face(MARISA_FACE);
  60. //swap_screen();
  61.     text_y--;
  62.     text_x += 5;
  63.     for (c = 0; c < 50; c++)
  64.         swap_screen();
  65. //swap_screen();
  66.     draw_face(CIRNO_FACE);
  67. //swap_screen();
  68.     for (c = 0; c < 100; c++)
  69.         swap_screen();
  70.     //init_level(image);
  71. init_level(pal, fn);
  72. }
  73.  
  74. static void init_level(u8 pal, char *fn)
  75. {
  76.     pal_bright(BRIGHT_MIN);
  77. preparescroll(fn);
  78. /*    if (image == IMG256_BG8)
  79.         unpack_pal256(PAL256_BG8, 0);
  80.     else
  81.         unpack_pal256(PAL256_BG1, 0);*/
  82. unpack_pal256(pal, 0);
  83.  
  84.     //unpack_pal16(PAL16_SPRITES, 15, 0);
  85.     //draw_image_g256(0, 0, image);
  86. scroll(0, 0);
  87. drawscroll();
  88.     pal_bright(BRIGHT_MID);
  89.     player.x = 120;
  90.     player.y = 168;
  91.     flush_sprites();
  92.     swap_screen();
  93.     scroll_pos = 0;
  94.     hor_scroll_pos = 0;
  95.     hor_scroll_speed = 0;
  96.     level_loop = 0;
  97.     schedule = 0;
  98.     add_cnt = 0;
  99. sprites_start();
  100. }
  101.  
  102.  
  103.  
  104. void start_game_loop()
  105. {
  106.     int i;
  107.     hp = 3;
  108.     score = 0;
  109.  
  110.     process_level = process_level1;
  111.     //process_level = process_level2;
  112.     scroll_pos = 0;
  113.     bullet_sprite = DEFAULT_BULLET;
  114.     //start_level(IMG256_BG1, "Day before festival");
  115. start_level(PAL256_BG1, "bg1-16.bmp", "Day before festival");
  116.     init_vm(level1_bytecode);
  117.     //init_vm(level2_bc);
  118.     music_play(MUS_TH0EA1);
  119.     sprites_start();
  120.     immortality = 20;
  121.     game_loop();
  122. }
  123.  
  124. static void player_control()
  125. {
  126.     if (keys[LEFT])
  127.         player.x -= 4;
  128.     if (keys[RIGHT])
  129.         player.x += 4;
  130.     if (keys[UP])
  131.         player.y -= 4;
  132.     if (keys[DOWN])
  133.         player.y += 4;
  134.     if (keys[FIRE])
  135.         user_fire();
  136.  
  137.     if (player.x < MIN_X_RES/*0*/)
  138.         player.x = MIN_X_RES/*0*/;
  139.     if (player.x > MAX_X_RES/*300*/)
  140.         player.x = MAX_X_RES/*300*/;
  141.     if (player.y < MIN_Y_RES/*0*/)
  142.         player.y = MIN_Y_RES/*0*/;
  143.     if (player.y > MAX_Y_RES - 32)
  144.         player.y = MAX_Y_RES - 32;
  145. }
  146.  
  147. static void bg_scroll()
  148. {
  149.     scroll_pos -= scroll_speed;
  150.     scroll_pos &= 511;
  151.     hor_scroll_pos += hor_scroll_speed;
  152.     hor_scroll_pos &= 511;
  153.  
  154.     scroll(hor_scroll_pos, scroll_pos);
  155. }
  156.  
  157. static void process_events()
  158. {
  159.     if ((schedule & 7) == 0)
  160.     {
  161.         level_loop++;
  162.         process_level();
  163.         if (immortality)
  164.         {
  165.             immortality--;
  166.         }
  167.     }
  168. }
  169.  
  170. static void player_collisions()
  171. {
  172.     static MovableSprite *b;
  173.     if (!immortality && is_player_collide())
  174.     {
  175.         immortality = 20;
  176.         player.x = 160;
  177.         player.y = 168;
  178.         cards = 3;
  179.         hp--;
  180.         sfx_play(1, 0);
  181.         for (push_counter = 0; push_counter < BULLETS_count; push_counter++)
  182.             bullets[push_counter].dy = 10;
  183.     }
  184.     b = is_player_collide_with_pups();
  185.     if (b)
  186.     {
  187.         switch (b->tile)
  188.         {
  189.         case BONUS_CARD:
  190.             if (cards < MY_BULLETS_max)
  191.                 cards++;
  192.             break;
  193.         case HEALTH_CARD:
  194.             hp++;
  195.             break;
  196.         default:
  197.             break;
  198.         }
  199.     }
  200. }
  201.  
  202. void game_loop()
  203. {
  204.     scroll_speed = 1;
  205.     immortality = 10;
  206.     while (state == STATE_PLAY)
  207.     {
  208.         schedule++;
  209.  
  210.         if ((schedule & 3) == 0)
  211.             anim_frame++;
  212.         anim_frame &= 3;
  213.  
  214.         player.tile = (immortality & 1) ? 2560 : 0;
  215.         if (schedule & 1)
  216.         {
  217.             keyboard(keys);
  218.             player_control();
  219.             player_collisions();
  220.         }
  221.         else
  222.         {
  223.             enemy_collision();
  224.             process_events();
  225.         }
  226.         if (hp < 1)
  227.         {
  228.             state = STATE_GAMEOVER;
  229.         }
  230. begin_set_sprites();
  231.         update_sprites(schedule & 1);
  232.         //update_sprites(0);
  233.         //update_sprites(1);
  234.         if ((schedule & 3) == 0)
  235.             bg_scroll();
  236.         //swap_screen();
  237.    
  238. if (schedule & 1) {
  239. end_set_sprites();
  240. drawscroll();
  241. swap_screen_scroll();
  242. }
  243.     }
  244. }
  245.  
  246. #endif