// Decompiled with JetBrains decompiler // Type: Terraria.Cinematics.DD2Film // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using Terraria.Audio; using Terraria.GameContent.UI; using Terraria.ID; namespace Terraria.Cinematics { public class DD2Film : Film { private NPC _dryad; private NPC _ogre; private NPC _portal; private List _army = new List(); private List _critters = new List(); private Vector2 _startPoint; public DD2Film() { this.AppendKeyFrames(new FrameEvent(this.CreateDryad), new FrameEvent(this.CreateCritters)); this.AppendSequences(120, new FrameEvent(this.DryadStand), new FrameEvent(this.DryadLookRight)); this.AppendSequences(100, new FrameEvent(this.DryadLookRight), new FrameEvent(this.DryadInteract)); this.AddKeyFrame(this.AppendPoint - 20, new FrameEvent(this.CreatePortal)); this.AppendSequences(30, new FrameEvent(this.DryadLookLeft), new FrameEvent(this.DryadStand)); this.AppendSequences(40, new FrameEvent(this.DryadConfusedEmote), new FrameEvent(this.DryadStand), new FrameEvent(this.DryadLookLeft)); this.AppendKeyFrame(new FrameEvent(this.CreateOgre)); this.AddKeyFrame(this.AppendPoint + 60, new FrameEvent(this.SpawnJavalinThrower)); this.AddKeyFrame(this.AppendPoint + 120, new FrameEvent(this.SpawnGoblin)); this.AddKeyFrame(this.AppendPoint + 180, new FrameEvent(this.SpawnGoblin)); this.AddKeyFrame(this.AppendPoint + 240, new FrameEvent(this.SpawnWitherBeast)); this.AppendSequences(30, new FrameEvent(this.DryadStand), new FrameEvent(this.DryadLookLeft)); this.AppendSequences(30, new FrameEvent(this.DryadLookRight), new FrameEvent(this.DryadWalk)); this.AppendSequences(300, new FrameEvent(this.DryadAttack), new FrameEvent(this.DryadLookLeft)); this.AppendKeyFrame(new FrameEvent(this.RemoveEnemyDamage)); this.AppendSequences(60, new FrameEvent(this.DryadLookRight), new FrameEvent(this.DryadStand), new FrameEvent(this.DryadAlertEmote)); this.AddSequences(this.AppendPoint - 90, 60, new FrameEvent(this.OgreLookLeft), new FrameEvent(this.OgreStand)); this.AddKeyFrame(this.AppendPoint - 12, new FrameEvent(this.OgreSwingSound)); this.AddSequences(this.AppendPoint - 30, 50, new FrameEvent(this.DryadPortalKnock), new FrameEvent(this.DryadStand)); this.AppendKeyFrame(new FrameEvent(this.RestoreEnemyDamage)); this.AppendSequences(40, new FrameEvent(this.DryadPortalFade), new FrameEvent(this.DryadStand)); this.AppendSequence(180, new FrameEvent(this.DryadStand)); this.AddSequence(0, this.AppendPoint, new FrameEvent(this.PerFrameSettings)); } private void PerFrameSettings(FrameEventData evt) => CombatText.clearAll(); private void CreateDryad(FrameEventData evt) { this._dryad = this.PlaceNPCOnGround(20, this._startPoint); this._dryad.knockBackResist = 0.0f; this._dryad.immortal = true; this._dryad.dontTakeDamage = true; this._dryad.takenDamageMultiplier = 0.0f; this._dryad.immune[(int) byte.MaxValue] = 100000; } private void DryadInteract(FrameEventData evt) { if (this._dryad == null) return; this._dryad.ai[0] = 9f; if (evt.IsFirstFrame) this._dryad.ai[1] = (float) evt.Duration; this._dryad.localAI[0] = 0.0f; } private void SpawnWitherBeast(FrameEventData evt) { int index = NPC.NewNPC((int) this._portal.Center.X, (int) this._portal.Bottom.Y, 568); NPC npc = Main.npc[index]; npc.knockBackResist = 0.0f; npc.immortal = true; npc.dontTakeDamage = true; npc.takenDamageMultiplier = 0.0f; npc.immune[(int) byte.MaxValue] = 100000; npc.friendly = this._ogre.friendly; this._army.Add(npc); } private void SpawnJavalinThrower(FrameEventData evt) { int index = NPC.NewNPC((int) this._portal.Center.X, (int) this._portal.Bottom.Y, 561); NPC npc = Main.npc[index]; npc.knockBackResist = 0.0f; npc.immortal = true; npc.dontTakeDamage = true; npc.takenDamageMultiplier = 0.0f; npc.immune[(int) byte.MaxValue] = 100000; npc.friendly = this._ogre.friendly; this._army.Add(npc); } private void SpawnGoblin(FrameEventData evt) { int index = NPC.NewNPC((int) this._portal.Center.X, (int) this._portal.Bottom.Y, 552); NPC npc = Main.npc[index]; npc.knockBackResist = 0.0f; npc.immortal = true; npc.dontTakeDamage = true; npc.takenDamageMultiplier = 0.0f; npc.immune[(int) byte.MaxValue] = 100000; npc.friendly = this._ogre.friendly; this._army.Add(npc); } private void CreateCritters(FrameEventData evt) { for (int index = 0; index < 5; ++index) { float num = (float) index / 5f; NPC npc = this.PlaceNPCOnGround((int) Utils.SelectRandom(Main.rand, (short) 46, (short) 46, (short) 299, (short) 538), this._startPoint + new Vector2((float) (((double) num - 0.25) * 400.0 + (double) Main.rand.NextFloat() * 50.0 - 25.0), 0.0f)); npc.ai[0] = 0.0f; npc.ai[1] = 600f; this._critters.Add(npc); } if (this._dryad == null) return; for (int index1 = 0; index1 < 10; ++index1) { double num = (double) index1 / 10.0; int index2 = NPC.NewNPC((int) this._dryad.position.X + Main.rand.Next(-1000, 800), (int) this._dryad.position.Y - Main.rand.Next(-50, 300), 356); NPC npc = Main.npc[index2]; npc.ai[0] = (float) ((double) Main.rand.NextFloat() * 4.0 - 2.0); npc.ai[1] = (float) ((double) Main.rand.NextFloat() * 4.0 - 2.0); npc.velocity.X = (float) ((double) Main.rand.NextFloat() * 4.0 - 2.0); this._critters.Add(npc); } } private void OgreSwingSound(FrameEventData evt) => SoundEngine.PlaySound(SoundID.DD2_OgreAttack, this._ogre.Center); private void DryadPortalKnock(FrameEventData evt) { if (this._dryad != null) { if (evt.Frame == 20) { this._dryad.velocity.Y -= 7f; this._dryad.velocity.X -= 8f; SoundEngine.PlaySound(3, (int) this._dryad.Center.X, (int) this._dryad.Center.Y); } if (evt.Frame >= 20) { this._dryad.ai[0] = 1f; this._dryad.ai[1] = (float) evt.Remaining; this._dryad.rotation += 0.05f; } } if (this._ogre == null) return; if (evt.Frame > 40) { this._ogre.target = Main.myPlayer; this._ogre.direction = 1; } else { this._ogre.direction = -1; this._ogre.ai[1] = 0.0f; this._ogre.ai[0] = Math.Min(40f, this._ogre.ai[0]); this._ogre.target = 300 + this._dryad.whoAmI; } } private void RemoveEnemyDamage(FrameEventData evt) { this._ogre.friendly = true; foreach (NPC npc in this._army) npc.friendly = true; } private void RestoreEnemyDamage(FrameEventData evt) { this._ogre.friendly = false; foreach (NPC npc in this._army) npc.friendly = false; } private void DryadPortalFade(FrameEventData evt) { if (this._dryad == null || this._portal == null) return; if (evt.IsFirstFrame) SoundEngine.PlaySound(SoundID.DD2_EtherianPortalDryadTouch, this._dryad.Center); float amount = Math.Max(0.0f, (float) (evt.Frame - 7) / (float) (evt.Duration - 7)); this._dryad.color = new Color(Vector3.Lerp(Vector3.One, new Vector3(0.5f, 0.0f, 0.8f), amount)); this._dryad.Opacity = 1f - amount; this._dryad.rotation += (float) (0.0500000007450581 * ((double) amount * 4.0 + 1.0)); this._dryad.scale = 1f - amount; if ((double) this._dryad.position.X < (double) this._portal.Right.X) { this._dryad.velocity.X *= 0.95f; this._dryad.velocity.Y *= 0.55f; } int num1 = (int) (6.0 * (double) amount); float num2 = this._dryad.Size.Length() / 2f / 20f; for (int index = 0; index < num1; ++index) { if (Main.rand.Next(5) == 0) { Dust dust = Dust.NewDustDirect(this._dryad.position, this._dryad.width, this._dryad.height, 27, this._dryad.velocity.X * 1f, Alpha: 100); dust.scale = 0.55f; dust.fadeIn = 0.7f; dust.velocity *= 0.1f * num2; dust.velocity += this._dryad.velocity; } } } private void CreatePortal(FrameEventData evt) { this._portal = this.PlaceNPCOnGround(549, this._startPoint + new Vector2(-240f, 0.0f)); this._portal.immortal = true; } private void DryadStand(FrameEventData evt) { if (this._dryad == null) return; this._dryad.ai[0] = 0.0f; this._dryad.ai[1] = (float) evt.Remaining; } private void DryadLookRight(FrameEventData evt) { if (this._dryad == null) return; this._dryad.direction = 1; this._dryad.spriteDirection = 1; } private void DryadLookLeft(FrameEventData evt) { if (this._dryad == null) return; this._dryad.direction = -1; this._dryad.spriteDirection = -1; } private void DryadWalk(FrameEventData evt) { this._dryad.ai[0] = 1f; this._dryad.ai[1] = 2f; } private void DryadConfusedEmote(FrameEventData evt) { if (this._dryad == null || !evt.IsFirstFrame) return; EmoteBubble.NewBubble(87, new WorldUIAnchor((Entity) this._dryad), evt.Duration); } private void DryadAlertEmote(FrameEventData evt) { if (this._dryad == null || !evt.IsFirstFrame) return; EmoteBubble.NewBubble(3, new WorldUIAnchor((Entity) this._dryad), evt.Duration); } private void CreateOgre(FrameEventData evt) { int index = NPC.NewNPC((int) this._portal.Center.X, (int) this._portal.Bottom.Y, 576); this._ogre = Main.npc[index]; this._ogre.knockBackResist = 0.0f; this._ogre.immortal = true; this._ogre.dontTakeDamage = true; this._ogre.takenDamageMultiplier = 0.0f; this._ogre.immune[(int) byte.MaxValue] = 100000; } private void OgreStand(FrameEventData evt) { if (this._ogre == null) return; this._ogre.ai[0] = 0.0f; this._ogre.ai[1] = 0.0f; this._ogre.velocity = Vector2.Zero; } private void DryadAttack(FrameEventData evt) { if (this._dryad == null) return; this._dryad.ai[0] = 14f; this._dryad.ai[1] = (float) evt.Remaining; this._dryad.dryadWard = false; } private void OgreLookRight(FrameEventData evt) { if (this._ogre == null) return; this._ogre.direction = 1; this._ogre.spriteDirection = 1; } private void OgreLookLeft(FrameEventData evt) { if (this._ogre == null) return; this._ogre.direction = -1; this._ogre.spriteDirection = -1; } public override void OnBegin() { Main.NewText("DD2Film: Begin"); Main.dayTime = true; Main.time = 27000.0; this._startPoint = Main.screenPosition + new Vector2((float) Main.mouseX, (float) Main.mouseY - 32f); base.OnBegin(); } private NPC PlaceNPCOnGround(int type, Vector2 position) { int x = (int) position.X; int y = (int) position.Y; int i = x / 16; int j = y / 16; while (!WorldGen.SolidTile(i, j)) ++j; int Y = j * 16; int Start = 100; switch (type) { case 20: Start = 1; break; case 576: Start = 50; break; } int index = NPC.NewNPC(x, Y, type, Start); return Main.npc[index]; } public override void OnEnd() { if (this._dryad != null) this._dryad.active = false; if (this._portal != null) this._portal.active = false; if (this._ogre != null) this._ogre.active = false; foreach (Entity critter in this._critters) critter.active = false; foreach (Entity entity in this._army) entity.active = false; Main.NewText("DD2Film: End"); base.OnEnd(); } } }