Back to shtanton's homepage
summaryrefslogtreecommitdiff
path: root/src/types.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/types.c')
-rw-r--r--src/types.c166
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