#W# Dungeon: Added a New Player Dungeon with some weaker mobs for level 1.

This commit is contained in:
WarrentyExpired 2026-10-06 14:59:05 -04:00
parent 11b620b0dc
commit 45ac268d7c
17 changed files with 3711 additions and 0 deletions

View file

@ -0,0 +1,61 @@
using ModernUO.Serialization;
using Server.Items;
using Server.Misc;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class BlindRatmanArcher : BaseCreature
{
[Constructible]
public BlindRatmanArcher() : base(AIType.AI_Archer)
{
Name = NameList.RandomName("ratman");
Body = 0x8E;
BaseSoundID = 437;
SetStr(106, 140);
SetDex(61, 90);
SetInt(116, 140);
SetHits(88, 108);
SetDamage(2, 8);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 40, 55);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.Anatomy, 30.2, 50.0);
SetSkill(SkillName.Archery, 40.1, 50.0);
SetSkill(SkillName.MagicResist, 65.1, 90.0);
SetSkill(SkillName.Tactics, 30.1, 55.0);
SetSkill(SkillName.Wrestling, 20.1, 40.0);
Fame = 1500;
Karma = -1500;
VirtualArmor = 56;
AddItem(new Bow());
PackItem(new Arrow(Utility.RandomMinMax(50, 70)));
}
public override string CorpseName => "a blind ratman archer corpse";
public override InhumanSpeech SpeechType => InhumanSpeech.Ratman;
public override bool CanRummageCorpses => true;
public override int Hides => 4;
//public override HideType HideType => HideType.Spined;
public override void GenerateLoot()
{
AddLoot(LootPack.Average);
}
}
}

View file

@ -0,0 +1,54 @@
using ModernUO.Serialization;
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.Grizzlybear")]
[SerializationGenerator(0, false)]
public partial class CaveBear : BaseCreature
{
[Constructible]
public CaveBear() : base(AIType.AI_Animal, FightMode.Aggressor)
{
Body = 212;
BaseSoundID = 0xA3;
Hue = 0x08FD;
SetStr(50, 75);
SetDex(51, 75);
SetInt(16, 40);
SetHits(56, 73);
SetMana(0);
SetDamage(3, 8);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 35);
SetResistance(ResistanceType.Cold, 15, 25);
SetResistance(ResistanceType.Poison, 5, 10);
SetResistance(ResistanceType.Energy, 5, 10);
SetSkill(SkillName.MagicResist, 25.1, 40.0);
SetSkill(SkillName.Tactics, 50.1, 70.0);
SetSkill(SkillName.Wrestling, 45.1, 70.0);
Fame = 1000;
Karma = 0;
VirtualArmor = 24;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 59.1;
}
public override string CorpseName => "a cave bear corpse";
public override string DefaultName => "a cave bear";
public override int Meat => 1;
public override int Hides => 4;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.FruitsAndVeggies | FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Bear;
}
}

View file

@ -0,0 +1,57 @@
using ModernUO.Serialization;
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.Gianttoad")]
[SerializationGenerator(0, false)]
public partial class CaveToad : BaseCreature
{
[Constructible]
public CaveToad() : base(AIType.AI_Melee)
{
Body = 80;
BaseSoundID = 0x26B;
Hue = 0x2A0;
SetStr(76, 100);
SetDex(6, 25);
SetInt(11, 20);
SetHits(26, 30);
SetMana(0);
SetDamage(1, 6);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 20, 25);
SetResistance(ResistanceType.Fire, 5, 10);
SetResistance(ResistanceType.Energy, 5, 10);
SetSkill(SkillName.MagicResist, 15.1, 20.0);
SetSkill(SkillName.Tactics, 20.1, 30.0);
SetSkill(SkillName.Wrestling, 20.1, 40.0);
Fame = 250;
Karma = 0;
VirtualArmor = 24;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 29.1;
}
public override string CorpseName => "a cave toad corpse";
public override string DefaultName => "a cave toad";
public override int Hides => 3;
//public override HideType HideType => HideType.Normal;
public override FoodType FavoriteFood => FoodType.Fish | FoodType.Meat;
public override void GenerateLoot()
{
AddLoot(LootPack.Poor);
}
}
}

