using System.Collections; using System.Collections.Generic; using Godot; using Godot.Collections; public partial class Acts { public enum IDs { None = -1, Check, NonLethalShot, Apprehend, ExecutionerBlow, TalkTestEnemy, HugTestEnemy, NOT_SET, AvoidTestEnemy, HealBell, ShieldBarrier, SharpShoot, KAction, Spare, SharpenPenceller, RubEraser, AAction, ACT, JAction, InsultEraser, ScribbleEraser, PencilBefriend, PencilBerate, EraserTalk, EraserBerate, UseItem, PennyDeath, PennyBerate, PennyConvince, EncourageKanako, MopperCheer, MopperDirt, MopperClean, FoxForgive, FoxPlead, FoxBerate, Foxfire, HeatWave, HealShower, AxisAtkUP, UnnerveGas, BearingTalkDown, BearingBrace, BearingPlead, AxisSiren, BellCover, BellShush, BellIgnore, AxisParadox, AxisRequest, StaplerRefill, StaplerPress, StaplerPet, GearSpin, GearOil, SpinSelf, Homerun, Wrench, Drill, MelodyDance, HealingSonata, StranglingThreads, RulerStraight, RulerBad, Flee } public static Acts instance; public static List actors; public static Coroutine DoActRoutine(StringName name, Battlers target, Battlers[] actors = null) { if (instance == null) { instance = new Acts(); } if (actors == null) { actors = new Battlers[1] { BattleDR.current.allBattlers[BattleDR.current.currentActor] }; } Acts.actors = new List(actors); BattleDR.inputCD = 5f; return Coroutine.Start((IEnumerator)instance.GetType().GetMethod(name).Invoke(instance, new object[1] { target })); } public IEnumerator Check(Battlers target) { Audio.PlaySound("snd_mercyadd.wav"); actors[0].entity.anim.Play("ActDo"); BattleDR.current.ResetEnemyHighlight(); DWMenu.instance.soul.Visible = false; DWMenu.instance.battleText2.Visible = false; DWMenu.instance.battleDesc.GetParent().Visible = false; Coroutine.Start(BattleDR.ActEffect(actors[0])); string[] array = (string[])Texts.checks[target.id].Clone(); array[0] = ("* " + target.name.ToUpper() + ": @1 AT @2 DF\n" + array[0]).Replace("@1", target.ATK.ToString()).Replace("@2", target.DEF.ToString()); BattleDR.DoDiag(array); while (BattleDR.current.diag.Count > 0) { yield return null; } actors[0].entity.anim.Play("BattleIdle"); DWMenu.instance.soul.Visible = true; } public IEnumerator Spare(Battlers target) { GD.Print(target.posID); if (target.CanSpare()) { Audio.PlaySound("snd_spare_ch1.wav"); BattleDR.DoDiag(new string[1] { Texts.battleNarration[0].Replace("[NAME]", actors[0].name).Replace("[TARGET]", target.name) }); BattleDR.ShowFloatingText(Texts.common[102], target.entity.GlobalPosition + Vector2.Left * 16f, Main.colorYellow); Coroutine c = null; if (BattleDR.lastResult != BattleDR.EndState.Special && !target.dontFlee) { c = Coroutine.Start(target.entity.Slide(Vector2.Right, 60f, 2f, useSprite: true)); } Coroutine.Start(BattleDR.ActEffect(target, 0f)); ((Node2D)Main.Particle("AttackShine", target.entity.GlobalPosition + target.center, 4086, BattleDR.current, localSpace: false)).Scale = new Vector2(-1f, 1f); BattleDR.RemoveEnemy(target, BattleDR.EndState.Spared); if (BattleDR.lastResult != BattleDR.EndState.Special && !target.dontFlee) { while (true) { Coroutine coroutine = c; if (coroutine == null || coroutine.done) { break; } target.entity.Modulate = target.entity.Modulate.Lerp(Main.colorClear, 0.1f); yield return null; } target.Delete(); } else { BattleDR.current.resultAmts[2][1]++; SaveFile.current.values[1]++; target.entity.anim.Pause(); } } else { BattleDR.DoDiag(new string[1] { Texts.battleNarration[1].Replace("[NAME]", actors[0].name).Replace("[TARGET]", target.name) }); } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator Foxfire(Battlers target) { Audio.PlaySound("snd_spellcast_ch1.wav"); BattleDR.DoDiag(new string[1] { Texts.battleNarration[2].Replace("[NAME]", actors[0].name) }); for (float a = 0f; a < 20f; a += Main.deltaTime) { yield return null; } Node2D node2D = GD.Load("res://Objects/Particles/Foxfire.tscn").Instantiate(PackedScene.GenEditState.Disabled); BattleDR.current.AddChild(node2D, forceReadableName: false, Node.InternalMode.Disabled); node2D.ZIndex = 3000; node2D.GlobalPosition = target.entity.GlobalPosition + target.center; int num = Mathf.RoundToInt((float)actors[0].MAGIC * 10f) + 35; if (target.entity.HasMeta("WeakFire")) { num = Mathf.RoundToInt((float)num * 1.5f); } BattleDR.current.DoDamage(actors[0], target, 1f, miss: false, noTP: true, dontKill: false, showNumber: true, num); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator NonLethalShot(Battlers target) { actors[0].entity.anim.Stop(); for (float a = 0f; a < 10f; a += Main.deltaTime) { yield return null; } actors[0].entity.currentAnim = Entity.Animations.AttackReady; BattleDR.DoDiag(new string[1] { GetNarration(3, target) }); for (float a = 0f; a < 5f; a += Main.deltaTime) { yield return null; } Main.Particle("AttackShine", actors[0].atkPartOffset, 4086, actors[0].entity); Main.Particle(Party.party[actors[0].internalID].hitPart, target.center, 4086, target.entity); for (float a = 0f; a < 5f; a += Main.deltaTime) { yield return null; } BattleDR.current.DoDamage(actors[0], target, 0.85f, miss: false, noTP: true, dontKill: true); if (target.HP == 1) { BattleDR.ShowFloatingText(Texts.common[103], target.center + target.entity.GlobalPosition); } for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } actors[0].entity.currentAnim = Entity.Animations.BattleIdle; } public IEnumerator FirstBattleEvent() { while (!BattleDR.current.started) { yield return null; } TextSystem.GetText("KanakoFirstBattle"); while (TextSystem.instance.Visible) { yield return null; } } public IEnumerator WardenTutorial(int state = 0) { while (!BattleDR.current.started) { yield return null; } TextSystem.GetText("WardenTutorial" + (1 + state)); while (TextSystem.instance.Visible) { yield return null; } } public IEnumerator EraserBerate(Battlers target) { AddSpare(target, 35); BattleDR.DoDiag(new string[1] { GetNarration(4, target) }); target.blurbOverride = 4; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator EraserTalk(Battlers target) { AddSpare(target, 35); BattleDR.DoDiag(new string[1] { GetNarration(5, target) }); target.blurbOverride = 5; while (BattleDR.current.diag.Count > 0) { yield return null; } } private string GetNarration(int id, Battlers target) { return Texts.battleNarration[id].Replace("\\n", "\n").Replace("\\t", "\t").Replace("[NAME]", actors[0]?.name) .Replace("[TARGET]", target?.name); } public IEnumerator RubEraser(Battlers target) { if (!target.internalFlags.Contains("Rub")) { target.internalFlags.Add("Rub"); AddSpare(target, 50); BattleDR.DoDiag(new string[1] { GetNarration(6, target) }); target.blurbOverride = 5; } else { BattleDR.DoDiag(new string[1] { GetNarration(7, target) }); AddSpare(target, 15); target.blurbOverride = 6; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator SharpenPenceller(Battlers target) { if (target.internalFlags.Contains("Berated")) { BattleDR.DoDiag(new string[1] { GetNarration(8, target) }); target.blurbOverride = 8; } else if (target.internalFlags.Contains("Befriend")) { target.entity.anim.Play("Happy"); BattleDR.DoDiag(new string[1] { GetNarration(9, target) }); AddSpare(target, 100); target.ATK += 5; target.blurbOverride = 3; } else { BattleDR.DoDiag(new string[1] { GetNarration(10, target) }); target.blurbOverride = 4; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator PencilBefriend(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(11, target) }); AddSpare(target, 35); target.blurbOverride = 5; while (BattleDR.current.diag.Count > 0) { yield return null; } if (!target.internalFlags.Contains("Befriend")) { target.internalFlags.Add("Befriend"); } } public IEnumerator PencilBerate(Battlers target) { if (target.internalFlags.Contains("Befriend")) { target.entity.currentAnim = Entity.Animations.Hurt; } BattleDR.DoDiag(new string[1] { GetNarration(12, target) }); if (!target.internalFlags.Contains("Berated")) { target.internalFlags.Add("Berated"); } if (!target.internalFlags.Contains("Befriend")) { target.blurbOverride = 6; AddSpare(target, 25); } else { target.spare = 0; target.blurbOverride = 7; target.MONEY *= 3; } while (BattleDR.current.diag.Count > 0) { yield return null; } target.entity.currentAnim = Entity.Animations.Idle; } public IEnumerator UseItem(Battlers target) { Items.IDs id = (Items.IDs)actors[0].selectedAction[2]; BattleDR.DoDiag(new string[1] { GetNarration(13, target).Replace("[ITEM]", Texts.items[id].name) }); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } if (Texts.items[id].heal == -2) { Coroutine.Start(BattleDR.Heal(target, (target.HP <= 0) ? 9999 : (target.MAXHP / 2))); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } } else if (Texts.items[id].heal > 0) { Coroutine.Start(BattleDR.Heal(target, Texts.items[id].heal)); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } } if (Texts.items[id].tp > 0) { BattleDR.current.TP = Mathf.Clamp(BattleDR.current.TP + Texts.items[id].tp, 0, 100); Audio.PlaySound("snd_cardrive.wav", 1f, 1.05f); BattleDR.ShowFloatingText("TP UP!", actors[0].entity.GlobalPosition); } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator HugTestEnemy(Battlers target) { BattleDR.DoDiag(new string[1] { "* You hug Kanako." }); actors.Add(BattleDR.current.party[1]); bool stoppedAnim = !actors[1].entity.anim.IsPlaying(); Vector2 pos = actors[0].entity.GlobalPosition; Vector2 k = actors[1].entity.GlobalPosition + new Vector2(8f, 0f); Vector2 h = k + new Vector2(16f, 0f); actors[0].entity.doTrail = true; actors[0].entity.direction = Entity.Direction.East; actors[0].entity.currentAnim = Entity.Animations.Idle; for (float a = 0f; a < 20f; a += Main.deltaTime) { actors[0].entity.GlobalPosition = pos.Lerp(h, a / 20f); yield return null; } actors[0].entity.GlobalPosition = k; actors[0].entity.doTrail = false; actors[0].entity.anim.Play("Hug"); actors[0].entity.sprite.FlipH = true; for (float a = 0f; a < 20f; a += Main.deltaTime) { actors[0].entity.GlobalPosition = h.Lerp(k, a / 20f); yield return null; } actors[1].entity.anim.Play("BlushBattle"); for (float a = 0f; a < 60f; a += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } if (BattleDR.current.tempFlags.Contains("KanakoHug")) { BattleDR.DoDiag(new string[1] { "* . . . . ." }, new string[1] { "KanakoBlushFlustered" }); } else { BattleDR.DoDiag(new string[1] { "* C-Cole?! \n* What are you doing...?!" }, new string[1] { "KanakoBlushFlustered" }); BattleDR.current.tempFlags.Add("KanakoHug"); } while (BattleDR.current.diag.Count > 0) { yield return null; } actors[0].entity.anim.PlayBackwards(); for (float a = 0f; a < 20f; a += Main.deltaTime) { actors[0].entity.GlobalPosition = k.Lerp(h, a / 20f); yield return null; } actors[0].entity.currentAnim = Entity.Animations.Idle; actors[0].entity.UpdateAnim(force: true); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } actors[0].entity.doTrail = true; for (float a = 0f; a < 20f; a += Main.deltaTime) { actors[0].entity.GlobalPosition = h.Lerp(pos, a / 20f); yield return null; } actors[0].entity.GlobalPosition = pos; actors[0].entity.doTrail = false; actors[0].entity.UpdateAnim(force: true); actors[1].entity.UpdateAnim(force: true); if (stoppedAnim) { actors[1].entity.anim.Stop(); } } private static void AddSpare(Battlers target, int percent, bool sound = true) { if (sound) { Audio.PlaySound("snd_mercyadd.wav"); } target.spare = Mathf.Clamp(target.spare + percent, 0, 100); BattleDR.ShowFloatingText(percent + "%", target.entity.GlobalPosition, Main.colorYellow); } public IEnumerator TalkTestEnemy(Battlers target) { BattleDR.DoDiag(new string[1] { "* " + actors[0].name + " attempts to talk to the cactus.\n* Unsurprisingly, it doesn't reply." }); AddSpare(target, 50); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator AvoidTestEnemy(Battlers target) { BattleDR.DoDiag(new string[1] { "* " + actors[0].name + " avoids touching the cactus.\n* Somehow, you feel it is relieved by this." }); AddSpare(target, 100); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator Dream(Battlers target) { yield break; } public IEnumerator EncourageKanako(Battlers target) { if (!BattleDR.current.tempFlags.Contains("WeirdStart") && !SaveFile.current.flags.Contains(SaveFile.Flags.WeirdStart)) { BattleDR.DoDiag(new string[1] { GetNarration(14, target) }); Audio.PlaySound("snd_boost.wav"); } else { BattleDR.DoDiag(new string[1] { GetNarration(15, target) }); } Party.party[1].atkMod = new int[2] { 1, Mathf.CeilToInt((float)Party.party[1].ATK * 1.2f) }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator Apprehend(Battlers target) { Vector2 p = target.entity.Position; Vector2 cup = Vector2.Up * 128f; Vector2 tp = p + Vector2.Left * 64f; BattleDR.DoDiag(new string[1] { GetNarration(16, target) }); float hp = target.HPPercent(); BattleDR current = BattleDR.current; Sprite2D obj = new Sprite2D { Texture = GD.Load("res://Sprites/Bullets/Cage.tres"), SelfModulate = Main.colorClear, Position = p + cup, ZIndex = 3500, Scale = target.cageSize }; Sprite2D node = obj; Sprite2D cage = obj; current.AddChild(node, forceReadableName: false, Node.InternalMode.Disabled); yield return null; float t = 0f; while (true) { target.entity.Position = target.entity.Position.Lerp(tp + Vector2.Right * Common.SinOverTime(0.5f * Mathf.Clamp(hp, 0.1f, 1f)) * 128f, Main.deltaTime * 0.1f); if (cage.SelfModulate.A >= 1f) { if (Input.IsActionJustPressed(Main.keys[4])) { break; } cage.Position = cage.Position.Lerp(tp + cup + Vector2.Right * Common.SinOverTime(-0.25f) * 36f, Main.deltaTime * 0.2f); if (cage.Position.Y < -120f) { cage.Position = new Vector2(cage.Position.X, -120f); } } else if (cage.SelfModulate.A < 1f) { cage.SelfModulate = Main.colorClear.Lerp(Main.colorWhite, t); t += Main.deltaTime * 0.15f; } yield return null; } Audio.PlaySound("snd_spearrise_ch1.wav"); cup = cage.Position; t = 80f; bool skipText = false; for (float a = 0f; a < t; a += Main.deltaTime) { target.entity.Position = target.entity.Position.Lerp(tp + Vector2.Right * Common.SinOverTime(0.5f * Mathf.Clamp(hp, 0.1f, 1f)) * 128f, Main.deltaTime * 0.1f); cage.Position = cup.Lerp(cup + Vector2.Down * 300f, a / t); if (cage.GlobalPosition.DistanceTo(target.entity.GlobalPosition + target.center) < Mathf.Lerp(32f, 2f, hp)) { CameraController.Shake(20f); target.entity.Shake(30f); cage.Reparent(target.entity); cage.Position = target.center; Audio.PlaySound("snd_impact_ch1.wav"); if ((target.resistArrest > 0f && target.HPPercent() > target.resistArrest) || target.resistArrest > 1f) { float x; for (x = 0f; x < 30f; x += Main.deltaTime) { yield return null; } target.entity.Shake(30f, 3f); for (x = 0f; x < 30f; x += Main.deltaTime) { yield return null; } Audio.PlaySound("snd_explosion.wav"); CameraController.Shake(30f, 3f); cage.Reparent(BattleDR.current); cup = cage.GlobalPosition; Vector2 end = cup + new Vector2(200f, 300f); Vector2 mid = new Vector2(Mathf.Lerp(cup.X, end.X, 0.5f), cup.Y - 200f); x = 0f; for (float b = 150f; x < b; x += Main.deltaTime) { cage.GlobalPosition = Common.Beizier(cup, mid, end, x / b); cage.RotationDegrees += Main.deltaTime * 2f; yield return null; } if (target.resistArrest > 1f) { BattleDR.DoDiag(new string[1] { GetNarration(17, target) }); } else { BattleDR.DoDiag(new string[1] { GetNarration(18, target) }); } while (BattleDR.current.diag.Count > 0) { yield return null; } skipText = true; break; } Audio.PlaySound("snd_mercyadd.wav"); BattleDR.DoDiag(new string[1] { GetNarration(19, target) }); BattleDR.ShowFloatingText(Texts.common[104], target.entity.GlobalPosition); for (float b = 0f; b < 30f; b += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } if (BattleDR.lastResult == BattleDR.EndState.Special) { BattleDR.current.forceEnd = true; cup = target.entity.Position; for (float b = 0f; b < 20f; b += Main.deltaTime) { target.entity.Position = cup.Lerp(p, b / 20f); yield return null; } BattleDR.current.resultAmts[4][1]++; BattleDR.current.busy = Coroutine.Start(BattleDR.current.EndBattle()); } else { for (float b = 0f; b < 20f; b += Main.deltaTime) { target.entity.Modulate = Main.colorWhite.Lerp(Main.colorClear, b / 20f); yield return null; } target.entity.Visible = false; BattleDR.RemoveEnemy(target, BattleDR.EndState.Apprehended); } yield break; } yield return null; } if (!skipText) { BattleDR.DoDiag(new string[1] { GetNarration(20, target) }); Audio.PlaySound("snd_error.wav"); while (BattleDR.current.diag.Count > 0) { yield return null; } } cup = target.entity.Position; for (float a = 0f; a < 20f; a += Main.deltaTime) { target.entity.Position = cup.Lerp(p, a / 20f); yield return null; } cage.QueueFree(); target.entity.Position = p; } public IEnumerator ExecutionerBlow(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(21, target) }); actors[0].entity.anim.Play("Execution_Jump"); Vector2 start = actors[0].entity.GlobalPosition; Vector2 targetP = target.entity.GlobalPosition + target.center + new Vector2(-40f, -15f); Vector2 m = start.Lerp(targetP, 0.6f) + new Vector2(0f, -60f); actors[0].entity.doTrail = true; Audio.PlaySound("snd_jump_ch1.wav"); float a = 0f; float b; for (b = 30f; a < b; a += Main.deltaTime) { actors[0].entity.GlobalPosition = Common.Beizier(start, m, targetP, Mathf.SmoothStep(0f, 1f, a / b)); yield return null; } actors[0].entity.anim.Play("Execution"); actors[0].entity.Shake(30f, 1f); b = 0f; for (a = 20f; b < a; b += Main.deltaTime) { yield return null; } actors[0].entity.doTrail = false; actors[0].entity.anim.Play("Execution_2"); a = 0f; for (b = 5f; a < b; a += Main.deltaTime) { yield return null; } actors[0].entity.anim.Play("Execution_3"); m = target.entity.GlobalPosition + new Vector2(-25f, 0f); Audio.PlaySound("snd_rudebuster_swing.wav"); b = 0f; for (a = 5f; b < a; b += Main.deltaTime) { actors[0].entity.GlobalPosition = targetP.Lerp(m, b / a); yield return null; } Main.Particle(Party.party[actors[0].internalID].hitPart, target.center, 4086, target.entity); BattleDR.current.DoDamage(actors[0], target, 1.5f, miss: false, noTP: true); Audio.PlaySound("snd_heavydamage.wav"); CameraController.Shake(20f, 4f); for (a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } actors[0].entity.doTrail = true; a = 0f; for (b = 20f; a < b; a += Main.deltaTime) { actors[0].entity.GlobalPosition = m.Lerp(start, Mathf.SmoothStep(0f, 1f, a / b)); yield return null; } actors[0].entity.GlobalPosition = start; actors[0].entity.doTrail = false; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator HealBell(Battlers target) { Audio.PlaySound("snd_spellcast_ch1.wav"); BattleDR.DoDiag(new string[1] { GetNarration(22, target) }); Node2D node2D = GD.Load("res://Objects/Particles/HealBell.tscn").Instantiate(PackedScene.GenEditState.Disabled); BattleDR.current.AddChild(node2D, forceReadableName: false, Node.InternalMode.Disabled); node2D.ZIndex = 3000; node2D.GlobalPosition = target.entity.GlobalPosition + new Vector2(0f, -64f); for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } for (float a = 0f; a < 90f; a += Main.deltaTime) { yield return null; } Coroutine.Start(BattleDR.Heal(target, Mathf.FloorToInt((float)(actors[0].MAGIC * 10) * (1f + Main.RandomRange(-0.1f, 0.1f))))); for (float a = 0f; a < 20f; a += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator ShieldBarrier(Battlers target) { Audio.PlaySound("snd_spellcast_ch1.wav"); BattleDR.DoDiag(new string[1] { GetNarration(23, target) }); BattleDR.current.soul.Visible = true; BattleDR.current.soul.GlobalPosition = BattleDR.current.party[0].entity.GlobalPosition + BattleDR.current.party[0].center; if (BattleDR.current.shield == null) { BattleDR.current.soul.AddChild(BattleDR.current.shield = GD.Load("res://Objects/Particles/ShieldFx.tscn").Instantiate(PackedScene.GenEditState.Disabled), forceReadableName: false, Node.InternalMode.Disabled); } Audio.PlaySound("snd_boost.wav", 0.9f, 1.1f); BattleDR.current.shield.Position = Vector2.Up; for (float a = 0f; a < 100f; a += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } BattleDR.current.soul.Visible = false; BattleDR.current.shield.Scale = Vector2.One * 0.4f; } public IEnumerator PennyDeath(Battlers target) { int[] selectedAction = Party.party[0].selectedAction; if (selectedAction != null && selectedAction[0] == 2 && Party.party[0].selectedAction[2] == 28 && actors[0].id == Entity.IDs.Kanako && target.hpLastTurn == 1) { for (float a = 0f; a < 60f; a += Main.deltaTime) { yield return null; } target.HP = 1; if (!BattleDR.current.tempFlags.Contains("WeirdStart")) { BattleDR.current.tempFlags.Add("WeirdStart"); target.entity.replaceAnim.Add(new Array { "Idle", "Weak1" }); target.lockAnim = true; target.entity.currentAnim = Entity.Animations.Idle; Audio.music.VolumeDb = Mathf.LinearToDb(0.66f); BattleDR.current.bgColor = Main.colorWhite.Lerp(Main.colorBlack, 0.5f); TextSystem.GetText("PenniltonWeird1"); while (TextSystem.instance.Visible) { yield return null; } BattleDR.current.forceMes = 6; yield break; } if (!BattleDR.current.tempFlags.Contains("Weird2")) { BattleDR.current.tempFlags.Add("Weird2"); target.entity.replaceAnim.Clear(); target.entity.replaceAnim.Add(new Array { "Idle", "Weak2" }); target.entity.currentAnim = Entity.Animations.Idle; Audio.music.VolumeDb = Mathf.LinearToDb(0.33f); BattleDR.current.bgColor = Main.colorWhite.Lerp(Main.colorBlack, 0.75f); TextSystem.GetText("PenniltonWeird2"); while (TextSystem.instance.Visible) { yield return null; } BattleDR.current.forceMes = 6; yield break; } if (!BattleDR.current.tempFlags.Contains("Weird3")) { BattleDR.current.tempFlags.Add("Weird3"); target.entity.replaceAnim.Clear(); target.entity.replaceAnim.Add(new Array { "Idle", "Weak3" }); target.entity.replaceAnim.Add(new Array { "Idle", "Weak3" }); target.entity.currentAnim = Entity.Animations.Idle; Audio.music.VolumeDb = Mathf.LinearToDb(0f); BattleDR.current.bgColor = Main.colorBlack; TextSystem.GetText("PenniltonWeird3"); while (TextSystem.instance.Visible) { yield return null; } target.callEventOnDefeat = IDs.None; BattleDR.current.forceMes = 7; SaveFile.AddFlag(SaveFile.Flags.WeirdStart); yield break; } } if (!target.fleeing) { BattleDR.current.fleeing.Add(Coroutine.Start(BattleDR.Flee(target))); } } public IEnumerator PennyBerate(Battlers target) { if (BattleDR.current.tempFlags.Contains("WeirdStart")) { BattleDR.DoDiag(new string[1] { GetNarration(24, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } yield break; } BattleDR.DoDiag(new string[1] { GetNarration(25, target) }); AddSpare(target, 17); target.atkMod = new int[2] { 2, 10 }; target.defMod = new int[2] { 2, -10 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator PennyConvince(Battlers target) { if (BattleDR.current.tempFlags.Contains("WeirdStart")) { BattleDR.DoDiag(new string[1] { GetNarration(26, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } yield break; } BattleDR.DoDiag(new string[1] { GetNarration(27, target) }); AddSpare(target, Main.RandomRange(7, 15)); target.atkMod = new int[2] { 3, -5 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator MopperCheer(Battlers target) { string[] text = new string[2] { GetNarration(28, target), "" }; while (BattleDR.current.diag.Count > 0) { yield return null; } if (target.internalFlags.Contains("Mess")) { target.blurbOverride = 5; text[1] = GetNarration(29, target); } else if (!target.internalFlags.Contains("Clean")) { text[1] = GetNarration(30, target); } else { target.blurbOverride = 6; AddSpare(target, 50); text[1] = GetNarration(31, target); } BattleDR.DoDiag(text); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator MopperDirt(Battlers target) { if (!target.internalFlags.Contains("Mess")) { target.internalFlags.Add("Mess"); target.MONEY *= 3; } target.spare = 0; target.blurbOverride = 4; target.entity.anim.Play("Hurt"); BattleDR.DoDiag(new string[2] { GetNarration(32, target), GetNarration(33, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator MopperClean(Battlers target) { if (target.internalFlags.Contains("Mess")) { target.blurbOverride = 5; BattleDR.DoDiag(new string[1] { GetNarration(34, target) }); } else { BattleDR.DoDiag(new string[1] { GetNarration(35, target) }); target.blurbOverride = 6; if (!target.internalFlags.Contains("Clean")) { target.internalFlags.Add("Clean"); AddSpare(target, 50); } else { AddSpare(target, 15); } } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator FoxPlead(Battlers target) { if (target.spare < 50) { BattleDR.DoDiag(new string[1] { GetNarration(36, target) }); } else { BattleDR.DoDiag(new string[1] { GetNarration(37, target) }); } AddSpare(target, 7); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BearingBrace(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(38, target) }); for (int i = 0; i < BattleDR.current.party.Count; i++) { if (BattleDR.current.party[i].HP > 0) { BattleDR.current.party[i].entity.anim.Play("Defend"); BattleDR.current.party[i].defMod = new int[2] { 3, Mathf.Max(10, Mathf.CeilToInt((float)BattleDR.current.party[i].DEF * 0.33f)) }; } } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BearingTalkDown(Battlers target) { BattleDR.DoDiag(new string[2] { GetNarration(39, target), GetNarration(40, target) }); AddSpare(target, 3); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BearingPlead(Battlers target) { BattleDR.DoDiag(new string[2] { GetNarration(41, target), GetNarration(40, target) }); AddSpare(target, 7); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator FoxForgive(Battlers target) { if (actors[0].id != Entity.IDs.Kanako) { if (target.spare < 50) { BattleDR.DoDiag(new string[2] { GetNarration(42, target), GetNarration(43, target) }); target.blurbOverride = 14; } else { BattleDR.DoDiag(new string[2] { GetNarration(42, target), GetNarration(44, target) }); target.blurbOverride = 8; AddSpare(target, 3); } } else { BattleDR.DoDiag(new string[2] { GetNarration(42, target), GetNarration(45, target) }); target.blurbOverride = 8; AddSpare(target, 3); target.atkMod = new int[2] { 4, -15 }; target.defMod = new int[2] { 4, -15 }; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator AxisRequest(Battlers target) { AddSpare(target, 4); BattleDR.DoDiag(new string[1] { GetNarration(46, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } if (Main.RandomRange(0, 100) <= 50) { BattleDR.DoDiag(new string[1] { GetNarration(47, target) }); target.atkMod = new int[2] { 3, -10 }; } else { BattleDR.DoDiag(new string[1] { GetNarration(48, target) }); target.defMod = new int[2] { 3, -10 }; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator AxisParadox(Battlers target) { AddSpare(target, 5); BattleDR.DoDiag(new string[1] { GetNarration(49, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } if (actors[0].id == Entity.IDs.Kanako) { if (!target.internalFlags.Contains("KDiag")) { target.internalFlags.Add("KDiag"); TextSystem.GetText("AxisParadoxKanako"); while (TextSystem.instance.Visible) { yield return null; } yield break; } } else if (!target.internalFlags.Contains("CDiag")) { target.internalFlags.Add("CDiag"); TextSystem.GetText("AxisParadoxCole"); while (TextSystem.instance.Visible) { yield return null; } } BattleDR.DoDiag(new string[1] { GetNarration(50, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BellCover(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(51, target) }); AddSpare(target, 3); actors[0].defMod = new int[2] { 3, 10 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BellShush(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(52, target) }); AddSpare(target, 3); target.defMod = new int[2] { 3, -10 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator BellIgnore(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(53, target) }); AddSpare(target, 4); target.atkMod = new int[2] { 3, -10 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator StaplerRefill(Battlers target) { yield break; } public IEnumerator StaplerPress(Battlers target) { target.entity.anim.Play("Hurt"); target.entity.Shake(10f, 1f); if (target.internalFlags.Contains("Empty")) { AddSpare(target, 5); Audio.PlaySound("snd_break1.wav"); BattleDR.DoDiag(new string[1] { GetNarration(54, target) }); } else { Audio.PlaySound("snd_switchpull_n.wav"); AddSpare(target, 35); Main.Particle("StapleOut", new Vector2(-10f, -15f), 10, target.entity); if (!target.internalFlags.Contains("Press")) { BattleDR.DoDiag(new string[1] { GetNarration(55, target) }); target.internalFlags.Add("Press"); } else { BattleDR.DoDiag(new string[1] { GetNarration(56, target) }); target.skipAttack = true; target.internalFlags.Add("Empty"); BattleDR.current.tempFlags.Add("StaplerEmpty"); target.entity.replaceAnim.Add(new Array { "Idle", "Sad" }); } } while (BattleDR.current.diag.Count > 0) { yield return null; } target.entity.UpdateAnim(force: true); } public IEnumerator StaplerPet(Battlers target) { if (target.internalFlags.Contains("Empty")) { BattleDR.DoDiag(new string[1] { GetNarration(57, target) }); } else { AddSpare(target, 50); BattleDR.DoDiag(new string[1] { GetNarration(58, target) }); target.entity.anim.Play("Happy"); target.blurbOverride = 3; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator GearSpin(Battlers target) { if (!target.internalFlags.Contains("Oil")) { BattleDR.DoDiag(new string[1] { GetNarration(59, target) }); AddSpare(target, 15); target.blurbOverride = 6; } else { target.entity.anim.Play("Happy"); AddSpare(target, 45); BattleDR.DoDiag(new string[1] { GetNarration(60, target) }); target.blurbOverride = 3; } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator GearOil(Battlers target) { if (!target.internalFlags.Contains("Oil")) { AddSpare(target, 15); BattleDR.DoDiag(new string[1] { GetNarration(61, target) }); target.internalFlags.Add("Oil"); target.blurbOverride = 2; } else { BattleDR.DoDiag(new string[1] { GetNarration(62, target) }); } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator SpinSelf(Battlers target) { actors[0].entity.anim.Play("Spinning"); bool flag = false; for (int i = 0; i < BattleDR.current.enemies.Count; i++) { if (BattleDR.current.enemies[i].id == Entity.IDs.Gearzerd) { AddSpare(BattleDR.current.enemies[i], 40, !flag); flag = true; target.blurbOverride = 4; } else if (BattleDR.current.enemies[i].id == Entity.IDs.Wrench) { AddSpare(BattleDR.current.enemies[i], 25, !flag); flag = true; } else if (BattleDR.current.enemies[i].id == Entity.IDs.Drill) { AddSpare(BattleDR.current.enemies[i], 20, !flag); flag = true; } } BattleDR.DoDiag(new string[1] { GetNarration(63, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } actors[0].entity.anim.Play("BattleIdle"); } public IEnumerator AxisAtkUP(Battlers target) { Audio.PlaySound("snd_boost.wav"); Audio.PlaySound("snd_cardrive.wav"); actors[0].entity.anim.Play("SpinAtk"); Node2D[] part = new Node2D[SaveFile.current.activeParty.Count]; for (int i = 0; i < SaveFile.current.activeParty.Count; i++) { if (Party.party[SaveFile.current.activeParty[i]].HP > 0) { part[i] = (Node2D)Main.Particle("AtkUp", Party.party[SaveFile.current.activeParty[i]].center, 1, Party.party[SaveFile.current.activeParty[i]].entity); Party.party[SaveFile.current.activeParty[i]].atkMod = new int[2] { 3, 15 + actors[0].MAGIC * 2 }; } } BattleDR.DoDiag(new string[1] { GetNarration(64, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } for (int j = 0; j < part.Length; j++) { if (GodotObject.IsInstanceValid(part[j])) { part[j].QueueFree(); } } } public IEnumerator HealShower(Battlers target) { actors[0].entity.anim.Play("SpinAtk"); Audio.PlaySound("snd_boost.wav"); BattleDR.DoDiag(new string[1] { GetNarration(65, target) }); while (BattleDR.current.diag.Count > 0) { yield return null; } for (int i = 0; i < SaveFile.current.activeParty.Count; i++) { Coroutine.Start(BattleDR.Heal(Party.party[SaveFile.current.activeParty[i]], 30 + 10 * actors[0].MAGIC, playParticles: true, doColor: true, showText: true, i == 0)); } for (float a = 0f; a < 30f; a += Main.deltaTime) { yield return null; } } public IEnumerator HeatWave(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(66, target) }); actors[0].entity.anim.Play("SpinAtk"); actors[0].entity.doTrail = true; Vector2 start = actors[0].entity.GlobalPosition; Vector2 center = BattleDR.current.GlobalPosition + new Vector2(0f - BattleDR.partyPos[1][1].X, BattleDR.partyPos[1][1].Y); Node part = Main.Particle("AxisFlame", actors[0].center, 1, actors[0].entity); float a = 0f; float c = 0f; float b = 180f; while (a <= b) { float s = Mathf.DegToRad(0f - Mathf.Lerp(0f, 720f, a / b)); actors[0].entity.GlobalPosition = actors[0].entity.GlobalPosition.Lerp(center + new Vector2(Mathf.Cos(s) * 65f, Mathf.Sin(s) * 90f - 40f), Main.deltaTime * 0.1f); if (c <= 0f) { Audio.PlaySound("snd_steamworks_13_vent.wav"); c = 15f; } yield return null; a += Main.deltaTime; c -= Main.deltaTime; } Vector2 p = actors[0].entity.GlobalPosition; int num = Mathf.RoundToInt((float)actors[0].ATK * 0.8f + (float)(actors[0].MAGIC * 3)); for (int i = 0; i < BattleDR.current.enemies.Count; i++) { BattleDR.current.DoDamage(actors[0], BattleDR.current.enemies[i], 1f, miss: false, noTP: true, dontKill: false, showNumber: true, Mathf.RoundToInt((float)num * (BattleDR.current.enemies[i].entity.HasMeta("WeakFire") ? 1.5f : 1f))); } part.QueueFree(); b = 0f; for (c = 10f; b <= c; b += Main.deltaTime) { actors[0].entity.GlobalPosition = p.Lerp(start, b / c); yield return null; } actors[0].entity.doTrail = false; actors[0].entity.GlobalPosition = start; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator UnnerveGas(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(67, target) }); float a; for (a = 0f; a < 5f; a += Main.deltaTime) { yield return null; } Audio.PlaySound("snd_fall2.wav"); Sprite2D sprite = new Sprite2D { Texture = GD.Load("res://Sprites/Bullets/AxisBomb.tres"), ZIndex = 3000, Scale = Vector2.One * 0.75f }; BattleDR.current.AddChild(sprite, forceReadableName: false, Node.InternalMode.Disabled); Vector2 s = actors[0].entity.GlobalPosition + new Vector2(15f, -25f); Vector2 t = target.entity.GlobalPosition + target.center; Vector2 m = new Vector2(Mathf.Lerp(s.X, t.X, 0.5f), Mathf.Min(s.Y, t.Y) - 60f); a = 0f; for (float b = 60f; a < b; a += Main.deltaTime) { sprite.GlobalPosition = Common.Beizier(s, m, t, a / b); yield return null; } CameraController.Shake(20f); Audio.PlaySound("snd_badexplosion.wav"); sprite.QueueFree(); BattleDR.ShowFloatingText(Texts.common[105], target.entity.GlobalPosition + new Vector2(-20f, 0f)); Main.Particle("AxisSmokeBomb", target.center, 1, target.entity); for (float b = 0f; b < 30f; b += Main.deltaTime) { yield return null; } while (BattleDR.current.diag.Count > 0) { yield return null; } target.defMod = new int[2] { 3, -20 + -3 * actors[0].MAGIC }; } public IEnumerator AxisSiren(Battlers target) { actors[0].entity.anim.Play("SpinAtk"); BattleDR.DoDiag(new string[1] { GetNarration(68, target) }); Node part = Main.Particle("AxisSiren", new Vector2(0f, -36f), 1, actors[0].entity); BattleDR.current.focusAtk = actors[0].posID; for (int i = 0; i < BattleDR.current.enemies.Count; i++) { BattleDR.current.enemies[i].entity.Shake(30f, 2f); BattleDR.ShowFloatingText(Texts.common[106], BattleDR.current.enemies[i].entity.GlobalPosition + new Vector2(-20f, 0f)); } actors[0].defMod = new int[2] { 1, -15 }; while (BattleDR.current.diag.Count > 0) { yield return null; } part.QueueFree(); } public IEnumerator Wrench(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(69, target) }); AddSpare(target, (actors[1].HP > 0) ? 50 : 100); target.blurbOverride = 4; if (actors[1].HP > 0) { actors[1].entity.anim.Play("Hurt"); } Vector2 p = target.entity.GlobalPosition; int z = target.entity.ZIndex; target.entity.ZIndex = 4000; target.entity.anim.Play("Fix"); while (BattleDR.current.diag.Count > 0) { target.entity.GlobalPosition = target.entity.GlobalPosition.Lerp(actors[1].entity.GlobalPosition + new Vector2(Common.SinOverTime(0.75f) * 8f + 45f, -16f), Main.deltaTime * 0.2f); target.entity.RotationDegrees = -90f + Common.SinOverTime(0.5f) * 15f; yield return null; } target.entity.anim.Play("Idle"); target.entity.RotationDegrees = 0f; target.entity.ZIndex = z; target.entity.GlobalPosition = p; Coroutine.Start(BattleDR.Heal(actors[1], (actors[1].HP > 0) ? 50 : 9999)); } public IEnumerator Drill(Battlers target) { BattleDR.DoDiag(new string[1] { GetNarration(70, target) }); AddSpare(target, 65); target.atkMod = new int[2] { 1, 20 }; while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator RulerStraight(Battlers target) { actors[0].entity.anim.Play("TPose"); if (!target.internalFlags.Contains("Bad")) { BattleDR.DoDiag(new string[1] { GetNarration(71, target) }); target.blurbOverride = 4; AddSpare(target, 50); } else { target.blurbOverride = 6; BattleDR.DoDiag(new string[1] { GetNarration(73, target) }); } while (BattleDR.current.diag.Count > 0) { yield return null; } } public IEnumerator RulerBad(Battlers target) { target.entity.anim.Play("Hurt"); BattleDR.DoDiag(new string[1] { GetNarration(72, target) }); for (int i = 0; i < BattleDR.current.enemies.Count; i++) { if (BattleDR.current.enemies[i].entity.id == Entity.IDs.Ruler) { AddSpare(BattleDR.current.enemies[i], 35); BattleDR.current.enemies[i].blurbOverride = 5; } } if (!target.internalFlags.Contains("Bad")) { target.internalFlags.Add("Bad"); target.MONEY *= 3; } while (BattleDR.current.diag.Count > 0) { yield return null; } } }