From 956dbfaefd7084e6b64bc69f1df6d5d274eb7c9d Mon Sep 17 00:00:00 2001 From: Ilya Groshev Date: Sun, 17 May 2026 11:29:16 +0300 Subject: [PATCH] Fix retire wiping the cleared status of event and extra quests --- server/internal/questflow/event_quest.go | 2 ++ server/internal/questflow/extra_quest.go | 2 ++ server/internal/questflow/quest.go | 23 ++++++++++++----------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/server/internal/questflow/event_quest.go b/server/internal/questflow/event_quest.go index b738097..e821751 100644 --- a/server/internal/questflow/event_quest.go +++ b/server/internal/questflow/event_quest.go @@ -54,6 +54,8 @@ func (h *QuestHandler) HandleEventQuestFinish(user *store.UserState, eventQuestC store.RecoverStamina(user, refund*1000, maxMillis, nowMillis) } + restoreClearedAfterRetire(user, questId, isRetired) + user.EventQuest.CurrentEventQuestChapterId = 0 user.EventQuest.CurrentQuestId = 0 user.EventQuest.CurrentQuestSceneId = 0 diff --git a/server/internal/questflow/extra_quest.go b/server/internal/questflow/extra_quest.go index d7abc4d..c454404 100644 --- a/server/internal/questflow/extra_quest.go +++ b/server/internal/questflow/extra_quest.go @@ -51,6 +51,8 @@ func (h *QuestHandler) HandleExtraQuestFinish(user *store.UserState, questId int store.RecoverStamina(user, refund*1000, maxMillis, nowMillis) } + restoreClearedAfterRetire(user, questId, isRetired) + user.ExtraQuest.CurrentQuestId = 0 user.ExtraQuest.CurrentQuestSceneId = 0 user.ExtraQuest.HeadQuestSceneId = 0 diff --git a/server/internal/questflow/quest.go b/server/internal/questflow/quest.go index 194c299..960b9e0 100644 --- a/server/internal/questflow/quest.go +++ b/server/internal/questflow/quest.go @@ -233,6 +233,17 @@ func (h *QuestHandler) finalizeChainPreviousQuest(user *store.UserState, questId log.Printf("[HandleMainQuestSceneProgress] finalized chain-previous quest %d (cleared)", questId) } +func restoreClearedAfterRetire(user *store.UserState, questId int32, isRetired bool) { + if !isRetired { + return + } + qs := user.Quests[questId] + if qs.ClearCount > 0 && qs.QuestStateType == model.UserQuestStateTypeActive { + qs.QuestStateType = model.UserQuestStateTypeCleared + user.Quests[questId] = qs + } +} + func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, isRetired, isAnnihilated bool, nowMillis int64) FinishOutcome { quest, ok := h.QuestById[questId] if !ok { @@ -260,17 +271,7 @@ func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, i store.RecoverStamina(user, refund*1000, maxMillis, nowMillis) } - // On retire of a previously-cleared quest (cage Menu Pick replay or - // Map Play replay), HandleQuestStart marked QuestStateType=Active for - // the run. With applyQuestVictory skipped on retire, that Active sticks - // and the cage UI shows the quest as locked. Restore Cleared. - if isRetired { - qs := user.Quests[questId] - if qs.ClearCount > 0 && qs.QuestStateType == model.UserQuestStateTypeActive { - qs.QuestStateType = model.UserQuestStateTypeCleared - user.Quests[questId] = qs - } - } + restoreClearedAfterRetire(user, questId, isRetired) user.MainQuest.ProgressQuestSceneId = 0 user.MainQuest.ProgressHeadQuestSceneId = 0