mirror of
https://github.com/EpinelPS/EpinelPS.git
synced 2025-12-15 00:14:48 +01:00
Generate static data schema, use pascal case for it
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
namespace EpinelPS.Data
|
||||
{
|
||||
public enum CurrencyType
|
||||
{
|
||||
NoneCurrency = 0,
|
||||
UserExp = 1,
|
||||
ChargeCash = 98,
|
||||
FreeCash = 99,
|
||||
CharacterExp = 1000,
|
||||
Gold = 2000,
|
||||
CharacterExp2 = 3000,
|
||||
FriendshipPoint = 4000,
|
||||
ArenaChip = 5000,
|
||||
CharPremiumTicket = 5100, //normal cards
|
||||
CharCustomizeTicket = 5200, //spec cards
|
||||
CharCorporationTicket = 5300, //unused
|
||||
ArenaTicket = 6001,
|
||||
_2NdArenaTicket = 6002,
|
||||
InterceptTicket2 = 6003,
|
||||
ContentStamina = 6100,
|
||||
RecycleRoomPoint = 6200,
|
||||
InfraCoreEnergy = 7000,
|
||||
RaptureParts = 8000,
|
||||
DissolutionPoint = 9000,
|
||||
InApp = 9999,
|
||||
GuildCoin = 10000,
|
||||
SilverMileageTicket = 11000,
|
||||
GoldMileageTicket = 12000,
|
||||
SimulationRoomPoint = 13000,
|
||||
CharacterSkillResetTicket = 14000
|
||||
}
|
||||
}
|
||||
@@ -35,223 +35,223 @@ namespace EpinelPS.Data
|
||||
// TODO: all of the data types need to be changed to match the game
|
||||
private bool UseMemoryPack = true;
|
||||
|
||||
public readonly Dictionary<string, MapInfo> MapData = [];
|
||||
public readonly Dictionary<string, FieldMapRecord> MapData = [];
|
||||
|
||||
[LoadRecord("MainQuestTable.json", "id")]
|
||||
public readonly Dictionary<int, MainQuestCompletionRecord> QuestDataRecords = [];
|
||||
[LoadRecord("MainQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, MainQuestRecord> QuestDataRecords = [];
|
||||
|
||||
[LoadRecord("CampaignStageTable.json", "id")]
|
||||
[LoadRecord("CampaignStageTable.json", "Id")]
|
||||
public readonly Dictionary<int, CampaignStageRecord> StageDataRecords = [];
|
||||
|
||||
[LoadRecord("RewardTable.json", "id")]
|
||||
[LoadRecord("RewardTable.json", "Id")]
|
||||
public readonly Dictionary<int, RewardRecord> RewardDataRecords = [];
|
||||
|
||||
[LoadRecord("UserExpTable.json", "level")]
|
||||
[LoadRecord("UserExpTable.json", "Level")]
|
||||
public readonly Dictionary<int, UserExpRecord> UserExpDataRecords = [];
|
||||
|
||||
[LoadRecord("CampaignChapterTable.json", "chapter")]
|
||||
[LoadRecord("CampaignChapterTable.json", "Chapter")]
|
||||
public readonly Dictionary<int, CampaignChapterRecord> ChapterCampaignData = [];
|
||||
|
||||
[LoadRecord("CharacterCostumeTable.json", "id")]
|
||||
[LoadRecord("CharacterCostumeTable.json", "Id")]
|
||||
public readonly Dictionary<int, CharacterCostumeRecord> CharacterCostumeTable = [];
|
||||
|
||||
[LoadRecord("CharacterTable.json", "id")]
|
||||
[LoadRecord("CharacterTable.json", "Id")]
|
||||
public readonly Dictionary<int, CharacterRecord> CharacterTable = [];
|
||||
|
||||
[LoadRecord("ContentsTutorialTable.json", "id")]
|
||||
public readonly Dictionary<int, ClearedTutorialData> TutorialTable = [];
|
||||
[LoadRecord("ItemEquipTable.json", "id")]
|
||||
[LoadRecord("ContentsTutorialTable.json", "Id")]
|
||||
public readonly Dictionary<int, ContentsTutorialRecord> TutorialTable = [];
|
||||
[LoadRecord("ItemEquipTable.json", "Id")]
|
||||
|
||||
public readonly Dictionary<int, ItemEquipRecord> ItemEquipTable = [];
|
||||
|
||||
[LoadRecord("ItemMaterialTable.json", "id")]
|
||||
[LoadRecord("ItemMaterialTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemMaterialRecord> itemMaterialTable = [];
|
||||
|
||||
[LoadRecord("ItemEquipExpTable.json", "id")]
|
||||
[LoadRecord("ItemEquipExpTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemEquipExpRecord> itemEquipExpTable = [];
|
||||
|
||||
[LoadRecord("ItemEquipGradeExpTable.json", "id")]
|
||||
[LoadRecord("ItemEquipGradeExpTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemEquipGradeExpRecord> ItemEquipGradeExpTable = [];
|
||||
|
||||
[LoadRecord("CharacterLevelTable.json", "level")]
|
||||
public readonly Dictionary<int, CharacterLevelData> LevelData = [];
|
||||
[LoadRecord("CharacterLevelTable.json", "Level")]
|
||||
public readonly Dictionary<int, CharacterLevelRecord> LevelData = [];
|
||||
|
||||
[LoadRecord("TacticAcademyFunctionTable.json", "id")]
|
||||
public readonly Dictionary<int, TacticAcademyLessonRecord> TacticAcademyLessons = [];
|
||||
[LoadRecord("TacticAcademyFunctionTable.json", "Id")]
|
||||
public readonly Dictionary<int, TacticAcademyFunctionRecord> TacticAcademyLessons = [];
|
||||
|
||||
[LoadRecord("SideStoryStageTable.json", "id")]
|
||||
[LoadRecord("SIdeStoryStageTable.json", "Id")]
|
||||
public readonly Dictionary<int, SideStoryStageRecord> SidestoryRewardTable = [];
|
||||
|
||||
[LoadRecord("FieldItemTable.json", "id")]
|
||||
[LoadRecord("FieldItemTable.json", "Id")]
|
||||
public readonly Dictionary<int, FieldItemRecord> FieldItems = [];
|
||||
|
||||
[LoadRecord("OutpostBattleTable.json", "id")]
|
||||
public readonly Dictionary<int, OutpostBattleTableRecord> OutpostBattle = [];
|
||||
[LoadRecord("OutpostBattleTable.json", "Id")]
|
||||
public readonly Dictionary<int, OutpostBattleRecord> OutpostBattle = [];
|
||||
|
||||
[LoadRecord("JukeboxListTable.json", "id")]
|
||||
[LoadRecord("JukeboxListTable.json", "Id")]
|
||||
public readonly Dictionary<int, JukeboxListRecord> jukeboxListDataRecords = [];
|
||||
|
||||
[LoadRecord("JukeboxThemeTable.json", "id")]
|
||||
[LoadRecord("JukeboxThemeTable.json", "Id")]
|
||||
public readonly Dictionary<int, JukeboxThemeRecord> jukeboxThemeDataRecords = [];
|
||||
|
||||
[LoadRecord("GachaTypeTable.json", "id")]
|
||||
public readonly Dictionary<int, GachaType> gachaTypes = [];
|
||||
[LoadRecord("GachaTypeTable.json", "Id")]
|
||||
public readonly Dictionary<int, GachaTypeRecord> gachaTypes = [];
|
||||
|
||||
[LoadRecord("EventManagerTable.json", "id")]
|
||||
public readonly Dictionary<int, EventManager> eventManagers = [];
|
||||
[LoadRecord("EventManagerTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventManagerRecord> eventManagers = [];
|
||||
|
||||
[LoadRecord("LiveWallpaperTable.json", "id")]
|
||||
[LoadRecord("LiveWallpaperTable.json", "Id")]
|
||||
public readonly Dictionary<int, LiveWallpaperRecord> lwptablemgrs = [];
|
||||
|
||||
[LoadRecord("AlbumResourceTable.json", "id")]
|
||||
[LoadRecord("AlbumResourceTable.json", "Id")]
|
||||
public readonly Dictionary<int, AlbumResourceRecord> albumResourceRecords = [];
|
||||
|
||||
[LoadRecord("UserFrameTable.json", "id")]
|
||||
public readonly Dictionary<int, UserFrameTableRecord> userFrameTable = [];
|
||||
[LoadRecord("UserFrameTable.json", "Id")]
|
||||
public readonly Dictionary<int, UserFrameRecord> userFrameTable = [];
|
||||
|
||||
[LoadRecord("ArchiveRecordManagerTable.json", "id")]
|
||||
[LoadRecord("ArchiveRecordManagerTable.json", "Id")]
|
||||
public readonly Dictionary<int, ArchiveRecordManagerRecord> archiveRecordManagerTable = [];
|
||||
|
||||
[LoadRecord("ArchiveEventStoryTable.json", "id")]
|
||||
[LoadRecord("ArchiveEventStoryTable.json", "Id")]
|
||||
public readonly Dictionary<int, ArchiveEventStoryRecord> archiveEventStoryRecords = [];
|
||||
|
||||
[LoadRecord("ArchiveEventQuestTable.json", "id")]
|
||||
public readonly Dictionary<int, ArchiveEventQuestRecord> archiveEventQuestRecords = [];
|
||||
[LoadRecord("ArchiveEventQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, ArchiveEventQuestRecord_Raw> archiveEventQuestRecords = [];
|
||||
|
||||
[LoadRecord("ArchiveEventDungeonStageTable.json", "id")]
|
||||
[LoadRecord("ArchiveEventDungeonStageTable.json", "Id")]
|
||||
public readonly Dictionary<int, ArchiveEventDungeonStageRecord> archiveEventDungeonStageRecords = [];
|
||||
|
||||
[LoadRecord("UserTitleTable.json", "id")]
|
||||
[LoadRecord("UserTitleTable.json", "Id")]
|
||||
public readonly Dictionary<int, UserTitleRecord> userTitleRecords = [];
|
||||
|
||||
[LoadRecord("ArchiveMessengerConditionTable.json", "id")]
|
||||
[LoadRecord("ArchiveMessengerConditionTable.json", "Id")]
|
||||
public readonly Dictionary<int, ArchiveMessengerConditionRecord> archiveMessengerConditionRecords = [];
|
||||
|
||||
[LoadRecord("CharacterStatTable.json", "id")]
|
||||
[LoadRecord("CharacterStatTable.json", "Id")]
|
||||
public readonly Dictionary<int, CharacterStatRecord> characterStatTable = [];
|
||||
|
||||
[LoadRecord("SkillInfoTable.json", "id")]
|
||||
[LoadRecord("SkillInfoTable.json", "Id")]
|
||||
public readonly Dictionary<int, SkillInfoRecord> skillInfoTable = [];
|
||||
|
||||
[LoadRecord("CostTable.json", "id")]
|
||||
[LoadRecord("CostTable.json", "Id")]
|
||||
public readonly Dictionary<int, CostRecord> costTable = [];
|
||||
|
||||
[LoadRecord("MidasProductTable.json", "midas_product_id_proximabeta")]
|
||||
[LoadRecord("MidasProductTable.json", "MidasProductIdProximabeta")]
|
||||
public readonly Dictionary<string, MidasProductRecord> mediasProductTable = [];
|
||||
|
||||
[LoadRecord("TowerTable.json", "id")]
|
||||
[LoadRecord("TowerTable.json", "Id")]
|
||||
public readonly Dictionary<int, TowerRecord> towerTable = [];
|
||||
|
||||
[LoadRecord("TriggerTable.json", "id")]
|
||||
[LoadRecord("TriggerTable.json", "Id")]
|
||||
public readonly Dictionary<int, TriggerRecord> TriggerTable = [];
|
||||
|
||||
[LoadRecord("InfraCoreGradeTable.json", "id")]
|
||||
public readonly Dictionary<int, InfracoreRecord> InfracoreTable = [];
|
||||
[LoadRecord("InfraCoreGradeTable.json", "Id")]
|
||||
public readonly Dictionary<int, InfraCoreGradeRecord> InfracoreTable = [];
|
||||
|
||||
[LoadRecord("AttractiveCounselCharacterTable.json", "name_code")]
|
||||
public readonly Dictionary<int, AttractiveCounselCharacterRecord> AttractiveCounselCharacterTable = [];
|
||||
[LoadRecord("AttractiveCounselCharacterTable.json", "NameCode")]
|
||||
public readonly Dictionary<int, AttractiveCounselCharacterRecord_Raw> AttractiveCounselCharacterTable = [];
|
||||
|
||||
[LoadRecord("AttractiveLevelRewardTable.json", "id")]
|
||||
[LoadRecord("AttractiveLevelRewardTable.json", "Id")]
|
||||
public readonly Dictionary<int, AttractiveLevelRewardRecord> AttractiveLevelReward = [];
|
||||
|
||||
[LoadRecord("AttractiveLevelTable.json", "id")]
|
||||
[LoadRecord("AttractiveLevelTable.json", "Id")]
|
||||
public readonly Dictionary<int, AttractiveLevelRecord> AttractiveLevelTable = [];
|
||||
|
||||
[LoadRecord("SubQuestTable.json", "id")]
|
||||
public readonly Dictionary<int, SubquestRecord> Subquests = [];
|
||||
[LoadRecord("SubQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, SubQuestRecord> Subquests = [];
|
||||
|
||||
[LoadRecord("MessengerDialogTable.json", "id")]
|
||||
[LoadRecord("MessengerDialogTable.json", "Id")]
|
||||
public readonly Dictionary<string, MessengerDialogRecord> Messages = [];
|
||||
|
||||
[LoadRecord("MessengerConditionTriggerTable.json", "id")]
|
||||
public readonly Dictionary<int, MessengerMsgConditionRecord> MessageConditions = [];
|
||||
[LoadRecord("MessengerConditionTriggerTable.json", "Id")]
|
||||
public readonly Dictionary<int, MessengerConditionTriggerRecord> MessageConditions = [];
|
||||
|
||||
[LoadRecord("ScenarioRewardsTable.json", "condition_id")]
|
||||
public readonly Dictionary<string, ScenarioRewardRecord> ScenarioRewards = [];
|
||||
[LoadRecord("ScenarioRewardsTable.json", "ConditionId")]
|
||||
public readonly Dictionary<string, ScenarioRewardsRecord> ScenarioRewards = [];
|
||||
|
||||
// Note: same data types are intentional
|
||||
[LoadRecord("ProductOfferTable.json", "id")]
|
||||
[LoadRecord("ProductOfferTable.json", "Id")]
|
||||
public readonly Dictionary<int, ProductOfferRecord> ProductOffers = [];
|
||||
|
||||
[LoadRecord("PopupPackageListTable.json", "id")]
|
||||
[LoadRecord("PopupPackageListTable.json", "Id")]
|
||||
public readonly Dictionary<int, ProductOfferRecord> PopupPackages = [];
|
||||
|
||||
[LoadRecord("InterceptNormalTable.json", "id")]
|
||||
public readonly Dictionary<int, InterceptionRecord> InterceptNormal = [];
|
||||
[LoadRecord("InterceptNormalTable.json", "Id")]
|
||||
public readonly Dictionary<int, InterceptNormalRecord> InterceptNormal = [];
|
||||
|
||||
[LoadRecord("InterceptSpecialTable.json", "id")]
|
||||
public readonly Dictionary<int, InterceptionRecord> InterceptSpecial = [];
|
||||
[LoadRecord("InterceptSpecialTable.json", "Id")]
|
||||
public readonly Dictionary<int, InterceptSpecialRecord> InterceptSpecial = [];
|
||||
|
||||
[LoadRecord("ConditionRewardTable.json", "id")]
|
||||
[LoadRecord("ConditionRewardTable.json", "Id")]
|
||||
public readonly Dictionary<int, ConditionRewardRecord> ConditionRewards = [];
|
||||
[LoadRecord("ItemConsumeTable.json", "id")]
|
||||
[LoadRecord("ItemConsumeTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemConsumeRecord> ConsumableItems = [];
|
||||
[LoadRecord("ItemRandomTable.json", "id")]
|
||||
public readonly Dictionary<int, RandomItemRecord> RandomItem = [];
|
||||
[LoadRecord("LostSectorTable.json", "id")]
|
||||
[LoadRecord("ItemRandomTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemRandomRecord> RandomItem = [];
|
||||
[LoadRecord("LostSectorTable.json", "Id")]
|
||||
public readonly Dictionary<int, LostSectorRecord> LostSector = [];
|
||||
[LoadRecord("LostSectorStageTable.json", "id")]
|
||||
[LoadRecord("LostSectorStageTable.json", "Id")]
|
||||
public readonly Dictionary<int, LostSectorStageRecord> LostSectorStages = [];
|
||||
[LoadRecord("ItemPieceTable.json", "id")]
|
||||
[LoadRecord("ItemPieceTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemPieceRecord> PieceItems = [];
|
||||
[LoadRecord("GachaGradeProbTable.json", "id")]
|
||||
[LoadRecord("GachaGradeProbTable.json", "Id")]
|
||||
public readonly Dictionary<int, GachaGradeProbRecord> GachaGradeProb = [];
|
||||
[LoadRecord("GachaListProbTable.json", "id")]
|
||||
[LoadRecord("GachaListProbTable.json", "Id")]
|
||||
public readonly Dictionary<int, GachaListProbRecord> GachaListProb = [];
|
||||
[LoadRecord("RecycleResearchStatTable.json", "id")]
|
||||
[LoadRecord("RecycleResearchStatTable.json", "Id")]
|
||||
public readonly Dictionary<int, RecycleResearchStatRecord> RecycleResearchStats = [];
|
||||
[LoadRecord("RecycleResearchLevelTable.json", "id")]
|
||||
[LoadRecord("RecycleResearchLevelTable.json", "Id")]
|
||||
public readonly Dictionary<int, RecycleResearchLevelRecord> RecycleResearchLevels = [];
|
||||
|
||||
// Harmony Cube Data Tables
|
||||
[LoadRecord("ItemHarmonyCubeTable.json", "id")]
|
||||
[LoadRecord("ItemHarmonyCubeTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemHarmonyCubeRecord> ItemHarmonyCubeTable = [];
|
||||
|
||||
[LoadRecord("ItemHarmonyCubeLevelTable.json", "id")]
|
||||
[LoadRecord("ItemHarmonyCubeLevelTable.json", "Id")]
|
||||
public readonly Dictionary<int, ItemHarmonyCubeLevelRecord> ItemHarmonyCubeLevelTable = [];
|
||||
|
||||
// Favorite Item Data Tables
|
||||
[LoadRecord("FavoriteItemTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemRecord> FavoriteItemTable = [];
|
||||
|
||||
[LoadRecord("FavoriteItemExpTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemExpTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemExpRecord> FavoriteItemExpTable = [];
|
||||
|
||||
[LoadRecord("FavoriteItemLevelTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemLevelTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemLevelRecord> FavoriteItemLevelTable = [];
|
||||
|
||||
[LoadRecord("FavoriteItemProbabilityTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemProbabilityTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemProbabilityRecord> FavoriteItemProbabilityTable = [];
|
||||
|
||||
[LoadRecord("FavoriteItemQuestTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemQuestRecord> FavoriteItemQuestTable = [];
|
||||
|
||||
[LoadRecord("FavoriteItemQuestStageTable.json", "id")]
|
||||
[LoadRecord("FavoriteItemQuestStageTable.json", "Id")]
|
||||
public readonly Dictionary<int, FavoriteItemQuestStageRecord> FavoriteItemQuestStageTable = [];
|
||||
|
||||
// Tables related to PlaySoda Arcade's event.
|
||||
|
||||
[LoadRecord("EventPlaySodaManagerTable.json", "id")]
|
||||
[LoadRecord("EventPlaySodaManagerTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventPlaySodaManagerRecord> EventPlaySodaManagerTable = [];
|
||||
|
||||
[LoadRecord("EventPlaySodaStoryModeTable.json", "id")]
|
||||
[LoadRecord("EventPlaySodaStoryModeTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventPlaySodaStoryModeRecord> EventPlaySodaStoryModeTable = [];
|
||||
|
||||
[LoadRecord("EventPlaySodaChallengeModeTable.json", "id")]
|
||||
[LoadRecord("EventPlaySodaChallengeModeTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventPlaySodaChallengeModeRecord> EventPlaySodaChallengeModeTable = [];
|
||||
|
||||
[LoadRecord("EventPlaySodaPointRewardTable.json", "id")]
|
||||
[LoadRecord("EventPlaySodaPointRewardTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventPlaySodaPointRewardRecord> EventPlaySodaPointRewardTable = [];
|
||||
|
||||
// Tables related to InTheMirror Arcade's event.
|
||||
|
||||
[LoadRecord("EventMvgQuestTable.json", "id")]
|
||||
[LoadRecord("EventMvgQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventMVGQuestRecord_Raw> EventMvgQuestTable = [];
|
||||
|
||||
[LoadRecord("EventMvgQuestTable.json", "id")]
|
||||
[LoadRecord("EventMvgQuestTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventMVGShopRecord_Raw> EventMvgShopTable = [];
|
||||
|
||||
[LoadRecord("EventMVGMissionTable.json", "id")]
|
||||
[LoadRecord("EventMVGMissionTable.json", "Id")]
|
||||
public readonly Dictionary<int, EventMVGMissionRecord_Raw> EventMvgMissionTable = [];
|
||||
|
||||
static async Task<GameData> BuildAsync()
|
||||
@@ -481,11 +481,11 @@ namespace EpinelPS.Data
|
||||
item.Name.StartsWith("LostSectorMap/")
|
||||
)
|
||||
{
|
||||
MapInfo[] x = await LoadZip<MapInfo>(item.Name, progress);
|
||||
FieldMapRecord[] x = await LoadZip<FieldMapRecord>(item.Name, progress);
|
||||
|
||||
foreach (MapInfo map in x)
|
||||
foreach (FieldMapRecord map in x)
|
||||
{
|
||||
MapData.Add(map.id, map);
|
||||
MapData.Add(map.Id, map);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -497,12 +497,12 @@ namespace EpinelPS.Data
|
||||
if (QuestDataRecords.Count == 0) throw new Exception("QuestDataRecords should not be empty");
|
||||
}
|
||||
|
||||
public MainQuestCompletionRecord? GetMainQuestForStageClearCondition(int stage)
|
||||
public MainQuestRecord? GetMainQuestForStageClearCondition(int stage)
|
||||
{
|
||||
if (QuestDataRecords.Count == 0) throw new Exception("QuestDataRecords should not be empty");
|
||||
foreach (KeyValuePair<int, MainQuestCompletionRecord> item in QuestDataRecords)
|
||||
foreach (KeyValuePair<int, MainQuestRecord> item in QuestDataRecords)
|
||||
{
|
||||
if (item.Value.condition_id == stage)
|
||||
if (item.Value.ConditionId == stage)
|
||||
{
|
||||
return item.Value;
|
||||
}
|
||||
@@ -510,9 +510,9 @@ namespace EpinelPS.Data
|
||||
|
||||
return null;
|
||||
}
|
||||
public MainQuestCompletionRecord? GetMainQuestByTableId(int tid)
|
||||
public MainQuestRecord? GetMainQuestByTableId(int tId)
|
||||
{
|
||||
return QuestDataRecords[tid];
|
||||
return QuestDataRecords[tId];
|
||||
}
|
||||
public CampaignStageRecord? GetStageData(int stage)
|
||||
{
|
||||
@@ -538,8 +538,8 @@ namespace EpinelPS.Data
|
||||
|
||||
if (prevValue < targetExp)
|
||||
{
|
||||
prevLevel = item.level;
|
||||
prevValue = item.exp;
|
||||
prevLevel = item.Level;
|
||||
prevValue = item.Exp;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -554,9 +554,9 @@ namespace EpinelPS.Data
|
||||
{
|
||||
UserExpRecord item = UserExpDataRecords[i];
|
||||
|
||||
if (targetLevel == item.level)
|
||||
if (targetLevel == item.Level)
|
||||
{
|
||||
return item.exp;
|
||||
return item.Exp;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
@@ -571,13 +571,13 @@ namespace EpinelPS.Data
|
||||
|
||||
foreach (KeyValuePair<int, CampaignChapterRecord> item in ChapterCampaignData)
|
||||
{
|
||||
if (difficulty == "Normal" && item.Value.chapter == chapterNum)
|
||||
if (difficulty == "Normal" && item.Value.Chapter == chapterNum)
|
||||
{
|
||||
return item.Value.field_id;
|
||||
return item.Value.FieldId;
|
||||
}
|
||||
else if (difficulty == "Hard" && item.Value.chapter == chapterNum)
|
||||
else if (difficulty == "Hard" && item.Value.Chapter == chapterNum)
|
||||
{
|
||||
return item.Value.hard_field_id;
|
||||
return item.Value.HardFieldId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,9 +592,9 @@ namespace EpinelPS.Data
|
||||
{
|
||||
foreach (KeyValuePair<int, CampaignChapterRecord> item in ChapterCampaignData)
|
||||
{
|
||||
if (item.Value.field_id == field)
|
||||
if (item.Value.FieldId == field)
|
||||
{
|
||||
return item.Value.chapter;
|
||||
return item.Value.Chapter;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,31 +604,31 @@ namespace EpinelPS.Data
|
||||
{
|
||||
foreach (KeyValuePair<int, CharacterCostumeRecord> item in CharacterCostumeTable)
|
||||
{
|
||||
yield return item.Value.id;
|
||||
yield return item.Value.Id;
|
||||
}
|
||||
}
|
||||
|
||||
internal ClearedTutorialData GetTutorialDataById(int TableId)
|
||||
internal ContentsTutorialRecord GetTutorialDataById(int TableId)
|
||||
{
|
||||
return TutorialTable[TableId];
|
||||
}
|
||||
|
||||
public string? GetItemSubType(int itemType)
|
||||
public ItemSubType GetItemSubType(int itemType)
|
||||
{
|
||||
// Check if it's an equipment item
|
||||
if (ItemEquipTable.TryGetValue(itemType, out ItemEquipRecord? equipRecord))
|
||||
{
|
||||
return equipRecord.item_sub_type;
|
||||
return equipRecord.ItemSubType;
|
||||
}
|
||||
|
||||
// Check if it's a harmony cube item
|
||||
if (ItemHarmonyCubeTable.TryGetValue(itemType, out ItemHarmonyCubeRecord? harmonyCubeRecord))
|
||||
{
|
||||
return harmonyCubeRecord.item_sub_type;
|
||||
return harmonyCubeRecord.ItemSubType;
|
||||
}
|
||||
|
||||
// Return null if item type not found
|
||||
return null;
|
||||
return ItemSubType.None;
|
||||
}
|
||||
|
||||
internal IEnumerable<int> GetStageIdsForChapter(int chapterNumber, bool normal)
|
||||
@@ -638,31 +638,30 @@ namespace EpinelPS.Data
|
||||
{
|
||||
CampaignStageRecord data = item.Value;
|
||||
|
||||
int chVal = data.chapter_id - 1;
|
||||
int chVal = data.ChapterId - 1;
|
||||
|
||||
if (chapterNumber == chVal && data.chapter_mod == mod && data.stage_type == StageType.Main)
|
||||
if (chapterNumber == chVal && data.ChapterMod == mod && data.StageType == StageType.Main)
|
||||
{
|
||||
yield return data.id;
|
||||
yield return data.Id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<int, CharacterLevelData> GetCharacterLevelUpData()
|
||||
public Dictionary<int, CharacterLevelRecord> GetCharacterLevelUpData()
|
||||
{
|
||||
return LevelData;
|
||||
}
|
||||
|
||||
public TacticAcademyLessonRecord GetTacticAcademyLesson(int lessonId)
|
||||
public TacticAcademyFunctionRecord GetTacticAcademyLesson(int lessonId)
|
||||
{
|
||||
return TacticAcademyLessons[lessonId];
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetScenarioStageIdsForChapter(int chapterNumber)
|
||||
{
|
||||
|
||||
return albumResourceRecords.Values.Where(record => record.target_chapter == chapterNumber && !string.IsNullOrEmpty(record.scenario_group_id)).Select(record => record.scenario_group_id);
|
||||
return albumResourceRecords.Values.Where(record => record.TargetChapter == chapterNumber && !string.IsNullOrEmpty(record.ScenarioGroupId)).Select(record => record.ScenarioGroupId);
|
||||
}
|
||||
public bool IsValidScenarioStage(string scenarioGroupId, int targetChapter, int targetStage)
|
||||
public bool IsValIdScenarioStage(string scenarioGroupId, int targetChapter, int targetStage)
|
||||
{
|
||||
// Only process stages that belong to the main quest
|
||||
if (!scenarioGroupId.StartsWith("d_main_"))
|
||||
@@ -678,7 +677,7 @@ namespace EpinelPS.Data
|
||||
|
||||
if (parts.Length < 4)
|
||||
{
|
||||
return false; // If it doesn't have at least 4 parts, it's not a valid stage
|
||||
return false; // If it doesn't have at least 4 parts, it's not a valId stage
|
||||
}
|
||||
|
||||
string chapterPart = parts[2]; // This could be "26", "18af", "01"
|
||||
@@ -719,22 +718,22 @@ namespace EpinelPS.Data
|
||||
{
|
||||
CampaignChapterRecord data = ChapterCampaignData[chapter - 1];
|
||||
if (mod == ChapterMod.Hard)
|
||||
return data.hard_field_id;
|
||||
else return data.field_id;
|
||||
return data.HardFieldId;
|
||||
else return data.FieldId;
|
||||
}
|
||||
internal string GetMapIdFromChapter(int chapter, string mod)
|
||||
{
|
||||
CampaignChapterRecord data = ChapterCampaignData[chapter - 1];
|
||||
if (mod == "Hard")
|
||||
return data.hard_field_id;
|
||||
else return data.field_id;
|
||||
return data.HardFieldId;
|
||||
else return data.FieldId;
|
||||
}
|
||||
|
||||
internal int GetConditionReward(int groupId, long damage)
|
||||
{
|
||||
IEnumerable<KeyValuePair<int, ConditionRewardRecord>> results = ConditionRewards.Where(x => x.Value.group == groupId && x.Value.value_min <= damage && x.Value.value_max >= damage);
|
||||
IEnumerable<KeyValuePair<int, ConditionRewardRecord>> results = ConditionRewards.Where(x => x.Value.Group == groupId && x.Value.ValueMin <= damage && x.Value.ValueMax >= damage);
|
||||
if (results.Any())
|
||||
return results.FirstOrDefault().Value.reward_id;
|
||||
return results.FirstOrDefault().Value.RewardId;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
@@ -750,4 +749,10 @@ namespace EpinelPS.Data
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
public class DataTable<T>
|
||||
{
|
||||
public string version { get; set; } = "";
|
||||
public List<T> records { get; set; } = [];
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,149 +0,0 @@
|
||||
namespace EpinelPS.Data
|
||||
{
|
||||
|
||||
public enum TriggerType
|
||||
{
|
||||
None = 0,
|
||||
UserLevel = 1,
|
||||
CampaignClear = 2,
|
||||
ChapterClear = 3,
|
||||
CampaignStart = 4,
|
||||
TowerAllStart = 5,
|
||||
TowerBasicClear = 6,
|
||||
CharacterLevel = 7,
|
||||
CharacterGrade = 8,
|
||||
CharacterCore = 9,
|
||||
CharacterAttractiveLevel = 10,
|
||||
MainShopBuy = 11,
|
||||
ShopGuildBuy = 12,
|
||||
GachaCharacter = 13,
|
||||
OutpostBattleReward = 14,
|
||||
OutpostFastBattleReward = 15,
|
||||
PointRewardDaily = 16,
|
||||
PointRewardWeekly = 17,
|
||||
ObtainCharacter = 18,
|
||||
OutpostBuilding = 19,
|
||||
SendFriendShipPoint = 20,
|
||||
SendDispatch = 21,
|
||||
MainQuestClear = 22,
|
||||
ObtainJukeboxTheme = 23,
|
||||
SubQuestClear = 24,
|
||||
CampaignGroupClear = 25,
|
||||
NpcTalk = 26,
|
||||
TowerElysionClear = 27,
|
||||
TowerMissilisClear = 28,
|
||||
TowerTetraClear = 29,
|
||||
TowerOverspecClear = 30,
|
||||
AchieveRanking1st = 31,
|
||||
AchieveRanking5th = 32,
|
||||
AchieveRanking10th = 33,
|
||||
EventPoint = 34,
|
||||
HardChapterClear = 35,
|
||||
ObtainCharacterSSR = 36,
|
||||
GachaCompany = 37,
|
||||
ObtainCharacterNew = 38,
|
||||
WinArena = 39,
|
||||
SpecialArenaTier = 40,
|
||||
PointRewardAchievement = 41,
|
||||
ObtainCharacterPilgrim = 42,
|
||||
ShopDisassembleBuy = 43,
|
||||
CharacterCounsel = 44,
|
||||
CharacterAttractivePresent = 45,
|
||||
ObtainEquipItemT3T4 = 46,
|
||||
ObtainEquipItemT5T6 = 47,
|
||||
ObtainEquipItemT7T8 = 48,
|
||||
ObtainEquipItemT9 = 49,
|
||||
PointRewardEvent = 50,
|
||||
MissionClearEvent = 51,
|
||||
ObtainMemorialItem = 52,
|
||||
LostSectorClear = 53,
|
||||
ObtainHarmonyCube = 54,
|
||||
HarmonyCubeLevel = 55,
|
||||
CooperationEventClear = 56,
|
||||
SynchroDeviceSlot = 57,
|
||||
ObtainEquipItemALL = 58,
|
||||
EquipItemLevel = 59,
|
||||
CharacterSkillLevel = 60,
|
||||
PickupGachaCharacter = 61,
|
||||
ObtainSilverMileage = 62,
|
||||
ObtainGoldMileage = 63,
|
||||
SendDispatchGrade = 64,
|
||||
OutpostBattleBoxLevel = 65,
|
||||
GetFriendShipPoint = 66,
|
||||
MessageClear = 67,
|
||||
RecycleResearchLevel = 68,
|
||||
GachaPremium = 69,
|
||||
CharacterLevelUpCount = 70,
|
||||
CharacterGradeUpCount = 71,
|
||||
CharacterLevelMax = 72,
|
||||
CharacterGradeMax = 73,
|
||||
HarmonyCubeLevelMax = 74,
|
||||
CharacterSkillLevelMax = 75,
|
||||
CharacterAttractiveLevelMax = 76,
|
||||
EquipItemLevelMax = 77,
|
||||
ObtainEquipItemT2 = 78,
|
||||
FieldObjectCollection = 79,
|
||||
SimulationRoomStart = 80,
|
||||
InterceptStart = 81,
|
||||
EquipItemLevelCount = 82,
|
||||
SimulationRoomClear = 83,
|
||||
InterceptClear = 84,
|
||||
DailyEventClear = 85,
|
||||
EventStageClear = 86,
|
||||
ObtainEventCurrencyMaterialMiraclesnow = 87,
|
||||
EventDungeonStageClear = 88,
|
||||
EventSortOutClear = 89,
|
||||
EventSortOutPointMax = 90,
|
||||
EquipItemLevelUpCount = 91,
|
||||
CharacterSkillLevelUpCount = 92,
|
||||
FirstPaidGacha_Legecy = 93,
|
||||
ObtainCharacterCostume = 94,
|
||||
SyncroDeviceLevelMax = 95,
|
||||
ObtainEventCurrencyMaterial = 96,
|
||||
SimulationRoomClearWithoutCondition = 97,
|
||||
EventTextAdventureClear = 98,
|
||||
RookieArenaPlayCount = 99,
|
||||
EventDicePlayCount = 100,
|
||||
EventBBQTycoonDailyRewardCheck = 101,
|
||||
EventBBQTycoonHighScore = 102,
|
||||
ChampionArenaGambleWinAll = 103,
|
||||
ChampionArenaGambleLoseAll = 104,
|
||||
EventMiniGameCe002PlayCheck = 105,
|
||||
EventMiniGameNKSPlayCheck = 106,
|
||||
EventSnowfallOasisDailyRewardCheck = 107,
|
||||
EventMiniGameCe003RewardCheck = 108,
|
||||
EventTowerDefensePlayCheck = 109,
|
||||
EventPlaySodaPlayCheck = 110,
|
||||
EventIslandAdventureFishingPlayCheck = 111,
|
||||
MiniGameDDCompleteDive = 112,
|
||||
MiniGameDDCompleteSushi = 113,
|
||||
MiniGameDDTotalGold = 114,
|
||||
MiniGameDDSushiPreTurnover = 115,
|
||||
MiniGameDDTotalFish = 116,
|
||||
MiniGameDDPerUnderwaterEncounter = 117,
|
||||
MiniGameDDUnlockEmployeeCount = 118,
|
||||
MiniGameDDUnlockNikkeCount = 119,
|
||||
MiniGameDDGunLevel = 120,
|
||||
MiniGameDDIDiverLevel = 121,
|
||||
MiniGameDDUnlockSushiCount = 122,
|
||||
MiniGameDDSushiLevel = 123,
|
||||
MiniGameDDSushiCookScore = 124,
|
||||
MiniGameDDSushiPreTurnoverTotalMax = 125,
|
||||
MiniGameDDSushiLevelTotalMax = 126,
|
||||
MiniGameDDAllAchievement = 127,
|
||||
ComebackPollComplete = 128,
|
||||
AliceAccessAttractiveScenario = 129,
|
||||
AliceEquipCollectionItemLevel = 130,
|
||||
AliceEquipCollectionItemSR = 131,
|
||||
AliceEquipItemOverload = 132,
|
||||
AliceSkill1Level = 133,
|
||||
AliceSkillBurstLevel = 134,
|
||||
InterceptNormalClearWithCondition = 135,
|
||||
InterceptSpecialClearWithCondition = 136,
|
||||
SimulationRoomClearCount1Only = 137,
|
||||
TacticAcademyFinish9_4 = 138,
|
||||
EventMiniGameCe004RewardCheck = 139,
|
||||
EventMVGPlayCheck = 140,
|
||||
EventDDRRewardCheck = 141
|
||||
}
|
||||
}
|
||||
@@ -13,17 +13,17 @@ namespace EpinelPS.LobbyServer.Archive
|
||||
ResGetArchiveRecord response = new();
|
||||
|
||||
// Explicitly select IDs from the records
|
||||
List<int> allIds = [.. GameData.Instance.archiveRecordManagerTable.Values.Select(record => record.id)];
|
||||
List<int> allIds = [.. GameData.Instance.archiveRecordManagerTable.Values.Select(record => record.Id)];
|
||||
|
||||
// Add the IDs to the response lists
|
||||
response.ArchiveRecordManagerList.AddRange(allIds);
|
||||
response.UnlockedArchiveRecordList.AddRange(allIds);
|
||||
|
||||
// Get entries with record_type "EventQuest"
|
||||
List<ArchiveRecordManagerRecord> eventQuestRecords = [.. GameData.Instance.archiveRecordManagerTable.Values.Where(record => record.record_type == "EventQuest")];
|
||||
List<ArchiveRecordManagerRecord> eventQuestRecords = [.. GameData.Instance.archiveRecordManagerTable.Values.Where(record => record.RecordType == ArchiveRecordType.EventQuest)];
|
||||
|
||||
response.ArchiveEventQuest = new();
|
||||
response.ArchiveEventQuest.UnlockedArchiveRecordManagerEventQuestIdList.AddRange(eventQuestRecords.Select(record => record.id));
|
||||
response.ArchiveEventQuest.UnlockedArchiveRecordManagerEventQuestIdList.AddRange(eventQuestRecords.Select(record => record.Id));
|
||||
// TODO more fields
|
||||
|
||||
|
||||
|
||||
@@ -10,23 +10,23 @@ namespace EpinelPS.LobbyServer.Archive
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
ReqGetNonResettableArchiveScenario req = await ReadData<ReqGetNonResettableArchiveScenario>(); // req has EventId field
|
||||
int evid = req.EventId;
|
||||
int evId = req.EventId;
|
||||
ResGetNonResettableArchiveScenario response = new();
|
||||
|
||||
// Access the GameData instance
|
||||
GameData gameData = GameData.Instance;
|
||||
|
||||
if (evid == 130002)
|
||||
if (evId == 130002)
|
||||
{
|
||||
// Directly use the archiveEventQuestRecords dictionary
|
||||
foreach (ArchiveEventQuestRecord record in gameData.archiveEventQuestRecords.Values)
|
||||
foreach (ArchiveEventQuestRecord_Raw record in gameData.archiveEventQuestRecords.Values)
|
||||
{
|
||||
if (record.event_quest_manager_id == evid)
|
||||
if (record.EventQuestManagerId == evId)
|
||||
{
|
||||
// Add the end_scenario_id to the ScenarioIdList
|
||||
if (!string.IsNullOrEmpty(record.end_scenario_id))
|
||||
// Add the end_scenario_Id to the ScenarioIdList
|
||||
if (!string.IsNullOrEmpty(record.EndScenarioId))
|
||||
{
|
||||
response.ScenarioIdList.Add(record.end_scenario_id);
|
||||
response.ScenarioIdList.Add(record.EndScenarioId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,12 +36,12 @@ namespace EpinelPS.LobbyServer.Archive
|
||||
// Directly use the archiveEventStoryRecords dictionary
|
||||
foreach (ArchiveEventStoryRecord record in gameData.archiveEventStoryRecords.Values)
|
||||
{
|
||||
if (record.event_id == evid)
|
||||
if (record.EventId == evId)
|
||||
{
|
||||
// Add the prologue_scenario to the ScenarioIdList
|
||||
if (!string.IsNullOrEmpty(record.prologue_scenario))
|
||||
// Add the PrologueScenario to the ScenarioIdList
|
||||
if (!string.IsNullOrEmpty(record.PrologueScenario))
|
||||
{
|
||||
response.ScenarioIdList.Add(record.prologue_scenario);
|
||||
response.ScenarioIdList.Add(record.PrologueScenario);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Archive
|
||||
ResGetResettableArchiveScenario response = new(); // has ScenarioIdList field that takes in strings
|
||||
|
||||
// Retrieve stage IDs from GameData
|
||||
List<string> stageIds = [.. GameData.Instance.archiveEventDungeonStageRecords.Values.Select(record => record.stage_id.ToString())];
|
||||
List<string> stageIds = [.. GameData.Instance.archiveEventDungeonStageRecords.Values.Select(record => record.StageId.ToString())];
|
||||
|
||||
// Add them to the response
|
||||
response.ScenarioIdList.Add(stageIds);
|
||||
|
||||
@@ -20,13 +20,13 @@ namespace EpinelPS.LobbyServer.Archive
|
||||
|
||||
if (gameData.archiveMessengerConditionRecords.TryGetValue(groupId, out ArchiveMessengerConditionRecord? conditionRecord))
|
||||
{
|
||||
foreach (ArchiveMessengerConditionList condition in conditionRecord.archive_messenger_condition_list)
|
||||
foreach (var condition in conditionRecord.ArchiveMessengerConditionList)
|
||||
{
|
||||
// Add each condition as a NetArchiveMessage in the response
|
||||
response.ArchiveMessageList.Add(new NetArchiveMessage
|
||||
{
|
||||
ConditionId = condition.condition_id,
|
||||
MessageId = conditionRecord.tid // Correctly using tid as MessageId
|
||||
ConditionId = condition.ConditionId,
|
||||
MessageId = conditionRecord.Tid // Correctly using tId as MessageId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace EpinelPS.LobbyServer.Auth
|
||||
|
||||
string token = new PasetoBuilder().Use(ProtocolVersion.V4, Purpose.Local)
|
||||
.WithKey(JsonDb.Instance.LauncherTokenKey, Encryption.SymmetricKey)
|
||||
.AddClaim("userid", UserId)
|
||||
.AddClaim("userId", UserId)
|
||||
.IssuedAt(DateTime.UtcNow)
|
||||
.Expiration(DateTime.UtcNow.AddDays(2))
|
||||
.Encode();
|
||||
|
||||
@@ -33,15 +33,15 @@ namespace EpinelPS.LobbyServer.Campaign
|
||||
|
||||
// Register and return reward
|
||||
|
||||
MapInfo map = GameData.Instance.MapData[req.MapId];
|
||||
var map = GameData.Instance.MapData[req.MapId];
|
||||
|
||||
ItemSpawner position = map.ItemSpawner.Where(x => x.positionId == req.FieldObject.PositionId).FirstOrDefault() ?? throw new Exception("bad position id");
|
||||
var position = map.ItemSpawner.Where(x => x.PositionId == req.FieldObject.PositionId).FirstOrDefault() ?? throw new Exception("bad position Id");
|
||||
|
||||
FieldItemRecord positionReward = GameData.Instance.FieldItems[position.itemId];
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(positionReward.type_value) ?? throw new Exception("failed to get reward");
|
||||
FieldItemRecord positionReward = GameData.Instance.FieldItems[position.ItemId];
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(positionReward.TypeValue) ?? throw new Exception("failed to get reward");
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||
|
||||
// Hide it from the field
|
||||
// HIde it from the field
|
||||
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Type = req.FieldObject.Type});
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
{
|
||||
while (attractiveData.Lv < 40)
|
||||
{
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.FirstOrDefault(x => x.Value.attractive_level == attractiveData.Lv).Value;
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.FirstOrDefault(x => x.Value.AttractiveLevel == attractiveData.Lv).Value;
|
||||
|
||||
if (levelInfo == null)
|
||||
{
|
||||
@@ -84,9 +84,9 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
break;
|
||||
}
|
||||
|
||||
if (attractiveData.Exp >= levelInfo.attractive_point)
|
||||
if (attractiveData.Exp >= levelInfo.AttractivePoint)
|
||||
{
|
||||
attractiveData.Exp -= levelInfo.attractive_point;
|
||||
attractiveData.Exp -= levelInfo.AttractivePoint;
|
||||
attractiveData.Lv++;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -21,29 +21,29 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
}
|
||||
|
||||
int totalExpGained = 0;
|
||||
CharacterRecord? characterRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(x => x.name_code == req.NameCode);
|
||||
CharacterRecord? characterRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(x => x.NameCode == req.NameCode);
|
||||
|
||||
foreach (NetItemData item in req.Items)
|
||||
{
|
||||
ItemMaterialRecord? materialInfo = GameData.Instance.itemMaterialTable.GetValueOrDefault(item.Tid);
|
||||
if (materialInfo != null && materialInfo.item_sub_type == "AttractiveMaterial")
|
||||
if (materialInfo != null && materialInfo.ItemSubType == ItemSubType.AttractiveMaterial)
|
||||
{
|
||||
int expGained = materialInfo.item_value * (int)item.Count;
|
||||
int expGained = materialInfo.ItemValue * (int)item.Count;
|
||||
|
||||
if (characterRecord != null)
|
||||
{
|
||||
if (materialInfo.material_type == "Corporation")
|
||||
if (materialInfo.MaterialType == MaterialType.Corporation)
|
||||
{
|
||||
string corporation = materialInfo.name_localkey.Split('_')[2];
|
||||
if (corporation.Equals(characterRecord.corporation, StringComparison.OrdinalIgnoreCase))
|
||||
string corporation = materialInfo.NameLocalkey.Split('_')[2];
|
||||
if (corporation.Equals(characterRecord.Corporation.ToString(), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
expGained *= 5;
|
||||
}
|
||||
}
|
||||
else if (materialInfo.material_type == "Squad")
|
||||
else if (materialInfo.MaterialType == MaterialType.Squad)
|
||||
{
|
||||
string squad = materialInfo.name_localkey.Split('_')[2];
|
||||
if (squad.Equals(characterRecord.squad, StringComparison.OrdinalIgnoreCase))
|
||||
string squad = materialInfo.NameLocalkey.Split('_')[2];
|
||||
if (squad.Equals(characterRecord.Squad.ToString(), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
expGained *= 3;
|
||||
}
|
||||
@@ -92,16 +92,16 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
{
|
||||
while (attractiveData.Lv < 40)
|
||||
{
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.Values.FirstOrDefault(x => x.attractive_level == attractiveData.Lv);
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.Values.FirstOrDefault(x => x.AttractiveLevel == attractiveData.Lv);
|
||||
|
||||
if (levelInfo == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (attractiveData.Exp >= levelInfo.attractive_point)
|
||||
if (attractiveData.Exp >= levelInfo.AttractivePoint)
|
||||
{
|
||||
attractiveData.Exp -= levelInfo.attractive_point;
|
||||
attractiveData.Exp -= levelInfo.AttractivePoint;
|
||||
attractiveData.Lv++;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
{
|
||||
while (attractiveData.Lv < 40)
|
||||
{
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.Values.FirstOrDefault(x => x.attractive_level == attractiveData.Lv);
|
||||
AttractiveLevelRecord? levelInfo = GameData.Instance.AttractiveLevelTable.Values.FirstOrDefault(x => x.AttractiveLevel == attractiveData.Lv);
|
||||
|
||||
if (levelInfo == null)
|
||||
{
|
||||
@@ -84,9 +84,9 @@ namespace EpinelPS.LobbyServer.Character.Counsel
|
||||
break;
|
||||
}
|
||||
|
||||
if (attractiveData.Exp >= levelInfo.attractive_point)
|
||||
if (attractiveData.Exp >= levelInfo.AttractivePoint)
|
||||
{
|
||||
attractiveData.Exp -= levelInfo.attractive_point;
|
||||
attractiveData.Exp -= levelInfo.AttractivePoint;
|
||||
attractiveData.Lv++;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -20,27 +20,27 @@ namespace EpinelPS.LobbyServer.Character
|
||||
CharacterModel targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException();
|
||||
|
||||
// Find the element with the current csn from the request
|
||||
CharacterRecord currentCharacter = fullchardata.FirstOrDefault(c => c.id == targetCharacter.Tid) ?? throw new NullReferenceException();
|
||||
CharacterRecord currentCharacter = fullchardata.FirstOrDefault(c => c.Id == targetCharacter.Tid) ?? throw new NullReferenceException();
|
||||
|
||||
if (currentCharacter != null && targetCharacter != null)
|
||||
{
|
||||
if (currentCharacter.grade_core_id == 103 || currentCharacter.grade_core_id == 11 || currentCharacter.grade_core_id == 201)
|
||||
if (currentCharacter.GradeCoreId == 103 || currentCharacter.GradeCoreId == 11 || currentCharacter.GradeCoreId == 201)
|
||||
{
|
||||
Console.WriteLine("cannot limit break any further!");
|
||||
await WriteDataAsync(response);
|
||||
return;
|
||||
}
|
||||
|
||||
// Find a new CSN based on the `name_code` of the current character and `grade_core_id + 1`
|
||||
// Find a new CSN based on the `NameCode` of the current character and `GradeCoreId + 1`
|
||||
// For some reason, there is a seperate character for each limit/core break value.
|
||||
CharacterRecord? newCharacter = fullchardata.FirstOrDefault(c => c.name_code == currentCharacter.name_code && c.grade_core_id == currentCharacter.grade_core_id + 1);
|
||||
CharacterRecord? newCharacter = fullchardata.FirstOrDefault(c => c.NameCode == currentCharacter.NameCode && c.GradeCoreId == currentCharacter.GradeCoreId + 1);
|
||||
|
||||
|
||||
if (newCharacter != null)
|
||||
{
|
||||
// replace character in DB with new character
|
||||
targetCharacter.Grade++;
|
||||
targetCharacter.Tid = newCharacter.id;
|
||||
targetCharacter.Tid = newCharacter.Id;
|
||||
|
||||
response.Character = new NetUserCharacterDefaultData()
|
||||
{
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
|
||||
}
|
||||
|
||||
// TODO: Validate response from real server and pull info from user info
|
||||
// TODO: ValIdate response from real server and pull info from user info
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
ReqCharacterLevelUp req = await ReadData<ReqCharacterLevelUp>();
|
||||
User user = GetUser();
|
||||
ResCharacterLevelUp response = new();
|
||||
Dictionary<int, CharacterLevelData> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
Dictionary<int, CharacterLevelRecord> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
|
||||
foreach (CharacterModel item in user.Characters.ToArray())
|
||||
{
|
||||
@@ -23,10 +23,10 @@ namespace EpinelPS.LobbyServer.Character
|
||||
int requiredCoreDust = 0;
|
||||
for (int i = item.Level; i < req.Lv; i++)
|
||||
{
|
||||
CharacterLevelData levelUpData = data[i];
|
||||
requiredCredit += levelUpData.gold;
|
||||
requiredBattleData += levelUpData.character_exp;
|
||||
requiredCoreDust += levelUpData.character_exp2;
|
||||
CharacterLevelRecord levelUpData = data[i];
|
||||
requiredCredit += levelUpData.Gold;
|
||||
requiredBattleData += levelUpData.CharacterExp;
|
||||
requiredCoreDust += levelUpData.CharacterExp2;
|
||||
}
|
||||
|
||||
if (user.CanSubtractCurrency(CurrencyType.Gold, requiredCredit) &&
|
||||
@@ -73,7 +73,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
}
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
|
||||
user.AddTrigger(Trigger.CharacterLevelUpCount, 1);
|
||||
JsonDb.Save();
|
||||
|
||||
await WriteDataAsync(response);
|
||||
|
||||
@@ -14,17 +14,17 @@ namespace EpinelPS.LobbyServer.Character
|
||||
User user = GetUser();
|
||||
|
||||
// look up ID from name code and level
|
||||
KeyValuePair<int, AttractiveLevelRewardRecord> levelUpRecord = GameData.Instance.AttractiveLevelReward.Where(x => x.Value.attractive_level == req.Lv && x.Value.name_code == req.NameCode).FirstOrDefault();
|
||||
KeyValuePair<int, AttractiveLevelRewardRecord> levelUpRecord = GameData.Instance.AttractiveLevelReward.Where(x => x.Value.AttractiveLevel == req.Lv && x.Value.NameCode == req.NameCode).FirstOrDefault();
|
||||
|
||||
foreach (NetUserAttractiveData item in user.BondInfo)
|
||||
{
|
||||
if (item.NameCode == req.NameCode)
|
||||
{
|
||||
if (!item.ObtainedRewardLevels.Contains(levelUpRecord.Value.id))
|
||||
if (!item.ObtainedRewardLevels.Contains(levelUpRecord.Value.Id))
|
||||
{
|
||||
item.ObtainedRewardLevels.Add(levelUpRecord.Value.id);
|
||||
item.ObtainedRewardLevels.Add(levelUpRecord.Value.Id);
|
||||
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(levelUpRecord.Value.reward_id) ?? throw new Exception("failed to get reward");
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(levelUpRecord.Value.RewardId) ?? throw new Exception("failed to get reward");
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
ReqCharacterGrowReset req = await ReadData<ReqCharacterGrowReset>();
|
||||
User user = GetUser();
|
||||
ResCharacterGrowReset response = new();
|
||||
Dictionary<int, CharacterLevelData> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
Dictionary<int, CharacterLevelRecord> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
|
||||
foreach (CharacterModel item in user.Characters.ToArray())
|
||||
{
|
||||
@@ -34,10 +34,10 @@ namespace EpinelPS.LobbyServer.Character
|
||||
int requiredCoreDust = 0;
|
||||
for (int i = 1; i < item.Level; i++)
|
||||
{
|
||||
CharacterLevelData levelUpData = data[i];
|
||||
requiredCredit += levelUpData.gold;
|
||||
requiredBattleData += levelUpData.character_exp;
|
||||
requiredCoreDust += levelUpData.character_exp2;
|
||||
CharacterLevelRecord levelUpData = data[i];
|
||||
requiredCredit += levelUpData.Gold;
|
||||
requiredBattleData += levelUpData.CharacterExp;
|
||||
requiredCoreDust += levelUpData.CharacterExp2;
|
||||
}
|
||||
|
||||
user.AddCurrency(CurrencyType.Gold, requiredCredit);
|
||||
|
||||
@@ -15,12 +15,12 @@ namespace EpinelPS.LobbyServer.Character
|
||||
|
||||
CharacterModel character = user.Characters.FirstOrDefault(c => c.Csn == req.Csn) ?? throw new Exception("cannot find character");
|
||||
|
||||
CharacterRecord charRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(c => c.id == character.Tid) ?? throw new Exception("cannot find character record");
|
||||
CharacterRecord charRecord = GameData.Instance.CharacterTable.Values.FirstOrDefault(c => c.Id == character.Tid) ?? throw new Exception("cannot find character record");
|
||||
Dictionary<int, int> skillIdMap = new()
|
||||
{
|
||||
{ 1, charRecord.ulti_skill_id },
|
||||
{ 2, charRecord.skill1_id },
|
||||
{ 3, charRecord.skill2_id }
|
||||
{ 1, charRecord.UltiSkillId },
|
||||
{ 2, charRecord.Skill1Id },
|
||||
{ 3, charRecord.Skill2Id }
|
||||
};
|
||||
Dictionary<int, int> skillLevelMap = new()
|
||||
{
|
||||
@@ -28,19 +28,19 @@ namespace EpinelPS.LobbyServer.Character
|
||||
{ 2, character.Skill1Lvl },
|
||||
{ 3, character.Skill2Lvl }
|
||||
};
|
||||
SkillInfoRecord skillRecord = GameData.Instance.skillInfoTable.Values.FirstOrDefault(s => s.id == skillIdMap[req.Category] + (skillLevelMap[req.Category] - 1)) ?? throw new Exception("cannot find character skill record");
|
||||
CostRecord costRecord = GameData.Instance.costTable.Values.FirstOrDefault(c => c.id == skillRecord.level_up_cost_id) ?? throw new Exception("cannot find character cost record");
|
||||
SkillInfoRecord skillRecord = GameData.Instance.skillInfoTable.Values.FirstOrDefault(s => s.Id == skillIdMap[req.Category] + (skillLevelMap[req.Category] - 1)) ?? throw new Exception("cannot find character skill record");
|
||||
CostRecord costRecord = GameData.Instance.costTable.Values.FirstOrDefault(c => c.Id == skillRecord.LevelUpCostId) ?? throw new Exception("cannot find character cost record");
|
||||
|
||||
foreach (CostData? cost in costRecord.costs.Where(i => i.item_type != "None"))
|
||||
foreach (CostData? cost in costRecord.Costs.Where(i => i.ItemType != RewardType.None))
|
||||
{
|
||||
ItemData item = user.Items.FirstOrDefault(i => i.ItemType == cost.item_id) ?? throw new NullReferenceException();
|
||||
ItemData item = user.Items.FirstOrDefault(i => i.ItemType == cost.ItemId) ?? throw new NullReferenceException();
|
||||
|
||||
item.Count -= cost.item_value;
|
||||
item.Count -= cost.ItemValue;
|
||||
|
||||
response.Items.Add(new NetUserItemData
|
||||
{
|
||||
Isn = item.Isn,
|
||||
Tid = cost.item_id,
|
||||
Tid = cost.ItemId,
|
||||
Count = item.Count,
|
||||
Csn = item.Csn,
|
||||
Corporation = item.Corp,
|
||||
@@ -81,7 +81,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
|
||||
if (character.UltimateLevel == 10 && character.Skill1Lvl == 10 && character.Skill2Lvl == 10)
|
||||
{
|
||||
user.AddTrigger(TriggerType.CharacterSkillLevelMax, 1);
|
||||
user.AddTrigger(Trigger.CharacterSkillLevelMax, 1);
|
||||
}
|
||||
|
||||
response.Character = newChar;
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
{
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
// Broken protocol so we didn't validate request data.
|
||||
// Broken protocol so we dIdn't valIdate request data.
|
||||
// May fix later.
|
||||
ReqSynchroAddSlot req = await ReadData<ReqSynchroAddSlot>();
|
||||
|
||||
|
||||
@@ -13,16 +13,16 @@ namespace EpinelPS.LobbyServer.Character
|
||||
User user = GetUser();
|
||||
|
||||
ResSynchroLevelUp response = new();
|
||||
Dictionary<int, CharacterLevelData> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
Dictionary<int, CharacterLevelRecord> data = GameData.Instance.GetCharacterLevelUpData();
|
||||
|
||||
|
||||
int requiredCredit = 0;
|
||||
int requiredBattleData = 0;
|
||||
int requiredCoreDust = 0;
|
||||
CharacterLevelData levelUpData = data[user.SynchroDeviceLevel + 1];
|
||||
requiredCredit += levelUpData.gold;
|
||||
requiredBattleData += levelUpData.character_exp;
|
||||
requiredCoreDust += levelUpData.character_exp2;
|
||||
CharacterLevelRecord levelUpData = data[user.SynchroDeviceLevel + 1];
|
||||
requiredCredit += levelUpData.Gold;
|
||||
requiredBattleData += levelUpData.CharacterExp;
|
||||
requiredCoreDust += levelUpData.CharacterExp2;
|
||||
|
||||
if (user.CanSubtractCurrency(CurrencyType.Gold, requiredCredit) &&
|
||||
user.CanSubtractCurrency(CurrencyType.CharacterExp, requiredBattleData) &&
|
||||
@@ -47,7 +47,7 @@ namespace EpinelPS.LobbyServer.Character
|
||||
}
|
||||
response.SynchroLv = user.SynchroDeviceLevel;
|
||||
|
||||
user.AddTrigger(TriggerType.CharacterLevelUpCount, 1);
|
||||
user.AddTrigger(Trigger.CharacterLevelUpCount, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
await WriteDataAsync(response);
|
||||
|
||||
@@ -21,27 +21,27 @@ namespace EpinelPS.LobbyServer.Character
|
||||
CharacterModel targetCharacter = user.GetCharacterBySerialNumber(req.Csn) ?? throw new NullReferenceException();
|
||||
|
||||
// Find the element with the current csn from the request
|
||||
CharacterRecord? currentCharacter = fullchardata.FirstOrDefault(c => c.id == targetCharacter.Tid);
|
||||
CharacterRecord? currentCharacter = fullchardata.FirstOrDefault(c => c.Id == targetCharacter.Tid);
|
||||
|
||||
if (currentCharacter != null && targetCharacter != null)
|
||||
{
|
||||
if (currentCharacter.grade_core_id == 103 || currentCharacter.grade_core_id == 11 || currentCharacter.grade_core_id == 201)
|
||||
if (currentCharacter.GradeCoreId == 103 || currentCharacter.GradeCoreId == 11 || currentCharacter.GradeCoreId == 201)
|
||||
{
|
||||
Console.WriteLine("warning: cannot upgrade code any further!");
|
||||
await WriteDataAsync(response);
|
||||
return;
|
||||
}
|
||||
|
||||
// Find a new CSN based on the `name_code` of the current character and `grade_core_id + 1`
|
||||
// Find a new CSN based on the `NameCode` of the current character and `GradeCoreId + 1`
|
||||
// For some reason, there is a seperate character for each limit/core break value.
|
||||
CharacterRecord? newCharacter = fullchardata.FirstOrDefault(c => c.name_code == currentCharacter.name_code && c.grade_core_id == currentCharacter.grade_core_id + 1);
|
||||
CharacterRecord? newCharacter = fullchardata.FirstOrDefault(c => c.NameCode == currentCharacter.NameCode && c.GradeCoreId == currentCharacter.GradeCoreId + 1);
|
||||
|
||||
|
||||
if (newCharacter != null)
|
||||
{
|
||||
// replace character in DB with new character
|
||||
targetCharacter.Grade++;
|
||||
targetCharacter.Tid = newCharacter.id;
|
||||
targetCharacter.Tid = newCharacter.Id;
|
||||
|
||||
response.Character = new NetUserCharacterDefaultData()
|
||||
{
|
||||
@@ -60,9 +60,9 @@ namespace EpinelPS.LobbyServer.Character
|
||||
user.RemoveItemBySerialNumber(req.Isn, 1);
|
||||
response.Items.Add(NetUtils.ToNet(bodyItem));
|
||||
|
||||
if (newCharacter.grade_core_id == 103 || newCharacter.grade_core_id == 11 || newCharacter.grade_core_id == 201)
|
||||
if (newCharacter.GradeCoreId == 103 || newCharacter.GradeCoreId == 11 || newCharacter.GradeCoreId == 201)
|
||||
{
|
||||
user.AddTrigger(TriggerType.CharacterGradeMax, 1);
|
||||
user.AddTrigger(Trigger.CharacterGradeMax, 1);
|
||||
}
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace EpinelPS.LobbyServer.Event
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
ReqLoginEventData req = await ReadData<ReqLoginEventData>();
|
||||
int evid = req.EventId;
|
||||
int evId = req.EventId;
|
||||
ResLoginEventData response = new()
|
||||
{
|
||||
EndDate = DateTime.Now.AddDays(13).Ticks,
|
||||
|
||||
@@ -22,8 +22,8 @@ namespace EpinelPS.LobbyServer.Event
|
||||
}
|
||||
*/
|
||||
|
||||
// Get all scenario_group_id values from albumResourceRecords starting with "event_"
|
||||
response.ScenarioIdList.Add(GameData.Instance.albumResourceRecords.Values.Where(record => record.scenario_group_id.StartsWith("event_")).Select(record => record.scenario_group_id).ToList());
|
||||
// Get all scenario_group_Id values from albumResourceRecords starting with "event_"
|
||||
response.ScenarioIdList.Add(GameData.Instance.albumResourceRecords.Values.Where(record => record.ScenarioGroupId.StartsWith("event_")).Select(record => record.ScenarioGroupId).ToList());
|
||||
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ namespace EpinelPS.LobbyServer.Event.StoryEvent
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
ReqStoryDungeonEventData req = await ReadData<ReqStoryDungeonEventData>();
|
||||
int evid = req.EventId;
|
||||
int evId = req.EventId;
|
||||
User user = GetUser();
|
||||
|
||||
|
||||
if (!user.EventInfo.TryGetValue(evid, out EventData? eventData))
|
||||
if (!user.EventInfo.TryGetValue(evId, out EventData? eventData))
|
||||
{
|
||||
eventData = new();
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
if (existingQuest != null) existingQuest.Clear = true;
|
||||
else user.FavoriteItemQuests.Add(new NetUserFavoriteItemQuestData { QuestId = req.FavoriteItemQuestId, Clear = true });
|
||||
|
||||
if (questData.next_quest_id > 0 && user.FavoriteItemQuests.All(q => q.QuestId != questData.next_quest_id))
|
||||
if (questData.NextQuestId > 0 && user.FavoriteItemQuests.All(q => q.QuestId != questData.NextQuestId))
|
||||
{
|
||||
user.FavoriteItemQuests.Add(new NetUserFavoriteItemQuestData { QuestId = questData.next_quest_id, Clear = false, Received = false });
|
||||
user.FavoriteItemQuests.Add(new NetUserFavoriteItemQuestData { QuestId = questData.NextQuestId, Clear = false, Received = false });
|
||||
}
|
||||
}
|
||||
|
||||
string stageMapId = GameData.Instance.GetMapIdFromChapter(stageData.chapter_id, stageData.chapter_mod);
|
||||
string stageMapId = GameData.Instance.GetMapIdFromChapter(stageData.ChapterId, stageData.ChapterMod);
|
||||
if (!user.FieldInfoNew.ContainsKey(stageMapId))
|
||||
{
|
||||
user.FieldInfoNew.Add(stageMapId, new FieldInfoNew());
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
ReqEnterFavoriteItemQuestStage req = await ReadData<ReqEnterFavoriteItemQuestStage>();
|
||||
User user = GetUser();
|
||||
|
||||
user.AddTrigger(TriggerType.CampaignStart, 1, req.StageId);
|
||||
user.AddTrigger(Trigger.CampaignStart, 1, req.StageId);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -46,14 +46,14 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
}
|
||||
|
||||
|
||||
if (questData.next_quest_id > 0)
|
||||
if (questData.NextQuestId > 0)
|
||||
{
|
||||
NetUserFavoriteItemQuestData? nextQuest = user.FavoriteItemQuests.FirstOrDefault(q => q.QuestId == questData.next_quest_id);
|
||||
NetUserFavoriteItemQuestData? nextQuest = user.FavoriteItemQuests.FirstOrDefault(q => q.QuestId == questData.NextQuestId);
|
||||
if (nextQuest == null)
|
||||
{
|
||||
NetUserFavoriteItemQuestData newQuest = new NetUserFavoriteItemQuestData
|
||||
{
|
||||
QuestId = questData.next_quest_id,
|
||||
QuestId = questData.NextQuestId,
|
||||
Clear = false,
|
||||
Received = false
|
||||
};
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
|
||||
if (req.ItemData == null)
|
||||
{
|
||||
throw new BadHttpRequestException($"No material item provided", 400);
|
||||
throw new BadHttpRequestException($"No material item provIded", 400);
|
||||
}
|
||||
|
||||
ItemData? userItem = user.Items.FirstOrDefault(x => x.Isn == req.ItemData.Isn);
|
||||
@@ -51,15 +51,15 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
throw new BadHttpRequestException($"Cannot upgrade at current level with this material", 400);
|
||||
}
|
||||
|
||||
int baseExp = probabilityData.exp * req.LoopCount;
|
||||
bool isGreatSuccess = CheckGreatSuccess(probabilityData.great_success_rate);
|
||||
int baseExp = probabilityData.Exp * req.LoopCount;
|
||||
bool isGreatSuccess = CheckGreatSuccess(probabilityData.GreatSuccessRate);
|
||||
|
||||
int totalExpGained = baseExp;
|
||||
int targetLevel = favoriteItem.Lv;
|
||||
|
||||
if (isGreatSuccess)
|
||||
{
|
||||
targetLevel = probabilityData.great_success_level;
|
||||
targetLevel = probabilityData.GreatSuccessRate;
|
||||
}
|
||||
|
||||
int goldCost = baseExp * 10;
|
||||
@@ -103,9 +103,9 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
{
|
||||
foreach (var record in GameData.Instance.FavoriteItemProbabilityTable.Values)
|
||||
{
|
||||
if (record.need_item_id == materialId &&
|
||||
currentLevel >= record.level_min &&
|
||||
currentLevel <= record.level_max)
|
||||
if (record.NeedItemId == materialId &&
|
||||
currentLevel >= record.LevelMin &&
|
||||
currentLevel <= record.LevelMax)
|
||||
{
|
||||
return record;
|
||||
}
|
||||
@@ -125,31 +125,32 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
|
||||
if (!GameData.Instance.FavoriteItemTable.TryGetValue(favoriteItem.Tid, out FavoriteItemRecord? favoriteRecord))
|
||||
{
|
||||
var sampleTids = GameData.Instance.FavoriteItemTable.Keys.Take(5).ToList();
|
||||
var sampleTIds = GameData.Instance.FavoriteItemTable.Keys.Take(5).ToList();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
string itemRarity = favoriteRecord.favorite_rare;
|
||||
if (string.IsNullOrEmpty(itemRarity))
|
||||
var itemRarity = favoriteRecord.FavoriteRare;
|
||||
if (favoriteRecord.FavoriteRare == FavoriteItemRare.None)
|
||||
{
|
||||
// TODO: dont hardcode table ids
|
||||
if (favoriteItem.Tid >= 100102 && favoriteItem.Tid <= 100602 && favoriteItem.Tid % 100 == 2)
|
||||
{
|
||||
itemRarity = "SR";
|
||||
itemRarity = FavoriteItemRare.SR;
|
||||
}
|
||||
else if (favoriteItem.Tid >= 100101 && favoriteItem.Tid <= 100601 && favoriteItem.Tid % 100 == 1)
|
||||
{
|
||||
itemRarity = "R";
|
||||
itemRarity = FavoriteItemRare.R;
|
||||
}
|
||||
else if (favoriteItem.Tid >= 200101 && favoriteItem.Tid <= 201301 && favoriteItem.Tid % 100 == 1)
|
||||
{
|
||||
itemRarity = "SSR";
|
||||
itemRarity = FavoriteItemRare.SSR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (itemRarity == "SSR")
|
||||
if (itemRarity == FavoriteItemRare.SSR)
|
||||
{
|
||||
int ssrMaxLevel = 2; // SSR has levels 0, 1, 2
|
||||
|
||||
@@ -168,14 +169,14 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
}
|
||||
|
||||
var expRecords = GameData.Instance.FavoriteItemExpTable.Values
|
||||
.Where(x => x.favorite_rare == itemRarity)
|
||||
.OrderBy(x => x.level)
|
||||
.Where(x => x.FavoriteRare == itemRarity)
|
||||
.OrderBy(x => x.Level)
|
||||
.ToList();
|
||||
|
||||
|
||||
if (!expRecords.Any())
|
||||
{
|
||||
var allRarities = GameData.Instance.FavoriteItemExpTable.Values.Select(x => x.favorite_rare).Distinct();
|
||||
var allRarities = GameData.Instance.FavoriteItemExpTable.Values.Select(x => x.FavoriteRare).Distinct();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -206,8 +207,8 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
|
||||
private int GetExpRequiredForLevel(int level, List<FavoriteItemExpRecord> expRecords)
|
||||
{
|
||||
var record = expRecords.FirstOrDefault(x => x.level == level);
|
||||
return record?.need_exp ?? 0;
|
||||
var record = expRecords.FirstOrDefault(x => x.Level == level);
|
||||
return record?.NeedExp ?? 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,14 +24,14 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
throw new BadHttpRequestException("Quest not cleared or reward already received");
|
||||
}
|
||||
|
||||
List<CharacterRecord> characterRecords = GameData.Instance.CharacterTable.Values.Where(c => c.name_code == questData.name_code).ToList();
|
||||
List<CharacterRecord> characterRecords = GameData.Instance.CharacterTable.Values.Where(c => c.NameCode == questData.NameCode).ToList();
|
||||
if (!characterRecords.Any())
|
||||
{
|
||||
throw new Exception($"Failed to find character record with name_code: {questData.name_code}");
|
||||
throw new Exception($"Failed to find character record with NameCode: {questData.NameCode}");
|
||||
}
|
||||
|
||||
HashSet<int> characterTids = characterRecords.Select(c => c.id).ToHashSet();
|
||||
CharacterModel? character = user.Characters.FirstOrDefault(c => characterTids.Contains(c.Tid));
|
||||
HashSet<int> characterTIds = characterRecords.Select(c => c.Id).ToHashSet();
|
||||
CharacterModel? character = user.Characters.FirstOrDefault(c => characterTIds.Contains(c.Tid));
|
||||
|
||||
int characterCsn = 0;
|
||||
if (character != null)
|
||||
@@ -39,10 +39,10 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
characterCsn = character.Csn;
|
||||
}
|
||||
|
||||
RewardRecord ? reward = GameData.Instance.GetRewardTableEntry(questData.reward_id);
|
||||
if (reward?.rewards == null || reward.rewards.Count == 0 || reward.rewards[0].reward_type != RewardType.FavoriteItem)
|
||||
RewardRecord ? reward = GameData.Instance.GetRewardTableEntry(questData.RewardId);
|
||||
if (reward?.Rewards == null || reward.Rewards.Count == 0 || reward.Rewards[0].RewardType != RewardType.FavoriteItem)
|
||||
{
|
||||
if (questData.reward_id > 0 && reward != null)
|
||||
if (questData.RewardId > 0 && reward != null)
|
||||
{
|
||||
NetRewardData rewardData = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||
ResObtainFavoriteItemQuestReward genericResponse = new ResObtainFavoriteItemQuestReward { UserReward = rewardData };
|
||||
@@ -53,7 +53,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
}
|
||||
throw new Exception("FavoriteItem reward data not found for quest");
|
||||
}
|
||||
int newItemTid = reward.rewards[0].reward_id;
|
||||
int newItemTId = reward.Rewards[0].RewardId;
|
||||
|
||||
if (character != null)
|
||||
{
|
||||
@@ -68,7 +68,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
|
||||
if (character != null && finalRewardData.UserFavoriteItems.Count > 0)
|
||||
{
|
||||
var newFavoriteItem = user.FavoriteItems.LastOrDefault(f => f.Tid == newItemTid);
|
||||
var newFavoriteItem = user.FavoriteItems.LastOrDefault(f => f.Tid == newItemTId);
|
||||
if (newFavoriteItem != null)
|
||||
{
|
||||
newFavoriteItem.Csn = characterCsn; // Equip item by setting Csn
|
||||
|
||||
@@ -20,13 +20,13 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
throw new BadHttpRequestException("Favorite item not found", 400);
|
||||
}
|
||||
|
||||
int srItemTid = rFavoriteItem.Tid + 1;
|
||||
int srItemTId = rFavoriteItem.Tid + 1;
|
||||
|
||||
|
||||
NetUserFavoriteItemData? srInventoryItem = user.FavoriteItems.FirstOrDefault(f => f.Tid == srItemTid && f.Csn == 0);
|
||||
NetUserFavoriteItemData? srInventoryItem = user.FavoriteItems.FirstOrDefault(f => f.Tid == srItemTId && f.Csn == 0);
|
||||
if (srInventoryItem == null)
|
||||
{
|
||||
throw new BadHttpRequestException($"No SR-grade favorite item (TID: {srItemTid}) available in inventory for exchange", 400);
|
||||
throw new BadHttpRequestException($"No SR-grade favorite item (TID: {srItemTId}) available in inventory for exchange", 400);
|
||||
}
|
||||
|
||||
(int NewLevel, int RemainingExp, double ConversionRate) expConversion = CalculateExpConversion(rFavoriteItem.Lv, rFavoriteItem.Exp);
|
||||
@@ -43,7 +43,7 @@ namespace EpinelPS.LobbyServer.FavoriteItem
|
||||
NetUserFavoriteItemData newSrFavoriteItem = new NetUserFavoriteItemData
|
||||
{
|
||||
FavoriteItemId = user.GenerateUniqueItemId(),
|
||||
Tid = srItemTid,
|
||||
Tid = srItemTId,
|
||||
Csn = equippedCharacterCsn, // Maintain equipment status
|
||||
Lv = expConversion.NewLevel,
|
||||
Exp = expConversion.RemainingExp
|
||||
|
||||
@@ -32,18 +32,18 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
|
||||
List<CharacterRecord> entireallCharacterData = [.. GameData.Instance.CharacterTable.Values];
|
||||
// Remove the .Values part since it's already a list.
|
||||
// Group by name_code to treat same name_code as one character
|
||||
// Always add characters with grade_core_id == 1 and 101
|
||||
List<CharacterRecord> allCharacterData = [.. entireallCharacterData.GroupBy(c => c.name_code).SelectMany(g => g.Where(c => c.grade_core_id == 1 || c.grade_core_id == 101 || c.grade_core_id == 201 || c.name_code == 3999))];
|
||||
// Group by NameCode to treat same NameCode as one character
|
||||
// Always add characters with GradeCoreId == 1 and 101
|
||||
List<CharacterRecord> allCharacterData = [.. entireallCharacterData.GroupBy(c => c.NameCode).SelectMany(g => g.Where(c => c.GradeCoreId == 1 || c.GradeCoreId == 101 || c.GradeCoreId == 201 || c.NameCode == 3999))];
|
||||
|
||||
// Separate characters by rarity categories
|
||||
List<CharacterRecord> rCharacters = [.. allCharacterData.Where(c => c.original_rare == "R")];
|
||||
List<CharacterRecord> srCharacters = [.. allCharacterData.Where(c => c.original_rare == "SR")];
|
||||
List<CharacterRecord> rCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.R)];
|
||||
List<CharacterRecord> srCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.SR)];
|
||||
|
||||
// Separate Pilgrim SSRs and non-Pilgrim SSRs
|
||||
// treat overspec as pilgrim
|
||||
List<CharacterRecord> pilgrimCharacters = [.. allCharacterData.Where(c => (c.original_rare == "SSR" && c.corporation == "PILGRIM") || (c.original_rare == "SSR" && c.corporation_sub_type == "OVERSPEC"))];
|
||||
List<CharacterRecord> ssrCharacters = [.. allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation != "PILGRIM")];
|
||||
List<CharacterRecord> pilgrimCharacters = [.. allCharacterData.Where(c => (c.OriginalRare == OriginalRareType.SSR && c.Corporation == CorporationType.PILGRIM) || (c.OriginalRare == OriginalRareType.SSR && c.CorporationSubType == CorporationSubType.OVERSPEC))];
|
||||
List<CharacterRecord> ssrCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.SSR && c.Corporation != CorporationType.PILGRIM)];
|
||||
|
||||
List<CharacterRecord> selectedCharacters = [];
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
if (user.sickpulls)
|
||||
{
|
||||
// Old selection method: Randomly select characters based on req.Count value, excluding characters in the sickPullsExclusionList
|
||||
selectedCharacters = [.. allCharacterData.Where(c => !sickPullsExclusionList.Contains(c.id)).OrderBy(x => random.Next()).Take(numberOfPulls)]; // Exclude characters based on the exclusion list for sick pulls
|
||||
selectedCharacters = [.. allCharacterData.Where(c => !sickPullsExclusionList.Contains(c.Id)).OrderBy(x => random.Next()).Take(numberOfPulls)]; // Exclude characters based on the exclusion list for sick pulls
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -71,7 +71,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
{
|
||||
// PieceCount = 1, // Spare Body
|
||||
CurrencyValue = 0, // Body Label
|
||||
Tid = characterData.id,
|
||||
Tid = characterData.Id,
|
||||
Type = 1
|
||||
};
|
||||
|
||||
@@ -81,11 +81,11 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
// If not fully limit broken, add spare body item
|
||||
// If user does not have character, generate CSN and add character
|
||||
|
||||
if (user.HasCharacter(characterData.id))
|
||||
if (user.HasCharacter(characterData.Id))
|
||||
{
|
||||
CharacterModel character = user.GetCharacter(characterData.id) ?? throw new Exception("HasCharacter() returned true, however character was null");
|
||||
CharacterModel character = user.GetCharacter(characterData.Id) ?? throw new Exception("HasCharacter() returned true, however character was null");
|
||||
|
||||
ItemData? existingItem = user.Items.FirstOrDefault(item => item.ItemType == characterData.piece_id);
|
||||
ItemData? existingItem = user.Items.FirstOrDefault(item => item.ItemType == characterData.PieceId);
|
||||
|
||||
response.Characters.Add(new NetUserCharacterDefaultData()
|
||||
{
|
||||
@@ -96,16 +96,16 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
UltiSkillLv = character.UltimateLevel,
|
||||
Skill1Lv = character.Skill1Lvl,
|
||||
Skill2Lv = character.Skill2Lvl,
|
||||
Tid = characterData.id,
|
||||
Tid = characterData.Id,
|
||||
});
|
||||
|
||||
bool increase_item = false;
|
||||
|
||||
gacha.Sn = character.Csn;
|
||||
gacha.Tid = characterData.id;
|
||||
gacha.Tid = characterData.Id;
|
||||
|
||||
// Check if we can add upgrade item
|
||||
if (characterData.original_rare == "SR")
|
||||
if (characterData.OriginalRare == OriginalRareType.SR)
|
||||
{
|
||||
if (existingItem != null && character.Grade + existingItem.Count <= 1)
|
||||
{
|
||||
@@ -116,7 +116,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
increase_item = true;
|
||||
}
|
||||
}
|
||||
else if (characterData.original_rare == "SSR")
|
||||
else if (characterData.OriginalRare == OriginalRareType.SSR)
|
||||
{
|
||||
if (existingItem != null && character.Grade + existingItem.Count <= 10)
|
||||
{
|
||||
@@ -152,7 +152,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
// If the item does not exist, create a new item entry
|
||||
ItemData newItem = new()
|
||||
{
|
||||
ItemType = characterData.piece_id,
|
||||
ItemType = characterData.PieceId,
|
||||
Csn = 0,
|
||||
Count = 1, // or any relevant count
|
||||
Level = 0,
|
||||
@@ -178,7 +178,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
}
|
||||
else
|
||||
{
|
||||
gacha.CurrencyValue = characterData.original_rare == "SSR" ? 6000 : (characterData.original_rare == "SR" ? 200 : 150);
|
||||
gacha.CurrencyValue = characterData.OriginalRare == OriginalRareType.SSR ? 6000 : (characterData.OriginalRare == OriginalRareType.SR ? 200 : 150);
|
||||
user.AddCurrency(CurrencyType.DissolutionPoint, gacha.CurrencyValue);
|
||||
|
||||
totalBodyLabels += (int)gacha.CurrencyValue;
|
||||
@@ -196,7 +196,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
Lv = 1,
|
||||
Skill1Lv = 1,
|
||||
Skill2Lv = 1,
|
||||
Tid = characterData.id,
|
||||
Tid = characterData.Id,
|
||||
UltiSkillLv = 1
|
||||
});
|
||||
|
||||
@@ -208,25 +208,25 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
Level = 1,
|
||||
Skill1Lvl = 1,
|
||||
Skill2Lvl = 1,
|
||||
Tid = characterData.id,
|
||||
Tid = characterData.Id,
|
||||
UltimateLevel = 1
|
||||
});
|
||||
|
||||
// Add "New Character" Badge
|
||||
user.AddBadge(BadgeContents.NikkeNew, characterData.name_code.ToString());
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, characterData.name_code);
|
||||
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
|
||||
user.AddBadge(BadgeContents.NikkeNew, characterData.NameCode.ToString());
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, characterData.NameCode);
|
||||
user.AddTrigger(Trigger.ObtainCharacterNew, 1);
|
||||
|
||||
if (characterData.original_rare == "SSR" || characterData.original_rare == "SR")
|
||||
if (characterData.OriginalRare == OriginalRareType.SSR || characterData.OriginalRare == OriginalRareType.SR)
|
||||
{
|
||||
user.BondInfo.Add(new() { NameCode = characterData.name_code, Lv = 1 });
|
||||
user.BondInfo.Add(new() { NameCode = characterData.NameCode, Lv = 1 });
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
response.Gacha.Add(gacha);
|
||||
|
||||
user.AddTrigger(TriggerType.GachaCharacter, 0, 0);
|
||||
user.AddTrigger(Trigger.GachaCharacter, 0, 0);
|
||||
}
|
||||
int TicketType = req.CurrencyType;
|
||||
int currencyType = TicketType == 5100 ? (int)CurrencyType.SilverMileageTicket : (int)CurrencyType.GoldMileageTicket;
|
||||
@@ -245,14 +245,14 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
private static CharacterRecord SelectRandomCharacter(List<CharacterRecord> rCharacters,List<CharacterRecord> srCharacters,List<CharacterRecord> ssrCharacters,List<CharacterRecord> pilgrimCharacters,List<int> exclusionList,int increasedChanceCharacterID,List<CharacterRecord> allCharacterData)
|
||||
{
|
||||
// Remove excluded characters from each category
|
||||
List<CharacterRecord> availableRCharacters = [.. rCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableSRCharacters = [.. srCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableSSRCharacters = [.. ssrCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availablePilgrimCharacters = [.. pilgrimCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableRCharacters = [.. rCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availableSRCharacters = [.. srCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availableSSRCharacters = [.. ssrCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availablePilgrimCharacters = [.. pilgrimCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
|
||||
// Find the IncreasedChanceCharacterID in the SSR list
|
||||
CharacterRecord? increasedChanceCharacter = availableSSRCharacters.FirstOrDefault(c => c.id == increasedChanceCharacterID);
|
||||
bool isPilgrimOrOverspec = increasedChanceCharacter != null && (increasedChanceCharacter.corporation == "PILGRIM" || increasedChanceCharacter.corporation_sub_type == "OVERSPEC");
|
||||
CharacterRecord? increasedChanceCharacter = availableSSRCharacters.FirstOrDefault(c => c.Id == increasedChanceCharacterID);
|
||||
bool isPilgrimOrOverspec = increasedChanceCharacter != null && (increasedChanceCharacter.Corporation == CorporationType.PILGRIM || increasedChanceCharacter.CorporationSubType == CorporationSubType.OVERSPEC);
|
||||
|
||||
double increasedChance = increasedChanceCharacterID != 1 ? (isPilgrimOrOverspec ? 1.0 : 2.0): 0.0;
|
||||
|
||||
|
||||
@@ -28,17 +28,17 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
|
||||
List<CharacterRecord> entireallCharacterData = [.. GameData.Instance.CharacterTable.Values];
|
||||
// Remove the .Values part since it's already a list.
|
||||
// Group by name_code to treat same name_code as one character
|
||||
// Always add characters with grade_core_id == 1 and 101
|
||||
List<CharacterRecord> allCharacterData = [.. entireallCharacterData.GroupBy(c => c.name_code).SelectMany(g => g.Where(c => c.grade_core_id == 1 || c.grade_core_id == 101 || c.grade_core_id == 201 || c.name_code == 3999))];
|
||||
// Group by NameCode to treat same NameCode as one character
|
||||
// Always add characters with GradeCoreId == 1 and 101
|
||||
List<CharacterRecord> allCharacterData = [.. entireallCharacterData.GroupBy(c => c.NameCode).SelectMany(g => g.Where(c => c.GradeCoreId == 1 || c.GradeCoreId == 101 || c.GradeCoreId == 201 || c.NameCode == 3999))];
|
||||
|
||||
// Separate characters by rarity categories
|
||||
List<CharacterRecord> rCharacters = [.. allCharacterData.Where(c => c.original_rare == "R" )];
|
||||
List<CharacterRecord> srCharacters = [.. allCharacterData.Where(c => c.original_rare == "SR")];
|
||||
List<CharacterRecord> rCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.R )];
|
||||
List<CharacterRecord> srCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.SR)];
|
||||
|
||||
// Separate Pilgrim SSRs and non-Pilgrim SSRs
|
||||
List<CharacterRecord> pilgrimCharacters = [.. allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation == "PILGRIM")];
|
||||
List<CharacterRecord> ssrCharacters = [.. allCharacterData.Where(c => c.original_rare == "SSR" && c.corporation != "PILGRIM")];
|
||||
List<CharacterRecord> pilgrimCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.SSR && c.Corporation == CorporationType.PILGRIM)];
|
||||
List<CharacterRecord> ssrCharacters = [.. allCharacterData.Where(c => c.OriginalRare == OriginalRareType.SSR && c.Corporation != CorporationType.PILGRIM)];
|
||||
|
||||
List<CharacterRecord> selectedCharacters = [];
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
if (user.sickpulls)
|
||||
{
|
||||
// Old selection method: Randomly select characters based on req.Count value, excluding characters in the sickPullsExclusionList
|
||||
selectedCharacters = [.. allCharacterData.Where(c => !sickPullsExclusionList.Contains(c.id)).OrderBy(x => random.Next()).Take(numberOfPulls)]; // Exclude characters based on the exclusion list for sick pulls
|
||||
selectedCharacters = [.. allCharacterData.Where(c => !sickPullsExclusionList.Contains(c.Id)).OrderBy(x => random.Next()).Take(numberOfPulls)]; // Exclude characters based on the exclusion list for sick pulls
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -63,7 +63,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
foreach (CharacterRecord characterData in selectedCharacters)
|
||||
{
|
||||
// Check if the item for this character already exists in user.Items based on ItemType
|
||||
ItemData? existingItem = user.Items.FirstOrDefault(item => item.ItemType == characterData.piece_id);
|
||||
ItemData? existingItem = user.Items.FirstOrDefault(item => item.ItemType == characterData.PieceId);
|
||||
|
||||
if (existingItem != null)
|
||||
{
|
||||
@@ -87,7 +87,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
// If the item does not exist, create a new item entry
|
||||
ItemData newItem = new()
|
||||
{
|
||||
ItemType = characterData.piece_id,
|
||||
ItemType = characterData.PieceId,
|
||||
Csn = 0,
|
||||
Count = 1, // or any relevant count
|
||||
Level = 0,
|
||||
@@ -115,18 +115,18 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
// Populate the 2D array with characterId and pieceId for each selected character
|
||||
foreach (CharacterRecord characterData in selectedCharacters)
|
||||
{
|
||||
int characterId = characterData.id;
|
||||
int pieceId = characterData.piece_id;
|
||||
int characterId = characterData.Id;
|
||||
int pieceId = characterData.PieceId;
|
||||
|
||||
// Store characterId and pieceId in the array
|
||||
pieceIds.Add(Tuple.Create(characterId, pieceId));
|
||||
int id = user.GenerateUniqueCharacterId();
|
||||
int Id = user.GenerateUniqueCharacterId();
|
||||
response.Gacha.Add(new NetGachaEntityData()
|
||||
{
|
||||
Corporation = 1,
|
||||
PieceCount = 1,
|
||||
CurrencyValue = 5,
|
||||
Sn = id,
|
||||
Sn = Id,
|
||||
Tid = characterId,
|
||||
Type = 1
|
||||
});
|
||||
@@ -137,7 +137,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
response.Characters.Add(new NetUserCharacterDefaultData()
|
||||
{
|
||||
CostumeId = 0,
|
||||
Csn = id,
|
||||
Csn = Id,
|
||||
Grade = 0,
|
||||
Lv = 1,
|
||||
Skill1Lv = 1,
|
||||
@@ -149,7 +149,7 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
user.Characters.Add(new CharacterModel()
|
||||
{
|
||||
CostumeId = 0,
|
||||
Csn = id,
|
||||
Csn = Id,
|
||||
Grade = 0,
|
||||
Level = 1,
|
||||
Skill1Lvl = 1,
|
||||
@@ -171,10 +171,10 @@ namespace EpinelPS.LobbyServer.Gacha
|
||||
private CharacterRecord SelectRandomCharacter(List<CharacterRecord> rCharacters, List<CharacterRecord> srCharacters, List<CharacterRecord> ssrCharacters, List<CharacterRecord> pilgrimCharacters, List<int> exclusionList)
|
||||
{
|
||||
// Remove excluded characters from each category
|
||||
List<CharacterRecord> availableRCharacters = [.. rCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableSRCharacters = [.. srCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableSSRCharacters = [.. ssrCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availablePilgrimCharacters = [.. pilgrimCharacters.Where(c => !exclusionList.Contains(c.id))];
|
||||
List<CharacterRecord> availableRCharacters = [.. rCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availableSRCharacters = [.. srCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availableSSRCharacters = [.. ssrCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
List<CharacterRecord> availablePilgrimCharacters = [.. pilgrimCharacters.Where(c => !exclusionList.Contains(c.Id))];
|
||||
|
||||
// Each time we call this method, a new category will be selected for a single character
|
||||
double roll = random.NextDouble() * 100; // Roll from 0 to 100
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace EpinelPS.LobbyServer
|
||||
ResetHour = JsonDb.Instance.ResetHourUtcTime,
|
||||
CheatShiftDuration = Duration.FromTimeSpan(TimeSpan.FromSeconds(0))
|
||||
};
|
||||
// todo: validate response with actual server
|
||||
// todo: valIdate response with actual server
|
||||
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace EpinelPS.LobbyServer.Intercept
|
||||
BonusReward = sRes.BonusReward
|
||||
};
|
||||
|
||||
user.AddTrigger(Data.TriggerType.InterceptClear, 1);
|
||||
user.AddTrigger(Data.Trigger.InterceptClear, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace EpinelPS.LobbyServer.Intercept
|
||||
|
||||
ResEnterIntercept response = new();
|
||||
|
||||
user.AddTrigger(Data.TriggerType.InterceptStart, 1);
|
||||
user.AddTrigger(Data.Trigger.InterceptStart, 1);
|
||||
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
if (item.Csn == req.Csn)
|
||||
{
|
||||
// update character id
|
||||
// update character Id
|
||||
item.Csn = 0;
|
||||
|
||||
response.Items.Add(NetUtils.ToNet(item));
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
if (item.Isn == req.Isn)
|
||||
{
|
||||
// update character id
|
||||
// update character Id
|
||||
item.Csn = 0;
|
||||
|
||||
response.Item = NetUtils.ToNet(item);
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
item.Csn = item.CsnList[0];
|
||||
if (GameData.Instance.ItemHarmonyCubeTable.TryGetValue(item.ItemType, out var harmonyCubeData))
|
||||
{
|
||||
item.Position = harmonyCubeData.location_id;
|
||||
item.Position = harmonyCubeData.LocationId;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -68,20 +68,20 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
(int exp, int modules) AddExp(NetItemData srcItem, ItemData destItem)
|
||||
{
|
||||
int[] maxLevel = [0, 0, 3, 3, 4, 4, 5, 5, 5, 5];
|
||||
ItemEquipRecord? srcEquipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.id == srcItem.Tid);
|
||||
ItemEquipRecord destEquipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.id == destItem.ItemType) ?? throw new NullReferenceException();;
|
||||
ItemEquipRecord? srcEquipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.Id == srcItem.Tid);
|
||||
ItemEquipRecord destEquipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.Id == destItem.ItemType) ?? throw new NullReferenceException();;
|
||||
int[] expNextTable = [.. GameData.Instance.itemEquipExpTable.Values
|
||||
.Where(x => x.item_rare == destEquipRecord.item_rare)
|
||||
.Select(x => x.exp)
|
||||
.Where(x => x.ItemRare == destEquipRecord.ItemRare)
|
||||
.Select(x => x.Exp)
|
||||
.OrderBy(x => x)];
|
||||
int exp = 0;
|
||||
int modules = 0;
|
||||
|
||||
if (srcEquipRecord != null)
|
||||
{
|
||||
ItemEquipGradeExpRecord levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.grade_core_id == srcEquipRecord.grade_core_id) ?? throw new NullReferenceException();;
|
||||
ItemEquipGradeExpRecord levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.GradeCoreId == srcEquipRecord.GradeCoreId) ?? throw new NullReferenceException();;
|
||||
|
||||
exp = srcItem.Count * levelRecord.exp;
|
||||
exp = srcItem.Count * levelRecord.Exp;
|
||||
|
||||
destItem.Exp += exp;
|
||||
}
|
||||
@@ -102,13 +102,13 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
// TODO: double-check this. is this a thing?
|
||||
// destItem.Exp += GetSourceExp(srcItem);
|
||||
|
||||
while (destItem.Level < maxLevel[destEquipRecord.grade_core_id - 1] && destItem.Exp >= expNextTable[destItem.Level + 1] && destItem.Level < maxLevel[destEquipRecord.grade_core_id - 1])
|
||||
while (destItem.Level < maxLevel[destEquipRecord.GradeCoreId - 1] && destItem.Exp >= expNextTable[destItem.Level + 1] && destItem.Level < maxLevel[destEquipRecord.GradeCoreId - 1])
|
||||
{
|
||||
destItem.Exp -= expNextTable[destItem.Level + 1];
|
||||
destItem.Level++;
|
||||
}
|
||||
|
||||
if (destItem.Level >= maxLevel[destEquipRecord.grade_core_id - 1])
|
||||
if (destItem.Level >= maxLevel[destEquipRecord.GradeCoreId - 1])
|
||||
{
|
||||
modules = destItem.Exp; // TODO: check this. is the ratio actually 1:1?
|
||||
destItem.Exp = 0;
|
||||
@@ -120,11 +120,11 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
private int GetSourceExp(NetItemData srcItem)
|
||||
{
|
||||
ItemData item = GetUser().Items.FirstOrDefault(x => x.Isn == srcItem.Isn) ?? throw new NullReferenceException();
|
||||
ItemEquipRecord equipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.id == item.ItemType) ?? throw new NullReferenceException();
|
||||
ItemEquipGradeExpRecord? levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.grade_core_id == equipRecord.grade_core_id);
|
||||
ItemEquipRecord equipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.Id == item.ItemType) ?? throw new NullReferenceException();
|
||||
ItemEquipGradeExpRecord? levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.GradeCoreId == equipRecord.GradeCoreId);
|
||||
int[] expNextTable = [.. GameData.Instance.itemEquipExpTable.Values
|
||||
.Where(x => x.item_rare == equipRecord.item_rare)
|
||||
.Select(x => x.exp)];
|
||||
.Where(x => x.ItemRare == equipRecord.ItemRare)
|
||||
.Select(x => x.Exp)];
|
||||
int level = item.Level;
|
||||
int exp = item.Exp;
|
||||
|
||||
@@ -139,11 +139,11 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
private static int CalcTotalExp(ItemData destItem)
|
||||
{
|
||||
int exp = 0;
|
||||
ItemEquipRecord equipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.id == destItem.ItemType) ?? throw new NullReferenceException();
|
||||
ItemEquipGradeExpRecord? levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.grade_core_id == equipRecord.grade_core_id);
|
||||
ItemEquipRecord equipRecord = GameData.Instance.ItemEquipTable.Values.FirstOrDefault(x => x.Id == destItem.ItemType) ?? throw new NullReferenceException();
|
||||
ItemEquipGradeExpRecord? levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.GradeCoreId == equipRecord.GradeCoreId);
|
||||
int[] expNextTable = [.. GameData.Instance.itemEquipExpTable.Values
|
||||
.Where(x => x.item_rare == equipRecord.item_rare)
|
||||
.Select(x => x.exp)];
|
||||
.Where(x => x.ItemRare == equipRecord.ItemRare)
|
||||
.Select(x => x.Exp)];
|
||||
|
||||
// skip the first level, it's unused
|
||||
for (int i = 1; i < expNextTable.Length; i++)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using EpinelPS.Database;
|
||||
using EpinelPS.Data;
|
||||
using EpinelPS.Utils;
|
||||
using static EpinelPS.Data.TriggerType;
|
||||
using static EpinelPS.Data.Trigger;
|
||||
|
||||
namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
@@ -27,8 +27,8 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
}
|
||||
|
||||
List<ItemHarmonyCubeLevelRecord> levelData = GameData.Instance.ItemHarmonyCubeLevelTable.Values
|
||||
.Where(x => x.level_enhance_id == harmonyCubeData.level_enhance_id)
|
||||
.OrderBy(x => x.level)
|
||||
.Where(x => x.LevelEnhanceId == harmonyCubeData.LevelEnhanceId)
|
||||
.OrderBy(x => x.Level)
|
||||
.ToList();
|
||||
|
||||
if (levelData.Count == 0)
|
||||
@@ -36,21 +36,21 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
throw new BadHttpRequestException("No level data found for this harmony cube", 400);
|
||||
}
|
||||
|
||||
ItemHarmonyCubeLevelRecord? currentLevelData = levelData.FirstOrDefault(x => x.level == harmonyCubeItem.Level);
|
||||
ItemHarmonyCubeLevelRecord? currentLevelData = levelData.FirstOrDefault(x => x.Level == harmonyCubeItem.Level);
|
||||
if (currentLevelData == null)
|
||||
{
|
||||
throw new BadHttpRequestException("Current level data not found", 400);
|
||||
}
|
||||
|
||||
ItemHarmonyCubeLevelRecord? nextLevelData = levelData.FirstOrDefault(x => x.level == harmonyCubeItem.Level + 1);
|
||||
ItemHarmonyCubeLevelRecord? nextLevelData = levelData.FirstOrDefault(x => x.Level == harmonyCubeItem.Level + 1);
|
||||
if (nextLevelData == null)
|
||||
{
|
||||
throw new BadHttpRequestException("Harmony cube is already at max level", 400);
|
||||
}
|
||||
|
||||
int requiredMaterialCount = nextLevelData.material_value;
|
||||
int requiredMaterialId = nextLevelData.material_id;
|
||||
int requiredGold = nextLevelData.gold_value;
|
||||
int requiredMaterialCount = nextLevelData.MaterialValue;
|
||||
int requiredMaterialId = nextLevelData.MaterialId;
|
||||
int requiredGold = nextLevelData.GoldValue;
|
||||
|
||||
ItemData? materialItem = user.Items.FirstOrDefault(x => x.ItemType == requiredMaterialId && x.Count >= requiredMaterialCount);
|
||||
if (materialItem == null)
|
||||
@@ -79,11 +79,11 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
harmonyCubeItem.Level++;
|
||||
harmonyCubeItem.Exp = 0; // Reset exp for the new level
|
||||
|
||||
user.AddTrigger(TriggerType.HarmonyCubeLevel, harmonyCubeItem.Level, harmonyCubeItem.ItemType);
|
||||
user.AddTrigger(Trigger.HarmonyCubeLevel, harmonyCubeItem.Level, harmonyCubeItem.ItemType);
|
||||
|
||||
if (harmonyCubeItem.Level >= levelData.Count)
|
||||
{
|
||||
user.AddTrigger(TriggerType.HarmonyCubeLevelMax, 1, harmonyCubeItem.ItemType);
|
||||
user.AddTrigger(Trigger.HarmonyCubeLevelMax, 1, harmonyCubeItem.ItemType);
|
||||
}
|
||||
|
||||
response.Items.Add(NetUtils.ToNet(harmonyCubeItem));
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
}
|
||||
|
||||
ItemHarmonyCubeLevelRecord? currentLevelData = GetCurrentLevelData(harmonyCubeItem, harmonyCubeData);
|
||||
int maxSlots = currentLevelData?.slot ?? 1;
|
||||
int maxSlots = currentLevelData?.Slot ?? 1;
|
||||
|
||||
foreach (long clearCsn in req.Clears)
|
||||
{
|
||||
@@ -119,14 +119,14 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
throw new BadHttpRequestException($"Character class incompatible with harmony cube", 400);
|
||||
}
|
||||
|
||||
CleanupCharacterFromAllHarmonyCubes(user, targetCsn, harmonyCubeData.location_id, harmonyCubeItem.Isn);
|
||||
CleanupCharacterFromAllHarmonyCubes(user, targetCsn, harmonyCubeData.LocationId, harmonyCubeItem.Isn);
|
||||
|
||||
harmonyCubeItem.CsnList.Add(targetCsn);
|
||||
|
||||
if (harmonyCubeItem.CsnList.Count == 1)
|
||||
{
|
||||
harmonyCubeItem.Csn = targetCsn;
|
||||
harmonyCubeItem.Position = harmonyCubeData.location_id;
|
||||
harmonyCubeItem.Position = harmonyCubeData.LocationId;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -156,7 +156,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
if (item.CsnList.Count > 0)
|
||||
{
|
||||
item.Csn = item.CsnList[0];
|
||||
item.Position = existingHarmonyCubeData.location_id;
|
||||
item.Position = existingHarmonyCubeData.LocationId;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -171,18 +171,18 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
private ItemHarmonyCubeLevelRecord? GetCurrentLevelData(ItemData harmonyCubeItem, ItemHarmonyCubeRecord harmonyCubeData)
|
||||
{
|
||||
List<ItemHarmonyCubeLevelRecord> levelData = GameData.Instance.ItemHarmonyCubeLevelTable.Values
|
||||
.Where(x => x.level_enhance_id == harmonyCubeData.level_enhance_id)
|
||||
.OrderBy(x => x.level)
|
||||
.Where(x => x.LevelEnhanceId == harmonyCubeData.LevelEnhanceId)
|
||||
.OrderBy(x => x.Level)
|
||||
.ToList();
|
||||
|
||||
return levelData.FirstOrDefault(x => x.level == harmonyCubeItem.Level);
|
||||
return levelData.FirstOrDefault(x => x.Level == harmonyCubeItem.Level);
|
||||
}
|
||||
|
||||
private bool IsClassCompatible(CharacterModel character, ItemHarmonyCubeRecord harmonyCubeData)
|
||||
{
|
||||
if (GameData.Instance.CharacterTable.TryGetValue(character.Tid, out CharacterRecord? characterData))
|
||||
{
|
||||
return harmonyCubeData.@class == "All" || harmonyCubeData.@class == characterData.character_class;
|
||||
return harmonyCubeData.Class == CharacterClassType.All || harmonyCubeData.Class == characterData.Class;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
// TODO: If this process takes too long, consider to avoid using function chain.
|
||||
// TODO: If this process takes too long, consIder to avoId using function chain.
|
||||
/*
|
||||
* Req Contains:
|
||||
* Isn: long value, the item serial number of the piece
|
||||
@@ -28,29 +28,29 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
if (piece.Count == 0) user.Items.Remove(piece);
|
||||
|
||||
ItemPieceRecord? pItem = GameData.Instance.PieceItems
|
||||
.FirstOrDefault(x => x.Value.id == piece.ItemType).Value
|
||||
?? throw new Exception("cannot find piece id " + piece.ItemType);
|
||||
.FirstOrDefault(x => x.Value.Id == piece.ItemType).Value
|
||||
?? throw new Exception("cannot find piece Id " + piece.ItemType);
|
||||
|
||||
IEnumerable<GachaListProbRecord> probList = GameData.Instance.GachaGradeProb
|
||||
.Where(x => x.Key == pItem.use_id)
|
||||
.SelectMany(grade => GameData.Instance.GachaListProb.Where(list => list.Value.group_id == grade.Value.gacha_list_id))
|
||||
.Where(x => x.Key == pItem.UseId)
|
||||
.SelectMany(grade => GameData.Instance.GachaListProb.Where(list => list.Value.GroupId == grade.Value.GachaListId))
|
||||
.Select(i => i.Value);
|
||||
IEnumerable<CharacterRecord> allCharacters = probList.SelectMany(e => GameData.Instance.CharacterTable.Values.Where(c => c.id == e.gacha_id));
|
||||
IEnumerable<CharacterRecord> allCharacters = probList.SelectMany(e => GameData.Instance.CharacterTable.Values.Where(c => c.Id == e.GachaId));
|
||||
|
||||
NetRewardData reward = new();
|
||||
IEnumerable<CharacterRecord> selectedCharacters = Enumerable.Range(1, req.Count)
|
||||
.Select(_ => SelectRandomCharacter(allCharacters, pItem.id));
|
||||
.Select(_ => SelectRandomCharacter(allCharacters, pItem.Id));
|
||||
|
||||
int totalBodyLabels = 0;
|
||||
foreach (CharacterRecord? character in selectedCharacters)
|
||||
{
|
||||
ItemData? spareItem = user.Items.FirstOrDefault(i => i.ItemType == character.piece_id);
|
||||
ItemData? spareItem = user.Items.FirstOrDefault(i => i.ItemType == character.PieceId);
|
||||
|
||||
if (user.GetCharacter(character.id) is CharacterModel ownedCharacter)
|
||||
if (user.GetCharacter(character.Id) is CharacterModel ownedCharacter)
|
||||
{
|
||||
// If the character already exists, we can increase its piece count
|
||||
int maxLimitBroken = GetValueByRarity(character.original_rare, 0, 2, 11);
|
||||
bool canIncreaseItem = character.original_rare != "R" && ownedCharacter.Grade + (spareItem?.Count ?? 0) < maxLimitBroken;
|
||||
int maxLimitBroken = GetValueByRarity(character.OriginalRare, 0, 2, 11);
|
||||
bool canIncreaseItem = character.OriginalRare != OriginalRareType.R && ownedCharacter.Grade + (spareItem?.Count ?? 0) < maxLimitBroken;
|
||||
(int newSpareItemCount, int dissoluteCharacterCount) = canIncreaseItem ? (1, 0) : (0, 1);
|
||||
if (canIncreaseItem)
|
||||
{
|
||||
@@ -62,7 +62,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
spareItem = new()
|
||||
{
|
||||
ItemType = character.piece_id,
|
||||
ItemType = character.PieceId,
|
||||
Csn = 0,
|
||||
Count = newSpareItemCount,
|
||||
Level = 0,
|
||||
@@ -80,7 +80,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
else
|
||||
{
|
||||
// If we cannot increase the item, we give body label instead
|
||||
int bodyLabel = GetValueByRarity(character.original_rare, 150, 200, 6000);
|
||||
int bodyLabel = GetValueByRarity(character.OriginalRare, 150, 200, 6000);
|
||||
totalBodyLabels += bodyLabel * dissoluteCharacterCount;
|
||||
reward.Character.Add(GetNetCharacterData(ownedCharacter, bodyLabel));
|
||||
}
|
||||
@@ -96,13 +96,13 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
Lv = 1,
|
||||
Skill1Lv = 1,
|
||||
Skill2Lv = 1,
|
||||
Tid = character.id,
|
||||
Tid = character.Id,
|
||||
UltiSkillLv = 1
|
||||
});
|
||||
reward.Character.Add(new NetCharacterData
|
||||
{
|
||||
Csn = user.GenerateUniqueCharacterId(),
|
||||
Tid = character.id,
|
||||
Tid = character.Id,
|
||||
});
|
||||
user.Characters.Add(new CharacterModel
|
||||
{
|
||||
@@ -112,29 +112,29 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
Level = 1,
|
||||
Skill1Lvl = 1,
|
||||
Skill2Lvl = 1,
|
||||
Tid = character.id,
|
||||
Tid = character.Id,
|
||||
UltimateLevel = 1
|
||||
});
|
||||
|
||||
// Add "New Character" Badge
|
||||
user.AddBadge(BadgeContents.NikkeNew, character.name_code.ToString());
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, character.name_code);
|
||||
if (character.original_rare == "SSR")
|
||||
user.AddBadge(BadgeContents.NikkeNew, character.NameCode.ToString());
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, character.NameCode);
|
||||
if (character.OriginalRare == OriginalRareType.SR)
|
||||
{
|
||||
user.AddTrigger(TriggerType.ObtainCharacterSSR, 1);
|
||||
user.AddTrigger(Trigger.ObtainCharacterSSR, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
|
||||
user.AddTrigger(Trigger.ObtainCharacterNew, 1);
|
||||
}
|
||||
|
||||
if (character.original_rare == "SSR" || character.original_rare == "SR")
|
||||
if (character.OriginalRare == OriginalRareType.SSR || character.OriginalRare == OriginalRareType.SR)
|
||||
{
|
||||
user.BondInfo.Add(new() { NameCode = character.name_code, Lv = 1 });
|
||||
user.BondInfo.Add(new() { NameCode = character.NameCode, Lv = 1 });
|
||||
}
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.GachaCharacter, 0, 0);
|
||||
user.AddTrigger(Trigger.GachaCharacter, 0, 0);
|
||||
}
|
||||
|
||||
reward.Currency.Add(new NetCurrencyData() { Type = (int)CurrencyType.DissolutionPoint, Value = totalBodyLabels });
|
||||
@@ -151,9 +151,9 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
private CharacterRecord SelectRandomCharacter(IEnumerable<CharacterRecord> characters, int pieceId)
|
||||
{
|
||||
PieceGradeProb gradeProb = GetPieceGradeProb(pieceId);
|
||||
IEnumerable<CharacterRecord> rCharacters = characters.Where(c => c.original_rare == "R");
|
||||
IEnumerable<CharacterRecord> srCharacters = characters.Where(c => c.original_rare == "SR");
|
||||
IEnumerable<CharacterRecord> ssrCharacters = characters.Where(c => c.original_rare == "SSR");
|
||||
IEnumerable<CharacterRecord> rCharacters = characters.Where(c => c.OriginalRare == OriginalRareType.R);
|
||||
IEnumerable<CharacterRecord> srCharacters = characters.Where(c => c.OriginalRare == OriginalRareType.SR);
|
||||
IEnumerable<CharacterRecord> ssrCharacters = characters.Where(c => c.OriginalRare == OriginalRareType.SSR);
|
||||
|
||||
double roll = random.NextDouble() * 100;
|
||||
|
||||
@@ -182,15 +182,15 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
5310301 => new PieceGradeProb(0.0, 38.9997, 61.0003), // High quality Mold
|
||||
5310302 or 5310303 or 5310304 or 5310305 => new PieceGradeProb(19.9998, 29.9997, 50.0005), // Manufacturer Mold
|
||||
5310306 or 5310307 or 5310308 or 5310309 => new PieceGradeProb(0.0, 0.0, 100.0), // New Commander Mold or Perfect Mold
|
||||
5330201 or 5359001 => new PieceGradeProb(0.0, 78.9993, 21.0007), // Mid quality Mold
|
||||
_ => throw new Exception("unknown piece id")
|
||||
5330201 or 5359001 => new PieceGradeProb(0.0, 78.9993, 21.0007), // MId quality Mold
|
||||
_ => throw new Exception("unknown piece Id")
|
||||
};
|
||||
|
||||
private int GetValueByRarity(string rarity, int rValue, int srValue, int ssrValue) => rarity switch
|
||||
private int GetValueByRarity(OriginalRareType rarity, int rValue, int srValue, int ssrValue) => rarity switch
|
||||
{
|
||||
"R" => rValue,
|
||||
"SR" => srValue,
|
||||
"SSR" => ssrValue,
|
||||
OriginalRareType.R => rValue,
|
||||
OriginalRareType.SR => srValue,
|
||||
OriginalRareType.SSR => ssrValue,
|
||||
_ => throw new Exception($"Unknown character rarity: {rarity}")
|
||||
};
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
|
||||
response.Reward = NetUtils.UseLootBox(user, box.ItemType, req.Count);
|
||||
|
||||
// update client side box count
|
||||
// update client sIde box count
|
||||
response.Reward.UserItems.Add(NetUtils.UserItemDataToNet(box));
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -25,23 +25,23 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
if (timeReward.Count == 0) user.Items.Remove(timeReward);
|
||||
|
||||
ItemConsumeRecord? cItem = GameData.Instance.ConsumableItems
|
||||
.FirstOrDefault(x => x.Value.id == timeReward.ItemType).Value
|
||||
?? throw new Exception("cannot find box id " + timeReward.ItemType);
|
||||
.FirstOrDefault(x => x.Value.Id == timeReward.ItemType).Value
|
||||
?? throw new Exception("cannot find box Id " + timeReward.ItemType);
|
||||
|
||||
// TODO: find out where these numbers come from
|
||||
(CurrencyType itemType, long amount) = cItem.use_id switch
|
||||
(CurrencyType itemType, long amount) = cItem.UseId switch
|
||||
{
|
||||
1 => (CurrencyType.Gold, NetUtils.GetOutpostRewardAmount(user, CurrencyType.Gold, TimeSpan.FromSeconds(cItem.use_value).TotalMinutes, false)),
|
||||
2 => (CurrencyType.CharacterExp, NetUtils.GetOutpostRewardAmount(user, CurrencyType.CharacterExp, TimeSpan.FromSeconds(cItem.use_value).TotalMinutes, false)),
|
||||
4 => (CurrencyType.CharacterExp2, NetUtils.GetOutpostRewardAmount(user, CurrencyType.CharacterExp2, TimeSpan.FromSeconds(cItem.use_value).TotalMinutes, false)),
|
||||
_ => throw new Exception("unknown use_id " + cItem.use_id)
|
||||
1 => (CurrencyType.Gold, NetUtils.GetOutpostRewardAmount(user, CurrencyType.Gold, TimeSpan.FromSeconds(cItem.UseValue).TotalMinutes, false)),
|
||||
2 => (CurrencyType.CharacterExp, NetUtils.GetOutpostRewardAmount(user, CurrencyType.CharacterExp, TimeSpan.FromSeconds(cItem.UseValue).TotalMinutes, false)),
|
||||
4 => (CurrencyType.CharacterExp2, NetUtils.GetOutpostRewardAmount(user, CurrencyType.CharacterExp2, TimeSpan.FromSeconds(cItem.UseValue).TotalMinutes, false)),
|
||||
_ => throw new Exception("unknown UseId " + cItem.UseId)
|
||||
};
|
||||
|
||||
NetRewardData reward = new();
|
||||
RewardUtils.AddSingleCurrencyObject(user, ref reward, itemType, amount);
|
||||
|
||||
response.Reward = reward;
|
||||
// update client side item count
|
||||
// update client sIde item count
|
||||
response.Reward.UserItems.Add(NetUtils.UserItemDataToNet(timeReward));
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
if (item.Isn == req.Isn)
|
||||
{
|
||||
// update character id
|
||||
// update character Id
|
||||
item.Csn = req.Csn;
|
||||
item.Position = pos;
|
||||
response.Items.Add(NetUtils.ToNet(item));
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
long swapCsn = req.Wear.SwapCsn;
|
||||
|
||||
ItemHarmonyCubeLevelRecord? currentLevelData = GetCurrentLevelData(harmonyCubeItem, harmonyCubeData);
|
||||
int maxSlots = currentLevelData?.slot ?? 1;
|
||||
int maxSlots = currentLevelData?.Slot ?? 1;
|
||||
|
||||
if (swapCsn > 0)
|
||||
{
|
||||
@@ -63,7 +63,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BadHttpRequestException("Invalid character CSN", 400);
|
||||
throw new BadHttpRequestException("InvalId character CSN", 400);
|
||||
}
|
||||
|
||||
foreach (ItemData modifiedItem in modifiedItems)
|
||||
@@ -142,7 +142,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
|
||||
// CRITICAL: Remove this character from ALL harmony cubes at the same position
|
||||
// This fixes any existing data inconsistency where a character might be in multiple CsnLists
|
||||
List<ItemData> modifiedItems = CleanupCharacterFromAllHarmonyCubes(user, targetCsn, harmonyCubeData.location_id, harmonyCubeItem.Isn);
|
||||
List<ItemData> modifiedItems = CleanupCharacterFromAllHarmonyCubes(user, targetCsn, harmonyCubeData.LocationId, harmonyCubeItem.Isn);
|
||||
|
||||
// Add to CsnList
|
||||
harmonyCubeItem.CsnList.Add(targetCsn);
|
||||
@@ -151,7 +151,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
if (harmonyCubeItem.CsnList.Count == 1)
|
||||
{
|
||||
harmonyCubeItem.Csn = targetCsn;
|
||||
harmonyCubeItem.Position = harmonyCubeData.location_id;
|
||||
harmonyCubeItem.Position = harmonyCubeData.LocationId;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Equipped harmony cube {harmonyCubeItem.ItemType} to character {targetCsn} for user {user.Username} (slot {harmonyCubeItem.CsnList.Count}/{maxSlots})");
|
||||
@@ -195,7 +195,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
// Set legacy fields to the first remaining character
|
||||
item.Csn = item.CsnList[0];
|
||||
item.Position = existingHarmonyCubeData.location_id;
|
||||
item.Position = existingHarmonyCubeData.LocationId;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -207,7 +207,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
// Add to modified items list for response
|
||||
modifiedItems.Add(item);
|
||||
|
||||
Console.WriteLine($"[ONE HARMONY CUBE RULE] Removed character {targetCsn} from harmony cube {item.ItemType} (position {existingHarmonyCubeData.location_id}) - one character can only have one harmony cube");
|
||||
Console.WriteLine($"[ONE HARMONY CUBE RULE] Removed character {targetCsn} from harmony cube {item.ItemType} (position {existingHarmonyCubeData.LocationId}) - one character can only have one harmony cube");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,12 +218,12 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
{
|
||||
// Get level data for this harmony cube
|
||||
List<ItemHarmonyCubeLevelRecord> levelData = GameData.Instance.ItemHarmonyCubeLevelTable.Values
|
||||
.Where(x => x.level_enhance_id == harmonyCubeData.level_enhance_id)
|
||||
.OrderBy(x => x.level)
|
||||
.Where(x => x.LevelEnhanceId == harmonyCubeData.LevelEnhanceId)
|
||||
.OrderBy(x => x.Level)
|
||||
.ToList();
|
||||
|
||||
// Find current level data
|
||||
return levelData.FirstOrDefault(x => x.level == harmonyCubeItem.Level);
|
||||
return levelData.FirstOrDefault(x => x.Level == harmonyCubeItem.Level);
|
||||
}
|
||||
|
||||
private bool IsClassCompatible(CharacterModel character, ItemHarmonyCubeRecord harmonyCubeData)
|
||||
@@ -232,7 +232,7 @@ namespace EpinelPS.LobbyServer.Inventory
|
||||
if (GameData.Instance.CharacterTable.TryGetValue(character.Tid, out CharacterRecord? characterData))
|
||||
{
|
||||
// Check if harmony cube class restriction matches character class
|
||||
return harmonyCubeData.@class == "All" || harmonyCubeData.@class == characterData.character_class;
|
||||
return harmonyCubeData.Class == CharacterClassType.All || harmonyCubeData.Class == characterData.Class;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ using EpinelPS.Utils;
|
||||
|
||||
namespace EpinelPS.LobbyServer.Jukebox
|
||||
{
|
||||
[PacketPath("/jukebox/set/tableid")]
|
||||
[PacketPath("/jukebox/set/tableId")]
|
||||
public class SetTableId : LobbyMsgHandler
|
||||
{
|
||||
protected override async Task HandleAsync()
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace EpinelPS.LobbyServer
|
||||
/// </summary>
|
||||
/// <param name="publicKey"></param>
|
||||
/// <returns></returns>
|
||||
public static GameClientInfo GenGameClientTok(ByteString publicKey, ulong userid)
|
||||
public static GameClientInfo GenGameClientTok(ByteString publicKey, ulong userId)
|
||||
{
|
||||
string token = Rng.RandomString(381);
|
||||
|
||||
@@ -86,10 +86,10 @@ namespace EpinelPS.LobbyServer
|
||||
info.Keys = box;
|
||||
info.ClientAuthToken = token;
|
||||
|
||||
if (userid == 0)
|
||||
if (userId == 0)
|
||||
throw new Exception("expected user account");
|
||||
|
||||
info.UserId = userid;
|
||||
info.UserId = userId;
|
||||
|
||||
return info;
|
||||
}
|
||||
@@ -127,7 +127,7 @@ namespace EpinelPS.LobbyServer
|
||||
|
||||
|
||||
// Restore completed tutorials.
|
||||
foreach (KeyValuePair<int, Data.ClearedTutorialData> item in user.ClearedTutorialData)
|
||||
foreach (KeyValuePair<int, ClearedTutorialData> item in user.ClearedTutorialData)
|
||||
{
|
||||
int groupId = item.Value.GroupId;
|
||||
int version = item.Value.VersionGroup;
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace EpinelPS.LobbyServer
|
||||
.WithKey(JsonDb.Instance.LauncherTokenKey, Encryption.SymmetricKey)
|
||||
.Decode(authToken, new PasetoTokenValidationParameters() { ValidateLifetime = true });
|
||||
|
||||
UserId = ((System.Text.Json.JsonElement)encryptionToken.Paseto.Payload["userid"]).GetUInt64();
|
||||
UserId = ((System.Text.Json.JsonElement)encryptionToken.Paseto.Payload["userId"]).GetUInt64();
|
||||
|
||||
if (UserId == 0) throw new Exception("403");
|
||||
await HandleAsync();
|
||||
@@ -144,9 +144,9 @@ namespace EpinelPS.LobbyServer
|
||||
{
|
||||
return JsonDb.GetUser(UserId) ?? throw new Exception("null user");
|
||||
}
|
||||
public User? GetUser(ulong id)
|
||||
public User? GetUser(ulong Id)
|
||||
{
|
||||
return JsonDb.GetUser(id);
|
||||
return JsonDb.GetUser(Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace EpinelPS.LobbyServer.LobbyUser
|
||||
Msn = 3,
|
||||
Nickname = "nick",
|
||||
Title = new() { IsPlain = true, Str = "Our Server Fell" },
|
||||
Text = new() { IsPlain = true, Str = "Our Game Was Down For 1 Second because the HP Laptop Which Hosted the Server Got Shut Down by the Lid Closing. As for the Reward for the Inconvience, free paid gems" },
|
||||
Text = new() { IsPlain = true, Str = "Our Game Was Down For 1 Second because the HP Laptop Which Hosted the Server Got Shut Down by the LId Closing. As for the Reward for the Inconvience, free paId gems" },
|
||||
HasReward = true,
|
||||
Sender = 102
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@ namespace EpinelPS.LobbyServer.LobbyUser
|
||||
ReqGetProfileFrame req = await ReadData<ReqGetProfileFrame>();
|
||||
ResGetProfileFrame response = new();
|
||||
|
||||
foreach (UserFrameTableRecord frameRecord in GameData.Instance.userFrameTable.Values)
|
||||
foreach (var frameRecord in GameData.Instance.userFrameTable.Values)
|
||||
{
|
||||
response.Frames.Add(frameRecord.id);
|
||||
response.Frames.Add(frameRecord.Id);
|
||||
}
|
||||
|
||||
await WriteDataAsync(response);
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace EpinelPS.LobbyServer.LobbyUser
|
||||
response.LastClearedNormalMainStageId = user.LastNormalStageCleared;
|
||||
|
||||
// Restore completed tutorials. GroupID is the first 4 digits of the Table ID.
|
||||
foreach (KeyValuePair<int, Data.ClearedTutorialData> item in user.ClearedTutorialData)
|
||||
foreach (KeyValuePair<int, ClearedTutorialData> item in user.ClearedTutorialData)
|
||||
{
|
||||
int groupId = item.Value.GroupId;
|
||||
int version = item.Value.VersionGroup;
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.LobbyUser
|
||||
|
||||
// Fetch all the wallpaper IDs from the LiveWallpaperTable,
|
||||
// excluding records where livewallpaper_type is "SkillCutScene"
|
||||
List<int> wallpaperIds = [.. GameData.Instance.lwptablemgrs.Where(w => w.Value.livewallpaper_type != "SkillCutScene").Select(w => w.Key)];
|
||||
List<int> wallpaperIds = [.. GameData.Instance.lwptablemgrs.Where(w => w.Value.LivewallpaperType != Livewallpaper_type.SkillCutScene).Select(w => w.Key)];
|
||||
|
||||
// Add the filtered wallpaper IDs to the LivewallpaperIds field
|
||||
r.LivewallpaperIds.AddRange(wallpaperIds);
|
||||
|
||||
@@ -19,9 +19,9 @@ namespace EpinelPS.LobbyServer.LobbyUser
|
||||
|
||||
user.CompletedScenarios.Add(req.ScenarioId);
|
||||
|
||||
if (GameData.Instance.ScenarioRewards.TryGetValue(req.ScenarioId, out ScenarioRewardRecord? record))
|
||||
if (GameData.Instance.ScenarioRewards.TryGetValue(req.ScenarioId, out ScenarioRewardsRecord? record))
|
||||
{
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, record.reward_id);
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, record.RewardId);
|
||||
}
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -14,9 +14,17 @@ namespace EpinelPS.LobbyServer.LobbyUser.Tutorial
|
||||
|
||||
if (!user.ClearedTutorialData.ContainsKey(req.LastClearedTid))
|
||||
{
|
||||
ClearedTutorialData cleared = GameData.Instance.GetTutorialDataById(req.LastClearedTid);
|
||||
cleared.id = req.LastClearedTid;
|
||||
user.ClearedTutorialData.Add(req.LastClearedTid, cleared);
|
||||
var cleared = GameData.Instance.GetTutorialDataById(req.LastClearedTid);
|
||||
cleared.Id = req.LastClearedTid;
|
||||
user.ClearedTutorialData.Add(req.LastClearedTid, new ClearedTutorialData()
|
||||
{
|
||||
ClearedStageId = cleared.ClearedStageId,
|
||||
GroupId = cleared.GroupId,
|
||||
Id = cleared.GroupId,
|
||||
NextId = cleared.NextId,
|
||||
SaveTutorial = cleared.SaveTutorial,
|
||||
VersionGroup = cleared.VersionGroup
|
||||
});
|
||||
}
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -26,17 +26,17 @@ namespace EpinelPS.LobbyServer.Lostsector
|
||||
|
||||
public static void ClearLostSectorStage(User user, int stageId)
|
||||
{
|
||||
// get lost sector id from stage id
|
||||
int sector = GameData.Instance.LostSectorStages[stageId].sector;
|
||||
// get lost sector Id from stage Id
|
||||
int sector = GameData.Instance.LostSectorStages[stageId].Sector;
|
||||
|
||||
// get position ID from stage id in map data
|
||||
// get position ID from stage Id in map data
|
||||
|
||||
LostSectorRecord sectorData = GameData.Instance.LostSector[sector];
|
||||
MapInfo mapInfo = GameData.Instance.MapData[sectorData.field_id];
|
||||
var mapInfo = GameData.Instance.MapData[sectorData.FieldId];
|
||||
|
||||
StageSpawner stage = mapInfo.StageSpawner.Where(x => x.stageId == stageId).FirstOrDefault() ?? throw new Exception("cannot find stage in map data");
|
||||
var stage = mapInfo.StageSpawner.Where(x => x.StageId == stageId).FirstOrDefault() ?? throw new Exception("cannot find stage in map data");
|
||||
|
||||
user.LostSectorData[sector].ClearedStages.Add(stage.positionId, stageId);
|
||||
user.LostSectorData[sector].ClearedStages.Add(stage.PositionId, stageId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,14 +15,14 @@ namespace EpinelPS.LobbyServer.Lostsector
|
||||
|
||||
foreach (KeyValuePair<int, LostSectorRecord> item in GameData.Instance.LostSector)
|
||||
{
|
||||
if (item.Value.open_condition_type == ContentOpenType.Stage && user.IsStageCompleted(item.Value.open_condition_value))
|
||||
if (item.Value.OpenConditionType == ContentOpenType.Stage && user.IsStageCompleted(item.Value.OpenConditionValue))
|
||||
{
|
||||
response.ClearStages.Add(new NetFieldStageData() { StageId = item.Value.open_condition_value });
|
||||
response.ClearStages.Add(new NetFieldStageData() { StageId = item.Value.OpenConditionValue });
|
||||
}
|
||||
|
||||
if (user.LostSectorData.TryGetValue(item.Key, out LostSectorData? val))
|
||||
{
|
||||
MapInfo map = GameData.Instance.MapData[item.Value.field_id];
|
||||
var map = GameData.Instance.MapData[item.Value.FieldId];
|
||||
response.LostSector.Add(new NetUserLostSectorData()
|
||||
{
|
||||
IsOpen = val.IsOpen,
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Lostsector
|
||||
|
||||
LostSectorRecord sectorInfo = GameData.Instance.LostSector[req.SectorId];
|
||||
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, sectorInfo.exploration_reward);
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, sectorInfo.ExplorationReward);
|
||||
}
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -24,16 +24,16 @@ namespace EpinelPS.LobbyServer.Lostsector
|
||||
|
||||
|
||||
// Get map info
|
||||
MapInfo map = GameData.Instance.MapData[GameData.Instance.LostSector[req.SectorId].field_id];
|
||||
var map = GameData.Instance.MapData[GameData.Instance.LostSector[req.SectorId].FieldId];
|
||||
|
||||
// find reward
|
||||
ItemSpawner rewardEntry = map.ItemSpawner.Where(x => x.positionId == req.Object.PositionId).FirstOrDefault() ?? throw new Exception("cannot find reward");
|
||||
var rewardEntry = map.ItemSpawner.Where(x => x.PositionId == req.Object.PositionId).FirstOrDefault() ?? throw new Exception("cannot find reward");
|
||||
|
||||
FieldItemRecord positionReward = GameData.Instance.FieldItems[rewardEntry.itemId];
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, positionReward.type_value);
|
||||
FieldItemRecord positionReward = GameData.Instance.FieldItems[rewardEntry.ItemId];
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, positionReward.TypeValue);
|
||||
response.BoxCount = lostSectorUser.ObtainedRewards;
|
||||
|
||||
if (positionReward.is_final_reward)
|
||||
if (positionReward.IsFinalReward)
|
||||
{
|
||||
lostSectorUser.RecievedFinalReward = true;
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
ResEnterSubQuestFinMessengerDialog response = new();
|
||||
|
||||
KeyValuePair<int, SubquestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.Value.end_messenger_conversation_id && x.Value.is_opener).First();
|
||||
KeyValuePair<int, SubQuestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.ConversationId == opener.Value.EndMessengerConversationId && x.Value.IsOpener).First();
|
||||
|
||||
response.Message = user.CreateMessage(conversation.Value, 1);
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -14,28 +14,28 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
ResEnterMessengerDialog response = new();
|
||||
|
||||
if (!GameData.Instance.MessageConditions.TryGetValue(req.Tid, out MessengerMsgConditionRecord? opener))
|
||||
if (!GameData.Instance.MessageConditions.TryGetValue(req.Tid, out MessengerConditionTriggerRecord? opener))
|
||||
{
|
||||
throw new BadHttpRequestException($"Message condition {req.Tid} not found", 404);
|
||||
}
|
||||
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.FirstOrDefault(x =>
|
||||
x.Value.conversation_id == opener.tid && x.Value.is_opener);
|
||||
x.Value.ConversationId == opener.Tid && x.Value.IsOpener);
|
||||
|
||||
if (conversation.Value == null)
|
||||
{
|
||||
conversation = GameData.Instance.Messages.FirstOrDefault(x =>
|
||||
x.Value.conversation_id == opener.tid);
|
||||
x.Value.ConversationId == opener.Tid);
|
||||
|
||||
if (conversation.Value == null)
|
||||
{
|
||||
throw new BadHttpRequestException($"No conversation found for {opener.tid}", 404);
|
||||
throw new BadHttpRequestException($"No conversation found for {opener.Tid}", 404);
|
||||
}
|
||||
}
|
||||
|
||||
response.Message = user.CreateMessage(conversation.Value);
|
||||
|
||||
user.AddTrigger(TriggerType.MessageClear, 1, req.Tid); // TODO check if this is correct
|
||||
user.AddTrigger(Trigger.MessageClear, 1, req.Tid); // TODO check if this is correct
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
ResEnterSubQuestMessengerDialog response = new();
|
||||
|
||||
KeyValuePair<int, SubquestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.Value.conversation_id && x.Value.is_opener).First();
|
||||
KeyValuePair<int, SubQuestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.ConversationId == opener.Value.ConversationId && x.Value.IsOpener).First();
|
||||
|
||||
response.Message = user.CreateMessage(conversation.Value);
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -14,10 +14,10 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
ResFinSubQuest response = new();
|
||||
|
||||
KeyValuePair<int, SubquestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.id == req.MessageId).First();
|
||||
KeyValuePair<int, SubQuestRecord> opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.Where(x => x.Value.Id == req.MessageId).First();
|
||||
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(conversation.Value.reward_id) ?? throw new Exception("unable to lookup reward");
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(conversation.Value.RewardId) ?? throw new Exception("unable to lookup reward");
|
||||
|
||||
user.SetSubQuest(req.SubQuestId, true);
|
||||
|
||||
|
||||
@@ -27,18 +27,18 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
private static void CheckAndCreateAvailableMessages(User user)
|
||||
{
|
||||
foreach (KeyValuePair<int, MessengerMsgConditionRecord> messageCondition in GameData.Instance.MessageConditions)
|
||||
foreach (KeyValuePair<int, MessengerConditionTriggerRecord> messageCondition in GameData.Instance.MessageConditions)
|
||||
{
|
||||
int conditionId = messageCondition.Key;
|
||||
MessengerMsgConditionRecord msgCondition = messageCondition.Value;
|
||||
MessengerConditionTriggerRecord msgCondition = messageCondition.Value;
|
||||
|
||||
if (IsMessageConditionSatisfied(user, conditionId))
|
||||
{
|
||||
bool messageExists = user.MessengerData.Any(m => m.ConversationId == msgCondition.tid);
|
||||
bool messageExists = user.MessengerData.Any(m => m.ConversationId == msgCondition.Tid);
|
||||
if (!messageExists)
|
||||
{
|
||||
KeyValuePair<string, MessengerDialogRecord> conversation = GameData.Instance.Messages.FirstOrDefault(x =>
|
||||
x.Value.conversation_id == msgCondition.tid && x.Value.is_opener);
|
||||
x.Value.ConversationId == msgCondition.Tid && x.Value.IsOpener);
|
||||
|
||||
if (conversation.Value != null)
|
||||
{
|
||||
@@ -51,14 +51,14 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
private static bool IsMessageConditionSatisfied(User user, int conditionId)
|
||||
{
|
||||
if (!GameData.Instance.MessageConditions.TryGetValue(conditionId, out MessengerMsgConditionRecord? msgCondition))
|
||||
if (!GameData.Instance.MessageConditions.TryGetValue(conditionId, out MessengerConditionTriggerRecord? msgCondition))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (MessengerConditionTriggerList trigger in msgCondition.trigger_list)
|
||||
foreach (TriggerData trigger in msgCondition.TriggerList)
|
||||
{
|
||||
if (trigger.trigger == "None" || trigger.condition_id == 0)
|
||||
if (trigger.Trigger == Data.Trigger.None || trigger.ConditionId == 0)
|
||||
continue;
|
||||
|
||||
if (!CheckTriggerCondition(user, trigger))
|
||||
@@ -70,25 +70,12 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool CheckTriggerCondition(User user, MessengerConditionTriggerList trigger)
|
||||
private static bool CheckTriggerCondition(User user, TriggerData trigger)
|
||||
{
|
||||
TriggerType triggerType = ParseTriggerType(trigger.trigger);
|
||||
|
||||
return user.Triggers.Any(t =>
|
||||
t.Type == triggerType &&
|
||||
t.ConditionId == trigger.condition_id &&
|
||||
t.Value >= trigger.condition_value);
|
||||
}
|
||||
|
||||
private static TriggerType ParseTriggerType(string triggerString)
|
||||
{
|
||||
return triggerString switch
|
||||
{
|
||||
"ObtainCharacter" => TriggerType.ObtainCharacter,
|
||||
"MainQuestClear" => TriggerType.MainQuestClear,
|
||||
"MessageClear" => TriggerType.MessageClear,
|
||||
_ => TriggerType.None
|
||||
};
|
||||
t.Type == trigger.Trigger &&
|
||||
t.ConditionId == trigger.ConditionId &&
|
||||
t.Value >= trigger.ConditionValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ namespace EpinelPS.LobbyServer.Messenger
|
||||
|
||||
KeyValuePair<string, MessengerDialogRecord> msgToSave = GameData.Instance.Messages.Where(x => x.Key == req.MessageId).First();
|
||||
|
||||
response.Message = user.CreateMessage(msgToSave.Value.conversation_id, req.MessageId);
|
||||
response.Message = user.CreateMessage(msgToSave.Value.ConversationId, req.MessageId);
|
||||
|
||||
if (msgToSave.Value.reward_id != 0)
|
||||
if (msgToSave.Value.RewardId != 0)
|
||||
{
|
||||
Logging.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.reward_id + " Message ID: " + req.MessageId, LogType.Warning);
|
||||
Logging.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.RewardId + " Message ID: " + req.MessageId, LogType.Warning);
|
||||
}
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
@@ -18,12 +18,12 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
foreach (var missionId in request.MissionIds)
|
||||
{
|
||||
var mission = GameData.Instance.EventMvgMissionTable[missionId];
|
||||
user.ArcadeInTheMirrorData.AchievementMissions.First(m => m.MissionId == mission.id).IsReceived = true;
|
||||
user.ArcadeInTheMirrorData.AchievementMissions.First(m => m.MissionId == mission.Id).IsReceived = true;
|
||||
|
||||
var achievement_mission = GameData.Instance.EventMvgMissionTable.First(m => m.Key > mission.id && m.Value.condition_type == EventMVGMissionConditionType.ClearAchievement);
|
||||
var achievement_mission = GameData.Instance.EventMvgMissionTable.First(m => m.Key > mission.Id && m.Value.ConditionType == EventMVGMissionConditionType.ClearAchievement);
|
||||
user.ArcadeInTheMirrorData.AchievementMissions.First(m => m.MissionId == achievement_mission.Key).Progress++;
|
||||
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, mission.reward_id));
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, mission.RewardId));
|
||||
}
|
||||
|
||||
var response = new ResObtainArcadeMvgAchievementMissionReward() { Reward = NetUtils.MergeRewards(rewards, user) };
|
||||
|
||||
@@ -18,11 +18,11 @@ namespace EpinelPS.LobbyServer.Minigame.InTheMirror
|
||||
foreach (var questId in request.QuestIds)
|
||||
{
|
||||
var quest = GameData.Instance.EventMvgQuestTable[questId];
|
||||
if (quest.id != 0)
|
||||
if (quest.Id != 0)
|
||||
{
|
||||
user.ArcadeInTheMirrorData.Quests.First(q => q.QuestId == quest.id).IsReceived = true;
|
||||
user.ArcadeInTheMirrorData.Quests.First(q => q.QuestId == quest.Id).IsReceived = true;
|
||||
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, quest.reward_id));
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, quest.RewardId));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,19 +16,19 @@ namespace EpinelPS.LobbyServer.Minigame.InTheMirror
|
||||
foreach (var questData in user.ArcadeInTheMirrorData.Quests.Where(q => q.IsReceived == false))
|
||||
{
|
||||
var quest = GameData.Instance.EventMvgQuestTable[questData.QuestId];
|
||||
if (quest.reward_id != 0)
|
||||
if (quest.RewardId != 0)
|
||||
{
|
||||
foreach (var rewardEntry in GameData.Instance.RewardDataRecords[quest.reward_id].rewards ??= [])
|
||||
foreach (var rewardEntry in GameData.Instance.RewardDataRecords[quest.RewardId].Rewards ??= [])
|
||||
{
|
||||
if (rewardEntry.reward_type != RewardType.None)
|
||||
if (rewardEntry.RewardType != RewardType.None)
|
||||
{
|
||||
switch (rewardEntry.reward_id)
|
||||
switch (rewardEntry.RewardId)
|
||||
{
|
||||
case 9810003:
|
||||
user.ArcadeInTheMirrorData.Gold += rewardEntry.reward_value;
|
||||
user.ArcadeInTheMirrorData.Gold += rewardEntry.RewardValue;
|
||||
break;
|
||||
case 9811001:
|
||||
user.ArcadeInTheMirrorData.Core += rewardEntry.reward_value;
|
||||
user.ArcadeInTheMirrorData.Core += rewardEntry.RewardValue;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
|
||||
var user = GetUser();
|
||||
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.game_type == EventPlaySodaGameType.CatchCoin).Key;
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.GameType == EventPlaySodaGameType.CatchCoin).Key;
|
||||
|
||||
var arcadePlaySodaInfo = user.ArcadePlaySodaInfoList.First(i => i.ChallengeStageId == challengeStageId);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
|
||||
var user = GetUser();
|
||||
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.game_type == EventPlaySodaGameType.Climbing).Key;
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.GameType == EventPlaySodaGameType.Climbing).Key;
|
||||
|
||||
var arcadePlaySodaInfo = user.ArcadePlaySodaInfoList.First(i => i.ChallengeStageId == challengeStageId);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
|
||||
var user = GetUser();
|
||||
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.game_type == EventPlaySodaGameType.Running).Key;
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.GameType == EventPlaySodaGameType.Running).Key;
|
||||
|
||||
var arcadePlaySodaInfo = user.ArcadePlaySodaInfoList.First(i => i.ChallengeStageId == challengeStageId);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
|
||||
var user = GetUser();
|
||||
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.game_type == EventPlaySodaGameType.Smash).Key;
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.GameType == EventPlaySodaGameType.Smash).Key;
|
||||
|
||||
var arcadePlaySodaInfo = user.ArcadePlaySodaInfoList.First(i => i.ChallengeStageId == challengeStageId);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
|
||||
var user = GetUser();
|
||||
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.game_type == EventPlaySodaGameType.StackUp).Key;
|
||||
var challengeStageId = GameData.Instance.EventPlaySodaChallengeModeTable.First(i => i.Value.GameType == EventPlaySodaGameType.StackUp).Key;
|
||||
|
||||
var arcadePlaySodaInfo = user.ArcadePlaySodaInfoList.First(i => i.ChallengeStageId == challengeStageId);
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace EpinelPS.LobbyServer.Minigame.PlaySoda
|
||||
while (pointValues.Length > arcadePlaySodaInfo.LastRewardStep && arcadePlaySodaInfo.AccumulatedScore >= pointValues[arcadePlaySodaInfo.LastRewardStep])
|
||||
{
|
||||
arcadePlaySodaInfo.LastRewardStep++;
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, GameData.Instance.EventPlaySodaPointRewardTable.First(r => (int)r.Value.game_type == arcadePlaySodaInfo.ChallengeStageId && r.Value.step == arcadePlaySodaInfo.LastRewardStep && r.Value.point_value == pointValues[arcadePlaySodaInfo.LastRewardStep - 1]).Value.reward_id));
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, GameData.Instance.EventPlaySodaPointRewardTable.First(r => (int)r.Value.GameType == arcadePlaySodaInfo.ChallengeStageId && r.Value.Step == arcadePlaySodaInfo.LastRewardStep && r.Value.PointValue == pointValues[arcadePlaySodaInfo.LastRewardStep - 1]).Value.RewardId));
|
||||
}
|
||||
|
||||
await WriteDataAsync(new ResObtainArcadePlaySodaPointReward() { LastRewardStep = arcadePlaySodaInfo.LastRewardStep, Reward = NetUtils.MergeRewards(rewards, user) });
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.Misc
|
||||
if (user.GachaTutorialPlayCount > 0)
|
||||
response.Unavailables.Add(3);
|
||||
|
||||
// TODO: Validate response from real server and pull info from user info
|
||||
// TODO: ValIdate response from real server and pull info from user info
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using EpinelPS.Utils;
|
||||
//idk why i did this but it still works as long as IsWhitelisted is set to true
|
||||
//Idk why i dId this but it still works as long as IsWhitelisted is set to true
|
||||
namespace EpinelPS.LobbyServer.Misc
|
||||
{
|
||||
[PacketPath("/maintenancenotice")]
|
||||
@@ -8,7 +8,7 @@ namespace EpinelPS.LobbyServer.Misc
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
ReqMaintenanceNotice req = await ReadData<ReqMaintenanceNotice>(); // field string OpenId
|
||||
string oid = req.OpenId;
|
||||
string oId = req.OpenId;
|
||||
|
||||
// Create a new instance of ResMaintenanceNotice
|
||||
ResMaintenanceNotice r = new()
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace EpinelPS.LobbyServer.Mission
|
||||
|
||||
if (!GameData.Instance.TriggerTable.TryGetValue(item, out TriggerRecord? key)) throw new Exception("unknown TID");
|
||||
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.RewardId) ?? throw new Exception("unable to lookup reward");
|
||||
|
||||
NetRewardData reward = RewardUtils.RegisterRewardsForUser(user, rewardRecord);
|
||||
rewards.Add(reward);
|
||||
@@ -34,7 +34,7 @@ namespace EpinelPS.LobbyServer.Mission
|
||||
total_points++;
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.PointRewardAchievement, total_points);
|
||||
user.AddTrigger(Trigger.PointRewardAchievement, total_points);
|
||||
|
||||
response.Reward = NetUtils.MergeRewards(rewards, user);
|
||||
|
||||
|
||||
@@ -30,20 +30,20 @@ namespace EpinelPS.LobbyServer.Mission
|
||||
|
||||
user.ResetableData.CompletedDailyMissions.Add(item);
|
||||
|
||||
if (key.reward_id != 0)
|
||||
if (key.RewardId != 0)
|
||||
{
|
||||
// Actual reward
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.RewardId) ?? throw new Exception("unable to lookup reward");
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Point reward
|
||||
total_points += key.point_value;
|
||||
total_points += key.PointValue;
|
||||
}
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.PointRewardDaily, total_points);
|
||||
user.AddTrigger(Trigger.PointRewardDaily, total_points);
|
||||
user.ResetableData.DailyMissionPoints += total_points;
|
||||
|
||||
response.Reward = NetUtils.MergeRewards(rewards, user);
|
||||
|
||||
@@ -26,20 +26,20 @@ namespace EpinelPS.LobbyServer.Mission
|
||||
|
||||
user.WeeklyResetableData.CompletedWeeklyMissions.Add(item);
|
||||
|
||||
if (key.reward_id != 0)
|
||||
if (key.RewardId != 0)
|
||||
{
|
||||
// Actual reward
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward");
|
||||
RewardRecord rewardRecord = GameData.Instance.GetRewardTableEntry(key.RewardId) ?? throw new Exception("unable to lookup reward");
|
||||
rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Point reward
|
||||
total_points += key.point_value;
|
||||
total_points += key.PointValue;
|
||||
}
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.PointRewardWeekly, total_points);
|
||||
user.AddTrigger(Trigger.PointRewardWeekly, total_points);
|
||||
user.WeeklyResetableData.WeeklyMissionPoints += total_points;
|
||||
|
||||
response.Reward = NetUtils.MergeRewards(rewards, user);
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
// test data
|
||||
return buildingId switch
|
||||
{
|
||||
// bulidding (22xxx)
|
||||
// bulIdding (22xxx)
|
||||
22401 => new BuildingCost { Gold = 1000, BuildTimeMinutes = 5 },
|
||||
22701 => new BuildingCost { Gold = 2000, BuildTimeMinutes = 10 },
|
||||
22801 => new BuildingCost { Gold = 1500, BuildTimeMinutes = 8 },
|
||||
@@ -30,7 +30,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
23400 => new BuildingCost { Gold = 2000, BuildTimeMinutes = 10 },
|
||||
23500 => new BuildingCost { Gold = 1800, BuildTimeMinutes = 9 },
|
||||
|
||||
// bulidding (10xxx-12xxx)
|
||||
// bulIdding (10xxx-12xxx)
|
||||
10100 => new BuildingCost { Gold = 500, BuildTimeMinutes = 3 },
|
||||
10200 => new BuildingCost { Gold = 800, BuildTimeMinutes = 5 },
|
||||
10300 => new BuildingCost { Gold = 1200, BuildTimeMinutes = 7 },
|
||||
|
||||
@@ -17,10 +17,10 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
|
||||
int currentLevel = user.InfraCoreLvl;
|
||||
|
||||
Dictionary<int, InfracoreRecord> gradeTable = GameData.Instance.InfracoreTable;
|
||||
Dictionary<int, InfraCoreGradeRecord> gradeTable = GameData.Instance.InfracoreTable;
|
||||
if (gradeTable.TryGetValue(currentLevel, out var gradeData))
|
||||
{
|
||||
if (gradeData.reward_id > 0)
|
||||
if (gradeData.RewardId > 0)
|
||||
{
|
||||
isReceived = user.InfraCoreRewardReceived.ContainsKey(currentLevel) && user.InfraCoreRewardReceived[currentLevel];
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
ClearLessonTid = req.LessonTid
|
||||
};
|
||||
|
||||
TacticAcademyLessonRecord x = GameData.Instance.GetTacticAcademyLesson(req.LessonTid);
|
||||
TacticAcademyFunctionRecord x = GameData.Instance.GetTacticAcademyLesson(req.LessonTid);
|
||||
|
||||
if (user.CanSubtractCurrency((CurrencyType)x.currency_id, x.currency_value))
|
||||
if (user.CanSubtractCurrency((CurrencyType)x.CurrencyId, x.CurrencyValue))
|
||||
{
|
||||
user.SubtractCurrency((CurrencyType)x.currency_id, x.currency_value);
|
||||
user.SubtractCurrency((CurrencyType)x.CurrencyId, x.CurrencyValue);
|
||||
|
||||
user.CompletedTacticAcademyLessons.Add(req.LessonTid);
|
||||
|
||||
@@ -40,27 +40,27 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
|
||||
private static void ProcessLessonReward(User user, TacticAcademyLessonRecord r)
|
||||
private static void ProcessLessonReward(User user, TacticAcademyFunctionRecord r)
|
||||
{
|
||||
if (r.lesson_reward == null)
|
||||
if (r.LessonReward == null)
|
||||
{
|
||||
Console.WriteLine("Warning: lesson_reward shouldnt be null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (r.lesson_type == "OutpostBattle")
|
||||
if (r.LessonType == LessonType.OutpostBattle)
|
||||
{
|
||||
foreach (TacticAcademyLessonReward item in r.lesson_reward)
|
||||
foreach (var item in r.LessonReward)
|
||||
{
|
||||
if (item.lesson_reward_id != 0 && item.lesson_reward_value != 0)
|
||||
if (item.LessonRewardId != 0 && item.LessonRewardValue != 0)
|
||||
{
|
||||
user.OutpostBuffs.GetPercentages((CurrencyType)item.lesson_reward_id).Add(item.lesson_reward_value);
|
||||
user.OutpostBuffs.GetPercentages((CurrencyType)item.LessonRewardId).Add(item.LessonRewardValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Warning: unknown lesson type: " + r.lesson_type);
|
||||
Console.WriteLine("Warning: unknown lesson type: " + r.LessonType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
response.Currencies.Add(new NetUserCurrencyData() { Type = (int)item.Key, Value = item.Value});
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.OutpostFastBattleReward, 1);
|
||||
user.AddTrigger(Trigger.OutpostFastBattleReward, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
new NetJukeboxPlaylistSong { JukeboxTableId = 9020001, Order = 902 }
|
||||
}
|
||||
},
|
||||
// JukeboxPlaylistUid = 123456789 // Assign a static UID, if required
|
||||
// JukeboxPlaylistUId = 123456789 // Assign a static UID, if required
|
||||
};
|
||||
|
||||
// Send the response
|
||||
|
||||
@@ -15,10 +15,10 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
|
||||
int currentLevel = user.InfraCoreLvl;
|
||||
|
||||
Dictionary<int, InfracoreRecord> gradeTable = GameData.Instance.InfracoreTable;
|
||||
Dictionary<int, InfraCoreGradeRecord> gradeTable = GameData.Instance.InfracoreTable;
|
||||
if (gradeTable.TryGetValue(currentLevel, out var gradeData))
|
||||
{
|
||||
if (gradeData.reward_id > 0)
|
||||
if (gradeData.RewardId > 0)
|
||||
{
|
||||
bool isReceived = user.InfraCoreRewardReceived.ContainsKey(currentLevel) && user.InfraCoreRewardReceived[currentLevel];
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
{
|
||||
user.InfraCoreRewardReceived[currentLevel] = true;
|
||||
|
||||
var reward = RewardUtils.RegisterRewardsForUser(user, gradeData.reward_id);
|
||||
var reward = RewardUtils.RegisterRewardsForUser(user, gradeData.RewardId);
|
||||
response.Reward = reward;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace EpinelPS.LobbyServer.Outpost
|
||||
|
||||
user.BattleTime = DateTime.UtcNow;
|
||||
|
||||
user.AddTrigger(TriggerType.OutpostBattleReward, 1);
|
||||
user.AddTrigger(Trigger.OutpostBattleReward, 1);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Outpost.Recycle
|
||||
{
|
||||
/*
|
||||
* Req Contains:
|
||||
* Tid: int value, research tid
|
||||
* Tid: int value, research tId
|
||||
* Items: int value, used items.
|
||||
*/
|
||||
ReqRecycleLevelUpResearch req = await ReadData<ReqRecycleLevelUpResearch>();
|
||||
@@ -36,29 +36,29 @@ namespace EpinelPS.LobbyServer.Outpost.Recycle
|
||||
GameData.Instance.RecycleResearchStats.TryGetValue(req.Tid, out RecycleResearchStatRecord? statRecord);
|
||||
if (statRecord is null)
|
||||
return;
|
||||
RecycleResearchLevelRecord? levelRecord = GameData.Instance.RecycleResearchLevels.Values.Where(e => e.recycle_type == statRecord.recycle_type)
|
||||
.FirstOrDefault(e => e.recycle_level == progress.Level);
|
||||
RecycleResearchLevelRecord? levelRecord = GameData.Instance.RecycleResearchLevels.Values.Where(e => e.RecycleType == statRecord.RecycleType)
|
||||
.FirstOrDefault(e => e.RecycleLevel == progress.Level);
|
||||
if (levelRecord is null)
|
||||
return;
|
||||
|
||||
if (statRecord.recycle_type == "Personal") // main research
|
||||
if (statRecord.RecycleType == RecycleType.Personal) // main research
|
||||
{
|
||||
ItemData? usedItem = user.Items.FirstOrDefault(e => e.ItemType == levelRecord.item_id); // item_id equals level-up item's tid.
|
||||
if (usedItem is null || usedItem.Count < levelRecord.item_value)
|
||||
ItemData? usedItem = user.Items.FirstOrDefault(e => e.ItemType == levelRecord.ItemId); // item_Id equals level-up item's tId.
|
||||
if (usedItem is null || usedItem.Count < levelRecord.ItemValue)
|
||||
return;
|
||||
|
||||
usedItem.Count -= levelRecord.item_value;
|
||||
usedItem.Count -= levelRecord.ItemValue;
|
||||
response.Items.Add(NetUtils.UserItemDataToNet(usedItem));
|
||||
|
||||
progress.Level += 1;
|
||||
progress.Hp = statRecord.hp * progress.Level;
|
||||
progress.Hp = statRecord.Hp * progress.Level;
|
||||
response.Recycle = new()
|
||||
{
|
||||
Tid = req.Tid,
|
||||
Lv = progress.Level,
|
||||
};
|
||||
}
|
||||
else if (statRecord.recycle_type == "Class" || statRecord.recycle_type == "Corporation") // class research or corporation research
|
||||
else if (statRecord.RecycleType == RecycleType.Class || statRecord.RecycleType == RecycleType.Corporation) // class research or corporation research
|
||||
{
|
||||
NetItemData netItem = req.Items.Single();
|
||||
ItemData? usedItem = user.Items.FirstOrDefault(e => e.ItemType == netItem.Tid);
|
||||
@@ -67,7 +67,7 @@ namespace EpinelPS.LobbyServer.Outpost.Recycle
|
||||
|
||||
usedItem.Count -= netItem.Count;
|
||||
response.Items.Add(NetUtils.UserItemDataToNet(usedItem));
|
||||
(int newLevel, int newExp) = CalcCorpAndClassLevelUp(statRecord.recycle_type, netItem.Count, progress.Level, progress.Exp);
|
||||
(int newLevel, int newExp) = CalcCorpAndClassLevelUp(statRecord.RecycleType, netItem.Count, progress.Level, progress.Exp);
|
||||
progress.Level = newLevel;
|
||||
progress.Exp = newExp;
|
||||
response.Recycle = new()
|
||||
@@ -79,25 +79,25 @@ namespace EpinelPS.LobbyServer.Outpost.Recycle
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"unknown recycle type {statRecord.recycle_type}");
|
||||
throw new Exception($"unknown recycle type {statRecord.RecycleType}");
|
||||
}
|
||||
}
|
||||
|
||||
// First: level, Second: exp
|
||||
private static (int, int) CalcCorpAndClassLevelUp(string researchType, int itemCount, int startLevel = 1, int startExp = 0)
|
||||
private static (int, int) CalcCorpAndClassLevelUp(RecycleType researchType, int itemCount, int startLevel = 1, int startExp = 0)
|
||||
{
|
||||
// levelRecord.exp is required exp to level up.
|
||||
IEnumerable<RecycleResearchLevelRecord> levelRecords = GameData.Instance.RecycleResearchLevels.Values.Where(e => e.recycle_type == researchType && e.recycle_level > startLevel);
|
||||
IEnumerable<RecycleResearchLevelRecord> levelRecords = GameData.Instance.RecycleResearchLevels.Values.Where(e => e.RecycleType == researchType && e.RecycleLevel > startLevel);
|
||||
|
||||
foreach (RecycleResearchLevelRecord? record in levelRecords)
|
||||
{
|
||||
if (itemCount < record.exp)
|
||||
if (itemCount < record.ItemValue)
|
||||
{
|
||||
startExp += itemCount;
|
||||
break;
|
||||
}
|
||||
|
||||
itemCount -= record.exp - startExp;
|
||||
itemCount -= record.ItemValue - startExp;
|
||||
startLevel += 1;
|
||||
startExp = 0;
|
||||
}
|
||||
|
||||
@@ -18,13 +18,13 @@ namespace EpinelPS.LobbyServer.Outpost.Recycle
|
||||
// Check progress is null, non-null means research is already unlocked.
|
||||
if (progress is null)
|
||||
{
|
||||
RecycleResearchStatRecord researchRecord = GameData.Instance.RecycleResearchStats.Values.FirstOrDefault(e => e.id == req.Tid)
|
||||
?? throw new Exception("not found research record with tid " + req.Tid);
|
||||
RecycleResearchStatRecord researchRecord = GameData.Instance.RecycleResearchStats.Values.FirstOrDefault(e => e.Id == req.Tid)
|
||||
?? throw new Exception("not found research record with tId " + req.Tid);
|
||||
progress = new()
|
||||
{
|
||||
Attack = researchRecord.attack,
|
||||
Defense = researchRecord.defense,
|
||||
Hp = researchRecord.hp,
|
||||
Attack = researchRecord.Attack,
|
||||
Defense = researchRecord.Defence,
|
||||
Hp = researchRecord.Hp,
|
||||
};
|
||||
user.ResearchProgress.Add(req.Tid, progress);
|
||||
}
|
||||
|
||||
@@ -24,11 +24,11 @@ namespace EpinelPS.LobbyServer.Shop
|
||||
MidasProductRecord? record = product.FirstOrDefault().Value;
|
||||
if (record != null)
|
||||
{
|
||||
string normalizedCost = record.cost.Replace(',', '.');
|
||||
string normalizedCost = record.Cost.Replace(',', '.');
|
||||
|
||||
if (!decimal.TryParse(normalizedCost, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal price))
|
||||
{
|
||||
Logging.WriteLine($"Failed to parse '{record.cost}' (normalized as '{normalizedCost}'). Cash shop will not work properly.", LogType.Error);
|
||||
Logging.WriteLine($"Failed to parse '{record.Cost}' (normalized as '{normalizedCost}'). Cash shop will not work properly.", LogType.Error);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace EpinelPS.LobbyServer.Shop
|
||||
CurrencyCode = "USD",
|
||||
CurrencySymbol = "$",
|
||||
MicroPrice = microPrice,
|
||||
Price = record.cost,
|
||||
Price = record.Cost,
|
||||
ProductId = item
|
||||
});
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Shop.InApp
|
||||
|
||||
ResGetMonthlySubscriptionReward response = new();
|
||||
|
||||
// TODO: Validate response from real server
|
||||
// TODO: ValIdate response from real server
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Shop.InApp
|
||||
|
||||
ResGetCustomPackageSetupData response = new();
|
||||
|
||||
// TODO: Validate response from real server and pull info from user info
|
||||
// TODO: ValIdate response from real server and pull info from user info
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Shop.PackageShop
|
||||
|
||||
ResGetCampaignPackage response = new();
|
||||
|
||||
// TODO: Validate response from real server and pull info from user info
|
||||
// TODO: ValIdate response from real server and pull info from user info
|
||||
await WriteDataAsync(response);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,8 +21,7 @@ namespace EpinelPS.LobbyServer.Sidestory
|
||||
|
||||
if (GameData.Instance.SidestoryRewardTable.TryGetValue(req.SideStoryStageId, out SideStoryStageRecord? value))
|
||||
{
|
||||
RewardRecord? rewardData = GameData.Instance.GetRewardTableEntry(value.first_clear_reward);
|
||||
|
||||
RewardRecord? rewardData = GameData.Instance.GetRewardTableEntry(value.FirstClearReward);
|
||||
if (rewardData != null)
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardData);
|
||||
else
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using EpinelPS.Utils;
|
||||
|
||||
namespace EpinelPS.LobbyServer.Soloraid;
|
||||
namespace EpinelPS.LobbyServer.SoloraId;
|
||||
|
||||
[PacketPath("/soloraidmuseum/get/reddotdata")]
|
||||
[PacketPath("/soloraIdmuseum/get/reddotdata")]
|
||||
public class GetBadgeData : LobbyMsgHandler
|
||||
{
|
||||
protected override async Task HandleAsync()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using EpinelPS.Utils;
|
||||
|
||||
namespace EpinelPS.LobbyServer.Soloraid
|
||||
namespace EpinelPS.LobbyServer.SoloraId
|
||||
{
|
||||
[PacketPath("/soloraid/getperiod")]
|
||||
public class GetSoloraidPeriod : LobbyMsgHandler
|
||||
[PacketPath("/soloraId/getperiod")]
|
||||
public class GetSoloraIdPeriod : LobbyMsgHandler
|
||||
{
|
||||
protected override async Task HandleAsync()
|
||||
{
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
};
|
||||
CampaignStageRecord clearedStage = GameData.Instance.GetStageData(StageId) ?? throw new Exception("cleared stage cannot be null");
|
||||
|
||||
string stageMapId = GameData.Instance.GetMapIdFromChapter(clearedStage.chapter_id, clearedStage.chapter_mod);
|
||||
string stageMapId = GameData.Instance.GetMapIdFromChapter(clearedStage.ChapterId, clearedStage.ChapterMod);
|
||||
|
||||
if (user.FieldInfoNew.Count == 0)
|
||||
{
|
||||
@@ -42,17 +42,17 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
}
|
||||
|
||||
DoQuestSpecificUserOperations(user, StageId);
|
||||
RewardRecord? rewardData = GameData.Instance.GetRewardTableEntry(clearedStage.reward_id);
|
||||
RewardRecord? rewardData = GameData.Instance.GetRewardTableEntry(clearedStage.RewardId);
|
||||
|
||||
if (forceCompleteScenarios)
|
||||
{
|
||||
if (!user.CompletedScenarios.Contains(clearedStage.enter_scenario) && !string.IsNullOrEmpty(clearedStage.enter_scenario) && !string.IsNullOrWhiteSpace(clearedStage.enter_scenario))
|
||||
if (!user.CompletedScenarios.Contains(clearedStage.EnterScenario) && !string.IsNullOrEmpty(clearedStage.EnterScenario) && !string.IsNullOrWhiteSpace(clearedStage.EnterScenario))
|
||||
{
|
||||
user.CompletedScenarios.Add(clearedStage.enter_scenario);
|
||||
user.CompletedScenarios.Add(clearedStage.EnterScenario);
|
||||
}
|
||||
if (!user.CompletedScenarios.Contains(clearedStage.exit_scenario) && !string.IsNullOrEmpty(clearedStage.exit_scenario) && !string.IsNullOrWhiteSpace(clearedStage.exit_scenario))
|
||||
if (!user.CompletedScenarios.Contains(clearedStage.ExitScenario) && !string.IsNullOrEmpty(clearedStage.ExitScenario) && !string.IsNullOrWhiteSpace(clearedStage.ExitScenario))
|
||||
{
|
||||
user.CompletedScenarios.Add(clearedStage.exit_scenario);
|
||||
user.CompletedScenarios.Add(clearedStage.ExitScenario);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,9 +92,9 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
});
|
||||
}
|
||||
|
||||
if (clearedStage.stage_category == StageCategory.Normal || clearedStage.stage_category == StageCategory.Boss || clearedStage.stage_category == StageCategory.Hard)
|
||||
if (clearedStage.StageCategory == StageCategory.Normal || clearedStage.StageCategory == StageCategory.Boss || clearedStage.StageCategory == StageCategory.Hard)
|
||||
{
|
||||
if (clearedStage.chapter_mod == ChapterMod.Hard)
|
||||
if (clearedStage.ChapterMod == ChapterMod.Hard)
|
||||
{
|
||||
if (StageId > user.LastHardStageCleared)
|
||||
user.LastHardStageCleared = StageId;
|
||||
@@ -107,10 +107,10 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Warn("Unknown stage category " + clearedStage.stage_category);
|
||||
Logging.Warn("Unknown stage category " + clearedStage.StageCategory);
|
||||
}
|
||||
|
||||
if (clearedStage.stage_type != StageType.Sub)
|
||||
if (clearedStage.StageType != StageType.Sub)
|
||||
{
|
||||
// add outpost reward level if unlocked
|
||||
if (user.MainQuestData.TryGetValue(21, out bool _))
|
||||
@@ -132,12 +132,12 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
|
||||
|
||||
// Mark chapter as completed if boss stage was completed
|
||||
if (clearedStage.stage_category == StageCategory.Boss && clearedStage.stage_type == StageType.Main)
|
||||
if (clearedStage.StageCategory == StageCategory.Boss && clearedStage.StageType == StageType.Main)
|
||||
{
|
||||
if (clearedStage.chapter_mod == ChapterMod.Hard)
|
||||
user.AddTrigger(TriggerType.HardChapterClear, 1, clearedStage.chapter_id);
|
||||
if (clearedStage.ChapterMod == ChapterMod.Hard)
|
||||
user.AddTrigger(Trigger.HardChapterClear, 1, clearedStage.ChapterId);
|
||||
else
|
||||
user.AddTrigger(TriggerType.ChapterClear, 1, clearedStage.chapter_id);
|
||||
user.AddTrigger(Trigger.ChapterClear, 1, clearedStage.ChapterId);
|
||||
}
|
||||
|
||||
if (!user.FieldInfoNew.ContainsKey(stageMapId))
|
||||
@@ -150,13 +150,13 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
|
||||
private static void DoQuestSpecificUserOperations(User user, int clearedStageId)
|
||||
{
|
||||
MainQuestCompletionRecord? quest = GameData.Instance.GetMainQuestForStageClearCondition(clearedStageId);
|
||||
MainQuestRecord? quest = GameData.Instance.GetMainQuestForStageClearCondition(clearedStageId);
|
||||
|
||||
user.AddTrigger(TriggerType.CampaignClear, 1, clearedStageId);
|
||||
user.AddTrigger(Trigger.CampaignClear, 1, clearedStageId);
|
||||
if (quest != null)
|
||||
{
|
||||
user.SetQuest(quest.id, false);
|
||||
user.AddTrigger(TriggerType.MainQuestClear, 1, quest.id);
|
||||
user.SetQuest(quest.Id, false);
|
||||
user.AddTrigger(Trigger.MainQuestClear, 1, quest.Id);
|
||||
}
|
||||
|
||||
// TODO: Is this the right place to add default characters?
|
||||
@@ -182,12 +182,12 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
user.BondInfo.Add(new() { NameCode = 3001, Lv = 1 });
|
||||
user.BondInfo.Add(new() { NameCode = 3005, Lv = 1 });
|
||||
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, 3001);
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1018);
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1015);
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1014);
|
||||
user.AddTrigger(TriggerType.ObtainCharacter, 1, 3005);
|
||||
user.AddTrigger(TriggerType.ObtainCharacterNew, 1);
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, 3001);
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, 1018);
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, 1015);
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, 1014);
|
||||
user.AddTrigger(Trigger.ObtainCharacter, 1, 3005);
|
||||
user.AddTrigger(Trigger.ObtainCharacterNew, 1);
|
||||
|
||||
NetTeamData team1Sub = new()
|
||||
{
|
||||
|
||||
@@ -15,9 +15,9 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
ResEnterStage response = new();
|
||||
|
||||
CampaignStageRecord clearedStage = GameData.Instance.GetStageData(req.StageId) ?? throw new Exception("cleared stage cannot be null");
|
||||
string map = GameData.Instance.GetMapIdFromChapter(clearedStage.chapter_id, clearedStage.chapter_mod);
|
||||
string map = GameData.Instance.GetMapIdFromChapter(clearedStage.ChapterId, clearedStage.ChapterMod);
|
||||
|
||||
if (clearedStage.stage_category == StageCategory.Boss)
|
||||
if (clearedStage.StageCategory == StageCategory.Boss)
|
||||
{
|
||||
// When entering a boss stage, unlock boss information in campaign
|
||||
if (!user.FieldInfoNew.ContainsKey(map))
|
||||
@@ -27,7 +27,7 @@ namespace EpinelPS.LobbyServer.Stage
|
||||
info.BossEntered = true;
|
||||
}
|
||||
|
||||
user.AddTrigger(TriggerType.CampaignStart, 1, req.StageId);
|
||||
user.AddTrigger(Trigger.CampaignStart, 1, req.StageId);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -14,13 +14,13 @@ namespace EpinelPS.LobbyServer.Subquest
|
||||
|
||||
ResSetTriggerFromSubQuest response = new();
|
||||
|
||||
if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out SubquestRecord? record))
|
||||
if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out SubQuestRecord? record))
|
||||
throw new Exception("no such subquest: " + req.SubquestId);
|
||||
|
||||
|
||||
user.AddTrigger(TriggerType.CampaignGroupClear, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere
|
||||
user.AddTrigger(TriggerType.FieldObjectCollection, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere
|
||||
user.AddTrigger(TriggerType.SubQuestClear, 1, req.SubquestId);
|
||||
user.AddTrigger(Trigger.CampaignGroupClear, record.ClearConditionValue, record.ClearConditionId); // TODO this may need to go elsewhere
|
||||
user.AddTrigger(Trigger.FieldObjectCollection, record.ClearConditionValue, record.ClearConditionId); // TODO this may need to go elsewhere
|
||||
user.AddTrigger(Trigger.SubQuestClear, 1, req.SubquestId);
|
||||
|
||||
JsonDb.Save();
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace EpinelPS.LobbyServer.Tower
|
||||
{
|
||||
ResClearTower response = new();
|
||||
|
||||
if (!GameData.Instance.towerTable.TryGetValue(TowerId, out TowerRecord? record)) throw new Exception("unable to find tower with id " + TowerId);
|
||||
if (!GameData.Instance.towerTable.TryGetValue(TowerId, out TowerRecord? record)) throw new Exception("unable to find tower with Id " + TowerId);
|
||||
|
||||
// Parse TowerId to get TowerType and FloorNumber
|
||||
int TowerType = (TowerId / 10000) - 1; // For some weird reason the Type here doesn't match up with NetTowerData, thus the -1
|
||||
@@ -35,35 +35,35 @@ namespace EpinelPS.LobbyServer.Tower
|
||||
// Update user's TowerProgress
|
||||
if (!user.TowerProgress.TryGetValue(TowerType, out int value))
|
||||
{
|
||||
user.TowerProgress[TowerType] = record.floor;
|
||||
user.TowerProgress[TowerType] = record.Floor;
|
||||
}
|
||||
else if (value < FloorNumber)
|
||||
{
|
||||
user.TowerProgress[TowerType] = record.floor;
|
||||
user.TowerProgress[TowerType] = record.Floor;
|
||||
}
|
||||
|
||||
if (record.type == "TETRA")
|
||||
if (record.Type == CorporationTowerType.TETRA)
|
||||
{
|
||||
user.AddTrigger(TriggerType.TowerTetraClear, TowerId);
|
||||
user.AddTrigger(Trigger.TowerTetraClear, TowerId);
|
||||
}
|
||||
else if (record.type == "ELYSION")
|
||||
else if (record.Type == CorporationTowerType.ELYSION)
|
||||
{
|
||||
user.AddTrigger(TriggerType.TowerElysionClear, TowerId);
|
||||
user.AddTrigger(Trigger.TowerElysionClear, TowerId);
|
||||
}
|
||||
else if (record.type == "MISSILIS")
|
||||
else if (record.Type== CorporationTowerType.MISSILIS)
|
||||
{
|
||||
user.AddTrigger(TriggerType.TowerMissilisClear, TowerId);
|
||||
user.AddTrigger(Trigger.TowerMissilisClear, TowerId);
|
||||
}
|
||||
else if (record.type == "PILGRIM")
|
||||
else if (record.Type == CorporationTowerType.OVERSPEC)
|
||||
{
|
||||
user.AddTrigger(TriggerType.TowerOverspecClear, TowerId);
|
||||
user.AddTrigger(Trigger.TowerOverspecClear, TowerId);
|
||||
}
|
||||
else if (record.type == "ALL")
|
||||
else if (record.Type == CorporationTowerType.ALL)
|
||||
{
|
||||
user.AddTrigger(TriggerType.TowerBasicClear, TowerId);
|
||||
user.AddTrigger(Trigger.TowerBasicClear, TowerId);
|
||||
}
|
||||
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward");
|
||||
RewardRecord reward = GameData.Instance.GetRewardTableEntry(record.RewardId) ?? throw new Exception("failed to get reward");
|
||||
response.Reward = RewardUtils.RegisterRewardsForUser(user, reward);
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user