View file

@ -0,0 +1,84 @@
using ModernUO.Serialization;
using Server.Items;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class CowardlyBrigand : BaseCreature
{
[Constructible]
public CowardlyBrigand() : base(AIType.AI_Melee)
{
SpeechHue = Utility.RandomDyedHue();
Title = "the cowardly brigand";
Hue = Race.Human.RandomSkinHue();
if (Female = Utility.RandomBool())
{
Body = 0x191;
Name = NameList.RandomName("female");
AddItem(new Skirt(Utility.RandomNeutralHue()));
}
else
{
Body = 0x190;
Name = NameList.RandomName("male");
AddItem(new ShortPants(Utility.RandomNeutralHue()));
}
SetStr(56, 700);
SetDex(31, 65);
SetInt(61, 75);
SetDamage(6, 12);
SetSkill(SkillName.Fencing, 46.0, 67.5);
SetSkill(SkillName.Macing, 45.0, 67.5);
SetSkill(SkillName.MagicResist, 25.0, 47.5);
SetSkill(SkillName.Swords, 45.0, 67.5);
SetSkill(SkillName.Tactics, 45.0, 67.5);
SetSkill(SkillName.Wrestling, 15.0, 37.5);
Fame = 500;
Karma = -500;
AddItem(new Boots(Utility.RandomNeutralHue()));
AddItem(new FancyShirt());
AddItem(new Bandana());
AddItem(
Utility.Random(7) switch
{
0 => new Longsword(),
1 => new Cutlass(),
2 => new Broadsword(),
3 => new Axe(),
4 => new Club(),
5 => new Dagger(),
_ => new Spear() // 6
}
);
Utility.AssignRandomHair(this);
}
public override bool ClickTitle => false;
public override bool AlwaysMurderer => true;
public override void OnDeath(Container c)
{
base.OnDeath(c);
if (Utility.RandomDouble() < 0.9)
{
c.DropItem(new SeveredHumanEars());
}
}
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
}
}
}

View file

@ -0,0 +1,62 @@
using ModernUO.Serialization;
using Server.Items;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class CrackedEarthElemental : BaseCreature
{
[Constructible]
public CrackedEarthElemental() : base(AIType.AI_Melee)
{
Body = 14;
BaseSoundID = 268;
SetStr(75, 100);
SetDex(66, 85);
SetInt(71, 92);
SetHits(56, 73);
SetDamage(9, 16);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 30, 35);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 15, 25);
SetResistance(ResistanceType.Energy, 15, 25);
SetSkill(SkillName.MagicResist, 50.1, 95.0);
SetSkill(SkillName.Tactics, 50.1, 80.0);
SetSkill(SkillName.Wrestling, 40.1, 80.0);
Fame = 1500;
Karma = -1500;
VirtualArmor = 34;
PackItem(new FertileDirt(Utility.RandomMinMax(1, 4)));
PackItem(new MandrakeRoot());
PackItem(new IronOre(2)
{
ItemID = 0x19B7
});
}
public override string CorpseName => "an cracked earth elemental corpse";
public override string DefaultName => "an cracked earth elemental";
public override bool BleedImmune => true;
public override int TreasureMapLevel => 1;
public override void GenerateLoot()
{
AddLoot(LootPack.Poor);
AddLoot(LootPack.Meager);
AddLoot(LootPack.Gems);
}
}
}

View file

