diff --git a/.Lib9c.Tests/Model/ItemNotificationTest.cs b/.Lib9c.Tests/Model/ItemNotificationTest.cs deleted file mode 100644 index 3daf58de8c..0000000000 --- a/.Lib9c.Tests/Model/ItemNotificationTest.cs +++ /dev/null @@ -1,254 +0,0 @@ -namespace Lib9c.Tests.Model -{ - using System; - using System.Collections.Generic; - using System.Linq; - using Libplanet.Crypto; - using Nekoyume; - using Nekoyume.Action; - using Nekoyume.Battle; - using Nekoyume.Model.Item; - using Nekoyume.Model.State; - using Xunit; - - public class ItemNotificationTest - { - private readonly Address _agentAddress; - private readonly TableSheets _tableSheets; - private readonly ItemSubType[] _itemSubTypesForEquipments - = new ItemSubType[] - { - ItemSubType.Weapon, - ItemSubType.Armor, - ItemSubType.Belt, - ItemSubType.Necklace, - ItemSubType.Ring, - }; - - public ItemNotificationTest() - { - var sheets = TableSheetsImporter.ImportSheets(); - - var privateKey = new PrivateKey(); - _agentAddress = privateKey.PublicKey.Address; - _tableSheets = new TableSheets(sheets); - } - - [Fact] - public void EquipItems() - { - var avatarAddress = _agentAddress.Derive("avatar_1"); - var avatarState = new AvatarState( - avatarAddress, - _agentAddress, - 0, - _tableSheets.GetAvatarSheets(), - default - ); - - avatarState.level = GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing1; - var equipmentList = new List(); - avatarState.EquipEquipments(equipmentList); - - var inventory = avatarState.inventory; - var hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When inventory is empty. - Assert.False(hasNotification); - - foreach (var type in _itemSubTypesForEquipments) - { - var rows = _tableSheets.EquipmentItemSheet.Values - .Where(r => r.ItemSubType == type && r.Grade == 1); - foreach (var row in rows) - { - var guid = Guid.NewGuid(); - var equipment = (Equipment)ItemFactory.CreateItemUsable(row, guid, 0, 0); - inventory.AddItem(equipment); - } - - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When all of the items are unequipped. - Assert.True(hasNotification); - - var ordered = inventory.Equipments - .Where(i => i.ItemSubType == type) - .OrderBy(i => CPHelper.GetCP(i)); - - var weakest = ordered.First(); - equipmentList.Add(weakest.ItemId); - avatarState.EquipEquipments(equipmentList); - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When weakest item is equipped. - Assert.True(hasNotification); - - equipmentList.Remove(weakest.ItemId); - - var strongest = ordered.Last(); - equipmentList.Add(strongest.ItemId); - avatarState.EquipEquipments(equipmentList); - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When strongest item is equipped. - Assert.False(hasNotification); - } - } - - [Fact] - public void EquipTwoRings() - { - var avatarAddress = _agentAddress.Derive("avatar_2"); - var avatarState = new AvatarState( - avatarAddress, - _agentAddress, - 0, - _tableSheets.GetAvatarSheets(), - default - ); - - avatarState.level = GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing2; - var equipmentList = new List(); - avatarState.EquipEquipments(equipmentList); - - var inventory = avatarState.inventory; - var hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When inventory is empty. - Assert.False(hasNotification); - - var rows = _tableSheets.EquipmentItemSheet.Values - .Where(r => r.ItemSubType == ItemSubType.Ring && r.Grade == 1); - foreach (var row in rows) - { - var guid = Guid.NewGuid(); - var equipment = (Equipment)ItemFactory.CreateItemUsable(row, guid, 0, 0); - inventory.AddItem(equipment); - } - - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When all of the items are unequipped. - Assert.True(hasNotification); - - var ordered = inventory.Equipments.OrderBy(i => CPHelper.GetCP(i)); - - var strongest = ordered.Last(); - equipmentList.Add(strongest.ItemId); - avatarState.EquipEquipments(equipmentList); - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When one strongest ring is equipped. - Assert.True(hasNotification); - - equipmentList.Clear(); - - var strongests = ordered.TakeLast(2).Select(i => i.ItemId); - equipmentList.AddRange(strongests); - avatarState.EquipEquipments(equipmentList); - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When the 1st strongest, the 2nd strongest items are equipped. - Assert.False(hasNotification); - } - - [Theory] - [InlineData(0, 0, true)] - [InlineData(0, 1, false)] - public void RequiredBlockIndexTest(long blockIndex, long requiredBlockIndex, bool expected) - { - var avatarAddress = _agentAddress.Derive("avatar_2"); - var avatarState = new AvatarState( - avatarAddress, - _agentAddress, - 0, - _tableSheets.GetAvatarSheets(), - default - ); - - avatarState.level = GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing2; - var equipmentList = new List(); - avatarState.EquipEquipments(equipmentList); - - var inventory = avatarState.inventory; - var hasNotification = inventory.HasNotification( - avatarState.level, - blockIndex, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - // When inventory is empty. - Assert.False(false); - - var rows = _tableSheets.EquipmentItemSheet.Values - .Where(r => r.ItemSubType == ItemSubType.Ring && r.Grade == 1); - foreach (var row in rows) - { - var guid = Guid.NewGuid(); - var equipment = (Equipment)ItemFactory.CreateItemUsable(row, guid, requiredBlockIndex, 0); - inventory.AddItem(equipment); - } - - hasNotification = inventory.HasNotification( - avatarState.level, - 0, - _tableSheets.ItemRequirementSheet, - _tableSheets.EquipmentItemRecipeSheet, - _tableSheets.EquipmentItemSubRecipeSheetV2, - _tableSheets.EquipmentItemOptionSheet - ); - Assert.Equal(blockIndex >= requiredBlockIndex, expected); - } - } -} diff --git a/Lib9c/Model/Item/Inventory.cs b/Lib9c/Model/Item/Inventory.cs index d34c04eba1..5b8cc21d1f 100644 --- a/Lib9c/Model/Item/Inventory.cs +++ b/Lib9c/Model/Item/Inventory.cs @@ -7,10 +7,7 @@ using Libplanet.Common; using Libplanet.Crypto; using Nekoyume.Action; -using Nekoyume.Battle; -using Nekoyume.Extensions; using Nekoyume.Model.State; -using Nekoyume.TableData; using Serilog; namespace Nekoyume.Model.Item @@ -956,59 +953,6 @@ e.item is ITradableFungibleItem tradableFungibleItem && #endregion - public bool HasNotification( - int level, - long blockIndex, - ItemRequirementSheet requirementSheet, - EquipmentItemRecipeSheet recipeSheet, - EquipmentItemSubRecipeSheetV2 subRecipeSheet, - EquipmentItemOptionSheet itemOptionSheet) - { - var availableSlots = UnlockHelper.GetAvailableEquipmentSlots(level); - - foreach (var (type, slotCount) in availableSlots) - { - var equipments = Equipments - .Where(e => - e.ItemSubType == type && - e.RequiredBlockIndex <= blockIndex) - .ToList(); - var current = equipments.Where(e => e.equipped).ToList(); - // When an equipment slot is empty. - if (current.Count < Math.Min(equipments.Count, slotCount)) - { - return true; - } - - // When any other equipments are stronger than current one. - foreach (var equipment in equipments) - { - if (equipment.equipped) - { - continue; - } - - var cp = CPHelper.GetCP(equipment); - foreach (var i in current) - { - var requirementLevel = i.GetRequirementLevel( - requirementSheet, - recipeSheet, - subRecipeSheet, - itemOptionSheet); - - - if (level >= requirementLevel && CPHelper.GetCP(i) < cp) - { - return true; - } - } - } - } - - return false; - } - public ITradableItem SellItem(Guid tradableId, long blockIndex, int count) { if (TryGetTradableItems(tradableId, blockIndex, count, out List items)) diff --git a/Lib9c/TableData/UnlockHelper.cs b/Lib9c/TableData/UnlockHelper.cs deleted file mode 100644 index b2411e8a42..0000000000 --- a/Lib9c/TableData/UnlockHelper.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Nekoyume.Model.Item; -using System.Collections.Generic; - -namespace Nekoyume -{ - public static class UnlockHelper - { - public static List<(ItemSubType, int)> GetAvailableEquipmentSlots(int level) - { - var availableSlots = new List<(ItemSubType, int)>(); - - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotWeapon) - { - availableSlots.Add((ItemSubType.Weapon, 1)); - } - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotArmor) - { - availableSlots.Add((ItemSubType.Armor, 1)); - } - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotBelt) - { - availableSlots.Add((ItemSubType.Belt, 1)); - } - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotNecklace) - { - availableSlots.Add((ItemSubType.Necklace, 1)); - } - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing1) - { - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing2) - { - availableSlots.Add((ItemSubType.Ring, 2)); - } - else - { - availableSlots.Add((ItemSubType.Ring, 1)); - } - } - if (level >= GameConfig.RequireCharacterLevel.CharacterEquipmentSlotAura) - { - availableSlots.Add((ItemSubType.Aura, 1)); - } - - return availableSlots; - } - } -}