using System; using System.Collections; using System.Collections.Generic; using DarkTonic.MasterAudio; using Pathfinding; using UnityEngine; // Token: 0x02000054 RID: 84 public class TileEffects : MonoBehaviour { // Token: 0x06000AD2 RID: 2770 RVA: 0x000D772F File Offset: 0x000D592F private void Start() { } // Token: 0x06000AD3 RID: 2771 RVA: 0x000D7731 File Offset: 0x000D5931 public void Setup(Library.Abilities abilityToUse, Library.Effects effectToUse, Actions actions, BreakableActions breakable, ChestActions chest, Character sourceCharacter) { base.enabled = true; base.StartCoroutine(this.SetupTimed(abilityToUse, effectToUse, actions, breakable, chest, sourceCharacter)); } // Token: 0x06000AD4 RID: 2772 RVA: 0x000D7750 File Offset: 0x000D5950 private IEnumerator SetupTimed(Library.Abilities abilityToUse, Library.Effects effectToUse, Actions actions, BreakableActions breakable, ChestActions chest, Character sourceCharacter) { this.tileRadius = Records.x.nodeSize / 2f; this.ability = abilityToUse; if (this.ability != null) { this.hasAbility = true; } else { this.hasAbility = false; } this.source = sourceCharacter; bool stop = false; if (effectToUse == null) { this.effect = Links.x.library.GetEffectRow(this.ability._Name); } else { this.effect = effectToUse; } this.isInstrument = false; this.summonAmount = 0; if (!this.doSpellScroll) { this.spellScroll = null; } this.influenceRadius = (float)this.effect._TileRadius; if (this.ability != null && (this.ability._IsSpell || this.fromEnchantedItem) && this.paganRow != null) { if (this.fromEnchantedItem) { this.influenceRadius = this.radius; } else { this.spellData = new Vector4(0f, 0f, 0f, 0f); if (!this.doSpellScroll) { this.spellData = this.source.stats.GetAbilityLevel(this.spellIndex); } else { this.spellData = Records.x.GetSpellScrollData(this.spellIndex); } for (int i = 0; i < 3; i++) { string text = ""; float num = 0f; if (i == 0) { text = this.paganRow._Slider1; num = this.spellData.x; } if (i == 1) { text = this.paganRow._Slider2; num = this.spellData.y; } if (i == 2) { text = this.paganRow._Slider3; num = this.spellData.z; } if (text.Contains("Radius")) { this.influenceRadius = num; } if (text.Contains("Time")) { this.effectTileOverrideDuration = Records.x.RealSecondsToGameSeconds(num); } if (text.Contains("Summons") && this.paganRow._School == "Fauna") { this.influenceRadius = (float)this.effect._TileRadius; this.summonAmount = (int)num; if (this.paganRow._ID.Contains("Frog")) { this.summonAmount *= 2; } else { this.summonAmount *= 3; } } } } } if (this.hasAbility) { if (this.ability._AINotes.Contains("Summons")) { this.summonAmount = 1; this.isSummons = true; if (this.ability._IsSpell) { if (this.fromEnchantedItem) { this.summonAmount = this.targetCount; } else { this.spellData = new Vector4(0f, 0f, 0f, 0f); if (!this.doSpellScroll) { this.spellData = this.source.stats.GetAbilityLevel(this.spellIndex); } else { this.spellData = Records.x.GetSpellScrollData(this.spellIndex); } for (int j = 0; j < 3; j++) { string text2 = ""; float num2 = 0f; if (j == 0) { text2 = this.paganRow._Slider1; num2 = this.spellData.x; } if (j == 1) { text2 = this.paganRow._Slider2; num2 = this.spellData.y; } if (j == 2) { text2 = this.paganRow._Slider3; num2 = this.spellData.z; } if (text2.Contains("Summons")) { float num3 = Mathf.Round(num2); this.summonAmount = (int)num3; } } } } else { this.summonAmount = 1; if (this.ability._Name.Contains("Spawn")) { this.summonAmount = 2; } } this.influenceRadius = (float)this.summonAmount; } if (this.ability._IsSpell) { this.spellData = new Vector4(0f, 0f, 0f, 0f); if (!this.doSpellScroll) { this.spellData = this.source.stats.GetAbilityLevel(this.spellIndex); } else { this.spellData = Records.x.GetSpellScrollData(this.spellIndex); } for (int k = 0; k < 3; k++) { string text3 = ""; float num4 = 0f; if (k == 0) { text3 = this.paganRow._Slider1; num4 = this.spellData.x; } if (k == 1) { text3 = this.paganRow._Slider2; num4 = this.spellData.y; } if (k == 2) { text3 = this.paganRow._Slider3; num4 = this.spellData.z; } if (text3.Contains("Damage") || text3.Contains("Deterioration") || text3.Contains("Effects") || text3.Contains("Power") || text3.Contains("Healing") || text3.Contains("Skill")) { this.sourceLevel = num4; } if (text3.Contains("Durability")) { this.sourceDurability = num4; } } if (this.ability._RadiusCenter.Contains("Target") || this.ability._RadiusCenter.Contains("Self")) { this.isSingleTarget = true; } if (this.effect._TileRadius > 1) { this.isSingleTarget = false; } if (this.ability._Name.Contains("CorpseNest") && this.singleTarget) { this.singleTarget.AddEffect(68, ""); while (!this.SingleTargetDone()) { this.waitingForTargetDeath = true; if (this.singleTarget) { this.startNode = this.singleTarget.node; } yield return null; } if (this.singleTarget) { this.singleTarget.RemoveEffect(68, "", true); if (this.singleTarget.stunned) { stop = true; } } this.singleTarget = null; this.waitingForTargetDeath = false; } if (this.source && this.source.stats.hasCustomAI && (this.ability._Name == "MushroomWall" || this.ability._Name == "FishPoisonBeam" || this.ability._Name == "BoneSpikes")) { this.customTileAI = true; } } } if (breakable) { this.pickedGroundNodesSaved = breakable.pickedGroundNodes; } else if (chest) { this.pickedGroundNodesSaved = chest.pickedGroundNodes; } else if (this.ghostBrush) { this.pickedGroundNodesSaved = this.ghostBrush.pickedGroundNodes; } else if (this.fromGroup) { this.pickedGroundNodesSaved = this.group.circleTiles; if (this.effect._Name == "Acid") { this.isPoison = true; } } else if (this.customTileAI) { this.pickedGroundNodesSaved = new List(); Character c = this.spellTarget; if (!c) { c = Links.x.main; this.spellTarget = Links.x.main; } if (c.node != null && Links.x.gaia.pathfindingReady) { Vector3 vector = (Vector3)this.source.node.position; Vector3 cNode = (Vector3)c.node.position; cNode.y = vector.y; if (this.ability._Name == "FishPoisonBeam") { float num5 = 6f; this.influenceRadius = 6f; float max = (num5 * Records.x.nodeSize + 0.1f) * (num5 * Records.x.nodeSize + 0.1f); ConstantPath constPath = ConstantPath.ConstructFast(this.source.node, Records.x.GetConstantPathRadius((int)num5), null); constPath.nnConstraint = new NNConstraint { constrainWalkability = false, constrainToEnvironment = -1, constrainTags = false, checkCircleID = 0 }; AstarPath.StartPath(constPath, false); yield return base.StartCoroutine(constPath.WaitForPath()); constPath.Claim(this); this.allNodes = constPath.allNodes; int count = this.allNodes.Count; vector = this.source.currentPosition; Vector3 vector2 = Quaternion.LookRotation((Vector3)this.startNode.position - vector) * Vector3.forward; Vector3 vector3 = vector; for (int l = 0; l < count; l++) { Vector3 vector4 = (Vector3)this.allNodes[l].position; vector3.y = vector4.y; if ((vector4 - vector3).sqrMagnitude < max) { float num6 = Vector3.Angle(vector4 - vector3, vector2); float num7 = 20f; if (num6 <= num7 && num6 >= num7 * -1f) { this.pickedGroundNodesSaved.Add(this.allNodes[l]); } } } constPath.Release(this, false); constPath = null; } if (this.ability._Name == "BoneSpikes") { float num8 = 10f; this.influenceRadius = 10f; float max = (num8 * Records.x.nodeSize + 0.1f) * (num8 * Records.x.nodeSize + 0.1f); ConstantPath constPath = ConstantPath.ConstructFast(this.source.node, Records.x.GetConstantPathRadius((int)num8), null); constPath.nnConstraint = new NNConstraint { constrainWalkability = false, constrainToEnvironment = -1, constrainTags = false, checkCircleID = 0 }; AstarPath.StartPath(constPath, false); yield return base.StartCoroutine(constPath.WaitForPath()); constPath.Claim(this); this.allNodes = constPath.allNodes; int count2 = this.allNodes.Count; vector = this.source.currentPosition; Vector3 vector5 = Quaternion.LookRotation((Vector3)this.startNode.position - vector) * Vector3.forward; Vector3 vector6 = vector; for (int m = 0; m < count2; m++) { Vector3 vector7 = (Vector3)this.allNodes[m].position; vector6.y = vector7.y; if ((vector7 - vector6).sqrMagnitude < max) { float num9 = Vector3.Angle(vector7 - vector6, vector5); float num10 = 15f; if (num9 <= num10 && num9 >= num10 * -1f) { this.pickedGroundNodesSaved.Add(this.allNodes[m]); } } } constPath.Release(this, false); this.pickedGroundNodesSaved.Sort((GraphNode a, GraphNode b) => Vector3.Distance(this.source.currentPosition, (Vector3)a.position).CompareTo(Vector3.Distance(this.source.currentPosition, (Vector3)b.position))); constPath = null; } if (this.ability._Name == "MushroomWall" && (vector - cNode).sqrMagnitude < 25f) { for (int n = 0; n < 8; n++) { GraphNode graphNode = c.node.ConnectionFromIndex(n); if (graphNode != null && graphNode != this.source.node) { this.pickedGroundNodesSaved.Add(graphNode); if (graphNode.ID != 0 && graphNode.ID != c.nodeStationaryID && graphNode.ID != c.nodeMovingID) { Character nodeCharacter = c.GetNodeCharacter(graphNode.ID); if (nodeCharacter) { nodeCharacter.Knockback(this.source.currentPosition, 1, false, false, false); } } } } for (int num11 = 0; num11 < 8; num11++) { GraphNode graphNode2 = this.source.node.ConnectionFromIndex(num11); if (graphNode2 != null && graphNode2 != c.node && !this.pickedGroundNodesSaved.Contains(graphNode2)) { this.pickedGroundNodesSaved.Add(graphNode2); if (graphNode2.ID != 0 && graphNode2.ID != this.source.nodeStationaryID && graphNode2.ID != this.source.nodeMovingID) { Character nodeCharacter2 = this.source.GetNodeCharacter(graphNode2.ID); if (nodeCharacter2 && nodeCharacter2 != c && nodeCharacter2 != this.source) { nodeCharacter2.Knockback(this.source.currentPosition, 1, false, false, false); } } } } } cNode = default(Vector3); } if (this.effect._Name.Contains("Wall")) { this.isWall = true; } c = null; } else if (!this.isSingleTarget && !stop) { this.pickedGroundNodesSaved = new List(); if (this.startNode != null && Links.x.gaia.pathfindingReady) { int num12 = (int)this.influenceRadius; this.isWall = false; bool isNearWall = false; if (this.effect._Name.Contains("Wall")) { this.isWall = true; if (this.effect._Name.Contains("Mushroom")) { isNearWall = true; if (this.spellTarget && this.spellTarget.node != null) { this.startNode = this.spellTarget.node; } } } int nodeCount = 0; float max = ((float)num12 * Records.x.nodeSize + 0.1f) * ((float)num12 * Records.x.nodeSize + 0.1f); ConstantPath constPath = ConstantPath.ConstructFast(this.startNode, Records.x.GetConstantPathRadius(num12), null); NNConstraint nnconstraint = new NNConstraint(); nnconstraint.constrainWalkability = false; nnconstraint.constrainToEnvironment = -1; nnconstraint.constrainTags = false; nnconstraint.checkCircleID = 0; if (this.ability._Name.Contains("Moss")) { nnconstraint.constrainToEnvironment = 3; } constPath.nnConstraint = nnconstraint; AstarPath.StartPath(constPath, false); yield return base.StartCoroutine(constPath.WaitForPath()); constPath.Claim(this); this.allNodes = constPath.allNodes; int count3 = this.allNodes.Count; Vector3 vector8 = (Vector3)this.startNode.position; if (this.source) { vector8 = this.source.tr.position; } Vector3 vector9 = (Vector3)this.startNode.position; if (vector9 == vector8) { vector9 += new Vector3(0.1f, 0f, 0.1f); } Vector3 vector10 = vector9 + Quaternion.LookRotation(vector8 - vector9) * Vector3.forward * -3.5f; Vector3 vector11 = vector9 + Quaternion.LookRotation(vector8 - vector9) * Vector3.forward * 3.5f; float sqrMagnitude = (vector8 - vector10).sqrMagnitude; float sqrMagnitude2 = (vector8 - vector11).sqrMagnitude; Vector3 vector12 = vector9; for (int num13 = 0; num13 < count3; num13++) { Vector3 vector13 = (Vector3)this.allNodes[num13].position; vector12.y = vector13.y; if ((vector13 - vector12).sqrMagnitude < max) { if (this.isWall) { if (isNearWall) { float sqrMagnitude3 = (vector13 - new Vector3(this.spellTarget.currentPosition.x, vector13.y, this.spellTarget.currentPosition.z)).sqrMagnitude; if (sqrMagnitude3 < 16f && sqrMagnitude3 > 2.25f) { this.pickedGroundNodesSaved.Add(this.allNodes[num13]); int num14 = nodeCount; nodeCount = num14 + 1; } } else { float sqrMagnitude4 = (vector13 - new Vector3(vector8.x, vector13.y, vector8.z)).sqrMagnitude; if (sqrMagnitude4 >= sqrMagnitude2 && sqrMagnitude4 <= sqrMagnitude) { this.pickedGroundNodesSaved.Add(this.allNodes[num13]); int num14 = nodeCount; nodeCount = num14 + 1; } } } else { this.pickedGroundNodesSaved.Add(this.allNodes[num13]); int num14 = nodeCount; nodeCount = num14 + 1; } } } this.pickedGroundNodesSaved.Remove(this.startNode); if (!this.isWall && !this.customTileAI) { this.pickedGroundNodesSaved.Add(this.startNode); } constPath.Release(this, false); constPath = null; } } if (this.effect._TileRadius == 1 && (this.singleTargetInteractive || this.singleTarget) && this.hasAbility && (this.ability._WeaponReq.Contains("Elixir") || this.ability._WeaponReq.Contains("Bow") || this.ability._WeaponReq.Contains("Sling"))) { this.isSingleTarget = true; } this.effectTiles.Clear(); this.allTiles.Clear(); this.hasTile.Clear(); if (!this.isSingleTarget) { if (!stop && this.pickedGroundNodesSaved != null) { for (int num15 = 0; num15 < this.pickedGroundNodesSaved.Count; num15++) { this.allTiles.Add(this.pickedGroundNodesSaved[num15]); } } } else if (this.singleTarget && this.singleTarget.node != null) { this.allTiles.Add(this.singleTarget.node); } if (this.allTiles.Count > 0 && !stop) { this.mainPosition = (Vector3)this.allTiles[this.allTiles.Count - 1].position; this.mainNode = this.allTiles[this.allTiles.Count - 1]; if (this.ability != null && this.IsInstrument(this.ability._WeaponReq)) { this.isInstrument = true; } if (!this.customTileAI) { int num16 = this.allTiles.Count - 1; this.allTiles.Insert(0, this.mainNode); this.allTiles.RemoveAt(num16 + 1); } if (this.ability == null) { this.overallTime = (int)this.effect._OverallTime; if (this.effect._OverallTime > 0f && !this.fromEnchantedItem) { this.timeToWait = this.effect._OverallTime; } } else { this.overallTime = this.ability._OverallTime; if (this.ability._OverallTime > 0 && !this.fromEnchantedItem) { this.timeToWait = (float)this.ability._OverallTime; } if (this.paganRow != null && (this.fromEnchantedItem || this.ability._IsSpell)) { if (this.fromEnchantedItem) { this.timeToWait = Records.x.RealSecondsToGameSeconds(this.spellDuration); this.overallTime = (int)this.timeToWait; } else { Vector4 vector14 = new Vector4(0f, 0f, 0f, 0f); if (!this.doSpellScroll) { vector14 = this.source.stats.GetAbilityLevel(this.spellIndex); } else { vector14 = Records.x.GetSpellScrollData(this.spellIndex); } for (int num17 = 0; num17 < 3; num17++) { string text4 = ""; float num18 = 0f; if (num17 == 0) { text4 = this.paganRow._Slider1; num18 = vector14.x; } if (num17 == 1) { text4 = this.paganRow._Slider2; num18 = vector14.y; } if (num17 == 2) { text4 = this.paganRow._Slider3; num18 = vector14.z; } if (text4 != null && text4.Contains("Duration")) { this.timeToWait = Records.x.RealSecondsToGameSeconds(num18); } } this.overallTime = (int)this.timeToWait; } } else if (this.ability._MainSkill.Contains("Pipe")) { this.timeToWait = 0f; this.overallTime = -1; } else if (this.effect._IsSong && !this.effect._IsBuff) { this.timeToWait = this.effect._OverallTime; } } if (this.isSingleTarget) { if (this.singleTargetInteractive) { NNConstraint nnconstraint2 = new NNConstraint(); nnconstraint2.constrainWalkability = true; nnconstraint2.walkable = true; nnconstraint2.constrainTags = false; nnconstraint2.checkCircleID = 0; GraphNode node = AstarPath.active.GetNearest(this.singleTargetInteractive.transform.position, nnconstraint2).node; if (node != null) { this.effectTiles.Add(node); this.hasTile.Add(true); } else { string[] array = new string[6]; array[0] = "Interactive did not find node for tile effect code "; array[1] = ((this != null) ? this.ToString() : null); array[2] = " "; array[3] = this.effect._Name; array[4] = " from "; int num19 = 5; Character character = this.source; array[num19] = ((character != null) ? character.ToString() : null); Debug.Log(string.Concat(array)); } } else if (this.singleTarget.node != null) { this.effectTiles.Add(this.singleTarget.node); this.hasTile.Add(true); } else { string[] array2 = new string[6]; array2[0] = "Single target effect did not find node for tile effect code "; array2[1] = ((this != null) ? this.ToString() : null); array2[2] = " "; array2[3] = this.effect._Name; array2[4] = " from "; int num20 = 5; Character character2 = this.source; array2[num20] = ((character2 != null) ? character2.ToString() : null); Debug.Log(string.Concat(array2)); } this.pooledEffects.Add(null); if (!this.singleTargetInteractive) { this.CheckTile(this.singleTarget.node, this.singleTarget, false); } else { this.CheckTileInteractive(this.singleTargetInteractive); } if (this.hasAbility && this.ability._CanBreak > 0 && this.ability._AINotes != "Summons") { Links.x.diorama.CheckTileEffects(this); } if (this.hasAbility && this.ability._NoiseRadius > 0 && this.source) { Links.x.sensory.AddNoise(this.source.gameObject, this.mainNode, this.ability._Name, this.source); } this.Remove(); } else { Links.x.cellar.AddTileEffect(this); this.scatterRoutine = this.ScatterTiles(0); base.StartCoroutine(this.scatterRoutine); } } if (stop) { Object.Destroy(this); } yield break; } // Token: 0x06000AD5 RID: 2773 RVA: 0x000D7788 File Offset: 0x000D5988 private bool SingleTargetDone() { return !Links.x.gaia.sceneLoaded || !this.singleTarget || this.singleTarget.dead || this.singleTarget.stunned || Links.x.combat.inPocketAttack; } // Token: 0x06000AD6 RID: 2774 RVA: 0x000D77E5 File Offset: 0x000D59E5 private IEnumerator ScatterTiles(int pass) { this.inScatter = true; this.scatterPassTime = Links.x.gameplay.seconds; bool hasAnimator = false; bool checkIfTileIsTaken = false; bool addEffectToTile = true; bool changeEnvironment = false; bool wall = false; bool stop = false; bool summons = false; int max = 6; bool spiritTile = false; bool rotateToGround = false; bool doAllTiles = false; this.isFaunaCreature = false; bool rotateForward = false; Quaternion look = Quaternion.identity; bool onlyOnePass = false; this.doWave = false; while (Records.x.pocketPause || Records.x.removeControls || Records.x.inMenus) { yield return null; } if (pass == 0 && !this.effect._IsBuff && !this.effect._IsSong) { if (!this.hasAbility) { this.setPenalty = true; } if (this.hasAbility) { if (this.source.npc) { this.setPenalty = true; } if (!this.source.npc && (this.ability._TargetsFaction == 6 || this.ability._TargetsFaction == 7)) { this.setPenalty = true; } } } if (this.hasAbility) { if (this.ability._FX == 29 || this.ability._FX == 108) { hasAnimator = true; wall = true; checkIfTileIsTaken = true; addEffectToTile = false; } if (this.ability._IsSpell && this.ability._MainSkill == "Fauna" && (this.ability._Name.Contains("Trap") || this.ability._Name.Contains("Nest"))) { this.isFaunaCreature = true; } if (this.ability._Name == "FishPoisonBeam") { rotateForward = true; look = Quaternion.LookRotation(this.spellTarget.currentPosition - this.source.currentPosition); this.doWave = true; onlyOnePass = true; } if (this.ability._Name == "FishPoison") { rotateToGround = true; onlyOnePass = true; hasAnimator = true; doAllTiles = true; } if (this.ability._Name == "Web") { rotateToGround = true; onlyOnePass = true; hasAnimator = true; doAllTiles = true; } if (this.ability._Name == "BoneSpikes") { rotateToGround = true; onlyOnePass = true; this.doWave = true; doAllTiles = true; MasterAudio.PlaySound3DAtVector3AndForget("SpecialAttacks", this.source.tr.position, 0.8f, new float?(1f), 0f, "Cannonball1", null); } } if (this.effect._Name.Contains("Moss")) { changeEnvironment = true; rotateToGround = true; } if (this.effect._Name.Contains("AttractionSpores")) { doAllTiles = true; } if (wall || changeEnvironment || doAllTiles || (this.isFaunaCreature && this.currentlySummoned >= this.summonAmount)) { if (pass > 0) { stop = true; } else { onlyOnePass = true; } } if (this.isInstrument && pass > 0) { stop = true; } if (pass == 0 && this.hasAbility && this.ability._CenterFX > 0) { this.centerFX = Links.x.cellar.GetPooledGameObject(this.ability._CenterFX); this.centerFX.transform.position = (Vector3)this.startNode.position; this.centerFX.SetActive(true); } if (this.hasAbility) { if (this.isSummons) { summons = true; if (pass > 0 && (this.currentlySummoned >= this.summonAmount || !this.isFaunaCreature)) { stop = true; } if (!this.ability._IsSpell) { yield return new WaitForSeconds(1f); while (Records.x.pocketPause) { yield return null; } } } if (this.effect._Name.Contains("SlipSlime")) { rotateToGround = true; } max = 2; if (this.isFaunaCreature) { max = 10; } } else { max = 1; } if (this.removing) { stop = true; } if (pass == 0) { this.effectStartTime = (float)((int)Links.x.gameplay.seconds); this.ready = true; } if (!stop) { bool remove = false; bool removedNode = false; float offset = 0.1f; if (this.hasAbility && this.ability._FXOffset != 0f) { offset = this.ability._FXOffset; } float waitTime = 1f / (float)this.allTiles.Count; int added = 0; if (changeEnvironment) { waitTime = 0.0001f; } int num; for (int i = 0; i < this.allTiles.Count; i = num + 1) { if (!this.waitingToRemove && !this.removing && i < this.allTiles.Count) { GraphNode node = this.allTiles[i]; remove = false; if (checkIfTileIsTaken && node != null) { remove = Links.x.sensory.CheckTileTaken(node); } bool inScatterPass = false; if (!this.customTileAI && !wall && (!summons || this.isFaunaCreature) && !doAllTiles && !this.isInstrument && !changeEnvironment && !onlyOnePass) { if (Random.Range(0, max) == 0) { inScatterPass = true; } if (this.isFaunaCreature && this.currentlySummoned >= this.summonAmount) { inScatterPass = false; } } else if (this.isInstrument && pass == 1) { inScatterPass = false; if (i < this.pooledEffects.Count) { num = added; added = num + 1; if (this.pooledEffects[i]) { this.pooledEffects[i].SetActive(false); } } if (added > 10) { yield return new WaitForSeconds(0.001f); while (Records.x.pocketPause) { yield return null; } added = 0; } } else if (summons) { if (added < this.summonAmount) { inScatterPass = true; } } else if (changeEnvironment) { if (node != null && Physics.Raycast((Vector3)node.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, 10f, 4194433)) { inScatterPass = true; } } else { inScatterPass = true; } if (!remove && inScatterPass) { GameObject visual = this.GetVisual(); if (spiritTile) { this.AddSpiritTile(visual); } if (pass > 0 && !this.isFaunaCreature) { this.RemoveFirstEffect(); } if (node != null) { Vector3 vector = (Vector3)node.position; this.pooledEffects.Add(visual); this.effectTiles.Add(node); this.hasTile.Add(true); num = added; added = num + 1; if (visual) { if (!visual.activeSelf) { visual.SetActive(true); } visual.transform.Rotate(new Vector3(0f, Random.Range(0f, 180f), 0f)); Vector3 vector2 = vector + new Vector3(0f, offset, 0f); if (this.isInstrument) { vector2 = vector + new Vector3(Random.Range(-0.3f, 0.3f), offset, Random.Range(-0.3f, 0.3f)); } visual.transform.position = vector2; if (this.hasAbility && this.ability._Sound != "" && !this.isInstrument) { if (this.customTileAI) { string text = this.ability._Sound; if (Random.Range(0, 2) == 0) { text += "1"; } else { text += "2"; } MasterAudio.PlaySound3DAtVector3AndForget("SpecialAttacks", this.mainPosition, 1f, new float?(1f), 0f, text, null); } else { MasterAudio.PlaySound3DAtVector3AndForget(this.ability._Sound, this.mainPosition, 0.8f, new float?(1f), 0f, "", null); } } } if (hasAnimator) { HannahAnimator component = visual.GetComponent(); if (component) { component.stopDuringPocketPause = true; this.animators.Add(component); if (this.ability._FX == 29 || this.ability._FX == 108) { component.enabled = true; component.Play("Start"); } else { component.enabled = true; if (component.currentAnimation == "End") { component.Play("Start"); } } } } if (this.hasAbility) { if (wall && visual) { this.breakable = visual.GetComponent(); this.breakable.node = node; this.breakable.caster = this.source; this.breakable.tileEffect = this; this.breakables.Add(this.breakable); } if (this.ability._FX == 31 && this.ability._IsSpell && visual) { HannahAnimator component2 = visual.GetComponent(); if (component2) { component2.currentTileEffect = this; component2.enabled = true; component2.Play("StartEndSummon"); } } if (!this.ability._IsSpell && summons && added <= this.summonAmount) { this.Flag(); } RaycastHit raycastHit; if (rotateToGround && Physics.Raycast((Vector3)node.position + new Vector3(0f, 3f, 0f), Vector3.up * -1f, out raycastHit, 10f, 4194449)) { Vector3 normal = raycastHit.normal; normal.y = Mathf.Clamp(normal.y, 0.97f, 1f); Quaternion quaternion = Quaternion.FromToRotation(Vector3.up, normal); if (visual) { Quaternion rotation = visual.transform.rotation; visual.transform.rotation = quaternion * rotation; } } if (rotateForward && visual) { visual.transform.rotation = look; } if (this.isFaunaCreature && visual) { this.SetupFaunaCreature(visual, node); } } if (this.setPenalty) { node.Penalty = 30000U; } if (changeEnvironment) { node.SetFlowerConnectionsEnvironment("Ground", 0); } if (addEffectToTile) { Links.x.sensory.CheckNewSpellNode(this, node, this.GetEffectName(), this.hasAbility, this.ability, this.source); } } if (wall || onlyOnePass) { if (!changeEnvironment) { yield return new WaitForSeconds(0.1f); while (Records.x.pocketPause) { yield return null; } } } else if (this.isInstrument) { if (added > 5) { yield return new WaitForSeconds(0.02f); while (Records.x.pocketPause) { yield return null; } added = 0; } } else if (!changeEnvironment) { yield return new WaitForSeconds(0.1f); while (Records.x.pocketPause) { yield return null; } } if (pass > 0) { yield return new WaitForSeconds(waitTime); while (Records.x.pocketPause) { yield return null; } } } if (remove) { this.allTiles[i] = null; removedNode = true; } node = null; } num = i; } if (removedNode && !this.waitingToRemove) { this.allTiles.RemoveAll((GraphNode item) => item == null); } if (pass == 0) { if (this.hasAbility && (this.ability._CanBreak > 0 || this.effect._Health < 0f) && this.ability._AINotes != "Summons") { Links.x.diorama.CheckTileEffects(this); } if (this.hasAbility && this.ability._NoiseRadius > 0 && this.source) { Links.x.sensory.AddNoise(this.source.gameObject, this.mainNode, this.ability._Name, this.source); } if (this.overallTime < 0 && !summons && !this.isFaunaCreature) { this.Remove(); } } this.scatterRoutine = null; this.inScatter = false; if (this.waitingToRemove) { this.Remove(); } if (!this.removing) { float num2 = 0.3f; if (this.isInstrument && pass == 0) { num2 = 1E-06f; } yield return new WaitForSeconds(num2); while (Records.x.pocketPause) { yield return null; } if (!onlyOnePass) { this.inScatter = true; this.scatterPassTime = Links.x.gameplay.seconds; if (pass == 1) { this.scatterRoutine = this.ScatterTiles(2); } else { this.scatterRoutine = this.ScatterTiles(1); } base.StartCoroutine(this.scatterRoutine); } } } else { if (this.isInstrument) { for (int j = 0; j < this.pooledEffects.Count; j++) { this.RemoveTile(this.effectTiles[j], this.pooledEffects[j], null); } this.pooledEffects.Clear(); this.hasTile.Clear(); this.animators.Clear(); this.effectTiles.Clear(); } this.scatterRoutine = null; this.inScatter = false; if (this.waitingToRemove) { this.Remove(); } } yield break; } // Token: 0x06000AD7 RID: 2775 RVA: 0x000D77FC File Offset: 0x000D59FC private void RemoveFirstEffect() { if (this.pooledEffects.Count > 0) { if (this.pooledEffects[0]) { Links.x.cellar.ReturnPooledGameObject(this.fx, this.pooledEffects[0]); } if (this.setPenalty && !Links.x.cellar.OtherListHasTile(this, this.effectTiles[0], "") && this.effectTiles[0] != null) { this.effectTiles[0].GetErosionPenalty(); } this.pooledEffects.RemoveAt(0); this.effectTiles.RemoveAt(0); this.hasTile.RemoveAt(0); if (this.animators.Count > 0) { this.animators.RemoveAt(0); } } } // Token: 0x06000AD8 RID: 2776 RVA: 0x000D78D8 File Offset: 0x000D5AD8 private GameObject GetVisual() { if (this.isSummons && !this.ability._IsSpell) { return null; } if (!this.hasAbility) { this.fx = this.effect._FX; } else { this.fx = this.ability._FX; } if (this.fx > 0) { return Links.x.cellar.GetPooledGameObject(this.fx); } return null; } // Token: 0x06000AD9 RID: 2777 RVA: 0x000D7948 File Offset: 0x000D5B48 private void AddSpiritTile(GameObject go) { Links.x.cameraEffects.AddRemoveGhost(go.GetComponent(), true); } // Token: 0x06000ADA RID: 2778 RVA: 0x000D7960 File Offset: 0x000D5B60 public void SetupFaunaCreature(GameObject go, GraphNode n) { this.currentlySummoned++; Fauna component = go.GetComponent(); if (this.faunas == null) { this.faunas = new List(); } this.faunas.Add(component); component.tileEffect = this; component.gameObject.transform.position = (Vector3)n.position; component.GetVariables(); component.Spawn(); component.node = n; component.type = this.effect._Name; if (this.effect._Script.Contains("Trap")) { if (this.effect._Name.Contains("Roly")) { GraphNode graphNode = n.ConnectionFromIndex(1); component.MakePath(graphNode, n.environment); return; } GraphNode graphNode2 = this.allTiles[Random.Range(0, this.allTiles.Count)]; component.MakePath(graphNode2, n.environment); } } // Token: 0x06000ADB RID: 2779 RVA: 0x000D7A58 File Offset: 0x000D5C58 public void UpdateFaunaNode(GraphNode currentNode, Fauna fauna) { for (int i = 0; i < this.faunas.Count; i++) { if (this.faunas[i] == fauna) { Links.x.sensory.CheckNewSpellNode(this, currentNode, this.GetEffectName(), this.hasAbility, this.ability, this.source); } } } // Token: 0x06000ADC RID: 2780 RVA: 0x000D7AB8 File Offset: 0x000D5CB8 private GraphNode RolyPoint(GraphNode currentNode, Fauna fauna) { GraphNode graphNode = currentNode; float num = float.PositiveInfinity; Vector3 position = fauna.tr.position; Quaternion quaternion = Quaternion.LookRotation((Vector3)this.startNode.position - fauna.tr.position); Vector3 vector = position + quaternion * Vector3.right * 3f + quaternion * Vector3.forward * Random.Range(0f, 1f); for (int i = 0; i < this.allTiles.Count; i++) { GraphNode graphNode2 = this.allTiles[i]; float sqrMagnitude = (vector - (Vector3)graphNode2.position).sqrMagnitude; if (sqrMagnitude < num && graphNode2 != currentNode) { num = sqrMagnitude; graphNode = graphNode2; } } return graphNode; } // Token: 0x06000ADD RID: 2781 RVA: 0x000D7B94 File Offset: 0x000D5D94 public void FaunaRepath(Fauna faunaController) { if (this.effect._Script.Contains("Trap")) { if (this.effect._Name.Contains("Roly")) { GraphNode graphNode = this.RolyPoint(faunaController.node, faunaController); faunaController.MakePath(graphNode, faunaController.node.environment); return; } GraphNode graphNode2 = this.allTiles[Random.Range(0, this.allTiles.Count)]; faunaController.MakePath(graphNode2, faunaController.node.environment); } } // Token: 0x06000ADE RID: 2782 RVA: 0x000D7C20 File Offset: 0x000D5E20 public void SaveCreatures() { for (int i = 0; i < this.creatures.Count; i++) { if (this.creatures[i]) { this.creatures[i].SaveCreatures(); } } } // Token: 0x06000ADF RID: 2783 RVA: 0x000D7C67 File Offset: 0x000D5E67 public void Flag() { if (this.creatures.Count < this.summonAmount) { base.StartCoroutine(this.DoFlag()); } } // Token: 0x06000AE0 RID: 2784 RVA: 0x000D7C89 File Offset: 0x000D5E89 private IEnumerator DoFlag() { int amt = this.summonAmount; if (this.ability._IsSpell) { amt = 1; } int num22; for (int i = 0; i < amt; i = num22 + 1) { bool alliedToParty = false; if (this.source) { alliedToParty = !this.source.npc; } Vector3 spawnPosition = this.mainPosition; if (!this.ability._IsSpell && Links.x.gaia.pathfindingReady) { ConstantPath constPath = null; GraphNode j = this.startNode; if (this.source) { j = this.source.node; } constPath = ConstantPath.ConstructFast(j, Records.x.GetConstantPathRadius(9), null); NNConstraint nnconstraint = new NNConstraint(); nnconstraint.checkConnections = 0; nnconstraint.constrainWalkability = true; nnconstraint.walkable = true; nnconstraint.constrainTags = false; nnconstraint.checkCircleID = 0; nnconstraint.passID = 0; nnconstraint.passID2 = 0; nnconstraint.constrainPenalty = 0; nnconstraint.constrainToEnvironment = -1; if (this.source && this.source.node != null) { nnconstraint.constrainToEnvironment = this.source.node.environment; } if (j != null) { nnconstraint.constrainToArea = (int)j.Area; } if (Links.x.gaia.pathfindingReady) { constPath.nnConstraint = nnconstraint; AstarPath.StartPath(constPath, false); yield return base.StartCoroutine(constPath.WaitForPath()); constPath.Claim(this); List list = constPath.allNodes; List list2 = new List(); int count = list.Count; Vector3 vector = (Vector3)j.position; int num = count - 1; int num2 = 0; for (int l = num; l >= 0; l--) { float sqrMagnitude = (vector - (Vector3)list[l].position).sqrMagnitude; if (sqrMagnitude > 400f && sqrMagnitude < 6400f && list[l] != j) { list2.Add(list[l]); num2++; } } if (num2 == 0) { for (int m = num; m >= 0; m--) { if ((vector - (Vector3)list[m].position).sqrMagnitude > 100f && list[m] != j) { list2.Add(list[m]); num2++; } } } if (num2 == 0) { for (int n = num; n >= 0; n--) { list2.Add(list[n]); num2++; } } if (num2 > 0) { if (num2 == 1) { spawnPosition = (Vector3)list2[0].position; } else { spawnPosition = (Vector3)list2[Random.Range(0, num2)].position; } } constPath.Release(this, false); } constPath = null; j = null; } float num3 = Links.x.gameplay.seconds + this.timeToWait; if (this.overallTime <= 0) { num3 = 0f; this.timeToWait = 0f; } bool flag = true; bool flag2 = false; bool flag3 = false; string text = this.effect._Name; if (text.Contains("Friend")) { text = this.itemInfo; } if (text.Contains("Summon")) { this.attacksAllowed = 1; if (text.Contains("Redbird")) { this.attacksAllowed = 2; } } else { if (!alliedToParty && text == "AcornMen") { text += "NPC"; } if (text == "FindShroomer") { flag = false; alliedToParty = false; if (this.spellData.y <= 1f) { int num4 = Random.Range(0, 2); if (num4 == 0) { text = "ShroomerEasy"; } if (num4 == 1) { text = "ShroomerFlyer"; } } else if (this.spellData.y > 1f && this.spellData.y <= 2f) { int num5 = Random.Range(0, 2); if (num5 == 0) { text = "Shroomer"; } if (num5 == 1) { text = "ShroomerBomber"; } } else { int num6 = Random.Range(0, 2); if (num6 == 0) { text = "GoldShroomer"; } if (num6 == 1) { text = "SporeShroomerMed"; } } flag2 = true; this.needsCreatureSave = true; if (this.source.party) { flag3 = true; } } if (text == "FindForest") { flag = false; alliedToParty = false; if (this.spellData.y <= 1f) { int num7 = Random.Range(0, 2); if (num7 == 0) { text = "Fox"; } if (num7 == 1) { text = "ImpRat"; } } else if (this.spellData.y > 1f && this.spellData.y <= 2f) { int num8 = Random.Range(0, 2); if (num8 == 0) { text = "Bakka"; } if (num8 == 0) { text = "StickBakka"; } if (num8 == 1) { text = "SandFox"; } } else { int num9 = Random.Range(0, 3); if (num9 == 0) { text = "SandFox"; } if (num9 == 1) { text = "HillBakka"; } if (num9 == 1) { text = "MountainBakka"; } } flag2 = true; this.needsCreatureSave = true; if (this.source.party) { flag3 = true; } } if (text == "FindFish") { flag = false; alliedToParty = false; if (this.spellData.y <= 1f) { int num10 = Random.Range(0, 2); if (num10 == 0) { text = "Insectoo"; } if (num10 == 1) { text = "FishMonster"; } } else if (this.spellData.y > 1f && this.spellData.y <= 2f) { int num11 = Random.Range(0, 2); if (num11 == 0) { text = "FishMonsterPoison"; } if (num11 == 0) { text = "InsectooYellow"; } } else { int num12 = Random.Range(0, 3); if (num12 == 0) { text = "FishMonsterPoison"; } if (num12 == 1) { text = "InsectooYellow"; } } flag2 = true; this.needsCreatureSave = true; if (this.source.party) { flag3 = true; } } } Quaternion quaternion = Quaternion.Euler(Vector3.zero); if (this.source) { quaternion = Quaternion.LookRotation(this.source.tr.position - spawnPosition); } else { quaternion = Quaternion.Euler(new Vector3(Random.Range(-180f, 180f), 0f, Random.Range(-180f, 180f))); } CreatureActions creatureActions = Links.x.gaia.CreateCreature(spawnPosition, quaternion, text, alliedToParty, num3, 1); this.creatures.Add(creatureActions); creatureActions.SetTileEffect(this); Character summon = creatureActions.GetFirstCharacter(); if (flag2) { creatureActions.onlyTemporary = true; string text2 = creatureActions.gameObject.name; text2 += i.ToString(); text2 += "_"; text2 += Links.x.gameplay.seconds.ToString(); creatureActions.gameObject.name = text2; summon.gameObject.name = text2; creatureActions.UpdateName(); } if (this.source) { summon.TransferLKP(this.source); } summon.jumpingPosition = false; if (flag3 && this.source.inTown) { Character character = null; int num13 = Links.x.combat.NPCCount(true); int num15; int num14 = Links.x.sensory.NonHostileAttacked(null, base.gameObject.transform.position, this.source, false, true, out character, out num15); int num16 = Links.x.combat.NPCCount(true); if (Records.x.editor) { string[] array = new string[10]; array[0] = "Alert owner non-hostile seen count "; array[1] = num14.ToString(); array[2] = " made noise "; array[3] = true.ToString(); array[4] = " offended character "; int num17 = 5; Character character2 = character; array[num17] = ((character2 != null) ? character2.ToString() : null); array[6] = " start npc count "; array[7] = num13.ToString(); array[8] = " current npc count "; array[9] = num16.ToString(); Debug.Log(string.Concat(array)); } if (character && num13 == 0 && !character.party && !Links.x.sensory.ProofState(character)) { Records.x.AddBribeBadge(character, "Seen", false, this.source); } } if (this.ability._IsSpell) { if (this.source) { float num18; string text3; if (this.doSpellScroll || this.fromEnchantedItem) { num18 = Mathf.Round(this.tether); text3 = this.source.stats.PaganPowerCalculation(false, this.tether, true); } else { num18 = Mathf.Round(this.source.stats.PaganPower(this.tether, false)); text3 = this.source.stats.PaganPowerCalculation(false, this.tether, false); } this.sourceLevel = num18; if (flag) { Effects effects = summon.gameObject.AddComponent(); Links.x.cellar.AddEffects(effects); effects.source = this.source; effects.target = summon; effects.targetInteractive = null; effects.fromLoad = false; effects.effectName = "SummonFighterPotency"; effects.sourceLevel = this.sourceLevel; effects.Inflicted(true); this.str.Clear(); if (!this.source.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(this.source)); } this.str.Append(this.source.stats.GetName()); if (!this.source.npc) { this.str.Append(""); } this.str.Append(" summoned a level "); this.str.Append(this.sourceLevel); this.str.Append(" "); this.str.Append(summon.stats.GetName()); if (Records.x.showRulesetInfo) { this.str.Append(" ... "); this.str.Append(text3); this.str.Append(""); } Links.x.gameFeed.AddFeed(this.str.ToString()); } else { this.str.Clear(); if (!this.source.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(this.source)); } this.str.Append(this.source.stats.GetName()); if (!this.source.npc) { this.str.Append(""); } this.str.Append(" summoned "); this.str.Append(summon.stats.GetName()); Links.x.gameFeed.AddFeed(this.str.ToString()); } if (this.source.party) { summon.GetFriendDock(this.source); } } yield return new WaitForSeconds(0.05f); } else { summon.ClearPathUpdates(); summon.ignoreNodeIDs = true; GraphNode graphNode = this.source.NearNode(this.source.tr.position, false, 0, -1, 0); summon.MakePath(graphNode, 200, false, false, true); summon.pipeSummons = true; bool found = false; Effects effects2 = summon.gameObject.AddComponent(); effects2.source = null; effects2.target = summon; effects2.fromLoad = false; effects2.effectName = "SecretInvisible"; effects2.sourceLevel = 0f; effects2.Inflicted(false); float num19 = 0f; float num20 = Records.x.SongSkillMultiplier(this.sourceLevel); float num21 = this.source.stats.InstrumentPower(this.severity, this.ability._WeaponReq, false, out num19); string text4 = this.source.stats.InstrumentPowerCalculation(false, this.ability._WeaponReq, num19, true, this.sourceLevel, "Pipe"); this.sourceLevel = this.source.stats.R1(num20); this.str.Clear(); if (!this.source.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(this.source)); } this.str.Append(this.source.stats.GetName()); if (!this.source.npc) { this.str.Append(""); } this.str.Append(" summoned a level "); this.str.Append(this.sourceLevel); this.str.Append(" "); this.str.Append(summon.stats.GetName()); if (Records.x.showRulesetInfo) { this.str.Append(" ... "); this.str.Append(text4); this.str.Append(""); } Links.x.gameFeed.AddFeed(this.str.ToString()); effects2 = summon.gameObject.AddComponent(); Links.x.cellar.AddEffects(effects2); effects2.source = this.source; effects2.target = summon; effects2.targetInteractive = null; effects2.fromLoad = false; effects2.effectName = "PipePotency"; effects2.sourceLevel = num21; effects2.Inflicted(true); for (int k = 0; k < 50; k = num22 + 1) { if (!found) { yield return new WaitForSeconds(2f); if (summon) { if (summon.IsSentient()) { if ((this.source.tr.position - summon.tr.position).sqrMagnitude <= 400f) { found = true; break; } summon.ClearPathUpdates(); summon.MakePath(this.source.node, 200, false, false, true); } else { found = true; } } else { found = true; } } num22 = k; } } this.currentlySummoned++; spawnPosition = default(Vector3); summon = null; num22 = i; } yield break; } // Token: 0x06000AE1 RID: 2785 RVA: 0x000D7C98 File Offset: 0x000D5E98 public int ReturnCreatureCount() { return this.creatures.Count; } // Token: 0x06000AE2 RID: 2786 RVA: 0x000D7CA8 File Offset: 0x000D5EA8 public void SetSpellMaterial(float curr, float max) { for (int i = 0; i < this.pooledEffects.Count; i++) { if (this.pooledEffects[i]) { SetSpellMaterial component = this.pooledEffects[i].GetComponent(); Debug.Log(component); if (component) { component.Set(curr, max); } } } } // Token: 0x06000AE3 RID: 2787 RVA: 0x000D7D08 File Offset: 0x000D5F08 public void RemoveTile(GraphNode n, GameObject pooledObject, BreakableActions b) { int num = this.effectTiles.IndexOf(n); if (num > -1) { this.effectTiles.RemoveAt(num); this.hasTile.RemoveAt(num); } if (b) { int num2 = this.breakables.IndexOf(b); if (num2 > -1) { this.breakables.RemoveAt(num2); } } if (!this.isInstrument) { num = this.pooledEffects.IndexOf(pooledObject); } if (num > -1) { this.pooledEffects.RemoveAt(num); } if (this.animators.Count > 0) { if (num < this.animators.Count && num > -1) { this.animators[num].enabled = true; this.animators[num].Play("End"); this.animators[num].gameObject.GetComponent().id = this.ability._FX; this.animators.RemoveAt(num); return; } } else { Links.x.cellar.ReturnPooledGameObject(this.ability._FX, pooledObject); } } // Token: 0x06000AE4 RID: 2788 RVA: 0x000D7E20 File Offset: 0x000D6020 public void RemoveSummons(CreatureActions creature, Vector3 pt) { int num = this.creatures.IndexOf(creature); if (num > -1) { this.creatures.RemoveAt(num); } this.str.Clear(); this.str.Append("Summoned creature has left"); Links.x.gameFeed.AddFeed(this.str.ToString()); if (!this.effect._Name.Contains("Summon")) { creature.Unsummon(this.doSpellScroll); GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(32); pooledGameObject.SetActive(true); pooledGameObject.transform.position = pt; } else if (creature && creature.GetFirstCharacter()) { if (Links.x.gaia.sceneLoaded && Links.x.gaia.pathfindingReady && !Links.x.gaia.waitingToRemoveScene) { creature.GetFirstCharacter().Leave(false); } else { creature.GetFirstCharacter().Missing(); } } if (creature) { Object.Destroy(creature.gameObject); } } // Token: 0x06000AE5 RID: 2789 RVA: 0x000D7F40 File Offset: 0x000D6140 public void Remove() { if (!this.removing && this) { if (this.scatterRoutine != null) { base.StopCoroutine(this.scatterRoutine); this.scatterRoutine = null; this.inScatter = false; } this.removeRoutine = this.Removing(); base.StartCoroutine(this.removeRoutine); } } // Token: 0x06000AE6 RID: 2790 RVA: 0x000D7F98 File Offset: 0x000D6198 private IEnumerator Removing() { this.removing = true; this.removeTime = Links.x.gameplay.seconds; if (this.songFX) { if (this.effect._IsBuff) { this.source.RemoveEffect(72, "", true); } else { this.source.RemoveEffect(34, "", true); } } if (Records.x.effectsDebugging) { Debug.Log(((this != null) ? this.ToString() : null) + " removing tile effect " + this.effect._Name); } if (this.effect._WhileOnTile) { for (int j = 0; j < this.affectedCharacters.Count; j++) { if (this.affectedCharacters[j]) { this.affectedCharacters[j].stats.RemoveTileEffect(this.affectedCharacterEffects[j]); } } for (int k = 0; k < this.affectedObjectsEffects.Count; k++) { if (k < this.affectedObjectsEffects.Count && this.affectedObjectsEffects[k]) { this.affectedObjectsEffects[k].Healed(false, false); } } } if (this.effect._IsSong && !this.effect._IsBuff) { List list = new List(); for (int l = 0; l < this.affectedCharacterEffects.Count; l++) { if (this.affectedCharacterEffects[l]) { list.Add(this.affectedCharacterEffects[l]); } } for (int m = 0; m < list.Count; m++) { if (list[m]) { list[m].Healed(false, true); } } } if (this.isFaunaCreature) { for (int n = 0; n < this.faunas.Count; n++) { if (this.faunas[n]) { this.faunas[n].Remove(); } } } for (int num = 0; num < this.creatures.Count; num++) { if (this.creatures[num]) { this.RemoveSummons(this.creatures[num], this.creatures[num].GetPoint()); } } if (!this.source) { for (int num2 = 0; num2 < this.creatures.Count; num2++) { if (this.creatures[num2]) { Object.Destroy(this.creatures[num2].gameObject); } } } int num3; for (int i = 0; i < this.pooledEffects.Count; i = num3 + 1) { if (this.pooledEffects[i]) { if (this.hasAbility && (this.ability._FX == 29 || this.ability._FX == 108) && this.pooledEffects[i]) { this.breakable = this.pooledEffects[i].GetComponent(); if (this.breakable) { this.breakable.effectID = this.ability._FX; this.breakable.Remove(); } } if (this.animators.Count > 0) { if (this.animators[i]) { this.animators[i].enabled = true; this.animators[i].Play("End"); this.animators[i].gameObject.GetComponent().id = this.ability._FX; } } else if (this.pooledEffects[i]) { Links.x.cellar.ReturnPooledGameObject(this.fx, this.pooledEffects[i]); } if (this.effect._Name.Contains("Moss") && !Links.x.cellar.OtherListHasTile(this, this.effectTiles[i], "Moss") && this.effectTiles[i] != null) { this.effectTiles[i].SetFlowerConnectionsEnvironment("Original", 0); if (this.effectTiles[i].ID > 2 && Links.x.main && ((Vector3)this.effectTiles[i].position - Links.x.main.currentPosition).sqrMagnitude > 1600f) { Character nodeCharacter = Links.x.main.GetNodeCharacter(this.effectTiles[i].ID); if (nodeCharacter && nodeCharacter.npc && nodeCharacter.creatures) { GraphNode walkIndex = nodeCharacter.creatures.GetWalkIndex(0); if (walkIndex != null) { nodeCharacter.SetPosition((Vector3)walkIndex.position, walkIndex); nodeCharacter.FirstPosition(walkIndex); if (Records.x.editor) { Debug.Log("Removing NPC from vine rug"); } } } } } if (this.setPenalty && !Links.x.cellar.OtherListHasTile(this, this.effectTiles[i], "") && this.effectTiles[i] != null) { this.effectTiles[i].GetErosionPenalty(); } if (!this.isInstrument && Links.x.gaia.sceneLoaded) { yield return new WaitForSeconds(0.02f); } while (Records.x.pocketPause) { yield return null; } } num3 = i; } if (this.centerFX) { Links.x.cellar.ReturnPooledGameObject(this.ability._CenterFX, this.centerFX); this.centerFX = null; } Links.x.cellar.RemoveTileEffect(this); Object.Destroy(this); yield break; } // Token: 0x06000AE7 RID: 2791 RVA: 0x000D7FA8 File Offset: 0x000D61A8 public bool HasTile(GraphNode n) { int count = this.effectTiles.Count; for (int i = 0; i < count; i++) { if (i < this.effectTiles.Count && this.effectTiles[i] == n) { return true; } } return false; } // Token: 0x06000AE8 RID: 2792 RVA: 0x000D7FF0 File Offset: 0x000D61F0 public bool ShouldBeDone() { if (this.waitingForTargetDeath) { return true; } if (this.removing) { return false; } this.currentTime = Links.x.gameplay.seconds; if ((float)((int)this.currentTime) > this.timeToWait + this.effectStartTime + 100f && !this.effect._Name.Contains("Moss")) { Debug.Log("Found effect that should have stopped save " + ((this != null) ? this.ToString() : null) + " " + this.effect._Name); return true; } return this.summonAmount > 0; } // Token: 0x06000AE9 RID: 2793 RVA: 0x000D8094 File Offset: 0x000D6294 private void Update() { if ((!Records.x.pocketPause && Links.x.gaia.sceneLoaded && !Records.x.removeControls && !Records.x.paused && !Links.x.combat.inPocketAttack) || Records.x.partyCamping) { this.UpdateEffectTime(); } } // Token: 0x06000AEA RID: 2794 RVA: 0x000D80FC File Offset: 0x000D62FC public void UpdateEffectTime() { this.currentTime = Links.x.gameplay.seconds; if (this.removing && this.currentTime > this.removeTime + 180f) { if (Records.x.editor) { Debug.Log("Remove routine stuck for " + this.effect._Name); } this.removing = false; if (this.removeRoutine != null) { base.StopCoroutine(this.removeRoutine); this.removeRoutine = null; } } if (this.ready && !this.removing) { if (this.waitingForTargetDeath) { return; } if (this.overallTime > 0 && !this.removing) { if (this.summonAmount == 0 && !this.isInstrument && this.source) { if (this.source.dead || this.source.stunned) { this.Remove(); return; } if (this.customTileAI && this.spellTarget && (this.spellTarget.dead || this.spellTarget.stunned)) { this.Remove(); return; } } if ((float)((int)this.currentTime) > this.timeToWait + this.effectStartTime) { if (this.inScatter && (!this.inScatter || this.currentTime <= this.scatterPassTime + 72f || this.summonAmount != 0)) { if (Records.x.effectsDebugging) { Debug.Log("Removing effect: " + Time.timeSinceLevelLoad.ToString() + " " + Links.x.gameplay.seconds.ToString()); } this.waitingToRemove = true; return; } if (!this.effect._Name.Contains("Moss")) { this.Remove(); return; } bool flag = true; int count = this.effectTiles.Count; Vector3 position = Links.x.main.tr.position; for (int i = 0; i < count; i++) { if ((this.effectTiles[i].ID > 2 || ((Vector3)this.effectTiles[i].position - position).sqrMagnitude < 9f) && Links.x.main) { if (((Vector3)this.effectTiles[i].position - Links.x.main.tr.position).sqrMagnitude <= 1600f) { flag = false; break; } Character nodeCharacter = Links.x.main.GetNodeCharacter(this.effectTiles[i].ID); if (nodeCharacter) { if (!nodeCharacter.npc || !nodeCharacter.creatures) { flag = false; break; } GraphNode walkIndex = nodeCharacter.creatures.GetWalkIndex(0); if (walkIndex != null) { nodeCharacter.SetPosition((Vector3)walkIndex.position, walkIndex); nodeCharacter.FirstPosition(walkIndex); if (Records.x.editor) { Debug.Log("Removing NPC from vine rug"); } } } } } if (flag) { if (Records.x.effectsDebugging) { Debug.Log("Removing effect: " + Time.timeSinceLevelLoad.ToString() + " " + Links.x.gameplay.seconds.ToString()); } this.Remove(); return; } } else if (this.summonAmount > 0 && !this.isInstrument && this.creatures.Count == 0 && this.currentlySummoned > 0 && !this.isFaunaCreature) { this.Remove(); return; } } else if (this.isInstrument && this.effect._Name.Contains("Summon")) { int num = 0; for (int j = 0; j < this.creatures.Count; j++) { if (this.creatures[j]) { Character firstCharacter = this.creatures[j].GetFirstCharacter(); if (firstCharacter && firstCharacter.IsSentient()) { int num2 = 0; if (firstCharacter.actions && firstCharacter.actions.ai) { num2 = firstCharacter.actions.ai.GetSeenCount(); } if (firstCharacter.stats.attackCount >= this.attacksAllowed || (Links.x.gameplay.seconds > this.effectStartTime + 20f && num2 == 0)) { this.RemoveSummons(this.creatures[j], this.creatures[j].GetPoint()); num++; } } } } if (Links.x.gaia.waitingToRemoveScene || (this.creatures.Count == 0 && num > 0)) { this.Remove(); } } } } // Token: 0x06000AEB RID: 2795 RVA: 0x000D8626 File Offset: 0x000D6826 public string GetEffectName() { if (this.hasAbility) { return this.ability._Name; } return this.effect._Name; } // Token: 0x06000AEC RID: 2796 RVA: 0x000D8648 File Offset: 0x000D6848 public void CheckTileBreakable(GraphNode n, BreakableActions breakable) { int count = this.allTiles.Count; Vector3 position = breakable.gameObject.transform.position; Vector3 vector = Vector3.zero; for (int i = 0; i < count; i++) { vector = (Vector3)this.allTiles[i].position; float num = vector.x - position.x; if (num < 0f) { num *= -1f; } if (num < this.tileRadius) { float num2 = vector.z - position.z; if (num2 < 0f) { num2 *= -1f; } if (num2 < this.tileRadius) { breakable.ClickToBreak(null, false, false); return; } } } } // Token: 0x06000AED RID: 2797 RVA: 0x000D8700 File Offset: 0x000D6900 public void Recast() { this.resistedCharacters.Clear(); this.resistedCharacterNodePosition.Clear(); } // Token: 0x06000AEE RID: 2798 RVA: 0x000D8718 File Offset: 0x000D6918 public void RemoveCharacterEffect(Character target, Effects eff) { if (this.effect._IsSong && !this.effect._IsBuff) { return; } int num = -1; int count = this.affectedCharacters.Count; for (int i = 0; i < count; i++) { if ((this.affectedCharacters[i] == target && eff == this.affectedCharacterEffects[i]) || !this.affectedCharacterEffects[i]) { num = i; } } if (num > -1) { this.affectedCharacters.RemoveAt(num); this.affectedCharacterEffects.RemoveAt(num); this.affectedPotency.RemoveAt(num); } if (Records.x.effectsDebugging) { Debug.Log("removing " + ((target != null) ? target.ToString() : null)); } this.resistedCharacters.Add(target); if (target.tr) { this.resistedCharacterNodePosition.Add(target.tr.position); return; } this.resistedCharacterNodePosition.Add(Vector3.zero); } // Token: 0x06000AEF RID: 2799 RVA: 0x000D8828 File Offset: 0x000D6A28 public void CheckTileInteractive(GameObject t) { if (!this.effect._ShowInStatus) { return; } if (this.removing || this.waitingToRemove) { return; } if (this.effect._Health != 0f) { if (this.singleTargetInteractive) { if (this.effectTiles[0] != null) { this.RollForEffect(this.effectTiles[0], (Vector3)this.effectTiles[0].position, this.effectTiles[0], null, t, 3f); return; } } else { this.breakableTarget = t.GetComponent(); this.chestTarget = t.GetComponent(); this.doorTarget = t.GetComponent(); GraphNode graphNode = null; if (this.breakableTarget && this.breakableTarget.node != null) { graphNode = this.breakableTarget.node; } if (this.chestTarget && this.chestTarget.node != null) { graphNode = this.chestTarget.node; } if (this.doorTarget && this.doorTarget.node != null) { graphNode = this.doorTarget.node; } if (graphNode == null) { NNConstraint nnconstraint = new NNConstraint(); nnconstraint.constrainWalkability = true; nnconstraint.walkable = true; nnconstraint.constrainPenalty = 0; nnconstraint.constrainTags = false; nnconstraint.checkCircleID = 0; nnconstraint.passID = 0; nnconstraint.passID2 = 0; nnconstraint.checkConnections = 0; nnconstraint.constrainToArea = -1; graphNode = AstarPath.active.GetNearest(t.transform.position, nnconstraint).node; if (this.breakableTarget) { this.breakableTarget.node = graphNode; } if (this.chestTarget) { this.chestTarget.node = graphNode; } if (this.doorTarget) { this.doorTarget.node = graphNode; } } int count = this.effectTiles.Count; bool flag = false; for (int i = 0; i < count; i++) { if (!flag) { if (this.effectTiles[0] != null) { flag = this.RollForEffect(this.effectTiles[0], (Vector3)this.effectTiles[0].position, graphNode, null, t, 3f); } if (flag) { break; } } } } } } // Token: 0x06000AF0 RID: 2800 RVA: 0x000D8A74 File Offset: 0x000D6C74 public bool CheckTile(GraphNode targetTile, Character target, bool reRoll) { if (!this.effect._ShowInStatus) { return false; } if (target.isBoro) { return false; } if (target.stunned || target.dead) { return false; } if (this.removing || this.waitingToRemove) { return false; } if (Links.x.combat.inRally || Links.x.combat.inPocketAttack) { return false; } if (this.isPoison && target.stats.isFishMonster) { return false; } if (this.isInstrument && this.pooledEffects.Count == 0) { return false; } bool flag = true; if (this.hasAbility) { int num = this.affectedCharacters.IndexOf(target); if (num > -1 && num < this.affectedCharacterEffects.Count) { if (this.affectedCharacterEffects[num] != null) { flag = false; } else { this.affectedCharacters.RemoveAt(num); this.affectedCharacterEffects.RemoveAt(num); this.affectedPotency.RemoveAt(num); if (Records.x.effectsDebugging) { Debug.Log("removing " + ((target != null) ? target.ToString() : null)); } } } } if (!reRoll) { int num2 = this.resistedCharacters.IndexOf(target); if (num2 > -1) { if (this.isInstrument) { flag = false; } else if ((this.resistedCharacterNodePosition[num2] - target.tr.position).sqrMagnitude < Records.x.nodeSize * Records.x.nodeSize) { flag = false; } else { this.resistedCharacterNodePosition.RemoveAt(num2); this.resistedCharacters.RemoveAt(num2); } } } if (this.customTileAI && target == this.source) { flag = false; } if (this.hasAbility) { int targetsFaction = this.ability._TargetsFaction; if (this.source && !this.isSingleTarget) { if (targetsFaction == 3) { if (this.source.vipFollow) { if (target.npc && target.hostility > 1) { flag = false; } } else if ((!target.npc || !this.source.npc || this.source.stats.IsTargetAnEnemy(target.stats.allegiance)) && (target.npc || this.source.npc)) { flag = false; } } else if (targetsFaction == 1) { if (target != this.source) { flag = false; } } else if (targetsFaction == 8 || targetsFaction == 5 || targetsFaction == 4) { if (this.source.vipFollow) { if (!target.npc || target.hostility <= 1) { flag = false; } } else if ((target.npc && this.source.npc) || (!target.npc && !this.source.npc && !this.source.stats.IsTargetAnEnemy(target.stats.allegiance))) { flag = false; } } if (!this.isInstrument && (target.stats.flying || target.stats.Floating() > 0)) { bool flag2 = true; if (this.hasAbility && !this.ability._OnGround) { flag2 = false; } if (!flag2) { flag = false; } } } else { flag = true; } } int count = this.effectTiles.Count; bool flag3 = false; bool flag4 = false; float num3 = this.tileRadius + target.attackRadius; if (!this.effect._CanStack && target) { if (target.stats.HasEffect(this.effect._Name)) { flag = false; } } if (flag) { if (this.isFaunaCreature && this.faunas != null) { int count2 = this.faunas.Count; } for (int i = 0; i < count; i++) { if (!flag3) { if (this.doWave && this.pooledEffects[i] && !this.pooledEffects[i].activeSelf) { this.hasTile[i] = false; } if (this.hasTile[i]) { GraphNode graphNode = this.effectTiles[i]; if (this.isFaunaCreature) { if (this.faunas != null) { if (this.faunas[i]) { graphNode = this.faunas[i].node; } else { graphNode = null; } } else { graphNode = null; } } if (graphNode != null) { Vector3 vector = (Vector3)graphNode.position; if (this.isFaunaCreature) { vector = this.faunas[i].tr.position; } flag3 = this.RollForEffect(graphNode, vector, targetTile, target, null, num3); if (Records.x.effectsDebugging) { Debug.Log(string.Concat(new string[] { (target != null) ? target.ToString() : null, " on tile ", i.ToString(), " ", flag3.ToString(), " ", num3.ToString() })); } if (flag3) { break; } } } } } if (!flag3) { flag4 = true; } } if (Records.x.effectsDebugging) { Debug.Log(string.Concat(new string[] { "can roll ", (target != null) ? target.ToString() : null, " ", flag4.ToString(), " ", ((Vector3)targetTile.position).ToString(), " ", flag.ToString(), " ", flag3.ToString() })); } if (!flag && this.effect._WhileOnTile && !this.isFaunaCreature) { bool flag5 = true; int count3 = this.allTiles.Count; for (int j = 0; j < count3; j++) { if (flag5 && this.allTiles[j] != null && this.InTileRange((Vector3)this.allTiles[j].position, targetTile, target, num3, j)) { flag5 = false; } } if (flag5) { flag4 = true; } } if (!flag3 && this.effect._WhileOnTile && flag4) { int num4 = this.affectedCharacters.IndexOf(target); if (num4 > -1) { target.stats.RemoveTileEffect(this.affectedCharacterEffects[num4]); if (num4 > -1 && num4 < this.affectedCharacterEffects.Count) { this.affectedCharacterEffects.RemoveAt(num4); } if (num4 > -1 && num4 < this.affectedPotency.Count) { this.affectedPotency.RemoveAt(num4); } if (num4 > -1 && num4 < this.affectedCharacters.Count) { this.affectedCharacters.RemoveAt(num4); } if (Records.x.effectsDebugging) { Debug.Log("removing " + ((target != null) ? target.ToString() : null)); } } } return flag3; } // Token: 0x06000AF1 RID: 2801 RVA: 0x000D918C File Offset: 0x000D738C public bool InTileRange(Vector3 effectTile, GraphNode targetTile, Character target, float distance, int i) { if (!this.effect._ShowInStatus) { return false; } if (this.isSingleTarget && target == this.singleTarget) { return true; } bool flag = false; float num = target.radius; if (this.InEffectRadius(target.currentPosition, effectTile, distance)) { flag = true; } return flag; } // Token: 0x06000AF2 RID: 2802 RVA: 0x000D91E0 File Offset: 0x000D73E0 private bool InEffectRadius(Vector3 targetPosition, Vector3 effectTile, float distance) { Vector3 zero = Vector3.zero; float num = effectTile.x - targetPosition.x; if (num < 0f) { num *= -1f; } if (num < distance) { float num2 = effectTile.z - targetPosition.z; if (num2 < 0f) { num2 *= -1f; } if (num2 < distance) { return true; } } return false; } // Token: 0x06000AF3 RID: 2803 RVA: 0x000D923C File Offset: 0x000D743C public bool RollForEffect(GraphNode effectTile, Vector3 effectPosition, GraphNode targetTile, Character target, GameObject targetInteractive, float distance) { if (!this.effect._ShowInStatus) { return false; } bool flag = false; if (target) { if (this.InEffectRadius(target.tr.position, effectPosition, distance)) { flag = true; } } else if (this.InEffectRadius(targetInteractive.transform.position, effectPosition, distance)) { flag = true; } bool flag2 = false; if (targetInteractive) { this.breakableTarget = targetInteractive.GetComponent(); this.chestTarget = targetInteractive.GetComponent(); this.doorTarget = targetInteractive.GetComponent(); flag2 = true; if (this.isInstrument) { flag = false; } if (this.singleTargetInteractive && targetInteractive == this.singleTargetInteractive) { flag = true; } } if (this.isSingleTarget && this.singleTarget == target) { flag = true; } if (flag) { bool flag3 = true; if (this.isFaunaCreature) { flag3 = false; for (int i = 0; i < this.faunas.Count; i++) { if (this.faunas[i] && this.faunas[i].node == effectTile) { flag3 = true; this.faunas[i].Collide(); this.faunas[i] = null; break; } } } if (!flag3) { return false; } if (Records.x.effectsDebugging) { Debug.Log(string.Concat(new string[] { (target != null) ? target.ToString() : null, " is on ", flag.ToString(), " ", Vector3.Distance((Vector3)effectTile.position, target.tr.position).ToString() })); } if (this.hasAbility) { float num = this.sourceLevel; float num2 = 0f; string text = ""; string text2 = ""; string text3 = ""; string text4 = ""; if (this.ability._IsSpell) { if (this.doSpellScroll || this.fromEnchantedItem) { num2 = Mathf.Round(this.severity + this.tether); text2 = this.source.stats.PaganPowerCalculation(false, this.tether, true); } else { num2 = Mathf.Round(this.source.stats.PaganPower(this.tether, false)); text2 = this.source.stats.PaganPowerCalculation(false, this.tether, false); } if (this.customTileAI) { num2 = 1f; text2 = ""; num = (float)this.source.stats.level; } if (!this.fromEnchantedItem && !this.doSpellScroll) { text3 = this.source.stats.GetAbilitySpellName(this.spellIndex); } else { text3 = this.ability._DisplayName; } text4 = this.ability._MainSkill; } else if (this.isInstrument) { float num3 = 0f; float num4 = Records.x.SongSkillMultiplier(this.sourceLevel); num2 = Mathf.Round(this.source.stats.InstrumentPower(this.severity, this.ability._WeaponReq, false, out num3)); text2 = this.source.stats.InstrumentPowerCalculation(false, this.ability._WeaponReq, num3, true, this.sourceLevel, this.ability._WeaponReq); num = Mathf.Round(num4 * 10f) / 10f; if (!target.npc && this.ability._WeaponReq == "Flute") { Effects existingEffect = target.stats.GetExistingEffect("ChoraFluteBuff"); if (existingEffect) { num += existingEffect.sourceLevel; } } } float num5 = 0f; float num6 = 0f; if (!this.effect._IsBuff && !flag2) { if (!this.isInstrument) { float num7 = 0f; num5 = Mathf.Round(target.stats.PaganResistance(false, text4, out num7, out num6)); text = target.stats.PaganResistCalculation(false, num7, text4); if (this.customTileAI) { num5 = 0f; num6 = 0f; text = ""; } } else { float num8 = 0f; num5 = (float)this.GetInstrumentResistRoll(target, out num8); text = target.stats.InstrumentResistCalculation(false, num8); } if (Records.x.miniGame) { num6 = 0f; } } else if (this.effect._IsBuff && !flag2) { num5 = 0f; } if (Records.x.showRuleset && target) { if (!this.isInstrument) { if (!this.effect._IsBuff) { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s resistance to ", this.ability._DisplayName, " (", text3, ") ", num5.ToString(), " vs. potency: ", num2.ToString() })); } else { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s gets buff from ", this.ability._DisplayName, " (", text3, "), potency is: ", num2.ToString() })); } } else if (!this.effect._IsBuff) { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s resistance to ", this.ability._DisplayName, ", resist: ", num5.ToString(), " vs. potency: ", num2.ToString() })); } else { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s gets buff from ", this.ability._DisplayName, ", potency is: ", num2.ToString() })); } } if (num2 > num5 || this.effect._IsBuff) { float num9 = 0f; flag = true; string text5 = ""; if (this.ability == null) { text5 = this.AddEffect(this.effect._Name, target, targetInteractive, num, true, num); } else if (this.isInstrument) { text5 = this.AddEffect(this.ability._Name, target, targetInteractive, num, true, num); } else if (this.ability._IsSpell) { num9 = 1f - num5 / num2 * 0.75f; num9 *= 1f - num6 / 10f; if (Records.x.showRuleset) { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s spell potency reduction for ", this.ability._DisplayName, " was ", num9.ToString(), ", source level was ", num.ToString() })); } if (!this.effect._IsBuff) { num *= num9; } text5 = this.AddEffect(this.ability._Name, target, targetInteractive, num, true, num); } if (this.isInstrument) { this.source.stats.AddSkillProgress(this.source.stats.GetCombatSkillID(this.mainSkill), (float)target.combatLevel / 5f, target); } else { float num10 = 0f; if (flag2) { if (this.chestTarget) { num10 = (float)this.chestTarget.chest.health / 10f; } else if (this.doorTarget) { num10 = (float)this.doorTarget.door.health / 10f; } else if (this.breakableTarget) { num10 = (float)this.breakableTarget.breakable.health / 10f; } } else { num10 = (float)target.combatLevel / 5f; } this.source.stats.AddSkillProgress(this.source.stats.GetCombatSkillID(this.mainSkill), num10, target); } if (flag2) { if (this.effect._Sound != "" && !this.isInstrument) { MasterAudio.PlaySound3DAtVector3AndForget(this.effect._Sound, targetInteractive.transform.position, 0.8f, new float?(1f), 0f, "", null); } } else if (this.effect._Sound != "" && !this.isInstrument) { MasterAudio.PlaySound3DAtVector3AndForget(this.effect._Sound, target.tr.position, 0.8f, new float?(1f), 0f, "", null); } if (!this.effect._IsBuff) { this.str.Clear(); if (!flag2) { if (!target.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(target)); } this.str.Append(target.stats.GetName()); if (!target.npc) { this.str.Append(""); } } else { if (this.chestTarget) { this.str.Append("Chest"); } if (this.doorTarget) { this.str.Append("Door"); } if (this.breakableTarget) { this.str.Append("Breakable"); } } this.str.Append(": "); if (this.ability._IsSpell) { this.str.Append(text3); } else { this.str.Append(this.ability._DisplayName); } if (num > 0f) { this.str.Append(" level "); this.str.Append(Mathf.Round(num * 10f) / 10f); if (this.ability._IsSpell && !flag2 && Records.x.showRulesetInfo && text2 != "") { this.str.Append(" (Resist reduction: "); this.str.Append(Mathf.Round((1f - num9) * 10f) / 10f * 100f); this.str.Append("%)"); } } if (text5 != "") { this.str.Append(", "); this.str.Append(text5); } if (Records.x.showRulesetInfo && text2 != "") { this.str.Append(" ... "); if (!flag2) { this.str.Append(text2); this.str.Append(" vs. "); this.str.Append(text); } else { this.str.Append(text2); } this.str.Append(""); } if (!Records.x.miniGame) { Links.x.gameFeed.AddFeed(this.str.ToString()); } } else { this.str.Clear(); if (!flag2) { if (!target.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(target)); } this.str.Append(target.stats.GetName()); if (!target.npc) { this.str.Append(""); } } else { if (this.chestTarget) { this.str.Append("Chest"); } if (this.doorTarget) { this.str.Append("Door"); } if (this.breakableTarget) { this.str.Append(this.breakableTarget.breakable.type.ToString()); } } this.str.Append(": "); if (this.ability._IsSpell) { this.str.Append(text3); } else { this.str.Append(this.ability._DisplayName); } if (num > 0f) { this.str.Append(" level "); this.str.Append(Mathf.Round(num * 10f) / 10f); } if (text5 != "") { this.str.Append(", "); this.str.Append(text5); } if (Records.x.showRulesetInfo && text2 != "") { this.str.Append(" ... "); this.str.Append(text2); this.str.Append(""); } if (!Records.x.miniGame) { Links.x.gameFeed.AddFeed(this.str.ToString()); } } } else { flag = false; if (!this.resistedCharacters.Contains(target) || flag2) { if (!flag2) { this.resistedCharacters.Add(target); this.resistedCharacterNodePosition.Add(target.tr.position); } if (target) { GameObject pooledGameObject = Links.x.cellar.GetPooledGameObject(86); pooledGameObject.transform.position = target.body.HeadPosition(0.5f); pooledGameObject.SetActive(true); } this.str.Clear(); if (!flag2) { if (!target.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(target)); } this.str.Append(target.stats.GetName()); if (!target.npc) { this.str.Append(""); } } else { if (this.chestTarget) { this.str.Append("Chest"); } if (this.doorTarget) { this.str.Append("Door"); } if (this.breakableTarget) { this.str.Append("Breakable"); } } this.str.Append(" blocked "); this.str.Append(this.ability._DisplayName); if (Records.x.showRulesetInfo && text2 != "") { this.str.Append(" ... "); if (!flag2) { this.str.Append(text2); this.str.Append(" vs. "); this.str.Append(text); } else { this.str.Append(text2); } this.str.Append(""); } Links.x.gameFeed.AddFeed(this.str.ToString()); } } } else { int num11 = 0; float num12 = 0f; if (!flag2 && !(this.effect._StatToResist == "Spore")) { int num13; num11 = Mathf.RoundToInt(target.stats.Stat(this.effect._StatToResist, true, out num13)); if (num11 < 0) { num11 = 0; } } int num14 = Random.Range(1, num11 + 1); if (!flag2) { num12 = Mathf.Round(target.stats.Balance() + (float)num14); } string text6 = target.stats.BalanceResist((float)num14, this.effect._StatToResist); if (num11 == 0) { } float num15 = Mathf.Round((float)this.effect._BalanceCheck); string text7 = target.stats.BalanceCheck(Mathf.Round((float)this.effect._BalanceCheck)); if (Records.x.showRuleset) { if (!this.effect._IsBuff) { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s resistance to ", this.effect._DisplayName, ", resist: ", num12.ToString(), " vs. potency: ", this.effect._BalanceCheck.ToString(), ", balance: ", target.stats.Balance().ToString(), ", ", this.effect._StatToResist, ": ", num11.ToString() })); } else { Debug.Log(string.Concat(new string[] { target.stats.GetName(), "'s gets buff from ", this.effect._DisplayName, ", potency is: ", this.effect._BalanceCheck.ToString() })); } } bool flag4 = false; bool flag5 = false; if (this.effect._StatToResist == "Spore") { if (target.stats.xmlName.Contains("Spore")) { flag4 = true; } else { flag5 = true; } } if (!flag5 && (num15 >= num12 || this.effect._IsBuff || flag4)) { flag = true; string text8; if (this.ability == null) { text8 = this.AddEffect(this.effect._Name, target, targetInteractive, 0f, true, this.sourceLevel); } else { text8 = this.AddEffect(this.ability._Name, target, targetInteractive, 0f, true, this.sourceLevel); } if (this.effect._RemoveOnHit) { int num16 = this.effectTiles.IndexOf(effectTile); if (num16 > -1) { if (this.pooledEffects[num16]) { Links.x.cellar.ReturnPooledGameObject(this.fx, this.pooledEffects[num16]); } this.pooledEffects[num16] = null; this.effectTiles[num16] = null; this.hasTile[num16] = false; } } this.str.Clear(); if (!flag2) { if (!target.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(target)); } this.str.Append(target.stats.GetName()); if (!target.npc) { this.str.Append(""); } } else { if (this.chestTarget) { this.str.Append("Chest"); } if (this.doorTarget) { this.str.Append("Door"); } if (this.breakableTarget) { this.str.Append(this.breakableTarget.breakable.type.ToString()); } } this.str.Append(": "); this.str.Append(this.effect._DisplayName); if (text8 != "") { this.str.Append(", "); this.str.Append(text8); } if (!this.effect._IsBuff && !flag4 && Records.x.showRulesetInfo) { this.str.Append(" ... "); if (!flag2) { this.str.Append(text7); this.str.Append(" vs. "); this.str.Append(text6); } else { this.str.Append(text7); } this.str.Append(""); } Links.x.gameFeed.AddFeed(this.str.ToString()); if (!this.hasAbility && this.effect._Sound != "" && !this.isInstrument) { MasterAudio.PlaySound3DAtVector3AndForget(this.effect._Sound, target.tr.position, 0.8f, new float?(1f), 0f, "", null); } } else { flag = false; if (!this.resistedCharacters.Contains(target) || flag2) { if (!flag2) { this.resistedCharacters.Add(target); this.resistedCharacterNodePosition.Add(target.tr.position); } if (target) { GameObject pooledGameObject2 = Links.x.cellar.GetPooledGameObject(86); pooledGameObject2.transform.position = target.body.HeadPosition(0.5f); pooledGameObject2.SetActive(true); } this.str.Clear(); if (!flag2) { if (!target.npc) { this.str.Append(Links.x.gameFeed.GetPartyColorText(target)); } this.str.Append(target.stats.GetName()); if (!target.npc) { this.str.Append(""); } } else { if (this.chestTarget) { this.str.Append("Chest"); } if (this.doorTarget) { this.str.Append("Door"); } if (this.breakableTarget) { this.str.Append("Breakable"); } } this.str.Append(" evaded "); this.str.Append(this.effect._DisplayName); if (Records.x.showRulesetInfo) { this.str.Append(" ... "); if (!flag2) { this.str.Append(text7); this.str.Append(" vs. "); this.str.Append(num12); } else { this.str.Append(text7); } this.str.Append(""); } Links.x.gameFeed.AddFeed(this.str.ToString()); } } } } return flag; } // Token: 0x06000AF4 RID: 2804 RVA: 0x000DA970 File Offset: 0x000D8B70 private int GetInstrumentResistRoll(Character target, out float luck) { luck = 0f; return (int)Mathf.Ceil(target.stats.InstrumentResistance(false, out luck)); } // Token: 0x06000AF5 RID: 2805 RVA: 0x000DA98C File Offset: 0x000D8B8C public string AddEffect(string abilityName, Character target, GameObject targetInteractive, float potency, bool addToList, float lvl) { if (!this.effect._CanStack && target && target.stats.HasEffect(this.effect._Name)) { return null; } Effects effects; if (target) { effects = target.gameObject.AddComponent(); } else { effects = targetInteractive.AddComponent(); } Links.x.cellar.AddEffects(effects); effects.gameObject.SetActive(true); effects.source = this.source; effects.target = target; effects.targetInteractive = targetInteractive; effects.fromLoad = false; effects.effectName = this.GetEffectName(); effects.removeAtSceneSwitch = true; effects.tileEffect = this; effects.sourceLevel = lvl; effects.durability = this.sourceDurability; effects.overrideDuration = this.effectTileOverrideDuration; string text = effects.Inflicted(true); if (addToList) { if (target) { this.affectedCharacters.Add(target); this.affectedCharacterEffects.Add(effects); this.affectedPotency.Add(potency); } else { this.affectedObjects.Add(targetInteractive); this.affectedObjectsEffects.Add(effects); } } if (this.hasAbility && this.source && target && this.singleTarget == target && !this.effect._IsBuff && !this.source.dead && !this.source.stunned && !target.dead && !target.stunned) { Links.x.sensory.AddPlayerFromDamage(target, this.source); } return text; } // Token: 0x06000AF6 RID: 2806 RVA: 0x000DAB28 File Offset: 0x000D8D28 private bool IsInstrument(string type) { return type == "Flute" || type == "Pipe" || type == "Drum" || type == "Horn"; } // Token: 0x04000F70 RID: 3952 public List effectTiles = new List(); // Token: 0x04000F71 RID: 3953 public List allTiles = new List(); // Token: 0x04000F72 RID: 3954 public List hasTile = new List(); // Token: 0x04000F73 RID: 3955 public bool ready; // Token: 0x04000F74 RID: 3956 public float influenceRadius; // Token: 0x04000F75 RID: 3957 public float radius; // Token: 0x04000F76 RID: 3958 public float timeToWait; // Token: 0x04000F77 RID: 3959 public float effectStartTime; // Token: 0x04000F78 RID: 3960 public float spellDuration; // Token: 0x04000F79 RID: 3961 public float currentTime; // Token: 0x04000F7A RID: 3962 public int turnsToWait; // Token: 0x04000F7B RID: 3963 public int targetCount; // Token: 0x04000F7C RID: 3964 public float severity; // Token: 0x04000F7D RID: 3965 public float tether; // Token: 0x04000F7E RID: 3966 public int spellIndex; // Token: 0x04000F7F RID: 3967 public List affectedCharacters = new List(); // Token: 0x04000F80 RID: 3968 public List affectedObjects = new List(); // Token: 0x04000F81 RID: 3969 public List resistedCharacters = new List(); // Token: 0x04000F82 RID: 3970 public List resistedCharacterNodePosition = new List(); // Token: 0x04000F83 RID: 3971 public string mainSkill; // Token: 0x04000F84 RID: 3972 public string itemInfo; // Token: 0x04000F85 RID: 3973 public Library.Pagan paganRow; // Token: 0x04000F86 RID: 3974 public Character singleTarget; // Token: 0x04000F87 RID: 3975 public bool isSingleTarget; // Token: 0x04000F88 RID: 3976 public Library.Inventory spellScroll; // Token: 0x04000F89 RID: 3977 private bool isSummons; // Token: 0x04000F8A RID: 3978 public List faunas; // Token: 0x04000F8B RID: 3979 public bool isWall; // Token: 0x04000F8C RID: 3980 public bool setPenalty; // Token: 0x04000F8D RID: 3981 private int waveCount; // Token: 0x04000F8E RID: 3982 private bool doWave; // Token: 0x04000F8F RID: 3983 public bool fromGroup; // Token: 0x04000F90 RID: 3984 public bool needsCreatureSave; // Token: 0x04000F91 RID: 3985 public EnemyGroup group; // Token: 0x04000F92 RID: 3986 public Vector3 mainPosition; // Token: 0x04000F93 RID: 3987 private GraphNode mainNode; // Token: 0x04000F94 RID: 3988 public bool hasAbility; // Token: 0x04000F95 RID: 3989 public Library.Abilities ability; // Token: 0x04000F96 RID: 3990 public Library.Effects effect; // Token: 0x04000F97 RID: 3991 private List pickedGroundNodesSaved; // Token: 0x04000F98 RID: 3992 public Character source; // Token: 0x04000F99 RID: 3993 public Character spellTarget; // Token: 0x04000F9A RID: 3994 public GameObject singleTargetInteractive; // Token: 0x04000F9B RID: 3995 public List affectedCharacterEffects = new List(); // Token: 0x04000F9C RID: 3996 public List affectedObjectsEffects = new List(); // Token: 0x04000F9D RID: 3997 public List affectedPotency = new List(); // Token: 0x04000F9E RID: 3998 public List pooledEffects = new List(); // Token: 0x04000F9F RID: 3999 public float sourceLevel; // Token: 0x04000FA0 RID: 4000 public int overallTime; // Token: 0x04000FA1 RID: 4001 public int damage; // Token: 0x04000FA2 RID: 4002 private List animators = new List(); // Token: 0x04000FA3 RID: 4003 private StringFast str = new StringFast(64); // Token: 0x04000FA4 RID: 4004 public bool removing; // Token: 0x04000FA5 RID: 4005 private BreakableActions breakable; // Token: 0x04000FA6 RID: 4006 public List breakables = new List(); // Token: 0x04000FA7 RID: 4007 private NNConstraint nodeConstraint = new NNConstraint(); // Token: 0x04000FA8 RID: 4008 private List allNodes; // Token: 0x04000FA9 RID: 4009 public List creatures = new List(); // Token: 0x04000FAA RID: 4010 private int summonAmount; // Token: 0x04000FAB RID: 4011 private int currentlySummoned; // Token: 0x04000FAC RID: 4012 private IEnumerator scatterRoutine; // Token: 0x04000FAD RID: 4013 private IEnumerator removeRoutine; // Token: 0x04000FAE RID: 4014 private bool isInstrument; // Token: 0x04000FAF RID: 4015 private int fx; // Token: 0x04000FB0 RID: 4016 public bool waitingToRemove; // Token: 0x04000FB1 RID: 4017 public bool inScatter; // Token: 0x04000FB2 RID: 4018 private float tileRadius; // Token: 0x04000FB3 RID: 4019 private ChestActions chestTarget; // Token: 0x04000FB4 RID: 4020 private DoorActions doorTarget; // Token: 0x04000FB5 RID: 4021 private BreakableActions breakableTarget; // Token: 0x04000FB6 RID: 4022 public GhostBrush ghostBrush; // Token: 0x04000FB7 RID: 4023 public bool ghostBrushMinor; // Token: 0x04000FB8 RID: 4024 public GraphNode startNode; // Token: 0x04000FB9 RID: 4025 public bool fromEnchantedItem; // Token: 0x04000FBA RID: 4026 public bool doSpellScroll; // Token: 0x04000FBB RID: 4027 public bool isSong; // Token: 0x04000FBC RID: 4028 private bool isFaunaCreature; // Token: 0x04000FBD RID: 4029 private float effectTileOverrideDuration; // Token: 0x04000FBE RID: 4030 private float sourceDurability; // Token: 0x04000FBF RID: 4031 private GameObject centerFX; // Token: 0x04000FC0 RID: 4032 public bool waitingForTargetDeath; // Token: 0x04000FC1 RID: 4033 private GameObject songFX; // Token: 0x04000FC2 RID: 4034 public int lastRollTime; // Token: 0x04000FC3 RID: 4035 private float scatterPassTime; // Token: 0x04000FC4 RID: 4036 private bool customTileAI; // Token: 0x04000FC5 RID: 4037 private bool isPoison; // Token: 0x04000FC6 RID: 4038 private int attacksAllowed = 1; // Token: 0x04000FC7 RID: 4039 private float removeTime; // Token: 0x04000FC8 RID: 4040 private Vector4 spellData; }