using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using DarkTonic.MasterAudio;
using Pathfinding;
using PixelCrushers.DialogueSystem;
using UnityEngine;

// Token: 0x02000051 RID: 81
public class Stats : MonoBehaviour
{
	// Token: 0x0600091E RID: 2334 RVA: 0x000C3DEB File Offset: 0x000C1FEB
	private void Start()
	{
	}

	// Token: 0x0600091F RID: 2335 RVA: 0x000C3DF0 File Offset: 0x000C1FF0
	public void SetupStats(Character self, string n)
	{
		this.character = self;
		this.xmlName = n;
		if (this.character.party && (!Records.x.editor || (Records.x.editor && (!Records.x.useTestCharacters || !Records.x.skipMainMenu))))
		{
			if (!n.Contains("Boro"))
			{
				this.xmlName = "Protagonist";
			}
			if (Records.x.banquetIsle && n.Contains("Bloodless"))
			{
				this.xmlName = "BloodlessHunter";
			}
		}
		this.characterRow = Links.x.library.GetPCRowFromName(this.xmlName);
		if (this.characterRow == null)
		{
			Debug.Log("null character row for " + this.xmlName);
		}
		this.originalMap = Links.x.diorama.sceneName;
		this.creaturesName = this.xmlName;
		this.canUseTwoWeapons = true;
		this.state = "";
		this.useItemsAI = 45;
		this.autoBuffsAI = 2;
		this.autoCritsAI = 25;
		this.level = this.characterRow._Level;
		if (this.character.party && Records.x.banquetIsle)
		{
			if (n.Contains("Bloodless"))
			{
				this.level = 49;
				this.XP = 300126;
			}
			if (n.Contains("Viorica"))
			{
				this.level = 9;
				this.XP = 1800;
			}
			if (n.Contains("Emil"))
			{
				this.level = 8;
				this.XP = 2200;
			}
		}
		this.modalWindowsOpen = true;
		this.songPoints = this.SongPointsMax();
		if (!this.character.npc)
		{
			if (ES3.FileExists(Records.x.openBook + "/Party1.es3"))
			{
				this.LoadFromDB();
			}
			else
			{
				this.LoadFromDB();
			}
		}
		else
		{
			this.LoadFromDB();
		}
		if (this.character.party && (!Records.x.editor || (Records.x.editor && (!Records.x.useTestCharacters || !Records.x.skipMainMenu))) && !n.Contains("Boro") && !n.Contains("Bloodless"))
		{
			this.displayName = n;
		}
		if (this.character.party)
		{
			if ((!Records.x.editor || (Records.x.editor && (!Records.x.useTestCharacters || !Records.x.skipMainMenu))) && !n.Contains("Boro") && !n.Contains("Bloodless"))
			{
				this.xmlName = "Protagonist";
				this.displayName = n;
				n = this.xmlName;
			}
			this.maxStamina = 30f;
			this.stamina = 30f;
			this.canCharge = true;
		}
		this.currLife = this.HealthMax();
		this.magicPoints = 0;
		if (this.character.npc)
		{
			this.magicPoints = this.magicPointsBase;
			if (Records.x.banquetIsle)
			{
				this.magicPoints = 300;
			}
		}
		this.CarryingWeight();
		if ((this.dialogueFile != "" && this.initiateDialogue >= 1 && this.initiateDialogue < 10) || this.initiateDialogue >= 11)
		{
			this.canTalk = true;
		}
	}

	// Token: 0x06000920 RID: 2336 RVA: 0x000C4150 File Offset: 0x000C2350
	public void ChangingScene()
	{
		List<Effects> list = new List<Effects>();
		foreach (Effects effects in this.effects)
		{
			list.Add(effects);
		}
		for (int i = 0; i < list.Count; i++)
		{
			list[i].Healed(this.character.dead, false);
		}
	}

	// Token: 0x06000921 RID: 2337 RVA: 0x000C41D4 File Offset: 0x000C23D4
	public void RemoveEffect(Effects effect, string n)
	{
		int num = this.effects.IndexOf(effect);
		if (num > -1)
		{
			if (num < this.effects.Count)
			{
				this.effects.RemoveAt(num);
				return;
			}
		}
		else if (Records.x.editor)
		{
			Debug.Log("Effect gone " + n + " " + ((this != null) ? this.ToString() : null));
		}
	}

