eco2d/code/game/header/world/world.h

80 lines
2.5 KiB
C
Raw Normal View History

2021-05-04 17:41:30 +00:00
#pragma once
#include "system.h"
#include "librg.h"
2021-05-05 09:25:05 +00:00
#include "packet.h"
2021-05-04 17:41:30 +00:00
#include "flecs/flecs.h"
#define WORLD_ERROR_NONE +0x0000
#define WORLD_ERROR_OUTOFMEM -0x0001
#define WORLD_ERROR_INVALID_BLOCKS -0x0002
#define WORLD_ERROR_INVALID_DIMENSIONS -0x0003
#define WORLD_ERROR_INVALID_BUFFER -0x0004
#define WORLD_ERROR_TRACKER_FAILED -0x0005
2021-05-09 14:41:19 +00:00
#define WORLD_LAYERING 0
#define WORLD_TRACKER_LAYERS 3
2021-05-09 19:12:11 +00:00
#define WORLD_TRACKER_UPDATE_FAST_MS 100
#define WORLD_TRACKER_UPDATE_NORMAL_MS 500
#define WORLD_TRACKER_UPDATE_SLOW_MS 1000
2021-05-15 11:43:29 +00:00
#define WORLD_BLOCK_SIZE 64
2021-05-04 19:22:55 +00:00
#define WORLD_PKT_READER(name) int32_t name(void* data, uint32_t datalen, void *udata)
2021-05-04 17:41:30 +00:00
typedef WORLD_PKT_READER(world_pkt_reader_proc);
2021-05-04 19:22:55 +00:00
#define WORLD_PKT_WRITER(name) int32_t name(pkt_header *pkt, void *udata)
2021-05-04 17:41:30 +00:00
typedef WORLD_PKT_WRITER(world_pkt_writer_proc);
2021-05-12 14:02:12 +00:00
typedef struct {
uint8_t *data;
uint32_t seed;
uint32_t size;
uint16_t chunk_size;
uint16_t chunk_amount;
2021-07-26 15:53:18 +00:00
uint8_t **block_mapping;
2021-05-12 14:02:12 +00:00
uint16_t dim;
uint64_t tracker_update[3];
uint8_t active_layer_id;
ecs_world_t *ecs;
ecs_query_t *ecs_update;
2021-07-27 11:30:43 +00:00
ecs_entity_t chunk_handle;
2021-07-26 15:53:18 +00:00
ecs_entity_t *chunk_mapping;
2021-05-12 14:02:12 +00:00
librg_world *tracker;
world_pkt_reader_proc *reader_proc;
world_pkt_writer_proc *writer_proc;
} world_data;
2021-05-06 15:30:38 +00:00
void world_setup_pkt_handlers(world_pkt_reader_proc *reader_proc, world_pkt_writer_proc *writer_proc);
2021-05-12 16:28:39 +00:00
int32_t world_init(int32_t seed, uint16_t chunk_size, uint16_t chunk_amount);
2021-05-04 17:41:30 +00:00
int32_t world_destroy(void);
int32_t world_update(void);
2021-05-12 14:42:22 +00:00
2021-05-04 19:22:55 +00:00
int32_t world_read(void* data, uint32_t datalen, void *udata);
int32_t world_write(pkt_header *pkt, void *udata);
2021-05-04 17:41:30 +00:00
uint32_t world_buf(uint8_t const **ptr, uint32_t *width);
ecs_world_t * world_ecs(void);
librg_world * world_tracker(void);
uint16_t world_chunk_size(void);
2021-05-08 06:55:12 +00:00
uint16_t world_chunk_amount(void);
uint16_t world_dim(void);
2021-07-26 15:53:18 +00:00
ecs_entity_t world_chunk_mapping(librg_chunk id);
typedef struct {
uint32_t id;
uint8_t block_id;
2021-07-27 11:30:43 +00:00
ecs_entity_t chunk_e;
int64_t chunk_id;
2021-07-26 15:53:18 +00:00
float ox, oy;
} world_block_lookup;
2021-07-27 11:30:43 +00:00
world_block_lookup world_block_from_realpos(float x, float y);
world_block_lookup world_block_from_index(int64_t id, uint16_t block_idx);
int64_t world_chunk_from_realpos(float x, float y);
int64_t world_chunk_from_entity(ecs_entity_t id);
void world_chunk_replace_block(int64_t id, uint16_t block_idx, uint8_t block_id);
uint8_t *world_chunk_get_blocks(int64_t id);
void world_chunk_mark_dirty(ecs_entity_t e);
uint8_t world_chunk_is_dirty(ecs_entity_t e);