6,6 → 6,10 |
Copyright (C) 2008 O.Bogomaz |
*/ |
|
#ifndef AUTOBUILD |
#include "lang.h--" |
#endif |
|
#define MEMSIZE 1024 * 60; |
|
#include "..\lib\kolibri.h" |
15,18 → 19,14 |
#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; |
libimg_image objects; |
|
int lives=0, level=0, score=0; |
int don_x, don_y, don_h, don_w=39, don_type, don_image_y; |
int don_h_mas[8] = { 18,36,18,37,12,32,24,37 }; |
int bus_x, bus_w=21, bus_y=145, bus_h=44; |
int don_x, don_y, don_h, don_w=68, don_type, don_image_y, don_step_y, don_step_y_default=3; |
int don_h_mas[8] = { 36,72,36,74,24,64,48,74 }; |
int bus_x, bus_w=42, bus_y, bus_h=88, bus_y_default=290; |
|
#define SCR_MENU_MAIN 1 |
#define SCR_GAME 2 |
34,8 → 34,8 |
|
#define RAND -1 |
|
#define WIN_X 258 |
#define WIN_Y 191 |
#define WIN_X 516 |
#define WIN_Y 382 |
|
int screen_type=SCR_MENU_MAIN; |
|
43,7 → 43,7 |
|
int active_menu_item=0; |
|
char *ITEMS_LIST[]={ |
char *MENU_LIST[]={ |
"New game", |
"Control keys", |
"About", |
64,28 → 64,24 |
don_offset_y = don_image_y - y; |
y = 0; |
} |
|
debugval("y", y); |
debugval("don_h", don_h); |
debugval("image_h", image_h); |
debugval("don_offset_y", don_offset_y); |
DrawScaledImage(objects.image, x, y, don_w, image_h, 0, don_offset_y); |
if (y>=don_step_y) DrawBar(x, y-don_step_y, don_w, don_step_y, COLOR_ROAD); //Fill donkey old parts |
if (image_h>0) DrawLibImage(objects.image, x, y, don_w, image_h, 0, don_offset_y); |
} |
void DrawBus(dword x, y) { DrawScaledImage(objects.image, x, y, bus_w, bus_h, 0, 222); } |
void DrawBoom(dword x, y) { DrawScaledImage(objects.image, x, y, 39, 33, 0, 268); } |
void DrawHighway() { DrawScaledImage(road.image, 0,0, WIN_X, WIN_Y, 0, 0); } |
void DrawMenuBackground() { DrawScaledImage(menu.image, 0, 0, WIN_X, WIN_Y, 0, 0); } |
void DrawBus(dword x, y) { DrawLibImage(objects.image, x, y, bus_w, bus_h, 0, 444); } |
void DrawBoom(dword x, y) { DrawLibImage(objects.image, x, y, 78, 66, 0, 536); } |
void DrawHighway() { DrawLibImage(road.image, 0,0, WIN_X, WIN_Y, 0, 0); } |
void DrawMenuBackground() { DrawLibImage(menu.image, 0, 0, WIN_X, WIN_Y, 0, 0); } |
|
void main() |
{ |
randomize(); |
GetNewObstacle(RAND); |
StartNewGame(); |
|
load_dll(libio, #libio_init,1); |
load_dll(libimg, #libimg_init,1); |
Libimg_LoadImage(#menu, "/sys/fonts/menu.png"); |
Libimg_LoadImage(#road, "/sys/fonts/road.png"); |
Libimg_LoadImage(#objects, "/sys/fonts/objects.png"); |
Libimg_LoadImage(#menu, "menu.png"); |
Libimg_LoadImage(#road, "road.png"); |
Libimg_LoadImage(#objects, "objects.png"); |
|
loop() |
{ |
114,30 → 110,28 |
{ |
if (active_menu_item==0) |
{ |
lives=3; |
level=0; |
score=0; |
StartNewGame(); |
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.4 Alpha\n\nAuthor: Leency\nMenu image from Freepik.com'tI"); |
if (active_menu_item==2) notify("'The Bus\nVersion v0.9\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, bus_y, bus_w, bus_h+1, COLOR_ROAD); |
DrawBar(bus_x*80+200, bus_y, bus_w, bus_h+1, 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, bus_y, bus_w, bus_h+1, COLOR_ROAD); |
DrawBar(bus_x*80+200, bus_y, bus_w, bus_h+1, 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, bus_y, bus_w, bus_h+1, COLOR_ROAD); |
DrawBar(bus_x*80+200, bus_y, bus_w, bus_h+1, COLOR_ROAD); |
bus_x=1; |
} |
if (key_scancode == SCAN_CODE_KEY_P) |
149,7 → 143,7 |
break; |
|
case evReDraw: |
DefineAndDrawWindow(250,150,WIN_X * SCALE-1+10,WIN_Y * SCALE-1+skin_height+5,0x74,0,"The Bus",0); |
DefineAndDrawWindow(250,150,WIN_X-1,WIN_Y-1,0x01,0,"The Bus",0); //0x74 is also possible if you fix bottom border |
DrawScreen(); |
break; |
|
158,16 → 152,67 |
break; |
|
default: |
if (screen_type==SCR_GAME) DrawRoad(); |
if (screen_type==SCR_GAME) |
{ |
if ((don_x == bus_x)&&(don_y + don_h > bus_y )&&(don_y < bus_y + don_h )) { |
lives--; |
DrawBus(bus_x*80+200,bus_y); |
DrawBoom(bus_x*80+180,302); |
pause(150); |
GetNewObstacle(RAND); |
DrawScreen(); |
} |
|
if (lives==0) { |
DrawGameOverMessage(); |
break; |
} |
|
don_y += don_step_y; |
|
if (don_y - don_step_y >= WIN_Y) |
{ |
GetNewObstacle(RAND); |
score++; |
bus_y -= don_step_y+1; |
DrawBar(bus_x*80+200, bus_y+bus_h, bus_w, don_step_y, COLOR_ROAD); |
WriteScore(); |
} |
|
if (score) && (score % 15 == 0) |
{ |
score++; |
NewLevel(); |
DrawScreen(); |
don_step_y++; |
} |
|
DrawRoad(); |
} |
} |
} |
} |
|
void NewLevel() |
{ |
level++; |
bus_y = bus_y_default; |
} |
|
void StartNewGame() |
{ |
lives=3; |
level=0; |
score=0; |
bus_y = bus_y_default; |
don_step_y = don_step_y_default; |
GetNewObstacle(RAND); |
} |
|
void WriteScore() { |
DrawScaledImage(road.image, 10, 83, 60, 12, 10, 82); |
WriteScaledText(10, 70, 0x80, 0xFFFFFF, "Score"); |
WriteScaledText(10, 83, 0x80, 0xFFFFFF, itoa(score)); |
DrawLibImage(road.image, 20, 166, 120, 24, 20, 164); |
WriteText(20, 140, 0x81, 0xFFFFFF, "Score"); |
WriteText(20, 166, 0x81, 0xFFFFFF, itoa(score)); |
} |
|
void SetScreen(dword _screen_type) { |
181,36 → 226,24 |
if (screen_type==SCR_MENU_MAIN) |
{ |
DrawMenuBackground(); |
WriteScaledText(10, 10, 0x80, 0xE8783F, "TAKE THE CHILDREN HOME"); |
$add ebx, 2 << 16 |
$int 64 |
WriteTextB(20, 20, 0x82, 0xE8783F, "THE BUS"); |
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)); |
WriteText(20, 20, 0x81, 0xFFFFFF, "Lives"); |
WriteText(20, 46, 0x81, 0xFFFFFF, itoa(lives)); |
WriteText(20, 80, 0x81, 0xFFFFFF, "Level"); |
WriteText(20, 106, 0x81, 0xFFFFFF, itoa(level)); |
WriteScore(); |
DrawRoad(); |
if (screen_type==SCR_PAUSE) { |
DrawScaledBar(0,0,70,30,0xFF0000); |
WriteScaledText(5,7,0x81,0xFFFfff,"PAUSE"); |
DrawBar(0,0,140,60,0xFF0000); |
WriteText(10,14,0x83,0xFFFfff,"PAUSE"); |
} |
} |
/* |
if (screen_type==SCR_PAUSE) |
{ |
for (i = 0; i < 8; i++) //calculate image y offset for current obstacle |
{ |
GetNewObstacle(i); |
DrawObstacle(don_w+1*i, 10); |
} |
} |
*/ |
} |
|
|
void DrawMenuList() |
223,72 → 256,39 |
{ |
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]); |
WriteText(20+2, item_n*56+116+2, 0x81, 0xAAAaaa, MENU_LIST[text_n]); |
WriteText(20, item_n*56+116, 0x81, color, MENU_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 |
DrawBar(0, 0, WIN_X, WIN_Y, 0xF3E1BD); |
WriteText(40, 40, 0x81, 0xA48C74, "GAME OVER"); |
WriteText(40, 75, 0x81, 0xA48C74, "FINAL SCORE"); |
WriteTextB(40, 140, 0x85, 0xA48C74, itoa(score)); |
pause(350); |
active_menu_item=0; |
SetScreen(SCR_MENU_MAIN); |
} |
|
void DrawAccident() |
{ |
DrawBus(bus_x*40+100,bus_y); |
DrawBoom(bus_x*40+90,151); |
pause(150); |
lives--; |
don_y = -don_h; |
DrawScreen(); |
if (lives>0) DrawScaledBar(bus_x*40+90, 147-17, 39, 45+23, COLOR_ROAD); |
} |
|
void GetNewObstacle(int N) |
{ |
int i; |
don_x = random(2); |
if (N==RAND) { |
don_type = random(7); |
} |
else { |
don_type = N; |
} |
if (N==RAND) don_type = random(7); else don_type = N; |
don_h = don_h_mas[don_type]; |
don_y = -don_h+1; |
don_y = -don_h; |
don_image_y = 0; |
for (i = 0; i < don_type; i++) //calculate image y offset for current obstacle |
{ |
don_image_y += don_h_mas[i]+1; |
for (i = 0; i < don_type; i++) don_image_y += don_h_mas[i]+2; //calculate image y offset for current obstacle |
} |
} |
|
#define LINE_LENGTH 10 |
void DrawRoad() |
int line_y=0; |
void DrawLineSeparator() |
{ |
int y, line_y; |
|
if ((don_x == bus_x)&&(don_y + don_h > bus_y )&&(don_y < bus_y + don_h )) DrawAccident(); |
|
if (lives==0) { |
DrawGameOverMessage(); |
return; |
} |
|
if (screen_type != SCR_PAUSE) |
{ |
line_y+=2; |
don_y+=2; |
} |
|
int y; |
if (screen_type == SCR_GAME) line_y += don_step_y; |
//the beginning of the white dashed line between two roadways |
if (line_y>=20) { |
line_y=0; |
295,24 → 295,22 |
} |
else |
{ |
DrawScaledBar(129, 0, 1, line_y, COLOR_ROAD); |
DrawScaledBar(129, 0, 1, line_y-LINE_LENGTH, 0xDDE9F2); |
DrawBar(258, 0, 2, line_y, COLOR_ROAD); |
DrawBar(258, 0, 2, line_y-LINE_LENGTH, 0xDDE9F2); |
} |
for (y=0; y<WIN_Y-20; 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); |
DrawBar(258, line_y+y, 2, LINE_LENGTH, 0xDDE9F2); |
DrawBar(258, line_y+y+LINE_LENGTH, 2, LINE_LENGTH, COLOR_ROAD); |
} |
if (don_y >= WIN_Y) |
} |
|
void DrawRoad() |
{ |
GetNewObstacle(RAND); |
score++; |
WriteScore(); |
DrawLineSeparator(); |
DrawObstacle(don_w+10*don_x+186,don_y); |
DrawBus(bus_x*80+200,bus_y); |
} |
DrawScaledBar(don_x*don_w+93, don_y-2, 30, 2, COLOR_ROAD); //Fill donkey old parts |
DrawObstacle(don_x*don_w+90,don_y); |
DrawBus(bus_x*40+100,147); |
} |
|
|
|