@ -0,0 +1,66 @@
using ModernUO.Serialization;
using Server.Items;
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.BoneMage")]
[SerializationGenerator(0, false)]
public partial class DustyBoneMagi : BaseCreature
{
[Constructible]
public DustyBoneMagi() : base(AIType.AI_Mage)
{
Body = 148;
BaseSoundID = 451;
SetStr(46, 70);
SetDex(36, 55);
SetInt(80, 110);
SetHits(46, 60);
SetDamage(3, 7);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 40);
SetResistance(ResistanceType.Fire, 20, 30);
SetResistance(ResistanceType.Cold, 50, 60);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.EvalInt, 30.1, 40.0);
SetSkill(SkillName.Magery, 40.1, 60.0);
SetSkill(SkillName.MagicResist, 55.1, 70.0);
SetSkill(SkillName.Tactics, 45.1, 60.0);
SetSkill(SkillName.Wrestling, 45.1, 55.0);
SetSkill(SkillName.Necromancy, 49, 59.1);
SetSkill(SkillName.SpiritSpeak, 40.0, 59.0);
Fame = 1200;
Karma = -1200;
VirtualArmor = 38;
PackReg(3);
PackNecroReg(3, 10);
PackItem(new Bone());
}
public override string CorpseName => "a dusty skeletal corpse";
public override string DefaultName => "a dusty bone mage";
public override bool BleedImmune => true;
public override OppositionGroup OppositionGroup => OppositionGroup.FeyAndUndead;
public override Poison PoisonImmune => Poison.Regular;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
AddLoot(LootPack.LowScrolls);
AddLoot(LootPack.Potions);
}
}
}

View file

@ -0,0 +1,102 @@
using ModernUO.Serialization;
using Server.Items;
using Server.Misc;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class FeebleOrc : BaseCreature
{
[Constructible]
public FeebleOrc() : base(AIType.AI_Melee)
{
Name = NameList.RandomName("orc");
Body = 17;
BaseSoundID = 0x45A;
SetStr(66, 90);
SetDex(51, 75);
SetInt(36, 60);
SetHits(38, 52);
SetDamage(3, 6);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 30);
SetResistance(ResistanceType.Fire, 20, 30);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 20, 30);
SetSkill(SkillName.MagicResist, 50.1, 75.0);
SetSkill(SkillName.Tactics, 45.1, 70.0);
SetSkill(SkillName.Wrestling, 40.1, 60.0);
Fame = 700;
Karma = -700;
VirtualArmor = 28;
PackItem(
Utility.Random(20) switch
{
0 => new Scimitar(),
1 => new Katana(),
2 => new WarMace(),
3 => new WarHammer(),
4 => new Kryss(),
5 => new Pitchfork(),
_ => null // 6-19
}
);
PackItem(new ThighBoots());
PackItem(
Utility.Random(3) switch
{
0 => new Ribs(),
1 => new Shaft(),
_ => new Candle() // 2
}
);
if (Utility.RandomDouble() < 0.2)
{
PackItem(new BolaBall());
}
}
public override string CorpseName => "a feeble orcish corpse";
public override InhumanSpeech SpeechType => InhumanSpeech.Orc;
public override bool CanRummageCorpses => true;
public override int TreasureMapLevel => 1;
public override int Meat => 1;
public override OppositionGroup OppositionGroup => OppositionGroup.SavagesAndOrcs;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
}
public override bool IsEnemy(Mobile m) =>
(!m.Player || m.FindItemOnLayer<OrcishKinMask>(Layer.Helm) == null) && base.IsEnemy(m);
public override void AggressiveAction(Mobile aggressor, bool criminal)
{
base.AggressiveAction(aggressor, criminal);
if (aggressor.FindItemOnLayer(Layer.Helm) is OrcishKinMask item)
{
AOS.Damage(aggressor, 50, 0, 100, 0, 0, 0);
item.Delete();
aggressor.FixedParticles(0x36BD, 20, 10, 5044, EffectLayer.Head);
aggressor.PlaySound(0x307);
}
}
}
}

View file

