From 0c95f1148aee8377bc3363cbd7dd9aafd997d673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Tue, 27 Sep 2022 15:22:13 +0000 Subject: [PATCH] Revert "all storage systems are dynamic now" This reverts commit b6b632899d3e52b4771f50c1f012899ce5ae6c3a. --- code/foundation/src/core/game.c | 55 ++-- code/foundation/src/ents/entity.c | 13 +- code/foundation/src/ents/entity.h | 10 - code/foundation/src/ents/entity_spawnlist.c | 11 +- code/foundation/src/ents/items.c | 23 +- code/foundation/src/ents/items.h | 4 - code/foundation/src/ents/items_list.c | 32 +- code/foundation/src/ents/items_list_helpers.h | 10 +- code/foundation/src/gen/assets.c | 68 ++-- code/foundation/src/gen/assets.h | 40 +-- code/foundation/src/gen/assets_list.c | 60 ++-- .../src/gui/build_mode.c | 0 .../src/gui/inventory.c | 0 code/foundation/src/renderers/renderer_3d.c | 8 +- code/foundation/src/renderers/renderer_v0.c | 8 +- code/foundation/src/world/blocks.c | 36 +- code/foundation/src/world/blocks.h | 29 +- code/foundation/src/world/blocks_list.c | 39 ++- code/foundation/src/world/entity_view.h | 2 +- code/games/minimal/src/platform.c | 146 ++++++++- code/games/sandbox/src/platform.c | 307 ------------------ 21 files changed, 318 insertions(+), 583 deletions(-) rename code/{games/sandbox => foundation}/src/gui/build_mode.c (100%) rename code/{games/sandbox => foundation}/src/gui/inventory.c (100%) delete mode 100644 code/games/sandbox/src/platform.c diff --git a/code/foundation/src/core/game.c b/code/foundation/src/core/game.c index d00b5e5..7fa5c4b 100644 --- a/code/foundation/src/core/game.c +++ b/code/foundation/src/core/game.c @@ -6,7 +6,6 @@ #include "platform/signal_handling.h" #include "net/network.h" #include "ents/entity.h" -#include "ents/items.h" #include "world/world_view.h" #include "world/entity_view.h" #include "core/camera.h" @@ -32,7 +31,7 @@ static WORLD_PKT_READER(pkt_reader) { pkt_header header = {0}; uint32_t ok = pkt_header_decode(&header, data, datalen); header.udata = udata; - + if (ok && header.ok) { return pkt_handlers[header.id].handler(&header) >= 0; } else { @@ -67,7 +66,7 @@ static WORLD_PKT_WRITER(mp_cli_pkt_writer) { void world_viewers_init(uint32_t num_viewers) { zpl_buffer_init(world_viewers, zpl_heap(), num_viewers); - + for (uint32_t i = 0; i < num_viewers; i++) { zpl_buffer_append(world_viewers, world_view_create(i)); } @@ -129,39 +128,31 @@ float game_time() { void game_init(const char *ip, uint16_t port, game_kind play_mode, uint32_t num_viewers, int32_t seed, uint16_t chunk_size, uint16_t chunk_amount, int8_t is_dash_enabled) { game_mode = play_mode; game_should_close = false; - + #ifndef _DEBUG const char *host_ip = "lab.zakto.pw"; #else const char *host_ip = "127.0.0.1"; #endif - + uint16_t host_port = (port > 0) ? port : 27000; - + if (ip != NULL) { host_ip = ip; } - - // NOTE: initialise subsystems - { - assets_setup(); - blocks_setup(); - item_setup(); - entity_spawndef_setup(); - } - + if (game_mode != GAMEKIND_HEADLESS) { platform_init(); - + world_viewers_init(num_viewers); active_viewer = &world_viewers[0]; camera_reset(); } - + if (game_mode != GAMEKIND_SINGLE) { network_init(); } - + if (game_mode == GAMEKIND_CLIENT) { world_setup_pkt_handlers(pkt_reader, mp_cli_pkt_writer); network_client_connect(host_ip, host_port); @@ -170,13 +161,13 @@ void game_init(const char *ip, uint16_t port, game_kind play_mode, uint32_t num_ world_setup_pkt_handlers(pkt_reader, game_mode == GAMEKIND_SINGLE ? sp_pkt_writer : mp_pkt_writer); world_init(seed, chunk_size, chunk_amount); if (is_dash_enabled) flecs_dash_init(); - + if (game_mode == GAMEKIND_HEADLESS) { network_server_start(0, 27000); //ecs_set_target_fps(world_ecs(), 60); } } - + if (game_mode == GAMEKIND_SINGLE) { for (uint32_t i = 0; i < num_viewers; i++) { pkt_00_init_send(i); @@ -189,35 +180,27 @@ int8_t game_is_networked() { } void game_shutdown() { - + if (game_mode == GAMEKIND_CLIENT) { network_client_disconnect(); } else { world_destroy(); - + if (game_mode == GAMEKIND_HEADLESS) { network_server_stop(); } } - + if (game_mode != GAMEKIND_SINGLE) { network_destroy(); } - + if (game_mode != GAMEKIND_HEADLESS) { world_viewers_destroy(); - + // TODO(zaklaus): crashes on exit //platform_shutdown(); } - - // NOTE: shutdown subsystems - { - item_cleanup(); - entity_spawndef_cleanup(); - blocks_cleanup(); - assets_cleanup(); - } } uint8_t game_is_running() { @@ -245,10 +228,10 @@ void game_update() { } else { world_update(); - + if (game_mode == GAMEKIND_HEADLESS) { network_server_tick(); - + static float ms_report = 2.5f; if (ms_report < get_cached_time()) { ms_report = get_cached_time() + 5.f; @@ -256,7 +239,7 @@ void game_update() { } } } - + last_update = get_cached_time(); } diff --git a/code/foundation/src/ents/entity.c b/code/foundation/src/ents/entity.c index 2819255..81985db 100644 --- a/code/foundation/src/ents/entity.c +++ b/code/foundation/src/ents/entity.c @@ -11,17 +11,6 @@ // NOTE(zaklaus): bring in entity spawnlist #include "entity_spawnlist.c" -void entity_spawndef_cleanup() { - zpl_array_free(entity_spawnlist); entity_spawnlist = NULL; -} -void entity_spawndef_register(spawndef def) { - if (!entity_spawnlist) { - zpl_array_init(entity_spawnlist, zpl_heap()); - } - - zpl_array_append(entity_spawnlist, def); -} - uint64_t entity_spawn(uint16_t class_id) { ecs_entity_t e = ecs_new(world_ecs(), 0); @@ -49,7 +38,7 @@ uint64_t entity_spawn(uint16_t class_id) { } uint64_t entity_spawn_id(uint16_t id){ - for (zpl_isize i = 0; i < zpl_array_count(entity_spawnlist); ++i){ + for (size_t i = 0; i < MAX_ENTITY_SPAWNDEFS; ++i){ if (entity_spawnlist[i].id == id){ ZPL_ASSERT(entity_spawnlist[i].proc); return entity_spawnlist[i].proc(); diff --git a/code/foundation/src/ents/entity.h b/code/foundation/src/ents/entity.h index edb2191..eaea315 100644 --- a/code/foundation/src/ents/entity.h +++ b/code/foundation/src/ents/entity.h @@ -1,18 +1,8 @@ #pragma once #include "platform/system.h" -#include "gen/assets.h" #define ENTITY_ACTION_VELOCITY_THRESHOLD 0.05f -typedef struct { - asset_id id; - uint64_t (*proc)(); -} spawndef; - -void entity_spawndef_setup(); -void entity_spawndef_cleanup(); -void entity_spawndef_register(spawndef def); - uint64_t entity_spawn(uint16_t class_id /* 0 = no streaming */); uint64_t entity_spawn_id(uint16_t id); void entity_batch_despawn(uint64_t *ids, size_t num_ids); diff --git a/code/foundation/src/ents/entity_spawnlist.c b/code/foundation/src/ents/entity_spawnlist.c index c2f45cc..43f93c3 100644 --- a/code/foundation/src/ents/entity_spawnlist.c +++ b/code/foundation/src/ents/entity_spawnlist.c @@ -1,8 +1,11 @@ // NOTE(zaklaus): access to spawners #include "ents/storage.h" -static spawndef *entity_spawnlist = 0; +static struct { + asset_id id; + uint64_t (*proc)(); +} entity_spawnlist[] = { + { .id = ASSET_CHEST, .proc = storage_spawn } +}; -void entity_spawndef_setup(void) { - entity_spawndef_register((spawndef){ .id = ASSET_CHEST, .proc = storage_spawn }); -} +#define MAX_ENTITY_SPAWNDEFS ((sizeof(entity_spawnlist))/(sizeof(entity_spawnlist[0]))) diff --git a/code/foundation/src/ents/items.c b/code/foundation/src/ents/items.c index 5d1c201..49101bd 100644 --- a/code/foundation/src/ents/items.c +++ b/code/foundation/src/ents/items.c @@ -9,21 +9,10 @@ #include "zpl.h" #include "items_list.c" - -void item_cleanup() { - zpl_array_free(items); items = NULL; -} - -void item_register(item_desc desc) { - if (!items) { - zpl_array_init(items, zpl_heap()); - } - - zpl_array_append(items, desc); -} +#define ITEMS_COUNT (sizeof(items)/sizeof(item_desc)) static inline item_id item_resolve_proxy(item_id id) { - ZPL_ASSERT(id >= 0 && id < zpl_array_count(items)); + ZPL_ASSERT(id >= 0 && id < ITEMS_COUNT); item_usage usage = items[id].usage; if (usage == UKIND_PROXY) { return item_find(items[id].proxy.id); @@ -49,7 +38,7 @@ uint64_t item_spawn(asset_id kind, uint32_t qty) { } item_id item_find(asset_id kind) { - for (item_id i=0; i= 0 && id < zpl_array_count(items)); + ZPL_ASSERT(id >= 0 && id < ITEMS_COUNT); return items[id].max_quantity; } item_usage item_get_usage(item_id id) { - ZPL_ASSERT(id >= 0 && id < zpl_array_count(items)); + ZPL_ASSERT(id >= 0 && id < ITEMS_COUNT); return items[id].usage; } bool item_get_place_directional(item_id id) { - ZPL_ASSERT(id >= 0 && id < zpl_array_count(items)); + ZPL_ASSERT(id >= 0 && id < ITEMS_COUNT); return items[id].place.directional; } diff --git a/code/foundation/src/ents/items.h b/code/foundation/src/ents/items.h index 960bf94..9cb21ba 100644 --- a/code/foundation/src/ents/items.h +++ b/code/foundation/src/ents/items.h @@ -41,10 +41,6 @@ typedef struct { typedef uint16_t item_id; -void item_setup(); -void item_cleanup(); -void item_register(item_desc desc); - // NOTE(zaklaus): item drops uint64_t item_spawn(asset_id kind, uint32_t qty); void item_despawn(uint64_t id); diff --git a/code/foundation/src/ents/items_list.c b/code/foundation/src/ents/items_list.c index b30c61c..074ad25 100644 --- a/code/foundation/src/ents/items_list.c +++ b/code/foundation/src/ents/items_list.c @@ -2,20 +2,18 @@ #include "world/entity_view.h" #include "items_list_helpers.h" -static item_desc *items = 0; - -void item_setup() { - item_register((item_desc){ .kind = 0, .max_quantity = 0, }); - item_register(ITEM_BLOCK(ASSET_DEMO_ICEMAKER, 64, ASSET_WATER)); - item_register(ITEM_SELF(ASSET_FENCE, 64)); - item_register(ITEM_SELF(ASSET_WOOD, 64)); - item_register(ITEM_HOLD(ASSET_TREE, 64)); - - item_register(ITEM_SELF_DIR(ASSET_BELT, 999)); - item_register(ITEM_PROXY(ASSET_BELT_LEFT, ASSET_BELT)); - item_register(ITEM_PROXY(ASSET_BELT_RIGHT, ASSET_BELT)); - item_register(ITEM_PROXY(ASSET_BELT_UP, ASSET_BELT)); - item_register(ITEM_PROXY(ASSET_BELT_DOWN, ASSET_BELT)); - - item_register(ITEM_ENT(ASSET_CHEST, 32, ASSET_CHEST)); -} +static item_desc items[] = { + { .kind = 0, .max_quantity = 0, }, + ITEM_BLOCK(ASSET_DEMO_ICEMAKER, 64, ASSET_WATER), + ITEM_SELF(ASSET_FENCE, 64), + ITEM_SELF(ASSET_WOOD, 64), + ITEM_HOLD(ASSET_TREE, 64), + + ITEM_SELF_DIR(ASSET_BELT, 999), + ITEM_PROXY(ASSET_BELT_LEFT, ASSET_BELT), + ITEM_PROXY(ASSET_BELT_RIGHT, ASSET_BELT), + ITEM_PROXY(ASSET_BELT_UP, ASSET_BELT), + ITEM_PROXY(ASSET_BELT_DOWN, ASSET_BELT), + + ITEM_ENT(ASSET_CHEST, 32, ASSET_CHEST), +}; diff --git a/code/foundation/src/ents/items_list_helpers.h b/code/foundation/src/ents/items_list_helpers.h index 11d4f71..166d50f 100644 --- a/code/foundation/src/ents/items_list_helpers.h +++ b/code/foundation/src/ents/items_list_helpers.h @@ -1,14 +1,14 @@ #pragma once #define ITEM_HOLD(asset, qty)\ -(item_desc){\ +{\ .kind = asset,\ .usage = UKIND_HOLD,\ .max_quantity = qty,\ } #define ITEM_BLOCK(asset, qty, build_asset)\ -(item_desc){\ +{\ .kind = asset,\ .usage = UKIND_PLACE,\ .max_quantity = qty,\ @@ -18,7 +18,7 @@ } #define ITEM_BLOCK_DIR(asset, qty, build_asset)\ -(item_desc){\ +{\ .kind = asset,\ .usage = UKIND_PLACE,\ .max_quantity = qty,\ @@ -29,7 +29,7 @@ } #define ITEM_PROXY(asset, proxy_id)\ -(item_desc){\ +{\ .kind = asset,\ .usage = UKIND_PROXY,\ .proxy = {\ @@ -38,7 +38,7 @@ } #define ITEM_ENT(asset, qty, eid)\ -(item_desc){\ +{\ .kind = asset,\ .usage = UKIND_PLACE_ITEM,\ .max_quantity = qty,\ diff --git a/code/foundation/src/gen/assets.c b/code/foundation/src/gen/assets.c index d3d664d..a751f07 100644 --- a/code/foundation/src/gen/assets.c +++ b/code/foundation/src/gen/assets.c @@ -2,15 +2,17 @@ #include "raylib.h" #include "gen/texgen.h" +#define ASSETS_COUNT (sizeof(assets)/sizeof(asset)) + typedef struct { asset_id id; asset_kind kind; - + union { Texture2D tex; Sound snd; }; - + // NOTE(zaklaus): metadata } asset; @@ -18,92 +20,80 @@ typedef struct { #define ASSET_FRAME_RENDER_MS (1.0/5.0) #define ASSET_FRAME_SKIP 4 -static int64_t assets_resources_frame_counter = 1; -static double assets_resources_frame_next_draw = 0.0; +static int64_t assets_frame_counter = 1; +static double assets_frame_next_draw = 0.0; #include -void assets_register(asset_desc a) { - if (!assets) { - zpl_array_init(assets, zpl_heap()); - } - - zpl_array_append(assets, ((asset){ .id = a.id, .kind = a.kind })); -} - -void assets_cleanup(void) { - zpl_array_free(assets); assets = NULL; -} - -int32_t assets_resources_setup(void) { - for (zpl_isize i=0; ikind) { case AKIND_TEXTURE: { b->tex = texgen_build_sprite(b->id); }break; - + case AKIND_ANIM: { b->tex = texgen_build_anim(b->id, 0); }break; - + case AKIND_SOUND: { // TODO(zaklaus): soundgen }break; - + default: break; } } - assets_resources_frame_next_draw = get_cached_time() + ASSET_FRAME_RENDER_MS; + assets_frame_next_draw = get_cached_time() + ASSET_FRAME_RENDER_MS; return 0; } -int32_t assets_resources_frame(void) { - if (assets_resources_frame_next_draw < get_cached_time()) { - for (zpl_isize i=0; ikind) { case AKIND_ANIM: { UnloadTexture(b->tex); - b->tex = texgen_build_anim(b->id, assets_resources_frame_counter); + b->tex = texgen_build_anim(b->id, assets_frame_counter); }break; - + default: break; } } - - assets_resources_frame_next_draw = get_cached_time() + ASSET_FRAME_RENDER_MS; - assets_resources_frame_counter += ASSET_FRAME_SKIP; + + assets_frame_next_draw = get_cached_time() + ASSET_FRAME_RENDER_MS; + assets_frame_counter += ASSET_FRAME_SKIP; } - + return 0; } -void assets_resources_destroy(void) { - for (zpl_isize i=0; iitem_is_held||inv2->item_is_held) ? false : IsMouseButtonDown(MOUSE_LEFT_BUTTON); + game_keystate_data in_data = { .x = x, .y = y, @@ -120,10 +182,73 @@ void platform_input() { .use = use, .sprint = sprint, .ctrl = ctrl, + .pick = pick, + + .drop = drop, + .storage_action = inv_is_storage_action, + .selected_item = player_inv.selected_item, + .storage_selected_item = storage_inv.selected_item, + .swap = inv->swap, + .swap_storage = inv_swap_storage, + .swap_from = inv->swap_from, + .swap_to = inv->swap_to, + + .deletion_mode = build_is_deletion_mode, }; + if (build_submit_placements) { + in_data.placement_num = build_num_placements; + zpl_memcopy(in_data.placements, build_placements, build_num_placements*zpl_size_of(item_placement)); + } + platform_input_update_input_frame(in_data); } + + // NOTE(zaklaus): cycle through viewers + { + if (IsKeyPressed(KEY_Q)) { + game_world_view_cycle_active(-1); + } + else if (IsKeyPressed(KEY_E)) { + game_world_view_cycle_active(1); + } + } + + // NOTE(zaklaus): switch render modes + { + if (IsKeyPressed(KEY_O)) { + renderer_switch(1-gfx_kind); + } + } + + // NOTE(zaklaus): toggle debug drawing +#ifndef ECO2D_PROD + { + if (IsKeyPressed(KEY_T)) { + debug_draw_enable(!debug_draw_state()); + } + } +#endif +} + +void draw_selected_item() { + camera cam = camera_get(); + entity_view *oe = game_world_view_active_get_entity(cam.ent_id); + if (oe) { + // NOTE(zaklaus): sel item + entity_view *e = game_world_view_active_get_entity(oe->sel_ent); + + if (e && e->kind == EKIND_DEVICE) { + renderer_draw_single(e->x, e->y, ASSET_BLANK, ColorAlpha(RED, 0.4f)); + }else{ + // NOTE(zaklaus): hover item + entity_view *e = game_world_view_active_get_entity(oe->pick_ent); + + if (e && e->kind == EKIND_DEVICE) { + renderer_draw_single(e->x, e->y, ASSET_BLANK, ColorAlpha(RED, 0.1f)); + } + } + } } void platform_render() { @@ -145,13 +270,22 @@ void platform_render() { game_world_view_active_entity_map(do_entity_fadeinout); } - assets_resources_frame(); + assets_frame(); BeginDrawing(); { profile (PROF_RENDER) { renderer_draw(); + draw_selected_item(); } + renderer_debug_draw(); + { + // NOTE(zaklaus): add-ins + buildmode_draw(); + inventory_draw(); + } + display_conn_status(); + debug_draw(); } EndDrawing(); diff --git a/code/games/sandbox/src/platform.c b/code/games/sandbox/src/platform.c deleted file mode 100644 index 2cf4804..0000000 --- a/code/games/sandbox/src/platform.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "platform/platform.h" -#include "raylib.h" -#include "raymath.h" -#include "net/network.h" -#include "core/game.h" -#include "world/entity_view.h" -#include "world/prediction.h" -#include "core/camera.h" -#include "math.h" -#include "world/blocks.h" -#include "gen/assets.h" -#include "platform/profiler.h" -#include "debug/debug_ui.h" -#include "utils/raylib_helpers.h" - -#if defined(PLATFORM_WEB) -#include -EM_JS(int, canvas_get_width, (), { - return canvas.width; -}); - -EM_JS(int, canvas_get_height, (), { - return canvas.height; -}); -#endif - -static uint16_t screenWidth = 1024; -static uint16_t screenHeight = 768; -static float target_zoom = 0.6f; -static bool request_shutdown; - -#define GFX_KIND 2 -#include "renderers/renderer_bridge.c" - -// NOTE(zaklaus): add-ins -#include "gui/build_mode.c" -#include "gui/inventory.c" - -void platform_init() { - SetTraceLogLevel(LOG_ERROR); - -#if defined(PLATFORM_WEB) - screenWidth = (uint16_t)canvas_get_width(); - screenHeight = (uint16_t)canvas_get_height(); -#endif - - InitWindow(screenWidth, screenHeight, "eco2d"); - SetWindowState(/*FLAG_WINDOW_UNDECORATED|*/FLAG_WINDOW_MAXIMIZED|FLAG_WINDOW_RESIZABLE|FLAG_MSAA_4X_HINT); - -#if !defined(PLATFORM_WEB) - screenWidth = (uint16_t)GetScreenWidth(); - screenHeight = (uint16_t)GetScreenHeight(); -#endif - // ToggleFullscreen(); - // SetTargetFPS(60.0); - - renderer_init(); -} - -inline static -void display_conn_status() { - if (game_is_networked()) { - if (network_client_is_connected()) { - DrawText("Connection: online", 5, 5, 12, GREEN); - } else { - DrawText("Connection: offline", 5, 5, 12, RED); - } - } else { - DrawText("Connection: single-player", 5, 5, 12, BLUE); - } -} - -void platform_shutdown() { - renderer_shutdown(); - CloseWindow(); -} - -uint8_t platform_is_running() { - return !WindowShouldClose(); -} - -void platform_get_block_realpos(float *x, float *y){ - camera cam = camera_get(); - Vector2 mpos = GetMousePosition(); - entity_view *e = game_world_view_active_get_entity(cam.ent_id); - if (!e) return; - float zoom = renderer_zoom_get(); - mpos.x -= screenWidth/2.0f; - mpos.y -= screenHeight/2.0f; - cam.x += mpos.x*(1.0f/zoom); - cam.y += mpos.y*(1.0f/zoom); - cam.x = ((int32_t)cam.x / (int32_t)(WORLD_BLOCK_SIZE)) * WORLD_BLOCK_SIZE; - cam.y = ((int32_t)cam.y / (int32_t)(WORLD_BLOCK_SIZE)) * WORLD_BLOCK_SIZE; - cam.x += WORLD_BLOCK_SIZE/2.0f; - cam.y += WORLD_BLOCK_SIZE/2.0f; - if (x) *x = (float)cam.x; - if (y) *y = (float)cam.y; -} - -static game_keystate_data last_input_data = {0}; -static pkt_send_blockpos last_blockpos_data = {0}; - -inline static -void platform_input_update_input_frame(game_keystate_data data) { - float mx = 0, my = 0; - platform_get_block_realpos(&mx, &my); - - if (mx != last_blockpos_data.mx || my != last_blockpos_data.my){ - last_blockpos_data.mx = mx; - last_blockpos_data.my = my; - game_action_send_blockpos(mx, my); - } - - // NOTE(zaklaus): Test if there are any changes - if (data.x != last_input_data.x) goto send_data; - if (data.y != last_input_data.y) goto send_data; - if (data.use != last_input_data.use) goto send_data; - if (data.sprint != last_input_data.sprint) goto send_data; - if (data.ctrl != last_input_data.ctrl) goto send_data; - if (data.pick != last_input_data.pick) goto send_data; - if (data.storage_action != last_input_data.storage_action) goto send_data; - if (data.selected_item != last_input_data.selected_item) goto send_data; - if (data.drop != last_input_data.drop) goto send_data; - if (data.swap != last_input_data.swap) goto send_data; - if (data.swap_from != last_input_data.swap_from) goto send_data; - if (data.swap_to != last_input_data.swap_to) goto send_data; - if (data.placement_num != last_input_data.placement_num) goto send_data; - if (data.deletion_mode != last_input_data.deletion_mode) goto send_data; - if (zpl_memcompare(data.placements, last_input_data.placements, zpl_size_of(data.placements))) goto send_data; - return; - - send_data: - last_input_data = data; - game_action_send_keystate(&data); -} - -void platform_input() { - float mouse_z = (GetMouseWheelMove()*0.5f); - - if (mouse_z != 0.0f) { - target_zoom = zpl_clamp(target_zoom+mouse_z, 0.1f, 11.0f); - } - - // NOTE(zaklaus): keystate handling - { - float x=0.0f, y=0.0f; - uint8_t use, sprint, drop, ctrl, pick; - if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)) x += 1.0f; - if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)) x -= 1.0f; - if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)) y += 1.0f; - if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)) y -= 1.0f; - - use = IsKeyPressed(KEY_SPACE); - sprint = IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT); - ctrl = IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL); - drop = IsKeyPressed(KEY_G) || player_inv.drop_item || storage_inv.drop_item; - - // NOTE(zaklaus): NEW! mouse movement - Vector2 mouse_pos = GetMousePosition(); - mouse_pos.x /= screenWidth; - mouse_pos.y /= screenHeight; - mouse_pos.x -= 0.5f; - mouse_pos.y -= 0.5f; - mouse_pos = Vector2Normalize(mouse_pos); - - if (game_get_kind() == GAMEKIND_SINGLE && IsMouseButtonDown(MOUSE_MIDDLE_BUTTON)) { - x = mouse_pos.x; - y = -mouse_pos.y; - } - - inv_keystate *inv = (inv_is_storage_action) ? &storage_inv : &player_inv; - inv_keystate *inv2 = (!inv_is_storage_action) ? &storage_inv : &player_inv; - - // NOTE(zaklaus): don't perform picking if we manipulate our inventories - pick = (inv_is_inside||inv->item_is_held||inv2->item_is_held) ? false : IsMouseButtonDown(MOUSE_LEFT_BUTTON); - - game_keystate_data in_data = { - .x = x, - .y = y, - .mx = mouse_pos.x, - .my = mouse_pos.y, - .use = use, - .sprint = sprint, - .ctrl = ctrl, - .pick = pick, - - .drop = drop, - .storage_action = inv_is_storage_action, - .selected_item = player_inv.selected_item, - .storage_selected_item = storage_inv.selected_item, - .swap = inv->swap, - .swap_storage = inv_swap_storage, - .swap_from = inv->swap_from, - .swap_to = inv->swap_to, - - .deletion_mode = build_is_deletion_mode, - }; - - if (build_submit_placements) { - in_data.placement_num = build_num_placements; - zpl_memcopy(in_data.placements, build_placements, build_num_placements*zpl_size_of(item_placement)); - } - - platform_input_update_input_frame(in_data); - } - - // NOTE(zaklaus): cycle through viewers - { - if (IsKeyPressed(KEY_Q)) { - game_world_view_cycle_active(-1); - } - else if (IsKeyPressed(KEY_E)) { - game_world_view_cycle_active(1); - } - } - - // NOTE(zaklaus): switch render modes - { - if (IsKeyPressed(KEY_O)) { - renderer_switch(1-gfx_kind); - } - } - - // NOTE(zaklaus): toggle debug drawing -#ifndef ECO2D_PROD - { - if (IsKeyPressed(KEY_T)) { - debug_draw_enable(!debug_draw_state()); - } - } -#endif -} - -void draw_selected_item() { - camera cam = camera_get(); - entity_view *oe = game_world_view_active_get_entity(cam.ent_id); - if (oe) { - // NOTE(zaklaus): sel item - entity_view *e = game_world_view_active_get_entity(oe->sel_ent); - - if (e && e->kind == EKIND_DEVICE) { - renderer_draw_single(e->x, e->y, ASSET_BLANK, ColorAlpha(RED, 0.4f)); - }else{ - // NOTE(zaklaus): hover item - entity_view *e = game_world_view_active_get_entity(oe->pick_ent); - - if (e && e->kind == EKIND_DEVICE) { - renderer_draw_single(e->x, e->y, ASSET_BLANK, ColorAlpha(RED, 0.1f)); - } - } - } -} - -void platform_render() { -#if !defined(PLATFORM_WEB) - screenWidth = (uint16_t)GetScreenWidth(); - screenHeight = (uint16_t)GetScreenHeight(); -#else - uint16_t newScreenWidth = (uint16_t)canvas_get_width(); - uint16_t newScreenHeight = (uint16_t)canvas_get_height(); - if (newScreenWidth != screenWidth || newScreenHeight != screenHeight) { - screenWidth = newScreenWidth; - screenHeight = newScreenHeight; - SetWindowSize(screenWidth, screenHeight); - } -#endif - - profile(PROF_ENTITY_LERP) { - game_world_view_active_entity_map(lerp_entity_positions); - game_world_view_active_entity_map(do_entity_fadeinout); - } - - assets_resources_frame(); - - BeginDrawing(); - { - profile (PROF_RENDER) { - renderer_draw(); - draw_selected_item(); - } - renderer_debug_draw(); - { - // NOTE(zaklaus): add-ins - buildmode_draw(); - inventory_draw(); - } - display_conn_status(); - debug_draw(); - } - EndDrawing(); - - if (request_shutdown) { - CloseWindow(); - } -} - -float platform_frametime() { - return GetFrameTime(); -} - -float platform_zoom_get(void) { - return target_zoom; -} - -void platform_request_close(void) { - request_shutdown = true; -}