code: various improvements
parent
401edb98c9
commit
f74b66e7b4
Binary file not shown.
|
@ -32,7 +32,7 @@ static ecs_entity_t *temp_actors = NULL;
|
||||||
#define REPLAY_VERSION 2
|
#define REPLAY_VERSION 2
|
||||||
|
|
||||||
static char replay_filename[1024] = {0};
|
static char replay_filename[1024] = {0};
|
||||||
static char replaybuf[UINT16_MAX];
|
static char replaybuf[sizeof(replay_record)*UINT16_MAX + 32];
|
||||||
|
|
||||||
void debug_replay_store(void) {
|
void debug_replay_store(void) {
|
||||||
assert(replay_filename[0]);
|
assert(replay_filename[0]);
|
||||||
|
|
|
@ -86,8 +86,8 @@ static int UIMeasureText(const char *text, int fontSize);
|
||||||
|
|
||||||
#include "debug_replay.c"
|
#include "debug_replay.c"
|
||||||
|
|
||||||
#include "debug_ui_widgets.c"
|
|
||||||
#include "debug_ui_actions.c"
|
#include "debug_ui_actions.c"
|
||||||
|
#include "debug_ui_widgets.c"
|
||||||
|
|
||||||
static debug_item items[] = {
|
static debug_item items[] = {
|
||||||
{
|
{
|
||||||
|
@ -109,6 +109,19 @@ static debug_item items[] = {
|
||||||
.list = {
|
.list = {
|
||||||
.items = (debug_item[]) {
|
.items = (debug_item[]) {
|
||||||
{ .kind = DITEM_BUTTON, .name = "spawn car", .on_click = ActSpawnCar },
|
{ .kind = DITEM_BUTTON, .name = "spawn car", .on_click = ActSpawnCar },
|
||||||
|
{
|
||||||
|
.kind = DITEM_LIST,
|
||||||
|
.name = "demo npcs",
|
||||||
|
.list = {
|
||||||
|
.items = (debug_item[]) {
|
||||||
|
{ .kind = DITEM_TEXT, .name = "npcs", .proc = DrawDemoNPCCount },
|
||||||
|
{ .kind = DITEM_BUTTON, .name = "spawn 1000 npcs", .on_click = ActSpawnDemoNPCs },
|
||||||
|
{ .kind = DITEM_BUTTON, .name = "remove all demo npcs", .on_click = ActDespawnDemoNPCs },
|
||||||
|
{ .kind = DITEM_END },
|
||||||
|
},
|
||||||
|
.is_collapsed = true
|
||||||
|
}
|
||||||
|
},
|
||||||
{ .kind = DITEM_END },
|
{ .kind = DITEM_END },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,3 +112,37 @@ ActReplayLoad(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(zaklaus): Demo NPCs
|
||||||
|
static ecs_entity_t *demo_npcs = NULL;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ActSpawnDemoNPCs(void) {
|
||||||
|
if (!demo_npcs) zpl_array_init(demo_npcs, zpl_heap());
|
||||||
|
if (zpl_array_count(demo_npcs) >= 10000) return;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < 1000; i++) {
|
||||||
|
uint64_t e = entity_spawn(EKIND_DEMO_NPC);
|
||||||
|
ecs_add(world_ecs(), e, EcsDemoNPC);
|
||||||
|
Position *pos = ecs_get_mut(world_ecs(), e, Position, NULL);
|
||||||
|
pos->x=rand() % world_dim();
|
||||||
|
pos->y=rand() % world_dim();
|
||||||
|
|
||||||
|
Velocity *v = ecs_get_mut(world_ecs(), e, Velocity, NULL);
|
||||||
|
v->x = (rand()%3-1) * 100;
|
||||||
|
v->y = (rand()%3-1) * 100;
|
||||||
|
|
||||||
|
zpl_array_append(demo_npcs, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ActDespawnDemoNPCs(void) {
|
||||||
|
if (!demo_npcs) return;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < zpl_array_count(demo_npcs); i++) {
|
||||||
|
entity_despawn(demo_npcs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
zpl_array_free(demo_npcs);
|
||||||
|
demo_npcs = 0;
|
||||||
|
}
|
|
@ -76,3 +76,11 @@ DrawReplayFileName(debug_item *it, float xpos, float ypos) {
|
||||||
(void)it;
|
(void)it;
|
||||||
return DrawFormattedText(xpos, ypos, TextFormat("%s", replay_filename[0] ? replay_filename : "<unnamed>"));
|
return DrawFormattedText(xpos, ypos, TextFormat("%s", replay_filename[0] ? replay_filename : "<unnamed>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(zaklaus): demo npcs
|
||||||
|
|
||||||
|
static inline debug_draw_result
|
||||||
|
DrawDemoNPCCount(debug_item *it, float xpos, float ypos) {
|
||||||
|
(void)it;
|
||||||
|
return DrawFormattedText(xpos, ypos, TextFormat("%d", demo_npcs ? zpl_array_count(demo_npcs) : 0));
|
||||||
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@ int main(int argc, char** argv) {
|
||||||
zpl_opts_add(&opts, "r", "random-seed", "generate random world seed", ZPL_OPTS_FLAG);
|
zpl_opts_add(&opts, "r", "random-seed", "generate random world seed", ZPL_OPTS_FLAG);
|
||||||
//zpl_opts_add(&opts, "cs", "chunk-size", "amount of blocks within a chunk (single axis)", ZPL_OPTS_INT);
|
//zpl_opts_add(&opts, "cs", "chunk-size", "amount of blocks within a chunk (single axis)", ZPL_OPTS_INT);
|
||||||
zpl_opts_add(&opts, "ws", "world-size", "amount of chunks within a world (single axis)", ZPL_OPTS_INT);
|
zpl_opts_add(&opts, "ws", "world-size", "amount of chunks within a world (single axis)", ZPL_OPTS_INT);
|
||||||
zpl_opts_add(&opts, "n", "npc-count", "amount of demo npcs to spawn", ZPL_OPTS_INT);
|
|
||||||
|
|
||||||
uint32_t ok = zpl_opts_compile(&opts, argc, argv);
|
uint32_t ok = zpl_opts_compile(&opts, argc, argv);
|
||||||
|
|
||||||
|
@ -49,7 +48,6 @@ int main(int argc, char** argv) {
|
||||||
uint16_t num_viewers = zpl_opts_integer(&opts, "viewer-count", 1);
|
uint16_t num_viewers = zpl_opts_integer(&opts, "viewer-count", 1);
|
||||||
uint16_t chunk_size = DEFAULT_CHUNK_SIZE; //zpl_opts_integer(&opts, "chunk-size", DEFAULT_CHUNK_SIZE);
|
uint16_t chunk_size = DEFAULT_CHUNK_SIZE; //zpl_opts_integer(&opts, "chunk-size", DEFAULT_CHUNK_SIZE);
|
||||||
uint16_t world_size = zpl_opts_integer(&opts, "world-size", DEFAULT_WORLD_SIZE);
|
uint16_t world_size = zpl_opts_integer(&opts, "world-size", DEFAULT_WORLD_SIZE);
|
||||||
uint32_t npc_count = zpl_opts_integer(&opts, "npc-count", 1000);
|
|
||||||
|
|
||||||
if (zpl_opts_has_arg(&opts, "random-seed")) {
|
if (zpl_opts_has_arg(&opts, "random-seed")) {
|
||||||
zpl_random rnd={0};
|
zpl_random rnd={0};
|
||||||
|
@ -66,23 +64,6 @@ int main(int argc, char** argv) {
|
||||||
sighandler_register();
|
sighandler_register();
|
||||||
game_init(is_viewer_only, num_viewers, seed, chunk_size, world_size, is_dash_enabled);
|
game_init(is_viewer_only, num_viewers, seed, chunk_size, world_size, is_dash_enabled);
|
||||||
|
|
||||||
// TODO(zaklaus): VERY TEMPORARY -- SPAWN SOME NPCS THAT RANDOMLY MOVE
|
|
||||||
#if 1
|
|
||||||
{
|
|
||||||
for (uint32_t i = 0; i < npc_count; i++) {
|
|
||||||
uint64_t e = entity_spawn(EKIND_DEMO_NPC);
|
|
||||||
ecs_add(world_ecs(), e, EcsDemoNPC);
|
|
||||||
Position *pos = ecs_get_mut(world_ecs(), e, Position, NULL);
|
|
||||||
pos->x=rand() % world_dim();
|
|
||||||
pos->y=rand() % world_dim();
|
|
||||||
|
|
||||||
Velocity *v = ecs_get_mut(world_ecs(), e, Velocity, NULL);
|
|
||||||
v->x = (rand()%3-1) * 100;
|
|
||||||
v->y = (rand()%3-1) * 100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (game_is_running()) {
|
while (game_is_running()) {
|
||||||
profile (PROF_MAIN_LOOP) {
|
profile (PROF_MAIN_LOOP) {
|
||||||
game_input();
|
game_input();
|
||||||
|
|
|
@ -26,6 +26,7 @@ static Camera2D render_camera;
|
||||||
void platform_init() {
|
void platform_init() {
|
||||||
InitWindow(screenWidth, screenHeight, "eco2d - client");
|
InitWindow(screenWidth, screenHeight, "eco2d - client");
|
||||||
SetWindowState(FLAG_WINDOW_UNDECORATED|FLAG_WINDOW_MAXIMIZED|FLAG_WINDOW_RESIZABLE);
|
SetWindowState(FLAG_WINDOW_UNDECORATED|FLAG_WINDOW_MAXIMIZED|FLAG_WINDOW_RESIZABLE);
|
||||||
|
|
||||||
SetTargetFPS(0);
|
SetTargetFPS(0);
|
||||||
|
|
||||||
screenWidth = GetScreenWidth();
|
screenWidth = GetScreenWidth();
|
||||||
|
|
|
@ -51,8 +51,8 @@ entity_view world_build_entity_view(int64_t e) {
|
||||||
view.heading = veh->heading;
|
view.heading = veh->heading;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ecs_get(world_ecs(), e, Chunk)) {
|
Chunk *chpos = 0;
|
||||||
Chunk *chpos = ecs_get_mut(world_ecs(), e, Chunk, 0);
|
if ((chpos = ecs_get_mut_if(world_ecs(), e, Chunk))) {
|
||||||
view.x = chpos->x;
|
view.x = chpos->x;
|
||||||
view.y = chpos->y;
|
view.y = chpos->y;
|
||||||
view.blocks_used = 1;
|
view.blocks_used = 1;
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
|
|
||||||
#define WORLD_LAYERING 0
|
#define WORLD_LAYERING 0
|
||||||
#define WORLD_TRACKER_LAYERS 3
|
#define WORLD_TRACKER_LAYERS 3
|
||||||
#define WORLD_TRACKER_UPDATE_FAST_MS 100
|
#define WORLD_TRACKER_UPDATE_FAST_MS 10
|
||||||
#define WORLD_TRACKER_UPDATE_NORMAL_MS 500
|
#define WORLD_TRACKER_UPDATE_NORMAL_MS 50
|
||||||
#define WORLD_TRACKER_UPDATE_SLOW_MS 1000
|
#define WORLD_TRACKER_UPDATE_SLOW_MS 100
|
||||||
#define WORLD_BLOCK_SIZE 64
|
#define WORLD_BLOCK_SIZE 64
|
||||||
|
|
||||||
#define WORLD_PKT_READER(name) int32_t name(void* data, uint32_t datalen, void *udata)
|
#define WORLD_PKT_READER(name) int32_t name(void* data, uint32_t datalen, void *udata)
|
||||||
|
|
|
@ -19,14 +19,6 @@ ECS_TYPE_DECLARE(Walking);
|
||||||
ECS_TYPE_DECLARE(Flying);
|
ECS_TYPE_DECLARE(Flying);
|
||||||
ECS_TYPE_DECLARE(EcsClient);
|
ECS_TYPE_DECLARE(EcsClient);
|
||||||
|
|
||||||
// NOTE(zaklaus): custom macro to define meta components outside the current scope
|
|
||||||
|
|
||||||
#ifndef ECS_META_DEFINE
|
|
||||||
#define ECS_META_DEFINE(world, T)\
|
|
||||||
ECS_COMPONENT_DEFINE(world, T);\
|
|
||||||
ecs_new_meta(world, ecs_entity(T), &__##T##__);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ComponentsImport(ecs_world_t *ecs) {
|
void ComponentsImport(ecs_world_t *ecs) {
|
||||||
ECS_MODULE(ecs, Components);
|
ECS_MODULE(ecs, Components);
|
||||||
ECS_IMPORT(ecs, FlecsMeta);
|
ECS_IMPORT(ecs, FlecsMeta);
|
||||||
|
|
|
@ -2,6 +2,20 @@
|
||||||
#include "flecs/flecs.h"
|
#include "flecs/flecs.h"
|
||||||
#include "flecs/flecs_meta.h"
|
#include "flecs/flecs_meta.h"
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE(zaklaus): custom macro to define meta components outside the current scope
|
||||||
|
|
||||||
|
#ifndef ECS_META_DEFINE
|
||||||
|
#define ECS_META_DEFINE(world, T)\
|
||||||
|
ECS_COMPONENT_DEFINE(world, T);\
|
||||||
|
ecs_new_meta(world, ecs_entity(T), &__##T##__);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ecs_get_mut_if
|
||||||
|
#define ecs_get_mut_if(world, entity, component)\
|
||||||
|
(ecs_get(world, entity, component) ? ecs_get_mut(world, entity, component, NULL) : NULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
ECS_STRUCT(Vector2D, {
|
ECS_STRUCT(Vector2D, {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
|
|
|
@ -7,14 +7,15 @@ void EnterOrLeaveVehicle(ecs_iter_t *it) {
|
||||||
|
|
||||||
for (int i = 0; i < it->count; i++) {
|
for (int i = 0; i < it->count; i++) {
|
||||||
if (!in[i].use) continue;
|
if (!in[i].use) continue;
|
||||||
|
in[i].use = false;
|
||||||
|
|
||||||
if (!world_entity_valid(in[i].parent)) {
|
if (!world_entity_valid(in[i].parent)) {
|
||||||
size_t ents_count;
|
size_t ents_count;
|
||||||
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 2);
|
int64_t *ents = world_chunk_query_entities(it->entities[i], &ents_count, 2);
|
||||||
|
|
||||||
for (size_t j = 0; j < ents_count; j++) {
|
for (size_t j = 0; j < ents_count; j++) {
|
||||||
if (ecs_get(world_ecs(), ents[j], Vehicle)) {
|
Vehicle *veh = 0;
|
||||||
Vehicle *veh = ecs_get_mut(world_ecs(), ents[j], Vehicle, NULL);
|
if ((veh = ecs_get_mut_if(world_ecs(), ents[j], Vehicle))) {
|
||||||
Position const* p2 = ecs_get(world_ecs(), ents[j], Position);
|
Position const* p2 = ecs_get(world_ecs(), ents[j], Position);
|
||||||
|
|
||||||
float dx = p2->x - p[i].x;
|
float dx = p2->x - p[i].x;
|
||||||
|
@ -34,9 +35,8 @@ void EnterOrLeaveVehicle(ecs_iter_t *it) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ecs_get(world_ecs(), in[i].parent, Vehicle)) {
|
Vehicle *veh = 0;
|
||||||
Vehicle *veh = ecs_get_mut(world_ecs(), in[i].parent, Vehicle, NULL);
|
if ((veh = ecs_get_mut_if(world_ecs(), in[i].parent, Vehicle))) {
|
||||||
|
|
||||||
for (int k = 0; k < 4; k++) {
|
for (int k = 0; k < 4; k++) {
|
||||||
if (veh->seats[k] == it->entities[i]) {
|
if (veh->seats[k] == it->entities[i]) {
|
||||||
veh->seats[k] = 0;
|
veh->seats[k] = 0;
|
||||||
|
|
Loading…
Reference in New Issue