feat: implement safe leave, profile reset, and full game reset semantics
This commit is contained in:
@@ -18,5 +18,7 @@ lifecycle_result_t application_resume(application_t *application,
|
||||
const uint8_t token[kSessionTokenBytes], uint8_t *session_index);
|
||||
bool application_session_for_token(const application_t *application,
|
||||
const uint8_t token[kSessionTokenBytes], uint8_t *session_index);
|
||||
lifecycle_result_t application_leave(application_t *application, uint8_t session_index, uint32_t game_id,
|
||||
recovery_reason_t reason);
|
||||
lifecycle_result_t application_submit(application_t *application, const app_command_t *command);
|
||||
bool application_bot_take_turn(application_t *application);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "game_types.h"
|
||||
|
||||
typedef uint8_t command_type_t;
|
||||
enum { COMMAND_CONFIG, COMMAND_START, COMMAND_SHOT, COMMAND_REMATCH, COMMAND_ABORT };
|
||||
enum { COMMAND_CONFIG, COMMAND_START, COMMAND_SHOT, COMMAND_REMATCH, COMMAND_ABORT, COMMAND_LEAVE, COMMAND_PROFILE_RESET, COMMAND_RESET };
|
||||
typedef struct { command_type_t type; uint8_t session_index; uint32_t game_id; uint32_t version; coordinate_t coordinate; game_mode_t mode; } app_command_t;
|
||||
typedef struct { app_command_t entries[kCommandQueueCapacity]; uint8_t head; uint8_t tail; uint8_t count; } command_queue_t;
|
||||
|
||||
|
||||
@@ -24,6 +24,9 @@ enum {
|
||||
LIFECYCLE_RESULT_GENERATION_FAILED,
|
||||
};
|
||||
|
||||
typedef uint8_t recovery_reason_t;
|
||||
enum { RECOVERY_REASON_NONE, RECOVERY_REASON_SESSION_LEFT, RECOVERY_REASON_PROFILE_RESET, RECOVERY_REASON_GAME_RESET };
|
||||
|
||||
typedef struct {
|
||||
game_engine_t game;
|
||||
session_manager_t sessions;
|
||||
@@ -34,6 +37,8 @@ typedef struct {
|
||||
bool bot_reserved;
|
||||
bool rematch_confirmed[kPlayerCapacity];
|
||||
uint32_t next_game_id;
|
||||
uint32_t recovery_generation;
|
||||
recovery_reason_t recovery_reason;
|
||||
} game_lifecycle_t;
|
||||
|
||||
void game_lifecycle_init(game_lifecycle_t *lifecycle, random_source_t random);
|
||||
@@ -44,6 +49,8 @@ lifecycle_result_t game_lifecycle_resume(game_lifecycle_t *lifecycle,
|
||||
const uint8_t token[kSessionTokenBytes], uint8_t *session_index);
|
||||
lifecycle_result_t game_lifecycle_disconnect(game_lifecycle_t *lifecycle, uint8_t session_index);
|
||||
lifecycle_result_t game_lifecycle_leave(game_lifecycle_t *lifecycle, uint8_t session_index);
|
||||
lifecycle_result_t game_lifecycle_reset(game_lifecycle_t *lifecycle, uint8_t session_index, uint32_t game_id);
|
||||
void game_lifecycle_set_recovery_reason(game_lifecycle_t *lifecycle, recovery_reason_t reason);
|
||||
lifecycle_result_t game_lifecycle_configure(game_lifecycle_t *lifecycle, uint8_t session_index,
|
||||
uint32_t game_id, game_mode_t mode);
|
||||
lifecycle_result_t game_lifecycle_start(game_lifecycle_t *lifecycle, uint8_t session_index, uint32_t game_id);
|
||||
|
||||
@@ -13,11 +13,14 @@ typedef enum {
|
||||
HTTP_API_ROUTE_HEALTH,
|
||||
HTTP_API_ROUTE_JOIN,
|
||||
HTTP_API_ROUTE_RESUME,
|
||||
HTTP_API_ROUTE_LEAVE,
|
||||
HTTP_API_ROUTE_PROFILE_RESET,
|
||||
HTTP_API_ROUTE_CONFIG,
|
||||
HTTP_API_ROUTE_START,
|
||||
HTTP_API_ROUTE_SHOT,
|
||||
HTTP_API_ROUTE_REMATCH,
|
||||
HTTP_API_ROUTE_ABORT,
|
||||
HTTP_API_ROUTE_RESET,
|
||||
HTTP_API_ROUTE_STATE,
|
||||
HTTP_API_ROUTE_STATISTICS,
|
||||
} http_api_route_t;
|
||||
|
||||
Reference in New Issue
Block a user