66
77 pb "lunar-tear/server/gen/proto"
88 "lunar-tear/server/internal/gametime"
9+ "lunar-tear/server/internal/masterdata"
910 "lunar-tear/server/internal/model"
1011 "lunar-tear/server/internal/runtime"
1112 "lunar-tear/server/internal/store"
@@ -22,34 +23,89 @@ func NewSideStoryQuestServiceServer(users store.UserRepository, sessions store.S
2223 return & SideStoryQuestServiceServer {users : users , sessions : sessions , holder : holder }
2324}
2425
26+ func sideStoryClearedCount (info * masterdata.SideStoryQuestInfo , user * store.UserState ) int {
27+ cleared := 0
28+ for _ , questId := range info .Quests {
29+ if user .QuestLimitContentStatus [questId ].LimitContentQuestStatusType == 1 {
30+ cleared ++
31+ }
32+ }
33+ return cleared
34+ }
35+
36+ func sideStoryQuestCleared (info * masterdata.SideStoryQuestInfo , user * store.UserState ) bool {
37+ return info != nil && len (info .Quests ) > 0 && sideStoryClearedCount (info , user ) == len (info .Quests )
38+ }
39+
40+ func sideStoryNextSceneAfterBattle (info * masterdata.SideStoryQuestInfo , user * store.UserState ) (int32 , bool ) {
41+ cleared := sideStoryClearedCount (info , user )
42+ if cleared == 0 {
43+ return 0 , false
44+ }
45+ total := len (info .Quests )
46+ var sceneType model.SideStorySceneIdType
47+ switch {
48+ case cleared >= total :
49+ sceneType = model .SideStorySceneOutroduction
50+ case cleared == total - 1 :
51+ sceneType = model .SideStorySceneUnlockLastQuest
52+ default :
53+ sceneType = model .SideStoryScenePlayLastQuest
54+ }
55+ return info .SceneIdByType (sceneType )
56+ }
57+
58+ func applySideStoryProgressState (progress * store.SideStoryQuestProgress , info * masterdata.SideStoryQuestInfo , user * store.UserState ) {
59+ if sideStoryQuestCleared (info , user ) {
60+ progress .SideStoryQuestStateType = model .SideStoryQuestStateCleared
61+ } else if progress .SideStoryQuestStateType == model .SideStoryQuestStateUnknown {
62+ progress .SideStoryQuestStateType = model .SideStoryQuestStateActive
63+ }
64+ }
65+
66+ func setSideStoryActive (user * store.UserState , questId , sceneId int32 , nowMillis int64 ) {
67+ user .SideStoryActiveProgress = store.SideStoryActiveProgress {
68+ CurrentSideStoryQuestId : questId ,
69+ CurrentSideStoryQuestSceneId : sceneId ,
70+ LatestVersion : nowMillis ,
71+ }
72+ }
73+
74+ func setSideStoryScene (user * store.UserState , info * masterdata.SideStoryQuestInfo , questId , sceneId int32 , nowMillis int64 ) {
75+ progress := user .SideStoryQuests [questId ]
76+ progress .HeadSideStoryQuestSceneId = sceneId
77+ applySideStoryProgressState (& progress , info , user )
78+ progress .LatestVersion = nowMillis
79+ user .SideStoryQuests [questId ] = progress
80+ setSideStoryActive (user , questId , sceneId , nowMillis )
81+ }
82+
2583func (s * SideStoryQuestServiceServer ) MoveSideStoryQuestProgress (ctx context.Context , req * pb.MoveSideStoryQuestRequest ) (* pb.MoveSideStoryQuestResponse , error ) {
2684 log .Printf ("[SideStoryQuestService] MoveSideStoryQuestProgress: sideStoryQuestId=%d" , req .SideStoryQuestId )
2785
2886 userId := CurrentUserId (ctx , s .users , s .sessions )
2987 nowMillis := gametime .NowMillis ()
30- firstSceneId := s .holder .Get ().SideStory .FirstSceneByQuestId [req .SideStoryQuestId ]
88+ info := s .holder .Get ().SideStory .QuestById [req .SideStoryQuestId ]
3189
3290 s .users .UpdateUser (userId , func (user * store.UserState ) {
91+ if info == nil || len (info .Quests ) == 0 {
92+ log .Printf ("[SideStoryQuestService] unknown sideStoryQuestId=%d, skipping" , req .SideStoryQuestId )
93+ return
94+ }
95+
3396 existing , exists := user .SideStoryQuests [req .SideStoryQuestId ]
3497
35- var sceneId int32
36- if exists && existing .HeadSideStoryQuestSceneId > 0 {
37- sceneId = existing .HeadSideStoryQuestSceneId
98+ var scene int32
99+ var ok bool
100+ if ! exists || existing .HeadSideStoryQuestSceneId == 0 {
101+ scene , ok = info .SceneIdByType (model .SideStorySceneIntroduction )
38102 } else {
39- sceneId = firstSceneId
103+ scene , ok = sideStoryNextSceneAfterBattle ( info , user )
40104 }
41-
42- user .SideStoryActiveProgress .CurrentSideStoryQuestId = req .SideStoryQuestId
43- user .SideStoryActiveProgress .CurrentSideStoryQuestSceneId = sceneId
44- user .SideStoryActiveProgress .LatestVersion = nowMillis
45-
46- if ! exists {
47- user .SideStoryQuests [req .SideStoryQuestId ] = store.SideStoryQuestProgress {
48- HeadSideStoryQuestSceneId : firstSceneId ,
49- SideStoryQuestStateType : model .SideStoryQuestStateActive ,
50- LatestVersion : nowMillis ,
51- }
105+ if ! ok {
106+ return
52107 }
108+ setSideStoryScene (user , info , req .SideStoryQuestId , scene , nowMillis )
53109 })
54110
55111 return & pb.MoveSideStoryQuestResponse {}, nil
@@ -61,16 +117,10 @@ func (s *SideStoryQuestServiceServer) UpdateSideStoryQuestSceneProgress(ctx cont
61117
62118 userId := CurrentUserId (ctx , s .users , s .sessions )
63119 nowMillis := gametime .NowMillis ()
64- s .users .UpdateUser (userId , func (user * store.UserState ) {
65- user .SideStoryActiveProgress .CurrentSideStoryQuestSceneId = req .SideStoryQuestSceneId
66- user .SideStoryActiveProgress .LatestVersion = nowMillis
120+ info := s .holder .Get ().SideStory .QuestById [req .SideStoryQuestId ]
67121
68- progress := user .SideStoryQuests [req .SideStoryQuestId ]
69- if req .SideStoryQuestSceneId > progress .HeadSideStoryQuestSceneId {
70- progress .HeadSideStoryQuestSceneId = req .SideStoryQuestSceneId
71- }
72- progress .LatestVersion = nowMillis
73- user .SideStoryQuests [req .SideStoryQuestId ] = progress
122+ s .users .UpdateUser (userId , func (user * store.UserState ) {
123+ setSideStoryScene (user , info , req .SideStoryQuestId , req .SideStoryQuestSceneId , nowMillis )
74124 })
75125
76126 return & pb.UpdateSideStoryQuestSceneProgressResponse {}, nil
0 commit comments