Login

Subversion Repositories NedoOS

Rev

Rev 957 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

#ifndef LEVEL2_C
#define LEVEL2_C
#include "gameloop.c"
#include "level_fragments.h"
#include "engine.c"
#include "resources.h"
#include "dialogs.c"
#include "gameloop.c"
#include "level3.c"

//static void init_level(u8 image);
//static void start_level(u8 image, u8 *name);
static void init_level(u8 pal, char *fn);
static void start_level(u8 pal, char *fn, u8 *name);

static void process_level2();
u8 l2s=0;

const u8 l2intro[] = {
    PushNpc(160, -10, 0, 2, FROG, 1, 300, 0),
    Nop(10),
    End
};

const u8 level2_bc[] = {
    DoubleCaravan(FROG, 1, 20, 0),
    Nop(10),
    Triangle(FAIRY, 30, BONUS_CARD),
    Nop(10),
    MakeCorridor(FIARY2, 1, 20, 0),
    Nop(10),
    MakeRightFlyers(32, GHOST, 10, BONUS_CARD),
    MakeLeftFlyers(120, GHOST, 10, BONUS_CARD),
    Nop(20),
    MakeBoomFairy(160, 30, HEALTH_CARD),
    Nop(10),
    MakeShootingStar(160, 90, ICEBALL, 20, 30),
    Nop(10),
    TriangleHalf(1, FAIRY, 30, HEALTH_CARD),
    Nop(20),
    DroppedEnemy(32, SHARP_ICE, 5),
    DroppedEnemy(64, SHARP_ICE, 5),
    DroppedEnemy(16, SHARP_ICE, 5),
    DroppedEnemy(160, SHARP_ICE, 5),
    JustStar(160, 120, 3),
    Nop(5),
    DroppedEnemy(15, SHARP_ICE, 5),
    DroppedEnemy(32, SHARP_ICE, 5),
    DroppedEnemy(96, SHARP_ICE, 5),
    DroppedEnemy(150, SHARP_ICE, 5),
    DroppedEnemy(200, SHARP_ICE, 5),
    DroppedEnemy(96, SHARP_ICE, 5),
    Nop(3),
    JustStar(160, 120, 3),
    Nop(10),
    MakeShootingStar(160, 90, ICEBALL, 20, 30),
    Nop(20),
    FiringTrap(SHARP_ICE),
    Nop(10),
    DroppedEnemy(16, GHOST, 4),
    DroppedEnemy(160, GHOST, 4),
    DroppedEnemy(300, GHOST, 4),
    DroppedEnemy(50, GHOST, 4),
    DroppedEnemy(250, GHOST, 4),
    Nop(13),
    DroppedEnemy(16, GHOST, 4),
    DroppedEnemy(160, GHOST, 4),
    DroppedEnemy(300, GHOST, 4),
    DroppedEnemy(50, GHOST, 4),
    DroppedEnemy(250, GHOST, 4),
    Nop(20),
    MidBoss2(FAIRY_MB, 100),
    Nop(10),
    MakeShootingStar(160, 90, ICEBALL, 20, 30),
    Nop(20),
    DroppedEnemy(16, GHOST, 4),
    DroppedEnemy(160, GHOST, 4),
    DroppedEnemy(300, GHOST, 4),
    DroppedEnemy(50, GHOST, 4),
    DroppedEnemy(250, GHOST, 4),
    Nop(10),
    DroppedEnemy(16, GHOST, 4),
    DroppedEnemy(160, GHOST, 4),
    DroppedEnemy(300, GHOST, 4),
    DroppedEnemy(50, GHOST, 4),
    DroppedEnemy(250, GHOST, 4),
    Nop(10),
    DroppedEnemy(16, GHOST, 4),
    DroppedEnemy(160, GHOST, 4),
    DroppedEnemy(300, GHOST, 4),
    DroppedEnemy(50, GHOST, 4),
    DroppedEnemy(250, GHOST, 4),
    Nop(10),
    MakeLeftFlyers(120, GHOST, 10, BONUS_CARD),
    Nop(20),
    PushNpc(160, -10, 0, 1, CIRNO, 66, 1024, 0),
    Nop(15),
    End
};

static void init_level2()
{
    level_loop = 0;
    scroll_speed = 1;
    process_level = process_level2;
    init_vm(l2intro);
    flush_sprites();
    //start_level(IMG256_BG3, "Fairies Lake");
music_stop();
start_level(PAL256_BG3, "bg3-16.bmp", "Fairies Lake");
    music_play(MUS_GLASSED);
    bullet_sprite = DEFAULT_BULLET;
    state = STATE_PLAY;
    l2s = 0;
}

