#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 #define MAX_PLACEABLE_CELLS 16 typedef struct { unsigned char r, g, b, a; } Color; typedef struct { char index; unsigned char opacity; char padding[2]; } ImageRef; typedef struct { int x, y, w, h; Color fill; Color border; ImageRef image; } 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 { IMAGE_NULL, IMAGE_CONTINUE, IMAGE_EXIT, IMAGE_PAUSE, IMAGE_PLAY, IMAGE_RETRY, IMAGE_NELSON, IMAGE_NELSON_LEFT, IMAGE_NELSON_UP, IMAGE_NELSON_RIGHT, IMAGE_NELSON_DOWN, N_IMAGES, }; static const char colorImages[N_COLORS] = { /*[RED] = IMAGE_NELSON, [RED_LEFT] = IMAGE_NELSON_LEFT, [RED_UP] = IMAGE_NELSON_UP, [RED_RIGHT] = IMAGE_NELSON_RIGHT, [RED_DOWN] = IMAGE_NELSON_DOWN,*/ }; enum { BUTTON_BACK, BUTTON_RETRY, BUTTON_PLAY, BUTTON_CONTINUE, N_BUTTONS, }; typedef struct { int width, height; int mousex, mousey; } UI; typedef enum { BUTTON_STATE_IDLE, BUTTON_STATE_HOVERED, BUTTON_STATE_PRESSED } ButtonState; typedef struct { int x, y, w, h; } Button; typedef struct { // 0 if only 1 blue is needed, 1 if 9 are needed char need9; char spawnRate; char grid[GRIDWIDTH * GRIDHEIGHT]; int goalx, goaly; int spawnerx, spawnery; char placeableCells[MAX_PLACEABLE_CELLS]; // Color } Level; typedef struct { uint64_t lastTick; char playing; char levelComplete; // How many blues have reached the end char blues; char need9; char grid[GRIDWIDTH * GRIDHEIGHT]; int goalx, goaly; int spawnerx, spawnery; int spawnerCount; ButtonState buttonStates[N_BUTTONS]; int currentLevel; char placeableCells[MAX_PLACEABLE_CELLS]; } State; // Mirror these in src/index.html.in enum { INPUT_NONE, INPUT_CLICK, INPUT_RCLICK, INPUT_PAUSE_PLAY, INPUT_MOVE, INPUT_RESTART, }; typedef struct { State state; UI ui; int input; } 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