/*
* src/scr_imap.c
*
* Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
*
* The use and distribution terms for this software are contained in the file
* named README, which can be found in the root of this distribution. By
* using this software in any fashion, you are agreeing to be bound by the
* terms of this license.
*
* You must not remove this notice, or any other, from this software.
*/
#include <stdio.h>
#include "system.h"
#include "game.h"
#include "screens.h"
#include "rects.h"
#include "draw.h"
#include "control.h"
#include "maps.h"
/*
* local vars
*/
static U16 step; /* current step */
static U16 count; /* number of loops for current step */
static U16 run; /* 1 = run, 0 = no more step */
static U8 flipflop; /* flipflop for top, bottom, left, right */
static U16 spnum; /* sprite number */
static U16 spx, spdx; /* sprite x position and delta */
static U16 spy, spdy; /* sprite y position and delta */
static U16 spbase, spoffs; /* base, offset for sprite numbers table */
static U8 seq = 0; /* anim sequence */
static rect_t anim_rect = { 120, 16, 64, 64, NULL }; /* anim rectangle */
/*
* prototypes
*/
static void drawtb (void);
static void drawlr (void);
static void drawsprite (void);
static void drawcenter (void);
static void nextstep (void);
static void anim (void);
static void init (void);
/*
* Map introduction
*
* ASM: 1948
*
* return: SCREEN_RUNNING, SCREEN_DONE, SCREEN_EXIT
*/
U8 screen_introMap (void)
{
switch (seq)
{
case 0:
sysvid_clear ();
draw_tilesBank = 0;
draw_tllst = screen_imaptext[game_map];
draw_setfb (32, 0);
draw_tilesSubList ();
draw_setfb (32, 96);
draw_tilesList ();
game_rects = NULL;
init ();
nextstep ();
drawcenter ();
drawtb ();
drawlr ();
drawsprite ();
control_last = 0;
game_rects = &draw_SCREENRECT;
game_setmusic (map_maps[game_map].tune, 1);
seq = 1;
break;
case 1: /* top and bottom borders */
drawtb ();
game_rects = &anim_rect;
seq = 2;
break;
case 2: /* background and sprite */
anim ();
drawcenter ();
drawsprite ();
game_rects = &anim_rect;
seq = 3;
break;
case 3: /* all borders */
drawtb ();
drawlr ();
game_rects = &anim_rect;
seq = 1;
break;
case 4: /* wait for key release */
if (!(control_status & CONTROL_FIRE))
seq = 5;
else
sys_sleep (50); /* .5s */
break;
}
if (control_status & CONTROL_FIRE)
seq = 4; // end as soon as key pressed
if (control_status & CONTROL_EXIT)
return SCREEN_EXIT; // check for exit request
if (seq == 5)
{
// end as soon as key pressed
sysvid_clear();
seq = 0;
return SCREEN_DONE;
}
else
return SCREEN_RUNNING;
}
/*
* Display top and bottom borders (0x1B1F)
*
*/
static void drawtb (void)
{
U8 i;
flipflop++;
if (flipflop & 0x01)
{
draw_setfb (128, 16);
for (i = 0; i < 6; i++)
draw_tile (0x40);
draw_setfb (128, 72);
for (i = 0; i < 6; i++)
draw_tile (0x06);
}
else
{
draw_setfb (128, 16);
for (i = 0; i < 6; i++)
draw_tile (0x05);
draw_setfb (128, 72);
for (i = 0; i < 6; i++)
draw_tile (0x40);
}
}
/*
* Display left and right borders (0x1B7C)
*
*/
static void drawlr (void)
{
U8 i;
if (flipflop & 0x02)
{
for (i = 0; i < 8; i++)
{
draw_setfb (120, 16 + i * 8);
draw_tile (0x04);
draw_setfb (176, 16 + i * 8);
draw_tile (0x04);
}
}
else
{
for (i = 0; i < 8; i++) {
draw_setfb (120, 16 + i * 8);
draw_tile (0x2B);
draw_setfb (176, 16 + i * 8);
draw_tile (0x2B);
}
}
}
/*
* Draw the sprite (0x19C6)
*
*/
static void drawsprite (void)
{
draw_sprite ((U8) spnum, (U16) (128 + ((spx << 1) & 0x1C)), (U16) (24 + (spy << 1)));
}
/*
* Draw the background (0x1AF1)
*
*/
static void drawcenter (void)
{
static U8 tn0[] = { 0x07, 0x5B, 0x7F, 0xA3, 0xC7 };
U8 i, j, tn;
tn = tn0[game_map];
for (i = 0; i < 6; i++)
{
draw_setfb (128, (24 + 8 * i));
for (j = 0; j < 6; j++)
draw_tile (tn++);
}
}
/*
* Next Step (0x1A74)
*
*/
static void nextstep (void)
{
if (screen_imapsteps[step].count)
{
count = screen_imapsteps[step].count;
spdx = screen_imapsteps[step].dx;
spdy = screen_imapsteps[step].dy;
spbase = screen_imapsteps[step].base;
spoffs = 0;
step++;
}
else
run = 0;
}
/*
* Anim (0x1AA8)
*
*/
static void anim (void)
{
U16 i;
if (run)
{
i = screen_imapsl[spbase + spoffs];
if (i == 0)
{
spoffs = 0;
i = screen_imapsl[spbase];
}
spnum = i;
spoffs++;
spx += spdx;
spy += spdy;
count--;
if (count == 0)
nextstep ();
}
}
/*
* Initialize (0x1A43)
*
*/
static void init (void)
{
run = 0;
run--;
step = screen_imapsofs[game_map];
spx = screen_imapsteps[step].dx;
spy = screen_imapsteps[step].dy;
step++;
spnum = 0; /* NOTE spnum in [8728] is never initialized ? */
}