diff options
Diffstat (limited to 'src/types.c')
-rw-r--r-- | src/types.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/types.c b/src/types.c new file mode 100644 index 0000000..c40d9c3 --- /dev/null +++ b/src/types.c @@ -0,0 +1,166 @@ +#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 |