kolibrios/programs/games/donkey/c_code.c

355 lines
5.6 KiB
C
Raw Permalink Normal View History

#include "system/kolibri.h"
#include "system/stdlib.h"
#include "system/string.h"
#include "system/gblib.h"
#include "car_01.h"
#include "car_02.h"
#include "donkey_01.h"
#include "donkey_02.h"
#include "az.h"
char STR_DONKEY[] = {"D O N K E Y 0.8"};
int start, paintbg, pause;
int dox, doy;
int drx, dry;
int drn, don;
int speed;
char snd_ok[]={0x08, 0x89, 0x0f, 0};
char snd_game_over[]={0x08, 0xa9, 0x0f, 0x09, 0x99, 0x0f, 0x11, 0x59, 0x0f, 0};
GB_BMP screen, font, car01, car02, donkey01, donkey02, az;
void az_putc(unsigned char c, int x, int y)
{
gb_image_set_t(&screen, x, y, &az, (c-'!')*11, 0, 11, 16, 0);
}
void az_puts(unsigned char *s, int x, int y)
{
unsigned i;
i = 0;
while (*(s+i))
{
az_putc(*(s+i), x+i*11, y);
i++;
}
}
void game_start()
{
drx = -1;
dry = 0;
doy = random(40)+130;
dox = random(1);
if (0 == dox)
dox--;
drn = don = 0;
paintbg = 1;
speed = 0;
kol_sleep(30);
}
void screen_back()
{
gb_bar(&screen, 0, 0, 320, 200, 0x888888);
gb_bar(&screen, 6, 6, 97-6, 195-6, 0x488888);
gb_bar(&screen, 183, 6, 305-183, 195-6, 0x488888);
az_puts("Donkey", 6, 30);
az_puts("Driver", 189, 30);
az_putc (don+'0', 5, 48);
az_putc (drn/10+'0', 189, 48);
az_puts("Keys:", 189, 95);
az_puts("Space Bar", 189, 116);
az_puts("Enter", 189, 132);
az_puts("Esc", 189, 148);
gb_line(&screen, 100, 0, 100, 199, 0xffffff);
gb_line(&screen, 180, 0, 180, 199, 0xffffff);
paintbg = 0;
}
void screen_draw()
{
int y;
if (-1 == pause)
{
screen_back();
gb_bar(&screen, 4, 20, 255, 60, 0xee0000);
az_puts ("P A U S E", 5, 30);
az_puts ("Press Enter to continue", 5, 60);
kol_screen_wait_rr();
kol_paint_image( 0, 0, 320, 200, screen.bmp);
paintbg = 1;
return;
}
if (don > 9)
{
gb_bar(&screen, 0, 0, 320, 200, 0x880000);
az_puts ("G A M E O V E R", 5, 30);
kol_screen_wait_rr();
kol_paint_image( 0, 0, 320, 200, screen.bmp);
kol_sleep(150);
game_start();
start = 1;
}
if (drn > 99)
{
gb_bar(&screen, 0, 0, 320, 200, 0x88);
az_puts ("CONGRATULATIONS !!!", 5, 30);
kol_screen_wait_rr();
kol_paint_image( 0, 0, 320, 200, screen.bmp);
kol_sleep(150);
game_start();
start = 1;
}
if (drn > 9)
speed = 1;
if (drn > 84)
speed = 2;
if (start)
{
if (!paintbg)
return;
gb_bar(&screen, 0, 0, 320, 200, 0x55);
az_puts ( STR_DONKEY, 5, 30);
az_puts ("remake for KolibriOS", 5, 78);
az_puts ("by Albom", 5, 78+16);
az_puts ("Press Space Bar", 5, 140);
az_puts ("to continue", 5, 156);
kol_screen_wait_rr();
kol_paint_image( 0, 0, 320, 200, screen.bmp);
paintbg = 0;
return;
}
if (paintbg)
screen_back();
else
gb_bar(&screen, 102, 0, 180-102, 200, 0x888888);
for (y=10; y<180; y+=20)
gb_line(&screen, 140, y-10*(doy%2), 140, y+10-10*(doy%2), 0xffffff);
doy-=5;
if (doy < -50)
{
dox = random(1);
if (0 == dox)
dox--;
doy = random(40)+130;
dry += 10;
drn++;
if (0 == drn%10)
dry = 0;
paintbg = 1;
}
if ((drx == dox)&&(dry > doy-15)&&(dry < doy+15))
{
kol_sound_speaker(snd_game_over);
don++;
dry = 0;
drn /= 10;
drn *= 10;
for (y = 0; y<2; y++)
{
kol_sleep(8);
screen_back();
az_puts("BOOM!", 6, 120);
gb_image_set_t(&screen, 140-13-(y+1)*20, 120-dry+(y+1)*20, &car01, 0, 0, 13, 34, 0x888888);
gb_image_set_t(&screen, 120+(y+3)*20, 120-dry+(y+1)*20, &car02, 0, 0, 13, 34, 0x888888);
gb_image_set_t(&screen, 140-17-(y+1)*20, 120-(y+1)*20, &donkey01, 0, 0, 17, 17, 0x888888);
gb_image_set_t(&screen, 140+(y+3)*20, 120-(y+1)*20, &donkey02, 0, 0, 13, 17, 0x888888);
kol_screen_wait_rr();
kol_paint_image(0, 0, 320, 200, screen.bmp);
}
dox = random(1);
if (0 == dox)
dox--;
doy = random(40)+130;
paintbg = 1;
}
gb_image_set_t(&screen, 140-13-drx*20, 130-dry, &car01, 0, 0, 13, 34, 0x888888);
gb_image_set_t(&screen, 140-drx*20, 130-dry, &car02, 0, 0, 13, 34, 0x888888);
gb_image_set_t(&screen, 140-17-dox*20, 130-doy, &donkey01, 0, 0, 17, 17, 0x888888);
gb_image_set_t(&screen, 140-dox*20, 130-doy, &donkey02, 0, 0, 13, 17, 0x888888);
kol_screen_wait_rr();
kol_paint_image(0, 0, 320, 200, screen.bmp);
}
void wnd_draw()
{
kol_paint_start();
kol_wnd_define(280, 200, 328, 204+kol_skin_height(), 0x34888888, 0x34888888, STR_DONKEY);
screen_draw();
kol_paint_end();
}
void kol_main()
{
unsigned event;
unsigned key;
srand(kol_system_time_get()<<8);
start = 1;
paintbg = 1;
pause = 1;
speed = 0;
screen.bmp = malloc(320*200*3);
screen.w = 320;
screen.h = 200;
car01.bmp = CAR_01;
car01.w = 13;
car01.h = 34;
car02.bmp = CAR_02;
car02.w = 13;
car02.h = 34;
donkey01.bmp = DONKEY_01;
donkey01.w = 17;
donkey01.h = 17;
donkey02.bmp = DONKEY_02;
donkey02.w = 13;
donkey02.h = 17;
az.bmp = AZ;
az.w = 1012;
az.h = 16;
wnd_draw();
for (;;)
{
kol_sleep(6-speed);
screen_draw();
event = kol_event_check();
switch (event)
{
case 1:
paintbg = 1;
wnd_draw();
break;
case 2:
key = (kol_key_get() & 0xff00)>>8;
if (start && (32==key))
{
start = 0;
game_start();
screen_draw();
break;
}
if (27 == key)
{
if (-1 == pause)
break;
start = 1;
paintbg = 1;
break;
}
if (32 == key)
{
if (-1 == pause)
break;
kol_sound_speaker(snd_ok);
drx *= -1;
screen_draw();
}
if ((!start) && (13 == key))
{
pause *= -1;
screen_draw();
}
break;
case 3:
if ( 1 == (kol_btn_get() & 0xff00)>>8 )
kol_exit();
break;
};
}
}