diff --git a/NineChronicles.DataProvider/DataRendering/AvatarData.cs b/NineChronicles.DataProvider/DataRendering/AvatarData.cs index 0e52131a..ed3fbf34 100644 --- a/NineChronicles.DataProvider/DataRendering/AvatarData.cs +++ b/NineChronicles.DataProvider/DataRendering/AvatarData.cs @@ -55,20 +55,41 @@ public static AvatarModel GetAvatarInfo( : new ItemSlotState(BattleType.Adventure); var equipmentList = SetEquipments(avatarState, itemSlotState, battleType); var costumeList = SetCostumes(avatarState, itemSlotState, battleType); - var runeOptionSheet = sheets.GetSheet(); - var runeOptions = new List(); var runeStates = outputStates.GetRuneState(avatarAddress, out _); + var runeAddresses = RuneSlotState.DeriveAddress(avatarAddress, battleType); + var runeSlotState = outputStates.TryGetLegacyState(runeAddresses, out List rawRuneSlotState) + ? new RuneSlotState(rawRuneSlotState) + : new RuneSlotState(BattleType.Adventure); + var runeSlotStates = new List(); + runeSlotStates.Add(runeSlotState); + var runes = SetRunes(runeSlotStates, battleType); + + var equippedRuneStates = new List(); + var runeIds = runes[battleType].GetRuneSlot() + .Where(slot => slot.RuneId.HasValue) + .Select(slot => slot.RuneId!.Value); + + foreach (var runeId in runeIds) + { + var runeState = runeStates.Runes!.FirstOrDefault(x => x.Value.RuneId == runeId); + if (runeStates.Runes != null) + { + equippedRuneStates.Add(runeState.Value); + } + } - foreach (var runeState in runeStates.Runes.Values) + var runeOptions = new List(); + var runeOptionSheet = sheets.GetSheet(); + foreach (var runeState in equippedRuneStates) { if (!runeOptionSheet.TryGetValue(runeState.RuneId, out var optionRow)) { - throw new SheetRowNotFoundException("RuneOptionSheet", runeState.RuneId); + continue; } if (!optionRow.LevelOptionMap.TryGetValue(runeState.Level, out var option)) { - throw new SheetRowNotFoundException("RuneOptionSheet", runeState.Level); + continue; } runeOptions.Add(option); @@ -188,5 +209,21 @@ private static Dictionary> SetCostumes( return costumes; } + + private static Dictionary SetRunes( + List runeSlotStates, + BattleType battleType) + { + Dictionary runes = new (); + runes.Add(BattleType.Adventure, new RuneSlotState(BattleType.Adventure)); + runes.Add(BattleType.Arena, new RuneSlotState(BattleType.Arena)); + runes.Add(BattleType.Raid, new RuneSlotState(BattleType.Raid)); + foreach (var state in runeSlotStates) + { + runes[battleType] = state; + } + + return runes; + } } }