summaryrefslogtreecommitdiff
path: root/src/content.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/content.h')
-rw-r--r--src/content.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/content.h b/src/content.h
new file mode 100644
index 0000000..ef27e22
--- /dev/null
+++ b/src/content.h
@@ -0,0 +1,177 @@
+// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein <lizzy@vlhl.dev>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+#ifndef CONTENT_H
+#define CONTENT_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "ser.h"
+#include "vec.h"
+
+#define SIGHT_RANGE 15
+#define PKT_NODES_MAX (50*50)
+
+typedef enum : uint16_t {
+ N_BIG_TREE = 0,
+ N_NEEDLE_TREE,
+ N_ROCK,
+ N_WATER,
+ N_PLANK,
+ N_PATH,
+ N_GRASS,
+ N_SAND,
+} node_type;
+
+#define ser_node_type ser_u16
+#define deser_node_type deser_u16
+
+typedef struct {
+ uint8_t r, g, b;
+} color;
+
+[[maybe_unused]] static void ser_color(strbuf *w, color c)
+{
+ ser_u8(w, c.r);
+ ser_u8(w, c.g);
+ ser_u8(w, c.b);
+}
+
+[[maybe_unused]] static bool deser_color(str *r, color *c)
+{
+ return deser_u8(r, &c->r) && deser_u8(r, &c->g) && deser_u8(r, &c->b);
+}
+
+[[maybe_unused]] static uint32_t color_to_u32(color c)
+{
+ return ((uint32_t) c.b) | (((uint32_t) c.g) << 8) | (((uint32_t) c.r) << 16);
+}
+
+[[maybe_unused]] static color color_from_u32(uint32_t u)
+{
+ return (color) { (u >> 16) & 0xFF, (u >> 8) & 0xFF, u & 0xFF };
+}
+
+typedef enum : uint8_t {
+ FLOWER_ROSE = 0,
+ FLOWER_HIBISCUS,
+ FLOWER_SUNFLOWER,
+ FLOWER_TULIP,
+ FLOWER_DANDELION, // im in a field of dandelions...
+ FLOWER_COUNT,
+} flower_type;
+
+#define ser_flower_type ser_u8
+#define deser_flower_type deser_u8
+
+typedef struct {
+ bool present;
+ node_type type;
+ int8_t z; // for rocks, indicates rock level
+ color col;
+ uint8_t variant;
+} node;
+
+[[maybe_unused]] static void ser_node(strbuf *w, node *n)
+{
+ bool present = n != NULL && n->present;
+ ser_bool(w, present);
+ if (!present)
+ return;
+ ser_node_type(w, n->type);
+ ser_i8(w, n->z);
+ ser_color(w, n->col);
+ ser_u8(w, n->variant);
+}
+
+[[maybe_unused]] static bool deser_node(str *r, node *n)
+{
+ if (!deser_bool(r, &n->present)) return false;
+ if (!n->present) return true;
+
+ return deser_node_type(r, &n->type)
+ && deser_i8(r, &n->z)
+ && deser_color(r, &n->col)
+ && deser_u8(r, &n->variant);
+}
+
+typedef enum : uint8_t {
+ DIR_RIGHT = 0,
+ DIR_UP,
+ DIR_LEFT,
+ DIR_DOWN,
+} dir;
+
+#define ser_dir ser_u8
+#define deser_dir deser_u8
+
+[[maybe_unused]] static vec2 dir_to_vec2(dir d)
+{
+ switch (d) {
+ case DIR_RIGHT: return VEC2(1, 0);
+ case DIR_UP: return VEC2(0, -1);
+ case DIR_LEFT: return VEC2(-1, 0);
+ case DIR_DOWN: return VEC2(0, 1);
+ default: return VEC2(0, 0);
+ }
+}
+
+typedef enum : uint8_t {
+ FAIL_WRONG_PASS = 0,
+ FAIL_ALREADY_ONLINE,
+} fail_reason;
+
+#define ser_fail_reason ser_u8
+#define deser_fail_reason deser_u8
+
+typedef uint64_t entity_id;
+#define ser_entity_id ser_u64
+#define deser_entity_id deser_u64
+
+typedef enum : uint16_t {
+ ENTITY_PLAYER = 0,
+ ENTITY_FLOWER,
+} entity_type;
+
+#define ser_entity_type ser_u16
+#define deser_entity_type deser_u16
+
+typedef enum : uint8_t {
+ ENTITY_ADD = 0, // type
+ ENTITY_REMOVE,
+ ENTITY_MOVE, // x y
+ ENTITY_CMD_COUNT,
+} entity_cmd;
+
+#define ser_entity_cmd ser_u8
+#define deser_entity_cmd deser_u8
+
+typedef struct {
+ entity_id id;
+ entity_type type;
+ vec2 pos;
+ union {
+ flower_type flower;
+ };
+} entity;
+
+enum : uint16_t {
+ CPKT_HI = 0, // len motd
+ CPKT_FAIL, // fail_reason
+ CPKT_PLAYERS, // len [len name id]
+ CPKT_ENTITY, // len [entity_id command]
+ CPKT_NODES, // box2 [node]
+ CPKT_RESET_MAP,
+};
+
+enum : uint16_t {
+ SPKT_HI = 0, // len name len password
+ SPKT_MOVE, // dir
+};
+
+typedef uint16_t pkt_type;
+#define ser_pkt_type ser_u16
+#define deser_pkt_type deser_u16
+
+#endif