feat: implement safe leave, profile reset, and full game reset semantics
This commit is contained in:
@@ -37,6 +37,14 @@ bool application_session_for_token(const application_t *application,
|
||||
return application != NULL && session_manager_find(&application->lifecycle.sessions, token, session_index);
|
||||
}
|
||||
|
||||
lifecycle_result_t application_leave(application_t *application, uint8_t session_index, uint32_t game_id,
|
||||
recovery_reason_t reason) {
|
||||
if (application == NULL || application->lifecycle.game.state.game_id != game_id) return LIFECYCLE_RESULT_STALE_GAME;
|
||||
const lifecycle_result_t result = game_lifecycle_leave(&application->lifecycle, session_index);
|
||||
if (result == LIFECYCLE_RESULT_OK) game_lifecycle_set_recovery_reason(&application->lifecycle, reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
lifecycle_result_t application_submit(application_t *application, const app_command_t *command) {
|
||||
if (!application_enqueue(application, command)) return LIFECYCLE_RESULT_GENERATION_FAILED;
|
||||
app_command_t next = {0};
|
||||
@@ -52,6 +60,16 @@ lifecycle_result_t application_submit(application_t *application, const app_comm
|
||||
return game_lifecycle_rematch(&application->lifecycle, next.session_index, next.game_id);
|
||||
case COMMAND_ABORT:
|
||||
return game_lifecycle_abort(&application->lifecycle, next.session_index, next.game_id);
|
||||
case COMMAND_LEAVE:
|
||||
return application_leave(application, next.session_index, next.game_id, RECOVERY_REASON_SESSION_LEFT);
|
||||
case COMMAND_PROFILE_RESET:
|
||||
return application_leave(application, next.session_index, next.game_id, RECOVERY_REASON_PROFILE_RESET);
|
||||
case COMMAND_RESET:
|
||||
{
|
||||
const lifecycle_result_t result = game_lifecycle_reset(&application->lifecycle, next.session_index, next.game_id);
|
||||
if (result == LIFECYCLE_RESULT_OK) application->command_queue = (command_queue_t){0};
|
||||
return result;
|
||||
}
|
||||
default:
|
||||
return LIFECYCLE_RESULT_GENERATION_FAILED;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user