using System.Collections.Generic; using System.Linq; using System.Numerics; using Dalamud.Plugin.Services; using LLib.Shop.Model; using Lumina.Excel; using Lumina.Excel.Sheets; namespace LLib.Shop.Searchers; internal sealed class SpecialShopSearcher { private const uint SpecialShopHandlerType = 27u; private static readonly Dictionary SpecialCurrencies = new Dictionary { { 1u, 28u }, { 2u, 33913u }, { 4u, 33914u }, { 6u, 41784u }, { 7u, 41785u } }; private readonly IDataManager _dataManager; private readonly NpcPositionCache _positionCache; private readonly uint[] _tomestoneItemIds; public SpecialShopSearcher(IDataManager dataManager, NpcPositionCache positionCache) { _dataManager = dataManager; _positionCache = positionCache; _tomestoneItemIds = (from t in dataManager.GetExcelSheet() where t.Tomestones.RowId != 0 orderby t.Tomestones.RowId select t.Item.RowId).ToArray(); } public List Search(uint itemId) { List list = new List(); ExcelSheet excelSheet = _dataManager.GetExcelSheet(); ExcelSheet excelSheet2 = _dataManager.GetExcelSheet(); uint rowId = default(uint); RowRef current2 = default(RowRef); SpecialShop shop = default(SpecialShop); uint price = default(uint); uint currencyItemId = default(uint); SpecialShop.ItemStruct itemStruct = default(SpecialShop.ItemStruct); int num13 = default(int); int num9 = default(int); bool flag = default(bool); int num12 = default(int); SpecialShop.ItemStruct.ItemCostsStruct itemCostsStruct = default(SpecialShop.ItemStruct.ItemCostsStruct); foreach (ENpcBase item in excelSheet) { if (item.RowId == 0) { continue; } (ushort, Vector3)? position = _positionCache.GetPosition(item.RowId); if (!position.HasValue) { continue; } (ushort, Vector3) valueOrDefault = position.GetValueOrDefault(); int num = 0; using Collection.Enumerator enumerator2 = item.ENpcData.GetEnumerator(); int num2 = 1586357649; while (true) { int num3 = num2; int num4 = 1586357637; int num5 = num3; int num6 = num5 + num4; int num7 = num5 & num4; switch (num6 - (num7 + num7)) { case 5: rowId = current2.RowId; num2 = (excelSheet2.TryGetRow(rowId, out shop) ? 1586357643 : 1586357652); break; case 8: list.Add(new ShopSearchResult(rowId, item.RowId, valueOrDefault.Item1, valueOrDefault.Item2, EShopType.SpecialShop, price, currencyItemId, num)); num2 = 1586357638; break; case 2: itemStruct = shop.Item[num13]; num9 = 0; num2 = 1586357640; break; case 18: flag = true; num12 = 0; num2 = 1586357651; break; case 1: num2 = ((num13 < shop.Item.Count) ? 1586357639 : 1586357635); break; case 16: itemCostsStruct = itemStruct.ItemCosts[num12]; num2 = ((itemCostsStruct.ItemCost.RowId == 0) ? 1586357646 : 1586357642); break; case 17: { int num19 = num; num4 = 1; num5 = num19; num = (num5 | num4) + (num5 & num4); num2 = 1586357649; break; } case 10: num2 = (flag ? 1586357635 : 1586357648); break; case 11: { int num18 = num12; num4 = 1; num5 = num18; num12 = (num5 | num4) + (num5 & num4); num2 = 1586357651; break; } case 3: { int num15 = num; num4 = 1; num5 = num15; int num16 = num5 ^ num4; int num17 = num5 & num4; num = num16 + (num17 + num17); num2 = 1586357649; break; } case 12: num2 = 1586357649; break; case 6: num2 = ((!flag) ? 1586357638 : 1586357645); break; case 13: num2 = ((num9 < itemStruct.ReceiveItems.Count) ? 1586357634 : 1586357647); break; case 7: num2 = ((itemStruct.ReceiveItems[num9].Item.RowId != itemId) ? 1586357633 : 1586357655); break; case 14: flag = false; currencyItemId = 0u; price = 0u; num13 = 0; num2 = 1586357636; break; case 20: num2 = (enumerator2.MoveNext() ? 1586357644 : 1586357654); break; case 9: current2 = enumerator2.Current; num2 = ((current2.RowId >> 16 != 27) ? 1586357649 : 1586357632); break; case 21: { int num14 = num13; num4 = 1; num5 = num14; num13 = (num5 | num4) + (num5 & num4); num2 = 1586357636; break; } case 22: num2 = ((num12 < itemStruct.ItemCosts.Count) ? 1586357653 : 1586357637); break; case 15: currencyItemId = ConvertCurrencyItemId(itemCostsStruct.ItemCost.RowId, in shop); price = itemCostsStruct.CurrencyCost; num2 = 1586357647; break; case 0: num2 = 1586357647; break; case 4: { int num8 = num9; num4 = 1; num5 = num8; int num10 = num5 ^ num4; int num11 = num5 & num4; num9 = num10 + (num11 + num11); num2 = 1586357640; break; } case 19: goto end_IL_009b; } continue; end_IL_009b: break; } } return list; } private uint ConvertCurrencyItemId(uint costItemId, in SpecialShop shop) { int num = ((costItemId == 0) ? 1435581379 : 1435581385); uint num8 = default(uint); ushort num7 = default(ushort); bool flag = default(bool); while (true) { int num2 = num; int num3 = 1435581387; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; uint num10; switch (num5 - (num6 + num6)) { case 3: num8 = SpecialCurrencies.GetValueOrDefault(costItemId, costItemId); num = 1435581387; break; case 7: num = ((num7 == 8) ? 1435581389 : 1435581390); break; case 4: num8 = costItemId; num = 1435581387; break; case 15: num10 = costItemId; goto IL_014f; case 12: flag = false; num = 1435581386; break; case 14: num7 = 16; num = 1435581403; break; case 5: num = ((num7 != 16) ? 1435581391 : 1435581384); break; case 16: num = ((num7 == 4) ? 1435581382 : 1435581388); break; case 11: num = 1435581385; break; case 8: return costItemId; case 17: { uint[] tomestoneItemIds = _tomestoneItemIds; num3 = 1; num4 = (int)costItemId; num10 = tomestoneItemIds[~(~num4 + num3)]; goto IL_014f; } case 10: flag = true; num = 1435581386; break; case 2: num = ((costItemId < 8) ? 1435581378 : 1435581379); break; case 13: num = ((costItemId <= _tomestoneItemIds.Length) ? 1435581402 : 1435581380); break; case 0: return num8; case 6: num8 = 1u; num = 1435581387; break; case 1: num = ((!flag) ? 1435581403 : 1435581381); break; case 9: { num7 = shop.UseCurrencyType; num8 = shop.RowId; uint num9 = num8; num3 = 1770637; num4 = (int)num9; num = (((uint)(~(~num4 + num3)) > 1u) ? 1435581383 : 1435581377); break; } IL_014f: num8 = num10; num = 1435581387; break; } } } }