diff options
author | fschildt <florian.schildt@protonmail.com> | 2025-08-22 15:23:11 +0200 |
---|---|---|
committer | fschildt <florian.schildt@protonmail.com> | 2025-08-22 15:23:11 +0200 |
commit | 2050c0e0576f05156f192aa4caf48834d2f28b14 (patch) | |
tree | ee58bd35b0df0a1bacfbc9700ed99ce80c99294e /src/client/main.c |
Diffstat (limited to 'src/client/main.c')
-rw-r--r-- | src/client/main.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/client/main.c b/src/client/main.c new file mode 100644 index 0000000..301a06d --- /dev/null +++ b/src/client/main.c @@ -0,0 +1,162 @@ +#include <client/fscord.h> +#include <basic/basic.h> +#include <basic/arena.h> +#include <basic/string32.h> +#include <os/os.h> +#include <messages/messages.h> +#include <client/login.h> +#include <client/session.h> +#include <client/string32_handles.h> +#include <client/server_connection.h> + +#include <string.h> + + +internal_fn b32 +fscord_update(Fscord *fscord) +{ + arena_clear(&fscord->frame_arena); + + + Login *login = fscord->login; + Session *session = fscord->session; + + + // handle network events + // Todo: Do this more carefully. + ServerConnectionStatus status = server_connection_get_status(); + if (status == SERVER_CONNECTION_NOT_ESTABLISHED) { + if (fscord->is_logged_in) { + fscord->is_logged_in = false; + session_reset(session); + } + if (login->is_trying_to_login) { + login->warning = SH_LOGIN_WARNING_COULD_NOT_CONNECT; + login->is_trying_to_login = false; + } + } + else if (status == SERVER_CONNECTION_ESTABLISHED) { + if (!fscord->is_logged_in && login->is_trying_to_login) { + login_update_login_attempt(login); + } + + b32 handled = server_connection_handle_events(); + if (!handled) { + fscord->is_logged_in = false; + session_reset(session); + server_connection_terminate(); + login->warning = SH_LOGIN_WARNING_CONNECTION_LOST; + } + } + else if (status == SERVER_CONNECTION_ESTABLISHING) { + // do nothing + } + else { + InvalidCodePath; + } + + + // handle window events + OSEvent event; + while (os_window_get_event(fscord->window, &event)) { + if (event.type == OS_EVENT_WINDOW_RESIZE) { + continue; + } + if (event.type == OS_EVENT_WINDOW_DESTROYED) { + return false; + } + + if (fscord->is_logged_in) { + session_process_event(session, &event); + } + else { + login_process_event(login, &event); + } + } + + if (fscord->is_logged_in) { + session_draw(session); + } + else { + login_draw(login); + } + +#if 0 + OSSoundBuffer *sound_buffer = os_sound_player_get_buffer(fscord->sound_player); + play_sound_update(&fscord->ps_user_connected, sound_buffer); + play_sound_update(&fscord->ps_user_disconnected, sound_buffer); +#endif + + + return true; +} + + +internal_fn b32 +fscord_init(Fscord *fscord) +{ + memset(fscord, 0, sizeof(*fscord)); + + + arena_init(&fscord->perma_arena, MEBIBYTES(10)); + arena_init(&fscord->frame_arena, MEBIBYTES(10)); + + + string32_handles_load_language(); + + + fscord->window = os_window_create("fscord", 1024, 720); + if (!fscord->window) { + return false; + } + fscord->offscreen_buffer = os_window_get_offscreen_buffer(fscord->window); + + + fscord->sound_player = os_sound_player_create(&fscord->perma_arena, 44100); + if (!fscord->sound_player) { + return false; + } + + + if (!font_init(&fscord->font, "./Inconsolata-Regular.ttf", 20)) { + return false; + } + fscord->sound_user_connected = sound_load(SOUND_USER_CONNECTED); + fscord->sound_user_disconnected = sound_load(SOUND_USER_DISCONNECTED); + + os_net_secure_streams_init(&fscord->perma_arena, 1); + server_connection_create(&fscord->perma_arena, fscord); + + fscord->is_logged_in = false; + fscord->login = login_create(&fscord->perma_arena, fscord); + fscord->session = session_create(&fscord->perma_arena, fscord); + + return true; +} + + +internal_fn void +fscord_main(void) +{ + Fscord fscord; + if (!fscord_init(&fscord)) { + return; + } + + b32 running = true; + while (running) { + running = fscord_update(&fscord); + + os_window_swap_buffers(fscord.window, fscord.offscreen_buffer); + //os_sound_player_play(fscord->sound_player); + } +} + + +int +main(void) +{ + fscord_main(); + return 0; +} + |