diff options
author | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2024-07-13 12:51:05 +0200 |
---|---|---|
committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2024-07-13 12:51:05 +0200 |
commit | 591232eba1809643df1f4a6075ff9581b8bb2f7a (patch) | |
tree | 92e2c464158d03ef9c83f153ba5b88c39581d9f8 /src/content.h | |
parent | 95283d70eee749d984b2ca07c0b61d39f9bb350d (diff) |
move headers to src
Signed-off-by: Lizzy Fleckenstein <lizzy@vlhl.dev>
Diffstat (limited to 'src/content.h')
-rw-r--r-- | src/content.h | 177 |
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 |