From 7a9b03d1d0894d0b70204d7c2bbe9cc1df88e52f Mon Sep 17 00:00:00 2001 From: Niko Date: Thu, 30 Oct 2025 23:50:31 +0000 Subject: [PATCH] Init Commit because im an Init Twat --- Content/Items/BoulderCannon.cs | 82 ++++++++ Content/Items/BoulderCannon.png | Bin 0 -> 32707 bytes Content/Items/Nyanageddon.cs | 61 ++++++ Content/Items/Nyanageddon.png | Bin 0 -> 863 bytes Content/Items/SummonItems/LexySummon.cs | 43 ++++ Content/Items/SummonItems/LexySummon.png | Bin 0 -> 504 bytes Content/Items/SummonItems/LyykaSummon.cs | 43 ++++ Content/Items/SummonItems/LyykaSummon.png | Bin 0 -> 504 bytes Content/Items/SummonItems/NeptuneSummon.cs | 43 ++++ Content/Items/SummonItems/NeptuneSummon.png | Bin 0 -> 504 bytes Content/Items/SummonItems/NikoSummon.cs | 54 +++++ Content/Items/SummonItems/NikoSummon.png | Bin 0 -> 504 bytes Content/Items/TrueNyanageddon.cs | 66 ++++++ Content/Items/TrueNyanageddon.png | Bin 0 -> 863 bytes Content/NPCs/OriginalLexy/Lexy.cs | 56 +++++ Content/NPCs/OriginalLexy/Lexy.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLexy/LexyNPC.cs | 125 +++++++++++ Content/NPCs/OriginalLexy/LexyNPC.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLexy/LexyNPC_Head.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLexy/Lexy_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLyyka/Clara.cs | 54 +++++ Content/NPCs/OriginalLyyka/Clara.png | Bin 0 -> 504 bytes .../NPCs/OriginalLyyka/Clara_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLyyka/Lyyka.cs | 182 ++++++++++++++++ Content/NPCs/OriginalLyyka/Lyyka.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLyyka/LyykaNPC.cs | 125 +++++++++++ Content/NPCs/OriginalLyyka/LyykaNPC.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLyyka/LyykaNPC_Head.png | Bin 0 -> 504 bytes .../NPCs/OriginalLyyka/Lyyka_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalLyyka/Terra.cs | 50 +++++ Content/NPCs/OriginalLyyka/Terra.png | Bin 0 -> 504 bytes .../NPCs/OriginalLyyka/Terra_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNeptune/Neptune.cs | 136 ++++++++++++ Content/NPCs/OriginalNeptune/Neptune.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNeptune/NeptuneNPC.cs | 125 +++++++++++ Content/NPCs/OriginalNeptune/NeptuneNPC.png | Bin 0 -> 504 bytes .../NPCs/OriginalNeptune/NeptuneNPC_Head.png | Bin 0 -> 504 bytes .../OriginalNeptune/Neptune_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNeptune/Raccoon.cs | 69 ++++++ Content/NPCs/OriginalNeptune/Raccoon.png | Bin 0 -> 504 bytes .../OriginalNeptune/Raccoon_Head_Boss.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNiko/Niko.cs | 199 ++++++++++++++++++ Content/NPCs/OriginalNiko/Niko.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNiko/NikoNPC.cs | 139 ++++++++++++ Content/NPCs/OriginalNiko/NikoNPC.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNiko/NikoNPC_Head.png | Bin 0 -> 504 bytes Content/NPCs/OriginalNiko/Niko_Head_Boss.png | Bin 0 -> 504 bytes ForgottenWawiTech.cs | 18 ++ ForgottenWawiTech.csproj | 16 ++ ForgottenWawiTech.sln | 24 +++ ForgottenWawiTech.tmod | Bin 0 -> 34885 bytes .../en-US_Mods.ForgottenWawiTech.hjson | 140 ++++++++++++ Properties/launchSettings.json | 16 ++ World/WorldDefeatedBosses.cs | 105 +++++++++ build.txt | 3 + description.txt | 2 + description_workshop.txt | 2 + icon.png | Bin 0 -> 26217 bytes icon_small.png | Bin 0 -> 3340 bytes 59 files changed, 1978 insertions(+) create mode 100644 Content/Items/BoulderCannon.cs create mode 100644 Content/Items/BoulderCannon.png create mode 100644 Content/Items/Nyanageddon.cs create mode 100644 Content/Items/Nyanageddon.png create mode 100644 Content/Items/SummonItems/LexySummon.cs create mode 100644 Content/Items/SummonItems/LexySummon.png create mode 100644 Content/Items/SummonItems/LyykaSummon.cs create mode 100644 Content/Items/SummonItems/LyykaSummon.png create mode 100644 Content/Items/SummonItems/NeptuneSummon.cs create mode 100644 Content/Items/SummonItems/NeptuneSummon.png create mode 100644 Content/Items/SummonItems/NikoSummon.cs create mode 100644 Content/Items/SummonItems/NikoSummon.png create mode 100644 Content/Items/TrueNyanageddon.cs create mode 100644 Content/Items/TrueNyanageddon.png create mode 100644 Content/NPCs/OriginalLexy/Lexy.cs create mode 100644 Content/NPCs/OriginalLexy/Lexy.png create mode 100644 Content/NPCs/OriginalLexy/LexyNPC.cs create mode 100644 Content/NPCs/OriginalLexy/LexyNPC.png create mode 100644 Content/NPCs/OriginalLexy/LexyNPC_Head.png create mode 100644 Content/NPCs/OriginalLexy/Lexy_Head_Boss.png create mode 100644 Content/NPCs/OriginalLyyka/Clara.cs create mode 100644 Content/NPCs/OriginalLyyka/Clara.png create mode 100644 Content/NPCs/OriginalLyyka/Clara_Head_Boss.png create mode 100644 Content/NPCs/OriginalLyyka/Lyyka.cs create mode 100644 Content/NPCs/OriginalLyyka/Lyyka.png create mode 100644 Content/NPCs/OriginalLyyka/LyykaNPC.cs create mode 100644 Content/NPCs/OriginalLyyka/LyykaNPC.png create mode 100644 Content/NPCs/OriginalLyyka/LyykaNPC_Head.png create mode 100644 Content/NPCs/OriginalLyyka/Lyyka_Head_Boss.png create mode 100644 Content/NPCs/OriginalLyyka/Terra.cs create mode 100644 Content/NPCs/OriginalLyyka/Terra.png create mode 100644 Content/NPCs/OriginalLyyka/Terra_Head_Boss.png create mode 100644 Content/NPCs/OriginalNeptune/Neptune.cs create mode 100644 Content/NPCs/OriginalNeptune/Neptune.png create mode 100644 Content/NPCs/OriginalNeptune/NeptuneNPC.cs create mode 100644 Content/NPCs/OriginalNeptune/NeptuneNPC.png create mode 100644 Content/NPCs/OriginalNeptune/NeptuneNPC_Head.png create mode 100644 Content/NPCs/OriginalNeptune/Neptune_Head_Boss.png create mode 100644 Content/NPCs/OriginalNeptune/Raccoon.cs create mode 100644 Content/NPCs/OriginalNeptune/Raccoon.png create mode 100644 Content/NPCs/OriginalNeptune/Raccoon_Head_Boss.png create mode 100644 Content/NPCs/OriginalNiko/Niko.cs create mode 100644 Content/NPCs/OriginalNiko/Niko.png create mode 100644 Content/NPCs/OriginalNiko/NikoNPC.cs create mode 100644 Content/NPCs/OriginalNiko/NikoNPC.png create mode 100644 Content/NPCs/OriginalNiko/NikoNPC_Head.png create mode 100644 Content/NPCs/OriginalNiko/Niko_Head_Boss.png create mode 100644 ForgottenWawiTech.cs create mode 100644 ForgottenWawiTech.csproj create mode 100644 ForgottenWawiTech.sln create mode 100644 ForgottenWawiTech.tmod create mode 100644 Localization/en-US_Mods.ForgottenWawiTech.hjson create mode 100644 Properties/launchSettings.json create mode 100644 World/WorldDefeatedBosses.cs create mode 100644 build.txt create mode 100644 description.txt create mode 100644 description_workshop.txt create mode 100644 icon.png create mode 100644 icon_small.png diff --git a/Content/Items/BoulderCannon.cs b/Content/Items/BoulderCannon.cs new file mode 100644 index 0000000..a34b547 --- /dev/null +++ b/Content/Items/BoulderCannon.cs @@ -0,0 +1,82 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; + +namespace ForgottenWawiTech.Content.Items +{ + public class BoulderCannon: ModItem + { + public override void SetDefaults() + { + Item.damage = 10000; + Item.DamageType = DamageClass.Ranged; + Item.width = 40; + Item.height = 40; + Item.useTime = 100; + Item.useAnimation = 100; + Item.useStyle = ItemUseStyleID.Shoot; + Item.knockBack = 6; + Item.value = Item.buyPrice(gold: 20); + Item.rare = ItemRarityID.Red; + Item.UseSound = SoundID.Dig; + Item.autoReuse = true; + Item.noMelee = true; + Item.shoot = ProjectileID.PurificationPowder; + Item.shootSpeed = 50f; + Item.useAmmo = AmmoID.None; + } + + // On shoot, fire Projectile ID 502 (the rainbow projectile) instead of the default ammo projectile + public override bool Shoot(Player player, Terraria.DataStructures.EntitySource_ItemUse_WithAmmo source, Vector2 position, Vector2 velocity, int type, int damage, float knockBack) + { + // If the player's name contains "Neptune" or "Otter", instakill the player. + if (player.name.Contains("Neptune") || player.name.Contains("Otter")) + { + player.KillMe(Terraria.DataStructures.PlayerDeathReason.ByCustomReason(player.name + " was punished accordingly."), 10000, 0); + return false; + } + + // Block the weapon if there is a boss alive +/* for (int i = 0; i < Main.maxNPCs; i++) + { + NPC npc = Main.npc[i]; + if (npc.active && npc.boss) + { + if (Main.myPlayer == player.whoAmI) + { + Main.NewText("The Boulder Cannon refuses to fire while a boss is alive!", 255, 0, 0); + } + return false; + } + } */ + + Terraria.Projectile.NewProjectile(source, position, velocity, 1013, damage, knockBack, player.whoAmI); + + return false; // return false to prevent tModLoader from shooting the default projectile + } + + public override Vector2? HoldoutOffset() { + return new Vector2(2f, -2f); + } + + public override void ModifyShootStats(Player player, ref Vector2 position, ref Vector2 velocity, ref int type, ref int damage, ref float knockback) { + Vector2 muzzleOffset = Vector2.Normalize(velocity) * 25f; + + if (Collision.CanHit(position, 0, 0, position + muzzleOffset, 0, 0)) { + position += muzzleOffset; + } + } + + public override void AddRecipes() + { + Recipe recipe = CreateRecipe(); + recipe.AddIngredient(ItemID.BouncyBoulder, 100); + recipe.AddIngredient(ItemID.LunarBar, 20); + recipe.AddTile(TileID.LunarCraftingStation); + recipe.Register(); + } + } +} diff --git a/Content/Items/BoulderCannon.png b/Content/Items/BoulderCannon.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4dbe585ecd5ae331e6568abe5c81f66d7f7876 GIT binary patch literal 32707 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 literal 0 HcmV?d00001 diff --git a/Content/Items/SummonItems/LexySummon.cs b/Content/Items/SummonItems/LexySummon.cs new file mode 100644 index 0000000..13b6b05 --- /dev/null +++ b/Content/Items/SummonItems/LexySummon.cs @@ -0,0 +1,43 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.Chat; +using Terraria.Localization; +using ForgottenWawiTech.Content.NPCs.OriginalLexy; + +namespace ForgottenWawiTech.Content.Items.SummonItems +{ + public class LexySummon : ModItem + { + public override void SetDefaults() + { + Item.width = 40; + Item.height = 40; + Item.useTime = 10; + Item.useAnimation = 10; + Item.useStyle = ItemUseStyleID.HoldUp; + Item.consumable = false; + Item.rare = ItemRarityID.Red; + } + + public override bool CanUseItem(Player player) + { + return Main.hardMode; + } + + public override bool? UseItem(Player player) + { + string summonText = "Chaos energy fills the air..."; + if (Main.netMode != NetmodeID.MultiplayerClient) + { + NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType()); + Main.NewText(summonText, 175, 75, 255); + } + + return true; + } + } +} \ No newline at end of file diff --git a/Content/Items/SummonItems/LexySummon.png b/Content/Items/SummonItems/LexySummon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/Items/SummonItems/LyykaSummon.cs b/Content/Items/SummonItems/LyykaSummon.cs new file mode 100644 index 0000000..301e523 --- /dev/null +++ b/Content/Items/SummonItems/LyykaSummon.cs @@ -0,0 +1,43 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.Chat; +using Terraria.Localization; +using ForgottenWawiTech.Content.NPCs.OriginalLyyka; + +namespace ForgottenWawiTech.Content.Items.SummonItems +{ + public class LyykaSummon : ModItem + { + public override void SetDefaults() + { + Item.width = 40; + Item.height = 40; + Item.useTime = 10; + Item.useAnimation = 10; + Item.useStyle = ItemUseStyleID.HoldUp; + Item.consumable = false; + Item.rare = ItemRarityID.Red; + } + + public override bool CanUseItem(Player player) + { + return Main.hardMode; + } + + public override bool? UseItem(Player player) + { + string summonText = "A feline presence fills the air..."; + if (Main.netMode != NetmodeID.MultiplayerClient) + { + NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType()); + Main.NewText(summonText, 175, 75, 255); + } + + return true; + } + } +} \ No newline at end of file diff --git a/Content/Items/SummonItems/LyykaSummon.png b/Content/Items/SummonItems/LyykaSummon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/Items/SummonItems/NeptuneSummon.cs b/Content/Items/SummonItems/NeptuneSummon.cs new file mode 100644 index 0000000..bd60a14 --- /dev/null +++ b/Content/Items/SummonItems/NeptuneSummon.cs @@ -0,0 +1,43 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.Chat; +using Terraria.Localization; +using ForgottenWawiTech.Content.NPCs.OriginalNeptune; + +namespace ForgottenWawiTech.Content.Items.SummonItems +{ + public class NeptuneSummon : ModItem + { + public override void SetDefaults() + { + Item.width = 40; + Item.height = 40; + Item.useTime = 10; + Item.useAnimation = 10; + Item.useStyle = ItemUseStyleID.HoldUp; + Item.consumable = false; + Item.rare = ItemRarityID.Red; + } + + public override bool CanUseItem(Player player) + { + return Main.hardMode; + } + + public override bool? UseItem(Player player) + { + string summonText = "The waters begin to stir..."; + if (Main.netMode != NetmodeID.MultiplayerClient) + { + NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType()); + Main.NewText(summonText, 175, 75, 255); + } + + return true; + } + } +} \ No newline at end of file diff --git a/Content/Items/SummonItems/NeptuneSummon.png b/Content/Items/SummonItems/NeptuneSummon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/Items/SummonItems/NikoSummon.cs b/Content/Items/SummonItems/NikoSummon.cs new file mode 100644 index 0000000..f73b02b --- /dev/null +++ b/Content/Items/SummonItems/NikoSummon.cs @@ -0,0 +1,54 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.Chat; +using Terraria.Localization; +using ForgottenWawiTech.Content.NPCs.OriginalNiko; + +namespace ForgottenWawiTech.Content.Items.SummonItems +{ + public class NikoSummon : ModItem + { + public override void SetDefaults() + { + Item.width = 40; + Item.height = 40; + Item.useTime = 10; + Item.useAnimation = 10; + Item.useStyle = ItemUseStyleID.HoldUp; + Item.consumable = false; + Item.rare = ItemRarityID.Red; + } + + // Only allow the boss to be summoned if the Wall of Flesh is defeated (hardmode) + // Will be changed in the future + public override bool CanUseItem(Player player) + { + return Main.hardMode; + } + + public override bool? UseItem(Player player) + { + string summonText = "A familiar presence fills the air..."; + if (Main.netMode != NetmodeID.MultiplayerClient) + { + NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType()); + Main.NewText(summonText, 175, 75, 255); + } + + return true; + } + /* public override void AddRecipes() + { + Recipe recipe = CreateRecipe(); + recipe.AddIngredient(1); + recipe.AddIngredient(ItemID.LunarBar, 20); + recipe.AddIngredient(ItemID.Meowmere, 5); + recipe.AddTile(TileID.LunarCraftingStation); + recipe.Register(); + } */ + } +} diff --git a/Content/Items/SummonItems/NikoSummon.png b/Content/Items/SummonItems/NikoSummon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/Items/TrueNyanageddon.cs b/Content/Items/TrueNyanageddon.cs new file mode 100644 index 0000000..4a1cfd2 --- /dev/null +++ b/Content/Items/TrueNyanageddon.cs @@ -0,0 +1,66 @@ +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.Audio; +using Terraria.DataStructures; +using Terraria.ID; +using Terraria.ModLoader; +using ForgottenWawiTech.Content.Items; + +namespace ForgottenWawiTech.Content.Items +{ + public class TrueNyanageddon : ModItem + { + public override void SetDefaults() + { + Item.damage = 1200; + Item.DamageType = DamageClass.Ranged; + Item.width = 40; + Item.height = 40; + Item.useTime = 7; + Item.useAnimation = 7; + Item.useStyle = ItemUseStyleID.Shoot; + Item.knockBack = 20; + Item.value = Item.buyPrice(gold: 60); + Item.rare = ItemRarityID.Red; + Item.UseSound = SoundID.Meowmere; + Item.autoReuse = true; + Item.noMelee = true; + Item.shoot = ProjectileID.PurificationPowder; + Item.shootSpeed = 20f; + Item.useAmmo = AmmoID.None; + } + + // On shoot, fire 5 Projectile ID 502 (the rainbow projectile) in an arc instead of the default ammo projectile + public override bool Shoot(Player player, Terraria.DataStructures.EntitySource_ItemUse_WithAmmo source, Vector2 position, Vector2 velocity, int type, int damage, float knockBack) + { + for (int i = -2; i <= 2; i++) + { + Vector2 newVelocity = velocity.RotatedBy(MathHelper.ToRadians(3 * i)); + Terraria.Projectile.NewProjectile(source, position, newVelocity, 502, damage, knockBack, player.whoAmI); + } + return false; // return false to prevent tModLoader from shooting the default projectile + } + + public override Vector2? HoldoutOffset() { + return new Vector2(2f, -2f); + } + + public override void ModifyShootStats(Player player, ref Vector2 position, ref Vector2 velocity, ref int type, ref int damage, ref float knockback) { + Vector2 muzzleOffset = Vector2.Normalize(velocity) * 25f; + + if (Collision.CanHit(position, 0, 0, position + muzzleOffset, 0, 0)) { + position += muzzleOffset; + } + } + + public override void AddRecipes() + { + Recipe recipe = CreateRecipe(); + recipe.AddIngredient(1); + recipe.AddIngredient(ItemID.LunarBar, 20); + recipe.AddIngredient(ItemID.Meowmere, 5); + recipe.AddTile(TileID.LunarCraftingStation); + recipe.Register(); + } + } +} diff --git a/Content/Items/TrueNyanageddon.png b/Content/Items/TrueNyanageddon.png new file mode 100644 index 0000000000000000000000000000000000000000..f28e9e51096353c0feb21a695d583d69e64d3d81 GIT binary patch literal 863 zcmV-l1EBngP)F3jT69Ai9(;bIOThIoBgS};Qt?0;R^ND)etNpF_dSMYJ+<0eRD0#Oqwe$giBaf0* z|3{e6v*i!~vr2iJZaLbjW!^?5v=Kp34X`yKlbHnkNDmtEYI_|f6TbggmdXpO-mN>H zD@pnO93Uf1(6K%cVV8|jPtF^ah8baNz{uP%ppRIQZyVVHU44;GXT|||Iq|+~d)0)I z*~O~$4)zVy?8l#lRjdBC`4K-UE&FUIM`uDbG|ULo010DE44?Ll5fN_7^wZY>44pX& z=uLVzp93oAh-;t49MK8D)G@hT&#Je7AeXc1kM$g3GDE!)Zf=N{rmdP()(3FzMa_C5 zqD`oCf^9oNp|Aw_X8ctqbo+v!`6}sW-1nX6k>6xngdLrzzH|p!f9cM&L p2t7xr5!tAZ5H`xk4bF&|@DFT6R_K3H?1lgU002ovPDHLkV1nQJqsIUM literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLexy/Lexy.cs b/Content/NPCs/OriginalLexy/Lexy.cs new file mode 100644 index 0000000..278fbeb --- /dev/null +++ b/Content/NPCs/OriginalLexy/Lexy.cs @@ -0,0 +1,56 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLexy +{ + [AutoloadBossHead] + public class Lexy : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Original Lexy"); + 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() + { + // For now, the boss instantly dies + NPC.life = 0; + NPC.checkDead(); + } + + public override void OnKill() + { +/* // Spawn LexyNPC 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 Lexy has been defeated + WorldDefeatedBosses.Lexy = true; + // Immediate sync of world flags + WorldDefeatedBosses.Sync(ModContent.GetInstance()); + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLexy/Lexy.png b/Content/NPCs/OriginalLexy/Lexy.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLexy/LexyNPC.cs b/Content/NPCs/OriginalLexy/LexyNPC.cs new file mode 100644 index 0000000..d3df922 --- /dev/null +++ b/Content/NPCs/OriginalLexy/LexyNPC.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.GameContent.Personalities; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLexy +{ + [AutoloadHead] + public class LexyNPC : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Lexy"); + Main.npcFrameCount[NPC.type] = 25; + + NPCID.Sets.ExtraFramesCount[NPC.type] = 9; + NPCID.Sets.AttackFrameCount[NPC.type] = 4; + NPCID.Sets.DangerDetectRange[NPC.type] = 700; + NPCID.Sets.AttackType[NPC.type] = 0; + NPCID.Sets.AttackTime[NPC.type] = 90; + NPCID.Sets.AttackAverageChance[NPC.type] = 30; + NPCID.Sets.HatOffsetY[NPC.type] = 4; + + NPCID.Sets.NPCBestiaryDrawModifiers drawModifiers = new NPCID.Sets.NPCBestiaryDrawModifiers(0) + { + Velocity = 1f, + Direction = 1 + }; + + NPCID.Sets.NPCBestiaryDrawOffset.Add(Type, drawModifiers); + } + + public override void SetDefaults() + { + NPC.townNPC = true; + NPC.friendly = true; + NPC.width = 18; + NPC.height = 40; + NPC.aiStyle = 7; + NPC.damage = 10; + NPC.defense = 15; + NPC.lifeMax = 250; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0.5f; + + AnimationType = NPCID.Guide; + } + + public override bool CanTownNPCSpawn(int numTownNPCs) + { + return WorldDefeatedBosses.Lexy; + } + + public override List SetNPCNameList() + { + return new List() { + "Lexy" + }; + } + + public override void SetChatButtons(ref string button, ref string button2) + { + button = Language.GetTextValue("LegacyInterface.28"); // "Shop" + } + + public override void OnChatButtonClicked(bool firstButton, ref string shop) + { + if (firstButton) + { + shop = "Shop"; + } + } + + public override void AddShops() + { + var npcShop = new NPCShop(Type) + .Add(ItemID.LightningBug) + .Add(ItemID.Sunflower); + + npcShop.Register(); + } + + public override string GetChat() + { + switch (Main.rand.Next(4)) + { + case 0: + return "Time to cause some chaos!"; + case 1: + return "Want to see a magic trick?"; + case 2: + return "Everything's more fun with explosions!"; + default: + return "Let's make things interesting..."; + } + } + + public override void TownNPCAttackStrength(ref int damage, ref float knockback) + { + damage = 20; + knockback = 4f; + } + + public override void TownNPCAttackCooldown(ref int cooldown, ref int randExtraCooldown) + { + cooldown = 30; + randExtraCooldown = 30; + } + + public override void TownNPCAttackProj(ref int projType, ref int attackDelay) + { + projType = ProjectileID.MagicMissile; + attackDelay = 1; + } + + public override void TownNPCAttackProjSpeed(ref float multiplier, ref float gravityCorrection, ref float randomOffset) + { + multiplier = 12f; + randomOffset = 2f; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLexy/LexyNPC.png b/Content/NPCs/OriginalLexy/LexyNPC.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLexy/LexyNPC_Head.png b/Content/NPCs/OriginalLexy/LexyNPC_Head.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLexy/Lexy_Head_Boss.png b/Content/NPCs/OriginalLexy/Lexy_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Clara.cs b/Content/NPCs/OriginalLyyka/Clara.cs new file mode 100644 index 0000000..b04e182 --- /dev/null +++ b/Content/NPCs/OriginalLyyka/Clara.cs @@ -0,0 +1,54 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLyyka +{ + [AutoloadBossHead] + public class Clara : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Clara"); + Main.npcFrameCount[NPC.type] = 1; + } + + public override void SetDefaults() + { + NPC.width = 44; + NPC.height = 44; + NPC.damage = 65; + NPC.defense = 18; + NPC.lifeMax = 15000; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0f; + NPC.boss = true; + NPC.aiStyle = -1; // placeholder + NPC.value = Item.buyPrice(0, 1, 50, 0); + } + + public override void AI() + { + // Placeholder AI: simple orbiting motion around spawn point + Vector2 center = NPC.ai[0] != 0 ? new Vector2(NPC.ai[1], NPC.ai[2]) : NPC.Center; + if (NPC.ai[0] == 0) + { + NPC.ai[0] = 1; + NPC.ai[1] = NPC.Center.X; + NPC.ai[2] = NPC.Center.Y; + } + + float orbitRadius = 120f; + NPC.ai[3] += 0.02f; + float angle = NPC.ai[3]; + Vector2 targetPos = new Vector2(NPC.ai[1], NPC.ai[2]) + orbitRadius * new Vector2((float)System.Math.Cos(angle), (float)System.Math.Sin(angle)); + Vector2 move = targetPos - NPC.Center; + float speed = 6f; + if (move.Length() > speed) + move = Vector2.Normalize(move) * speed; + NPC.velocity = (NPC.velocity * 20f + move) / 21f; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLyyka/Clara.png b/Content/NPCs/OriginalLyyka/Clara.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Clara_Head_Boss.png b/Content/NPCs/OriginalLyyka/Clara_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Lyyka.cs b/Content/NPCs/OriginalLyyka/Lyyka.cs new file mode 100644 index 0000000..ffedca2 --- /dev/null +++ b/Content/NPCs/OriginalLyyka/Lyyka.cs @@ -0,0 +1,182 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; +using Terraria.Chat; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLyyka +{ + [AutoloadBossHead] + public class Lyyka : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Original Lyyka"); + 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 boss AI for Lyyka: + // - At 50% HP, spawn Terra. Lyyka becomes invulnerable and waits until Terra is defeated -> Phase 2 + // - At 30% HP (after Terra phase), spawn Clara. Lyyka becomes invulnerable and waits until Clara is defeated -> Phase 3 + + NPC.TargetClosest(false); + Player target = Main.player[NPC.target]; + if (!target.active || target.dead) + { + NPC.timeLeft = 300; + return; + } + + int phase = (int)NPC.ai[0]; // 0 = initial, 1 = waiting Terra, 2 = after Terra, 3 = waiting Clara, 4 = final + int flags = (int)NPC.ai[1]; // bit0 = Terra spawned, bit1 = Clara spawned + + // Phase 0: before Terra summoned + if (phase == 0) + { + if (NPC.life <= NPC.lifeMax / 2 && (flags & 1) == 0) + { + flags |= 1; + NPC.ai[1] = flags; + + // Make invulnerable and wait for Terra + NPC.dontTakeDamage = true; + NPC.ai[0] = 1; + NPC.netUpdate = true; + + } + + // basic approach movement + if (NPC.ai[0] == 0) + { + Vector2 dir = (target.Center - NPC.Center); + if (dir.Length() > 8f) + { + dir.Normalize(); + NPC.velocity = Vector2.Lerp(NPC.velocity, dir * 3.5f, 0.02f); + } + } + } + // Phase 1: waiting for Terra + else if (phase == 1) + { + bool terraAlive = false; + int terraType = ModContent.NPCType(); + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC check = Main.npc[i]; + if (check.active && check.type == terraType) + { + terraAlive = true; + break; + } + } + + if (!terraAlive) + { + NPC.dontTakeDamage = false; + NPC.ai[0] = 2; // enter Phase 2 + NPC.netUpdate = true; + } + else + { + NPC.velocity *= 0.98f; // idle while waiting + } + } + // Phase 2: after Terra defeated, before Clara + else if (phase == 2) + { + // When at or below 30% HP, spawn Clara (if not already spawned) + if (NPC.life <= (int)(NPC.lifeMax * 0.3f) && (flags & 2) == 0) + { + flags |= 2; + NPC.ai[1] = flags; + + NPC.dontTakeDamage = true; + NPC.ai[0] = 3; // waiting for Clara + NPC.netUpdate = true; + + string announceClara = "Clara descends from the sky!"; + } + + // basic movement in Phase 2 + Vector2 dir2 = (target.Center - NPC.Center); + if (dir2.Length() > 8f) + { + dir2.Normalize(); + NPC.velocity = Vector2.Lerp(NPC.velocity, dir2 * 4f, 0.02f); + } + } + // Phase 3: waiting for Clara + else if (phase == 3) + { + bool claraAlive = false; + int claraType = ModContent.NPCType(); + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC check = Main.npc[i]; + if (check.active && check.type == claraType) + { + claraAlive = true; + break; + } + } + + if (!claraAlive) + { + NPC.dontTakeDamage = false; + NPC.ai[0] = 4; // final phase + NPC.netUpdate = true; + } + else + { + NPC.velocity *= 0.98f; + } + } + // Phase 4+: final behaviour + else + { + Vector2 dir3 = (target.Center - NPC.Center); + if (dir3.Length() > 8f) + { + dir3.Normalize(); + NPC.velocity = Vector2.Lerp(NPC.velocity, dir3 * 4.5f, 0.02f); + } + } + } + + public override void OnKill() + { +/* // Spawn LyykaNPC 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 Lyyka has been defeated + WorldDefeatedBosses.Lyyka = true; + // Immediate sync of world flags + WorldDefeatedBosses.Sync(ModContent.GetInstance()); + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLyyka/Lyyka.png b/Content/NPCs/OriginalLyyka/Lyyka.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/LyykaNPC.cs b/Content/NPCs/OriginalLyyka/LyykaNPC.cs new file mode 100644 index 0000000..5cd49e4 --- /dev/null +++ b/Content/NPCs/OriginalLyyka/LyykaNPC.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.GameContent.Personalities; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLyyka +{ + [AutoloadHead] + public class LyykaNPC : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Lyyka"); + Main.npcFrameCount[NPC.type] = 25; + + NPCID.Sets.ExtraFramesCount[NPC.type] = 9; + NPCID.Sets.AttackFrameCount[NPC.type] = 4; + NPCID.Sets.DangerDetectRange[NPC.type] = 700; + NPCID.Sets.AttackType[NPC.type] = 0; + NPCID.Sets.AttackTime[NPC.type] = 90; + NPCID.Sets.AttackAverageChance[NPC.type] = 30; + NPCID.Sets.HatOffsetY[NPC.type] = 4; + + NPCID.Sets.NPCBestiaryDrawModifiers drawModifiers = new NPCID.Sets.NPCBestiaryDrawModifiers(0) + { + Velocity = 1f, + Direction = 1 + }; + + NPCID.Sets.NPCBestiaryDrawOffset.Add(Type, drawModifiers); + } + + public override void SetDefaults() + { + NPC.townNPC = true; + NPC.friendly = true; + NPC.width = 18; + NPC.height = 40; + NPC.aiStyle = 7; + NPC.damage = 10; + NPC.defense = 15; + NPC.lifeMax = 250; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0.5f; + + AnimationType = NPCID.Guide; + } + + public override bool CanTownNPCSpawn(int numTownNPCs) + { + return WorldDefeatedBosses.Lyyka; + } + + public override List SetNPCNameList() + { + return new List() { + "Lyyka" + }; + } + + public override void SetChatButtons(ref string button, ref string button2) + { + button = Language.GetTextValue("LegacyInterface.28"); // "Shop" + } + + public override void OnChatButtonClicked(bool firstButton, ref string shop) + { + if (firstButton) + { + shop = "Shop"; + } + } + + public override void AddShops() + { + var npcShop = new NPCShop(Type) + .Add(ItemID.LightningBug) + .Add(ItemID.Sunflower); + + npcShop.Register(); + } + + public override string GetChat() + { + switch (Main.rand.Next(4)) + { + case 0: + return "Meow!"; + case 1: + return "Want some cookies?"; + case 2: + return "Time for a catnap..."; + default: + return "Purr..."; + } + } + + public override void TownNPCAttackStrength(ref int damage, ref float knockback) + { + damage = 20; + knockback = 4f; + } + + public override void TownNPCAttackCooldown(ref int cooldown, ref int randExtraCooldown) + { + cooldown = 30; + randExtraCooldown = 30; + } + + public override void TownNPCAttackProj(ref int projType, ref int attackDelay) + { + projType = ProjectileID.SwordBeam; + attackDelay = 1; + } + + public override void TownNPCAttackProjSpeed(ref float multiplier, ref float gravityCorrection, ref float randomOffset) + { + multiplier = 12f; + randomOffset = 2f; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLyyka/LyykaNPC.png b/Content/NPCs/OriginalLyyka/LyykaNPC.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/LyykaNPC_Head.png b/Content/NPCs/OriginalLyyka/LyykaNPC_Head.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Lyyka_Head_Boss.png b/Content/NPCs/OriginalLyyka/Lyyka_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Terra.cs b/Content/NPCs/OriginalLyyka/Terra.cs new file mode 100644 index 0000000..b289fc6 --- /dev/null +++ b/Content/NPCs/OriginalLyyka/Terra.cs @@ -0,0 +1,50 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; + +namespace ForgottenWawiTech.Content.NPCs.OriginalLyyka +{ + [AutoloadBossHead] + public class Terra : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Terra"); + Main.npcFrameCount[NPC.type] = 1; + } + + public override void SetDefaults() + { + NPC.width = 48; + NPC.height = 48; + NPC.damage = 80; + NPC.defense = 20; + NPC.lifeMax = 20000; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0f; + NPC.boss = true; + NPC.aiStyle = -1; // custom AI will be added later + NPC.value = Item.buyPrice(0, 2, 0, 0); + } + + public override void AI() + { + // Placeholder AI: hover in place and face the player + Player target = Main.player[NPC.target]; + if (!target.active || target.dead) + { + NPC.TargetClosest(false); + target = Main.player[NPC.target]; + + } + + Vector2 direction = target.Center - NPC.Center; + direction.Normalize(); + float speed = 2.5f; + NPC.velocity = (NPC.velocity * 30f + direction * speed) / 31f; + NPC.spriteDirection = NPC.direction = (direction.X < 0f) ? -1 : 1; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalLyyka/Terra.png b/Content/NPCs/OriginalLyyka/Terra.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalLyyka/Terra_Head_Boss.png b/Content/NPCs/OriginalLyyka/Terra_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/Neptune.cs b/Content/NPCs/OriginalNeptune/Neptune.cs new file mode 100644 index 0000000..880e4e2 --- /dev/null +++ b/Content/NPCs/OriginalNeptune/Neptune.cs @@ -0,0 +1,136 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; +using Terraria.Chat; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalNeptune +{ + [AutoloadBossHead] + public class Neptune : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Original Neptune"); + 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 boss AI: at 50% HP spawn Raccoon. Neptune becomes invulnerable and does not attack + // until Raccoon is defeated, then move to Phase 2. + + NPC.TargetClosest(false); + Player target = Main.player[NPC.target]; + if (!target.active || target.dead) + { + NPC.timeLeft = 300; + return; + } + + int phase = (int)NPC.ai[0]; // 0 = phase 1 (initial), 1 = waiting for raccoon, 2 = phase 2 + int flags = (int)NPC.ai[1]; // bitflags: bit0 = raccoon spawned + + // Phase 0: before Raccoon summoned + if (phase == 0) + { + // If at or below 50% life and raccoon hasn't been spawned, spawn it and enter waiting state + if (NPC.life <= NPC.lifeMax / 2 && (flags & 1) == 0) + { + flags |= 1; + NPC.ai[1] = flags; + + // Make Neptune invulnerable and enter waiting phase + NPC.dontTakeDamage = true; + NPC.ai[0] = 1; + NPC.netUpdate = true; + + string announce = "A mischievous raccoon scurries into the battlefield!"; + } + + // Simple approach movement when not waiting + if (NPC.ai[0] == 0) + { + Vector2 dir = (target.Center - NPC.Center); + if (dir.Length() > 8f) + { + dir.Normalize(); + NPC.velocity = Vector2.Lerp(NPC.velocity, dir * 3f, 0.02f); + } + } + } + // Phase 1: waiting for Raccoon to be defeated + else if (phase == 1) + { + bool raccoonAlive = false; + int raccoonType = ModContent.NPCType(); + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC check = Main.npc[i]; + if (check.active && check.type == raccoonType) + { + raccoonAlive = true; + break; + } + } + + // Stay invulnerable and idle until raccoon is gone + if (!raccoonAlive) + { + NPC.dontTakeDamage = false; + NPC.ai[0] = 2; // enter Phase 2 + NPC.netUpdate = true; + } + else + { + // idle drift while waiting + NPC.velocity *= 0.98f; + } + } + // Phase 2+: normal behaviour (placeholder movement) + else + { + Vector2 dir = (target.Center - NPC.Center); + if (dir.Length() > 8f) + { + dir.Normalize(); + NPC.velocity = Vector2.Lerp(NPC.velocity, dir * 4f, 0.02f); + } + NPC.spriteDirection = NPC.direction = (target.Center.X < NPC.Center.X) ? -1 : 1; + } + } + + public override void OnKill() + { +/* // Spawn NeptuneNPC 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 Neptune has been defeated + WorldDefeatedBosses.Neptune = true; + // Immediate sync of world flags + WorldDefeatedBosses.Sync(ModContent.GetInstance()); + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalNeptune/Neptune.png b/Content/NPCs/OriginalNeptune/Neptune.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/NeptuneNPC.cs b/Content/NPCs/OriginalNeptune/NeptuneNPC.cs new file mode 100644 index 0000000..43b8e9c --- /dev/null +++ b/Content/NPCs/OriginalNeptune/NeptuneNPC.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.GameContent.Personalities; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalNeptune +{ + [AutoloadHead] + public class NeptuneNPC : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Neptune"); + Main.npcFrameCount[NPC.type] = 25; + + NPCID.Sets.ExtraFramesCount[NPC.type] = 9; + NPCID.Sets.AttackFrameCount[NPC.type] = 4; + NPCID.Sets.DangerDetectRange[NPC.type] = 700; + NPCID.Sets.AttackType[NPC.type] = 0; + NPCID.Sets.AttackTime[NPC.type] = 90; + NPCID.Sets.AttackAverageChance[NPC.type] = 30; + NPCID.Sets.HatOffsetY[NPC.type] = 4; + + NPCID.Sets.NPCBestiaryDrawModifiers drawModifiers = new NPCID.Sets.NPCBestiaryDrawModifiers(0) + { + Velocity = 1f, + Direction = 1 + }; + + NPCID.Sets.NPCBestiaryDrawOffset.Add(Type, drawModifiers); + } + + public override void SetDefaults() + { + NPC.townNPC = true; + NPC.friendly = true; + NPC.width = 18; + NPC.height = 40; + NPC.aiStyle = 7; + NPC.damage = 10; + NPC.defense = 15; + NPC.lifeMax = 250; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0.5f; + + AnimationType = NPCID.Guide; + } + + public override bool CanTownNPCSpawn(int numTownNPCs) + { + return WorldDefeatedBosses.Neptune; + } + + public override List SetNPCNameList() + { + return new List() { + "Neptune" + }; + } + + public override void SetChatButtons(ref string button, ref string button2) + { + button = Language.GetTextValue("LegacyInterface.28"); // "Shop" + } + + public override void OnChatButtonClicked(bool firstButton, ref string shop) + { + if (firstButton) + { + shop = "Shop"; + } + } + + public override void AddShops() + { + var npcShop = new NPCShop(Type) + .Add(ItemID.LightningBug) + .Add(ItemID.Sunflower); + + npcShop.Register(); + } + + public override string GetChat() + { + switch (Main.rand.Next(4)) + { + case 0: + return "*Splashing water sounds*"; + case 1: + return "The ocean calls..."; + case 2: + return "Do you like water?"; + default: + return "Waves crash eternally..."; + } + } + + public override void TownNPCAttackStrength(ref int damage, ref float knockback) + { + damage = 20; + knockback = 4f; + } + + public override void TownNPCAttackCooldown(ref int cooldown, ref int randExtraCooldown) + { + cooldown = 30; + randExtraCooldown = 30; + } + + public override void TownNPCAttackProj(ref int projType, ref int attackDelay) + { + projType = ProjectileID.WaterBolt; + attackDelay = 1; + } + + public override void TownNPCAttackProjSpeed(ref float multiplier, ref float gravityCorrection, ref float randomOffset) + { + multiplier = 12f; + randomOffset = 2f; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalNeptune/NeptuneNPC.png b/Content/NPCs/OriginalNeptune/NeptuneNPC.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/NeptuneNPC_Head.png b/Content/NPCs/OriginalNeptune/NeptuneNPC_Head.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/Neptune_Head_Boss.png b/Content/NPCs/OriginalNeptune/Neptune_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/Raccoon.cs b/Content/NPCs/OriginalNeptune/Raccoon.cs new file mode 100644 index 0000000..138b485 --- /dev/null +++ b/Content/NPCs/OriginalNeptune/Raccoon.cs @@ -0,0 +1,69 @@ +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Microsoft.Xna.Framework; + +namespace ForgottenWawiTech.Content.NPCs.OriginalNeptune +{ + [AutoloadBossHead] + public class Raccoon : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Raccoon"); + Main.npcFrameCount[NPC.type] = 1; + } + + public override void SetDefaults() + { + NPC.width = 40; + NPC.height = 40; + NPC.damage = 70; + NPC.defense = 16; + NPC.lifeMax = 18000; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0f; + NPC.boss = true; + NPC.aiStyle = -1; // custom behavior later + NPC.value = Item.buyPrice(0, 1, 75, 0); + } + + public override void AI() + { + // Placeholder AI: dash toward player occasionally + Player target = Main.player[NPC.target]; + if (!target.active || target.dead) + { + NPC.TargetClosest(false); + target = Main.player[NPC.target]; + if (!target.active || target.dead) + { + NPC.velocity.Y -= 0.1f; + } + } + + NPC.ai[0]++; + if (NPC.ai[0] < 60) + { + // approach + Vector2 dir = target.Center - NPC.Center; + dir.Normalize(); + NPC.velocity = dir * 3f; + } + else if (NPC.ai[0] == 60) + { + // dash + Vector2 dash = target.Center - NPC.Center; + dash.Normalize(); + NPC.velocity = dash * 10f; + } + else if (NPC.ai[0] > 120) + { + NPC.ai[0] = 0; + } + + NPC.spriteDirection = NPC.direction = (target.Center.X < NPC.Center.X) ? -1 : 1; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalNeptune/Raccoon.png b/Content/NPCs/OriginalNeptune/Raccoon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNeptune/Raccoon_Head_Boss.png b/Content/NPCs/OriginalNeptune/Raccoon_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNiko/Niko.cs b/Content/NPCs/OriginalNiko/Niko.cs new file mode 100644 index 0000000..d71315e --- /dev/null +++ b/Content/NPCs/OriginalNiko/Niko.cs @@ -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()); + } + 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()); + } + } +} diff --git a/Content/NPCs/OriginalNiko/Niko.png b/Content/NPCs/OriginalNiko/Niko.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNiko/NikoNPC.cs b/Content/NPCs/OriginalNiko/NikoNPC.cs new file mode 100644 index 0000000..5e7e23f --- /dev/null +++ b/Content/NPCs/OriginalNiko/NikoNPC.cs @@ -0,0 +1,139 @@ +using System.Collections.Generic; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; +using Terraria.GameContent.Personalities; +using Terraria.Localization; + +namespace ForgottenWawiTech.Content.NPCs.OriginalNiko +{ + [AutoloadHead] + public class NikoNPC : ModNPC + { + public override void SetStaticDefaults() + { + // DisplayName.SetDefault("Niko"); + Main.npcFrameCount[NPC.type] = 25; // The amount of frames the NPC has + + NPCID.Sets.ExtraFramesCount[NPC.type] = 9; // Generally for Town NPCs, this should be 9 + NPCID.Sets.AttackFrameCount[NPC.type] = 4; + NPCID.Sets.DangerDetectRange[NPC.type] = 700; // The amount of pixels away from the center of the npc that it tries to attack enemies + NPCID.Sets.AttackType[NPC.type] = 0; + NPCID.Sets.AttackTime[NPC.type] = 90; // The amount of time it takes for the NPC's attack animation to be over + NPCID.Sets.AttackAverageChance[NPC.type] = 30; + NPCID.Sets.HatOffsetY[NPC.type] = 4; // For when a party is active, the party hat spawns at a Y offset + + // Influences how the NPC looks in the Bestiary + NPCID.Sets.NPCBestiaryDrawModifiers drawModifiers = new NPCID.Sets.NPCBestiaryDrawModifiers(0) + { + Velocity = 1f, // Draws the NPC in the bestiary as if its walking +1 tiles in the x direction + Direction = 1 // -1 is left and 1 is right. NPCs are drawn facing the left by default + }; + + NPCID.Sets.NPCBestiaryDrawOffset.Add(Type, drawModifiers); + } + + public override void SetDefaults() + { + NPC.townNPC = true; + NPC.friendly = true; + NPC.width = 18; + NPC.height = 40; + NPC.aiStyle = 7; + NPC.damage = 10; + NPC.defense = 15; + NPC.lifeMax = 250; + NPC.HitSound = SoundID.NPCHit1; + NPC.DeathSound = SoundID.NPCDeath1; + NPC.knockBackResist = 0.5f; + + AnimationType = NPCID.Guide; + } + + public override bool CanTownNPCSpawn(int numTownNPCs) + { + // NikoNPC can only spawn after Original Niko is defeated + // Due to Terraria logic, we need to return true here if Niko has been defeated so that the NPC can respawn. + return WorldDefeatedBosses.Niko; + + } + + public override List SetNPCNameList() + { + return new List() { + "Niko" + }; + } + + public override void SetChatButtons(ref string button, ref string button2) + { + button = Language.GetTextValue("LegacyInterface.28"); // "Shop" + } + + public override void OnChatButtonClicked(bool firstButton, ref string shop) + { + if (firstButton) + { + shop = "Shop"; + } + } + + public override void AddShops() + { + var npcShop = new NPCShop(Type) + .Add(ItemID.LightningBug) // Example item, replace with your own items + .Add(ItemID.Sunflower); // Example item, replace with your own items + + npcShop.Register(); + } + + public override string GetChat() + { + switch (Main.rand.Next(8)) + { + case 0: + return "Just because you defeated me doesn't mean I'm gone forever."; + case 1: + return "I'm taking the internet down for an hour, hope you don't mind."; + case 2: + return "FUCK!"; + case 3: + return "Be quick, I'm about to bugger off to Nando's."; + case 4: + return "I'm not dead yet!"; + case 5: + return "You can't get rid of me that easily!"; + case 6: + return "I'll be back!"; + case 7: + return "This isn't the end!"; + default: + return "I have no idea what to say."; + } + } + + public override void TownNPCAttackStrength(ref int damage, ref float knockback) + { + damage = 20; + knockback = 4f; + } + + public override void TownNPCAttackCooldown(ref int cooldown, ref int randExtraCooldown) + { + cooldown = 30; + randExtraCooldown = 30; + } + + public override void TownNPCAttackProj(ref int projType, ref int attackDelay) + { + projType = ProjectileID.SwordBeam; + attackDelay = 1; + } + + public override void TownNPCAttackProjSpeed(ref float multiplier, ref float gravityCorrection, ref float randomOffset) + { + multiplier = 12f; + randomOffset = 2f; + } + } +} \ No newline at end of file diff --git a/Content/NPCs/OriginalNiko/NikoNPC.png b/Content/NPCs/OriginalNiko/NikoNPC.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNiko/NikoNPC_Head.png b/Content/NPCs/OriginalNiko/NikoNPC_Head.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/Content/NPCs/OriginalNiko/Niko_Head_Boss.png b/Content/NPCs/OriginalNiko/Niko_Head_Boss.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0cf81e52f4133dbe85453dd9a37993af17b5be GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBbOU@sT!FNbf{DF-NtsjE_3B;! z|NjSy0D+K@p01v+t9x8zR#D@WS?dlQ`1+YJESG!@x4dC7*`C93=UXkhhvvt!hjSLlJ~RwmnP~Bh_e#*cGOJz5H)U2RZk=*d{>S{o z|7E^K_FWXNcxrjXh&wV*Hfp0Ti%!ljhM&t`NT+&77>M@wN(xASbQfH=B6&8`PK|k& o(pT;d?|57xzrgJ7^Ax@sCjQeEzP*#>W`d&2)78&qol`;+07t#pIRF3v literal 0 HcmV?d00001 diff --git a/ForgottenWawiTech.cs b/ForgottenWawiTech.cs new file mode 100644 index 0000000..9a4c0c6 --- /dev/null +++ b/ForgottenWawiTech.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Terraria.ModLoader; +using System.IO; +using Terraria; +using Terraria.ModLoader.IO; + +namespace ForgottenWawiTech +{ + // Please read https://github.com/tModLoader/tModLoader/wiki/Basic-tModLoader-Modding-Guide#mod-skeleton-contents for more information about the various files in a mod. + public class ForgottenWawiTech : Mod + { + + } +} diff --git a/ForgottenWawiTech.csproj b/ForgottenWawiTech.csproj new file mode 100644 index 0000000..726c74f --- /dev/null +++ b/ForgottenWawiTech.csproj @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ForgottenWawiTech.sln b/ForgottenWawiTech.sln new file mode 100644 index 0000000..da22ab7 --- /dev/null +++ b/ForgottenWawiTech.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ForgottenWawiTech", "ForgottenWawiTech.csproj", "{21F9DB8D-48F0-6003-B105-E35E06F69FEB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21F9DB8D-48F0-6003-B105-E35E06F69FEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21F9DB8D-48F0-6003-B105-E35E06F69FEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21F9DB8D-48F0-6003-B105-E35E06F69FEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21F9DB8D-48F0-6003-B105-E35E06F69FEB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BE0328FD-FC45-46F6-9816-4A2C742D5427} + EndGlobalSection +EndGlobal diff --git a/ForgottenWawiTech.tmod b/ForgottenWawiTech.tmod new file mode 100644 index 0000000000000000000000000000000000000000..f960e58b24f48aee4b8770cd96358e686c690f40 GIT binary patch literal 34885 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 + if (Niko) list.Add("Niko"); + if (Lyyka) list.Add("Lyyka"); + if (Neptune) list.Add("Neptune"); + if (Lexy) list.Add("Lexy"); + if (Terra) list.Add("Terra"); + if (Clara) list.Add("Clara"); + if (Raccoon) list.Add("Raccoon"); + + tag["ForgottenWawiTech_DefeatedBosses"] = list; + } + + public override void LoadWorldData(TagCompound tag) + { + if (tag.TryGet>("ForgottenWawiTech_DefeatedBosses", out var list)) + { + Niko = list.Contains("Niko"); + Lyyka = list.Contains("Lyyka"); + Neptune = list.Contains("Neptune"); + Lexy = list.Contains("Lexy"); + Terra = list.Contains("Terra"); + Clara = list.Contains("Clara"); + Raccoon = list.Contains("Raccoon"); + } + else + { + Niko = Lyyka = Neptune = Lexy = Terra = Clara = Raccoon = false; + } + } + + public override void NetSend(BinaryWriter writer) + { + var flags = new BitsByte( + Niko, + Lyyka, + Neptune, + Lexy, + Terra, + Clara, + Raccoon + ); + writer.Write((byte)flags); + } + + public override void NetReceive(BinaryReader reader) + { + BitsByte flags = reader.ReadByte(); + Niko = flags[0]; + Lyyka = flags[1]; + Neptune = flags[2]; + Lexy = flags[3]; + Terra = flags[4]; + Clara = flags[5]; + Raccoon = flags[6]; + } + + // Immediate network sync helper to broadcast current flags to clients. + public static void Sync(Mod mod) + { + if (mod == null) + return; + + var flags = new BitsByte( + Niko, + Lyyka, + Neptune, + Lexy, + Terra, + Clara, + Raccoon + ); + + ModPacket packet = mod.GetPacket(); + packet.Write((byte)0); // message type 0 = sync world defeated bosses + packet.Write((byte)flags); + packet.Send(); + } + } +} diff --git a/build.txt b/build.txt new file mode 100644 index 0000000..d3208ab --- /dev/null +++ b/build.txt @@ -0,0 +1,3 @@ +displayName = The Forgotten Wawi Tech +author = EclypsedMoonfall, Axl_the_Protogen +version = 0.1 \ No newline at end of file diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..8ed5dfa --- /dev/null +++ b/description.txt @@ -0,0 +1,2 @@ +Susie's Idea. +This mod is solely created for a modpack I am using for myself and friends. You can add it if you want - but I don't know why you would. \ No newline at end of file diff --git a/description_workshop.txt b/description_workshop.txt new file mode 100644 index 0000000..8ed5dfa --- /dev/null +++ b/description_workshop.txt @@ -0,0 +1,2 @@ +Susie's Idea. +This mod is solely created for a modpack I am using for myself and friends. You can add it if you want - but I don't know why you would. \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7aa3b204fe43c8163731d93dbb75e6460536e0 GIT binary patch literal 26217 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 B2pj+a literal 0 HcmV?d00001 diff --git a/icon_small.png b/icon_small.png new file mode 100644 index 0000000000000000000000000000000000000000..484125d661262ad5f67e79ad6b6d5b742082ac99 GIT binary patch literal 3340 zcmcInd2AHt75~k#$LzuG`dVXSdu>v?IH(3Ifh5gQs3EoxQ35Ve5}KrGqW)14rJ}8> z{!<#IRhz0Ml|mF%G@@0i5Tqm+NKzpMx6leoFOdjj6CvX`#$J1Ut@oatnf~4^CP8hb zsG{%b?YFZt-}}A$oBiqi_uU%~Gz0*I`+9q}ac!bB`n~+zbN0C^F3Rq0_ij{%|FZfA zywJa~Ve1B9U~jPeH4m>7U+>+v75IKTAAb%g$+k)0J8OWc$ALRu2I9}`KmNd-ykR`k z`_OJ6SS_O9SNrSvqwm{&TQ~WVf#$kf>)&ko>Ysto6Ma1!`g_C5gQ0_qeBwIt^XdSl zj-pWhFQkgrJ=o)}R}sY7eU#|c>l?nP0(cP@SMI_tAGJG_D-=c-4^cGA4JR#ugs+V9 zxAMr(DNqU-WLBCm`-s#{`6uNv<%W_QR)YC#*e}+iw!Z@%Jw%Xv#wkChu%7;Ra^NTx z`J_hlEV8x+?IP8FQ-{8f!n+FN?1(|PQjSr+Kq*ip{GXWw>~Q3fdNiqA%ea7YuQ=W!t7gZ;w*jCXCAM^o@UaT#w#w3~6W z8bvf!L~$KGZl}1Kr!h@y#2z;+ty~5CFvX_)M-tDTLRWPcf?HLLHR%X;aQo9HtQFkU zNdLk%^6#nL=zfg3j4i{mUvN{=4?pV3;`66SBGOMeM7h>V0wT{i*rSVQz#k%2@V$^j z{x@0V4iapi1~u-3ZgQP317~!2=0(}_D%9fy8Suh8B}xM1wd5-Dr$_*{P+p;gD!-p- zOJX3ti0+*!9J_k~rI-Vy+5=rAzJ+aa9YWEL9B zYWkWnf*M3vJCE_YqxchRy_((_>_;V#rGF!s!~|xt?R=I>*AB4J+7yFmexVv>zZVHIOo;cmzU_!hL6e~zc7yU`v@scB{2 zC?I@)6STGv@?&YHkA4${Rm&c8xGIhZ%9#-CliE(~?4&hMGsIn#R`#YG#C%9&NP^de zTC9$d*PsJC@kR3{G#YaWOJDxd9mtH&;qJqap!Tj7EWDpY`}gidVSEvb$pu85AR`wL zj|*AY?m7!R_Hp8M1_xCmpd5{ljM1_hqJH1*1LrAiRbb9^C^~ zuMC!KCQCONQ6Cf&p!a_@}BL;ZLA%;87Ky@OvSWrxV^w};%*44vX6Tqdx3;5v4cQJl! z7|mN&vE%(P>OzRctD&7tL$j3WBJAJpMQT>1LT58Jf6V-?VYOYL=Vcjzaq2Z!se z0Bi0EBq3D14$H&a5<=jnm}}t7D?=y_%_H;IB*z3t1VbJBTpf&-2tX7%Rjb0Y{xP(0 z9$ckWSmhnU&Sts*Q#L;6lO zWKq^bj@K#uenN@w-5|{jE#yJ#u3Mm}G)mf%Yb;TViR0&?mV;tw(hvRbz?VvLn|lGdMKR$wTs(^F-M^L*mj>u^Xff?1Yobp+Ex9b$tf9${x>pD<@r^i|fsQ>}* zVNvbpwY)32p%o(}^g=p=%&hWTn#YFa%{d(PK?}OW*PWcjNzC^JTesM+=eh5ty*7MiH2nIh>Doy?m$ z#&dMg;(#wA`nNXpFvKz#D-X!}Ux{E+JK6*$H0HOBMO7I)40Q&@2?r-xnVx3iBnadw uL*?HWJ4>HO^H4`y(KyRVU8W^2pa7Z82i`h0er!;__iehb=gp0eKl?91>dXQF literal 0 HcmV?d00001