#ifndef INCLUDE_TYPES_C #define INCLUDE_TYPES_C #include "all.c" #define MEM_SIZE (1<<24) #define GRIDWIDTH 20 #define GRIDHEIGHT 16 #define TICK_LENGTH 200 #define GRID_OFFSET_X 64 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, }; enum { BUTTON_CONTINUE, BUTTON_RETRY, BUTTON_BACK, N_BUTTONS, }; typedef struct { int width, height; } UI; typedef enum { BUTTON_STATE_IDLE, BUTTON_STATE_HOVERED, BUTTON_STATE_PRESSED } ButtonState; typedef struct { int x, y, w, h; } Button; typedef struct { uint64_t lastTick; char playing; int grid[GRIDWIDTH * GRIDHEIGHT]; int goalx, goaly; ButtonState buttonStates[N_BUTTONS]; } 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; } #endif // INCLUDE_TYPES_C