mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 05:43:41 +03:00
Fix Main Quests replay and weapon awaken level cap
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled
This commit is contained in:
@@ -81,6 +81,7 @@ func initMaps(u *store.UserState) {
|
||||
u.CharacterRebirths = make(map[int32]store.CharacterRebirthState)
|
||||
u.AutoSaleSettings = make(map[int32]store.AutoSaleSettingState)
|
||||
u.SideStoryQuests = make(map[int32]store.SideStoryQuestProgress)
|
||||
u.MainQuestSeasonRoutes = make(map[store.SeasonRouteKey]store.SeasonRouteEntry)
|
||||
u.QuestLimitContentStatus = make(map[int32]store.QuestLimitContentStatus)
|
||||
u.BigHuntMaxScores = make(map[int32]store.BigHuntMaxScore)
|
||||
u.BigHuntStatuses = make(map[int32]store.BigHuntStatus)
|
||||
@@ -124,17 +125,26 @@ func load1to1(db *sql.DB, uid int64, u *store.UserState) {
|
||||
Scan(&u.LoginBonus.LoginBonusId, &u.LoginBonus.CurrentPageNumber, &u.LoginBonus.CurrentStampNumber,
|
||||
&u.LoginBonus.LatestRewardReceiveDatetime, &u.LoginBonus.LatestVersion)
|
||||
|
||||
var ctxActive, ctxIsLast, ctxCage int
|
||||
_ = db.QueryRow(`SELECT current_quest_flow_type, current_main_quest_route_id, current_quest_scene_id,
|
||||
head_quest_scene_id, is_reached_last_quest_scene, progress_quest_scene_id, progress_head_quest_scene_id,
|
||||
progress_quest_flow_type, main_quest_season_id, latest_version, saved_current_quest_scene_id,
|
||||
saved_head_quest_scene_id, replay_flow_current_quest_scene_id, replay_flow_head_quest_scene_id
|
||||
progress_quest_flow_type, main_quest_season_id, latest_version,
|
||||
saved_ctx_active, saved_ctx_current_quest_scene_id, saved_ctx_head_quest_scene_id,
|
||||
saved_ctx_current_main_quest_route_id, saved_ctx_main_quest_season_id,
|
||||
saved_ctx_is_reached_last_quest_scene, saved_ctx_portal_cage_in_progress,
|
||||
replay_flow_current_quest_scene_id, replay_flow_head_quest_scene_id
|
||||
FROM user_main_quest WHERE user_id=?`, uid).
|
||||
Scan(&u.MainQuest.CurrentQuestFlowType, &u.MainQuest.CurrentMainQuestRouteId, &u.MainQuest.CurrentQuestSceneId,
|
||||
&u.MainQuest.HeadQuestSceneId, &b, &u.MainQuest.ProgressQuestSceneId, &u.MainQuest.ProgressHeadQuestSceneId,
|
||||
&u.MainQuest.ProgressQuestFlowType, &u.MainQuest.MainQuestSeasonId, &u.MainQuest.LatestVersion,
|
||||
&u.MainQuest.SavedCurrentQuestSceneId, &u.MainQuest.SavedHeadQuestSceneId,
|
||||
&ctxActive, &u.MainQuest.SavedContext.CurrentQuestSceneId, &u.MainQuest.SavedContext.HeadQuestSceneId,
|
||||
&u.MainQuest.SavedContext.CurrentMainQuestRouteId, &u.MainQuest.SavedContext.MainQuestSeasonId,
|
||||
&ctxIsLast, &ctxCage,
|
||||
&u.MainQuest.ReplayFlowCurrentQuestSceneId, &u.MainQuest.ReplayFlowHeadQuestSceneId)
|
||||
u.MainQuest.IsReachedLastQuestScene = b != 0
|
||||
u.MainQuest.SavedContext.Active = ctxActive != 0
|
||||
u.MainQuest.SavedContext.IsReachedLastQuestScene = ctxIsLast != 0
|
||||
u.MainQuest.SavedContext.PortalCageInProgress = ctxCage != 0
|
||||
|
||||
_ = db.QueryRow(`SELECT current_event_quest_chapter_id, current_quest_id, current_quest_scene_id,
|
||||
head_quest_scene_id, latest_version FROM user_event_quest WHERE user_id=?`, uid).
|
||||
@@ -346,6 +356,16 @@ func loadMapTables(db *sql.DB, uid int64, u *store.UserState) {
|
||||
}
|
||||
})
|
||||
|
||||
queryRows(db, `SELECT main_quest_season_id, main_quest_route_id, latest_version
|
||||
FROM user_main_quest_season_routes WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
||||
var seasonId, routeId int32
|
||||
var lv int64
|
||||
rows.Scan(&seasonId, &routeId, &lv)
|
||||
u.MainQuestSeasonRoutes[store.SeasonRouteKey{MainQuestSeasonId: seasonId, MainQuestRouteId: routeId}] = store.SeasonRouteEntry{
|
||||
MainQuestSeasonId: seasonId, MainQuestRouteId: routeId, LatestVersion: lv,
|
||||
}
|
||||
})
|
||||
|
||||
queryRows(db, `SELECT limit_content_id, limit_content_quest_status_type, event_quest_chapter_id, latest_version
|
||||
FROM user_quest_limit_content_status WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
||||
var id int32
|
||||
|
||||
@@ -50,11 +50,16 @@ func writeUserState(tx *sql.Tx, uid int64, u *store.UserState) error {
|
||||
u.LoginBonus.LatestRewardReceiveDatetime, u.LoginBonus.LatestVersion); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := exec(`INSERT INTO user_main_quest (user_id, current_quest_flow_type, current_main_quest_route_id, current_quest_scene_id, head_quest_scene_id, is_reached_last_quest_scene, progress_quest_scene_id, progress_head_quest_scene_id, progress_quest_flow_type, main_quest_season_id, latest_version, saved_current_quest_scene_id, saved_head_quest_scene_id, replay_flow_current_quest_scene_id, replay_flow_head_quest_scene_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,
|
||||
if err := exec(`INSERT INTO user_main_quest (user_id, current_quest_flow_type, current_main_quest_route_id, current_quest_scene_id, head_quest_scene_id, is_reached_last_quest_scene, progress_quest_scene_id, progress_head_quest_scene_id, progress_quest_flow_type, main_quest_season_id, latest_version, saved_ctx_active, saved_ctx_current_quest_scene_id, saved_ctx_head_quest_scene_id, saved_ctx_current_main_quest_route_id, saved_ctx_main_quest_season_id, saved_ctx_is_reached_last_quest_scene, saved_ctx_portal_cage_in_progress, replay_flow_current_quest_scene_id, replay_flow_head_quest_scene_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,
|
||||
uid, u.MainQuest.CurrentQuestFlowType, u.MainQuest.CurrentMainQuestRouteId, u.MainQuest.CurrentQuestSceneId,
|
||||
u.MainQuest.HeadQuestSceneId, boolToInt(u.MainQuest.IsReachedLastQuestScene), u.MainQuest.ProgressQuestSceneId,
|
||||
u.MainQuest.ProgressHeadQuestSceneId, u.MainQuest.ProgressQuestFlowType, u.MainQuest.MainQuestSeasonId,
|
||||
u.MainQuest.LatestVersion, u.MainQuest.SavedCurrentQuestSceneId, u.MainQuest.SavedHeadQuestSceneId,
|
||||
u.MainQuest.LatestVersion,
|
||||
boolToInt(u.MainQuest.SavedContext.Active),
|
||||
u.MainQuest.SavedContext.CurrentQuestSceneId, u.MainQuest.SavedContext.HeadQuestSceneId,
|
||||
u.MainQuest.SavedContext.CurrentMainQuestRouteId, u.MainQuest.SavedContext.MainQuestSeasonId,
|
||||
boolToInt(u.MainQuest.SavedContext.IsReachedLastQuestScene),
|
||||
boolToInt(u.MainQuest.SavedContext.PortalCageInProgress),
|
||||
u.MainQuest.ReplayFlowCurrentQuestSceneId, u.MainQuest.ReplayFlowHeadQuestSceneId); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -208,6 +213,12 @@ func writeUserState(tx *sql.Tx, uid int64, u *store.UserState) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for k, v := range u.MainQuestSeasonRoutes {
|
||||
if err := exec(`INSERT INTO user_main_quest_season_routes (user_id, main_quest_season_id, main_quest_route_id, latest_version) VALUES (?,?,?,?)`,
|
||||
uid, k.MainQuestSeasonId, k.MainQuestRouteId, v.LatestVersion); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for id, v := range u.QuestLimitContentStatus {
|
||||
if err := exec(`INSERT INTO user_quest_limit_content_status (user_id, limit_content_id, limit_content_quest_status_type, event_quest_chapter_id, latest_version) VALUES (?,?,?,?,?)`,
|
||||
uid, id, v.LimitContentQuestStatusType, v.EventQuestChapterId, v.LatestVersion); err != nil {
|
||||
@@ -562,11 +573,16 @@ func diffAndSave(tx *sql.Tx, uid int64, before, after *store.UserState) error {
|
||||
}
|
||||
}
|
||||
if before.MainQuest != after.MainQuest {
|
||||
if err := exec(`UPDATE user_main_quest SET current_quest_flow_type=?, current_main_quest_route_id=?, current_quest_scene_id=?, head_quest_scene_id=?, is_reached_last_quest_scene=?, progress_quest_scene_id=?, progress_head_quest_scene_id=?, progress_quest_flow_type=?, main_quest_season_id=?, latest_version=?, saved_current_quest_scene_id=?, saved_head_quest_scene_id=?, replay_flow_current_quest_scene_id=?, replay_flow_head_quest_scene_id=? WHERE user_id=?`,
|
||||
if err := exec(`UPDATE user_main_quest SET current_quest_flow_type=?, current_main_quest_route_id=?, current_quest_scene_id=?, head_quest_scene_id=?, is_reached_last_quest_scene=?, progress_quest_scene_id=?, progress_head_quest_scene_id=?, progress_quest_flow_type=?, main_quest_season_id=?, latest_version=?, saved_ctx_active=?, saved_ctx_current_quest_scene_id=?, saved_ctx_head_quest_scene_id=?, saved_ctx_current_main_quest_route_id=?, saved_ctx_main_quest_season_id=?, saved_ctx_is_reached_last_quest_scene=?, saved_ctx_portal_cage_in_progress=?, replay_flow_current_quest_scene_id=?, replay_flow_head_quest_scene_id=? WHERE user_id=?`,
|
||||
after.MainQuest.CurrentQuestFlowType, after.MainQuest.CurrentMainQuestRouteId, after.MainQuest.CurrentQuestSceneId,
|
||||
after.MainQuest.HeadQuestSceneId, boolToInt(after.MainQuest.IsReachedLastQuestScene), after.MainQuest.ProgressQuestSceneId,
|
||||
after.MainQuest.ProgressHeadQuestSceneId, after.MainQuest.ProgressQuestFlowType, after.MainQuest.MainQuestSeasonId,
|
||||
after.MainQuest.LatestVersion, after.MainQuest.SavedCurrentQuestSceneId, after.MainQuest.SavedHeadQuestSceneId,
|
||||
after.MainQuest.LatestVersion,
|
||||
boolToInt(after.MainQuest.SavedContext.Active),
|
||||
after.MainQuest.SavedContext.CurrentQuestSceneId, after.MainQuest.SavedContext.HeadQuestSceneId,
|
||||
after.MainQuest.SavedContext.CurrentMainQuestRouteId, after.MainQuest.SavedContext.MainQuestSeasonId,
|
||||
boolToInt(after.MainQuest.SavedContext.IsReachedLastQuestScene),
|
||||
boolToInt(after.MainQuest.SavedContext.PortalCageInProgress),
|
||||
after.MainQuest.ReplayFlowCurrentQuestSceneId, after.MainQuest.ReplayFlowHeadQuestSceneId, uid); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -734,6 +750,18 @@ func diffAndSave(tx *sql.Tx, uid int64, before, after *store.UserState) error {
|
||||
func(v store.SideStoryQuestProgress) []any {
|
||||
return []any{0, v.HeadSideStoryQuestSceneId, int32(v.SideStoryQuestStateType), v.LatestVersion}
|
||||
}, "side_story_quest_id, head_side_story_quest_scene_id, side_story_quest_state_type, latest_version")
|
||||
|
||||
for k, v := range after.MainQuestSeasonRoutes {
|
||||
if old, ok := before.MainQuestSeasonRoutes[k]; !ok || old != v {
|
||||
exec(`INSERT OR REPLACE INTO user_main_quest_season_routes (user_id, main_quest_season_id, main_quest_route_id, latest_version) VALUES (?,?,?,?)`,
|
||||
uid, k.MainQuestSeasonId, k.MainQuestRouteId, v.LatestVersion)
|
||||
}
|
||||
}
|
||||
for k := range before.MainQuestSeasonRoutes {
|
||||
if _, ok := after.MainQuestSeasonRoutes[k]; !ok {
|
||||
exec(`DELETE FROM user_main_quest_season_routes WHERE user_id=? AND main_quest_season_id=? AND main_quest_route_id=?`, uid, k.MainQuestSeasonId, k.MainQuestRouteId)
|
||||
}
|
||||
}
|
||||
diffMapInt32(tx, uid, before.QuestLimitContentStatus, after.QuestLimitContentStatus, "user_quest_limit_content_status", "limit_content_id",
|
||||
func(v store.QuestLimitContentStatus) []any {
|
||||
return []any{0, v.LimitContentQuestStatusType, v.EventQuestChapterId, v.LatestVersion}
|
||||
|
||||
@@ -109,6 +109,7 @@ func (s *SQLiteStore) ImportUser(u *store.UserState) error {
|
||||
"user_big_hunt_max_scores",
|
||||
"user_quest_limit_content_status",
|
||||
"user_side_story_quests",
|
||||
"user_main_quest_season_routes",
|
||||
"user_missions",
|
||||
"user_quest_missions",
|
||||
"user_quests",
|
||||
|
||||
@@ -41,6 +41,7 @@ type UserState struct {
|
||||
LoginBonus UserLoginBonusState
|
||||
Tutorials map[int32]TutorialProgressState
|
||||
MainQuest MainQuestState
|
||||
MainQuestSeasonRoutes map[SeasonRouteKey]SeasonRouteEntry
|
||||
EventQuest EventQuestState
|
||||
ExtraQuest ExtraQuestState
|
||||
SideStoryQuests map[int32]SideStoryQuestProgress
|
||||
@@ -153,6 +154,9 @@ func (u *UserState) EnsureMaps() {
|
||||
if u.SideStoryQuests == nil {
|
||||
u.SideStoryQuests = make(map[int32]SideStoryQuestProgress)
|
||||
}
|
||||
if u.MainQuestSeasonRoutes == nil {
|
||||
u.MainQuestSeasonRoutes = make(map[SeasonRouteKey]SeasonRouteEntry)
|
||||
}
|
||||
if u.QuestLimitContentStatus == nil {
|
||||
u.QuestLimitContentStatus = make(map[int32]QuestLimitContentStatus)
|
||||
}
|
||||
@@ -510,12 +514,24 @@ type MainQuestState struct {
|
||||
MainQuestSeasonId int32
|
||||
LatestVersion int64
|
||||
|
||||
SavedCurrentQuestSceneId int32
|
||||
SavedHeadQuestSceneId int32
|
||||
SavedContext SavedQuestContext
|
||||
ReplayFlowCurrentQuestSceneId int32
|
||||
ReplayFlowHeadQuestSceneId int32
|
||||
}
|
||||
|
||||
// SavedQuestContext snapshots player state when entering a menu-replay (cleared
|
||||
// quest started from the Main Quest List menu). On finish, every field is
|
||||
// restored atomically so the player returns to the exact pre-replay state.
|
||||
type SavedQuestContext struct {
|
||||
Active bool
|
||||
CurrentQuestSceneId int32
|
||||
HeadQuestSceneId int32
|
||||
CurrentMainQuestRouteId int32
|
||||
MainQuestSeasonId int32
|
||||
IsReachedLastQuestScene bool
|
||||
PortalCageInProgress bool
|
||||
}
|
||||
|
||||
type EventQuestState struct {
|
||||
CurrentEventQuestChapterId int32
|
||||
CurrentQuestId int32
|
||||
@@ -543,6 +559,17 @@ type SideStoryActiveProgress struct {
|
||||
LatestVersion int64
|
||||
}
|
||||
|
||||
type SeasonRouteKey struct {
|
||||
MainQuestSeasonId int32
|
||||
MainQuestRouteId int32
|
||||
}
|
||||
|
||||
type SeasonRouteEntry struct {
|
||||
MainQuestSeasonId int32
|
||||
MainQuestRouteId int32
|
||||
LatestVersion int64
|
||||
}
|
||||
|
||||
type QuestLimitContentStatus struct {
|
||||
LimitContentQuestStatusType int32
|
||||
EventQuestChapterId int32
|
||||
|
||||
Reference in New Issue
Block a user