Init Commit because im an Init Twat

This commit is contained in:
2025-10-30 23:50:31 +00:00
commit 7a9b03d1d0
59 changed files with 1978 additions and 0 deletions
+199
View File
@@ -0,0 +1,199 @@
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<NikoNPC>());
}
else
{
NetMessage.SendData(MessageID.SpawnNPC, number: ModContent.NPCType<NikoNPC>(), 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<ForgottenWawiTech>());
}
}
}