#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_color.h>
#include <math.h>
ALLEGRO_DISPLAY *d;
ALLEGRO_EVENT_QUEUE *q;
ALLEGRO_EVENT e;
ALLEGRO_TIMER *t;
ALLEGRO_COLOR c;
bool k[ALLEGRO_KEY_MAX];
int w = 30;
int h = 38;
int s = 16;
int a, b, g;
double p = ALLEGRO_PI, f;
bool r;
int x, y, px, py, kx, ky, sx, sy;
int gx[4], gy[4], dx[4], dy[4];
char n[] =
" "
" "
" "
" "
" ############################ "
" #............##............# "
" #.####.#####.##.#####.####.# "
" #.# #.# #.##.# #.# #.# "
" #.####.#####.##.#####.####.# "
" #..........................# "
" #.####.##.########.##.####.# "
" #.####.##.########.##.####.# "
" #......##....##....##......# "
" ######.##### ## #####.###### "
" #.##### ## #####.# "
" #.## [] ##.# "
" #.## ### ### ##.# "
" ######.## #~~~~~~# ##.###### "
" . #[][][]# . "
" ######.## #~~~~~~# ##.###### "
" #.## ######## ##.# "
" #.## ##.# "
" #.## ######## ##.# "
" ######.## ######## ##.###### "
" #............##............# "
" #.####.#####.##.#####.####.# "
" #.####.#####.##.#####.####.# "
" #...##.......().......##...# "
" ###.##.##.########.##.##.### "
" ###.##.##.########.##.##.### "
" #......##....##....##......# "
" #.##########.##.##########.# "
" #.##########.##.##########.# "
" #..........................# "
" ############################ "
" "
" "
" ";
char *m;
#define P(x) (((x) - 1) * s)
#define Q(x) (1 + (x) / s)
#define M(x, y) m[(y) * w + (x)]
int main() {
srand(time(NULL));
al_init();
al_install_keyboard();
al_init_primitives_addon();
al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST);
al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST);
d = al_create_display((w - 2) * s, (h - 2) * s);
al_set_window_title(d, "Bambam and the Globals");
q = al_create_event_queue();
t = al_create_timer(1.0 / 60);
al_register_event_source(q, al_get_keyboard_event_source());
al_register_event_source(q, al_get_timer_event_source(t));
al_register_event_source(q, al_get_display_event_source(d));
al_start_timer(t);
m = malloc(strlen(n) + 1);
restart:
strcpy(m, n);
b = 0;
y = 1;
starty:
x = 1;
startx:
if (M(x, y) != '(') goto noparenthesis;
px = P(x) + s;
py = P(y) + s / 2;
noparenthesis:
if (M(x, y) != '[') goto nobracket;
gx[b] = P(x) + s;
gy[b] = P(y) + s / 2;
if (b == 0) goto notfirst;
sx = gx[0];
sy = gy[0];
notfirst:
b++;
nobracket:
x++;
if (x < w - 1) goto startx;
y++;
if (y < h - 1) goto starty;
mainloop:
if (!r || !al_is_event_queue_empty(q)) goto dontdraw;
al_clear_to_color(al_color_name("black"));
b = 7;
loopdrawhighlight:
c = al_color_name("blue");
if (b == 1) c = al_color_name("wheat");
y = 1;
loopdrawy:
x = 1;
loopdrawx:
if (M(x, y) != '.') goto nodot;
al_draw_filled_rectangle(
P(x) + s * 0.4,
P(y) + s * 0.4,
P(x) + s * 0.6,
P(y) + s * 0.6,
al_color_name("peachpuff"));
nodot:
if (M(x, y) != '#') goto nohash;
a = 1 * (M(x + 0, y - 1) == '#') +
2 * (M(x + 1, y - 1) == '#') +
4 * (M(x + 1, y + 0) == '#') +
8 * (M(x + 1, y + 1) == '#') +
16 * (M(x + 0, y + 1) == '#') +
32 * (M(x - 1, y + 1) == '#') +
64 * (M(x - 1, y + 0) == '#') +
128 * (M(x - 1, y - 1) == '#');
if (a == 64)
al_draw_line(P(x), P(y) + s / 2, P(x) + s,
P(y) + s / 2, c, b);
else if (a == 4)
al_draw_line(P(x), P(y) + s / 2, P(x) + s,
P(y) + s / 2, c, b);
else if ((a & 85) == 5)
al_draw_arc(P(x) + s, P(y),
s / 2, p / 2, p / 2, c, b);
else if ((a & 85) == 20)
al_draw_arc(P(x) + s, P(y) + s,
s / 2, p, p / 2, c, b);
else if ((a & 85) == 65)
al_draw_arc(P(x), P(y),
s / 2, 0, p / 2, c, b);
else if ((a & 85) == 80)
al_draw_arc(P(x), P(y) + s,
s / 2, p * 1.5, p / 2, c, b);
else if ((a & 7) == 5)
al_draw_arc(P(x) + s, P(y),
s / 2, p / 2, p / 2, c, b);
else if ((a & 28) == 20)
al_draw_arc(P(x) + s, P(y) + s,
s / 2, p, p / 2, c, b);
else if ((a & 193) == 65)
al_draw_arc(P(x), P(y),
s / 2, 0, p / 2, c, b);
else if ((a & 112) == 80)
al_draw_arc(P(x), P(y) + s,
s / 2, p * 1.5, p / 2, c, b);
else if ((a & 17) == 17)
al_draw_line(P(x) + s / 2, P(y), P(x) + s / 2,
P(y) + s, c, b);
else if ((a & 68) == 68)
al_draw_line(P(x), P(y) + s / 2, P(x) + s,
P(y) + s / 2, c, b);
nohash:
x++;
if (x < w - 1) goto loopdrawx;
y++;
if (y < h - 1) goto loopdrawy;
b -= 6;
if (b > 0) goto loopdrawhighlight;
b = 0;
looptwice:
al_draw_filled_pieslice(px + b * (w - 2) * s, py, s,
f + p * 0.25 * fabs(sin(2 * p * (g % 60) / 60.0)),
p * 2 - p * 0.5 * fabs(sin(2 * p * (g % 60) / 60.0)),
al_color_name("yellow"));
b++;
if (b < 2) goto looptwice;
b = 0;
loopdrawghosts:
if (b == 0) c = al_color_name("red");
if (b == 1) c = al_color_name("cyan");
if (b == 2) c = al_color_name("pink");
if (b == 3) c = al_color_name("orange");
x = gx[b];
y = gy[b];
al_draw_filled_pieslice(x, y, s, p * 0.6, p * 1.8, c);
al_draw_filled_triangle(x, y, x - s, y, x - s, y + s, c);
al_draw_filled_triangle(x, y, x + s, y, x + s, y + s, c);
al_draw_filled_rectangle(x - s * 0.5, y,
x + s * 0.5, y + s * 0.5, c);
al_draw_filled_circle(x - s * 0.5, y, s * 0.25,
al_color_name("white"));
al_draw_filled_circle(x + s * 0.5, y, s * 0.25,
al_color_name("white"));
b++;
if (b < 4) goto loopdrawghosts;
al_flip_display();
g++;
r = false;
dontdraw:
al_wait_for_event(q, &e);
if (e.type == ALLEGRO_EVENT_DISPLAY_CLOSE) goto done;
if (e.type != ALLEGRO_EVENT_TIMER) goto nottimer;
if (k[ALLEGRO_KEY_ESCAPE]) goto done;
if (k[ALLEGRO_KEY_LEFT]) {kx = -1; ky = 0; f = p;}
if (k[ALLEGRO_KEY_RIGHT]) {kx = 1; ky = 0; f = 0;}
if (k[ALLEGRO_KEY_UP]) {kx = 0; ky = -1; f = p * 1.5;}
if (k[ALLEGRO_KEY_DOWN]) {kx = 0; ky = 1; f = p * 0.5;}
if (M(Q(px + kx * s / 2), Q(py + ky * s / 2)) == '#') goto cango;
px += kx;
py += ky;
if (px < -s) px += (w - 2) * s;
if (px > (w - 3) * s) px -= (w - 2) * s;
if (M(Q(px + kx * s), Q(py + ky * s)) == '.')
M(Q(px + kx * s), Q(py + ky * s)) = ' ';
cango:
b = 0;
loopghosts:
x = gx[b] - px;
y = gy[b] - py;
if (x * x + y * y < s * s * 2 * 2) goto restart;
if (dx[b] == 0 && dy[b] == 0) dx[b] = (rand() % 2) * 2 - 1;
if (M(Q(gx[b]), Q(gy[b])) != '~') goto noteleport;
gx[b] = sx;
gy[b] = sy;
dy[b] = 0;
noteleport:
if (M(Q(gx[b] + dx[b] * s / 2), Q(gy[b] + dy[b] * s / 2)) == '#')
goto ghostwall;
gx[b] += dx[b];
gy[b] += dy[b];
goto ghostmoved;
ghostwall:
if (dx[b] == 0) goto nodx;
dx[b] = 0;
dy[b] = (rand() % 2) * 2 - 1;
goto ghostmoved;
nodx:
dy[b] = 0;
dx[b] = (rand() % 2) * 2 - 1;
ghostmoved:
b++;
if (b < 4) goto loopghosts;
r = true;
goto mainloop;
nottimer:
if (e.type == ALLEGRO_EVENT_KEY_DOWN) k[e.keyboard.keycode] = true;
if (e.type == ALLEGRO_EVENT_KEY_UP) k[e.keyboard.keycode] = false;
goto mainloop;
done:
free(m);
al_uninstall_system();
} |