iconFOSDEM 2012 in Brussels

2012-02-26

Really need to add a blog entry about this - I was there a few weeks ago. Was coding some Wesnoth related stuff: units.wesnoth.org Also not directly related, I made a Pacman clone while bored: It uses no external datafiles, just plain Allegro 5 primitives:
#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();
}