static void l2b_dialog()
{
    init_dialog();
    swap_screen();
    put_dialog_string(REIMU_FACE, "CIIIIRRRNOO!\nWhat a heck you doing?!", 1);
//swap_screen();
    wait_for_space();
    flush_sprites();
    //init_level(IMG256_BG3);
init_level(0/*PAL256_BG3*/, "bg3-16.bmp");
unpack_pal256(PAL256_BG3, 0);
    init_vm(level2_bc);
}

static void l2f_dialog()
{
    init_dialog();
    swap_screen();
    put_dialog_string(CIRNO_FACE, "Okay, okay...\nYou've beaten the\nstrongest boss!", 0);
    put_dialog_string(REIMU_FACE, "Hey, insect!\nHave you seen my donation\nbox?", 1);
    put_dialog_string(CIRNO_FACE, "Why do I need empty box?No. I don't need it.", 0);
    put_dialog_string(REIMU_FACE, "We'll talk again!\nI have no time for bugs now!", 1);
//swap_screen();
    wait_for_space();
    init_level3();
}

static void process_boss2()
{
    u8 c;
    Npc *boss;

    if (scroll_pos < 2)
        scroll_speed = 0;

    boss = find_npc_by_type(BOSS_TYPE);

    if (boss)
    {
        if (boss->sprite.x <= 20 || boss->sprite.x >= 280)
        {
            boss->sprite.dx = -boss->sprite.dx;
            boss->sprite.x += boss->sprite.dx;
        }
        if (boss->sprite.y <= 20 || boss->sprite.y >= 120)
        {
            boss->sprite.dy = -boss->sprite.dy;
            boss->sprite.y += boss->sprite.dy;
        }
    }
    else
    {
        l2f_dialog();
        return;
    }
   
    switch (level_loop)
    {
        boss_shoot1(1, boss->sprite.x + 16, boss->sprite.y + 16);
        boss_attack_drop_npc(20, ICE);
    case 26:
        boss->sprite.dx = 1;
        boss->sprite.dy = 1;
        break;
        boss_shoot1(30, boss->sprite.x + 16, boss->sprite.y + 16);
        boss_attack_drop_npc(50, FROG);

        just_star(60, boss->sprite.x + 16, boss->sprite.y + 16);
        just_star(61, boss->sprite.x + 16, boss->sprite.y + 16);
        just_star(62, boss->sprite.x + 16, boss->sprite.y + 16);

        just_star(80, boss->sprite.x + 16, boss->sprite.y + 16);
        just_star(82, boss->sprite.x + 16, boss->sprite.y + 16);
        just_star(84, boss->sprite.x + 16, boss->sprite.y + 16);

    case 100:
        for (c = 0; c < 5; c++)
            push_bonus(BONUS_CARD, boss->sprite.x + 16, boss->sprite.y + 16, 3 - (c * 2), 2);
        level_loop = 1;
    }
}

static void l2m_dialog()
{
music_stop();
init_level(PAL256_BG4, "bg4-16.bmp");
    music_play(MUS_CIRNO); //TODO ╨┐╨╛╤З╨╡╨╝╤Г ╨│╨┤╨╡-╤В╨╛ ╨╖╨┤╨╡╤Б╤М ╨┐╤А╨╕╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В╤Б╤П ╨╝╤Г╨╖╤Л╨║╨░?
    init_dialog();
    swap_screen();
    put_dialog_string(REIMU_FACE, "Hey, BUG!\nSTOP! I SAID STOP!", 1);
    put_dialog_string(CIRNO_FACE, "Whaat?\nYou are talking with\nthe final boss!", 0);
    put_dialog_string(REIMU_FACE, "You are the second...\nIf Marisa was the first.", 1);
    put_dialog_string(CIRNO_FACE, "It's your final!", 0);
//swap_screen();
    wait_for_space();
    flush_sprites();
    //init_level(IMG256_BG4);
unpack_pal256(PAL256_BG4, 0);

    level_loop = 0;
    bullet_sprite = CIRNO_BULLET;
    process_level = process_boss2;
    scroll_pos = 192;
    push_npc(144, 20, 0, 0, CIRNO, 255, 1500, 0);
}


static void process_level2()
{
    if (executing) {
        vm_step();
    } else {
        switch (l2s) {
            case 0:
                l2s ++;
                l2b_dialog();
                break;
            case 1:
                l2m_dialog();
                break;
        }
    }
}

#endif