ZealOS/src/Demo/Games/Halogen.ZC

184 lines
3.3 KiB
HolyC
Raw Normal View History

#define ROAD_NUM 512
#define ROAD_WIDTH_BY_2 200
2020-02-15 20:01:48 +00:00
#define CAR_WIDTH_BY_2 100
I64 road_x[ROAD_NUM], road_trend;
F64 speed, distance;
I64 road_ptr = 0, car_x;
F64 t_last;
2020-02-15 20:01:48 +00:00
Bool crash;
U0 DrawIt(CTask *task, CDC *dc)
2020-02-15 20:01:48 +00:00
{
I64 w = task->pix_width, h = task->pix_height;
I64 i, x, y, xx;
xx = w >> 1 - car_x + road_x[road_ptr & (ROAD_NUM - 1)];
dc->color = LTGRAY;
for (i = 0; i < ROAD_NUM; i++)
{
x = w >> 1 - car_x + road_x[(i + road_ptr) & (ROAD_NUM - 1)];
y = h - 0.5 * i;
if (y < (h + FONT_HEIGHT) >> 1)
break;
GrPlot(dc, x + ROAD_WIDTH_BY_2 - 0.4 * i, y);
GrPlot(dc, x - ROAD_WIDTH_BY_2 + 0.4 * i, y);
}
dc->color = WHITE;
2020-02-15 20:01:48 +00:00
x = w >> 1 - CAR_WIDTH_BY_2;
if (x < xx - ROAD_WIDTH_BY_2)
crash = TRUE;
GrLine(dc, x - 10, h, x - 40, h - 100);
GrLine(dc, x + 10, h, x + 40, h - 100);
2020-02-15 20:01:48 +00:00
x = w >> 1 + CAR_WIDTH_BY_2;
if (x > xx + ROAD_WIDTH_BY_2)
crash = TRUE;
GrLine(dc, x - 10, h, x - 40, h - 100);
GrLine(dc, x + 10, h, x + 40, h - 100);
2020-02-15 20:01:48 +00:00
dc->color = YELLOW;
if (crash)
GrPrint(dc, w >> 1 - FONT_WIDTH * 4, (h - FONT_HEIGHT) >> 1, "Game Over");
2020-02-15 20:01:48 +00:00
}
U0 UpdateRoad()
{
F64 t0 = tS;
distance += speed * (t0 - t_last);
t_last = t0;
while (distance > 1.0)
{
road_trend = ClampI64(road_trend + SignI64(RandU16 % 3 - 1), -5, 5);
road_x[road_ptr & (ROAD_NUM - 1)] = road_x[(road_ptr - 1) & (ROAD_NUM - 1)] += road_trend / 3;
road_ptr++;
distance -= 1.0;
}
2020-02-15 20:01:48 +00:00
}
U0 Init()
{
I64 i, x = 0;
DocClear;
"$$BG,DKGRAY$$%h*c", (TEXT_ROWS - 1) / 2, '\n';
speed = 0;
distance = 0;
road_trend = 0;
road_ptr = 0;
car_x = 0;
for (i = 0; i < ROAD_NUM; i++)
{
road_x[i] = x;
road_trend = ClampI64(road_trend + SignI64(RandU16 % 3 - 1), -5, 5);
x += road_trend / 3;
}
t_last = tS;
crash = FALSE;
2020-02-15 20:01:48 +00:00
}
U0 Halogen()
{
I64 arg1, arg2, ch=0, sc=0;
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
Fs->text_attr = BLACK << 4 + WHITE;
MenuPush( "File {"
" Abort(,CH_SHIFT_ESC);"
" Exit(,CH_ESC);"
"}"
"Play {"
" Restart(,'\n');"
" Accelerate(,,SC_CURSOR_UP);"
" Deccellerate(,,SC_CURSOR_DOWN);"
" Left(,,SC_CURSOR_LEFT);"
" Right(,,SC_CURSOR_RIGHT);"
"}"
);
AutoComplete;
WinBorder;
WinMax;
DocCursor;
Init;
Fs->draw_it = &DrawIt;
try
{
while (TRUE)
{
switch (MessageScan(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN | 1 << MESSAGE_KEY_UP))
{
case MESSAGE_KEY_DOWN:
ch = arg1;
sc = arg2;
switch (ch)
{
case '\n':
Init;
break;
case CH_ESC:
case CH_SHIFT_ESC:
goto ha_done;
}
break;
case MESSAGE_KEY_UP:
ch = arg1;
sc = arg2;
if (!ch)
switch (sc.u8[0])
{
case SC_CURSOR_RIGHT:
case SC_CURSOR_LEFT:
case SC_CURSOR_UP:
case SC_CURSOR_DOWN:
sc = 0;
break;
}
break;
}
switch (sc.u8[0])
{
case SC_CURSOR_RIGHT:
car_x++;
break;
case SC_CURSOR_LEFT:
car_x--;
break;
case SC_CURSOR_UP:
if (++speed > 200)
speed = 200;
break;
case SC_CURSOR_DOWN:
if (--speed < 0)
speed = 0;
break;
}
if (crash)
Sound;
else
{
if (speed)
Sound(Freq2Ona(speed + 10));
else
Sound;
UpdateRoad;
}
Sleep(10);
}
2020-02-15 20:01:48 +00:00
ha_done:
MessageGet(,, 1 << MESSAGE_KEY_UP);
}
catch
PutExcept;
MenuPop;
DocClear;
SettingsPop;
2020-02-15 20:01:48 +00:00
}
Halogen;