Generate static data schema, use pascal case for it

This commit is contained in:
Mikhail Tyukin
2025-09-27 22:34:39 -04:00
parent 50d4d23e00
commit 29427ab515
115 changed files with 785236 additions and 2323 deletions

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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);

View File

@@ -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
});
}
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()
{

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;

View File

@@ -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>();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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());

View File

@@ -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();

View File

@@ -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
};

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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));

View File

@@ -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);

View File

@@ -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

View File

@@ -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++)

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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}")
};

View File

@@ -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();

View File

@@ -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();

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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()

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);
}
}
}

View File

@@ -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,

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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();

View File

@@ -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) };

View File

@@ -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));
}
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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) });

View File

@@ -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);
}
}

View File

@@ -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()

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 },

View File

@@ -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];
}

View File

@@ -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);
}
}
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -28,7 +28,7 @@ namespace EpinelPS.LobbyServer.Outpost
user.BattleTime = DateTime.UtcNow;
user.AddTrigger(TriggerType.OutpostBattleReward, 1);
user.AddTrigger(Trigger.OutpostBattleReward, 1);
JsonDb.Save();

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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
});
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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();

View File

@@ -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();

View File

@@ -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