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

// Token: 0x02000021 RID: 33
public class Combat : MonoBehaviour
{
	// Token: 0x0600049B RID: 1179 RVA: 0x00067BED File Offset: 0x00065DED
	private void Start()
	{
		this.party = Links.x.party;
		this.currentTileEffects = Links.x.cellar.currentTileEffects;
	}

	// Token: 0x0600049C RID: 1180 RVA: 0x00067C14 File Offset: 0x00065E14
	private void Update()
	{
		if (this.slowingTime)
		{
			if (this.slowSpeed == 0f)
			{
				this.slowSpeed = 5f;
			}
			float num = this.slowSpeed * (1.5f - Time.timeScale);
			if (this.timeTarget == 1f)
			{
				num = 200f * Time.timeScale;
			}
			if (num <= 0f)
			{
				num = 0.05f;
			}
			if (this.timeTarget < 1f && this.timeScale < this.timeTarget + 0.05f && !this.startTimeHold && !this.slowingTimeForLastDeath)
			{
				this.startTimeHold = true;
				this.startTimeHoldDeltaTime = Time.timeSinceLevelLoad;
			}
			if (this.startTimeHold)
			{
				Time.timeScale = this.timeTarget;
				if (Time.timeSinceLevelLoad > this.startTimeHoldDeltaTime + 0.25f)
				{
					this.startTimeHold = false;
					if (!Records.x.pocketPause)
					{
						Links.x.rtsCamera.Zoom(false, "");
					}
					this.timeTarget = 1f;
				}
			}
			else
			{
				this.timeScale = Mathf.Lerp(this.timeScale, this.timeTarget, Time.deltaTime * num);
				Time.timeScale = this.timeScale;
			}
			if (this.timeTarget == 1f && this.timeScale > 0.9f)
			{
				Time.timeScale = 1f;
				this.slowingTime = false;
				MasterAudio.PlaySoundAndForget("Slow Time End", 1f, new float?(1f), 0f, "", null);
			}
		}
		if (!Records.x.combat)
		{
			this.CheckReduceHostilities(false);
		}
		if (this.showDebugs)
		{
			this.showDebugs = false;
			for (int i = 0; i < this.characters.Count; i++)
			{
				if (this.characters[i] && this.characters[i].actions)
				{
					this.characters[i].actions.ai.ShowDebug();
				}
			}
		}
		if (Records.x.combat && !this.combatCinematics && this.combatStart == null && !this.slowTimePause && !Records.x.waitForResurrect && !Records.x.mainCharacterDead && Links.x.gaia.sceneLoaded && !this.inRally && !this.inPocketAttack && this.combatEnd == null)
		{
			this.npcCount = 0;
			for (int j = 0; j < this.characters.Count; j++)
			{
				if (!this.characters[j])
				{
					this.characters.RemoveAt(j);
					this.charactersLastActionTime.RemoveAt(j);
					j--;
				}
				else if (this.characters[j].npc && this.characters[j].inCombat && !this.characters[j].vipFollow)
				{
					this.npcCount++;
				}
			}
			this.CheckToMakeNewGroup();
			this.CheckOnlyNPCs();
			if (!Links.x.soundtrack.currentSoundtrack.Contains("Combat") && this.npcsInCombat && !Records.x.removeControls && !this.npcOnlyCombat)
			{
				Links.x.gaia.SetPlaylist("Combat", true, 0.75f);
				MasterAudio.PlaySoundAndForget("Dome Open", 1f, new float?(1f), 0f, "", null);
				MasterAudio.PlaySoundAndForget("Combat Starts", 1f, new float?(1f), 0f, "", null);
				MasterAudio.PlaySoundAndForget("Combat Start", 1f, new float?(1f), 0f, "", null);
			}
			if (this.npcCount > 0 && !this.npcOnlyCombat)
			{
				this.preDome = false;
				this.npcsInCombat = true;
				this.playerStartedCombat = false;
				this.attackingInteractiveOutsideOfCombat = false;
			}
			else if (!this.npcsInCombat)
			{
				this.preDome = true;
			}
			if (Records.x.secrets && Input.GetKeyDown(KeyCode.B))
			{
				Debug.Log(string.Concat(new string[]
				{
					"Combat info ",
					this.npcsInCombat.ToString(),
					" ",
					this.npcCount.ToString(),
					" ",
					this.preDome.ToString(),
					" ",
					this.inRally.ToString()
				}));
				for (int k = 0; k < this.characters.Count; k++)
				{
					string text = "\nCombatant ";
					Character character = this.characters[k];
					Debug.Log(text + ((character != null) ? character.ToString() : null));
				}
			}
			if (this.npcsInCombat)
			{
				this.preDome = false;
			}
			if ((this.npcCount == 0 || this.npcOnlyCombat) && !this.playerStartedCombat && !this.preDome && !this.inRally && !this.inPocketAttack)
			{
				this.EndCombat(false);
			}
			this.CheckHudButtons(this.npcCount);
			int num2 = -1;
			if (this.targetUpdateTime <= 0f)
			{
				if (!this.hoverShowTargets)
				{
					this.GetTargets(false, false, null);
				}
				this.targetUpdateTime = 4f;
			}
			else
			{
				this.GetNodeCalled();
				this.targetUpdateTime -= 1f;
			}
			this.TargetsAnytime();
			if (!Records.x.turnBased)
			{
				for (int l = 0; l < this.needsTurn.Count; l++)
				{
					if (num2 == -1 && !Records.x.paused && !Records.x.removeControls && !Records.x.holdCombat && !Records.x.dialogue && !Records.x.pocketPause)
					{
						Character character2 = this.needsTurn[l];
						if (character2 && character2.hasActions && !character2.turning && !character2.stats.pinned && !character2.stats.pinning && !character2.body.IsHit())
						{
							bool flag = true;
							if (!character2.IsSentient())
							{
								flag = false;
							}
							this.SendTurnEvents(character2);
							if (!flag)
							{
								if (character2.timelineIcon)
								{
									character2.timelineIcon.offsetTime = 0f;
									character2.timelineIcon.Beginning();
								}
								num2 = l;
							}
							else
							{
								num2 = l;
								this.waitingForOverlap = false;
								this.SetCharacterInTurn(true);
								this.StartCharacterTurn(character2);
							}
						}
					}
				}
				if (num2 > -1 && num2 < this.needsTurn.Count)
				{
					this.needsTurn.RemoveAt(num2);
				}
			}
			if (Records.x.turnBased)
			{
				if (this.shaderFlash)
				{
					if (!Records.x.playerTurn)
					{
						this.shaderFlash = false;
						Shader.SetGlobalFloat("_TurnFlash", 0f);
					}
					if (this.shaderFlashTarget == 0f && this.shaderTimeFlash < 0.05f)
					{
						this.shaderFlashTarget = 1f;
					}
					if (this.shaderFlashTarget == 1f && this.shaderTimeFlash > 0.95f)
					{
						this.shaderFlashTarget = 0f;
					}
					float num3 = 4f;
					if (this.shaderFlashTarget == 0f)
					{
						num3 = 4f;
					}
					this.shaderTimeFlash = Mathf.Lerp(this.shaderTimeFlash, this.shaderFlashTarget, Time.deltaTime * num3);
					Shader.SetGlobalFloat("_TurnFlash", this.shaderTimeFlash);
				}
				this.domeTr.Rotate(new Vector3(0f, 10f * Time.deltaTime, 3f * Time.deltaTime));
				if (!this.characterInTurn)
				{
					num2 = -1;
					if (this.delayedAttacks.Count > 0 && this.overlapping.Count == 0)
					{
						this.currentTurnCharacter = this.delayedAttacks[0];
						this.SetCharacterInTurn(true);
						this.currentTurnCharacter.actions.StartAttackFromDelay();
						this.delayedAttacks.RemoveAt(0);
						num2 = -2;
					}
					for (int m = 0; m < this.needsTurn.Count; m++)
					{
						if (num2 == -1)
						{
							Character character3 = this.needsTurn[m];
							if (character3)
							{
								if (this.overlapping.Count > 0 && !character3.npc)
								{
									num2 = -2;
									this.waitingForOverlap = true;
									break;
								}
								if (character3.hasActions && !character3.overlapping)
								{
									bool flag2 = true;
									if (!character3.IsSentient())
									{
										flag2 = false;
									}
									this.SendTurnEvents(character3);
									if (!flag2)
									{
										character3.timelineIcon.offsetTime = 0f;
										character3.timelineIcon.Beginning();
										num2 = m;
									}
									else
									{
										num2 = m;
										this.waitingForOverlap = false;
										this.SetCharacterInTurn(true);
										this.StartCharacterTurn(character3);
									}
								}
							}
						}
					}
					if (num2 > -1)
					{
						this.needsTurn.RemoveAt(num2);
					}
					if (this.waitingForOverlap)
					{
						int num4 = 0;
						for (int n = 0; n < this.overlapping.Count; n++)
						{
							if (this.overlapping[n] && this.overlapping[n].IsSentient())
							{
								num4++;
							}
						}
						if (num4 == 0)
						{
							this.waitingForOverlap = false;
						}
					}
				}
			}
			if (Time.timeSinceLevelLoad > this.characterAddedTime + 0.5f && this.characterAddedTime > 0f && Links.x.gaia.sceneLoaded)
			{
				for (int num5 = 0; num5 < this.characters.Count; num5++)
				{
					Character character4 = this.characters[num5];
					if (character4 && !character4.dead && !character4.stunned && character4.hasActions && !character4.actions.combatStartPassives && (character4.npc || this.npcCount > 0))
					{
						character4.actions.combatStartPassives = true;
						int num6;
						character4.stats.CheckForSongsAndWords("CombatStart", out num6);
					}
				}
				this.characterAddedTime = Time.timeSinceLevelLoad;
			}
			float seconds = Links.x.gameplay.seconds;
			for (int num7 = 0; num7 < this.characters.Count; num7++)
			{
				Character character5 = this.characters[num7];
				if (character5 && !character5.mainSelected && character5.IsSentient() && character5.attackTime >= 1f && !character5.inAction && !character5.inQueuedAbility && !character5.inRecovery && !character5.moving && !character5.isHit && !character5.turning && !character5.dodging && character5.waitingForPath == 0 && !character5.jumping && !character5.searching && !character5.missing)
				{
					bool flag3 = false;
					if (character5.actions)
					{
						if (character5.actions.ai.findingAction && seconds > 100f + character5.actions.ai.findingActionTime)
						{
							flag3 = true;
						}
						if (character5.timelineIcon && (character5.timelineIcon.Nothing() || flag3) && seconds > this.charactersLastActionTime[num7] + 150f && character5.actions && !character5.actions.chargeUpFX && !character5.actions.ai.jumping && !character5.actions.ai.busy && (!character5.actions.ai.findingAction || flag3) && !this.needsTurn.Contains(character5))
						{
							this.GetNextAction(character5);
							this.charactersLastActionTime[num7] = seconds;
						}
					}
				}
			}
		}
		else if (Records.x.pocketPause)
		{
			if (this.targetUpdateTime <= 0f)
			{
				if (!this.hoverShowTargets)
				{
					this.GetTargets(false, false, null);
				}
				this.targetUpdateTime = 4f;
			}
			else
			{
				this.targetUpdateTime -= 1f;
			}
		}
		if (!Records.x.combat && !Records.x.removeControls && (Links.x.soundtrack.currentSoundtrack.Contains("Combat") || Links.x.soundtrack.currentSong.Contains("Combat")))
		{
			Links.x.gaia.FadeOutPlaylist(true, 0.5f);
			Links.x.gaia.SetEnvironmentPlaylist(Links.x.gameplay.sailing, Links.x.main.inTown, true);
		}
		if (!this.combatCinematics)
		{
			this.centralEnemyPosition = Vector3.zero;
			int num8 = 0;
			bool flag4 = false;
			for (int num9 = 0; num9 < this.characters.Count; num9++)
			{
				if (this.characters[num9])
				{
					if (this.characters[num9].actions && !this.characters[num9].dead && !this.characters[num9].stunned)
					{
						if (this.characters[num9].actions.startSearchTime > 0f)
						{
							this.characters[num9].actions.CheckSearchTime();
						}
						if (this.characters[num9].npc)
						{
							num8++;
							this.centralEnemyPosition += this.characters[num9].currentPosition;
						}
					}
					else
					{
						this.characters[num9] = null;
						if (num9 < this.charactersLastActionTime.Count && num9 > -1)
						{
							this.charactersLastActionTime[num9] = -1f;
						}
						flag4 = true;
					}
				}
			}
			if (num8 > 0)
			{
				this.centralEnemyPosition /= (float)num8;
			}
			if (flag4)
			{
				this.characters.RemoveAll((Character item) => item == null);
				this.charactersLastActionTime.RemoveAll((float item) => item == -1f);
			}
		}
	}

