0,0 → 1,293 |
/* |
THE BUS |
Copyright (C) 2008, 2012, 2017 Leency |
Menu image from Freepik.com |
D O N K E Y |
Copyright (C) 2008 O.Bogomaz |
*/ |
|
#define MEMSIZE 1024 * 60; |
|
#include "..\lib\kolibri.h" |
#include "..\lib\random.h" |
|
#include "..\lib\obj\libio_lib.h" |
#include "..\lib\obj\libimg_lib.h" |
#include "..\lib\patterns\libimg_load_skin.h" |
|
#define SCALE 2 |
|
#include "draw_scalled.h" |
|
libimg_image menu; |
libimg_image road; |
|
int lives=0, level=0, score=0; |
int don_x, don_y, don_h=40, don_type; |
int bus_x, bus_y=147; |
|
#define SCR_MENU_MAIN 1 |
#define SCR_GAME 2 |
#define SCR_PAUSE 3 |
|
|
#define WIN_X 258 * SCALE |
#define WIN_Y 191 * SCALE |
|
int screen_type=SCR_MENU_MAIN; |
|
#define COLOR_ROAD 0x6D879B; |
|
int active_menu_item=0; |
|
char *ITEMS_LIST[]={ |
"New game", |
"Control keys", |
"About", |
"Exit", |
0}; |
|
|
//actually it has to be named DrawObstacle(), but I like Donkey more :) |
void DrawDonkey(signed int x, y) { |
int don_offset_x; |
int don_offset_y; |
int image_h; |
|
if (don_type<4) { |
don_offset_y=0; |
don_offset_x=don_type*40; |
} |
else { |
don_offset_y = don_h + 1; |
don_offset_x=don_type-3*40; |
} |
|
image_h = don_h; |
if (y < 0) { |
image_h = don_h + y+1; |
don_offset_y = don_h + y; |
y = 0; |
} |
|
DrawScaledImage(road.image, x, y, 39, image_h, don_offset_x, don_offset_y); |
} |
void DrawBus(dword x, y) { DrawScaledImage(road.image, x, y, 21, 45, 237, 0); } |
void DrawBoom(dword x, y) { DrawScaledImage(road.image, x, y, 39, 34, 208, 47); } |
void DrawHighway() { DrawScaledImage(road.image, 0,0, WIN_X, WIN_Y, 0, 82); } |
void DrawMenuBackground() { DrawScaledImage(menu.image, 0, 0, WIN_X, WIN_Y, 0, 0); } |
|
void main() |
{ |
randomize(); |
|
load_dll(libio, #libio_init,1); |
load_dll(libimg, #libimg_init,1); |
Libimg_LoadImage(#menu, "/sys/fonts/home2x.png"); |
Libimg_LoadImage(#road, "/sys/fonts/busimg2x.png"); |
|
loop() |
{ |
WaitEventTimeout(1); |
|
switch(EAX & 0xFF) |
{ |
case evKey: |
GetKeys(); |
if (key_scancode == SCAN_CODE_ESC) |
{ |
if (screen_type==SCR_GAME) SetScreen(SCR_MENU_MAIN); |
else if (screen_type==SCR_MENU_MAIN) ExitProcess(); |
} |
if (key_scancode == SCAN_CODE_DOWN) && (screen_type==SCR_MENU_MAIN) |
{ |
if (active_menu_item<>3) active_menu_item++; ELSE active_menu_item=0; |
DrawMenuList(); |
} |
if (key_scancode == SCAN_CODE_UP) && (screen_type==SCR_MENU_MAIN) |
{ |
if (active_menu_item<>0) active_menu_item--; ELSE active_menu_item=3; |
DrawMenuList(); |
} |
if (key_scancode == SCAN_CODE_ENTER) && (screen_type==SCR_MENU_MAIN) |
{ |
if (active_menu_item==0) |
{ |
lives=3; |
level=0; |
score=0; |
SetScreen(SCR_GAME); |
} |
if (active_menu_item==1) notify("'The Bus\nControl keys:\nLeft, Right, Space\nPress P key for pause'tI"); |
if (active_menu_item==2) notify("'The Bus\nVersion v0.2 Alpha\n\nAuthor: Leency\nMenu image from Freepik.com'tI"); |
if (active_menu_item==3) ExitProcess(); |
} |
if (key_scancode == SCAN_CODE_SPACE) && (screen_type==SCR_GAME) |
{ |
DrawScaledBar(bus_x*40+100,147, 21,45, COLOR_ROAD); |
if (bus_x==1) bus_x=0; else bus_x=1; |
} |
if (key_scancode == SCAN_CODE_LEFT) && (screen_type==SCR_GAME) |
{ |
if (bus_x==0) break; |
DrawScaledBar(bus_x*40+100,147, 21,45, COLOR_ROAD); |
bus_x=0; |
} |
if (key_scancode == SCAN_CODE_RIGHT) && (screen_type==SCR_GAME) |
{ |
if (bus_x==1) break; |
DrawScaledBar(bus_x*40+100,147, 21,45, COLOR_ROAD); |
bus_x=1; |
} |
if (key_scancode == SCAN_CODE_KEY_P) |
{ |
if (screen_type==SCR_MENU_MAIN) break; |
else if (screen_type==SCR_GAME) SetScreen(SCR_PAUSE); |
else if (screen_type==SCR_PAUSE) SetScreen(SCR_GAME); |
} |
break; |
|
case evReDraw: |
DefineAndDrawWindow(250,150,WIN_X-1+10,WIN_Y-1+skin_height+7,0x74,0,"The Bus",0); |
DrawScreen(); |
break; |
|
case evButton: |
ExitProcess(); |
break; |
|
default: |
if (screen_type==SCR_GAME) DrawRoad(); |
break; |
} |
} |
} |
|
void WriteScore() { |
DrawScaledImage(road.image, 10, 83, 60, 12, 10, 83+82); |
WriteScaledText(10, 70, 0x80, 0xFFFFFF, "Score"); |
WriteScaledText(10, 83, 0x80, 0xFFFFFF, itoa(score)); |
} |
|
void SetScreen(dword _screen_type) { |
screen_type = _screen_type; |
DrawScreen(); |
} |
|
void DrawScreen() |
{ |
if (screen_type==SCR_MENU_MAIN) |
{ |
DrawMenuBackground(); |
WriteScaledText(10, 10, 0x80, 0xE8783F, "TAKE THE CHILDREN HOME"); |
$add ebx, 2 << 16 |
$int 64 |
DrawMenuList(); |
} |
if (screen_type==SCR_GAME) || (screen_type==SCR_PAUSE) |
{ |
DrawHighway(); |
WriteScaledText(10, 10, 0x80, 0xFFFFFF, "Lives"); |
WriteScaledText(10, 23, 0x80, 0xFFFFFF, itoa(lives)); |
WriteScaledText(10, 40, 0x80, 0xFFFFFF, "Level"); |
WriteScaledText(10, 53, 0x80, 0xFFFFFF, itoa(level)); |
WriteScore(); |
DrawRoad(); |
if (screen_type==SCR_PAUSE) { |
DrawScaledBar(0,0,70,30,0xFF0000); |
WriteScaledText(5,7,0x81,0xFFFfff,"PAUSE"); |
} |
} |
} |
|
|
void DrawMenuList() |
{ |
int j; |
for (j=0; j<4; j++) DrawMenuItem(j, j); |
} |
|
void DrawMenuItem(int item_n, text_n) |
{ |
dword color; |
if (active_menu_item==item_n) color = 0xFF0000; else color = 0xFFffff; |
WriteScaledText(10+1, item_n*28+48+1, 0x80, 0xAAAaaa, ITEMS_LIST[text_n]); |
WriteScaledText(10, item_n*28+48, 0x80, color, ITEMS_LIST[text_n]); |
} |
|
|
void DrawGameOverMessage() |
{ |
DrawScaledBar(0, 0, WIN_X, WIN_Y, 0xF3E1BD); |
WriteScaledText(20, 20, 0x80, 0xA48C74, "GAME OVER"); |
WriteScaledText(20, 40, 0x80, 0xA48C74, "FINAL SCORE"); |
WriteScaledText(20, 70, 0x84, 0xA48C74, itoa(score)); |
$add ecx, 2 << 16 |
$int 64 |
pause(350); |
active_menu_item=0; |
SetScreen(SCR_MENU_MAIN); |
return; |
} |
|
void DrawAccident() |
{ |
DrawBus(bus_x*40+100,bus_y); |
DrawBoom(bus_x*40+90,152); |
pause(150); |
lives--; |
don_y = -don_h; |
DrawScreen(); |
if (lives>0) DrawScaledBar(bus_x*40+90, 147-17, 39, 45+23, COLOR_ROAD); |
} |
|
#define LINE_LENGTH 10 |
void DrawRoad() |
{ |
byte y,line_y; |
|
if ((don_x == bus_x)&&(don_y + don_h > bus_y )&&(don_y + don_h < bus_y )) DrawAccident(); |
|
if (lives==0) { |
DrawGameOverMessage(); |
return; |
} |
|
if (screen_type != SCR_PAUSE) |
{ |
line_y+=2; |
don_y+=2; |
} |
|
//the beginning of the white dashed line between two roadways |
if (line_y>=20) { |
line_y=0; |
} |
else |
{ |
DrawScaledBar(129, 0, 1, line_y, COLOR_ROAD); |
DrawScaledBar(129, 0, 1, line_y-LINE_LENGTH, 0xDDE9F2); |
} |
for (y=0; y<190; y+=20) //white dashed line between two roadways |
{ |
DrawScaledBar(129, line_y+y, 1, LINE_LENGTH, 0xDDE9F2); |
DrawScaledBar(129, line_y+y+LINE_LENGTH, 1, LINE_LENGTH, COLOR_ROAD); |
} |
if (don_y>=210) |
{ |
don_x = random(2); |
don_y = -don_h; |
don_type = random(7); |
score++; |
WriteScore(); |
} |
DrawScaledBar(don_x*don_h+93, don_y-2, 30, 2, COLOR_ROAD); //Fill donkey old parts |
DrawDonkey(don_x*don_h+90,don_y); |
DrawBus(bus_x*don_h+100,147); |
} |
|
|
|
|
|
stop: |