	// Token: 0x06000922 RID: 2338 RVA: 0x000C423C File Offset: 0x000C243C
	public void ReturnPooledEffects()
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			this.effects[i].ReturnPooledEffects();
		}
	}

	// Token: 0x06000923 RID: 2339 RVA: 0x000C4270 File Offset: 0x000C2470
	public void RemoveAllAilments()
	{
		List<Effects> list = new List<Effects>();
		foreach (Effects effects in this.effects)
		{
			if (!effects.effect._IsBuff)
			{
				list.Add(effects);
			}
		}
		for (int i = 0; i < list.Count; i++)
		{
			list[i].Healed(this.character.dead, false);
		}
	}

	// Token: 0x06000924 RID: 2340 RVA: 0x000C4300 File Offset: 0x000C2500
	public void ClearAilments()
	{
		this.RemoveAllAilments();
		this.effects.Clear();
	}

	// Token: 0x06000925 RID: 2341 RVA: 0x000C4313 File Offset: 0x000C2513
	public void AddEffect(Effects effect, int var1, float level)
	{
		if (!this.effects.Contains(effect))
		{
			this.effects.Add(effect);
		}
	}

	// Token: 0x06000926 RID: 2342 RVA: 0x000C4330 File Offset: 0x000C2530
	public void RemoveNullAilments()
	{
		if (this.effects.Count > 0)
		{
			int count = this.effects.Count;
			for (int i = 0; i < this.effects.Count; i++)
			{
				this.effects[i];
			}
		}
		this.effects.RemoveAll((Effects item) => item == null);
	}

	// Token: 0x06000927 RID: 2343 RVA: 0x000C43AA File Offset: 0x000C25AA
	public void SaveEffects()
	{
	}

	// Token: 0x06000928 RID: 2344 RVA: 0x000C43AC File Offset: 0x000C25AC
	public void HealAll()
	{
		this.temp.Clear();
		for (int i = 0; i < this.effects.Count; i++)
		{
			this.temp.Add(this.effects[i]);
		}
		int count = this.temp.Count;
		for (int j = 0; j < count; j++)
		{
			this.temp[j].Healed(false, true);
		}
		this.currLife = this.HealthMax();
		if (this.character.downed)
		{
			this.character.downed = false;
			this.character.GetUp();
		}
		if (this.character.portrait)
		{
			this.character.portrait.SetHealthColor();
		}
		if (this.character.dockFriend)
		{
			this.character.dockFriend.UpdateHealth();
		}
		this.UpdateStats();
	}

	// Token: 0x06000929 RID: 2345 RVA: 0x000C4498 File Offset: 0x000C2698
	public int GetMaxRadiusFromAbilities()
	{
		int count = this.abilityNames.Count;
		int num = 0;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityLevels[i].x > 0f || (this.abilityLevels[i].x == 0f && this.abilityRows[i]._IsSpell))
			{
				Library.Effects effectRow = Links.x.library.GetEffectRow(this.abilityNames[i]);
				if (this.abilityRows[i]._AINotes.Contains("Crowd") && effectRow != null && effectRow._TileRadius > 0 && effectRow._TileRadius > num)
				{
					num = effectRow._TileRadius;
				}
			}
		}
		return num;
	}

	// Token: 0x0600092A RID: 2346 RVA: 0x000C4560 File Offset: 0x000C2760
	public int GetLevel(string abilityName)
	{
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityNames[i] == abilityName)
			{
				return (int)this.abilityLevels[i].x;
			}
		}
		return 0;
	}

	// Token: 0x0600092B RID: 2347 RVA: 0x000C45B0 File Offset: 0x000C27B0
	public Effects GetExistingEffect(string n)
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i] && this.effects[i].effectName == n)
			{
				return this.effects[i];
			}
		}
		return null;
	}

	// Token: 0x0600092C RID: 2348 RVA: 0x000C4610 File Offset: 0x000C2810
	public float GetAmplifyEffects()
	{
		float num = 0f;
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i])
			{
				if (this.effects[i].effect._Script.Contains("AmplifyWounds"))
				{
					num += this.effects[i].sourceLevel;
				}
				if (this.effects[i].effect._Script.Contains("PukeSpore"))
				{
					num += this.effects[i].sourceLevel;
				}
			}
		}
		return num;
	}

	// Token: 0x0600092D RID: 2349 RVA: 0x000C46C0 File Offset: 0x000C28C0
	public float AddPotionBoosts()
	{
		float num = 0f;
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i])
			{
				if (this.effects[i].effect._Name.Contains("HarvestOverflowing"))
				{
					num += this.effects[i].sourceLevel;
				}
				if (this.effects[i].effect._Name.Contains("HarvestOverflowing"))
				{
					num += this.effects[i].sourceLevel;
				}
			}
		}
		return num;
	}

	// Token: 0x0600092E RID: 2350 RVA: 0x000C4770 File Offset: 0x000C2970
	public int GetStatusCount(Effects exclude, string type)
	{
		int num = 0;
		for (int i = 0; i < this.effects.Count; i++)
		{
			Effects effects = this.effects[i];
			if (effects && effects != exclude)
			{
				if (type == "Stun")
				{
					if (effects.effect._Stun > 0)
					{
						num++;
					}
				}
				else if (type == "Flee")
				{
					if (effects.effect._Flee > 0)
					{
						num++;
					}
				}
				else if (type == "Stuck")
				{
					if (effects.effect._StuckInPlace > 0)
					{
						num++;
					}
				}
				else if (type == "Confuse" && effects.effect._Confuse > 0)
				{
					num++;
				}
			}
		}
		return num;
	}

	// Token: 0x0600092F RID: 2351 RVA: 0x000C4844 File Offset: 0x000C2A44
	public bool HasInstrumentEffect(string n)
	{
		int count = this.effects.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.effects[i] && this.effects[i].hasAbility && this.effects[i].ability._MainSkill == n)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000930 RID: 2352 RVA: 0x000C48B0 File Offset: 0x000C2AB0
	public bool HasEffect(string n)
	{
		int count = this.effects.Count;
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i] && this.effects[i].effectName == n)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000931 RID: 2353 RVA: 0x000C4910 File Offset: 0x000C2B10
	public void RemoveCurrentSong(bool isBuff)
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			Effects effects = this.effects[i];
			if (effects && effects.effect._IsSong && ((effects.effect._IsBuff && isBuff) || (!effects.effect._IsBuff && !isBuff)))
			{
				effects.Healed(false, true);
				return;
			}
		}
	}

	// Token: 0x06000932 RID: 2354 RVA: 0x000C4980 File Offset: 0x000C2B80
	public bool HasSongBuff()
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			Effects effects = this.effects[i];
			if (effects && effects.effect._IsSong && effects.effect._IsBuff)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000933 RID: 2355 RVA: 0x000C49D8 File Offset: 0x000C2BD8
	public bool HasSongAilment()
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			Effects effects = this.effects[i];
			if (effects && effects.effect._IsSong && !effects.effect._IsBuff)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000934 RID: 2356 RVA: 0x000C4A30 File Offset: 0x000C2C30
	public bool HasAilment()
	{
		bool flag = false;
		int count = this.effects.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.effects[i] && !this.effects[i].effect._IsBuff)
			{
				return true;
			}
		}
		return flag;
	}

	// Token: 0x06000935 RID: 2357 RVA: 0x000C4A88 File Offset: 0x000C2C88
	public void HealEffect(string n)
	{
		for (int i = 0; i < 10; i++)
		{
			bool flag = false;
			int count = this.effects.Count;
			for (int j = 0; j < count; j++)
			{
				if (!flag && j < this.effects.Count && this.effects[j] && this.effects[j].effectName == n)
				{
					this.effects[j].Healed(false, true);
					flag = true;
				}
			}
		}
	}

	// Token: 0x06000936 RID: 2358 RVA: 0x000C4B10 File Offset: 0x000C2D10
	public void HealEffectExcept(string n, Effects e)
	{
		for (int i = 0; i < 10; i++)
		{
			bool flag = false;
			int count = this.effects.Count;
			for (int j = 0; j < count; j++)
			{
				if (!flag && j < this.effects.Count && this.effects[j] && this.effects[j].effectName == n && this.effects[j] != e)
				{
					this.effects[j].Healed(false, true);
					flag = true;
				}
			}
		}
	}

	// Token: 0x06000937 RID: 2359 RVA: 0x000C4BB0 File Offset: 0x000C2DB0
	public bool HasEffectAndCure(string n)
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i] && this.effects[i].effectName == n && i < this.effects.Count && this.effects[i])
			{
				this.effects[i].Healed(false, true);
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000938 RID: 2360 RVA: 0x000C4C38 File Offset: 0x000C2E38
	public void RemoveTileEffect(Effects effect)
	{
		int count = this.effects.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.effects[i] == effect)
			{
				this.effects[i].Healed(this.character.dead, true);
				return;
			}
		}
	}

	// Token: 0x06000939 RID: 2361 RVA: 0x000C4C90 File Offset: 0x000C2E90
	public void ChangeAilmentMultiplier(float amt, bool isBuff, bool healed)
	{
		for (int i = 0; i < this.effects.Count; i++)
		{
			this.effects[i].ChangeAilmentMultiplier(amt, isBuff, healed);
		}
	}

	// Token: 0x0600093A RID: 2362 RVA: 0x000C4CC8 File Offset: 0x000C2EC8
	public void SpawnStartingEffect()
	{
		if (this.characterRow._StartingEffect != "")
		{
			bool flag = true;
			if (this.xmlName.Contains("RozafirFarmer"))
			{
				QuestState questState = QuestLog.GetQuestState("D6_Licech");
				if (questState != QuestState.Unassigned && questState != QuestState.Active && questState != QuestState.ActivePart2 && questState != QuestState.Discussed)
				{
					flag = false;
				}
			}
			if (flag)
			{
				if (Records.x.testQuests)
				{
					Debug.Log(((this != null) ? this.ToString() : null) + " " + this.characterRow._StartingEffect);
				}
				Effects effects = base.gameObject.AddComponent<Effects>();
				Links.x.cellar.AddEffects(effects);
				effects.gameObject.SetActive(true);
				this.effects.Add(effects);
				effects.source = null;
				effects.effectStartTime = 0;
				effects.target = this.character;
				effects.fromLoad = true;
				effects.effectName = this.characterRow._StartingEffect;
				effects.sourceLevel = 0f;
				effects.Inflicted(false);
			}
		}
	}

	// Token: 0x0600093B RID: 2363 RVA: 0x000C4DDC File Offset: 0x000C2FDC
	public void SpawnEffects()
	{
		if (this.effectsNamesFromSave.Count > 0)
		{
			int count = this.effectsNamesFromSave.Count;
			for (int i = 0; i < this.effectsNamesFromSave.Count; i++)
			{
				Library.Effects effectRow = Links.x.library.GetEffectRow(this.effectsNamesFromSave[i]);
				if (effectRow != null && !effectRow._IsIntercession && !effectRow._Name.Contains("Ring") && !effectRow._Name.Contains("Circle") && !effectRow._Name.Contains("Circlet") && !effectRow._Name.Contains("Earring") && !effectRow._WhileOnTile && effectRow._Name != "Leader" && effectRow._Name != "Follower")
				{
					Effects effects = base.gameObject.AddComponent<Effects>();
					Links.x.cellar.AddEffects(effects);
					effects.gameObject.SetActive(true);
					this.effects.Add(effects);
					effects.source = null;
					float num = (float)this.effectsTimesFromSave[i];
					effects.target = this.character;
					effects.fromLoad = true;
					effects.effectName = this.effectsNamesFromSave[i];
					effects.sourceLevel = this.effectsVar2FromSave[i];
					effects.Inflicted(false);
					if (effects)
					{
						effects.effectStartTime = (int)num;
					}
				}
			}
		}
		this.effectsNamesFromSave.Clear();
		this.effectsTimesFromSave.Clear();
		this.effectsVar2FromSave.Clear();
	}

	// Token: 0x0600093C RID: 2364 RVA: 0x000C4F94 File Offset: 0x000C3194
	public string GetStatusEffects(bool characterSheet)
	{
		int count = this.effects.Count;
		this.str.Clear();
		int num = 0;
		if (this.character.stunned && characterSheet)
		{
			this.str.Append("<color ");
			this.str.Append(Links.x.characterSheet.hoverColor);
			this.str.Append(">");
			this.str.Append("Stunned</color>\nKnocked out for up to 24 hours\n");
			int num2 = (int)this.character.timeOfDeath - (int)Mathf.Floor((float)Links.x.gameplay.GetCurrentGameTimeHours());
			this.str.Append(num2);
			if ((float)num2 != 1f)
			{
				this.str.Append(" hours remaining\n");
			}
			else
			{
				this.str.Append(" hour remaining\n");
			}
		}
		for (int i = 0; i < count; i++)
		{
			if (this.effects[i].effect._ShowInStatus && !this.effects[i].effect._Permanent)
			{
				if (num == 0)
				{
					if (characterSheet)
					{
						this.str.Append("<color ");
						this.str.Append(Links.x.characterSheet.hoverColor);
						this.str.Append(">");
					}
				}
				else if (characterSheet)
				{
					this.str.Append("\n");
					this.str.Append("<color ");
					this.str.Append(Links.x.characterSheet.hoverColor);
					this.str.Append(">");
				}
				else
				{
					this.str.Append(", ");
				}
				this.str.Append(this.effects[i].effect._DisplayName);
				if (characterSheet)
				{
					this.str.Append("</color>");
					this.str.Append("\n");
					this.str.Append(this.effects[i].displayEffects);
				}
				if (this.effects[i].effect._OverallTime > 0f && !this.effects[i].effect._OverTime)
				{
					int num3 = this.effects[i].effectStartTime + this.effects[i].timeToWait - (int)Links.x.gameplay.seconds;
					if (num3 < 0)
					{
						num3 *= -1;
					}
					num3 = (int)Records.x.ShowSeconds(num3);
					if (characterSheet)
					{
						if (this.effects[i].displayEffects != "")
						{
							this.str.Append("\n</color>");
						}
					}
					else
					{
						this.str.Append(" (");
					}
					this.str.Append(num3);
					if (characterSheet)
					{
						if ((float)num3 != 1f)
						{
							this.str.Append(" seconds remaining\n");
						}
						else
						{
							this.str.Append(" second remaining\n");
						}
					}
					else
					{
						this.str.Append("s)");
					}
				}
				else if (characterSheet)
				{
					this.str.Append("\n");
				}
				num++;
			}
		}
		string text = this.str.ToString();
		if (text == "")
		{
			return "";
		}
		return text;
	}

	// Token: 0x0600093D RID: 2365 RVA: 0x000C5340 File Offset: 0x000C3540
	public float GetStatusEffectDuration(string effect)
	{
		int count = this.effects.Count;
		float num = 0f;
		for (int i = 0; i < count; i++)
		{
			if (effect == this.effects[i].effect._Name && this.effects[i].effect._OverallTime > num)
			{
				num = (float)(this.effects[i].effectStartTime + this.effects[i].timeToWait - (int)Links.x.gameplay.seconds);
			}
		}
		return num;
	}

	// Token: 0x0600093E RID: 2366 RVA: 0x000C53DC File Offset: 0x000C35DC
	public string GetStatusEffectSingle(string effect)
	{
		int count = this.effects.Count;
		bool flag = false;
		this.str.Clear();
		float num = 0f;
		for (int i = 0; i < count; i++)
		{
			if (effect == this.effects[i].effect._Name)
			{
				if (!flag)
				{
					this.str.Append(this.effects[i].effect._DisplayName);
				}
				flag = true;
				if (this.effects[i].effect._OverallTime > num)
				{
					num = (float)(this.effects[i].effectStartTime + this.effects[i].timeToWait - (int)Links.x.gameplay.seconds);
				}
			}
		}
		if (flag)
		{
			this.str.Append("<color #5E584D> (");
			float num2 = Records.x.ShowSeconds((int)num);
			if (num2 < 60f)
			{
				this.str.Append(num2);
				this.str.Append(" sec.)</color>");
			}
			else
			{
				float num3 = num2 / 60f;
				num3 = Mathf.Round(num3);
				this.str.Append(num3);
				this.str.Append(" min.)</color>");
			}
		}
		return this.str.ToString();
	}

	// Token: 0x0600093F RID: 2367 RVA: 0x000C5538 File Offset: 0x000C3738
	public void GetEffectStrings()
	{
		this.effectsNamesFromSave.Clear();
		this.effectsTimesFromSave.Clear();
		this.effectsVar2FromSave.Clear();
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i])
			{
				this.effectsNamesFromSave.Add(this.effects[i].effectName);
				this.effectsTimesFromSave.Add(this.effects[i].effectStartTime);
				this.effectsVar2FromSave.Add(this.effects[i].sourceLevel);
			}
		}
		if (this.effectsNamesFromSave.Count > 0)
		{
			this.str.Clear();
			int count = this.effectsNamesFromSave.Count;
			for (int j = 0; j < count; j++)
			{
				if (j > 0)
				{
					this.str.Append(",");
				}
				this.str.Append(this.effectsNamesFromSave[j]);
				this.str.Append(",");
				this.str.Append(this.effectsTimesFromSave[j]);
				this.str.Append(",");
				this.str.Append(0);
				this.str.Append(",");
				this.str.Append(this.effectsVar2FromSave[j]);
			}
			this.savedEffects = this.str.ToString();
			return;
		}
		this.savedEffects = "";
	}

	// Token: 0x06000940 RID: 2368 RVA: 0x000C56D8 File Offset: 0x000C38D8
	public void AddEffectFromLoad(string x, string y, string z, string w)
	{
		this.effectsNamesFromSave.Clear();
		this.effectsTimesFromSave.Clear();
		this.effectsVar2FromSave.Clear();
		this.effectsNamesFromSave.Add(x);
		if (y == null)
		{
			y = "0";
		}
		int num = 0;
		int.TryParse(y, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
		this.effectsTimesFromSave.Add(num);
		num = 0;
		int.TryParse(w, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
		this.effectsVar2FromSave.Add((float)num);
	}

	// Token: 0x06000941 RID: 2369 RVA: 0x000C5760 File Offset: 0x000C3960
	public void UpdateStats()
	{
	}

	// Token: 0x06000942 RID: 2370 RVA: 0x000C5762 File Offset: 0x000C3962
	public int XPToNextLevel()
	{
		return this.GetNextLevel(this.level);
	}

	// Token: 0x06000943 RID: 2371 RVA: 0x000C5770 File Offset: 0x000C3970
	public int XPToNextLevelForLevelUp()
	{
		int nextLevel = this.GetNextLevel(this.level);
		int xp = this.XP;
		return nextLevel - xp;
	}

	// Token: 0x06000944 RID: 2372 RVA: 0x000C5794 File Offset: 0x000C3994
	public void CheckThatXPLevelIsCorrect(int xpTest, int lvlTest)
	{
		if (Records.x.banquetIsle)
		{
			return;
		}
		int num = this.GetNextLevel(lvlTest - 1);
		if (lvlTest == 1)
		{
			num = 0;
		}
		int num2 = this.GetNextLevel(lvlTest) - 1;
		if (xpTest > num2 || xpTest < num)
		{
			Debug.Log("Level is wrong");
			Debug.Log(string.Concat(new string[]
			{
				", min: ",
				num.ToString(),
				" max: ",
				num2.ToString(),
				" xp: ",
				xpTest.ToString()
			}));
			bool flag = false;
			for (int i = lvlTest; i >= 1; i--)
			{
				if (!flag)
				{
					Debug.Log("Testing level " + i.ToString());
					num = this.GetNextLevel(i - 1) + 1;
					if (i == 1)
					{
						num = 0;
					}
					Debug.Log("level min is " + num.ToString());
					num2 = this.GetNextLevel(i) - 1;
					Debug.Log("level max is " + num2.ToString());
					if (xpTest <= num2 && xpTest >= num)
					{
						this.level = i;
						Debug.Log("Found correct level: " + i.ToString());
						flag = true;
						if (this.level == 3 && xpTest >= 225)
						{
							if (this.levelUps != "")
							{
								this.levelUps += ",";
							}
							this.levelUps += "2";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							if (this.levelUps != "")
							{
								this.levelUps += ",";
							}
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
						}
						if (this.level == 4 && xpTest >= 375)
						{
							if (this.levelUps != "")
							{
								this.levelUps += ",";
							}
							this.levelUps += "3";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							if (this.levelUps != "")
							{
								this.levelUps += ",";
							}
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
							this.levelUps += ",";
							this.levelUps += "-1";
						}
						if (this.level == 5)
						{
							if (xpTest >= 375)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "3";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 600)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "4";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
						}
						if (this.level == 6)
						{
							if (xpTest >= 375)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "3";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 600)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "4";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 900)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "5";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
						}
						if (this.level == 7)
						{
							if (xpTest >= 375)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "3";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 600)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "4";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 900)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "5";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
							if (xpTest >= 1250)
							{
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "6";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								if (this.levelUps != "")
								{
									this.levelUps += ",";
								}
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
								this.levelUps += ",";
								this.levelUps += "-1";
							}
						}
					}
				}
			}
		}
	}

	// Token: 0x06000945 RID: 2373 RVA: 0x000C6A2C File Offset: 0x000C4C2C
	public int GetNextLevel(int lvl)
	{
		if (lvl <= 1)
		{
			return 150;
		}
		if (lvl == 2)
		{
			return 600;
		}
		if (lvl == 3)
		{
			return 1350;
		}
		if (lvl == 4)
		{
			return 2400;
		}
		if (lvl == 5)
		{
			return 3750;
		}
		if (lvl == 6)
		{
			return 5400;
		}
		if (lvl == 7)
		{
			return 7350;
		}
		if (lvl == 8)
		{
			return 9600;
		}
		if (lvl == 9)
		{
			return 12150;
		}
		if (lvl == 10)
		{
			return 15000;
		}
		if (lvl == 11)
		{
			return 18150;
		}
		if (lvl == 12)
		{
			return 21600;
		}
		if (lvl == 13)
		{
			return 25350;
		}
		if (lvl == 14)
		{
			return 29400;
		}
		if (lvl == 15)
		{
			return 33750;
		}
		if (lvl == 16)
		{
			return 38400;
		}
		if (lvl == 17)
		{
			return 43350;
		}
		if (lvl == 18)
		{
			return 48600;
		}
		if (lvl == 19)
		{
			return 54150;
		}
		if (lvl == 20)
		{
			return 60000;
		}
		if (lvl == 21)
		{
			return 66150;
		}
		if (lvl == 22)
		{
			return 72600;
		}
		if (lvl == 23)
		{
			return 79350;
		}
		if (lvl == 24)
		{
			return 86400;
		}
		if (lvl == 25)
		{
			return 93750;
		}
		if (lvl == 26)
		{
			return 101400;
		}
		if (lvl == 27)
		{
			return 109350;
		}
		if (lvl == 28)
		{
			return 117600;
		}
		if (lvl == 29)
		{
			return 126150;
		}
		if (lvl == 30)
		{
			return 135000;
		}
		if (lvl == 31)
		{
			return 144150;
		}
		if (lvl == 32)
		{
			return 153600;
		}
		if (lvl == 33)
		{
			return 163350;
		}
		if (lvl == 34)
		{
			return 173400;
		}
		if (lvl == 35)
		{
			return 183750;
		}
		if (lvl == 36)
		{
			return 194400;
		}
		if (lvl == 37)
		{
			return 205350;
		}
		if (lvl == 38)
		{
			return 216600;
		}
		if (lvl == 39)
		{
			return 228150;
		}
		if (lvl == 40)
		{
			return 240000;
		}
		if (lvl == 41)
		{
			return 252150;
		}
		if (lvl == 42)
		{
			return 264600;
		}
		if (lvl == 43)
		{
			return 277350;
		}
		if (lvl == 44)
		{
			return 290400;
		}
		if (lvl == 45)
		{
			return 303750;
		}
		if (lvl == 46)
		{
			return 317400;
		}
		if (lvl == 47)
		{
			return 331350;
		}
		if (lvl == 48)
		{
			return 345600;
		}
		if (lvl == 49)
		{
			return 360150;
		}
		if (lvl == 50)
		{
			return 375000;
		}
		return lvl * lvl * 150;
	}

	// Token: 0x06000946 RID: 2374 RVA: 0x000C6C60 File Offset: 0x000C4E60
	public int GetNextLevelBefore1_3(int lvl)
	{
		if (lvl <= 1)
		{
			return 100;
		}
		if (lvl == 2)
		{
			return 225;
		}
		if (lvl == 3)
		{
			return 375;
		}
		if (lvl == 4)
		{
			return 600;
		}
		if (lvl == 5)
		{
			return 900;
		}
		if (lvl == 6)
		{
			return 1250;
		}
		if (lvl == 7)
		{
			return 1600;
		}
		if (lvl == 8)
		{
			return 2000;
		}
		if (lvl == 9)
		{
			return 2400;
		}
		if (lvl == 10)
		{
			return 2800;
		}
		if (lvl == 11)
		{
			return 3200;
		}
		if (lvl == 12)
		{
			return 3800;
		}
		if (lvl == 13)
		{
			return 7000;
		}
		if (lvl == 14)
		{
			return 10000;
		}
		if (lvl == 15)
		{
			return 15000;
		}
		if (lvl == 16)
		{
			return 21000;
		}
		if (lvl == 17)
		{
			return 27000;
		}
		if (lvl == 18)
		{
			return 35000;
		}
		if (lvl == 19)
		{
			return 45000;
		}
		if (lvl == 20)
		{
			return 55000;
		}
		if (lvl == 21)
		{
			return 65000;
		}
		if (lvl == 22)
		{
			return 75000;
		}
		if (lvl == 23)
		{
			return 85000;
		}
		if (lvl == 24)
		{
			return 95000;
		}
		if (lvl == 25)
		{
			return 105000;
		}
		if (lvl == 26)
		{
			return 115000;
		}
		if (lvl == 27)
		{
			return 125000;
		}
		if (lvl == 28)
		{
			return 135000;
		}
		if (lvl == 29)
		{
			return 145000;
		}
		if (lvl == 30)
		{
			return 155000;
		}
		return 999999;
	}

	// Token: 0x06000947 RID: 2375 RVA: 0x000C6DB4 File Offset: 0x000C4FB4
	public int CorrectLevelForXP(int prevXP, int prevLevel)
	{
		int num = this.GetNextLevel(prevLevel - 1);
		if (prevLevel == 1)
		{
			prevLevel = 0;
		}
		int num2 = this.GetNextLevel(prevLevel) - 1;
		if (prevXP <= num2 && prevXP >= num)
		{
			return prevLevel;
		}
		Debug.Log("Level is wrong");
		Debug.Log(string.Concat(new string[]
		{
			", min: ",
			num.ToString(),
			" max: ",
			num2.ToString(),
			" xp: ",
			prevXP.ToString()
		}));
		bool flag = false;
		int num3 = prevLevel;
		for (int i = 50; i >= 1; i--)
		{
			if (!flag)
			{
				Debug.Log("Testing level " + i.ToString());
				num = this.GetNextLevel(i - 1) + 1;
				if (i == 1)
				{
					num = 0;
				}
				Debug.Log("level min is " + num.ToString());
				num2 = this.GetNextLevel(i) - 1;
				Debug.Log("level max is " + num2.ToString());
				if (prevXP <= num2 && prevXP >= num)
				{
					num3 = i;
					Debug.Log("Found correct level: " + i.ToString());
					flag = true;
				}
			}
		}
		return num3;
	}

	// Token: 0x06000948 RID: 2376 RVA: 0x000C6EDC File Offset: 0x000C50DC
	public void AddXP(int amt, Character target, bool show)
	{
		if (target && target.summoned)
		{
			return;
		}
		if (!this.character.dead && amt > 0)
		{
			if (target)
			{
				float num = (float)amt;
				if (target.numberOfTimesKilled == 1f)
				{
					num = (float)amt * 0.75f;
				}
				if (target.numberOfTimesKilled == 2f)
				{
					num = (float)amt * 0.5f;
				}
				if (target.numberOfTimesKilled == 3f)
				{
					num = (float)amt * 0.25f;
				}
				if (target.numberOfTimesKilled >= 4f)
				{
					num = 0f;
				}
				amt = Mathf.RoundToInt(num);
			}
			this.XP += amt;
			if (show)
			{
				this.ShowXP(amt);
			}
			this.CheckForLevelUp();
			this.str.Clear();
			this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
			this.str.Append(this.GetName());
			this.str.Append("</color>");
			this.str.Append(" +");
			this.str.Append(amt);
			this.str.Append(" XP");
			if (!Links.x.creation)
			{
				Links.x.gameFeed.AddFeed(this.str.ToString());
			}
			this.CheckForLevelUp();
		}
	}

	// Token: 0x06000949 RID: 2377 RVA: 0x000C7048 File Offset: 0x000C5248
	public void ShowXP(int amt)
	{
		Animator animatedText = Links.x.cellar.GetAnimatedText("XP", amt.ToString(), false);
		animatedText.gameObject.transform.position = this.character.body.HeadPosition(0f) + new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), 0f) + new Vector3(0f, 2.5f, 0f);
		animatedText.gameObject.transform.SetParent(this.character.tr, true);
		animatedText.gameObject.name = this.GetName();
		MasterAudio.PlaySoundAndForget("Feedback", 0.6f, new float?(1f), 0f, "XP", null);
	}

	// Token: 0x0600094A RID: 2378 RVA: 0x000C7138 File Offset: 0x000C5338
	public void CheckForLevelUp()
	{
		for (int i = 0; i < 30; i++)
		{
			int num = this.level;
			if (this.GetNextLevel(this.level) <= this.XP)
			{
				this.LevelUpSkills();
				if (this.levelUpCorout != null)
				{
					base.StopCoroutine(this.levelUpCorout);
					this.levelUpCorout = null;
				}
				this.levelUpCorout = this.LevelUpDelay("Skill");
				base.StartCoroutine(this.levelUpCorout);
				this.str.Clear();
				this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
				this.str.Append(this.GetName());
				this.str.Append("</color>");
				this.str.Append(" leveled up");
				Links.x.gameFeed.AddFeed(this.str.ToString());
			}
		}
	}

	// Token: 0x0600094B RID: 2379 RVA: 0x000C7230 File Offset: 0x000C5430
	private IEnumerator LevelUpDelay(string type)
	{
		yield return new WaitForSecondsRealtime(2f);
		Animator animator;
		if (type == "Skill")
		{
			animator = Links.x.cellar.GetAnimatedText("LevelUp", "", false);
		}
		else
		{
			animator = Links.x.cellar.GetAnimatedText("Text", "Stat+", false);
		}
		animator.gameObject.transform.position = this.character.body.HeadPosition(0f) + new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), 0f) + new Vector3(0f, 0.5f, 0f);
		animator.gameObject.transform.SetParent(this.character.tr, true);
		animator.gameObject.name = this.GetName();
		MasterAudio.PlaySoundAndForget("Feedback", 0.1f, new float?(1f), 0f, "LevelUp", null);
		this.levelUpCorout = null;
		yield break;
	}

	// Token: 0x0600094C RID: 2380 RVA: 0x000C7248 File Offset: 0x000C5448
	public void GetHighestSkills(out int highest1, out int highest2, out int highest3)
	{
		highest1 = -1;
		float num = -1f;
		highest2 = -1;
		highest3 = -1;
		for (int i = 0; i < this.skillsProgress.Count; i++)
		{
			if (this.skillsProgress[i] > num && this.skillsProgress[i] > 0f)
			{
				highest1 = i;
				num = this.skillsProgress[i];
			}
		}
		num = -1f;
		for (int j = 0; j < this.skillsProgress.Count; j++)
		{
			if (this.skillsProgress[j] > num && j != highest1 && this.skillsProgress[j] > 0f)
			{
				highest2 = j;
				num = this.skillsProgress[j];
			}
		}
		num = -1f;
		for (int k = 0; k < this.skillsProgress.Count; k++)
		{
			if (this.skillsProgress[k] > num && k != highest1 && k != highest2 && this.skillsProgress[k] > 0f)
			{
				highest3 = k;
				num = this.skillsProgress[k];
			}
		}
	}

	// Token: 0x0600094D RID: 2381 RVA: 0x000C7358 File Offset: 0x000C5558
	public void LevelUpSkills()
	{
		int num = 0;
		int num2 = 1;
		int num3 = 2;
		this.GetHighestSkills(out num, out num2, out num3);
		if (this.levelUps != "")
		{
			this.levelUps += ",";
		}
		this.levelUps += this.level.ToString();
		this.levelUps += ",";
		this.levelUps += num.ToString();
		this.levelUps += ",";
		this.levelUps += num2.ToString();
		this.levelUps += ",";
		this.levelUps += num3.ToString();
		for (int i = 0; i < this.skillsProgress.Count; i++)
		{
			this.skillsProgress[i] = 0f;
		}
		this.level++;
		this.LevelUpStats();
	}

	// Token: 0x0600094E RID: 2382 RVA: 0x000C7480 File Offset: 0x000C5680
	public void LevelUpStats()
	{
		if (this.levelUps != "")
		{
			this.levelUps += ",";
		}
		this.levelUps += "-1";
		this.levelUps += ",";
		this.levelUps += "-1";
		this.levelUps += ",";
		this.levelUps += "-1";
		this.levelUps += ",";
		this.levelUps += "-1";
		if (this.levelUpCorout != null)
		{
			base.StopCoroutine(this.levelUpCorout);
			this.levelUpCorout = null;
		}
		this.levelUpCorout = this.LevelUpDelay("Stat");
		base.StartCoroutine(this.levelUpCorout);
		this.str.Clear();
		this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
		this.str.Append(this.GetName());
		this.str.Append("</color>");
		Links.x.gameFeed.AddFeed(this.str.ToString());
	}

	// Token: 0x0600094F RID: 2383 RVA: 0x000C75F4 File Offset: 0x000C57F4
	public bool ShouldStun(Character target)
	{
		bool flag = false;
		if (target.party)
		{
			flag = false;
		}
		if (!this.character.npc && !Records.x.kill)
		{
			flag = true;
		}
		if (this.character.npc && (this.isGuard || this.allegiance == 6U))
		{
			if (!target)
			{
				return false;
			}
			if (target.stats.animal)
			{
				flag = false;
			}
			else
			{
				flag = true;
				if (!Records.x.kill && target.stats.allegiance == 7U && target.stats.xmlName.Contains("WestRuins"))
				{
					flag = false;
				}
			}
		}
		return flag;
	}

	// Token: 0x06000950 RID: 2384 RVA: 0x000C7697 File Offset: 0x000C5897
	public bool CanAttackStunned()
	{
		return !this.character.npc || (!this.isGuard && this.allegiance != 6U);
	}

	// Token: 0x06000951 RID: 2385 RVA: 0x000C76BC File Offset: 0x000C58BC
	public string GetDialogueName()
	{
		if (!this.character.npc)
		{
			return this.displayName;
		}
		if (this.initiateDialogue >= 10 && this.race != "Dryad")
		{
			return this.displayName + ", " + this.characterRow._GenericName;
		}
		if (this.characterRow._GenericName != "")
		{
			return this.characterRow._GenericName;
		}
		return this.displayName;
	}

	// Token: 0x06000952 RID: 2386 RVA: 0x000C7740 File Offset: 0x000C5940
	public string GetName()
	{
		if (this.character.ghost)
		{
			return "Ghost";
		}
		if (!this.character.npc)
		{
			return this.displayName;
		}
		if (this.initiateDialogue >= 10)
		{
			return this.displayName;
		}
		if (this.characterRow._GenericName != "")
		{
			return this.characterRow._GenericName;
		}
		if (this.race.Contains("Forest"))
		{
			return "Forest creature";
		}
		if (this.race.Contains("Shroom"))
		{
			return "Shroom creature";
		}
		if (this.race.Contains("Fish"))
		{
			return "Fish creature";
		}
		if (this.race.Contains("Beast"))
		{
			return "Beast";
		}
		if (this.race.Contains("Demon"))
		{
			return "Demon";
		}
		return this.displayName;
	}

	// Token: 0x06000953 RID: 2387 RVA: 0x000C7826 File Offset: 0x000C5A26
	public string GetDisplayName()
	{
		return this.displayName;
	}

	// Token: 0x06000954 RID: 2388 RVA: 0x000C782E File Offset: 0x000C5A2E
	public string GetGenericName()
	{
		return this.characterRow._GenericName;
	}

	// Token: 0x06000955 RID: 2389 RVA: 0x000C783C File Offset: 0x000C5A3C
	public void UpdateDiceModifiers(int type, int count, int sides, bool removing)
	{
		if (!removing)
		{
			this.diceCountMods.Add(count);
			this.diceSideMods.Add(sides);
			this.diceTypeMods.Add(type);
			return;
		}
		int num = -1;
		for (int i = 0; i < this.diceTypeMods.Count; i++)
		{
			if (this.diceCountMods[i] == count && this.diceSideMods[i] == sides && this.diceTypeMods[i] == type)
			{
				num = i;
				break;
			}
		}
		if (num > -1)
		{
			this.diceCountMods.RemoveAt(num);
			this.diceSideMods.RemoveAt(num);
			this.diceTypeMods.RemoveAt(num);
		}
	}

	// Token: 0x06000956 RID: 2390 RVA: 0x000C78E3 File Offset: 0x000C5AE3
	public int GetDiceModifier(int type)
	{
		return 0;
	}

	// Token: 0x06000957 RID: 2391 RVA: 0x000C78E6 File Offset: 0x000C5AE6
	public int GetDiceModifierAverage(int type)
	{
		return 0;
	}

	// Token: 0x06000958 RID: 2392 RVA: 0x000C78EC File Offset: 0x000C5AEC
	public int GetFlatModifier(int type)
	{
		if (type == 0)
		{
			return (int)this.strengthModFlat;
		}
		if (type == 1)
		{
			return (int)this.agilityModFlat;
		}
		if (type == 2)
		{
			return (int)this.auraModFlat;
		}
		if (type == 3)
		{
			return (int)this.paganModFlat;
		}
		if (type == 4)
		{
			return (int)this.dexterityModFlat;
		}
		if (type == 5)
		{
			return (int)this.sensoryModFlat;
		}
		if (type == 6)
		{
			return (int)this.severityModFlat;
		}
		if (type == 7)
		{
			return (int)this.paganSeverityModFlat;
		}
		if (type == 8)
		{
			return (int)this.hitModFlat;
		}
		if (type == 9)
		{
			return (int)this.paganHitModFlat;
		}
		if (type == 10)
		{
			return (int)this.evadeModFlat;
		}
		if (type == 11)
		{
			return (int)this.blockModFlat;
		}
		return 0;
	}

	// Token: 0x06000959 RID: 2393 RVA: 0x000C798C File Offset: 0x000C5B8C
	public int GetCombatSkillID(string mainSkill)
	{
		int num = 0;
		if (mainSkill == "Whip")
		{
			num = 35;
		}
		if (mainSkill == "Pole")
		{
			num = 8;
		}
		if (mainSkill == "Scepter" || mainSkill == "Scepter")
		{
			num = 6;
		}
		if (mainSkill == "Sword")
		{
			num = 5;
		}
		if (mainSkill == "ShortSword")
		{
			num = 4;
		}
		if (mainSkill == "Sling")
		{
			num = 11;
		}
		if (mainSkill == "Ax")
		{
			num = 7;
		}
		if (mainSkill == "Bow")
		{
			num = 10;
		}
		if (mainSkill == "Edge")
		{
			num = 4;
		}
		if (mainSkill == "Bindings")
		{
			num = 16;
		}
		if (mainSkill == "Fauna")
		{
			num = 17;
		}
		if (mainSkill == "Vines")
		{
			num = 18;
		}
		if (mainSkill == "Spores")
		{
			num = 19;
		}
		if (mainSkill == "Elixir")
		{
			num = 12;
		}
		if (mainSkill == "LargeShield")
		{
			num = 14;
		}
		if (mainSkill == "SmallShield")
		{
			num = 15;
		}
		if (mainSkill == "Hand-to-Hand")
		{
			num = 13;
		}
		if (mainSkill == "Flute")
		{
			num = 26;
		}
		if (mainSkill == "Horn")
		{
			num = 27;
		}
		if (mainSkill == "Pipe")
		{
			num = 29;
		}
		if (mainSkill == "Pearl")
		{
			num = 1;
		}
		if (mainSkill == "Stonewood")
		{
			num = 3;
		}
		if (mainSkill == "Robes")
		{
			num = 0;
		}
		if (mainSkill == "Crimscale")
		{
			num = 2;
		}
		if (mainSkill == "Multi-Hand")
		{
			num = 9;
		}
		if (mainSkill == "Flute")
		{
			num = 26;
		}
		if (mainSkill == "Horn")
		{
			num = 27;
		}
		if (mainSkill == "Pipe")
		{
			num = 29;
		}
		return num;
	}

	// Token: 0x0600095A RID: 2394 RVA: 0x000C7B60 File Offset: 0x000C5D60
	public int GetArmorSkillID(string mainSkill)
	{
		int num = 0;
		if (mainSkill == "Pearl")
		{
			num = 1;
		}
		if (mainSkill == "Stonewood")
		{
			num = 3;
		}
		if (mainSkill == "Robes")
		{
			num = 0;
		}
		if (mainSkill == "Crimscale")
		{
			num = 2;
		}
		return num;
	}

	// Token: 0x0600095B RID: 2395 RVA: 0x000C7BAC File Offset: 0x000C5DAC
	public int GetCharmerSkillID(string mainSkill)
	{
		int num = 0;
		if (mainSkill == "Forest")
		{
			num = 24;
		}
		if (mainSkill == "Fish")
		{
			num = 23;
		}
		if (mainSkill == "Shroom")
		{
			num = 25;
		}
		return num;
	}

	// Token: 0x0600095C RID: 2396 RVA: 0x000C7BEC File Offset: 0x000C5DEC
	public float R2(float x)
	{
		return Mathf.Round(x * 10f) / 10f;
	}

	// Token: 0x0600095D RID: 2397 RVA: 0x000C7C00 File Offset: 0x000C5E00
	public float R1(float x)
	{
		return Mathf.Round(x * 10f) / 10f;
	}

	// Token: 0x0600095E RID: 2398 RVA: 0x000C7C14 File Offset: 0x000C5E14
	public float PartyAdventureMoveSpeed()
	{
		return Links.x.fellowship.GetPartyMoveSpeed();
	}

	// Token: 0x0600095F RID: 2399 RVA: 0x000C7C28 File Offset: 0x000C5E28
	public float MoveSpeed(bool forCharacterSheet)
	{
		float num = this.moveSpeedMod;
		float num2;
		if (!forCharacterSheet)
		{
			if (this.animal)
			{
				num2 = this.PaganMSNPC() + this.StrengthMSNPC() + this.AglMSNPC();
				num2 += this.MoveSpeedBaseNPC() * 35f;
			}
			else if (!this.character.party)
			{
				num2 = this.PaganMSNPC() + this.StrengthMSNPC() + this.AglMSNPC();
				if (this.character.inCombat)
				{
					num2 += this.MoveSpeedBaseNPC() * 60f;
				}
				else
				{
					num2 += this.MoveSpeedBaseNPC() * 91f;
				}
			}
			else
			{
				num2 = this.PaganMS() + this.StrengthMS() + this.AglMS();
				if (forCharacterSheet || this.character.inCombat)
				{
					num2 += 68f;
				}
				else
				{
					num2 += 97f;
				}
			}
			if (this.character.vipFollow || this.character.summoned)
			{
				if (this.character.animator.GetBool("Combat"))
				{
					num2 += this.MoveSpeedMS() * 100f;
				}
				else
				{
					num2 += this.R1(this.summonSpeed) * 100f;
				}
			}
			else
			{
				num2 += this.MoveSpeedMS() * 100f;
			}
			num2 *= 0.01f;
		}
		else
		{
			num2 = this.PaganMS() + this.StrengthMS() + this.AglMS();
		}
		if (this.character.party)
		{
			float num3 = this.BagWeightMS();
			num2 *= num3;
		}
		if (num != 0f)
		{
			float moveMod = this.GetMoveMod();
			num2 *= moveMod;
		}
		if (num2 < 0f)
		{
			num2 = 0.1f;
		}
		return this.R2(num2);
	}

	// Token: 0x06000960 RID: 2400 RVA: 0x000C7DC8 File Offset: 0x000C5FC8
	public float GetMoveMod()
	{
		float num = this.moveSpeedMod;
		if (num > 10f)
		{
			num = 10f;
		}
		if (num < -10f)
		{
			num = -10f;
		}
		float num2 = Mathf.Abs(num / 10f);
		if (num > 0f)
		{
			return this.R1(1f + num2);
		}
		return this.R1(1f - num2);
	}

	// Token: 0x06000961 RID: 2401 RVA: 0x000C7E28 File Offset: 0x000C6028
	public float MoveSpeedBaseNPC()
	{
		return 0.675f;
	}

	// Token: 0x06000962 RID: 2402 RVA: 0x000C7E2F File Offset: 0x000C602F
	public float MoveSpeedMS()
	{
		return this.R1(this.moveSpeed / 2f);
	}

	// Token: 0x06000963 RID: 2403 RVA: 0x000C7E43 File Offset: 0x000C6043
	public float PaganMS()
	{
		return this.R1((this.Pagan() + this.paganModFlat + (float)this.GetDiceModifierAverage(3)) / 10f);
	}

	// Token: 0x06000964 RID: 2404 RVA: 0x000C7E67 File Offset: 0x000C6067
	public float StrengthMS()
	{
		return this.R1((this.Strength() + this.strengthModFlat + (float)this.GetDiceModifierAverage(0)) / 10f);
	}

	// Token: 0x06000965 RID: 2405 RVA: 0x000C7E8B File Offset: 0x000C608B
	public float PaganMSNPC()
	{
		return this.R1((this.Pagan() + this.paganModFlat + (float)this.GetDiceModifierAverage(3)) / 3f);
	}

	// Token: 0x06000966 RID: 2406 RVA: 0x000C7EAF File Offset: 0x000C60AF
	public float StrengthMSNPC()
	{
		return this.R1((this.Strength() + this.strengthModFlat + (float)this.GetDiceModifierAverage(0)) / 3f);
	}

	// Token: 0x06000967 RID: 2407 RVA: 0x000C7ED3 File Offset: 0x000C60D3
	public float AglMSNPC()
	{
		return this.R1((this.Agility() + this.agilityModFlat + (float)this.GetDiceModifierAverage(1)) / 3f);
	}

	// Token: 0x06000968 RID: 2408 RVA: 0x000C7EF7 File Offset: 0x000C60F7
	public float AglMS()
	{
		return this.R1((this.Agility() + this.agilityModFlat + (float)this.GetDiceModifierAverage(1)) / 10f);
	}

	// Token: 0x06000969 RID: 2409 RVA: 0x000C7F1C File Offset: 0x000C611C
	public float BagWeightMS()
	{
		if (this.character.party && this.character.inventoryBag)
		{
			return 1f - Mathf.Clamp(this.R1(this.character.inventoryBag.weight / (float)this.CarryingWeight() * 0.4f), 0f, 0.4f);
		}
		return 1f;
	}

	// Token: 0x0600096A RID: 2410 RVA: 0x000C7F88 File Offset: 0x000C6188
	public float UtilitySpeed()
	{
		return 1f;
	}

	// Token: 0x0600096B RID: 2411 RVA: 0x000C7F8F File Offset: 0x000C618F
	public float ActionTime()
	{
		if (this.character.pipeSummons)
		{
			return 0.1f;
		}
		return this.AttackSpeed(this.currentHand, false, false);
	}

	// Token: 0x0600096C RID: 2412 RVA: 0x000C7FB4 File Offset: 0x000C61B4
	public float Initiative()
	{
		float num = (this.Agility() + this.agilityModFlat) / 300f;
		float num2 = (this.Sensory() + this.sensoryModFlat) / 300f;
		return this.R1(num + num2 + 0.3f);
	}

	// Token: 0x0600096D RID: 2413 RVA: 0x000C7FF8 File Offset: 0x000C61F8
	public float AttackSpeed(int index, bool forCharacterSheet, bool forAI)
	{
		float num = this.SkillAS(index);
		float num2 = this.AglAS(forCharacterSheet);
		float num3 = this.actionTimeMod;
		float num4 = this.BaseAtkSpeed(index) - num - num2 + num3;
		if (Records.x.showRuleset && !forCharacterSheet && !forAI)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s attack speed total: ",
				num4.ToString(),
				", agl mod: ",
				num2.ToString(),
				", skill: ",
				num.ToString(),
				", base: ",
				this.BaseAtkSpeed(index).ToString()
			}));
		}
		if (!forCharacterSheet)
		{
			if (this.lastActionModifier == 0f)
			{
				this.lastActionModifier = 1f;
			}
			num4 *= this.lastActionModifier;
			if (Records.x.filming && this.character.mainSelected)
			{
				num4 *= 0.5f;
			}
		}
		if (num4 < 0.1f)
		{
			num4 = 0.1f;
		}
		return this.R1(num4);
	}

	// Token: 0x0600096E RID: 2414 RVA: 0x000C8104 File Offset: 0x000C6304
	public float FreeAttackSpeed(int index, bool forCharacterSheet, bool forAI)
	{
		float num = this.SkillAS(index);
		float num2 = this.AglAS(forCharacterSheet);
		float num3 = this.actionTimeMod;
		float num4 = this.BaseAtkSpeed(index) - num - num2 + num3;
		if (Records.x.showRuleset && !forCharacterSheet && !forAI)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s attack speed total: ",
				num4.ToString(),
				", agl mod: ",
				num2.ToString(),
				", skill: ",
				num.ToString(),
				", base: ",
				this.BaseAtkSpeed(index).ToString()
			}));
		}
		if (!forCharacterSheet)
		{
			if (this.lastActionModifier == 0f)
			{
				this.lastActionModifier = 1f;
			}
			num4 *= this.lastActionModifier;
			if (Records.x.filming && this.character.mainSelected)
			{
				num4 *= 0.5f;
			}
		}
		num4 *= 0.1f;
		if (num4 < 0.1f)
		{
			num4 = 0.1f;
		}
		return this.R1(num4);
	}

	// Token: 0x0600096F RID: 2415 RVA: 0x000C8218 File Offset: 0x000C6418
	public float AglAS(bool forCharacterSheet)
	{
		float num = this.Agility() + this.agilityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(1);
		}
		else
		{
			num += (float)this.GetDiceModifier(1);
		}
		return this.R1(num / 75f);
	}

	// Token: 0x06000970 RID: 2416 RVA: 0x000C825B File Offset: 0x000C645B
	public bool HasShield()
	{
		return this.character.GetInvNum(2) > 1 && Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2))._EquipSlotID == 1;
	}

	// Token: 0x06000971 RID: 2417 RVA: 0x000C8292 File Offset: 0x000C6492
	public float ShieldAC()
	{
		if (this.character.GetInvNum(2) > 1)
		{
			return Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2))._AC;
		}
		return 0f;
	}

	// Token: 0x06000972 RID: 2418 RVA: 0x000C82CC File Offset: 0x000C64CC
	public float SkillAS(int index)
	{
		string text = "";
		if (index == 0 && this.character.invRow1 != null)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (index == 1 && this.character.invRow2 != null)
		{
			text = this.character.invRow2._MainSkill;
		}
		int num = this.GetCombatSkillID(text);
		if (index == 7 || index == 13 || index == 14)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(index * 2));
			if (invRowByIndex._MainSkill == "Flute")
			{
				num = 26;
			}
			if (invRowByIndex._MainSkill == "Horn")
			{
				num = 27;
			}
			if (invRowByIndex._MainSkill == "Pipe")
			{
				num = 29;
			}
			if (invRowByIndex._MainSkill.Contains("Elixir"))
			{
				num = 12;
			}
		}
		float num2 = this.GetSkill(num);
		if (num2 < 0f)
		{
			num2 = 0f;
		}
		num2 /= 400f;
		return this.R1(num2);
	}

	// Token: 0x06000973 RID: 2419 RVA: 0x000C83D0 File Offset: 0x000C65D0
	public float BaseAtkSpeed(int index)
	{
		if (this.HandCount() <= 1f)
		{
			if (this.character.invRow1 != null)
			{
				return this.character.invRow1._WpnSpeed;
			}
		}
		else if (this.character.invRow2 != null)
		{
			return (this.character.invRow1._WpnSpeed + this.character.invRow2._WpnSpeed) / 2f;
		}
		if (index == 7 || index == 13 || index == 14)
		{
			return Links.x.library.GetInvRowByIndex(this.character.GetInvNum(index * 2))._WpnSpeed;
		}
		return 3f;
	}

	// Token: 0x06000974 RID: 2420 RVA: 0x000C8474 File Offset: 0x000C6674
	public int GetCurrentHand()
	{
		if (this.character.actions)
		{
			int num = 0;
			if (this.character.actions.firstAttack && this.character.inAction && this.character.GetInvNum(2) > 1 && this.character.invRow2._EquipSlotID == 0)
			{
				num = 1;
			}
			return num;
		}
		return 0;
	}

	// Token: 0x06000975 RID: 2421 RVA: 0x000C84DA File Offset: 0x000C66DA
	private float Pagan()
	{
		if (this.pagan < 0f)
		{
			return 0f;
		}
		return this.pagan;
	}

	// Token: 0x06000976 RID: 2422 RVA: 0x000C84F5 File Offset: 0x000C66F5
	private float Dexterity()
	{
		if (this.dexterity < 0f)
		{
			return 0f;
		}
		return this.dexterity;
	}

	// Token: 0x06000977 RID: 2423 RVA: 0x000C8510 File Offset: 0x000C6710
	private float Strength()
	{
		if (this.strength < 0f)
		{
			return 0f;
		}
		return this.strength;
	}

	// Token: 0x06000978 RID: 2424 RVA: 0x000C852B File Offset: 0x000C672B
	private float Agility()
	{
		if (this.agility < 0f)
		{
			return 0f;
		}
		return this.agility;
	}

	// Token: 0x06000979 RID: 2425 RVA: 0x000C8546 File Offset: 0x000C6746
	private float Sensory()
	{
		if (this.sensory < 0f)
		{
			return 0f;
		}
		return this.sensory;
	}

	// Token: 0x0600097A RID: 2426 RVA: 0x000C8561 File Offset: 0x000C6761
	private float Aura()
	{
		if (this.aura < 0f)
		{
			return 0f;
		}
		return this.aura;
	}

	// Token: 0x0600097B RID: 2427 RVA: 0x000C857C File Offset: 0x000C677C
	public int SpiritCurrent()
	{
		return this.magicPoints;
	}

	// Token: 0x0600097C RID: 2428 RVA: 0x000C8584 File Offset: 0x000C6784
	public int SpiritMax()
	{
		return 90;
	}

	// Token: 0x0600097D RID: 2429 RVA: 0x000C8588 File Offset: 0x000C6788
	public float SpiritAura()
	{
		return this.R2((this.Pagan() + this.paganModFlat + (float)this.GetDiceModifierAverage(3)) / 50f);
	}

	// Token: 0x0600097E RID: 2430 RVA: 0x000C85AC File Offset: 0x000C67AC
	public float SpiritPagan()
	{
		return this.R2((this.Aura() + this.auraModFlat + (float)this.GetDiceModifierAverage(2)) / 100f);
	}

	// Token: 0x0600097F RID: 2431 RVA: 0x000C85D0 File Offset: 0x000C67D0
	public float SpiritAbsorptionMultiplier(bool characterSheet)
	{
		float num = this.SpiritAura();
		float num2 = this.SpiritPagan();
		return this.R1((float)this.magicPointsBase + num + num2 + this.spiritAbsorption);
	}

	// Token: 0x06000980 RID: 2432 RVA: 0x000C8605 File Offset: 0x000C6805
	public int HealthCurrent()
	{
		return this.currLife;
	}

	// Token: 0x06000981 RID: 2433 RVA: 0x000C8610 File Offset: 0x000C6810
	public int HealthMax()
	{
		if (this.character.npc)
		{
			return Mathf.Clamp(this.lifeBase + this.maxHealthAdd, 0, 1000000);
		}
		return Mathf.Clamp(this.lifeBase + this.maxHealthAdd + this.HealthAura(), 0, 10000000);
	}

	// Token: 0x06000982 RID: 2434 RVA: 0x000C8662 File Offset: 0x000C6862
	public int HealthAura()
	{
		return (int)Mathf.Round((this.Aura() + this.auraModFlat + (float)this.GetDiceModifierAverage(2)) / 10f);
	}

	// Token: 0x06000983 RID: 2435 RVA: 0x000C8688 File Offset: 0x000C6888
	public float Stat(string stat, bool addRolls, out int adjusted)
	{
		float num = 0f;
		adjusted = 0;
		addRolls = false;
		if (stat == "Agility")
		{
			num = this.agility + this.agilityModFlat;
			if (this.agilityModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.agilityModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num2 = (float)this.GetDiceModifierAverage(1);
				num += num2;
				if (num2 > 0f)
				{
					adjusted = 1;
				}
				else if (num2 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		if (stat == "Aura")
		{
			num = this.Aura() + this.auraModFlat;
			if (this.auraModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.auraModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num3 = (float)this.GetDiceModifierAverage(2);
				num += num3;
				if (num3 > 0f)
				{
					adjusted = 1;
				}
				else if (num3 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		if (stat == "Strength")
		{
			num = this.strength + this.strengthModFlat;
			if (this.strengthModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.strengthModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num4 = (float)this.GetDiceModifierAverage(0);
				num += num4;
				if (num4 > 0f)
				{
					adjusted = 1;
				}
				else if (num4 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		if (stat == "Dexterity")
		{
			num = this.dexterity + this.dexterityModFlat;
			if (this.dexterityModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.dexterityModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num5 = (float)this.GetDiceModifierAverage(4);
				num += num5;
				if (num5 > 0f)
				{
					adjusted = 1;
				}
				else if (num5 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		if (stat == "Pagan")
		{
			num = this.pagan + this.paganModFlat;
			if (this.paganModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.paganModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num6 = (float)this.GetDiceModifierAverage(3);
				num += num6;
				if (num6 > 0f)
				{
					adjusted = 1;
				}
				else if (num6 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		if (stat == "Sensory")
		{
			num = this.sensory + this.sensoryModFlat;
			if (this.sensoryModFlat > 0f)
			{
				adjusted = 1;
			}
			else if (this.sensoryModFlat < 0f)
			{
				adjusted = -1;
			}
			if (addRolls)
			{
				float num7 = (float)this.GetDiceModifierAverage(5);
				num += num7;
				if (num7 > 0f)
				{
					adjusted = 1;
				}
				else if (num7 < 0f)
				{
					adjusted = -1;
				}
			}
		}
		return num;
	}

	// Token: 0x06000984 RID: 2436 RVA: 0x000C890C File Offset: 0x000C6B0C
	public void SetStat(string stat, float x)
	{
		if (stat == "Agility")
		{
			this.agility = x;
		}
		if (stat == "Aura")
		{
			this.aura = x;
		}
		if (stat == "Strength")
		{
			this.strength = x;
		}
		if (stat == "Dexterity")
		{
			this.dexterity = x;
		}
		if (stat == "Pagan")
		{
			this.pagan = x;
		}
		if (stat == "Sensory")
		{
			this.sensory = x;
		}
	}

	// Token: 0x06000985 RID: 2437 RVA: 0x000C8994 File Offset: 0x000C6B94
	public void AddStat(string stat, float x)
	{
		if (stat == "Agility")
		{
			this.agility += x;
		}
		if (stat == "Aura")
		{
			this.aura += x;
		}
		if (stat == "Strength")
		{
			this.strength += x;
		}
		if (stat == "Dexterity")
		{
			this.dexterity += x;
		}
		if (stat == "Pagan")
		{
			this.pagan += x;
		}
		if (stat == "Sensory")
		{
			this.sensory += x;
		}
	}

	// Token: 0x06000986 RID: 2438 RVA: 0x000C8A44 File Offset: 0x000C6C44
	public float GetStatOnly(string stat)
	{
		if (stat == "Agility")
		{
			return this.agility;
		}
		if (stat == "Aura")
		{
			return this.aura;
		}
		if (stat == "Strength")
		{
			return this.strength;
		}
		if (stat == "Dexterity")
		{
			return this.dexterity;
		}
		if (stat == "Pagan")
		{
			return this.pagan;
		}
		if (stat == "Sensory")
		{
			return this.sensory;
		}
		return 0f;
	}

	// Token: 0x06000987 RID: 2439 RVA: 0x000C8ACE File Offset: 0x000C6CCE
	public void SetSkill(int index, float x)
	{
		this.skills[index] = x;
	}

	// Token: 0x06000988 RID: 2440 RVA: 0x000C8AE0 File Offset: 0x000C6CE0
	public float CharacterWeight()
	{
		if (!this.character.inventoryBag)
		{
			return 0f;
		}
		float num = (float)this.weightBase;
		if (this.character.party && !this.character.isBoro)
		{
			num += this.character.inventoryBag.weight;
		}
		else if (this.character.isBoro)
		{
			num += Records.x.boroWeight;
		}
		return num;
	}

	// Token: 0x06000989 RID: 2441 RVA: 0x000C8B58 File Offset: 0x000C6D58
	public float Level()
	{
		if (this.character.party)
		{
			return (float)this.level;
		}
		float num = (float)this.level - 2f;
		float num2 = (this.strength + this.dexterity + this.agility + this.sensory + this.pagan + this.aura) / 6f;
		num2 /= 30f;
		return num + num2;
	}

	// Token: 0x0600098A RID: 2442 RVA: 0x000C8BC1 File Offset: 0x000C6DC1
	public float Balance()
	{
		return this.balance;
	}

	// Token: 0x0600098B RID: 2443 RVA: 0x000C8BCC File Offset: 0x000C6DCC
	public string BalanceCheck(float amt)
	{
		this.str.Clear();
		this.str.Append(amt);
		this.SBP();
		this.str.Append("Difficulty");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x0600098C RID: 2444 RVA: 0x000C8C1C File Offset: 0x000C6E1C
	public string BalanceResist(float amt, string stat)
	{
		this.str.Clear();
		this.str.Append(this.Balance());
		this.SBP();
		this.str.Append("Balance Mod");
		if (stat != "")
		{
			this.CPlus();
			this.str.Append(amt);
			this.SBP();
			this.str.Append(stat);
			this.CB();
		}
		else
		{
			this.CB();
		}
		return this.str.ToString();
	}

	// Token: 0x0600098D RID: 2445 RVA: 0x000C8CAC File Offset: 0x000C6EAC
	public float GhostResistance(bool forCharacterSheet)
	{
		float num = this.GhostResistAur(forCharacterSheet);
		if (forCharacterSheet)
		{
			return Mathf.Round(num / (float)this.GhostRollMax() * 100f);
		}
		return this.R2(num);
	}

	// Token: 0x0600098E RID: 2446 RVA: 0x000C8CE0 File Offset: 0x000C6EE0
	public float GhostResistAur(bool forCharacterSheet)
	{
		if (forCharacterSheet)
		{
			return this.Aura() + this.auraModFlat + (float)this.GetDiceModifierAverage(2);
		}
		return this.Aura() + this.auraModFlat + (float)this.GetDiceModifier(2);
	}

	// Token: 0x0600098F RID: 2447 RVA: 0x000C8D12 File Offset: 0x000C6F12
	public int GhostRollMax()
	{
		return 40;
	}

	// Token: 0x06000990 RID: 2448 RVA: 0x000C8D18 File Offset: 0x000C6F18
	public void GhostHit()
	{
		if (Links.x.gameplay.seconds > this.lastGhostRoll + 100f && !Records.x.filming && (this.character.party || (this.character.tr.position - Links.x.main.tr.position).sqrMagnitude < 400f) && !this.character.hasIncenseTorch && !this.character.summoned && !this.HasEffect("Ghost"))
		{
			this.character.PlayAnimation("Hit", 0f);
			int num = Mathf.RoundToInt(this.GhostResistance(false));
			int num2 = Random.Range(1, this.GhostRollMax());
			if (Records.x.showRuleset)
			{
				Debug.Log(string.Concat(new string[]
				{
					this.GetName(),
					"'s ghost roll  resistance: ",
					num.ToString(),
					" roll: ",
					num2.ToString()
				}));
			}
			this.lastGhostRoll = Links.x.gameplay.seconds;
			if (num >= num2)
			{
				this.str.Clear();
				if (!this.character.npc)
				{
					this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
				}
				this.str.Append(this.GetName());
				if (!this.character.npc)
				{
					this.str.Append("</color>");
				}
				this.str.Append(" resisted ghost");
				Links.x.gameFeed.AddFeed(this.str.ToString());
				return;
			}
			Effects effects = this.character.gameObject.AddComponent<Effects>();
			Links.x.cellar.AddEffects(effects);
			effects.gameObject.SetActive(true);
			effects.source = this.character;
			effects.target = this.character;
			effects.effectName = "Ghost";
			effects.sourceLevel = 0f;
			effects.Inflicted(false);
		}
	}

	// Token: 0x06000991 RID: 2449 RVA: 0x000C8F5C File Offset: 0x000C715C
	public float Disposition(string areaName)
	{
		float num = this.DispSen();
		num += this.DispSkill();
		num += (float)this.character.GetGlam() / 2f;
		if (Records.x.BribeBadgeCount() > 0)
		{
			num -= 100f;
		}
		return this.R1(num) / 100f;
	}

	// Token: 0x06000992 RID: 2450 RVA: 0x000C8FB0 File Offset: 0x000C71B0
	public float DispSen()
	{
		return this.R1((this.Sensory() + this.sensoryModFlat + (float)this.GetDiceModifierAverage(5)) / 15f);
	}

	// Token: 0x06000993 RID: 2451 RVA: 0x000C8FD4 File Offset: 0x000C71D4
	public float DispSkill()
	{
		return this.R1(this.GetSkill(22) / 6f);
	}

	// Token: 0x06000994 RID: 2452 RVA: 0x000C8FEC File Offset: 0x000C71EC
	public float DispositionResistance(string areaName, Character dialogueCharacter)
	{
		float num = (this.Sensory() + this.sensoryModFlat + (float)this.GetDiceModifierAverage(5)) / 300f;
		bool flag = false;
		if (dialogueCharacter && dialogueCharacter.stats.characterRow._Race == this.characterRow._Race)
		{
			flag = true;
		}
		if (flag)
		{
			num *= 0.95f;
		}
		if (Records.x.HasBanner(areaName))
		{
			num *= 0.5f;
		}
		return num;
	}

	// Token: 0x06000995 RID: 2453 RVA: 0x000C9068 File Offset: 0x000C7268
	public float DispositionCost(string areaName, Character merchant)
	{
		float num = this.Disposition(areaName);
		if (!merchant)
		{
			return 1f - num;
		}
		if (Records.x.BribeBadgeCount() > 0)
		{
			return num;
		}
		return 1f - num * (1f - merchant.stats.DispositionResistance(areaName, this.character));
	}

	// Token: 0x06000996 RID: 2454 RVA: 0x000C90BC File Offset: 0x000C72BC
	public float DispositionSell(string areaName, Character merchant)
	{
		if (!merchant)
		{
			return 1f;
		}
		return this.Disposition(areaName) / merchant.stats.DispositionResistance(areaName, this.character);
	}

	// Token: 0x06000997 RID: 2455 RVA: 0x000C90E6 File Offset: 0x000C72E6
	public string Disposition()
	{
		this.str.Clear();
		return this.str.ToString();
	}

	// Token: 0x06000998 RID: 2456 RVA: 0x000C90FF File Offset: 0x000C72FF
	public string MerchantDisposition(string areaName, Character merchant)
	{
		this.str.Clear();
		return this.str.ToString();
	}

	// Token: 0x06000999 RID: 2457 RVA: 0x000C9118 File Offset: 0x000C7318
	public float PartyDispositionSell(string areaName, Character merchant)
	{
		return 1f;
	}

	// Token: 0x0600099A RID: 2458 RVA: 0x000C9120 File Offset: 0x000C7320
	public float SongCost(Library.Abilities abilityRow)
	{
		return Mathf.Floor((float)abilityRow._SongCost * abilityRow._Difficulty * 30f * this.DispositionCost(Links.x.diorama.sceneName, Links.x.merchant.merchantCharacter));
	}

	// Token: 0x0600099B RID: 2459 RVA: 0x000C916C File Offset: 0x000C736C
	public float Repair(string mainSkill, bool forCharacterSheet)
	{
		float num = this.RepairDex();
		int combatSkillID = this.GetCombatSkillID(mainSkill);
		float num2 = this.R2(this.GetSkill(combatSkillID) / 10f + num + (float)this.nimbleFingers);
		if (!forCharacterSheet)
		{
			this.AddSkillProgress(combatSkillID, 0f, null);
			this.str2.Clear();
			this.str2.Append(Links.x.gameFeed.GetPartyColorText(this.character));
			this.str2.Append(this.GetName());
			this.str2.Append("</color>");
			this.str2.Append(" repairs weapon condition +");
			this.str2.Append(num2);
			if (Records.x.showRulesetInfo)
			{
				this.str2.Append(" <color #857C6C>... ");
				this.str2.Append(this.RepairCalculations(false, mainSkill));
				this.str2.Append("</color>");
			}
			Links.x.gameFeed.AddFeed(this.str2.ToString());
		}
		if (forCharacterSheet)
		{
			return this.R2(num + (float)this.nimbleFingers);
		}
		return num2;
	}

	// Token: 0x0600099C RID: 2460 RVA: 0x000C9297 File Offset: 0x000C7497
	public float RepairDex()
	{
		return this.R2((this.Dexterity() + this.dexterityModFlat + (float)this.GetDiceModifierAverage(4)) / 2f);
	}

	// Token: 0x0600099D RID: 2461 RVA: 0x000C92BC File Offset: 0x000C74BC
	public float Fletching(bool forCharacterSheet, string mainSkill)
	{
		float num = this.FletchDex();
		int combatSkillID = this.GetCombatSkillID(mainSkill);
		if (!forCharacterSheet)
		{
			this.AddSkillProgress(combatSkillID, 0f, null);
		}
		if (forCharacterSheet)
		{
			return this.R2(num + (float)this.nimbleFingers);
		}
		float num2 = this.R2(this.GetSkill(combatSkillID) / 10f + num + (float)this.nimbleFingers);
		if (!forCharacterSheet)
		{
			this.str2.Clear();
			this.str2.Append(Links.x.gameFeed.GetPartyColorText(this.character));
			this.str2.Append(this.GetName());
			this.str2.Append("</color>");
			if (mainSkill.Contains("Bow"))
			{
				this.str2.Append(" assembles arrows with +");
			}
			else if (mainSkill.Contains("Sling"))
			{
				this.str2.Append(" assembles slingstones with +");
			}
			else
			{
				this.str2.Append(" assembles vials with +");
			}
			this.str2.Append(num2);
			this.str2.Append(" damage");
			if (Records.x.showRulesetInfo)
			{
				this.str2.Append(" <color #857C6C>... ");
				this.str2.Append(this.FletchingCalculations(false, mainSkill));
				this.str2.Append("</color>");
			}
			Links.x.gameFeed.AddFeed(this.str2.ToString());
		}
		return num2;
	}

	// Token: 0x0600099E RID: 2462 RVA: 0x000C943B File Offset: 0x000C763B
	public float FletchDex()
	{
		return this.R2((this.Dexterity() + this.dexterityModFlat + (float)this.GetDiceModifierAverage(4)) / 10f);
	}

	// Token: 0x0600099F RID: 2463 RVA: 0x000C9460 File Offset: 0x000C7660
	public float SocketingRepair(int socketRepairAmount, bool forCharacterSheet, string mainSkill)
	{
		float num = this.SocketDex();
		if (forCharacterSheet)
		{
			return this.R2(num + (float)this.nimbleFingers);
		}
		int combatSkillID = this.GetCombatSkillID(mainSkill);
		float num2 = this.R2(this.GetSkill(combatSkillID) / 5f + (num + (float)this.nimbleFingers));
		if (num2 > (float)socketRepairAmount)
		{
			num2 = (float)socketRepairAmount;
		}
		if (!forCharacterSheet)
		{
			this.AddSkillProgress(combatSkillID, 0f, null);
			this.str2.Clear();
			this.str2.Append(Links.x.gameFeed.GetPartyColorText(this.character));
			this.str2.Append(this.GetName());
			this.str2.Append("</color>");
			this.str2.Append(" repairs armor condition +");
			this.str2.Append(num2);
			if (Records.x.showRulesetInfo)
			{
				this.str2.Append(" <color #857C6C>... ");
				this.str2.Append(this.SocketingCalculations(false, mainSkill));
				this.str2.Append("</color>");
			}
			Links.x.gameFeed.AddFeed(this.str2.ToString());
		}
		return num2;
	}

	// Token: 0x060009A0 RID: 2464 RVA: 0x000C9593 File Offset: 0x000C7793
	public float SocketDex()
	{
		return this.R2((this.Dexterity() + this.dexterityModFlat + (float)this.GetDiceModifierAverage(4)) / 3f);
	}

	// Token: 0x060009A1 RID: 2465 RVA: 0x000C95B8 File Offset: 0x000C77B8
	public string RepairCalculations(bool fromManual, string mainSkill)
	{
		this.str.Clear();
		float num = (float)this.character.stats.NimbleFingers();
		this.str.Append(this.character.stats.RepairDex());
		this.SBP();
		this.str.Append("DEX/2");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Nimble Mods");
			this.str.Append("]</color> +");
		}
		else
		{
			this.CPlus();
		}
		if (fromManual)
		{
			this.SBP();
			this.str.Append("Skill of Weapon");
			this.str.Append("/10");
		}
		else
		{
			int combatSkillID = this.GetCombatSkillID(mainSkill);
			this.str.Append(this.R1(this.GetSkill(combatSkillID) / 10f));
			this.SBP();
			this.str.Append("Skill of Weapon");
			this.str.Append("/10");
		}
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009A2 RID: 2466 RVA: 0x000C96F0 File Offset: 0x000C78F0
	public string FletchingCalculations(bool fromManual, string mainSkill)
	{
		this.str.Clear();
		float num = (float)this.character.stats.NimbleFingers();
		this.str.Append(this.character.stats.RepairDex());
		this.SBP();
		this.str.Append("DEX/2");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Nimble Mods");
			this.str.Append("]</color> +");
		}
		else
		{
			this.CPlus();
		}
		if (fromManual)
		{
			this.SBP();
			this.str.Append("Skill of Weapon");
			this.str.Append("/10");
		}
		else
		{
			int combatSkillID = this.GetCombatSkillID(mainSkill);
			this.str.Append(this.R1(this.GetSkill(combatSkillID) / 10f));
			this.SBP();
			this.str.Append("Skill of Weapon");
			this.str.Append("/10");
		}
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009A3 RID: 2467 RVA: 0x000C9828 File Offset: 0x000C7A28
	public string SocketingCalculations(bool fromManual, string mainSkill)
	{
		this.str.Clear();
		float num = (float)this.character.stats.NimbleFingers();
		this.str.Append(this.character.stats.SocketDex());
		this.SBP();
		this.str.Append("DEX/3");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Nimble Mods");
			this.str.Append("]</color> +");
		}
		else
		{
			this.CPlus();
		}
		if (fromManual)
		{
			this.SBP();
			this.str.Append("Skill of Armor");
			this.str.Append("/5");
		}
		else
		{
			int combatSkillID = this.GetCombatSkillID(mainSkill);
			this.str.Append(this.R1(this.GetSkill(combatSkillID) / 10f));
			this.SBP();
			this.str.Append("Skill of Armor");
			this.str.Append("/5");
		}
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009A4 RID: 2468 RVA: 0x000C995E File Offset: 0x000C7B5E
	public float EnchantPowerAura()
	{
		return this.R1((this.Aura() + this.auraModFlat + (float)this.GetDiceModifierAverage(2)) / 15f);
	}

	// Token: 0x060009A5 RID: 2469 RVA: 0x000C9984 File Offset: 0x000C7B84
	public float EnchantPag()
	{
		float num = this.Pagan() + this.paganModFlat + (float)this.GetDiceModifierAverage(3);
		if (num > 10f)
		{
			return this.R1((num - 10f) / 15f);
		}
		return 0f;
	}

	// Token: 0x060009A6 RID: 2470 RVA: 0x000C99CC File Offset: 0x000C7BCC
	public string IntercessionCalculation()
	{
		this.str.Clear();
		this.str.Append(this.character.stats.EnchantPowerAura());
		this.SBP();
		this.str.Append("AUR/15");
		this.CPlus();
		this.str.Append(this.character.stats.IntercessionSkill());
		this.SBP();
		this.str.Append("Skill/15");
		this.CMin();
		this.str.Append(this.character.stats.EnchantPag());
		this.SBP();
		this.str.Append("(PAG>10)/15");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009A7 RID: 2471 RVA: 0x000C9A9B File Offset: 0x000C7C9B
	public float IntercessionSkill()
	{
		return this.R1(this.GetSkill(16) / 15f);
	}

	// Token: 0x060009A8 RID: 2472 RVA: 0x000C9AB1 File Offset: 0x000C7CB1
	public bool CanWearEnchantedItem(float savedDifficulty)
	{
		return this.EnchantWearingAbility() >= savedDifficulty;
	}

	// Token: 0x060009A9 RID: 2473 RVA: 0x000C9AC0 File Offset: 0x000C7CC0
	public float EnchantWearingAbility()
	{
		float num = this.EnchantPowerAura();
		float num2 = this.EnchantPag();
		return this.R1(num - num2 + this.IntercessionSkill());
	}

	// Token: 0x060009AA RID: 2474 RVA: 0x000C9AEB File Offset: 0x000C7CEB
	public float SightRadiusBase()
	{
		return this.sightRadiusBase;
	}

	// Token: 0x060009AB RID: 2475 RVA: 0x000C9AF4 File Offset: 0x000C7CF4
	public float SightRadius(bool forCharacterSheet, bool forCharacterCreation, bool forFOW)
	{
		float num = 0f;
		float num2 = this.SightRadiusTOD(false, forFOW);
		float num3 = this.SightRadiusSensory(forCharacterSheet);
		float num4 = (this.sightRadiusBase - this.blind + num + num3) * num2;
		if (forCharacterSheet)
		{
			num4 = Mathf.Round(num4);
		}
		if (forCharacterCreation)
		{
			num4 = Mathf.Round(this.sightRadiusBase + num3);
		}
		return num4;
	}

	// Token: 0x060009AC RID: 2476 RVA: 0x000C9B48 File Offset: 0x000C7D48
	public float SightRadiusTOD(bool returnPercent, bool forFOW)
	{
		float num = 0.9f;
		if (Links.x.gameplay.IsNight())
		{
			num = 0.75f;
			if (this.character.party && Links.x.fellowship.PartyHasTorch())
			{
				num = 1f;
			}
		}
		else if (this.character.desiredGraph == 1)
		{
			num = 0.75f;
		}
		else if (Links.x.gameplay.IsAfternoon())
		{
			num = 1f;
		}
		if (this.character.party && forFOW && Links.x.gaia.sceneLoaded && Links.x.diorama.InResurrectionFog(this.character.tr.position))
		{
			num = 0.5f;
		}
		if (returnPercent)
		{
			return Mathf.Round(num * 100f);
		}
		return this.R2(num);
	}

	// Token: 0x060009AD RID: 2477 RVA: 0x000C9C24 File Offset: 0x000C7E24
	public float SightRadiusSensory(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		return this.R2(num / 5f);
	}

	// Token: 0x060009AE RID: 2478 RVA: 0x000C9C6C File Offset: 0x000C7E6C
	public float HearingRadius(bool forCharacterSheet, bool forCharacterCreation)
	{
		float num = 0f;
		float num2 = this.HearingRadiusSensory(true);
		float num3 = this.hearingRadiusBase - this.deaf + num + num2;
		if (forCharacterSheet)
		{
			num3 = Mathf.Round(num3);
		}
		if (forCharacterCreation)
		{
			num3 = Mathf.Round(this.hearingRadiusBase + num2);
		}
		return num3;
	}

	// Token: 0x060009AF RID: 2479 RVA: 0x000C9CB8 File Offset: 0x000C7EB8
	public float HearingRadiusSensory(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		return num / 5f;
	}

	// Token: 0x060009B0 RID: 2480 RVA: 0x000C9CF8 File Offset: 0x000C7EF8
	public void StartSneak()
	{
		float num = 0f;
		if (this.character.IsSentient())
		{
			bool flag = this.Sneaking(false, out num);
			string text = this.SearchingCalculation(false);
			if (this.character.CheckLights(true))
			{
				flag = false;
			}
			this.str.Clear();
			if (!this.character.npc)
			{
				this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
			}
			this.str.Append(this.GetName());
			if (!this.character.npc)
			{
				this.str.Append("</color>");
			}
			if (flag)
			{
				this.str.Append(" is sneaking for ");
				this.str.Append(this.R1(num));
				this.str.Append(" seconds");
				this.character.body.Sneaking(true);
				this.character.SetupSneakGauge((int)Mathf.Round(num));
			}
			else
			{
				this.str.Append(" failed to sneak");
				GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(58);
				if (pooledGameObject)
				{
					pooledGameObject.transform.position = this.character.body.headBone.position + new Vector3(0f, 1f, 0f);
					pooledGameObject.SetActive(true);
				}
			}
			if (Records.x.showRulesetInfo)
			{
				this.str.Append(" <color #857C6C>... ");
				this.str.Append(text);
				this.str.Append("</color>");
			}
			Links.x.gameFeed.AddFeed(this.str.ToString());
		}
	}

	// Token: 0x060009B1 RID: 2481 RVA: 0x000C9EC4 File Offset: 0x000C80C4
	public bool Sneaking(bool forCharacterSheet, out float duration)
	{
		float num = this.RaceMod();
		float num2 = this.AglSneak();
		float num3 = this.SenSneak();
		float num4 = this.SneakSkill();
		duration = this.R1((num + num2 + num3 + (float)this.invisible) * num4);
		if (!forCharacterSheet && duration > 1f)
		{
			this.AddSkillProgress(21, 0f, null);
		}
		return duration > 1f;
	}

	// Token: 0x060009B2 RID: 2482 RVA: 0x000C9F2A File Offset: 0x000C812A
	public float Stealing()
	{
		return this.SneakSkillStealing();
	}

	// Token: 0x060009B3 RID: 2483 RVA: 0x000C9F32 File Offset: 0x000C8132
	public float HearStealing()
	{
		return this.SenSneakHearing();
	}

	// Token: 0x060009B4 RID: 2484 RVA: 0x000C9F3C File Offset: 0x000C813C
	public float SenSneakHearing()
	{
		float num = this.Sensory() + this.sensoryModFlat;
		return this.R1(num);
	}

	// Token: 0x060009B5 RID: 2485 RVA: 0x000C9F5E File Offset: 0x000C815E
	public float SneakSkillStealing()
	{
		return this.R1(this.GetSkill(21) * 2f / 10f);
	}

	// Token: 0x060009B6 RID: 2486 RVA: 0x000C9F7C File Offset: 0x000C817C
	public string StealingCalculation(bool fromManual)
	{
		this.str.Clear();
		float num = (float)this.character.stats.NimbleFingers();
		this.str.Append(this.character.stats.SneakSkillStealing());
		this.SBP();
		this.str.Append("(Skill*2)/10");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Nimble Mods");
			this.str.Append("]</color>");
		}
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009B7 RID: 2487 RVA: 0x000CA02E File Offset: 0x000C822E
	public float SneakSkill()
	{
		return this.R1(this.GetSkill(21) / 25f);
	}

	// Token: 0x060009B8 RID: 2488 RVA: 0x000CA044 File Offset: 0x000C8244
	public float RaceMod()
	{
		float num = 2f;
		if (this.race == "Yeti")
		{
			num = 0f;
		}
		if (this.race == "Taratorith")
		{
			num = 0.15f;
		}
		if (this.race == "Pasaaren")
		{
			num = 0.25f;
		}
		if (this.race == "Ameythevian")
		{
			num = 0.3f;
		}
		if (this.race == "Varuchov")
		{
			num = 0.5f;
		}
		return num;
	}

	// Token: 0x060009B9 RID: 2489 RVA: 0x000CA0D0 File Offset: 0x000C82D0
	public float AglSneak()
	{
		float num = this.Agility() + this.agilityModFlat;
		num += (float)this.GetDiceModifierAverage(1);
		num /= 20f;
		return this.R1(num);
	}

	// Token: 0x060009BA RID: 2490 RVA: 0x000CA108 File Offset: 0x000C8308
	public float SenSneak()
	{
		float num = this.Sensory() + this.sensoryModFlat;
		num += (float)this.GetDiceModifierAverage(5);
		num /= 15f;
		return this.R1(num);
	}

	// Token: 0x060009BB RID: 2491 RVA: 0x000CA140 File Offset: 0x000C8340
	public string SearchingCalculation(bool fromManual)
	{
		this.str.Clear();
		this.str.Append("(");
		this.str.Append(this.character.stats.AglSneak());
		this.SBP();
		this.str.Append("AGL/20");
		this.CPlus();
		this.str.Append(this.character.stats.SenSneak());
		this.SBP();
		this.str.Append("SEN/15");
		this.CPlus();
		this.str.Append(this.character.stats.RaceMod());
		this.SBP();
		this.str.Append("Race Bonus");
		if (this.character.stats.Invisible() != 0)
		{
			this.CPlus();
			this.str.Append(this.character.stats.Invisible());
			this.SBP();
			this.str.Append("Invisible Mod");
		}
		this.str.Append("]</color>");
		this.str.Append(") * ");
		this.str.Append(this.character.stats.SneakSkill());
		this.SBP();
		this.str.Append("Skill/25");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009BC RID: 2492 RVA: 0x000CA2C0 File Offset: 0x000C84C0
	public bool IsInvisible()
	{
		return this.character.body.sneaking;
	}

	// Token: 0x060009BD RID: 2493 RVA: 0x000CA2D4 File Offset: 0x000C84D4
	public float Charming(string skill, bool forCharacterSheet)
	{
		float num = this.CharmSkill(skill);
		float num2 = this.CharmSen(forCharacterSheet);
		float num3 = this.R1(num + (float)this.charming + num2);
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				" charm hit chance ",
				num3.ToString(),
				" from sensory ",
				num2.ToString(),
				" and skill ",
				skill,
				" ",
				num.ToString()
			}));
		}
		return num3;
	}

	// Token: 0x060009BE RID: 2494 RVA: 0x000CA36F File Offset: 0x000C856F
	public float SummonModCharm()
	{
		return (float)Links.x.GetSummonsCount(0) * 2f;
	}

	// Token: 0x060009BF RID: 2495 RVA: 0x000CA383 File Offset: 0x000C8583
	public float SummonModSpells()
	{
		return (float)Links.x.GetSummonsCount(1) * 2f;
	}

	// Token: 0x060009C0 RID: 2496 RVA: 0x000CA398 File Offset: 0x000C8598
	public float CharmSkill(string skill)
	{
		int num = 23;
		if (skill.Contains("Forest"))
		{
			num = 24;
		}
		else if (skill.Contains("Fish"))
		{
			num = 23;
		}
		else if (skill.Contains("Shroom"))
		{
			num = 25;
		}
		if (skill == "")
		{
			num = 23;
			if (this.GetSkill(24) > this.GetSkill(num))
			{
				num = 24;
			}
			if (this.GetSkill(25) > this.GetSkill(num))
			{
				num = 25;
			}
		}
		float num2 = this.GetSkill(num) / 20f;
		return this.R1(num2);
	}

	// Token: 0x060009C1 RID: 2497 RVA: 0x000CA430 File Offset: 0x000C8630
	public float CharmSen(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifier(5);
		}
		num /= 30f;
		return this.R1(num);
	}

	// Token: 0x060009C2 RID: 2498 RVA: 0x000CA478 File Offset: 0x000C8678
	public float CharmResistance(bool forCharacterSheet, float health)
	{
		float num = this.CharmResistSen(forCharacterSheet);
		float num2 = this.CharmResistAura(forCharacterSheet);
		float num3 = this.CharmHealth(health);
		if (Records.x.showRuleset)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				" charm resistance ",
				this.R2(num * num3).ToString(),
				" from sensory ",
				(num2 + num).ToString(),
				" and health factor ",
				num3.ToString()
			}));
		}
		return this.R2((num2 + num) * num3);
	}

	// Token: 0x060009C3 RID: 2499 RVA: 0x000CA514 File Offset: 0x000C8714
	public float CharmResistSen(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifier(5);
		}
		return this.R1(num / 2f);
	}

	// Token: 0x060009C4 RID: 2500 RVA: 0x000CA558 File Offset: 0x000C8758
	public float CharmResistAura(bool forCharacterSheet)
	{
		float num = this.Aura() + this.auraModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(2);
		}
		else
		{
			num += (float)this.GetDiceModifier(2);
		}
		return this.R1(num / 2f);
	}

	// Token: 0x060009C5 RID: 2501 RVA: 0x000CA59B File Offset: 0x000C879B
	public float CharmHealth(float health)
	{
		return this.R1(0.4f + health / (float)this.HealthMax());
	}

	// Token: 0x060009C6 RID: 2502 RVA: 0x000CA5B4 File Offset: 0x000C87B4
	public string CharmingCalculation(string type)
	{
		this.str.Clear();
		float num = (float)this.character.stats.Charming();
		this.str.Append(this.character.stats.CharmSen(true));
		this.SBP();
		this.str.Append("SEN/30");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Bind Mods");
			this.str.Append("]</color> + ");
		}
		else
		{
			this.CPlus();
		}
		this.str.Append(this.character.stats.CharmSkill(type));
		this.SBP();
		this.str.Append("Skill");
		this.str.Append("/20");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009C7 RID: 2503 RVA: 0x000CA6B4 File Offset: 0x000C88B4
	public string CharmResist(float summonMod, float health)
	{
		this.str.Clear();
		float num = this.CharmResistSen(false);
		float num2 = this.CharmResistAura(false);
		float num3 = this.CharmHealth(health);
		this.str.Append("(");
		this.str.Append(num);
		this.SBP();
		this.str.Append("SEN/2");
		this.CPlus();
		this.str.Append(num2);
		this.SBP();
		this.str.Append("AUR/2");
		this.str.Append("]</color>) * ");
		this.str.Append(num3);
		this.SBP();
		this.str.Append(".4f + Health/Max Health");
		this.CMin();
		this.str.Append(summonMod);
		this.SBP();
		this.str.Append("Current Summons Penalty");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009C8 RID: 2504 RVA: 0x000CA7B4 File Offset: 0x000C89B4
	public int CarryingWeight()
	{
		return this.CarryWeightStrength() + this.CarryWeightAgility() + this.CarryWeightDex();
	}

	// Token: 0x060009C9 RID: 2505 RVA: 0x000CA7CA File Offset: 0x000C89CA
	public int CarryWeightStrength()
	{
		return (int)(Mathf.Round(this.Strength() + this.strengthModFlat + (float)this.GetDiceModifierAverage(0)) * 7f);
	}

	// Token: 0x060009CA RID: 2506 RVA: 0x000CA7EE File Offset: 0x000C89EE
	public int CarryWeightAgility()
	{
		return (int)(Mathf.Round(this.Agility() + this.agilityModFlat + (float)this.GetDiceModifierAverage(1)) * 2f);
	}

	// Token: 0x060009CB RID: 2507 RVA: 0x000CA812 File Offset: 0x000C8A12
	public int CarryWeightDex()
	{
		return (int)(Mathf.Round(this.Dexterity() + this.dexterityModFlat + (float)this.GetDiceModifierAverage(4)) * 2f);
	}

	// Token: 0x060009CC RID: 2508 RVA: 0x000CA838 File Offset: 0x000C8A38
	public float Lockpicking(bool forCharacterSheet)
	{
		float num = this.LockSkill();
		float num2 = this.LockDex(forCharacterSheet);
		return this.R1(num + ((float)this.nimbleFingers + num2));
	}

	// Token: 0x060009CD RID: 2509 RVA: 0x000CA865 File Offset: 0x000C8A65
	public float LockSkill()
	{
		return this.R1(this.GetSkill(20) / 10f);
	}

	// Token: 0x060009CE RID: 2510 RVA: 0x000CA87C File Offset: 0x000C8A7C
	public float LockDex(bool forCharacterSheet)
	{
		float num = this.Dexterity() + this.dexterityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(4);
		}
		else
		{
			num += (float)this.GetDiceModifierAverage(4);
		}
		return num / 10f;
	}

	// Token: 0x060009CF RID: 2511 RVA: 0x000CA8BC File Offset: 0x000C8ABC
	public string LockpickingCalculation(bool fromManual)
	{
		this.str.Clear();
		float num = (float)this.character.stats.NimbleFingers();
		this.str.Append(this.character.stats.LockDex(true));
		this.SBP();
		this.str.Append("DEX/10");
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(num);
			this.SBP();
			this.str.Append("Nimble Mods");
			this.str.Append("]</color> +");
		}
		else
		{
			this.CPlus();
		}
		this.str.Append(this.character.stats.LockSkill());
		this.SBP();
		this.str.Append("Skill");
		this.str.Append("/10");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009D0 RID: 2512 RVA: 0x000CA9BC File Offset: 0x000C8BBC
	public string LockDifficultyString(float diff)
	{
		this.str.Clear();
		this.str.Append(diff);
		this.SBP();
		this.str.Append("Difficulty");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009D1 RID: 2513 RVA: 0x000CAA0C File Offset: 0x000C8C0C
	public float SearchNumber(string type, bool forCharacterSheet, string skill)
	{
		float num = this.SearchSen();
		float num2 = this.SearchSkill(skill, type);
		return num * num2;
	}

	// Token: 0x060009D2 RID: 2514 RVA: 0x000CAA2C File Offset: 0x000C8C2C
	public float SearchSkill(string skill, string type)
	{
		int num = 0;
		if (type == "Rogue")
		{
			num = 20;
			float num2 = this.GetSkill(num);
			if (this.GetSkill(21) > num2)
			{
				num = 21;
				num2 = this.GetSkill(21);
			}
			if (this.GetSkill(22) > num2)
			{
				num = 22;
				num2 = this.GetSkill(22);
			}
		}
		else if (type == "Charmer")
		{
			num = 23;
			float num3 = this.GetSkill(num);
			if (this.GetSkill(24) > num3)
			{
				num = 24;
				num3 = this.GetSkill(24);
			}
			if (this.GetSkill(25) > num3)
			{
				num = 25;
				num3 = this.GetSkill(25);
			}
		}
		return Mathf.Ceil(this.GetSkill(num) / 50f);
	}

	// Token: 0x060009D3 RID: 2515 RVA: 0x000CAADC File Offset: 0x000C8CDC
	public float SearchSen()
	{
		float num = this.Sensory() + this.sensoryModFlat;
		num += (float)this.GetDiceModifierAverage(5);
		num /= 5f;
		return this.R1(num);
	}

	// Token: 0x060009D4 RID: 2516 RVA: 0x000CAB14 File Offset: 0x000C8D14
	public string SearchCalculation(string type)
	{
		this.str.Clear();
		this.str.Append(this.character.stats.SearchSen());
		this.SBP();
		this.str.Append("SEN/5");
		this.CMult();
		this.str.Append(this.character.stats.SearchSkill("", type));
		this.SBP();
		if (type == "Charmer")
		{
			this.str.Append("Highest Binding Skill");
		}
		else
		{
			this.str.Append("Highest Rogue Skill");
		}
		this.str.Append("/50");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009D5 RID: 2517 RVA: 0x000CABE4 File Offset: 0x000C8DE4
	public string SearchDifficultyString(float diff)
	{
		this.str.Clear();
		this.str.Append(diff);
		this.SBP();
		this.str.Append("Difficulty");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009D6 RID: 2518 RVA: 0x000CAC34 File Offset: 0x000C8E34
	public float WeaponHitChance(bool forCharacterSheet, int weaponIndex)
	{
		float num = 0f;
		int num2 = 0;
		if (forCharacterSheet)
		{
			num2 = 1;
		}
		string text = "";
		if (weaponIndex == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (weaponIndex == 1)
		{
			text = this.character.invRow2._MainSkill;
		}
		string text2;
		this.GetHitChanceStat(text, out text2, out num, (float)num2);
		float num3 = this.HitMods(forCharacterSheet);
		float num4 = this.HitSkill(weaponIndex, false);
		float num5 = num + num3 + num4;
		if (forCharacterSheet)
		{
			return Mathf.Round(num5);
		}
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s hit roll info 2 - stat total: ",
				num.ToString(),
				", hit chance mods: ",
				num3.ToString(),
				", skill: ",
				num4.ToString()
			}));
		}
		return Mathf.Round(num5);
	}

	// Token: 0x060009D7 RID: 2519 RVA: 0x000CAD18 File Offset: 0x000C8F18
	public float HandCount()
	{
		float num = 1f;
		if (!this.HasShield())
		{
			if (this.character.GetInvNum(2) > 1)
			{
				num += 1f;
			}
			else if (this.GetSkill(9) >= 50f)
			{
				if (this.character.GetInvNum(0) <= 1)
				{
					num += 1f;
				}
				else if (this.character.invRow1 != null && this.character.invRow1._ArmorID < 0)
				{
					num += 1f;
				}
			}
		}
		return num;
	}

	// Token: 0x060009D8 RID: 2520 RVA: 0x000CADA0 File Offset: 0x000C8FA0
	public float HitMods(bool forCharacterSheet)
	{
		float num = this.hitModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(8);
		}
		else
		{
			num += (float)this.GetDiceModifier(8);
		}
		return num;
	}

	// Token: 0x060009D9 RID: 2521 RVA: 0x000CADD0 File Offset: 0x000C8FD0
	public string MainSkill(int weaponIndex)
	{
		string text = "";
		if (weaponIndex == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (weaponIndex == 1)
		{
			text = "Multi-Hand";
		}
		return Links.x.manual.DisplayNameFromIndex(this.GetCombatSkillID(text), this.character);
	}

	// Token: 0x060009DA RID: 2522 RVA: 0x000CAE20 File Offset: 0x000C9020
	public int MainSkillIndex(int weaponIndex)
	{
		string text = "";
		if (weaponIndex == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (weaponIndex == 1)
		{
			text = "Multi-Hand";
		}
		return this.GetCombatSkillID(text);
	}

	// Token: 0x060009DB RID: 2523 RVA: 0x000CAE58 File Offset: 0x000C9058
	public float HitSkill(int weaponIndex, bool justSkill)
	{
		string text = "";
		if (weaponIndex == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (weaponIndex == 1)
		{
			text = "Multi-Hand";
		}
		int combatSkillID = this.GetCombatSkillID(text);
		if (justSkill)
		{
			return this.GetSkill(combatSkillID);
		}
		return this.R1(this.GetSkill(combatSkillID) / 20f);
	}

	// Token: 0x060009DC RID: 2524 RVA: 0x000CAEB0 File Offset: 0x000C90B0
	public float HitWpnDur(int weaponIndex, bool returnPercent)
	{
		string text = "";
		float num = 0f;
		if (weaponIndex == 0)
		{
			num = (float)this.character.invRow1._DurabilityMax;
		}
		if (weaponIndex == 1)
		{
			num = (float)this.character.invRow2._DurabilityMax;
		}
		if (num == -1f)
		{
			return 1f;
		}
		this.GetCombatSkillID(text);
		float num2 = this.character.GetDurabilityNum(weaponIndex).x;
		if (num2 > num)
		{
			num2 = num;
		}
		if (returnPercent)
		{
			return this.R1(num2 / num * 100f);
		}
		return this.R2(num2 / num);
	}

	// Token: 0x060009DD RID: 2525 RVA: 0x000CAF40 File Offset: 0x000C9140
	public string HitChanceCalculation(int hand)
	{
		this.str.Clear();
		float num = 0f;
		int num2 = 0;
		string text = "";
		if (hand == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (hand == 1)
		{
			text = this.character.invRow2._MainSkill;
		}
		string text2;
		this.GetHitChanceStat(text, out text2, out num, (float)num2);
		float num3 = this.HitMods(true);
		this.str.Append(num);
		this.SBP();
		this.str.Append(text2);
		this.str.Append("/20");
		if (num3 != 0f)
		{
			this.CPlus();
			this.str.Append(num3);
			this.SBP();
			this.str.Append("Bonuses & Ailments");
			this.CPlus();
		}
		else
		{
			this.CPlus();
		}
		if (this.animal)
		{
			this.str.Append("Skill");
		}
		else
		{
			this.str.Append(this.HitSkill(hand, false));
		}
		this.SBP();
		this.str.Append(this.MainSkill(hand));
		this.str.Append("/20");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x060009DE RID: 2526 RVA: 0x000CB084 File Offset: 0x000C9284
	private void OP()
	{
		this.str.Append("<color=#504B41>(");
	}

	// Token: 0x060009DF RID: 2527 RVA: 0x000CB097 File Offset: 0x000C9297
	private void CP()
	{
		this.str.Append(")</color>");
	}

	// Token: 0x060009E0 RID: 2528 RVA: 0x000CB0AA File Offset: 0x000C92AA
	private void SP()
	{
		this.str.Append(" ");
	}

	// Token: 0x060009E1 RID: 2529 RVA: 0x000CB0BD File Offset: 0x000C92BD
	private void SOP()
	{
		this.str.Append(" <color=#504B41>(");
	}

	// Token: 0x060009E2 RID: 2530 RVA: 0x000CB0D0 File Offset: 0x000C92D0
	private void COL()
	{
	}

	// Token: 0x060009E3 RID: 2531 RVA: 0x000CB0D2 File Offset: 0x000C92D2
	private void SBP()
	{
		this.str.Append(" <color=#504B41>[");
	}

	// Token: 0x060009E4 RID: 2532 RVA: 0x000CB0E5 File Offset: 0x000C92E5
	private void CB()
	{
		this.str.Append("]</color>");
	}

	// Token: 0x060009E5 RID: 2533 RVA: 0x000CB0F8 File Offset: 0x000C92F8
	private void CPlus()
	{
		this.str.Append("]</color> + ");
	}

	// Token: 0x060009E6 RID: 2534 RVA: 0x000CB10B File Offset: 0x000C930B
	private void CMult()
	{
		this.str.Append("]</color> * ");
	}

	// Token: 0x060009E7 RID: 2535 RVA: 0x000CB11E File Offset: 0x000C931E
	private void CMin()
	{
		this.str.Append("]</color> - ");
	}

	// Token: 0x060009E8 RID: 2536 RVA: 0x000CB134 File Offset: 0x000C9334
	public float EvasionChance(bool forCharacterSheet, float dazedCount, out float roll)
	{
		float num = this.EvadeAgl(forCharacterSheet);
		float num2 = this.EvadeMods(forCharacterSheet);
		float num3 = this.BlockMods(forCharacterSheet);
		float num4 = -1f;
		float num5 = -1f;
		bool flag = false;
		bool flag2 = false;
		if (this.character.GetInvNum(2) > 1 && Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2))._Tag == "Shield")
		{
			flag = true;
		}
		if (this.HasEffect("VineCocoon"))
		{
			flag2 = true;
			flag = true;
		}
		float num6;
		float num7;
		this.EvadeArmorTotal(out num6, out num4, out num7, false, flag);
		bool flag3 = false;
		if (num4 > -1f)
		{
			flag3 = true;
		}
		float num8;
		float num9;
		this.BlockTotal(out num8, out num5, out num9, false, flag3);
		if (flag2)
		{
			flag = true;
			this.GetExistingEffect("VineCocoon");
			num5 = 120f;
		}
		float num10 = num;
		if (flag3)
		{
			num10 += num4;
		}
		if (flag)
		{
			num10 += num5;
			num10 += num3;
		}
		if (!flag3 && !flag)
		{
			num10 += this.EvadeUnarmed(false, flag);
		}
		num10 += num2;
		if (dazedCount > 0f && !forCharacterSheet)
		{
			num10 *= 1f - dazedCount * 0.2f;
		}
		roll = 0f;
		if (!forCharacterSheet)
		{
			float num11 = num10;
			float num12 = num10 * 0.75f;
			float num13 = num10 * 1.1f;
			float num14 = Random.Range(num12, num13);
			num10 = this.R1(num14);
			roll = this.R1(num11 - num14);
			if (this.character.npc)
			{
				float num15 = 1f - this.R1(this.stamina / this.maxStamina);
				num10 -= this.R1(num15 * 10f);
			}
		}
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s evade roll info 2 - stat total: ",
				num.ToString(),
				", evade chance mods: ",
				num2.ToString(),
				", skill: ",
				num4.ToString()
			}));
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s block roll info 2 - block chance mods: ",
				num3.ToString(),
				", skill: ",
				num5.ToString()
			}));
		}
		return this.R1(num10);
	}

	// Token: 0x060009E9 RID: 2537 RVA: 0x000CB374 File Offset: 0x000C9574
	public string MainArmorSkill()
	{
		if (this.character.GetInvNum(18) > 1)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(18));
			return Links.x.manual.DisplayNameFromIndex(this.GetArmorSkillID(invRowByIndex._MainSkill), this.character);
		}
		return "Unarmored";
	}

	// Token: 0x060009EA RID: 2538 RVA: 0x000CB3D8 File Offset: 0x000C95D8
	public void EvadeArmorTotal(out float maxDurability, out float skillTotal, out float durability, bool justSkill, bool hasShield)
	{
		maxDurability = 1f;
		skillTotal = -1f;
		durability = 1f;
		if (this.character.GetInvNum(18) > 1)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(18));
			maxDurability = (float)invRowByIndex._DurabilityMax;
			if (this.character.npc)
			{
				maxDurability /= 2f;
			}
			skillTotal = this.GetSkill(this.GetArmorSkillID(invRowByIndex._MainSkill));
			if (hasShield)
			{
				skillTotal /= 80f;
			}
			else
			{
				skillTotal /= 40f;
			}
			if (justSkill)
			{
				skillTotal = (float)this.GetArmorSkillID(invRowByIndex._MainSkill);
			}
			durability = this.character.GetDurabilityNum(9).x / maxDurability;
			if (justSkill)
			{
				durability = Mathf.Round(durability / maxDurability * 100f);
			}
			skillTotal = Mathf.Round(skillTotal);
		}
	}

	// Token: 0x060009EB RID: 2539 RVA: 0x000CB4C4 File Offset: 0x000C96C4
	public float EvadeAgl(bool forCharacterSheet)
	{
		float num = this.Agility() + this.agilityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(1);
		}
		else
		{
			num += (float)this.GetDiceModifier(1);
		}
		float num2 = 0f;
		float num3 = 0f;
		float num4 = 0f;
		if (this.character.invRow1 != null)
		{
			num3 = this.character.invRow1._EvasionReduction;
		}
		if (this.character.GetInvNum(2) > 1)
		{
			num4 = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2))._EvasionReduction;
		}
		if (this.character.GetInvNum(18) > 1)
		{
			num2 = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(18))._EvasionReduction;
		}
		num -= num2;
		num -= num4;
		num -= num3;
		return this.R1(num / 20f);
	}

	// Token: 0x060009EC RID: 2540 RVA: 0x000CB5A8 File Offset: 0x000C97A8
	public float EvadeMods(bool forCharacterSheet)
	{
		float num = this.evadeModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(10);
		}
		else
		{
			num += (float)this.GetDiceModifier(10);
		}
		return num;
	}

	// Token: 0x060009ED RID: 2541 RVA: 0x000CB5DC File Offset: 0x000C97DC
	public float EvadeUnarmed(bool forCharacterSheet, bool hasShield)
	{
		float num = this.Dexterity() + this.dexterityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(4);
		}
		else
		{
			num += (float)this.GetDiceModifier(4);
		}
		float num2 = this.Aura() + this.auraModFlat;
		if (forCharacterSheet)
		{
			num2 += (float)this.GetDiceModifierAverage(2);
		}
		else
		{
			num2 += (float)this.GetDiceModifier(2);
		}
		float num3 = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num3 += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num3 += (float)this.GetDiceModifier(5);
		}
		float num4 = Mathf.Round(num + num2 + num3) / 40f;
		return this.R1(num4);
	}

	// Token: 0x060009EE RID: 2542 RVA: 0x000CB67C File Offset: 0x000C987C
	public void BlockTotal(out float maxDurability, out float skillTotal, out float durability, bool justSkill, bool hasArmor)
	{
		maxDurability = 1f;
		skillTotal = -1f;
		durability = 0f;
		if (this.character.GetInvNum(2) <= 1)
		{
			durability = 0f;
			return;
		}
		Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2));
		if (invRowByIndex._Tag == "Shield")
		{
			maxDurability = (float)invRowByIndex._DurabilityMax;
			int num = 15;
			if (invRowByIndex._MainSkill == "LargeShield")
			{
				num = 14;
			}
			skillTotal = this.GetSkill(num);
			if (hasArmor)
			{
				skillTotal /= 80f;
			}
			else
			{
				skillTotal /= 40f;
			}
			durability = this.character.GetDurabilityNum(1).x / maxDurability;
			skillTotal = Mathf.Round(skillTotal);
			return;
		}
		durability = 0f;
	}

	// Token: 0x060009EF RID: 2543 RVA: 0x000CB754 File Offset: 0x000C9954
	public float BlockMods(bool forCharacterSheet)
	{
		float num = this.blockModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(11);
		}
		else
		{
			num += (float)this.GetDiceModifier(11);
		}
		return num;
	}

	// Token: 0x060009F0 RID: 2544 RVA: 0x000CB788 File Offset: 0x000C9988
	public string MainShieldSkill()
	{
		if (this.character.GetInvNum(2) > 1)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2));
			if (invRowByIndex._Tag == "Shield")
			{
				return Links.x.manual.DisplayNameFromIndex(this.GetCombatSkillID(invRowByIndex._MainSkill), this.character);
			}
		}
		return "No Shield";
	}

	// Token: 0x060009F1 RID: 2545 RVA: 0x000CB7FC File Offset: 0x000C99FC
	public string EvadeChanceCalculation(float evasionBonus, float roll, bool forCharacterSheet)
	{
		this.str.Clear();
		bool flag = false;
		if (this.character.GetInvNum(2) > 1 && Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2))._Tag == "Shield")
		{
			flag = true;
		}
		float num = -1f;
		float num2 = -1f;
		float num3;
		float num4;
		this.EvadeArmorTotal(out num3, out num, out num4, false, flag);
		bool flag2 = false;
		if (num > -1f)
		{
			flag2 = true;
		}
		float num5;
		float num6;
		this.BlockTotal(out num5, out num2, out num6, false, flag2);
		float num7 = this.EvadeMods(true);
		float num8 = this.BlockMods(true);
		if (evasionBonus > 0f)
		{
			this.str.Append("(");
		}
		this.str.Append(this.EvadeAgl(true));
		this.SBP();
		this.str.Append("(AGL - Equipment Evasion Reduction)/20");
		this.CPlus();
		if (flag2 || flag)
		{
			if (flag2)
			{
				this.str.Append(num);
				this.SBP();
				this.str.Append(this.MainArmorSkill());
				if (flag)
				{
					this.str.Append("/80");
				}
				else
				{
					this.str.Append("/40");
				}
			}
			if (flag)
			{
				if (flag2)
				{
					this.CPlus();
				}
				this.str.Append(num2);
				this.SBP();
				this.str.Append(this.MainShieldSkill());
				if (flag2)
				{
					this.str.Append("/80");
				}
				else
				{
					this.str.Append("/40");
				}
			}
		}
		else
		{
			this.str.Append(this.EvadeUnarmed(true, flag));
			this.SBP();
			this.str.Append("(DEX + AUR + SEN)/40");
		}
		if (num8 != 0f)
		{
			this.CPlus();
			this.str.Append(num8);
			this.SBP();
			this.str.Append("Block Chance Mods");
		}
		else if (num7 != 0f)
		{
			this.CPlus();
			this.str.Append(num7);
			this.SBP();
			this.str.Append("Evade Chance Mods");
		}
		if (evasionBonus > 0f)
		{
			this.str.Append("</color>) * ");
			this.str.Append(evasionBonus);
			this.SBP();
			this.str.Append("Bonus");
		}
		else if (forCharacterSheet)
		{
			this.CB();
		}
		if (!forCharacterSheet)
		{
			if (roll > 0f)
			{
				this.CMin();
				this.str.Append(roll);
			}
			if (roll < 0f)
			{
				this.CPlus();
				this.str.Append(roll * -1f);
			}
			if (roll == 0f)
			{
				this.CPlus();
				this.str.Append("0");
			}
			this.SBP();
			this.str.Append("Evade Luck");
			if (this.character.npc)
			{
				this.CMin();
				float num9 = 1f - this.R1(this.stamina / this.maxStamina);
				this.str.Append(this.R1(num9 * 10f));
				this.SBP();
				this.str.Append("Fatigue");
				this.CB();
			}
			else
			{
				this.CB();
			}
		}
		else if (!this.character.party)
		{
			this.str.Append("- Fatigue Penalty");
			this.CB();
		}
		return this.str.ToString();
	}

	// Token: 0x060009F2 RID: 2546 RVA: 0x000CBB94 File Offset: 0x000C9D94
	public float DamageRoll(bool forCharacterSheet, int weaponIndex, out float wpnDmg, bool single, bool marked, Character target)
	{
		wpnDmg = 0f;
		float num = 0f;
		int num2 = 0;
		if (forCharacterSheet)
		{
			num2 = 1;
		}
		string text = "";
		Library.Inventory invRow = this.character.invRow1;
		if (weaponIndex == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (weaponIndex == 1)
		{
			text = this.character.invRow2._MainSkill;
			Library.Inventory invRow2 = this.character.invRow2;
		}
		string text2;
		this.GetDmgStat(text, out num, out text2, (float)num2);
		float num3 = this.DmgMods(forCharacterSheet);
		int num4 = 0;
		int num5 = 0;
		this.DmgMinMax(out num4, out num5, weaponIndex, target, forCharacterSheet);
		float num6 = this.HitWpnDur(this.GetCurrentHand(), false);
		if (forCharacterSheet)
		{
			num6 = 1f;
		}
		else
		{
			float num7 = num6 * 100f;
			if (num7 < 100f)
			{
				num6 = (float)Random.Range((int)num7, 100) / 100f;
			}
			else
			{
				num6 = 1f;
			}
		}
		float num8 = (float)num5;
		wpnDmg = num8 * num6;
		float num9;
		if (forCharacterSheet)
		{
			num9 = Mathf.Round(num + num3);
		}
		else
		{
			num9 = this.R1(num8 + num + num3);
		}
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s damage roll info -  total ",
				num9.ToString(),
				", min: ",
				num4.ToString(),
				", max: ",
				num5.ToString(),
				", roll: ",
				num8.ToString(),
				", strength: ",
				num.ToString(),
				", diff: ",
				num3.ToString()
			}));
		}
		return num9;
	}

	// Token: 0x060009F3 RID: 2547 RVA: 0x000CBD40 File Offset: 0x000C9F40
	public string DamageRollString(int weaponIndex, out float floatVersion)
	{
		floatVersion = 0f;
		int num = 0;
		int num2 = 0;
		this.DmgMinMax(out num, out num2, weaponIndex, null, true);
		float num3 = this.HitWpnDur(0, false);
		float num4 = (float)num2;
		float num6;
		float num5 = this.DamageRoll(true, weaponIndex, out num6, false, false, null);
		floatVersion = num4 * num3 + num5;
		return this.R1(num4 * num3 + num5).ToString();
	}

	// Token: 0x060009F4 RID: 2548 RVA: 0x000CBDA0 File Offset: 0x000C9FA0
	public float DmgStrength(bool forCharacterSheet)
	{
		float num = this.Strength() + this.strengthModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(0);
		}
		else
		{
			num += (float)this.GetDiceModifier(0);
		}
		num /= 20f;
		return this.R1(num);
	}

	// Token: 0x060009F5 RID: 2549 RVA: 0x000CBDE8 File Offset: 0x000C9FE8
	public float DmgMods(bool forCharacterSheet)
	{
		float num = this.severityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(6);
		}
		else
		{
			num += (float)this.GetDiceModifier(6);
		}
		return this.R1(num);
	}

	// Token: 0x060009F6 RID: 2550 RVA: 0x000CBE20 File Offset: 0x000CA020
	public void DmgMinMax(out int damageMin, out int damageMax, int weaponIndex, Character target, bool forCS)
	{
		damageMin = 0;
		damageMax = 0;
		bool flag = false;
		if (weaponIndex == 0)
		{
			damageMax = this.character.invRow1._DmgMax;
			if (this.character.invRow1._MeleeRangeEnd >= 5f)
			{
				flag = true;
			}
			if (!forCS)
			{
				damageMax += this.CheckForSpecial(this.character.invRow1, target);
			}
		}
		if (weaponIndex == 1)
		{
			damageMax = this.character.invRow2._DmgMax;
			if (!forCS)
			{
				damageMax += this.CheckForSpecial(this.character.invRow2, target);
			}
		}
		if (flag)
		{
			int num = this.character.selectedAmmoIndex + 4;
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(num * 2));
			damageMax = invRowByIndex._DmgMax;
			Vector3 socketNum = this.character.GetSocketNum(num * 2);
			damageMax += (int)socketNum.x;
			if (Records.x.showRuleset && !Records.x.paused && Records.x.InCombat(false))
			{
				Debug.Log(string.Concat(new string[]
				{
					this.GetName(),
					"'s damage roll is from projectile ",
					invRowByIndex._DisplayName,
					", min: ",
					damageMin.ToString(),
					", max: ",
					damageMax.ToString(),
					", ammo index: ",
					num.ToString()
				}));
			}
		}
	}

	// Token: 0x060009F7 RID: 2551 RVA: 0x000CBF8C File Offset: 0x000CA18C
	public int CheckForSpecial(Library.Inventory itemRow, Character target)
	{
		if (itemRow._HasUseFill && itemRow._UseFill == "Forest1" && target && target.stats.race == "Forest")
		{
			return 1;
		}
		return 0;
	}

	// Token: 0x060009F8 RID: 2552 RVA: 0x000CBFCC File Offset: 0x000CA1CC
	public string GetHitChanceStat(string mainSkill, out string abrev, out float num, float forCS)
	{
		num = 0f;
		abrev = "DEX";
		if (mainSkill == "Hand-to-Hand")
		{
			float num2 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			float num3 = this.Agility() + this.agilityModFlat + Mathf.Lerp((float)this.GetDiceModifier(1), (float)this.GetDiceModifierAverage(1), forCS);
			float num4 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			string text = "Sensory";
			num = num2;
			abrev = "SEN";
			if (num3 > num2)
			{
				text = "Agility";
				num = num3;
				abrev = "AGL";
			}
			if (num4 > num3 && text == "Agility")
			{
				text = "Dexterity";
				num = num4;
				abrev = "DEX";
			}
			if (num4 > num2 && text == "Sensory")
			{
				num = num4;
				abrev = "DEX";
			}
			num = this.R1(num / 20f);
			return "Sensory or Agility or Dexterity (whichever is higher)";
		}
		if (mainSkill == "Whip")
		{
			num = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = this.R1(num / 20f);
			return "Dexterity";
		}
		if (mainSkill == "Sword" || mainSkill == "LongSword")
		{
			num = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = this.R1(num / 20f);
			return "Dexterity";
		}
		if (mainSkill == "ShortSword")
		{
			float num5 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			float num6 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = num5;
			abrev = "SEN";
			if (num6 > num5)
			{
				num = num6;
				abrev = "DEX";
			}
			num = this.R1(num / 20f);
			return "Sensory or Dexterity (whichever is higher)";
		}
		if (mainSkill == "Bow")
		{
			num = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			num = this.R1(num / 20f);
			abrev = "SEN";
			return "Sensory";
		}
		if (mainSkill == "Elixir")
		{
			float num7 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			float num8 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = num7;
			abrev = "SEN";
			if (num8 > num7)
			{
				num = num8;
				abrev = "DEX";
			}
			num = this.R1(num / 20f);
			return "Sensory or Dexterity (whichever is higher)";
		}
		if (mainSkill == "Pole")
		{
			num = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = this.R1(num / 20f);
			abrev = "DEX";
			return "Dexterity";
		}
		if (mainSkill == "Scepter")
		{
			float num9 = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			float num10 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = num9;
			abrev = "STR";
			if (num10 > num9)
			{
				num = num10;
				abrev = "DEX";
			}
			num = this.R1(num / 20f);
			return "Strength or Dexterity (whichever is higher)";
		}
		if (mainSkill == "Sling")
		{
			float num11 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			float num12 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = num11;
			abrev = "SEN";
			if (num12 > num11)
			{
				num = num12;
				abrev = "STR";
			}
			num = this.R1(num / 20f);
			return "Sensory or Dexterity (whichever is higher)";
		}
		if (mainSkill == "Ax")
		{
			float num13 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			float num14 = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
			num = num13;
			abrev = "SEN";
			if (num14 > num13)
			{
				num = num14;
				abrev = "DEX";
			}
			num = this.R1(num / 20f);
			return "Sensory or Dexterity (whichever is higher)";
		}
		num = this.Dexterity() + this.dexterityModFlat + Mathf.Lerp((float)this.GetDiceModifier(4), (float)this.GetDiceModifierAverage(4), forCS);
		num = this.R1(num / 20f);
		return "Dexterity";
	}

	// Token: 0x060009F9 RID: 2553 RVA: 0x000CC534 File Offset: 0x000CA734
	public string GetDmgStat(string mainSkill, out float num, out string abrev, float forCS)
	{
		num = 0f;
		if (mainSkill == "Hand-to-Hand")
		{
			float num2 = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			float num3 = this.Aura() + this.auraModFlat + Mathf.Lerp((float)this.GetDiceModifier(2), (float)this.GetDiceModifierAverage(2), forCS);
			num = num2 + num3;
			num = this.R1(num / 20f);
			abrev = "(STR + AUR)";
			return "Strength + Aura";
		}
		if (mainSkill == "Whip")
		{
			float num4 = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			float num5 = this.Agility() + this.agilityModFlat + Mathf.Lerp((float)this.GetDiceModifier(1), (float)this.GetDiceModifierAverage(1), forCS);
			num = num4;
			abrev = "STR";
			if (num5 > num4)
			{
				num = num5;
				abrev = "AGL";
			}
			num = this.R1(num / 20f);
			return "Strength or Agility (whichever is higher)";
		}
		if (mainSkill == "Sword" || mainSkill == "LongSword")
		{
			num = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			abrev = "STR";
			num = this.R1(num / 20f);
			return "Strength";
		}
		if (mainSkill == "ShortSword")
		{
			float num6 = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			float num7 = this.Agility() + this.agilityModFlat + Mathf.Lerp((float)this.GetDiceModifier(1), (float)this.GetDiceModifierAverage(1), forCS);
			num = num6;
			abrev = "STR";
			if (num7 > num6)
			{
				num = num7;
				abrev = "AGL";
			}
			num = this.R1(num / 20f);
			return "Strength or Agility (whichever is higher)";
		}
		if (mainSkill == "Bow")
		{
			num = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			num = this.R1(num / 20f);
			abrev = "STR";
			return "Strength";
		}
		if (mainSkill == "Elixir")
		{
			abrev = "WPN";
			num = 0f;
			return "From Weapon";
		}
		if (mainSkill == "Pole")
		{
			float num8 = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			float num9 = this.Sensory() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(5), (float)this.GetDiceModifierAverage(5), forCS);
			num = num8;
			abrev = "STR";
			if (num9 > num8)
			{
				num = num9;
				abrev = "SEN";
			}
			num = this.R1(num / 20f);
			return "Strength or Sensory (whichever is higher)";
		}
		if (mainSkill == "Scepter")
		{
			num = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
			num = this.R1(num / 20f);
			abrev = "STR";
			return "Strength";
		}
		if (mainSkill == "Sling")
		{
			abrev = "WPN";
			num = 0f;
			return "From Weapon";
		}
		mainSkill == "Ax";
		num = this.Strength() + this.sensoryModFlat + Mathf.Lerp((float)this.GetDiceModifier(0), (float)this.GetDiceModifierAverage(0), forCS);
		num = this.R1(num / 20f);
		abrev = "STR";
		return "Strength";
	}

	// Token: 0x060009FA RID: 2554 RVA: 0x000CC8FC File Offset: 0x000CAAFC
	public float ArmorNumber(bool forCharacterSheet, bool addDurability)
	{
		bool flag = false;
		float num = -1f;
		float num2 = 0f;
		float num3 = 0f;
		float num4 = 0f;
		float num5 = 0f;
		float num6 = 0f;
		float num7 = 0f;
		if (this.character.GetInvNum(2) > 1)
		{
			Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(2));
			if (invRowByIndex._Tag == "Shield")
			{
				flag = true;
			}
			num6 = invRowByIndex._AC;
		}
		this.EvadeArmorTotal(out num2, out num, out num3, false, flag);
		bool flag2 = false;
		if (num > -1f)
		{
			flag2 = true;
			if (this.character.GetInvNum(18) > 1)
			{
				num7 = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(18))._AC;
			}
		}
		if (flag)
		{
			float num8;
			this.BlockTotal(out num4, out num8, out num5, false, flag2);
		}
		float num9 = 0f;
		if (flag2)
		{
			float num10 = num3;
			if (forCharacterSheet)
			{
				num10 = num3;
			}
			if (!addDurability)
			{
				num10 = 1f;
			}
			num9 += num7 * num10;
		}
		if (flag)
		{
			float num11 = num5 * 100f;
			float num12;
			if (num11 < 100f)
			{
				num12 = (float)Random.Range((int)num11, 100) / 100f;
				if (forCharacterSheet)
				{
					num12 = num11 / 100f;
				}
			}
			else
			{
				num12 = 1f;
			}
			if (forCharacterSheet)
			{
				num12 = num5;
			}
			if (!addDurability)
			{
				num12 = 1f;
			}
			num9 += num6 * num12;
		}
		if (this.character.npc && this.xmlName.Contains("FishMonsterWhite") && (this.character.node.GraphIndex == 1U || Links.x.gameplay.IsNight()))
		{
			num9 += 40f;
		}
		float num13 = this.characterRow._NaturalArmor;
		if (this.naturalArmorBase > 0f)
		{
			num13 = this.naturalArmorBase;
		}
		if (num13 < 0f)
		{
			num13 = 0f;
		}
		num9 += num13;
		bool flag3 = forCharacterSheet && addDurability;
		return this.R1(num9);
	}

	// Token: 0x060009FB RID: 2555 RVA: 0x000CCAF8 File Offset: 0x000CACF8
	public float ArmorAura(int forCS)
	{
		float num = this.Aura() + this.auraModFlat + Mathf.Lerp((float)this.GetDiceModifier(2), (float)this.GetDiceModifierAverage(2), (float)forCS);
		return this.R1(num / 4f);
	}

	// Token: 0x060009FC RID: 2556 RVA: 0x000CCB38 File Offset: 0x000CAD38
	public float ArmorPaganAura(int forCS)
	{
		float num = this.Aura() + this.auraModFlat + Mathf.Lerp((float)this.GetDiceModifier(2), (float)this.GetDiceModifierAverage(2), (float)forCS);
		return this.R1(num / 2f);
	}

	// Token: 0x060009FD RID: 2557 RVA: 0x000CCB78 File Offset: 0x000CAD78
	public bool AttackIsPoison(bool firstAttack, Library.Inventory ammoRow)
	{
		if (this.xmlName.Contains("Frog"))
		{
			return true;
		}
		if (ammoRow != null)
		{
			if (ammoRow._Effect.Contains("Frog"))
			{
				return true;
			}
			if (ammoRow._Name.Contains("Poison"))
			{
				return true;
			}
		}
		return (firstAttack && this.character.invRow1._Effect.Contains("Poison")) || (!firstAttack && this.character.invRow2 != null && this.character.invRow2._Effect.Contains("Poison"));
	}

	// Token: 0x060009FE RID: 2558 RVA: 0x000CCC14 File Offset: 0x000CAE14
	public float HeavyDamageModifier()
	{
		return 1.15f + (this.dexterity + this.dexterityModFlat) / 200f;
	}

	// Token: 0x060009FF RID: 2559 RVA: 0x000CCC2F File Offset: 0x000CAE2F
	public float MultiHitMod()
	{
		return this.character.invRow1._MultiTargetMod;
	}

	// Token: 0x06000A00 RID: 2560 RVA: 0x000CCC41 File Offset: 0x000CAE41
	public float LightDamageModifier()
	{
		return 0.5f;
	}

	// Token: 0x06000A01 RID: 2561 RVA: 0x000CCC48 File Offset: 0x000CAE48
	public string DefenseStance(string orig, float perc)
	{
		this.str.Clear();
		this.str.Append("<color #857C6C>(");
		this.str.Append(orig);
		this.str.Append(" * ");
		this.str.Append(this.R1(perc));
		this.SBP();
		this.str.Append("Defend");
		this.CB();
		this.str.Append("</color>");
		return this.str.ToString();
	}

	// Token: 0x06000A02 RID: 2562 RVA: 0x000CCCDC File Offset: 0x000CAEDC
	public string DirectionalString()
	{
		this.str.Clear();
		this.str.Append("<color #857C6C>");
		this.str.Append(" + 1");
		this.SBP();
		this.str.Append("Directional bonus");
		this.CB();
		this.str.Append("</color>");
		return this.str.ToString();
	}

	// Token: 0x06000A03 RID: 2563 RVA: 0x000CCD50 File Offset: 0x000CAF50
	public string DamageCalculation(bool fromManual, float wpnDmg, float severity, float targetArmor, bool secondAttack, float damageReduction, string attackType, bool interactable, bool poison, Character target)
	{
		this.str.Clear();
		float num = this.DmgMods(true);
		int num2 = 0;
		int num3 = 0;
		this.DmgMinMax(out num2, out num3, this.GetCurrentHand(), target, fromManual);
		float num4 = 0f;
		int num5 = 0;
		string text = "";
		if (this.GetCurrentHand() == 0)
		{
			text = this.character.invRow1._MainSkill;
		}
		if (this.GetCurrentHand() == 1)
		{
			text = this.character.invRow2._MainSkill;
		}
		string text2;
		this.GetDmgStat(text, out num4, out text2, (float)num5);
		this.COL();
		if (secondAttack || (damageReduction < 1f && damageReduction > 0f))
		{
			this.str.Append("(");
		}
		this.str.Append("(");
		if (fromManual)
		{
			this.str.Append("Hit Chance Severity + ");
		}
		if (!fromManual)
		{
			this.str.Append(this.R1(severity));
			this.SBP();
			this.str.Append("Severity");
			this.CPlus();
		}
		if (text2 != "WPN")
		{
			this.str.Append(num4);
			this.SBP();
			this.str.Append(text2);
			this.str.Append("/20");
			this.CPlus();
		}
		if (num != 0f)
		{
			this.str.Append(num);
			this.SBP();
			this.str.Append("Damage Mods");
			this.str.Append("]</color> + ");
		}
		if (fromManual)
		{
			this.str.Append(num3);
			this.SBP();
			this.str.Append("Weapon Damage");
			this.CMult();
			this.str.Append(this.HitWpnDur(this.GetCurrentHand(), false));
			this.SBP();
			this.str.Append("Weapon Condition");
			this.CB();
		}
		else
		{
			this.str.Append(this.R1(wpnDmg * this.HitWpnDur(this.GetCurrentHand(), false)));
			this.SBP();
			this.str.Append("Wpn Dmg * Condition");
		}
		if (fromManual)
		{
			this.str.Append(") * ");
			this.str.Append("(Target's Armor % * Armor Condition % + Aur/4)");
			this.str.Append("\n\n<color=#504B41>Left hand attack damage is halved.</color>");
		}
		else
		{
			this.CB();
			if (!interactable)
			{
				this.str.Append(") * ");
				this.str.Append(this.R1(targetArmor));
				this.SBP();
				if (poison)
				{
					this.str.Append("Armor ineffective to poison");
				}
				else
				{
					this.str.Append("Armor");
				}
				this.CB();
				if (secondAttack || (damageReduction < 1f && damageReduction > 0f) || damageReduction > 1f)
				{
					this.str.Append(")");
					if ((damageReduction < 1f && damageReduction > 0f) || damageReduction > 1f)
					{
						this.str.Append(" * ");
						this.str.Append(damageReduction);
						this.SBP();
						if (attackType == "Multi Attack")
						{
							this.str.Append("Sweep Penalty");
						}
						if (attackType == "Heavy Attack")
						{
							this.str.Append("Marked Penalty");
						}
						if (attackType == "Grazing")
						{
							this.str.Append("Grazed");
						}
						if (attackType == "Spirit Attack 1")
						{
							this.str.Append("Rally Bonus");
						}
						this.CB();
					}
					if (secondAttack)
					{
						this.str.Append(" * ");
						this.str.Append(0.5);
						this.SBP();
						this.str.Append("Left Hand Penalty");
						this.CB();
					}
				}
			}
			else
			{
				if ((damageReduction < 1f && damageReduction > 0f) || damageReduction > 1f)
				{
					this.str.Append(") * ");
					this.str.Append(damageReduction);
					this.SBP();
					if (attackType == "Multi Attack")
					{
						this.str.Append("Sweep Penalty");
					}
					if (attackType == "Heavy Attack")
					{
						this.str.Append("Marked Penalty");
					}
					if (attackType == "Spirit Attack 1")
					{
						this.str.Append("Rally Bonus");
					}
					this.CMin();
				}
				else
				{
					this.str.Append(") * ");
				}
				this.str.Append(this.R1(targetArmor));
				this.SBP();
				this.str.Append("Armor");
				this.CB();
				if (secondAttack)
				{
					this.COL();
					this.str.Append(")/2");
					this.SBP();
					this.str.Append("Left Hand");
					this.CB();
				}
			}
		}
		return this.str.ToString();
	}

	// Token: 0x06000A04 RID: 2564 RVA: 0x000CD29C File Offset: 0x000CB49C
	public float PaganHitChance(bool forCharacterSheet, string skill)
	{
		float num = this.PaganHit(forCharacterSheet);
		float num2 = this.PaganMods(forCharacterSheet);
		float num3 = 1f;
		float num4;
		this.PaganTotals(out num4, out num3, skill, false, forCharacterSheet);
		float num5 = num + num2 + num3;
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s pagan hit roll info - total is: ",
				(Mathf.Round(num5 * 100f) / 100f).ToString(),
				", pagan: ",
				num.ToString(),
				", pagan mods: ",
				num2.ToString(),
				", skill: ",
				num3.ToString()
			}));
		}
		return Mathf.Round(num5);
	}

	// Token: 0x06000A05 RID: 2565 RVA: 0x000CD364 File Offset: 0x000CB564
	public void PaganTotals(out float durability, out float skillTotal, string skill, bool justSkill, bool forCharacterSheet)
	{
		durability = 1f;
		skillTotal = 1f;
		int combatSkillID = this.GetCombatSkillID(skill);
		skillTotal = this.GetSkill(combatSkillID) / 10f;
		if (justSkill)
		{
			skillTotal = this.GetSkill(combatSkillID);
		}
		if (Records.x.showRuleset && !justSkill && Records.x.InCombat(false) && !Records.x.paused && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s pagan roll info 1 - skill raw: ",
				this.GetSkill(combatSkillID).ToString(),
				", dur: ",
				this.character.GetDurabilityNum(0).y.ToString(),
				", max dur: , staff: ",
				this.character.invRow1._DisplayName
			}));
		}
	}

	// Token: 0x06000A06 RID: 2566 RVA: 0x000CD44C File Offset: 0x000CB64C
	public float PaganHit(bool forCharacterSheet)
	{
		float num = this.Pagan() + this.paganModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(3);
		}
		else
		{
			num += (float)this.GetDiceModifier(3);
		}
		return num / 5f;
	}

	// Token: 0x06000A07 RID: 2567 RVA: 0x000CD48C File Offset: 0x000CB68C
	public float PaganMods(bool forCharacterSheet)
	{
		float num = this.paganHitModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(9);
		}
		else
		{
			num += (float)this.GetDiceModifier(9);
		}
		return num;
	}

	// Token: 0x06000A08 RID: 2568 RVA: 0x000CD4C0 File Offset: 0x000CB6C0
	public void PaganSpellCost(string spellName, bool remove, out float spiritCost, out float healthCost)
	{
		int num = this.uniqueNames.IndexOf(spellName);
		spiritCost = 0f;
		healthCost = 0f;
		if (num > -1)
		{
			spiritCost = this.abilityCost[num].x;
			if (Records.x.showRuleset)
			{
				Debug.Log(string.Concat(new string[]
				{
					this.GetName(),
					"'s spell cost - spirit: ",
					spiritCost.ToString(),
					", health: ",
					healthCost.ToString()
				}));
			}
			if (remove && !this.semizenMagic && this.customAI != "SpellsOnly")
			{
				this.AddSpirit((int)spiritCost * (-1 * Records.x.spiritFragment));
			}
		}
	}

	// Token: 0x06000A09 RID: 2569 RVA: 0x000CD580 File Offset: 0x000CB780
	public bool HasPaganCostForSpell(string spellName)
	{
		int num = this.uniqueNames.IndexOf(spellName);
		float num2 = 0f;
		if (num > -1)
		{
			float num3 = this.abilityCost[num].x * (float)Records.x.spiritFragment;
			return num2 <= (float)this.currLife && num3 <= (float)this.magicPoints;
		}
		return false;
	}

	// Token: 0x06000A0A RID: 2570 RVA: 0x000CD5E4 File Offset: 0x000CB7E4
	public float PaganPower(float tether, bool forCharacterSheet)
	{
		float num = this.PaganPowerAura(forCharacterSheet);
		float num2 = this.PaganPowerPag(forCharacterSheet);
		float num3 = this.PaganPowerMods(forCharacterSheet);
		if (forCharacterSheet)
		{
			return this.R1(num + num2 + num3 + (float)this.character.GetMagicItems());
		}
		float num4 = this.R1(tether + num + num2 + num3 + (float)this.character.GetMagicItems());
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s spell power - aura: ",
				num.ToString(),
				", pagan: ",
				num2.ToString(),
				", mods: ",
				num3.ToString(),
				", tether: ",
				tether.ToString(),
				", magic items: ",
				this.character.GetMagicItems().ToString(),
				" total is ",
				num4.ToString()
			}));
		}
		return this.R1(num4);
	}

	// Token: 0x06000A0B RID: 2571 RVA: 0x000CD6FC File Offset: 0x000CB8FC
	public float PaganRollString()
	{
		float num = this.PaganPowerAura(true);
		float num2 = this.PaganPowerPag(true);
		float num3 = this.PaganPowerMods(true);
		return this.R1(num + num2 + num3 + (float)this.character.GetMagicItems());
	}

	// Token: 0x06000A0C RID: 2572 RVA: 0x000CD73C File Offset: 0x000CB93C
	public float PaganPowerMods(bool forCharacterSheet)
	{
		float num = this.paganSeverityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(7);
		}
		else
		{
			num += (float)this.GetDiceModifier(7);
		}
		return num;
	}

	// Token: 0x06000A0D RID: 2573 RVA: 0x000CD76C File Offset: 0x000CB96C
	public float PaganPowerPag(bool forCharacterSheet)
	{
		float num = this.Pagan() + this.paganModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(3);
		}
		else
		{
			num += (float)this.GetDiceModifier(3);
		}
		num /= 5f;
		return this.R1(num);
	}

	// Token: 0x06000A0E RID: 2574 RVA: 0x000CD7B4 File Offset: 0x000CB9B4
	public float PaganPowerAura(bool forCharacterSheet)
	{
		float num = this.Aura() + this.auraModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(2);
		}
		else
		{
			num += (float)this.GetDiceModifier(2);
		}
		num /= 7f;
		return this.R1(num);
	}

	// Token: 0x06000A0F RID: 2575 RVA: 0x000CD7FC File Offset: 0x000CB9FC
	public float PaganPowerFromItem(float severity, float tether)
	{
		float num = Mathf.Round(tether + severity);
		if (Records.x.showRuleset)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s spell power from item - tether: ",
				tether.ToString(),
				", severity: ",
				severity.ToString()
			}));
		}
		return num;
	}

	// Token: 0x06000A10 RID: 2576 RVA: 0x000CD85C File Offset: 0x000CBA5C
	public string PaganPowerCalculation(bool fromManual, float tether, bool fromItem)
	{
		this.str.Clear();
		if (fromItem)
		{
			this.str.Append(tether);
			this.SBP();
			this.str.Append("Spell Overpower");
			this.CB();
		}
		else
		{
			this.str.Append(this.PaganPowerAura(true));
			this.SBP();
			this.str.Append("AUR/7");
			this.CPlus();
			this.str.Append(this.PaganPowerPag(true));
			if (!Records.x.banquetIsle && !this.semizenMagic)
			{
				this.SBP();
				this.str.Append("PAG/5");
				this.CPlus();
			}
			else
			{
				this.SBP();
				this.str.Append("OCC/5");
				this.CPlus();
			}
			this.str.Append(this.character.GetMagicItems());
			this.SBP();
			this.str.Append("Enhanced Items");
			this.CPlus();
			float num = this.PaganPowerMods(true);
			if (num != 0f)
			{
				this.str.Append(num);
				this.SBP();
				this.str.Append("Mods");
				this.CPlus();
			}
			this.str.Append(tether);
			this.SBP();
			this.str.Append("Spell Overpower");
			this.CB();
		}
		return this.str.ToString();
	}

	// Token: 0x06000A11 RID: 2577 RVA: 0x000CD9DD File Offset: 0x000CBBDD
	public float SpellRadius(Library.Pagan paganRow)
	{
		if (this.character.npc)
		{
			return 20f;
		}
		if (paganRow != null && paganRow._ID == "Revive")
		{
			return 5f;
		}
		return 20f;
	}

	// Token: 0x06000A12 RID: 2578 RVA: 0x000CDA14 File Offset: 0x000CBC14
	public float PaganResistance(bool forCharacterSheet, string spellClass, out float roll, out float armor)
	{
		armor = (float)this.character.GetMagicAC();
		float num = this.PaganResistAura(forCharacterSheet);
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s spell resistance - aura: ",
				num.ToString(),
				", armor: ",
				armor.ToString()
			}));
		}
		float num2 = num;
		roll = 0f;
		if (!forCharacterSheet)
		{
			float num3 = num2;
			float num4 = num2 * 0.6f;
			float num5 = num2 * 1.4f;
			float num6 = Random.Range(num4, num5);
			num2 = num6;
			roll = this.R1(num3 - num6);
			if (spellClass == "Vines")
			{
				num2 += this.paganResist.x;
			}
			else if (spellClass == "Spores")
			{
				num2 += this.paganResist.z;
			}
			else if (spellClass == "Fauna")
			{
				num2 += this.paganResist.y;
			}
		}
		return num2;
	}

	// Token: 0x06000A13 RID: 2579 RVA: 0x000CDB18 File Offset: 0x000CBD18
	public float PaganResistAura(bool forCharacterSheet)
	{
		float num = this.Aura() + this.auraModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(2);
		}
		else
		{
			num += (float)this.GetDiceModifier(2);
		}
		num /= 3f;
		return this.R1(num);
	}

	// Token: 0x06000A14 RID: 2580 RVA: 0x000CDB60 File Offset: 0x000CBD60
	public string PaganResistCalculation(bool fromManual, float luck, string spellClass)
	{
		this.str.Clear();
		this.str.Append(this.PaganResistAura(true));
		this.SBP();
		this.str.Append("AUR/3");
		int magicAC = this.character.GetMagicAC();
		float num = 0f;
		if (spellClass == "Vines")
		{
			num = this.paganResist.x;
		}
		else if (spellClass == "Spores")
		{
			num = this.paganResist.z;
		}
		else if (spellClass == "Fauna")
		{
			num = this.paganResist.y;
		}
		if (num != 0f)
		{
			if (num > 0f)
			{
				this.CPlus();
				this.str.Append(num);
			}
			if (num < 0f)
			{
				this.CMin();
				this.str.Append(num * -1f);
			}
			if (fromManual)
			{
				this.SBP();
				if (spellClass == "Vines")
				{
					this.str.Append("Vines Resistance");
				}
				else if (spellClass == "Spores")
				{
					this.str.Append("Spores Resistance");
				}
				else if (spellClass == "Fauna")
				{
					this.str.Append("Fauna Resistance");
				}
			}
			else
			{
				this.SBP();
				this.str.Append("Resistance Modifier");
			}
		}
		if (fromManual)
		{
			this.CB();
		}
		else
		{
			if (luck > 0f)
			{
				this.CMin();
				this.str.Append(luck);
			}
			if (luck < 0f)
			{
				this.CPlus();
				this.str.Append(luck * -1f);
			}
			this.SBP();
			this.str.Append("Resist Luck");
			this.CB();
		}
		if (fromManual || magicAC > 0)
		{
			this.str.Append("Spell effects are reduced ");
			this.str.Append((float)this.character.GetMagicAC() / 10f);
			this.str.Append("%");
			this.SBP();
			this.str.Append("Pagan Armor");
			this.CB();
		}
		return this.str.ToString();
	}

	// Token: 0x06000A15 RID: 2581 RVA: 0x000CDDA0 File Offset: 0x000CBFA0
	public float SpellDifficulty(string spellName, out float tether)
	{
		int num = this.uniqueNames.IndexOf(spellName);
		float num2 = 0f;
		tether = 0f;
		if (num > -1)
		{
			Library.Pagan paganRow = Links.x.library.GetPaganRow(this.abilityNames[num]);
			num2 = Records.x.SpellDifficulty(paganRow, this.abilityLevels[num].x, this.abilityLevels[num].y, this.abilityLevels[num].z);
			if (paganRow._Slider1.Contains("Summon"))
			{
				num2 += this.SummonModSpells();
			}
		}
		else
		{
			Debug.LogError("NO SPELL NAME FOUND " + ((this != null) ? this.ToString() : null));
		}
		return num2;
	}

	// Token: 0x06000A16 RID: 2582 RVA: 0x000CDE60 File Offset: 0x000CC060
	public float PlayingSkill(string instrument)
	{
		int num = 26;
		if (instrument == "Flute")
		{
			num = 26;
		}
		if (instrument == "Horn")
		{
			num = 27;
		}
		if (instrument == "Pipe")
		{
			num = 29;
		}
		return this.R1(this.GetSkill(num) / 20f);
	}

	// Token: 0x06000A17 RID: 2583 RVA: 0x000CDEB4 File Offset: 0x000CC0B4
	public float PlayingSkillHighest()
	{
		float num = this.R1(this.GetSkill(26) / 20f);
		float num2 = this.R1(this.GetSkill(27) / 20f);
		float num3 = this.R1(this.GetSkill(29) / 20f);
		float num4 = num;
		if (num2 > num4)
		{
			num4 = num2;
		}
		if (num3 > num4)
		{
			num4 = num3;
		}
		return num4;
	}

	// Token: 0x06000A18 RID: 2584 RVA: 0x000CDF10 File Offset: 0x000CC110
	public float PlaySensory(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifier(5);
		}
		num /= 10f;
		return this.R1(num);
	}

	// Token: 0x06000A19 RID: 2585 RVA: 0x000CDF58 File Offset: 0x000CC158
	public float InstrumentPower(float severity, string skill, bool forCharacterSheet, out float instrumentPower)
	{
		float num = this.PlayingPowerDex(forCharacterSheet);
		float num2 = this.PlaySensory(forCharacterSheet);
		int num3 = 0;
		int num4 = 0;
		this.PlayingMinMax(out num3, out num4, forCharacterSheet, skill);
		instrumentPower = this.R1((float)Random.Range(num3, num4 + 1));
		if (forCharacterSheet)
		{
			return this.R2((float)num4 + num + num2 + this.R1((float)this.Artistry()));
		}
		float num5 = this.PlayingSkill(skill);
		float num6;
		if (forCharacterSheet)
		{
			num6 = this.R1(instrumentPower + num + num2 + this.R1(this.PlayingSkillHighest()) + this.R1((float)this.Artistry()));
		}
		else
		{
			num6 = this.R1(instrumentPower + num + num2 + this.R1(num5) + this.R1((float)this.Artistry()));
		}
		if (Records.x.showRuleset && !forCharacterSheet)
		{
			Debug.Log(string.Concat(new string[]
			{
				this.GetName(),
				"'s instrument potency total: ",
				num6.ToString(),
				", damageMin: ",
				num3.ToString(),
				", damageMax: ",
				num4.ToString(),
				", power: ",
				instrumentPower.ToString(),
				", severity: ",
				severity.ToString(),
				" , dex: ",
				num.ToString(),
				", sen: ",
				num2.ToString()
			}));
		}
		return num6;
	}

	// Token: 0x06000A1A RID: 2586 RVA: 0x000CE0D0 File Offset: 0x000CC2D0
	public float MusicPowerString()
	{
		float num = this.PlayingPowerDex(true);
		return this.R1(num);
	}

	// Token: 0x06000A1B RID: 2587 RVA: 0x000CE0EC File Offset: 0x000CC2EC
	public void PlayingMinMax(out int damageMin, out int damageMax, bool forCharacterSheet, string skill)
	{
		damageMin = 0;
		damageMax = 0;
		if (forCharacterSheet)
		{
			return;
		}
		Library.Inventory inventory = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(this.character.instrumentInUse * 2));
		if (this.character.instrumentInUse == 0)
		{
			inventory = this.character.GetInstrumentType(skill);
		}
		if (inventory != null && (inventory._MainSkill == "Flute" || inventory._MainSkill == "Drums" || inventory._MainSkill == "Pipe" || inventory._MainSkill == "Horn"))
		{
			damageMin = inventory._DmgMin;
			damageMax = inventory._DmgMax;
		}
	}

	// Token: 0x06000A1C RID: 2588 RVA: 0x000CE1A4 File Offset: 0x000CC3A4
	public float PlayingPowerDex(bool forCharacterSheet)
	{
		float num = this.Dexterity() + this.dexterityModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(4);
		}
		else
		{
			num += (float)this.GetDiceModifier(4);
		}
		num /= 30f;
		return this.R1(num);
	}

	// Token: 0x06000A1D RID: 2589 RVA: 0x000CE1EC File Offset: 0x000CC3EC
	public string InstrumentPowerCalculation(bool fromManual, string req, float instrumentPower, bool addSkillLevel, float skillLevel, string type)
	{
		this.str.Clear();
		float num = (float)this.Artistry();
		if (num != 0f)
		{
			this.CPlus();
			this.str.Append(this.R1(num));
			this.SBP();
			this.str.Append("Artistry Mods");
			this.CPlus();
		}
		this.str.Append(this.PlayingPowerDex(true));
		this.SBP();
		this.str.Append("DEX/30");
		this.CPlus();
		this.str.Append(this.PlaySensory(true));
		this.SBP();
		this.str.Append("SEN/10");
		this.CPlus();
		if (!fromManual)
		{
			this.str.Append(this.R1(instrumentPower));
		}
		this.SBP();
		if (!fromManual)
		{
			if (type == "Pipe")
			{
				this.str.Append("Pipe Power");
			}
			else if (type == "Flute")
			{
				this.str.Append("Flute Power");
			}
			else
			{
				this.str.Append("Horn Power");
			}
		}
		else
		{
			this.str.Append("Instrument Power");
		}
		if (addSkillLevel)
		{
			this.str.Append("]</color> + ");
			this.str.Append(this.PlayingSkill(req));
			this.SBP();
			this.str.Append("Skill/20");
		}
		else
		{
			this.str.Append("]</color> + ");
			this.str.Append(this.PlayingSkill(req));
			this.SBP();
			this.str.Append("Highest Instrument Skill/20");
		}
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x06000A1E RID: 2590 RVA: 0x000CE3C0 File Offset: 0x000CC5C0
	public string SongSkillMultiplierCalculation(float x)
	{
		this.str.Clear();
		this.str.Append(this.R1(Records.x.SongSkillMultiplier(x)));
		this.SBP();
		this.str.Append("Modified Skill");
		this.CB();
		return this.str.ToString();
	}

	// Token: 0x06000A1F RID: 2591 RVA: 0x000CE420 File Offset: 0x000CC620
	public float InstrumentResistance(bool forCharacterSheet, out float roll)
	{
		float num = this.PlayingResistAura(forCharacterSheet);
		float num2 = this.PlayingResistSensory(forCharacterSheet);
		float num3 = num + num2;
		num3 += this.musicResistMod;
		roll = 0f;
		if (!forCharacterSheet)
		{
			float num4 = num3;
			float num5 = num3 * 0.6f;
			float num6 = num3 * 1.4f;
			float num7 = Random.Range(num5, num6);
			num3 = num7;
			roll = this.R1(num4 - num7);
		}
		return this.R1(num3);
	}

	// Token: 0x06000A20 RID: 2592 RVA: 0x000CE484 File Offset: 0x000CC684
	public float PlayingResistAura(bool forCharacterSheet)
	{
		float num = this.Aura() + this.auraModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(2);
		}
		else
		{
			num += (float)this.GetDiceModifier(2);
		}
		num /= 4f;
		return Mathf.Ceil(num);
	}

	// Token: 0x06000A21 RID: 2593 RVA: 0x000CE4C8 File Offset: 0x000CC6C8
	public float PlayingResistSensory(bool forCharacterSheet)
	{
		float num = this.Sensory() + this.sensoryModFlat;
		if (forCharacterSheet)
		{
			num += (float)this.GetDiceModifierAverage(5);
		}
		else
		{
			num += (float)this.GetDiceModifier(5);
		}
		num /= 5f;
		return Mathf.Ceil(num);
	}

	// Token: 0x06000A22 RID: 2594 RVA: 0x000CE50C File Offset: 0x000CC70C
	public string InstrumentResistCalculation(bool forCS, float luck)
	{
		this.str.Clear();
		float num;
		this.str.Append(this.character.stats.InstrumentResistance(true, out num));
		this.SBP();
		this.str.Append("AUR/4 + SEN/5");
		if (this.musicResistMod != 0f)
		{
			this.str.Append(" + Bonuses & Ailments");
		}
		if (forCS)
		{
			this.CB();
		}
		else
		{
			if (luck > 0f)
			{
				this.CMin();
				this.str.Append(luck);
			}
			if (luck < 0f)
			{
				this.CPlus();
				this.str.Append(luck * -1f);
			}
			this.SBP();
			this.str.Append("Resist Luck");
			this.CB();
		}
		return this.str.ToString();
	}

	// Token: 0x06000A23 RID: 2595 RVA: 0x000CE5E8 File Offset: 0x000CC7E8
	public float SongDifficulty(Library.Abilities song)
	{
		return song._Difficulty;
	}

	// Token: 0x06000A24 RID: 2596 RVA: 0x000CE5F0 File Offset: 0x000CC7F0
	public float ElixirDifficulty(Library.Abilities elixir)
	{
		return elixir._Difficulty;
	}

	// Token: 0x06000A25 RID: 2597 RVA: 0x000CE5F8 File Offset: 0x000CC7F8
	public int Stuck()
	{
		if (this.character.inventoryBag && this.character.inventoryBag.weight > (float)this.CarryingWeight())
		{
			return 1;
		}
		return this.stuck;
	}

	// Token: 0x06000A26 RID: 2598 RVA: 0x000CE62D File Offset: 0x000CC82D
	public bool Overburdened()
	{
		return this.character.party && this.character.inventoryBag && this.character.inventoryBag.weight > (float)this.CarryingWeight();
	}

	// Token: 0x06000A27 RID: 2599 RVA: 0x000CE66C File Offset: 0x000CC86C
	public int Silent()
	{
		return this.silent;
	}

	// Token: 0x06000A28 RID: 2600 RVA: 0x000CE674 File Offset: 0x000CC874
	public int Confuse()
	{
		return this.confuse;
	}

	// Token: 0x06000A29 RID: 2601 RVA: 0x000CE67C File Offset: 0x000CC87C
	public int Floating()
	{
		return this.floating;
	}

	// Token: 0x06000A2A RID: 2602 RVA: 0x000CE684 File Offset: 0x000CC884
	public int Flee()
	{
		return this.flee;
	}

	// Token: 0x06000A2B RID: 2603 RVA: 0x000CE68C File Offset: 0x000CC88C
	public int AttackAllies()
	{
		return this.attackAllies;
	}

	// Token: 0x06000A2C RID: 2604 RVA: 0x000CE694 File Offset: 0x000CC894
	public float Blind()
	{
		return this.R1(this.blind);
	}

	// Token: 0x06000A2D RID: 2605 RVA: 0x000CE6A2 File Offset: 0x000CC8A2
	public float ArmorReduction()
	{
		return this.R1(this.armorReduction);
	}

	// Token: 0x06000A2E RID: 2606 RVA: 0x000CE6B0 File Offset: 0x000CC8B0
	public float EqArmorReduction()
	{
		return this.R1(this.eqArmorReduction);
	}

	// Token: 0x06000A2F RID: 2607 RVA: 0x000CE6BE File Offset: 0x000CC8BE
	public float Deaf()
	{
		return this.R1(this.deaf);
	}

	// Token: 0x06000A30 RID: 2608 RVA: 0x000CE6CC File Offset: 0x000CC8CC
	public int Invisible()
	{
		return this.invisible;
	}

	// Token: 0x06000A31 RID: 2609 RVA: 0x000CE6D4 File Offset: 0x000CC8D4
	public int Stun()
	{
		return this.stun;
	}

	// Token: 0x06000A32 RID: 2610 RVA: 0x000CE6DC File Offset: 0x000CC8DC
	public int Charming()
	{
		return this.charming;
	}

	// Token: 0x06000A33 RID: 2611 RVA: 0x000CE6E4 File Offset: 0x000CC8E4
	public int Artistry()
	{
		return this.artistry;
	}

	// Token: 0x06000A34 RID: 2612 RVA: 0x000CE6EC File Offset: 0x000CC8EC
	public int NimbleFingers()
	{
		return this.nimbleFingers;
	}

	// Token: 0x06000A35 RID: 2613 RVA: 0x000CE6F4 File Offset: 0x000CC8F4
	public float MoveSpeedMod()
	{
		return this.R1(this.moveSpeedMod);
	}

	// Token: 0x06000A36 RID: 2614 RVA: 0x000CE702 File Offset: 0x000CC902
	public float ActionSpeedMod()
	{
		return this.actionTimeMod;
	}

	// Token: 0x06000A37 RID: 2615 RVA: 0x000CE70C File Offset: 0x000CC90C
	public void SetHealth(int amt, bool sendDeathEvent)
	{
		this.currLife = amt;
		if (this.currLife > this.HealthMax())
		{
			this.currLife = this.HealthMax();
		}
		this.character.UpdateHealth();
		if (this.currLife <= 0)
		{
			this.currLife = 0;
			if (sendDeathEvent)
			{
				this.character.Dead(false, Records.x.combat, false);
			}
		}
		if (this.character.party && this.character.portrait)
		{
			this.character.portrait.SetHealthColor();
		}
		if (this.character.summoned && this.character.dockFriend)
		{
			this.character.dockFriend.UpdateHealth();
		}
	}

	// Token: 0x06000A38 RID: 2616 RVA: 0x000CE7CD File Offset: 0x000CC9CD
	public void SetMaxHealth(int amt)
	{
		this.lifeBase = amt;
	}

	// Token: 0x06000A39 RID: 2617 RVA: 0x000CE7D6 File Offset: 0x000CC9D6
	public void SetSpirit(int amt)
	{
		this.magicPoints = amt;
		if (this.magicPoints > this.SpiritMax() && this.character.party)
		{
			this.magicPoints = this.SpiritMax();
		}
	}

	// Token: 0x06000A3A RID: 2618 RVA: 0x000CE806 File Offset: 0x000CCA06
	public void SetSpiritMax(int amt)
	{
		this.magicPointsBase = amt;
	}

	// Token: 0x06000A3B RID: 2619 RVA: 0x000CE810 File Offset: 0x000CCA10
	public void AddHealth(int amt)
	{
		this.currLife += amt;
		if (this.currLife > this.HealthMax())
		{
			this.currLife = this.HealthMax();
		}
		if (this.currLife < 0)
		{
			this.currLife = 0;
		}
		if (this.character.party)
		{
			this.character.portrait.SetHealthColor();
		}
		if (this.character.summoned && this.character.dockFriend)
		{
			this.character.dockFriend.UpdateHealth();
		}
		this.character.UpdateHealth();
	}

	// Token: 0x06000A3C RID: 2620 RVA: 0x000CE8AC File Offset: 0x000CCAAC
	public void AddHealthMax(int amt)
	{
		this.maxHealthAdd += amt;
		if (this.currLife > this.HealthMax())
		{
			this.currLife = this.HealthMax();
		}
		this.character.UpdateHealth();
	}

	// Token: 0x06000A3D RID: 2621 RVA: 0x000CE8E4 File Offset: 0x000CCAE4
	public void AddSpiritFromKill(float amt)
	{
		if (this.HasSpellbook())
		{
			this.magicPoints += (int)amt;
			if (this.magicPoints > this.SpiritMax() && this.character.party)
			{
				this.magicPoints = this.SpiritMax();
			}
			if (this.magicPoints < 0)
			{
				this.magicPoints = 0;
			}
			if (this.character.portrait)
			{
				this.character.portrait.SetMagicColor();
			}
			this.UpdateAbilityTriggers();
			if (this.character.party)
			{
				GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(62);
				pooledGameObject.transform.position = this.character.body.HeadPosition(-0.5f);
				pooledGameObject.transform.SetParent(this.character.tr);
				pooledGameObject.SetActive(true);
			}
		}
	}

	// Token: 0x06000A3E RID: 2622 RVA: 0x000CE9C4 File Offset: 0x000CCBC4
	public void AddSpirit(int amt)
	{
		if (this.HasSpellbook())
		{
			this.magicPoints += amt;
			if (this.magicPoints > this.SpiritMax() && this.character.party)
			{
				this.magicPoints = this.SpiritMax();
			}
			if (this.magicPoints < 0)
			{
				this.magicPoints = 0;
			}
			if (this.character.portrait)
			{
				this.character.portrait.SetMagicColor();
			}
			this.UpdateAbilityTriggers();
			if (amt > 0 && this.character.party)
			{
				GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(62);
				pooledGameObject.transform.position = this.character.body.HeadPosition(-0.5f);
				pooledGameObject.transform.SetParent(this.character.tr);
				pooledGameObject.SetActive(true);
			}
		}
	}

	// Token: 0x06000A3F RID: 2623 RVA: 0x000CEAA8 File Offset: 0x000CCCA8
	public void AddStamina(float amt)
	{
		if (amt > 0f)
		{
			if (this.staminaRegenMod > 0f)
			{
				amt *= this.staminaRegenMod;
			}
			else if (this.staminaRegenMod < 0f)
			{
				amt /= this.staminaRegenMod * -1f;
			}
		}
		else if (this.staminaReductionMultiplier > 0f)
		{
			amt *= this.staminaReductionMultiplier;
		}
		this.stamina += amt;
		if (this.stamina > this.MaxStamina())
		{
			this.stamina = this.MaxStamina();
		}
		if (this.stamina < 0f)
		{
			this.stamina = 0f;
		}
		if (this.character.npc)
		{
			this.character.UpdateStamina();
		}
		if (this.character.party && this.character.portrait)
		{
			this.character.portrait.SetFatigue();
		}
	}

	// Token: 0x06000A40 RID: 2624 RVA: 0x000CEB93 File Offset: 0x000CCD93
	public float MaxStamina()
	{
		return this.maxStamina + this.maxStaminaAdd;
	}

	// Token: 0x06000A41 RID: 2625 RVA: 0x000CEBA2 File Offset: 0x000CCDA2
	public void AddStamimaSpeed(float amt)
	{
		this.staminaRegenMod += amt;
	}

	// Token: 0x06000A42 RID: 2626 RVA: 0x000CEBB2 File Offset: 0x000CCDB2
	public void AddStamimaReductionMultipler(float amt)
	{
		this.staminaReductionMultiplier += amt;
	}

	// Token: 0x06000A43 RID: 2627 RVA: 0x000CEBC2 File Offset: 0x000CCDC2
	public float RallySpeed()
	{
		return this.R1(this.rallyBase + this.rallySpeed);
	}

	// Token: 0x06000A44 RID: 2628 RVA: 0x000CEBD7 File Offset: 0x000CCDD7
	public void SetStamina(float amt)
	{
		this.stamina = amt;
		if (this.stamina > this.maxStamina)
		{
			this.stamina = this.maxStamina;
		}
		if (this.character.npc)
		{
			this.character.UpdateStamina();
		}
	}

	// Token: 0x06000A45 RID: 2629 RVA: 0x000CEC12 File Offset: 0x000CCE12
	public float StaminaPercent()
	{
		return this.stamina / this.maxStamina;
	}

	// Token: 0x06000A46 RID: 2630 RVA: 0x000CEC21 File Offset: 0x000CCE21
	public void AddActionTimeMod(float amt)
	{
		this.actionTimeMod += amt;
	}

	// Token: 0x06000A47 RID: 2631 RVA: 0x000CEC31 File Offset: 0x000CCE31
	public void AddMoveSpeedMod(float amt)
	{
		this.moveSpeedMod += amt;
	}

	// Token: 0x06000A48 RID: 2632 RVA: 0x000CEC41 File Offset: 0x000CCE41
	public void AddStrengthMod(float amt)
	{
		this.strengthModFlat += amt;
	}

	// Token: 0x06000A49 RID: 2633 RVA: 0x000CEC51 File Offset: 0x000CCE51
	public void AddAgilityMod(float amt)
	{
		this.agilityModFlat += amt;
	}

	// Token: 0x06000A4A RID: 2634 RVA: 0x000CEC61 File Offset: 0x000CCE61
	public void AddAuraMod(float amt)
	{
		this.auraModFlat += amt;
		this.EnchantJewelryEffects(16, true);
		this.EnchantJewelryEffects(20, true);
		this.EnchantJewelryEffects(22, true);
		this.EnchantJewelryEffects(24, true);
	}

	// Token: 0x06000A4B RID: 2635 RVA: 0x000CEC95 File Offset: 0x000CCE95
	public void AddDexterityMod(float amt)
	{
		this.dexterityModFlat += amt;
	}

	// Token: 0x06000A4C RID: 2636 RVA: 0x000CECA5 File Offset: 0x000CCEA5
	public void AddPaganMod(float amt)
	{
		this.paganModFlat += amt;
		this.EnchantJewelryEffects(16, true);
		this.EnchantJewelryEffects(20, true);
		this.EnchantJewelryEffects(22, true);
		this.EnchantJewelryEffects(24, true);
	}

	// Token: 0x06000A4D RID: 2637 RVA: 0x000CECD9 File Offset: 0x000CCED9
	public void AddSensoryMod(float amt)
	{
		this.sensoryModFlat += amt;
	}

	// Token: 0x06000A4E RID: 2638 RVA: 0x000CECE9 File Offset: 0x000CCEE9
	public void AddBalanceMod(float amt)
	{
		this.balance += amt;
	}

	// Token: 0x06000A4F RID: 2639 RVA: 0x000CECF9 File Offset: 0x000CCEF9
	public void AddSilent(int amt)
	{
		this.silent += amt;
	}

	// Token: 0x06000A50 RID: 2640 RVA: 0x000CED09 File Offset: 0x000CCF09
	public void AddConfuse(int amt)
	{
		this.confuse += amt;
	}

	// Token: 0x06000A51 RID: 2641 RVA: 0x000CED19 File Offset: 0x000CCF19
	public void AddFloating(int amt)
	{
		this.floating += amt;
	}

	// Token: 0x06000A52 RID: 2642 RVA: 0x000CED29 File Offset: 0x000CCF29
	public void AddAttackAllies(int amt)
	{
		this.attackAllies += amt;
	}

	// Token: 0x06000A53 RID: 2643 RVA: 0x000CED39 File Offset: 0x000CCF39
	public void AddReduceStun(float amt)
	{
		this.reduceStun += amt;
	}

	// Token: 0x06000A54 RID: 2644 RVA: 0x000CED49 File Offset: 0x000CCF49
	public void AddFlee(int amt)
	{
		this.flee += amt;
	}

	// Token: 0x06000A55 RID: 2645 RVA: 0x000CED59 File Offset: 0x000CCF59
	public void AddBlind(float amt)
	{
		this.blind += amt;
	}

	// Token: 0x06000A56 RID: 2646 RVA: 0x000CED69 File Offset: 0x000CCF69
	public void AddArmorReduction(float amt)
	{
		this.armorReduction += amt;
	}

	// Token: 0x06000A57 RID: 2647 RVA: 0x000CED79 File Offset: 0x000CCF79
	public void AddEqArmorReduction(float amt)
	{
		this.eqArmorReduction += amt;
	}

	// Token: 0x06000A58 RID: 2648 RVA: 0x000CED89 File Offset: 0x000CCF89
	public void AddDeaf(float amt)
	{
		this.deaf += amt;
	}

	// Token: 0x06000A59 RID: 2649 RVA: 0x000CED99 File Offset: 0x000CCF99
	public void AddInvisible(int amt)
	{
		this.invisible += amt;
	}

	// Token: 0x06000A5A RID: 2650 RVA: 0x000CEDAC File Offset: 0x000CCFAC
	public void AddStuck(int amt)
	{
		this.stuck += amt;
		if (this.stuck != 0)
		{
			if (this.character.hasActions && this.character.moving && this.character.actions)
			{
				this.character.TargetReached();
				this.character.actions.EndTurn(true);
			}
			if (this.character.portrait)
			{
				this.character.portrait.SetSynergy(0f, 0f);
				return;
			}
		}
		else if (this.character.portrait)
		{
			this.UpdateRallyCount(false, 0f);
		}
	}

	// Token: 0x06000A5B RID: 2651 RVA: 0x000CEE62 File Offset: 0x000CD062
	public void AddStun(int amt)
	{
		this.stun += amt;
	}

	// Token: 0x06000A5C RID: 2652 RVA: 0x000CEE72 File Offset: 0x000CD072
	public void SetStun(int amt)
	{
		this.stun = amt;
	}

	// Token: 0x06000A5D RID: 2653 RVA: 0x000CEE7B File Offset: 0x000CD07B
	public void AddCharming(int amt)
	{
		this.charming += amt;
	}

	// Token: 0x06000A5E RID: 2654 RVA: 0x000CEE8B File Offset: 0x000CD08B
	public void AddArtistry(int amt)
	{
		this.artistry += amt;
	}

	// Token: 0x06000A5F RID: 2655 RVA: 0x000CEE9B File Offset: 0x000CD09B
	public void AddNimbleFingers(int amt)
	{
		this.nimbleFingers += amt;
	}

	// Token: 0x06000A60 RID: 2656 RVA: 0x000CEEAB File Offset: 0x000CD0AB
	public void AddStagger(int amt)
	{
		this.stagger += amt;
	}

	// Token: 0x06000A61 RID: 2657 RVA: 0x000CEEBB File Offset: 0x000CD0BB
	public void AddLightAtks(int amt)
	{
		this.onlyLightAtks += amt;
	}

	// Token: 0x06000A62 RID: 2658 RVA: 0x000CEECB File Offset: 0x000CD0CB
	public void AddDmgMod(float amt)
	{
		this.severityModFlat += amt;
	}

	// Token: 0x06000A63 RID: 2659 RVA: 0x000CEEDB File Offset: 0x000CD0DB
	public void AddPaganDmgMod(float amt)
	{
		this.paganSeverityModFlat += amt;
	}

	// Token: 0x06000A64 RID: 2660 RVA: 0x000CEEEB File Offset: 0x000CD0EB
	public void AddHitMod(float amt)
	{
		this.hitModFlat += amt;
	}

	// Token: 0x06000A65 RID: 2661 RVA: 0x000CEEFB File Offset: 0x000CD0FB
	public void AddPaganHitMod(float amt)
	{
		this.paganHitModFlat += amt;
	}

	// Token: 0x06000A66 RID: 2662 RVA: 0x000CEF0B File Offset: 0x000CD10B
	public void AddEvadeMod(float amt)
	{
		this.evadeModFlat += amt;
	}

	// Token: 0x06000A67 RID: 2663 RVA: 0x000CEF1B File Offset: 0x000CD11B
	public void AddBlockMod(float amt)
	{
		this.blockModFlat += amt;
	}

	// Token: 0x06000A68 RID: 2664 RVA: 0x000CEF2B File Offset: 0x000CD12B
	public void AddRallySpeed(float amt)
	{
		this.rallySpeed += amt;
	}

	// Token: 0x06000A69 RID: 2665 RVA: 0x000CEF3B File Offset: 0x000CD13B
	public void AddSpiritAbsorption(float amt)
	{
		this.spiritAbsorption += amt;
	}

	// Token: 0x06000A6A RID: 2666 RVA: 0x000CEF4B File Offset: 0x000CD14B
	public void ReduceAllSkills(float amt)
	{
		this.allSkillAdd += amt;
	}

	// Token: 0x06000A6B RID: 2667 RVA: 0x000CEF5B File Offset: 0x000CD15B
	public void AddMusicResist(float amt)
	{
		this.musicResistMod += amt;
	}

	// Token: 0x06000A6C RID: 2668 RVA: 0x000CEF6C File Offset: 0x000CD16C
	public void AddPaganResist(float amt, string type)
	{
		if (type == "Fauna")
		{
			this.paganResist.y = this.paganResist.y + amt;
			return;
		}
		if (type == "Vines")
		{
			this.paganResist.x = this.paganResist.x + amt;
			return;
		}
		if (type == "Spores")
		{
			this.paganResist.z = this.paganResist.z + amt;
		}
	}

	// Token: 0x06000A6D RID: 2669 RVA: 0x000CEFD2 File Offset: 0x000CD1D2
	public void SetCompanionControl(string variableName, bool state, int num)
	{
		if (variableName == "Magic Tactics")
		{
			this.magicTactics = num;
		}
		if (variableName == "Use AI")
		{
			this.companionAI = num;
		}
	}

	// Token: 0x06000A6E RID: 2670 RVA: 0x000CEFFC File Offset: 0x000CD1FC
	public void DoHitAI(Character target)
	{
		if (this.xmlName == "GoldShroomer" && this.character.actions && target.node != null && !target.summoned)
		{
			this.character.actions.SpellFromTrigger("MushroomWall", "Wall", target);
		}
	}

	// Token: 0x06000A6F RID: 2671 RVA: 0x000CF058 File Offset: 0x000CD258
	public void LoadFromDB()
	{
		this.displayName = this.characterRow._DisplayName;
		this.currLife = this.characterRow._Life;
		this.lifeBase = this.currLife;
		this.sex = this.characterRow._Sex;
		this.race = this.characterRow._Race;
		this.character.radius = (float)this.characterRow._Radius;
		this.moveSpeed = this.characterRow._MoveSpeed;
		this.summonSpeed = this.characterRow._SummonSpeed;
		this.character.characterHeight = this.characterRow._Height - 0.5f;
		this.soundID = this.characterRow._SoundID;
		this.character.combatLevel = this.characterRow._CombatLevel;
		this.dialogueFile = this.characterRow._DialogueFile;
		this.initiateDialogue = this.characterRow._InitiateDialogue;
		this.strength = (float)this.characterRow._Strength;
		this.agility = (float)this.characterRow._Agility;
		this.aura = (float)this.characterRow._Aura;
		this.dexterity = (float)this.characterRow._Dexterity;
		this.pagan = (float)this.characterRow._Pagan;
		this.sensory = (float)this.characterRow._Sensory;
		this.weightBase = this.characterRow._Weight;
		this.sightRadiusBase = this.characterRow._Sight;
		this.hearingRadiusBase = this.characterRow._Hearing;
		this.flying = this.characterRow._Flying;
		this.maxStamina = this.characterRow._Stamina;
		this.stamina = this.maxStamina;
		this.model = this.characterRow._Model;
		this.headModel = this.characterRow._ModelHead;
		this.magicPointsBase = this.characterRow._MaxMP;
		if (this.magicPointsBase > 0)
		{
			this.canCastSpells = true;
		}
		else
		{
			this.canCastSpells = false;
		}
		this.formationGroup = this.characterRow._Formation;
		this.skinTexture = this.characterRow._SkinTexture;
		this.hairTexture = this.characterRow._HairTexture;
		if (this.characterRow._CustomAI != "")
		{
			this.hasCustomAI = true;
			this.customAI = this.characterRow._CustomAI;
		}
		if (this.characterRow._EveryAttackAI != "")
		{
			this.everyAttackAI = this.characterRow._EveryAttackAI;
			this.hasEveryAttackAI = true;
		}
		if (this.characterRow._NonCombatAI != "")
		{
			this.hasNonCombatAI = true;
			this.nonCombatAI = this.characterRow._NonCombatAI;
		}
		this.canJumpEvade = this.characterRow._CanJumpEvade;
		this.canAggressionGroup = this.characterRow._CanAggressionGroup;
		this.canSecretGroup = this.characterRow._CanSecretGroup;
		this.canRecoverGroup = this.characterRow._CanRecoverGroup;
		this.needsDefending = this.characterRow._NeedsDefending;
		this.hasCircleAnims = this.characterRow._HasGroupAnims;
		this.hasEnemies = this.characterRow._HasEnemies;
		if (this.character.ghost)
		{
			this.hasEnemies = true;
		}
		else
		{
			this.SetAllegiance();
		}
		this.canJump = this.characterRow._CanJump;
		if (this.race == "Yeti" || this.race == "Ameythevian" || this.race == "Bloodless Hunter" || this.race == "Taratorith" || this.race == "Lachovinian" || this.race == "Pasaaren" || this.race == "Varuchov" || this.race == "Ghost" || this.race == "Dryad" || this.race == "Dolki")
		{
			this.animal = false;
			this.canCharge = true;
			if (!(this.race == "Dryad") && !(this.characterRow._AnimationPrefix == "_GhostC") && !(this.characterRow._AnimationPrefix == "_ChildPaduri"))
			{
				this.canPin = true;
			}
			if ((float)this.magicPointsBase == 111111f || (float)this.magicPointsBase == 222222f)
			{
				this.semizenMagic = true;
			}
		}
		else
		{
			this.animal = true;
			if ((float)this.magicPointsBase == 111111f || (float)this.magicPointsBase == 222222f)
			{
				this.semizenMagic = true;
			}
		}
		this.savedBag.Clear();
		this.savedDur.Clear();
		this.hasBuffItem = false;
		this.savedIntercesion = -1;
		List<int> items = this.characterRow._Items;
		if (!this.character.ghost)
		{
			for (int i = 0; i < items.Count; i++)
			{
				if (i % 3 == 0)
				{
					this.savedBag.Add(items[i]);
					Library.Inventory invRow = Links.x.library.GetInvRow(items[i]);
					if (invRow._Tag == "Consumable" && this.character.npc && (invRow._Effect.Contains("Spirit") || invRow._Effect.Contains("Stamina")))
					{
						this.hasBuffItem = true;
					}
					if (this.character.npc && !this.animal && invRow._Name == "RainGodEarring")
					{
						this.savedIntercessionA = new Vector3(48f, 1f, 0f);
						this.savedIntercessionB = new Vector3(0f, 0f, 1f);
						this.savedIntercesion = invRow._ID;
					}
				}
				else
				{
					if (i % 3 == 1)
					{
						this.savedBag.Add(items[i]);
					}
					if (i % 3 == 2)
					{
						float num = (float)items[i];
						if (i == 29 && this.character.npc)
						{
							num /= 2f;
						}
						this.savedDur.Add(new Vector4(num, 0f, 0f, 0f));
					}
				}
			}
		}
		this.hasWordsOfPower = false;
		List<int> skillLvl = this.characterRow._SkillLvl;
		for (int j = 0; j < skillLvl.Count; j++)
		{
			this.skillsProgress.Add(0f);
			this.skills.Add((float)skillLvl[j]);
			if (this.character.npc && (j == 30 || j == 31 || j == 32))
			{
				this.hasWordsOfPower = true;
			}
		}
		if (!this.character.npc && this.characterRow._Knowledge != "")
		{
			this.knowledge.Clear();
			new string[0];
			char c = ',';
			string[] array = this.characterRow._Knowledge.Split(c, StringSplitOptions.None);
			int num2 = 0;
			foreach (string text in array)
			{
				if (text != "" && num2 % 2 == 0)
				{
					this.knowledge.Add(text);
				}
			}
		}
		this.SetVoiceID(true);
		this.magicTactics = 3;
		this.abilities = this.characterRow._Abilities;
		this.abilityLevelsTemp = this.characterRow._AbilitiesLevels;
		this.spellNamesTemp = this.characterRow._AbilitiesNames;
		this.abilityCostTemp = null;
		this.SetupAbilities(true);
		this.UpdateStats();
		if (this.character.party)
		{
			this.FormationTactics();
		}
		if (this.xmlName.Contains("Fish"))
		{
			this.isFishMonster = true;
		}
		if (!this.animal && (this.xmlName.Contains("Farmer") || this.xmlName.Contains("Dancer")))
		{
			this.hasCustomIdle = true;
			if (this.character.animator)
			{
				this.character.animator.SetFloat("Idle Variation", 1f);
			}
		}
		if (this.xmlName.Contains("Merchant") || this.xmlName.Contains("StoreGuard"))
		{
			this.merchant = true;
		}
		if (this.xmlName.Contains("Boro"))
		{
			this.boro = true;
			if (!Records.x.BoroInParty())
			{
				this.dialogueFile = "";
				this.canTalk = false;
			}
		}
	}

	// Token: 0x06000A70 RID: 2672 RVA: 0x000CF920 File Offset: 0x000CDB20
	public void SetVoiceID(bool fromDB)
	{
		float num = this.characterRow._Sex;
		if (!fromDB)
		{
			num = this.sex;
		}
		string text = this.characterRow._Race;
		if (!fromDB)
		{
			text = this.race;
		}
		if (this.characterRow._VoiceID == 0)
		{
			if (num < 0.5f)
			{
				if (text == "Taratorith")
				{
					this.voiceID = 0;
				}
				else if (text == "Pasaaren")
				{
					this.voiceID = 1;
				}
				else if (text == "Varuchov")
				{
					this.voiceID = 2;
				}
				else if (text == "Ameythevian")
				{
					this.voiceID = 3;
				}
				else if (text == "Yeti")
				{
					this.voiceID = 4;
				}
				else
				{
					this.voiceID = 0;
				}
				if (this.characterRow._Height < 3f)
				{
					this.voiceID = 9;
					return;
				}
			}
			else
			{
				if (text == "Taratorith")
				{
					this.voiceID = 5;
				}
				else if (text == "Pasaaren")
				{
					this.voiceID = 6;
				}
				else if (text == "Varuchov")
				{
					this.voiceID = 7;
				}
				else if (text == "Ameythevian")
				{
					this.voiceID = 8;
				}
				else if (text == "Yeti")
				{
					this.voiceID = 4;
				}
				else
				{
					this.voiceID = 5;
				}
				if (this.characterRow._Height < 3f)
				{
					this.voiceID = 10;
				}
			}
		}
	}

	// Token: 0x06000A71 RID: 2673 RVA: 0x000CFA98 File Offset: 0x000CDC98
	public void SetAllegiance()
	{
		this.allegiance = this.characterRow._Allegiance;
		if (this.allegiance == 1U || this.allegiance == 10U || this.allegiance == 11U)
		{
			this.isGuard = true;
		}
		if (this.allegiance == 1U || this.allegiance == 10U)
		{
			this.isHouseGuard = true;
		}
		if (this.allegiance == 1U)
		{
			this.isLazureGuard = true;
		}
		this.enemies = this.characterRow._Enemies;
		for (int i = 0; i < this.enemies.Count; i++)
		{
			if (i == 0)
			{
				this.enemy1 = this.enemies[i];
			}
			if (i == 1)
			{
				this.enemy2 = this.enemies[i];
			}
			if (i == 2)
			{
				this.enemy3 = this.enemies[i];
			}
			if (i == 3)
			{
				this.enemy4 = this.enemies[i];
			}
			if (i == 4)
			{
				this.enemy5 = this.enemies[i];
			}
			if (i == 5)
			{
				this.enemy6 = this.enemies[i];
			}
			if (i == 6)
			{
				this.enemy7 = this.enemies[i];
			}
			if (i == 7)
			{
				this.enemy8 = this.enemies[i];
			}
			if (i == 8)
			{
				this.enemy9 = this.enemies[i];
			}
			if (i > 8)
			{
				Debug.Log("Not enough faction enemy slots! " + this.characterRow._Name + " " + this.allegiance.ToString());
			}
		}
	}

	// Token: 0x06000A72 RID: 2674 RVA: 0x000CFC24 File Offset: 0x000CDE24
	public void SetResurrectionFactions()
	{
		this.allegiance = 8U;
		this.enemy1 = 1U;
		this.enemy2 = 5U;
		this.enemy3 = 6U;
		this.enemy4 = 7U;
		this.enemy5 = 10U;
		this.enemy6 = 11U;
	}

	// Token: 0x06000A73 RID: 2675 RVA: 0x000CFC5C File Offset: 0x000CDE5C
	public void SetSummonAllegiance()
	{
		this.allegiance = 0U;
		this.enemy1 = 100U;
		this.enemy2 = 100U;
		this.enemy3 = 100U;
		this.enemy4 = 100U;
		this.enemy5 = 100U;
		this.enemy6 = 100U;
		this.enemy7 = 100U;
		this.enemy8 = 100U;
		this.enemy9 = 100U;
	}

	// Token: 0x06000A74 RID: 2676 RVA: 0x000CFCB8 File Offset: 0x000CDEB8
	public void SetHostageAllegiance(bool afterRescue)
	{
		if (!afterRescue)
		{
			this.isGuard = false;
			this.isHouseGuard = false;
			this.isLazureGuard = false;
			this.allegiance = 0U;
			this.enemy1 = 100U;
			this.enemy2 = 100U;
			this.enemy3 = 100U;
			this.enemy4 = 100U;
			this.enemy5 = 100U;
			this.enemy6 = 100U;
			this.enemy7 = 100U;
			this.enemy8 = 100U;
			this.enemy9 = 100U;
			return;
		}
		this.SetAllegiance();
	}

	// Token: 0x06000A75 RID: 2677 RVA: 0x000CFD33 File Offset: 0x000CDF33
	public void Talk()
	{
		if ((this.dialogueFile != "" && this.initiateDialogue >= 1 && this.initiateDialogue < 10) || this.initiateDialogue >= 11)
		{
			this.canTalk = true;
		}
	}

	// Token: 0x06000A76 RID: 2678 RVA: 0x000CFD6C File Offset: 0x000CDF6C
	public void ClearAllAbilities()
	{
		int count = this.abilities.Count;
		for (int i = 0; i < count; i++)
		{
			Debug.Log("clearing " + this.abilities[i]);
		}
		this.abilityNames.Clear();
		this.abilityLevels.Clear();
		this.uniqueNames.Clear();
		this.abilityCost.Clear();
		this.abilityRows.Clear();
		this.abilityTriggers.Clear();
		this.abilityTriggerCount.Clear();
		this.abilityReady.Clear();
		this.abilityEquipped.Clear();
		this.abilities = new List<string>();
		this.abilityLevelsTemp = new List<Vector4>();
		this.spellNamesTemp = new List<string>();
	}

	// Token: 0x06000A77 RID: 2679 RVA: 0x000CFE30 File Offset: 0x000CE030
	public void SetupAbilities(bool fromDB)
	{
		this.abilityNames.Clear();
		this.abilityLevels.Clear();
		this.uniqueNames.Clear();
		this.abilityCost.Clear();
		bool flag = false;
		if (!fromDB && this.abilityCostTemp == null)
		{
			flag = true;
		}
		for (int i = 0; i < this.abilities.Count; i++)
		{
			this.abilityNames.Add(this.abilities[i]);
			this.abilityLevels.Add(this.abilityLevelsTemp[i]);
			this.uniqueNames.Add(this.spellNamesTemp[i]);
			if (fromDB || flag)
			{
				this.abilityCost.Add(new Vector2((float)((int)this.abilityLevelsTemp[i].w), 0f));
			}
			else
			{
				this.abilityCost.Add(this.abilityCostTemp[i]);
			}
		}
		this.abilityRows.Clear();
		this.abilityTriggers.Clear();
		this.abilityTriggerCount.Clear();
		this.abilityReady.Clear();
		this.abilityEquipped.Clear();
		bool flag2 = false;
		if (Records.x.editor && Records.x.useTestCharacters && !this.character.npc && this.equippedSongList.Count == 0)
		{
			flag2 = true;
		}
		int count = this.abilities.Count;
		for (int j = 0; j < count; j++)
		{
			Library.Abilities abilityRow = Links.x.library.GetAbilityRow(this.abilityNames[j]);
			string trigger = abilityRow._Trigger;
			this.abilityRows.Add(abilityRow);
			if (abilityRow._IsSpell)
			{
				this.abilityTriggers.Add("Spell");
				this.abilityTriggerCount.Add(1);
				this.abilityReady.Add(true);
				this.abilityEquipped.Add(0);
				if (!this.character.npc)
				{
					this.canCastSpells = true;
				}
			}
			else
			{
				this.abilityTriggers.Add(trigger);
				this.abilityTriggerCount.Add(0);
				this.abilityReady.Add(true);
				if (this.equippedSongList.Contains(this.uniqueNames[j]))
				{
					this.abilityEquipped.Add(1);
				}
				else
				{
					string text = this.uniqueNames[j];
					bool flag3 = false;
					if (this.songPoints > 0 && (this.character.npc || flag2) && (abilityRow._SongCost <= this.songPoints || this.character.npc))
					{
						this.equippedSongList.Add(text);
						flag3 = true;
						this.songPoints -= abilityRow._SongCost;
					}
					if (flag3)
					{
						this.abilityEquipped.Add(1);
					}
					else
					{
						this.abilityEquipped.Add(0);
					}
				}
			}
		}
		if (!fromDB && !flag2)
		{
			string[] array = new string[0];
			char c = ',';
			array = this.equippedAbilities.Split(c, StringSplitOptions.None);
			this.equippedSongList.Clear();
			foreach (string text2 in array)
			{
				if (text2 != "")
				{
					this.equippedSongList.Add(text2);
				}
			}
			for (int l = 0; l < this.abilityEquipped.Count; l++)
			{
				this.abilityEquipped[l] = 0;
			}
			for (int m = 0; m < this.equippedSongList.Count; m++)
			{
				int num = this.uniqueNames.IndexOf(this.equippedSongList[m]);
				this.songPoints -= this.abilityRows[num]._SongCost;
				this.abilityEquipped[num] = 1;
			}
			string[] array3 = new string[0];
			array3 = this.equippedCounts.Split(c, StringSplitOptions.None);
			int num2 = 0;
			foreach (string text3 in array)
			{
				int num3 = this.uniqueNames.IndexOf(text3);
				if (text3 != "" && text3 != null && num3 != -1)
				{
					if (array3[num2] != "0")
					{
						this.abilityTriggerCount[num3] = int.Parse(array3[num2]);
					}
					else
					{
						this.abilityTriggerCount[num3] = 0;
					}
				}
				num2++;
			}
			this.UpdateAbilityTriggers();
		}
		if (this.character.portrait)
		{
			this.character.portrait.skillBag.SetTrinketGrid(true);
			this.character.portrait.skillBag.SetSongGrid();
		}
	}

	// Token: 0x06000A78 RID: 2680 RVA: 0x000D02E8 File Offset: 0x000CE4E8
	public bool HasTokenInSkill(string n, bool majorOnly, bool minorOnly)
	{
		if (this.majorSkill1 == null)
		{
			return false;
		}
		if (majorOnly)
		{
			return this.majorSkill1.Contains(n) || this.majorSkill2.Contains(n);
		}
		if (minorOnly)
		{
			return this.minorSkill3.Contains(n);
		}
		return this.majorSkill1.Contains(n) || this.majorSkill2.Contains(n) || this.minorSkill3.Contains(n);
	}

	// Token: 0x06000A79 RID: 2681 RVA: 0x000D036A File Offset: 0x000CE56A
	public bool HasPaganToken()
	{
		return this.GetSkill(17) >= 50f || this.GetSkill(18) >= 50f || this.GetSkill(19) >= 50f;
	}

	// Token: 0x06000A7A RID: 2682 RVA: 0x000D03A0 File Offset: 0x000CE5A0
	public void SetStartingFormation(out int choice1, out int choice2)
	{
		choice1 = 0;
		choice2 = 0;
		bool flag = false;
		bool flag2 = false;
		bool flag3 = false;
		bool flag4 = false;
		bool flag5 = false;
		if (this.HasTokenInSkill("ShortSword", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("LongSword", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Scepter", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Ax", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Pole", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Bow", true, false))
		{
			flag = true;
		}
		if (this.HasTokenInSkill("Multi-Hand", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Sling", true, false))
		{
			flag = true;
		}
		if (this.HasTokenInSkill("Elixir", true, false))
		{
			flag = true;
		}
		if (this.HasTokenInSkill("Hand-to-Hand", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("LargeShield", false, false))
		{
			flag5 = true;
		}
		if (this.HasTokenInSkill("SmallShield", false, false))
		{
			flag5 = true;
		}
		if (this.HasTokenInSkill("Whip", true, false))
		{
			flag2 = true;
		}
		if (this.HasTokenInSkill("Stonewood", false, false))
		{
			flag5 = true;
		}
		if (this.HasTokenInSkill("Crimscale", false, false))
		{
			flag5 = true;
		}
		if (this.HasTokenInSkill("Pearl", false, false))
		{
			flag5 = true;
		}
		if (this.HasTokenInSkill("ShortSword", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("LongSword", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Scepter", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Ax", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Pole", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Bow", false, true))
		{
			flag4 = true;
		}
		if (this.HasTokenInSkill("Multi-Hand", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Sling", false, true))
		{
			flag4 = true;
		}
		if (this.HasTokenInSkill("Elixir", false, true))
		{
			flag4 = true;
		}
		if (this.HasTokenInSkill("Hand-to-Hand", false, true))
		{
			flag3 = true;
		}
		if (this.HasTokenInSkill("Whip", false, true))
		{
			flag3 = true;
		}
		if (!flag2 && !flag3 && !flag && !flag4)
		{
			choice1 = 8;
			choice2 = 5;
			return;
		}
		if (flag2 && !flag)
		{
			if (flag4)
			{
				int num;
				int num2;
				if (flag5 || this.Stat("Strength", false, out num) > 30f || this.Stat("Dexterity", false, out num2) > 30f)
				{
					choice1 = 2;
					choice2 = 5;
					if (this.partyID == 2)
					{
						choice1 = 3;
						choice2 = 6;
					}
					if (this.partyID == 3)
					{
						choice1 = 1;
						choice2 = 4;
					}
				}
				else
				{
					choice1 = 5;
					choice2 = 2;
				}
			}
			else if (flag5)
			{
				choice1 = 2;
				choice2 = 5;
				if (this.partyID == 2)
				{
					choice1 = 3;
					choice2 = 6;
				}
				if (this.partyID == 3)
				{
					choice1 = 1;
					choice2 = 4;
				}
			}
			else
			{
				choice1 = 5;
				choice2 = 2;
				if (this.partyID == 2)
				{
					choice1 = 3;
					choice2 = 6;
				}
				if (this.partyID == 3)
				{
					choice1 = 1;
					choice2 = 4;
				}
			}
		}
		if (!flag2 && flag)
		{
			if (flag3)
			{
				choice1 = 5;
				choice2 = 8;
				if (this.partyID == 2)
				{
					choice1 = 6;
					choice2 = 9;
				}
				if (this.partyID == 3)
				{
					choice1 = 4;
					choice2 = 7;
				}
			}
			else
			{
				choice1 = 8;
				choice2 = 7;
				if (this.partyID == 2)
				{
					choice1 = 9;
					choice2 = 9;
				}
				if (this.partyID == 3)
				{
					choice1 = 7;
					choice2 = 7;
				}
			}
		}
		if (flag2 && flag)
		{
			bool flag6 = false;
			int num3;
			int num4;
			if (this.Stat("Strength", false, out num3) > 30f || this.Stat("Dexterity", false, out num4) > 30f)
			{
				flag6 = true;
			}
			if (flag5 || this.Stat("Strength", false, out num3) > 30f || this.Stat("Dexterity", false, out num4) > 30f)
			{
				choice1 = 2;
				choice2 = 5;
			}
			else
			{
				choice1 = 5;
				if (flag6)
				{
					choice2 = 2;
				}
				else
				{
					choice2 = 8;
				}
			}
		}
		if (choice1 == 0)
		{
			choice1 = 8;
			choice2 = 5;
		}
	}

	// Token: 0x06000A7B RID: 2683 RVA: 0x000D0738 File Offset: 0x000CE938
	public void SetStartingWeapons()
	{
		string text = "";
		string text2 = "";
		string text3 = "";
		string text4 = "";
		string text5 = "";
		string text6 = "";
		string text7 = "";
		string text8 = "";
		string text9 = "";
		string text10 = "";
		string text11 = "";
		string text12 = "";
		int num = 1;
		int num2 = 1;
		int num3 = 1;
		int num4 = 1;
		int num5 = 1;
		int num6 = 1;
		int num7 = 1;
		int num8 = 1;
		string text13 = "";
		string text14 = "";
		string text15 = "";
		string text16 = "";
		string text17 = "";
		int num9 = 1;
		int num10 = 1;
		int num11 = 1;
		int num12 = 1;
		int num13 = 1;
		string text18 = "";
		string text19 = "";
		bool flag = false;
		bool flag2 = true;
		bool flag3 = false;
		bool flag4 = false;
		for (int i = 0; i < 4; i++)
		{
			string text20 = "Flute";
			string text21 = "FluteUsed";
			if (i == 1)
			{
				text20 = "Horn";
				text21 = "HornUsed";
			}
			if (i == 2)
			{
				text20 = "Drum";
				text21 = "DrumUsed";
			}
			if (i == 3)
			{
				text20 = "Pipe";
				text21 = "PipeUsed";
			}
			if (this.HasTokenInSkill(text20, false, false))
			{
				if (text3 == "")
				{
					text3 = text21;
				}
				else if (text7 == "")
				{
					text7 = text21;
				}
				else if (text8 == "")
				{
					text8 = text21;
				}
				else if (text9 == "")
				{
					text9 = text21;
				}
				else if (text10 == "")
				{
					text10 = text21;
				}
				else if (text11 == "")
				{
					text11 = text21;
				}
				else if (text13 == "")
				{
					text13 = text21;
				}
				else if (text14 == "")
				{
					text14 = text21;
				}
				else if (text15 == "")
				{
					text15 = text21;
				}
				else if (text16 == "")
				{
					text16 = text21;
				}
				else if (text17 == "")
				{
					text17 = text21;
				}
				if (!flag3)
				{
					global::Item item;
					ItemEquipped itemEquipped;
					Links.x.inventory.AddFromGround(null, null, 0, false, 0f, Links.x.library.GetInvRowID("Songbook"), 1, new Vector3((float)this.partyID, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector4(0f, 0f, 0f, 0f), this.character, false, false, out item, out itemEquipped);
					flag3 = true;
				}
			}
			if (flag)
			{
				Debug.Log(string.Concat(new string[] { text3, " ", text7, " ", text8, " ", text9, " ", text10 }));
			}
		}
		if ((this.HasTokenInSkill("Fauna", false, false) || this.HasTokenInSkill("Vines", false, false) || this.HasTokenInSkill("Spores", false, false)) && !flag4)
		{
			global::Item item2;
			ItemEquipped itemEquipped2;
			Links.x.inventory.AddFromGround(null, null, 0, false, 0f, Links.x.library.GetInvRowID("Spellbook"), 1, new Vector3((float)this.partyID, 0f, 0f), new Vector3(0f, 0f, 0f), new Vector4(0f, 0f, 0f, 0f), this.character, false, false, out item2, out itemEquipped2);
			this.AddSpirit(30);
			string text22 = "GemAmeythystGood";
			if (text7 == "")
			{
				text7 = text22;
			}
			else if (text8 == "")
			{
				text8 = text22;
			}
			else if (text9 == "")
			{
				text9 = text22;
			}
			else if (text10 == "")
			{
				text10 = text22;
			}
			else if (text11 == "")
			{
				text11 = text22;
			}
			else if (text13 == "")
			{
				text13 = text22;
			}
			else if (text14 == "")
			{
				text14 = text22;
			}
			else if (text15 == "")
			{
				text15 = text22;
			}
			else if (text16 == "")
			{
				text16 = text22;
			}
			else if (text17 == "")
			{
				text17 = text22;
			}
			text22 = "GemCitrinePoor";
			if (text7 == "")
			{
				text7 = text22;
			}
			else if (text8 == "")
			{
				text8 = text22;
			}
			else if (text9 == "")
			{
				text9 = text22;
			}
			else if (text10 == "")
			{
				text10 = text22;
			}
			else if (text11 == "")
			{
				text11 = text22;
			}
			else if (text13 == "")
			{
				text13 = text22;
			}
			else if (text14 == "")
			{
				text14 = text22;
			}
			else if (text15 == "")
			{
				text15 = text22;
			}
			else if (text16 == "")
			{
				text16 = text22;
			}
			else if (text17 == "")
			{
				text17 = text22;
			}
			text22 = "GemMortarPestle";
			if (text7 == "")
			{
				text7 = text22;
			}
			else if (text8 == "")
			{
				text8 = text22;
			}
			else if (text9 == "")
			{
				text9 = text22;
			}
			else if (text10 == "")
			{
				text10 = text22;
			}
			else if (text11 == "")
			{
				text11 = text22;
			}
			else if (text13 == "")
			{
				text13 = text22;
			}
			else if (text14 == "")
			{
				text14 = text22;
			}
			else if (text15 == "")
			{
				text15 = text22;
			}
			else if (text16 == "")
			{
				text16 = text22;
			}
			else if (text17 == "")
			{
				text17 = text22;
			}
			text22 = "FoodSpiritOk";
			if (text3 == "")
			{
				text3 = text22;
			}
			else if (text18 == "")
			{
				text18 = text22;
			}
			else if (text19 == "")
			{
				text19 = text22;
			}
			else if (text7 == "")
			{
				text7 = text22;
			}
			else if (text8 == "")
			{
				text8 = text22;
			}
			else if (text9 == "")
			{
				text9 = text22;
			}
			else if (text10 == "")
			{
				text10 = text22;
			}
			else if (text11 == "")
			{
				text11 = text22;
			}
			else if (text13 == "")
			{
				text13 = text22;
			}
			else if (text14 == "")
			{
				text14 = text22;
			}
			else if (text15 == "")
			{
				text15 = text22;
			}
			else if (text16 == "")
			{
				text16 = text22;
			}
			else if (text17 == "")
			{
				text17 = text22;
			}
		}
		if (this.HasTokenInSkill("Fish", false, false) || this.HasTokenInSkill("Forest", false, false) || this.HasTokenInSkill("Shroom", false, false))
		{
			string text23 = "Rosary";
			if (text3 == "")
			{
				text3 = text23;
				num = 10;
			}
			else if (text18 == "")
			{
				text18 = text23;
				num2 = 10;
			}
			else if (text19 == "")
			{
				text19 = text23;
				num3 = 10;
			}
			else if (text7 == "")
			{
				text7 = text23;
				num4 = 10;
			}
			else if (text8 == "")
			{
				text8 = text23;
				num5 = 10;
			}
			else if (text9 == "")
			{
				text9 = text23;
				num6 = 10;
			}
			else if (text10 == "")
			{
				text10 = text23;
				num7 = 10;
			}
			else if (text11 == "")
			{
				text11 = text23;
				num8 = 10;
			}
			else if (text13 == "")
			{
				text13 = text23;
				num9 = 10;
			}
			else if (text14 == "")
			{
				text14 = text23;
				num10 = 10;
			}
			else if (text15 == "")
			{
				text15 = text23;
				num11 = 10;
			}
			else if (text16 == "")
			{
				text16 = text23;
				num12 = 10;
			}
			else if (text17 == "")
			{
				text17 = text23;
				num13 = 10;
			}
		}
		for (int j = 0; j < 9; j++)
		{
			bool flag5 = true;
			string text24 = "ShortSword";
			string text25 = "SwordBasic";
			if (j == 1)
			{
				text24 = "LongSword";
				text25 = "GreatSwordBasic";
				flag5 = false;
			}
			if (j == 2)
			{
				text24 = "Scepter";
				if (this.race == "Yeti")
				{
					text25 = "ScepterBasic";
					flag5 = false;
				}
				else
				{
					text25 = "SceptorLightBasic";
				}
			}
			if (j == 3)
			{
				text24 = "Ax";
				text25 = "AxBasic";
			}
			if (j == 4)
			{
				text24 = "Pole";
				text25 = "SpearBasic";
				flag5 = false;
			}
			if (j == 5)
			{
				text24 = "Bow";
				text25 = "BowBasic";
				flag5 = false;
			}
			if (j == 6)
			{
				text24 = "Sling";
				text25 = "BlowgunBasic";
				flag5 = false;
			}
			if (j == 7)
			{
				text24 = "Elixir";
				text25 = "ElixirsBasic";
				flag5 = false;
			}
			if (j == 8)
			{
				text24 = "Whip";
				text25 = "WhipBasic";
			}
			if (this.HasTokenInSkill(text24, false, false))
			{
				if (text == "")
				{
					text = text25;
					flag2 = flag5;
				}
				else if (text12 == "")
				{
					text12 = text25;
				}
				else if (text7 == "")
				{
					text7 = text25;
				}
				else if (text8 == "")
				{
					text8 = text25;
				}
				else if (text9 == "")
				{
					text9 = text25;
				}
				else if (text10 == "")
				{
					text10 = text25;
				}
				else if (text11 == "")
				{
					text11 = text25;
				}
				else if (text13 == "")
				{
					text13 = text25;
				}
				else if (text14 == "")
				{
					text14 = text25;
				}
				else if (text15 == "")
				{
					text15 = text25;
				}
				else if (text16 == "")
				{
					text16 = text25;
				}
				else if (text17 == "")
				{
					text17 = text25;
				}
				if (text24 == "Bow")
				{
					text25 = "Arrow";
					if (text4 == "")
					{
						text4 = text25;
					}
					else if (text5 == "")
					{
						text5 = text25;
					}
					else if (text6 == "")
					{
						text6 = text25;
					}
					else if (text7 == "")
					{
						text7 = text25;
					}
					else if (text8 == "")
					{
						text8 = text25;
					}
					else if (text9 == "")
					{
						text9 = text25;
					}
					else if (text10 == "")
					{
						text10 = text25;
					}
					else if (text11 == "")
					{
						text11 = text25;
					}
					else if (text13 == "")
					{
						text13 = text25;
					}
					else if (text14 == "")
					{
						text14 = text25;
					}
					else if (text15 == "")
					{
						text15 = text25;
					}
					else if (text16 == "")
					{
						text16 = text25;
					}
					else if (text17 == "")
					{
						text17 = text25;
					}
					text25 = "Stick";
					if (text7 == "")
					{
						text7 = text25;
						num4 = 25;
					}
					else if (text8 == "")
					{
						text8 = text25;
						num5 = 25;
					}
					else if (text9 == "")
					{
						text9 = text25;
						num6 = 25;
					}
					else if (text10 == "")
					{
						text10 = text25;
						num7 = 25;
					}
					else if (text11 == "")
					{
						text11 = text25;
						num8 = 25;
					}
					else if (text13 == "")
					{
						text13 = text25;
						num9 = 25;
					}
					else if (text14 == "")
					{
						text14 = text25;
						num10 = 25;
					}
					else if (text15 == "")
					{
						text15 = text25;
						num11 = 25;
					}
					else if (text16 == "")
					{
						text16 = text25;
						num12 = 25;
					}
					else if (text17 == "")
					{
						text17 = text25;
						num13 = 25;
					}
				}
				if (text24 == "Sling")
				{
					text25 = "Dart";
					if (text4 == "")
					{
						text4 = text25;
					}
					else if (text5 == "")
					{
						text5 = text25;
					}
					else if (text6 == "")
					{
						text6 = text25;
					}
					else if (text7 == "")
					{
						text7 = text25;
					}
					else if (text8 == "")
					{
						text8 = text25;
					}
					else if (text9 == "")
					{
						text9 = text25;
					}
					else if (text10 == "")
					{
						text10 = text25;
					}
					else if (text11 == "")
					{
						text11 = text25;
					}
					else if (text13 == "")
					{
						text13 = text25;
					}
					else if (text14 == "")
					{
						text14 = text25;
					}
					else if (text15 == "")
					{
						text15 = text25;
					}
					else if (text16 == "")
					{
						text16 = text25;
					}
					else if (text17 == "")
					{
						text17 = text25;
					}
					text25 = "HollowStick";
					if (text7 == "")
					{
						text7 = text25;
						num4 = 25;
					}
					else if (text8 == "")
					{
						text8 = text25;
						num5 = 25;
					}
					else if (text9 == "")
					{
						text9 = text25;
						num6 = 25;
					}
					else if (text10 == "")
					{
						text10 = text25;
						num7 = 25;
					}
					else if (text11 == "")
					{
						text11 = text25;
						num8 = 25;
					}
					else if (text13 == "")
					{
						text13 = text25;
						num9 = 25;
					}
					else if (text14 == "")
					{
						text14 = text25;
						num10 = 25;
					}
					else if (text15 == "")
					{
						text15 = text25;
						num11 = 25;
					}
					else if (text16 == "")
					{
						text16 = text25;
						num12 = 25;
					}
					else if (text17 == "")
					{
						text17 = text25;
						num13 = 25;
					}
				}
				if (text24 == "Elixir")
				{
					text25 = "Vial";
					if (text4 == "")
					{
						text4 = text25;
					}
					else if (text5 == "")
					{
						text5 = text25;
					}
					else if (text6 == "")
					{
						text6 = text25;
					}
					else if (text7 == "")
					{
						text7 = text25;
					}
					else if (text8 == "")
					{
						text8 = text25;
					}
					else if (text9 == "")
					{
						text9 = text25;
					}
					else if (text10 == "")
					{
						text10 = text25;
					}
					else if (text11 == "")
					{
						text11 = text25;
					}
					else if (text13 == "")
					{
						text13 = text25;
					}
					else if (text14 == "")
					{
						text14 = text25;
					}
					else if (text15 == "")
					{
						text15 = text25;
					}
					else if (text16 == "")
					{
						text16 = text25;
					}
					else if (text17 == "")
					{
						text17 = text25;
					}
					text25 = "Globe";
					if (text7 == "")
					{
						text7 = text25;
						num4 = 25;
					}
					else if (text8 == "")
					{
						text8 = text25;
						num5 = 25;
					}
					else if (text9 == "")
					{
						text9 = text25;
						num6 = 25;
					}
					else if (text10 == "")
					{
						text10 = text25;
						num7 = 25;
					}
					else if (text11 == "")
					{
						text11 = text25;
						num8 = 25;
					}
					else if (text13 == "")
					{
						text13 = text25;
						num9 = 25;
					}
					else if (text14 == "")
					{
						text14 = text25;
						num10 = 25;
					}
					else if (text15 == "")
					{
						text15 = text25;
						num11 = 25;
					}
					else if (text16 == "")
					{
						text16 = text25;
						num12 = 25;
					}
					else if (text17 == "")
					{
						text17 = text25;
						num13 = 25;
					}
				}
				text25 = "Hammers";
				if (text7 == "")
				{
					text7 = text25;
					num4 = 5;
				}
				else if (text8 == "")
				{
					text8 = text25;
					num5 = 5;
				}
				else if (text9 == "")
				{
					text9 = text25;
					num6 = 5;
				}
				else if (text10 == "")
				{
					text10 = text25;
					num7 = 5;
				}
				else if (text11 == "")
				{
					text11 = text25;
					num8 = 5;
				}
				else if (text13 == "")
				{
					text13 = text25;
					num9 = 5;
				}
				else if (text14 == "")
				{
					text14 = text25;
					num10 = 5;
				}
				else if (text15 == "")
				{
					text15 = text25;
					num11 = 5;
				}
				else if (text16 == "")
				{
					text16 = text25;
					num12 = 5;
				}
				else if (text17 == "")
				{
					text17 = text25;
					num13 = 5;
				}
			}
		}
		for (int k = 0; k < 2; k++)
		{
			string text26 = "FoodHealthGood";
			if (k == 1)
			{
				text26 = "FoodHealthOk";
			}
			if (text3 == "")
			{
				text3 = text26;
			}
			else if (text18 == "")
			{
				text18 = text26;
			}
			else if (text19 == "")
			{
				text19 = text26;
			}
			else if (text7 == "")
			{
				text7 = text26;
			}
			else if (text8 == "")
			{
				text8 = text26;
			}
			else if (text9 == "")
			{
				text9 = text26;
			}
			else if (text10 == "")
			{
				text10 = text26;
			}
			else if (text11 == "")
			{
				text11 = text26;
			}
			else if (text13 == "")
			{
				text13 = text26;
			}
			else if (text14 == "")
			{
				text14 = text26;
			}
			else if (text15 == "")
			{
				text15 = text26;
			}
			else if (text16 == "")
			{
				text16 = text26;
			}
			else if (text17 == "")
			{
				text17 = text26;
			}
		}
		if (this.HasTokenInSkill("Bow", false, false) || this.HasTokenInSkill("Elixir", false, false) || this.HasTokenInSkill("Sling", false, false))
		{
			string text27 = "ArrowKit";
			if (text7 == "")
			{
				text7 = text27;
			}
			else if (text8 == "")
			{
				text8 = text27;
			}
			else if (text9 == "")
			{
				text9 = text27;
			}
			else if (text10 == "")
			{
				text10 = text27;
			}
			else if (text11 == "")
			{
				text11 = text27;
			}
			else if (text13 == "")
			{
				text13 = text27;
			}
			else if (text14 == "")
			{
				text14 = text27;
			}
			else if (text15 == "")
			{
				text15 = text27;
			}
			else if (text16 == "")
			{
				text16 = text27;
			}
			else if (text17 == "")
			{
				text17 = text27;
			}
		}
		for (int l = 0; l < 2; l++)
		{
			string text28 = "SmallShield";
			string text29 = "ShieldBasic";
			if (l == 1)
			{
				text28 = "LargeShield";
				text29 = "ShieldLargeBasic";
			}
			if (this.HasTokenInSkill(text28, false, false))
			{
				if (text2 == "" && flag2)
				{
					text2 = text29;
				}
				else if (text7 == "")
				{
					text7 = text29;
				}
				else if (text8 == "")
				{
					text8 = text29;
				}
				else if (text9 == "")
				{
					text9 = text29;
				}
				else if (text10 == "")
				{
					text10 = text29;
				}
				else if (text11 == "")
				{
					text11 = text29;
				}
				else if (text13 == "")
				{
					text13 = text29;
				}
				else if (text14 == "")
				{
					text14 = text29;
				}
				else if (text15 == "")
				{
					text15 = text29;
				}
				else if (text16 == "")
				{
					text16 = text29;
				}
				else if (text17 == "")
				{
					text17 = text29;
				}
			}
			if (flag)
			{
				Debug.Log(string.Concat(new string[] { text2, " ", text7, " ", text8, " ", text9, " ", text10 }));
			}
		}
		for (int m = 0; m < 21; m++)
		{
			string text30 = text;
			int num14 = 0;
			int num15 = 1;
			if (m == 1)
			{
				text30 = text2;
				num14 = 2;
			}
			if (m == 2)
			{
				text30 = text12;
				num14 = 32;
			}
			if (m == 4)
			{
				text30 = text3;
				num14 = 14;
				num15 = num;
			}
			if (m == 5)
			{
				text30 = "";
				num14 = 18;
			}
			if (m == 6)
			{
				text30 = text4;
				num14 = 8;
			}
			if (m == 7)
			{
				text30 = text5;
				num14 = 10;
			}
			if (m == 8)
			{
				text30 = text6;
				num14 = 12;
			}
			if (m == 9)
			{
				text30 = text7;
				num14 = 38;
				num15 = num4;
			}
			if (m == 10)
			{
				text30 = text8;
				num14 = 40;
				num15 = num5;
			}
			if (m == 11)
			{
				text30 = text9;
				num14 = 42;
				num15 = num6;
			}
			if (m == 12)
			{
				text30 = text10;
				num14 = 44;
				num15 = num7;
			}
			if (m == 13)
			{
				text30 = text11;
				num14 = 46;
				num15 = num8;
			}
			if (m == 14)
			{
				text30 = text18;
				num14 = 26;
				num15 = num2;
			}
			if (m == 15)
			{
				text30 = text19;
				num14 = 28;
				num15 = num3;
			}
			if (m == 16)
			{
				text30 = text13;
				num14 = 48;
				num15 = num9;
			}
			if (m == 17)
			{
				text30 = text14;
				num14 = 50;
				num15 = num10;
			}
			if (m == 18)
			{
				text30 = text15;
				num14 = 52;
				num15 = num11;
			}
			if (m == 19)
			{
				text30 = text16;
				num14 = 54;
				num15 = num12;
			}
			if (m == 20)
			{
				text30 = text17;
				num14 = 56;
				num15 = num13;
			}
			if (text30 != "" && text30 != "Fist")
			{
				Library.Inventory invRowFromName = Links.x.library.GetInvRowFromName(text30);
				float num16 = 0f;
				if (invRowFromName != null)
				{
					if (m >= 6 && m <= 8)
					{
						num15 = 50;
					}
					if (m >= 9 && m != 7 && m != 14 && m != 15)
					{
						global::Item item3;
						ItemEquipped itemEquipped3;
						Links.x.inventory.AddFromGround(null, null, 0, false, 0f, invRowFromName._ID, num15, Vector3.zero, Vector3.zero, new Vector4((float)invRowFromName._DurabilityMax, 0f, 0f, num16), this.character, false, false, out item3, out itemEquipped3);
					}
					else
					{
						this.character.UpdateInvLists("Add", num14 / 2, invRowFromName._ID, num15, new Vector4((float)invRowFromName._DurabilityMax, 0f, 0f, num16), Vector3.zero, Vector3.zero, null);
						if (this.character.inventoryBag)
						{
							this.character.inventoryBag.UpdateBagItem(num14 / 2, invRowFromName._ID, num15, new Vector4((float)invRowFromName._DurabilityMax, 0f, 0f, num16), Vector3.zero, Vector3.zero, this.character);
						}
					}
				}
			}
		}
		this.character.AddEquippedItems();
	}

	// Token: 0x06000A7C RID: 2684 RVA: 0x000D1FDF File Offset: 0x000D01DF
	public void AddPaganKnowledge(string spellName)
	{
		if (!this.knowledge.Contains(spellName))
		{
			this.knowledge.Add(spellName);
		}
	}

	// Token: 0x06000A7D RID: 2685 RVA: 0x000D1FFB File Offset: 0x000D01FB
	public bool HasPaganKnowledge(string spellName)
	{
		return this.knowledge.Contains(spellName);
	}

	// Token: 0x06000A7E RID: 2686 RVA: 0x000D200C File Offset: 0x000D020C
	public void AddSong(string songName, string uniqueName, Vector3 l)
	{
		if (!this.abilities.Contains(songName))
		{
			this.abilities.Insert(0, songName);
			Vector4 vector = new Vector4(0f, 0f, 0f, 0f);
			vector.x = l.x;
			vector.y = l.y;
			vector.z = l.z;
			vector.w = 0f;
			this.abilityLevels.Insert(0, vector);
			Library.Abilities abilityRow = Links.x.library.GetAbilityRow(songName);
			string trigger = abilityRow._Trigger;
			this.abilityNames.Insert(0, songName);
			this.abilityReady.Insert(0, true);
			this.abilityTriggers.Insert(0, trigger);
			this.abilityTriggerCount.Insert(0, 0);
			this.abilityCost.Insert(0, new Vector2(1f, 0f));
			this.abilityRows.Insert(0, abilityRow);
			this.abilityEquipped.Insert(0, 0);
			this.uniqueNames.Insert(0, uniqueName);
			this.character.portrait.skillBag.SetTrinketGrid(true);
			this.character.portrait.skillBag.SetSongGrid();
			this.UpdateAbilityTriggers();
			if (this.songPoints > 0 && abilityRow._SongCost <= this.songPoints)
			{
				this.equippedSongList.Add(uniqueName);
				this.songPoints -= abilityRow._SongCost;
				this.abilityEquipped[0] = 1;
				Debug.Log(((this != null) ? this.ToString() : null) + " " + this.songPoints.ToString());
			}
		}
	}

	// Token: 0x06000A7F RID: 2687 RVA: 0x000D21BC File Offset: 0x000D03BC
	public void AddWord(string wordName, string uniqueName, Vector3 l)
	{
		if (!this.abilities.Contains(wordName))
		{
			this.abilities.Insert(0, wordName);
			Vector4 vector = new Vector4(0f, 0f, 0f, 0f);
			vector.x = l.x;
			vector.y = l.y;
			vector.z = l.z;
			vector.w = 0f;
			this.abilityLevels.Insert(0, vector);
			Library.Abilities abilityRow = Links.x.library.GetAbilityRow(wordName);
			string trigger = abilityRow._Trigger;
			this.abilityNames.Insert(0, wordName);
			this.abilityReady.Insert(0, true);
			this.abilityTriggers.Insert(0, trigger);
			this.abilityTriggerCount.Insert(0, 0);
			this.abilityCost.Insert(0, new Vector2(1f, 0f));
			this.abilityRows.Insert(0, abilityRow);
			this.abilityEquipped.Insert(0, 0);
			this.uniqueNames.Insert(0, wordName);
			this.UpdateAbilityTriggers();
		}
	}

	// Token: 0x06000A80 RID: 2688 RVA: 0x000D22D8 File Offset: 0x000D04D8
	public int SpellCount()
	{
		int num = 0;
		for (int i = 0; i < this.uniqueNames.Count; i++)
		{
			if (this.abilityRows[i]._IsSpell)
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x06000A81 RID: 2689 RVA: 0x000D2315 File Offset: 0x000D0515
	public int SpellIndex(string s)
	{
		return this.abilityNames.IndexOf(s);
	}

	// Token: 0x06000A82 RID: 2690 RVA: 0x000D2324 File Offset: 0x000D0524
	public void SaveSpell(string knowledgeName, string spellName, int slider1, int slider2, int slider3, int tether, Vector2 cost)
	{
		if (this.uniqueNames.IndexOf(spellName) == -1)
		{
			List<string> list = new List<string>();
			list.Add(spellName);
			for (int i = 0; i < this.uniqueNames.Count; i++)
			{
				if (!this.abilityRows[i]._IsSpell)
				{
					list.Add("");
				}
				else
				{
					list.Add(this.uniqueNames[i]);
				}
			}
			list.Sort();
			int num = list.IndexOf(spellName);
			this.abilities.Insert(num, spellName);
			Vector4 vector = new Vector4(0f, 0f, 0f, 0f);
			vector.x = (float)slider1;
			vector.y = (float)slider2;
			vector.z = (float)slider3;
			vector.w = (float)tether;
			this.abilityLevels.Insert(num, vector);
			this.abilityNames.Insert(num, knowledgeName);
			Library.Abilities abilityRow = Links.x.library.GetAbilityRow(knowledgeName);
			string trigger = abilityRow._Trigger;
			this.uniqueNames.Insert(num, spellName);
			this.abilityReady.Insert(num, true);
			this.abilityTriggers.Insert(num, trigger);
			this.abilityTriggerCount.Insert(num, 0);
			this.abilityCost.Insert(num, cost);
			this.abilityRows.Insert(num, abilityRow);
			this.abilityEquipped.Insert(num, 0);
			this.canCastSpells = true;
			this.character.portrait.skillBag.SetTrinketGrid(true);
			this.character.portrait.skillBag.SetSpellbookGrid();
			this.UpdateAbilityTriggers();
		}
	}

	// Token: 0x06000A83 RID: 2691 RVA: 0x000D24C8 File Offset: 0x000D06C8
	public void RemoveSpell(string spellName)
	{
		int num = this.uniqueNames.IndexOf(spellName);
		if (num > -1)
		{
			this.abilities.RemoveAt(num);
			this.abilityLevels.RemoveAt(num);
			this.abilityNames.RemoveAt(num);
			this.uniqueNames.RemoveAt(num);
			this.abilityReady.RemoveAt(num);
			this.abilityTriggers.RemoveAt(num);
			this.abilityTriggerCount.RemoveAt(num);
			this.abilityCost.RemoveAt(num);
			this.abilityRows.RemoveAt(num);
			this.abilityEquipped.RemoveAt(num);
			this.character.portrait.skillBag.SetSpellbookGrid();
		}
		this.CheckFavoriteSpells();
	}

	// Token: 0x06000A84 RID: 2692 RVA: 0x000D257C File Offset: 0x000D077C
	public int CheckJobNumber(string job)
	{
		int num = 0;
		int count = this.abilityRows.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityRows[i]._MainSkill == job)
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x06000A85 RID: 2693 RVA: 0x000D25C4 File Offset: 0x000D07C4
	public bool GetWordsOfPower()
	{
		int count = this.effects.Count;
		if (this.wordCount > 0)
		{
			this.words.Clear();
		}
		if (count > 0)
		{
			for (int i = 0; i < count; i++)
			{
				if (this.effects[i].effect._Name.Contains("Word"))
				{
					this.words.Add(this.effects[i].effect._Name);
				}
			}
		}
		if (this.words.Count > 0)
		{
			this.wordCount = this.words.Count;
			return true;
		}
		return false;
	}

	// Token: 0x06000A86 RID: 2694 RVA: 0x000D2668 File Offset: 0x000D0868
	public void DoWordOfPower(string originalWord, string abilityName)
	{
		Effects effects = this.character.gameObject.AddComponent<Effects>();
		Links.x.cellar.AddEffects(effects);
		effects.gameObject.SetActive(true);
		effects.source = this.character;
		effects.target = this.character;
		effects.fromLoad = false;
		effects.effectName = abilityName + "Word";
		effects.sourceLevel = 0f;
		effects.Inflicted(false);
		this.str.Clear();
		this.str.Append(Links.x.gameFeed.GetPartyColorText(this.character));
		this.str.Append(this.GetName());
		this.str.Append("</color>");
		this.str.Append(" shouted word of power: ");
		this.str.Append(originalWord);
		Links.x.gameFeed.AddFeed(this.str.ToString());
	}

	// Token: 0x06000A87 RID: 2695 RVA: 0x000D276D File Offset: 0x000D096D
	public bool HasAbility(string abilityName)
	{
		return this.abilityNames.Contains(abilityName);
	}

	// Token: 0x06000A88 RID: 2696 RVA: 0x000D277B File Offset: 0x000D097B
	public Vector4 GetAbilityLevel(int index)
	{
		return this.abilityLevels[index];
	}

	// Token: 0x06000A89 RID: 2697 RVA: 0x000D2789 File Offset: 0x000D0989
	public string GetAbilitySpellName(int index)
	{
		return this.uniqueNames[index];
	}

	// Token: 0x06000A8A RID: 2698 RVA: 0x000D2798 File Offset: 0x000D0998
	public void CheckForAbilityBooleans()
	{
		this.hasHealingSongs = false;
		this.hasDefenseAbilities = false;
		this.hasUndeadAbilities = false;
		this.hasBuffAbilities = false;
		this.hasUtilityAbilities = false;
		if (this.GetSkill(23) >= 50f || this.GetSkill(24) >= 50f || this.GetSkill(25) >= 50f)
		{
			this.canCharm = true;
			return;
		}
		this.canCharm = false;
	}

	// Token: 0x06000A8B RID: 2699 RVA: 0x000D2804 File Offset: 0x000D0A04
	public void UsedAbility(string s)
	{
	}

	// Token: 0x06000A8C RID: 2700 RVA: 0x000D2806 File Offset: 0x000D0A06
	public bool IsFavoriteSpell(string n)
	{
		return this.favoriteSpells.IndexOf(n) > -1;
	}

	// Token: 0x06000A8D RID: 2701 RVA: 0x000D281A File Offset: 0x000D0A1A
	public void AddFavoriteSpell(string n)
	{
		if (this.favoriteSpells.IndexOf(n) == -1)
		{
			this.favoriteSpells.Add(n);
		}
	}

	// Token: 0x06000A8E RID: 2702 RVA: 0x000D2837 File Offset: 0x000D0A37
	public void RemoveFavoriteSpell(string n)
	{
		if (this.favoriteSpells.IndexOf(n) > -1)
		{
			this.favoriteSpells.Remove(n);
		}
	}

	// Token: 0x06000A8F RID: 2703 RVA: 0x000D2858 File Offset: 0x000D0A58
	public void CheckFavoriteSpells()
	{
		bool flag = false;
		for (int i = 0; i < this.favoriteSpells.Count; i++)
		{
			if (this.uniqueNames.IndexOf(this.favoriteSpells[i]) == -1)
			{
				this.favoriteSpells[i] = null;
				flag = true;
			}
		}
		if (flag)
		{
			this.favoriteSpells.RemoveAll((string item) => item == null);
		}
	}

	// Token: 0x06000A90 RID: 2704 RVA: 0x000D28D4 File Offset: 0x000D0AD4
	public void CheckForSongsAndWords(string trigger, out int multiTargets)
	{
		multiTargets = 0;
		if (Records.x.miniGame)
		{
			return;
		}
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			int num = multiTargets;
			if (this.abilityReady[i] && this.abilityEquipped[i] == 1 && this.abilityTriggers[i] == trigger)
			{
				int x = this.abilityRows[i]._X;
				if (x > 1)
				{
					List<int> list = this.abilityTriggerCount;
					int num2 = i;
					int num3 = list[num2];
					list[num2] = num3 + 1;
					if (this.character.portrait)
					{
						this.character.portrait.skillBag.SongProcs();
					}
				}
				if ((this.abilityTriggerCount[i] >= x || x <= 1) && this.character.actions)
				{
					this.character.actions.SongWordTriggered(this.uniqueNames[i], trigger, this.abilityRows[i], out multiTargets);
					if (num > multiTargets)
					{
						multiTargets = num;
					}
					this.abilityTriggerCount[i] = 0;
					if (this.character.portrait)
					{
						this.character.portrait.skillBag.SongProcs();
					}
				}
			}
		}
	}

	// Token: 0x06000A91 RID: 2705 RVA: 0x000D2A32 File Offset: 0x000D0C32
	public void EnchantJewelryEffects(int index, bool intercessionsOnly)
	{
		if (this)
		{
			base.StartCoroutine(this.CheckJewelry(index, intercessionsOnly));
		}
	}

	// Token: 0x06000A92 RID: 2706 RVA: 0x000D2A4B File Offset: 0x000D0C4B
	private IEnumerator CheckJewelry(int index, bool intercessionsOnly)
	{
		Vector3 spellInfo = this.character.GetSocketNum(index);
		Vector3 spellInfo2 = this.character.GetSocketNum(index + 1);
		int originalIndex = index;
		index /= 2;
		bool debugJewelry = false;
		if (debugJewelry)
		{
			Debug.Log(string.Concat(new string[]
			{
				"CHECKING JEWELRY ",
				(this != null) ? this.ToString() : null,
				" ",
				index.ToString(),
				" ",
				spellInfo.x.ToString(),
				" ",
				this.character.GetDurabilityNum(index).x.ToString(),
				" ",
				intercessionsOnly.ToString()
			}));
		}
		yield return new WaitForSecondsRealtime(0.1f);
		if (!intercessionsOnly)
		{
			bool flag = false;
			int num = this.effects.Count;
			Effects effects = null;
			for (int i = 0; i < num; i++)
			{
				if (this.effects[i] && this.effects[i].jewelrySlot == index)
				{
					effects = this.effects[i];
					flag = true;
					break;
				}
			}
			if (flag && effects)
			{
				effects.Healed(false, true);
				if (debugJewelry)
				{
					Debug.Log(string.Concat(new string[]
					{
						"Found existing, healing ",
						(this != null) ? this.ToString() : null,
						" ",
						spellInfo.x.ToString(),
						" ",
						index.ToString()
					}));
				}
			}
			flag = false;
			num = this.effects.Count;
			effects = null;
			for (int j = 0; j < num; j++)
			{
				if (this.effects[j] && this.effects[j].jewelrySlot == index)
				{
					effects = this.effects[j];
					flag = true;
					break;
				}
			}
			if (flag && effects)
			{
				effects.Healed(false, true);
				if (debugJewelry)
				{
					Debug.Log(string.Concat(new string[]
					{
						"Found existing, healing ",
						(this != null) ? this.ToString() : null,
						" ",
						spellInfo.x.ToString(),
						" ",
						index.ToString()
					}));
				}
			}
		}
		if (spellInfo.x > 0f)
		{
			Library.Pagan paganRowByID = Links.x.library.GetPaganRowByID((float)((int)spellInfo.x));
			if (paganRowByID != null)
			{
				bool flag2 = false;
				int count = this.effects.Count;
				Effects effects2 = null;
				for (int k = 0; k < this.effects.Count; k++)
				{
					if (this.effects[k].jewelrySlot == index && this.effects[k].effect._Name == paganRowByID._ID)
					{
						effects2 = this.effects[k];
						flag2 = true;
						break;
					}
				}
				if (flag2 && effects2)
				{
					effects2.Healed(false, true);
					if (debugJewelry)
					{
						Debug.Log(string.Concat(new string[]
						{
							"Found existing, healing ",
							(this != null) ? this.ToString() : null,
							" ",
							spellInfo.x.ToString(),
							" ",
							index.ToString()
						}));
					}
				}
				if (this.CanWearEnchantedItem(spellInfo2.z) && paganRowByID != null)
				{
					if (debugJewelry)
					{
						Debug.Log("Updating enchanted jewelry " + index.ToString() + " " + paganRowByID._ID);
					}
					float num2 = 0f;
					for (int l = 0; l < 3; l++)
					{
						string text = paganRowByID._Slider1;
						float num3 = spellInfo.y;
						if (l == 1)
						{
							text = paganRowByID._Slider2;
							num3 = spellInfo.z;
						}
						if (l == 2)
						{
							text = paganRowByID._Slider3;
							num3 = spellInfo2.x;
						}
						if (text != "" && (text.Contains("Potency") || text.Contains("Reduction")))
						{
							num2 = num3;
						}
					}
					Effects effects3 = base.gameObject.AddComponent<Effects>();
					Links.x.cellar.AddEffects(effects3);
					effects3.gameObject.SetActive(true);
					effects3.source = this.character;
					effects3.target = this.character;
					effects3.fromLoad = false;
					effects3.effectName = paganRowByID._ID;
					effects3.jewelrySlot = index;
					effects3.sourceLevel = num2;
					effects3.Inflicted(false);
				}
			}
		}
		if (!intercessionsOnly)
		{
			this.JewelryEffects(originalIndex, debugJewelry);
		}
		yield break;
	}

	// Token: 0x06000A93 RID: 2707 RVA: 0x000D2A68 File Offset: 0x000D0C68
	public void JewelryEffects(int index, bool debugJewelry)
	{
		Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.character.GetInvNum(index));
		if (invRowByIndex != null && invRowByIndex._Effect != "" && !invRowByIndex._Effect.Contains("Cure"))
		{
			bool flag = false;
			Effects effects = null;
			if (flag && effects)
			{
				effects.Healed(false, true);
			}
			if (debugJewelry)
			{
				Debug.Log("Updating jewelry " + index.ToString() + " " + invRowByIndex._Effect);
			}
			Effects effects2 = base.gameObject.AddComponent<Effects>();
			Links.x.cellar.AddEffects(effects2);
			effects2.gameObject.SetActive(true);
			effects2.source = this.character;
			effects2.target = this.character;
			effects2.fromLoad = false;
			effects2.effectName = invRowByIndex._Effect;
			effects2.jewelrySlot = index / 2;
			effects2.sourceLevel = invRowByIndex._Level;
			effects2.Inflicted(false);
		}
		if (Links.x.characterSheet.open)
		{
			Links.x.characterSheet.GetStats();
		}
	}

	// Token: 0x06000A94 RID: 2708 RVA: 0x000D2B8C File Offset: 0x000D0D8C
	public bool WeaponRequired(int i)
	{
		string weaponReq = this.abilityRows[i]._WeaponReq;
		bool flag = false;
		if (weaponReq == "Any")
		{
			flag = true;
		}
		else if (weaponReq == "Melee")
		{
			if (this.character.invRow1 != null && this.character.invRow1._MeleeRangeEnd < 5f)
			{
				flag = true;
			}
		}
		else if (weaponReq == "Range")
		{
			if (this.character.invRow1 != null && this.character.invRow1._MeleeRangeEnd >= 5f)
			{
				flag = true;
			}
		}
		else if (weaponReq == "Two")
		{
			int num = 0;
			if (this.character.invRow1 != null && this.character.invRow1._ID > 1)
			{
				num++;
			}
			if (this.character.invRow2 != null && this.character.invRow2._ID > 1 && this.character.invRow2._EquipSlotID == 0)
			{
				num++;
			}
			if (num == 2)
			{
				flag = true;
			}
		}
		else if (weaponReq == "Shield")
		{
			if (this.character.invRow2 != null && this.character.invRow2._WeaponType == weaponReq)
			{
				flag = true;
			}
		}
		else if (weaponReq == "None")
		{
			int num2 = 0;
			if (this.character.invRow1 != null && this.character.invRow1._ID > 1)
			{
				num2++;
			}
			if (this.character.invRow2 != null && this.character.invRow2._ID > 1 && this.character.invRow2._EquipSlotID == 0)
			{
				num2++;
			}
			if (this.character.invRow3 != null && this.character.invRow3._ID > 1)
			{
				num2++;
			}
			if (this.character.invRow4 != null && this.character.invRow4._ID > 1)
			{
				num2++;
			}
			if (num2 == 0)
			{
				flag = true;
			}
		}
		else if (this.character.invRow1 != null && this.character.invRow1._WeaponType == weaponReq)
		{
			flag = true;
		}
		return flag;
	}

	// Token: 0x06000A95 RID: 2709 RVA: 0x000D2DD8 File Offset: 0x000D0FD8
	public bool HasPowerDraw()
	{
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityRows[i]._AddsToAttack && this.abilityRows[i]._AINotes.Contains("Distance") && this.abilityRows[i]._WeaponReq == this.character.invRow1._WeaponType)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000A96 RID: 2710 RVA: 0x000D2E58 File Offset: 0x000D1058
	public void CheckTerrainAbilities(string currentTerrain)
	{
		int count = this.effects.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.effects[i] && this.effects[i].terrainDependent)
			{
				Library.Effects effect = this.effects[i].effect;
				bool flag = false;
				if (currentTerrain == effect._TerrainReq)
				{
					flag = true;
				}
				if (this.effects[i].effectIsActive != flag)
				{
					if (flag)
					{
						this.effects[i].Set(false);
					}
					else
					{
						this.effects[i].Set(true);
					}
					this.effects[i].effectIsActive = flag;
					if (Records.x.editor)
					{
						Debug.Log("Switching terrain effect " + this.effects[i].effect._Name);
					}
				}
			}
		}
	}

	// Token: 0x06000A97 RID: 2711 RVA: 0x000D2F58 File Offset: 0x000D1158
	public bool HasSpellbook()
	{
		if (this.magicPointsBase > 0)
		{
			if (!this.character.party)
			{
				return true;
			}
			if (this.character.HasBook(Links.x.library.spellbookIndex) > -1)
			{
				this.canCastSpells = true;
				return true;
			}
		}
		this.canCastSpells = false;
		return false;
	}

	// Token: 0x06000A98 RID: 2712 RVA: 0x000D2FAB File Offset: 0x000D11AB
	public bool HasSongbook()
	{
		return !this.character.party || this.character.HasBook(Links.x.library.songbookIndex) > -1;
	}

	// Token: 0x06000A99 RID: 2713 RVA: 0x000D2FDC File Offset: 0x000D11DC
	public void UpdateAbilityTriggers()
	{
		bool flag = this.HasSongbook();
		bool flag2 = false;
		bool flag3 = false;
		bool flag4 = false;
		if (flag)
		{
			if (this.character.HasInstrumentType("Flute"))
			{
				flag2 = true;
			}
			if (this.character.HasInstrumentType("Horn"))
			{
				flag3 = true;
			}
			if (this.character.HasInstrumentType("Pipe"))
			{
				flag4 = true;
			}
		}
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityEquipped[i] == 1)
			{
				if (this.abilityRows[i]._IsSong)
				{
					if (flag)
					{
						if ((this.abilityRows[i]._WeaponReq == "Flute" && flag2) || (this.abilityRows[i]._WeaponReq == "Horn" && flag3) || (this.abilityRows[i]._WeaponReq == "Pipe" && flag4))
						{
							this.abilityReady[i] = true;
						}
						else
						{
							this.abilityReady[i] = false;
						}
					}
					else
					{
						this.abilityReady[i] = false;
					}
				}
				else
				{
					this.abilityReady[i] = this.WeaponRequired(i);
				}
			}
			else if (this.abilityRows[i]._IsSpell)
			{
				this.hasSpells = true;
				if (this.HasSpellbook())
				{
					if (this.HasPaganCostForSpell(this.uniqueNames[i]))
					{
						if (this.character.sailing)
						{
							if (this.abilityRows[i]._UseOnBoat)
							{
								this.abilityReady[i] = true;
							}
							else
							{
								this.abilityReady[i] = false;
							}
						}
						else
						{
							this.abilityReady[i] = true;
						}
					}
					else
					{
						this.abilityReady[i] = false;
					}
				}
				else
				{
					this.abilityReady[i] = false;
				}
			}
		}
		if (this.character.party && this.character.portrait)
		{
			this.character.portrait.skillBag.UpdateAbilityTriggers();
		}
	}

	// Token: 0x06000A9A RID: 2714 RVA: 0x000D321C File Offset: 0x000D141C
	public void CombatStartSpells()
	{
		this.spellDifficulties.Clear();
		int count = this.abilityRows.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.abilityRows[i]._IsSpell)
			{
				float num;
				this.spellDifficulties.Add((int)this.SpellDifficulty(this.uniqueNames[i], out num));
			}
			else
			{
				this.spellDifficulties.Add(0);
			}
		}
	}

	// Token: 0x06000A9B RID: 2715 RVA: 0x000D3290 File Offset: 0x000D1490
	public Library.Abilities GetAbilityRow(string n)
	{
		int count = this.abilityRows.Count;
		for (int i = 0; i < count; i++)
		{
			if (n == this.uniqueNames[i])
			{
				return this.abilityRows[i];
			}
		}
		return null;
	}

	// Token: 0x06000A9C RID: 2716 RVA: 0x000D32D7 File Offset: 0x000D14D7
	public bool GetAbilityReadyState(int index)
	{
		return this.abilityReady[index];
	}

	// Token: 0x06000A9D RID: 2717 RVA: 0x000D32E5 File Offset: 0x000D14E5
	public int GetAbilityTriggerCount(int index)
	{
		return this.abilityTriggerCount[index];
	}

	// Token: 0x06000A9E RID: 2718 RVA: 0x000D32F4 File Offset: 0x000D14F4
	public string GetAbilityTrigger(int index, bool plural)
	{
		string text = this.abilityTriggers[index];
		return this.TriggerName(text, plural);
	}

	// Token: 0x06000A9F RID: 2719 RVA: 0x000D3318 File Offset: 0x000D1518
	public string TriggerName(string s, bool plural)
	{
		if (s == "CombatStart")
		{
			return "combat start";
		}
		if (s == "Attack" || s == "PreAttack")
		{
			if (plural)
			{
				return "successful attacks";
			}
			return "successful attack";
		}
		else if (s == "OnBlock")
		{
			if (plural)
			{
				return "successful blocks";
			}
			return "successful block";
		}
		else if (s == "OnHit")
		{
			if (plural)
			{
				return "hits taken";
			}
			return "hit taken";
		}
		else if (s == "OnKill")
		{
			if (plural)
			{
				return "enemy deaths";
			}
			return "enemy death";
		}
		else if (s == "OnPartyKill")
		{
			if (plural)
			{
				return "enemy deaths from party";
			}
			return "enemy death from party";
		}
		else if (s == "OnEvade")
		{
			if (plural)
			{
				return "dodges/evasions";
			}
			return "dodge/evasion";
		}
		else
		{
			if (!(s == "OnFriendDown"))
			{
				return s;
			}
			if (plural)
			{
				return "friends down";
			}
			return "friend down";
		}
	}

	// Token: 0x06000AA0 RID: 2720 RVA: 0x000D340A File Offset: 0x000D160A
	public int GetAbilityTriggerGoal(int index)
	{
		return this.abilityRows[index]._X;
	}

	// Token: 0x06000AA1 RID: 2721 RVA: 0x000D341D File Offset: 0x000D161D
	public bool GetAbilityStatus(int index)
	{
		return this.abilityReady[index];
	}

	// Token: 0x06000AA2 RID: 2722 RVA: 0x000D342C File Offset: 0x000D162C
	public int GetAbilityIndex(string s)
	{
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			if (s == this.abilityNames[i])
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x06000AA3 RID: 2723 RVA: 0x000D3468 File Offset: 0x000D1668
	public int GetIndex(string s, int c)
	{
		for (int i = 0; i < c; i++)
		{
			if (s == this.abilities[i])
			{
				return i;
			}
		}
		return -1;
	}

	// Token: 0x06000AA4 RID: 2724 RVA: 0x000D3498 File Offset: 0x000D1698
	public int GetAbilityNumber(string s)
	{
		int count = this.abilityNames.Count;
		for (int i = 0; i < count; i++)
		{
			if (s == this.abilityNames[i])
			{
				return (int)this.abilityLevels[i].x;
			}
		}
		return 0;
	}

	// Token: 0x06000AA5 RID: 2725 RVA: 0x000D34E5 File Offset: 0x000D16E5
	public bool HasSpellName(string s)
	{
		return this.abilityNames.Contains(s);
	}

	// Token: 0x06000AA6 RID: 2726 RVA: 0x000D34F8 File Offset: 0x000D16F8
	public bool IsTargetAnEnemy(uint num)
	{
		return num != 0U && (this.enemy1 == num || this.enemy2 == num || this.enemy3 == num || this.enemy4 == num || this.enemy5 == num || this.enemy6 == num || this.enemy7 == num || this.enemy8 == num || this.enemy9 == num);
	}

	// Token: 0x06000AA7 RID: 2727 RVA: 0x000D3570 File Offset: 0x000D1770
	public void RemovedCompanionSave()
	{
		this.saveFile = new ES3File(string.Concat(new string[]
		{
			Records.x.openBook,
			"/Creatures_",
			this.originalMap,
			"_",
			this.creaturesName,
			".es3"
		}));
		new List<string>().Add("Normal");
		new List<int>().Add(this.currLife);
		new List<string>().Add(Links.x.diorama.sceneName);
		new List<Vector3>().Add(this.character.tr.position);
		this.saveFile.Sync();
	}

	// Token: 0x06000AA8 RID: 2728 RVA: 0x000D3628 File Offset: 0x000D1828
	public void CharacterSave()
	{
		string text = Records.x.openBook + "/Party_" + this.partyID.ToString() + ".es3";
		this.saveFile = new ES3File(text);
		this.saveFile.Save<float>("Strength", this.strength);
		this.saveFile.Save<float>("Aura", this.aura);
		this.saveFile.Save<float>("Dexterity", this.dexterity);
		this.saveFile.Save<float>("Pagan", this.pagan);
		this.saveFile.Save<float>("Sensory", this.sensory);
		this.saveFile.Save<float>("Agility", this.agility);
		this.saveFile.Save<float>("MoveRadius", this.maxStaminaAdd);
		this.saveFile.Save<int>("CurrLife", this.currLife);
		this.saveFile.Save<int>("LifeBase", this.lifeBase);
		this.saveFile.Save<int>("WeightBase", this.weightBase);
		this.saveFile.Save<float>("SightRadiusBase", this.sightRadiusBase);
		this.saveFile.Save<float>("HearingRadiusBase", this.hearingRadiusBase);
		this.saveFile.Save<float>("Sex", this.sex);
		this.saveFile.Save<string>("SkinTexture", this.skinTexture);
		this.saveFile.Save<string>("HairTexture", this.hairTexture);
		this.RemoveNullAilments();
		this.effectsNamesFromSave.Clear();
		this.effectsTimesFromSave.Clear();
		this.effectsVar2FromSave.Clear();
		for (int i = 0; i < this.effects.Count; i++)
		{
			if (this.effects[i])
			{
				this.effectsNamesFromSave.Add(this.effects[i].effectName);
				this.effectsTimesFromSave.Add(this.effects[i].effectStartTime);
				this.effectsVar2FromSave.Add(this.effects[i].sourceLevel);
			}
		}
		this.saveFile.Save<List<int>>("EffectsTimes", this.effectsTimesFromSave);
		this.saveFile.Save<List<string>>("EffectsName", this.effectsNamesFromSave);
		this.saveFile.Save<List<float>>("EffectsVar2", this.effectsVar2FromSave);
		this.saveFile.Save<int>("XP", this.XP);
		this.saveFile.Save<string>("DisplayName", this.displayName);
		this.saveFile.Save<string>("DialogueFile", this.dialogueFile);
		this.saveFile.Save<string>("Model", this.model);
		this.saveFile.Save<string>("HeadModel", this.headModel);
		this.saveFile.Save<string>("Indoor Scene", this.character.indoorID);
		this.saveFile.Save<string>("Indoor Scene Door", this.character.doorID);
		this.saveFile.Save<int>("Graph", this.character.desiredGraph);
		this.saveFile.Save<float>("TimeOfDeath", this.character.timeOfDeath);
		this.saveFile.Save<bool>("Stunned", this.character.stunned);
		this.saveFile.Save<string>("LevelUps", this.levelUps);
		this.saveFile.Save<int>("KillCount", this.killCount);
		this.saveFile.Save<int>("Level", this.level);
		if (this.character)
		{
			this.saveFile.Save<Vector3>("Position", this.character.tr.position);
			this.saveFile.Save<Quaternion>("Rotation", this.character.tr.rotation);
			this.saveFile.Save<bool>("Selected", this.character.selected);
			this.saveFile.Save<bool>("MainSelected", this.character.mainSelected);
			this.bagToSave.Clear();
			this.bagStacksToSave.Clear();
			this.bag = this.character.bag;
			for (int j = 0; j < this.bag.Count; j++)
			{
				if (j % 2 == 0)
				{
					if (this.bag[j] == 0)
					{
						this.bagToSave.Add("Empty");
					}
					if (this.bag[j] == 1)
					{
						this.bagToSave.Add("Fist");
					}
					if (this.bag[j] > 1)
					{
						Library.Inventory invRowByIndex = Links.x.library.GetInvRowByIndex(this.bag[j]);
						this.bagToSave.Add(invRowByIndex._Name);
					}
				}
				else
				{
					this.bagStacksToSave.Add(this.bag[j]);
				}
			}
			this.saveFile.Save<List<string>>("Bag", this.bagToSave);
			this.saveFile.Save<List<Vector3>>("Sockets", this.character.sockets);
			this.saveFile.Save<List<int>>("BagPositions", this.character.bagPositions);
			this.saveFile.Save<List<Vector4>>("Durability", this.character.durability);
			this.saveFile.Save<List<int>>("BagStacks", this.bagStacksToSave);
		}
		this.saveFile.Save<string>("MajorStat1", this.majorStat1);
		this.saveFile.Save<string>("MajorStat2", this.majorStat2);
		this.saveFile.Save<string>("MinorStat3", this.minorStat3);
		this.saveFile.Save<string>("MajorSkill1", this.majorSkill1);
		this.saveFile.Save<string>("MajorSkill2", this.majorSkill2);
		this.saveFile.Save<string>("MinorSkill3", this.minorSkill3);
		this.saveFile.Save<int>("TopStartingSkill1", this.topStartingSkill1);
		this.saveFile.Save<int>("TopStartingSkill2", this.topStartingSkill2);
		this.saveFile.Save<int>("TopStartingSkill3", this.topStartingSkill3);
		this.saveFile.Save<string>("OriginalMap", this.originalMap);
		this.saveFile.Save<bool>("Protagonist", this.protagonist);
		this.saveFile.Save<string>("Race", this.race);
		this.saveFile.Save<string>("RaceTrait", this.raceTrait);
		this.saveFile.Save<int>("PartyColorID", this.character.partyColorID);
		this.saveFile.Save<int>("MagicTactics", this.magicTactics);
		this.saveFile.Save<int>("UseAI", this.companionAI);
		this.saveFile.Save<List<string>>("PaganKnowledge", this.knowledge);
		this.saveFile.Save<List<string>>("Abilities", this.uniqueNames);
		this.saveFile.Save<List<Vector4>>("AbilityLevels", this.abilityLevels);
		this.saveFile.Save<List<Vector2>>("AbilityCost", this.abilityCost);
		this.saveFile.Save<List<string>>("AbilityNames", this.abilityNames);
		this.equippedAbilities = "";
		string text2 = "";
		foreach (string text3 in this.equippedSongList)
		{
			this.equippedAbilities += text3;
			this.equippedAbilities += ",";
			int num = this.uniqueNames.IndexOf(text3);
			if (num > -1)
			{
				text2 += this.abilityTriggerCount[num].ToString();
				text2 += ",";
			}
			else
			{
				text2 += " ,";
			}
		}
		this.saveFile.Save<string>("EquippedAbilities", this.equippedAbilities);
		this.saveFile.Save<string>("EquippedAbilityCount", text2);
		this.saveFile.Save<List<string>>("FavoriteSpells", this.favoriteSpells);
		this.saveFile.Save<List<float>>("Skills", this.skills);
		this.saveFile.Save<List<float>>("SkillsProgress", this.skillsProgress);
		this.saveFile.Save<float>("RallyBase", this.rallyBase);
		this.saveFile.Save<int>("MagicPoints", this.magicPoints);
		this.saveFile.Save<int>("MagicPointsBase", this.magicPointsBase);
		this.saveFile.Save<int>("Formation", this.formationGroup);
		this.saveFile.Save<int>("SelectedAmmo", this.character.selectedAmmoIndex);
		this.saveFile.Save<int>("SelectedWpnIndex", this.character.selectedWpnIndex);
		this.saveFile.Save<int>("PartyID", this.partyID);
		this.saveFile.Save<int>("UseItems", this.useItemsAI);
		this.saveFile.Save<bool>("AutoCastAI", this.autoCastAI);
		this.saveFile.Save<int>("AutoCrit", this.autoCritsAI);
		this.saveFile.Save<int>("AutoBuff", this.autoBuffsAI);
		this.saveFile.Save<bool>("IsLeader", this.isLeader);
		if (this.character.portrait)
		{
			this.modalWindowsOpen = this.character.portrait.skillBag.modalWindowsOpen;
		}
		this.saveFile.Save<bool>("ModalWindowsOpen", this.modalWindowsOpen);
		this.saveFile.Save<float>("RallyBoost", Links.x.fellowship.rallyBoost);
		if (Records.x.demo)
		{
			this.saveFile.Save<float>("GameVersionForThisScene", Records.x.gameVersionDemo);
		}
		else
		{
			this.saveFile.Save<float>("GameVersionForThisScene", Records.x.gameVersion);
		}
		this.saveFile.Sync();
	}

	// Token: 0x06000AA9 RID: 2729 RVA: 0x000D4080 File Offset: 0x000D2280
	public void CharacterLoad()
	{
		string text = Records.x.openBook + "/Party_" + this.partyID.ToString() + ".es3";
		int num = 0;
		if (ES3.FileExists(text))
		{
			this.saveFile = new ES3File(text);
			this.strength = this.saveFile.Load<float>("Strength");
			this.aura = this.saveFile.Load<float>("Aura");
			this.dexterity = this.saveFile.Load<float>("Dexterity");
			this.pagan = this.saveFile.Load<float>("Pagan");
			this.sensory = this.saveFile.Load<float>("Sensory");
			this.agility = this.saveFile.Load<float>("Agility");
			this.maxStaminaAdd = this.saveFile.Load<float>("MoveRadius");
			this.currLife = this.saveFile.Load<int>("CurrLife");
			this.lifeBase = this.saveFile.Load<int>("LifeBase");
			this.weightBase = this.saveFile.Load<int>("WeightBase");
			this.sightRadiusBase = this.saveFile.Load<float>("SightRadiusBase");
			this.hearingRadiusBase = this.saveFile.Load<float>("HearingRadiusBase");
			this.sex = this.saveFile.Load<float>("Sex");
			this.skinTexture = this.saveFile.Load<string>("SkinTexture");
			this.hairTexture = this.saveFile.Load<string>("HairTexture");
			this.effectsNamesFromSave.Clear();
			this.effectsTimesFromSave.Clear();
			this.effectsVar2FromSave.Clear();
			this.effectsTimesFromSave = this.saveFile.Load<List<int>>("EffectsTimes");
			this.effectsNamesFromSave = this.saveFile.Load<List<string>>("EffectsName");
			this.effectsVar2FromSave = this.saveFile.Load<List<float>>("EffectsVar2");
			this.XP = this.saveFile.Load<int>("XP");
			this.displayName = this.saveFile.Load<string>("DisplayName");
			this.dialogueFile = this.saveFile.Load<string>("DialogueFile");
			this.model = this.saveFile.Load<string>("Model");
			this.headModel = this.saveFile.Load<string>("HeadModel");
			this.character.doorID = this.saveFile.Load<string>("Indoor Scene Door");
			this.character.indoorID = this.saveFile.Load<string>("Indoor Scene");
			this.character.desiredGraph = this.saveFile.Load<int>("Graph");
			this.character.timeOfDeath = this.saveFile.Load<float>("TimeOfDeath");
			this.character.stunned = this.saveFile.Load<bool>("Stunned");
			this.levelUps = this.saveFile.Load<string>("LevelUps");
			this.killCount = this.saveFile.Load<int>("KillCount");
			this.level = this.saveFile.Load<int>("Level");
			Vector3 vector = this.saveFile.Load<Vector3>("Position");
			Quaternion quaternion = this.saveFile.Load<Quaternion>("Rotation");
			bool flag = this.saveFile.Load<bool>("Selected");
			bool flag2 = this.saveFile.Load<bool>("MainSelected");
			this.bag = this.character.bag;
			this.bagPositions = this.character.bagPositions;
			this.sockets = this.character.sockets;
			this.durability = this.character.durability;
			this.savedStatsBag.Clear();
			this.savedStatsBag = this.saveFile.Load<List<string>>("Bag");
			this.bagStacksToSave.Clear();
			this.bagStacksToSave = this.saveFile.Load<List<int>>("BagStacks");
			this.savedStatsSockets = this.saveFile.Load<List<Vector3>>("Sockets");
			this.savedStatsBagPositions = this.saveFile.Load<List<int>>("BagPositions");
			this.savedStatsDurability = this.saveFile.Load<List<Vector4>>("Durability");
			this.majorStat1 = this.saveFile.Load<string>("MajorStat1");
			this.majorStat2 = this.saveFile.Load<string>("MajorStat2");
			this.minorStat3 = this.saveFile.Load<string>("MinorStat3");
			this.majorSkill1 = this.saveFile.Load<string>("MajorSkill1");
			this.majorSkill2 = this.saveFile.Load<string>("MajorSkill2");
			this.minorSkill3 = this.saveFile.Load<string>("MinorSkill3");
			this.topStartingSkill1 = this.saveFile.Load<int>("TopStartingSkill1");
			this.topStartingSkill2 = this.saveFile.Load<int>("TopStartingSkill2");
			this.topStartingSkill3 = this.saveFile.Load<int>("TopStartingSkill3");
			this.bag.Clear();
			for (int i = 0; i < this.savedStatsBag.Count; i++)
			{
				if (this.savedStatsBag[i] == "Empty")
				{
					this.bag.Add(0);
					this.bag.Add(0);
				}
				else if (this.savedStatsBag[i] == "Fist")
				{
					this.bag.Add(1);
					this.bag.Add(0);
				}
				else
				{
					int invRowID = Links.x.library.GetInvRowID(this.savedStatsBag[i]);
					this.bag.Add(invRowID);
					this.bag.Add(0);
				}
			}
			int num2 = 0;
			for (int j = 0; j < this.bag.Count; j++)
			{
				if (j % 2 != 0)
				{
					this.bag[j] = this.bagStacksToSave[num2];
					num2++;
				}
			}
			for (int k = 0; k < this.sockets.Count; k++)
			{
				if (k < this.savedStatsSockets.Count)
				{
					this.sockets[k] = this.savedStatsSockets[k];
				}
			}
			for (int l = 0; l < this.bagPositions.Count; l++)
			{
				if (l < this.savedStatsBagPositions.Count)
				{
					this.bagPositions[l] = this.savedStatsBagPositions[l];
				}
			}
			for (int m = 0; m < this.durability.Count; m++)
			{
				if (m < this.savedStatsDurability.Count)
				{
					this.durability[m] = this.savedStatsDurability[m];
				}
			}
			this.originalMap = this.saveFile.Load<string>("OriginalMap");
			this.protagonist = this.saveFile.Load<bool>("Protagonist");
			this.race = this.saveFile.Load<string>("Race");
			if (this.race == "Yeti")
			{
				this.character.animationPrefix = "_VollingYeti";
			}
			this.raceTrait = this.saveFile.Load<string>("RaceTrait");
			Links.x.ReturnPartyColor(this.character.partyColorID);
			this.character.partyColorID = this.saveFile.Load<int>("PartyColorID");
			this.character.portrait.UpdateBar();
			Links.x.GetOpenPartyColorFromSave(this.character.partyColorID);
			this.character.UpdateArrowColor();
			this.character.CircleAnimation("");
			this.magicTactics = this.saveFile.Load<int>("MagicTactics");
			this.companionAI = this.saveFile.Load<int>("UseAI");
			this.autoCastAI = this.saveFile.Load<bool>("AutoCastAI");
			if (this.saveFile.KeyExists("UseItems"))
			{
				this.useItemsAI = this.saveFile.Load<int>("UseItems");
				this.autoBuffsAI = this.saveFile.Load<int>("AutoBuff");
				this.autoCritsAI = this.saveFile.Load<int>("AutoCrit");
			}
			this.isLeader = this.saveFile.Load<bool>("IsLeader");
			this.knowledge = this.saveFile.Load<List<string>>("PaganKnowledge");
			this.abilities = this.saveFile.Load<List<string>>("AbilityNames");
			this.abilityLevelsTemp = this.saveFile.Load<List<Vector4>>("AbilityLevels");
			this.spellNamesTemp = this.saveFile.Load<List<string>>("Abilities");
			this.abilityCostTemp = this.saveFile.Load<List<Vector2>>("AbilityCost");
			this.equippedAbilities = this.saveFile.Load<string>("EquippedAbilities");
			for (int n = 0; n < this.abilityEquipped.Count; n++)
			{
				this.abilityEquipped[n] = 0;
			}
			this.equippedCounts = this.saveFile.Load<string>("EquippedAbilityCount");
			this.skills.Clear();
			this.skillsProgress.Clear();
			this.skills = this.saveFile.Load<List<float>>("Skills");
			this.skillsProgress = this.saveFile.Load<List<float>>("SkillsProgress");
			this.modalWindowsOpen = this.saveFile.Load<bool>("ModalWindowsOpen");
			this.rallyBase = this.saveFile.Load<float>("RallyBase");
			this.magicPoints = this.saveFile.Load<int>("MagicPoints");
			this.magicPointsBase = this.saveFile.Load<int>("MagicPointsBase");
			this.formationGroup = this.saveFile.Load<int>("Formation");
			this.character.selectedAmmoIndex = this.saveFile.Load<int>("SelectedAmmo");
			this.character.selectedWpnIndex = this.saveFile.Load<int>("SelectedWpnIndex");
			this.partyID = this.saveFile.Load<int>("PartyID");
			num = this.character.selectedWpnIndex;
			if (this.saveFile.KeyExists("GameVersionForThisScene"))
			{
				this.lastVersionForThisScene = this.saveFile.Load<float>("GameVersionForThisScene");
			}
			else
			{
				this.lastVersionForThisScene = 1.29f;
			}
			if (this.saveFile.KeyExists("FavoriteSpells"))
			{
				this.favoriteSpells = this.saveFile.Load<List<string>>("FavoriteSpells");
			}
			if (this.saveFile.KeyExists("RallyBoost"))
			{
				Links.x.fellowship.rallyBoost = (float)((int)this.saveFile.Load<float>("RallyBoost"));
			}
			this.character.SetPosition(vector, null);
			this.character.SetRotation(quaternion, false, true);
			this.character.FirstPosition(null);
			if (flag)
			{
				this.character.AddToSelected(false, false);
			}
			else
			{
				this.character.RemoveFromSelected(true);
			}
			if (flag2)
			{
				this.character.SetAsLeader();
			}
			this.character.portrait.SetSelection();
			this.character.characterSheetPortrait.SetSelection();
			this.character.portrait.skillBag.SetSelectedAmmoIndex(this.character.selectedAmmoIndex);
			Library.Inventory invRow = Links.x.library.GetInvRow(this.bag[18]);
			if (invRow != null)
			{
				if (this.bag[18] <= 1 || invRow._ArmorID == -1)
				{
					this.character.SetupBody();
				}
			}
			else
			{
				this.character.SetupBody();
			}
			if (this.character.stunned)
			{
				this.character.Stunned(true);
			}
			this.SetupAbilities(false);
		}
		else if (Records.x.banquetIsle)
		{
			Links.x.main.SetAsLeader();
		}
		this.UpdateStats();
		this.FormationTactics();
		this.SetVoiceID(false);
		this.character.protagonist = this.protagonist;
		if (this.protagonist)
		{
			Links.x.protagonist = this.character;
		}
		this.character.portrait.skillBag.SetTrinketGrid(true);
		this.character.portrait.skillBag.SetSpellbookGrid();
		this.character.portrait.skillBag.SetSongGrid();
		this.character.portrait.UpdateMP();
		this.SpawnEffects();
		this.character.SetupPartyAfterLoadedVariables();
		this.UpdateRallyCount(false, 0f);
		Links.x.hudControl.SetRallyBars();
		this.character.portrait.skillBag.SetSelectedWpnIndex(num);
		base.StartCoroutine(this.WaitForAnimator());
	}

	// Token: 0x06000AAA RID: 2730 RVA: 0x000D4D48 File Offset: 0x000D2F48
	private IEnumerator WaitForAnimator()
	{
		float timeToLerp = 1f;
		float percentage = 0f;
		float startTime = Time.realtimeSinceStartup;
		while (percentage < 1f)
		{
			percentage = (Time.realtimeSinceStartup - startTime) / timeToLerp;
			if (this.character.animator)
			{
				this.character.animator.enabled = false;
			}
			yield return null;
		}
		if (this.character.animator)
		{
			this.character.animator.Rebind();
			this.character.animator.Update(0f);
			this.character.animator.enabled = true;
		}
		yield break;
	}

	// Token: 0x06000AAB RID: 2731 RVA: 0x000D4D57 File Offset: 0x000D2F57
	public int SongPointsMax()
	{
		return 4;
	}

	// Token: 0x06000AAC RID: 2732 RVA: 0x000D4D5C File Offset: 0x000D2F5C
	public void UpdateEquippedSongList(string n)
	{
		bool flag = false;
		for (int i = 0; i < this.equippedSongList.Count; i++)
		{
			if (this.equippedSongList[i] == n && !flag)
			{
				int num = this.uniqueNames.IndexOf(n);
				if (num > -1)
				{
					flag = true;
					this.equippedSongList.RemoveAt(i);
					this.songPoints += this.abilityRows[num]._SongCost;
					this.abilityEquipped[num] = 0;
				}
			}
		}
		if (!flag)
		{
			int num2 = this.uniqueNames.IndexOf(n);
			if (num2 > -1 && this.abilityRows[num2]._SongCost <= this.songPoints)
			{
				this.equippedSongList.Add(n);
				this.songPoints -= this.abilityRows[num2]._SongCost;
				this.abilityEquipped[num2] = 1;
			}
		}
		if (this.character.portrait)
		{
			this.character.portrait.skillBag.SetSongGrid();
		}
	}

	// Token: 0x06000AAD RID: 2733 RVA: 0x000D4E6D File Offset: 0x000D306D
	public float GetSynergyNeeded(int x)
	{
		if (x == 1)
		{
			return this.synergy1;
		}
		return this.synergy2;
	}

	// Token: 0x06000AAE RID: 2734 RVA: 0x000D4E80 File Offset: 0x000D3080
	public void UpdateRallyCount(bool add, float amt)
	{
		if (!this.character.party)
		{
			return;
		}
		if (add)
		{
			amt = 1.25f + this.rallyBase / 5f;
			amt *= Mathf.Clamp(Links.x.fellowship.rallySpeed, 1f, 1000000f);
			Links.x.hudControl.UpdateRally(amt);
		}
	}

	// Token: 0x06000AAF RID: 2735 RVA: 0x000D4EE4 File Offset: 0x000D30E4
	public void UsedSynergy()
	{
	}

	// Token: 0x06000AB0 RID: 2736 RVA: 0x000D4EE6 File Offset: 0x000D30E6
	public void ClearSynergies()
	{
		this.synergyAttackCount = 0f;
		this.UpdateRallyCount(false, 0f);
	}

	// Token: 0x06000AB1 RID: 2737 RVA: 0x000D4F00 File Offset: 0x000D3100
	public void FormationTactics()
	{
		this.defendMainInCombat = false;
		if (this.formationGroup == 0 || this.formationGroup == 1 || this.formationGroup == 2 || this.formationGroup == 3)
		{
			this.kiteInCombat = false;
			if (this.character.npc && this.character.creatures)
			{
				this.defendMainInCombat = false;
				this.defendingCharacter = null;
				if (this.character.creatures.creatures.hasLeader)
				{
					this.defendingCharacter = this.character.creatures.GetLeader();
					if (this.defendingCharacter)
					{
						this.defendMainInCombat = true;
					}
				}
				else if (this.character.creatures.creatures.pickOneLeader)
				{
					this.defendingCharacter = this.character.creatures.GetFirstAsLeader(this.character);
					if (this.defendingCharacter)
					{
						this.defendMainInCombat = true;
					}
					else
					{
						this.defendMainInCombat = false;
					}
				}
			}
		}
		else
		{
			this.kiteInCombat = true;
		}
		if (this.character.party)
		{
			if (false)
			{
				this.defendingCharacter = Links.x.SharingFormation(this.character, this.formationGroup);
				if (this.defendingCharacter && !this.character.summoned)
				{
					this.defendMainInCombat = true;
				}
			}
			else
			{
				this.defendMainInCombat = false;
				this.defendingCharacter = null;
			}
		}
		if (this.formationGroup == 1 || this.formationGroup == 4 || this.formationGroup == 7)
		{
			this.useUtilityAbilities = true;
			return;
		}
		this.useUtilityAbilities = false;
	}

	// Token: 0x06000AB2 RID: 2738 RVA: 0x000D5098 File Offset: 0x000D3298
	public void AddSkillProgress(int skillIndex, float difficulty, Character target)
	{
		if (this.character.npc || this.character.summoned)
		{
			return;
		}
		if (target && target.ghost)
		{
			return;
		}
		float num = Records.x.GetSkillWeight(skillIndex) + difficulty;
		if (num < 0.5f)
		{
			num = 0.5f;
		}
		List<float> list = this.skillsProgress;
		list[skillIndex] += num;
		this.CheckProgress(skillIndex);
	}

	// Token: 0x06000AB3 RID: 2739 RVA: 0x000D510D File Offset: 0x000D330D
	public void CheckProgress(int skillIndex)
	{
	}

	// Token: 0x06000AB4 RID: 2740 RVA: 0x000D510F File Offset: 0x000D330F
	public void FinishLevelUp()
	{
	}

	// Token: 0x06000AB5 RID: 2741 RVA: 0x000D5114 File Offset: 0x000D3314
	public void IncreaseSkill(int skillIndex, int amount)
	{
		List<float> list = this.skills;
		list[skillIndex] += (float)amount;
	}

	// Token: 0x06000AB6 RID: 2742 RVA: 0x000D513B File Offset: 0x000D333B
	public void SetSkill(int skillIndex, int amount)
	{
		this.skills[skillIndex] = (float)amount;
	}

	// Token: 0x06000AB7 RID: 2743 RVA: 0x000D514B File Offset: 0x000D334B
	public float GetSkill(int skillIndex)
	{
		return this.skills[skillIndex] + this.allSkillAdd;
	}

	// Token: 0x06000AB8 RID: 2744 RVA: 0x000D5160 File Offset: 0x000D3360
	public float GetSkillProgress(int skillIndex)
	{
		float num = 0f;
		int count = this.skillsProgress.Count;
		for (int i = 0; i < count; i++)
		{
			num += this.skillsProgress[i];
		}
		if (num == 0f)
		{
			return 0f;
		}
		return this.skillsProgress[skillIndex] / num;
	}

	// Token: 0x06000AB9 RID: 2745 RVA: 0x000D51B6 File Offset: 0x000D33B6
	public int HasFamilyBackground(int index)
	{
		return this.familyBackgrounds[index];
	}

	// Token: 0x06000ABA RID: 2746 RVA: 0x000D51C0 File Offset: 0x000D33C0
	public int HasFamilyBackgroundFromName(string n)
	{
		int num = 0;
		if (n == "Merchant")
		{
			int num2 = 0;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 7;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 13;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 19;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Farmer")
		{
			int num2 = 1;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 9;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 14;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Cleric")
		{
			int num2 = 2;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 22;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 10;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Brewer")
		{
			int num2 = 3;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Sailor")
		{
			int num2 = 4;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Entertainer")
		{
			int num2 = 6;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Servant")
		{
			int num2 = 5;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Artisan")
		{
			int num2 = 8;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
			num2 = 25;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Rider")
		{
			int num2 = 11;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Herder")
		{
			int num2 = 12;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Expeditioner")
		{
			int num2 = 15;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Miner")
		{
			int num2 = 1164;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Hunter")
		{
			int num2 = 17;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Weaver")
		{
			int num2 = 18;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Gardener")
		{
			int num2 = 20;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Hunter")
		{
			int num2 = 21;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Justice")
		{
			int num2 = 23;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Politician")
		{
			int num2 = 24;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Pine")
		{
			int num2 = 26;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Maple")
		{
			int num2 = 27;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Willow")
		{
			int num2 = 28;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Birch")
		{
			int num2 = 29;
			num = this.familyBackgrounds[num2];
			if (num > 0)
			{
				return num;
			}
		}
		if (n == "Date")
		{
			int num2 = 30;
			return this.familyBackgrounds[num2];
		}
		return num;
	}

	// Token: 0x06000ABB RID: 2747 RVA: 0x000D5528 File Offset: 0x000D3728
	public void SetFamilyBackground(string rank, string race)
	{
		int num = 0;
		if (race == "Ameythevian")
		{
			if (rank == "Merchant")
			{
				num = 0;
			}
			if (rank == "Farmer")
			{
				num = 1;
			}
			if (rank == "Cleric")
			{
				num = 2;
			}
			if (rank == "Brewer")
			{
				num = 3;
			}
			if (rank == "Sailor")
			{
				num = 4;
			}
			if (rank == "Servant")
			{
				num = 5;
			}
			if (rank == "Entertainer")
			{
				num = 6;
			}
		}
		if (race == "Taratorith")
		{
			if (rank == "Merchant")
			{
				num = 7;
			}
			if (rank == "Artisan")
			{
				num = 8;
			}
			if (rank == "Farmer")
			{
				num = 9;
			}
			if (rank == "Cleric")
			{
				num = 10;
			}
			if (rank == "Rider")
			{
				num = 11;
			}
			if (rank == "Herder")
			{
				num = 12;
			}
		}
		if (race == "Varuchov")
		{
			if (rank == "Merchant")
			{
				num = 13;
			}
			if (rank == "Farmer")
			{
				num = 14;
			}
			if (rank == "Expeditioner")
			{
				num = 15;
			}
			if (rank == "Miner")
			{
				num = 16;
			}
			if (rank == "Hunter")
			{
				num = 17;
			}
			if (rank == "Weaver")
			{
				num = 18;
			}
		}
		if (race == "Pasaaren")
		{
			if (rank == "Merchant")
			{
				num = 19;
			}
			if (rank == "Gardener")
			{
				num = 20;
			}
			if (rank == "Hunter")
			{
				num = 21;
			}
			if (rank == "Cleric")
			{
				num = 22;
			}
			if (rank == "Justice")
			{
				num = 23;
			}
			if (rank == "Politician")
			{
				num = 24;
			}
			if (rank == "Artisan")
			{
				num = 25;
			}
		}
		if (race == "Yeti")
		{
			if (rank == "Pine")
			{
				num = 26;
			}
			if (rank == "Maple")
			{
				num = 27;
			}
			if (rank == "Willow")
			{
				num = 28;
			}
			if (rank == "Birch")
			{
				num = 29;
			}
			if (rank == "Date")
			{
				num = 30;
			}
		}
		for (int i = 0; i < 30; i++)
		{
			if (i == num)
			{
				this.familyBackgrounds[i] = 1;
			}
			else
			{
				this.familyBackgrounds[i] = 0;
			}
		}
		this.familyBackground = rank;
	}

	// Token: 0x06000ABC RID: 2748 RVA: 0x000D578C File Offset: 0x000D398C
	public void SetMajorsMinors(string setMajorStat1, string setMajorStat2, string setMinorStat3, string setMajorSkill1, string setMajorSkill2, string setMinorSkill3, bool setChangedArchetype)
	{
		this.majorStat1 = setMajorStat1;
		this.majorStat2 = setMajorStat2;
		this.minorStat3 = setMinorStat3;
		this.majorSkill1 = setMajorSkill1;
		this.majorSkill2 = setMajorSkill2;
		this.minorSkill3 = setMinorSkill3;
		this.changedArchetype = setChangedArchetype;
		int num = -1;
		int num2 = -1;
		int num3 = -1;
		float skillAmount = this.GetSkillAmount(this.majorSkill1, out num);
		float skillAmount2 = this.GetSkillAmount(this.majorSkill2, out num2);
		this.GetSkillAmount(this.minorSkill3, out num3);
		if (skillAmount > skillAmount2)
		{
			this.topStartingSkill1 = num;
			this.topStartingSkill2 = num2;
		}
		else
		{
			this.topStartingSkill2 = num;
			this.topStartingSkill1 = num2;
		}
		this.topStartingSkill3 = num3;
	}

	// Token: 0x06000ABD RID: 2749 RVA: 0x000D5828 File Offset: 0x000D3A28
	public float GetSkillAmount(string n, out int skillIndex)
	{
		skillIndex = -1;
		if (n == "Robes")
		{
			skillIndex = 0;
			return this.GetSkill(0);
		}
		if (n == "Pearl")
		{
			skillIndex = 1;
			return this.GetSkill(1);
		}
		if (n == "Crimscale")
		{
			skillIndex = 2;
			return this.GetSkill(2);
		}
		if (n == "Stonewood")
		{
			skillIndex = 3;
			return this.GetSkill(3);
		}
		if (n == "ShortSword")
		{
			skillIndex = 4;
			return this.GetSkill(4);
		}
		if (n == "LongSword")
		{
			skillIndex = 5;
			return this.GetSkill(5);
		}
		if (n == "Scepter")
		{
			skillIndex = 6;
			return this.GetSkill(6);
		}
		if (n == "Ax")
		{
			skillIndex = 7;
			return this.GetSkill(7);
		}
		if (n == "Pole")
		{
			skillIndex = 8;
			return this.GetSkill(8);
		}
		if (n == "Multi-Hand")
		{
			skillIndex = 9;
			return this.GetSkill(9);
		}
		if (n == "Bow")
		{
			skillIndex = 10;
			return this.GetSkill(10);
		}
		if (n == "Sling")
		{
			skillIndex = 11;
			return this.GetSkill(11);
		}
		if (n == "Elixir")
		{
			skillIndex = 12;
			return this.GetSkill(12);
		}
		if (n == "Hand-to-Hand")
		{
			skillIndex = 13;
			return this.GetSkill(13);
		}
		if (n == "LargeShield")
		{
			skillIndex = 14;
			return this.GetSkill(14);
		}
		if (n == "SmallShield")
		{
			skillIndex = 15;
			return this.GetSkill(15);
		}
		if (n == "Bindings")
		{
			skillIndex = 16;
			return this.GetSkill(16);
		}
		if (n == "Fauna")
		{
			skillIndex = 17;
			return this.GetSkill(17);
		}
		if (n == "Vines")
		{
			skillIndex = 18;
			return this.GetSkill(18);
		}
		if (n == "Spores")
		{
			skillIndex = 19;
			return this.GetSkill(19);
		}
		if (n == "Lockpick")
		{
			skillIndex = 20;
			return this.GetSkill(20);
		}
		if (n == "Sneaking")
		{
			skillIndex = 21;
			return this.GetSkill(21);
		}
		if (n == "Bartering")
		{
			skillIndex = 22;
			return this.GetSkill(22);
		}
		if (n == "Fish")
		{
			skillIndex = 23;
			return this.GetSkill(23);
		}
		if (n == "Forest")
		{
			skillIndex = 24;
			return this.GetSkill(24);
		}
		if (n == "Shroom")
		{
			skillIndex = 25;
			return this.GetSkill(25);
		}
		if (n == "Flute")
		{
			skillIndex = 26;
			return this.GetSkill(26);
		}
		if (n == "Horn")
		{
			skillIndex = 27;
			return this.GetSkill(27);
		}
		if (n == "Drum")
		{
			skillIndex = 28;
			return this.GetSkill(28);
		}
		if (n == "Pipe")
		{
			skillIndex = 29;
			return this.GetSkill(29);
		}
		if (n == "Melee")
		{
			skillIndex = 30;
			return this.GetSkill(30);
		}
		if (n == "Range")
		{
			skillIndex = 31;
			return this.GetSkill(31);
		}
		if (n == "Defense")
		{
			skillIndex = 32;
			return this.GetSkill(32);
		}
		if (n == "Whip")
		{
			skillIndex = 35;
			return this.GetSkill(35);
		}
		return 0f;
	}

	// Token: 0x06000ABE RID: 2750 RVA: 0x000D5BA0 File Offset: 0x000D3DA0
	public string GetMajorsMinors(int index)
	{
		if (index == 0)
		{
			return this.majorStat1;
		}
		if (index == 1)
		{
			return this.majorStat2;
		}
		if (index == 2)
		{
			return this.minorStat3;
		}
		if (index == 3)
		{
			return this.majorSkill1;
		}
		if (index == 4)
		{
			return this.majorSkill2;
		}
		if (index == 5)
		{
			return this.minorSkill3;
		}
		return "";
	}

	// Token: 0x06000ABF RID: 2751 RVA: 0x000D5BF3 File Offset: 0x000D3DF3
	public bool GetChangeArchetype()
	{
		return this.changedArchetype;
	}

	// Token: 0x06000AC0 RID: 2752 RVA: 0x000D5BFC File Offset: 0x000D3DFC
	public bool IsGoodWeaponMatch(Character c, global::Item item)
	{
		string mainSkill = item.invRow._MainSkill;
		int combatSkillID = this.GetCombatSkillID(mainSkill);
		return c.stats.GetSkill(combatSkillID) > 100f;
	}

	// Token: 0x06000AC1 RID: 2753 RVA: 0x000D5C34 File Offset: 0x000D3E34
	public bool IsGoodArmorMatch(Character c, global::Item item)
	{
		string mainSkill = item.invRow._MainSkill;
		int armorSkillID = this.GetArmorSkillID(mainSkill);
		return c.stats.GetSkill(armorSkillID) > 50f;
	}

	// Token: 0x06000AC2 RID: 2754 RVA: 0x000D5C6C File Offset: 0x000D3E6C
	public bool IsGoodShieldMatch(Character c, global::Item item)
	{
		string mainSkill = item.invRow._MainSkill;
		int combatSkillID = this.GetCombatSkillID(mainSkill);
		return c.stats.GetSkill(combatSkillID) > 50f;
	}

	// Token: 0x06000AC3 RID: 2755 RVA: 0x000D5CA4 File Offset: 0x000D3EA4
	public bool IsGoodAmmoMatch(Character c, global::Item item)
	{
		for (int i = 0; i < 2; i++)
		{
			Library.Inventory inventory = null;
			if (i == 0)
			{
				Links.x.library.GetInvRowByIndex(c.GetInvNum(0));
			}
			else
			{
				Links.x.library.GetInvRowByIndex(c.GetInvNum(32));
			}
			if (inventory._Ammo1 != "")
			{
				if (inventory._MainSkill == "Bow" && item.invRow._Ammo1 == "Bow")
				{
					if (item.ID >= Links.x.library.arrowsMin && item.ID <= Links.x.library.arrowsMax)
					{
						return true;
					}
				}
				else if (inventory._MainSkill == "Sling" && item.invRow._Ammo1 == "Dart")
				{
					if (item.ID >= Links.x.library.dartsMin && item.ID <= Links.x.library.dartsMax)
					{
						return true;
					}
				}
				else if (inventory._MainSkill.Contains("Elixir") || item.invRow._MainSkill.Contains("Elixir"))
				{
					if (item.ID >= Links.x.library.vialsMin && item.ID <= Links.x.library.vialsMax)
					{
						return true;
					}
				}
				else if (inventory._Name == item.invRow._Ammo1)
				{
					return true;
				}
			}
		}
		return false;
	}

	// Token: 0x06000AC4 RID: 2756 RVA: 0x000D5E40 File Offset: 0x000D4040
	public string GetBestSkill(string type, out float highestSkill)
	{
		float num = 0f;
		string text = "";
		string text2 = "";
		highestSkill = 0f;
		for (int i = 0; i < 10; i++)
		{
			int num2 = 0;
			if (i == 0)
			{
				num2 = 35;
				text2 = "whips";
			}
			if (i == 1)
			{
				num2 = 8;
				text2 = "polearms";
			}
			if (i == 2)
			{
				num2 = 6;
				text2 = "scepters";
			}
			if (i == 3)
			{
				num2 = 5;
				text2 = "swords";
			}
			if (i == 4)
			{
				num2 = 4;
				text2 = "short swords";
			}
			if (i == 5)
			{
				num2 = 11;
				text2 = "slings";
			}
			if (i == 6)
			{
				num2 = 7;
				text2 = "axes";
			}
			if (i == 7)
			{
				num2 = 10;
				text2 = "bows";
			}
			if (i == 8)
			{
				num2 = 12;
				text2 = "elixir throwing";
			}
			if (i == 9)
			{
				num2 = 13;
				text2 = "hand-to-hand fighting";
			}
			float skill = this.GetSkill(num2);
			if (skill > num)
			{
				num = skill;
				text = text2;
			}
		}
		highestSkill = num;
		return text;
	}

	// Token: 0x06000AC5 RID: 2757 RVA: 0x000D5F1C File Offset: 0x000D411C
	public int MatchBestSkillToDialogueName(string n)
	{
		if (n == "whips")
		{
			return 35;
		}
		if (n == "polearms")
		{
			return 8;
		}
		if (n == "scepters")
		{
			return 6;
		}
		if (n == "swords")
		{
			return 5;
		}
		if (n == "short swords")
		{
			return 4;
		}
		if (n == "slins")
		{
			return 11;
		}
		if (n == "axes")
		{
			return 7;
		}
		if (n == "bows")
		{
			return 10;
		}
		if (n == "elixir throwing")
		{
			return 12;
		}
		if (n == "hand-to-hand fighting")
		{
			return 13;
		}
		if (n == "slings")
		{
			return 11;
		}
		return -1;
	}

	// Token: 0x06000AC6 RID: 2758 RVA: 0x000D5FD8 File Offset: 0x000D41D8
	public float HighestMusicSkill()
	{
		float skill = this.GetSkill(26);
		float skill2 = this.GetSkill(27);
		float skill3 = this.GetSkill(29);
		if (skill > skill2 && skill > skill3)
		{
			return skill;
		}
		if (skill2 > skill && skill2 > skill3)
		{
			return skill2;
		}
		if (skill3 > skill && skill3 > skill2)
		{
			return skill3;
		}
		return skill;
	}

	// Token: 0x04000E65 RID: 3685
	[Header("INFO")]
	public Character character;

	// Token: 0x04000E66 RID: 3686
	public Library.Characters characterRow;

	// Token: 0x04000E67 RID: 3687
	public string xmlName;

	// Token: 0x04000E68 RID: 3688
	public string displayName;

	// Token: 0x04000E69 RID: 3689
	public string creaturesName;

	// Token: 0x04000E6A RID: 3690
	public string dialogueFile;

	// Token: 0x04000E6B RID: 3691
	public string model;

	// Token: 0x04000E6C RID: 3692
	public string headModel;

	// Token: 0x04000E6D RID: 3693
	public string originalMap;

	// Token: 0x04000E6E RID: 3694
	public string state;

	// Token: 0x04000E6F RID: 3695
	public int initiateDialogue;

	// Token: 0x04000E70 RID: 3696
	public int partyID;

	// Token: 0x04000E71 RID: 3697
	public int voiceID;

	// Token: 0x04000E72 RID: 3698
	public bool dead;

	// Token: 0x04000E73 RID: 3699
	public bool stunned;

	// Token: 0x04000E74 RID: 3700
	public float leaveTime;

	// Token: 0x04000E75 RID: 3701
	public float lastVersionForThisScene;

	// Token: 0x04000E76 RID: 3702
	[Header("EFFECTS")]
	public string savedEffects = "";

	// Token: 0x04000E77 RID: 3703
	private List<string> effectsNamesFromSave = new List<string>();

	// Token: 0x04000E78 RID: 3704
	public List<Effects> effects = new List<Effects>();

	// Token: 0x04000E79 RID: 3705
	private List<int> effectsTimesFromSave = new List<int>();

	// Token: 0x04000E7A RID: 3706
	private List<float> effectsVar2FromSave = new List<float>();

	// Token: 0x04000E7B RID: 3707
	private List<Effects> temp = new List<Effects>();

	// Token: 0x04000E7C RID: 3708
	[Header("ABILITIES and SPELLS")]
	public List<string> abilityNames = new List<string>();

	// Token: 0x04000E7D RID: 3709
	public List<bool> abilityReady = new List<bool>();

	// Token: 0x04000E7E RID: 3710
	public List<string> abilityTriggers = new List<string>();

	// Token: 0x04000E7F RID: 3711
	public List<int> abilityTriggerCount = new List<int>();

	// Token: 0x04000E80 RID: 3712
	public List<Vector2> abilityCost = new List<Vector2>();

	// Token: 0x04000E81 RID: 3713
	public List<Library.Abilities> abilityRows = new List<Library.Abilities>();

	// Token: 0x04000E82 RID: 3714
	public List<int> abilityEquipped = new List<int>();

	// Token: 0x04000E83 RID: 3715
	public List<Vector4> abilityLevels = new List<Vector4>();

	// Token: 0x04000E84 RID: 3716
	public List<string> knowledge = new List<string>();

	// Token: 0x04000E85 RID: 3717
	public List<string> uniqueNames = new List<string>();

	// Token: 0x04000E86 RID: 3718
	public List<float> skillsProgress = new List<float>();

	// Token: 0x04000E87 RID: 3719
	public List<float> skills = new List<float>();

	// Token: 0x04000E88 RID: 3720
	public List<int> spellDifficulties = new List<int>();

	// Token: 0x04000E89 RID: 3721
	public string equippedAbilities = "";

	// Token: 0x04000E8A RID: 3722
	private string equippedCounts = "";

	// Token: 0x04000E8B RID: 3723
	public string[] equippedWordList = new string[3];

	// Token: 0x04000E8C RID: 3724
	public List<string> equippedSongList = new List<string>();

	// Token: 0x04000E8D RID: 3725
	public List<string> favoriteSpells = new List<string>();

	// Token: 0x04000E8E RID: 3726
	public float synergyAttackCount;

	// Token: 0x04000E8F RID: 3727
	public bool flying;

	// Token: 0x04000E90 RID: 3728
	public bool canCastSpells;

	// Token: 0x04000E91 RID: 3729
	private List<Vector4> abilityLevelsTemp;

	// Token: 0x04000E92 RID: 3730
	private List<string> spellNamesTemp;

	// Token: 0x04000E93 RID: 3731
	private List<Vector2> abilityCostTemp;

	// Token: 0x04000E94 RID: 3732
	private List<string> abilities;

	// Token: 0x04000E95 RID: 3733
	private StringFast str = new StringFast(64);

	// Token: 0x04000E96 RID: 3734
	private StringFast str2 = new StringFast(64);

	// Token: 0x04000E97 RID: 3735
	[Header("STATS")]
	public float moveSpeed = 0.5f;

	// Token: 0x04000E98 RID: 3736
	public float moveSpeedMod;

	// Token: 0x04000E99 RID: 3737
	public float sex;

	// Token: 0x04000E9A RID: 3738
	public float skin;

	// Token: 0x04000E9B RID: 3739
	public float hair;

	// Token: 0x04000E9C RID: 3740
	public float hairColor;

	// Token: 0x04000E9D RID: 3741
	public string skinTexture;

	// Token: 0x04000E9E RID: 3742
	public string hairTexture;

	// Token: 0x04000E9F RID: 3743
	public string archetype;

	// Token: 0x04000EA0 RID: 3744
	public string majorStat1;

	// Token: 0x04000EA1 RID: 3745
	public string majorStat2;

	// Token: 0x04000EA2 RID: 3746
	public string minorStat3;

	// Token: 0x04000EA3 RID: 3747
	public string majorSkill1;

	// Token: 0x04000EA4 RID: 3748
	public string majorSkill2;

	// Token: 0x04000EA5 RID: 3749
	public string minorSkill3;

	// Token: 0x04000EA6 RID: 3750
	public int topStartingSkill1;

	// Token: 0x04000EA7 RID: 3751
	public int topStartingSkill2;

	// Token: 0x04000EA8 RID: 3752
	public int topStartingSkill3;

	// Token: 0x04000EA9 RID: 3753
	private bool changedArchetype;

	// Token: 0x04000EAA RID: 3754
	public float sightRadiusBase;

	// Token: 0x04000EAB RID: 3755
	public float hearingRadiusBase;

	// Token: 0x04000EAC RID: 3756
	public float naturalArmorBase;

	// Token: 0x04000EAD RID: 3757
	public int lifeBase;

	// Token: 0x04000EAE RID: 3758
	public int magicPointsBase;

	// Token: 0x04000EAF RID: 3759
	public int weightBase;

	// Token: 0x04000EB0 RID: 3760
	public int maxHealthAdd;

	// Token: 0x04000EB1 RID: 3761
	public int currLife;

	// Token: 0x04000EB2 RID: 3762
	public int magicPoints;

	// Token: 0x04000EB3 RID: 3763
	public float rallyBase;

	// Token: 0x04000EB4 RID: 3764
	public bool animal;

	// Token: 0x04000EB5 RID: 3765
	public bool protagonist;

	// Token: 0x04000EB6 RID: 3766
	public bool canJump;

	// Token: 0x04000EB7 RID: 3767
	public int soundID;

	// Token: 0x04000EB8 RID: 3768
	public string race;

	// Token: 0x04000EB9 RID: 3769
	public string raceTrait;

	// Token: 0x04000EBA RID: 3770
	public bool canTalk;

	// Token: 0x04000EBB RID: 3771
	public bool hasEnemies;

	// Token: 0x04000EBC RID: 3772
	public int nextXP;

	// Token: 0x04000EBD RID: 3773
	public int XP;

	// Token: 0x04000EBE RID: 3774
	private List<uint> enemies;

	// Token: 0x04000EBF RID: 3775
	private uint enemy1;

	// Token: 0x04000EC0 RID: 3776
	private uint enemy2;

	// Token: 0x04000EC1 RID: 3777
	private uint enemy3;

	// Token: 0x04000EC2 RID: 3778
	private uint enemy4;

	// Token: 0x04000EC3 RID: 3779
	private uint enemy5;

	// Token: 0x04000EC4 RID: 3780
	private uint enemy6;

	// Token: 0x04000EC5 RID: 3781
	private uint enemy7;

	// Token: 0x04000EC6 RID: 3782
	private uint enemy8;

	// Token: 0x04000EC7 RID: 3783
	private uint enemy9;

	// Token: 0x04000EC8 RID: 3784
	public uint allegiance;

	// Token: 0x04000EC9 RID: 3785
	public int level = 1;

	// Token: 0x04000ECA RID: 3786
	public float strength;

	// Token: 0x04000ECB RID: 3787
	public float strengthModFlat;

	// Token: 0x04000ECC RID: 3788
	public float agility;

	// Token: 0x04000ECD RID: 3789
	public float agilityModFlat;

	// Token: 0x04000ECE RID: 3790
	public float dexterity;

	// Token: 0x04000ECF RID: 3791
	public float dexterityModFlat;

	// Token: 0x04000ED0 RID: 3792
	public float aura;

	// Token: 0x04000ED1 RID: 3793
	public float auraModFlat;

	// Token: 0x04000ED2 RID: 3794
	public float pagan;

	// Token: 0x04000ED3 RID: 3795
	public float paganModFlat;

	// Token: 0x04000ED4 RID: 3796
	public float sensory;

	// Token: 0x04000ED5 RID: 3797
	public float sensoryModFlat;

	// Token: 0x04000ED6 RID: 3798
	public float severityModFlat;

	// Token: 0x04000ED7 RID: 3799
	public float paganSeverityModFlat;

	// Token: 0x04000ED8 RID: 3800
	public float hitModFlat;

	// Token: 0x04000ED9 RID: 3801
	public float paganHitModFlat;

	// Token: 0x04000EDA RID: 3802
	public float evadeModFlat;

	// Token: 0x04000EDB RID: 3803
	public float balance;

	// Token: 0x04000EDC RID: 3804
	public float blockModFlat;

	// Token: 0x04000EDD RID: 3805
	public string levelUps = "";

	// Token: 0x04000EDE RID: 3806
	public List<int> diceCountMods = new List<int>();

	// Token: 0x04000EDF RID: 3807
	public List<int> diceSideMods = new List<int>();

	// Token: 0x04000EE0 RID: 3808
	public List<int> diceTypeMods = new List<int>();

	// Token: 0x04000EE1 RID: 3809
	public List<int> savedBag = new List<int>();

	// Token: 0x04000EE2 RID: 3810
	public List<Vector4> savedDur = new List<Vector4>();

	// Token: 0x04000EE3 RID: 3811
	private List<string> bagToSave = new List<string>();

	// Token: 0x04000EE4 RID: 3812
	public bool canUseTwoWeapons;

	// Token: 0x04000EE5 RID: 3813
	public bool knowsNames;

	// Token: 0x04000EE6 RID: 3814
	public string savedMerchantList = "";

	// Token: 0x04000EE7 RID: 3815
	public int savedMerchantTime;

	// Token: 0x04000EE8 RID: 3816
	public string savedMerchantHistory = "";

	// Token: 0x04000EE9 RID: 3817
	public bool modalWindowsOpen;

	// Token: 0x04000EEA RID: 3818
	public bool hasCustomIdle;

	// Token: 0x04000EEB RID: 3819
	public int currentHand;

	// Token: 0x04000EEC RID: 3820
	public string familyBackground;

	// Token: 0x04000EED RID: 3821
	private int[] familyBackgrounds = new int[31];

	// Token: 0x04000EEE RID: 3822
	private IEnumerator levelUpCorout;

	// Token: 0x04000EEF RID: 3823
	public int killCount;

	// Token: 0x04000EF0 RID: 3824
	public int attackCount;

	// Token: 0x04000EF1 RID: 3825
	public int hitCount;

	// Token: 0x04000EF2 RID: 3826
	public int songPoints;

	// Token: 0x04000EF3 RID: 3827
	public bool semizenMagic;

	// Token: 0x04000EF4 RID: 3828
	public float lastActionModifier;

	// Token: 0x04000EF5 RID: 3829
	public float stamina;

	// Token: 0x04000EF6 RID: 3830
	public float maxStamina;

	// Token: 0x04000EF7 RID: 3831
	public float maxStaminaAdd;

	// Token: 0x04000EF8 RID: 3832
	public float staminaRegenMod;

	// Token: 0x04000EF9 RID: 3833
	public float staminaReductionMultiplier;

	// Token: 0x04000EFA RID: 3834
	public Vector3 savedIntercessionA;

	// Token: 0x04000EFB RID: 3835
	public Vector3 savedIntercessionB;

	// Token: 0x04000EFC RID: 3836
	public int savedIntercesion;

	// Token: 0x04000EFD RID: 3837
	[Header("EFFECTS")]
	public int stun;

	// Token: 0x04000EFE RID: 3838
	public int confuse;

	// Token: 0x04000EFF RID: 3839
	public int floating;

	// Token: 0x04000F00 RID: 3840
	public int flee;

	// Token: 0x04000F01 RID: 3841
	public int attackAllies;

	// Token: 0x04000F02 RID: 3842
	public int silent;

	// Token: 0x04000F03 RID: 3843
	public int invisible;

	// Token: 0x04000F04 RID: 3844
	public int stuck;

	// Token: 0x04000F05 RID: 3845
	public int charming;

	// Token: 0x04000F06 RID: 3846
	public int artistry;

	// Token: 0x04000F07 RID: 3847
	public int nimbleFingers;

	// Token: 0x04000F08 RID: 3848
	public int stagger;

	// Token: 0x04000F09 RID: 3849
	public int onlyLightAtks;

	// Token: 0x04000F0A RID: 3850
	public float actionTimeMod;

	// Token: 0x04000F0B RID: 3851
	public float rallySpeed;

	// Token: 0x04000F0C RID: 3852
	public float spiritAbsorption;

	// Token: 0x04000F0D RID: 3853
	public float allSkillAdd;

	// Token: 0x04000F0E RID: 3854
	public float deaf;

	// Token: 0x04000F0F RID: 3855
	public float blind;

	// Token: 0x04000F10 RID: 3856
	public float armorReduction;

	// Token: 0x04000F11 RID: 3857
	public float eqArmorReduction;

	// Token: 0x04000F12 RID: 3858
	public float reduceStun;

	// Token: 0x04000F13 RID: 3859
	public float musicResistMod;

	// Token: 0x04000F14 RID: 3860
	public Vector3 paganResist;

	// Token: 0x04000F15 RID: 3861
	public bool pinned;

	// Token: 0x04000F16 RID: 3862
	public bool pinning;

	// Token: 0x04000F17 RID: 3863
	public int pinHitCount;

	// Token: 0x04000F18 RID: 3864
	private ES3File saveFile;

	// Token: 0x04000F19 RID: 3865
	private List<string> savedStatsBag = new List<string>();

	// Token: 0x04000F1A RID: 3866
	private List<int> savedStatsBagPositions = new List<int>();

	// Token: 0x04000F1B RID: 3867
	private List<Vector3> savedStatsSockets = new List<Vector3>();

	// Token: 0x04000F1C RID: 3868
	private List<Vector4> savedStatsDurability = new List<Vector4>();

	// Token: 0x04000F1D RID: 3869
	private List<int> bagStacksToSave = new List<int>();

	// Token: 0x04000F1E RID: 3870
	private List<int> bag;

	// Token: 0x04000F1F RID: 3871
	private List<int> bagPositions;

	// Token: 0x04000F20 RID: 3872
	private List<Vector4> durability;

	// Token: 0x04000F21 RID: 3873
	private List<Vector3> sockets;

	// Token: 0x04000F22 RID: 3874
	public List<string> words = new List<string>();

	// Token: 0x04000F23 RID: 3875
	private int wordCount;

	// Token: 0x04000F24 RID: 3876
	public bool hasWordsOfPower;

	// Token: 0x04000F25 RID: 3877
	public bool hasSpells;

	// Token: 0x04000F26 RID: 3878
	private float lastGhostRoll;

	// Token: 0x04000F27 RID: 3879
	public bool hasCircleAnims;

	// Token: 0x04000F28 RID: 3880
	[Header("COMPANION AI")]
	public int magicTactics;

	// Token: 0x04000F29 RID: 3881
	public bool kiteInCombat;

	// Token: 0x04000F2A RID: 3882
	public bool defendMainInCombat;

	// Token: 0x04000F2B RID: 3883
	public bool stayNearPatrol;

	// Token: 0x04000F2C RID: 3884
	public Character defendingCharacter;

	// Token: 0x04000F2D RID: 3885
	public GraphNode stayNearPoint;

	// Token: 0x04000F2E RID: 3886
	public bool useUtilityAbilities;

	// Token: 0x04000F2F RID: 3887
	public bool hasBuffItem;

	// Token: 0x04000F30 RID: 3888
	public bool hasDefenseAbilities;

	// Token: 0x04000F31 RID: 3889
	public bool hasHealingSongs;

	// Token: 0x04000F32 RID: 3890
	public bool hasUndeadAbilities;

	// Token: 0x04000F33 RID: 3891
	public bool hasBuffAbilities;

	// Token: 0x04000F34 RID: 3892
	public bool hasUtilityAbilities;

	// Token: 0x04000F35 RID: 3893
	public bool canCharm;

	// Token: 0x04000F36 RID: 3894
	public bool merchant;

	// Token: 0x04000F37 RID: 3895
	public int companionAI;

	// Token: 0x04000F38 RID: 3896
	public int formationGroup = 5;

	// Token: 0x04000F39 RID: 3897
	public bool isGuard;

	// Token: 0x04000F3A RID: 3898
	public bool isHouseGuard;

	// Token: 0x04000F3B RID: 3899
	public bool isLazureGuard;

	// Token: 0x04000F3C RID: 3900
	public int useItemsAI;

	// Token: 0x04000F3D RID: 3901
	public int autoBuffsAI;

	// Token: 0x04000F3E RID: 3902
	public int autoCritsAI;

	// Token: 0x04000F3F RID: 3903
	public bool isLeader;

	// Token: 0x04000F40 RID: 3904
	public bool autoCastAI;

	// Token: 0x04000F41 RID: 3905
	public float synergy1 = 10f;

	// Token: 0x04000F42 RID: 3906
	public float synergy2 = 20f;

	// Token: 0x04000F43 RID: 3907
	public bool isFishMonster;

	// Token: 0x04000F44 RID: 3908
	public bool hasHitAI;

	// Token: 0x04000F45 RID: 3909
	public bool hasNonCombatAI;

	// Token: 0x04000F46 RID: 3910
	public bool hasCustomAI;

	// Token: 0x04000F47 RID: 3911
	public bool hasEveryAttackAI;

	// Token: 0x04000F48 RID: 3912
	public bool canJumpEvade;

	// Token: 0x04000F49 RID: 3913
	public bool leaveBehindTiles;

	// Token: 0x04000F4A RID: 3914
	public bool canCharge;

	// Token: 0x04000F4B RID: 3915
	public bool canPin;

	// Token: 0x04000F4C RID: 3916
	public bool canAggressionGroup;

	// Token: 0x04000F4D RID: 3917
	public bool canSecretGroup;

	// Token: 0x04000F4E RID: 3918
	public bool canRecoverGroup;

	// Token: 0x04000F4F RID: 3919
	public bool needsDefending;

	// Token: 0x04000F50 RID: 3920
	public string customAI;

	// Token: 0x04000F51 RID: 3921
	public string everyAttackAI;

	// Token: 0x04000F52 RID: 3922
	public string nonCombatAI;

	// Token: 0x04000F53 RID: 3923
	public bool boro;

	// Token: 0x04000F54 RID: 3924
	private float summonSpeed;
}
