summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/content.h106
-rw-r--r--include/vec.h6
2 files changed, 88 insertions, 24 deletions
diff --git a/include/content.h b/include/content.h
index 664c84e..9d35dc8 100644
--- a/include/content.h
+++ b/include/content.h
@@ -7,9 +7,13 @@
#include <stdint.h>
#include <stdbool.h>
+#include "ser.h"
#include "vec.h"
-typedef enum {
+#define SIGHT_RANGE 10
+#define PKT_NODES_MAX (50*50)
+
+typedef enum : uint16_t {
N_VALLEY_FLOWER,
N_MOUNTAIN_FLOWER,
N_BIG_TREE,
@@ -22,16 +26,31 @@ typedef enum {
N_SAND,
} node_type;
+#define ser_node_type ser_u16
+#define deser_node_type deser_u16
+
typedef struct {
uint8_t r, g, b;
} color;
-static inline uint32_t color_to_u32(color c)
+[[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);
}
-static inline color color_from_u32(uint32_t u)
+[[maybe_unused]] static color color_from_u32(uint32_t u)
{
return (color) { (u >> 16) & 0xFF, (u >> 8) & 0xFF, u & 0xFF };
}
@@ -43,51 +62,92 @@ typedef struct {
color col;
} node;
-#define SIGHT_RANGE 10
-#define NODES_PKT_MAX (50*50)
+[[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);
+}
+
+[[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);
+}
-typedef enum {
+typedef enum : uint8_t {
DIR_RIGHT = 0,
DIR_UP,
DIR_LEFT,
DIR_DOWN,
} dir;
-static inline vec2 dir_to_vec2(dir d)
+#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(0, 1);
- case DIR_UP: return VEC2(-1, 0);
- case DIR_LEFT: return VEC2(0, -1);
- case DIR_DOWN: return VEC2(1, 0);
+ 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 uint8_t fail_reason;
+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
-enum {
- FAIL_WRONG_PASS = 0,
- FAIL_ALREADY_ONLINE,
-};
+typedef uint64_t entity_id;
+#define ser_entity_id ser_u64
+#define deser_entity_id deser_u64
-typedef uint16_t pkt_type;
-#define ser_pkt_type ser_u16
-#define deser_pkt_type deser_u16
+typedef enum : uint16_t {
+ ENTITY_PLAYER
+} entity_type;
+
+#define ser_entity_type ser_u16
+#define deser_entity_type deser_u16
+
+typedef enum : uint8_t {
+ ENTITY_ADD, // type
+ ENTITY_REMOVE,
+ ENTITY_MOVE, // x y
+} entity_cmd;
+
+#define ser_entity_cmd ser_u8
+#define deser_entity_cmd deser_u8
-enum {
+enum : uint16_t {
CPKT_HI = 0, // len motd
CPKT_FAIL, // fail_reason
CPKT_PLAYERS, // len [len name id]
- CPKT_MOVE, // player_id remove x y
+ CPKT_ENTITY, // len [entity_id command]
CPKT_NODES, // box2 [node]
CPKT_RESET_MAP,
};
-enum {
+enum : uint16_t {
SPKT_HI = 0, // len name len password
- SPKT_MOVE, // move_dir
+ SPKT_MOVE, // dir
};
+typedef uint16_t pkt_type;
+#define ser_pkt_type ser_u16
+#define deser_pkt_type deser_u16
+
#endif
diff --git a/include/vec.h b/include/vec.h
index ce1b921..d2d9e31 100644
--- a/include/vec.h
+++ b/include/vec.h
@@ -9,7 +9,7 @@
#include <stdbool.h>
#include "ser.h"
-#define VECFN static __attribute__((unused))
+#define VECFN [[maybe_unused]] static
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
@@ -22,12 +22,16 @@ typedef struct { S x; S y; } V; \
typedef struct { V pos; uvec2 size; } B; \
VECFN V V##_add(V a, V b) { return (V) { a.x+b.x, a.y+b.y }; } \
VECFN V V##_sub(V a, V b) { return (V) { a.x-b.x, a.y-b.y }; } \
+VECFN V V##_mul(V v, S s) { return (V) { v.x*s, v.y*s }; } \
+VECFN V V##_div(V v, S s) { return (V) { v.x/s, v.y/s }; } \
VECFN uvec2 V##_chksub(V a, V b) { return (uvec2) { CHKSUB(a.x, b.x), CHKSUB(a.y, b.y) }; } \
VECFN V V##_min(V a, V b) { return (V) { MIN(a.x, b.x), MIN(a.y, b.y) }; } \
VECFN V V##_max(V a, V b) { return (V) { MAX(a.x, b.x), MAX(a.y, b.y) }; } \
VECFN bool V##_eq(V a, V b) { return a.x == b.x && a.y == b.y; } \
VECFN bool V##_le(V a, V b) { return a.x <= b.x && a.y <= b.y; } \
VECFN bool V##_lt(V a, V b) { return a.x < b.x && a.y < b.y; } \
+VECFN V V##_zero() { return (V) { 0, 0 }; } \
+VECFN bool V##_iszero(V v) { return V##_eq(v, V##_zero()); } \
VECFN void ser_##V(strbuf *w, V v) { ser_##SER(w, v.x); ser_##SER(w, v.y); } \
VECFN bool deser_##V(str *r, V *v) { return deser_##SER(r, &v->x) && deser_##SER(r, &v->y); } \
VECFN void ser_##B(strbuf *w, B b) { ser_##V(w, b.pos); ser_uvec2(w, b.size); } \