Subversion Repositories NedoOS

Rev

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

  1. #ifndef LEVEL4_C
  2. #define LEVEL4_C
  3. #include "gameloop.c"
  4. #include "level_fragments.h"
  5. #include "engine.c"
  6. #include "resources.h"
  7. #include "dialogs.c"
  8. #include "gameloop.c"
  9. #include "sprite_pool.c"
  10. u8 l4s = 0;
  11.  
  12. //static void init_level(u8 image);
  13. //static void start_level(u8 image, u8 *name);
  14. static void init_level(u8 pal, char *fn);
  15. static void start_level(u8 pal, char *fn, u8 *name);
  16.  
  17. void process_level4();
  18.  
  19. const u8 level4[] = {
  20.     MakeCaravan(60, EYE, 1, 20, BONUS_CARD),
  21.     Nop(10),
  22.     MakeLeftFlyers(100, BAT, 5, 0),
  23.     AimedCircle(FIREBALL, 10, 2),
  24.     MakeRightFlyers(150, BAT, 5, 0),
  25.     AimedCircle(FIREBALL, 10, 2),
  26.     MakeLeftFlyers(180, BAT, 5, 0),
  27.     AimedCircle(FIREBALL, 10, 2),
  28.     MakeRightFlyers(50, BAT, 5, 0),
  29.     AimedCircle(FIREBALL, 10, 2),
  30.     Nop(20),
  31.     MakeShootingStar(160, 80, ICEBALL, 10, 30),
  32.     Nop(10),
  33.     MakeCorridor(GHOST, 41, 10, BONUS_CARD),
  34.     Nop(10),
  35.     AimedSideEnemies(KNIFE_LEFT, 10, 10),
  36.     Nop(5),
  37.     Triangle(EYE, 30, HEALTH_CARD),
  38.     Nop(4),
  39.     MakeEnemyWave(BAT, 10, 20),
  40.     MakeBoomFairy(50, 50, HEALTH_CARD),
  41.     Nop(10),
  42.     PushNpc(30, -20, 1, 1, EYE, 33, 15, 0),
  43.     PushNpc(280, -20, -1, 1, EYE, 33, 15, 0),
  44.     PushNpc(62, -20, 1, 1, EYE, 33, 15, 0),
  45.     PushNpc(218, -20, -1, 1, EYE, 33, 15, 0),
  46.     PushNpc(160, -20, -1, 1, EYE, 33, 15, 0),
  47.     AimedShoot(33, 10),
  48.     SetNpcSpeed(33, 0, 5),
  49.     Nop(20),
  50.     MakeEnemiesPair(BAT, 3, 30),
  51.     MakeCaravan(20, EYE, 30, 40, HEALTH_CARD),
  52.     Nop(10),
  53.     MakeShootingStar(70, 60, FIREBALL, 20, 20),
  54.     MakeShootingStar(250, 80, ICEBALL, 20, 20),
  55.     AimedCircle(FIREBALL, 10, 10),
  56.     MidBoss2(EYE, 100),
  57.     Nop(10),
  58.     DroppedEnemy(30, FIREBALL, 10),
  59.     DroppedEnemy(230, FIREBALL, 10),
  60.     DroppedEnemy(130, FIREBALL, 10),
  61.     Nop(10),
  62.     DroppedEnemy(50, FIREBALL, 10),
  63.     DroppedEnemy(80, FIREBALL, 10),
  64.     DroppedEnemy(180, FIREBALL, 10),
  65.     Nop(10),
  66.     DroppedEnemy(3, FIREBALL, 10),
  67.     DroppedEnemy(74, FIREBALL, 10),
  68.     DroppedEnemy(32, FIREBALL, 10),
  69.     Nop(10),
  70.     DroppedEnemy(210, FIREBALL, 10),
  71.     DroppedEnemy(11, FIREBALL, 10),
  72.     DroppedEnemy(63, FIREBALL, 10),
  73.     Nop(10),
  74.     TriangleHalf(1, EYE, 30, BONUS_CARD),
  75.     Nop(10),
  76.     MakeEnemyWave(GHOST, 30, 30),
  77.     Nop(16),
  78.     PushNpc(160, -20, 0, 1, FLANDRE, BOSS_TYPE, 2000, 0),
  79.     Nop(15),
  80.     End
  81. };
  82.  
  83. const u8 level4_2[] = {
  84.     MakeCaravan(32, BOOK, 1, 10, BONUS_CARD),
  85.     Nop(10),
  86.     MakeBoomFairy(100, 30, HEALTH_CARD),
  87.     Nop(10),
  88.     Triangle(BAT, 30, 0),
  89.     MakeLeftFlyers(120, BOOK, 20, BONUS_CARD),
  90.     JustStar(160, 120, 5),
  91.     MakeRightFlyers(40, BOOK, 20, BONUS_CARD),
  92.     Nop(10),
  93.     MakeShootingStar(70, 70, FIREBALL, 44, 20),
  94.     MakeShootingStar(180, 90, ICEBALL, 33, 20),
  95.     JustStar(160,120, 5),
  96.     Nop(20),
  97.     DroppedEnemy(30, BOOK, 10),
  98.     DroppedEnemy(230, BOOK, 10),
  99.     DroppedEnemy(130, BOOK, 10),
  100.     AimedCircle(FIREBALL, 5, 1),
  101.     Nop(10),
  102.     DroppedEnemy(50, BOOK, 10),
  103.     DroppedEnemy(80, BOOK, 10),
  104.     DroppedEnemy(180, BOOK, 10),
  105.     DroppedEnemy(3, BOOK, 10),
  106.     AimedCircle(FIREBALL, 5, 1),
  107.     Nop(10),
  108.     DroppedEnemy(74, BOOK, 10),
  109.     DroppedEnemy(32, BOOK, 10),
  110.     AimedCircle(FIREBALL, 5, 1),
  111.     DroppedEnemy(210, BOOK, 10),
  112.     DroppedEnemy(11, BOOK, 10),
  113.     Nop(5),
  114.     AimedCircle(FIREBALL, 5, 1),
  115.     Nop(10),
  116.     DroppedEnemy(63, BOOK, 10),
  117.     Nop(10),
  118.     AimedSideEnemies(KNIFE_LEFT, 1, 10),
  119.     Nop(10),
  120.     MakeEnemyWave(BOOK, 20, 10),
  121.     Nop(10),
  122.     MakeEnemiesPair(EYE, 99, 30),
  123.     Nop(5),
  124.     TriangleHalf(1, EYE, 30, BONUS_CARD),
  125.     Nop(10),
  126.     DroppedEnemy(30, FIREBALL, 10),
  127.     DroppedEnemy(230, BOOK, 10),
  128.     DroppedEnemy(130, FIREBALL, 10),
  129.     Nop(10),
  130.     DroppedEnemy(50, BOOK, 10),
  131.     DroppedEnemy(80, FIREBALL, 10),
  132.     DroppedEnemy(180, BOOK, 10),
  133.     Nop(10),
  134.     JustStar(160,120, 5),
  135.     Nop(10),
  136.     DroppedEnemy(3, FIREBALL, 10),
  137.     DroppedEnemy(74, FIREBALL, 10),
  138.     DroppedEnemy(32, BOOK, 10),
  139.     Nop(10),
  140.     DroppedEnemy(210, BOOK, 10),
  141.     DroppedEnemy(11, FIREBALL, 10),
  142.     DroppedEnemy(63, BOOK, 10),
  143.     Nop(10),
  144.     Triangle(EYE, 30, BONUS_CARD),
  145.     Nop(10),
  146.     MakeBoomFairy(100, 30, HEALTH_CARD),
  147.     Nop(10),
  148.     MakeShootingStar(60, 70, BOOK, 33, 33),
  149.     MakeShootingStar(180, 90, BOOK, 33, 33),
  150.     MakeShootingStar(160, 120, BOOK, 33, 33),
  151.     Nop(10),
  152.     PushNpc(160, -20, 0, 1, PATCHULY, BOSS_TYPE, 2000, 0),
  153.     Nop(20),
  154.     End
  155. };
  156.  
  157. void init_level4()
  158. {
  159.     level_loop = 0;
  160.     l4s = 0;
  161.     flush_sprites();
  162.     //start_level(IMG256_BG7, "Looking for Patchuly Knowlege");
  163. start_level(PAL256_BG7, "bg7-16.bmp", "Looking for Patchuly Knowlege");
  164.     music_play(MUS_ZONK);
  165.     bullet_sprite = DEFAULT_BULLET;
  166.     state = STATE_PLAY;
  167.     init_vm(level4);
  168.     process_level = process_level4;
  169.     scroll_speed = 1;
  170. }
  171.  
  172. void dialog_l4p2()
  173. {
  174.     init_dialog();
  175.     swap_screen();
  176.     put_dialog_string(FLAN_FACE, "So...\nYou played with me!\nWhat do you want?", 0);
  177.     put_dialog_string(REIMU_FACE, "I'm flying to kick\nyour bookworm's ass!", 1);
  178.     put_dialog_string(FLAN_FACE, "Sister Flan is sitting\nin the library!", 0);
  179. //swap_screen();
  180.     wait_for_space();
  181.     //init_level(IMG256_BG7);
  182. init_level(PAL256_BG7, "bg7-16.bmp");
  183.     state = STATE_PLAY;
  184.     process_level = process_level4;
  185.     bullet_sprite = DEFAULT_BULLET;
  186.     init_vm(level4_2);
  187. }
  188.  
  189. const u8 patch_vm[] = {
  190.     Nop(20),
  191.     AimedShoot(BOSS_TYPE, 10),
  192.     Nop(20),
  193.     PushNpc(32, -20, 0, 1, MAID, 254, 50, HEALTH_CARD),
  194.     PushNpc(280, -20, 0, 1, FLANDRE, 254, 50, HEALTH_CARD),
  195.     Nop(10),
  196.     SetNpcSpeed(254, 0, 0),
  197.     AimedShoot(254, 10),
  198.     SetNpcSpeed(254, 0, -3),
  199.     Nop(10),
  200.     AimedCircle(FIREBALL, 1, 3),
  201.     Nop(10),
  202.     AimedCircle(FIREBALL, 1, 3),
  203.     Nop(10),
  204.     AimedCircle(FIREBALL, 1, 3),
  205.     End
  206. };
  207.  
  208. u8 leftBonus = 0;
  209.  
  210. void last_dialog()
  211. {
  212.     init_dialog();
  213.     swap_screen();
  214.     put_dialog_string(PACHU_FACE, "Please stop!\nWhat a noise in my\nlibrary?", 0);
  215.     put_dialog_string(REIMU_FACE, "I NEED TO TALK WITH YOU!\nAnd \"thank you\" Marisa for\n\"help\"", 1);
  216.     put_dialog_string(MARISA_FACE, "I've sent you\nhealthing and my power!", 0);
  217. //swap_screen();
  218.     wait_for_space(); init_dialog();
  219.     swap_screen();
  220.     put_dialog_string(REIMU_FACE, "Like a drunken sniper...", 1);
  221.     put_dialog_string(FLAN_FACE, "So...\nWhat do you want from\nmy sister?!", 0);
  222.     put_dialog_string(REIMU_FACE, "My donations box is lost!\nHave you taken it for\nyour books?", 1);
  223. //swap_screen();
  224.     wait_for_space(); init_dialog();
  225.     swap_screen();
  226.     put_dialog_string(PACHU_FACE, "What?\n", 0);
  227.     put_dialog_string(REIMU_FACE, "Also, Komano is lost...", 1);
  228.     put_dialog_string(PACHU_FACE, "Oh, she came to me and\nasked for books about\nbox repairing...", 0);
  229. //swap_screen();
  230.     wait_for_space(); init_dialog();
  231.     swap_screen();
  232.     put_dialog_string(PACHU_FACE, "She went to the repair\nmaster. But you made\nall this noise!", 0);
  233.     put_dialog_string(REIMU_FACE, "Okeey, as an apology, I'm\nwaiting for everyone to\nget drunk tonight.", 1);
  234.     put_dialog_string(CIRNO_FACE, "I'll be there!", 0);
  235. //swap_screen();
  236.     wait_for_space(); init_dialog();
  237.     swap_screen();
  238.     put_dialog_string(REIMU_FACE, "But how You appears\nhere?!", 1);
  239.     put_dialog_string(CIRNO_FACE, "Cause, I'm strongest!\nAnd Sakuya just opened\nthe door..", 0);
  240.     put_dialog_string(REIMU_FACE, "Fi-i-inee!\nLet's drink tonight!\nAnd even Cirno-tan.", 1);
  241. //swap_screen();
  242.     wait_for_space();
  243.     state = STATE_WIN;
  244. }
  245.  
  246. void process_patchu()
  247. {
  248.     Npc *boss;
  249.    
  250.     boss = find_npc_by_type(BOSS_TYPE);
  251.     if (!boss) {
  252.         last_dialog();
  253.         return ;
  254.     }
  255.  
  256.     if (!executing) {
  257.         init_vm(patch_vm);
  258.     }
  259.  
  260.     vm_step();
  261.  
  262.     if (boss->sprite.x > 280 || boss->sprite.x < 30)
  263.         boss->sprite.dx = -boss->sprite.dx;
  264.  
  265.     if (scroll_pos < 2 || scroll_pos > 260) {
  266.         scroll_speed = -scroll_speed;
  267.     }
  268.  
  269.     if (hor_scroll_pos < 2 || hor_scroll_pos > 195) {
  270.         hor_scroll_speed = -hor_scroll_speed;
  271.     }
  272.    
  273.     switch (level_loop % 60) {
  274.         boss_shoot1(0, boss->sprite.x, boss->sprite.y)
  275.         just_star(30, boss->sprite.x + 16, boss->sprite.y + 16)
  276.         just_star(35, boss->sprite.x + 16, boss->sprite.y + 16)
  277.         just_star(40, boss->sprite.x + 16, boss->sprite.y + 16)
  278.         just_star(45, boss->sprite.x + 16, boss->sprite.y + 16)
  279.         case 59:
  280.             if (leftBonus) {
  281.                 push_bonus(HEALTH_CARD, 10, 80, 2, -5);
  282.                 push_bonus(BONUS_CARD, 100, 80, 0, -5);
  283.                 push_bonus(HEALTH_CARD, 30, 80, 2, -5);
  284.             } else {
  285.                 push_bonus(HEALTH_CARD, 160, 80, 0, -5);
  286.                 push_bonus(BONUS_CARD, 260, 80, -2, -5);
  287.                 push_bonus(BONUS_CARD, 280, 80, -2, -5);    
  288.             }
  289.             leftBonus = !leftBonus;
  290.             break;
  291.        
  292.     }
  293.  
  294. }
  295.  
  296. void dialog_l4p3()
  297. {
  298.     init_dialog();
  299.     swap_screen();
  300.     put_dialog_string(PACHU_FACE, "What a noise?!", 0);
  301.     put_dialog_string(REIMU_FACE, "Oh...\nI've found you!", 1);
  302.     put_dialog_string(PACHU_FACE, "Please, stop this noise!", 0);
  303. //swap_screen();
  304.     wait_for_space();
  305.     init_dialog();
  306.     swap_screen();
  307.     put_dialog_string(REIMU_FACE, "I need to talk with you", 1);
  308. //swap_screen();
  309.     wait_for_space();
  310.     //init_level(IMG256_BG8);
  311. init_level(PAL256_BG8, "bg8-16.bmp");
  312.     pal_bright(BRIGHT_MIN);
  313.     swap_screen();
  314.     unpack_pal256(PAL256_BG8, 0);
  315.     unpack_pal16(PAL16_SPRITES, 15, 0);
  316.     pal_bright(BRIGHT_MID);
  317.     swap_screen();
  318.     process_level = process_patchu;
  319.     music_play(MUS_TH0PN);
  320.     state = STATE_PLAY;
  321.     scroll_pos = 192;
  322.     hor_scroll_pos = 150;
  323.     scroll_speed = -3;
  324.     hor_scroll_speed = 3;
  325.     push_npc(160, 32, 2, 0, PATCHULY, BOSS_TYPE, 1024, 0);
  326.     bullet_sprite = BULLET2;
  327.     level_loop = 0;
  328.     init_vm(patch_vm);
  329. }
  330.  
  331. void process_flandre()
  332. {
  333.     Npc *boss;
  334.     Npc *bossClone;
  335.  
  336.     boss = find_npc_by_type(BOSS_TYPE);
  337.     bossClone = find_npc_by_type(254);
  338.  
  339.     if (boss) {
  340.          if (boss->sprite.x <= 20 || boss->sprite.x >= 280)
  341.         {
  342.             boss->sprite.dx = -boss->sprite.dx;
  343.             boss->sprite.x += boss->sprite.dx;
  344.         }
  345.         if (boss->sprite.y <= 20 || boss->sprite.y >= 120)
  346.         {
  347.             boss->sprite.dy = -boss->sprite.dy;
  348.             boss->sprite.y += boss->sprite.dy;
  349.         }
  350.  
  351.         if (bossClone) {
  352.             if (bossClone->sprite.x <= 20 || bossClone->sprite.x >= 280)
  353.             {
  354.                 bossClone->sprite.dx = -bossClone->sprite.dx;
  355.                 bossClone->sprite.x += bossClone->sprite.dx;
  356.             }
  357.             if (bossClone->sprite.y <= 20 || bossClone->sprite.y >= 120)
  358.             {
  359.                 bossClone->sprite.dy = -bossClone->sprite.dy;
  360.                 bossClone->sprite.y += bossClone->sprite.dy;
  361.             }
  362.         }
  363.  
  364.         if (level_loop % 10 < 4) {
  365.             push_star(boss->sprite.x + 16, boss->sprite.y + 16);
  366.             if (bossClone) push_star(bossClone->sprite.x + 16, bossClone->sprite.y + 16);
  367.         }
  368.  
  369.         switch (level_loop % 150)
  370.         {
  371.         case 0:
  372.             push_npc(boss->sprite.x, boss->sprite.y, -boss->sprite.dx, -boss->sprite.dy, FLANDRE, 254, 30, HEALTH_CARD);
  373.             break;
  374.         case 50:
  375.             npc_by_type_set_speed(254, 0, 330);
  376.             break;
  377.         case 100:
  378.             push_bonus(HEALTH_CARD, 160, 120, -2, -3);
  379.             push_bonus(HEALTH_CARD, 160, 120, 0, -5);
  380.             push_bonus(HEALTH_CARD, 160, 120, 2, 3);
  381.             push_bonus(BONUS_CARD, 160, 100, -2, -3);
  382.             push_bonus(BONUS_CARD, 160, 100, 0, -5);
  383.             push_bonus(BONUS_CARD, 160, 100, 2, 3);
  384.             break;
  385.         }
  386.     } else {
  387.         dialog_l4p2();
  388.     }
  389. }
  390.  
  391. void dialog_l4p1()
  392. {
  393.     init_dialog();
  394.     swap_screen();
  395.     put_dialog_string(FLAN_FACE, "Hello, Reddy-sister!\nAre you gonna play with me?", 0);
  396.     put_dialog_string(REIMU_FACE, "Flan, I have no time\nfor this!", 1);
  397.     put_dialog_string(FLAN_FACE, "Oh sister...\nYou'll play with me!", 0);
  398. //swap_screen();
  399.     bullet_sprite = FLAN_BULLET;
  400.     process_level = process_flandre;
  401.     wait_for_space();
  402.     //init_level(IMG256_BG7);
  403. init_level(PAL256_BG7, "bg7-16.bmp");
  404.     push_npc(32, 32, 2, 3, FLANDRE, BOSS_TYPE, 500, HEALTH_CARD);
  405.     state = STATE_PLAY;
  406. }
  407.  
  408. void process_level4()
  409. {
  410.     if (executing) {
  411.         vm_step();
  412.     } else {
  413.         switch (l4s) {
  414.             case 0:
  415.                 l4s++;
  416.                 dialog_l4p1();
  417.                 break;
  418.             case 1:
  419.                 dialog_l4p3();
  420.                 break;
  421.         }
  422.     }
  423. }
  424.  
  425. #endif
  426.