Files
BepInEx/Projects/BanquetForFools/Source/Assembly-CSharp/Merchant.cs
2025-05-21 20:40:04 +02:00

805 lines
19 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// Token: 0x020000C2 RID: 194
public class Merchant : MonoBehaviour
{
// Token: 0x06001243 RID: 4675 RVA: 0x00162C47 File Offset: 0x00160E47
private void Start()
{
this.gridImg = this.bag.gridImg;
this.gridState = this.bag.gridState;
this.bag.Setup();
}
// Token: 0x06001244 RID: 4676 RVA: 0x00162C78 File Offset: 0x00160E78
public void RemoveItem(Item currItem)
{
if (this.isBoro())
{
Records.x.boroWeight -= (float)((int)currItem.invRow._Weight);
this.SetWeightText();
}
Vector4 durability = currItem.durability;
durability.y = 0f;
currItem.durability = durability;
this.items.Remove(currItem);
this.CheckSlotCosts();
if (this.onlySelling)
{
this.merchantCharacter.stats.savedMerchantTime = Links.x.gameplay.gameDays;
}
this.UpdateMerchant();
}
// Token: 0x06001245 RID: 4677 RVA: 0x00162D0C File Offset: 0x00160F0C
public void AddItem(Item currItem, int amt, int max, bool addToBag)
{
Links.x.inventory.secondaryDragSave = true;
this.items.Add(currItem);
Vector4 durability = currItem.durability;
durability.y = (float)Links.x.gameplay.gameDays;
if (durability.y == 0f)
{
durability.y = 1f;
}
currItem.durability = durability;
currItem.forSale = true;
string name = currItem.invRow._Name;
int num = this.history.IndexOf(name);
if (currItem.invRow._NeedFullStack)
{
amt = 1;
}
if (num > -1)
{
int num2 = this.historyCounts[num];
if (amt < 1)
{
amt = 1;
}
this.historyCounts[num] = num2 + amt;
}
else
{
this.history.Add(name);
if (amt < 1)
{
amt = 1;
}
this.historyCounts.Add(amt);
}
if (this.isBoro())
{
Records.x.boroWeight += currItem.invRow._Weight;
this.SetWeightText();
}
this.UpdateMerchant();
}
// Token: 0x06001246 RID: 4678 RVA: 0x00162E1C File Offset: 0x0016101C
public float GetItemHistoryCount(Library.Inventory row, float cost)
{
int num = this.history.IndexOf(row._Name);
float num2 = 1f;
if (num > -1)
{
float num3 = (float)this.historyCounts[num];
if (num3 == 1f)
{
num2 = 0.95f;
}
if (num3 == 2f)
{
num2 = 0.9f;
}
if (num3 == 3f)
{
num2 = 0.85f;
}
if (num3 == 4f)
{
num2 = 0.8f;
}
if (num3 == 5f)
{
num2 = 0.75f;
}
if (num3 == 6f)
{
num2 = 0.7f;
}
if (num3 == 7f)
{
num2 = 0.65f;
}
if (num3 == 8f)
{
num2 = 0.6f;
}
if (num3 == 9f)
{
num2 = 0.55f;
}
if (num3 == 10f)
{
num2 = 0.5f;
}
if (num3 == 11f)
{
num2 = 0.45f;
}
if (num3 == 12f)
{
num2 = 0.4f;
}
if (num3 == 13f)
{
num2 = 0.35f;
}
if (num3 == 14f)
{
num2 = 0.3f;
}
if (num3 == 15f)
{
num2 = 0.25f;
}
if (num3 == 16f)
{
num2 = 0.2f;
}
if (num3 == 17f)
{
num2 = 0.15f;
}
if (num3 == 18f)
{
num2 = 0.1f;
}
if (num3 >= 19f)
{
num2 = 0.05f;
}
}
if (cost > 0f)
{
cost *= num2;
if (cost < 1f)
{
cost = 1f;
}
}
return Mathf.Round(cost);
}
// Token: 0x06001247 RID: 4679 RVA: 0x00162F80 File Offset: 0x00161180
public void CheckSlotCosts()
{
for (int i = 0; i < this.items.Count; i++)
{
this.localImg = this.items[i].gridImg;
float num = 0f;
int buyPrice = this.items[i].invRow._BuyPrice;
if (!this.items[i].invRow._NeedFullStack)
{
num *= (float)this.items[i].stackSize;
}
if (this.items[i].durability.w < 0f)
{
num = this.items[i].durability.w * -1f;
}
if (this.items[i].socketA.x > 0f)
{
num += this.items[i].socketB.y;
}
bool flag = num <= (float)Links.x.inventory.emeralds;
this.gridImg = this.bag.gridImg;
this.gridState = this.bag.gridState;
for (int j = 0; j < this.localImg.Count; j++)
{
if (flag)
{
this.gridImg[this.localImg[j]].sprite = Links.x.inventory.filledSprite;
}
else
{
this.gridImg[this.localImg[j]].sprite = Links.x.inventory.filledUnavailableSprite;
}
this.gridState[this.localImg[j]] = true;
}
}
}
// Token: 0x06001248 RID: 4680 RVA: 0x00163144 File Offset: 0x00161344
public string GetMerchantText(string t)
{
string text;
if (t == "Sell")
{
text = "My thanks";
}
else if (t == "Buy")
{
int num = Random.Range(0, 8);
if (num == 0)
{
text = "A good specimen";
}
else if (num == 1)
{
text = "Thanks for your business";
}
else if (num == 2)
{
text = "I'll take that off your hands";
}
else if (num == 3)
{
text = "A fine piece";
}
else if (num == 4)
{
text = "My thanks";
}
else if (num == 5)
{
text = "An easy resell";
}
else if (num == 6)
{
text = "I can find a buyer for this";
}
else
{
text = "Why not?";
}
}
else if (t == "Contraband")
{
text = "I'll not buy ill-gained wares";
}
else if (t == "PropertyLazure")
{
text = "I cannot buy property of House Lazure";
}
else if (t == "MerchantGoods")
{
text = "Maybe something more unique?";
}
else if (t == "Book")
{
text = "I don't buy these";
}
else if (t == "Full Stack")
{
text = "I'll only buy a full set";
}
else
{
text = "You'll need more emeralds for that";
}
return text;
}
// Token: 0x06001249 RID: 4681 RVA: 0x00163264 File Offset: 0x00161464
public void UpdateMerchant()
{
if (!this.setup)
{
if (this.merchantCharacter)
{
if (!this.onlySelling)
{
this.merchantCharacter.stats.savedMerchantTime = Links.x.gameplay.gameDays;
}
this.str.Clear();
int num = this.items.Count;
for (int i = 0; i < num; i++)
{
Item item = this.items[i];
if (item)
{
if (i != 0)
{
this.str.Append(",");
}
this.str.Append(item.invRow._Name);
this.str.Append(",");
this.str.Append(item.stackSize);
this.str.Append(",");
this.str.Append(item.socketA.x);
this.str.Append(",");
this.str.Append(item.socketA.y);
this.str.Append(",");
this.str.Append(item.socketA.z);
this.str.Append(",");
this.str.Append(item.socketB.x);
this.str.Append(",");
this.str.Append(item.socketB.y);
this.str.Append(",");
this.str.Append(item.socketB.z);
this.str.Append(",");
this.str.Append(item.durability.x);
this.str.Append(",");
if (item.durability.y == 0f)
{
item.durability.y = (float)Links.x.gameplay.gameDays;
}
this.str.Append(item.durability.y);
this.str.Append(",");
this.str.Append(item.durability.z);
}
}
this.savedMerchantList = this.str.ToString();
this.merchantCharacter.stats.savedMerchantList = this.savedMerchantList;
this.str.Clear();
num = this.history.Count;
for (int j = 0; j < num; j++)
{
if (j > 0)
{
this.str.Append(",");
}
this.str.Append(this.history[j]);
this.str.Append(",");
this.str.Append(this.historyCounts[j]);
}
this.savedMerchantHistory = this.str.ToString();
this.merchantCharacter.stats.savedMerchantHistory = this.savedMerchantHistory;
if (this.isBoro())
{
Records.x.boroBag = this.savedMerchantList;
return;
}
}
else if (this.isBoat)
{
this.creature.UpdateItems();
}
}
}
// Token: 0x0600124A RID: 4682 RVA: 0x001635D0 File Offset: 0x001617D0
public void CloseBag()
{
this.UpdateMerchant();
int num = this.items.Count;
for (int i = 0; i < num; i++)
{
if (this.items[i])
{
this.items[i].DestroyItem(false, false);
}
}
if (this.gridImg == null)
{
this.gridImg = this.bag.gridImg;
this.gridState = this.bag.gridState;
}
num = this.gridImg.Count;
for (int j = 0; j < this.gridImg.Count; j++)
{
this.gridImg[j].sprite = this.bag.emptySprite;
this.gridState[j] = false;
}
this.items.Clear();
this.isBoat = false;
}
// Token: 0x0600124B RID: 4683 RVA: 0x001636A8 File Offset: 0x001618A8
public bool CanSellContraband()
{
return this.merchantCharacter && this.merchantCharacter.stats.xmlName == "RozafirUndergroundMerchant";
}
// Token: 0x0600124C RID: 4684 RVA: 0x001636D8 File Offset: 0x001618D8
public void Unload()
{
this.merchantCharacter = Links.x.gaia.boro;
this.SetUpItems();
List<Item> list = new List<Item>();
List<bool> list2 = new List<bool>();
for (int i = 0; i < this.items.Count; i++)
{
list2.Add(false);
}
for (int j = 0; j < this.items.Count; j++)
{
float num = 0f;
int num2 = -1;
for (int k = 0; k < this.items.Count; k++)
{
if (!list2[k])
{
float weight = this.items[k].invRow._Weight;
if (weight > num)
{
num = weight;
num2 = k;
}
}
}
if (num2 > -1)
{
list2[num2] = true;
list.Add(this.items[num2]);
}
}
bool flag = false;
int count = list.Count;
int num3 = -1;
if (Links.x.main.node != null)
{
num3 = (int)Links.x.main.node.Area;
}
for (int l = 0; l < count; l++)
{
if (!flag)
{
for (int m = 0; m < list.Count; m++)
{
if (!flag && list[m])
{
Item item = list[m];
if (Records.x.editor)
{
string text = "Removing ";
Item item2 = item;
Debug.Log(text + ((item2 != null) ? item2.ToString() : null));
}
this.RemoveItem(item);
Item item3 = Links.x.inventory.groundBag.DropLoot(item.ID, item.stackSize, item.socketA, item.socketB, item.durability, Links.x.main, Links.x.main.tr.position + new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f)), true, false, num3);
if (item3)
{
Vector3 vector = Links.x.main.tr.position + new Vector3(Random.Range(-2f, 2f), 0f, Random.Range(-2f, 2f));
RaycastHit raycastHit;
if (Physics.Linecast(vector + new Vector3(0f, 10f, 0f), vector - new Vector3(0f, 20f, 0f), out raycastHit, 4194305))
{
item3.tr.position = raycastHit.point;
}
else
{
item3.tr.position = new Vector3(Random.Range(-1f, 1f), 0f, Random.Range(-1f, 1f));
}
}
item.DestroyItem(false, false);
Records.x.boroWeight = 0f;
int count2 = this.items.Count;
for (int n = 0; n < count2; n++)
{
Item item4 = this.items[n];
if (item4)
{
Records.x.boroWeight += item4.invRow._Weight;
}
}
if (Records.x.boroWeight < Records.x.BoroMaxWeight())
{
flag = true;
}
}
}
}
}
this.CloseBag();
this.merchantCharacter = null;
}
// Token: 0x0600124D RID: 4685 RVA: 0x00163A78 File Offset: 0x00161C78
public void SetUpItems()
{
this.bag.End();
this.setup = true;
this.bag.Setup();
int num;
if (this.merchantCharacter)
{
this.savedMerchantList = this.merchantCharacter.stats.savedMerchantList;
num = this.merchantCharacter.stats.savedMerchantTime;
this.savedMerchantHistory = this.merchantCharacter.stats.savedMerchantHistory;
if (!this.merchantCharacter.stats.xmlName.Contains("Peddler") && !this.merchantCharacter.stats.xmlName.Contains("Merchant") && !this.merchantCharacter.isBoro)
{
this.onlySelling = true;
}
}
else
{
this.savedMerchantList = this.creature.savedItems;
num = 0;
this.savedMerchantHistory = "";
}
this.itemIDs.Clear();
if (this.isBoro())
{
Records.x.boroWeight = 0f;
}
if (this.onlySelling && this.merchantCharacter.stats.xmlName == "RozafirGardenerChanter" && (this.savedMerchantList == "" || this.savedMerchantList == null || Links.x.gameplay.gameDays > num || num <= 0))
{
this.savedMerchantList = "GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0,GhostScrollCirclet,1,0,0,0,0,0,0,0,0,0";
}
if (this.savedMerchantList != "" && this.savedMerchantList != null)
{
char c = ',';
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = 0;
int num6 = 0;
int num7 = 0;
int num8 = 0;
int num9 = -1;
int num10 = 0;
int num11 = 0;
string[] array = new string[0];
array = this.savedMerchantList.Split(c, StringSplitOptions.None);
int num12 = array.Length;
int num13 = 0;
for (int i = 0; i < num12; i++)
{
if (num13 == 0)
{
int num14 = 0;
if (array[i] != "" && array[i] != null)
{
bool flag = true;
string text = array[0];
if (text == "0" || text == "1" || text == "2" || text == "3" || text == "4" || text == "5" || text == "6" || text == "7" || text == "8" || text == "9")
{
flag = false;
}
else
{
string text2 = array[i];
Library.Inventory inventory = Links.x.library.GetInvRowFromName(text2);
if (inventory != null)
{
num14 = inventory._ID;
}
}
if (num14 > 2)
{
Library.Inventory inventory = Links.x.library.GetInvRowByIndex(num14);
if (Links.x.gameplay.gameDays > num + 2 && !Links.x.merchant.isBoro() && !this.onlySelling)
{
flag = inventory._NeverSell;
}
int num15;
int.TryParse(array[i + 9], out num15);
if (Links.x.gameplay.gameDays >= num15 + 1 && !Links.x.merchant.isBoro() && num15 >= 1 && !this.onlySelling && !this.isBoat)
{
flag = false;
}
if (flag)
{
int.TryParse(array[i + 1], out num2);
int.TryParse(array[i + 2], out num3);
int.TryParse(array[i + 3], out num4);
int.TryParse(array[i + 4], out num5);
int.TryParse(array[i + 5], out num6);
int.TryParse(array[i + 6], out num7);
int.TryParse(array[i + 7], out num8);
int.TryParse(array[i + 8], out num9);
int.TryParse(array[i + 9], out num10);
int.TryParse(array[i + 10], out num11);
this.itemIDs.Add(num14);
this.itemIDs.Add(num2);
this.itemIDs.Add(num3);
this.itemIDs.Add(num4);
this.itemIDs.Add(num5);
this.itemIDs.Add(num6);
this.itemIDs.Add(num7);
this.itemIDs.Add(num8);
this.itemIDs.Add(num9);
this.itemIDs.Add(num10);
this.itemIDs.Add(num11);
}
}
}
}
if (num13 == 10)
{
num13 = 0;
}
else
{
num13++;
}
}
num12 = this.itemIDs.Count;
num13 = 0;
for (int j = 0; j < num12; j++)
{
if (num13 == 0)
{
Item item = Links.x.inventory.SpawnItem(null, false, this.itemIDs[j], this.itemIDs[j + 1], new Vector3((float)this.itemIDs[j + 2], (float)this.itemIDs[j + 3], (float)this.itemIDs[j + 4]), new Vector3((float)this.itemIDs[j + 5], (float)this.itemIDs[j + 6], (float)this.itemIDs[j + 7]), new Vector4((float)this.itemIDs[j + 8], (float)this.itemIDs[j + 9], (float)this.itemIDs[j + 10], 0f), Vector3.zero, this.bag.transform);
item.forSale = true;
item.backImage.gameObject.transform.SetParent(Links.x.inventory.merchantBag.transform);
item.transform.SetAsLastSibling();
int mainBagX = this.bag.mainBagX;
int mainBagY = this.bag.mainBagY;
if (Links.x.inventory.FindOpenSpace(this.bag.transform.position, item, mainBagX, mainBagY, "Secondary", Links.x.inventory.merchantBag))
{
this.items.Add(item);
}
else
{
item.DestroyItem(false, false);
Debug.Log("no spot found for " + item.ID.ToString());
}
if (this.isBoro())
{
Records.x.boroWeight += item.invRow._Weight;
}
item.CheckStackSize();
}
if (num13 == 10)
{
num13 = 0;
}
else
{
num13++;
}
}
}
if (this.savedMerchantHistory != "" && this.savedMerchantHistory != null && !this.merchantCharacter.isBoro)
{
this.history.Clear();
this.historyCounts.Clear();
char c2 = ',';
string[] array2 = new string[0];
array2 = this.savedMerchantHistory.Split(c2, StringSplitOptions.None);
int num16 = array2.Length;
int num17 = 0;
for (int k = 0; k < num16; k++)
{
if (num17 == 0)
{
string text3 = array2[k];
int num18 = 0;
if (text3 != "")
{
int.TryParse(array2[k + 1], out num18);
this.historyCounts.Add(num18);
this.history.Add(text3);
}
}
if (num17 == 1)
{
num17 = 0;
}
else
{
num17++;
}
}
}
else
{
this.history.Clear();
this.historyCounts.Clear();
this.savedMerchantHistory = "";
}
this.setup = false;
if (this.isBoro())
{
if (!this.boat)
{
this.SetWeightText();
}
else
{
Links.x.inventory.peddlerHeader.text = "Loot";
}
Links.x.inventory.peddlerFabric.enabled = false;
Links.x.inventory.peddlerEmeraldBackground.sprite = Links.x.inventory.emeraldsNone;
return;
}
Links.x.inventory.peddlerFabric.enabled = true;
Links.x.inventory.peddlerEmeraldBackground.sprite = Links.x.inventory.emeraldsHigh;
Links.x.inventory.peddlerHeader.text = "<font=Bold>" + this.merchantCharacter.stats.GetName() + "'s Cart</font>";
}
// Token: 0x0600124E RID: 4686 RVA: 0x00164308 File Offset: 0x00162508
public void ReturnFromDrag(Item newItem)
{
int mainBagX = this.bag.mainBagX;
int mainBagY = this.bag.mainBagY;
bool flag = Links.x.inventory.FindOpenSpace(this.bag.transform.position, newItem, mainBagX, mainBagY, "Secondary", Links.x.inventory.merchantBag);
Debug.Log("Found spot " + flag.ToString());
if (!flag)
{
newItem.DestroyItem(false, false);
Debug.Log("no spot found for " + newItem.ID.ToString());
}
}
// Token: 0x0600124F RID: 4687 RVA: 0x001643A0 File Offset: 0x001625A0
private void SetWeightText()
{
if (this.isBoro() && !this.boat)
{
Records.x.boroWeight = 0f;
int count = this.items.Count;
for (int i = 0; i < count; i++)
{
Item item = this.items[i];
if (item)
{
Records.x.boroWeight += item.invRow._Weight;
}
}
float num = Mathf.Round(Records.x.boroWeight);
float num2 = Records.x.BoroMaxWeight();
Links.x.inventory.peddlerHeader.text = string.Concat(new string[]
{
"Pack weight: <font=Bold>",
num.ToString(),
"/",
num2.ToString(),
"</font>"
});
}
}
// Token: 0x06001250 RID: 4688 RVA: 0x0016448D File Offset: 0x0016268D
public bool isBoro()
{
return (!this.merchantCharacter && this.boat) || this.merchantCharacter.isBoro;
}
// Token: 0x04001E1C RID: 7708
public Character merchantCharacter;
// Token: 0x04001E1D RID: 7709
public List<Item> items = new List<Item>();
// Token: 0x04001E1E RID: 7710
public List<int> itemIDs = new List<int>();
// Token: 0x04001E1F RID: 7711
public Bag bag;
// Token: 0x04001E20 RID: 7712
public List<string> history = new List<string>();
// Token: 0x04001E21 RID: 7713
public List<int> historyCounts = new List<int>();
// Token: 0x04001E22 RID: 7714
private List<int> localImg;
// Token: 0x04001E23 RID: 7715
private List<Image> gridImg;
// Token: 0x04001E24 RID: 7716
private List<bool> gridState;
// Token: 0x04001E25 RID: 7717
public string savedMerchantList;
// Token: 0x04001E26 RID: 7718
public string savedMerchantHistory;
// Token: 0x04001E27 RID: 7719
private StringFast str = new StringFast(64);
// Token: 0x04001E28 RID: 7720
private bool setup;
// Token: 0x04001E29 RID: 7721
public bool isBoat;
// Token: 0x04001E2A RID: 7722
public bool onlySelling;
// Token: 0x04001E2B RID: 7723
public Boat boat;
// Token: 0x04001E2C RID: 7724
public CreatureActions creature;
}