using Terraria; using Terraria.ID; using Terraria.ModLoader; using Microsoft.Xna.Framework; using Terraria.Chat; using Terraria.Localization; namespace ForgottenWawiTech.Content.NPCs.OriginalNiko { [AutoloadBossHead] public class Niko : ModNPC { public override void SetStaticDefaults() { // DisplayName.SetDefault("Original Niko"); Main.npcFrameCount[NPC.type] = 1; } public override void SetDefaults() { NPC.width = 40; NPC.height = 40; NPC.damage = 1786; NPC.defense = 290; NPC.lifeMax = 1000000; NPC.HitSound = SoundID.NPCHit1; NPC.DeathSound = SoundID.NPCDeath1; NPC.knockBackResist = 0f; NPC.boss = true; NPC.aiStyle = -1; NPC.value = Item.buyPrice(0, 1, 0, 0); } public override void AI() { // Phased behaviour for Niko: // Phase 0: initial/dummy AI until 50% HP // Phase 1: invulnerable for ~1 minute (dialogue opportunity) // Phase 2: dummy AI until 30% HP // Phase 3: spawn other bosses (Lyyka, Neptune, Lexy) if they are undefeated, then move to Phase 4 NPC.TargetClosest(false); Player target = Main.player[NPC.target]; if (!target.active || target.dead) { NPC.timeLeft = 300; return; } int phase = (int)NPC.ai[0]; int flags = (int)NPC.ai[1]; // bit0=Lyyka spawned, bit1=Neptune spawned, bit2=Lexy spawned int timer = (int)NPC.ai[2]; // Simple dummy movement helper void DoDummyMovement(float speed) { Vector2 dir = target.Center - NPC.Center; if (dir.Length() > 8f) { dir.Normalize(); NPC.velocity = Vector2.Lerp(NPC.velocity, dir * speed, 0.02f); } } // Phase 0: initial until 50% HP if (phase == 0) { DoDummyMovement(3f); if (NPC.life <= NPC.lifeMax / 2) { // Enter invulnerable phase NPC.ai[0] = 1; NPC.ai[2] = 0; // reset timer NPC.dontTakeDamage = true; NPC.netUpdate = true; string announce = "Niko envelopes themself in a strange silence..."; if (Main.netMode != NetmodeID.MultiplayerClient) Main.NewText(announce, 200, 100, 255); else ChatHelper.BroadcastChatMessage(NetworkText.FromLiteral(announce), new Color(200, 100, 255)); } } // Phase 1: invulnerable waiting (~1 minute) for dialogue else if (phase == 1) { NPC.ai[2]++; // Idle drift NPC.velocity *= 0.98f; // Periodic short dialogue during invulnerable phase int t = (int)NPC.ai[2]; if (t == 120) { string line = "...silence stretches, an uneasy calm."; if (Main.netMode != NetmodeID.MultiplayerClient) Main.NewText(line, 200, 120, 255); else ChatHelper.BroadcastChatMessage(NetworkText.FromLiteral(line), new Color(200, 120, 255)); } else if (t == 900) { string line = "Niko: You think you've seen everything?"; if (Main.netMode != NetmodeID.MultiplayerClient) Main.NewText(line, 220, 160, 255); else ChatHelper.BroadcastChatMessage(NetworkText.FromLiteral(line), new Color(220, 160, 255)); } else if (t == 2100) { string line = "Niko: There's more yet to come..."; if (Main.netMode != NetmodeID.MultiplayerClient) Main.NewText(line, 200, 140, 255); else ChatHelper.BroadcastChatMessage(NetworkText.FromLiteral(line), new Color(200, 140, 255)); } // After approx 60 seconds (3600 ticks), end invulnerability if (NPC.ai[2] >= 3600) { NPC.dontTakeDamage = false; NPC.ai[0] = 2; NPC.netUpdate = true; string announce = "Niko's barrier fades... the battle resumes."; if (Main.netMode != NetmodeID.MultiplayerClient) Main.NewText(announce, 255, 150, 100); else ChatHelper.BroadcastChatMessage(NetworkText.FromLiteral(announce), new Color(255, 150, 100)); } } // Phase 2: dummy AI after invul until 30% HP else if (phase == 2) { DoDummyMovement(4f); if (NPC.life <= (int)(NPC.lifeMax * 0.3f)) { NPC.ai[0] = 3; // go to spawn phase NPC.netUpdate = true; } } // Phase 3: spawn other bosses if undefeated else if (phase == 3) { // Spawn Lyyka if undefeated and not already spawned if (!WorldDefeatedBosses.Lyyka && (flags & 1) == 0) { flags |= 1; string announceL = "Lyyka is called to the fray!"; } // Spawn Neptune if undefeated and not already spawned if (!WorldDefeatedBosses.Neptune && (flags & 2) == 0) { flags |= 2; string announceN = "The waves answer Niko's call: Neptune arrives!"; } // Spawn Lexy if undefeated and not already spawned if (!WorldDefeatedBosses.Lexy && (flags & 4) == 0) { flags |= 4; string announceX = "Lexy emerges to twist the battlefield!"; } // Save flags and move to final phase NPC.ai[1] = flags; NPC.ai[0] = 4; NPC.netUpdate = true; } // Phase 4+: final behaviour (dummy) else { DoDummyMovement(5f); } } public override void OnKill() { // Spawn NikoNPC when killed /* if (Main.netMode != NetmodeID.MultiplayerClient) { NPC.NewNPC(NPC.GetSource_Death(), (int)NPC.Center.X, (int)NPC.Center.Y, ModContent.NPCType()); } else { NetMessage.SendData(MessageID.SpawnNPC, number: ModContent.NPCType(), number2: NPC.whoAmI); } */ // Set a world flag or similar to indicate Niko has been defeated WorldDefeatedBosses.Niko = true; // Immediate sync of world flags WorldDefeatedBosses.Sync(ModContent.GetInstance()); } } }