@@ -34,6 +34,8 @@ type QuestCatalog struct {
3434 TutorialUnlockConditions []EntityMTutorialUnlockCondition
3535 ChapterLastSceneByQuestId map [int32 ]int32
3636 SeasonIdByRouteId map [int32 ]int32
37+ RoutesBySeason map [int32 ][]int32
38+ RouteCompletionQuestId map [int32 ]int32
3739 BattleOnlyTargetSceneByQuestId map [int32 ]int32
3840
3941 UserExpThresholds []int32
@@ -114,8 +116,53 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
114116 return nil , fmt .Errorf ("load main quest route table: %w" , err )
115117 }
116118 seasonIdByRouteId := make (map [int32 ]int32 , len (routes ))
119+ routesBySeason := make (map [int32 ][]int32 , len (routes ))
120+ sortOrderByRoute := make (map [int32 ]int32 , len (routes ))
117121 for _ , r := range routes {
118122 seasonIdByRouteId [r .MainQuestRouteId ] = r .MainQuestSeasonId
123+ routesBySeason [r .MainQuestSeasonId ] = append (routesBySeason [r .MainQuestSeasonId ], r .MainQuestRouteId )
124+ sortOrderByRoute [r .MainQuestRouteId ] = r .SortOrder
125+ }
126+ for seasonId , ids := range routesBySeason {
127+ s := ids
128+ sort .Slice (s , func (i , j int ) bool { return sortOrderByRoute [s [i ]] > sortOrderByRoute [s [j ]] })
129+ routesBySeason [seasonId ] = s
130+ }
131+
132+ anotherReplayConds , err := utils.ReadTable [EntityMMainQuestRouteAnotherReplayFlowUnlockCondition ]("m_main_quest_route_another_replay_flow_unlock_condition" )
133+ if err != nil {
134+ return nil , fmt .Errorf ("load main quest route another replay flow unlock condition table: %w" , err )
135+ }
136+ evaluateConds , err := utils.ReadTable [EntityMEvaluateCondition ]("m_evaluate_condition" )
137+ if err != nil {
138+ return nil , fmt .Errorf ("load evaluate condition table: %w" , err )
139+ }
140+ valueGroupByConditionId := make (map [int32 ]int32 , len (evaluateConds ))
141+ for _ , c := range evaluateConds {
142+ valueGroupByConditionId [c .EvaluateConditionId ] = c .EvaluateConditionValueGroupId
143+ }
144+ evaluateValueGroups , err := utils.ReadTable [EntityMEvaluateConditionValueGroup ]("m_evaluate_condition_value_group" )
145+ if err != nil {
146+ return nil , fmt .Errorf ("load evaluate condition value group table: %w" , err )
147+ }
148+ valueByGroupId := make (map [int32 ]int32 , len (evaluateValueGroups ))
149+ for _ , vg := range evaluateValueGroups {
150+ if _ , exists := valueByGroupId [vg .EvaluateConditionValueGroupId ]; exists {
151+ continue
152+ }
153+ valueByGroupId [vg .EvaluateConditionValueGroupId ] = int32 (vg .Value )
154+ }
155+ routeCompletionQuestId := make (map [int32 ]int32 , len (anotherReplayConds ))
156+ for _ , c := range anotherReplayConds {
157+ valueGroupId , ok := valueGroupByConditionId [c .UnlockEvaluateConditionId ]
158+ if ! ok {
159+ continue
160+ }
161+ questId , ok := valueByGroupId [valueGroupId ]
162+ if ! ok {
163+ continue
164+ }
165+ routeCompletionQuestId [c .MainQuestRouteId ] = questId
119166 }
120167
121168 firstClearSwitches , err := utils.ReadTable [EntityMQuestFirstClearRewardSwitch ]("m_quest_first_clear_reward_switch" )
@@ -539,6 +586,8 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
539586 TutorialUnlockConditions : tutorialUnlockConds ,
540587 ChapterLastSceneByQuestId : chapterLastSceneByQuestId ,
541588 SeasonIdByRouteId : seasonIdByRouteId ,
589+ RoutesBySeason : routesBySeason ,
590+ RouteCompletionQuestId : routeCompletionQuestId ,
542591 BattleOnlyTargetSceneByQuestId : battleOnlyTargetSceneByQuestId ,
543592
544593 UserExpThresholds : BuildExpThresholds (paramMapRows , 1 ),
0 commit comments