diff --git a/Lib9c/TableData/WorldBossRankingRewardSheet.cs b/Lib9c/TableData/WorldBossRankingRewardSheet.cs index 066e76379a..4671815ad3 100644 --- a/Lib9c/TableData/WorldBossRankingRewardSheet.cs +++ b/Lib9c/TableData/WorldBossRankingRewardSheet.cs @@ -3,6 +3,7 @@ using System.Linq; using Libplanet.Types.Assets; using Nekoyume.Helper; +using Nekoyume.Model.Item; using static Nekoyume.TableData.TableExtensions; namespace Nekoyume.TableData @@ -32,6 +33,7 @@ public RuneInfo(int id, int qty) public int RateMax; public List Runes; public int Crystal; + public List<(int itemId, int quantity)> Materials; public override int Key => Id; public override void Set(IReadOnlyList fields) { @@ -48,20 +50,42 @@ public override void Set(IReadOnlyList fields) Runes.Add(new RuneInfo(ParseInt(fields[6 + offset]), ParseInt(fields[7 + offset]))); } Crystal = ParseInt(fields[12]); + + if (fields.Count > 13) + { + Materials = new List<(int, int)>(); + for (int i = 0; i < 2; i++) + { + var offset = i * 2; + Materials.Add( + (ParseInt(fields[13 + offset]), ParseInt(fields[14 + offset]))); + } + } } - public List GetRewards(RuneSheet runeSheet) + public (List assets, Dictionary materials) GetRewards( + RuneSheet runeSheet, + MaterialItemSheet materialSheet) { - var result = new List + var assets = new List { Crystal * CrystalCalculator.CRYSTAL }; - result.AddRange(Runes + assets.AddRange(Runes .Where(runeInfo => runeInfo.RuneQty > 0) .Select(runeInfo => RuneHelper.ToFungibleAssetValue(runeSheet[runeInfo.RuneId], runeInfo.RuneQty))); - return result; + + var materials = new Dictionary(); + foreach (var (itemId, quantity) in Materials) + { + var materialRow = materialSheet.Values.First(r => r.Id == itemId); + var material = ItemFactory.CreateTradableMaterial(materialRow); + materials.TryAdd(material, 0); + materials[material] += quantity; + } + return (assets, materials); } }