// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein // // SPDX-License-Identifier: AGPL-3.0-or-later #ifndef CONTENT_H #define CONTENT_H #include #include #include "vec.h" typedef enum { N_VALLEY_FLOWER, N_MOUNTAIN_FLOWER, N_BIG_TREE, N_NEEDLE_TREE, N_ROCK, N_WATER, N_PLANK, N_PATH, N_GRASS, N_SAND, } node_type; typedef struct { uint8_t r, g, b; } color; static inline uint32_t color_to_u32(color c) { return ((uint32_t) c.b) | (((uint32_t) c.g) << 8) | (((uint32_t) c.r) << 16); } static inline color color_from_u32(uint32_t u) { return (color) { (u >> 16) & 0xFF, (u >> 8) & 0xFF, u & 0xFF }; } typedef struct { bool present; node_type type; int8_t z; // for rocks, indicates rock level color col; } node; #define SIGHT_RANGE 10 #define NODES_PKT_MAX (50*50) typedef enum { DIR_RIGHT = 0, DIR_UP, DIR_LEFT, DIR_DOWN, } dir; static inline vec2 dir_to_vec2(dir d) { switch (d) { case DIR_RIGHT: return VEC2(0, 1); case DIR_UP: return VEC2(-1, 0); case DIR_LEFT: return VEC2(0, -1); case DIR_DOWN: return VEC2(1, 0); } } typedef uint8_t fail_reason; #define ser_fail_reason ser_u8 #define deser_fail_reason deser_u8 enum { FAIL_WRONG_PASS = 0, FAIL_ALREADY_ONLINE, }; typedef uint16_t pkt_type; #define ser_pkt_type ser_u16 #define deser_pkt_type deser_u16 enum { CPKT_HI = 0, // len motd CPKT_FAIL, // fail_reason CPKT_PLAYERS, // len [len name id] CPKT_MOVE, // player_id remove x y CPKT_NODES, // box2 [node] CPKT_RESET_MAP, }; enum { SPKT_HI = 0, // len name len password SPKT_MOVE, // move_dir }; #endif