k-chow/roms/skate/park.c

151 lines
3.4 KiB
C
Raw Permalink Normal View History

/*
* Copyright (c) LSE
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "skate.h"
#define array_size(A) (sizeof (A) / sizeof (*A))
static const enum e_gfx park_begin[] = {
NO_BOX, NO_BOX, NO_BOX, NO_BOX, BOX_UP, BOX, BOX, NO_BOX, NO_BOX, BOX_UP
};
static const enum e_gfx park_loop[] = {
NO_BOX, BOX_RAIL, BOX_RAIL, NO_BOX, BOX_UP, BOX, BOX, NO_BOX, NO_BOX, BOX_UP
};
struct scrolling scrolling;
enum e_gfx get_park(size_t box) {
if (box < array_size(park_begin))
return park_begin[box];
return park_loop[(box - array_size(park_begin)) % array_size(park_loop)];
}
void scroll_stop(void)
{
scrolling.timer1 = scrolling.timer2 = jiffies;
scrolling.freq = 6;
}
static void scroll_init(void)
{
scrolling.step = 2;
scrolling.width = 0;
scrolling.current_box = 0;
scrolling.x = 0;
scroll_stop();
}
void park_init(void)
{
scroll_init();
}
int get_box(int x)
{
return x / BOX_WIDTH;
}
int get_shift(int x)
{
return x % BOX_WIDTH;
}
int box_height(int box, int shift)
{
switch (get_park(box)) {
case BOX_UP:
return shift;
case BOX_RAIL:
if (skater.slide)
return 15;
else
return 0;
case BOX:
return BOX_HEIGHT;
default:
return 0;
}
}
void park_draw(void)
{
int box = get_box(scrolling.x);
int x = -get_shift(scrolling.x);
do {
enum e_gfx p = get_park(box);
if (graphics[p].gfx)
draw_image_alpha(graphics[p].gfx,
x, GRAPHIC_HEIGHT - 10 - BOX_HEIGHT,
BG_COLOR);
x += BOX_WIDTH;
box++;
} while (x < GRAPHIC_WIDTH);
}
void scroll(void)
{
// automatic slow down
if (!skater.slide)
if (jiffies - scrolling.timer1 >= 20) {
scrolling.timer1 = jiffies;
scroll_slowdown();
}
// scroll left
if (jiffies - scrolling.timer2 >= (unsigned long)scrolling.freq) {
scrolling.timer2 = jiffies;
if (scrolling.freq < 6) {
if (skater.x < GRAPHIC_WIDTH / 2 - BOX_WIDTH)
skater.x += scrolling.step;
else {
scrolling.x += scrolling.step;
scrolling.width += scrolling.step;
}
}
}
//
if (scrolling.width == BOX_WIDTH) {
scrolling.width = 0;
scrolling.current_box++;
}
}
int scroll_slowdown(void)
{
scrolling.freq++;
if (scrolling.freq > 6)
scrolling.freq = 6;
return scrolling.freq;
}
int scroll_speedup(void)
{
scrolling.freq -= 2;
if (scrolling.freq <= 0)
scrolling.freq = 0;
return scrolling.freq;
}