using System;
using System.Collections;
using System.Collections.Generic;
using Pathfinding;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;

// Token: 0x0200002E RID: 46
public class Fellowship : MonoBehaviour
{
	// Token: 0x060006EF RID: 1775 RVA: 0x00094B38 File Offset: 0x00092D38
	private void Start()
	{
		this.playerInput = base.gameObject.GetComponent<PlayerInput>();
		this.moveAction = this.playerInput.actions["Move"];
		this.directionAction = this.playerInput.actions["Target"];
		this.party = Links.x.party;
		this.waypoint = Links.x.cellar.GetPooledGameObject(0);
		this.waypoint.SetActive(false);
		this.waypointAnimator = this.waypoint.transform.GetChild(0).gameObject.GetComponent<Animator>();
		this.waypoint.transform.parent = base.transform;
		this.gameplayCircleTiles = Links.x.gameplay.circleTiles;
		this.nodeConstraintDir.constrainWalkability = true;
		this.nodeConstraintDir.walkable = true;
		this.nodeConstraintDir.constrainTags = false;
		this.nodeConstraintDir.checkCircleID = 0;
		this.nodeConstraintDir.passID = 0;
		this.nodeConstraintDir.passID2 = 0;
		this.nodeConstraintDir.constrainPenalty = 0;
		this.nodeConstraintDir.checkConnections = 8;
		this.nodeConstraintDir.constrainToArea = -1;
		Shader.SetGlobalVector("_JoystickDirection", Links.x.gameplay.farPosition);
		this.checkTime = Time.timeSinceLevelLoad;
		this.portraitParentRoleSheet = Links.x.characterSheet.portraitParent;
		this.currentFormationPoints = this.formationPoints1;
		this.GetFormation();
	}

	// Token: 0x060006F0 RID: 1776 RVA: 0x00094CC6 File Offset: 0x00092EC6
	public int CharacterIndex(Character character)
	{
		return this.party.IndexOf(character);
	}

