275 lines
6.4 KiB
C
275 lines
6.4 KiB
C
#include "debug_ui.h"
|
|
#include "world/blocks.h"
|
|
#include "items.h"
|
|
|
|
void
|
|
ActExitGame(void) {
|
|
game_request_close();
|
|
}
|
|
|
|
void
|
|
ActSpawnCar(void) {
|
|
ecs_entity_t e = vehicle_spawn();
|
|
ecs_entity_t plr = camera_get().ent_id;
|
|
|
|
Position const* origin = ecs_get(world_ecs(), plr, Position);
|
|
Position * dest = ecs_get_mut(world_ecs(), e, Position, NULL);
|
|
*dest = *origin;
|
|
|
|
debug_replay_special_action(RPKIND_SPAWN_CAR);
|
|
}
|
|
|
|
void
|
|
ActSpawnIcemaker(void) {
|
|
ecs_entity_t e = item_spawn(IKIND_DEMO_ICEMAKER, 32);
|
|
ecs_entity_t plr = camera_get().ent_id;
|
|
|
|
Position const* origin = ecs_get(world_ecs(), plr, Position);
|
|
Position * dest = ecs_get_mut(world_ecs(), e, Position, NULL);
|
|
*dest = *origin;
|
|
|
|
debug_replay_special_action(RPKIND_SPAWN_ICEMAKER_ITEM);
|
|
}
|
|
|
|
void
|
|
ActSpawnCirclingDriver(void) {
|
|
ecs_entity_t plr = camera_get().ent_id;
|
|
ecs_entity_t ve = vehicle_spawn();
|
|
ecs_entity_t e = entity_spawn(EKIND_DEMO_NPC);
|
|
|
|
Position const *origin = ecs_get(world_ecs(), plr, Position);
|
|
Position *veh_dest = ecs_get_mut(world_ecs(), ve, Position, NULL);
|
|
Position *dest = ecs_get_mut(world_ecs(), e, Position, NULL);
|
|
*veh_dest = *origin;
|
|
*dest = *origin;
|
|
|
|
Input *input = ecs_get_mut(world_ecs(), e, Input, NULL);
|
|
zpl_zero_item(input);
|
|
input->x = input->y = 1.0f;
|
|
|
|
Vehicle *veh = ecs_get_mut(world_ecs(), ve, Vehicle, NULL);
|
|
veh->seats[0] = e;
|
|
|
|
ecs_set(world_ecs(), e, IsInVehicle, { .veh = ve });
|
|
|
|
debug_replay_special_action(RPKIND_SPAWN_CIRCLING_DRIVER);
|
|
}
|
|
|
|
void
|
|
ActPlaceIceRink(void) {
|
|
ecs_entity_t plr = camera_get().ent_id;
|
|
uint8_t watr_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_WATER);
|
|
Position const *p = ecs_get(world_ecs(), plr, Position);
|
|
float const bs = WORLD_BLOCK_SIZE;
|
|
|
|
for (int y = 0; y < 100; y++) {
|
|
for (int x = 0; x < 100; x++) {
|
|
world_block_lookup l = world_block_from_realpos((p->x - (x*bs)/2.0f), p->y - (y*bs)/2.0f);
|
|
world_chunk_replace_block(l.chunk_id, l.id, watr_id);
|
|
}
|
|
}
|
|
|
|
debug_replay_special_action(RPKIND_PLACE_ICE_RINK);
|
|
}
|
|
|
|
void
|
|
ActEraseWorldChanges(void) {
|
|
ecs_entity_t plr = camera_get().ent_id;
|
|
Position const *p = ecs_get(world_ecs(), plr, Position);
|
|
float const bs = WORLD_BLOCK_SIZE;
|
|
|
|
for (int y = 0; y < 100; y++) {
|
|
for (int x = 0; x < 100; x++) {
|
|
world_block_lookup l = world_block_from_realpos((p->x - (x*bs)/2.0f), p->y - (y*bs)/2.0f);
|
|
world_chunk_place_block(l.chunk_id, l.id, 0);
|
|
}
|
|
}
|
|
|
|
debug_replay_special_action(RPKIND_PLACE_ERASE_CHANGES);
|
|
}
|
|
|
|
// NOTE(zaklaus): Replay system
|
|
|
|
uint8_t
|
|
CondReplayStatusOn(void) {
|
|
return is_recording && !is_playing;
|
|
}
|
|
|
|
uint8_t
|
|
CondReplayStatusOff(void) {
|
|
return !is_recording && !is_playing;
|
|
}
|
|
|
|
uint8_t
|
|
CondReplayDataPresentAndNotPlaying(void) {
|
|
return records != NULL && !is_recording && !is_playing;
|
|
}
|
|
|
|
uint8_t
|
|
CondReplayIsPlaying(void) {
|
|
return records != NULL && !is_recording && is_playing;
|
|
}
|
|
|
|
uint8_t
|
|
CondReplayIsNotPlaying(void) {
|
|
return !is_recording && !is_playing;
|
|
}
|
|
|
|
uint8_t
|
|
CondReplayIsNotPlayingOrRecordsNotClear(void) {
|
|
return records != NULL && !is_recording && !is_playing;
|
|
}
|
|
|
|
void
|
|
ActReplayBegin(void) {
|
|
debug_replay_start();
|
|
}
|
|
|
|
void
|
|
ActReplayEnd(void) {
|
|
debug_replay_stop();
|
|
}
|
|
|
|
void
|
|
ActReplayRun(void) {
|
|
debug_replay_run();
|
|
}
|
|
|
|
void
|
|
ActReplayClear(void) {
|
|
debug_replay_clear();
|
|
}
|
|
|
|
|
|
void
|
|
ActReplayNew(void) {
|
|
debug_replay_clear();
|
|
zpl_zero_size(replay_filename, sizeof(replay_filename));
|
|
}
|
|
|
|
void
|
|
ActReplaySaveAs(void) {
|
|
if (!records) return;
|
|
char const *workdir = GetWorkingDirectory();
|
|
|
|
sfd_Options sfd = {
|
|
.title = "Save Macro",
|
|
.path = "art",
|
|
.filter_name = "eco2d Macro",
|
|
.filter = "*.dem",
|
|
};
|
|
|
|
char const *path = sfd_save_dialog(&sfd);
|
|
ChangeDirectory(workdir);
|
|
|
|
if (path) {
|
|
zpl_strcpy(replay_filename, zpl_bprintf("%s.dem", path));
|
|
debug_replay_store();
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
ActReplaySave(void) {
|
|
if (!replay_filename[0]) {
|
|
ActReplaySaveAs();
|
|
}
|
|
else debug_replay_store();
|
|
}
|
|
|
|
void
|
|
ActReplayLoad(void) {
|
|
char const *workdir = GetWorkingDirectory();
|
|
|
|
sfd_Options sfd = {
|
|
.title = "Load Macro",
|
|
.path = "art",
|
|
.filter_name = "eco2d Macro",
|
|
.filter = "*.dem",
|
|
};
|
|
|
|
char const *path = sfd_open_dialog(&sfd);
|
|
ChangeDirectory(workdir);
|
|
|
|
if (path) {
|
|
zpl_zero_size(replay_filename, sizeof(replay_filename));
|
|
zpl_strcpy(replay_filename, path);
|
|
debug_replay_clear();
|
|
debug_replay_load();
|
|
}
|
|
}
|
|
|
|
// NOTE(zaklaus): Demo NPCs
|
|
static ecs_entity_t *demo_npcs = NULL;
|
|
|
|
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) * 10;
|
|
v->y = (rand()%3-1) * 10;
|
|
|
|
zpl_array_append(demo_npcs, e);
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
// NOTE(zaklaus): world simulation controls
|
|
#define WORLDSIM_STEPPING 0.01f
|
|
static float sim_step_size = 0.1f;
|
|
|
|
void
|
|
ActWorldToggleSim(void) {
|
|
if (world_is_paused()) {
|
|
world_resume();
|
|
} else {
|
|
world_pause();
|
|
}
|
|
}
|
|
|
|
void
|
|
ActWorldIncrementSimStepSize(void) {
|
|
sim_step_size += WORLDSIM_STEPPING;
|
|
}
|
|
|
|
void
|
|
ActWorldDecrementSimStepSize(void) {
|
|
if (sim_step_size > WORLDSIM_STEPPING)
|
|
sim_step_size -= WORLDSIM_STEPPING;
|
|
}
|
|
|
|
void
|
|
ActWorldStep(void) {
|
|
world_step(sim_step_size);
|
|
}
|
|
|
|
uint8_t
|
|
CondIsWorldPaused(void) {
|
|
return world_is_paused();
|
|
}
|
|
|
|
uint8_t
|
|
CondIsWorldRunning(void) {
|
|
return !world_is_paused();
|
|
}
|