	// Token: 0x0600049D RID: 1181 RVA: 0x00068B48 File Offset: 0x00066D48
	public void Enraged()
	{
		int num = 0;
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && character.enraged)
			{
				num++;
			}
		}
		for (int j = 0; j < this.characters.Count; j++)
		{
			Character character = this.characters[j];
			if (character && character.npc && !character.summoned && character.IsSentient() && character.visible == 1 && !character.ghost && character.stats.magicPointsBase == 0 && !character.stats.defendMainInCombat && !character.stats.isLeader && character.hostility >= 2 && num < 1)
			{
				bool flag = false;
				int num2 = 35;
				if (!character.stats.animal)
				{
					num2 = 50;
				}
				if (Random.Range(0, num2) == 0 || flag)
				{
					num++;
					character.enraged = true;
					if (character.inCircle && character.group)
					{
						character.group.LeaveCircle(character);
					}
					Effects effects = character.gameObject.AddComponent<Effects>();
					Links.x.cellar.AddEffects(effects);
					effects.gameObject.SetActive(true);
					effects.source = character;
					effects.target = character;
					effects.fromLoad = false;
					effects.effectName = "Enraged";
					effects.sourceLevel = (float)character.combatLevel;
					effects.Inflicted(false);
					Links.x.rtsCamera.StartShake("");
					MasterAudio.PlaySoundAndForget("Enraged", 1f, new float?(1f), 0f, "", null);
					character.PlaySoundFX(0, 2);
					Animator animatedText = Links.x.cellar.GetAnimatedText("SmallDmg", "Enraged!", false);
					animatedText.gameObject.transform.position = character.body.HeadPosition(0f) + new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), 0f);
					animatedText.gameObject.SetActive(true);
					this.str.Clear();
					this.str.Append(character.stats.GetName());
					this.str.Append(" enraged! ");
					Links.x.gameFeed.AddFeed(this.str.ToString());
					if (character.creatures && character.creatures.creatures.pickOneLeader)
					{
						Character defendingCharacter = character.stats.defendingCharacter;
						string text = "Current leader ";
						Character character2 = defendingCharacter;
						Debug.Log(text + ((character2 != null) ? character2.ToString() : null));
						if (!defendingCharacter)
						{
							character.creatures.SetNewFirstLeader(character);
							effects.timeToWait = 50;
						}
						if (defendingCharacter)
						{
							Debug.Log("Current leader " + defendingCharacter.dead.ToString());
							if (defendingCharacter.dead || defendingCharacter.stunned || defendingCharacter.stats.HealthCurrent() <= 0)
							{
								character.creatures.SetNewFirstLeader(character);
							}
						}
					}
				}
			}
		}
	}

	// Token: 0x0600049E RID: 1182 RVA: 0x00068EC4 File Offset: 0x000670C4
	public void StartCharacterTurn(Character character)
	{
		if (character.npc)
		{
			character.actions.ChooseAction();
			if (Records.x.turnBased)
			{
				Records.x.playerTurn = false;
				Records.x.RemoveControls(true);
				this.SwitchUI("NPC");
				this.ClearTargets();
				this.currentTurnCharacter = character;
				return;
			}
		}
		else
		{
			character.actions.ChooseAction();
		}
	}

	// Token: 0x0600049F RID: 1183 RVA: 0x00068F2C File Offset: 0x0006712C
	public void StartSlowTime(string type)
	{
		if (Time.timeScale == 1f && !this.slowingTime)
		{
			this.slowingTime = true;
			MasterAudio.PlaySoundAndForget("Slow Time Start", 1f, new float?(1f), 0f, "", null);
			this.timeTarget = 0.25f;
			this.startTime = Time.deltaTime;
			this.slowSpeed = 10f;
			if (type == "")
			{
				this.slowSpeed = 10f;
				this.slowTimeHold = false;
				this.slowTimePause = true;
			}
			if (type == "Critical")
			{
				this.slowSpeed = 8f;
				this.slowTimeHold = false;
				this.slowTimePause = true;
			}
			if (type == "Rally")
			{
				this.slowSpeed = 20f;
			}
			type == "Synergy";
			if (this.slowingTimeForLastDeath)
			{
				this.slowSpeed = 5f;
				this.timeTarget = 0.5f;
				Links.x.hudControl.ChangeHudVisibility(false, true);
				Links.x.gameCard.End();
				Links.x.itemCard.End();
				Links.x.hudControl.timelineAnimator.Play("Timeline End");
				Records.x.mainCharacterDead = true;
				if (Records.x.turnBased)
				{
					Records.x.RemoveControls(true);
				}
				for (int i = 0; i < this.timelineIcons.Count; i++)
				{
					if (this.timelineIcons[i])
					{
						this.timelineIcons[i].SetAsActive(false);
					}
				}
				Links.x.gaia.FadeOutPlaylist(true, 0.5f);
				Links.x.gaia.FadeOutPlaylist(false, 0.5f);
			}
			if (!Records.x.pocketPause)
			{
				Links.x.rtsCamera.Zoom(true, "");
			}
		}
	}

	// Token: 0x060004A0 RID: 1184 RVA: 0x00069129 File Offset: 0x00067329
	public void EndSlowTime()
	{
		this.slowTimeHold = false;
	}

	// Token: 0x060004A1 RID: 1185 RVA: 0x00069134 File Offset: 0x00067334
	public void AddPartyToTurnList()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].IsSentient() && !this.party[i].isBoro && !this.party[i].inAction && !this.party[i].inRecovery && !this.party[i].actions.hasTarget && !this.needsTurn.Contains(this.party[i]) && this.party[i].actions.GetTarget() == null)
			{
				this.GetNextAction(this.party[i]);
			}
		}
		if (Links.x.gaia.boroControls)
		{
			Links.x.gaia.boroControls.LeavingForCombat();
		}
	}

	// Token: 0x060004A2 RID: 1186 RVA: 0x00069250 File Offset: 0x00067450
	public void SetCharacterInTurn(bool state)
	{
		if (Records.x.turnBased)
		{
			this.characterInTurn = state;
		}
	}

	// Token: 0x060004A3 RID: 1187 RVA: 0x00069268 File Offset: 0x00067468
	public void SendTurnEvents(Character source)
	{
		int count = this.currentTileEffects.Count;
		this.currentTileEffectsTemp.Clear();
		for (int i = 0; i < count; i++)
		{
			this.currentTileEffectsTemp.Add(this.currentTileEffects[i]);
		}
	}

	// Token: 0x060004A4 RID: 1188 RVA: 0x000692B0 File Offset: 0x000674B0
	public void Projectile(Projectile projectile, bool adding)
	{
		int num = this.projectiles.IndexOf(projectile);
		if (adding)
		{
			if (num == -1)
			{
				this.projectiles.Add(projectile);
				return;
			}
		}
		else if (num > -1)
		{
			this.projectiles.RemoveAt(num);
		}
	}

	// Token: 0x060004A5 RID: 1189 RVA: 0x000692F0 File Offset: 0x000674F0
	public void RemoveFromNeedsTurn(Character character)
	{
		int num = this.needsTurn.IndexOf(character);
		if (num > -1)
		{
			this.needsTurn.RemoveAt(num);
		}
	}

	// Token: 0x060004A6 RID: 1190 RVA: 0x0006931C File Offset: 0x0006751C
	public void GetNextAction(Character character)
	{
		if (character.mainSelected && !Records.x.cyclingAttacks && !Records.x.freeAttack)
		{
			return;
		}
		if (this.needsTurn.IndexOf(character) == -1)
		{
			this.needsTurn.Add(character);
		}
		int num = this.characters.IndexOf(character);
		if (num > -1 && this.charactersLastActionTime.Count < num)
		{
			this.charactersLastActionTime[num] = Links.x.gameplay.seconds;
		}
	}

	// Token: 0x060004A7 RID: 1191 RVA: 0x000693A0 File Offset: 0x000675A0
	public void RemoveFromPartyLists(Character character)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i])
			{
				this.party[i].RemoveLKPlayer(character);
				if (this.party[i].GetLKPCount() == 0 && this.party[i].actions)
				{
					this.party[i].actions.EndActions();
				}
			}
		}
	}

	// Token: 0x060004A8 RID: 1192 RVA: 0x0006942C File Offset: 0x0006762C
	public void EndEnemyTurn(Character character, bool setIconAtBeginning)
	{
		Records.x.playerTurn = false;
		character.ToggleArrow(false);
		character.centerOfAttention = false;
		character.CircleAnimation("");
		character.EndTurn();
		if (setIconAtBeginning && character.timelineIcon)
		{
			character.timelineIcon.offsetTime = 0f;
			character.timelineIcon.Beginning();
		}
		this.SetCharacterInTurn(false);
		this.currentTurnCharacter = null;
	}

	// Token: 0x060004A9 RID: 1193 RVA: 0x0006949C File Offset: 0x0006769C
	public void EndEnemyTurnFromOverlap(Character character)
	{
		if (Records.x.turnBased)
		{
			character.ToggleArrow(false);
			character.centerOfAttention = false;
			character.CircleAnimation("");
			character.timelineIcon.Beginning();
			character.EndTurn();
			int num = this.overlapping.IndexOf(character);
			if (num > -1)
			{
				this.overlapping.RemoveAt(num);
			}
		}
	}

	// Token: 0x060004AA RID: 1194 RVA: 0x000694FC File Offset: 0x000676FC
	public void TriggerNextEnemy(Character character)
	{
		this.SetCharacterInTurn(false);
		character.timelineIcon.SetAtBeginningPosition();
		this.currentTurnCharacter = null;
		if (Records.x.turnBased)
		{
			if (this.overlapping.Count == 0)
			{
				for (int i = 0; i < this.timelineIcons.Count; i++)
				{
					this.timelineIcons[i].RecordOffset();
				}
			}
			if (this.overlapping.IndexOf(character) == -1 && character.stats.Stuck() == 0)
			{
				this.overlapping.Add(character);
				return;
			}
			this.EndEnemyTurnFromOverlap(character);
		}
	}

	// Token: 0x060004AB RID: 1195 RVA: 0x00069594 File Offset: 0x00067794
	public void RemoveTimelineIcon(Character character)
	{
		int num = this.overlapping.IndexOf(character);
		if (num > -1)
		{
			this.overlapping.RemoveAt(num);
		}
		num = this.needsTurn.IndexOf(character);
		if (num > -1)
		{
			this.needsTurn.RemoveAt(num);
		}
		num = this.delayedAttacks.IndexOf(character);
		if (num > -1)
		{
			this.delayedAttacks.RemoveAt(num);
		}
	}

	// Token: 0x060004AC RID: 1196 RVA: 0x000695F8 File Offset: 0x000677F8
	public void AddDelayedAttack(Character character)
	{
		if (this.delayedAttacks.IndexOf(character) == -1)
		{
			this.delayedAttacks.Add(character);
		}
		this.SetCharacterInTurn(false);
	}

	// Token: 0x060004AD RID: 1197 RVA: 0x0006961C File Offset: 0x0006781C
	public void EndTurn(bool immediate, Character endTurnCharacter, bool setIconAtBeginning)
	{
		endTurnCharacter.EndTurn();
		if (Records.x.turnBased)
		{
			setIconAtBeginning = true;
		}
		if (endTurnCharacter.timelineIcon && setIconAtBeginning)
		{
			endTurnCharacter.timelineIcon.offsetTime = 0f;
			if (endTurnCharacter.hasActions && !endTurnCharacter.actions.choosingTurn)
			{
				endTurnCharacter.timelineIcon.Beginning();
			}
		}
		if (Records.x.turnBased)
		{
			if (!this.currentTurnCharacter)
			{
				return;
			}
			if (this.currentTurnCharacter.npc)
			{
				return;
			}
			Records.x.playerTurn = false;
			Records.x.RemoveControls(true);
			this.currentTurnCharacter.ToggleArrow(false);
			this.currentTurnCharacter.EndTurn();
			this.ClearTargets();
			bool flag = false;
			for (int i = 0; i < this.characters.Count; i++)
			{
				if (this.characters[i] && this.characters[i].npc && this.characters[i].inCombat)
				{
					flag = true;
					break;
				}
			}
			this.ClearTargets();
			if (!flag && !this.combatCinematics && this.preDome)
			{
				Character character = Links.x.protagonist;
				if (!Links.x.hasMain)
				{
					character = Links.x.GetNearestParty(Links.x.follow.position);
				}
				this.StartCombat(null, character, true, false);
			}
			this.currentTurnCharacter.centerOfAttention = false;
			this.currentTurnCharacter.CircleAnimation("");
			this.currentTurnCharacter = null;
			this.SetCharacterInTurn(false);
		}
	}

	// Token: 0x060004AE RID: 1198 RVA: 0x000697B0 File Offset: 0x000679B0
	public void SwitchUI(string current)
	{
		if (!Records.x.turnBased)
		{
			return;
		}
		if (current == "Party")
		{
			Links.x.domeAnimator.SetBool("None", false);
			Links.x.domeAnimator.SetBool("NPC", false);
			int count = this.domeMeshes.Count;
			for (int i = 0; i < count; i++)
			{
				this.domeMeshes[i].sharedMaterial = this.radiusGemPlayerTurn;
			}
			return;
		}
		if (current == "NPC")
		{
			Links.x.domeAnimator.SetBool("None", false);
			Links.x.domeAnimator.SetBool("NPC", true);
			int count2 = this.domeMeshes.Count;
			for (int j = 0; j < count2; j++)
			{
				this.domeMeshes[j].sharedMaterial = this.radiusGemEnemyTurn;
			}
			return;
		}
		if (current == "None")
		{
			Links.x.domeAnimator.SetBool("NPC", false);
			Links.x.domeAnimator.SetBool("None", true);
			int count3 = this.domeMeshes.Count;
			for (int k = 0; k < count3; k++)
			{
				this.domeMeshes[k].sharedMaterial = this.radiusGemNoTurn;
			}
		}
	}

	// Token: 0x060004AF RID: 1199 RVA: 0x00069908 File Offset: 0x00067B08
	public bool PartyNearTimelineEnd()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].timelineIcon && this.party[i].timelineIcon.t > 0.7f)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004B0 RID: 1200 RVA: 0x00069978 File Offset: 0x00067B78
	public void CheckHudButtons(int x)
	{
		if (Records.x.turnBased)
		{
			if (Records.x.canLeaveCombat || x == 0)
			{
				if (!this.doveObject.activeSelf)
				{
					this.doveObject.SetActive(true);
				}
			}
			else if (this.doveObject.activeSelf)
			{
				this.doveObject.SetActive(false);
			}
			if (Records.x.playerTurn && x > 0)
			{
				if (!this.endTurnObject.activeSelf)
				{
					this.endTurnObject.SetActive(true);
					return;
				}
			}
			else if (this.endTurnObject.activeSelf)
			{
				this.endTurnObject.SetActive(false);
			}
		}
	}

	// Token: 0x060004B1 RID: 1201 RVA: 0x00069A1C File Offset: 0x00067C1C
	public int PartyTurnsLeft()
	{
		int num = 0;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].outsideDome && !this.party[i].waitingToJoinDome && this.party[i].CanMakePath() && this.party[i].CanChooseActions())
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x060004B2 RID: 1202 RVA: 0x00069AA8 File Offset: 0x00067CA8
	private void CheckOnlyNPCs()
	{
		bool flag = false;
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && this.characters[i].npc)
			{
				flag = true;
			}
		}
		if (flag)
		{
			for (int j = 0; j < this.characters.Count; j++)
			{
				if (this.characters[j] && this.characters[j].npc && this.characters[j].HasPartyLKP())
				{
					flag = false;
					break;
				}
			}
		}
		this.npcOnlyCombat = flag;
	}

	// Token: 0x060004B3 RID: 1203 RVA: 0x00069B54 File Offset: 0x00067D54
	public void AddParty(Character character, bool searching, Character firstTarget, bool setIconAtBeginning)
	{
		if (Records.x.combatConsoleDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				"Add to combat: ",
				(character != null) ? character.ToString() : null,
				", is searching? ",
				searching.ToString(),
				", first target is:  ",
				(firstTarget != null) ? firstTarget.ToString() : null,
				" ",
				character.visible.ToString()
			}));
		}
		if (character.missing)
		{
			return;
		}
		if (character.isBoro)
		{
			return;
		}
		if (character.party && Records.x.holdCombat)
		{
			return;
		}
		if (!character.IsSentient())
		{
			return;
		}
		if (character.ghost && character.ghostVanishing)
		{
			return;
		}
		if (character.ambushing && !character.jumping)
		{
			return;
		}
		if (character.inactive)
		{
			return;
		}
		if (Links.x.gaia.waitingToRemoveScene)
		{
			return;
		}
		if (Records.x.miniGame && !this.miniGameCharacters.Contains(character))
		{
			return;
		}
		if (character.npc && (character.attackingUntilBribe || character.hostility == 2))
		{
			foreach (Character character2 in this.party)
			{
				bool hasActions = character2.hasActions;
			}
		}
		this.CheckOnlyNPCs();
		if (!searching)
		{
			this.characterAddedTime = Time.timeSinceLevelLoad;
		}
		int num = this.characters.IndexOf(character);
		if (num == -1)
		{
			this.characters.Add(character);
			this.charactersLastActionTime.Add(Links.x.gameplay.seconds);
			if (!character.actions && !character.isBoro)
			{
				Links.x.sensory.LookAtObject(base.transform, 30f, false, character, 4f, 0.5f, null, 3);
				Actions actions = character.gameObject.AddComponent<Actions>();
				AttackAI attackAI = character.gameObject.AddComponent<AttackAI>();
				actions.ai = attackAI;
				attackAI.character = character;
				actions.character = character;
				actions.invRow = character.invRow1;
				attackAI.actions = actions;
				character.actions = actions;
				attackAI.StartCombat();
				character.hasActions = true;
				character.ToggleCombatAnimator(true);
				if (!character.IsWalking() && !character.inAction && !character.inRecovery && !character.inQueuedAbility)
				{
					character.PlayIdle();
				}
				character.GetStaminaBar();
			}
			if (character.npc)
			{
				this.playerStartedCombat = false;
			}
			character.actions.character = character;
			if (character.dayNightVanishing && !character.inCircle)
			{
				character.EndPath();
			}
			if (this.HasTimelineIcon(character) && !character.mainSelected)
			{
				character.timelineIcon.Beginning();
			}
		}
		if (character.actions)
		{
			character.hasActions = true;
			character.actions.endActionsAfterTurn = false;
		}
		if (Records.x.combatConsoleDebugging)
		{
			Debug.Log(string.Concat(new string[]
			{
				"Adding character to combat ",
				(character != null) ? character.ToString() : null,
				" targeting ",
				(firstTarget != null) ? firstTarget.ToString() : null,
				" ",
				searching.ToString(),
				" ",
				num.ToString(),
				" ",
				character.GetLKPCount().ToString()
			}));
		}
		num = this.characters.IndexOf(character);
		if (character.mainSelected && firstTarget && !firstTarget.party)
		{
			Links.x.hudControl.ToggleAttackTimer(true);
		}
		character.body.SetSeeThroughAmount();
		if (character.npc && !searching && !character.inCombat)
		{
			if (!this.HasTimelineIcon(character))
			{
				TimelineIcon timelineIconEnemy = Links.x.cellar.GetTimelineIconEnemy();
				timelineIconEnemy.Setup(character, num, setIconAtBeginning);
				this.timelineIcons.Add(timelineIconEnemy);
			}
			if (character.hostility == 1)
			{
				Records.x.UpdateBribeState(character);
			}
			if (character.searching && !character.inCircle)
			{
				character.EndPath();
			}
			if (character.npc && character.sailing && character.boatNavigator)
			{
				character.boat.StopBoat();
			}
			if (character.heard)
			{
				Links.x.cellar.ReturnPooledGameObject(22, character.heard);
				character.heard.SetActive(false);
				character.heard = null;
			}
			character.StartQuip("NPC Seen");
			character.inCombat = true;
			character.searching = false;
			if ((character.npc || (!character.npc && Records.x.ai == 1)) && !this.npcOnlyCombat && !character.jumping && !character.resting && !character.animator.GetBool("Combat"))
			{
				character.PlayAnimation("CombatStart", 0f);
			}
			character.ClearMoveTargets();
			character.ToggleCombatAnimator(true);
			character.centerOfAttention = false;
			character.CircleAnimation("");
		}
		if (character.npc && !searching && firstTarget)
		{
			Links.x.sensory.AddNoise(character.gameObject, character.node, "Combat Aggro", firstTarget);
		}
		if (character.npc && searching && !character.searching && !character.inCombat)
		{
			character.StartQuip("NPC Heard");
			character.searching = true;
			if (!character.inCircle)
			{
				character.PlayAnimation("Heard", 0f);
			}
			character.ToggleCombatAnimator(true);
			if (character.hasActions)
			{
				character.actions.StartSearch(firstTarget);
			}
		}
		if (!character.npc && !character.isBoro)
		{
			if (!this.HasTimelineIcon(character))
			{
				TimelineIcon timelineIcon = Links.x.cellar.GetTimelineIcon();
				timelineIcon.Setup(character, num, setIconAtBeginning);
				this.timelineIcons.Add(timelineIcon);
			}
			character.inCombat = true;
			character.HasBuffItem();
		}
		bool flag = false;
		if (this.characterStartingAttack == character)
		{
			flag = true;
		}
		character.StartCombat(firstTarget, flag);
		if (character.actions)
		{
			character.actions.ai.actionCount = 0;
		}
	}

	// Token: 0x060004B4 RID: 1204 RVA: 0x0006A190 File Offset: 0x00068390
	public void GivePartyActions(Character character, bool needsAction)
	{
		if (Records.x.turnBased)
		{
			if (this.characters.IndexOf(character) == -1)
			{
				this.characters.Add(character);
				this.charactersLastActionTime.Add(Links.x.gameplay.seconds);
				if (!character.actions)
				{
					Actions actions = character.gameObject.AddComponent<Actions>();
					AttackAI attackAI = character.gameObject.AddComponent<AttackAI>();
					actions.ai = attackAI;
					attackAI.character = character;
					actions.character = character;
					actions.ResetAction();
					attackAI.StartCombat();
					attackAI.actions = actions;
					character.actions = actions;
					character.hasActions = true;
				}
				if (character.npc)
				{
					this.playerStartedCombat = false;
				}
				character.actions.character = character;
			}
			Debug.Log("Adding actions to " + ((character != null) ? character.ToString() : null));
			return;
		}
		this.AddParty(character, false, null, false);
		Links.x.hudControl.timelineAnimator.Play("Timeline Start");
		if (needsAction)
		{
			character.timelineIcon.Beginning();
		}
	}

	// Token: 0x060004B5 RID: 1205 RVA: 0x0006A2A8 File Offset: 0x000684A8
	public int NPCCount(bool canBeSearching)
	{
		int num = 0;
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && this.characters[i].npc && (this.characters[i].inCombat || canBeSearching))
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x060004B6 RID: 1206 RVA: 0x0006A310 File Offset: 0x00068510
	public bool HasTimelineIcon(Character character)
	{
		for (int i = 0; i < this.timelineIcons.Count; i++)
		{
			if (this.timelineIcons[i].character == character)
			{
				character.timelineIcon = this.timelineIcons[i];
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004B7 RID: 1207 RVA: 0x0006A364 File Offset: 0x00068564
	public void RemoveTimelineIcon(TimelineIcon icon)
	{
		int num = this.timelineIcons.IndexOf(icon);
		if (num > -1)
		{
			this.timelineIcons.RemoveAt(num);
		}
	}

	// Token: 0x060004B8 RID: 1208 RVA: 0x0006A390 File Offset: 0x00068590
	public void StartCombat(Character firstTarget, Character initiator, bool partyInitiative, bool firstStart)
	{
		if (this.combatEnd != null)
		{
			base.StopCoroutine(this.combatEnd);
			this.endingCombat = false;
			this.combatEnd = null;
		}
		if (this.combatStart == null)
		{
			this.combatStart = this.SetDomeNodes(firstTarget, initiator, partyInitiative, firstStart);
			base.StartCoroutine(this.combatStart);
		}
	}

	// Token: 0x060004B9 RID: 1209 RVA: 0x0006A3E5 File Offset: 0x000685E5
	private IEnumerator SetDomeNodes(Character firstTarget, Character initiator, bool partyInitiative, bool firstStart)
	{
		bool waitedToEnd = false;
		while (this.endingCombat)
		{
			Debug.Log("Ending combat");
			waitedToEnd = true;
			yield return null;
		}
		if (this.characters.Count > 0 || !waitedToEnd)
		{
			Links.x.combat.SetCharacterInTurn(false);
			Shader.SetGlobalFloat("_NoCharacterFX", 0f);
			this.combatCinematics = true;
			Records.x.combat = true;
			bool flag = false;
			bool flag2 = true;
			if (firstTarget && initiator && firstTarget.npc && initiator.npc)
			{
				flag2 = false;
			}
			if (firstStart)
			{
				this.partyXP.Clear();
				this.partyCharacterXP.Clear();
				for (int j = 0; j < this.party.Count; j++)
				{
					if (this.party[j])
					{
						this.partyCharacterXP.Add(this.party[j]);
						this.partyXP.Add(this.party[j].stats.XP);
					}
				}
			}
			if (Links.x.gaia.boroControls && flag2)
			{
				Links.x.gaia.boroControls.LeavingForCombat();
			}
			if (initiator && !initiator.npc)
			{
				initiator = Links.x.main;
			}
			Links.x.SetFormationOrder();
			this.currentTurn = "Party";
			this.domeOn = true;
			bool flag3 = firstStart && flag2;
			if (flag)
			{
				if (this.combatEnd != null)
				{
					base.StopCoroutine(this.combatEnd);
					this.endingCombat = false;
					this.combatEnd = null;
				}
				if (!Links.x.domeAnimator.gameObject.activeSelf)
				{
					Links.x.domeAnimator.gameObject.SetActive(true);
				}
				Links.x.domeColliders.SetActive(true);
			}
			this.combatStartTime = Links.x.gameplay.seconds;
			if (firstStart && flag2 && Records.x.turnBased)
			{
				if (initiator.npc && !partyInitiative)
				{
					this.currentTurn = "Party";
					this.playerStartedCombat = false;
				}
				else
				{
					this.currentTurn = "NPC";
					this.playerStartedCombat = true;
					if (partyInitiative)
					{
						if (Links.x.domeAnimator.gameObject.activeSelf)
						{
							Links.x.domeAnimator.SetBool("NPC", false);
						}
					}
					else if (Links.x.domeAnimator.gameObject.activeSelf)
					{
						Links.x.domeAnimator.SetBool("NPC", false);
					}
				}
			}
			this.domeDistance = 25f;
			float num = this.domeDistance;
			float num2 = this.domeDistance;
			if (initiator)
			{
				this.domeCenter = initiator.tr.position;
			}
			if (!firstStart || partyInitiative)
			{
				this.domeCenter = initiator.tr.position;
			}
			this.allCharacters = Links.x.diorama.characters;
			if (this.characterStartingAttack && Records.x.turnBased)
			{
				this.currentTurnCharacter = this.characterStartingAttack;
				if (Records.x.turnBased)
				{
					this.characterInTurn = true;
				}
			}
			this.domeDistance = 25f;
			if (flag)
			{
				Links.x.domeAnimator.gameObject.SetActive(true);
				Links.x.domeAnimator.gameObject.transform.position = this.domeCenter;
				Links.x.cameraEffects.ChangeDomeState(true);
				Links.x.domeColliders.transform.position = this.domeCenter;
				Shader.SetGlobalVector("_DomeCenter", this.domeCenter);
				if (Links.x.worldCamera.orthographic)
				{
					Links.x.domeAnimator.speed = 0.8f;
				}
				else
				{
					Links.x.domeAnimator.speed = 0.3f;
				}
			}
			Links.x.hudControl.timelineAnimator.Play("Timeline Start");
			int count = this.allCharacters.Count;
			if (firstStart && flag2)
			{
				int num3;
				for (int i = 0; i < this.party.Count; i = num3 + 1)
				{
					if (this.party[i] && !this.party[i].isBoro)
					{
						this.AddParty(this.party[i], false, initiator, true);
						this.party[i].inCombat = true;
						if (Records.x.useBigTiles)
						{
							yield return this.delayQuarterSecond;
						}
					}
					num3 = i;
				}
			}
			if (firstStart)
			{
				if (Records.x.turnBased && !this.characterStartingAttack)
				{
					yield return this.delaySecond;
				}
				this.npcCount = 0;
				for (int k = 0; k < this.characters.Count; k++)
				{
					if (this.characters[k].npc)
					{
						this.npcCount++;
					}
				}
				this.preDome = true;
				if (this.npcCount > 0)
				{
					this.preDome = false;
					this.npcsInCombat = true;
				}
			}
			Links.x.hudControl.StartCombat();
		}
		this.combatStart = null;
		this.characterStartingAttack = null;
		this.combatCinematics = false;
		yield break;
	}

	// Token: 0x060004BA RID: 1210 RVA: 0x0006A411 File Offset: 0x00068611
	public void CheckForFreeAttack(Character attacker, Character target)
	{
	}

	// Token: 0x060004BB RID: 1211 RVA: 0x0006A414 File Offset: 0x00068614
	public bool CanSeeSomeoneInCombat(Vector3 pt, float sight)
	{
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && (pt - character.tr.position).sqrMagnitude < sight * sight && character.hasActions && character.actions.ai.HasEnemies())
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004BC RID: 1212 RVA: 0x0006A488 File Offset: 0x00068688
	public bool AnyoneCharging()
	{
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && this.characters[i].actions && this.characters[i].actions.chargeUpFX)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004BD RID: 1213 RVA: 0x0006A4F8 File Offset: 0x000686F8
	public bool InDomeRange(Character character)
	{
		if (Records.x.turnBased)
		{
			float num = this.domeDistance + 2f;
			return Vector3.Distance(character.tr.position, this.domeCenter) < num;
		}
		return true;
	}

	// Token: 0x060004BE RID: 1214 RVA: 0x0006A53C File Offset: 0x0006873C
	public void SaveCombatants(Vector3 exitPoint, bool newMap)
	{
		if (newMap)
		{
			this.changingMap = Links.x.gaia.changingMaps;
			this.changingMapDistance = Links.x.gaia.changingMapsDistance;
			if (Links.x.gaia.changingMapsComplete)
			{
				this.changingMap.Clear();
				this.changingMapDistance.Clear();
			}
			for (int i = 0; i < this.characters.Count; i++)
			{
				Character character = this.characters[i];
				if (character && character.IsSentient() && character.npc && character.creatures && !character.creatures.temporary && !character.ghost && !character.stats.characterRow._NeverLeaveMap && character.stats.characterRow._Quest == "")
				{
					this.changingMap.Add(character);
					this.changingMapDistance.Add(Vector3.Distance(character.tr.position, exitPoint) * 10f);
				}
			}
		}
	}

	// Token: 0x060004BF RID: 1215 RVA: 0x0006A668 File Offset: 0x00068868
	public void SetCombatantsHostility(int hostility)
	{
		Debug.Log("Checking combatants " + this.characters.Count.ToString());
		int num = 0;
		foreach (Character character in this.characters)
		{
			if (character && character.npc && character.creatures.creatures.temperament != Creatures.temperamentState.AttacksOnSight)
			{
				character.hostility = (int)character.creatures.creatures.temperament;
				character.CircleAnimation("");
				if (character.actions)
				{
					character.actions.EndActions();
				}
				if (num == 0 || Random.Range(0, 3) == 0)
				{
					int num2 = Random.Range(0, 3);
					if (!character.stats.animal)
					{
						if (num2 == 0)
						{
							character.StartQuip("That'll be a lesson for you");
						}
						if (num2 == 1)
						{
							character.StartQuip("Do that again and you'll be on exile island");
						}
						if (num2 == 2)
						{
							character.StartQuip("I was merciful...this time");
						}
					}
				}
				num++;
			}
		}
	}

	// Token: 0x060004C0 RID: 1216 RVA: 0x0006A798 File Offset: 0x00068998
	private IEnumerator StartXPCoroutine()
	{
		yield return new WaitForSeconds(1.5f);
		if (!Records.x.dialogue)
		{
			for (int i = 0; i < this.partyCharacterXP.Count; i++)
			{
				if (this.partyCharacterXP[i] && this.partyCharacterXP[i].stats.XP - this.partyXP[i] > 0)
				{
					bool dead = this.partyCharacterXP[i].dead;
				}
			}
		}
		yield return new WaitForSeconds(2f);
		if (this.exileCharacter)
		{
			if (this.exileCharacter.creatures)
			{
				float num = this.exileCharacter.creatures.GetTimeOfDeath(this.exileCharacter);
				num -= 21f;
				float num2 = Mathf.Floor((float)Links.x.gameplay.GetCurrentGameTimeHours());
				if (!Records.x.combat && !Records.x.dialogue && num2 < num && Records.x.CanTurnInExile(this.exileCharacter.stats.characterRow._Quest, this.exileCharacter.stats.xmlName) && QuestLog.GetQuestState("ShowExileIslandDialogue") == QuestState.Unassigned)
				{
					if (!this.exileCharacter.stats.xmlName.Contains("RenazinSpy"))
					{
						Character firstAvailableParty = Links.x.GetFirstAvailableParty(this.exileCharacter.tr.position);
						Character secondAvailableParty = Links.x.GetSecondAvailableParty(this.exileCharacter.tr.position, firstAvailableParty);
						if (!secondAvailableParty)
						{
							Links.x.gameplay.StartDialogue(Links.x.main, this.exileCharacter, null, null, "Party/ExileIslandSingle");
						}
						else if (secondAvailableParty)
						{
							Links.x.gameplay.StartDialogue(firstAvailableParty, this.exileCharacter, secondAvailableParty, null, "Party/ExileIsland");
						}
					}
					QuestLog.SetQuestState("ShowExileIslandDialogue", QuestState.Active);
				}
			}
			this.exileCharacter = null;
		}
		yield break;
	}

	// Token: 0x060004C1 RID: 1217 RVA: 0x0006A7A8 File Offset: 0x000689A8
	public void ClickAwayFromCombat()
	{
		int num = 0;
		if (Records.x.combat)
		{
			for (int i = 0; i < this.characters.Count; i++)
			{
				if (this.characters[i] && this.characters[i].npc)
				{
					num++;
					break;
				}
			}
			if (num == 0)
			{
				this.EndCombat(false);
			}
		}
	}

	// Token: 0x060004C2 RID: 1218 RVA: 0x0006A810 File Offset: 0x00068A10
	public void BribeToReduceHostilities()
	{
		List<Character> list = new List<Character>();
		for (int i = 0; i < this.characters.Count; i++)
		{
			list.Add(this.characters[i]);
		}
		int num = 0;
		for (int j = 0; j < list.Count; j++)
		{
			if (list[j] && list[j].npc && list[j].hasActions)
			{
				if (list[j].stats.isGuard || list[j].stats.allegiance == 6U)
				{
					list[j].hostility = 1;
					list[j].attackingUntilBribe = false;
					list[j].actions.EndActions();
				}
				else
				{
					num++;
				}
			}
		}
		if (num == 0)
		{
			this.EndCombat(false);
		}
		Links.x.sensory.RemoveBribeHostility();
	}

	// Token: 0x060004C3 RID: 1219 RVA: 0x0006A900 File Offset: 0x00068B00
	public void JusticeCombat(Character guilty)
	{
		Debug.Log("Setting non-hostile everyone but " + ((guilty != null) ? guilty.ToString() : null));
		List<Character> list = new List<Character>();
		for (int i = 0; i < this.characters.Count; i++)
		{
			list.Add(this.characters[i]);
		}
		int num = 0;
		for (int j = 0; j < list.Count; j++)
		{
			if (list[j] && list[j].npc)
			{
				if ((list[j].stats.isGuard || list[j].stats.allegiance == 6U) && list[j] != guilty && !Links.x.sensory.CheckProof(list[j]))
				{
					if (list[j].hasActions)
					{
						list[j].hostility = 1;
						list[j].actions.EndActions();
						list[j].ClearLKP();
					}
					else
					{
						list[j].ClearLKP();
					}
				}
				else
				{
					num++;
				}
			}
		}
	}

	// Token: 0x060004C4 RID: 1220 RVA: 0x0006AA2C File Offset: 0x00068C2C
	public void AddHostilityReduceCharacter(Character character)
	{
		int num = this.reduceHostilities.IndexOf(character);
		Debug.Log("reduce hostilities for " + ((character != null) ? character.ToString() : null));
		if (num == -1)
		{
			this.reduceHostilities.Add(character);
			this.reduceHostilitiesTimes.Add(Time.timeSinceLevelLoad);
		}
	}

	// Token: 0x060004C5 RID: 1221 RVA: 0x0006AA80 File Offset: 0x00068C80
	public void CheckReduceHostilities(bool ignoreTimes)
	{
		if (Records.x.BribeBadgeCount() > 0)
		{
			return;
		}
		bool flag = false;
		for (int i = 0; i < this.reduceHostilities.Count; i++)
		{
			if (Time.timeSinceLevelLoad > this.reduceHostilitiesTimes[i] + 3f && ((!Records.x.InCombat(false) && this.reduceHostilities[i]) || ignoreTimes))
			{
				string text = "removed hostility for ";
				Character character = this.reduceHostilities[i];
				Debug.Log(text + ((character != null) ? character.ToString() : null));
				this.reduceHostilities[i].hostility = 1;
				this.reduceHostilitiesTimes[i] = -1f;
				this.reduceHostilities[i] = null;
				flag = true;
			}
		}
		if (flag)
		{
			this.reduceHostilitiesTimes.RemoveAll((float item) => item == -1f);
			this.reduceHostilities.RemoveAll((Character item) => item == null);
		}
	}

	// Token: 0x060004C6 RID: 1222 RVA: 0x0006ABA9 File Offset: 0x00068DA9
	public void EndCombat(bool immediate)
	{
		if (this.combatEnd != null)
		{
			base.StopCoroutine(this.combatEnd);
			this.endingCombat = false;
			this.combatEnd = null;
		}
		this.combatEnd = this.EndingCombat(immediate);
		base.StartCoroutine(this.combatEnd);
	}

	// Token: 0x060004C7 RID: 1223 RVA: 0x0006ABE8 File Offset: 0x00068DE8
	private bool EveryoneDone()
	{
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && character.actions)
			{
				if (character.actions.playingMusic)
				{
					return false;
				}
				if (character.inAction && Time.timeSinceLevelLoad < this.startCombatEnd + 1f)
				{
					return false;
				}
				if (character.inQueuedAbility)
				{
					return false;
				}
			}
		}
		return !this.inRally && !this.inPocketAttack;
	}

	// Token: 0x060004C8 RID: 1224 RVA: 0x0006AC78 File Offset: 0x00068E78
	private IEnumerator EndingCombat(bool immediate)
	{
		this.startCombatEnd = Time.timeSinceLevelLoad;
		while (!this.EveryoneDone() && !immediate)
		{
			yield return null;
		}
		if (Records.x.combatConsoleDebugging)
		{
			Debug.Log("End combat");
		}
		if (this.pickingRally)
		{
			Links.x.main.portrait.AnimatorSynergyDone();
			this.rallyCharacter.portrait.AnimatorSynergyDone();
		}
		Links.x.gameCard.badgesCanvasGroup.alpha = 1f;
		this.centralEnemyPosition = Vector3.zero;
		this.endingCombat = true;
		this.pickingRally = false;
		this.inRally = false;
		this.preDome = false;
		this.inPocketAttack = false;
		this.isJustice = false;
		if (this.combatStart != null)
		{
			base.StopCoroutine(this.combatStart);
			this.combatStart = null;
		}
		Links.x.combat.SetCharacterInTurn(false);
		if (this.groupCorout != null)
		{
			base.StopCoroutine(this.groupCorout);
			this.groupCorout = null;
		}
		Links.x.hudControl.EndOfCombat();
		if (false)
		{
			Links.x.domeColliders.SetActive(false);
		}
		bool flag = false;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].isBoro && this.party[i].hasActions)
			{
				flag = true;
				break;
			}
		}
		for (int j = 0; j < this.reduceHostilities.Count; j++)
		{
			this.reduceHostilitiesTimes[j] = Time.timeSinceLevelLoad;
		}
		Links.x.fellowship.formation = 0;
		Links.x.fellowship.GetFormation();
		Links.x.hudControl.EndCombat();
		this.npcOnlyCombat = false;
		base.StartCoroutine(this.StartXPCoroutine());
		this.combatCinematics = true;
		Records.x.combat = false;
		Links.x.hudControl.timelineAnimator.Play("Timeline End");
		this.playerStartedCombat = false;
		for (int k = 0; k < this.characters.Count; k++)
		{
			Character character = this.characters[k];
			if (character)
			{
				if (character.actions)
				{
					character.inCombat = false;
					character.EndCombat();
					if (character.actions)
					{
						character.actions.EndActions();
					}
					character.isTarget = false;
					if (character.stats.isLazureGuard)
					{
						this.AddHostilityReduceCharacter(character);
					}
					this.characters[k] = null;
					this.charactersLastActionTime[k] = -1f;
				}
			}
			else
			{
				this.charactersLastActionTime[k] = -1f;
			}
		}
		this.TargetsAnytime();
		this.pocketTarget = null;
		if (Links.x.gaia.boroControls && flag)
		{
			Links.x.gaia.boroControls.ComingBackFromCombat();
		}
		Records.x.CombatDoneBribeStates();
		for (int l = 0; l < this.enemyGroups.Count; l++)
		{
			this.enemyGroups[l].BreakCircle(false, false);
		}
		this.enemyGroups.Clear();
		this.groupCount = 3;
		this.characters.RemoveAll((Character item) => item == null);
		this.charactersLastActionTime.RemoveAll((float item) => item == -1f);
		Links.x.cellar.ReturnCombatPools();
		int count = this.currentTileEffects.Count;
		this.currentTileEffectsTemp.Clear();
		for (int m = 0; m < count; m++)
		{
			this.currentTileEffectsTemp.Add(this.currentTileEffects[m]);
		}
		if (Links.x.soundtrack.currentSoundtrack.Contains("Combat") || Links.x.soundtrack.currentSong.Contains("Combat"))
		{
			Links.x.gaia.FadeOutPlaylist(true, 0.5f);
			Links.x.gaia.SetEnvironmentPlaylist(Links.x.gameplay.sailing, Links.x.main.inTown, true);
		}
		if (Records.x.turnBased)
		{
			this.SwitchUI("Off");
			Records.x.playerTurn = true;
			for (int n = 0; n < this.party.Count; n++)
			{
				this.party[n].ToggleArrow(true);
			}
			this.domeOn = true;
		}
		this.undeadCount = 0;
		Records.x.playerTurn = false;
		this.combatCinematics = false;
		this.combatEnd = null;
		int num = 0;
		int num2 = 0;
		for (int num3 = 0; num3 < this.party.Count; num3++)
		{
			if (this.party[num3])
			{
				if ((this.party[num3].stunned || this.party[num3].dead) && this.party[num3].party)
				{
					num++;
				}
				if (this.party[num3].party)
				{
					this.party[num3].portrait.skillBag.SetSelectedState();
					num2++;
				}
			}
		}
		if (num < num2)
		{
			for (int num4 = 0; num4 < this.party.Count; num4++)
			{
				if (this.party[num4] && (this.party[num4].stunned || this.party[num4].dead) && this.party[num4].party)
				{
					this.party[num4].PartyResurrect(-1);
				}
			}
		}
		if (!Links.x.AllDead())
		{
			Links.x.diorama.CombatEndPrompts();
		}
		if (!this.attackingInteractiveOutsideOfCombat)
		{
			Links.x.hudControl.ToggleAttackTimer(false);
		}
		this.npcsInCombat = false;
		this.ClearPossibleTargets();
		this.endingCombat = false;
		Links.x.gameplay.SetDomeSize();
		this.timedBreakables = null;
		this.diaBreakables = null;
		this.diaDoors = null;
		this.diaChests = null;
		yield break;
	}

	// Token: 0x060004C9 RID: 1225 RVA: 0x0006AC8E File Offset: 0x00068E8E
	private IEnumerator DomeEnd()
	{
		yield return this.delayHalfSecond;
		if (!Records.x.combat)
		{
			Links.x.cameraEffects.ChangeDomeState(false);
			this.domeOn = false;
		}
		yield break;
	}

	// Token: 0x060004CA RID: 1226 RVA: 0x0006ACA0 File Offset: 0x00068EA0
	public void EndCombatFromTestScreen()
	{
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && (this.characters[i].hostility == 2 || this.characters[i].attackingUntilBribe))
			{
				if (this.characters[i].hasActions)
				{
					this.characters[i].actions.EndActions();
				}
				this.characters[i].TargetReached();
				if (Records.x.kill)
				{
					this.characters[i].stats.SetHealth(0, false);
					if (!this.characters[i].dead)
					{
						this.characters[i].Dead(false, true, false);
					}
				}
				else
				{
					this.characters[i].stats.SetHealth(0, false);
					this.characters[i].Stunned(false);
				}
			}
		}
		this.EndCombat(false);
	}

	// Token: 0x060004CB RID: 1227 RVA: 0x0006ADC4 File Offset: 0x00068FC4
	public void CheckToMakeNewGroup()
	{
		float seconds = Links.x.gameplay.seconds;
		bool flag = true;
		if (Records.x.banquetIsle)
		{
			flag = Links.x.GetPartyCount() > 1;
		}
		if (Records.x.InCombat(false) && Links.x.gaia.pathfindingReady && Links.x.gaia.sceneLoaded && !Records.x.pocketPause && !Records.x.paused && flag && !Records.x.removeControls && this.npcCount >= 0)
		{
			Character character = null;
			if (this.groupCorout == null && !Records.x.partySailing)
			{
				bool flag2 = false;
				bool flag3 = false;
				bool flag4 = false;
				for (int i = 0; i < this.characters.Count; i++)
				{
					if (!flag2 && !flag4)
					{
						Character character2 = this.characters[i];
						if (character2 && character2.npc && character2.IsSentient() && !character2.inCircle && (seconds > character2.timeSinceCircle + 30f || character2.timeSinceCircle == 0f) && !character2.sailing)
						{
							if ((character2.protectMe || character2.stats.needsDefending) && (Links.x.gameplay.seconds > character2.timeSinceCircle + 100f || character2.timeSinceCircle == 0f) && character2.node != null)
							{
								flag2 = true;
								character = character2;
							}
							if (character2.postHitTime > 0f && character2.stats.isFishMonster)
							{
								flag4 = true;
								character = character2;
							}
						}
					}
				}
				if (this.npcCount == 1 && !flag2 && this.enemyGroups.Count == 0 && Random.Range(0, 10) != 0)
				{
					int j = 0;
					while (j < this.characters.Count)
					{
						if (this.characters[j] && this.characters[j].npc && !this.characters[j].inCircle && !this.characters[j].ambushing)
						{
							if (this.characters[j].actions)
							{
								this.characters[j].actions.ai.runBackToFriends = true;
								break;
							}
							break;
						}
						else
						{
							j++;
						}
					}
				}
				bool flag5 = false;
				if ((Links.x.gameplay.seconds > this.lastGroupTime + 50f && ((Random.Range(0, 10) == 0 && this.enemyGroups.Count == 0) || (Random.Range(0, 20) == 0 && this.enemyGroups.Count == 1) || (Random.Range(0, 20) == 0 && this.enemyGroups.Count == 2))) || flag2 || flag4 || flag5)
				{
					bool flag6 = false;
					if (!character && Random.Range(0, 4) == 0)
					{
						flag6 = true;
					}
					if (this.npcCount == 1)
					{
						flag6 = true;
					}
					if (flag4)
					{
						flag6 = true;
						flag3 = false;
						flag2 = false;
					}
					this.groupCorout = this.MakeGroup(flag2, flag6, character, flag3, flag4);
					base.StartCoroutine(this.groupCorout);
					return;
				}
				if (this.groupCorout == null)
				{
					this.CheckIfSomeoneShouldAddToGroup();
				}
			}
		}
	}

	// Token: 0x060004CC RID: 1228 RVA: 0x0006B149 File Offset: 0x00069349
	private IEnumerator MakeGroup(bool defensive, bool swarm, Character defendCharacter, bool noUICircle, bool aggressionFromHit)
	{
		float t = Links.x.gameplay.seconds;
		Character centerCharacter = null;
		this.triedCharacters.Clear();
		bool swarming = swarm;
		bool staminaFilling = false;
		bool movingTogether = noUICircle;
		if (!defendCharacter && Random.Range(0, 3) == 0 && this.npcCount > 5 && !swarm)
		{
			movingTogether = true;
		}
		if (movingTogether)
		{
			swarm = false;
			swarming = false;
			defensive = false;
			staminaFilling = false;
		}
		if (!swarming && !movingTogether && !defensive)
		{
			staminaFilling = true;
		}
		if (Records.x.banquetIsle && Records.x.needsCircleTooltip)
		{
			movingTogether = true;
			swarming = false;
			defensive = false;
			staminaFilling = false;
			defendCharacter = null;
		}
		Vector3 groupPosition = Vector3.zero;
		GraphNode groupNode = null;
		Vector3 mainPosition = Links.x.main.currentPosition;
		if (this.groupCount == 0)
		{
			this.groupCount = 3;
		}
		if (defensive && defendCharacter)
		{
			groupNode = defendCharacter.node;
			ConstantPath constPath = ConstantPath.ConstructFast(groupNode, Records.x.GetConstantPathRadius(9), null);
			this.groupConstraint.constrainWalkability = false;
			this.groupConstraint.walkable = true;
			this.groupConstraint.constrainTags = false;
			this.groupConstraint.passID = 0;
			this.groupConstraint.passID2 = 0;
			this.groupConstraint.checkCircleID = this.groupCount;
			this.groupConstraint.checkConnections = 0;
			this.groupConstraint.constrainToEnvironment = 1;
			this.groupConstraint.constrainToArea = -1;
			if (defendCharacter.movesOnWater)
			{
				this.groupConstraint.constrainToEnvironment = 2;
			}
			constPath.nnConstraint = this.groupConstraint;
			AstarPath.StartPath(constPath, false);
			yield return base.StartCoroutine(constPath.WaitForPath());
			constPath.Claim(this);
			this.allNodes = constPath.allNodes;
			int count = this.allNodes.Count;
			this.possibleCenters.Clear();
			Vector3 vector = Vector3.zero;
			for (int i = 0; i < count; i++)
			{
				GraphNode graphNode = this.allNodes[i];
				if (graphNode.Walkable)
				{
					vector = (Vector3)graphNode.position;
					if (this.AwayFromOtherGroups(vector, mainPosition, 625f) && graphNode.ConnectionCount(16) <= 8 && this.AwayFromOtherParty(vector, 144f) && !Physics.Linecast(Links.x.main.torsoPosition, vector + new Vector3(0f, 3f, 0f), 66304))
					{
						this.possibleCenters.Add(graphNode);
					}
				}
			}
			centerCharacter = defendCharacter;
			constPath.Release(this, false);
			constPath = null;
		}
		else if (!defensive && Links.x.main.node != null)
		{
			groupNode = Links.x.main.node;
			ConstantPath constPath = ConstantPath.ConstructFast(groupNode, Records.x.GetConstantPathRadius(9), null);
			this.groupConstraint.constrainWalkability = false;
			this.groupConstraint.walkable = true;
			this.groupConstraint.constrainTags = false;
			this.groupConstraint.passID = 0;
			this.groupConstraint.passID2 = 0;
			this.groupConstraint.checkCircleID = this.groupCount;
			this.groupConstraint.checkConnections = 0;
			this.groupConstraint.constrainToEnvironment = -1;
			this.groupConstraint.constrainToArea = -1;
			constPath.nnConstraint = this.groupConstraint;
			AstarPath.StartPath(constPath, false);
			yield return base.StartCoroutine(constPath.WaitForPath());
			constPath.Claim(this);
			this.allNodes = constPath.allNodes;
			int count2 = this.allNodes.Count;
			this.possibleCenters.Clear();
			Vector3 vector2 = Vector3.zero;
			float num = 256f;
			float num2 = 625f;
			if (movingTogether && this.npcCount > 1)
			{
				num = 100f;
				num2 = 400f;
			}
			for (int j = 0; j < count2; j++)
			{
				GraphNode graphNode2 = this.allNodes[j];
				if (graphNode2.Walkable)
				{
					vector2 = (Vector3)graphNode2.position;
					if ((this.AwayFromOtherGroups(vector2, mainPosition, 1225f) || aggressionFromHit) && (graphNode2.ConnectionCount(16) >= 12 || aggressionFromHit) && (this.AwayFromOtherParty(vector2, num) || aggressionFromHit) && (this.NearParty(vector2, num2) || aggressionFromHit) && !Physics.Linecast(Links.x.main.torsoPosition, vector2 + new Vector3(0f, 3f, 0f), 66304))
					{
						this.possibleCenters.Add(graphNode2);
					}
				}
			}
			centerCharacter = defendCharacter;
			constPath.Release(this, false);
			constPath = null;
		}
		bool overrideTime = false;
		if (aggressionFromHit)
		{
			overrideTime = true;
		}
		yield return new WaitForSeconds(0.001f);
		if (this.possibleCenters.Count > 0)
		{
			this.npcsThatCanGroup.Clear();
			Character character = centerCharacter;
			for (int k = 0; k < this.characters.Count; k++)
			{
				Character character2 = this.characters[k];
				if (character2 && character2.npc && character2.IsSentient() && !character2.inCircle && !character2.enraged)
				{
					if (!defensive && !centerCharacter && !swarming && character2.stats.xmlName.Contains("Bakka") && !character2.ambushing && !character && character2.stats.StaminaPercent() > 0.5f)
					{
						swarming = true;
					}
					if (this.CanJoin(character2, character, t, false, swarming, movingTogether, staminaFilling, defensive, overrideTime))
					{
						this.npcsThatCanGroup.Add(character2);
					}
				}
			}
			Character character3 = defendCharacter;
			if (!character3)
			{
				for (int l = 0; l < this.characters.Count; l++)
				{
					if (this.characters[l] && this.characters[l].inCombat && this.characters[l].IsSentient() && this.characters[l].npc)
					{
						character3 = this.characters[l];
						break;
					}
				}
			}
			if (character3)
			{
				for (int m = 0; m < this.allCharacters.Count; m++)
				{
					Character character4 = this.allCharacters[m];
					if (character4 && !character4.inactive && character4.npc && character4.IsSentient() && !character4.inCircle && !character4.enraged && !character4.hasActions && (character4.hostility == 2 || character4.attackingUntilBribe) && character4.stats.race == character3.stats.race && this.CanJoin(character4, character, t, false, swarming, movingTogether, staminaFilling, defensive, overrideTime) && character4 != character)
					{
						this.npcsThatCanGroup.Add(character4);
					}
				}
			}
			int z = this.possibleCenters.Count;
			Vector3 vector3 = Vector3.zero;
			int characterCount = this.npcsThatCanGroup.Count;
			int charactersAllowed = 6;
			if (swarming)
			{
				charactersAllowed = Random.Range(2, 6);
			}
			if (movingTogether)
			{
				charactersAllowed = Random.Range(2, 4);
			}
			if (aggressionFromHit)
			{
				charactersAllowed = Random.Range(2, 4);
			}
			this.possibleGroupNodes.Clear();
			this.possibleGroupNodeCharacters.Clear();
			bool failedFirstPass = false;
			int num5;
			for (int y = 0; y < 2; y = num5 + 1)
			{
				if (y == 0 || (y == 1 && staminaFilling && failedFirstPass))
				{
					for (int x = 0; x < z; x = num5 + 1)
					{
						bool flag = true;
						vector3 = (Vector3)this.possibleCenters[x].position;
						int num3 = 0;
						if (centerCharacter)
						{
							float num4 = (vector3 - centerCharacter.currentPosition).sqrMagnitude;
							if (num4 < 400f || aggressionFromHit)
							{
								Vector3 vector4 = Quaternion.LookRotation(vector3 - new Vector3(centerCharacter.currentPosition.x, vector3.y, centerCharacter.currentPosition.z)) * Vector3.forward;
								Vector3 vector5 = Vector3.Normalize(mainPosition - new Vector3(centerCharacter.currentPosition.x, mainPosition.y, centerCharacter.currentPosition.z));
								if (Vector3.Dot(vector4, vector5) > 0.5f || aggressionFromHit)
								{
									num3++;
								}
								else
								{
									flag = false;
								}
							}
							else
							{
								flag = false;
							}
						}
						if (flag)
						{
							this.groupCharacters.Clear();
							Character character5;
							if (this.GetGroupCharacters(vector3, centerCharacter, defensive, staminaFilling, characterCount, num3, charactersAllowed, out character5, false, swarming, movingTogether, staminaFilling, overrideTime) >= 2 && character5)
							{
								this.possibleGroupNodes.Add(this.possibleCenters[x]);
								this.possibleGroupNodeCharacters.Add(character5);
							}
						}
						if (x == 100 || x == 200 || x == 300 || x == 400)
						{
							yield return new WaitForSeconds(0.001f);
						}
						num5 = x;
					}
				}
				if (y == 0 && staminaFilling && this.possibleGroupNodes.Count == 0)
				{
					failedFirstPass = true;
					staminaFilling = false;
					swarming = true;
					swarm = true;
				}
				num5 = y;
			}
			float num6 = float.PositiveInfinity;
			int num7 = -1;
			for (int n = 0; n < this.possibleGroupNodes.Count; n++)
			{
				float num4 = this.SubtractVectors((Vector3)this.possibleGroupNodes[n].position, this.possibleGroupNodeCharacters[n].currentPosition).sqrMagnitude;
				if (num4 < num6)
				{
					num6 = num4;
					num7 = n;
				}
			}
			if (num7 > -1)
			{
				this.groupCharacters.Clear();
				groupNode = this.possibleGroupNodes[num7];
				groupPosition = (Vector3)this.possibleGroupNodes[num7].position;
				int num8 = 0;
				if (centerCharacter)
				{
					this.groupCharacters.Add(centerCharacter);
					num8++;
				}
				Character character6;
				this.GetGroupCharacters(groupPosition, centerCharacter, defensive, staminaFilling, characterCount, num8, charactersAllowed, out character6, true, swarming, movingTogether, staminaFilling, overrideTime);
				this.groupNodes.Clear();
				if (this.groupCharacters.Count < 8)
				{
					for (int num9 = this.groupCharacters.Count; num9 < 9; num9++)
					{
						this.groupCharacters.Add(null);
					}
				}
				bool flag2 = true;
				if (swarming && aggressionFromHit)
				{
					if (defendCharacter.dead || defendCharacter.stunned)
					{
						flag2 = false;
					}
					groupNode = this.groupCharacters[0].node;
				}
				if (flag2)
				{
					ConstantPath constPath = ConstantPath.ConstructFast(groupNode, Records.x.GetConstantPathRadius(4), null);
					this.groupConstraint.constrainWalkability = false;
					this.groupConstraint.walkable = true;
					this.groupConstraint.constrainTags = false;
					this.groupConstraint.checkCircleID = this.groupCount;
					this.groupConstraint.passID = 0;
					this.groupConstraint.passID2 = 0;
					this.groupConstraint.checkConnections = 0;
					this.groupConstraint.constrainToEnvironment = 1;
					if (this.groupCharacters.Count > 0 && this.groupCharacters[0] && this.groupCharacters[0].movesOnWater)
					{
						this.groupConstraint.constrainToEnvironment = 2;
					}
					this.groupConstraint.constrainToArea = -1;
					constPath.nnConstraint = this.groupConstraint;
					if (Links.x.gaia.pathfindingReady && Links.x.gaia.sceneLoaded)
					{
						AstarPath.StartPath(constPath, false);
						yield return base.StartCoroutine(constPath.WaitForPath());
						constPath.Claim(this);
						this.allNodes = constPath.allNodes;
						int count3 = this.allNodes.Count;
						this.groupNodes.Clear();
						int num10 = 0;
						this.allNodesTaken.Clear();
						for (int num11 = 0; num11 < count3; num11++)
						{
							this.allNodesTaken.Add(0);
						}
						for (int num12 = 0; num12 < 10; num12++)
						{
							float num13 = 3f;
							if (num12 == 1)
							{
								num13 = 3.6f;
							}
							if (num12 == 2)
							{
								num13 = 5.1f;
							}
							if (num12 == 3)
							{
								num13 = 7.1f;
							}
							if (num12 == 4)
							{
								num13 = 7.6f;
							}
							if (num12 == 5)
							{
								num13 = 10.6f;
							}
							if (num12 == 6)
							{
								num13 = 10.1f;
							}
							if (num12 == 7)
							{
								num13 = 14.1f;
							}
							if (num12 == 8)
							{
								num13 = 12.6f;
							}
							if (num12 == 9)
							{
								num13 = 17.6f;
							}
							float num14 = num13 * num13;
							for (int num15 = 0; num15 < count3; num15++)
							{
								if (this.allNodesTaken[num15] == 0 && (num12 <= 1 || num10 < 9) && ((Vector3)this.allNodes[num15].position - groupPosition).sqrMagnitude < num14 && this.allNodes[num15].Walkable)
								{
									num10++;
									this.groupNodes.Add(this.allNodes[num15]);
									this.allNodesTaken[num15] = 1;
								}
							}
						}
						this.allNodesTaken.Clear();
						int count4 = this.groupNodes.Count;
						for (int num16 = 0; num16 < count4; num16++)
						{
							this.allNodesTaken.Add(0);
						}
						for (int num17 = 0; num17 < count4; num17++)
						{
							vector3 = (Vector3)this.groupNodes[num17].position;
							bool flag3 = false;
							for (int num18 = 0; num18 < count4; num18++)
							{
								if (!flag3)
								{
									Vector3 vector6 = (Vector3)this.groupNodes[num18].position;
									vector6.y = vector3.y;
									float num4 = (vector6 - vector3).sqrMagnitude;
									if (num4 < 16f)
									{
										flag3 = true;
									}
								}
							}
							if (!flag3)
							{
								this.allNodesTaken[num17] = 1;
							}
						}
						bool flag4 = false;
						for (int num19 = 0; num19 < count4; num19++)
						{
							if (this.allNodesTaken[num19] == 1)
							{
								this.groupNodes[num19] = null;
								flag4 = true;
							}
						}
						if (flag4)
						{
							this.groupNodes.RemoveAll((GraphNode item) => item == null);
						}
						if (this.groupNodes.Count < 13)
						{
							for (int num20 = this.groupNodes.Count; num20 < 13; num20++)
							{
								this.groupNodes.Add(null);
							}
						}
						constPath.Release(this, false);
						this.lastGroupTime = Links.x.gameplay.seconds;
						EnemyGroup enemyGroup = base.gameObject.AddComponent<EnemyGroup>();
						this.enemyGroups.Add(enemyGroup);
						enemyGroup.groupID = this.groupCount;
						enemyGroup.maxCharacters = charactersAllowed;
						this.groupCount++;
						if (swarming)
						{
							enemyGroup.aggressive = true;
						}
						if (!defensive && !swarming && !movingTogether)
						{
							enemyGroup.staminaFilling = true;
						}
						enemyGroup.movingTogether = movingTogether;
						enemyGroup.Setup(this.groupCharacters[0], this.groupCharacters[1], this.groupCharacters[2], this.groupCharacters[3], this.groupCharacters[4], this.groupCharacters[5], this.groupCharacters[6], this.groupCharacters[7], groupNode, this.groupNodes[0], this.groupNodes[1], this.groupNodes[2], this.groupNodes[3], this.groupNodes[4], this.groupNodes[5], this.groupNodes[6], this.groupNodes[7], this.groupNodes[8], this.groupNodes[9], this.groupNodes[10], this.groupNodes[11]);
					}
					constPath = null;
				}
			}
		}
		this.groupCorout = null;
		yield break;
	}

	// Token: 0x060004CD RID: 1229 RVA: 0x0006B180 File Offset: 0x00069380
	private int GetGroupCharacters(Vector3 pt, Character centerCharacter, bool defensive, bool needsStamina, int characterCount, int count, int charactersAllowed, out Character firstCharacter, bool addToGroup, bool swarming, bool movingTogether, bool staminaFilling, bool overrideTime)
	{
		int num = count;
		firstCharacter = centerCharacter;
		Vector3 currentPosition = Links.x.main.currentPosition;
		float seconds = Links.x.gameplay.seconds;
		for (int i = 0; i < 2; i++)
		{
			if (addToGroup || i == 1)
			{
				float num2 = 900f;
				if (!defensive)
				{
					if (firstCharacter)
					{
						num2 = 256f;
					}
					else
					{
						num2 = 529f;
					}
				}
				if (this.npcCount < 2)
				{
					num2 = 1600f;
				}
				if (i == 0)
				{
					num2 = 64f;
				}
				for (int j = 0; j < characterCount; j++)
				{
					if (num <= charactersAllowed)
					{
						Character character = this.npcsThatCanGroup[j];
						if (character != firstCharacter && character.npc && character.IsSentient() && !character.inCircle && !character.enraged && (defensive || needsStamina || character.stats.formationGroup <= 3) && this.CanJoin(character, firstCharacter, seconds, needsStamina, swarming, movingTogether, staminaFilling, defensive, overrideTime))
						{
							float num3;
							if (firstCharacter)
							{
								num3 = (character.currentPosition - firstCharacter.currentPosition).sqrMagnitude;
							}
							else
							{
								num3 = (character.currentPosition - pt).sqrMagnitude;
							}
							if (num3 < num2)
							{
								bool flag = false;
								if (i > 0)
								{
									flag = this.groupCharacters.Contains(character);
								}
								if (!flag)
								{
									if (!firstCharacter)
									{
										Vector3 vector = Quaternion.LookRotation(pt - new Vector3(character.currentPosition.x, pt.y, character.currentPosition.z)) * Vector3.forward;
										Vector3 vector2 = Vector3.Normalize(currentPosition - new Vector3(character.currentPosition.x, currentPosition.y, character.currentPosition.z));
										if (Vector3.Dot(vector, vector2) < 0.5f && !overrideTime)
										{
											flag = true;
										}
										else
										{
											firstCharacter = character;
										}
									}
									if (!flag)
									{
										num++;
										this.groupCharacters.Add(character);
									}
								}
							}
						}
					}
				}
			}
		}
		return num;
	}

	// Token: 0x060004CE RID: 1230 RVA: 0x0006B3D0 File Offset: 0x000695D0
	public void CheckIfSomeoneShouldAddToGroup()
	{
		for (int i = 0; i < this.enemyGroups.Count; i++)
		{
			EnemyGroup enemyGroup = this.enemyGroups[i];
			if (enemyGroup.inCircleCount < enemyGroup.maxCharacters && enemyGroup.formationCoroutine == null)
			{
				int num = enemyGroup.FreeSpots();
				bool aggressive = enemyGroup.aggressive;
				Character centerCharacter = enemyGroup.centerCharacter;
				if (centerCharacter)
				{
					int num2 = 0;
					for (int j = 0; j < 2; j++)
					{
						float num3 = 400f;
						if (enemyGroup.aggressive || enemyGroup.staminaFilling)
						{
							num3 = 100f;
						}
						if (j == 0)
						{
							num3 = 56.25f;
						}
						for (int k = 0; k < this.characters.Count; k++)
						{
							if (num2 <= num)
							{
								Character character = this.characters[k];
								if (character && character.npc && character.IsSentient() && !character.inCircle && !character.enraged && !character.inAction && !character.jumping && (!enemyGroup.aggressive || character.stats.formationGroup <= 3) && this.CanJoin(character, centerCharacter, Links.x.gameplay.seconds, enemyGroup.staminaFilling, enemyGroup.aggressive, enemyGroup.movingTogether, enemyGroup.staminaFilling, enemyGroup.defensive, false) && (enemyGroup.centroid - character.currentPosition).sqrMagnitude < num3 && character.hasActions && !character.actions.ai.busy)
								{
									num2++;
									enemyGroup.AddToCircle(character);
								}
							}
						}
					}
				}
			}
		}
	}

	// Token: 0x060004CF RID: 1231 RVA: 0x0006B5AC File Offset: 0x000697AC
	private bool CanJoin(Character c1, Character c2, float t, bool needsStamina, bool isAggressiveGroup, bool isFakeGroup, bool isRecoverGroup, bool isDefendGroup, bool overrideTime)
	{
		if (c1.sailing)
		{
			return false;
		}
		if (overrideTime && !c1.inCircle && !c1.enraged)
		{
			if (!c2)
			{
				return true;
			}
			if (c1.stats.race == c2.stats.race && !c1.movesOnWater && !c2.movesOnWater)
			{
				return true;
			}
		}
		if (c1.ambushing || c1.resting)
		{
			return false;
		}
		if (c1.inCircle)
		{
			return false;
		}
		if (c1.stats.flying)
		{
			return false;
		}
		if (c1.stats.pinned || c1.stats.pinning)
		{
			return false;
		}
		if (isAggressiveGroup && !c1.stats.canAggressionGroup && (float)c1.stats.formationGroup <= 3f)
		{
			return false;
		}
		if (isFakeGroup && !c1.stats.canSecretGroup && (float)c1.stats.formationGroup <= 3f)
		{
			return false;
		}
		if (isRecoverGroup && !c1.stats.canRecoverGroup)
		{
			return false;
		}
		if (isDefendGroup && !c1.stats.canSecretGroup)
		{
			if (!c2)
			{
				return true;
			}
			if (c1.movesOnWater != c2.movesOnWater)
			{
				return false;
			}
			if (c2.stats.race == c1.stats.race)
			{
				return true;
			}
			if (c1.hostility >= 2 && c1.stats.allegiance == c2.stats.allegiance)
			{
				if (Links.x.diorama.sceneName == "D5_WestRuins")
				{
					if (c2.stats.xmlName.Contains("Pagan"))
					{
						return c1.stats.xmlName.Contains("Acorn");
					}
					if (c2.stats.xmlName.Contains("Baron"))
					{
						return c1.stats.xmlName.Contains("Skilpi");
					}
				}
				return true;
			}
			return false;
		}
		else
		{
			if (t < c1.timeSinceCircle + 100f && c1.timeSinceCircle != 0f)
			{
				return false;
			}
			if (c1.stats.hasCustomAI && c1.stats.customAI == "MushroomWallTiles")
			{
				return false;
			}
			if (c1.stats.hasEveryAttackAI && c1.stats.everyAttackAI == "BubbleEvade")
			{
				return false;
			}
			if (needsStamina && c1.stats.StaminaPercent() > 0.7f)
			{
				return false;
			}
			if (c1.stats.defendMainInCombat && !c1.ghost)
			{
				return false;
			}
			if (c1.stats.stayNearPatrol)
			{
				return false;
			}
			if (isAggressiveGroup && !c2 && !c1.stats.canSecretGroup && c1.stats.isFishMonster)
			{
				return c1.postHitTime > 0f;
			}
			return !c2 || (!(c1.stats.race != c2.stats.race) && c1.movesOnWater == c2.movesOnWater && (c1.stats.MoveSpeedMS() == c2.stats.MoveSpeedMS() || isDefendGroup));
		}
	}

	// Token: 0x060004D0 RID: 1232 RVA: 0x0006B8EC File Offset: 0x00069AEC
	private bool AwayFromOtherGroups(Vector3 groupPosition, Vector3 mainPosition, float maxFromMain)
	{
		if (this.SubtractVectors(groupPosition, mainPosition).sqrMagnitude < maxFromMain && Mathf.Abs(groupPosition.y - mainPosition.y) < 8f)
		{
			for (int i = 0; i < this.enemyGroups.Count; i++)
			{
				if ((groupPosition - this.enemyGroups[i].center).sqrMagnitude < 400f)
				{
					return false;
				}
			}
			return true;
		}
		return false;
	}

	// Token: 0x060004D1 RID: 1233 RVA: 0x0006B968 File Offset: 0x00069B68
	private bool AwayFromOtherParty(Vector3 groupPosition, float max)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].party && this.party[i].IsSentient() && (groupPosition - this.party[i].currentPosition).sqrMagnitude < max)
			{
				return false;
			}
		}
		return true;
	}

	// Token: 0x060004D2 RID: 1234 RVA: 0x0006B9EC File Offset: 0x00069BEC
	public bool NearParty(Vector3 groupPosition, float dist)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].party && this.party[i].IsSentient() && (this.party[i].mainSelected || this.SubtractVectors(Links.x.main.currentPosition, this.party[i].currentPosition).sqrMagnitude < dist) && (groupPosition - this.party[i].currentPosition).sqrMagnitude < dist)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004D3 RID: 1235 RVA: 0x0006BABC File Offset: 0x00069CBC
	public bool NearAnyParty(Vector3 pt, float dist)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character && character.party && character.IsSentient() && (pt - character.currentPosition).sqrMagnitude < dist)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x060004D4 RID: 1236 RVA: 0x0006BB20 File Offset: 0x00069D20
	public void AddCharacterToGroup(Character c, EnemyGroup g)
	{
	}

	// Token: 0x060004D5 RID: 1237 RVA: 0x0006BB24 File Offset: 0x00069D24
	public void RemoveGroup(EnemyGroup g)
	{
		int num = this.enemyGroups.IndexOf(g);
		if (num > -1)
		{
			this.enemyGroups.RemoveAt(num);
		}
	}

	// Token: 0x060004D6 RID: 1238 RVA: 0x0006BB50 File Offset: 0x00069D50
	public void ClearTargets()
	{
		int count = this.characters.Count;
		for (int i = 0; i < count; i++)
		{
			Character character = this.characters[i];
			if (character && character.npc)
			{
				character.body.CombatSheen(0);
			}
		}
	}

	// Token: 0x060004D7 RID: 1239 RVA: 0x0006BBA0 File Offset: 0x00069DA0
	public int ChallengeLevel(bool useParty)
	{
		int num = 0;
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && ((useParty && character.party) || (!useParty && character.npc)))
			{
				num += character.stats.level;
			}
		}
		return num;
	}

	// Token: 0x060004D8 RID: 1240 RVA: 0x0006BC04 File Offset: 0x00069E04
	public void ClearPossibleTargets()
	{
		for (int i = 0; i < this.possibleTargets.Count; i++)
		{
			if (this.possibleTargets[i])
			{
				this.possibleTargets[i].body.CombatSheen(0);
			}
		}
		for (int j = 0; j < this.synergies.Count; j++)
		{
			if (this.synergies[j])
			{
				if (this.synergyFX[j])
				{
					Links.x.cellar.ReturnPooledGameObject(87, this.synergyFX[j]);
				}
				this.synergies[j].body.CombatSheen(0);
			}
		}
		for (int k = 0; k < this.synergyFX.Count; k++)
		{
			if (this.synergyFX[k])
			{
				Links.x.cellar.ReturnPooledGameObject(87, this.synergyFX[k]);
			}
		}
		this.synergies.Clear();
		this.synergyFX.Clear();
		for (int l = 0; l < this.nearBreakables.Count; l++)
		{
			BreakableActions breakableActions = this.nearBreakables[l];
			if (breakableActions && !breakableActions.destroyed)
			{
				breakableActions.CombatSheen(0);
			}
		}
		for (int m = 0; m < this.nearDoors.Count; m++)
		{
			DoorActions doorActions = this.nearDoors[m];
			if (doorActions && !doorActions.destroyed)
			{
				doorActions.CombatSheen(0);
			}
		}
		for (int n = 0; n < this.nearChests.Count; n++)
		{
			ChestActions chestActions = this.nearChests[n];
			if (chestActions && !chestActions.destroyed)
			{
				chestActions.CombatSheen(0);
			}
		}
		for (int num = 0; num < this.nearPuzzles.Count; num++)
		{
			PuzzleActions puzzleActions = this.nearPuzzles[num];
			if (puzzleActions)
			{
				puzzleActions.CombatSheen(0);
			}
		}
	}

	// Token: 0x060004D9 RID: 1241 RVA: 0x0006BE1B File Offset: 0x0006A01B
	public int PossibleTargetCount()
	{
		return this.possibleTargets.Count;
	}

	// Token: 0x060004DA RID: 1242 RVA: 0x0006BE28 File Offset: 0x0006A028
	public bool CanAttackTarget(Character target)
	{
		return this.possibleTargets.Contains(target);
	}

	// Token: 0x060004DB RID: 1243 RVA: 0x0006BE3B File Offset: 0x0006A03B
	public bool InRangeTarget(Character c)
	{
		return this.inRange.Contains(c);
	}

	// Token: 0x060004DC RID: 1244 RVA: 0x0006BE4C File Offset: 0x0006A04C
	public void TargetsAnytime()
	{
		bool flag = true;
		Character main = Links.x.main;
		if (Links.x.pocketWheel.open && (!Links.x.pocketWheel.selected.Contains("Attack") || Links.x.pocketWheel.selected.Contains("Special")))
		{
			flag = false;
		}
		if ((main.inAction || main.inRecovery || main.IsAttacking(main.body.currentHash)) && main.timelineIcon && main.timelineIcon.overridePause)
		{
			flag = false;
		}
		bool flag2 = false;
		bool flag3 = false;
		if (Links.x.pocketWheel.selected.Contains("Medium Attack"))
		{
			flag2 = true;
		}
		if (Links.x.pocketWheel.selected.Contains("Heavy Attack"))
		{
			flag3 = true;
		}
		if (flag2 && Records.x.pocketPause && !Links.x.pocketWheel.mediumAtkBtn.interactable)
		{
			flag = false;
		}
		if (flag3 && Records.x.pocketPause && !Links.x.pocketWheel.heavyAtkBtn.interactable)
		{
			flag = false;
		}
		if (!Records.x.removeControls && Links.x.gaia.sceneLoaded && !this.miniEvent && !this.bubbleEvent && !Records.x.miniGame && Records.x.InCombat(false) && !this.npcOnlyCombat && flag && !Links.x.pocketWheel.rally1)
		{
			Vector3 position = main.tr.position;
			this.inRange.Clear();
			float meleeRangeStart = main.invRow1._MeleeRangeStart;
			for (int i = 0; i < this.allCharacters.Count; i++)
			{
				Character character = this.allCharacters[i];
				if (character)
				{
					bool flag4 = false;
					if (!character.inactive && character.npc && !character.dead && !character.inactive && (!character.stunned || (character.stunned && Records.x.kill)) && (character.hostility >= 2 || character.attackingUntilBribe) && character.visible == 1 && !character.meshAlwaysOff)
					{
						float num;
						float num2;
						float num3;
						this.GetDistances(main, character, out num, out num2, out num3);
						float sqrMagnitude = (position - character.tr.position).sqrMagnitude;
						if (flag2)
						{
							num3 = 0f;
							num2 = 12.25f;
						}
						else if (flag3)
						{
							num3 = 0f;
							num2 = 49f;
						}
						if (sqrMagnitude <= num2 && (meleeRangeStart == 0f || sqrMagnitude >= num3 || this.inPocketAttack) && (!Physics.Linecast(main.raycastPosition, main.AddVectorY(character.tr.position, 2f), 66048) || this.inPocketAttack))
						{
							bool flag5 = true;
							if (main.invRow1._MainSkill != "Elixir" && main.invRow1._MainSkill != "Pole")
							{
								flag5 = Links.x.combat.InRangeSight(main, character);
							}
							if (flag5)
							{
								if (!character.body.targetOutline)
								{
									character.body.TargetingOutline(true);
								}
								this.inRange.Add(character);
								flag4 = true;
							}
						}
					}
					if (!flag4 && character.body.targetOutline && !character.body.multiHit)
					{
						character.body.TargetingOutline(false);
					}
				}
			}
			return;
		}
		for (int j = 0; j < this.inRange.Count; j++)
		{
			if (this.inRange[j] && !this.inRange[j].body.multiHit)
			{
				this.inRange[j].body.TargetingOutline(false);
			}
		}
	}

	// Token: 0x060004DD RID: 1245 RVA: 0x0006C278 File Offset: 0x0006A478
	public int GetTargets(bool first, bool test, Character main)
	{
		if (!Links.x.gaia.sceneLoaded)
		{
			return 0;
		}
		this.planes = GeometryUtility.CalculateFrustumPlanes(Links.x.worldCamera);
		this.targetUpdateTime = 4f;
		if (first)
		{
			this.allCharacters = Links.x.diorama.characters;
		}
		if (this.allCharacters == null)
		{
			this.allCharacters = Links.x.diorama.characters;
		}
		if (!main)
		{
			main = Links.x.main;
			if (Links.x.pocketWheel.rallyWheelOpen && Links.x.pocketWheel.selectedRallyCharacter)
			{
				main = Links.x.pocketWheel.selectedRallyCharacter;
			}
		}
		if (main.inAction && !Links.x.pocketWheel.rallyWheelOpen)
		{
			return 0;
		}
		bool flag = true;
		if (test)
		{
			if (!Links.x.pocketWheel.rally1)
			{
				Links.x.follow.position = main.tr.position + main.HeadHeight();
			}
			flag = this.hoverShowTargets;
		}
		if (this.debugTargets)
		{
			string[] array = new string[6];
			array[0] = "Get targets ";
			array[1] = test.ToString();
			array[2] = " ";
			int num = 3;
			Character character = main;
			array[num] = ((character != null) ? character.ToString() : null);
			array[4] = " ";
			array[5] = Links.x.pocketWheel.canTarget.ToString();
			Debug.Log(string.Concat(array));
		}
		if (!test)
		{
			this.ClearPossibleTargets();
			this.possibleTargets.Clear();
		}
		string selected = Links.x.pocketWheel.selected;
		int num2 = 0;
		if (main)
		{
			bool flag2 = false;
			if ((main.CanAttack() || Links.x.pocketWheel.rallyWheelOpen) && (!Links.x.combat.inPocketAttack || (Links.x.combat.inPocketAttack && Links.x.pocketWheel.rallyWheelOpen)) && (Links.x.pocketWheel.rallyWheelOpen || Links.x.pocketWheel.open) && (Links.x.pocketWheel.canTarget || test || !Links.x.pocketWheel.rallyWheelOpen) && (Links.x.pocketWheel.CanSelectRallyTarget() || !Links.x.pocketWheel.rallyWheelOpen || test))
			{
				flag2 = true;
			}
			if (this.debugTargets)
			{
				Debug.Log(flag2.ToString() + " " + selected);
			}
			bool flag3 = false;
			if (selected.Contains("Light Attack"))
			{
				flag3 = true;
			}
			if (selected.Contains("Medium Attack") && Links.x.pocketWheel.mediumAtkBtn.interactable)
			{
				flag3 = true;
			}
			if (selected.Contains("Heavy Attack") && Links.x.pocketWheel.heavyAtkBtn.interactable)
			{
				flag3 = true;
			}
			if (Records.x.pocketPause && !this.miniEvent && flag2 && (Links.x.gameplay.spellTargetingParty || Links.x.gameplay.spellTargetingEnemy || flag3 || Links.x.pocketWheel.Charming() || selected.Contains("Special Attack")))
			{
				Vector3 right = Links.x.worldCamera.gameObject.transform.right;
				Vector3 position = main.tr.position;
				float meleeRangeStart = main.invRow1._MeleeRangeStart;
				bool flag4 = false;
				float num3 = 0f;
				float num4 = 0f;
				float num5 = 0f;
				float num6 = 0f;
				int num7 = -1;
				bool flag5 = false;
				bool flag6 = false;
				if (Links.x.pocketWheel.open && Links.x.pocketWheel.selected.Contains("Medium Attack"))
				{
					flag5 = true;
				}
				if (Links.x.pocketWheel.open && Links.x.pocketWheel.selected.Contains("Heavy Attack"))
				{
					flag6 = true;
				}
				if (Links.x.pocketWheel.open && Links.x.pocketWheel.Charming() && main.attackTime >= 1f)
				{
					flag4 = true;
					num6 = main.stats.SummonModCharm();
					num3 = main.stats.Charming("Shroom", false);
					num4 = main.stats.Charming("Forest", false);
					num5 = main.stats.Charming("Fish", false);
					this.charmFail = "No targets";
					num7 = main.HasRosary();
					if (num7 == -1)
					{
						this.charmFail = "No Bells";
					}
					if (Records.x.partySailing)
					{
						this.charmFail = "On water";
					}
				}
				if (Records.x.pocketPause)
				{
					int num8 = 0;
					if (main.invRow1._MeleeRangeEnd >= 5f && (selected.Contains("Light Attack") || selected.Contains("Special Attack")))
					{
						num8 = main.GetAmmoIndex(main.invRow1);
						if (num8 == -1 && first)
						{
							if (main.invRow1._WeaponType == "Sling")
							{
								main.StartQuip("I'm out of stones!");
							}
							else if (main.invRow1._WeaponType == "Bow")
							{
								main.StartQuip("I'm out of arrows!");
							}
							else
							{
								main.StartQuip("I'm out of elyxirs!");
							}
						}
					}
					if (num8 == -1 && selected.Contains("Special Attack") && (Links.x.pocketWheel.selectedRally.Contains("Crippl") || test) && Links.x.pocketWheel.HasAmmo(main, false))
					{
						num8 = 0;
					}
					bool flag7 = false;
					if (Links.x.gameplay.spellTargetingParty && main == Links.x.gameplay.actionCharacter)
					{
						flag7 = true;
					}
					if (this.debugTargets)
					{
						Debug.Log(this.allCharacters.Count.ToString() + " " + num8.ToString());
					}
					for (int i = 0; i < this.allCharacters.Count; i++)
					{
						Character character2 = this.allCharacters[i];
						if (character2 && num8 > -1 && !character2.inactive && ((character2.npc && !flag7) || (!character2.npc && flag7 && !character2.isBoro)) && !character2.dead && !character2.inactive && (!character2.stunned || (character2.stunned && Records.x.kill)) && !Links.x.gameplay.spellTargetingGround && !character2.meshAlwaysOff)
						{
							bool flag8 = false;
							float num9;
							float num10;
							float num11;
							this.GetDistances(main, character2, out num9, out num10, out num11);
							if (Links.x.gameplay.spellTargetingEnemy || Links.x.gameplay.spellTargetingParty || Links.x.pocketWheel.Charming())
							{
								if (main == Links.x.gameplay.actionCharacter)
								{
									num11 = 0f;
									num10 = main.stats.SpellRadius(Links.x.gameplay.spellPaganRow) * main.stats.SpellRadius(Links.x.gameplay.spellPaganRow);
								}
								if (Links.x.pocketWheel.Charming())
								{
									num10 = main.stats.SpellRadius(Links.x.gameplay.spellPaganRow) * main.stats.SpellRadius(Links.x.gameplay.spellPaganRow);
								}
							}
							else if (flag5)
							{
								num11 = 0f;
								num10 = 12.25f;
							}
							else if (flag6)
							{
								num11 = 0f;
								num10 = 49f;
							}
							if (this.inPocketAttack)
							{
								num10 = 100f;
							}
							float num12 = (position - character2.tr.position).sqrMagnitude;
							if (this.inPocketAttack)
							{
								num12 = (this.rallyStartPosition - character2.tr.position).sqrMagnitude;
							}
							if (this.debugTargets)
							{
								string text = num12.ToString();
								string text2 = " ";
								Character character3 = character2;
								Debug.Log(text + text2 + ((character3 != null) ? character3.ToString() : null));
							}
							if (num12 <= num10 && (meleeRangeStart == 0f || num12 >= num11 || this.inPocketAttack) && (!Physics.Linecast(main.raycastPosition, main.AddVectorY(character2.tr.position, 2f), 66048) || this.inPocketAttack))
							{
								if (this.debugTargets)
								{
									string text3 = "in sight ";
									Character character4 = character2;
									Debug.Log(text3 + ((character4 != null) ? character4.ToString() : null));
								}
								if (this.OnScreen(character2, right) || this.inPocketAttack)
								{
									bool flag9 = true;
									if (main.invRow1._MainSkill != "Elixir" && main.invRow1._MainSkill != "Pole" && !flag4 && !flag6)
									{
										flag9 = Links.x.combat.InRangeSight(main, character2);
									}
									if (this.debugTargets)
									{
										string text4 = "on screen ";
										Character character5 = character2;
										Debug.Log(text4 + ((character5 != null) ? character5.ToString() : null));
									}
									if (flag5 && (character2.radius > 2f || character2.stats.characterRow._Height > 4f || character2.stats.pinned || character2.stats.flying))
									{
										flag9 = false;
									}
									if (!flag4)
									{
										if (flag9 || this.inPocketAttack)
										{
											if (test)
											{
												num2++;
												if (flag)
												{
													character2.body.CombatSheen(3);
												}
												flag8 = true;
											}
											else
											{
												this.possibleTargets.Add(character2);
												if (this.inPocketAttack && character2.visible == 0)
												{
													character2.SetMeshState(true);
												}
												flag8 = true;
												character2.body.CombatSheen(3);
											}
										}
									}
									else
									{
										string race = character2.stats.race;
										if (num7 > -1 && !Records.x.partySailing && (race.Contains("Shroom") || race.Contains("Fish") || race.Contains("Forest")))
										{
											bool flag10 = false;
											float num13 = character2.stats.CharmResistance(false, (float)character2.stats.HealthCurrent());
											if (race.Contains("Shroom") && num3 + 2f >= num13 + num6)
											{
												flag10 = true;
											}
											if (race.Contains("Forest") && num4 + 2f >= num13 + num6)
											{
												flag10 = true;
											}
											if (race.Contains("Fish") && num5 + 2f >= num13 + num6)
											{
												flag10 = true;
											}
											if (flag10)
											{
												if (!character2.stats.xmlName.Contains("Cat"))
												{
													this.possibleTargets.Add(character2);
													flag8 = true;
													character2.body.CombatSheen(3);
												}
											}
											else
											{
												this.charmFail = "Low Skill";
											}
										}
									}
								}
							}
							if (!flag8 && (!test || (test && flag)))
							{
								character2.body.CombatSheen(0);
							}
							character2.CircleAnimation("");
						}
					}
					bool flag11 = false;
					if (Links.x.pocketWheel.rallyWheelOpen)
					{
						if (Links.x.pocketWheel.selectedRally.Contains("Both") || Links.x.pocketWheel.selectedRally.Contains("Crippl") || Links.x.pocketWheel.selectedRally.Contains("Wound"))
						{
							flag11 = true;
						}
						if (this.hoverShowTargets && (this.hoverShowTargetsType.Contains("Both") || this.hoverShowTargetsType.Contains("Crippl") || this.hoverShowTargetsType.Contains("Wound")))
						{
							flag11 = true;
						}
					}
					if (!Links.x.pocketWheel.Charming() && Links.x.pocketWheel.selected != "Medium Attack" && !flag11 && num8 > -1)
					{
						for (int j = 0; j < this.nearBreakables.Count; j++)
						{
							BreakableActions breakableActions = this.nearBreakables[j];
							if (breakableActions && !breakableActions.destroyed && ((this.inPocketAttack && breakableActions.gameObject == this.lastRallyTarget && (this.hoverShowTargets || Links.x.pocketWheel.canTarget)) || this.CheckInteractiveLineOfSight(breakableActions, null, null, null, main)))
							{
								bool flag12 = false;
								if (breakableActions && (float)breakableActions.currentHealth < Records.x.ChargeAmount((float)main.stats.level))
								{
									flag12 = true;
								}
								if (!flag6 || flag12)
								{
									if (test)
									{
										num2++;
									}
									if (flag)
									{
										breakableActions.CombatSheen(3);
									}
								}
								else
								{
									breakableActions.CombatSheen(0);
								}
							}
						}
						for (int k = 0; k < this.nearDoors.Count; k++)
						{
							DoorActions doorActions = this.nearDoors[k];
							if (doorActions && !doorActions.destroyed && doorActions.lockCollider.enabled && ((this.inPocketAttack && doorActions.gameObject == this.lastRallyTarget && (this.hoverShowTargets || Links.x.pocketWheel.canTarget)) || this.CheckInteractiveLineOfSight(null, doorActions, null, null, main)))
							{
								if (test)
								{
									num2++;
								}
								if (flag)
								{
									if (!flag6)
									{
										doorActions.CombatSheen(3);
									}
									else
									{
										doorActions.CombatSheen(0);
									}
								}
							}
						}
						for (int l = 0; l < this.nearChests.Count; l++)
						{
							ChestActions chestActions = this.nearChests[l];
							if (chestActions && !chestActions.destroyed && ((this.inPocketAttack && chestActions.gameObject == this.lastRallyTarget && (this.hoverShowTargets || Links.x.pocketWheel.canTarget)) || this.CheckInteractiveLineOfSight(null, null, chestActions, null, main)))
							{
								if (test)
								{
									num2++;
								}
								if (flag)
								{
									if (!flag6)
									{
										chestActions.CombatSheen(3);
									}
									else
									{
										chestActions.CombatSheen(0);
									}
								}
							}
						}
						for (int m = 0; m < this.nearPuzzles.Count; m++)
						{
							PuzzleActions puzzleActions = this.nearPuzzles[m];
							if (puzzleActions && ((this.inPocketAttack && puzzleActions.gameObject == this.lastRallyTarget && (this.hoverShowTargets || Links.x.pocketWheel.canTarget)) || this.CheckInteractiveLineOfSight(null, null, null, puzzleActions, main)))
							{
								if (test)
								{
									num2++;
								}
								if (flag)
								{
									if (!flag6)
									{
										puzzleActions.CombatSheen(3);
									}
									else
									{
										puzzleActions.CombatSheen(0);
									}
								}
							}
						}
					}
					else if (!test || flag)
					{
						for (int n = 0; n < this.nearBreakables.Count; n++)
						{
							BreakableActions breakableActions2 = this.nearBreakables[n];
							if (breakableActions2)
							{
								breakableActions2.CombatSheen(0);
							}
						}
						for (int num14 = 0; num14 < this.nearDoors.Count; num14++)
						{
							DoorActions doorActions2 = this.nearDoors[num14];
							if (doorActions2)
							{
								doorActions2.CombatSheen(0);
							}
						}
						for (int num15 = 0; num15 < this.nearChests.Count; num15++)
						{
							ChestActions chestActions2 = this.nearChests[num15];
							if (chestActions2)
							{
								chestActions2.CombatSheen(0);
							}
						}
						for (int num16 = 0; num16 < this.nearPuzzles.Count; num16++)
						{
							PuzzleActions puzzleActions2 = this.nearPuzzles[num16];
							if (puzzleActions2)
							{
								puzzleActions2.CombatSheen(0);
							}
						}
					}
				}
			}
			else if (Records.x.pocketPause && !this.hoverShowTargets)
			{
				this.ClearSheens();
			}
		}
		return num2;
	}

	// Token: 0x060004DE RID: 1246 RVA: 0x0006D2DC File Offset: 0x0006B4DC
	public void ClearSheens()
	{
		for (int i = 0; i < this.nearBreakables.Count; i++)
		{
			BreakableActions breakableActions = this.nearBreakables[i];
			if (breakableActions)
			{
				breakableActions.CombatSheen(0);
			}
		}
		for (int j = 0; j < this.nearDoors.Count; j++)
		{
			DoorActions doorActions = this.nearDoors[j];
			if (doorActions)
			{
				doorActions.CombatSheen(0);
			}
		}
		for (int k = 0; k < this.nearChests.Count; k++)
		{
			ChestActions chestActions = this.nearChests[k];
			if (chestActions)
			{
				chestActions.CombatSheen(0);
			}
		}
		for (int l = 0; l < this.nearPuzzles.Count; l++)
		{
			PuzzleActions puzzleActions = this.nearPuzzles[l];
			if (puzzleActions)
			{
				puzzleActions.CombatSheen(0);
			}
		}
		for (int m = 0; m < this.allCharacters.Count; m++)
		{
			Character character = this.allCharacters[m];
			if (character)
			{
				character.body.CombatSheen(0);
			}
		}
	}

	// Token: 0x060004DF RID: 1247 RVA: 0x0006D400 File Offset: 0x0006B600
	public void MultiHitObjects(bool state, Vector3 position, BreakableActions mainHoverBreak, ChestActions mainHoverChest, DoorActions mainHoverDoor)
	{
		if (this.diaDoors == null)
		{
			this.currentTileEffects = Links.x.cellar.currentTileEffects;
			this.timedBreakables = Links.x.cellar.combatBreakables;
			this.diaBreakables = Links.x.diorama.breakableActions;
			this.diaDoors = Links.x.diorama.doorActions;
			this.diaChests = Links.x.diorama.chestActions;
		}
		Character character = Links.x.main;
		if (Links.x.pocketWheel.rallyWheelOpen && Links.x.pocketWheel.selectedRallyCharacter)
		{
			character = Links.x.pocketWheel.selectedRallyCharacter;
		}
		Vector3 vector = Links.x.gameplay.GetHoverPosition();
		if (position != Vector3.zero)
		{
			vector = position;
		}
		if (vector != Vector3.zero)
		{
			for (int i = 0; i < this.timedBreakables.Count; i++)
			{
				TimedBreakable timedBreakable = this.timedBreakables[i];
				if (timedBreakable && !timedBreakable.breakable.destroyed && mainHoverBreak != timedBreakable.breakable && character.InAttackShape(null, vector, character, character.currentPosition, timedBreakable.breakable.transform.position, character.invRow1) && this.CheckInteractiveLineOfSight(timedBreakable.breakable, null, null, null, character))
				{
					if (state)
					{
						timedBreakable.breakable.HoverIn(false);
					}
					else
					{
						timedBreakable.breakable.HoverOut();
					}
				}
			}
			for (int j = 0; j < this.currentTileEffects.Count; j++)
			{
				TileEffects tileEffects = this.currentTileEffects[j];
				if (tileEffects && tileEffects.isWall)
				{
					foreach (BreakableActions breakableActions in tileEffects.breakables)
					{
						if (breakableActions && mainHoverBreak != breakableActions && character.InAttackShape(null, vector, character, character.currentPosition, breakableActions.transform.position, character.invRow1) && this.CheckInteractiveLineOfSight(breakableActions, null, null, null, character))
						{
							if (state)
							{
								breakableActions.HoverIn(false);
							}
							else
							{
								breakableActions.HoverOut();
							}
						}
					}
				}
			}
			for (int k = 0; k < this.diaBreakables.Count; k++)
			{
				BreakableActions breakableActions2 = this.diaBreakables[k];
				if (breakableActions2 && !breakableActions2.destroyed && mainHoverBreak != breakableActions2 && character.InAttackShape(null, vector, character, character.currentPosition, breakableActions2.transform.position, character.invRow1) && this.CheckInteractiveLineOfSight(breakableActions2, null, null, null, character))
				{
					if (state)
					{
						breakableActions2.HoverIn(false);
					}
					else
					{
						breakableActions2.HoverOut();
					}
				}
			}
			for (int l = 0; l < this.diaChests.Count; l++)
			{
				ChestActions chestActions = this.diaChests[l];
				if (chestActions && !chestActions.destroyed && mainHoverChest != chestActions && character.InAttackShape(null, vector, character, character.currentPosition, chestActions.transform.position, character.invRow1) && this.CheckInteractiveLineOfSight(null, null, chestActions, null, character))
				{
					if (state)
					{
						chestActions.HoverIn(false);
					}
					else
					{
						chestActions.HoverOut();
					}
				}
			}
			for (int m = 0; m < this.diaDoors.Count; m++)
			{
				DoorActions doorActions = this.diaDoors[m];
				if (doorActions && !doorActions.destroyed && doorActions.lockCollider && mainHoverDoor != doorActions && character.InAttackShape(null, vector, character, character.currentPosition, doorActions.transform.position, character.invRow1) && this.CheckInteractiveLineOfSight(null, doorActions, null, null, character))
				{
					if (state)
					{
						doorActions.HoverIn(false);
					}
					else
					{
						doorActions.HoverOut();
					}
				}
			}
		}
	}

	// Token: 0x060004E0 RID: 1248 RVA: 0x0006D834 File Offset: 0x0006BA34
	public void MultiHitCharacters(bool state)
	{
		Character character = Links.x.main;
		if (Links.x.pocketWheel.rallyWheelOpen)
		{
			character = Links.x.pocketWheel.selectedRallyCharacter;
		}
		if (state)
		{
			Vector3 hoverPosition = Links.x.gameplay.GetHoverPosition();
			if (hoverPosition != Vector3.zero)
			{
				for (int i = 0; i < this.possibleTargets.Count; i++)
				{
					Character character2 = this.possibleTargets[i];
					if (character2 && character.InAttackShape(character2, hoverPosition, Links.x.main, character.currentPosition, character2.currentPosition, Links.x.main.invRow1))
					{
						character2.body.Hover(state, false);
					}
				}
				return;
			}
		}
		else
		{
			for (int j = 0; j < this.allCharacters.Count; j++)
			{
				if (this.allCharacters[j] && this.allCharacters[j].body.bracket)
				{
					this.allCharacters[j].body.Hover(false, false);
				}
			}
		}
	}

	// Token: 0x060004E1 RID: 1249 RVA: 0x0006D960 File Offset: 0x0006BB60
	private float Dist(Vector3 p1)
	{
		p1.y = this.mainPosition.y;
		return (p1 - this.mainPosition).sqrMagnitude;
	}

	// Token: 0x060004E2 RID: 1250 RVA: 0x0006D994 File Offset: 0x0006BB94
	public void GetJoystickTarget(out Character closestEnemy, out Character closestParty, out BreakableActions closestBreakable, out ChestActions closestChest, out DoorActions closestDoor, out PuzzleActions closestPuzzle, Vector2 dir, bool first)
	{
		closestEnemy = null;
		closestParty = null;
		closestBreakable = null;
		closestChest = null;
		closestDoor = null;
		closestPuzzle = null;
		if (this.possibleTargets.Count == 0)
		{
			this.GetTargets(false, false, null);
		}
		Character character = Links.x.main;
		if (Links.x.pocketWheel.rallyWheelOpen && Links.x.pocketWheel.selectedRallyCharacter)
		{
			character = Links.x.pocketWheel.selectedRallyCharacter;
		}
		bool flag = false;
		if (Links.x.pocketWheel.Charming())
		{
			flag = true;
		}
		if (closestEnemy)
		{
			GameObject gameObject = closestEnemy.gameObject;
		}
		if (closestParty)
		{
			GameObject gameObject2 = closestParty.gameObject;
		}
		if (closestBreakable)
		{
			GameObject gameObject3 = closestBreakable.gameObject;
		}
		if (closestChest)
		{
			GameObject gameObject4 = closestChest.gameObject;
		}
		if (closestDoor)
		{
			GameObject gameObject5 = closestDoor.gameObject;
		}
		if (closestPuzzle)
		{
			GameObject gameObject6 = closestPuzzle.gameObject;
		}
		closestParty = null;
		closestEnemy = null;
		closestBreakable = null;
		closestChest = null;
		closestDoor = null;
		closestPuzzle = null;
		this.mainPosition = character.tr.position;
		Vector2 move = Links.x.fellowship.move;
		float num = Mathf.Atan2(move.x, move.y) / 3.1415927f * 180f;
		if (num < 0f)
		{
			num += 360f;
		}
		if (character && (first || this.forw == Vector3.zero))
		{
			this.forw = character.tr.forward;
		}
		float num2 = character.AttackRange();
		if (this.synergies.Count > 0)
		{
			for (int i = 0; i < this.synergies.Count; i++)
			{
				float num3 = Vector3.Distance(character.currentPosition, this.synergies[i].currentPosition);
				if (num3 > num2)
				{
					num2 = num3;
				}
			}
		}
		Vector3 vector = this.mainPosition + this.forw * num2 / 2f;
		if (Mathf.Abs(move.magnitude) > 0.1f && !Links.x.gameplay.gameFeedScrolling && !Links.x.gameplay.badgeScrolling)
		{
			this.forw = Quaternion.Euler(0f, num + Links.x.worldCamera.transform.rotation.eulerAngles.y, 0f) * Vector3.forward;
			vector = this.mainPosition + this.forw * (num2 * Mathf.Abs(move.magnitude));
		}
		this.mainPosition = vector;
		float num4 = 100000f;
		if (!Links.x.gameplay.spellTargetingParty)
		{
			for (int j = 0; j < this.possibleTargets.Count; j++)
			{
				float num5 = this.Dist(this.possibleTargets[j].tr.position);
				if (num5 < num4)
				{
					num4 = num5;
					closestEnemy = this.possibleTargets[j];
				}
			}
		}
		num4 = 100000f;
		for (int k = 0; k < this.party.Count; k++)
		{
			if (!flag && ((!this.pickingRally && this.synergies.Contains(this.party[k])) || Links.x.gameplay.spellTargetingParty))
			{
				float num6 = this.Dist(this.party[k].tr.position);
				if (num6 < num4)
				{
					num4 = num6;
					closestParty = this.party[k];
				}
			}
		}
		num4 = 100000f;
		for (int l = 0; l < this.nearBreakables.Count; l++)
		{
			if (Links.x.combat.CheckInteractiveLineOfSight(this.nearBreakables[l], null, null, null, character) && !flag && this.nearBreakables[l])
			{
				float num7 = this.Dist(this.nearBreakables[l].gameObject.transform.position);
				if (num7 < num4)
				{
					num4 = num7;
					closestBreakable = this.nearBreakables[l];
				}
			}
		}
		num4 = 100000f;
		for (int m = 0; m < this.nearChests.Count; m++)
		{
			if (Links.x.combat.CheckInteractiveLineOfSight(null, null, this.nearChests[m], null, character) && !flag)
			{
				float num8 = this.Dist(this.nearChests[m].gameObject.transform.position);
				if (num8 < num4)
				{
					num4 = num8;
					closestChest = this.nearChests[m];
				}
			}
		}
		num4 = 100000f;
		for (int n = 0; n < this.nearDoors.Count; n++)
		{
			if (Links.x.combat.CheckInteractiveLineOfSight(null, this.nearDoors[n], null, null, character) && !flag)
			{
				float num9 = this.Dist(this.nearDoors[n].lockColliderPosition);
				if (num9 < num4)
				{
					num4 = num9;
					closestDoor = this.nearDoors[n];
				}
			}
		}
		num4 = 100000f;
		int num10 = -1;
		for (int num11 = 0; num11 < 8; num11++)
		{
			float num12 = 100000f;
			if (num11 == 1 && closestEnemy)
			{
				num12 = this.Dist(closestEnemy.tr.position);
			}
			if (num11 == 5 && closestParty)
			{
				num12 = this.Dist(closestParty.tr.position);
			}
			if (!Links.x.pocketWheel.Charming())
			{
				if (num11 == 2 && closestBreakable)
				{
					num12 = this.Dist(closestBreakable.gameObject.transform.position);
				}
				if (num11 == 3 && closestChest)
				{
					num12 = this.Dist(closestChest.gameObject.transform.position);
				}
				if (num11 == 4 && closestDoor)
				{
					num12 = this.Dist(closestDoor.lockColliderPosition);
				}
				if (num11 == 7 && closestPuzzle)
				{
					num12 = this.Dist(closestPuzzle.gameObject.transform.position);
				}
			}
			if (num12 < num4)
			{
				num4 = num12;
				num10 = num11;
			}
		}
		if (num10 > -1)
		{
			if (num10 == 1 && closestEnemy)
			{
				GameObject gameObject7 = closestEnemy.gameObject;
				closestBreakable = null;
				closestChest = null;
				closestDoor = null;
				closestPuzzle = null;
				closestParty = null;
			}
			if (num10 == 5 && closestParty)
			{
				GameObject gameObject7 = closestParty.gameObject;
				closestBreakable = null;
				closestChest = null;
				closestDoor = null;
				closestPuzzle = null;
				closestEnemy = null;
			}
			if (num10 == 2 && closestBreakable)
			{
				closestEnemy = null;
				closestParty = null;
				GameObject gameObject7 = closestBreakable.gameObject;
				closestChest = null;
				closestDoor = null;
				closestPuzzle = null;
			}
			if (num10 == 3 && closestChest)
			{
				closestEnemy = null;
				closestParty = null;
				closestBreakable = null;
				GameObject gameObject7 = closestChest.gameObject;
				closestDoor = null;
				closestPuzzle = null;
			}
			if (num10 == 4 && closestDoor)
			{
				closestEnemy = null;
				closestParty = null;
				closestBreakable = null;
				closestChest = null;
				GameObject gameObject7 = closestDoor.gameObject;
				closestPuzzle = null;
			}
			if (num10 == 7 && closestPuzzle)
			{
				closestEnemy = null;
				closestParty = null;
				closestBreakable = null;
				closestChest = null;
				closestDoor = null;
				GameObject gameObject7 = closestPuzzle.gameObject;
			}
		}
	}

	// Token: 0x060004E3 RID: 1251 RVA: 0x0006E104 File Offset: 0x0006C304
	private float Dot(Vector3 p1)
	{
		Vector3 vector = Vector3.Normalize(p1 - this.mainPosition);
		return Vector3.Dot(this.forw, vector);
	}

	// Token: 0x060004E4 RID: 1252 RVA: 0x0006E130 File Offset: 0x0006C330
	private float Dot(Vector3 p1, Vector3 f)
	{
		Vector3 vector = Vector3.Normalize(p1 - this.mainPosition);
		return Vector3.Dot(f, vector);
	}

	// Token: 0x060004E5 RID: 1253 RVA: 0x0006E156 File Offset: 0x0006C356
	public int TargetCount()
	{
		return this.possibleTargets.Count;
	}

	// Token: 0x060004E6 RID: 1254 RVA: 0x0006E164 File Offset: 0x0006C364
	public int ItemCardCount()
	{
		int num = 0;
		num += this.possibleTargets.Count;
		if (this.synergies.Count > 0)
		{
			num += this.synergies.Count;
		}
		for (int i = 0; i < this.nearBreakables.Count; i++)
		{
			if (this.nearBreakables[i] && this.nearBreakables[i].combatTargetID != 0)
			{
				num++;
			}
		}
		for (int j = 0; j < this.nearDoors.Count; j++)
		{
			if (this.nearDoors[j] && this.nearDoors[j].combatTargetID != 0)
			{
				num++;
			}
		}
		for (int k = 0; k < this.nearChests.Count; k++)
		{
			if (this.nearChests[k] && this.nearChests[k].combatTargetID != 0)
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x060004E7 RID: 1255 RVA: 0x0006E260 File Offset: 0x0006C460
	public bool BreakableIsNear(BreakableActions c, Character main)
	{
		return (Links.x.combat.inPocketAttack && this.lastRallyTarget == c.gameObject) || (this.nearBreakables.Contains(c) && this.CheckInteractiveLineOfSight(c, null, null, null, main));
	}

	// Token: 0x060004E8 RID: 1256 RVA: 0x0006E2B4 File Offset: 0x0006C4B4
	public bool ChestIsNear(ChestActions c, Character main)
	{
		return (Links.x.combat.inPocketAttack && this.lastRallyTarget == c.gameObject) || (this.nearChests.Contains(c) && this.CheckInteractiveLineOfSight(null, null, c, null, main));
	}

	// Token: 0x060004E9 RID: 1257 RVA: 0x0006E308 File Offset: 0x0006C508
	public bool PuzzleIsNear(PuzzleActions c, Character main)
	{
		return (Links.x.combat.inPocketAttack && this.lastRallyTarget == c.gameObject) || (this.nearPuzzles.Contains(c) && this.CheckInteractiveLineOfSight(null, null, null, c, main));
	}

	// Token: 0x060004EA RID: 1258 RVA: 0x0006E35C File Offset: 0x0006C55C
	public bool DoorIsNear(DoorActions c, Character main)
	{
		return (Links.x.combat.inPocketAttack && this.lastRallyTarget == c.gameObject) || (this.nearDoors.Contains(c) && this.CheckInteractiveLineOfSight(null, c, null, null, main));
	}

	// Token: 0x060004EB RID: 1259 RVA: 0x0006E3AD File Offset: 0x0006C5AD
	public void ClearNearby()
	{
		this.nearBreakables.Clear();
		this.nearChests.Clear();
		this.nearPuzzles.Clear();
		this.nearDoors.Clear();
		this.possibleTargets.Clear();
	}

	// Token: 0x060004EC RID: 1260 RVA: 0x0006E3E8 File Offset: 0x0006C5E8
	public void SetPositionAtWorldPoint(RectTransform rt, Vector3 worldPoint)
	{
		Vector3 vector = Links.x.worldCamera.WorldToScreenPoint(worldPoint);
		vector.z = 0f;
		vector.x = vector.x * (1920f / (float)Screen.width) - 960f;
		vector.y = vector.y * (Links.x.canvasRT.sizeDelta.y / (float)Screen.height) - Links.x.canvasRT.sizeDelta.y / 2f;
		rt.localPosition = vector;
	}

	// Token: 0x060004ED RID: 1261 RVA: 0x0006E47D File Offset: 0x0006C67D
	public void ChangeScene()
	{
		this.miniGameCharacters.Clear();
	}

	// Token: 0x060004EE RID: 1262 RVA: 0x0006E48A File Offset: 0x0006C68A
	public void HighlightCharacter(bool state, Character character)
	{
	}

	// Token: 0x060004EF RID: 1263 RVA: 0x0006E48C File Offset: 0x0006C68C
	public void HighlightChest(bool state, ChestActions chest)
	{
	}

	// Token: 0x060004F0 RID: 1264 RVA: 0x0006E48E File Offset: 0x0006C68E
	public void HighlightBreakable(bool state, BreakableActions breakable)
	{
	}

	// Token: 0x060004F1 RID: 1265 RVA: 0x0006E490 File Offset: 0x0006C690
	public void HighlightDoor(bool state, DoorActions door)
	{
	}

	// Token: 0x060004F2 RID: 1266 RVA: 0x0006E492 File Offset: 0x0006C692
	public void HighlightPuzzle(bool state, PuzzleActions puzzle)
	{
	}

	// Token: 0x060004F3 RID: 1267 RVA: 0x0006E494 File Offset: 0x0006C694
	public void RemoveAllHighlights()
	{
		this.HighlightPuzzle(false, null);
		this.HighlightChest(false, null);
		this.HighlightDoor(false, null);
		this.HighlightBreakable(false, null);
		this.HighlightCharacter(false, null);
	}

	// Token: 0x060004F4 RID: 1268 RVA: 0x0006E4C0 File Offset: 0x0006C6C0
	public void AddRemoveInteraction(bool state, BreakableActions nearBreak, ChestActions nearChest, PuzzleActions nearPuzzle, DoorActions nearDoor)
	{
		if (nearBreak)
		{
			int num = this.nearBreakables.IndexOf(nearBreak);
			if (num == -1 && state)
			{
				this.nearBreakables.Add(nearBreak);
			}
			if (num > -1 && !state)
			{
				this.nearBreakables.RemoveAt(num);
				if (!Links.x.pocketWheel.Charming())
				{
					nearBreak.CombatSheen(0);
				}
			}
		}
		if (nearChest)
		{
			int num2 = this.nearChests.IndexOf(nearChest);
			if (num2 == -1 && state)
			{
				this.nearChests.Add(nearChest);
			}
			if (num2 > -1 && !state)
			{
				this.nearChests.RemoveAt(num2);
				if (!Links.x.pocketWheel.Charming())
				{
					nearChest.CombatSheen(0);
				}
			}
		}
		if (nearPuzzle)
		{
			int num3 = this.nearPuzzles.IndexOf(nearPuzzle);
			if (num3 == -1 && state && nearPuzzle.currentHealth > 0)
			{
				this.nearPuzzles.Add(nearPuzzle);
			}
			if (num3 > -1 && !state)
			{
				this.nearPuzzles.RemoveAt(num3);
				if (!Links.x.pocketWheel.Charming())
				{
					nearPuzzle.CombatSheen(0);
				}
			}
		}
		if (nearDoor)
		{
			int num4 = this.nearDoors.IndexOf(nearDoor);
			if (num4 == -1 && state)
			{
				this.nearDoors.Add(nearDoor);
			}
			if (num4 > -1 && !state)
			{
				this.nearDoors.RemoveAt(num4);
				if (!Links.x.pocketWheel.Charming())
				{
					nearDoor.CombatSheen(0);
				}
			}
		}
		if (Records.x.pocketPause)
		{
			this.GetTargets(false, false, null);
		}
	}

	// Token: 0x060004F5 RID: 1269 RVA: 0x0006E645 File Offset: 0x0006C845
	public bool InAttackDirection(Vector3 targetPosition)
	{
		return true;
	}

	// Token: 0x060004F6 RID: 1270 RVA: 0x0006E648 File Offset: 0x0006C848
	public bool CharacterHasSynergy(Character c)
	{
		return this.synergies.Contains(c);
	}

	// Token: 0x060004F7 RID: 1271 RVA: 0x0006E65C File Offset: 0x0006C85C
	public void UpdateRallyVisuals()
	{
		for (int i = 0; i < this.synergies.Count; i++)
		{
			if (this.synergies[i])
			{
				if (this.synergyFX[i])
				{
					this.synergyFX[i].SetActive(false);
					Links.x.cellar.ReturnPooledGameObject(87, this.synergyFX[i]);
				}
				this.synergies[i].body.CombatSheen(0);
			}
		}
		this.synergies.Clear();
		this.synergyFX.Clear();
		this.GetTargets(false, false, null);
	}

	// Token: 0x060004F8 RID: 1272 RVA: 0x0006E70C File Offset: 0x0006C90C
	public bool InRangeSight(Character attacker, Character target)
	{
		bool flag = false;
		if (!attacker.hasActions)
		{
			return true;
		}
		if (target)
		{
			RaycastHit raycastHit;
			if (Physics.SphereCast(attacker.torsoPosition, 0.1f, target.torsoPosition - attacker.torsoPosition, out raycastHit, Vector3.Distance(target.torsoPosition, attacker.torsoPosition), -2147483584))
			{
				SelectionCircle selectionCircle = raycastHit.collider.gameObject.GetComponent<SelectionCircle>();
				if (selectionCircle)
				{
					if (selectionCircle.character == attacker)
					{
						if (Physics.SphereCast(attacker.torsoPosition, 0.1f, target.torsoPosition - attacker.torsoPosition, out raycastHit, Vector3.Distance(target.torsoPosition, attacker.torsoPosition), -2147483584))
						{
							selectionCircle = raycastHit.collider.gameObject.GetComponent<SelectionCircle>();
							if (selectionCircle)
							{
								if (selectionCircle.character == target || !attacker.actions.ai.CanAttack(selectionCircle.character))
								{
									flag = true;
								}
							}
							else
							{
								Character component = raycastHit.collider.gameObject.GetComponent<Character>();
								if (component && (component == target || !attacker.actions.ai.CanAttack(component)))
								{
									flag = true;
								}
							}
						}
					}
					else if (selectionCircle.character == target || !attacker.actions.ai.CanAttack(selectionCircle.character))
					{
						flag = true;
					}
				}
				else
				{
					Character component2 = raycastHit.collider.gameObject.GetComponent<Character>();
					if (component2 && (component2 == target || !attacker.actions.ai.CanAttack(component2)))
					{
						flag = true;
					}
				}
			}
			else
			{
				flag = true;
			}
		}
		return flag;
	}

	// Token: 0x060004F9 RID: 1273 RVA: 0x0006E8CC File Offset: 0x0006CACC
	public bool OnScreen(Character target, Vector3 cameraDirection)
	{
		if (false)
		{
			float characterHeight = target.characterHeight;
			Vector3 position = target.tr.position;
			float num = target.RealRadius();
			Vector3 vector = position + cameraDirection * num;
			Vector3 vector2 = position + cameraDirection * num * -1f;
			Vector3 vector3 = vector + new Vector3(0f, target.characterHeight, 0f);
			Vector3 vector4 = vector2 + new Vector3(0f, target.characterHeight, 0f);
			Camera worldCamera = Links.x.worldCamera;
			int width = Screen.width;
			int height = Screen.height;
			Vector3 vector5 = worldCamera.WorldToScreenPoint(vector);
			Vector3 vector6 = worldCamera.WorldToScreenPoint(vector2);
			Vector3 vector7 = worldCamera.WorldToScreenPoint(vector4);
			Vector3 vector8 = worldCamera.WorldToScreenPoint(vector3);
			if (vector6.x <= 0f && vector7.x <= 0f)
			{
				return false;
			}
			if (vector5.x >= (float)width && vector8.x >= (float)width)
			{
				return false;
			}
			if (vector7.y <= 0f && vector8.y <= 0f)
			{
				return false;
			}
			if (vector6.y >= (float)height && vector5.y >= (float)height)
			{
				return false;
			}
		}
		return true;
	}

	// Token: 0x060004FA RID: 1274 RVA: 0x0006EA04 File Offset: 0x0006CC04
	public bool CheckInteractiveLineOfSight(BreakableActions breakable, DoorActions door, ChestActions chest, PuzzleActions puzzle, Character main)
	{
		Vector3 vector = main.tr.position;
		GameObject gameObject = null;
		if (Links.x.gameplay.spellTargetingGround || Links.x.gameplay.spellTargetingEnemy || Links.x.gameplay.spellTargetingParty)
		{
			return false;
		}
		if (breakable)
		{
			vector = breakable.mainCollider.bounds.center;
			gameObject = breakable.gameObject;
		}
		if (door)
		{
			vector = door.lockColliderPosition;
			gameObject = door.gameObject;
		}
		if (puzzle)
		{
			vector = puzzle.gameObject.transform.position;
			gameObject = puzzle.gameObject;
		}
		if (chest)
		{
			vector = chest.tr.position + new Vector3(0f, 1f, 0f);
			gameObject = chest.mainCollider.gameObject;
		}
		float sqrMagnitude = (vector - main.currentPosition).sqrMagnitude;
		float num = main.AttackRange();
		if (sqrMagnitude < num * num)
		{
			vector.y += 0.5f;
			RaycastHit raycastHit;
			bool flag = Physics.SphereCast(main.raycastPosition, 0.25f, vector - main.raycastPosition, out raycastHit, num, 2163200);
			if (flag)
			{
				if (raycastHit.collider.gameObject == gameObject)
				{
					flag = false;
				}
				else if (raycastHit.collider.gameObject.transform.parent && raycastHit.collider.gameObject.transform.parent.gameObject == gameObject)
				{
					flag = false;
				}
			}
			return !flag;
		}
		return false;
	}

	// Token: 0x060004FB RID: 1275 RVA: 0x0006EBB1 File Offset: 0x0006CDB1
	public void PerfectDodge(Character main, Character target)
	{
		if (this.dodgeCoroutine == null)
		{
			this.dodgeCoroutine = this.PerfectDodgeSlow(main, target);
			base.StartCoroutine(this.dodgeCoroutine);
			return;
		}
		main.FullAttackTime();
	}

	// Token: 0x060004FC RID: 1276 RVA: 0x0006EBDD File Offset: 0x0006CDDD
	private IEnumerator PerfectDodgeSlow(Character main, Character target)
	{
		MasterAudio.PlaySoundAndForget("Synergy Pass", Random.Range(0.8f, 0.9f), new float?(1f), 0f, "", null);
		this.StartSlowTime("Synergy");
		Links.x.rtsCamera.Zoom(true, "MainCharacterQTERange");
		Links.x.hudControl.attackTimerAnimator.gameObject.transform.localScale = Vector3.one * 1.5f;
		float startValue = main.attackTime;
		float endValue = 1f;
		float timeToLerp = 0.125f;
		float percentage = 0f;
		float startTime = Time.timeSinceLevelLoad;
		while (percentage < 1f)
		{
			Links.x.hudControl.attackTimerAnimator.gameObject.transform.localScale = Vector3.one * 1.5f;
			main.inventoryTime = 0f;
			percentage = (Time.time - startTime) / timeToLerp;
			main.attackTime = Mathf.Lerp(startValue, endValue, percentage);
			main.portrait.SetActionBar(main.attackTime);
			main.portrait.skillBag.SetSelectedState();
			Links.x.hudControl.UpdateAttackTime(main.attackTime, 1f, 0f);
			yield return null;
		}
		timeToLerp = 1f;
		percentage = 0f;
		startTime = Time.timeSinceLevelLoad;
		while (percentage < 1f)
		{
			percentage = (Time.time - startTime) / timeToLerp;
			yield return null;
		}
		if (!Records.x.pocketPause)
		{
			Links.x.rtsCamera.Zoom(false, "");
			Links.x.hudControl.attackTimerAnimator.gameObject.transform.localScale = Vector3.one;
		}
		main.FullAttackTime();
		this.dodgeCoroutine = null;
		yield break;
	}

	// Token: 0x060004FD RID: 1277 RVA: 0x0006EBF4 File Offset: 0x0006CDF4
	public void SwitchLethality()
	{
		int count = this.allCharacters.Count;
		for (int i = 0; i < count; i++)
		{
			Character character = this.allCharacters[i];
			if (character && character.npc && (!character.stunned || (character.stunned && Records.x.kill)) && !character.dead && !character.inactive)
			{
				character.CircleAnimation("");
			}
		}
	}

	// Token: 0x060004FE RID: 1278 RVA: 0x0006EC70 File Offset: 0x0006CE70
	public void GetDistances(Character pathfinder, Character target, out float bestDistance, out float maxDistance, out float minDistance)
	{
		float meleeRangeEnd = pathfinder.invRow1._MeleeRangeEnd;
		bestDistance = (meleeRangeEnd * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius - 0.65f) * (meleeRangeEnd * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius - 0.65f);
		maxDistance = (meleeRangeEnd * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius) * (meleeRangeEnd * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius);
		minDistance = (pathfinder.invRow1._MeleeRangeStart * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius) * (pathfinder.invRow1._MeleeRangeStart * Records.x.nodeSize + pathfinder.attackRadius + target.attackRadius);
		if (minDistance == maxDistance || pathfinder.invRow1._MeleeRangeStart == 0f)
		{
			minDistance = 0f;
		}
		if (bestDistance < minDistance)
		{
			bestDistance = minDistance;
		}
	}

	// Token: 0x060004FF RID: 1279 RVA: 0x0006ED80 File Offset: 0x0006CF80
	public bool NodeCalled(GraphNode n)
	{
		for (int i = 0; i < this.targetNodes.Count; i++)
		{
			if (n == this.targetNodes[i])
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000500 RID: 1280 RVA: 0x0006EDB8 File Offset: 0x0006CFB8
	public void GetNodeCalled()
	{
		this.targetNodes.Clear();
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && character.hasActions && character.actions.targetMovePosition != null)
			{
				this.targetNodes.Add(character.actions.targetMovePosition);
			}
		}
	}

	// Token: 0x06000501 RID: 1281 RVA: 0x0006EE28 File Offset: 0x0006D028
	public int OverlapCount()
	{
		return this.overlapping.Count;
	}

	// Token: 0x06000502 RID: 1282 RVA: 0x0006EE38 File Offset: 0x0006D038
	public Vector3 SubtractVectors(Vector3 a, Vector3 b)
	{
		Vector3 vector;
		vector.x = a.x - b.x;
		vector.y = a.y - b.y;
		vector.z = a.z - b.z;
		return vector;
	}

	// Token: 0x06000503 RID: 1283 RVA: 0x0006EE84 File Offset: 0x0006D084
	public Vector3 AddVectors(Vector3 a, Vector3 b)
	{
		Vector3 vector;
		vector.x = a.x + b.x;
		vector.y = a.y + b.y;
		vector.z = a.z + b.z;
		return vector;
	}

	// Token: 0x06000504 RID: 1284 RVA: 0x0006EED0 File Offset: 0x0006D0D0
	public Vector3 AddVectorY(Vector3 a, float b)
	{
		Vector3 vector;
		vector.x = a.x;
		vector.y = a.y + b;
		vector.z = a.z;
		return vector;
	}

	// Token: 0x06000505 RID: 1285 RVA: 0x0006EF08 File Offset: 0x0006D108
	public int GetNPCCount()
	{
		int num = 0;
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && this.characters[i].npc)
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x06000506 RID: 1286 RVA: 0x0006EF58 File Offset: 0x0006D158
	public int GetNPCCountHostile()
	{
		if (this.npcOnlyCombat)
		{
			return 0;
		}
		int num = 0;
		for (int i = 0; i < this.characters.Count; i++)
		{
			if (this.characters[i] && this.characters[i].npc && (this.characters[i].attackingUntilBribe || this.characters[i].hostility >= 2))
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x06000507 RID: 1287 RVA: 0x0006EFDC File Offset: 0x0006D1DC
	public Character FindTargetInRange(Character attacker)
	{
		for (int i = 0; i < this.characters.Count; i++)
		{
			Character character = this.characters[i];
			if (character && ((character.npc && !attacker.npc) || (attacker.npc && !character.npc)))
			{
				float num = attacker.invRow1._MeleeRangeStart * Records.x.nodeSize * (attacker.invRow1._MeleeRangeStart * Records.x.nodeSize);
				float num2 = attacker.invRow1._MeleeRangeEnd * Records.x.nodeSize + attacker.attackRadius + character.attackRadius;
				float num3 = num2 * num2;
				float sqrMagnitude = ((Vector3)character.node.position - (Vector3)attacker.node.position).sqrMagnitude;
				if (sqrMagnitude <= num3 && sqrMagnitude >= num)
				{
					return character;
				}
			}
		}
		return null;
	}

	// Token: 0x04000765 RID: 1893
	[Header("TURNS")]
	public string currentTurn;

	// Token: 0x04000766 RID: 1894
	private IEnumerator combatEnd;

	// Token: 0x04000767 RID: 1895
	private IEnumerator combatStart;

	// Token: 0x04000768 RID: 1896
	public bool playerStartedCombat;

	// Token: 0x04000769 RID: 1897
	public bool preDome;

	// Token: 0x0400076A RID: 1898
	public bool npcsInCombat;

	// Token: 0x0400076B RID: 1899
	public bool attackingInteractiveOutsideOfCombat;

	// Token: 0x0400076C RID: 1900
	public bool miniEvent;

	// Token: 0x0400076D RID: 1901
	public bool bubbleEvent;

	// Token: 0x0400076E RID: 1902
	public float domeDistance;

	// Token: 0x0400076F RID: 1903
	public Character comboTargetHover;

	// Token: 0x04000770 RID: 1904
	public Character currentTurnCharacter;

	// Token: 0x04000771 RID: 1905
	public Character characterStartingAttack;

	// Token: 0x04000772 RID: 1906
	public Character rallyCharacter;

	// Token: 0x04000773 RID: 1907
	public Character rallyTarget;

	// Token: 0x04000774 RID: 1908
	public Character pocketTarget;

	// Token: 0x04000775 RID: 1909
	public Character bubbleEventTarget;

	// Token: 0x04000776 RID: 1910
	public bool characterInTurn;

	// Token: 0x04000777 RID: 1911
	public bool waitingForOverlap;

	// Token: 0x04000778 RID: 1912
	public bool slowingTime;

	// Token: 0x04000779 RID: 1913
	public bool slowingTimeForLastDeath;

	// Token: 0x0400077A RID: 1914
	public bool slowTimeHold;

	// Token: 0x0400077B RID: 1915
	public bool slowTimePause;

	// Token: 0x0400077C RID: 1916
	public bool npcOnlyCombat;

	// Token: 0x0400077D RID: 1917
	public bool pickingRally;

	// Token: 0x0400077E RID: 1918
	public bool inRally;

	// Token: 0x0400077F RID: 1919
	public bool inPocketAttack;

	// Token: 0x04000780 RID: 1920
	public int undeadCount;

	// Token: 0x04000781 RID: 1921
	public int allDeadCount;

	// Token: 0x04000782 RID: 1922
	public int rallyAttacks;

	// Token: 0x04000783 RID: 1923
	public int rallyDamage;

	// Token: 0x04000784 RID: 1924
	public GameObject synergySpaceFX;

	// Token: 0x04000785 RID: 1925
	public GameObject synergySpaceFX2;

	// Token: 0x04000786 RID: 1926
	public GameObject pocketFX;

	// Token: 0x04000787 RID: 1927
	public GameObject lastRallyTarget;

	// Token: 0x04000788 RID: 1928
	public Vector3 centralEnemyPosition;

	// Token: 0x04000789 RID: 1929
	public Vector3 bubbleEventTargetPosition;

	// Token: 0x0400078A RID: 1930
	public Vector3 pocketTargetPosition;

	// Token: 0x0400078B RID: 1931
	public int npcCount;

	// Token: 0x0400078C RID: 1932
	public int groupCount;

	// Token: 0x0400078D RID: 1933
	[Header("LISTS")]
	public List<Character> characters = new List<Character>();

	// Token: 0x0400078E RID: 1934
	private List<Character> groupCharacters = new List<Character>();

	// Token: 0x0400078F RID: 1935
	private List<Character> triedCharacters = new List<Character>();

	// Token: 0x04000790 RID: 1936
	public List<Character> npcsThatCanGroup = new List<Character>();

	// Token: 0x04000791 RID: 1937
	private List<GraphNode> groupNodes = new List<GraphNode>();

	// Token: 0x04000792 RID: 1938
	private List<GraphNode> targetNodes = new List<GraphNode>();

	// Token: 0x04000793 RID: 1939
	private List<Character> inRange = new List<Character>();

	// Token: 0x04000794 RID: 1940
	private List<GraphNode> possibleCenters = new List<GraphNode>();

	// Token: 0x04000795 RID: 1941
	private List<int> allNodesTaken = new List<int>();

	// Token: 0x04000796 RID: 1942
	public List<EnemyGroup> enemyGroups = new List<EnemyGroup>();

	// Token: 0x04000797 RID: 1943
	public List<float> charactersLastActionTime = new List<float>();

	// Token: 0x04000798 RID: 1944
	public List<Character> needsTurn = new List<Character>();

	// Token: 0x04000799 RID: 1945
	public List<Character> delayedAttacks = new List<Character>();

	// Token: 0x0400079A RID: 1946
	public List<Character> overlapping = new List<Character>();

	// Token: 0x0400079B RID: 1947
	public List<Character> synergies = new List<Character>();

	// Token: 0x0400079C RID: 1948
	private List<GameObject> synergyFX = new List<GameObject>();

	// Token: 0x0400079D RID: 1949
	private List<Character> changingMap;

	// Token: 0x0400079E RID: 1950
	private List<float> changingMapDistance;

	// Token: 0x0400079F RID: 1951
	private List<Character> allCharacters;

	// Token: 0x040007A0 RID: 1952
	private List<GraphNode> allNodes;

	// Token: 0x040007A1 RID: 1953
	private List<GraphNode> allDomeNodes;

	// Token: 0x040007A2 RID: 1954
	public List<GraphNode> domeNodes = new List<GraphNode>();

	// Token: 0x040007A3 RID: 1955
	public List<GraphNode> tempDomeNodes = new List<GraphNode>();

	// Token: 0x040007A4 RID: 1956
	public List<int> partyXP = new List<int>();

	// Token: 0x040007A5 RID: 1957
	public List<Character> partyCharacterXP = new List<Character>();

	// Token: 0x040007A6 RID: 1958
	public List<Character> reduceHostilities = new List<Character>();

	// Token: 0x040007A7 RID: 1959
	public List<float> reduceHostilitiesTimes = new List<float>();

	// Token: 0x040007A8 RID: 1960
	public List<BreakableActions> nearBreakables = new List<BreakableActions>();

	// Token: 0x040007A9 RID: 1961
	public List<ChestActions> nearChests = new List<ChestActions>();

	// Token: 0x040007AA RID: 1962
	public List<PuzzleActions> nearPuzzles = new List<PuzzleActions>();

	// Token: 0x040007AB RID: 1963
	public List<DoorActions> nearDoors = new List<DoorActions>();

	// Token: 0x040007AC RID: 1964
	private List<TimedBreakable> timedBreakables;

	// Token: 0x040007AD RID: 1965
	private List<BreakableActions> diaBreakables;

	// Token: 0x040007AE RID: 1966
	private List<DoorActions> diaDoors;

	// Token: 0x040007AF RID: 1967
	private List<ChestActions> diaChests;

	// Token: 0x040007B0 RID: 1968
	private List<Character> party;

	// Token: 0x040007B1 RID: 1969
	public List<TimelineIcon> timelineIcons = new List<TimelineIcon>();

	// Token: 0x040007B2 RID: 1970
	public List<Projectile> projectiles = new List<Projectile>();

	// Token: 0x040007B3 RID: 1971
	private List<MeshRenderer> gridMeshes1 = new List<MeshRenderer>();

	// Token: 0x040007B4 RID: 1972
	private List<MeshRenderer> gridMeshes2 = new List<MeshRenderer>();

	// Token: 0x040007B5 RID: 1973
	private List<int> gridMeshTypes = new List<int>();

	// Token: 0x040007B6 RID: 1974
	private List<MeshRenderer> domeMeshes = new List<MeshRenderer>();

	// Token: 0x040007B7 RID: 1975
	private List<GraphNode> targetingNodes = new List<GraphNode>();

	// Token: 0x040007B8 RID: 1976
	private List<GraphNode> tempPath;

	// Token: 0x040007B9 RID: 1977
	private List<GraphNode> tempNodes = new List<GraphNode>();

	// Token: 0x040007BA RID: 1978
	private List<GraphNode> savedNodes = new List<GraphNode>();

	// Token: 0x040007BB RID: 1979
	private List<bool> targetingBool = new List<bool>();

	// Token: 0x040007BC RID: 1980
	private List<float> targetingDist = new List<float>();

	// Token: 0x040007BD RID: 1981
	private List<Character> orderedTargets = new List<Character>();

	// Token: 0x040007BE RID: 1982
	private List<Character> orderedTargetsTemp = new List<Character>();

	// Token: 0x040007BF RID: 1983
	private List<TileEffects> currentTileEffects;

	// Token: 0x040007C0 RID: 1984
	private List<TileEffects> currentTileEffectsTemp = new List<TileEffects>();

	// Token: 0x040007C1 RID: 1985
	[Header("UI")]
	public Vector3 domeCenter;

	// Token: 0x040007C2 RID: 1986
	public Animator combatHudAnim;

	// Token: 0x040007C3 RID: 1987
	public GameObject doveObject;

	// Token: 0x040007C4 RID: 1988
	public GameObject endTurnObject;

	// Token: 0x040007C5 RID: 1989
	private Transform domeTr;

	// Token: 0x040007C6 RID: 1990
	public bool domeOn;

	// Token: 0x040007C7 RID: 1991
	private float startCombatEnd;

	// Token: 0x040007C8 RID: 1992
	public TextMeshProUGUI playerTurnUI;

	// Token: 0x040007C9 RID: 1993
	public TextMeshProUGUI enemyTurnUI;

	// Token: 0x040007CA RID: 1994
	public TextMeshProTypewriterEffect typeWriterPlayerTurnUI;

	// Token: 0x040007CB RID: 1995
	public TextMeshProTypewriterEffect typeWriterEnemyTurnUI;

	// Token: 0x040007CC RID: 1996
	public List<Character> possibleTargets = new List<Character>();

	// Token: 0x040007CD RID: 1997
	private List<Character> characterTargets;

	// Token: 0x040007CE RID: 1998
	public Material radiusGemEnemyTurn;

	// Token: 0x040007CF RID: 1999
	public Material radiusGemPlayerTurn;

	// Token: 0x040007D0 RID: 2000
	public Material radiusGemNoTurn;

	// Token: 0x040007D1 RID: 2001
	public Image huddleFill;

	// Token: 0x040007D2 RID: 2002
	public float targetUpdateTime;

	// Token: 0x040007D3 RID: 2003
	private bool endingCombat;

	// Token: 0x040007D4 RID: 2004
	[Header("MISC")]
	public bool showDebugs;

	// Token: 0x040007D5 RID: 2005
	[Header("MISC")]
	public bool debugTargets;

	// Token: 0x040007D6 RID: 2006
	private List<GraphNode> nodes;

	// Token: 0x040007D7 RID: 2007
	private IEnumerator partyTargetCoroutine;

	// Token: 0x040007D8 RID: 2008
	private IEnumerator radiusCoroutine;

	// Token: 0x040007D9 RID: 2009
	private IEnumerator endCoroutine;

	// Token: 0x040007DA RID: 2010
	private IEnumerator groupCorout;

	// Token: 0x040007DB RID: 2011
	private IEnumerator dodgeCoroutine;

	// Token: 0x040007DC RID: 2012
	private NNConstraint nodeConstraint = new NNConstraint();

	// Token: 0x040007DD RID: 2013
	private NNConstraint groupConstraint = new NNConstraint();

	// Token: 0x040007DE RID: 2014
	public bool combatCinematics;

	// Token: 0x040007DF RID: 2015
	public bool updateSelected;

	// Token: 0x040007E0 RID: 2016
	public bool updateCircles;

	// Token: 0x040007E1 RID: 2017
	private WaitForSeconds delayShort = new WaitForSeconds(0.001f);

	// Token: 0x040007E2 RID: 2018
	private WaitForSeconds delayHalfSecond = new WaitForSeconds(0.5f);

	// Token: 0x040007E3 RID: 2019
	private WaitForSeconds delayQuarterSecond = new WaitForSeconds(0.25f);

	// Token: 0x040007E4 RID: 2020
	private Plane[] planes = new Plane[0];

	// Token: 0x040007E5 RID: 2021
	private StringFast str = new StringFast(32);

	// Token: 0x040007E6 RID: 2022
	public List<Character> miniGameCharacters = new List<Character>();

	// Token: 0x040007E7 RID: 2023
	public Vector3 rallyStartPosition;

	// Token: 0x040007E8 RID: 2024
	public Vector3 rallyCharacterStartPosition;

	// Token: 0x040007E9 RID: 2025
	public GameObject pocketParticle;

	// Token: 0x040007EA RID: 2026
	private WaitForSeconds delaySecond = new WaitForSeconds(1f);

	// Token: 0x040007EB RID: 2027
	private float shaderTimeFlash;

	// Token: 0x040007EC RID: 2028
	private float shaderFlashTarget;

	// Token: 0x040007ED RID: 2029
	private bool shaderFlash;

	// Token: 0x040007EE RID: 2030
	public float timeTarget;

	// Token: 0x040007EF RID: 2031
	public float timeScale;

	// Token: 0x040007F0 RID: 2032
	public float startTime;

	// Token: 0x040007F1 RID: 2033
	public float slowSpeed;

	// Token: 0x040007F2 RID: 2034
	public float startTimeHoldDeltaTime;

	// Token: 0x040007F3 RID: 2035
	public float combatStartTime;

	// Token: 0x040007F4 RID: 2036
	private bool startTimeHold;

	// Token: 0x040007F5 RID: 2037
	public Character exileCharacter;

	// Token: 0x040007F6 RID: 2038
	public bool isJustice;

	// Token: 0x040007F7 RID: 2039
	private Vector3 mainPosition;

	// Token: 0x040007F8 RID: 2040
	private Vector3 forw;

	// Token: 0x040007F9 RID: 2041
	private GameObject prevClosestItem;

	// Token: 0x040007FA RID: 2042
	public GameObject targetArrow;

	// Token: 0x040007FB RID: 2043
	public TextMeshProUGUI targetBtnText;

	// Token: 0x040007FC RID: 2044
	public RectTransform targetArrowRT;

	// Token: 0x040007FD RID: 2045
	private float characterAddedTime;

	// Token: 0x040007FE RID: 2046
	public float lastJusticeTime;

	// Token: 0x040007FF RID: 2047
	public float lastPinTime;

	// Token: 0x04000800 RID: 2048
	public float lastChargeTime;

	// Token: 0x04000801 RID: 2049
	public string charmFail;

	// Token: 0x04000802 RID: 2050
	private float lastGroupTime;

	// Token: 0x04000803 RID: 2051
	private List<GraphNode> possibleGroupNodes = new List<GraphNode>();

	// Token: 0x04000804 RID: 2052
	private List<Character> possibleGroupNodeCharacters = new List<Character>();

	// Token: 0x04000805 RID: 2053
	public bool hoverShowTargets;

	// Token: 0x04000806 RID: 2054
	public string hoverShowTargetsType;

	// Token: 0x04000807 RID: 2055
	public Character hoverShowTargetCharacter;
}
