mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 05:43:41 +03:00
Implement Recollections of Dusk
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
|
||||
pb "lunar-tear/server/gen/proto"
|
||||
"lunar-tear/server/internal/gametime"
|
||||
"lunar-tear/server/internal/masterdata"
|
||||
"lunar-tear/server/internal/model"
|
||||
"lunar-tear/server/internal/runtime"
|
||||
"lunar-tear/server/internal/store"
|
||||
@@ -22,34 +23,89 @@ func NewSideStoryQuestServiceServer(users store.UserRepository, sessions store.S
|
||||
return &SideStoryQuestServiceServer{users: users, sessions: sessions, holder: holder}
|
||||
}
|
||||
|
||||
func sideStoryClearedCount(info *masterdata.SideStoryQuestInfo, user *store.UserState) int {
|
||||
cleared := 0
|
||||
for _, questId := range info.Quests {
|
||||
if user.QuestLimitContentStatus[questId].LimitContentQuestStatusType == 1 {
|
||||
cleared++
|
||||
}
|
||||
}
|
||||
return cleared
|
||||
}
|
||||
|
||||
func sideStoryQuestCleared(info *masterdata.SideStoryQuestInfo, user *store.UserState) bool {
|
||||
return info != nil && len(info.Quests) > 0 && sideStoryClearedCount(info, user) == len(info.Quests)
|
||||
}
|
||||
|
||||
func sideStoryNextSceneAfterBattle(info *masterdata.SideStoryQuestInfo, user *store.UserState) (int32, bool) {
|
||||
cleared := sideStoryClearedCount(info, user)
|
||||
if cleared == 0 {
|
||||
return 0, false
|
||||
}
|
||||
total := len(info.Quests)
|
||||
var sceneType model.SideStorySceneIdType
|
||||
switch {
|
||||
case cleared >= total:
|
||||
sceneType = model.SideStorySceneOutroduction
|
||||
case cleared == total-1:
|
||||
sceneType = model.SideStorySceneUnlockLastQuest
|
||||
default:
|
||||
sceneType = model.SideStoryScenePlayLastQuest
|
||||
}
|
||||
return info.SceneIdByType(sceneType)
|
||||
}
|
||||
|
||||
func applySideStoryProgressState(progress *store.SideStoryQuestProgress, info *masterdata.SideStoryQuestInfo, user *store.UserState) {
|
||||
if sideStoryQuestCleared(info, user) {
|
||||
progress.SideStoryQuestStateType = model.SideStoryQuestStateCleared
|
||||
} else if progress.SideStoryQuestStateType == model.SideStoryQuestStateUnknown {
|
||||
progress.SideStoryQuestStateType = model.SideStoryQuestStateActive
|
||||
}
|
||||
}
|
||||
|
||||
func setSideStoryActive(user *store.UserState, questId, sceneId int32, nowMillis int64) {
|
||||
user.SideStoryActiveProgress = store.SideStoryActiveProgress{
|
||||
CurrentSideStoryQuestId: questId,
|
||||
CurrentSideStoryQuestSceneId: sceneId,
|
||||
LatestVersion: nowMillis,
|
||||
}
|
||||
}
|
||||
|
||||
func setSideStoryScene(user *store.UserState, info *masterdata.SideStoryQuestInfo, questId, sceneId int32, nowMillis int64) {
|
||||
progress := user.SideStoryQuests[questId]
|
||||
progress.HeadSideStoryQuestSceneId = sceneId
|
||||
applySideStoryProgressState(&progress, info, user)
|
||||
progress.LatestVersion = nowMillis
|
||||
user.SideStoryQuests[questId] = progress
|
||||
setSideStoryActive(user, questId, sceneId, nowMillis)
|
||||
}
|
||||
|
||||
func (s *SideStoryQuestServiceServer) MoveSideStoryQuestProgress(ctx context.Context, req *pb.MoveSideStoryQuestRequest) (*pb.MoveSideStoryQuestResponse, error) {
|
||||
log.Printf("[SideStoryQuestService] MoveSideStoryQuestProgress: sideStoryQuestId=%d", req.SideStoryQuestId)
|
||||
|
||||
userId := CurrentUserId(ctx, s.users, s.sessions)
|
||||
nowMillis := gametime.NowMillis()
|
||||
firstSceneId := s.holder.Get().SideStory.FirstSceneByQuestId[req.SideStoryQuestId]
|
||||
info := s.holder.Get().SideStory.QuestById[req.SideStoryQuestId]
|
||||
|
||||
s.users.UpdateUser(userId, func(user *store.UserState) {
|
||||
if info == nil || len(info.Quests) == 0 {
|
||||
log.Printf("[SideStoryQuestService] unknown sideStoryQuestId=%d, skipping", req.SideStoryQuestId)
|
||||
return
|
||||
}
|
||||
|
||||
existing, exists := user.SideStoryQuests[req.SideStoryQuestId]
|
||||
|
||||
var sceneId int32
|
||||
if exists && existing.HeadSideStoryQuestSceneId > 0 {
|
||||
sceneId = existing.HeadSideStoryQuestSceneId
|
||||
var scene int32
|
||||
var ok bool
|
||||
if !exists || existing.HeadSideStoryQuestSceneId == 0 {
|
||||
scene, ok = info.SceneIdByType(model.SideStorySceneIntroduction)
|
||||
} else {
|
||||
sceneId = firstSceneId
|
||||
scene, ok = sideStoryNextSceneAfterBattle(info, user)
|
||||
}
|
||||
|
||||
user.SideStoryActiveProgress.CurrentSideStoryQuestId = req.SideStoryQuestId
|
||||
user.SideStoryActiveProgress.CurrentSideStoryQuestSceneId = sceneId
|
||||
user.SideStoryActiveProgress.LatestVersion = nowMillis
|
||||
|
||||
if !exists {
|
||||
user.SideStoryQuests[req.SideStoryQuestId] = store.SideStoryQuestProgress{
|
||||
HeadSideStoryQuestSceneId: firstSceneId,
|
||||
SideStoryQuestStateType: model.SideStoryQuestStateActive,
|
||||
LatestVersion: nowMillis,
|
||||
}
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
setSideStoryScene(user, info, req.SideStoryQuestId, scene, nowMillis)
|
||||
})
|
||||
|
||||
return &pb.MoveSideStoryQuestResponse{}, nil
|
||||
@@ -61,16 +117,10 @@ func (s *SideStoryQuestServiceServer) UpdateSideStoryQuestSceneProgress(ctx cont
|
||||
|
||||
userId := CurrentUserId(ctx, s.users, s.sessions)
|
||||
nowMillis := gametime.NowMillis()
|
||||
s.users.UpdateUser(userId, func(user *store.UserState) {
|
||||
user.SideStoryActiveProgress.CurrentSideStoryQuestSceneId = req.SideStoryQuestSceneId
|
||||
user.SideStoryActiveProgress.LatestVersion = nowMillis
|
||||
info := s.holder.Get().SideStory.QuestById[req.SideStoryQuestId]
|
||||
|
||||
progress := user.SideStoryQuests[req.SideStoryQuestId]
|
||||
if req.SideStoryQuestSceneId > progress.HeadSideStoryQuestSceneId {
|
||||
progress.HeadSideStoryQuestSceneId = req.SideStoryQuestSceneId
|
||||
}
|
||||
progress.LatestVersion = nowMillis
|
||||
user.SideStoryQuests[req.SideStoryQuestId] = progress
|
||||
s.users.UpdateUser(userId, func(user *store.UserState) {
|
||||
setSideStoryScene(user, info, req.SideStoryQuestId, req.SideStoryQuestSceneId, nowMillis)
|
||||
})
|
||||
|
||||
return &pb.UpdateSideStoryQuestSceneProgressResponse{}, nil
|
||||
|
||||
Reference in New Issue
Block a user