// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein // // SPDX-License-Identifier: AGPL-3.0-or-later #ifndef CONTENT_H #define CONTENT_H #include #include #include "ser.h" #include "vec.h" #define SIGHT_RANGE 15 #define PKT_NODES_MAX (50*50) typedef enum : uint16_t { N_VALLEY_FLOWER = 0, N_MOUNTAIN_FLOWER, N_BIG_TREE, 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_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; #define ser_entity_cmd ser_u8 #define deser_entity_cmd deser_u8 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