2074 lines
68 KiB
C#
2074 lines
68 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using DarkTonic.MasterAudio;
|
|
using Pathfinding;
|
|
using PixelCrushers.DialogueSystem;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
|
|
// Token: 0x02000083 RID: 131
|
|
public class Cinematics : MonoBehaviour
|
|
{
|
|
// Token: 0x06000CAC RID: 3244 RVA: 0x000F84D8 File Offset: 0x000F66D8
|
|
public void StartBanquetIsle()
|
|
{
|
|
base.StartCoroutine(this.StartOfBanquetIsle());
|
|
}
|
|
|
|
// Token: 0x06000CAD RID: 3245 RVA: 0x000F84E7 File Offset: 0x000F66E7
|
|
private IEnumerator StartOfBanquetIsle()
|
|
{
|
|
Records.x.RemoveControls(true);
|
|
Links.x.hudControl.ChangeHudVisibility(false, false);
|
|
Records.x.SetTypingState(true);
|
|
this.videoFinished = false;
|
|
yield return new WaitForSeconds(0.3f);
|
|
Links.x.cinematicVideos.Setup("Throat", this);
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
while (!this.videoFinished)
|
|
{
|
|
if (Links.x.fadeAnimator.GetCurrentAnimatorStateInfo(0).IsName("FadeOut") || Links.x.fadeAnimator.GetCurrentAnimatorStateInfo(0).IsName("FadeOutLoop"))
|
|
{
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
}
|
|
yield return null;
|
|
}
|
|
if (!Records.x.demo && new ES3File("Version.es3").KeyExists("FinishedIntro"))
|
|
{
|
|
Links.x.hudControl.skipIntro.SetActive(true);
|
|
if (Links.x.joy)
|
|
{
|
|
yield return new WaitForSecondsRealtime(0.5f);
|
|
GameObject go = Links.x.hudControl.skipIntro.transform.GetChild(0).GetChild(2).gameObject;
|
|
while (!go.activeSelf || !go.activeInHierarchy)
|
|
{
|
|
yield return null;
|
|
}
|
|
EventSystem.current.SetSelectedGameObject(go);
|
|
go.GetComponent<UITriggerButton>().SetSelected(true);
|
|
go = null;
|
|
}
|
|
while (Links.x.hudControl.skipIntro.activeSelf)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Links.x.joy)
|
|
{
|
|
EventSystem.current.SetSelectedGameObject(null);
|
|
}
|
|
}
|
|
Links.x.hudControl.JoyBox(false);
|
|
if (!Links.x.hudControl.skippingIntro)
|
|
{
|
|
Records.x.RemoveControls(false);
|
|
Links.x.hudControl.ChangeHudVisibility(true, true);
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
Shader.SetGlobalFloat("_CloseUp", 0f);
|
|
Shader.SetGlobalFloat("_Perspective", 0f);
|
|
Records.x.SetTypingState(false);
|
|
Records.x.TriggerGlobalSave("CheckpointSave", true);
|
|
Records.x.RemoveControls(false);
|
|
Links.x.gaia.CheckForNewSoundtrack("Banquet Isle", false, false);
|
|
}
|
|
Links.x.hudControl.skippingIntro = false;
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CAE RID: 3246 RVA: 0x000F84F6 File Offset: 0x000F66F6
|
|
public void Ishaat(PromptActions prompt)
|
|
{
|
|
base.StartCoroutine(this.EndOfBanquet(prompt));
|
|
}
|
|
|
|
// Token: 0x06000CAF RID: 3247 RVA: 0x000F8506 File Offset: 0x000F6706
|
|
private IEnumerator EndOfBanquet(PromptActions prompt)
|
|
{
|
|
Character hunter = null;
|
|
int num = 10000000;
|
|
List<Character> party = Links.x.party;
|
|
for (int j = 0; j < party.Count; j++)
|
|
{
|
|
if (party[j])
|
|
{
|
|
int partyID = party[j].stats.partyID;
|
|
if (partyID < num)
|
|
{
|
|
num = partyID;
|
|
hunter = party[j];
|
|
}
|
|
}
|
|
}
|
|
while (Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
if (!Records.x.combat)
|
|
{
|
|
break;
|
|
}
|
|
yield return null;
|
|
}
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Links.x.main.cc)
|
|
{
|
|
Links.x.main.cc.enabled = false;
|
|
}
|
|
Records.x.RemoveControls(true);
|
|
Links.x.hudControl.ChangeHudVisibility(false, false);
|
|
Records.x.SetTypingState(true);
|
|
if (Records.x.combat)
|
|
{
|
|
if (Records.x.pocketPause)
|
|
{
|
|
Links.x.gameplay.PocketPause(false);
|
|
}
|
|
List<Character> combatCharacters = Links.x.combat.characters;
|
|
GraphNode i = Links.x.main.NearNode(Links.x.diorama.playerStartDefault.position, false, 0, -1, 0);
|
|
for (int k = 0; k < combatCharacters.Count; k++)
|
|
{
|
|
if (combatCharacters[k] && combatCharacters[k] != hunter)
|
|
{
|
|
if (i != null)
|
|
{
|
|
combatCharacters[k].StartFleeAroundPoint(i);
|
|
combatCharacters[k].ignoreRemoveControls = true;
|
|
combatCharacters[k].ClearLKP();
|
|
if (combatCharacters[k].actions)
|
|
{
|
|
combatCharacters[k].actions.EndActions();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combatCharacters[k].stats.SetHealth(0, false);
|
|
combatCharacters[k].Stunned(false);
|
|
}
|
|
}
|
|
}
|
|
yield return new WaitForSeconds(0.01f);
|
|
for (int l = 0; l < combatCharacters.Count; l++)
|
|
{
|
|
if (combatCharacters[l] && combatCharacters[l] != hunter)
|
|
{
|
|
if (i != null)
|
|
{
|
|
combatCharacters[l].StartFleeAroundPoint(i);
|
|
combatCharacters[l].ignoreRemoveControls = true;
|
|
combatCharacters[l].ClearLKP();
|
|
if (combatCharacters[l].actions)
|
|
{
|
|
combatCharacters[l].actions.EndActions();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combatCharacters[l].stats.SetHealth(0, false);
|
|
combatCharacters[l].Stunned(false);
|
|
}
|
|
}
|
|
}
|
|
hunter.ClearLKP();
|
|
if (hunter.actions)
|
|
{
|
|
hunter.actions.EndActions();
|
|
}
|
|
Links.x.combat.EndCombat(false);
|
|
hunter.StopMoving();
|
|
hunter.sphere.transform.position = hunter.tr.position;
|
|
hunter.savedPathTarget = hunter.node;
|
|
hunter.savedFollowNode = hunter.node;
|
|
hunter.TargetReached();
|
|
if (hunter.cc)
|
|
{
|
|
hunter.cc.enabled = false;
|
|
}
|
|
combatCharacters = null;
|
|
i = null;
|
|
}
|
|
Records.x.combat = false;
|
|
prompt.state = 2;
|
|
Links.x.gaia.PlayFade("Out", "Unscaled");
|
|
this.videoFinished = false;
|
|
yield return new WaitForSeconds(0.3f);
|
|
Links.x.cinematicVideos.Setup("Standoff", this);
|
|
while (!this.videoFinished)
|
|
{
|
|
yield return null;
|
|
}
|
|
Records.x.SetTypingState(false);
|
|
Links.x.gameplay.gameHours = 5f;
|
|
Links.x.gameplay.gameMinutes = 300f;
|
|
Links.x.gameplay.gameSeconds = 18000f;
|
|
Links.x.gameplay.gameDays = 0;
|
|
Links.x.inventory.emeralds = 0;
|
|
Links.x.fellowship.rally = 0f;
|
|
Links.x.fellowship.rallyBoost = 0f;
|
|
Links.x.fellowship.rallyAttacks = 0f;
|
|
Links.x.gameplay.LoadGameTime();
|
|
Links.x.gaia.SwitchToCharacterCreationScene();
|
|
ES3File es3File = new ES3File("Version.es3");
|
|
es3File.Save<bool>("FinishedIntro", true);
|
|
es3File.Sync();
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CB0 RID: 3248 RVA: 0x000F851C File Offset: 0x000F671C
|
|
public void EndDemoMessage()
|
|
{
|
|
base.StartCoroutine(this.EndDemoMessageWait());
|
|
}
|
|
|
|
// Token: 0x06000CB1 RID: 3249 RVA: 0x000F852B File Offset: 0x000F672B
|
|
private IEnumerator EndDemoMessageWait()
|
|
{
|
|
Links.x.hudControl.demoMessage.SetActive(true);
|
|
Links.x.hudControl.demoMessage.GetComponent<DeathScreen>().Setup();
|
|
while (!this.Clicked())
|
|
{
|
|
yield return null;
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CB2 RID: 3250 RVA: 0x000F853A File Offset: 0x000F673A
|
|
public void StartDemo()
|
|
{
|
|
base.StartCoroutine(this.DemoStart());
|
|
}
|
|
|
|
// Token: 0x06000CB3 RID: 3251 RVA: 0x000F854C File Offset: 0x000F674C
|
|
private bool Clicked()
|
|
{
|
|
if (Links.x.joy)
|
|
{
|
|
if (Links.x.gameplay.cancelStart || Links.x.gameplay.actionStart || Links.x.gameplay.interactStart)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1) || Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.Return))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Token: 0x06000CB4 RID: 3252 RVA: 0x000F85BF File Offset: 0x000F67BF
|
|
private IEnumerator DemoStart()
|
|
{
|
|
Records.x.RemoveControls(true);
|
|
Links.x.hudControl.ChangeHudVisibility(false, false);
|
|
Records.x.SetTypingState(true);
|
|
this.videoFinished = false;
|
|
while (!Links.x.gaia.sceneLoaded)
|
|
{
|
|
yield return null;
|
|
}
|
|
bool flag = false;
|
|
if (!Records.x.editor)
|
|
{
|
|
flag = false;
|
|
}
|
|
GameObject gameObject = GameObject.Find("Mihal the Scribe CC");
|
|
Character npc = gameObject.GetComponent<CreatureActions>().GetFirstCharacter();
|
|
List<Character> allCharacters = Links.x.diorama.characters;
|
|
GameObject gameObject2 = GameObject.Find("Fake Guard A");
|
|
GameObject gameObject3 = GameObject.Find("Fake Guard B");
|
|
GameObject gameObject4 = GameObject.Find("Fake Guard C");
|
|
GameObject gameObject5 = GameObject.Find("Fake Guard D");
|
|
CreatureActions creatureA = gameObject2.GetComponent<CreatureActions>();
|
|
CreatureActions creatureB = gameObject3.GetComponent<CreatureActions>();
|
|
CreatureActions creatureC = gameObject4.GetComponent<CreatureActions>();
|
|
CreatureActions creatureD = gameObject5.GetComponent<CreatureActions>();
|
|
if (!flag)
|
|
{
|
|
Links.x.cinematicVideos.Setup("Flyover", this);
|
|
Links.x.gaia.PlayFade("Out", "Unscaled");
|
|
npc.ambushing = true;
|
|
npc.SetMeshState(false);
|
|
npc.body.SetMeshState(false, false);
|
|
while (!this.videoFinished)
|
|
{
|
|
if (Links.x.fadeAnimator.GetCurrentAnimatorStateInfo(0).IsName("FadeIn") || Links.x.fadeAnimator.GetCurrentAnimatorStateInfo(0).IsName("FadeInLoop"))
|
|
{
|
|
Links.x.gaia.PlayFade("Out", "Unscaled");
|
|
}
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.TogglePause(false);
|
|
yield return new WaitForSeconds(0.2f);
|
|
Character barkeep = Links.x.diorama.FindCharacterAnyState("LazureBarkeep");
|
|
Character character = Links.x.diorama.FindCharacterAnyState("LazureBarmaid");
|
|
Character duraPatron = Links.x.diorama.FindCharacterAnyState("LazurePatronDuraMessenger");
|
|
Character mercPatron = Links.x.diorama.FindCharacterAnyState("LazurePatronMerc");
|
|
Character patronC = Links.x.diorama.FindCharacterAnyState("LazureBarPatronC");
|
|
Character patronD = Links.x.diorama.FindCharacterAnyState("LazureBarPatronD");
|
|
Character patronE = Links.x.diorama.FindCharacterAnyState("LazureBarPatronE");
|
|
Character fakeGuardA = creatureA.GetFirstCharacter();
|
|
Character fakeGuardB = creatureB.GetFirstCharacter();
|
|
creatureC.GetFirstCharacter();
|
|
creatureD.GetFirstCharacter();
|
|
character.tr.position = (Vector3)character.creatures.GetWalkIndex(0).position;
|
|
character.FirstPosition(character.creatures.GetWalkIndex(0));
|
|
character.ignoreRemoveControls = true;
|
|
List<Character> portraitOrder = Links.x.portraitOrder;
|
|
int count2 = portraitOrder.Count;
|
|
for (int j = 0; j < count2; j++)
|
|
{
|
|
Character character2 = portraitOrder[j];
|
|
character2.SetRotation(Quaternion.LookRotation(npc.tr.position - character2.tr.position), false, true);
|
|
}
|
|
Links.x.gameplay.gameHours = 5f;
|
|
Links.x.gameplay.gameMinutes = 300f;
|
|
Links.x.gameplay.gameSeconds = 18000f;
|
|
Links.x.gameplay.gameDays = 0;
|
|
Links.x.gaia.SetPlaylist("Garrison", true, 0f);
|
|
for (int k = 0; k < allCharacters.Count; k++)
|
|
{
|
|
Character character3 = allCharacters[k];
|
|
if (character3 && character3.npc && (character3.tr.position - npc.tr.position).sqrMagnitude < 2500f && character3 != npc && character3 != barkeep)
|
|
{
|
|
character3.ignoreRemoveControls = true;
|
|
}
|
|
}
|
|
character.MakePath(character.creatures.GetWalkIndex(1), 4, false, false, true);
|
|
yield return new WaitForSeconds(0.5f);
|
|
patronD.PlayAnimation("Talk_1", 0f);
|
|
mercPatron.PatrolRotate();
|
|
patronE.PlayAnimation("Talk_2", 0f);
|
|
fakeGuardA.PlayAnimation("Talk_3", 0f);
|
|
mercPatron.PlayAnimation("Talk_3", 0f);
|
|
patronE.PatrolRotate();
|
|
duraPatron.PlayAnimation("Talk_2", 0f);
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
yield return new WaitForSeconds(0.5f);
|
|
fakeGuardB.PatrolRotate();
|
|
yield return new WaitForSeconds(1.5f);
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Interactives", npc.tr.position, 1f, new float?(1f), 0f, "Opening Door", null);
|
|
patronC.PlayAnimation("Talk_1", 0f);
|
|
npc.ambushing = false;
|
|
npc.SetMeshState(true);
|
|
npc.body.SetMeshState(true, true);
|
|
npc.PlayAnimation("Idle", 0f);
|
|
yield return new WaitForSeconds(1f);
|
|
npc.ignoreRemoveControls = true;
|
|
npc.StartQuip("Hold your tongues and still your mead!");
|
|
npc.body.headAnim.FreshBlink();
|
|
yield return new WaitForSeconds(1f);
|
|
patronD.PlayAnimation("Talk_1", 0f);
|
|
yield return new WaitForSeconds(0.5f);
|
|
mercPatron.PatrolRotate();
|
|
float timeToLerp = 1f;
|
|
float percentage = 0f;
|
|
float startTime = Time.time;
|
|
float count = 0f;
|
|
int num2;
|
|
for (int i = 0; i < allCharacters.Count; i = num2 + 1)
|
|
{
|
|
Character character4 = allCharacters[i];
|
|
if (character4 && character4.npc && character4.visible == 1 && character4 != npc && character4 != barkeep)
|
|
{
|
|
character4.alwaysTurn = true;
|
|
character4.SetRotation(Quaternion.LookRotation(npc.tr.position - character4.tr.position), true, false);
|
|
float num = Random.Range(0.1f, 0.25f);
|
|
count += num;
|
|
if (!this.Clicked())
|
|
{
|
|
yield return new WaitForSeconds(num);
|
|
}
|
|
}
|
|
num2 = i;
|
|
}
|
|
timeToLerp = 4f - count;
|
|
percentage = 0f;
|
|
startTime = Time.time;
|
|
if (timeToLerp < 0f)
|
|
{
|
|
timeToLerp = 0.1f;
|
|
}
|
|
while (percentage < 1f && !this.Clicked())
|
|
{
|
|
percentage = (Time.time - startTime) / timeToLerp;
|
|
yield return null;
|
|
}
|
|
barkeep.ignoreRemoveControls = false;
|
|
count = 0f;
|
|
npc.ignoreRemoveControls = true;
|
|
npc.PlayAnimation("Talk_1", 0f);
|
|
npc.StartQuip("The Pavura needs four guards, who will answer his call?");
|
|
timeToLerp = 4f;
|
|
percentage = 0f;
|
|
startTime = Time.time;
|
|
while (percentage < 1f && !this.Clicked())
|
|
{
|
|
percentage = (Time.time - startTime) / timeToLerp;
|
|
yield return null;
|
|
}
|
|
npc.EndQuip();
|
|
barkeep = null;
|
|
duraPatron = null;
|
|
mercPatron = null;
|
|
patronC = null;
|
|
patronD = null;
|
|
patronE = null;
|
|
fakeGuardA = null;
|
|
fakeGuardB = null;
|
|
}
|
|
Links.x.gaia.OpenCharacterCreation(true, npc, null);
|
|
yield return new WaitForSeconds(0.5f);
|
|
npc.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - npc.tr.position), false, true);
|
|
while (Links.x.creation)
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
for (int l = 0; l < allCharacters.Count; l++)
|
|
{
|
|
Character character5 = allCharacters[l];
|
|
if (character5 != npc && character5 && character5.party)
|
|
{
|
|
character5.SetRotation(Quaternion.LookRotation(npc.tr.position - character5.tr.position), false, true);
|
|
}
|
|
}
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
Records.x.RemoveControls(true);
|
|
Links.x.gameplay.TogglePause(false);
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
float timeToLerp2 = 2f;
|
|
float percentage2 = 0f;
|
|
float startTime2 = Time.time;
|
|
while (percentage2 < 1f)
|
|
{
|
|
if (this.Clicked())
|
|
{
|
|
break;
|
|
}
|
|
percentage2 = (Time.time - startTime2) / timeToLerp2;
|
|
yield return null;
|
|
}
|
|
while (this.Clicked())
|
|
{
|
|
yield return null;
|
|
}
|
|
npc.ignoreRemoveControls = true;
|
|
npc.StartQuip("Make haste, and follow me! The Pavura awaits you.");
|
|
timeToLerp2 = 5f;
|
|
percentage2 = 0f;
|
|
startTime2 = Time.time;
|
|
while (percentage2 < 1f && !this.Clicked())
|
|
{
|
|
percentage2 = (Time.time - startTime2) / timeToLerp2;
|
|
yield return null;
|
|
}
|
|
for (int m = 0; m < allCharacters.Count; m++)
|
|
{
|
|
Character character6 = allCharacters[m];
|
|
if (character6 && character6.npc)
|
|
{
|
|
character6.ignoreRemoveControls = false;
|
|
}
|
|
}
|
|
Records.x.StartUIFade(false, false);
|
|
yield return new WaitForSeconds(0.5f);
|
|
if (creatureA)
|
|
{
|
|
creatureA.GetFirstCharacter().Missing();
|
|
}
|
|
if (creatureB)
|
|
{
|
|
creatureB.GetFirstCharacter().Missing();
|
|
}
|
|
if (creatureC)
|
|
{
|
|
creatureC.GetFirstCharacter().Missing();
|
|
}
|
|
if (creatureD)
|
|
{
|
|
creatureD.GetFirstCharacter().Missing();
|
|
}
|
|
Links.x.gaia.EndCharacterCreation();
|
|
Records.x.SetTypingState(false);
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CB5 RID: 3253 RVA: 0x000F85CE File Offset: 0x000F67CE
|
|
public void EndDemoInOffice()
|
|
{
|
|
base.StartCoroutine(this.EndDemoInOfficeTimer());
|
|
}
|
|
|
|
// Token: 0x06000CB6 RID: 3254 RVA: 0x000F85DD File Offset: 0x000F67DD
|
|
private IEnumerator EndDemoInOfficeTimer()
|
|
{
|
|
while (Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
if (!Records.x.combat)
|
|
{
|
|
break;
|
|
}
|
|
yield return null;
|
|
}
|
|
while (Records.x.combat)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
Records.x.RemoveControls(true);
|
|
Records.x.SetTypingState(true);
|
|
Links.x.hudControl.StartDemoIntro();
|
|
float timeToLerp = 1f;
|
|
float percentage = 0f;
|
|
float startTime = Time.realtimeSinceStartup;
|
|
while (percentage < 1f)
|
|
{
|
|
percentage = (Time.realtimeSinceStartup - startTime) / timeToLerp;
|
|
yield return null;
|
|
}
|
|
timeToLerp = 10f;
|
|
percentage = 0f;
|
|
startTime = Time.realtimeSinceStartup;
|
|
while (percentage < 1f && !this.Clicked())
|
|
{
|
|
percentage = (Time.realtimeSinceStartup - startTime) / timeToLerp;
|
|
yield return null;
|
|
}
|
|
Object.Destroy(this);
|
|
Links.x.hudControl.EndDemoIntro();
|
|
Records.x.RemoveControls(false);
|
|
Records.x.SetTypingState(false);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CB7 RID: 3255 RVA: 0x000F85EC File Offset: 0x000F67EC
|
|
public void EndDemo()
|
|
{
|
|
base.StartCoroutine(this.DemoEnd());
|
|
}
|
|
|
|
// Token: 0x06000CB8 RID: 3256 RVA: 0x000F85FB File Offset: 0x000F67FB
|
|
private IEnumerator DemoEnd()
|
|
{
|
|
while (Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
if (!Records.x.combat)
|
|
{
|
|
break;
|
|
}
|
|
yield return null;
|
|
}
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Links.x.main.cc)
|
|
{
|
|
Links.x.main.cc.enabled = false;
|
|
}
|
|
yield return new WaitForSeconds(0.5f);
|
|
Records.x.TriggerGlobalSave("CheckpointSave", true);
|
|
yield return new WaitForSeconds(0.5f);
|
|
Records.x.RemoveControls(true);
|
|
Links.x.hudControl.ChangeHudVisibility(false, false);
|
|
Links.x.hudControl.demoMessage.SetActive(true);
|
|
Links.x.hudControl.demoMessage.GetComponent<DeathScreen>().Setup();
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CB9 RID: 3257 RVA: 0x000F860A File Offset: 0x000F680A
|
|
public void StartPavuraWalk()
|
|
{
|
|
if (this.pavuraWalk == null)
|
|
{
|
|
this.pavuraWalk = this.PavuraWalk();
|
|
base.StartCoroutine(this.pavuraWalk);
|
|
}
|
|
}
|
|
|
|
// Token: 0x06000CBA RID: 3258 RVA: 0x000F862D File Offset: 0x000F682D
|
|
private IEnumerator PavuraWalk()
|
|
{
|
|
if (Records.x.paused)
|
|
{
|
|
Links.x.gameplay.TogglePause(false);
|
|
}
|
|
Shader.SetGlobalFloat("_CloseUp", 1f);
|
|
Shader.SetGlobalFloat("_Perspective", 1f);
|
|
Links.x.gaia.PlayFade("Out", "Scaled");
|
|
yield return new WaitForSeconds(0.2f);
|
|
Links.x.diorama.FindCharacterAnyState("LazureScribeCC").Leave(false);
|
|
Links.x.gaia.SetEnvironmentPlaylist(false, false, false);
|
|
Links.x.gaia.SetPlaylist("Lazure", true, 0f);
|
|
List<Character> party = Links.x.portraitOrder;
|
|
int partyCount = party.Count;
|
|
int num;
|
|
for (int i = 0; i < partyCount; i = num + 1)
|
|
{
|
|
Character character = party[i];
|
|
GameObject pavuraOfficePoint = GameObject.Find("Jump_Pavura Office Point " + i.ToString());
|
|
GraphNode graphNode = character.NearNode(pavuraOfficePoint.transform.position, true, 0, -1, 0);
|
|
if (graphNode != null)
|
|
{
|
|
Links.x.sensory.SetMagicaClothState(false);
|
|
this.MovePosition(character, graphNode, true);
|
|
yield return new WaitForSeconds(0.001f);
|
|
Links.x.sensory.SetMagicaClothState(true);
|
|
}
|
|
character.SetRotation(pavuraOfficePoint.transform.rotation, false, true);
|
|
character = null;
|
|
pavuraOfficePoint = null;
|
|
num = i;
|
|
}
|
|
Links.x.cameraEffects.ToggleInteriorExterior(Links.x.main);
|
|
bool isFollowing = Links.x.rtsCamera.IsFollowing;
|
|
Links.x.rtsCamera.Follow(Links.x.main.tr, Links.x.main, true);
|
|
Links.x.rtsCamera.JumpTo(Links.x.main.tr, true);
|
|
Links.x.main.SetAsLeader();
|
|
yield return new WaitForSeconds(0.5f);
|
|
Character pavura = Links.x.diorama.FindCharacterAnyState("Pavura");
|
|
pavura.SetRotation(Quaternion.LookRotation(pavura.tr.position - Links.x.main.tr.position), false, true);
|
|
Links.x.diorama.ToggleSceneCameras(true, "C");
|
|
Links.x.rtsCamera.CopyPerspectiveCamera(Links.x.diorama.activeView.sceneCamera, null, pavura);
|
|
yield return new WaitForSeconds(0.1f);
|
|
pavura.SetRotation(Quaternion.LookRotation(pavura.tr.position - Links.x.main.tr.position), false, true);
|
|
yield return new WaitForSeconds(0.1f);
|
|
pavura.SetRotation(Quaternion.LookRotation(pavura.tr.position - Links.x.main.tr.position), false, true);
|
|
yield return new WaitForSeconds(0.1f);
|
|
pavura.SetRotation(Quaternion.LookRotation(pavura.tr.position - Links.x.main.tr.position), false, true);
|
|
yield return new WaitForSeconds(0.1f);
|
|
pavura.SetRotation(Quaternion.LookRotation(pavura.tr.position - Links.x.main.tr.position), false, true);
|
|
if (Links.x.cameraEffects.gameFade.enabled)
|
|
{
|
|
Links.x.cameraEffects.FinishFade();
|
|
}
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
Links.x.follow.position = Links.x.main.tr.position + new Vector3(0f, 3f, 0f);
|
|
yield return new WaitForSeconds(3f);
|
|
Links.x.gameplay.StartDialogue(pavura, Links.x.main, null, null, pavura.stats.dialogueFile);
|
|
yield return new WaitForSeconds(3f);
|
|
pavura.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - pavura.tr.position), false, true);
|
|
this.pavuraWalk = null;
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CBB RID: 3259 RVA: 0x000F863C File Offset: 0x000F683C
|
|
public void EndPavura()
|
|
{
|
|
if (this.endPavura == null)
|
|
{
|
|
this.endPavura = this.EndPavuraDialogue();
|
|
base.StartCoroutine(this.endPavura);
|
|
}
|
|
}
|
|
|
|
// Token: 0x06000CBC RID: 3260 RVA: 0x000F865F File Offset: 0x000F685F
|
|
private IEnumerator EndPavuraDialogue()
|
|
{
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
Links.x.follow.position = Links.x.main.tr.position + new Vector3(0f, 3f, 0f);
|
|
QuestLog.SetQuestState("CharacterCreation", QuestState.Active);
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
Character pavura = Links.x.diorama.FindCharacterAnyState("Pavura");
|
|
Shader.SetGlobalFloat("_CloseUp", 1f);
|
|
Shader.SetGlobalFloat("_Perspective", 1f);
|
|
pavura.patrolHoldTime = float.PositiveInfinity;
|
|
pavura.ignoreRemoveControls = true;
|
|
GraphNode i = pavura.NearNode(Links.x.diorama.playerStartDefault.position, true, 0, -1, 0);
|
|
pavura.MakePath(i, 30, false, false, true);
|
|
GameObject gameObject = GameObject.Find("The Pavura GuardA");
|
|
GameObject gameObject2 = GameObject.Find("The Pavura GuardB");
|
|
CreatureActions creatureA = gameObject.GetComponent<CreatureActions>();
|
|
CreatureActions creatureB = gameObject2.GetComponent<CreatureActions>();
|
|
if (creatureA)
|
|
{
|
|
yield return new WaitForSeconds(1f);
|
|
Character firstCharacter = creatureA.GetFirstCharacter();
|
|
firstCharacter.patrolHoldTime = float.PositiveInfinity;
|
|
firstCharacter.ignoreRemoveControls = true;
|
|
firstCharacter.MakePath(i, 30, false, false, true);
|
|
yield return new WaitForSeconds(0.5f);
|
|
Character firstCharacter2 = creatureB.GetFirstCharacter();
|
|
firstCharacter2.patrolHoldTime = float.PositiveInfinity;
|
|
firstCharacter2.ignoreRemoveControls = true;
|
|
firstCharacter2.MakePath(i, 30, false, false, true);
|
|
}
|
|
GameObject gameObject3 = GameObject.Find("Mihal the Scribe");
|
|
CreatureActions scribeA = gameObject3.GetComponent<CreatureActions>();
|
|
yield return new WaitForSeconds(5f);
|
|
Links.x.gaia.PlayFade("Out", "Scaled");
|
|
yield return new WaitForSeconds(0.5f);
|
|
if (creatureA)
|
|
{
|
|
pavura.Missing();
|
|
creatureA.GetFirstCharacter().Missing();
|
|
creatureB.GetFirstCharacter().Missing();
|
|
}
|
|
Links.x.diorama.GetIndoorView();
|
|
Links.x.rtsCamera.ReturnOrthographicCamera();
|
|
Links.x.cameraEffects.ToggleInteriorExterior(Links.x.main);
|
|
Links.x.rtsCamera.Follow(Links.x.main.tr, Links.x.main, true);
|
|
Links.x.rtsCamera.JumpTo(Links.x.main.tr, true);
|
|
Links.x.gaia.loadingCharacterCreation = false;
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
scribeA.GetFirstCharacter();
|
|
scribeA.GetFirstCharacter().stats.initiateDialogue = 12;
|
|
scribeA.GetFirstCharacter().stats.canTalk = true;
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.dialogue.SetSkipKey(true);
|
|
Links.x.gaia.PlayFade("In", "Scaled");
|
|
yield return new WaitForSeconds(0.5f);
|
|
Records.x.TriggerGlobalSave("CheckpointSave", true);
|
|
while (Records.x.saving)
|
|
{
|
|
yield return null;
|
|
}
|
|
yield return new WaitForSeconds(1f);
|
|
Records.x.RemoveControls(false);
|
|
Links.x.hudControl.ChangeHudVisibility(true, true);
|
|
Links.x.cameraEffects.ToggleObscurance();
|
|
Shader.SetGlobalFloat("_CloseUp", 0f);
|
|
Shader.SetGlobalFloat("_Perspective", 0f);
|
|
Records.x.AddQuestToTimer("C6_GobletGuildThievesA", 72f, "unassigned", "active", false);
|
|
Records.x.AddQuestToTimer("C6_GobletGuildThievesB", 72f, "unassigned", "active", false);
|
|
Records.x.AddQuestToTimer("C6_GobletGuildThievesC", 72f, "unassigned", "active", false);
|
|
this.endPavura = null;
|
|
if (Records.x.demo)
|
|
{
|
|
this.EndDemoInOffice();
|
|
}
|
|
else
|
|
{
|
|
Object.Destroy(this);
|
|
}
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CBD RID: 3261 RVA: 0x000F8670 File Offset: 0x000F6870
|
|
public void MovePosition(Character character, GraphNode g, bool isInterior)
|
|
{
|
|
character.SetPosition((Vector3)g.position, null);
|
|
character.ClaimNode(g, (Vector3)g.position, true);
|
|
character.sphere.transform.position = (Vector3)g.position;
|
|
if (character.circleTr)
|
|
{
|
|
character.circleTr.position = character.tr.position;
|
|
}
|
|
character.SetMoveFollowPosition((Vector3)g.position);
|
|
character.doorID = "";
|
|
character.indoorID = "";
|
|
if (isInterior)
|
|
{
|
|
if (Links.x.diorama.GetIndoorView())
|
|
{
|
|
character.indoorID = Links.x.diorama.GetIndoorView().GetInteriorBoundsName((Vector3)g.position);
|
|
}
|
|
else
|
|
{
|
|
character.indoorID = "?";
|
|
}
|
|
}
|
|
character.ChangeTorchLight();
|
|
character.FirstPosition(g);
|
|
}
|
|
|
|
// Token: 0x06000CBE RID: 3262 RVA: 0x000F875F File Offset: 0x000F695F
|
|
public void TalkToWitch(Character messenger, Vector3 startPoint)
|
|
{
|
|
base.StartCoroutine(this.TalkToWitchWait(messenger, startPoint));
|
|
}
|
|
|
|
// Token: 0x06000CBF RID: 3263 RVA: 0x000F8770 File Offset: 0x000F6970
|
|
private IEnumerator TalkToWitchWait(Character messenger, Vector3 startPoint)
|
|
{
|
|
if (messenger && !messenger.stunned && !messenger.dead)
|
|
{
|
|
while (!this.CanTalk(messenger, startPoint, false, false, true, 10f))
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Links.x.cameraEffects.transitioning)
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.EndPath();
|
|
DialogueLua.SetVariable("C6_WitchPrompt", true);
|
|
Links.x.gameplay.StartDialogue(messenger, Links.x.main, null, null, messenger.stats.dialogueFile);
|
|
yield return new WaitForSecondsRealtime(1f);
|
|
while (Records.x.dialogue)
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.creatures.stopPatrolTemporarily = false;
|
|
messenger.MakePath(messenger.creatures.GetWalkNodeIndex(0), 200, false, false, false);
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CC0 RID: 3264 RVA: 0x000F878D File Offset: 0x000F698D
|
|
public void BanquetIsleFriend(Character messenger, Vector3 startPoint)
|
|
{
|
|
base.StartCoroutine(this.BanquetIsleFriendWait(messenger, startPoint));
|
|
}
|
|
|
|
// Token: 0x06000CC1 RID: 3265 RVA: 0x000F879E File Offset: 0x000F699E
|
|
private IEnumerator BanquetIsleFriendWait(Character messenger, Vector3 startPoint)
|
|
{
|
|
if (messenger && !messenger.stunned && !messenger.dead)
|
|
{
|
|
messenger.StartQuip("Hold!");
|
|
Debug.Log("Starting friend cinematic");
|
|
while (!this.CanTalk(messenger, startPoint, true, true, false, 10f))
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.EndPath();
|
|
Character nearestPartyInRoom = Links.x.GetNearestPartyInRoom(messenger.tr.position, null, 400f, messenger.indoorID, true);
|
|
Character character = Links.x.diorama.FindCharacter("BanquetIsleFriend2");
|
|
if (character && (character.dead || character.stunned))
|
|
{
|
|
character = null;
|
|
}
|
|
Links.x.gameplay.StartDialogue(messenger, nearestPartyInRoom, character, null, messenger.stats.dialogueFile);
|
|
yield return new WaitForSecondsRealtime(1f);
|
|
while (Records.x.dialogue)
|
|
{
|
|
yield return null;
|
|
}
|
|
yield return new WaitForSeconds(0.25f);
|
|
if (Records.x.needsCompanionTooltip || Records.x.editor)
|
|
{
|
|
Links.x.hudControl.ShowTutorialTooltip("Companion");
|
|
}
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CC2 RID: 3266 RVA: 0x000F87BB File Offset: 0x000F69BB
|
|
public void BanquetIsleFriendLeave(Character messenger, Vector3 startPoint)
|
|
{
|
|
base.StartCoroutine(this.BanquetIsleFriendLeaveWait(messenger, startPoint));
|
|
}
|
|
|
|
// Token: 0x06000CC3 RID: 3267 RVA: 0x000F87CC File Offset: 0x000F69CC
|
|
private bool IsPlayingAsMain()
|
|
{
|
|
return Links.x.main && Links.x.main.stats.partyID == 0;
|
|
}
|
|
|
|
// Token: 0x06000CC4 RID: 3268 RVA: 0x000F87F8 File Offset: 0x000F69F8
|
|
private IEnumerator BanquetIsleFriendLeaveWait(Character messenger, Vector3 startPoint)
|
|
{
|
|
if (messenger)
|
|
{
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.paused)
|
|
{
|
|
if (!Records.x.secrets && !Records.x.editor)
|
|
{
|
|
break;
|
|
}
|
|
yield return null;
|
|
}
|
|
while (messenger.dead)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (!this.CanTalk(messenger, startPoint, true, true, false, 40f) && this.IsPlayingAsMain())
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.TogglePause(false);
|
|
Records.x.RemoveControls(true);
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
messenger.EndPath();
|
|
messenger.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - messenger.tr.position), false, false);
|
|
if (this.IsPlayingAsMain())
|
|
{
|
|
Links.x.rtsCamera.puzzleTarget = messenger.transform.gameObject;
|
|
}
|
|
else
|
|
{
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.transform.gameObject;
|
|
}
|
|
Links.x.rtsCamera.Zoom(true, "Dialogue");
|
|
if (this.IsPlayingAsMain())
|
|
{
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", messenger.gameObject.transform.position);
|
|
}
|
|
else
|
|
{
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", Links.x.main.gameObject.transform.position);
|
|
}
|
|
Links.x.gaia.FadeOutPlaylist(true, 0.5f);
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Choking", Links.x.main.transform.position, 0.6f, new float?(1f), 0.1f, "", null);
|
|
yield return new WaitForSeconds(0.5f);
|
|
messenger.PlayAnimation("Hit", 0f);
|
|
Character npc2 = Links.x.GetCreationID(2);
|
|
messenger.animator.SetBool("Combat", true);
|
|
if (npc2)
|
|
{
|
|
npc2.animator.SetBool("Combat", true);
|
|
npc2.PlayAnimation("Hit", 0f);
|
|
}
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Vine", Links.x.main.transform.position, 0.7f, new float?(1f), 0.1f, "", null);
|
|
Links.x.cinematicFX.gameObject.SetActive(true);
|
|
Links.x.cinematicFX.gameObject.GetComponent<HannahAnimator>().Play("Idle");
|
|
Vector3 position = messenger.body.faceRenderer.transform.position;
|
|
Vector3 vector = Links.x.worldCamera.WorldToScreenPoint(position);
|
|
vector.z = 0f;
|
|
vector.x = vector.x * (1920f / (float)Screen.width) - 960f;
|
|
vector.y = vector.y * (Links.x.canvasRT.sizeDelta.y / (float)Screen.height) - Links.x.canvasRT.sizeDelta.y / 2f;
|
|
Links.x.cinematicFX.localPosition = vector;
|
|
GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(78);
|
|
pooledGameObject.transform.position = messenger.tr.position + new Vector3(0f, 1f, 0f);
|
|
pooledGameObject.SetActive(true);
|
|
Character creationID = Links.x.GetCreationID(0);
|
|
if (creationID.dead)
|
|
{
|
|
creationID.PartyResurrect(-1);
|
|
}
|
|
messenger.RemoveFromParty(true);
|
|
messenger.SetMeshState(true);
|
|
if (npc2)
|
|
{
|
|
npc2.RemoveFromParty(true);
|
|
GameObject pooledGameObject2 = Links.x.cellar.GetPooledGameObject(78);
|
|
pooledGameObject2.transform.position = npc2.tr.position + new Vector3(0f, 1f, 0f);
|
|
pooledGameObject2.SetActive(true);
|
|
npc2.SetMeshState(true);
|
|
}
|
|
yield return new WaitForSeconds(1f);
|
|
messenger.creatures.SetTemperament(2);
|
|
if (npc2)
|
|
{
|
|
npc2.creatures.SetTemperament(2);
|
|
}
|
|
messenger.body.faceRenderer.material.SetTexture("_MainTex", Links.x.cinematicLachoTextureSwap1);
|
|
QuestLog.SetQuestState("F5_BanquetFriend", QuestState.Success);
|
|
Links.x.gameplay.StartDialogue(messenger, Links.x.main, null, null, messenger.stats.dialogueFile);
|
|
yield return new WaitForSeconds(0.5f);
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", new Vector3(-100000f, -100000f, -100000f));
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.gameObject;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Links.x.rtsCamera.puzzleTarget = null;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Records.x.RemoveControls(false);
|
|
Links.x.rtsCamera.Zoom(false, "Dialogue");
|
|
QuestLog.SetQuestState("F5_BanquetFriend", QuestState.Complete);
|
|
while (Records.x.dialogue)
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.body.faceRenderer.material.SetTexture("_MainTex", Links.x.cinematicLachoTextureSwap2);
|
|
npc2.body.faceRenderer.material.SetTexture("_MainTex", Links.x.cinematicLachoTextureSwap2);
|
|
if (messenger == Links.x.main || npc2 == Links.x.main)
|
|
{
|
|
Character creationID2 = Links.x.GetCreationID(0);
|
|
creationID2.SetAsLeader();
|
|
Links.x.fellowship.SingleSelected(creationID2);
|
|
creationID2.AddToSelected(false, true);
|
|
creationID2.SetAsLeader();
|
|
Links.x.rtsCamera.JumpTo(creationID2.tr.position, creationID2, true);
|
|
Links.x.rtsCamera.Follow(creationID2.tr, creationID2, true);
|
|
}
|
|
while (!Records.x.combat)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (messenger && !messenger.dead)
|
|
{
|
|
messenger.hostility = 2;
|
|
messenger.FullAttackTime();
|
|
messenger.stats.AddActionTimeMod(-2f);
|
|
messenger.UpdateLKP(Links.x.main, Links.x.main.node, "Seen", true);
|
|
Links.x.combat.GetNextAction(messenger);
|
|
}
|
|
if (npc2 && !npc2.dead)
|
|
{
|
|
npc2.creatures.SetTemperament(2);
|
|
npc2.hostility = 2;
|
|
npc2.FullAttackTime();
|
|
npc2.stats.AddActionTimeMod(-1f);
|
|
npc2.UpdateLKP(Links.x.main, Links.x.main.node, "Seen", true);
|
|
Links.x.combat.GetNextAction(npc2);
|
|
}
|
|
if (messenger == Links.x.main || npc2 == Links.x.main)
|
|
{
|
|
Character creationID3 = Links.x.GetCreationID(0);
|
|
creationID3.SetAsLeader();
|
|
Links.x.fellowship.SingleSelected(creationID3);
|
|
creationID3.AddToSelected(false, true);
|
|
creationID3.SetAsLeader();
|
|
Links.x.rtsCamera.JumpTo(creationID3.tr.position, creationID3, true);
|
|
Links.x.rtsCamera.Follow(creationID3.tr, creationID3, true);
|
|
}
|
|
Links.x.protagonist = Links.x.main;
|
|
npc2 = null;
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CC5 RID: 3269 RVA: 0x000F8815 File Offset: 0x000F6A15
|
|
public void BanquetIslePriest(Character messenger, Vector3 startPoint)
|
|
{
|
|
base.StartCoroutine(this.BanquetIslePriestWait(messenger, startPoint));
|
|
}
|
|
|
|
// Token: 0x06000CC6 RID: 3270 RVA: 0x000F8826 File Offset: 0x000F6A26
|
|
private IEnumerator BanquetIslePriestWait(Character messenger, Vector3 startPoint)
|
|
{
|
|
if (messenger && !messenger.stunned && !messenger.dead)
|
|
{
|
|
Debug.Log("Starting banquet isle priest");
|
|
if (Links.x.soundtrack.currentSoundtrack != "Banquet Isle")
|
|
{
|
|
Links.x.gaia.SetPlaylist("Banquet Isle", true, 0f);
|
|
}
|
|
while (!this.CanTalk(messenger, startPoint, true, false, false, 20f))
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.paused && (Records.x.secrets || Records.x.editor))
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.TogglePause(false);
|
|
Records.x.RemoveControls(true);
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
messenger.EndPath();
|
|
messenger.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - messenger.tr.position), false, false);
|
|
Links.x.rtsCamera.puzzleTarget = messenger.transform.gameObject;
|
|
Links.x.rtsCamera.Zoom(true, "Dialogue");
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", messenger.gameObject.transform.position);
|
|
yield return new WaitForEndOfFrame();
|
|
while (messenger.turning)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.IsSaving())
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.StartQuip("Help! I cannot resist him!");
|
|
MasterAudio.PlaySound3DAtVector3AndForget("BloodlessTurn", messenger.transform.position, 1f, new float?(1f), 0f, "", null);
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Choking", messenger.transform.position, 0.6f, new float?(1f), 0.1f, "", null);
|
|
yield return new WaitForSeconds(0.5f);
|
|
messenger.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - messenger.tr.position), true, false);
|
|
messenger.PlayAnimation("Distress", 0f);
|
|
messenger.inAction = true;
|
|
messenger.inActionTime = Links.x.gameplay.seconds;
|
|
messenger.animator.SetBool("Combat", true);
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Vine", messenger.transform.position, 0.7f, new float?(1f), 0.1f, "", null);
|
|
Links.x.cinematicFX.gameObject.SetActive(true);
|
|
Links.x.cinematicFX.gameObject.GetComponent<HannahAnimator>().Play("Idle");
|
|
Vector3 position = messenger.body.faceRenderer.transform.position;
|
|
Vector3 vector = Links.x.worldCamera.WorldToScreenPoint(position);
|
|
vector.z = 0f;
|
|
vector.x = vector.x * (1920f / (float)Screen.width) - 960f;
|
|
vector.y = vector.y * (Links.x.canvasRT.sizeDelta.y / (float)Screen.height) - Links.x.canvasRT.sizeDelta.y / 2f;
|
|
Links.x.cinematicFX.localPosition = vector;
|
|
GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(78);
|
|
pooledGameObject.transform.position = messenger.tr.position + new Vector3(0f, 1f, 0f);
|
|
pooledGameObject.SetActive(true);
|
|
messenger.creatures.SetTemperament(2);
|
|
messenger.body.faceRenderer.material.SetTexture("_MainTex", Links.x.cinematicLachoTextureSwap1);
|
|
messenger.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - messenger.tr.position), true, false);
|
|
yield return new WaitForSeconds(2.5f);
|
|
messenger.inAction = false;
|
|
messenger.SetRotation(Quaternion.LookRotation(Links.x.main.tr.position - messenger.tr.position), true, false);
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", new Vector3(-100000f, -100000f, -100000f));
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.gameObject;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.rtsCamera.puzzleTarget = null;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Records.x.RemoveControls(false);
|
|
Links.x.rtsCamera.Zoom(false, "Dialogue");
|
|
messenger.hostility = 2;
|
|
if (Vector3.Distance(messenger.tr.position, Links.x.main.tr.position) < 30f)
|
|
{
|
|
messenger.UpdateLKP(Links.x.main, Links.x.main.node, "Seen", true);
|
|
Links.x.sensory.AddPlayerToCombat(messenger, Links.x.main, true, false, false);
|
|
if (!Records.x.combat && !messenger.dead && !messenger.stunned)
|
|
{
|
|
Links.x.combat.StartCombat(Links.x.main, messenger, false, true);
|
|
}
|
|
messenger.FullAttackTime();
|
|
}
|
|
QuestLog.SetQuestState("F5_BanquetPriest", QuestState.Success);
|
|
yield return new WaitForSeconds(1f);
|
|
while (messenger.inAction || messenger.inRecovery)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Records.x.needsAttackTooltip || Records.x.editor)
|
|
{
|
|
Links.x.hudControl.ShowTutorialTooltip("Attack");
|
|
}
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CC7 RID: 3271 RVA: 0x000F8843 File Offset: 0x000F6A43
|
|
public void TalkToPartyPaduriiChildQuest(Character messenger, Vector3 startPoint)
|
|
{
|
|
base.StartCoroutine(this.TalkToPartyPaduriiChildQuestWait(messenger, startPoint));
|
|
}
|
|
|
|
// Token: 0x06000CC8 RID: 3272 RVA: 0x000F8854 File Offset: 0x000F6A54
|
|
private IEnumerator TalkToPartyPaduriiChildQuestWait(Character messenger, Vector3 startPoint)
|
|
{
|
|
if (messenger && !messenger.stunned && !messenger.dead)
|
|
{
|
|
messenger.ignoreRemoveControls = true;
|
|
while (!this.CanTalk(messenger, startPoint, false, false, true, 8f))
|
|
{
|
|
yield return null;
|
|
}
|
|
while (messenger.moving)
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.StartDialogue(messenger, Links.x.main, null, null, messenger.stats.dialogueFile);
|
|
yield return new WaitForSecondsRealtime(1f);
|
|
while (Records.x.dialogue)
|
|
{
|
|
yield return null;
|
|
}
|
|
messenger.ignoreNodeIDs = false;
|
|
messenger.creatures.stopPatrolTemporarily = false;
|
|
messenger.ignoreRemoveControls = false;
|
|
messenger.MakePath(messenger.creatures.GetWalkNodeIndex(0), 200, false, false, false);
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CC9 RID: 3273 RVA: 0x000F8874 File Offset: 0x000F6A74
|
|
private bool CanTalk(Character messenger, Vector3 startPoint, bool canInterruptCombat, bool run, bool checkStartPoint, float dist)
|
|
{
|
|
if (Records.x.InCombat(false) && !canInterruptCombat)
|
|
{
|
|
return false;
|
|
}
|
|
if (Records.x.removeControls && !messenger.ignoreRemoveControls)
|
|
{
|
|
return false;
|
|
}
|
|
if (Records.x.paused)
|
|
{
|
|
return false;
|
|
}
|
|
if (Records.x.inMenus)
|
|
{
|
|
return false;
|
|
}
|
|
if (Records.x.dialogue)
|
|
{
|
|
return false;
|
|
}
|
|
if (!Links.x.hasMain)
|
|
{
|
|
return false;
|
|
}
|
|
if (Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
return false;
|
|
}
|
|
if (Links.x.cameraEffects.transitioning)
|
|
{
|
|
return false;
|
|
}
|
|
if (messenger.sleeping)
|
|
{
|
|
return false;
|
|
}
|
|
if (messenger.dead || messenger.stunned)
|
|
{
|
|
return false;
|
|
}
|
|
if (Links.x.main.followingType != "")
|
|
{
|
|
return false;
|
|
}
|
|
float num = 6400f;
|
|
float sqrMagnitude = (messenger.tr.position - startPoint).sqrMagnitude;
|
|
if (sqrMagnitude > num && checkStartPoint)
|
|
{
|
|
messenger.creatures.stopPatrolTemporarily = false;
|
|
return false;
|
|
}
|
|
if (!checkStartPoint || (checkStartPoint && sqrMagnitude <= num))
|
|
{
|
|
if ((Links.x.main.tr.position - new Vector3(messenger.tr.position.x, Links.x.main.tr.position.y, messenger.tr.position.z)).sqrMagnitude < dist * dist)
|
|
{
|
|
return true;
|
|
}
|
|
if (messenger.creatures)
|
|
{
|
|
messenger.creatures.stopPatrolTemporarily = true;
|
|
}
|
|
if (messenger.moving)
|
|
{
|
|
return false;
|
|
}
|
|
if (messenger.waitingForPath > 0 || messenger.NodesCount() > 0)
|
|
{
|
|
return false;
|
|
}
|
|
GraphNode graphNode = messenger.NearNode(Links.x.main.tr.position + Quaternion.LookRotation(messenger.tr.position - Links.x.main.tr.position) * Vector3.forward * 5f, true, 0, -1, 0);
|
|
if (graphNode != null)
|
|
{
|
|
messenger.running = run;
|
|
messenger.MakePath(graphNode, 100, false, false, true);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Token: 0x06000CCA RID: 3274 RVA: 0x000F8AB2 File Offset: 0x000F6CB2
|
|
public void ClearGhostFog(GameObject go)
|
|
{
|
|
base.StartCoroutine(this.ClearFog(go));
|
|
}
|
|
|
|
// Token: 0x06000CCB RID: 3275 RVA: 0x000F8AC2 File Offset: 0x000F6CC2
|
|
private IEnumerator ClearFog(GameObject go)
|
|
{
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (Records.x.paused)
|
|
{
|
|
if (!Records.x.secrets && !Records.x.editor)
|
|
{
|
|
break;
|
|
}
|
|
yield return null;
|
|
}
|
|
while (Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.combat.EndCombat(false);
|
|
while (Records.x.InCombat(false))
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.TogglePause(false);
|
|
Records.x.RemoveControls(true);
|
|
Shader.SetGlobalFloat("_CinematicGhostFow", 0f);
|
|
Shader.SetGlobalFloat("_CinematicGhostFade", 0f);
|
|
Debug.Log("Ghost fog cinematics");
|
|
List<Transform> trs = new List<Transform>();
|
|
foreach (object obj in go.transform)
|
|
{
|
|
Transform transform = (Transform)obj;
|
|
if (transform != go.transform)
|
|
{
|
|
trs.Add(transform);
|
|
}
|
|
}
|
|
int childCount = trs.Count;
|
|
SceneCamera sceneCamera = null;
|
|
Links.x.gaia.SetPlaylist("Banquet Isle", true, 0f);
|
|
yield return new WaitForSeconds(0.5f);
|
|
int num2;
|
|
for (int i = 0; i < childCount; i = num2 + 1)
|
|
{
|
|
Links.x.fogOfWar.saveFow = false;
|
|
Links.x.fogOfWarInterior.saveFow = false;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Links.x.rtsCamera.puzzleSnapCamera = true;
|
|
Links.x.fadeAnimator.enabled = true;
|
|
Links.x.fadeAnimator.Play("CinematicQuickFade");
|
|
yield return new WaitForSecondsRealtime(0.14f);
|
|
Links.x.diorama.GhostMaterials();
|
|
Shader.SetGlobalFloat("_CinematicGhostFow", 1f);
|
|
Shader.SetGlobalFloat("_CinematicGhostFade", 0f);
|
|
Links.x.hoverObject = trs[i].gameObject;
|
|
Shader.SetGlobalVector("_DoorLightPosition", trs[i].position + new Vector3(0f, 3f, 0f));
|
|
Records.x.hoverLightColor = Color.white * 0.3f;
|
|
Shader.SetGlobalFloat("_DoorLightRange", 30f);
|
|
Links.x.rtsCamera.puzzleTarget = trs[i].gameObject;
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", trs[i].gameObject.transform.position);
|
|
if (i == 0 && Records.x.inspectCamera && Records.x.inspecting)
|
|
{
|
|
this.FlipToOrthographic(out sceneCamera);
|
|
}
|
|
yield return new WaitForSeconds(0.25f);
|
|
float startValue = 0f;
|
|
float endValue = 1f;
|
|
float timeToLerp = 1.5f;
|
|
float percentage = 0f;
|
|
float startTime = Time.time;
|
|
while (percentage < 1f)
|
|
{
|
|
percentage = (Time.time - startTime) / timeToLerp;
|
|
float num = Mathf.Lerp(startValue, endValue, percentage);
|
|
Shader.SetGlobalFloat("_CinematicGhostFade", num);
|
|
yield return null;
|
|
}
|
|
foreach (object obj2 in trs[i])
|
|
{
|
|
((Transform)obj2).gameObject.SetActive(true);
|
|
}
|
|
MasterAudio.PlaySound("Ghost Fog Gone", Random.Range(0.6f, 0.8f), new float?(Random.Range(0.8f, 1.2f)), 0f, "", null, false, false);
|
|
yield return new WaitForSeconds(2.5f);
|
|
num2 = i;
|
|
}
|
|
Links.x.fadeAnimator.enabled = true;
|
|
Links.x.fadeAnimator.Play("CinematicQuickFade");
|
|
yield return new WaitForSeconds(0.12f);
|
|
Links.x.diorama.GhostFogOff();
|
|
Shader.SetGlobalFloat("_CinematicGhostFow", 0f);
|
|
Shader.SetGlobalFloat("_CinematicGhostFade", 0f);
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", new Vector3(-100000f, -100000f, -100000f));
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.gameObject;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
yield return new WaitForSeconds(0.01f);
|
|
Links.x.rtsCamera.puzzleTarget = null;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Links.x.rtsCamera.puzzleSnapCamera = false;
|
|
yield return new WaitForSeconds(0.5f);
|
|
MasterAudio.PlaySoundAndForget("Feedback", 0.4f, new float?(1f), 0f, "DialogueStatPass", null);
|
|
Links.x.gameFeed.AddFeed("The air around you is lighter");
|
|
yield return new WaitForSeconds(0.5f);
|
|
Records.x.RemoveControls(false);
|
|
Links.x.fogOfWar.saveFow = true;
|
|
Links.x.fogOfWarInterior.saveFow = true;
|
|
Links.x.questEnd.QuestEnded("C6_Ghosts");
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CCC RID: 3276 RVA: 0x000F8AD8 File Offset: 0x000F6CD8
|
|
private SceneCamera FlipToOrthographic(out SceneCamera prevView)
|
|
{
|
|
prevView = null;
|
|
if (Records.x.inspectCamera)
|
|
{
|
|
prevView = Records.x.previousView;
|
|
SceneCamera inspectCamera = Records.x.inspectCamera;
|
|
Records.x.inspecting = false;
|
|
Links.x.rtsCamera.ReturnOrthographicCamera();
|
|
Links.x.rtsCamera.Follow(Links.x.main.tr, Links.x.main, true);
|
|
Links.x.rtsCamera.JumpTo(Links.x.main.tr, true);
|
|
Links.x.diorama.ToggleSceneCameras(false, "");
|
|
Records.x.inspectCamera = null;
|
|
return inspectCamera;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Token: 0x06000CCD RID: 3277 RVA: 0x000F8B98 File Offset: 0x000F6D98
|
|
private bool CanStartCinematic()
|
|
{
|
|
return Links.x.gaia.sceneLoaded && !Records.x.InCombat(false) && !Records.x.inMenus && !Records.x.paused && !Records.x.pocketPause && !Records.x.removeControls && !Records.x.saving && !Links.x.rtsCamera.puzzleTarget && !Links.x.combat.inPocketAttack && !Links.x.combat.inRally;
|
|
}
|
|
|
|
// Token: 0x06000CCE RID: 3278 RVA: 0x000F8C40 File Offset: 0x000F6E40
|
|
private bool Nearby(Character c, string startIndoorID, Vector3 center, float dist)
|
|
{
|
|
return c && !(c.indoorID != startIndoorID) && (c.tr.position - center).sqrMagnitude <= dist * dist;
|
|
}
|
|
|
|
// Token: 0x06000CCF RID: 3279 RVA: 0x000F8C8C File Offset: 0x000F6E8C
|
|
public void PromptLook(Character hitCharacter, PromptActions promptActions, GameObject lookTarget, bool isRogue, bool isCharmer, int roll, string rollString, string diffString)
|
|
{
|
|
base.StartCoroutine(this.OrchestratePromptLook(hitCharacter, promptActions, lookTarget, isRogue, isCharmer, roll, rollString, diffString));
|
|
}
|
|
|
|
// Token: 0x06000CD0 RID: 3280 RVA: 0x000F8CB4 File Offset: 0x000F6EB4
|
|
private IEnumerator OrchestratePromptLook(Character hitCharacter, PromptActions promptActions, GameObject lookTarget, bool isRogue, bool isCharmer, int roll, string rollString, string diffString)
|
|
{
|
|
string startIndoorID = hitCharacter.indoorID;
|
|
while (!this.CanStartCinematic())
|
|
{
|
|
yield return null;
|
|
}
|
|
if (hitCharacter && promptActions.gameObject.activeSelf)
|
|
{
|
|
Vector3 center = lookTarget.transform.position;
|
|
Debug.Log(string.Concat(new string[]
|
|
{
|
|
"Starting prompt sequence ",
|
|
(hitCharacter != null) ? hitCharacter.ToString() : null,
|
|
" ",
|
|
(lookTarget != null) ? lookTarget.ToString() : null,
|
|
" ",
|
|
isRogue.ToString(),
|
|
" ",
|
|
isCharmer.ToString(),
|
|
" ",
|
|
roll.ToString(),
|
|
" ",
|
|
(promptActions != null) ? promptActions.ToString() : null
|
|
}));
|
|
while (!this.Nearby(hitCharacter, startIndoorID, lookTarget.transform.position, 50f) || !this.CanStartCinematic())
|
|
{
|
|
yield return null;
|
|
}
|
|
if (promptActions.gameObject.activeSelf)
|
|
{
|
|
Records.x.RemoveControls(true);
|
|
Links.x.fellowship.StopWalking(true);
|
|
Links.x.rtsCamera.puzzleLerp = true;
|
|
Links.x.rtsCamera.puzzleTarget = lookTarget.transform.gameObject;
|
|
Links.x.rtsCamera.Zoom(true, "Dialogue");
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", center);
|
|
if (Links.x.cameraEffects.indoors)
|
|
{
|
|
Links.x.hoverObject = lookTarget;
|
|
Shader.SetGlobalVector("_DoorLightPosition", center + new Vector3(0f, 3f, 0f));
|
|
Records.x.hoverLightColor = Color.white * 0.1f;
|
|
Shader.SetGlobalFloat("_DoorLightRange", 15f);
|
|
}
|
|
if (lookTarget == hitCharacter.gameObject)
|
|
{
|
|
if (isRogue)
|
|
{
|
|
hitCharacter.StartQuip(promptActions.SkillQuip(promptActions.prompt.rangerQuip, hitCharacter.stats.race));
|
|
}
|
|
else if (isCharmer)
|
|
{
|
|
hitCharacter.StartQuip(promptActions.SkillQuip(promptActions.prompt.charmerQuip, hitCharacter.stats.race));
|
|
}
|
|
else if (promptActions.prompt.type == Prompts.types.quip)
|
|
{
|
|
string text = promptActions.prompt.conversation;
|
|
if (text == "")
|
|
{
|
|
text = promptActions.prompt.textID;
|
|
}
|
|
hitCharacter.StartQuip(promptActions.Quip(text, promptActions.characterName, hitCharacter.stats.race));
|
|
}
|
|
}
|
|
if (isRogue)
|
|
{
|
|
promptActions.FinishRogueCheck(hitCharacter, roll);
|
|
MasterAudio.PlaySoundAndForget("Feedback", 1f, new float?(1f), 0f, "DialogueStatPass", null);
|
|
}
|
|
else if (isCharmer)
|
|
{
|
|
promptActions.FinishCharmerCheck(hitCharacter, roll);
|
|
MasterAudio.PlaySoundAndForget("Feedback", 1f, new float?(1f), 0f, "DialogueStatPass", null);
|
|
}
|
|
else if (promptActions.prompt.type == Prompts.types.quip)
|
|
{
|
|
promptActions.FinishQuip();
|
|
}
|
|
float num = 1.75f;
|
|
if (isCharmer || isRogue || lookTarget != hitCharacter.gameObject)
|
|
{
|
|
num = 2f;
|
|
}
|
|
bool flag = false;
|
|
if (promptActions.gameObject.transform.childCount == 3)
|
|
{
|
|
flag = true;
|
|
}
|
|
if (!flag)
|
|
{
|
|
if (Links.x.worldCamera.orthographic)
|
|
{
|
|
yield return new WaitForSeconds(num);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Vector3 vector = promptActions.gameObject.transform.GetChild(0).position;
|
|
vector.y -= 0.5f;
|
|
Links.x.footstep.SetActive(true);
|
|
Links.x.footstep.transform.position = vector;
|
|
yield return new WaitForSeconds(0.95f);
|
|
Links.x.footstep.SetActive(false);
|
|
yield return new WaitForSeconds(0.05f);
|
|
Links.x.footstep.SetActive(true);
|
|
vector = promptActions.gameObject.transform.GetChild(1).position;
|
|
vector.y -= 0.5f;
|
|
Links.x.footstep.transform.position = vector;
|
|
yield return new WaitForSeconds(0.95f);
|
|
Links.x.footstep.SetActive(false);
|
|
yield return new WaitForSeconds(0.05f);
|
|
Links.x.footstep.SetActive(true);
|
|
vector = promptActions.gameObject.transform.GetChild(2).position;
|
|
vector.y -= 0.5f;
|
|
Links.x.footstep.transform.position = vector;
|
|
yield return new WaitForSeconds(1f);
|
|
Links.x.footstep.SetActive(false);
|
|
}
|
|
if (lookTarget != hitCharacter.gameObject)
|
|
{
|
|
if (isRogue)
|
|
{
|
|
hitCharacter.StartQuip(promptActions.SkillQuip(promptActions.prompt.rangerQuip, hitCharacter.stats.race));
|
|
}
|
|
else if (isCharmer)
|
|
{
|
|
hitCharacter.StartQuip(promptActions.SkillQuip(promptActions.prompt.charmerQuip, hitCharacter.stats.race));
|
|
}
|
|
else if (promptActions.prompt.type == Prompts.types.quip)
|
|
{
|
|
string text2 = promptActions.prompt.conversation;
|
|
if (text2 == "")
|
|
{
|
|
text2 = promptActions.prompt.textID;
|
|
}
|
|
hitCharacter.StartQuip(promptActions.Quip(text2, promptActions.characterName, hitCharacter.stats.race));
|
|
}
|
|
Links.x.rtsCamera.puzzleTarget = hitCharacter.gameObject;
|
|
yield return new WaitForSeconds(1f);
|
|
Records.x.RemoveControls(false);
|
|
yield return new WaitForSeconds(1f);
|
|
}
|
|
else
|
|
{
|
|
Records.x.RemoveControls(false);
|
|
}
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", new Vector3(-100000f, -100000f, -100000f));
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.gameObject;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Links.x.rtsCamera.Zoom(false, "Dialogue");
|
|
Links.x.hoverObject = null;
|
|
GameObject fx = null;
|
|
if (isRogue || isCharmer)
|
|
{
|
|
MasterAudio.PlaySoundAndForget("Feedback", 0.6f, new float?(1f), 0f, "Song Learned", null);
|
|
string text3 = "Rogue Check";
|
|
if (isCharmer)
|
|
{
|
|
text3 = "Charmer Check";
|
|
}
|
|
Animator animatedText = Links.x.cellar.GetAnimatedText("SkillCheckPass", text3, false);
|
|
animatedText.gameObject.transform.position = hitCharacter.body.headBone.position + new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), 0f) + new Vector3(0f, 3f, 0f);
|
|
animatedText.gameObject.transform.SetParent(hitCharacter.tr, true);
|
|
animatedText.gameObject.name = hitCharacter.stats.GetName();
|
|
this.str.Clear();
|
|
this.str.Append(Links.x.gameFeed.GetPartyColorText(hitCharacter));
|
|
this.str.Append(hitCharacter.stats.GetName());
|
|
this.str.Append("</color>");
|
|
if (isRogue)
|
|
{
|
|
this.str.Append(" passed Rogue search check ");
|
|
}
|
|
else
|
|
{
|
|
this.str.Append(" passed Binding search check ");
|
|
}
|
|
if (Records.x.showRulesetInfo)
|
|
{
|
|
this.str.Append(" <color #857C6C>... ");
|
|
this.str.Append(rollString);
|
|
this.str.Append(" vs. ");
|
|
this.str.Append(diffString);
|
|
this.str.Append("</color>");
|
|
}
|
|
Links.x.gameFeed.AddFeed(this.str.ToString());
|
|
}
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.rtsCamera.puzzleTarget = null;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
if (isRogue || isCharmer)
|
|
{
|
|
yield return new WaitForSeconds(1f);
|
|
int xp = (promptActions.prompt.charmerSkillCheck + roll) * 2;
|
|
if (isRogue)
|
|
{
|
|
xp = promptActions.prompt.rangerSkillCheck;
|
|
}
|
|
yield return new WaitForSeconds(0.5f);
|
|
hitCharacter.stats.AddXP(xp, null, true);
|
|
}
|
|
promptActions.state = 1;
|
|
yield return new WaitForSeconds(2f);
|
|
if ((isRogue || isCharmer) && fx)
|
|
{
|
|
Links.x.cellar.ReturnPooledGameObject(10, fx);
|
|
}
|
|
fx = null;
|
|
}
|
|
center = default(Vector3);
|
|
}
|
|
else if (promptActions.gameObject.activeSelf)
|
|
{
|
|
promptActions.state = 0;
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CD1 RID: 3281 RVA: 0x000F8D0B File Offset: 0x000F6F0B
|
|
public void Ambush(GameObject creatureFolder, Character hitCharacter, PromptActions promptActions)
|
|
{
|
|
if (Records.x.turnOffAnimals)
|
|
{
|
|
return;
|
|
}
|
|
base.StartCoroutine(this.OrchestrateAmbush(creatureFolder, hitCharacter, promptActions));
|
|
}
|
|
|
|
// Token: 0x06000CD2 RID: 3282 RVA: 0x000F8D2A File Offset: 0x000F6F2A
|
|
private IEnumerator OrchestrateAmbush(GameObject creatureFolder, Character hitCharacter, PromptActions promptActions)
|
|
{
|
|
while (Records.x.removeControls)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (Links.x.gaia.sceneLoaded)
|
|
{
|
|
List<Transform> pts = new List<Transform>();
|
|
Vector3 center = Vector3.zero;
|
|
foreach (object obj in base.transform)
|
|
{
|
|
Transform transform = (Transform)obj;
|
|
if (transform != base.transform)
|
|
{
|
|
pts.Add(transform);
|
|
center += transform.position;
|
|
}
|
|
}
|
|
if (pts.Count > 0)
|
|
{
|
|
center /= (float)pts.Count;
|
|
}
|
|
bool doCinematicCameraPause = false;
|
|
if (promptActions.prompt.conversation == "ShromersGate")
|
|
{
|
|
doCinematicCameraPause = true;
|
|
}
|
|
while (!Links.x.gaia.sceneLoaded)
|
|
{
|
|
yield return null;
|
|
}
|
|
CreatureActions[] creatures = creatureFolder.GetComponentsInChildren<CreatureActions>();
|
|
foreach (CreatureActions creatureActions in creatures)
|
|
{
|
|
if (pts.Count > 0)
|
|
{
|
|
creatureActions.ambush = true;
|
|
}
|
|
creatureActions.SetupCreatures();
|
|
}
|
|
int count = 0;
|
|
Character firstAmbushCharacter = null;
|
|
List<Character> characters;
|
|
foreach (CreatureActions creatureActions2 in creatures)
|
|
{
|
|
characters = creatureActions2.characters;
|
|
int count2 = characters.Count;
|
|
for (int l = 0; l < count2; l++)
|
|
{
|
|
Character character = characters[l];
|
|
if (pts.Count > 0 && count < pts.Count && character)
|
|
{
|
|
character.ambushing = true;
|
|
character.body.SeeThroughColliders(false);
|
|
character.jumpingAreas = false;
|
|
character.alwaysOn = true;
|
|
character.SetPosition(pts[count].position, null);
|
|
Vector3.Lerp(pts[count].position, hitCharacter.tr.position, 0.5f);
|
|
character.SetMeshState(false);
|
|
GraphNode walkIndex = creatureActions2.GetWalkIndex(l);
|
|
character.ClaimNode(walkIndex, character.tr.position, false);
|
|
this.npcs.Add(character);
|
|
Vector3 zero = Vector3.zero;
|
|
zero.x = Random.Range(8f, 10f);
|
|
if (Random.Range(0, 2) == 0)
|
|
{
|
|
zero.x *= -1f;
|
|
}
|
|
zero.y = Random.Range(8f, 10f);
|
|
if (Random.Range(0, 2) == 0)
|
|
{
|
|
zero.y *= -1f;
|
|
}
|
|
zero.z = Random.Range(8f, 10f);
|
|
if (Random.Range(0, 2) == 0)
|
|
{
|
|
zero.z *= -1f;
|
|
}
|
|
this.rots.Add(zero);
|
|
int j = count;
|
|
count = j + 1;
|
|
}
|
|
else if (character)
|
|
{
|
|
character.FirstPosition(null);
|
|
}
|
|
if (!firstAmbushCharacter && character)
|
|
{
|
|
firstAmbushCharacter = character;
|
|
}
|
|
}
|
|
if (pts.Count == 0)
|
|
{
|
|
creatureActions2.Ambush(hitCharacter);
|
|
characters = creatureActions2.characters;
|
|
int y = characters.Count;
|
|
yield return new WaitForSecondsRealtime(0.1f);
|
|
for (int m = 0; m < y; m++)
|
|
{
|
|
Character character2 = characters[m];
|
|
if (character2)
|
|
{
|
|
character2.body.SeeThroughColliders(false);
|
|
this.AmbushParticle(character2.tr.position + new Vector3(0f, 2f, 0f));
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Interactives", character2.tr.position, Random.Range(0.5f, 0.8f), new float?(Random.Range(0.5f, 0.8f)), 0f, "Chest Break", null);
|
|
character2.ambushing = true;
|
|
character2.jumpingPosition = false;
|
|
character2.PlaySoundFX(0, 7);
|
|
character2.ambushing = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CreatureActions[] array2 = null;
|
|
if (doCinematicCameraPause)
|
|
{
|
|
while (Records.x.inMenus)
|
|
{
|
|
yield return null;
|
|
}
|
|
while ((Records.x.paused && (Records.x.secrets || Records.x.editor)) || Records.x.removeControls || Records.x.saving || Links.x.combat.inPocketAttack || Links.x.combat.inRally)
|
|
{
|
|
yield return null;
|
|
}
|
|
Links.x.gameplay.TogglePause(false);
|
|
Records.x.RemoveControls(true);
|
|
foreach (CreatureActions creatureActions3 in creatures)
|
|
{
|
|
characters = creatureActions3.characters;
|
|
int count3 = characters.Count;
|
|
for (int n = 0; n < count3; n++)
|
|
{
|
|
Character character3 = characters[n];
|
|
if (character3)
|
|
{
|
|
character3.ignoreRemoveControls = true;
|
|
character3.ignoreNodeIDs = false;
|
|
character3.meshAlwaysOn = true;
|
|
character3.SetMeshState(true);
|
|
character3.stats.AddBlind(-20f);
|
|
character3.body.SetMeshState(true, true);
|
|
}
|
|
}
|
|
}
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
if (promptActions.prompt.conversation == "ShromersGate")
|
|
{
|
|
string text = "LazureGuardDayGateA";
|
|
string text2 = "LazureGuardDayGateB";
|
|
if (!Links.x.gameplay.IsDay())
|
|
{
|
|
text = "LazureGuardNightGateA";
|
|
text2 = "LazureGuardNightGateB";
|
|
}
|
|
Character character4 = Links.x.main;
|
|
Character character5 = Links.x.diorama.FindCharacterAnyState(text);
|
|
if (character5 && (Links.x.main.tr.position - character5.tr.position).sqrMagnitude < 400f)
|
|
{
|
|
character4 = character5;
|
|
}
|
|
Character character6 = Links.x.diorama.FindCharacterAnyState(text2);
|
|
if (character4 == Links.x.main && character6 && (Links.x.main.tr.position - character6.tr.position).sqrMagnitude < 400f)
|
|
{
|
|
character4 = character6;
|
|
}
|
|
if (character5)
|
|
{
|
|
if (character5.turning)
|
|
{
|
|
character5.EndTurning(false);
|
|
}
|
|
if (character5.moving)
|
|
{
|
|
character5.TargetReached();
|
|
}
|
|
character5.SetRotation(Quaternion.LookRotation(firstAmbushCharacter.tr.position - character5.tr.position), false, true);
|
|
character5.PlayAnimation("Heard", 0f);
|
|
}
|
|
if (character6)
|
|
{
|
|
if (character6.turning)
|
|
{
|
|
character6.EndTurning(false);
|
|
}
|
|
if (character6.moving)
|
|
{
|
|
character6.TargetReached();
|
|
}
|
|
character6.SetRotation(Quaternion.LookRotation(firstAmbushCharacter.tr.position - character6.tr.position), false, true);
|
|
character6.PlayAnimation("Heard", 0f);
|
|
}
|
|
character4.StartQuip(promptActions.Quip(promptActions.prompt.conversation, "Leader", Links.x.main.stats.race));
|
|
Links.x.rtsCamera.puzzleTarget = character4.transform.gameObject;
|
|
Links.x.rtsCamera.Zoom(true, "Dialogue");
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", Vector3.Lerp(Links.x.main.tr.position, firstAmbushCharacter.gameObject.transform.position, 0.5f));
|
|
yield return new WaitForSeconds(2f);
|
|
Links.x.rtsCamera.Zoom(false, "Dialogue");
|
|
Links.x.rtsCamera.puzzleTarget = firstAmbushCharacter.gameObject;
|
|
yield return new WaitForSeconds(1f);
|
|
}
|
|
else
|
|
{
|
|
Links.x.main.StartQuip(promptActions.Quip(promptActions.prompt.conversation, "Leader", Links.x.main.stats.race));
|
|
}
|
|
Shader.SetGlobalVector("_CinematicRevealPosition", new Vector3(-100000f, -100000f, -100000f));
|
|
Links.x.rtsCamera.puzzleTarget = Links.x.main.gameObject;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
yield return new WaitForSeconds(0.5f);
|
|
Links.x.rtsCamera.puzzleTarget = null;
|
|
Links.x.rtsCamera.puzzleLerp = false;
|
|
Records.x.RemoveControls(false);
|
|
Links.x.rtsCamera.Zoom(false, "Dialogue");
|
|
}
|
|
else
|
|
{
|
|
Character character7 = Links.x.HasCompanion(promptActions.characterName, Links.x.main.tr.position);
|
|
if (character7)
|
|
{
|
|
character7.StartQuip(promptActions.Quip(promptActions.prompt.conversation, promptActions.characterName, character7.stats.race));
|
|
}
|
|
}
|
|
float max = 400f;
|
|
int lastCount = 0;
|
|
if (pts.Count > 0)
|
|
{
|
|
while ((Links.x.GetMainPosition() - new Vector3(center.x, Links.x.GetMainPosition().y, center.z)).sqrMagnitude > max || doCinematicCameraPause)
|
|
{
|
|
count = 0;
|
|
foreach (CreatureActions creatureActions4 in creatures)
|
|
{
|
|
characters = creatureActions4.characters;
|
|
int count4 = characters.Count;
|
|
for (int num = 0; num < count4; num++)
|
|
{
|
|
Character character8 = characters[num];
|
|
if (character8)
|
|
{
|
|
character8.SetMeshState(false);
|
|
character8.body.SetMeshState(false, false);
|
|
character8.ambushing = true;
|
|
character8.jumpingAreas = false;
|
|
if (count < pts.Count)
|
|
{
|
|
lastCount = count;
|
|
character8.SetPosition(pts[count].position, null);
|
|
}
|
|
else
|
|
{
|
|
character8.SetPosition(pts[lastCount].position, null);
|
|
}
|
|
}
|
|
int num2 = count;
|
|
count = num2 + 1;
|
|
}
|
|
}
|
|
yield return null;
|
|
}
|
|
count = 0;
|
|
lastCount = 0;
|
|
foreach (CreatureActions c in creatures)
|
|
{
|
|
characters = c.characters;
|
|
int y = characters.Count;
|
|
int j;
|
|
for (int i = 0; i < y; i = j + 1)
|
|
{
|
|
Character character9 = characters[i];
|
|
if (character9)
|
|
{
|
|
Vector3 vector = pts[lastCount].position;
|
|
if (count < pts.Count)
|
|
{
|
|
lastCount = count;
|
|
vector = pts[count].position;
|
|
}
|
|
this.AmbushParticle(vector + new Vector3(0f, 2f, 0f));
|
|
MasterAudio.PlaySound3DAtVector3AndForget("Interactives", base.gameObject.transform.position, Random.Range(0.5f, 0.8f), new float?(Random.Range(0.5f, 0.8f)), 0f, "Chest Break", null);
|
|
character9.ambushing = true;
|
|
character9.body.SeeThroughColliders(true);
|
|
character9.SetPosition(vector, null);
|
|
GraphNode walkIndex2 = c.GetWalkIndex(i);
|
|
if (character9.inactive)
|
|
{
|
|
character9.TurnScriptsOn();
|
|
character9.inactive = false;
|
|
}
|
|
character9.ClaimNode(walkIndex2, character9.tr.position, false);
|
|
character9.GetIndoorID();
|
|
character9.Jump(walkIndex2, (Vector3)walkIndex2.position, false, false);
|
|
character9.SetRotation(Quaternion.LookRotation((Vector3)walkIndex2.position, character9.tr.position), false, false);
|
|
character9.SetMeshState(true);
|
|
character9.body.SetMeshState(true, true);
|
|
character9.PlaySoundFX(0, 7);
|
|
}
|
|
j = count;
|
|
count = j + 1;
|
|
float timeToLerp = Random.Range(0.1f, 0.3f);
|
|
float percentage = 0f;
|
|
float startTime = Time.time;
|
|
while (percentage < 1f)
|
|
{
|
|
percentage = (Time.time - startTime) / timeToLerp;
|
|
this.Jumping(hitCharacter, i);
|
|
yield return null;
|
|
}
|
|
j = i;
|
|
}
|
|
c = null;
|
|
}
|
|
array2 = null;
|
|
while (this.Jumping(hitCharacter, this.npcs.Count))
|
|
{
|
|
yield return null;
|
|
}
|
|
}
|
|
foreach (CreatureActions creatureActions5 in creatures)
|
|
{
|
|
characters = creatureActions5.characters;
|
|
int count5 = characters.Count;
|
|
for (int num3 = 0; num3 < count5; num3++)
|
|
{
|
|
Character character10 = characters[num3];
|
|
if (character10)
|
|
{
|
|
character10.meshAlwaysOn = false;
|
|
character10.ignoreRemoveControls = false;
|
|
character10.ignoreNodeIDs = false;
|
|
character10.body.SeeThroughColliders(true);
|
|
}
|
|
}
|
|
}
|
|
if (promptActions.prompt.ambushQuipPrompt && !promptActions.prompt.ambushQuipPrompt.GetComponent<Cinematics>())
|
|
{
|
|
promptActions.prompt.ambushQuipPrompt.gameObject.SetActive(false);
|
|
promptActions.prompt.ambushQuipPrompt.GetComponent<PromptActions>().state = 1;
|
|
}
|
|
promptActions.state = 1;
|
|
characters = null;
|
|
pts = null;
|
|
center = default(Vector3);
|
|
creatures = null;
|
|
firstAmbushCharacter = null;
|
|
}
|
|
Object.Destroy(this);
|
|
yield break;
|
|
}
|
|
|
|
// Token: 0x06000CD3 RID: 3283 RVA: 0x000F8D50 File Offset: 0x000F6F50
|
|
private bool Jumping(Character hitCharacter, int x)
|
|
{
|
|
int num = 0;
|
|
for (int i = 0; i < this.npcs.Count; i++)
|
|
{
|
|
if (this.npcs[i].ambushing && i <= x)
|
|
{
|
|
if (!this.npcs[i].jumping)
|
|
{
|
|
this.npcs[i].ambushing = false;
|
|
this.npcs[i].SettlePosition();
|
|
this.npcs[i].SetRotation(Quaternion.LookRotation(Links.x.main.currentPosition, this.npcs[i].tr.position), false, true);
|
|
this.StartAmbush(this.npcs[i], hitCharacter);
|
|
string text = "Cannonball";
|
|
if (Random.Range(0, 2) == 0)
|
|
{
|
|
text += "1";
|
|
}
|
|
else
|
|
{
|
|
text += "2";
|
|
}
|
|
MasterAudio.PlaySound3DAtVector3AndForget("SpecialAttacks", this.npcs[i].tr.position, Random.Range(0.8f, 0.9f), new float?(1f), 0f, text, null);
|
|
}
|
|
else if (this.npcs[i].jumping && !Records.x.pocketPause)
|
|
{
|
|
this.npcs[i].body.SetMeshState(true, true);
|
|
if (this.npcs[i].stats.animal)
|
|
{
|
|
this.npcs[i].tr.Rotate(this.rots[i]);
|
|
}
|
|
else if (this.npcs[i].movePoint != Vector3.zero)
|
|
{
|
|
this.npcs[i].tr.rotation = Quaternion.LookRotation(new Vector3(this.npcs[i].movePoint.x, this.npcs[i].tr.position.y, this.npcs[i].movePoint.z) - this.npcs[i].tr.position);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num++;
|
|
}
|
|
}
|
|
return num != this.npcs.Count;
|
|
}
|
|
|
|
// Token: 0x06000CD4 RID: 3284 RVA: 0x000F8FCD File Offset: 0x000F71CD
|
|
private void AmbushParticle(Vector3 pt)
|
|
{
|
|
GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(60);
|
|
pooledGameObject.transform.position = pt + new Vector3(0f, 1f, 0f);
|
|
pooledGameObject.SetActive(true);
|
|
}
|
|
|
|
// Token: 0x06000CD5 RID: 3285 RVA: 0x000F900C File Offset: 0x000F720C
|
|
private void StartAmbush(Character character, Character hitCharacter)
|
|
{
|
|
character.ClearMoveTargets();
|
|
character.ClearPathUpdates();
|
|
character.SetRotation(Quaternion.LookRotation(hitCharacter.tr.position - character.tr.position), true, true);
|
|
if (!character.GetLKPlayerBool(hitCharacter))
|
|
{
|
|
character.StartGetPathToTarget(hitCharacter.node, hitCharacter, null, null, null, null, null, null, character, null, false, false, true, "Searching", false);
|
|
character.UpdateLKP(hitCharacter, hitCharacter.node, "Heard", false);
|
|
}
|
|
if (hitCharacter != Links.x.main)
|
|
{
|
|
character.UpdateLKP(Links.x.main, Links.x.main.node, "Heard", false);
|
|
}
|
|
character.movingToPatrolNode = true;
|
|
}
|
|
|
|
// Token: 0x04001478 RID: 5240
|
|
private IEnumerator pavuraWalk;
|
|
|
|
// Token: 0x04001479 RID: 5241
|
|
private IEnumerator endPavura;
|
|
|
|
// Token: 0x0400147A RID: 5242
|
|
private List<Character> npcs = new List<Character>();
|
|
|
|
// Token: 0x0400147B RID: 5243
|
|
private List<Vector3> rots = new List<Vector3>();
|
|
|
|
// Token: 0x0400147C RID: 5244
|
|
private StringFast str = new StringFast(64);
|
|
|
|
// Token: 0x0400147D RID: 5245
|
|
public bool videoFinished;
|
|
}
|