diff --git a/Info/Bosses.txt b/Info/Bosses.txt new file mode 100644 index 000000000..9396293db --- /dev/null +++ b/Info/Bosses.txt @@ -0,0 +1,25 @@ +Mob Bodies +unknown demon lord - 1071 0x42F +Prive evil lich - 830 0x33E +Rising colossus - 829 - 0x33D - Shame +gargoyle guard - 755 - 0x2F3 +slasher of viels - 741 - 0x2E5 +navery night-eyes - 735 - 0x2DF - spider +lowland boura - 715 - 0x2CB +abyssmal invernal - 713 - 0x2C9 +hydra - 265 - 0x109 +dragon order - 198 - 0xC6 +dragon chaos - 197 - 0xC5 +succubi large - 174 - 0xAE + +Summon Items +blood 0x122A +chain 0x1A07 +lava 0x1A7E +wrapped body 0x1C20 +book 0x1C11 +snowflake 0x232E +stydragonhead 0x2DB4 +abyssalhorn 0x2DB7 +bone 0x318C + diff --git a/Info/Ideas.txt b/Info/Ideas.txt index 17be0964a..6e478f3ba 100644 --- a/Info/Ideas.txt +++ b/Info/Ideas.txt @@ -1,3 +1,7 @@ Snack Pack - Holds food and water - Double click eats and drinks. + +Scrolls + - Item that raises your total skill cap by 1 up to 720 + - Power scrolls but 1 point at a time. diff --git a/Info/NeedsFinished.txt b/Info/NeedsFinished.txt index 6d4d1bed7..329a78418 100644 --- a/Info/NeedsFinished.txt +++ b/Info/NeedsFinished.txt @@ -20,5 +20,7 @@ Citizens CentrED Stuff - Add unspawnable tiles around dungeons - +Dungeon Bosses + - Dungeon Arenas + - Duneon Arenas Region Skills diff --git a/Projects/UOContent/Engines/DungeonBoss/Alters/BossAlter.cs b/Projects/UOContent/Engines/DungeonBoss/Alters/BossAlter.cs new file mode 100644 index 000000000..3c8ae59c0 --- /dev/null +++ b/Projects/UOContent/Engines/DungeonBoss/Alters/BossAlter.cs @@ -0,0 +1,68 @@ +using System; +using Server; +using Server.Items; +using Server.Mobiles; +using Server.Network; +using ModernUO.Serialization; + +namespace Server.Custom.Dungeons +{ + [SerializationGenerator(0)] + public abstract partial class BossAlter : Item + { + private Mobile _ActiveBoss; + + [CommandProperty(AccessLevel.GameMaster)] + public Mobile ActiveBoss { get => _ActiveBoss; set => _ActiveBoss = value; } + + public abstract Type SummonItem { get; } + public abstract Type BossType { get; } + + public BossAlter(int itemID) : base(itemID) + { + Movable = false; + } + + public override bool OnDragDrop(Mobile from, Item dropped) + { + if (dropped.GetType() != SummonItem) + { + from.SendMessage(33, "The altar rejects your offering. It requires a different catalyst."); + return false; + } + + if (_ActiveBoss != null && _ActiveBoss.Alive && !_ActiveBoss.Deleted) + { + from.SendMessage(33, "The guardian of this domain is already present!"); + return false; + } + + dropped.Delete(); + + Effects.PlaySound(Location, Map, 0x20F); + Effects.SendLocationEffect(Location, Map, 0x3728, 10, 10); + Effects.SendLocationEffect(Location, Map, 0x3709, 10, 30, 1153, 0); + + try + { + Mobile boss = (Mobile)Activator.CreateInstance(BossType); + boss.MoveToWorld(new Point3D(X + 1, Y + 1, Z), Map); + boss.PlaySound(boss.GetAngerSound()); + + _ActiveBoss = boss; + from.SendMessage(89, "The altar consumes your offering, and a terrible presence enters the room!"); + } + catch (Exception e) + { + Console.WriteLine($"Error spawning dungeon boss: {e.Message}"); + from.SendMessage(33, "The altar flickers, but nothing happens."); + } + + return true; + } + + public BossAlter(Serial serial) : base(serial) + { + } + } +} diff --git a/Projects/UOContent/Engines/DungeonBoss/Alters/ShameAlter.cs b/Projects/UOContent/Engines/DungeonBoss/Alters/ShameAlter.cs new file mode 100644 index 000000000..1c95f6b47 --- /dev/null +++ b/Projects/UOContent/Engines/DungeonBoss/Alters/ShameAlter.cs @@ -0,0 +1,27 @@ +using System; +using Server; +using Server.Items; +using Server.Mobiles; +using ModernUO.Serialization; + +namespace Server.Custom.Dungeons +{ + [SerializationGenerator(0)] + public partial class ShameAlter : BossAlter + { + public override Type SummonItem => typeof(PulsingBloodClot); + + public override Type BossType => typeof(BloodstoneTitan); + + [Constructible] + public ShameAlter() : base(0xFFBD) + { + Name = "Altar of the Bloodstone Titan"; + Hue = 1157; + } + + public ShameAlter(Serial serial) : base(serial) + { + } + } +} diff --git a/Projects/UOContent/Engines/DungeonBoss/Items/PulsingBloodClot.cs b/Projects/UOContent/Engines/DungeonBoss/Items/PulsingBloodClot.cs new file mode 100644 index 000000000..1c0e48c44 --- /dev/null +++ b/Projects/UOContent/Engines/DungeonBoss/Items/PulsingBloodClot.cs @@ -0,0 +1,23 @@ +using System; +using Server; +using Server.Items; +using ModernUO.Serialization; + +namespace Server.Custom.Dungeons +{ + [SerializationGenerator(0)] // ModernUO Auto-Serialization + public partial class PulsingBloodClot : Item + { + [Constructible] // Spelled with an 'i' for ModernUO + public PulsingBloodClot() : base(0x122A) + { + Name = "Pulsing Blood Clot"; + Weight = 1.0; + Hue = 1157; + } + + public PulsingBloodClot(Serial serial) : base(serial) + { + } + } +} diff --git a/Projects/UOContent/Engines/DungeonBoss/Mobiles/BloodstoneTitan.cs b/Projects/UOContent/Engines/DungeonBoss/Mobiles/BloodstoneTitan.cs new file mode 100644 index 000000000..81cbb1e37 --- /dev/null +++ b/Projects/UOContent/Engines/DungeonBoss/Mobiles/BloodstoneTitan.cs @@ -0,0 +1,57 @@ +using ModernUO.Serialization; + +namespace Server.Mobiles +{ + [SerializationGenerator(0, false)] + public partial class BloodstoneTitan : BaseCreature + { + [Constructible] + public BloodstoneTitan() : base(AIType.AI_Mage) + { + Body = 829; + Hue = 1157; + BaseSoundID = 278; + + SetStr(1026, 1115); + SetDex(80, 100); + SetInt(550, 750); + + SetHits(1200, 1300); + + SetDamage(27, 37); + + SetDamageType(ResistanceType.Physical, 40); + SetDamageType(ResistanceType.Poison, 30); + SetDamageType(ResistanceType.Energy, 30); + + SetResistance(ResistanceType.Physical, 55, 65); + SetResistance(ResistanceType.Fire, 20, 30); + SetResistance(ResistanceType.Cold, 40, 50); + SetResistance(ResistanceType.Poison, 50, 60); + SetResistance(ResistanceType.Energy, 30, 40); + + SetSkill(SkillName.EvalInt, 99.1, 110.0); + SetSkill(SkillName.Magery, 99.1, 110.0); + SetSkill(SkillName.Meditation, 80.4, 100.0); + SetSkill(SkillName.MagicResist, 80.1, 95.0); + SetSkill(SkillName.Tactics, 99.1, 100.0); + SetSkill(SkillName.Wrestling, 99.1, 100.0); + + Fame = 32000; + Karma = -32000; + + VirtualArmor = 60; + } + + public override string CorpseName => "a bloodstone corpse"; + public override string DefaultName => "a bloodstone titan"; + + public override int TreasureMapLevel => 5; + + public override void GenerateLoot() + { + AddLoot(LootPack.SuperBoss, 2); + AddLoot(LootPack.SuperBoss, 2); + } + } +}