Files
2025-05-21 20:40:04 +02:00

2474 lines
74 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Pathfinding;
using PixelCrushers.DialogueSystem;
using UnityEngine;
// Token: 0x0200004D RID: 77
public class Sensory : MonoBehaviour
{
// Token: 0x060008D6 RID: 2262 RVA: 0x000BF748 File Offset: 0x000BD948
private void Start()
{
this.diorama = base.gameObject.GetComponent<Diorama>();
this.characters = this.diorama.characters;
this.party = Links.x.party;
this.deads = Links.x.deads;
this.linksNPC = Links.x.npcs;
this.promptActions = this.diorama.promptActions;
for (int i = 0; i < 1; i++)
{
this.footsteps.Add(false);
}
this.cams = this.diorama.sceneViews;
for (int j = 0; j < this.cams.Count; j++)
{
this.pix.Add(new Color32[this.cams.Count]);
this.sourceWidths.Add(0);
this.terrainDimensions.Add(new Vector2(0f, 0f));
}
for (int k = 0; k < this.cams.Count; k++)
{
if (this.cams[k].terrainMap)
{
MeshRenderer component = this.cams[k].terrainMap.GetComponent<MeshRenderer>();
component.enabled = true;
this.cams[k].terrainMap.SetActive(true);
Texture2D texture2D = component.sharedMaterial.mainTexture as Texture2D;
this.pix[k] = texture2D.GetPixels32(0);
int width = texture2D.width;
int height = texture2D.height;
this.terrainDimensions[k] = new Vector2((float)width, (float)height);
this.sourceWidths[k] = texture2D.width;
this.cams[k].terrainMap.layer = 24;
component.enabled = false;
if (k == 0)
{
this.terrainTextureWidthExt = width;
this.terrainTextureHeightExt = height;
}
else
{
this.terrainTextureWidthInt = width;
this.terrainTextureHeightInt = height;
}
}
}
}
// Token: 0x060008D7 RID: 2263 RVA: 0x000BF943 File Offset: 0x000BDB43
public void CreateMeshRenderer(Collider collider)
{
}
// Token: 0x060008D8 RID: 2264 RVA: 0x000BF945 File Offset: 0x000BDB45
private int CalculateIndex(int x, int y, int width)
{
return x + y * width;
}
// Token: 0x060008D9 RID: 2265 RVA: 0x000BF94C File Offset: 0x000BDB4C
public string GetPixelColor(int x, int y, int camIndex)
{
if (camIndex == -1)
{
camIndex = 0;
}
this.currPix = this.pix[camIndex];
int num = this.CalculateIndex(x, y, this.sourceWidths[camIndex]);
Color32 color = this.currPix[num];
int num2 = Links.x.MatchTerrainColors(color);
if (num2 == 0)
{
return "Grass";
}
if (num2 == 1)
{
return "Sand";
}
if (num2 == 2)
{
return "Puddle";
}
if (num2 == 3)
{
return "Rocks";
}
if (num2 == 4)
{
return "Wood";
}
if (num2 == 5)
{
return "Fabric";
}
if (num2 == 6)
{
return "Snow";
}
if (num2 == 7)
{
return "Guts";
}
return "Grass";
}
// Token: 0x060008DA RID: 2266 RVA: 0x000BF9F4 File Offset: 0x000BDBF4
public Color32 GetPixelColorForUndergroundMap(int x, int y)
{
this.currPix = this.pix[1];
int num = this.CalculateIndex(x, y, this.sourceWidths[1]);
return this.currPix[num];
}
// Token: 0x060008DB RID: 2267 RVA: 0x000BFA34 File Offset: 0x000BDC34
private void Update()
{
if (Links.x.gaia.sceneLoaded)
{
this.bribeBadgeCount = Records.x.BribeBadgeCount();
float num = 3f;
if (!Records.x.windows)
{
num = 10f;
}
if (!this.checking || Time.timeSinceLevelLoad > this.timeSinceLastCheck + num)
{
if (this.sensoryCoroutine != null)
{
Debug.Log("Sensory code was stuck");
base.StopCoroutine(this.sensoryCoroutine);
this.sensoryCoroutine = null;
}
this.sensoryCoroutine = this.SensoryCheck();
base.StartCoroutine(this.sensoryCoroutine);
this.timeSinceLastCheck = Time.timeSinceLevelLoad;
}
}
}
// Token: 0x060008DC RID: 2268 RVA: 0x000BFADD File Offset: 0x000BDCDD
public void SwitchingScenes()
{
if (this.sensoryCoroutine != null)
{
base.StopCoroutine(this.sensoryCoroutine);
this.sensoryCoroutine = null;
}
}
// Token: 0x060008DD RID: 2269 RVA: 0x000BFAFC File Offset: 0x000BDCFC
private bool Stop()
{
bool flag = false;
if (Records.x.waitForResurrect)
{
flag = true;
}
if (Links.x.combat.combatCinematics)
{
flag = true;
}
if (Records.x.paused || Records.x.pocketPause)
{
flag = true;
}
if (!Links.x.main)
{
flag = true;
}
if (Links.x.creation && Links.x.creation.open)
{
flag = true;
}
if (Links.x.gaia.waitingToRemoveScene)
{
flag = true;
}
if (Links.x.combat.inPocketAttack)
{
flag = true;
}
if (!Links.x.gaia.sceneLoaded)
{
flag = true;
}
return flag;
}
// Token: 0x060008DE RID: 2270 RVA: 0x000BFBB7 File Offset: 0x000BDDB7
public IEnumerator SensoryCheck()
{
this.checking = true;
bool flag = this.Stop();
if (!flag && Links.x.main.node == null)
{
flag = true;
}
bool canDisableCharacters = true;
if (Records.x.testPatrols && Records.x.editor)
{
canDisableCharacters = false;
}
bool enemiesCanAttack = true;
if (Records.x.noCombat && Records.x.editor)
{
enemiesCanAttack = false;
}
float secondsWaited = 0f;
float currentTime = Time.timeSinceLevelLoad;
if (this.debug)
{
Debug.Log("Sensory check " + flag.ToString());
}
if (!flag)
{
int count = this.characters.Count;
int num = this.party.Count;
float closestDistance = float.PositiveInfinity;
Character closestParty = null;
Character character = null;
bool inSearchRange = false;
bool inCombatRange = false;
bool startCombat = false;
int noiseCount = this.noiseObj.Count;
Vector3 vector = Vector3.zero;
Vector3 vector2 = Vector3.zero;
float angle = 0f;
Character startCombatCharacter = null;
Character startCombatSeenCharacter = null;
float nodeSize = Records.x.nodeSize;
float nodeSize2 = Records.x.nodeSize;
this.SetupNoiseLists();
this.npcs.Clear();
for (int j = 0; j < count; j++)
{
character = this.characters[j];
if (character && character.npc && !character.dead)
{
this.npcs.Add(character);
}
}
this.checkParty.Clear();
int num2 = 0;
for (int k = 0; k < count; k++)
{
character = this.characters[k];
if (character && !character.npc && !character.isBoro && !character.dead)
{
this.checkParty.Add(character);
if (character.fowRevealer)
{
num2++;
}
}
}
int num3 = 0;
int everyone = this.checkParty.Count + this.npcs.Count;
int npcCount = this.npcs.Count;
Vector3 vector3 = Vector3.zero;
int num4 = this.party.Count;
int partyCanSeeMeCount = 0;
bool isHostileCharacter = false;
bool foundAllianceEnemey = false;
float closestDistToSeenCharacter = float.PositiveInfinity;
Character startCombatTarget = null;
bool canTalk = false;
bool canTalkWhileSneaking = false;
int dia = 0;
bool locationMatch = false;
int num23;
for (int i = 0; i < everyone; i = num23 + 1)
{
flag = this.Stop();
if (!flag)
{
if (i < this.npcs.Count)
{
character = this.npcs[i];
}
else
{
character = this.checkParty[i - npcCount];
}
if (!character)
{
flag = true;
}
if (Records.x.dialogue)
{
this.bribeBadgeCount = Records.x.BribeBadgeCount();
}
}
if (!flag)
{
closestDistance = float.PositiveInfinity;
inSearchRange = false;
inCombatRange = false;
closestParty = null;
partyCanSeeMeCount = 0;
isHostileCharacter = false;
closestDistToSeenCharacter = float.PositiveInfinity;
startCombatSeenCharacter = null;
dia = character.stats.initiateDialogue;
canTalk = character.stats.canTalk;
canTalkWhileSneaking = false;
if (canTalk)
{
canTalk = false;
if (dia >= 1 && dia < 10)
{
canTalk = true;
}
if (dia > 10)
{
canTalk = true;
}
if (dia == 5 || dia == 15)
{
canTalkWhileSneaking = true;
}
}
if (num3 > 50 && !startCombat)
{
yield return new WaitForSeconds(0.01f);
this.bribeBadgeCount = Records.x.BribeBadgeCount();
secondsWaited += 0.01f;
num3 = 0;
flag = this.Stop();
if (!Links.x.gaia.sceneLoaded)
{
flag = true;
}
}
if (Records.x.mainCharacterDead)
{
flag = true;
}
}
if (!character.dead && !flag && !character.isBoro && character.tr)
{
vector = character.body.tr.rotation * Vector3.forward;
if (character.moving)
{
vector = character.tr.rotation * Vector3.forward;
}
vector3 = character.tr.position;
bool flag2 = false;
if (character.hostility == 2 || character.hostility == 3 || character.attackingUntilBribe)
{
isHostileCharacter = true;
}
if (this.bribeBadgeCount > 0 && character.stats.isGuard)
{
isHostileCharacter = true;
}
if (!character.stunned && (isHostileCharacter || !character.npc || character.willBeHostile))
{
flag2 = true;
}
bool flag3;
bool flag4;
bool flag5;
if (character.npc)
{
flag3 = false;
flag4 = true;
if (character.stats.hasEnemies)
{
num = everyone;
flag3 = true;
flag5 = false;
}
else
{
flag5 = false;
num = this.checkParty.Count;
}
}
else
{
flag4 = false;
flag3 = false;
flag5 = false;
num = this.npcs.Count;
}
float num5;
float num6;
if (character.inCombat || character.party || character.sailing || character.summoned)
{
num5 = 360f;
num6 = -360f;
}
else
{
num5 = 45f;
num6 = -45f;
}
float num7 = character.stats.SightRadius(false, false, false);
float num8 = num7 * num7;
if (character.npc && character.creatures && !character.summoned)
{
character.creatures.FarFromPoints(currentTime, character);
}
for (int l = 0; l < num; l++)
{
flag = this.Stop();
Character character2;
if (flag3)
{
if (l < this.npcs.Count)
{
character2 = this.npcs[l];
}
else
{
character2 = this.checkParty[l - npcCount];
}
if (character2.npc)
{
flag5 = false;
if (character2.stats.allegiance > 0U)
{
if (!character.stats.IsTargetAnEnemy(character2.stats.allegiance))
{
if (character2.hostility == 2 && character.hostility == 1 && character.stats.isGuard)
{
flag5 = true;
}
else
{
character2 = null;
}
}
else if (character2.inactive)
{
character2 = null;
}
else
{
flag5 = true;
}
}
else
{
character2 = null;
}
}
else
{
flag5 = false;
}
}
else if (flag4)
{
character2 = this.checkParty[l];
}
else
{
character2 = this.npcs[l];
}
if (character2 == character)
{
character2 = null;
}
if (character2 && character2.pipeSummons)
{
character2 = null;
}
if (character2 && !flag)
{
float num9 = this.SubtractVectors(vector3, character2.tr.position).sqrMagnitude;
if (!character.inactive)
{
num3++;
}
bool flag6 = true;
locationMatch = true;
if (character.ghost && !character2.ghost && num9 < 16f)
{
character2.stats.GhostHit();
}
if (this.debug && !character.inactive)
{
string[] array = new string[26];
array[0] = "Sight check ";
int num10 = 1;
Character character3 = character2;
array[num10] = ((character3 != null) ? character3.ToString() : null);
array[2] = " ";
int num11 = 3;
Character character4 = character;
array[num11] = ((character4 != null) ? character4.ToString() : null);
array[4] = " ";
array[5] = locationMatch.ToString();
array[6] = " dist ";
array[7] = num9.ToString();
array[8] = " sight ";
array[9] = num8.ToString();
array[10] = " character indoor id ";
array[11] = character.indoorID;
array[12] = " target indoor id";
array[13] = character2.indoorID;
array[14] = " hostile ";
array[15] = isHostileCharacter.ToString();
array[16] = " alliance ";
array[17] = flag5.ToString();
array[18] = " bb ";
array[19] = this.bribeBadgeCount.ToString();
array[20] = " update lists ";
array[21] = flag2.ToString();
array[22] = " sleeping ";
array[23] = character.sleeping.ToString();
array[24] = " inactive ";
array[25] = character.inactive.ToString();
Debug.Log(string.Concat(array));
vector2 = this.SubtractVectorsNoY(character2.currentPosition, vector3);
angle = Vector3.Angle(vector2, vector);
string[] array2 = new string[5];
int num12 = 0;
Character character5 = character;
array2[num12] = ((character5 != null) ? character5.ToString() : null);
array2[1] = " ";
array2[2] = angle.ToString();
array2[3] = " ";
array2[4] = Physics.Linecast(character.raycastPosition, character2.raycastPosition, Links.x.sightBlockers).ToString();
Debug.Log(string.Concat(array2));
}
if (num9 < num8 && !character.inactive && locationMatch)
{
if (!character.inCombat && !character.party)
{
vector2 = this.SubtractVectorsNoY(character2.currentPosition, vector3);
angle = Vector3.Angle(vector2, vector);
}
if (this.debug && !character.inactive)
{
string[] array3 = new string[8];
array3[0] = "Angle check ";
int num13 = 1;
Character character6 = character2;
array3[num13] = ((character6 != null) ? character6.ToString() : null);
array3[2] = " ";
int num14 = 3;
Character character7 = character;
array3[num14] = ((character7 != null) ? character7.ToString() : null);
array3[4] = " ";
array3[5] = angle.ToString();
array3[6] = " ";
array3[7] = num5.ToString();
Debug.Log(string.Concat(array3));
}
if ((angle <= num5 && angle >= num6) || canTalk || character.party || character.inCombat || character.ambushing)
{
flag6 = character.indoorID != character2.indoorID || Physics.Linecast(character.raycastPosition, character2.raycastPosition, Links.x.sightBlockers);
if (this.debug)
{
string[] array4 = new string[5];
int num15 = 0;
Character character8 = character;
array4[num15] = ((character8 != null) ? character8.ToString() : null);
array4[1] = " ";
int num16 = 2;
Character character9 = character2;
array4[num16] = ((character9 != null) ? character9.ToString() : null);
array4[3] = " sight blocked? ";
array4[4] = flag6.ToString();
Debug.Log(string.Concat(array4));
if (flag6)
{
RaycastHit raycastHit;
Physics.Linecast(character.raycastPosition, character2.raycastPosition, out raycastHit, Links.x.sightBlockers);
if (raycastHit.collider)
{
string text = "hit ";
GameObject gameObject = raycastHit.collider.gameObject;
Debug.Log(text + ((gameObject != null) ? gameObject.ToString() : null) + " " + raycastHit.collider.gameObject.layer.ToString());
}
}
}
if (character2.body.sneaking)
{
flag6 = true;
}
if (!flag6 && !character.sleeping && (flag2 || flag5 || isHostileCharacter))
{
bool flag7 = true;
if (character2.stunned && character.npc && !character.stats.CanAttackStunned())
{
flag7 = false;
}
if (this.debug)
{
string[] array5 = new string[10];
array5[0] = "Seen ";
array5[1] = flag5.ToString();
array5[2] = " ";
int num17 = 3;
Character character10 = character;
array5[num17] = ((character10 != null) ? character10.ToString() : null);
array5[4] = " ";
int num18 = 5;
Character character11 = character2;
array5[num18] = ((character11 != null) ? character11.ToString() : null);
array5[6] = " ";
int num19 = 7;
GraphNode node = character2.node;
array5[num19] = ((node != null) ? node.ToString() : null);
array5[8] = " ";
array5[9] = flag7.ToString();
Debug.Log(string.Concat(array5));
}
if (character2.node != null && flag7 && enemiesCanAttack)
{
string text2;
if (isHostileCharacter)
{
text2 = "Attack";
}
else if (flag5)
{
if (!character2.party)
{
foundAllianceEnemey = true;
text2 = "Attack";
}
else
{
text2 = "Seen";
}
}
else
{
text2 = "Seen";
}
character.UpdateLKP(character2, character2.node, text2, true);
if ((num9 < closestDistToSeenCharacter || !inCombatRange) && !character2.dead && !character2.stunned)
{
if (flag5 || isHostileCharacter || (flag2 && character.npc))
{
startCombatSeenCharacter = character2;
}
closestDistToSeenCharacter = num9;
}
if (flag5 || isHostileCharacter || (flag2 && character.npc))
{
inCombatRange = true;
inSearchRange = true;
}
}
}
if (canTalk && !character.sleeping && !Links.x.cameraEffects.transitioning && !flag6 && character2.mainSelected && (!character2.body.sneaking || (character2.body.sneaking && canTalkWhileSneaking)) && !character.stunned && !Records.x.dialogue && !Links.x.combat.inPocketAttack && !Links.x.dialogue.quipping)
{
bool flag8 = false;
if (character.hasActions || character.inCombat || character.hostility == 2 || character.attackingUntilBribe || Records.x.InCombat(false) || character.dayNightVanishing || character.missing || character.deactivating || character.vanished)
{
flag8 = true;
}
if (!flag8 || (flag8 && (dia == 16 || dia == 6 || dia == 17 || dia == 7)))
{
if (((dia == 15 || dia == 5 || dia == 17 || dia == 7) && num9 < 400f) || num9 < 144f)
{
Links.x.dialogue.initiateNum = character.stats.initiateDialogue;
if (dia == 1)
{
character.stats.initiateDialogue = 3;
}
else if (dia == 11)
{
character.stats.initiateDialogue = 13;
}
else if (dia >= 10)
{
character.stats.initiateDialogue = 10;
}
else
{
character.stats.initiateDialogue = 0;
}
character.InitiateDialogue();
}
}
else if (character.inCombat || character.hostility > 1)
{
if (dia >= 15)
{
character.stats.initiateDialogue = 10;
}
if (dia >= 5)
{
character.stats.initiateDialogue = 0;
}
}
}
}
}
if (flag6)
{
if ((flag5 || flag2) && (character.hasActions || (character.willBeHostile && character2.party)) && !character.inactive && !character.stunned && ((isHostileCharacter && !character2.npc && character.npc) || flag5 || (!character.npc && character2.npc && Records.x.InCombat(true) && locationMatch) || (character.willBeHostile && character2.party)) && character2.node != null && enemiesCanAttack)
{
bool flag9 = true;
if (character.willBeHostile && character2.party && !character.hasActions)
{
flag9 = character.HasLKPlayer(character2);
}
if (flag9)
{
string text3 = "Search";
character.UpdateLKP(character2, character2.node, text3, false);
}
}
if (!character.hasActions && character.party)
{
character.RemoveLKPlayer(character2);
}
}
if (character.npc && character2.party && partyCanSeeMeCount == 0)
{
float num20 = character2.stats.SightRadius(false, false, false);
if (num9 < num20 * num20)
{
if (num9 < 4900f && Input.GetKeyDown(KeyCode.R) && Records.x.editor)
{
string[] array6 = new string[17];
int num21 = 0;
Character character12 = character;
array6[num21] = ((character12 != null) ? character12.ToString() : null);
array6[1] = " looking at ";
int num22 = 2;
Character character13 = character2;
array6[num22] = ((character13 != null) ? character13.ToString() : null);
array6[3] = "... pos char: ";
array6[4] = character.tr.position.ToString();
array6[5] = " pos target: ";
array6[6] = character2.tr.position.ToString();
array6[7] = " dist: ";
array6[8] = Vector3.Distance(vector3, character2.tr.position).ToString();
array6[9] = " sight: ";
array6[10] = character.stats.SightRadius(false, false, false).ToString();
array6[11] = " raycast: ";
array6[12] = Physics.Linecast(character.raycastPosition, character2.raycastPosition, Links.x.sightBlockers).ToString();
array6[13] = " id ";
array6[14] = character2.indoorID;
array6[15] = " ";
array6[16] = character.indoorID;
Debug.Log(string.Concat(array6));
}
if (!Physics.Linecast(character.raycastPosition, character2.raycastPosition, Links.x.sightBlockers))
{
num23 = partyCanSeeMeCount;
partyCanSeeMeCount = num23 + 1;
}
}
}
if (num9 < closestDistance && character2.party)
{
closestParty = character2;
closestDistance = num9;
}
}
}
bool flag10;
if (character.npc)
{
flag10 = true;
num4 = this.party.Count;
for (int m = 0; m < num4; m++)
{
if (this.party[m] && !this.party[m].isBoro && this.party[m].indoorID == character.indoorID)
{
flag10 = false;
}
}
}
else
{
flag10 = false;
}
if (!character.inactive && !character.stunned)
{
float num24 = character.stats.HearingRadius(false, false);
float num25 = num24 * num24;
for (int n = 0; n < noiseCount; n++)
{
bool flag11 = false;
Character character14 = this.noiseCharacterTemp[n];
flag5 = false;
string text4 = this.noiseTypeTemp[n];
bool flag12 = false;
if (character.stats.hasEnemies)
{
if (character.stats.IsTargetAnEnemy(character14.stats.allegiance))
{
flag11 = true;
flag5 = true;
}
else if (character14.hostility == 2 && character.hostility == 1 && character.stats.isGuard)
{
flag11 = true;
flag5 = true;
}
else if (character14.party && isHostileCharacter)
{
flag11 = true;
}
}
if (!flag11)
{
if (isHostileCharacter || character.willBeHostile)
{
flag11 = true;
}
else if (character.party && character14.npc)
{
flag11 = true;
}
}
if (flag11 && character.sleeping && text4.Contains("Footstep"))
{
flag11 = false;
}
if (flag11 && character14.stunned && character.npc && !character.stats.CanAttackStunned())
{
flag11 = false;
}
if (flag11)
{
float num9 = this.SubtractVectors(vector3, (Vector3)this.noiseLocationTemp[n].position).sqrMagnitude;
float num26 = this.NoiseRange(this.noiseTypeTemp[n]);
if (character.visible == 0 && character.npc && !character.ambushing)
{
num26 /= 4f;
}
if (!character.npc && character14.npc && character.hasActions)
{
num25 = 1600f;
num26 = 1600f;
}
if (this.debug)
{
string[] array7 = new string[10];
array7[0] = "hearing ";
int num27 = 1;
Character character15 = character;
array7[num27] = ((character15 != null) ? character15.ToString() : null);
array7[2] = " ";
array7[3] = num25.ToString();
array7[4] = " ";
array7[5] = num26.ToString();
array7[6] = " ";
array7[7] = num9.ToString();
array7[8] = " ";
array7[9] = enemiesCanAttack.ToString();
Debug.Log(string.Concat(array7));
}
if (num9 < num26 && num9 < num25 && enemiesCanAttack)
{
if (!character.hasActions && character.visible == 1 && num9 < 100f)
{
flag12 = true;
}
if ((isHostileCharacter && !character14.npc && character.npc) || flag5 || (!character.npc && character14.npc && Records.x.combat && locationMatch) || (character.willBeHostile && character14.party))
{
if (!character.noiseImmune)
{
character.UpdateLKP(character14, this.noiseLocationTemp[n], "Heard", false);
if (!character.inCombat && (character.animID == 0 || character.turning) && character.npc && !character14.body.sneaking && character.tr && character14.tr)
{
character.SetRotation(Quaternion.LookRotation(character14.tr.position - character.tr.position), false, false);
}
}
if (this.debug)
{
string[] array8 = new string[13];
int num28 = 0;
Character character16 = character;
array8[num28] = ((character16 != null) ? character16.ToString() : null);
array8[1] = " ";
int num29 = 2;
Character character17 = character14;
array8[num29] = ((character17 != null) ? character17.ToString() : null);
array8[3] = " ";
array8[4] = this.noiseTypeTemp[n];
array8[5] = " ";
array8[6] = num24.ToString();
array8[7] = " ";
array8[8] = Vector3.Distance((Vector3)this.noiseLocationTemp[n].position, vector3).ToString();
array8[9] = " ";
array8[10] = flag5.ToString();
array8[11] = " ";
array8[12] = isHostileCharacter.ToString();
Debug.Log(string.Concat(array8));
}
if (!inSearchRange && !character14.dead && !character14.stunned)
{
startCombatSeenCharacter = character14;
}
inSearchRange = true;
if (character.vipFollow)
{
inSearchRange = false;
}
if (flag5 && !character.inCombat)
{
foundAllianceEnemey = true;
}
if (character.sleeping)
{
character.WakeUp();
character.SetRotation(Quaternion.LookRotation(character14.tr.position - character.tr.position), false, false);
}
}
}
if (character.noiseImmune && !inSearchRange)
{
character.noiseImmune = false;
}
else if (character.noiseImmune)
{
inSearchRange = false;
}
}
else if (character.visible == 1 && !character.hasActions)
{
float num9 = this.SubtractVectors(vector3, (Vector3)this.noiseLocationTemp[n].position).sqrMagnitude;
float num26 = this.NoiseRange(this.noiseTypeTemp[n]);
if (character.visible == 0)
{
num26 /= 4f;
}
if (num9 < num26 && num9 < num25 && num9 < 100f)
{
flag12 = true;
}
}
if (flag12 && character.npc != character14.npc && character.hostility == 1 && !character.attackingUntilBribe && !character14.body.sneaking && !character.body.lookAtController.hasTarget)
{
character.body.lookAtController.SetNewTarget(character14.body.headBone, Random.Range(6f, 9f), 0f, false);
}
}
}
if (inSearchRange && !inCombatRange && (isHostileCharacter || foundAllianceEnemey) && !character.inCombat && !character.inactive && flag4 && !character.stunned && enemiesCanAttack && !character.searching && !character.cannotAttack && startCombatSeenCharacter && !startCombatSeenCharacter.dead && !startCombatSeenCharacter.stunned && (!character.ambushing || (character.ambushing && character.jumping)))
{
Links.x.combat.AddParty(character, true, startCombatSeenCharacter, true);
character.SetRotation(Quaternion.LookRotation(startCombatSeenCharacter.tr.position - vector3), false, false);
character.PlaySoundFX(0, 7);
}
if (inCombatRange && (isHostileCharacter || foundAllianceEnemey) && !character.inactive && flag4 && !character.stunned && !character.inCombat && !character.cannotAttack && character.node != null && startCombatSeenCharacter)
{
if (foundAllianceEnemey && character.visible == 1 && this.CheckProof(startCombatSeenCharacter))
{
character.StartQuip("Justice!");
}
if (!character.ambushing || (character.ambushing && character.jumping))
{
startCombat = true;
}
if (character.ghost && character.ghostVanishing)
{
startCombat = false;
}
startCombatCharacter = character;
startCombatTarget = startCombatSeenCharacter;
if (Records.x.combat)
{
Links.x.combat.AddParty(startCombatCharacter, false, startCombatSeenCharacter, true);
}
}
if (Records.x.combat && !Links.x.combat.npcOnlyCombat && character.party && !character.hasActions && !character.stunned && character.IsSentient() && !character.dead && !character.stunned && !character.hasActions)
{
Links.x.combat.AddParty(character, false, startCombatSeenCharacter, true);
if (Links.x.gaia.boro)
{
Links.x.gaia.boroControls.LeavingForCombat();
}
}
if (!character.inactive && !Records.x.pocketPause && !Links.x.combat.inRally && !Links.x.combat.inPocketAttack)
{
if (partyCanSeeMeCount == 0 && flag4 && !character.sailing)
{
if (canDisableCharacters)
{
if (character.visible == 1)
{
character.SetMeshState(false);
}
}
else if (character.visible != 1 && !character.missing)
{
character.SetMeshState(true);
}
}
else if (flag4 && character.visible == 0)
{
character.SetMeshState(true);
}
}
if (character.visible == 1 && character.npc && character.hostility < 2 && !character.attackingUntilBribe && Records.x.InCombat(false) && !Links.x.combat.preDome && !Links.x.combat.npcOnlyCombat && this.bribeBadgeCount > 0 && character.node != null && Links.x.combat.CanSeeSomeoneInCombat(character.tr.position, character.stats.SightRadius(false, false, false)))
{
Character character18;
int num30;
this.NonHostileAttacked(character, character.tr.position, closestParty, true, true, out character18, out num30);
}
if (character.ghost && character.visible == 1 && !character.inactive && character.hasActions)
{
this.GhostFlee(character);
}
if (character.visible == 1 && (((!inCombatRange && !inSearchRange && closestDistance < 400f) || (character.hostility <= 1 && character.hasCinematicQuip)) && !character.inactive && flag4) && !Records.x.paused && !Records.x.dialogue && !character.stunned)
{
Vector3 vector4 = Links.x.worldCamera.WorldToViewportPoint(vector3);
if (vector4.x > 0f && vector4.y > 0f && vector4.x < 1f && vector4.y < 1f)
{
character.FindQuip();
}
}
if (canDisableCharacters && !character.inCombat && !character.hasActions && character.npc && !character.sailing && !character.alwaysOn && !character.fleeing)
{
float num31 = closestDistance;
if (num31 > 8100f && character.creatures)
{
num31 = character.creatures.NearestPatrolPoint(Links.x.main.currentPosition);
if (num31 < 1600f)
{
flag10 = false;
}
else
{
num31 = closestDistance;
}
}
if (num31 > 8100f || flag10 || character.vanished)
{
if (!character.inactive)
{
character.TurnScriptsOff();
}
}
else if (character.inactive)
{
character.TurnScriptsOn();
}
}
if (!character.inactive && character.IsSentient() && !character.stunned)
{
Links.x.diorama.CheckDoors(character);
}
}
num23 = i;
}
if (!Records.x.combat && startCombat && !flag && !startCombatCharacter.inactive)
{
if (startCombatCharacter.sleeping)
{
startCombatCharacter.WakeUp();
}
int hostility = startCombatCharacter.hostility;
Links.x.combat.StartCombat(startCombatTarget, startCombatCharacter, false, true);
Links.x.combat.AddParty(startCombatCharacter, false, startCombatTarget, true);
if (hostility >= 2)
{
this.AlertGroupFromCombatSounds(startCombatCharacter, startCombatTarget);
}
}
if (this.footstepAdded)
{
for (int num32 = 0; num32 < this.footsteps.Count; num32++)
{
this.footsteps[num32] = false;
}
this.footstepAdded = false;
}
if (this.deads == null)
{
this.deads = Links.x.deads;
}
int num33 = this.deads.Count;
for (int num34 = 0; num34 < num33; num34++)
{
if (num34 < this.deads.Count && !flag && this.deads[num34] && Links.x.hasMain)
{
float num9 = this.SubtractVectors(Links.x.main.currentPosition, this.deads[num34].tr.position).sqrMagnitude;
bool flag13 = num9 >= 1600f;
if (flag13 && !this.deads[num34].deadInactive)
{
this.deads[num34].deadInactive = true;
this.deads[num34].body.SetMeshState(false, true);
}
else if (!flag13 && this.deads[num34].deadInactive)
{
this.deads[num34].deadInactive = false;
this.deads[num34].body.SetMeshState(true, true);
}
if ((this.deads[num34].creatures || this.deads[num34].party) && Links.x.gameplay.seconds > this.deads[num34].timeOfDeath)
{
if (this.deads[num34].stats.state.Contains("Purgatory"))
{
this.deads[num34].body.EndDead(2);
}
else if (!this.deads[num34].goreObj)
{
if (flag13)
{
this.deads[num34].body.EndDead(2);
}
}
else if (flag13)
{
this.deads[num34].body.EndDead(2);
}
else
{
this.deads[num34].body.SetGoreKinematic();
}
}
}
}
if (!Records.x.dialogue && (Records.x.InCombat(false) || this.bribeBadgeCount > 0) && !flag)
{
this.bribeBadgeCount = Records.x.BribeBadgeCount();
bool flag14 = false;
if (Records.x.BribeBadgeCountOld() > 0)
{
flag14 = true;
}
num33 = this.npcs.Count;
for (int num35 = 0; num35 < this.npcs.Count; num35++)
{
Character character19 = this.npcs[num35];
if (character19 && !character19.stunned && character19.hostility == 1 && !character19.attackingUntilBribe && !character19.inactive && !character19.hasActions)
{
bool flag15 = false;
bool flag16 = false;
if (this.bribeBadgeCount > 0)
{
flag15 = Links.x.combat.CanSeeSomeoneInCombat(character19.tr.position, character19.stats.SightRadius(false, false, false));
if ((flag15 || flag14) && Records.x.IsVictim(character19.stats.xmlName))
{
flag16 = true;
}
}
if (character19.stats.isGuard || flag16)
{
bool flag17 = false;
if (this.bribeBadgeCount > 0 && character19.hostility == 1 && !character19.attackingUntilBribe && (flag15 || flag14))
{
closestParty = Links.x.GetNearestParty(character19.tr.position);
float num7 = character19.stats.SightRadius(false, false, false) * character19.stats.SightRadius(false, false, false);
if (closestParty && character19 && this.SubtractVectors(closestParty.tr.position, character19.tr.position).sqrMagnitude < num7)
{
this.AddPlayerToCombat(character19, closestParty, true, true, true);
character19.GuardQuip();
flag17 = true;
}
}
if (!flag17 && Records.x.InCombat(false))
{
this.CheckIfAllyInCombat(character19);
}
}
}
}
}
this.UpdateCharactersIntExt(false);
closestParty = null;
character = null;
startCombatCharacter = null;
startCombatSeenCharacter = null;
startCombatTarget = null;
}
float num36 = 0.1f - secondsWaited;
if (num36 <= 0.001f)
{
num36 = 0.001f;
}
if (num36 > 0.1f)
{
num36 = 0.1f;
}
yield return new WaitForSeconds(num36);
this.checking = false;
this.sensoryCoroutine = null;
yield break;
}
// Token: 0x060008DF RID: 2271 RVA: 0x000BFBC8 File Offset: 0x000BDDC8
public void SetDeadRendererLayers(int layer)
{
int count = this.deads.Count;
for (int i = 0; i < count; i++)
{
if (i < this.deads.Count && this.deads[i] && this.deads[i].body)
{
this.deads[i].body.SetDeadRendererLayers(layer);
}
}
}
// Token: 0x060008E0 RID: 2272 RVA: 0x000BFC3D File Offset: 0x000BDE3D
public void AlertGroupFromCombatSounds(Character target, Character character)
{
if (target.creatures && target.creatures.inGroup)
{
this.AddAllToCombat(target, character, true, true, true);
}
}
// Token: 0x060008E1 RID: 2273 RVA: 0x000BFC68 File Offset: 0x000BDE68
public void UpdateCharactersIntExt(bool everyone)
{
if (!Links.x.gaia.pathfindingReady)
{
return;
}
bool indoors = Links.x.cameraEffects.indoors;
string text = "";
bool flag = Links.x.worldCamera.orthographic;
if (!Links.x.hasMain)
{
flag = true;
}
if (indoors)
{
text = Links.x.rtsCamera.currentBoundsName;
}
if (text == "" || text == "?")
{
flag = true;
}
int count = this.characters.Count;
for (int i = 0; i < this.characters.Count; i++)
{
Character character = this.characters[i];
if (character && (!character.npc || everyone) && character.node != null)
{
if (indoors)
{
if (character.node.GraphIndex == 1U && character.indoorID != text)
{
character.SetMeshState(false);
character.body.SetMeshState(false, false);
}
if (character.visible == 0 && character.node.GraphIndex == 1U && character.indoorID == text && !character.npc)
{
character.SetMeshState(true);
character.body.SetMeshState(true, true);
}
if (character.node.GraphIndex == 0U)
{
character.SetMeshState(false);
character.body.SetMeshState(false, false);
}
}
else if (character.visible == 0 && character.node.GraphIndex == 0U && !character.npc)
{
character.SetMeshState(true);
}
else if (character.node.GraphIndex == 1U)
{
character.SetMeshState(false);
character.body.SetMeshState(false, false);
}
if (!flag && character.npc && !character.stats.animal && character.hostility < 2 && (text == character.indoorID && indoors))
{
character.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - character.tr.position), true, false);
}
}
}
}
// Token: 0x060008E2 RID: 2274 RVA: 0x000BFEA8 File Offset: 0x000BE0A8
public bool CheckSneaking(Character diaCharacter, bool all, Character partyCharacter, bool checkHearing, bool checkCone)
{
bool flag = true;
float num = diaCharacter.stats.SightRadius(false, false, false);
float num2 = diaCharacter.stats.HearingRadius(false, false);
if (all)
{
for (int i = 0; i < this.party.Count; i++)
{
bool flag2 = false;
if (!this.party[i].summoned && !this.party[i].isBoro && this.party[i].IsSentient())
{
float num3 = (this.party[i].raycastPosition - diaCharacter.raycastPosition).sqrMagnitude;
if ((num3 < num * num || (checkHearing && num3 < num2 * num2)) && (!Physics.Linecast(this.party[i].raycastPosition, diaCharacter.raycastPosition, Links.x.sightBlockers) || checkHearing))
{
bool flag3 = true;
if (checkCone)
{
float num4 = Vector3.Angle(this.SubtractVectors(diaCharacter.tr.position, partyCharacter.tr.position), diaCharacter.body.tr.forward);
flag3 = num4 <= 45f && num4 >= -45f;
}
if (!this.party[i].body.sneaking && flag3)
{
flag2 = true;
}
}
}
if (flag2)
{
flag = false;
break;
}
}
}
else
{
bool flag4 = false;
if (!partyCharacter.summoned && !partyCharacter.isBoro && partyCharacter.IsSentient())
{
float num3 = (partyCharacter.raycastPosition - diaCharacter.raycastPosition).sqrMagnitude;
if ((num3 < num * num || (checkHearing && num3 < num2 * num2)) && (!Physics.Linecast(partyCharacter.raycastPosition, diaCharacter.raycastPosition, Links.x.sightBlockers) || checkHearing))
{
bool flag5 = true;
if (checkCone)
{
float num5 = Vector3.Angle(this.SubtractVectors(diaCharacter.tr.position, partyCharacter.tr.position), diaCharacter.body.tr.forward);
if (Records.x.editor)
{
Debug.Log(string.Concat(new string[]
{
(diaCharacter != null) ? diaCharacter.ToString() : null,
" check in cone ",
(partyCharacter != null) ? partyCharacter.ToString() : null,
" ",
num5.ToString()
}));
}
flag5 = num5 <= 45f && num5 >= -45f;
}
if (!partyCharacter.body.sneaking && flag5)
{
flag4 = true;
}
}
}
if (flag4)
{
flag = false;
}
}
return flag;
}
// Token: 0x060008E3 RID: 2275 RVA: 0x000C0190 File Offset: 0x000BE390
public bool CanSeeOrHearWholeParty(CreatureActions tower, bool checkCone, bool checkHearing)
{
bool flag = false;
for (int i = 0; i < this.party.Count; i++)
{
if (!flag && this.party[i] && this.party[i].party && this.CanSeeOrHearParty(tower, this.party[i], checkCone, checkHearing))
{
flag = true;
}
}
return flag;
}
// Token: 0x060008E4 RID: 2276 RVA: 0x000C01F8 File Offset: 0x000BE3F8
public bool CanSeeOrHearParty(CreatureActions tower, Character partyCharacter, bool checkCone, bool checkHearing)
{
this.towerCharacters = tower.characters;
bool flag = true;
for (int i = 0; i < this.towerCharacters.Count; i++)
{
Character character = this.towerCharacters[i];
if (character && !character.dead && !character.sleeping && character.IsSentient() && !this.CheckSneaking(character, false, partyCharacter, checkHearing, checkCone))
{
flag = false;
}
}
return !flag;
}
// Token: 0x060008E5 RID: 2277 RVA: 0x000C026C File Offset: 0x000BE46C
public void SetupNoiseLists()
{
int count = this.noiseObj.Count;
this.noiseObjTemp.Clear();
this.noiseLocationTemp.Clear();
this.noiseFactionTemp.Clear();
this.noiseTypeTemp.Clear();
this.noiseCharacterTemp.Clear();
for (int i = 0; i < count; i++)
{
this.noiseObjTemp.Add(this.noiseObj[i]);
this.noiseLocationTemp.Add(this.noiseLocation[i]);
this.noiseFactionTemp.Add(this.noiseFaction[i]);
this.noiseTypeTemp.Add(this.noiseType[i]);
this.noiseCharacterTemp.Add(this.noiseCharacter[i]);
}
this.noiseObj.Clear();
this.noiseType.Clear();
this.noiseFaction.Clear();
this.noiseLocation.Clear();
this.noiseCharacter.Clear();
}
// Token: 0x060008E6 RID: 2278 RVA: 0x000C0374 File Offset: 0x000BE574
public bool CanBeSeen(Character checkCharacter)
{
int count = this.characters.Count;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && ((character.npc && !checkCharacter.npc && (character.hostility == 2 || character.hostility == 3 || character.attackingUntilBribe)) || (!character.npc && checkCharacter.npc)) && character.CanSee(checkCharacter))
{
return true;
}
}
return false;
}
// Token: 0x060008E7 RID: 2279 RVA: 0x000C03F8 File Offset: 0x000BE5F8
public void SetMagicaClothState(bool state)
{
int count = this.characters.Count;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character)
{
character.body.SetMagicaClothState(state);
}
}
}
// Token: 0x060008E8 RID: 2280 RVA: 0x000C0440 File Offset: 0x000BE640
public bool ProofState(Character target)
{
bool flag = false;
if (target.stats.characterRow._Quest == "")
{
return false;
}
if (target.stats.characterRow._QuestProofState == "")
{
return false;
}
QuestState questState = QuestLog.GetQuestState(target.stats.characterRow._Quest);
QuestState questState2 = Records.x.StringToQuestState(target.stats.characterRow._QuestProofState);
if (questState == questState2 || questState == QuestState.PerpIsDead)
{
flag = true;
}
if (!target.stats.animal && target.stats.xmlName.Contains("RozafirDolki") && (questState == QuestState.ActivePart2 || questState == QuestState.ActivePart3))
{
flag = true;
}
return flag;
}
// Token: 0x060008E9 RID: 2281 RVA: 0x000C0504 File Offset: 0x000BE704
public bool CheckProof(Character target)
{
if (!target)
{
return false;
}
bool flag = false;
if (target.stats.characterRow._Quest != "")
{
bool flag2 = false;
if (target.stats.characterRow._QuestProofState == "Any")
{
flag2 = true;
}
if ((this.ProofState(target) && target.stats.characterRow._QuestProofState != "") || flag2)
{
flag = true;
QuestState questState = Records.x.StringToQuestState(target.stats.characterRow._QuestProofState);
if (!Links.x.combat.isJustice && questState != QuestState.Unassigned)
{
Character nearestPartyInRoom = Links.x.GetNearestPartyInRoom(target.tr.position, null, 1600f, target.indoorID, true);
if (!target.stunned && !target.dead && target.IsSentient() && nearestPartyInRoom)
{
Links.x.combat.isJustice = true;
if (!target.stats.semizenMagic)
{
bool flag3 = true;
if (target.stats.xmlName.Contains("Dolki"))
{
flag3 = false;
}
if (target.stats.xmlName.Contains("FallsBandit"))
{
flag3 = false;
}
if (flag3)
{
if (Time.timeSinceLevelLoad > Links.x.combat.lastJusticeTime + 1200f || Links.x.combat.lastJusticeTime == 0f)
{
Links.x.gameplay.StartDialogue(target, nearestPartyInRoom, null, null, "Party/Justice");
Links.x.combat.lastJusticeTime = Time.timeSinceLevelLoad + 1200f;
}
else
{
target.StartQuip("Slay me not! I'll take exile!");
}
}
}
Links.x.combat.JusticeCombat(target);
if (Records.x.BribeBadgeCount() > 0)
{
Records.x.StartForgiveness();
}
if (!target.hasActions)
{
this.AddPlayerToCombat(target, nearestPartyInRoom, false, false, false);
}
}
}
}
}
return flag;
}
// Token: 0x060008EA RID: 2282 RVA: 0x000C0718 File Offset: 0x000BE918
public void AddPlayerFromDamage(Character target, Character character)
{
if (!target.npc)
{
return;
}
if (target.sleeping)
{
target.WakeUp();
}
if (character && character.body.sneaking)
{
character.EndSneak(false, false);
}
if (target.willBeHostile)
{
target.hostility = 2;
}
int hostility = target.hostility;
bool attackingUntilBribe = target.attackingUntilBribe;
if (Links.x.combat.bubbleEvent && target.hostility <= 1)
{
return;
}
bool flag = false;
if (target.npc && character.party)
{
flag = this.CheckProof(target);
}
bool flag2 = false;
if ((hostility == 1 || hostility == 0) && !attackingUntilBribe && !flag && character.party && (!target.stats.animal || Links.x.main.inTown))
{
if (target.stats.race.Contains("Dryad") || target.stats.race.Contains("Lachovinian"))
{
target.hostility = 2;
if (target.vipFollow)
{
target.creatures.VIPFail();
}
}
else
{
bool flag3 = Links.x.main.inTown;
bool flag4 = false;
if (!flag3 && target.stats.dialogueFile != "")
{
if (target.stats.xmlName.Contains("FallsBandit"))
{
flag4 = true;
}
else
{
flag3 = true;
}
}
if (flag3)
{
Records.x.AddBribeBadge(target, "Seen", false, character);
flag2 = true;
}
else if (flag4)
{
target.hostility = 2;
if (target.vipFollow)
{
target.creatures.CheckVIP();
}
}
}
}
if (!target.hasActions && !target.dead && (!target.stunned || (target.stunned && Records.x.kill)))
{
this.AddPlayerToCombat(target, character, true, false, true);
}
else if (target.hostility != 2 && target.hostility != 3 && !target.attackingUntilBribe)
{
this.AddPlayerToCombat(target, character, true, false, true);
}
if (!character.npc)
{
for (int i = 0; i < this.party.Count; i++)
{
if (this.party[i] && this.party[i].IsSentient())
{
this.party[i].UpdateLKP(target, target.node, "Heard", false);
}
}
}
if (target.npc && character.party && (flag2 && hostility != 2 && hostility != 3 && !attackingUntilBribe))
{
Character character2;
int num;
this.NonHostileAttacked(target, target.tr.position, character, false, true, out character2, out num);
}
if (target.creatures && target.creatures.inGroup)
{
this.AddAllToCombat(target, character, true, true, true);
}
}
// Token: 0x060008EB RID: 2283 RVA: 0x000C09F0 File Offset: 0x000BEBF0
public bool AddAllToCombat(Character target, Character attacker, bool searching, bool overrideSleep, bool madeNoise)
{
bool flag = false;
if (target.creatures.inGroup)
{
Transform parent = target.creatures.gameObject.transform.parent;
if (parent)
{
foreach (object obj in parent)
{
CreatureActions component = ((Transform)obj).gameObject.GetComponent<CreatureActions>();
if (component)
{
bool flag2 = true;
Character firstCharacter = component.GetFirstCharacter();
if (firstCharacter && firstCharacter != target && (this.CheckProof(target) || Records.x.IsFelon(target.stats.xmlName)) && !this.CheckProof(firstCharacter) && !Records.x.IsFelon(firstCharacter.stats.xmlName) && component.creatures.temperament == Creatures.temperamentState.FightsIfAttacked)
{
flag2 = false;
}
if (flag2 && component.AddAllToCombat(attacker, searching, overrideSleep, madeNoise))
{
string[] array = new string[6];
array[0] = "Group turning hostile after attack: ";
array[1] = ((target != null) ? target.ToString() : null);
array[2] = " ";
int num = 3;
CreatureActions creatures = target.creatures;
array[num] = ((creatures != null) ? creatures.ToString() : null);
array[4] = " ";
int num2 = 5;
CreatureActions creatureActions = component;
array[num2] = ((creatureActions != null) ? creatureActions.ToString() : null);
Debug.Log(string.Concat(array));
flag = true;
}
}
}
}
}
return flag;
}
// Token: 0x060008EC RID: 2284 RVA: 0x000C0B80 File Offset: 0x000BED80
public void AddPartyToCombat(Character startCombatSeenCharacter)
{
for (int i = 0; i < this.party.Count; i++)
{
Character character = this.party[i];
if (character && character.IsSentient() && !character.dead && !character.stunned && !character.hasActions)
{
Links.x.combat.AddParty(character, false, startCombatSeenCharacter, true);
if (Links.x.gaia.boro)
{
Links.x.gaia.boroControls.LeavingForCombat();
}
}
}
}
// Token: 0x060008ED RID: 2285 RVA: 0x000C0C18 File Offset: 0x000BEE18
public void AddPlayerToCombat(Character character, Character attackingCharacter, bool checkForGroup, bool searching, bool madeNoise)
{
if (character.hostility == 0)
{
return;
}
bool flag = false;
if (checkForGroup && attackingCharacter.party)
{
flag = true;
}
if (searching)
{
character.UpdateLKP(attackingCharacter, attackingCharacter.node, "Heard", false);
}
else
{
character.UpdateLKP(attackingCharacter, attackingCharacter.node, "Attack", true);
}
if (!character.hasActions)
{
if (character.sleeping)
{
character.WakeUp();
}
if (character.hostility == 1 && !character.attackingUntilBribe && (!character.stats.animal || Links.x.main.inTown))
{
if (!this.CheckProof(character) && attackingCharacter.party)
{
character.attackingUntilBribe = true;
}
if (character.stats.isGuard)
{
character.GuardQuip();
}
}
Links.x.combat.AddParty(character, searching, attackingCharacter, true);
character.searching = searching;
if (character.searching)
{
character.inCombat = false;
}
if (Records.x.combatConsoleDebugging)
{
Debug.Log(((character != null) ? character.ToString() : null) + " add player to combat, searching is " + searching.ToString());
}
if (character.npc || (!character.npc && Records.x.ai == 1))
{
character.PlayAnimation("CombatStart", 0f);
}
character.PlaySoundFX(0, 7);
character.EndPath();
}
if (flag && character.creatures)
{
this.AddAllToCombat(character, attackingCharacter, searching, false, madeNoise);
}
}
// Token: 0x060008EE RID: 2286 RVA: 0x000C0D90 File Offset: 0x000BEF90
public int NonHostileAttacked(Character target, Vector3 targetPosition, Character attackingCharacter, bool single, bool madeNoise, out Character closestOffendedCharacter, out int anyoneSeen)
{
int num = this.characters.Count;
Vector3 vector = targetPosition;
if (target)
{
vector = target.tr.position;
}
int desiredGraph = attackingCharacter.desiredGraph;
uint area = attackingCharacter.node.Area;
bool flag = false;
if (!single && target)
{
flag = this.CheckProof(target);
}
else
{
vector = attackingCharacter.tr.position;
}
int num2 = 0;
closestOffendedCharacter = null;
float num3 = 100000f;
this.bribeBadgeCount = Records.x.BribeBadgeCount();
anyoneSeen = 0;
if (single)
{
num = 1;
}
for (int i = 0; i < num; i++)
{
Character character;
if (single)
{
character = target;
}
else
{
character = this.characters[i];
}
if (character)
{
if (character.dead || character.stunned || character.hostility == 2 || character.attackingUntilBribe || character.party || character.summoned || character.isBoro || character.ghost || (character.sleeping && !madeNoise) || character.stats.animal)
{
if (this.bribeBadgeCount > 0 && character.attackingUntilBribe)
{
float num4 = character.stats.SightRadius(false, false, false) * character.stats.SightRadius(false, false, false);
if (this.SubtractVectors(vector, character.tr.position).sqrMagnitude < num4 && !attackingCharacter.body.sneaking && !Physics.Linecast(attackingCharacter.raycastPosition, character.raycastPosition, Links.x.sightBlockers))
{
Records.x.UpdateBribeState(character);
}
}
}
else if (character.indoorID == attackingCharacter.indoorID)
{
float num5 = character.stats.SightRadius(false, false, false) * character.stats.SightRadius(false, false, false);
float sqrMagnitude = this.SubtractVectors(vector, character.tr.position).sqrMagnitude;
if (sqrMagnitude < num5 && !attackingCharacter.body.sneaking)
{
bool flag2 = madeNoise ?? this.InAngleView(attackingCharacter, character);
bool flag3 = false;
if (flag2 && !Physics.Linecast(attackingCharacter.raycastPosition, character.raycastPosition, Links.x.sightBlockers))
{
flag3 = true;
}
bool flag4 = false;
bool flag5 = false;
if (!flag3)
{
flag5 = true;
}
if (target != character || single)
{
if (character.sleeping)
{
character.WakeUp();
}
if (character.stats.isGuard)
{
num2++;
anyoneSeen++;
if (flag)
{
character.StartQuip("Justice!");
this.AddPlayerToCombat(character, target, true, flag5, madeNoise);
}
else
{
flag4 = true;
if (!this.CheckProof(character))
{
character.attackingUntilBribe = true;
}
character.GuardQuip();
this.AddPlayerToCombat(character, attackingCharacter, true, flag5, madeNoise);
if (this.bribeBadgeCount > 0)
{
Records.x.UpdateBribeState(character);
}
}
}
else if (!character.fleeing && !character.summoned && !character.ghost && character.IsSentient() && !character.sleeping && !character.hasActions && !this.CheckProof(character))
{
flag4 = true;
anyoneSeen++;
character.StartQuip("Help!");
character.Flee(attackingCharacter.node, false, Links.x.gameplay.seconds, 100f);
if (this.bribeBadgeCount > 0)
{
Records.x.UpdateBribeState(character);
}
}
if (sqrMagnitude < num3 && flag4)
{
num3 = sqrMagnitude;
closestOffendedCharacter = character;
}
}
}
}
}
}
if (num2 > 0 && !madeNoise && !single)
{
Character character2;
int num6;
this.NonHostileAttacked(target, targetPosition, attackingCharacter, single, true, out character2, out num6);
}
return num2;
}
// Token: 0x060008EF RID: 2287 RVA: 0x000C1158 File Offset: 0x000BF358
public void RemoveBribeHostility()
{
for (int i = 0; i < this.characters.Count; i++)
{
if (this.characters[i])
{
this.characters[i].attackingUntilBribe = false;
if (this.characters[i].hostility == 2 && this.characters[i].creatures && this.characters[i].creatures.inGroup && this.characters[i].creatures.creatures.temperament == Creatures.temperamentState.FightsIfAttacked && !this.ProofState(this.characters[i]))
{
this.characters[i].hostility = 1;
}
}
}
}
// Token: 0x060008F0 RID: 2288 RVA: 0x000C1234 File Offset: 0x000BF434
public void GhostFlee(Character ghost)
{
int count = this.characters.Count;
Vector3 position = ghost.tr.position;
int desiredGraph = ghost.desiredGraph;
uint area = ghost.node.Area;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && character.stats.allegiance == 6U && !character.dead && !character.stunned && character.hostility != 2 && !character.attackingUntilBribe && !character.party && !character.summoned && !character.isBoro && !character.ghost && character.desiredGraph == desiredGraph && (desiredGraph == 0 || character.indoorID == ghost.indoorID))
{
float num = character.stats.SightRadius(false, false, false) * character.stats.SightRadius(false, false, false);
if (this.SubtractVectors(position, character.tr.position).sqrMagnitude < num && !Physics.Linecast(ghost.raycastPosition, character.raycastPosition, Links.x.sightBlockers))
{
if (character.sleeping)
{
character.WakeUp();
}
if (!character.fleeing && character.IsSentient() && !character.hasActions)
{
if (Records.x.badgeCount > 0)
{
Records.x.UpdateBribeState(character);
}
character.StartQuip("Help!");
character.Flee(ghost.node, false, Links.x.gameplay.seconds, 200f);
}
}
}
}
}
// Token: 0x060008F1 RID: 2289 RVA: 0x000C13FC File Offset: 0x000BF5FC
public void CheckIfAllyInCombat(Character lookingCharacter)
{
int count = this.characters.Count;
Vector3 position = lookingCharacter.tr.position;
int desiredGraph = lookingCharacter.desiredGraph;
uint area = lookingCharacter.node.Area;
float num = lookingCharacter.stats.SightRadius(false, false, false);
float num2 = num * num;
bool flag = false;
Character character = null;
bool flag2 = false;
for (int i = 0; i < count; i++)
{
Character character2 = this.characters[i];
if (!flag && character2 && character2.stats.allegiance == lookingCharacter.stats.allegiance && character2.hostility > 1 && !this.CheckProof(character2) && character2.desiredGraph == desiredGraph && character2.node != null && desiredGraph == character2.desiredGraph && this.SubtractVectors(position, character2.tr.position).sqrMagnitude < num2)
{
character = character2.GetNearestPartyLKP(position);
if (character)
{
flag = true;
flag2 = Physics.Linecast(lookingCharacter.raycastPosition, character2.raycastPosition, Links.x.sightBlockers);
}
}
}
if (flag)
{
Debug.Log(((lookingCharacter != null) ? lookingCharacter.ToString() : null) + " saw an ally in combat");
this.AddPlayerToCombat(lookingCharacter, character, false, flag2, true);
}
}
// Token: 0x060008F2 RID: 2290 RVA: 0x000C155C File Offset: 0x000BF75C
public Character NearestNPC(Character partyCharacter)
{
Character character = null;
float num = 3600f;
Vector3 position = partyCharacter.tr.position;
for (int i = 0; i < this.characters.Count; i++)
{
Character character2 = this.characters[i];
if (character2 && character2.npc && character2.IsSentient() && !character2.sleeping && character2.visible == 1 && character2.stats.dialogueFile != "")
{
float sqrMagnitude = (character2.tr.position - position).sqrMagnitude;
if (sqrMagnitude < num)
{
character = character2;
num = sqrMagnitude;
}
}
}
return character;
}
// Token: 0x060008F3 RID: 2291 RVA: 0x000C1618 File Offset: 0x000BF818
public Character BribeCharacterNear(Character partyCharacter, bool any)
{
Character character = null;
float num = 3600f;
for (int i = 0; i < this.characters.Count; i++)
{
Character character2 = this.characters[i];
if (character2 && character2.npc && character2.IsSentient() && !character2.sleeping && character2.visible == 1)
{
bool flag = false;
if (character2.stats.isGuard)
{
flag = true;
}
if (!flag && Records.x.IsVictim(character2.stats.xmlName))
{
flag = true;
}
if (flag)
{
if (any)
{
for (int j = 0; j < this.party.Count; j++)
{
if (this.party[j] && this.party[j].IsSentient() && this.party[j].party && !this.party[j].isBoro)
{
float sqrMagnitude = (character2.tr.position - this.party[j].tr.position).sqrMagnitude;
if (sqrMagnitude < num)
{
character = character2;
num = sqrMagnitude;
}
}
}
}
else
{
float sqrMagnitude2 = (character2.tr.position - partyCharacter.tr.position).sqrMagnitude;
if (sqrMagnitude2 < num)
{
character = character2;
num = sqrMagnitude2;
}
}
}
}
}
return character;
}
// Token: 0x060008F4 RID: 2292 RVA: 0x000C17AC File Offset: 0x000BF9AC
public bool InAngleView(Vector3 pt, Character lookingCharacter)
{
Vector3 vector = this.SubtractVectors(pt, lookingCharacter.tr.position);
Vector3 vector2 = lookingCharacter.body.tr.rotation * Vector3.forward;
if (lookingCharacter.moving)
{
vector2 = lookingCharacter.tr.rotation * Vector3.forward;
}
float num = Vector3.Angle(vector, vector2);
float num2 = 45f;
float num3 = -45f;
return num <= num2 && num >= num3;
}
// Token: 0x060008F5 RID: 2293 RVA: 0x000C1822 File Offset: 0x000BFA22
public bool InAngleView(Character lookAtCharacter, Character lookingCharacter)
{
return lookingCharacter.hasActions || this.InAngleView(lookAtCharacter.tr.position, lookingCharacter);
}
// Token: 0x060008F6 RID: 2294 RVA: 0x000C1840 File Offset: 0x000BFA40
public Character HitCharacter(GraphNode mouseNode)
{
int count = this.characters.Count;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && (mouseNode.ID == character.nodeMovingID || mouseNode.ID == character.nodeStationaryID))
{
return character;
}
}
return null;
}
// Token: 0x060008F7 RID: 2295 RVA: 0x000C189C File Offset: 0x000BFA9C
public void AddMP(Character c)
{
float num = c.stats.characterRow._Height;
if (c.stats.characterRow._Flying)
{
num = 1f;
}
float num2 = Mathf.Round(1f + (float)c.stats.characterRow._Radius / 2f + num / 2f);
int count = this.party.Count;
for (int i = 0; i < count; i++)
{
Character character = this.party[i];
if (character && !character.inactive && !character.dead && !character.missing && (c.tr.position - character.tr.position).sqrMagnitude < 6400f)
{
character.stats.AddSpiritFromKill(num2);
if (character.party && character.portrait)
{
character.portrait.SetMagicColor();
}
}
}
}
// Token: 0x060008F8 RID: 2296 RVA: 0x000C19A8 File Offset: 0x000BFBA8
public void AddAbilityToSameFaction(Character character, Library.Abilities ability)
{
for (int i = 0; i < this.characters.Count; i++)
{
if (this.characters[i] && ((this.characters[i].npc && character.npc && !character.stats.IsTargetAnEnemy(this.characters[i].stats.allegiance)) || (!character.npc && !this.characters[i].npc)))
{
character.actions.AddEffect(ability._Name, this.linksNPC[i]);
}
}
}
// Token: 0x060008F9 RID: 2297 RVA: 0x000C1A5C File Offset: 0x000BFC5C
public void AddAbilityToOtherFaction(Character character, Library.Abilities ability)
{
for (int i = 0; i < this.characters.Count; i++)
{
if (this.characters[i] && ((character.npc && (!this.characters[i].npc || character.stats.IsTargetAnEnemy(this.characters[i].stats.allegiance))) || (!character.npc && this.characters[i].npc)))
{
character.actions.AddEffect(ability._Name, this.linksNPC[i]);
}
}
}
// Token: 0x060008FA RID: 2298 RVA: 0x000C1B10 File Offset: 0x000BFD10
public void CheckNewSpell(TileEffects tileEffect)
{
int count = this.characters.Count;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && !character.inactive && character.node != null)
{
tileEffect.CheckTile(character.node, character, true);
}
}
}
// Token: 0x060008FB RID: 2299 RVA: 0x000C1B6C File Offset: 0x000BFD6C
public void CheckNewSpellNode(TileEffects tileEffect, GraphNode g, string effectName, bool hasAbility, Library.Abilities ability, Character source)
{
float num = (tileEffect.influenceRadius + 1f) * Records.x.nodeSize;
for (int i = 0; i < this.characters.Count; i++)
{
Character character = this.characters[i];
if (character && !character.inactive && !character.dead && (character.currentPosition - tileEffect.mainPosition).sqrMagnitude < num * num && character.node != null)
{
tileEffect.CheckTile(character.node, character, false);
}
}
}
// Token: 0x060008FC RID: 2300 RVA: 0x000C1C04 File Offset: 0x000BFE04
public bool CheckTileTaken(GraphNode g)
{
int count = this.characters.Count;
Vector3 vector = (Vector3)g.position;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && !character.inactive && this.SubtractVectors(character.tr.position, vector).sqrMagnitude < 9f && character.node == g)
{
return true;
}
}
return false;
}
// Token: 0x060008FD RID: 2301 RVA: 0x000C1C84 File Offset: 0x000BFE84
public void SetUpPause()
{
for (int i = 0; i < this.characters.Count; i++)
{
if (this.characters[i] && !this.characters[i].inactive)
{
this.characters[i].ChangePauseState();
}
}
}
// Token: 0x060008FE RID: 2302 RVA: 0x000C1CE0 File Offset: 0x000BFEE0
public void SetUpPocketPause()
{
for (int i = 0; i < this.characters.Count; i++)
{
if (this.characters[i] && !this.characters[i].inactive)
{
this.characters[i].ChangePocketPauseState();
}
}
for (int j = 0; j < this.deads.Count; j++)
{
if (this.deads[j] && !this.deads[j].inactive)
{
this.deads[j].ChangePocketPauseState();
}
}
}
// Token: 0x060008FF RID: 2303 RVA: 0x000C1D88 File Offset: 0x000BFF88
public void StartGrounder()
{
int count = this.characters.Count;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && !character.useGrounder)
{
character.body.SetGrounderState(true);
}
}
}
// Token: 0x06000900 RID: 2304 RVA: 0x000C1DD8 File Offset: 0x000BFFD8
public void CheckForCharactersInDome(Character firstTarget, Character initiator)
{
}
// Token: 0x06000901 RID: 2305 RVA: 0x000C1DDC File Offset: 0x000BFFDC
public void LookAtObject(Transform lookAtTransform, float radius, bool useHand, Character lookAtCharacter, float timeAmount, float delay, Character onlyCharacterToLook, int whoLooks)
{
if (!lookAtTransform)
{
return;
}
int count = this.characters.Count;
float num = radius * radius;
Vector3 position = lookAtTransform.position;
for (int i = 0; i < count; i++)
{
Character character = this.characters[i];
if (character && (whoLooks == 0 || (whoLooks == 2 && character.npc) || (whoLooks == 1 && !character.npc) || (whoLooks == 3 && character.npc && !lookAtCharacter.npc) || (!character.npc && lookAtCharacter.npc)) && character.IsSentient() && character != lookAtCharacter && (!onlyCharacterToLook || (onlyCharacterToLook && character == onlyCharacterToLook)) && (this.SubtractVectors(character.tr.position, position).sqrMagnitude < num || character == onlyCharacterToLook))
{
float num2 = 0f;
if (delay > 0f)
{
num2 = Random.Range(delay - 0.5f, delay + 0.5f);
}
float num3 = 0f;
if (timeAmount > 0f)
{
num3 = Random.Range(timeAmount - 1f, timeAmount + 1f);
}
character.body.lookAtController.SetNewTarget(lookAtTransform, num3, num2, useHand);
}
}
}
// Token: 0x06000902 RID: 2306 RVA: 0x000C1F4C File Offset: 0x000C014C
public float NoiseRange(string type)
{
if (type == "Combat Aggro")
{
return 400f;
}
if (type == "Death")
{
return 16f;
}
if (type == "Footsteps")
{
return 625f;
}
if (type == "Sailing")
{
return 1600f;
}
if (type == "Attack")
{
return 400f;
}
if (type == "Hit")
{
return 400f;
}
if (type == "Item Drop")
{
return 100f;
}
if (type == "Break")
{
return 400f;
}
if (type == "RockWall")
{
return 625f;
}
if (type == "Entangle")
{
return 25f;
}
if (type == "NPCSpell")
{
return 900f;
}
return 0f;
}
// Token: 0x06000903 RID: 2307 RVA: 0x000C2030 File Offset: 0x000C0230
public void AddNoise(GameObject go, GraphNode pos, string type, Character character)
{
if (pos != null)
{
this.noiseCharacter.Add(character);
this.noiseObj.Add(go);
this.noiseLocation.Add(pos);
this.noiseType.Add(type);
if (type == "Hit" || type == "Combat Aggro" || type == "Death")
{
this.noiseFaction.Add(2);
}
else
{
this.noiseFaction.Add(0);
}
if (this.debug && type != "Footsteps")
{
Debug.Log("Add noise " + ((go != null) ? go.ToString() : null) + " " + type);
}
}
}
// Token: 0x06000904 RID: 2308 RVA: 0x000C20EC File Offset: 0x000C02EC
public void AddFootstep(Character character)
{
if (character.stats.Silent() > 0 || character.body.sneaking)
{
return;
}
if (character.node == null)
{
return;
}
int num = this.noiseCharacter.IndexOf(character);
if (num == -1)
{
this.AddNoise(character.gameObject, character.node, "Footsteps", character);
return;
}
this.noiseLocation[num] = character.node;
if (character.sailing)
{
this.noiseType[num] = "Sailing";
}
else
{
this.noiseType[num] = "Footsteps";
}
this.noiseFaction[num] = 1;
}
// Token: 0x06000905 RID: 2309 RVA: 0x000C2194 File Offset: 0x000C0394
public Vector3 SubtractVectors(Vector3 a, Vector3 b)
{
Vector3 vector;
vector.x = a.x - b.x;
vector.y = a.y - b.y;
vector.z = a.z - b.z;
return vector;
}
// Token: 0x06000906 RID: 2310 RVA: 0x000C21E0 File Offset: 0x000C03E0
public Vector3 SubtractVectorsNoY(Vector3 a, Vector3 b)
{
Vector3 vector;
vector.x = a.x - b.x;
vector.y = 0f;
vector.z = a.z - b.z;
return vector;
}
// Token: 0x04000E01 RID: 3585
[Header("NOISE")]
public List<GameObject> noiseObj = new List<GameObject>();
// Token: 0x04000E02 RID: 3586
public List<string> noiseType = new List<string>();
// Token: 0x04000E03 RID: 3587
public List<int> noiseFaction = new List<int>();
// Token: 0x04000E04 RID: 3588
public List<GraphNode> noiseLocation = new List<GraphNode>();
// Token: 0x04000E05 RID: 3589
public List<Character> noiseCharacter = new List<Character>();
// Token: 0x04000E06 RID: 3590
private List<GameObject> noiseObjTemp = new List<GameObject>();
// Token: 0x04000E07 RID: 3591
private List<string> noiseTypeTemp = new List<string>();
// Token: 0x04000E08 RID: 3592
private List<int> noiseFactionTemp = new List<int>();
// Token: 0x04000E09 RID: 3593
private List<GraphNode> noiseLocationTemp = new List<GraphNode>();
// Token: 0x04000E0A RID: 3594
private List<Character> noiseCharacterTemp = new List<Character>();
// Token: 0x04000E0B RID: 3595
public List<bool> footsteps = new List<bool>();
// Token: 0x04000E0C RID: 3596
private bool footstepAdded;
// Token: 0x04000E0D RID: 3597
[Header("MISC")]
public bool debug;
// Token: 0x04000E0E RID: 3598
private Diorama diorama;
// Token: 0x04000E0F RID: 3599
private IEnumerator domeCoroutine;
// Token: 0x04000E10 RID: 3600
private List<Character> characters;
// Token: 0x04000E11 RID: 3601
private List<Character> party;
// Token: 0x04000E12 RID: 3602
private List<Character> npcs = new List<Character>();
// Token: 0x04000E13 RID: 3603
private List<Character> checkParty = new List<Character>();
// Token: 0x04000E14 RID: 3604
private List<PromptActions> promptActions;
// Token: 0x04000E15 RID: 3605
private List<Character> deads;
// Token: 0x04000E16 RID: 3606
private List<Character> linksNPC;
// Token: 0x04000E17 RID: 3607
private List<Character> towerCharacters;
// Token: 0x04000E18 RID: 3608
private List<Color32[]> pix = new List<Color32[]>();
// Token: 0x04000E19 RID: 3609
private List<int> sourceWidths = new List<int>();
// Token: 0x04000E1A RID: 3610
public List<Vector2> terrainDimensions = new List<Vector2>();
// Token: 0x04000E1B RID: 3611
private bool checking;
// Token: 0x04000E1C RID: 3612
private IEnumerator sensoryCoroutine;
// Token: 0x04000E1D RID: 3613
private List<SceneCamera> cams;
// Token: 0x04000E1E RID: 3614
private Color32[] currPix;
// Token: 0x04000E1F RID: 3615
public int terrainTextureWidthExt;
// Token: 0x04000E20 RID: 3616
public int terrainTextureWidthInt;
// Token: 0x04000E21 RID: 3617
public int terrainTextureHeightExt;
// Token: 0x04000E22 RID: 3618
public int terrainTextureHeightInt;
// Token: 0x04000E23 RID: 3619
public int bribeBadgeCount;
// Token: 0x04000E24 RID: 3620
private float timeSinceLastCheck;
}