diff --git a/CMakeLists.txt b/CMakeLists.txt index 9679540..dae43fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_compile_options(/MP /W4) endif() include_directories(code/common code/vendors code/vendors/flecs) @@ -18,4 +19,4 @@ add_subdirectory(code/modules) add_subdirectory(code/common) add_subdirectory(code/vendors) -add_subdirectory(code/apps/client) +add_subdirectory(code/game) diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 411faac..99d594c 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -9,7 +9,7 @@ function(link_system_libs target_name) endfunction() macro(populate_pkt_srcs) - file(GLOB PKT_SRCS ../../common/packets/*.h ../../common/packets/*.c) + file(GLOB PKT_SRCS ../common/packets/*.h ../common/packets/*.c) endmacro() diff --git a/code/apps/playground/CMakeLists.txt b/code/apps/playground/CMakeLists.txt deleted file mode 100644 index 89f8dea..0000000 --- a/code/apps/playground/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -populate_pkt_srcs() -add_executable(playground - source/main.c - source/game.c - - ${PKT_SRCS} -) - -include_directories(header ../modules ../common) -target_link_libraries(playground eco2d-common eco2d-modules flecs-bundle cwpack) -link_system_libs(playground) diff --git a/code/apps/playground/source/game.c b/code/apps/playground/source/game.c deleted file mode 100644 index 6aaf80c..0000000 --- a/code/apps/playground/source/game.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "game.h" - -void game_init(int8_t play_mode, int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t world_size) { - -} - -int8_t game_is_networked() { - return 1; -} - -void game_shutdown() { - world_destroy(); -} - -uint8_t game_is_running() { - return 1; -} - -void game_input() { - -} - -void game_update() { - world_update(); -} - -void game_render() { -} - diff --git a/code/apps/playground/source/main.c b/code/apps/playground/source/main.c deleted file mode 100644 index 46fbc0f..0000000 --- a/code/apps/playground/source/main.c +++ /dev/null @@ -1,36 +0,0 @@ -#define ZPL_IMPL -#define ZPL_NANO -#include - -#define LIBRG_IMPL -#define LIBRG_CUSTOM_ZPL -#include "librg.h" - -#include "packet.h" -#include "game.h" -#include "packets/pkt_01_welcome.h" - -int32_t mock_pkt_decode(pkt_desc *desc, uint32_t args, size_t msg_size, void *data, uint32_t size) { - pkt_header header = { - .data = pkt_buffer, - .datalen = msg_size - }; - return pkt_msg_decode(&header, desc, args, data, size); -} - -int main(void) { - pkt_01_welcome test_data = { - .chunk_size = 4, - .world_size = 8 - }; - - size_t msg_size = pkt_01_welcome_encode(&test_data); - pkt_01_welcome resp = {0}; - if (mock_pkt_decode(pkt_01_welcome_desc, 3, msg_size, PKT_STRUCT_PTR(&resp))) { - zpl_printf("[err] oopsie!\n"); - } - - zpl_printf("size %d, amt %d, struct %d msg %d\n", resp.chunk_size, resp.world_size, sizeof(pkt_01_welcome), msg_size); - - return 0; -} diff --git a/code/apps/server/CMakeLists.txt b/code/apps/server/CMakeLists.txt deleted file mode 100644 index 99733a3..0000000 --- a/code/apps/server/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -populate_pkt_srcs() -add_executable(eco2d-server - source/main.c - source/network.c - source/game.c - source/utils/options.c - - header/network.h - header/utils/options.h - - ${PKT_SRCS} -) - -include_directories(header ../../modules) -target_compile_definitions(eco2d-server PRIVATE SERVER) -target_link_libraries(eco2d-server eco2d-common eco2d-modules flecs-bundle cwpack) -link_system_libs(eco2d-server) diff --git a/code/apps/server/header/network.h b/code/apps/server/header/network.h deleted file mode 100644 index c48634a..0000000 --- a/code/apps/server/header/network.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -int32_t network_init(void); -int32_t network_destroy(void); - -int32_t network_server_start(const char *host, uint16_t port); -int32_t network_server_stop(void); -int32_t network_server_tick(void); -void network_server_update(void *data); - -uint64_t network_client_create(void *peer); -void network_client_destroy(uint64_t ent_id); - -int32_t network_msg_send(void *peer, void *data, size_t datalen); -int32_t network_msg_send_unreliable(void *peer, void *data, size_t datalen); - -WORLD_PKT_WRITER(mp_pkt_writer); \ No newline at end of file diff --git a/code/apps/server/header/utils/options.h b/code/apps/server/header/utils/options.h deleted file mode 100644 index d647f18..0000000 --- a/code/apps/server/header/utils/options.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "system.h" - -void generate_minimap(int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t world_size); diff --git a/code/apps/server/source/game.c b/code/apps/server/source/game.c deleted file mode 100644 index f0f9b3c..0000000 --- a/code/apps/server/source/game.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "game.h" -#include "platform.h" -#include "world/world.h" -#include "packet.h" -#include "signal_handling.h" -#include "network.h" - -#include "flecs/flecs.h" -#include "flecs/flecs_dash.h" -#include "flecs/flecs_systems_civetweb.h" -#include "flecs/flecs_os_api_stdcpp.h" - -static WORLD_PKT_READER(mp_pkt_reader) { - pkt_header header = {0}; - uint32_t ok = pkt_header_decode(&header, data, datalen); - - if (ok && header.ok) { - return pkt_handlers[header.id].handler(&header) >= 0; - } else { - zpl_printf("[warn] unknown packet id %d (header %d data %d)\n", header.id, ok, header.ok); - } - return -1; -} - -void game_init(int8_t play_mode, int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t world_size) { - sighandler_register(); - stdcpp_set_os_api(); - - zpl_printf("[INFO] Generating world of size: %d x %d\n", world_size, world_size); - world_init(seed, block_size, chunk_size, world_size, mp_pkt_reader, mp_pkt_writer); - - /* server dashboard */ - { - ECS_IMPORT(world_ecs(), FlecsDash); - ECS_IMPORT(world_ecs(), FlecsSystemsCivetweb); - - ecs_set(world_ecs(), 0, EcsDashServer, {.port = 27001}); - ecs_set_target_fps(world_ecs(), 60); - } - - zpl_printf("[INFO] Initializing network...\n"); - network_init(); - network_server_start("0.0.0.0", 27000); -} - -int8_t game_is_networked() { - return 1; -} - -void game_shutdown() { - network_server_stop(); - network_destroy(); - world_destroy(); - sighandler_unregister(); - zpl_printf("Bye!\n"); -} - -uint8_t game_is_running() { - return 1; -} - -void game_input() { - -} - -void game_update() { - network_server_tick(); - world_update(); -} - -void game_render() { -} - diff --git a/code/apps/server/source/main.c b/code/apps/server/source/main.c deleted file mode 100644 index 74954c7..0000000 --- a/code/apps/server/source/main.c +++ /dev/null @@ -1,72 +0,0 @@ -#define ZPL_IMPL -#include "zpl.h" - -#include "system.h" -#include "world/world.h" -#include "network.h" -#include "utils/options.h" -#include "signal_handling.h" - -#include "flecs/flecs.h" -#include "flecs/flecs_dash.h" -#include "flecs/flecs_systems_civetweb.h" -#include "flecs/flecs_os_api_stdcpp.h" - -#define DEFAULT_WORLD_SEED 302097 -#define DEFAULT_BLOCK_SIZE 64 /* amount of units within a block (single axis) */ -#define DEFAULT_CHUNK_SIZE 3 /* amount of blocks within a chunk (single axis) */ -#define DEFAULT_WORLD_SIZE 8 /* amount of chunks within a world (single axis) */ - -zpl_global zpl_b32 is_running = true; - -int main(int argc, char** argv) { - zpl_opts opts={0}; - zpl_opts_init(&opts, zpl_heap(), argv[0]); - - zpl_opts_add(&opts, "?", "help", "the HELP section", ZPL_OPTS_FLAG); - zpl_opts_add(&opts, "p", "preview-map", "draw world preview", ZPL_OPTS_FLAG); - zpl_opts_add(&opts, "s", "seed", "world seed", ZPL_OPTS_INT); - zpl_opts_add(&opts, "r", "random-seed", "generate random world seed", ZPL_OPTS_FLAG); - zpl_opts_add(&opts, "bs", "block-size", "amount of units within a block (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); - - uint32_t ok = zpl_opts_compile(&opts, argc, argv); - - if (!ok) { - zpl_opts_print_errors(&opts); - zpl_opts_print_help(&opts); - return -1; - } - - int32_t seed = zpl_opts_integer(&opts, "seed", DEFAULT_WORLD_SEED); - uint16_t block_size = zpl_opts_integer(&opts, "block-size", DEFAULT_BLOCK_SIZE); - uint16_t chunk_size = zpl_opts_integer(&opts, "chunk-size", DEFAULT_CHUNK_SIZE); - uint16_t world_size = zpl_opts_integer(&opts, "world-size", DEFAULT_WORLD_SIZE); - - if (zpl_opts_has_arg(&opts, "random-seed")) { - zpl_random rnd={0}; - zpl_random_init(&rnd); - seed = zpl_random_gen_u32(&rnd); - zpl_printf("Seed: %u\n", seed); - } - - if (zpl_opts_has_arg(&opts, "preview-map")) { - generate_minimap(seed, block_size, chunk_size, world_size); - return 0; - } - - game_init(1, seed, block_size, chunk_size, world_size); - - while (is_running) { - game_update(); - } - - game_shutdown(); - - return 0; -} - -void platform_shutdown(void) { - is_running = false; -} diff --git a/code/apps/server/source/network.c b/code/apps/server/source/network.c deleted file mode 100644 index c57438b..0000000 --- a/code/apps/server/source/network.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "zpl.h" - -#define ENET_IMPLEMENTATION -#include "enet.h" - -#define LIBRG_IMPL -#define LIBRG_CUSTOM_ZPL -#include "librg.h" - -#include "system.h" -#include "network.h" -#include "packet.h" -#include "world/world.h" - -#include "player.h" - -#include "modules/general.h" -#include "modules/controllers.h" -#include "modules/net.h" - -#include "assets.h" -#include "packets/pkt_01_welcome.h" - -#define NETWORK_UPDATE_DELAY 0.100 -#define NETWORK_MAX_CLIENTS 32 - -static ENetHost *server = NULL; - -WORLD_PKT_WRITER(mp_pkt_writer) { - if (pkt->is_reliable) { - return network_msg_send(udata, pkt->data, pkt->datalen); - } - else { - return network_msg_send_unreliable(udata, pkt->data, pkt->datalen); - } -} - -int32_t network_init(void) { - return enet_initialize() != 0; -} - -int32_t network_destroy(void) { - enet_deinitialize(); - return 0; -} - -int32_t network_server_start(const char *host, uint16_t port) { - zpl_unused(host); - - ENetAddress address = {0}; - - address.host = ENET_HOST_ANY; /* Bind the server to the default localhost. */ - address.port = port; /* Bind the server to port. */ - - /* create a server */ - server = enet_host_create(&address, NETWORK_MAX_CLIENTS, 2, 0, 0); - - if (server == NULL) { - zpl_printf("[ERROR] An error occurred while trying to create an ENet server host.\n"); - return 1; - } - - zpl_printf("[INFO] Started an ENet server...\n"); - - return 0; -} - -int32_t network_server_stop(void) { - zpl_printf("[INFO] Shutting down the ENet server...\n"); - enet_host_destroy(server); - server = NULL; - return 0; -} - -int32_t network_server_tick(void) { - ENetEvent event = {0}; - while (enet_host_service(server, &event, 1) > 0) { - switch (event.type) { - case ENET_EVENT_TYPE_CONNECT: { - zpl_printf("[INFO] A new user %d connected.\n", event.peer->incomingPeerID); - uint16_t peer_id = event.peer->incomingPeerID; - uint64_t ent_id = network_client_create(event.peer); - // TODO: Make sure ent_id does not get truncated with large entity numbers. - event.peer->data = (void*)((uint32_t)ent_id); - - pkt_01_welcome table = {.ent_id = ent_id, .block_size = world_block_size(), .chunk_size = world_chunk_size(), .world_size = world_world_size()}; - pkt_world_write(MSG_ID_01_WELCOME, pkt_01_welcome_encode(&table), 1, event.peer); - } break; - case ENET_EVENT_TYPE_DISCONNECT: - case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT: { - zpl_printf("[INFO] A user %d disconnected.\n", event.peer->incomingPeerID); - ecs_entity_t e = (ecs_entity_t)((uint32_t)event.peer->data); - network_client_destroy(e); - } break; - - case ENET_EVENT_TYPE_RECEIVE: { - if (!world_read(event.packet->data, event.packet->dataLength, event.peer)) { - zpl_printf("[INFO] User %d sent us a malformed packet.\n", event.peer->incomingPeerID); - ecs_entity_t e = (ecs_entity_t)((uint32_t)event.peer->data); - network_client_destroy(e); - } - - /* Clean up the packet now that we're done using it. */ - enet_packet_destroy(event.packet); - } break; - - case ENET_EVENT_TYPE_NONE: break; - } - } - - return 0; -} - -uint64_t network_client_create(ENetPeer *peer) { - ECS_IMPORT(world_ecs(), Net); - ecs_entity_t e = (ecs_entity_t)player_spawn(zpl_bprintf("client_%d", peer->incomingPeerID)); - ecs_set(world_ecs(), e, ClientInfo, {(uintptr_t)peer}); - - librg_entity_owner_set(world_tracker(), e, (int64_t)peer); - - return (uint64_t)e; -} - -void network_client_destroy(uint64_t ent_id) { - player_despawn(ent_id); -} - -static int32_t network_msg_send_raw(ENetPeer *peer, void *data, size_t datalen, uint32_t flags) { - ENetPacket *packet = enet_packet_create(data, datalen, flags); - return enet_peer_send(peer, 0, packet); -} - -int32_t network_msg_send(ENetPeer *peer, void *data, size_t datalen) { - return network_msg_send_raw(peer, data, datalen, ENET_PACKET_FLAG_RELIABLE); -} - -int32_t network_msg_send_unreliable(ENetPeer *peer, void *data, size_t datalen) { - return network_msg_send_raw(peer, data, datalen, 0); -} diff --git a/code/apps/server/source/utils/options.c b/code/apps/server/source/utils/options.c deleted file mode 100644 index 113ab92..0000000 --- a/code/apps/server/source/utils/options.c +++ /dev/null @@ -1,23 +0,0 @@ -#include - -#include "world/world.h" -#include "world/blocks.h" -#include "utils/options.h" - -void generate_minimap(int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t world_size) { - world_init(seed, 3, chunk_size, world_size, NULL, NULL); - - uint8_t const *world; - uint32_t world_length = chunk_size * world_size; - uint32_t len = world_buf(&world, NULL); - - for (int i=0; i 0 && i % world_length == 0) { - putc('\n', stdout); - } - putc(blocks_get_symbol(world[i]), stdout); - } - - putc('\n', stdout); - world_destroy(); -} diff --git a/code/apps/client/CMakeLists.txt b/code/game/CMakeLists.txt similarity index 94% rename from code/apps/client/CMakeLists.txt rename to code/game/CMakeLists.txt index c5a5f4d..c924f0c 100644 --- a/code/apps/client/CMakeLists.txt +++ b/code/game/CMakeLists.txt @@ -27,7 +27,7 @@ add_executable(eco2d-cli target_compile_definitions(client-common PRIVATE CLIENT) set(LIBS client-common cwpack eco2d-common eco2d-modules flecs-bundle) -include_directories(header ../../modules) +include_directories(header ../modules) target_link_libraries(eco2d-client raylib ${LIBS}) target_link_libraries(eco2d-cli ${LIBS}) diff --git a/code/apps/client/FindRaylib.cmake b/code/game/FindRaylib.cmake similarity index 100% rename from code/apps/client/FindRaylib.cmake rename to code/game/FindRaylib.cmake diff --git a/code/apps/client/header/camera.h b/code/game/header/camera.h similarity index 100% rename from code/apps/client/header/camera.h rename to code/game/header/camera.h diff --git a/code/apps/client/header/network.h b/code/game/header/network.h similarity index 100% rename from code/apps/client/header/network.h rename to code/game/header/network.h diff --git a/code/apps/client/header/prediction.h b/code/game/header/prediction.h similarity index 100% rename from code/apps/client/header/prediction.h rename to code/game/header/prediction.h diff --git a/code/apps/client/header/utils/options.h b/code/game/header/utils/options.h similarity index 100% rename from code/apps/client/header/utils/options.h rename to code/game/header/utils/options.h diff --git a/code/apps/client/header/world_view.h b/code/game/header/world_view.h similarity index 100% rename from code/apps/client/header/world_view.h rename to code/game/header/world_view.h diff --git a/code/apps/client/source/camera.c b/code/game/source/camera.c similarity index 100% rename from code/apps/client/source/camera.c rename to code/game/source/camera.c diff --git a/code/apps/client/source/game.c b/code/game/source/game.c similarity index 100% rename from code/apps/client/source/game.c rename to code/game/source/game.c diff --git a/code/apps/client/source/main.c b/code/game/source/main.c similarity index 100% rename from code/apps/client/source/main.c rename to code/game/source/main.c diff --git a/code/apps/client/source/network.c b/code/game/source/network.c similarity index 100% rename from code/apps/client/source/network.c rename to code/game/source/network.c diff --git a/code/apps/client/source/platform_raylib.c b/code/game/source/platform_raylib.c similarity index 100% rename from code/apps/client/source/platform_raylib.c rename to code/game/source/platform_raylib.c diff --git a/code/apps/client/source/platform_text.c b/code/game/source/platform_text.c similarity index 100% rename from code/apps/client/source/platform_text.c rename to code/game/source/platform_text.c diff --git a/code/apps/client/source/prediction.c b/code/game/source/prediction.c similarity index 100% rename from code/apps/client/source/prediction.c rename to code/game/source/prediction.c diff --git a/code/apps/client/source/utils/options.c b/code/game/source/utils/options.c similarity index 100% rename from code/apps/client/source/utils/options.c rename to code/game/source/utils/options.c diff --git a/code/apps/client/source/world_view.c b/code/game/source/world_view.c similarity index 100% rename from code/apps/client/source/world_view.c rename to code/game/source/world_view.c