@ -0,0 +1,64 @@
using ModernUO.Serialization;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class FledglingImp : BaseCreature
{
[Constructible]
public FledglingImp() : base(AIType.AI_Mage)
{
Body = 74;
BaseSoundID = 422;
SetStr(71, 85);
SetDex(41, 60);
SetInt(66, 85);
SetHits(55, 70);
SetDamage(6, 9);
SetDamageType(ResistanceType.Physical, 0);
SetDamageType(ResistanceType.Fire, 50);
SetDamageType(ResistanceType.Poison, 50);
SetResistance(ResistanceType.Physical, 25, 35);
SetResistance(ResistanceType.Fire, 40, 50);
SetResistance(ResistanceType.Cold, 20, 30);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.EvalInt, 20.1, 30.0);
SetSkill(SkillName.Magery, 50.1, 70.0);
SetSkill(SkillName.MagicResist, 20.1, 30.0);
SetSkill(SkillName.Tactics, 42.1, 50.0);
SetSkill(SkillName.Wrestling, 40.1, 44.0);
Fame = 1200;
Karma = -1200;
VirtualArmor = 30;
Tamable = true;
ControlSlots = 2;
MinTameSkill = 65.1;
}
public override string CorpseName => "a fledgling imp corpse";
public override string DefaultName => "a fledgling imp";
public override int Meat => 1;
public override int Hides => 3;
public override HideType HideType => HideType.Spined;
public override FoodType FavoriteFood => FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Daemon;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
AddLoot(LootPack.MedScrolls, 2);
}
}
}

View file

@ -0,0 +1,83 @@
using ModernUO.Serialization;
using Server.Items;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class FrailSkeleton : BaseCreature
{
[Constructible]
public FrailSkeleton() : base(AIType.AI_Melee)
{
Body = Utility.RandomList(50, 56);
BaseSoundID = 0x48D;
SetStr(36, 50);
SetDex(36, 55);
SetInt(16, 40);
SetHits(34, 48);
SetDamage(3, 7);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 15, 20);
SetResistance(ResistanceType.Fire, 5, 10);
SetResistance(ResistanceType.Cold, 25, 40);
SetResistance(ResistanceType.Poison, 25, 35);
SetResistance(ResistanceType.Energy, 5, 15);
SetSkill(SkillName.MagicResist, 45.1, 60.0);
SetSkill(SkillName.Tactics, 45.1, 60.0);
SetSkill(SkillName.Wrestling, 45.1, 55.0);
Fame = 250;
Karma = -250;
VirtualArmor = 16;
switch (Utility.Random(5))
{
case 0:
{
PackItem(new BoneArms());
break;
}
case 1:
{
PackItem(new BoneChest());
break;
}
case 2:
{
PackItem(new BoneGloves());
break;
}
case 3:
{
PackItem(new BoneLegs());
break;
}
case 4:
{
PackItem(new BoneHelm());
break;
}
}
}
public override string CorpseName => "a frail skeletal corpse";
public override string DefaultName => "a frail skeleton";
public override bool BleedImmune => true;
public override Poison PoisonImmune => Poison.Lesser;
public override OppositionGroup OppositionGroup => OppositionGroup.FeyAndUndead;
public override void GenerateLoot()
{
AddLoot(LootPack.Poor);
}
}
}

View file

@ -0,0 +1,60 @@
using ModernUO.Serialization;
using Server.Items;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class LesserGiantSpider : BaseCreature
{
[Constructible]
public LesserGiantSpider() : base(AIType.AI_Melee)
{
Body = 28;
BaseSoundID = 0x388;
Hue = 0x2F0;
SetStr(46, 60);
SetDex(36, 55);
SetInt(36, 60);
SetHits(36, 50);
SetMana(0);
SetDamage(5, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 15, 20);
SetResistance(ResistanceType.Poison, 25, 35);
SetSkill(SkillName.Poisoning, 20.1, 50.0);
SetSkill(SkillName.MagicResist, 25.1, 40.0);
SetSkill(SkillName.Tactics, 35.1, 50.0);
SetSkill(SkillName.Wrestling, 30.1, 45.0);
Fame = 200;
Karma = -200;
VirtualArmor = 16;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 49.1;
PackItem(new SpidersSilk(5));
}
public override string CorpseName => "a lesser giant spider corpse";
public override string DefaultName => "a lesser giant spider";
public override FoodType FavoriteFood => FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Arachnid;
public override Poison PoisonImmune => Poison.Lesser;
public override Poison HitPoison => Poison.Lesser;
public override void GenerateLoot()
{
AddLoot(LootPack.Poor);
}
}
}