	// Token: 0x060006F1 RID: 1777 RVA: 0x00094CD4 File Offset: 0x00092ED4
	public int GroupLevel()
	{
		int num = 0;
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character && character.IsSentient() && character.party)
			{
				num += character.stats.level;
			}
		}
		return num;
	}

	// Token: 0x060006F2 RID: 1778 RVA: 0x00094D30 File Offset: 0x00092F30
	public void SetPartyNodes(string type)
	{
		bool flag = false;
		if (type == "Moving")
		{
			flag = true;
		}
		for (int i = 0; i < this.party.Count; i++)
		{
			if (!this.party[i].CanMove())
			{
				this.party[i].SetNodeID(true, flag);
			}
		}
	}

	// Token: 0x060006F3 RID: 1779 RVA: 0x00094D8A File Offset: 0x00092F8A
	public void NewScene()
	{
		this.nodeConstraint = new NNConstraint();
		this.nodeConstraintParty = new NNConstraint();
		this.nodeConstraintFormation = new NNConstraint();
		this.mouseNode = null;
		this.canPath = true;
	}

	// Token: 0x060006F4 RID: 1780 RVA: 0x00094DBC File Offset: 0x00092FBC
	public GraphNode NearNode(Vector3 pos, bool checkEmpty, bool overWater, bool spellTargetingGround, int checkCircle, int area)
	{
		if (!Links.x.gaia.pathfindingReady)
		{
			return null;
		}
		this.nodeConstraint.constrainWalkability = true;
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainTags = checkEmpty;
		this.nodeConstraintDir.checkCircleID = checkCircle;
		this.nodeConstraint.passID = 0;
		this.nodeConstraint.passID2 = 0;
		this.nodeConstraint.constrainPenalty = 0;
		this.nodeConstraint.checkConnections = 0;
		this.nodeConstraint.constrainToArea = area;
		if (overWater)
		{
			this.nodeConstraint.constrainToEnvironment = 2;
		}
		else if (spellTargetingGround)
		{
			this.nodeConstraint.constrainToEnvironment = 3;
		}
		else
		{
			this.nodeConstraint.constrainToEnvironment = 1;
		}
		if (!(AstarPath.active != null))
		{
			return null;
		}
		GraphNode node = AstarPath.active.GetNearest(pos, this.nodeConstraint).node;
		if (node != null)
		{
			return node;
		}
		return null;
	}

	// Token: 0x060006F5 RID: 1781 RVA: 0x00094EA8 File Offset: 0x000930A8
	public bool GetDirection(Character character, out Quaternion rot, out Vector3 moveSpeed)
	{
		rot = Quaternion.Euler(Vector3.zero);
		moveSpeed = Vector3.zero;
		if (Links.x.joy && (Links.x.gameplay.hudLeftOpen || Links.x.gameplay.hudRightOpen || Links.x.gameplay.descWindowOpen))
		{
			this.joyStickDown = true;
			return false;
		}
		if (Links.x.joy && (this.joyStickDown || Links.x.gameplay.aimHold || Links.x.gameplay.gameFeedScrolling || Links.x.gameplay.makeCircleMode))
		{
			return false;
		}
		if (Records.x.paused)
		{
			return false;
		}
		float num = this.angle;
		Quaternion rot2 = character.rot;
		this.angle = Mathf.Atan2(this.move.x, this.move.y) / 3.1415927f * 180f;
		if (this.angle < 0f)
		{
			this.angle += 360f;
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Left")))
		{
			this.keyDown = "Left";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Right")))
		{
			this.keyDown = "Right";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Up")))
		{
			this.keyDown = "Up";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Down")))
		{
			this.keyDown = "Down";
		}
		if (this.keyDown == "Left" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Right" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Up" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Down" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
		{
			this.keyDown = "";
		}
		float y = Links.x.worldCamera.transform.rotation.eulerAngles.y;
		bool flag = false;
		if (Links.x.mk)
		{
			if (Input.GetMouseButton(0) && Links.x.pathfind)
			{
				float num2 = 0.5f;
				if (!Links.x.worldCamera.orthographic)
				{
					num2 = 1.25f;
				}
				Vector3 right = Links.x.rtsCamera.gameObject.transform.right;
				Vector3 vector = character.tr.position + right * -1f * num2;
				Vector3 vector2 = character.tr.position + right * num2;
				Vector3 vector3 = character.tr.position + new Vector3(0f, num2, 0f);
				Vector3 vector4 = character.tr.position - new Vector3(0f, num2, 0f);
				Vector3 vector5 = Links.x.worldCamera.WorldToViewportPoint(character.tr.position);
				Vector3 vector6 = Links.x.worldCamera.WorldToViewportPoint(vector);
				Vector3 vector7 = Links.x.worldCamera.WorldToViewportPoint(vector2);
				Vector3 vector8 = Links.x.worldCamera.WorldToViewportPoint(vector3);
				Vector3 vector9 = Links.x.worldCamera.WorldToViewportPoint(vector4);
				Vector2 vector10 = new Vector2(vector5.x, vector5.y) - new Vector2(0.5f, 0.5f);
				new Vector2(vector5.x, vector5.y) - new Vector2(Input.mousePosition.x / (float)Screen.width, Input.mousePosition.y / (float)Screen.height);
				Vector3 vector11 = new Vector3(Input.mousePosition.x / (float)Screen.width, Input.mousePosition.y / (float)Screen.height, 0f);
				float num3 = Mathf.Atan2(Input.mousePosition.x / (float)Screen.width - (0.5f + vector10.x), Input.mousePosition.y / (float)Screen.height - (0.5f + vector10.y)) / 3.1415927f * 180f;
				if (vector11.x > vector6.x && vector11.x < vector7.x && vector11.y > vector9.y && vector11.y < vector8.y && character.mainSelected)
				{
					this.angle = num;
				}
				else
				{
					character.fellowshipMod = 1f;
					this.angle = num3;
				}
				rot = Quaternion.Euler(new Vector3(0f, this.angle + y, 0f));
				flag = true;
			}
			else
			{
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 315f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 45f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 225f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 135f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
				{
					if (this.keyDown == "Left")
					{
						rot = Quaternion.Euler(new Vector3(0f, 270f + y, 0f));
						flag = true;
					}
					else
					{
						rot = Quaternion.Euler(new Vector3(0f, 90f + y, 0f));
						flag = true;
					}
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
				{
					if (this.keyDown == "Down")
					{
						rot = Quaternion.Euler(new Vector3(0f, 180f + y, 0f));
						flag = true;
					}
					else
					{
						rot = Quaternion.Euler(new Vector3(0f, 0f + y, 0f));
						flag = true;
					}
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 270f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 90f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 180f + y, 0f));
					flag = true;
				}
				if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
				{
					rot = Quaternion.Euler(new Vector3(0f, 0f + y, 0f));
					flag = true;
				}
			}
		}
		if (Links.x.mk)
		{
			if (flag)
			{
				this.t += Time.deltaTime;
				if (this.t > 1f)
				{
					this.t = 1f;
				}
			}
			else
			{
				this.t -= Time.deltaTime;
				if (this.t < 0f)
				{
					this.t = 0f;
				}
			}
			moveSpeed = new Vector3(this.t, 0f, this.t);
		}
		if (Links.x.joy)
		{
			rot = Quaternion.Euler(new Vector3(0f, this.angle + y, 0f));
			if (this.angle > 0f)
			{
				flag = true;
			}
			moveSpeed = new Vector3(this.move.x, 0f, this.move.y);
		}
		if (flag && character.mainSelected)
		{
			this.formationHead.rotation = Quaternion.LookRotation(Links.x.main.tr.position + rot * Vector3.forward * 0.5f - Links.x.main.tr.position);
		}
		return flag;
	}

	// Token: 0x060006F6 RID: 1782 RVA: 0x00095994 File Offset: 0x00093B94
	public bool MakeDirectionalWaypoint(bool endOfPath)
	{
		if (!Links.x.main || Links.x.main)
		{
			return false;
		}
		if (Links.x.joy)
		{
			this.joyStickDown = true;
			return false;
		}
		if (Links.x.joy && this.joyStickDown)
		{
			return false;
		}
		if (Records.x.paused)
		{
			return false;
		}
		Vector3 zero = Vector3.zero;
		Quaternion quaternion = Quaternion.Euler(Vector3.zero);
		float num = Mathf.Atan2(this.move.x, this.move.y) / 3.1415927f * 180f;
		if (num < 0f)
		{
			num += 360f;
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Left")))
		{
			this.keyDown = "Left";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Right")))
		{
			this.keyDown = "Right";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Up")))
		{
			this.keyDown = "Up";
		}
		if (Input.GetKeyDown(Links.x.gameplay.keyControl.GetHotkey("Down")))
		{
			this.keyDown = "Down";
		}
		if (this.keyDown == "Left" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Right" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Up" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
		{
			this.keyDown = "";
		}
		if (this.keyDown == "Down" && !Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
		{
			this.keyDown = "";
		}
		if (this.prevKeyDown != this.keyDown)
		{
			this.prevConnection1 = null;
			this.prevConnection2 = null;
			this.prevConnection3 = null;
		}
		float num2 = Links.x.worldCamera.transform.rotation.eulerAngles.y + Records.x.gridOffset;
		bool flag = false;
		Vector3 vector = Links.x.main.tr.position;
		if (Links.x.mk)
		{
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 315f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 45f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 225f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 135f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
			{
				if (this.keyDown == "Left")
				{
					quaternion = Quaternion.Euler(new Vector3(0f, 270f + num2, 0f));
					flag = true;
				}
				else
				{
					quaternion = Quaternion.Euler(new Vector3(0f, 90f + num2, 0f));
					flag = true;
				}
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")) && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
			{
				if (this.keyDown == "Down")
				{
					quaternion = Quaternion.Euler(new Vector3(0f, 180f + num2, 0f));
					flag = true;
				}
				else
				{
					quaternion = Quaternion.Euler(new Vector3(0f, 0f + num2, 0f));
					flag = true;
				}
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Left")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 270f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Right")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 90f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Down")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 180f + num2, 0f));
				flag = true;
			}
			if (!flag && Input.GetKey(Links.x.gameplay.keyControl.GetHotkey("Up")))
			{
				quaternion = Quaternion.Euler(new Vector3(0f, 0f + num2, 0f));
				flag = true;
			}
		}
		if (Links.x.joy)
		{
			quaternion = Quaternion.Euler(new Vector3(0f, num + num2, 0f));
			if (num > 0f)
			{
				flag = true;
			}
		}
		this.prevKeyDown = this.keyDown;
		bool flag2 = false;
		if (this.savedRot != quaternion && !Links.x.joy)
		{
			flag2 = true;
		}
		this.savedRot = quaternion;
		if (flag && Links.x.hasMain && (endOfPath || (!endOfPath && !Links.x.main.moving) || (!endOfPath && flag2)) && !Records.x.pocketPause)
		{
			Character main = Links.x.main;
			Vector3 vector2 = main.moveFollow.position;
			if (main.node != null)
			{
				vector2 = (Vector3)main.node.position;
			}
			if ((endOfPath || main.CanMakePath()) && main.IsSentient())
			{
				Vector3 vector3 = vector2 + quaternion * Vector3.forward * Records.x.nodeSize;
				Debug.DrawRay(vector2, quaternion * Vector3.forward * 2f, Color.white, 2f);
				main.StopMoveToRoutine();
				main.ClearMoveTargets();
				this.nodeConstraintDir.constrainWalkability = true;
				this.nodeConstraintDir.walkable = true;
				this.nodeConstraintDir.constrainTags = false;
				this.nodeConstraintDir.passID = main.nodeStationaryID;
				this.nodeConstraintDir.passID2 = main.nodeMovingID;
				this.nodeConstraintDir.constrainPenalty = 0;
				this.nodeConstraintDir.checkConnections = main.ConnectionNumber();
				this.nodeConstraintDir.constrainToArea = -1;
				this.nodeConstraint.constrainToEnvironment = 1;
				RaycastHit raycastHit;
				if (Physics.Raycast(vector3 + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 10f, 4456449))
				{
					vector3 = raycastHit.point;
				}
				float num3 = Records.x.nodeSize + 0.5f;
				GraphNode graphNode = null;
				Vector3 vector4 = (Vector3)main.node.position;
				float num4 = -1f;
				Character character = null;
				for (int i = 0; i < 8; i++)
				{
					GraphNode graphNode2 = main.node.ConnectionFromIndex(i);
					if (graphNode2 != null)
					{
						Vector3 vector5 = (Vector3)graphNode2.position;
						Vector3 vector6 = Quaternion.LookRotation(vector3 - vector4) * Vector3.forward;
						Vector3 vector7 = Vector3.Normalize(vector5 - vector4);
						float num5 = Vector3.Dot(vector6, vector7);
						if (num5 >= -0.25f && num5 > num4)
						{
							this.nodeConstraintDir.constrainTags = main.hasActions;
							if (this.nodeConstraintDir.Suitable(graphNode2))
							{
								bool flag3 = true;
								if (!main.hasActions)
								{
									for (int j = 0; j < 8; j++)
									{
										int num6 = graphNode2.ConnectionID(j);
										if (num6 != main.nodeStationaryID && num6 != main.nodeMovingID)
										{
											Character character2 = null;
											if (!main.ConnectionIsStill(num6, out character2))
											{
												flag3 = false;
												character = character2;
											}
										}
									}
								}
								if (flag3)
								{
									num4 = num5;
									graphNode = graphNode2;
								}
							}
						}
					}
				}
				if (character)
				{
					character.EndPath();
				}
				if (graphNode == null)
				{
					graphNode = main.node;
				}
				if (graphNode != null)
				{
					(Vector3)graphNode.position;
					if (Vector3.Distance((Vector3)graphNode.position, vector3) < num3)
					{
						vector = vector3;
					}
					else
					{
						vector = (Vector3)graphNode.position;
					}
					if (flag2 && main.NodesCount() > 0)
					{
						main.ClearNodePath();
					}
					main.pathTargPosition = (Vector3)graphNode.position;
					Links.x.main.AddKeyNode(graphNode, vector);
					this.SetFormationHead(graphNode);
					this.savedRot = quaternion;
					return true;
				}
			}
		}
		return false;
	}

	// Token: 0x060006F7 RID: 1783 RVA: 0x0009640C File Offset: 0x0009460C
	public void SetFormationHead(GraphNode n)
	{
		Character character = Links.x.main;
		if (character.summoned)
		{
			for (int i = 0; i < this.party.Count; i++)
			{
				if (this.party[i].selected && !this.party[i].summoned)
				{
					character = this.party[i];
					this.party[i].SetAsLeader();
					break;
				}
			}
		}
		if ((Vector3)n.position != character.tr.position)
		{
			this.formationHead.rotation = Quaternion.LookRotation((Vector3)n.position - character.tr.position);
		}
		this.formationHead.position = (Vector3)n.position;
	}

	// Token: 0x060006F8 RID: 1784 RVA: 0x000964E8 File Offset: 0x000946E8
	public GraphNode GetFormationPosition(GraphNode node, Character character, bool useLine)
	{
		GraphNode graphNode = null;
		int num;
		if (!character.vipFollow)
		{
			num = Links.x.GetPortraitIndexWaypoints(character);
			if (character.summoned)
			{
				num = 4 + Links.x.GetPartySummonsIDReal(character);
				if (!useLine && num > 3)
				{
					num = 3;
				}
			}
		}
		else
		{
			num = 3;
			if (useLine)
			{
				num = 4;
			}
		}
		if (node == null)
		{
			return null;
		}
		this.nodeConstraintFormation.constrainToArea = (int)node.Area;
		this.nodeConstraintFormation.walkable = true;
		this.nodeConstraintFormation.constrainWalkability = true;
		this.nodeConstraintFormation.constrainTags = true;
		this.nodeConstraintFormation.checkCircleID = 1;
		this.nodeConstraintFormation.passID = character.nodeStationaryID;
		this.nodeConstraintFormation.passID2 = character.nodeMovingID;
		this.nodeConstraintFormation.constrainPenalty = 2;
		this.nodeConstraintFormation.checkConnections = character.ConnectionNumber();
		if (Records.x.partySailing)
		{
			this.nodeConstraintFormation.constrainToEnvironment = 2;
		}
		else
		{
			this.nodeConstraintFormation.constrainToEnvironment = 1;
		}
		if (this.companionNode1 != null && !Records.x.InCombat(false))
		{
			if (num == 1)
			{
				return this.companionNode1;
			}
			if (num == 2 && this.companionNode2 != null)
			{
				return this.companionNode2;
			}
			if (num == 3 && this.companionNode3 != null)
			{
				return this.companionNode3;
			}
			if (character.summoned && this.companionNode4 != null)
			{
				GraphNode graphNode2 = character.NearNode((Vector3)this.companionNode4.position, true, 0, -1, character.CheckCircleID());
				if (graphNode2 != null)
				{
					return graphNode2;
				}
			}
		}
		bool flag = false;
		if (num > 1 && character.hasActions && !useLine)
		{
			num = Mathf.RoundToInt((float)num / 2f);
		}
		character.portraitID = (float)num;
		if (num == 0)
		{
			return node;
		}
		GraphNode graphNode3 = node;
		int num2 = 0;
		Vector3 vector = this.formationHead.forward * (float)num * -2f + (Vector3)node.position;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i])
			{
				if (this.party[i].moving)
				{
					if (this.party[i].savedPathTarget != null)
					{
						this.party[i].savedPathTarget.planningA = 1;
					}
				}
				else if (this.party[i].node != null)
				{
					this.party[i].node.planningA = 1;
				}
			}
		}
		if (useLine)
		{
			this.nodeConstraintFormation.constrainTags = true;
			this.nodeConstraintFormation.constrainPenalty = 2;
			this.nodeConstraintFormation.constrainWalkability = true;
			this.nodeConstraintFormation.uniqueID = 1;
			int num3 = -1;
			if (Links.x.main && Links.x.main.node != null)
			{
				num3 = (int)Links.x.main.node.Area;
			}
			this.nodeConstraint.constrainToArea = num3;
			vector = this.formationHead.forward * (float)num * -2.5f + (Vector3)node.position;
			if (num % 2 == 0)
			{
				vector += this.formationHead.right * 2.5f;
			}
			else
			{
				vector += this.formationHead.right * -2.5f;
			}
			graphNode = AstarPath.active.GetNearest(vector, this.nodeConstraint).node;
		}
		else
		{
			int num4 = num;
			if (flag)
			{
				num4 = 1;
			}
			for (int j = 0; j < 50; j++)
			{
				this.nodeConstraintFormation.constrainTags = true;
				this.nodeConstraintFormation.constrainPenalty = 2;
				this.nodeConstraintFormation.constrainWalkability = true;
				this.nodeConstraintFormation.uniqueID = 0;
				GraphNode graphNode4 = graphNode3.ClosestConnectionDirectional(graphNode3, character.nodeStationaryID, character.nodeMovingID, 10000f, vector, (int)character.radius, character.ConnectionNumber(), this.nodeConstraintFormation, null, null, null, 0, -1);
				if (graphNode4 != null)
				{
					(Vector3)graphNode3.position;
					(Vector3)graphNode3.position;
					this.nodeConstraintFormation.uniqueID = 1;
					if (this.nodeConstraintFormation.Suitable(graphNode4))
					{
						num2++;
						graphNode = graphNode4;
						if (num2 >= num4)
						{
							break;
						}
						graphNode3 = graphNode4;
						vector -= this.formationHead.forward * 2.5f;
					}
					else
					{
						graphNode3 = graphNode4;
						vector -= this.formationHead.forward * 1.5f;
					}
				}
				else
				{
					this.nodeConstraintFormation.constrainTags = false;
					this.nodeConstraintFormation.constrainPenalty = 0;
					this.nodeConstraintFormation.constrainWalkability = false;
					this.nodeConstraintFormation.uniqueID = 0;
					graphNode4 = graphNode3.ClosestConnectionDirectional(graphNode3, 0, 0, 10000f, vector, 1, 0, this.nodeConstraintFormation, null, null, null, 0, -1);
					if (graphNode4 != null)
					{
						graphNode3 = graphNode4;
					}
					vector -= this.formationHead.forward * 3f;
				}
				if (j % 5 == 0 && j >= 10)
				{
					vector += this.formationHead.right * 2f;
				}
				if (j % 8 == 0 && j >= 10)
				{
					vector += this.formationHead.right * -2f;
				}
			}
		}
		for (int k = 0; k < this.party.Count; k++)
		{
			if (this.party[k])
			{
				if (this.party[k].moving)
				{
					if (this.party[k].savedPathTarget != null)
					{
						this.party[k].savedPathTarget.planningA = 0;
					}
				}
				else if (this.party[k].node != null)
				{
					this.party[k].node.planningA = 0;
				}
			}
		}
		return graphNode;
	}

	// Token: 0x060006F9 RID: 1785 RVA: 0x00096B10 File Offset: 0x00094D10
	public GraphNode GetFormationPointInCircle(Character c)
	{
		GraphNode graphNode = c.node;
		if (this.circleTiles.Contains(graphNode))
		{
			return graphNode;
		}
		if (c.summoned && !Links.x.main.hasCircleBuff && Records.x.InCombat(false))
		{
			return graphNode;
		}
		this.nodeConstraintFormation.constrainToArea = -1;
		this.nodeConstraintFormation.walkable = true;
		this.nodeConstraintFormation.constrainWalkability = true;
		this.nodeConstraintFormation.constrainTags = true;
		this.nodeConstraintFormation.checkCircleID = 1;
		this.nodeConstraintFormation.passID = c.nodeStationaryID;
		this.nodeConstraintFormation.passID2 = c.nodeMovingID;
		this.nodeConstraintFormation.constrainPenalty = 0;
		this.nodeConstraintFormation.checkConnections = c.ConnectionNumber();
		if (Records.x.partySailing)
		{
			this.nodeConstraintFormation.constrainToEnvironment = 2;
		}
		else
		{
			this.nodeConstraintFormation.constrainToEnvironment = 1;
		}
		this.openTiles.Clear();
		for (int i = 0; i < this.circleTiles.Count; i++)
		{
			GraphNode graphNode2 = this.circleTiles[i];
			if (this.nodeConstraintFormation.Suitable(graphNode2))
			{
				bool flag = false;
				for (int j = 0; j < this.party.Count; j++)
				{
					if (this.party[j] && this.party[j].savedPathTarget == graphNode2)
					{
						flag = true;
					}
				}
				if (!flag)
				{
					this.openTiles.Add(graphNode2);
				}
			}
		}
		Vector3 vector = Links.x.gameplay.frontOfCircle;
		float num = float.PositiveInfinity;
		if (c.stats.formationGroup >= 4 && c.stats.formationGroup <= 6)
		{
			vector = Links.x.gameplay.middleCircle;
		}
		if (c.stats.formationGroup >= 7 && c.stats.formationGroup <= 9)
		{
			vector = Links.x.gameplay.backOfCircle;
		}
		for (int k = 0; k < this.openTiles.Count; k++)
		{
			float sqrMagnitude = ((Vector3)this.openTiles[k].position - vector).sqrMagnitude;
			if (sqrMagnitude < num)
			{
				num = sqrMagnitude;
				graphNode = this.openTiles[k];
			}
		}
		return graphNode;
	}

	// Token: 0x060006FA RID: 1786 RVA: 0x00096D64 File Offset: 0x00094F64
	public void MakeWaypoints(Vector3 mousePoint, GraphNode moveToNode, bool estimatePath, bool overWater)
	{
		if (Links.x.hasMain)
		{
			bool flag = EventSystem.current.IsPointerOverGameObject();
			if ((flag && (moveToNode != null || this.newFormation)) || !flag)
			{
				this.mPoint = mousePoint;
				this.mouseNode = null;
				if (mousePoint != Vector3.zero && (estimatePath || Input.GetMouseButtonDown(0)) && this.mouseNode == null && Links.x.main.node != null)
				{
					this.mouseNode = this.NearNode(mousePoint, false, overWater, false, 0, (int)Links.x.main.node.Area);
				}
				GraphNode graphNode = this.mouseNode;
				bool flag2 = false;
				if (moveToNode != null)
				{
					graphNode = moveToNode;
					flag2 = true;
					if (!Links.x.hasMain)
					{
						return;
					}
				}
				else
				{
					graphNode = Links.x.gameplay.mouseNode;
				}
				if (graphNode != null && estimatePath)
				{
					this.StartEstimatePath(graphNode);
				}
				bool flag3 = false;
				if (Links.x.gameplay.quickReposition || (Links.x.pocketWheel.open && (Links.x.pocketWheel.selected == "Command Group" || Links.x.pocketWheel.selected == "Command Reposition")))
				{
					flag3 = true;
				}
				if (graphNode != null && !estimatePath)
				{
					this.canPath = true;
					if ((this.canPath && Input.GetMouseButtonDown(0)) || flag2 || this.newFormation || flag3)
					{
						if (this.estimatePathRoutine != null)
						{
							base.StopCoroutine(this.estimatePathRoutine);
							this.estimatePathRoutine = null;
						}
						if (!flag2 && this.scatterCoroutine != null)
						{
							base.StopCoroutine(this.scatterCoroutine);
						}
						if (!this.drawingSquare)
						{
							this.creatingPath = true;
							this.SetFormationHead(graphNode);
							Links.x.gameplay.NewPaths();
							int num = 0;
							this.pickedNodes.Clear();
							Character character = null;
							if (Records.x.partySailing)
							{
								Links.x.gaia.boro.showWaypoint = true;
								Links.x.gaia.boro.MakePath(this.mouseNode, 500, false, false, true);
							}
							else
							{
								for (int i = 0; i < this.party.Count; i++)
								{
									Character character2 = this.party[i];
									if (((!flag3 && character2.mainSelected) || (flag3 && !character2.mainSelected)) && character2.IsSentient() && !character2.isBoro && !character2.pipeSummons)
									{
										bool flag4 = true;
										character2.running = false;
										if (character2.hasActions && character2.actions.cannotInterrupt)
										{
											flag4 = false;
											character2.actions.TryingToInterruptInventoryWait();
										}
										if (flag4)
										{
											character2.StopMoveToRoutine();
											if (!flag2)
											{
												character2.ClearMoveTargets();
											}
											num++;
											if (!character2.mainSelected)
											{
												if (!character)
												{
													character = character2;
													this.pickedNodes.Add(graphNode);
												}
												else
												{
													GraphNode graphNode2;
													if (character2.inCircle)
													{
														if (this.circleTiles.Contains(graphNode))
														{
															graphNode2 = this.GetFormationPointInCircle(character2);
														}
														else
														{
															graphNode2 = this.GetFormationPosition(graphNode, character2, true);
														}
													}
													else
													{
														graphNode2 = this.GetFormationPosition(graphNode, character2, true);
													}
													if (graphNode2 == null)
													{
														graphNode2 = graphNode;
													}
													this.pickedNodes.Add(graphNode2);
												}
											}
											else
											{
												this.pickedNodes.Add(graphNode);
											}
										}
										else
										{
											this.pickedNodes.Add(null);
										}
									}
									else
									{
										this.pickedNodes.Add(null);
									}
								}
								for (int j = 0; j < this.pickedNodes.Count; j++)
								{
									Character character3 = this.party[j];
									if (this.pickedNodes[j] != null && character3)
									{
										if (character3.stats.Overburdened())
										{
											character3.StartQuip("I'm overburdened");
										}
										if (character3.actions)
										{
											if (character3.actions && !character3.mainSelected)
											{
												character3.actions.ClearSelectedActionRealTime();
											}
											if (character3.actions && !character3.mainSelected)
											{
												character3.actions.Interrupt();
											}
											if (character3.actions)
											{
												character3.actions.CheckIfRunningAI();
											}
											if (character3.actions)
											{
												character3.actions.hasWaypoint = true;
											}
										}
										if (!flag2)
										{
											character3.ClearMoveTargets();
										}
										if (!character3.mainSelected)
										{
											character3.ClearPathUpdates();
											character3.showWaypoint = true;
											if (flag2 && Links.x.main.followingType != "Dialogue" && !flag3)
											{
												character3.followingType = Links.x.main.followingType;
												character3.followingExit = Links.x.main.followingExit;
												character3.followingBoat = Links.x.main.followingBoat;
												character3.followingNode = Links.x.main.followingNode;
												character3.followingCharacter = Links.x.main.followingCharacter;
												if (!character3.CheckEarlyIfInRange())
												{
													character3.MakePath(this.pickedNodes[j], 500, false, false, true);
												}
											}
											else if (Records.x.paused || Records.x.pocketPause || flag3)
											{
												if (!Links.x.pocketWheel.selected.Contains("Group") || !Links.x.pocketWheel.open)
												{
													character3.showWaypoint = true;
													if (character3 == character)
													{
														character3.SetWaypoint(mousePoint);
													}
													else
													{
														character3.SetWaypoint((Vector3)this.pickedNodes[j].position);
													}
													character3.commandMove = this.pickedNodes[j];
												}
												else
												{
													character3.showWaypoint = false;
												}
												character3.StartDelayedPath(this.pickedNodes[j], (float)j, (float)j * 0.02f + Random.Range(0f, 0.02f));
												if (flag3 && character3.actions && character3.actions.hasTarget)
												{
													float num2 = character3.AttackRange();
													if (character3.actions.selectedTargetInteractive)
													{
														if (Vector3.Distance((Vector3)this.pickedNodes[j].position, character3.actions.selectedTargetInteractive.transform.position) > num2)
														{
															character3.actions.SetSelectedTarget(false, null, null, null);
														}
													}
													else if (character3.actions.selectedTarget && Vector3.Distance((Vector3)this.pickedNodes[j].position, character3.actions.selectedTarget.currentPosition) > num2)
													{
														character3.actions.SetSelectedTarget(false, null, null, null);
													}
												}
											}
											else
											{
												character3.StartDelayedPath(this.pickedNodes[j], (float)j, (float)j * 0.02f + Random.Range(0f, 0.02f));
											}
										}
										else
										{
											character3.clickedPoint = mousePoint;
											character3.ClearPathUpdates();
											character3.showWaypoint = true;
											character3.pathTargPosition = (Vector3)this.pickedNodes[j].position;
											character3.MakePath(this.pickedNodes[j], 500, false, false, true);
										}
										if (Links.x.gameplay.doubleClick && (Records.x.editor || Records.x.secrets))
										{
											character3.running = true;
										}
									}
								}
							}
							this.waypoint.transform.position = mousePoint;
						}
						this.creatingPath = false;
						this.previousClick = (Vector3)graphNode.position;
					}
				}
				this.newFormation = false;
			}
		}
	}

	// Token: 0x060006FB RID: 1787 RVA: 0x00097570 File Offset: 0x00095770
	public void StartEstimatePath(GraphNode mNode)
	{
		if (this.prevNode == mNode && Time.timeSinceLevelLoad > this.prevNodeTime + 0.5f)
		{
			this.prevNode = null;
			this.prevNodeTime = Time.timeSinceLevelLoad;
		}
		if (this.combatWait || !Records.x.combat)
		{
			this.prevNode = null;
			this.combatWait = false;
		}
		if (false && this.estimatePathRoutine == null && mNode != null && !Links.x.combat.combatCinematics && !Links.x.gameplay.targetingCharacter && this.prevNode != mNode)
		{
			this.estimatePathRoutine = this.EstimatePath(mNode);
			base.StartCoroutine(this.estimatePathRoutine);
			this.prevNode = mNode;
		}
		this.canPath = true;
	}

	// Token: 0x060006FC RID: 1788 RVA: 0x00097633 File Offset: 0x00095833
	private IEnumerator EstimatePath(GraphNode mNode)
	{
		if (!this.creatingPath)
		{
			Character mainCharacter = Links.x.main;
			this.pickedNodesEstimated.Clear();
			this.SetFormationHead(mNode);
			for (int j = 0; j < this.party.Count; j++)
			{
				if (this.party[j].mainSelected)
				{
					GraphNode formationPosition = this.GetFormationPosition(mNode, this.party[j], true);
					if (formationPosition != null)
					{
						this.pickedNodesEstimated.Add(formationPosition);
					}
					else
					{
						this.pickedNodesEstimated.Add(null);
						this.waypoint.transform.position = Links.x.gameplay.farPosition;
					}
				}
				else
				{
					this.pickedNodesEstimated.Add(null);
				}
			}
			int num2;
			for (int i = 0; i < this.pickedNodesEstimated.Count; i = num2 + 1)
			{
				if (i < this.party.Count && this.party[i] && this.pickedNodesEstimated[i] != null && this.party[i].node != null)
				{
					this.SetNodeConstraint(this.party[i], true, true, false, 0, 1);
					ABPath p = ABPath.ConstructFast(this.party[i].node, this.pickedNodesEstimated[i], null);
					p.nnConstraint = this.nodeConstraint;
					AstarPath.StartPath(p, false);
					yield return base.StartCoroutine(p.WaitForPath());
					p.Claim(this);
					if (!p.error)
					{
						this.canPath = true;
						this.path = p.path;
						this.waypoint.transform.position = (Vector3)this.pickedNodesEstimated[i].position - new Vector3(0f, 0.5f, 0f);
						if (!Links.x.gameplay.targetingCharacter && !Links.x.gameplay.spellTargetingGround)
						{
							(Vector3)this.pickedNodesEstimated[i].position;
							int num = 0;
							for (int k = 0; k < this.path.Count; k++)
							{
								if (this.path[k] != null)
								{
									if (k == 0)
									{
										if (this.path[k] != mainCharacter.node)
										{
											(Vector3)this.path[k].position;
											GraphNode graphNode = this.path[k];
											num++;
										}
									}
									else
									{
										(Vector3)this.path[k].position;
										GraphNode graphNode2 = this.path[k];
										num++;
									}
								}
							}
						}
					}
					else
					{
						this.canPath = false;
						this.waypoint.transform.position = Links.x.gameplay.farPosition;
					}
					p.Release(this, false);
					p = null;
				}
				num2 = i;
			}
			mainCharacter = null;
		}
		bool flag = this.canPath;
		this.estimatePathRoutine = null;
		yield break;
	}

	// Token: 0x060006FD RID: 1789 RVA: 0x00097649 File Offset: 0x00095849
	public void AddHudPortraitChange(Character character)
	{
		if (this.portraitHudUpdate.IndexOf(character) < 0)
		{
			this.portraitHudUpdate.Add(character);
		}
	}

	// Token: 0x060006FE RID: 1790 RVA: 0x00097666 File Offset: 0x00095866
	public void AddPortraitChange(Character character)
	{
		if (this.portraitUpdate.IndexOf(character) < 0)
		{
			this.portraitUpdate.Add(character);
		}
	}

	// Token: 0x060006FF RID: 1791 RVA: 0x00097684 File Offset: 0x00095884
	private void Update()
	{
		this.move = this.moveAction.ReadValue<Vector2>();
		this.direction = this.directionAction.ReadValue<Vector2>();
		if (this.joyStickDown && this.move.magnitude < 0.2f)
		{
			this.joyStickDown = false;
		}
		if (Links.x.joy)
		{
			bool flag = false;
			if (Mathf.Abs(this.move.magnitude) > 0.1f && Links.x.hasMain && !Links.x.pocketWheel.spellbook.activeSelf && !Links.x.gameplay.inPartyDock && !Links.x.gameplay.gameFeedScrolling && ((Records.x.pocketPause && Links.x.pocketWheel.targetSelection) || (!Records.x.pocketPause && Links.x.gameplay.aimHold)) && Links.x.main.IsSentient() && !Records.x.inMenus && !Records.x.removeControls && !Records.x.typing && !Links.x.gameplay.dockDown && !Links.x.gameplay.badgeScrolling)
			{
				this.angle = Mathf.Atan2(this.move.x, this.move.y) / 3.1415927f * 180f;
				float y = Links.x.worldCamera.transform.rotation.eulerAngles.y;
				if (this.angle < 0f)
				{
					this.angle += 360f;
				}
				Quaternion quaternion = Quaternion.Euler(new Vector3(0f, this.angle + y, 0f));
				Vector3 vector = Links.x.main.tr.position + quaternion * Vector3.forward * 10f;
				Shader.SetGlobalVector("_JoystickDirection", vector);
				Shader.SetGlobalFloat("_JoystickMagnitude", Mathf.Abs(this.move.magnitude));
				flag = true;
			}
			if (!flag)
			{
				Shader.SetGlobalVector("_JoystickDirection", Links.x.gameplay.farPosition);
			}
		}
		if (this.portraitUpdate.Count > 0 && Links.x.gaia.sceneLoaded)
		{
			Links.x.renderPortraits.AddCharacter(this.portraitUpdate[0], this.portraitUpdate[0].stats.xmlName, this.portraitUpdate[0].characterSheetPortrait, false, null, null, null, null);
			this.portraitUpdate.RemoveAt(0);
		}
		if (Time.timeSinceLevelLoad > this.updateTime + 0.05f && !Records.x.paused && !Records.x.paused && Links.x.gaia.sceneLoaded && !Records.x.pocketPause && this.waypointRoutine == null)
		{
			this.StartCheckIfAtTargetLocation();
			this.updateTime = Time.timeSinceLevelLoad;
		}
		if (Time.timeSinceLevelLoad > this.checkTime + 2f && Links.x.gaia.sceneLoaded)
		{
			this.checkTime = Time.timeSinceLevelLoad;
			Links.x.renderPortraits.CheckForModel();
		}
		if (Records.x.circle)
		{
			this.CheckCircle();
			this.CheckCircleMorale();
		}
		if (this.fading)
		{
			this.currentDither = Mathf.Lerp(this.startDither, this.endDither, this.fadeAmount * 1f);
			if ((this.endDither == 1f && this.currentDither >= 1f) || (this.endDither == 0f && this.currentDither <= 0f))
			{
				this.fading = false;
			}
			this.fadeAmount += Time.deltaTime * 1.5f;
		}
	}

	// Token: 0x06000700 RID: 1792 RVA: 0x00097AB0 File Offset: 0x00095CB0
	public bool EveryoneInPosition(Character c)
	{
		int num = 0;
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character && character.node != null)
			{
				Vector3 position = character.sphere.transform.position;
				float sqrMagnitude = ((Vector3)character.node.position - position).sqrMagnitude;
				if (character.moving || character.moveNode != null || character.tempStop || character.NodesCount() != 0 || sqrMagnitude >= 0.36f)
				{
					num++;
				}
			}
		}
		return num == 0;
	}

	// Token: 0x06000701 RID: 1793 RVA: 0x00097B60 File Offset: 0x00095D60
	public void FreshBlinks()
	{
		foreach (Character character in this.party)
		{
			if (character && character.party)
			{
				Links.x.renderPortraits.FreshBlinks(character);
			}
		}
	}

	// Token: 0x06000702 RID: 1794 RVA: 0x00097BCC File Offset: 0x00095DCC
	public void ClearCompanionNodes()
	{
		this.companionNode1 = null;
		this.companionNode2 = null;
		this.companionNode3 = null;
		this.companionNode4 = null;
	}

	// Token: 0x06000703 RID: 1795 RVA: 0x00097BEC File Offset: 0x00095DEC
	public void SetUpCompanionNodes(Transform c1, Transform c2, Transform c3, Transform c4)
	{
		if (Records.x.editor)
		{
			Debug.Log(string.Concat(new string[]
			{
				"SETUP NODES ",
				(c1 != null) ? c1.ToString() : null,
				" ",
				(c2 != null) ? c2.ToString() : null,
				" ",
				(c3 != null) ? c3.ToString() : null,
				" ",
				(c4 != null) ? c4.ToString() : null
			}));
		}
		this.ClearCompanionNodes();
		if (c1)
		{
			this.companionNode1 = this.NearNode(c1.position, false, false, false, 1, -1);
		}
		if (c2)
		{
			this.companionNode2 = this.NearNode(c2.position, false, false, false, 1, -1);
		}
		if (c3)
		{
			this.companionNode3 = this.NearNode(c3.position, false, false, false, 1, -1);
		}
		if (c4)
		{
			this.companionNode4 = this.NearNode(c4.position, false, false, false, 1, -1);
		}
	}

	// Token: 0x06000704 RID: 1796 RVA: 0x00097CFA File Offset: 0x00095EFA
	public void AddRallySpeed(float amt)
	{
		this.rallySpeed += amt;
	}

	// Token: 0x06000705 RID: 1797 RVA: 0x00097D0C File Offset: 0x00095F0C
	public void SetWaitPositions()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i])
			{
				this.party[i].waitPosition = this.party[i].currentPosition;
			}
		}
	}

	// Token: 0x06000706 RID: 1798 RVA: 0x00097D64 File Offset: 0x00095F64
	public bool InCircle(Vector3 n, bool mustBeInside)
	{
		Vector3 vector = Vector3.zero;
		float num = 5f;
		if (mustBeInside)
		{
			num = 1.5f;
		}
		for (int i = 0; i < this.circleTiles.Count; i++)
		{
			vector = (Vector3)this.circleTiles[i].position;
			float num2 = vector.x - n.x;
			if (num2 < 0f)
			{
				num2 *= -1f;
			}
			if (num2 < num)
			{
				float num3 = vector.z - n.z;
				if (num3 < 0f)
				{
					num3 *= -1f;
				}
				if (num3 < num)
				{
					return true;
				}
			}
		}
		return false;
	}

	// Token: 0x06000707 RID: 1799 RVA: 0x00097E08 File Offset: 0x00096008
	public void StartCircle(Vector3 clampedPoint)
	{
		if (this.breakRoutine != null)
		{
			base.StopCoroutine(this.breakRoutine);
		}
		Records.x.circle = true;
		this.circleTiles.Clear();
		for (int i = 0; i < this.gameplayCircleTiles.Count; i++)
		{
			this.circleTiles.Add(this.gameplayCircleTiles[i]);
			this.gameplayCircleTiles[i].circle = 1;
			if (this.gameplayCircleTiles[i].Penalty == 0U)
			{
				this.circleTiles[i].Penalty = 8000U;
			}
		}
		this.timeOutsideCircle.Clear();
		for (int j = 0; j < this.party.Count; j++)
		{
			if (this.party[j] && !this.party[j].pipeSummons && !this.party[j].isBoro)
			{
				this.party[j].inCircle = true;
				this.party[j].commandMove = null;
			}
			this.timeOutsideCircle.Add(-1f);
		}
		this.morale = 100;
		Links.x.hudControl.SetMorale((float)this.morale);
		this.dioramaCharacters = Links.x.diorama.characters;
		this.DrawCircle(clampedPoint);
		for (int k = 0; k < this.circleTiles.Count; k++)
		{
			Links.x.cameraEffects.GroupCharacters((Vector3)this.circleTiles[k].position, null, true);
		}
		this.StartCircleFade(false);
	}

	// Token: 0x06000708 RID: 1800 RVA: 0x00097FB4 File Offset: 0x000961B4
	public void StartCircleFade(bool fadeOut)
	{
		if (fadeOut)
		{
			this.startDither = 0f;
			this.endDither = 1f;
		}
		else
		{
			this.startDither = 1f;
			this.endDither = 0f;
		}
		this.currentDither = this.startDither;
		this.fadeAmount = 0f;
		this.fading = true;
	}

	// Token: 0x06000709 RID: 1801 RVA: 0x00098010 File Offset: 0x00096210
	public void RemovePartyFromCircle(Character p)
	{
		int num = this.party.IndexOf(p);
		if (num > -1)
		{
			this.timeOutsideCircle.RemoveAt(num);
		}
	}

	// Token: 0x0600070A RID: 1802 RVA: 0x0009803A File Offset: 0x0009623A
	public void AddPartyToCircle(Character p)
	{
		this.timeOutsideCircle.Add(-1f);
	}

	// Token: 0x0600070B RID: 1803 RVA: 0x0009804C File Offset: 0x0009624C
	private void CheckCircleMorale()
	{
		bool flag = false;
		bool flag2 = false;
		int num = this.morale;
		int num2 = 0;
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character && character.inCircle && !character.pipeSummons && !character.isBoro)
			{
				num2++;
			}
		}
		int num3 = 1;
		int num4 = 1;
		int num5 = 1;
		if (num3 < 1)
		{
			num3 = 1;
		}
		int num6 = 3;
		int num7 = 0;
		int num8 = 0;
		int num9 = 0;
		float seconds = Links.x.gameplay.seconds;
		for (int j = 0; j < this.party.Count; j++)
		{
			Character character2 = this.party[j];
			if (character2 && character2.IsSentient() && character2.inCircle && !character2.pipeSummons && !character2.summoned && !character2.isBoro)
			{
				bool flag3;
				if (!character2.hasCircleBuff)
				{
					if (this.timeOutsideCircle[j] == 0f)
					{
						num9++;
						this.timeOutsideCircle[j] = seconds;
						flag3 = true;
					}
					else if (this.timeOutsideCircle[j] == -1f)
					{
						num9++;
						if (character2.hasCircleBuff)
						{
							this.timeOutsideCircle[j] = 0f;
						}
						flag3 = true;
					}
					else if (seconds > this.timeOutsideCircle[j] + 6f)
					{
						flag3 = false;
					}
					else
					{
						num9++;
						flag3 = true;
					}
				}
				else
				{
					num9++;
					this.timeOutsideCircle[j] = 0f;
					flag3 = character2.IsSentient();
					if (!character2.IsSentient())
					{
						flag2 = true;
					}
				}
				if (flag3)
				{
					num8++;
				}
			}
		}
		if (num8 < num3)
		{
			flag = true;
		}
		else
		{
			if (num8 <= num4)
			{
				num7++;
			}
			if (num8 <= num5)
			{
				num7++;
			}
		}
		if (!flag)
		{
			this.intruderTemp.Clear();
			this.intruderTimeTemp.Clear();
			int num10 = 0;
			int num11 = 0;
			int num12 = 0;
			for (int k = 0; k < this.dioramaCharacters.Count; k++)
			{
				Character character3 = this.dioramaCharacters[k];
				if (character3 && character3.npc && (character3.hostility >= 2 || character3.attackingUntilBribe) && this.InCircle(character3.currentPosition, true))
				{
					int num13 = this.intruders.IndexOf(character3);
					if (num13 == -1)
					{
						this.intruderTemp.Add(character3);
						this.intruderTimeTemp.Add(seconds);
					}
					else
					{
						float num14 = this.intruderTime[num13];
						this.intruderTemp.Add(character3);
						this.intruderTimeTemp.Add(num14);
						if (seconds > num14 + 100f)
						{
							num10++;
							if (seconds > num14 + 400f)
							{
								num12++;
							}
						}
						else
						{
							num11++;
						}
					}
				}
			}
			this.intruders.Clear();
			this.intruderTime.Clear();
			int num15 = 0;
			for (int l = 0; l < this.intruderTemp.Count; l++)
			{
				this.intruders.Add(this.intruderTemp[l]);
				this.intruderTime.Add(this.intruderTimeTemp[l]);
				if (seconds > this.intruderTimeTemp[l] + 60f)
				{
					num15++;
				}
			}
			if (num10 >= num6 || num12 > 0)
			{
				flag2 = true;
				flag = true;
			}
			if (num10 >= 1)
			{
				num7++;
			}
			if (num11 >= 1)
			{
				num7++;
			}
			if (num15 >= 2)
			{
				num7++;
			}
			if (num7 == 0)
			{
				this.morale = 100;
			}
			if (num7 == 1)
			{
				this.morale = 50;
			}
			if (num7 >= 2)
			{
				this.morale = 10;
			}
			Links.x.hudControl.SetMorale((float)this.morale);
			if (num != this.morale)
			{
			}
			if (!flag)
			{
				for (int m = 0; m < this.circleTiles.Count; m++)
				{
					if (this.circleTiles[m].Penalty == 0U)
					{
						this.circleTiles[m].Penalty = 8000U;
					}
				}
			}
		}
		if (flag)
		{
			this.BreakCircle(flag2);
			Links.x.gameplay.circleBreakObject.SetActive(false);
		}
	}

	// Token: 0x0600070C RID: 1804 RVA: 0x000984D0 File Offset: 0x000966D0
	private void ReturnLines(int l)
	{
		for (int i = 0; i < this.lines.Count; i++)
		{
			Links.x.cellar.ReturnPooledGameObject(l, this.lines[i]);
		}
		this.lines.Clear();
	}

	// Token: 0x0600070D RID: 1805 RVA: 0x0009851C File Offset: 0x0009671C
	private void DrawCircle(Vector3 clampedPoint)
	{
		float num = 9f;
		int num2 = 60;
		int num3 = this.linenum;
		this.linenum = 127;
		if (this.morale > 33 && this.morale < 66)
		{
			this.linenum = 126;
		}
		if (this.morale <= 33)
		{
			this.linenum = 125;
		}
		if (this.linenum != num3)
		{
			this.ReturnLines(num3);
		}
		bool flag = true;
		Vector3 vector = Vector3.zero;
		Vector3 vector2 = Vector3.up * -1f;
		Vector3 forward = Vector3.forward;
		Vector3 zero = Vector3.zero;
		float num4 = 0.25f;
		Vector3 vector3 = clampedPoint;
		vector3.y += 1.5f;
		197120;
		Quaternion quaternion = Quaternion.identity;
		Vector3 vector4 = clampedPoint;
		Vector3 one = Vector3.one;
		int num5 = 0;
		this.positions.Clear();
		for (int i = 0; i < this.circleTiles.Count; i++)
		{
			vector = (Vector3)this.circleTiles[i].position;
			int num6 = 12;
			if (flag)
			{
				num6 = 6;
			}
			float num7 = 6.2831855f / (float)num6;
			float num8 = 1.8f;
			if (flag)
			{
				num8 = 1.8f;
			}
			for (int j = 0; j < num6; j++)
			{
				float num9 = (float)j * num7;
				float num10 = num8 * Mathf.Cos(num9);
				float num11 = num8 * Mathf.Sin(num9);
				vector = (Vector3)this.circleTiles[i].position;
				vector.x += num10;
				vector.z += num11;
				this.positions.Add(vector);
			}
		}
		this.linesPoints.Clear();
		float num12 = 6.2831855f / (float)num2;
		for (int k = 0; k < num2 + 1; k++)
		{
			int num13 = k;
			if (k == num2)
			{
				num13 = 0;
			}
			float num9 = (float)num13 * num12;
			float num10 = num * Mathf.Cos(num9);
			float num11 = num * Mathf.Sin(num9);
			vector = clampedPoint;
			vector.x += num10;
			vector.z += num11;
			float num14 = 200f;
			int num15 = -1;
			for (int l = 0; l < this.positions.Count; l++)
			{
				this.positions[l].y = vector.y;
				float sqrMagnitude = (this.positions[l] - vector).sqrMagnitude;
				if (sqrMagnitude < num14)
				{
					num14 = sqrMagnitude;
					num15 = l;
				}
			}
			if (num15 > -1)
			{
				vector = this.positions[num15];
			}
			else
			{
				vector = Vector3.zero;
			}
			if (vector.x != 0f && vector.z != 0f)
			{
				float y = vector.y;
				vector.y += 3f;
				RaycastHit raycastHit;
				if (Physics.Raycast(vector, vector2, out raycastHit, 8f, Links.x.floor))
				{
					vector.y = raycastHit.point.y + num4;
				}
				else
				{
					vector.y = y + num4;
				}
				if (vector4 != vector)
				{
					quaternion = Quaternion.LookRotation(vector4 - vector);
					if (k > 0)
					{
						if (flag)
						{
							this.linesPoints.Add(vector);
						}
						else
						{
							GameObject gameObject;
							if (num5 < this.lines.Count)
							{
								gameObject = this.lines[num5];
							}
							else
							{
								gameObject = Links.x.cellar.GetPooledGameObject(this.linenum);
								this.lines.Add(gameObject);
								gameObject.SetActive(true);
							}
							gameObject.transform.position = vector;
							gameObject.transform.rotation = quaternion;
							num5++;
							one.z = Vector3.Distance(vector4, vector);
							gameObject.transform.localScale = one;
						}
					}
					vector4 = vector;
				}
			}
		}
		if (num5 < this.lines.Count)
		{
			for (int m = num5; m < this.lines.Count; m++)
			{
				Links.x.cellar.ReturnPooledGameObject(this.linenum, this.lines[m]);
				this.lines[m] = null;
			}
			this.lines.RemoveAll((GameObject item) => item == null);
		}
		float num16 = float.PositiveInfinity;
		Vector3 vector5 = Vector3.zero;
		for (int n = 0; n < this.linesPoints.Count; n++)
		{
			float sqrMagnitude2 = (this.linesPoints[n] - Links.x.gameplay.backOfCircle).sqrMagnitude;
			if (sqrMagnitude2 < num16)
			{
				num16 = sqrMagnitude2;
				vector5 = this.linesPoints[n];
			}
		}
		if (vector5 != Vector3.zero)
		{
			Links.x.gameplay.circleBreakObject.SetActive(true);
			Links.x.gameplay.circleBreakObject.transform.position = vector5;
			Vector3 eulerAngles = Quaternion.LookRotation(Links.x.worldCamera.gameObject.transform.position - vector5).eulerAngles;
			eulerAngles.x = 0f;
			eulerAngles.z = 0f;
			Links.x.gameplay.circleBreakObject.transform.rotation = Quaternion.Euler(eulerAngles);
		}
	}

	// Token: 0x0600070E RID: 1806 RVA: 0x00098ABD File Offset: 0x00096CBD
	public void BreakCircle(bool fromEnemies)
	{
		Records.x.circle = false;
		if (this.breakRoutine != null)
		{
			base.StopCoroutine(this.breakRoutine);
		}
		this.breakRoutine = this.BreakCircleFade(fromEnemies);
		base.StartCoroutine(this.breakRoutine);
	}

	// Token: 0x0600070F RID: 1807 RVA: 0x00098AF8 File Offset: 0x00096CF8
	private IEnumerator BreakCircleFade(bool fromEnemies)
	{
		Links.x.hudControl.SetFalseStayBack();
		if (fromEnemies)
		{
			Links.x.hudControl.CircleBreak();
		}
		Links.x.gameplay.circleBreakObject.SetActive(false);
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character && !character.isBoro)
			{
				character.inCircle = false;
				character.hasCircleBuff = false;
				character.stats.HealEffect("CircleHarmony");
				if (fromEnemies)
				{
					Effects effects = character.gameObject.AddComponent<Effects>();
					Links.x.cellar.AddEffects(effects);
					effects.gameObject.SetActive(true);
					effects.source = character;
					effects.target = character;
					effects.effectName = "CircleBreak";
					effects.Inflicted(false);
				}
			}
		}
		if (fromEnemies)
		{
			this.timeToNextCircle = 0f;
		}
		else
		{
			this.timeToNextCircle = 0f;
		}
		this.StartCircleFade(true);
		while (this.fading)
		{
			yield return null;
		}
		for (int j = 0; j < this.circleTiles.Count; j++)
		{
			this.circleTiles[j].circle = 0;
			if (this.circleTiles[j].Penalty == 8000U)
			{
				this.circleTiles[j].Penalty = 0U;
			}
		}
		Links.x.gameplay.BreakCircle();
		this.ReturnLines(this.linenum);
		this.breakRoutine = null;
		yield break;
	}

	// Token: 0x06000710 RID: 1808 RVA: 0x00098B10 File Offset: 0x00096D10
	public void CheckCircle()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			Character character = this.party[i];
			if (character)
			{
				bool hasCircleBuff = character.hasCircleBuff;
				bool flag = false;
				for (int j = 0; j < this.circleTiles.Count; j++)
				{
					if (!flag)
					{
						Vector3 vector = (Vector3)this.circleTiles[j].position;
						vector.y = character.currentPosition.y;
						if ((vector - character.currentPosition).sqrMagnitude < 4f)
						{
							flag = true;
						}
					}
				}
				if (flag)
				{
					if (!hasCircleBuff)
					{
						character.hasCircleBuff = true;
						if (!character.stats.HasEffect("CircleHarmony"))
						{
							Effects effects = character.gameObject.AddComponent<Effects>();
							Links.x.cellar.AddEffects(effects);
							effects.gameObject.SetActive(true);
							effects.source = character;
							effects.target = character;
							effects.effectName = "CircleHarmony";
							effects.sourceLevel = this.AverageLevel();
							effects.Inflicted(false);
						}
					}
				}
				else if (hasCircleBuff)
				{
					character.hasCircleBuff = false;
					character.stats.HealEffect("CircleHarmony");
				}
			}
		}
	}

	// Token: 0x06000711 RID: 1809 RVA: 0x00098C60 File Offset: 0x00096E60
	private float AverageLevel()
	{
		float num = 0f;
		float num2 = 0f;
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			if (this.portraitOrder[i])
			{
				num += (float)this.portraitOrder[i].stats.level;
				num2 += 1f;
			}
		}
		return num / num2;
	}

	// Token: 0x06000712 RID: 1810 RVA: 0x00098CC8 File Offset: 0x00096EC8
	public void SetFriends()
	{
		if (Records.x.editor)
		{
			this.friend1.Clear();
			this.friend2.Clear();
			for (int i = 0; i < this.portraitOrder.Count; i++)
			{
				if (this.friend1.Count < 2)
				{
					this.friend1.Add(this.portraitOrder[i]);
				}
				else
				{
					this.friend2.Add(this.portraitOrder[i]);
				}
			}
			for (int j = 0; j < this.party.Count; j++)
			{
				if (this.party[j].summoned)
				{
					this.friend1.Add(this.party[j]);
				}
			}
		}
	}

	// Token: 0x06000713 RID: 1811 RVA: 0x00098D8E File Offset: 0x00096F8E
	public bool InFriendGroup(Character c)
	{
		return this.friend1.Contains(c) || this.friend2.Contains(c);
	}

	// Token: 0x06000714 RID: 1812 RVA: 0x00098DB4 File Offset: 0x00096FB4
	public bool IsGroupLeader(Character c, out Character groupLeader)
	{
		groupLeader = null;
		if (c.mainSelected)
		{
			if (this.friend1.Contains(c))
			{
				groupLeader = c;
				return true;
			}
			if (this.friend2.Contains(c))
			{
				groupLeader = c;
				return true;
			}
		}
		else
		{
			if (this.friend1.Contains(c))
			{
				for (int i = 0; i < this.friend1.Count; i++)
				{
					if (this.friend1[i].mainSelected)
					{
						groupLeader = this.friend1[i];
						return false;
					}
				}
				if (this.friend1.Count > 0)
				{
					if (this.friend1[0] == c)
					{
						groupLeader = c;
						return true;
					}
					groupLeader = this.friend1[0];
					return false;
				}
			}
			if (this.friend2.Contains(c))
			{
				for (int j = 0; j < this.friend2.Count; j++)
				{
					if (this.friend2[j].mainSelected)
					{
						groupLeader = this.friend2[j];
						return false;
					}
				}
				if (this.friend2.Count > 0)
				{
					if (this.friend2[0] == c)
					{
						groupLeader = c;
						return true;
					}
					groupLeader = this.friend2[0];
					return false;
				}
			}
		}
		return false;
	}

	// Token: 0x06000715 RID: 1813 RVA: 0x00098EF4 File Offset: 0x000970F4
	public bool TeleportParty(bool always)
	{
		bool flag = false;
		if (Links.x.main.indoorID == "?")
		{
			Links.x.main.indoorID = "";
		}
		if (Links.x.main.node == null)
		{
			return false;
		}
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && (!flag || always))
			{
				Character character = this.party[i];
				if (!character.mainSelected && !character.isBoro && character.IsSentient() && !character.inCircle)
				{
					if (character.indoorID == "?")
					{
						character.indoorID = "";
					}
					bool flag2 = false;
					if (character.indoorID != Links.x.main.indoorID || character.desiredGraph != Links.x.main.desiredGraph || flag2 || always)
					{
						Links.x.GetPartyID(character);
						Vector3 eulerAngles = Links.x.main.tr.rotation.eulerAngles;
						eulerAngles.x = 0f;
						eulerAngles.z = 0f;
						eulerAngles.y *= -1f;
						this.formationHead.rotation = Quaternion.Euler(eulerAngles);
						GraphNode graphNode = Links.x.fellowship.GetFormationPosition(Links.x.main.node, character, false);
						bool flag3;
						if (graphNode != null)
						{
							Vector3 vector = (Vector3)graphNode.position;
							vector.y = Links.x.main.tr.position.y;
							if ((vector - Links.x.main.tr.position).sqrMagnitude > 625f)
							{
								flag3 = false;
								graphNode = null;
							}
							else
							{
								flag3 = true;
							}
						}
						else
						{
							flag3 = true;
						}
						if (flag3)
						{
							character.TargetReached();
							character.ClearPathUpdatesAll();
							if (character.actions)
							{
								if (character.actions)
								{
									character.actions.ClearSelectedActionRealTime();
								}
								if (character.actions)
								{
									character.actions.Interrupt();
								}
								if (character.actions)
								{
									character.actions.CheckIfRunningAI();
								}
							}
							character.body.turnOnMagicaClothNextFrame = 5;
							character.body.SetMagicaClothState(false);
							if (graphNode != null)
							{
								character.tr.position = (Vector3)graphNode.position;
								character.SetRotation(Quaternion.LookRotation((Vector3)graphNode.position - Links.x.main.tr.position), false, true);
								character.FirstPosition(graphNode);
							}
							else
							{
								character.tr.position = Links.x.main.tr.position + new Vector3(1f, 0f, 1f);
								character.FirstPosition(null);
							}
							if (character.actions)
							{
								character.actions.EndTurn(true);
							}
							character.MakeRandomPathAfterJump();
							flag = true;
						}
					}
				}
			}
		}
		return flag;
	}

	// Token: 0x06000716 RID: 1814 RVA: 0x0009924C File Offset: 0x0009744C
	public void StartCheckIfAtTargetLocation()
	{
		if (Records.x.partySailing)
		{
			return;
		}
		if (Records.x.removeControls)
		{
			return;
		}
		if (this.waypointRoutine == null && Links.x.main && !this.TeleportParty(false))
		{
			this.waypointRoutine = this.CheckIfAtTargetLocation();
			base.StartCoroutine(this.waypointRoutine);
		}
	}

	// Token: 0x06000717 RID: 1815 RVA: 0x000992AE File Offset: 0x000974AE
	private IEnumerator CheckIfAtTargetLocation()
	{
		Character c = null;
		bool someoneNeedsPath = false;
		bool doFollow = true;
		int pickupCount = this.PickupCount();
		if (!Records.x.editor)
		{
			this.debug = false;
		}
		int count = this.party.Count;
		this.waypointOrder.Clear();
		for (int j = 0; j < count; j++)
		{
			if (j == 0)
			{
				this.waypointOrder.Add(this.party[j]);
			}
			else
			{
				bool flag = false;
				for (int k = 0; k < this.waypointOrder.Count; k++)
				{
					if (!flag && this.party[j].stats.formationGroup < this.waypointOrder[k].stats.formationGroup)
					{
						flag = true;
						this.waypointOrder.Insert(k, this.party[j]);
					}
				}
				if (!flag)
				{
					this.waypointOrder.Add(this.party[j]);
				}
			}
		}
		this.waypointOrder.Remove(Links.x.main);
		if (Links.x.main)
		{
			this.waypointOrder.Insert(0, Links.x.main);
		}
		Character main = Links.x.main;
		if (main)
		{
			int num23;
			for (int i = 0; i < this.waypointOrder.Count; i = num23 + 1)
			{
				c = this.waypointOrder[i];
				if (c && !someoneNeedsPath)
				{
					if (!main.physicsMove && main.savedPathTarget == null)
					{
						main.savedPathTarget = main.node;
					}
					if (Records.x.editor && (Input.GetKey(KeyCode.Alpha9) || this.debug))
					{
						string[] array = new string[26];
						array[0] = "Checking if in location ";
						int num = 1;
						Character character = c;
						array[num] = ((character != null) ? character.ToString() : null);
						array[2] = " ";
						array[3] = c.jumpingPosition.ToString();
						array[4] = " ";
						array[5] = c.jumpingAreas.ToString();
						array[6] = " ";
						array[7] = c.moving.ToString();
						array[8] = " ";
						int num2 = 9;
						GraphNode moveNode2 = c.moveNode;
						array[num2] = ((moveNode2 != null) ? moveNode2.ToString() : null);
						array[10] = " ";
						int num3 = 11;
						GraphNode slideNode = c.slideNode;
						array[num3] = ((slideNode != null) ? slideNode.ToString() : null);
						array[12] = "  ";
						array[13] = c.movingOutOfWay.ToString();
						array[14] = " ";
						array[15] = c.NodesCount().ToString();
						array[16] = " ";
						array[17] = c.CanMakePath().ToString();
						array[18] = " ";
						array[19] = Links.x.gaia.sceneLoaded.ToString();
						array[20] = " ";
						array[21] = Links.x.gaia.pathfindingReady.ToString();
						array[22] = " ";
						array[23] = c.blockedTime.ToString();
						array[24] = " ";
						array[25] = c.inCombat.ToString();
						Debug.Log(string.Concat(array));
					}
					bool flag2 = false;
					if (c.movingOutOfWayTime > 0f && Time.timeSinceLevelLoad < c.movingOutOfWayTime + 2f)
					{
						flag2 = true;
					}
					bool flag3 = c.inCombat;
					if (c.inCombat && c.actions && c.actions.ai.seenCount == 0)
					{
						flag3 = false;
					}
					bool flag4 = false;
					bool flag5 = false;
					Character character2 = null;
					if (!Records.x.friends)
					{
						flag4 = false;
						c.inFriendGroup = false;
					}
					GraphNode graphNode = main.savedPathTarget;
					Vector3 vector = main.tr.position;
					if (main.moving && !main.physicsMove && main.savedPathTarget != null)
					{
						vector = (Vector3)main.savedPathTarget.position;
					}
					GraphNode leaderNode = main.node;
					Character leader = main;
					if (!main.moving && !main.physicsMove && main.NodesCount() == 0)
					{
						graphNode = leaderNode;
					}
					if (main.physicsMove)
					{
						graphNode = main.node;
					}
					bool justMoved = c.justMoved;
					if (!c.jumpingPosition && !c.jumpingAreas && !c.isBoro)
					{
						if (!c.moving && c.moveNode == null && c.slideNode == null && !c.movingOutOfWay && c.NodesCount() == 0 && c.CanMakePath() && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && c.blockedTime == 0f && !flag3 && (!c.sailing || (c.sailing && c.boatNavigator && !c.boat.turning)) && !c.isBoro && !c.physicsMove)
						{
							Vector3 vector2 = c.sphere.transform.position;
							float sqrMagnitude = (c.sphere.transform.position - vector2).sqrMagnitude;
							if (sqrMagnitude > 0.75f && sqrMagnitude < 10f)
							{
								vector2 = c.sphere.transform.position;
							}
							float num4 = (c.tr.position - new Vector3(main.tr.position.x, c.tr.position.y, main.tr.position.z)).sqrMagnitude;
							float num5 = 0f;
							float sqrMagnitude2 = (c.tr.position - vector2).sqrMagnitude;
							float num6 = 5f + 2f * (float)Links.x.GetPortraitIndexWaypoints(c);
							if (!Links.x.main.moving)
							{
								num6 += 6f;
							}
							if (main.node != null && main.node.Penalty > 25000U)
							{
								num6 += 15f;
							}
							if (c.summoned)
							{
								num6 = 20f;
							}
							if ((Records.x.partyWait || c.inCircle) && doFollow)
							{
								num6 = 50000f;
							}
							if (flag4 && !flag5)
							{
								Vector3 vector3 = c.tr.position;
								if (c.GetLastNode() != null)
								{
									vector3 = (Vector3)c.GetLastNode().position;
								}
								num5 = (vector3 - new Vector3(character2.tr.position.x, c.tr.position.y, character2.tr.position.z)).sqrMagnitude;
								num6 = 50f;
								num4 = 0f;
							}
							if (Records.x.editor && (Input.GetKey(KeyCode.Alpha9) || this.debug))
							{
								string[] array2 = new string[26];
								array2[0] = "Checking if in location 2 ";
								int num7 = 1;
								Character character3 = c;
								array2[num7] = ((character3 != null) ? character3.ToString() : null);
								array2[2] = " ";
								array2[3] = num4.ToString();
								array2[4] = " ";
								array2[5] = sqrMagnitude2.ToString();
								array2[6] = " ";
								array2[7] = num6.ToString();
								array2[8] = " ";
								array2[9] = Records.x.partyWait.ToString();
								array2[10] = " ";
								array2[11] = justMoved.ToString();
								array2[12] = " ";
								array2[13] = c.movingOutOfWayTime.ToString();
								array2[14] = " ";
								int num8 = 15;
								GraphNode graphNode2 = this.companionNode1;
								array2[num8] = ((graphNode2 != null) ? graphNode2.ToString() : null);
								array2[16] = " ";
								int num9 = 17;
								GraphNode savedPathTarget = c.savedPathTarget;
								array2[num9] = ((savedPathTarget != null) ? savedPathTarget.ToString() : null);
								array2[18] = " ";
								array2[19] = flag4.ToString();
								array2[20] = " ";
								array2[21] = flag5.ToString();
								array2[22] = " ";
								array2[23] = main.moving.ToString();
								array2[24] = " ";
								int num10 = 25;
								Vector3 vector4 = vector;
								array2[num10] = vector4.ToString();
								Debug.Log(string.Concat(array2));
							}
							if (sqrMagnitude2 > 9f && c.savedPathTarget != null && ((doFollow && (num4 < num6 * num6 || (flag4 && !flag5 && num5 < 64f))) || !doFollow) && !Records.x.partyWait && !c.mainSelected)
							{
								GraphNode moveNode = c.savedPathTarget;
								if (moveNode != null && c.node != null && c.stats.Stuck() == 0)
								{
									if (c.followingType == "")
									{
										GraphNode graphNode3 = c.NearNode(vector2, true, 0, -1, c.CheckCircleID());
										if (graphNode3 != null)
										{
											Vector3 vector5 = (Vector3)graphNode3.position;
											if ((vector5 - vector2).sqrMagnitude < 9f && Mathf.Abs(vector5.y - vector2.y) < 1.5f)
											{
												moveNode = graphNode3;
											}
										}
									}
									ABPath p = ABPath.ConstructFast(c.node, moveNode, null);
									bool flag6 = false;
									if (c.pushCount >= this.pushCountMax)
									{
										flag6 = true;
									}
									this.SetNodeConstraintParty(c, flag6, true, true, 0, 1);
									p.nnConstraint = this.nodeConstraintParty;
									AstarPath.StartPath(p, false);
									yield return base.StartCoroutine(p.WaitForPath());
									p.Claim(this);
									bool flag7 = !p.error;
									p.Release(this, false);
									if (Records.x.astarDebugging && c.mainSelected)
									{
										string[] array3 = new string[7];
										int num11 = 0;
										Character character4 = c;
										array3[num11] = ((character4 != null) ? character4.ToString() : null);
										array3[1] = " ";
										array3[2] = flag7.ToString();
										array3[3] = " ";
										array3[4] = c.node.position;
										array3[5] = " ";
										array3[6] = moveNode.position;
										Debug.Log(string.Concat(array3));
									}
									if (flag7 && c.waitingForPath != 1)
									{
										c.ClearCurrentPathNodes();
										c.ClearPathUpdates();
										c.pathTargPosition = (Vector3)moveNode.position;
										int num12 = 500;
										if (Records.x.partyWait)
										{
											num12 = 5;
										}
										c.MakePath(moveNode, num12, false, false, false);
										if (c.waypoint && !(c.waypoint.transform.position == Links.x.gameplay.farPosition))
										{
											c.showWaypoint = true;
										}
										yield return new WaitForSeconds(0.1f);
									}
									else
									{
										c.pushCount = 0;
									}
									p = null;
								}
								moveNode = null;
							}
							else if (Random.Range(0, 5) == 0 && pickupCount > 0 && !c.hasActions && !c.mainSelected)
							{
								this.LookForPickups(c);
							}
							else
							{
								if (Records.x.editor && (Input.GetKey(KeyCode.Alpha9) || this.debug))
								{
									string[] array4 = new string[24];
									array4[0] = "Checking if in location 3 ";
									int num13 = 1;
									Character character5 = c;
									array4[num13] = ((character5 != null) ? character5.ToString() : null);
									array4[2] = " ";
									array4[3] = num4.ToString();
									array4[4] = " ";
									array4[5] = sqrMagnitude2.ToString();
									array4[6] = " ";
									array4[7] = num5.ToString();
									array4[8] = " ";
									array4[9] = num6.ToString();
									array4[10] = " ";
									array4[11] = Records.x.partyWait.ToString();
									array4[12] = " ";
									array4[13] = justMoved.ToString();
									array4[14] = " ";
									array4[15] = flag2.ToString();
									array4[16] = " ";
									int num14 = 17;
									GraphNode graphNode4 = this.companionNode1;
									array4[num14] = ((graphNode4 != null) ? graphNode4.ToString() : null);
									array4[18] = " ";
									int num15 = 19;
									GraphNode commandMove = c.commandMove;
									array4[num15] = ((commandMove != null) ? commandMove.ToString() : null);
									array4[20] = " ";
									int num16 = 21;
									GraphNode savedPathTarget2 = c.savedPathTarget;
									array4[num16] = ((savedPathTarget2 != null) ? savedPathTarget2.ToString() : null);
									array4[22] = " ";
									array4[23] = c.pickupTime.ToString();
									Debug.Log(string.Concat(array4));
								}
								if (!Records.x.InCombat(false) && !c.mainSelected && doFollow && !c.isBoro && ((!justMoved && !flag2) || (flag4 && !flag5)) && (num4 > num6 * num6 || c.inCircle) && c.pickupTime == 0f)
								{
									if (num4 >= num6 * num6 && this.companionNode1 == null && c.commandMove == null && !c.inCircle)
									{
										GraphNode graphNode5 = graphNode;
										if (graphNode5 == null)
										{
											graphNode5 = leaderNode;
										}
										if (Records.x.editor && Input.GetKey(KeyCode.Alpha9))
										{
											string text = "Checking if in location 4 ";
											Character character6 = c;
											string text2 = ((character6 != null) ? character6.ToString() : null);
											string text3 = " ";
											GraphNode graphNode6 = graphNode5;
											Debug.Log(text + text2 + text3 + ((graphNode6 != null) ? graphNode6.ToString() : null));
										}
										if (graphNode5 != null)
										{
											if (main.physicsMove)
											{
												Vector3 vector6 = (Vector3)graphNode5.position + Links.x.main.tr.forward * 4f;
												GraphNode graphNode7 = graphNode5.ClosestConnection(graphNode5, 0, 0, 25f, vector6, 0, 0, c.nodeConstraint, 0);
												if (graphNode7 != null)
												{
													graphNode5 = graphNode7;
												}
											}
											this.formationHead.rotation = Quaternion.LookRotation(main.tr.position - c.tr.position);
											GraphNode formationPosition = this.GetFormationPosition(graphNode5, c, true);
											if (Records.x.editor && (Input.GetKey(KeyCode.Alpha9) || this.debug))
											{
												string[] array5 = new string[6];
												array5[0] = "Checking if in location 4 ";
												int num17 = 1;
												Character character7 = c;
												array5[num17] = ((character7 != null) ? character7.ToString() : null);
												array5[2] = " ";
												int num18 = 3;
												GraphNode graphNode8 = formationPosition;
												array5[num18] = ((graphNode8 != null) ? graphNode8.ToString() : null);
												array5[4] = " ";
												array5[5] = Vector3.Distance((Vector3)graphNode5.position, c.tr.position).ToString();
												Debug.Log(string.Concat(array5));
											}
											if (formationPosition != null && c.waitingForPath != 1)
											{
												c.savedFollowNode = graphNode5;
												int num19 = 500;
												if (Records.x.partyWait)
												{
													num19 = 5;
												}
												if (flag4 && !flag5)
												{
													c.clickedPoint = character2.tr.position + this.formationHead.forward * -2.5f;
												}
												c.MakePath(formationPosition, num19, false, false, true);
											}
										}
									}
									else if (this.companionNode1 != null && !flag2)
									{
										this.CompanionIndoorNode(c);
									}
									else if (c.commandMove != null && !flag2 && !c.hasActions)
									{
										if (((Vector3)c.commandMove.position - c.tr.position).sqrMagnitude > 16f)
										{
											c.savedFollowNode = c.commandMove;
											c.ClearPathUpdates();
											c.pathTargPosition = (Vector3)c.commandMove.position;
											c.MakePath(c.commandMove, 500, false, false, true);
										}
									}
									else if (c.inCircle && !c.mainSelected && !flag2 && !c.hasActions)
									{
										this.CheckCirclePositionAndMove(c);
									}
								}
							}
						}
						else if (((((flag5 && flag4) || !flag4 || !Records.x.friends) && (main.physicsMove || main.moving) && !justMoved) || (flag4 && !flag5 && (character2.moving || character2.physicsMove))) && c.savedFollowNode != null && graphNode != null && doFollow && c.CanMakePath() && c.slideNode == null && !c.movingOutOfWay && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && !flag3 && !c.mainSelected && !Records.x.partyWait && this.companionNode1 == null && c.pickupTime == 0f && c.commandMove == null && !c.inCircle)
						{
							float num20 = 6f;
							if (Links.x.main.physicsMove)
							{
								num20 = 10f;
							}
							if (c.NodesCount() <= 1)
							{
								num20 = 2f;
							}
							if (leaderNode.Penalty > 25000U)
							{
								num20 += 8f;
							}
							bool flag8 = false;
							if (c.savedFollowNode == leaderNode)
							{
								flag8 = true;
							}
							if (Records.x.editor && (Input.GetKey(KeyCode.Alpha9) || this.debug))
							{
								string[] array6 = new string[18];
								array6[0] = "Looking for point on the move ";
								int num21 = 1;
								Character character8 = c;
								array6[num21] = ((character8 != null) ? character8.ToString() : null);
								array6[2] = " ";
								array6[3] = c.moving.ToString();
								array6[4] = " ";
								array6[5] = ((Vector3)c.savedFollowNode.position - vector).sqrMagnitude.ToString();
								array6[6] = " ";
								array6[7] = num20.ToString();
								array6[8] = " ";
								array6[9] = ((Vector3)c.savedFollowNode.position).ToString();
								array6[10] = " ";
								int num22 = 11;
								Vector3 vector4 = vector;
								array6[num22] = vector4.ToString();
								array6[12] = " ";
								array6[13] = flag8.ToString();
								array6[14] = " ";
								array6[15] = c.waitingForPath.ToString();
								array6[16] = " ";
								array6[17] = c.NodesCount().ToString();
								Debug.Log(string.Concat(array6));
							}
							if (((Vector3)c.savedFollowNode.position - vector).sqrMagnitude > num20 * num20 && !flag8)
							{
								if (Random.Range(0, 4) == 0 && !c.hasActions && !c.mainSelected && pickupCount > 0)
								{
									this.LookForPickups(c);
								}
								else
								{
									if (graphNode == null)
									{
										graphNode = leaderNode;
									}
									this.GetNewPath(c, graphNode);
								}
							}
						}
						else if (this.companionNode1 != null && !flag2)
						{
							if (!c.moving && c.moveNode == null && c.slideNode == null && !c.movingOutOfWay && c.NodesCount() == 0 && c.CanMakePath() && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && !flag3 && !c.sailing && !c.isBoro && !c.mainSelected)
							{
								this.CompanionIndoorNode(c);
							}
						}
						else if (c.commandMove != null && flag2 && !c.hasActions)
						{
							if (!c.moving && c.moveNode == null && c.slideNode == null && !c.movingOutOfWay && c.NodesCount() == 0 && c.CanMakePath() && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && !flag3 && !c.sailing && !c.isBoro && !c.mainSelected && ((Vector3)c.commandMove.position - c.tr.position).sqrMagnitude > 16f)
							{
								c.savedFollowNode = c.commandMove;
								c.ClearPathUpdates();
								c.pathTargPosition = (Vector3)c.commandMove.position;
								c.MakePath(c.commandMove, 500, false, false, true);
							}
						}
						else if (c.inCircle && !c.mainSelected && !flag2 && !c.hasActions && !c.moving && c.waitingForPath == 0 && c.blockedTime == 0f)
						{
							this.CheckCirclePositionAndMove(c);
						}
						if (!c.mainSelected && !c.hasActions && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && doFollow && !c.fleeing && !c.missing && !Records.x.partyWait && !c.inCircle && !leader.jumpingAreas && !leader.jumpingPosition && !c.jumpingPosition && !c.jumpingAreas && c.IsSentient() && (c.tr.position - leader.tr.position).sqrMagnitude > 4900f && leaderNode != null)
						{
							bool flag9 = false;
							if (c.indoorID == "?")
							{
								c.indoorID = "";
							}
							if (c.indoorID != leader.indoorID || c.desiredGraph != leader.desiredGraph)
							{
								flag9 = true;
							}
							if (!flag9)
							{
								this.JumpPosition(leader, i, c);
							}
						}
					}
					leaderNode = null;
					leader = null;
				}
				num23 = i;
			}
		}
		this.waypointRoutine = null;
		yield break;
	}

	// Token: 0x06000718 RID: 1816 RVA: 0x000992C0 File Offset: 0x000974C0
	public void GetNewPath(Character c, GraphNode fromNode)
	{
		if (c.CanMakePath() && Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady)
		{
			GraphNode graphNode = fromNode;
			if (Links.x.main.physicsMove)
			{
				graphNode = Links.x.main.node;
				Vector3 vector = (Vector3)graphNode.position + Links.x.main.tr.forward * 2.5f;
				GraphNode graphNode2 = graphNode.ClosestConnection(graphNode, 0, 0, 36f, vector, 0, 0, c.nodeConstraint, 0);
				if (graphNode2 != null)
				{
					graphNode = graphNode2;
					vector = (Vector3)graphNode.position + Links.x.main.tr.forward * 2.5f;
					graphNode2 = graphNode.ClosestConnection(graphNode, 0, 0, 36f, vector, 0, 0, c.nodeConstraint, 0);
					if (graphNode2 != null)
					{
						graphNode = graphNode2;
					}
				}
			}
			if (graphNode != null && c.waitingForPath != 1 && (c.timeSinceFollowPath == 0f || Time.timeSinceLevelLoad > c.timeSinceFollowPath + 0.5f))
			{
				this.formationHead.rotation = Links.x.main.tr.rotation;
				GraphNode formationPosition = this.GetFormationPosition(graphNode, c, true);
				if (formationPosition != null)
				{
					c.savedFollowNode = graphNode;
					c.ClearPathUpdates();
					c.pathTargPosition = (Vector3)formationPosition.position;
					c.MakePath(formationPosition, 500, false, false, true);
				}
			}
		}
	}

	// Token: 0x06000719 RID: 1817 RVA: 0x00099448 File Offset: 0x00097648
	public void StopWalking(bool all)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && (all || !this.party[i].mainSelected))
			{
				this.party[i].TargetReached();
			}
		}
	}

	// Token: 0x0600071A RID: 1818 RVA: 0x000994A8 File Offset: 0x000976A8
	public int PickupCount()
	{
		int num = 0;
		if (this.pickups == null)
		{
			this.pickups = Links.x.cellar.pickups;
		}
		int count = this.pickups.Count;
		for (int i = 0; i < count; i++)
		{
			if (this.pickups[i])
			{
				num++;
			}
		}
		return num;
	}

	// Token: 0x0600071B RID: 1819 RVA: 0x00099504 File Offset: 0x00097704
	public bool LookForPickups(Character character)
	{
		if (this.pickups == null)
		{
			this.pickups = Links.x.cellar.pickups;
		}
		int count = this.pickups.Count;
		float num = 20f;
		if (character.inCircle)
		{
			num = 8f;
		}
		float num2 = num * num;
		this.nearPickups.Clear();
		bool flag = false;
		float num3 = (float)character.stats.HealthCurrent() / (float)character.stats.HealthMax();
		bool flag2 = false;
		if (num3 < 1f)
		{
			flag2 = true;
		}
		if (character.party && character.stats.HasSpellbook() && character.stats.SpiritCurrent() < 90)
		{
			flag = true;
		}
		for (int i = 0; i < count; i++)
		{
			Pickups pickups = this.pickups[i];
			if (pickups && ((flag2 && pickups.isHealth) || (pickups.isSpirit && flag)) && (pickups.tr.position - character.currentPosition).sqrMagnitude < num2)
			{
				this.nearPickups.Add(pickups);
			}
		}
		if (this.nearPickups.Count > 0)
		{
			this.pickupCoroutine = this.PickupMove(character);
			base.StartCoroutine(this.pickupCoroutine);
			return true;
		}
		return false;
	}

	// Token: 0x0600071C RID: 1820 RVA: 0x00099645 File Offset: 0x00097845
	private IEnumerator PickupMove(Character character)
	{
		bool foundItem = false;
		Pickups itemToPickup = null;
		if (!foundItem && !character.sailing)
		{
			int num2;
			for (int i = 0; i < this.pickups.Count; i = num2 + 1)
			{
				if (!foundItem)
				{
					Pickups item = this.pickups[i];
					GraphNode node = item.node;
					if (node != null)
					{
						ABPath p = ABPath.ConstructFast(character.node, node, null);
						p.nnConstraint = this.nodeConstraint;
						AstarPath.StartPath(p, false);
						yield return base.StartCoroutine(p.WaitForPath());
						p.Claim(this);
						bool flag = false;
						if (!p.error)
						{
							flag = true;
						}
						if (flag)
						{
							this.tempPath = p.path;
							GraphNode graphNode = null;
							int num = 0;
							for (int j = 0; j < this.tempPath.Count; j++)
							{
								if (this.tempPath[j] != character.node)
								{
									graphNode = this.tempPath[j];
									num++;
								}
							}
							if (graphNode != null)
							{
								foundItem = true;
								itemToPickup = item;
								character.pickupTime = Time.timeSinceLevelLoad;
								break;
							}
						}
						p.Release(this, false);
						p = null;
					}
					item = null;
				}
				num2 = i;
			}
		}
		this.pickupCoroutine = null;
		if (foundItem && itemToPickup.node != null)
		{
			character.ClearPathUpdates();
			character.pathTargPosition = (Vector3)itemToPickup.node.position;
			character.MakePath(itemToPickup.node, 500, false, false, true);
		}
		yield break;
	}

	// Token: 0x0600071D RID: 1821 RVA: 0x0009965C File Offset: 0x0009785C
	public void JumpPosition(Character main, int i, Character selectedParty)
	{
		GraphNode formationPosition = this.GetFormationPosition(main.node, selectedParty, false);
		if (formationPosition != null)
		{
			selectedParty.body.SetMagicaClothState(false);
			selectedParty.body.turnOnMagicaClothNextFrame = 3;
			selectedParty.SetPosition((Vector3)formationPosition.position, null);
			selectedParty.ClaimNode(formationPosition, (Vector3)formationPosition.position, true);
			selectedParty.sphere.transform.position = (Vector3)formationPosition.position;
			selectedParty.savedFollowNode = main.node;
			selectedParty.SetMoveFollowPosition((Vector3)formationPosition.position);
			selectedParty.indoorID = "";
			selectedParty.doorID = "";
			selectedParty.TargetReached();
			selectedParty.waitingForPath = 0;
			selectedParty.ClearMoveTargets();
			if (main.desiredGraph == 1)
			{
				if (Links.x.diorama.GetIndoorView())
				{
					selectedParty.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName((Vector3)formationPosition.position);
				}
				else
				{
					selectedParty.indoorID = "?";
				}
				selectedParty.doorID = "";
			}
			selectedParty.ChangeTorchLight();
			selectedParty.FirstPosition(formationPosition);
		}
	}

	// Token: 0x0600071E RID: 1822 RVA: 0x00099788 File Offset: 0x00097988
	public bool CheckCirclePositionAndMove(Character c)
	{
		GraphNode graphNode = c.node;
		if (this.circleTiles.Contains(graphNode))
		{
			return false;
		}
		graphNode = this.GetFormationPointInCircle(c);
		if (graphNode != null && graphNode != c.node)
		{
			c.savedFollowNode = graphNode;
			c.ClearPathUpdates();
			c.pathTargPosition = (Vector3)graphNode.position;
			c.MakePath(graphNode, 500, false, false, true);
			return true;
		}
		return false;
	}

	// Token: 0x0600071F RID: 1823 RVA: 0x000997F0 File Offset: 0x000979F0
	private void CompanionIndoorNode(Character selectedParty)
	{
		int portraitIndexWaypoints = Links.x.GetPortraitIndexWaypoints(selectedParty);
		GraphNode graphNode = null;
		if (portraitIndexWaypoints == 1)
		{
			graphNode = this.companionNode1;
		}
		if (portraitIndexWaypoints == 2 && this.companionNode2 != null)
		{
			graphNode = this.companionNode2;
		}
		if (portraitIndexWaypoints == 3 && this.companionNode3 != null)
		{
			graphNode = this.companionNode3;
		}
		if (selectedParty.summoned && this.companionNode4 != null)
		{
			GraphNode graphNode2 = selectedParty.NearNode((Vector3)this.companionNode4.position, true, 0, -1, selectedParty.CheckCircleID());
			if (graphNode2 != null)
			{
				graphNode = graphNode2;
			}
		}
		if (graphNode != null)
		{
			float num = 10f;
			if (selectedParty.summoned)
			{
				num = 50f;
			}
			float sqrMagnitude = (Links.x.main.tr.position - (Vector3)graphNode.position).sqrMagnitude;
			if (((Vector3)graphNode.position - selectedParty.tr.position).sqrMagnitude > num && sqrMagnitude > 25f)
			{
				selectedParty.savedFollowNode = graphNode;
				selectedParty.ClearPathUpdates();
				selectedParty.pathTargPosition = (Vector3)graphNode.position;
				selectedParty.MakePath(graphNode, 500, false, false, true);
			}
		}
	}

	// Token: 0x06000720 RID: 1824 RVA: 0x00099914 File Offset: 0x00097B14
	public bool AnyoneResurrecting(Character c)
	{
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			Character character = this.portraitOrder[i];
			if (character && character.actions && character.actions.ai.resurrectCorout != null)
			{
				if (!c)
				{
					return true;
				}
				if (c == character.actions.ai.pinnedTarget)
				{
					return true;
				}
			}
		}
		return false;
	}

	// Token: 0x06000721 RID: 1825 RVA: 0x00099990 File Offset: 0x00097B90
	public bool AnyonePinning()
	{
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			Character character = this.portraitOrder[i];
			if (character && (character.stats.pinning || character.stats.pinned))
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000722 RID: 1826 RVA: 0x000999E8 File Offset: 0x00097BE8
	public bool NearCompanionNode(Character selectedParty)
	{
		int portraitIndexWaypoints = Links.x.GetPortraitIndexWaypoints(selectedParty);
		GraphNode graphNode = null;
		if (portraitIndexWaypoints == 1)
		{
			graphNode = this.companionNode1;
		}
		if (portraitIndexWaypoints == 2 && this.companionNode2 != null)
		{
			graphNode = this.companionNode2;
		}
		if (portraitIndexWaypoints == 3 && this.companionNode3 != null)
		{
			graphNode = this.companionNode3;
		}
		if (selectedParty.summoned && this.companionNode4 != null)
		{
			graphNode = this.companionNode4;
		}
		return graphNode != null && ((Vector3)graphNode.position - selectedParty.tr.position).sqrMagnitude < 10f;
	}

	// Token: 0x06000723 RID: 1827 RVA: 0x00099A7C File Offset: 0x00097C7C
	public void SetPartyPositions(bool useSelected)
	{
		Vector3 position = this.party[0].tr.position;
		GraphNode graphNode = this.party[0].node;
		if (graphNode == null)
		{
			graphNode = this.party[0].NearNode(position, true, 0, -1, 1);
			if (graphNode != null)
			{
				this.party[0].ClaimNode(graphNode, (Vector3)graphNode.position, true);
			}
		}
		if (graphNode != null)
		{
			this.SetFormationHead(graphNode);
			for (int i = 1; i < this.party.Count; i++)
			{
				if (this.party[i] && ((useSelected && this.party[i].selected) || !useSelected))
				{
					GraphNode graphNode2 = this.party[i].NearNode((Vector3)graphNode.position, true, 0, -1, 1);
					if (graphNode2 != null)
					{
						this.party[i].SetPosition((Vector3)graphNode2.position, null);
						Quaternion quaternion = Links.x.diorama.playerStartDefault.rotation;
						if (!this.party[i].mainSelected)
						{
							quaternion = Quaternion.LookRotation(Links.x.main.tr.position = this.party[i].tr.position);
						}
						Vector3 eulerAngles = quaternion.eulerAngles;
						eulerAngles.x = 0f;
						eulerAngles.z = 0f;
						eulerAngles.y += Random.Range(-180f, 180f);
						this.party[i].SetRotation(Quaternion.Euler(eulerAngles), false, true);
						this.party[i].FirstPosition(graphNode2);
					}
				}
			}
		}
		else
		{
			Debug.Log("Start node is null");
		}
	}

	// Token: 0x06000724 RID: 1828 RVA: 0x00099C60 File Offset: 0x00097E60
	public void UpdateHotkeys()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].portrait && !this.party[i].isBoro)
			{
				this.party[i].portrait.UpdateKey(Links.x.joy);
			}
		}
	}

	// Token: 0x06000725 RID: 1829 RVA: 0x00099CE4 File Offset: 0x00097EE4
	public void RemoveAllFromSelected(Character c)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i] != c)
			{
				this.party[i].RemoveFromSelected(false);
			}
		}
	}

	// Token: 0x06000726 RID: 1830 RVA: 0x00099D40 File Offset: 0x00097F40
	public void SetFirstAsSelected(bool setLeader)
	{
		bool flag = false;
		int num = 10;
		int num2 = -1;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].selected && !this.party[i].isBoro && this.party[i].stats.formationGroup < num && !this.party[i].summoned)
			{
				flag = true;
				num2 = i;
				num = this.party[i].stats.formationGroup;
			}
		}
		if (num2 == -1)
		{
			for (int j = 0; j < this.party.Count; j++)
			{
				if (this.party[j] && this.party[j].selected && !this.party[j].isBoro && this.party[j].stats.formationGroup < num)
				{
					flag = true;
					num2 = j;
					num = this.party[j].stats.formationGroup;
				}
			}
		}
		if (num2 >= 0)
		{
			this.party[num2].SetAsLeader();
		}
		if (!flag && setLeader)
		{
			this.party[0].SetAsLeader();
			this.party[0].AddToSelected(true, false);
		}
	}

	// Token: 0x06000727 RID: 1831 RVA: 0x00099EC8 File Offset: 0x000980C8
	public void StopMoving()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i])
			{
				this.party[i].EndPath();
			}
		}
	}

	// Token: 0x06000728 RID: 1832 RVA: 0x00099F10 File Offset: 0x00098110
	private bool PartyClose(Character character, Vector3 point)
	{
		point.y = character.tr.position.y;
		return (character.tr.position - point).sqrMagnitude < 100f;
	}

	// Token: 0x06000729 RID: 1833 RVA: 0x00099F58 File Offset: 0x00098158
	public void CheckForPartySongs(string trigger)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i].IsSentient() && !this.party[i].isBoro)
			{
				int num;
				this.party[i].stats.CheckForSongsAndWords(trigger, out num);
			}
		}
	}

	// Token: 0x0600072A RID: 1834 RVA: 0x00099FD0 File Offset: 0x000981D0
	public Character GetSearchNumber(string job, out int jobTotal, string skill, Vector3 point)
	{
		Character character = null;
		float num = -1f;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.PartyClose(this.party[i], point) && !this.party[i].isBoro)
			{
				float num2 = this.party[i].stats.SearchNumber(job, false, skill);
				if (num2 > num)
				{
					character = this.party[i];
					num = num2;
				}
			}
		}
		jobTotal = (int)Mathf.Ceil(num);
		return character;
	}

	// Token: 0x0600072B RID: 1835 RVA: 0x0009A070 File Offset: 0x00098270
	public bool OnlyOneMoving(Character character)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i] != character && !this.party[i].isBoro)
			{
				return false;
			}
		}
		return true;
	}

	// Token: 0x0600072C RID: 1836 RVA: 0x0009A0D0 File Offset: 0x000982D0
	public float GetPartyMoveSpeed()
	{
		int count = this.party.Count;
		float num = 0f;
		float num2 = 0f;
		if (Links.x.main.stats.moveSpeedMod != 0f)
		{
			return Links.x.main.stats.MoveSpeed(false);
		}
		for (int i = 0; i < count; i++)
		{
			Character character = this.party[i];
			if (character && !character.isBoro && !character.summoned)
			{
				float num3 = this.party[i].stats.MoveSpeed(false);
				num += num3;
				num2 += 1f;
			}
		}
		return num / num2;
	}

	// Token: 0x0600072D RID: 1837 RVA: 0x0009A18C File Offset: 0x0009838C
	public float GetSailingSpeed(out float weightTotal, out float sailingFamilyMod, out float banners, out float boroBonus)
	{
		float num = 0f;
		weightTotal = 0f;
		sailingFamilyMod = 0f;
		float num2 = 0f;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i])
			{
				weightTotal += this.party[i].stats.CharacterWeight();
				num2 += (float)this.party[i].stats.CarryingWeight() + 50f;
			}
		}
		banners = 0f;
		boroBonus = Mathf.Round(Records.x.boroBonus.x * 5f * 100f) / 100f;
		weightTotal /= num2;
		weightTotal *= 3f;
		weightTotal = Mathf.Round(weightTotal * 100f) / 100f;
		num -= weightTotal;
		num += banners;
		return num + boroBonus;
	}

	// Token: 0x0600072E RID: 1838 RVA: 0x0009A280 File Offset: 0x00098480
	public void SetPartyLightColor()
	{
		bool flag = false;
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].summoned && !this.party[i].isBoro && this.party[i].hasTorch)
			{
				flag = true;
			}
		}
		if (flag)
		{
			Links.x.currentPartyLightColor = Links.x.torchColor;
			return;
		}
		Links.x.currentPartyLightColor = Links.x.partyLightColor;
	}

	// Token: 0x0600072F RID: 1839 RVA: 0x0009A320 File Offset: 0x00098520
	public bool PartyHasTorch()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].summoned && !this.party[i].isBoro && this.party[i].hasTorch)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000730 RID: 1840 RVA: 0x0009A392 File Offset: 0x00098592
	public void StartDeathSequence()
	{
		base.StartCoroutine(this.DeathSequence());
	}

	// Token: 0x06000731 RID: 1841 RVA: 0x0009A3A1 File Offset: 0x000985A1
	private IEnumerator DeathSequence()
	{
		Records.x.RemoveControls(true);
		Records.x.mainCharacterDead = true;
		Links.x.cameraEffects.PlayAnimation("CameraDeath");
		Links.x.gaia.SetPlaylist("Death", true, 0f);
		Links.x.combat.EndCombat(false);
		foreach (Character character in this.party)
		{
			if (character.party)
			{
				Links.x.inventory.ClearBag(character);
			}
		}
		yield return new WaitForSecondsRealtime(2.5f);
		Links.x.gameplay.OpenDock();
		Links.x.deathScreen.SetActive(true);
		Links.x.deathScreen.GetComponent<DeathScreen>().Setup();
		yield break;
	}

	// Token: 0x06000732 RID: 1842 RVA: 0x0009A3B0 File Offset: 0x000985B0
	public void SingleSelected(Character character)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && this.party[i] != character && !this.party[i].isBoro)
			{
				this.party[i].RemoveFromSelected(false);
			}
		}
	}

	// Token: 0x06000733 RID: 1843 RVA: 0x0009A420 File Offset: 0x00098620
	public void SetPartyRotation(Vector3 pt)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].isBoro && !this.party[i].summoned && !this.party[i].mainSelected)
			{
				this.party[i].SetRotation(Quaternion.LookRotation(pt - this.party[i].tr.position), false, false);
			}
		}
	}

	// Token: 0x06000734 RID: 1844 RVA: 0x0009A4CC File Offset: 0x000986CC
	public void SelectAll()
	{
		if (Links.x.cameraEffects.indoors)
		{
			string currentBoundsName = Links.x.rtsCamera.currentBoundsName;
		}
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].selected && !this.party[i].isBoro)
			{
				this.party[i].AddToSelected(true, false);
			}
		}
		this.SetFirstAsSelected(true);
	}

	// Token: 0x06000735 RID: 1845 RVA: 0x0009A564 File Offset: 0x00098764
	public bool AnyoneOutside()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].isBoro && this.party[i].desiredGraph == 0)
			{
				return true;
			}
		}
		return false;
	}

	// Token: 0x06000736 RID: 1846 RVA: 0x0009A5C3 File Offset: 0x000987C3
	public void GetFormation()
	{
		this.currentFormationPoints = this.formationPoints1;
		this.formationHead = this.formationPoints1[0].parent;
	}

	// Token: 0x06000737 RID: 1847 RVA: 0x0009A5E8 File Offset: 0x000987E8
	public void SetNodeConstraint(Character pathfinder, bool constrainTags, bool constrainRadius, bool checkWalkRadius, int uniqueID, int checkCircle)
	{
		this.nodeConstraint.constrainWalkability = true;
		this.nodeConstraint.walkable = true;
		this.nodeConstraint.constrainPenalty = 0;
		this.nodeConstraint.constrainTags = constrainTags;
		this.nodeConstraint.checkCircleID = checkCircle;
		if (!pathfinder)
		{
			this.nodeConstraint.passID = 0;
			this.nodeConstraint.passID2 = 0;
			this.nodeConstraint.checkConnections = Records.x.playerDefaultConnections;
			this.nodeConstraint.constrainPenalty = 0;
		}
		else
		{
			this.nodeConstraint.passID = pathfinder.nodeStationaryID;
			this.nodeConstraint.passID2 = pathfinder.nodeMovingID;
			this.nodeConstraint.checkConnections = pathfinder.ConnectionNumber();
			if (pathfinder.npc)
			{
				this.nodeConstraint.constrainPenalty = 1;
			}
			else
			{
				this.nodeConstraint.constrainPenalty = 2;
			}
		}
		this.nodeConstraint.constrainToArea = -1;
		if (Records.x.partySailing)
		{
			this.nodeConstraint.constrainToEnvironment = 2;
			return;
		}
		this.nodeConstraint.constrainToEnvironment = 1;
	}

	// Token: 0x06000738 RID: 1848 RVA: 0x0009A6FC File Offset: 0x000988FC
	public void SetNodeConstraintParty(Character pathfinder, bool constrainTags, bool constrainRadius, bool checkWalkRadius, int uniqueID, int checkCircle)
	{
		this.nodeConstraintParty.constrainWalkability = true;
		this.nodeConstraintParty.walkable = true;
		this.nodeConstraintParty.constrainPenalty = 0;
		this.nodeConstraintParty.constrainTags = constrainTags;
		this.nodeConstraintParty.checkCircleID = checkCircle;
		if (!pathfinder)
		{
			this.nodeConstraintParty.passID = 0;
			this.nodeConstraintParty.passID2 = 0;
			this.nodeConstraintParty.checkConnections = Records.x.playerDefaultConnections;
			this.nodeConstraintParty.constrainPenalty = 0;
		}
		else
		{
			this.nodeConstraintParty.passID = pathfinder.nodeStationaryID;
			this.nodeConstraintParty.passID2 = pathfinder.nodeMovingID;
			this.nodeConstraintParty.checkConnections = pathfinder.ConnectionNumber();
			if (pathfinder.npc)
			{
				this.nodeConstraintParty.constrainPenalty = 1;
			}
			else
			{
				this.nodeConstraintParty.constrainPenalty = 2;
			}
		}
		this.nodeConstraintParty.constrainToArea = -1;
		if (Records.x.partySailing)
		{
			this.nodeConstraintParty.constrainToEnvironment = 2;
			return;
		}
		this.nodeConstraintParty.constrainToEnvironment = 1;
	}

	// Token: 0x06000739 RID: 1849 RVA: 0x0009A810 File Offset: 0x00098A10
	public void UpdateSelectionFromDoors()
	{
		bool indoors = Links.x.cameraEffects.indoors;
		string text = "";
		if (indoors)
		{
			text = Links.x.rtsCamera.currentBoundsName;
		}
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].isBoro && (!indoors || this.party[i].desiredGraph != 1 || !(this.party[i].indoorID == text)) && !indoors)
			{
				int desiredGraph = this.party[i].desiredGraph;
			}
		}
		this.SetFirstAsSelected(true);
	}

	// Token: 0x0600073A RID: 1850 RVA: 0x0009A8D0 File Offset: 0x00098AD0
	public float GetDistanceToCompanions(GameObject go)
	{
		Character character = null;
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			if (go == this.portraitOrder[i].gameObject)
			{
				character = this.portraitOrder[i];
			}
		}
		float num = 10f;
		float num2 = num;
		for (int j = 0; j < this.portraitOrder.Count; j++)
		{
			if (this.portraitOrder[j] != character && this.portraitOrder[j] && character)
			{
				float num3 = Vector3.Distance(this.portraitOrder[j].tr.position, character.tr.position);
				if (num3 < num2)
				{
					num2 = num3;
				}
			}
		}
		return num2 / num;
	}

	// Token: 0x0600073B RID: 1851 RVA: 0x0009A9A4 File Offset: 0x00098BA4
	public void SetMainSelectedForSection()
	{
		if (Links.x.cameraEffects.indoors)
		{
			string currentBoundsName = Links.x.rtsCamera.currentBoundsName;
		}
		bool flag = false;
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			if (this.party[i] && this.party[i].selected && !this.party[i].isBoro)
			{
				if (!flag)
				{
					this.party[i].SetAsLeader();
				}
				flag = true;
			}
		}
		if (!flag)
		{
			for (int j = 0; j < this.party.Count; j++)
			{
				if (!flag && this.party[j] && !this.party[j].isBoro)
				{
					this.party[j].SetAsLeader();
					flag = true;
				}
			}
		}
	}

	// Token: 0x0600073C RID: 1852 RVA: 0x0009AA90 File Offset: 0x00098C90
	public void SetPortraitHotkeys(bool joystick)
	{
		if (this.party == null)
		{
			return;
		}
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i].portrait)
			{
				this.party[i].portrait.UpdateKey(joystick);
			}
		}
	}

	// Token: 0x0600073D RID: 1853 RVA: 0x0009AAEC File Offset: 0x00098CEC
	public void UpdatePortraits()
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i].portrait)
			{
				this.party[i].portrait.SetSelection();
			}
			this.party[i].CircleColor(false);
		}
	}

	// Token: 0x0600073E RID: 1854 RVA: 0x0009AB50 File Offset: 0x00098D50
	public void AddXP(int xp, Character actionTarget, bool show)
	{
		for (int i = 0; i < this.party.Count; i++)
		{
			if (this.party[i] && !this.party[i].dead && !this.party[i].summoned && !this.party[i].stunned && !this.party[i].isBoro)
			{
				this.party[i].stats.AddXP(xp, actionTarget, show);
			}
		}
	}

	// Token: 0x0600073F RID: 1855 RVA: 0x0009ABEE File Offset: 0x00098DEE
	public void CompanionDied()
	{
		Links.x.OrderPortraitList();
		Links.x.hudControl.SetPortraitPositions();
		Links.x.characterSheet.OrderPortraits();
		Links.x.hudControl.SetPortraitBacks();
	}

	// Token: 0x06000740 RID: 1856 RVA: 0x0009AC28 File Offset: 0x00098E28
	public void SetPortraits(bool all, int num)
	{
		this.portraitOrder = Links.x.portraitOrder;
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			if (this.portraitOrder[i] && (i == num || all))
			{
				Portrait portrait = null;
				this.GetPortrait(i, out portrait);
				Portrait portrait2;
				if (!this.portraitOrder[i].portrait)
				{
					portrait2 = Links.x.hudControl.CreatePortrait(this.portraitOrder[i]);
				}
				else
				{
					portrait2 = this.portraitOrder[i].portrait;
				}
				this.portraitOrder[i].portrait = portrait2;
				this.portraitOrder[i].characterSheetPortrait = portrait;
				portrait2.SetSelection();
				portrait.SetCharacter(this.portraitOrder[i]);
				portrait.SetSelection();
			}
		}
	}

	// Token: 0x06000741 RID: 1857 RVA: 0x0009AD19 File Offset: 0x00098F19
	public void GetPortrait(int num, out Portrait characterSheetPortrait)
	{
		characterSheetPortrait = null;
		if (num < this.portraitParentRoleSheet.childCount && num > -1)
		{
			characterSheetPortrait = this.portraitParentRoleSheet.GetChild(num).gameObject.GetComponent<Portrait>();
		}
	}

	// Token: 0x06000742 RID: 1858 RVA: 0x0009AD48 File Offset: 0x00098F48
	public void SetStartingFormation()
	{
		this.portraitOrder = Links.x.portraitOrder;
		List<int> list = new List<int>();
		List<int> list2 = new List<int>();
		for (int i = 0; i < this.portraitOrder.Count; i++)
		{
			if (this.portraitOrder[i] && !this.portraitOrder[i].isBoro && !this.portraitOrder[i].summoned)
			{
				int num = 0;
				int num2 = 0;
				this.portraitOrder[i].stats.SetStartingFormation(out num, out num2);
				list.Add(num);
				list2.Add(num2);
			}
		}
		for (int j = 0; j < this.portraitOrder.Count; j++)
		{
			if (this.portraitOrder[j] && !this.portraitOrder[j].isBoro && !this.portraitOrder[j].summoned)
			{
				bool flag = false;
				bool flag2 = false;
				for (int k = 0; k < list.Count; k++)
				{
					if (k != j)
					{
						if (list[k] == list[j])
						{
							flag = true;
						}
						if (list2[k] == list2[j])
						{
							flag2 = true;
						}
					}
				}
				if (!flag)
				{
					this.portraitOrder[j].stats.formationGroup = list[j];
				}
				else if (flag2)
				{
					this.portraitOrder[j].stats.formationGroup = list[j];
				}
				else
				{
					this.portraitOrder[j].stats.formationGroup = list2[j];
				}
			}
		}
	}

	// Token: 0x06000743 RID: 1859 RVA: 0x0009AF08 File Offset: 0x00099108
	public int PartyCount()
	{
		int num = 0;
		for (int i = 0; i < this.party.Count; i++)
		{
			num++;
		}
		return num;
	}

	// Token: 0x06000744 RID: 1860 RVA: 0x0009AF34 File Offset: 0x00099134
	public void SetMinimapIcons(bool state)
	{
		if (this.party != null)
		{
			for (int i = 0; i < this.party.Count; i++)
			{
				if (this.party[i] && this.party[i].mapIcon)
				{
					this.party[i].mapIcon.SetActive(state);
				}
			}
		}
	}

	// Token: 0x06000745 RID: 1861 RVA: 0x0009AFA1 File Offset: 0x000991A1
	public void SetWaypoint()
	{
	}

	// Token: 0x04000A1B RID: 2587
	[Header("CLICKING")]
	public Vector3 mousePoint;

	// Token: 0x04000A1C RID: 2588
	public GraphNode mouseNode;

	// Token: 0x04000A1D RID: 2589
	[Header("PARTY")]
	public bool drawingSquare;

	// Token: 0x04000A1E RID: 2590
	public int formation;

	// Token: 0x04000A1F RID: 2591
	private Transform portraitParentRoleSheet;

	// Token: 0x04000A20 RID: 2592
	public List<Character> portraitUpdate = new List<Character>();

	// Token: 0x04000A21 RID: 2593
	public List<Character> portraitHudUpdate = new List<Character>();

	// Token: 0x04000A22 RID: 2594
	private StringFast str = new StringFast(64);

	// Token: 0x04000A23 RID: 2595
	private List<Character> portraitOrder;

	// Token: 0x04000A24 RID: 2596
	public List<Character> friend1 = new List<Character>();

	// Token: 0x04000A25 RID: 2597
	public List<Character> friend2 = new List<Character>();

	// Token: 0x04000A26 RID: 2598
	public int morale;

	// Token: 0x04000A27 RID: 2599
	public float rally;

	// Token: 0x04000A28 RID: 2600
	public float rallySpeed;

	// Token: 0x04000A29 RID: 2601
	public float rallyBoost;

	// Token: 0x04000A2A RID: 2602
	public float rallyAttacks;

	// Token: 0x04000A2B RID: 2603
	public bool debug;

	// Token: 0x04000A2C RID: 2604
	[Header("MOVEMENT")]
	public LineRenderer lineRendererToDrawTrajectory;

	// Token: 0x04000A2D RID: 2605
	public bool canPath;

	// Token: 0x04000A2E RID: 2606
	public bool lineOn;

	// Token: 0x04000A2F RID: 2607
	public bool debuggingPath;

	// Token: 0x04000A30 RID: 2608
	public bool newFormation;

	// Token: 0x04000A31 RID: 2609
	private List<GraphNode> refPrepPath;

	// Token: 0x04000A32 RID: 2610
	private List<Character> party;

	// Token: 0x04000A33 RID: 2611
	private List<Character> dioramaCharacters;

	// Token: 0x04000A34 RID: 2612
	public List<Character> waypointOrder = new List<Character>();

	// Token: 0x04000A35 RID: 2613
	private Vector3 dir;

	// Token: 0x04000A36 RID: 2614
	public List<GraphNode> pickedNodes = new List<GraphNode>();

	// Token: 0x04000A37 RID: 2615
	public List<GraphNode> pickedNodesEstimated = new List<GraphNode>();

	// Token: 0x04000A38 RID: 2616
	public GameObject waypoint;

	// Token: 0x04000A39 RID: 2617
	public int summonsFormationGroup;

	// Token: 0x04000A3A RID: 2618
	public GraphNode formationFront;

	// Token: 0x04000A3B RID: 2619
	public SelectionBox box;

	// Token: 0x04000A3C RID: 2620
	public int pushCountMax = 100;

	// Token: 0x04000A3D RID: 2621
	public float angle;

	// Token: 0x04000A3E RID: 2622
	private List<Pickups> pickups;

	// Token: 0x04000A3F RID: 2623
	private List<Pickups> nearPickups = new List<Pickups>();

	// Token: 0x04000A40 RID: 2624
	private IEnumerator pickupCoroutine;

	// Token: 0x04000A41 RID: 2625
	public float updateTime;

	// Token: 0x04000A42 RID: 2626
	private List<Character> nearbyParty = new List<Character>();

	// Token: 0x04000A43 RID: 2627
	private List<GraphNode> nearbyPartyNode = new List<GraphNode>();

	// Token: 0x04000A44 RID: 2628
	public Transform formationHead;

	// Token: 0x04000A45 RID: 2629
	public List<Transform> formationPoints1 = new List<Transform>();

	// Token: 0x04000A46 RID: 2630
	private List<Transform> currentFormationPoints;

	// Token: 0x04000A47 RID: 2631
	private Vector3 previousClick;

	// Token: 0x04000A48 RID: 2632
	private Vector3 mPoint;

	// Token: 0x04000A49 RID: 2633
	public int lookingForDomePaths;

	// Token: 0x04000A4A RID: 2634
	private List<GraphNode> path;

	// Token: 0x04000A4B RID: 2635
	public bool creatingPath;

	// Token: 0x04000A4C RID: 2636
	public Quaternion savedRot;

	// Token: 0x04000A4D RID: 2637
	public bool combatWait;

	// Token: 0x04000A4E RID: 2638
	public GraphNode prevConnection1;

	// Token: 0x04000A4F RID: 2639
	public GraphNode prevConnection2;

	// Token: 0x04000A50 RID: 2640
	public GraphNode prevConnection3;

	// Token: 0x04000A51 RID: 2641
	public string prevKeyDown;

	// Token: 0x04000A52 RID: 2642
	private string keyDown;

	// Token: 0x04000A53 RID: 2643
	public GraphNode companionNode1;

	// Token: 0x04000A54 RID: 2644
	public GraphNode companionNode2;

	// Token: 0x04000A55 RID: 2645
	public GraphNode companionNode3;

	// Token: 0x04000A56 RID: 2646
	public GraphNode companionNode4;

	// Token: 0x04000A57 RID: 2647
	private List<GraphNode> gameplayCircleTiles;

	// Token: 0x04000A58 RID: 2648
	public List<GraphNode> circleTiles = new List<GraphNode>();

	// Token: 0x04000A59 RID: 2649
	private List<GraphNode> openTiles = new List<GraphNode>();

	// Token: 0x04000A5A RID: 2650
	[Header("INTERACTION")]
	public Character moveToCharacter;

	// Token: 0x04000A5B RID: 2651
	private List<GraphNode> tempPath;

	// Token: 0x04000A5C RID: 2652
	private NNConstraint nodeConstraint = new NNConstraint();

	// Token: 0x04000A5D RID: 2653
	private NNConstraint nodeConstraintParty = new NNConstraint();

	// Token: 0x04000A5E RID: 2654
	private NNConstraint nodeConstraintFormation = new NNConstraint();

	// Token: 0x04000A5F RID: 2655
	private NNConstraint nodeConstraintDir = new NNConstraint();

	// Token: 0x04000A60 RID: 2656
	public float dialogueMaxDistance = 4f;

	// Token: 0x04000A61 RID: 2657
	public IEnumerator scatterCoroutine;

	// Token: 0x04000A62 RID: 2658
	public IEnumerator waypointRoutine;

	// Token: 0x04000A63 RID: 2659
	public IEnumerator estimatePathRoutine;

	// Token: 0x04000A64 RID: 2660
	public IEnumerator resurrectCoroutine;

	// Token: 0x04000A65 RID: 2661
	private float updateTimeDomePaths;

	// Token: 0x04000A66 RID: 2662
	private GraphNode prevNode;

	// Token: 0x04000A67 RID: 2663
	private float prevNodeTime;

	// Token: 0x04000A68 RID: 2664
	private Animator waypointAnimator;

	// Token: 0x04000A69 RID: 2665
	private PlayerInput playerInput;

	// Token: 0x04000A6A RID: 2666
	private InputAction moveAction;

	// Token: 0x04000A6B RID: 2667
	private InputAction directionAction;

	// Token: 0x04000A6C RID: 2668
	public Vector2 move;

	// Token: 0x04000A6D RID: 2669
	public Vector3 direction;

	// Token: 0x04000A6E RID: 2670
	public bool joyStickDown;

	// Token: 0x04000A6F RID: 2671
	private float t;

	// Token: 0x04000A70 RID: 2672
	private float checkTime;

	// Token: 0x04000A71 RID: 2673
	[Header("GROUPS")]
	private List<Vector3> positions = new List<Vector3>();

	// Token: 0x04000A72 RID: 2674
	public List<GameObject> lines = new List<GameObject>();

	// Token: 0x04000A73 RID: 2675
	public int linenum;

	// Token: 0x04000A74 RID: 2676
	public List<float> timeOutsideCircle = new List<float>();

	// Token: 0x04000A75 RID: 2677
	private List<Character> intruders = new List<Character>();

	// Token: 0x04000A76 RID: 2678
	private List<float> intruderTime = new List<float>();

	// Token: 0x04000A77 RID: 2679
	private List<Character> intruderTemp = new List<Character>();

	// Token: 0x04000A78 RID: 2680
	private List<float> intruderTimeTemp = new List<float>();

	// Token: 0x04000A79 RID: 2681
	private List<Vector3> linesPoints = new List<Vector3>();

	// Token: 0x04000A7A RID: 2682
	public float currentDither;

	// Token: 0x04000A7B RID: 2683
	private float startDither;

	// Token: 0x04000A7C RID: 2684
	private float endDither;

	// Token: 0x04000A7D RID: 2685
	private float fadeAmount;

	// Token: 0x04000A7E RID: 2686
	public bool fading;

	// Token: 0x04000A7F RID: 2687
	private IEnumerator breakRoutine;

	// Token: 0x04000A80 RID: 2688
	public float timeToNextCircle;

	// Token: 0x04000A81 RID: 2689
	public float circleRecoverTime = 150f;
}
