Fix map replay flow and quest mission rewards
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled

This commit is contained in:
Ilya Groshev
2026-05-11 20:21:55 +03:00
parent 9a2cc92a6f
commit 6c9e3c45f0
14 changed files with 241 additions and 188 deletions
-46
View File
@@ -12,34 +12,6 @@ type BattleDropInfo struct {
BattleDropCategoryId int32
}
// SeasonRoutePair pairs a main-quest season with one of its routes, used to
// reconstruct a player's progression history for IUserMainQuestSeasonRoute.
type SeasonRoutePair struct {
MainQuestSeasonId int32
MainQuestRouteId int32
}
// SeasonRoutesUpToCurrent returns every (season, route) pair from
// OrderedSeasonRoutes whose ordering is <= the given (seasonId, routeId)
// pair, inclusive. Used at user-load time to backfill
// IUserMainQuestSeasonRoute history so the client can compute the next
// route correctly when the player advances past a chapter end. Returns
// nil if the given pair isn't found.
func (q *QuestCatalog) SeasonRoutesUpToCurrent(seasonId, routeId int32) []SeasonRoutePair {
if q == nil {
return nil
}
out := make([]SeasonRoutePair, 0, len(q.OrderedSeasonRoutes))
for _, p := range q.OrderedSeasonRoutes {
out = append(out, p)
if p.MainQuestSeasonId == seasonId && p.MainQuestRouteId == routeId {
return out
}
}
// Pair not found in masterdata — don't return a partial list.
return nil
}
type QuestCatalog struct {
SceneById map[int32]EntityMQuestScene
MissionById map[int32]EntityMQuestMission
@@ -62,7 +34,6 @@ type QuestCatalog struct {
TutorialUnlockConditions []EntityMTutorialUnlockCondition
ChapterLastSceneByQuestId map[int32]int32
SeasonIdByRouteId map[int32]int32
OrderedSeasonRoutes []SeasonRoutePair
QuestsWithDifficulty map[int32]bool // any questId referenced in m_quest_relation_main_flow
BattleOnlyTargetSceneByQuestId map[int32]int32
@@ -148,22 +119,6 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
seasonIdByRouteId[r.MainQuestRouteId] = r.MainQuestSeasonId
}
orderedRoutes := make([]EntityMMainQuestRoute, len(routes))
copy(orderedRoutes, routes)
sort.Slice(orderedRoutes, func(i, j int) bool {
if orderedRoutes[i].MainQuestSeasonId != orderedRoutes[j].MainQuestSeasonId {
return orderedRoutes[i].MainQuestSeasonId < orderedRoutes[j].MainQuestSeasonId
}
return orderedRoutes[i].SortOrder < orderedRoutes[j].SortOrder
})
orderedSeasonRoutes := make([]SeasonRoutePair, 0, len(orderedRoutes))
for _, r := range orderedRoutes {
orderedSeasonRoutes = append(orderedSeasonRoutes, SeasonRoutePair{
MainQuestSeasonId: r.MainQuestSeasonId,
MainQuestRouteId: r.MainQuestRouteId,
})
}
firstClearSwitches, err := utils.ReadTable[EntityMQuestFirstClearRewardSwitch]("m_quest_first_clear_reward_switch")
if err != nil {
return nil, fmt.Errorf("load quest first clear reward switch table: %w", err)
@@ -600,7 +555,6 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
TutorialUnlockConditions: tutorialUnlockConds,
ChapterLastSceneByQuestId: chapterLastSceneByQuestId,
SeasonIdByRouteId: seasonIdByRouteId,
OrderedSeasonRoutes: orderedSeasonRoutes,
QuestsWithDifficulty: questsWithDifficulty,
BattleOnlyTargetSceneByQuestId: battleOnlyTargetSceneByQuestId,