diff --git a/server/internal/questflow/quest.go b/server/internal/questflow/quest.go index b491276..ce1ffe9 100644 --- a/server/internal/questflow/quest.go +++ b/server/internal/questflow/quest.go @@ -94,18 +94,8 @@ func (h *QuestHandler) handleQuestStartInternal(user *store.UserState, questId i if sceneIds := h.SceneIdsByQuestId[questId]; len(sceneIds) > 0 { firstSceneId := sceneIds[0] prevSceneId := user.MainQuest.CurrentQuestSceneId - user.MainQuest.CurrentQuestSceneId = firstSceneId - if h.isSceneAhead(firstSceneId, user.MainQuest.HeadQuestSceneId) { - user.MainQuest.HeadQuestSceneId = firstSceneId - } + h.advanceMainFlowScene(user, questId, firstSceneId) user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow) - lastSceneId := h.getChapterLastSceneId(questId) - user.MainQuest.IsReachedLastQuestScene = firstSceneId == lastSceneId - if routeId, ok := h.RouteIdByQuestId[questId]; ok { - if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok { - user.MainQuest.MainQuestSeasonId = seasonId - } - } log.Printf("[HandleQuestStart] background quest %d auto-cleared, scene %d -> %d", questId, prevSceneId, firstSceneId) } } @@ -142,8 +132,15 @@ func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, i } outcome := h.evaluateFinishOutcome(user, questId) + wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow) + if !isRetired { h.applyQuestVictory(user, questId, &outcome, nowMillis) + + if isMainQuestPlayable(quest) && !wasReplay { + lastSceneId := h.getLastMainFlowSceneId(questId) + h.advanceMainFlowScene(user, questId, lastSceneId) + } } if isRetired && !isAnnihilated && quest.Stamina > 1 { @@ -152,8 +149,6 @@ func (h *QuestHandler) HandleQuestFinish(user *store.UserState, questId int32, i store.RecoverStamina(user, refund*1000, maxMillis, nowMillis) } - wasReplay := user.MainQuest.CurrentQuestFlowType == int32(model.QuestFlowTypeReplayFlow) - user.MainQuest.ProgressQuestSceneId = 0 user.MainQuest.ProgressHeadQuestSceneId = 0 user.MainQuest.ProgressQuestFlowType = 0 diff --git a/server/internal/questflow/scene.go b/server/internal/questflow/scene.go index ae6ccc1..8627bcb 100644 --- a/server/internal/questflow/scene.go +++ b/server/internal/questflow/scene.go @@ -26,6 +26,23 @@ func (h *QuestHandler) isSceneAhead(newSceneId, currentHeadId int32) bool { return h.SceneById[newSceneId].SortOrder > h.SceneById[currentHeadId].SortOrder } +func (h *QuestHandler) advanceMainFlowScene(user *store.UserState, questId, sceneId int32) { + user.MainQuest.CurrentQuestSceneId = sceneId + if h.isSceneAhead(sceneId, user.MainQuest.HeadQuestSceneId) { + user.MainQuest.HeadQuestSceneId = sceneId + } + + lastSceneId := h.getChapterLastSceneId(questId) + user.MainQuest.IsReachedLastQuestScene = sceneId == lastSceneId + + if routeId, ok := h.RouteIdByQuestId[questId]; ok { + user.MainQuest.CurrentMainQuestRouteId = routeId + if seasonId, ok := h.SeasonIdByRouteId[routeId]; ok { + user.MainQuest.MainQuestSeasonId = seasonId + } + } +} + func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questSceneId int32, nowMillis int64) { scene, ok := h.SceneById[questSceneId] if !ok { @@ -37,10 +54,7 @@ func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questS panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress", questSceneId)) } - user.MainQuest.CurrentQuestSceneId = questSceneId - if h.isSceneAhead(questSceneId, user.MainQuest.HeadQuestSceneId) { - user.MainQuest.HeadQuestSceneId = questSceneId - } + h.advanceMainFlowScene(user, quest.QuestId, questSceneId) user.MainQuest.CurrentQuestFlowType = int32(model.QuestFlowTypeMainFlow) if user.SideStoryActiveProgress.CurrentSideStoryQuestId != 0 { @@ -49,15 +63,6 @@ func (h *QuestHandler) HandleMainFlowSceneProgress(user *store.UserState, questS } } - lastSceneId := h.getChapterLastSceneId(scene.QuestId) - user.MainQuest.IsReachedLastQuestScene = questSceneId == lastSceneId - - routeId, ok := h.RouteIdByQuestId[quest.QuestId] - if !ok { - panic(fmt.Sprintf("unknown questId=%d for HandleMainFlowSceneProgress setting currentMainQuestRouteId", quest.QuestId)) - } - user.MainQuest.CurrentMainQuestRouteId = routeId - user.PortalCageStatus.IsCurrentProgress = false user.PortalCageStatus.LatestVersion = nowMillis