Login

Subversion Repositories NedoOS

Rev

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

#ifndef GAMELOOPC
#define GAMELOOPC
//#include "sprite_pool.c"
//#include "engine.c"
//#include <evo.h>
//#include "dialogs.c"
#include "bytecode.h"
#include "level1.c"
#include "level3.c"
#include "level4.c"
#include "interpreter.c"

#define LEFT KEY_5
#define RIGHT KEY_8
#define DOWN KEY_6
#define UP KEY_7
#define FIRE KEY_SPACE

static u8 i, j;
static void init_level(u8 pal, char *fn);

void game_loop();

static void start_level(u8 pal, char *fn, u8 *name)
{
    u8 c;
    music_stop();
    player.y = STARTY/*321*/;
    flush_sprites();
    init_text();
    swap_screen();
    text_y = 24/*29*/;
    text_x = 20;
    put_str("Girls are praying...");

    text_y = 10;
    text_x = 3;
    put_str("Lives: ");
    put_num(hp);
    text_y = 11;
    text_x = 3;
    put_str("Score: ");
    put_num(score);

    text_y = 2;
    text_x = 20 - strlen(name) / 2;
    put_slow_str(name);

    text_x = 10;
    text_y = 5;
    draw_face(REIMU_FACE);
    text_y--;
    text_x += 5;
//swap_screen();

    for (c = 0; c < 50; c++)
        swap_screen();
//swap_screen();
    draw_face(MARISA_FACE);
//swap_screen();
    text_y--;
    text_x += 5;
    for (c = 0; c < 50; c++)
        swap_screen();
//swap_screen();
    draw_face(CIRNO_FACE);
//swap_screen();
    for (c = 0; c < 100; c++)
        swap_screen();
    //init_level(image);
init_level(pal, fn);
}

static void init_level(u8 pal, char *fn)
{
    pal_bright(BRIGHT_MIN);
if (pal) preparescroll(fn);
/*    if (image == IMG256_BG8)
        unpack_pal256(PAL256_BG8, 0);
    else
        unpack_pal256(PAL256_BG1, 0);*/

unpack_pal256(pal, 0);

    //unpack_pal16(PAL16_SPRITES, 15, 0);
    //draw_image_g256(0, 0, image);
scroll(0, 0);
//drawscroll();
    pal_bright(BRIGHT_MID);
    player.x = 120;
    player.y = 168;
    flush_sprites();
    swap_screen();
    scroll_pos = 0;
    hor_scroll_pos = 0;
    hor_scroll_speed = 0;
    level_loop = 0;
    schedule = 0;
    add_cnt = 0;
//sprites_start();
}



void start_game_loop()
{
    int i;
    hp = 3;
    score = 0;

    process_level = process_level1;
    //process_level = process_flandre;
    //process_level = process_level2;
    scroll_pos = 0;
    bullet_sprite = DEFAULT_BULLET;
    //start_level(IMG256_BG1, "Day before festival");
start_level(PAL256_BG1, "bg1-16.bmp", "Day before festival");
//start_level(PAL256_BG8, "bg8-16.bmp", "Day before festival");
    init_vm(level1_bytecode);
    //init_vm(level2_bc);
//init_vm(level4_2);
    music_play(MUS_TH0EA1);
    sprites_start();
    immortality = 20;
    game_loop();
}

static void player_control()
{
    if (keys[LEFT])
        player.x -= 4;
    if (keys[RIGHT])
        player.x += 4;
    if (keys[UP])
        player.y -= 4;
    if (keys[DOWN])
        player.y += 4;
    if (keys[FIRE])
        user_fire();
#ifdef CHEAT
    if (keys[KEY_C]&&keys[KEY_CAPS])
        cheat_on = 1;
#endif

    if (player.x < MIN_X_RES/*0*/)
        player.x = MIN_X_RES/*0*/;
    if (player.x > MAX_X_RES/*300*/)
        player.x = MAX_X_RES/*300*/;
    if (player.y < MIN_Y_RES/*0*/)
        player.y = MIN_Y_RES/*0*/;
    if (player.y > MAX_Y_RES - 32)
        player.y = MAX_Y_RES - 32;
}

static void bg_scroll()
{
    scroll_pos -= scroll_speed;
    scroll_pos &= 511;
    hor_scroll_pos += hor_scroll_speed;
    hor_scroll_pos &= 511;

    scroll(hor_scroll_pos, scroll_pos);
}

static void process_events()
{
    if ((schedule & 7) == 0)
    {
        level_loop++;
        process_level();
        if (immortality)
        {
            immortality--;
        }
    }
}

static void player_collisions()
{
    static MovableSprite *b;
    if (!immortality && is_player_collide())
    {
        immortality = 20;
        player.x = 160;
        player.y = 168;
        cards = 3;
        hp--;
        sfx_play(1, 0);
        for (push_counter = 0; push_counter < BULLETS_count; push_counter++)
            bullets[push_counter].dy = 10;
    }
    b = is_player_collide_with_pups();
    if (b)
    {
        switch (b->tile)
        {
        case BONUS_CARD:
            if (cards < MY_BULLETS_max)
                cards++;
            break;
        case HEALTH_CARD:
            hp++;
            break;
        default:
            break;
        }
    }
}

void game_loop()
{
    scroll_speed = 1;
    immortality = 10;
    while (state == STATE_PLAY)
    {
        schedule++;

        if ((schedule & 3) == 0)
            anim_frame++;
        anim_frame &= 3;

        player.tile = (immortality & 1) ? 1072/*2560*/ : 0;
        if (schedule & 1)
        {
            keyboard(keys);
            player_control();
            player_collisions();
        }
        else
        {
            enemy_collision();
            process_events();
        }
        if (hp < 1)
        {
            state = STATE_GAMEOVER;
        }
//begin_set_sprites();
        update_sprites(schedule & 1);
        //update_sprites(0);
        //update_sprites(1);
        if ((schedule & 3) == 0)
            bg_scroll();
        //swap_screen();
   
if (schedule & 1) {
end_set_sprites();
drawscroll();
swap_screen_scroll();
}
    }
}

#endif