#pragma once #include #include #include "app_interfaces.h" #include "app_config.h" #include "game_types.h" typedef uint8_t session_result_t; enum { SESSION_RESULT_OK, SESSION_RESULT_INVALID_NAME, SESSION_RESULT_INVALID_ROLE, SESSION_RESULT_NO_PLAYER_SLOT, SESSION_RESULT_NO_SPECTATOR_SLOT, SESSION_RESULT_UNAUTHORIZED, SESSION_RESULT_WRONG_PHASE, }; typedef struct { role_t role; bool occupied; bool connected; uint8_t token[kSessionTokenBytes]; char name[kDisplayNameBytes + 1]; } session_t; typedef struct { session_t entries[kSessionCapacity]; } session_manager_t; void session_manager_init(session_manager_t *manager); session_result_t session_manager_join(session_manager_t *manager, role_t requested_role, const char *name, random_source_t random, uint8_t *session_index); session_result_t session_manager_resume(session_manager_t *manager, const uint8_t token[kSessionTokenBytes], uint8_t *session_index); bool session_manager_disconnect(session_manager_t *manager, uint8_t session_index); session_result_t session_manager_leave(session_manager_t *manager, uint8_t session_index, phase_t phase); bool session_manager_player_present(const session_manager_t *manager, uint8_t player_index); _Static_assert(sizeof(session_t) <= 104, "session grew beyond fixed budget"); _Static_assert(sizeof(session_manager_t) <= 1040, "session table grew beyond fixed budget");