#include "all.c" #define MEM_SIZE (1<<24) #define GRIDWIDTH 20 #define GRIDHEIGHT 16 #define TICK_LENGTH 200 typedef struct { unsigned char r, g, b, a; } Color; typedef struct { int x, y, w, h; Color fill; Color border; } DrawElement; typedef struct { int len; DrawElement els[2 * GRIDWIDTH * GRIDHEIGHT * 4]; } DrawList; typedef struct { char *start; char *end; } Arena; enum { EMPTY, BLACK, RED, YELLOW, RED_UP, RED_DOWN, RED_LEFT, RED_RIGHT, BLUE, BLUE_UP, BLUE_DOWN, BLUE_LEFT, BLUE_RIGHT, N_COLORS, }; typedef struct { int width, height; } UI; typedef struct { uint64_t lastTick; char playing; int grid[GRIDWIDTH * GRIDHEIGHT]; int goalx, goaly; } State; // Mirror these in src/index.html.in enum { INPUT_NONE, INPUT_CLICK, INPUT_RCLICK, INPUT_PAUSE_PLAY, }; typedef struct { State state; UI ui; int input; int mousex, mousey; } Game; #define new(a, c, t) ((t *) alloc(a, c, sizeof(t), _Alignof(t))) #define affirm(c) while (!(c)) *(volatile int *)0 = 0 static void xmemcpy(void *dst, void *src, ptrdiff_t size) { for (ptrdiff_t i = 0; i < size; i++) { ((char *) dst)[i] = ((char *) src)[i]; } } static void *alloc(Arena *a, ptrdiff_t count, ptrdiff_t size, ptrdiff_t align) { ptrdiff_t pad = -(size_t) a->start & (align - 1); affirm(count < (a->end - a->start - pad) / size); char *r = a->start + pad; a->start += pad + size * count; for (ptrdiff_t i = 0; i < count * size; i++) { r[i] = 0; } return r; }