Add authentication server, dev CLI, Docker multi-service setup, and cross-platform improvements

This commit is contained in:
Ilya Groshev
2026-04-21 16:49:44 +03:00
parent 43d6527b42
commit a3fbb1aeba
121 changed files with 4523 additions and 2888 deletions
+61 -241
View File
@@ -4,214 +4,34 @@ import (
"fmt"
"sort"
"lunar-tear/server/internal/model"
"lunar-tear/server/internal/utils"
)
type QuestSceneRow struct {
QuestSceneId int32 `json:"QuestSceneId"`
QuestId int32 `json:"QuestId"`
SortOrder int32 `json:"SortOrder"`
QuestSceneType model.QuestSceneType `json:"QuestSceneType"`
AssetBackgroundId int32 `json:"AssetBackgroundId"`
EventMapNumberUpper int32 `json:"EventMapNumberUpper"`
EventMapNumberLower int32 `json:"EventMapNumberLower"`
IsMainFlowQuestTarget bool `json:"IsMainFlowQuestTarget"`
IsBattleOnlyTarget bool `json:"IsBattleOnlyTarget"`
QuestResultType model.QuestResultType `json:"QuestResultType"`
IsStorySkipTarget bool `json:"IsStorySkipTarget"`
}
type QuestRow struct {
QuestId int32 `json:"QuestId"`
NameQuestTextId int32 `json:"NameQuestTextId"`
PictureBookNameQuestTextId int32 `json:"PictureBookNameQuestTextId"`
QuestReleaseConditionListId int32 `json:"QuestReleaseConditionListId"`
StoryQuestTextId int32 `json:"StoryQuestTextId"`
QuestDisplayAttributeGroupId int32 `json:"QuestDisplayAttributeGroupId"`
RecommendedDeckPower int32 `json:"RecommendedDeckPower"`
QuestFirstClearRewardGroupId int32 `json:"QuestFirstClearRewardGroupId"`
QuestPickupRewardGroupId int32 `json:"QuestPickupRewardGroupId"`
QuestDeckRestrictionGroupId int32 `json:"QuestDeckRestrictionGroupId"`
QuestMissionGroupId int32 `json:"QuestMissionGroupId"`
Stamina int32 `json:"Stamina"`
UserExp int32 `json:"UserExp"`
CharacterExp int32 `json:"CharacterExp"`
CostumeExp int32 `json:"CostumeExp"`
Gold int32 `json:"Gold"`
DailyClearableCount int32 `json:"DailyClearableCount"`
IsRunInTheBackground bool `json:"IsRunInTheBackground"`
IsCountedAsQuest bool `json:"IsCountedAsQuest"`
QuestBonusId int32 `json:"QuestBonusId"`
IsNotShowAfterClear bool `json:"IsNotShowAfterClear"`
IsBigWinTarget bool `json:"IsBigWinTarget"`
IsUsableSkipTicket bool `json:"IsUsableSkipTicket"`
QuestReplayFlowRewardGroupId int32 `json:"QuestReplayFlowRewardGroupId"`
InvisibleQuestMissionGroupId int32 `json:"InvisibleQuestMissionGroupId"`
FieldEffectGroupId int32 `json:"FieldEffectGroupId"`
}
type QuestMissionRow struct {
QuestMissionId int32 `json:"QuestMissionId"`
QuestMissionConditionType model.QuestMissionConditionType `json:"QuestMissionConditionType"`
QuestMissionRewardId int32 `json:"QuestMissionRewardId"`
QuestMissionConditionValueGroupId int32 `json:"QuestMissionConditionValueGroupId"`
}
type QuestMissionGroupRow struct {
QuestMissionGroupId int32 `json:"QuestMissionGroupId"`
SortOrder int32 `json:"SortOrder"`
QuestMissionId int32 `json:"QuestMissionId"`
}
type QuestMissionRewardRow struct {
QuestMissionRewardId int32 `json:"QuestMissionRewardId"`
PossessionType model.PossessionType `json:"PossessionType"`
PossessionId int32 `json:"PossessionId"`
Count int32 `json:"Count"`
}
type MainQuestSequenceRow struct {
MainQuestSequenceId int32 `json:"MainQuestSequenceId"`
SortOrder int32 `json:"SortOrder"`
QuestId int32 `json:"QuestId"`
}
type MainQuestRouteRow struct {
MainQuestRouteId int32 `json:"MainQuestRouteId"`
MainQuestSeasonId int32 `json:"MainQuestSeasonId"`
SortOrder int32 `json:"SortOrder"`
CharacterId int32 `json:"CharacterId"`
}
type MainQuestChapterRow struct {
MainQuestChapterId int32 `json:"MainQuestChapterId"`
MainQuestRouteId int32 `json:"MainQuestRouteId"`
SortOrder int32 `json:"SortOrder"`
MainQuestSequenceGroupId int32 `json:"MainQuestSequenceGroupId"`
PortalCageCharacterGroupId int32 `json:"PortalCageCharacterGroupId"`
StartDatetime int64 `json:"StartDatetime"`
IsInvisibleInLibrary bool `json:"IsInvisibleInLibrary"`
JoinLibraryChapterId int32 `json:"JoinLibraryChapterId"`
}
type QuestFirstClearRewardSwitchRow struct {
QuestId int32 `json:"QuestId"`
QuestFirstClearRewardGroupId int32 `json:"QuestFirstClearRewardGroupId"`
SwitchConditionClearQuestId int32 `json:"SwitchConditionClearQuestId"`
}
type QuestFirstClearRewardGroupRow struct {
QuestFirstClearRewardGroupId int32 `json:"QuestFirstClearRewardGroupId"`
QuestFirstClearRewardType int32 `json:"QuestFirstClearRewardType"`
SortOrder int32 `json:"SortOrder"`
PossessionType model.PossessionType `json:"PossessionType"`
PossessionId int32 `json:"PossessionId"`
Count int32 `json:"Count"`
IsPickup bool `json:"IsPickup"`
}
type QuestReplayFlowRewardGroupRow struct {
QuestReplayFlowRewardGroupId int32 `json:"QuestReplayFlowRewardGroupId"`
SortOrder int32 `json:"SortOrder"`
PossessionType model.PossessionType `json:"PossessionType"`
PossessionId int32 `json:"PossessionId"`
Count int32 `json:"Count"`
}
type QuestSceneGrantRow struct {
QuestSceneId int32 `json:"QuestSceneId"`
PossessionType model.PossessionType `json:"PossessionType"`
PossessionId int32 `json:"PossessionId"`
Count int32 `json:"Count"`
}
type QuestPickupRewardGroupRow struct {
QuestPickupRewardGroupId int32 `json:"QuestPickupRewardGroupId"`
SortOrder int32 `json:"SortOrder"`
BattleDropRewardId int32 `json:"BattleDropRewardId"`
}
type BattleDropRewardRow struct {
BattleDropRewardId int32 `json:"BattleDropRewardId"`
PossessionType model.PossessionType `json:"PossessionType"`
PossessionId int32 `json:"PossessionId"`
Count int32 `json:"Count"`
}
type QuestSceneBattleRow struct {
QuestSceneId int32 `json:"QuestSceneId"`
BattleGroupId int32 `json:"BattleGroupId"`
}
type BattleGroupRow struct {
BattleGroupId int32 `json:"BattleGroupId"`
WaveNumber int32 `json:"WaveNumber"`
BattleId int32 `json:"BattleId"`
}
type BattleRow struct {
BattleId int32 `json:"BattleId"`
BattleNpcId int32 `json:"BattleNpcId"`
DeckType model.DeckType `json:"DeckType"`
BattleNpcDeckNumber int32 `json:"BattleNpcDeckNumber"`
}
type BattleNpcDeckRow struct {
BattleNpcId int32 `json:"BattleNpcId"`
DeckType model.DeckType `json:"DeckType"`
BattleNpcDeckNumber int32 `json:"BattleNpcDeckNumber"`
BattleNpcDeckCharacterUuid01 string `json:"BattleNpcDeckCharacterUuid01"`
BattleNpcDeckCharacterUuid02 string `json:"BattleNpcDeckCharacterUuid02"`
BattleNpcDeckCharacterUuid03 string `json:"BattleNpcDeckCharacterUuid03"`
}
type BattleNpcDropCategoryRow struct {
BattleNpcId int32 `json:"BattleNpcId"`
BattleNpcDeckCharacterUuid string `json:"BattleNpcDeckCharacterUuid"`
BattleDropCategoryId int32 `json:"BattleDropCategoryId"`
}
type BattleDropInfo struct {
QuestSceneId int32
BattleDropCategoryId int32
}
type TutorialUnlockConditionRow struct {
TutorialType int32 `json:"TutorialType"`
TutorialUnlockConditionType int32 `json:"TutorialUnlockConditionType"`
ConditionValue int32 `json:"ConditionValue"`
}
type RentalDeckRow struct {
BattleGroupId int32 `json:"BattleGroupId"`
}
type UserLevelRow struct {
UserLevel int32 `json:"UserLevel"`
MaxStamina int32 `json:"MaxStamina"`
}
type QuestCatalog struct {
SceneById map[int32]QuestSceneRow
MissionById map[int32]QuestMissionRow
QuestById map[int32]QuestRow
SceneById map[int32]EntityMQuestScene
MissionById map[int32]EntityMQuestMission
QuestById map[int32]EntityMQuest
MissionIdsByQuestId map[int32][]int32
RouteIdByQuestId map[int32]int32
SceneIdsByQuestId map[int32][]int32
OrderedQuestIds []int32
FirstClearRewardsByGroupId map[int32][]QuestFirstClearRewardGroupRow
FirstClearRewardSwitchesByQuestId map[int32][]QuestFirstClearRewardSwitchRow
MissionRewardsByMissionId map[int32][]QuestMissionRewardRow
FirstClearRewardsByGroupId map[int32][]EntityMQuestFirstClearRewardGroup
FirstClearRewardSwitchesByQuestId map[int32][]EntityMQuestFirstClearRewardSwitch
MissionRewardsByMissionId map[int32][]EntityMQuestMissionReward
WeaponIdsByReleaseConditionGroupId map[int32][]int32
ReleaseConditionsByGroupId map[int32][]WeaponStoryReleaseConditionRow
SceneGrantsBySceneId map[int32][]QuestSceneGrantRow
BattleDropRewardById map[int32]BattleDropRewardRow
ReleaseConditionsByGroupId map[int32][]EntityMWeaponStoryReleaseConditionGroup
SceneGrantsBySceneId map[int32][]EntityMUserQuestSceneGrantPossession
BattleDropRewardById map[int32]EntityMBattleDropReward
PickupRewardIdsByGroupId map[int32][]int32
BattleDropsByQuestId map[int32][]BattleDropInfo
ReplayFlowRewardsByGroupId map[int32][]QuestReplayFlowRewardGroupRow
ReplayFlowRewardsByGroupId map[int32][]EntityMQuestReplayFlowRewardGroup
RentalQuestIds map[int32]bool
TutorialUnlockConditions []TutorialUnlockConditionRow
TutorialUnlockConditions []EntityMTutorialUnlockCondition
ChapterLastSceneByQuestId map[int32]int32
SeasonIdByRouteId map[int32]int32
@@ -221,8 +41,8 @@ type QuestCatalog struct {
CostumeMaxLevelByRarity map[int32]NumericalFunc
MaxStaminaByLevel map[int32]int32
CostumeById map[int32]CostumeMasterRow
WeaponById map[int32]WeaponMasterRow
CostumeById map[int32]EntityMCostume
WeaponById map[int32]EntityMWeapon
WeaponSkillSlots map[int32][]int32
WeaponAbilitySlots map[int32][]int32
@@ -231,7 +51,7 @@ type QuestCatalog struct {
}
func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
scenes, err := utils.ReadJSON[QuestSceneRow]("EntityMQuestSceneTable.json")
scenes, err := utils.ReadTable[EntityMQuestScene]("m_quest_scene")
if err != nil {
return nil, fmt.Errorf("load quest scene table: %w", err)
}
@@ -245,17 +65,17 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return scenes[i].QuestSceneId < scenes[j].QuestSceneId
})
missions, err := utils.ReadJSON[QuestMissionRow]("EntityMQuestMissionTable.json")
missions, err := utils.ReadTable[EntityMQuestMission]("m_quest_mission")
if err != nil {
return nil, fmt.Errorf("load quest mission table: %w", err)
}
quests, err := utils.ReadJSON[QuestRow]("EntityMQuestTable.json")
quests, err := utils.ReadTable[EntityMQuest]("m_quest")
if err != nil {
return nil, fmt.Errorf("load quest table: %w", err)
}
missionGroups, err := utils.ReadJSON[QuestMissionGroupRow]("EntityMQuestMissionGroupTable.json")
missionGroups, err := utils.ReadTable[EntityMQuestMissionGroup]("m_quest_mission_group")
if err != nil {
return nil, fmt.Errorf("load quest mission group table: %w", err)
}
@@ -269,7 +89,7 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return missionGroups[i].QuestMissionId < missionGroups[j].QuestMissionId
})
sequences, err := utils.ReadJSON[MainQuestSequenceRow]("EntityMMainQuestSequenceTable.json")
sequences, err := utils.ReadTable[EntityMMainQuestSequence]("m_main_quest_sequence")
if err != nil {
return nil, fmt.Errorf("load main quest sequence table: %w", err)
}
@@ -283,12 +103,12 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return sequences[i].QuestId < sequences[j].QuestId
})
chapters, err := utils.ReadJSON[MainQuestChapterRow]("EntityMMainQuestChapterTable.json")
chapters, err := utils.ReadTable[EntityMMainQuestChapter]("m_main_quest_chapter")
if err != nil {
return nil, fmt.Errorf("load main quest chapter table: %w", err)
}
routes, err := utils.ReadJSON[MainQuestRouteRow]("EntityMMainQuestRouteTable.json")
routes, err := utils.ReadTable[EntityMMainQuestRoute]("m_main_quest_route")
if err != nil {
return nil, fmt.Errorf("load main quest route table: %w", err)
}
@@ -297,12 +117,12 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
seasonIdByRouteId[r.MainQuestRouteId] = r.MainQuestSeasonId
}
firstClearSwitches, err := utils.ReadJSON[QuestFirstClearRewardSwitchRow]("EntityMQuestFirstClearRewardSwitchTable.json")
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)
}
firstClearRewards, err := utils.ReadJSON[QuestFirstClearRewardGroupRow]("EntityMQuestFirstClearRewardGroupTable.json")
firstClearRewards, err := utils.ReadTable[EntityMQuestFirstClearRewardGroup]("m_quest_first_clear_reward_group")
if err != nil {
return nil, fmt.Errorf("load quest first clear reward group table: %w", err)
}
@@ -316,7 +136,7 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return firstClearRewards[i].QuestFirstClearRewardType < firstClearRewards[j].QuestFirstClearRewardType
})
replayFlowRewards, err := utils.ReadJSON[QuestReplayFlowRewardGroupRow]("EntityMQuestReplayFlowRewardGroupTable.json")
replayFlowRewards, err := utils.ReadTable[EntityMQuestReplayFlowRewardGroup]("m_quest_replay_flow_reward_group")
if err != nil {
return nil, fmt.Errorf("load quest replay flow reward group table: %w", err)
}
@@ -327,52 +147,52 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return replayFlowRewards[i].SortOrder < replayFlowRewards[j].SortOrder
})
missionRewards, err := utils.ReadJSON[QuestMissionRewardRow]("EntityMQuestMissionRewardTable.json")
missionRewards, err := utils.ReadTable[EntityMQuestMissionReward]("m_quest_mission_reward")
if err != nil {
return nil, fmt.Errorf("load quest mission reward table: %w", err)
}
weapons, err := utils.ReadJSON[WeaponMasterRow]("EntityMWeaponTable.json")
weapons, err := utils.ReadTable[EntityMWeapon]("m_weapon")
if err != nil {
return nil, fmt.Errorf("load weapon table: %w", err)
}
weaponSkillGroups, err := utils.ReadJSON[WeaponSkillGroupRow]("EntityMWeaponSkillGroupTable.json")
weaponSkillGroups, err := utils.ReadTable[EntityMWeaponSkillGroup]("m_weapon_skill_group")
if err != nil {
return nil, fmt.Errorf("load weapon skill group table: %w", err)
}
weaponAbilityGroups, err := utils.ReadJSON[WeaponAbilityGroupRow]("EntityMWeaponAbilityGroupTable.json")
weaponAbilityGroups, err := utils.ReadTable[EntityMWeaponAbilityGroup]("m_weapon_ability_group")
if err != nil {
return nil, fmt.Errorf("load weapon ability group table: %w", err)
}
releaseConditions, err := utils.ReadJSON[WeaponStoryReleaseConditionRow]("EntityMWeaponStoryReleaseConditionGroupTable.json")
releaseConditions, err := utils.ReadTable[EntityMWeaponStoryReleaseConditionGroup]("m_weapon_story_release_condition_group")
if err != nil {
return nil, fmt.Errorf("load weapon story release condition table: %w", err)
}
costumeMasters, err := utils.ReadJSON[CostumeMasterRow]("EntityMCostumeTable.json")
costumeMasters, err := utils.ReadTable[EntityMCostume]("m_costume")
if err != nil {
return nil, fmt.Errorf("load costume table: %w", err)
}
costumeRarities, err := utils.ReadJSON[costumeRarityRow]("EntityMCostumeRarityTable.json")
costumeRarities, err := utils.ReadTable[EntityMCostumeRarity]("m_costume_rarity")
if err != nil {
return nil, fmt.Errorf("load costume rarity table: %w", err)
}
sceneGrants, err := utils.ReadJSON[QuestSceneGrantRow]("EntityMUserQuestSceneGrantPossessionTable.json")
sceneGrants, err := utils.ReadTable[EntityMUserQuestSceneGrantPossession]("m_user_quest_scene_grant_possession")
if err != nil {
return nil, fmt.Errorf("load quest scene grant table: %w", err)
}
battleDropRewards, err := utils.ReadJSON[BattleDropRewardRow]("EntityMBattleDropRewardTable.json")
battleDropRewards, err := utils.ReadTable[EntityMBattleDropReward]("m_battle_drop_reward")
if err != nil {
return nil, fmt.Errorf("load battle drop reward table: %w", err)
}
pickupRewardGroups, err := utils.ReadJSON[QuestPickupRewardGroupRow]("EntityMQuestPickupRewardGroupTable.json")
pickupRewardGroups, err := utils.ReadTable[EntityMQuestPickupRewardGroup]("m_quest_pickup_reward_group")
if err != nil {
return nil, fmt.Errorf("load quest pickup reward group table: %w", err)
}
@@ -383,37 +203,37 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return pickupRewardGroups[i].SortOrder < pickupRewardGroups[j].SortOrder
})
sceneBattles, err := utils.ReadJSON[QuestSceneBattleRow]("EntityMQuestSceneBattleTable.json")
sceneBattles, err := utils.ReadTable[EntityMQuestSceneBattle]("m_quest_scene_battle")
if err != nil {
return nil, fmt.Errorf("load quest scene battle table: %w", err)
}
battleGroups, err := utils.ReadJSON[BattleGroupRow]("EntityMBattleGroupTable.json")
battleGroups, err := utils.ReadTable[EntityMBattleGroup]("m_battle_group")
if err != nil {
return nil, fmt.Errorf("load battle group table: %w", err)
}
battles, err := utils.ReadJSON[BattleRow]("EntityMBattleTable.json")
battles, err := utils.ReadTable[EntityMBattle]("m_battle")
if err != nil {
return nil, fmt.Errorf("load battle table: %w", err)
}
npcDecks, err := utils.ReadJSON[BattleNpcDeckRow]("EntityMBattleNpcDeckTable.json")
npcDecks, err := utils.ReadTable[EntityMBattleNpcDeck]("m_battle_npc_deck")
if err != nil {
return nil, fmt.Errorf("load battle npc deck table: %w", err)
}
npcDropCategories, err := utils.ReadJSON[BattleNpcDropCategoryRow]("EntityMBattleNpcDeckCharacterDropCategoryTable.json")
npcDropCategories, err := utils.ReadTable[EntityMBattleNpcDeckCharacterDropCategory]("m_battle_npc_deck_character_drop_category")
if err != nil {
return nil, fmt.Errorf("load battle npc drop category table: %w", err)
}
rentalDecks, err := utils.ReadJSON[RentalDeckRow]("EntityMBattleRentalDeckTable.json")
rentalDecks, err := utils.ReadTable[EntityMBattleRentalDeck]("m_battle_rental_deck")
if err != nil {
return nil, fmt.Errorf("load battle rental deck table: %w", err)
}
tutorialUnlockConds, err := utils.ReadJSON[TutorialUnlockConditionRow]("EntityMTutorialUnlockConditionTable.json")
tutorialUnlockConds, err := utils.ReadTable[EntityMTutorialUnlockCondition]("m_tutorial_unlock_condition")
if err != nil {
return nil, fmt.Errorf("load tutorial unlock condition table: %w", err)
}
@@ -423,7 +243,7 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
return nil, err
}
userLevels, err := utils.ReadJSON[UserLevelRow]("EntityMUserLevelTable.json")
userLevels, err := utils.ReadTable[EntityMUserLevel]("m_user_level")
if err != nil {
return nil, fmt.Errorf("load user level table: %w", err)
}
@@ -450,12 +270,12 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
}
}
costumeById := make(map[int32]CostumeMasterRow, len(costumeMasters))
costumeById := make(map[int32]EntityMCostume, len(costumeMasters))
for _, cm := range costumeMasters {
costumeById[cm.CostumeId] = cm
}
weaponById := make(map[int32]WeaponMasterRow, len(weapons))
weaponById := make(map[int32]EntityMWeapon, len(weapons))
for _, w := range weapons {
weaponById[w.WeaponId] = w
}
@@ -469,19 +289,19 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
abilitySlots[row.WeaponAbilityGroupId] = append(abilitySlots[row.WeaponAbilityGroupId], row.SlotNumber)
}
sceneById := make(map[int32]QuestSceneRow, len(scenes))
sceneById := make(map[int32]EntityMQuestScene, len(scenes))
sceneIdsByQuestId := make(map[int32][]int32)
for _, scene := range scenes {
sceneById[scene.QuestSceneId] = scene
sceneIdsByQuestId[scene.QuestId] = append(sceneIdsByQuestId[scene.QuestId], scene.QuestSceneId)
}
missionById := make(map[int32]QuestMissionRow, len(missions))
missionById := make(map[int32]EntityMQuestMission, len(missions))
for _, mission := range missions {
missionById[mission.QuestMissionId] = mission
}
questById := make(map[int32]QuestRow, len(quests))
questById := make(map[int32]EntityMQuest, len(quests))
for _, quest := range quests {
questById[quest.QuestId] = quest
}
@@ -500,7 +320,7 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
missionIdsByQuestId[questId] = append([]int32(nil), missionIds...)
}
chapterBySequenceId := make(map[int32]MainQuestChapterRow, len(chapters))
chapterBySequenceId := make(map[int32]EntityMMainQuestChapter, len(chapters))
for _, chapter := range chapters {
chapterBySequenceId[chapter.MainQuestSequenceGroupId] = chapter
}
@@ -511,12 +331,12 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
}
}
sortedChapters := make([]MainQuestChapterRow, len(chapters))
sortedChapters := make([]EntityMMainQuestChapter, len(chapters))
copy(sortedChapters, chapters)
sort.Slice(sortedChapters, func(i, j int) bool {
return sortedChapters[i].SortOrder < sortedChapters[j].SortOrder
})
sequencesByGroupId := make(map[int32][]MainQuestSequenceRow)
sequencesByGroupId := make(map[int32][]EntityMMainQuestSequence)
for _, seq := range sequences {
sequencesByGroupId[seq.MainQuestSequenceId] = append(sequencesByGroupId[seq.MainQuestSequenceId], seq)
}
@@ -544,25 +364,25 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
}
}
firstClearRewardsByGroupId := make(map[int32][]QuestFirstClearRewardGroupRow, len(firstClearRewards))
firstClearRewardsByGroupId := make(map[int32][]EntityMQuestFirstClearRewardGroup, len(firstClearRewards))
for _, reward := range firstClearRewards {
firstClearRewardsByGroupId[reward.QuestFirstClearRewardGroupId] = append(
firstClearRewardsByGroupId[reward.QuestFirstClearRewardGroupId], reward)
}
replayFlowRewardsByGroupId := make(map[int32][]QuestReplayFlowRewardGroupRow, len(replayFlowRewards))
replayFlowRewardsByGroupId := make(map[int32][]EntityMQuestReplayFlowRewardGroup, len(replayFlowRewards))
for _, reward := range replayFlowRewards {
replayFlowRewardsByGroupId[reward.QuestReplayFlowRewardGroupId] = append(
replayFlowRewardsByGroupId[reward.QuestReplayFlowRewardGroupId], reward)
}
firstClearRewardSwitchesByQuestId := make(map[int32][]QuestFirstClearRewardSwitchRow, len(firstClearSwitches))
firstClearRewardSwitchesByQuestId := make(map[int32][]EntityMQuestFirstClearRewardSwitch, len(firstClearSwitches))
for _, switchRow := range firstClearSwitches {
firstClearRewardSwitchesByQuestId[switchRow.QuestId] = append(
firstClearRewardSwitchesByQuestId[switchRow.QuestId], switchRow)
}
missionRewardsByMissionId := make(map[int32][]QuestMissionRewardRow, len(missionRewards))
missionRewardsByMissionId := make(map[int32][]EntityMQuestMissionReward, len(missionRewards))
for _, reward := range missionRewards {
missionRewardsByMissionId[reward.QuestMissionRewardId] = append(
missionRewardsByMissionId[reward.QuestMissionRewardId], reward)
@@ -576,18 +396,18 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
}
}
releaseConditionsByGroupId := make(map[int32][]WeaponStoryReleaseConditionRow)
releaseConditionsByGroupId := make(map[int32][]EntityMWeaponStoryReleaseConditionGroup)
for _, c := range releaseConditions {
releaseConditionsByGroupId[c.WeaponStoryReleaseConditionGroupId] = append(
releaseConditionsByGroupId[c.WeaponStoryReleaseConditionGroupId], c)
}
sceneGrantsBySceneId := make(map[int32][]QuestSceneGrantRow)
sceneGrantsBySceneId := make(map[int32][]EntityMUserQuestSceneGrantPossession)
for _, sg := range sceneGrants {
sceneGrantsBySceneId[sg.QuestSceneId] = append(sceneGrantsBySceneId[sg.QuestSceneId], sg)
}
battleDropRewardById := make(map[int32]BattleDropRewardRow, len(battleDropRewards))
battleDropRewardById := make(map[int32]EntityMBattleDropReward, len(battleDropRewards))
for _, bdr := range battleDropRewards {
battleDropRewardById[bdr.BattleDropRewardId] = bdr
}
@@ -609,22 +429,22 @@ func LoadQuestCatalog(partsCatalog *PartsCatalog) (*QuestCatalog, error) {
}
type npcDeckKey struct {
BattleNpcId int32
DeckType model.DeckType
BattleNpcId int64
DeckType int32
BattleNpcDeckNumber int32
}
npcDeckByKey := make(map[npcDeckKey]BattleNpcDeckRow, len(npcDecks))
npcDeckByKey := make(map[npcDeckKey]EntityMBattleNpcDeck, len(npcDecks))
for _, d := range npcDecks {
npcDeckByKey[npcDeckKey{d.BattleNpcId, d.DeckType, d.BattleNpcDeckNumber}] = d
}
battleByIdMap := make(map[int32]BattleRow, len(battles))
battleByIdMap := make(map[int32]EntityMBattle, len(battles))
for _, b := range battles {
battleByIdMap[b.BattleId] = b
}
type dropCatKey struct {
BattleNpcId int32
BattleNpcId int64
Uuid string
}
dropCategoryByKey := make(map[dropCatKey]int32, len(npcDropCategories))