fix: two-player lobby deadlock
This commit is contained in:
@@ -99,16 +99,18 @@ void game_lifecycle_set_bot_scheduler(game_lifecycle_t *lifecycle, scheduler_t s
|
||||
lifecycle_result_t game_lifecycle_join(game_lifecycle_t *lifecycle, role_t requested_role, const char *name,
|
||||
uint8_t *session_index) {
|
||||
if (lifecycle == NULL) return LIFECYCLE_RESULT_UNAUTHORIZED;
|
||||
if ((requested_role == ROLE_PLAYER_1 || requested_role == ROLE_PLAYER_2) && lifecycle->game.state.phase != PHASE_LOBBY) {
|
||||
if ((requested_role == ROLE_PLAYER_1 || requested_role == ROLE_PLAYER_2 || requested_role == ROLE_AUTO_PLAYER) && lifecycle->game.state.phase != PHASE_LOBBY) {
|
||||
return LIFECYCLE_RESULT_NO_PLAYER_SLOT;
|
||||
}
|
||||
if (requested_role == ROLE_PLAYER_2 && !session_manager_player_present(&lifecycle->sessions, 0U)) {
|
||||
return LIFECYCLE_RESULT_NO_PLAYER_SLOT;
|
||||
}
|
||||
if (requested_role == ROLE_PLAYER_2 && (lifecycle->game.state.mode == MODE_BOT || lifecycle->bot_reserved)) {
|
||||
if ((requested_role == ROLE_PLAYER_2 || requested_role == ROLE_AUTO_PLAYER) && (lifecycle->game.state.mode == MODE_BOT || lifecycle->bot_reserved)) {
|
||||
return LIFECYCLE_RESULT_NO_PLAYER_SLOT;
|
||||
}
|
||||
return session_result(session_manager_join(&lifecycle->sessions, requested_role, name, lifecycle->random, session_index));
|
||||
const lifecycle_result_t result = session_result(session_manager_join(&lifecycle->sessions, requested_role, name, lifecycle->random, session_index));
|
||||
if (result == LIFECYCLE_RESULT_OK) ++lifecycle->game.state.version;
|
||||
return result;
|
||||
}
|
||||
|
||||
lifecycle_result_t game_lifecycle_resume(game_lifecycle_t *lifecycle,
|
||||
@@ -126,6 +128,7 @@ lifecycle_result_t game_lifecycle_leave(game_lifecycle_t *lifecycle, uint8_t ses
|
||||
if (lifecycle == NULL || session_index >= kSessionCapacity || !lifecycle->sessions.entries[session_index].occupied) return LIFECYCLE_RESULT_UNAUTHORIZED;
|
||||
const bool player = session_index < kPlayerCapacity && lifecycle->sessions.entries[session_index].role == (role_t)session_index;
|
||||
if (player && lifecycle->game.state.phase != PHASE_LOBBY) return_to_lobby(lifecycle);
|
||||
else ++lifecycle->game.state.version;
|
||||
memset(&lifecycle->sessions.entries[session_index], 0, sizeof(session_t));
|
||||
++lifecycle->recovery_generation;
|
||||
lifecycle->recovery_reason = RECOVERY_REASON_SESSION_LEFT;
|
||||
|
||||
Reference in New Issue
Block a user