View file

@ -0,0 +1,64 @@
using ModernUO.Serialization;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class LesserHarpy : BaseCreature
{
[Constructible]
public LesserHarpy() : base(AIType.AI_Melee)
{
Body = 30;
BaseSoundID = 402;
SetStr(96, 120);
SetDex(86, 110);
SetInt(51, 75);
SetHits(38, 42);
SetDamage(3, 5);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 30);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 30);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.MagicResist, 50.1, 65.0);
SetSkill(SkillName.Tactics, 40.1, 70.0);
SetSkill(SkillName.Wrestling, 30.1, 60.0);
Fame = 500;
Karma = -500;
VirtualArmor = 28;
}
public override string CorpseName => "a lesser harpy corpse";
public override string DefaultName => "a lesser harpy";
public override bool CanRummageCorpses => true;
public override int Meat => 2;
public override MeatType MeatType => MeatType.Bird;
public override int Feathers => 20;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager, 2);
}
public override int GetAttackSound() => 916;
public override int GetAngerSound() => 916;
public override int GetDeathSound() => 917;
public override int GetHurtSound() => 919;
public override int GetIdleSound() => 918;
}
}

View file

@ -0,0 +1,55 @@
using ModernUO.Serialization;
using Server.Misc;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class MangyRatman : BaseCreature
{
[Constructible]
public MangyRatman() : base(AIType.AI_Melee)
{
Name = NameList.RandomName("ratman");
Body = 42;
BaseSoundID = 437;
SetStr(56, 80);
SetDex(51, 70);
SetInt(36, 60);
SetHits(58, 72);
SetDamage(4, 5);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 30);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.MagicResist, 35.1, 60.0);
SetSkill(SkillName.Tactics, 30.1, 55.0);
SetSkill(SkillName.Wrestling, 30.1, 55.0);
Fame = 700;
Karma = -700;
VirtualArmor = 28;
}
public override string CorpseName => "a mangy ratman's corpse";
public override InhumanSpeech SpeechType => InhumanSpeech.Ratman;
public override bool CanRummageCorpses => true;
public override int Hides => 4;
//public override HideType HideType => HideType.Spined;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
// TODO: weapon, misc
}
}
}

View file

@ -0,0 +1,65 @@
using ModernUO.Serialization;
using Server.Misc;
namespace Server.Mobiles
{
[SerializationGenerator(0, false)]
public partial class SicklyRatmanMage : BaseCreature
{
[Constructible]
public SicklyRatmanMage() : base(AIType.AI_Mage)
{
Name = NameList.RandomName("ratman");
Body = 0x8F;
BaseSoundID = 437;
SetStr(906, 130);
SetDex(50, 70);
SetInt(100, 130);
SetHits(88, 108);
SetDamage(4, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 40, 45);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 10, 20);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.EvalInt, 30.1, 60.0);
SetSkill(SkillName.Magery, 40.1, 65.0);
SetSkill(SkillName.MagicResist, 65.1, 90.0);
SetSkill(SkillName.Tactics, 30.1, 55.0);
SetSkill(SkillName.Wrestling, 30.1, 55.0);
Fame = 2500;
Karma = -2500;
VirtualArmor = 44;
PackReg(6);
if (Utility.RandomDouble() < 0.02)
{
PackStatue();
}
}
public override string CorpseName => "a sickly ratman mage corpse";
public override InhumanSpeech SpeechType => InhumanSpeech.Ratman;
public override bool CanRummageCorpses => true;
public override int Meat => 1;
public override int Hides => 4;
//public override HideType HideType => HideType.Spined;
public override void GenerateLoot()
{
AddLoot(LootPack.Average);
AddLoot(LootPack.LowScrolls);
}
}
}