41 lines
1.5 KiB
C
41 lines
1.5 KiB
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#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");
|