#include "pxl8_protocol.h" #include "pxl8_bytes.h" usize pxl8_protocol_serialize_header(const pxl8_msg_header* msg, u8* buf, usize len) { if (len < sizeof(pxl8_msg_header)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u32_be(&s, msg->sequence); pxl8_write_u16_be(&s, msg->size); pxl8_write_u8(&s, msg->type); pxl8_write_u8(&s, msg->version); return s.offset; } usize pxl8_protocol_deserialize_header(const u8* buf, usize len, pxl8_msg_header* msg) { if (len < sizeof(pxl8_msg_header)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); msg->sequence = pxl8_read_u32_be(&s); msg->size = pxl8_read_u16_be(&s); msg->type = pxl8_read_u8(&s); msg->version = pxl8_read_u8(&s); return s.offset; } usize pxl8_protocol_serialize_input(const pxl8_input_msg* msg, u8* buf, usize len) { if (len < sizeof(pxl8_input_msg)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u32_be(&s, msg->buttons); pxl8_write_f32_be(&s, msg->look_dx); pxl8_write_f32_be(&s, msg->look_dy); pxl8_write_f32_be(&s, msg->move_x); pxl8_write_f32_be(&s, msg->move_y); pxl8_write_f32_be(&s, msg->yaw); pxl8_write_u64_be(&s, msg->tick); pxl8_write_u64_be(&s, msg->timestamp); return s.offset; } usize pxl8_protocol_deserialize_input(const u8* buf, usize len, pxl8_input_msg* msg) { if (len < sizeof(pxl8_input_msg)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); msg->buttons = pxl8_read_u32_be(&s); msg->look_dx = pxl8_read_f32_be(&s); msg->look_dy = pxl8_read_f32_be(&s); msg->move_x = pxl8_read_f32_be(&s); msg->move_y = pxl8_read_f32_be(&s); msg->yaw = pxl8_read_f32_be(&s); msg->tick = pxl8_read_u64_be(&s); msg->timestamp = pxl8_read_u64_be(&s); return s.offset; } usize pxl8_protocol_serialize_command(const pxl8_command_msg* msg, u8* buf, usize len) { if (len < sizeof(pxl8_command_msg)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u16_be(&s, msg->cmd_type); pxl8_write_bytes(&s, msg->payload, PXL8_COMMAND_PAYLOAD_SIZE); pxl8_write_u16_be(&s, msg->payload_size); pxl8_write_u64_be(&s, msg->tick); return s.offset; } usize pxl8_protocol_deserialize_command(const u8* buf, usize len, pxl8_command_msg* msg) { if (len < sizeof(pxl8_command_msg)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); msg->cmd_type = pxl8_read_u16_be(&s); pxl8_read_bytes(&s, msg->payload, PXL8_COMMAND_PAYLOAD_SIZE); msg->payload_size = pxl8_read_u16_be(&s); msg->tick = pxl8_read_u64_be(&s); return s.offset; } usize pxl8_protocol_serialize_entity_state(const pxl8_entity_state* state, u8* buf, usize len) { if (len < sizeof(pxl8_entity_state)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u64_be(&s, state->entity_id); pxl8_write_bytes(&s, state->userdata, 56); return s.offset; } usize pxl8_protocol_deserialize_entity_state(const u8* buf, usize len, pxl8_entity_state* state) { if (len < sizeof(pxl8_entity_state)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); state->entity_id = pxl8_read_u64_be(&s); pxl8_read_bytes(&s, state->userdata, 56); return s.offset; } usize pxl8_protocol_serialize_event(const pxl8_event_msg* msg, u8* buf, usize len) { if (len < sizeof(pxl8_event_msg)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u8(&s, msg->event_type); pxl8_write_bytes(&s, msg->payload, PXL8_EVENT_PAYLOAD_SIZE); return s.offset; } usize pxl8_protocol_deserialize_event(const u8* buf, usize len, pxl8_event_msg* msg) { if (len < sizeof(pxl8_event_msg)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); msg->event_type = pxl8_read_u8(&s); pxl8_read_bytes(&s, msg->payload, PXL8_EVENT_PAYLOAD_SIZE); return s.offset; } usize pxl8_protocol_serialize_snapshot_header(const pxl8_snapshot_header* hdr, u8* buf, usize len) { if (len < sizeof(pxl8_snapshot_header)) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u16_be(&s, hdr->entity_count); pxl8_write_u16_be(&s, hdr->event_count); pxl8_write_u64_be(&s, hdr->player_id); pxl8_write_u64_be(&s, hdr->tick); pxl8_write_f32_be(&s, hdr->time); return s.offset; } usize pxl8_protocol_deserialize_snapshot_header(const u8* buf, usize len, pxl8_snapshot_header* hdr) { if (len < sizeof(pxl8_snapshot_header)) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); hdr->entity_count = pxl8_read_u16_be(&s); hdr->event_count = pxl8_read_u16_be(&s); hdr->player_id = pxl8_read_u64_be(&s); hdr->tick = pxl8_read_u64_be(&s); hdr->time = pxl8_read_f32_be(&s); return s.offset; } usize pxl8_protocol_serialize_chunk_msg_header(const pxl8_chunk_msg_header* hdr, u8* buf, usize len) { if (len < 24) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u8(&s, hdr->chunk_type); pxl8_write_u8(&s, hdr->flags); pxl8_write_u8(&s, hdr->fragment_idx); pxl8_write_u8(&s, hdr->fragment_count); pxl8_write_u32_be(&s, hdr->id); pxl8_write_u32_be(&s, (u32)hdr->cx); pxl8_write_u32_be(&s, (u32)hdr->cy); pxl8_write_u32_be(&s, (u32)hdr->cz); pxl8_write_u32_be(&s, hdr->version); pxl8_write_u16_be(&s, hdr->payload_size); pxl8_write_u16_be(&s, hdr->reserved); return s.offset; } usize pxl8_protocol_deserialize_chunk_msg_header(const u8* buf, usize len, pxl8_chunk_msg_header* hdr) { if (len < 24) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); hdr->chunk_type = pxl8_read_u8(&s); hdr->flags = pxl8_read_u8(&s); hdr->fragment_idx = pxl8_read_u8(&s); hdr->fragment_count = pxl8_read_u8(&s); hdr->id = pxl8_read_u32_be(&s); hdr->cx = (i32)pxl8_read_u32_be(&s); hdr->cy = (i32)pxl8_read_u32_be(&s); hdr->cz = (i32)pxl8_read_u32_be(&s); hdr->version = pxl8_read_u32_be(&s); hdr->payload_size = pxl8_read_u16_be(&s); hdr->reserved = pxl8_read_u16_be(&s); return s.offset; } usize pxl8_protocol_deserialize_bsp_wire_header(const u8* buf, usize len, pxl8_bsp_wire_header* hdr) { if (len < 44) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); hdr->num_vertices = pxl8_read_u32_be(&s); hdr->num_edges = pxl8_read_u32_be(&s); hdr->num_faces = pxl8_read_u32_be(&s); hdr->num_planes = pxl8_read_u32_be(&s); hdr->num_nodes = pxl8_read_u32_be(&s); hdr->num_leafs = pxl8_read_u32_be(&s); hdr->num_surfedges = pxl8_read_u32_be(&s); hdr->num_marksurfaces = pxl8_read_u32_be(&s); hdr->num_cell_portals = pxl8_read_u32_be(&s); hdr->visdata_size = pxl8_read_u32_be(&s); hdr->num_vertex_lights = pxl8_read_u32_be(&s); return s.offset; } usize pxl8_protocol_serialize_chunk_enter(const pxl8_chunk_enter_msg* msg, u8* buf, usize len) { if (len < 8) return 0; pxl8_write_stream s = pxl8_write_stream_create(buf, (u32)len); pxl8_write_u32_be(&s, msg->chunk_id); pxl8_write_u8(&s, msg->chunk_type); pxl8_write_u8(&s, msg->reserved[0]); pxl8_write_u8(&s, msg->reserved[1]); pxl8_write_u8(&s, msg->reserved[2]); return s.offset; } usize pxl8_protocol_deserialize_chunk_enter(const u8* buf, usize len, pxl8_chunk_enter_msg* msg) { if (len < 8) return 0; pxl8_stream s = pxl8_stream_create(buf, (u32)len); msg->chunk_id = pxl8_read_u32_be(&s); msg->chunk_type = pxl8_read_u8(&s); msg->reserved[0] = pxl8_read_u8(&s); msg->reserved[1] = pxl8_read_u8(&s); msg->reserved[2] = pxl8_read_u8(&s); return s.offset; }