partial psz patch

This commit is contained in:
mark 2009-06-21 05:43:18 +00:00
parent d03acbffaf
commit 869f68488d
23 changed files with 15471 additions and 19 deletions

View file

@ -0,0 +1,71 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a mongbat corpse" )]
public class GreaterMongbat : BaseCreature
{
[Constructable]
public GreaterMongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a greater mongbat";
Body = 39;
BaseSoundID = 422;
SetStr( 56, 80 );
SetDex( 61, 80 );
SetInt( 26, 50 );
SetHits( 34, 48 );
SetStam( 61, 80);
SetMana( 26, 50 );
SetDamage( 5, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetSkill( SkillName.MagicResist, 15.1, 30.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 20.1, 35.0 );
Fame = 450;
Karma = -450;
VirtualArmor = 10;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 71.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int Meat{ get{ return 1; } }
public override int Hides{ get{ return 6; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public GreaterMongbat( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,184 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a chaos dragoon corpse" )]
public class ChaosDragoon : BaseCreature
{
[Constructable]
public ChaosDragoon() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.15, 0.4 )
{
Name = "a chaos dragoon";
Body = 0x190;
Hue = Utility.RandomSkinHue();
SetStr( 176, 225 );
SetDex( 81, 95 );
SetInt( 61, 85 );
SetHits( 176, 225 );
SetDamage( 24, 26 );
SetDamageType( ResistanceType.Physical, 25 );
SetDamageType( ResistanceType.Fire, 25 );
SetDamageType( ResistanceType.Cold, 25 );
SetDamageType( ResistanceType.Energy, 25 );
//SetResistance( ResistanceType.Physical, 25, 38 );
//SetResistance( ResistanceType.Fire, 25, 38 );
//SetResistance( ResistanceType.Cold, 25, 38 );
//SetResistance( ResistanceType.Poison, 25, 38 );
//SetResistance( ResistanceType.Energy, 25, 38 );
SetSkill( SkillName.Fencing, 77.6, 92.5 );
SetSkill( SkillName.Healing, 60.3, 90.0 );
SetSkill( SkillName.Macing, 77.6, 92.5 );
SetSkill( SkillName.Anatomy, 77.6, 87.5 );
SetSkill( SkillName.MagicResist, 77.6, 97.5 );
SetSkill( SkillName.Swords, 77.6, 92.5 );
SetSkill( SkillName.Tactics, 77.6, 87.5 );
Fame = 5000;
Karma = -5000;
CraftResource res;
switch (Utility.Random( 6 ))
{
case 0: res = CraftResource.BlackScales; break;
case 1: res = CraftResource.RedScales; break;
case 2: res = CraftResource.BlueScales; break;
case 3: res = CraftResource.YellowScales; break;
case 4: res = CraftResource.GreenScales; break;
case 5: res = CraftResource.WhiteScales; break;
}
BaseWeapon melee = null;
switch (Utility.Random( 3 ))
{
case 0: melee = new Kryss(); break;
case 1: melee = new Broadsword(); break;
case 2: melee = new Katana(); break;
}
melee.Movable = false;
AddItem( melee );
DragonHelm helm = new DragonHelm();
helm.Resource = res;
helm.Movable = false;
AddItem( helm );
DragonChest chest = new DragonChest();
chest.Resource = res;
chest.Movable = false;
AddItem( chest );
DragonArms arms = new DragonArms();
arms.Resource = res;
arms.Movable = false;
AddItem( arms );
DragonGloves gloves = new DragonGloves();
gloves.Resource = res;
gloves.Movable = false;
AddItem( gloves );
DragonLegs legs = new DragonLegs();
legs.Resource = res;
legs.Movable = false;
AddItem( legs );
ChaosShield shield = new ChaosShield();
shield.Movable = false;
AddItem( shield );
AddItem( new Shirt() );
AddItem( new Boots() );
int amount = Utility.RandomMinMax( 1, 3 );
switch ( res )
{
case CraftResource.BlackScales: AddItem( new BlackScales( amount ) ); break;
case CraftResource.RedScales: AddItem( new RedScales( amount ) ); break;
case CraftResource.BlueScales: AddItem( new BlueScales( amount ) ); break;
case CraftResource.YellowScales: AddItem( new YellowScales( amount ) ); break;
case CraftResource.GreenScales: AddItem( new GreenScales( amount ) ); break;
case CraftResource.WhiteScales: AddItem( new WhiteScales( amount ) ); break;
}
new SwampDragon().Rider = this;
}
public override int GetIdleSound()
{
return 0x2CE;
}
public override int GetDeathSound()
{
return 0x2CC;
}
public override int GetHurtSound()
{
return 0x2D1;
}
public override int GetAttackSound()
{
return 0x2C8;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
//AddLoot( LootPack.Gems );
}
public override bool HasBreath{ get{ return true; } }
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.AOS; } }
public override bool CanRummageCorpses{ get{ return true; } }
public override bool AlwaysMurderer{ get{ return true; } }
public override bool ShowFameTitle{ get{ return false; } }
public override bool OnBeforeDeath()
{
IMount mount = this.Mount;
if ( mount != null )
mount.Rider = null;
return base.OnBeforeDeath();
}
public override void AlterMeleeDamageTo( Mobile to, ref int damage )
{
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
damage *= 3;
}
public ChaosDragoon( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,206 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("a chaos dragoon elite corpse")]
public class ChaosDragoonElite : BaseCreature
{
[Constructable]
public ChaosDragoonElite()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.15, 0.4)
{
Name = "a chaos dragoon elite";
Body = 0x190;
Hue = Utility.RandomSkinHue();
SetStr(276, 350);
SetDex(66, 90);
SetInt(126, 150);
SetHits(276, 350);
SetDamage(29, 34);
SetDamageType(ResistanceType.Physical, 100);
/*SetResistance(ResistanceType.Physical, 45, 55);
SetResistance(ResistanceType.Fire, 15, 25);
SetResistance(ResistanceType.Cold, 50);
SetResistance(ResistanceType.Poison, 25, 35);
SetResistance(ResistanceType.Energy, 25, 35);*/
SetSkill(SkillName.Tactics, 80.1, 100.0);
SetSkill(SkillName.MagicResist, 100.1, 110.0);
SetSkill(SkillName.Anatomy, 80.1, 100.0);
SetSkill(SkillName.Magery, 85.1, 100.0);
SetSkill(SkillName.EvalInt, 85.1, 100.0);
SetSkill(SkillName.Swords, 72.5, 95.0);
SetSkill(SkillName.Fencing, 85.1, 100);
SetSkill(SkillName.Macing, 85.1, 100);
Fame = 8000;
Karma = -8000;
CraftResource res;
switch (Utility.Random(6))
{
case 0: res = CraftResource.BlackScales; break;
case 1: res = CraftResource.RedScales; break;
case 2: res = CraftResource.BlueScales; break;
case 3: res = CraftResource.YellowScales; break;
case 4: res = CraftResource.GreenScales; break;
case 5: res = CraftResource.WhiteScales; break;
}
BaseWeapon melee = null;
switch (Utility.Random(3))
{
case 0: melee = new Kryss(); break;
case 1: melee = new Broadsword(); break;
case 2: melee = new Katana(); break;
}
melee.Movable = false;
AddItem(melee);
DragonChest Tunic = new DragonChest();
Tunic.Resource = res;
Tunic.Movable = false;
AddItem(Tunic);
DragonLegs Legs = new DragonLegs();
Legs.Resource = res;
Legs.Movable = false;
AddItem(Legs);
DragonArms Arms = new DragonArms();
Arms.Resource = res;
Arms.Movable = false;
AddItem(Arms);
DragonGloves Gloves = new DragonGloves();
Gloves.Resource = res;
Gloves.Movable = false;
AddItem(Gloves);
DragonHelm Helm = new DragonHelm();
Helm.Resource = res;
Helm.Movable = false;
AddItem(Helm);
ChaosShield shield = new ChaosShield();
shield.Movable = false;
AddItem(shield);
AddItem(new Boots(0x455));
AddItem(new Shirt(Utility.RandomMetalHue()));
int amount = Utility.RandomMinMax(1, 3);
switch (res)
{
case CraftResource.BlackScales: AddItem(new BlackScales(amount)); break;
case CraftResource.RedScales: AddItem(new RedScales(amount)); break;
case CraftResource.BlueScales: AddItem(new BlueScales(amount)); break;
case CraftResource.YellowScales: AddItem(new YellowScales(amount)); break;
case CraftResource.GreenScales: AddItem(new GreenScales(amount)); break;
case CraftResource.WhiteScales: AddItem(new WhiteScales(amount)); break;
}
switch (Utility.Random(9))
{
case 0: res = CraftResource.DullCopper; break;
case 1: res = CraftResource.ShadowIron; break;
case 2: res = CraftResource.Copper; break;
case 3: res = CraftResource.Bronze; break;
case 4: res = CraftResource.Gold; break;
case 5: res = CraftResource.Agapite; break;
case 6: res = CraftResource.Verite; break;
case 7: res = CraftResource.Valorite; break;
case 8: res = CraftResource.Iron; break;
}
SwampDragon mt = new SwampDragon();
mt.HasBarding = true;
mt.BardingResource = res;
mt.BardingHP = mt.BardingMaxHP;
mt.Rider = this;
}
public override int GetIdleSound()
{
return 0x2CE;
}
public override int GetDeathSound()
{
return 0x2CC;
}
public override int GetHurtSound()
{
return 0x2D1;
}
public override int GetAttackSound()
{
return 0x2C8;
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
AddLoot(LootPack.Gems);
}
public override bool HasBreath { get { return true; } }
public override bool AutoDispel { get { return true; } }
public override bool BardImmune { get { return !Core.AOS; } }
public override bool CanRummageCorpses { get { return true; } }
public override bool AlwaysMurderer { get { return true; } }
public override bool ShowFameTitle { get { return false; } }
public override bool OnBeforeDeath()
{
IMount mount = this.Mount;
if ( mount != null )
{
if ( mount is SwampDragon )
((SwampDragon)mount).HasBarding = false;
mount.Rider = null;
}
return base.OnBeforeDeath();
}
public override void AlterMeleeDamageTo(Mobile to, ref int damage)
{
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
damage *= 3;
}
public ChaosDragoonElite(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,128 @@
using Server;
using System;
using Server.Items;
using Server.Gumps;
namespace Server.Mobiles
{
[CorpseName( "a Cu Sidhe corpse" )]
public class CuSidhe : BaseMount
{
[Constructable]
public CuSidhe() : this( "a Cu Sidhe" )
{
}
[Constructable]
public CuSidhe( string name ) : base( name, 277, 0x3E91, AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
double chance = Utility.RandomDouble() * 23301;
if ( chance <= 1 )
Hue = 0x489;
else if ( chance < 50 )
Hue = Utility.RandomList( 0x657, 0x515, 0x4B1, 0x481, 0x480, 0x455 );
else if ( chance < 500 )
Hue = Utility.RandomList( 0x97A, 0x978, 0x901, 0x8AC, 0x5A7, 0x527 );
SetStr( 1201, 1225 );
SetDex( 151, 170 );
SetInt( 251, 282 );
SetDamage( 4, 5 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 50 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 30, 45 );
SetResistance( ResistanceType.Cold, 70, 85 );
SetResistance( ResistanceType.Poison, 30, 50 );
SetResistance( ResistanceType.Energy, 70, 85 );
SetSkill( SkillName.Wrestling, 90.1, 96.8 );
SetSkill( SkillName.Tactics, 90.3, 99.3 );
SetSkill( SkillName.MagicResist, 75.3, 90.0 );
SetSkill( SkillName.Anatomy, 65.5, 69.4 );
SetSkill( SkillName.Healing, 72.2, 98.9 );
Fame = 5000; //Guessing here
Karma = 5000; //Guessing here
Tamable = true;
ControlSlots = 4;
MinTameSkill = 101.1;
if ( Utility.RandomDouble() < 0.2 )
PackItem( new TreasureMap( 5, Map.Trammel ) );
//if ( Utility.RandomDouble() < 0.1 )
//PackItem( new ParrotItem() );
PackGold( 500, 800 );
// TODO 0-2 spellweaving scroll
}
public override void GenerateLoot()
{
AddLoot( LootPack.AosFilthyRich, 5 );
}
public override void OnDoubleClick( Mobile from )
{
if ( from.Race != Race.Elf && from == ControlMaster && from.AccessLevel == AccessLevel.Player )
{
Item pads = from.FindItemOnLayer( Layer.Shoes );
if ( pads is PadsOfTheCuSidhe )
from.SendMessage( "Your boots allow you to mount the Cu Sidhe", null, 0x3B2 );
else
{
from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
return;
}
}
base.OnDoubleClick( from );
}
public override bool CanHeal{ get{ return true; } }
public override bool CanHealOwner{ get{ return true; } }
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies; } }
public override bool CanAngerOnTame{ get { return true; } }
public override bool StatLossAfterTame{ get{ return true; } }
public override int Hides{ get{ return 10; } }
public override int Meat{ get{ return 3; } }
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
public CuSidhe( Serial serial ) : base( serial )
{
}
public override int GetIdleSound() { return 0x577; }
public override int GetAttackSound() { return 0x576; }
public override int GetAngerSound() { return 0x578; }
public override int GetHurtSound() { return 0x576; }
public override int GetDeathSound() { return 0x579; }
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,64 @@
using System;
using Server.Mobiles;
namespace Server.Mobiles
{
[CorpseName( "a grizzly bear corpse" )]
[TypeAlias( "Server.Mobiles.Grizzlybear" )]
public class RagingGrizzlyBear : BaseCreature
{
[Constructable]
public RagingGrizzlyBear() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
Name = "a raging grizzly bear";
Body = 212;
BaseSoundID = 0xA3;
SetStr( 1251, 1550 );
SetDex( 801, 1050 );
SetInt( 151, 400 );
SetHits( 751, 930 );
SetMana( 0 );
SetDamage( 6, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 70 );
SetResistance( ResistanceType.Cold, 30, 50 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 10, 20 );
Fame = 5000; //Guessing here
Karma = -5000; //Guessing here
VirtualArmor = 24;
Tamable = false;
}
public override int Meat{ get{ return 2; } }
public override int Hides{ get{ return 16; } }
public override PackInstinct PackInstinct{ get{ return PackInstinct.Bear; } }
public RagingGrizzlyBear( Serial serial ) : base( serial )
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,109 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("a fetid essence corpse")]
public class FetidEssence : BaseCreature
{
[Constructable]
public FetidEssence () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fetid essence";
Body = 273;
SetStr( 101, 150 );
SetDex( 210, 250 );
SetInt( 451, 550 );
SetHits( 551, 650 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Poison, 70 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 70, 90 );
SetResistance( ResistanceType.Energy, 75, 80 );
SetSkill(SkillName.Meditation, 91.4, 99.4 );
SetSkill(SkillName.EvalInt, 88.5, 92.3 );
SetSkill(SkillName.Magery, 97.9, 101.7 );
SetSkill(SkillName.Poisoning, 100 );
SetSkill(SkillName.Anatomy, 0, 4.5 );
SetSkill( SkillName.MagicResist, 103.5, 108.8 );
SetSkill( SkillName.Tactics, 81.0, 84.6 );
SetSkill( SkillName.Wrestling, 81.3, 83.9 );
Fame = 3700; // Guessed
Karma = -3700; // Guessed
}
/*public override void GenerateLoot() -- Need to verify
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
}*/
public override int GetAngerSound()
{
return 0x56d;
}
public override int GetIdleSound()
{
return 0x56b;
}
public override int GetAttackSound()
{
return 0x56c;
}
public override int GetHurtSound()
{
return 0x56c;
}
public override int GetDeathSound()
{
return 0x56e;
}
public FetidEssence ( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
/*private class InternalTimer : Timer
{
private Mobile m_From;
private Mobile m_Mobile;
private int m_Count;
public InternalTimer( Mobile from, Mobile m ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_From = from;
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
}*/
}
}

View file

@ -0,0 +1,127 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("an interred grizzle corpse")]
public class InterredGrizzle : BaseCreature
{
[Constructable]
public InterredGrizzle () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an interred grizzle";
Body = 259;
SetStr( 451, 500 );
SetDex( 201, 250 );
SetInt( 801, 850 );
SetHits( 1500 );
SetStam( 150 );
SetDamage( 5, 6 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Fire, 70 );
SetResistance( ResistanceType.Physical, 35, 55 );
SetResistance( ResistanceType.Fire, 20, 65 );
SetResistance( ResistanceType.Cold, 55, 80 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 60, 80 );
SetSkill(SkillName.Meditation, 77.7, 84.0 );
SetSkill(SkillName.EvalInt, 72.2, 79.6 );
SetSkill(SkillName.Magery, 83.7, 89.6);
SetSkill(SkillName.Poisoning, 0 );
SetSkill(SkillName.Anatomy, 0 );
SetSkill( SkillName.MagicResist, 80.2, 87.3 );
SetSkill( SkillName.Tactics, 104.5, 105.1 );
SetSkill( SkillName.Wrestling, 105.1, 109.4 );
Fame = 3700; // Guessed
Karma = -3700; // Guessed
}
/*public override void GenerateLoot() -- Need to verify
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
}*/
// TODO: Acid Blood
/*
* Message: 1070820
* Spits pool of acid (blood, hue 0x3F), hits lost 6-10 per second/step
* Damage is resistable (physical)
* Acid last 10 seconds
*/
public override int GetAngerSound()
{
return 0x581;
}
public override int GetIdleSound()
{
return 0x582;
}
public override int GetAttackSound()
{
return 0x580;
}
public override int GetHurtSound()
{
return 0x583;
}
public override int GetDeathSound()
{
return 0x584;
}
/*
public override bool OnBeforeDeath()
{
SpillAcid( 1, 4, 10, 6, 10 );
return base.OnBeforeDeath();
}
*/
public InterredGrizzle ( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
private class InternalTimer : Timer
{
private Mobile m_From;
private Mobile m_Mobile;
private int m_Count;
public InternalTimer( Mobile from, Mobile m ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_From = from;
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
}
}
}

View file

@ -0,0 +1,84 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName("a dryad corpse")]
public class MLDryad : BaseCreature
{
public override bool InitialInnocent { get { return true; } }
/* VULNERABLE TO FEY SLAYER!
* These creatures should be able to cast Area Peace as
* well as cause Players' armor to drop into their backpack*/
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Disrobe;
}
[Constructable]
public MLDryad()
: base(AIType.AI_Mage, FightMode.Aggressor, 10, 1, 0.2, 0.4) // NEED TO CHECK
{
Name = "a dryad";
Body = 266;
BaseSoundID = 0x57B;
SetStr(132, 149);
SetDex(152, 168);
SetInt(251, 280);
SetHits(304, 321);
SetDamage(6, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 40, 50);
SetResistance(ResistanceType.Fire, 15, 25);
SetResistance(ResistanceType.Cold, 40, 45);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.Meditation, 80.9, 89.9);
SetSkill(SkillName.EvalInt, 70.3, 78.7);
SetSkill(SkillName.Magery, 70.7, 75.7);
SetSkill(SkillName.Anatomy, 0);
SetSkill(SkillName.MagicResist, 101.7, 117.1);
SetSkill(SkillName.Tactics, 71.7, 79.8);
SetSkill(SkillName.Wrestling, 72.5, 79.5);
Fame = 5000;
Karma = 5000;
VirtualArmor = 28; // Don't know what it should be
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich); // Need to verify
}
public override int Meat { get { return 1; } }
public MLDryad(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,84 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName("a satyr corpse")]
public class Satyr : BaseCreature
{
/* These creatures should be able to cast Area Peace as
* well as cause Players' armor to drop into their backpack
*/
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Disrobe;
}
[Constructable]
public Satyr()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4) // NEED TO CHECK
{
Name = "a satyr";
Body = 271;
BaseSoundID = 0x586;
SetStr(177, 195);
SetDex(251, 269);
SetInt(153, 170);
SetHits(353, 399);
SetDamage(6, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 55, 60);
SetResistance(ResistanceType.Fire, 26, 35);
SetResistance(ResistanceType.Cold, 30, 40);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.Poisoning, 0);
SetSkill(SkillName.Meditation, 0);
SetSkill(SkillName.EvalInt, 0);
SetSkill(SkillName.Magery, 0);
SetSkill(SkillName.Anatomy, 0);
SetSkill(SkillName.MagicResist, 55.3, 64.3);
SetSkill(SkillName.Tactics, 80.1, 99.3);
SetSkill(SkillName.Wrestling, 80.6, 100.0);
Fame = 5000;
Karma = -5000;
VirtualArmor = 28; // Don't know what it should be
}
public override void GenerateLoot()
{
AddLoot(LootPack.Rich); // Need to verify
}
public override int Meat { get { return 1; } }
public Satyr(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,90 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a treefellow corpse" )]
public class FerelTreefellow : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public FerelTreefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
{
Name = "a ferel treefellow";
Body = 301;
SetStr( 1351, 1600 );
SetDex( 301, 550 );
SetInt( 651, 900 );
SetHits( 1170, 1320 );
SetDamage( 3, 4 ); // Estimate until Anat/Tactics is verified
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 60, 70 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 60 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );// Unknown
SetSkill( SkillName.Tactics, 65.1, 90.0 );// Unknown
SetSkill( SkillName.Wrestling, 65.1, 85.0 );// Unknown
Fame = 1000; //Unknown
Karma = -3000; //Unknown
VirtualArmor = 24;
PackItem( new Log( Utility.RandomMinMax( 23, 34 ) ) );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override int GetIdleSound()
{
return 443;
}
public override int GetDeathSound()
{
return 31;
}
public override int GetAttackSound()
{
return 672;
}
public override bool BleedImmune{ get{ return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Average ); //Unknown
}
public FerelTreefellow( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,77 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a slimey corpse" )]
public class CorrosiveSlime : BaseCreature
{
[Constructable]
public CorrosiveSlime() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a corrosive slime";
Body = 51;
BaseSoundID = 456;
Hue = Utility.RandomSlimeHue();
SetStr( 22, 34 );
SetDex( 16, 21 );
SetInt( 16, 20 );
SetHits( 15, 19 );
SetDamage( 1, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 5, 10 );
SetResistance( ResistanceType.Poison, 15, 20 );
SetSkill( SkillName.Poisoning, 36.0, 49.1 );
SetSkill(SkillName.Anatomy, 0);
SetSkill( SkillName.MagicResist, 15.9, 18.9 );
SetSkill( SkillName.Tactics, 24.6, 26.1 );
SetSkill( SkillName.Wrestling, 24.9, 26.1 );
Fame = 300;
Karma = -300;
VirtualArmor = 8;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 23.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
AddLoot( LootPack.Gems );
}
public override Poison PoisonImmune { get { return Poison.Regular; } }
public override Poison HitPoison { get { return Poison.Regular; } }
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
//TODO: Damage weapon via acid
public CorrosiveSlime( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,104 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("corpse of Ilhenir")]
public class Ilhenir : BaseCreature
{
// Based off of the Bone Demon, since Stratics and UOGuide are lacking in info. Many things guessed for now.
[Constructable]
public Ilhenir()
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = "Ilhenir";
Title = "the Stained";
Body = 259;
SetStr( 1105, 1350 );
SetDex( 82, 160 );
SetInt( 505, 750 );
SetHits( 9000 );
SetDamage(4, 6);
SetDamageType(ResistanceType.Physical, 60);
SetDamageType(ResistanceType.Fire, 20);
SetDamageType(ResistanceType.Poison, 20);
SetResistance(ResistanceType.Physical, 55, 65);
SetResistance(ResistanceType.Fire, 50, 60);
SetResistance(ResistanceType.Cold, 55, 65);
SetResistance(ResistanceType.Poison, 70, 90);
SetResistance(ResistanceType.Energy, 65, 75);
SetSkill(SkillName.EvalInt, 100);
SetSkill(SkillName.Magery, 100);
SetSkill(SkillName.Meditation, 0);
SetSkill(SkillName.Poisoning, 5.4);
SetSkill(SkillName.Anatomy, 117.5);
SetSkill(SkillName.MagicResist, 120.0);
SetSkill(SkillName.Tactics, 119.9);
SetSkill(SkillName.Wrestling, 119.9);
Fame = 50000;
Karma = -50000;
VirtualArmor = 44;
}
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 8);
}
public override bool Unprovokable { get { return true; } }
public override bool Uncalmable { get { return true; } }
public override Poison PoisonImmune { get { return Poison.Lethal; } }
public override int TreasureMapLevel { get { return 1; } }
public override int GetAngerSound()
{
return 0x581;
}
public override int GetIdleSound()
{
return 0x582;
}
public override int GetAttackSound()
{
return 0x580;
}
public override int GetHurtSound()
{
return 0x583;
}
public override int GetDeathSound()
{
return 0x584;
}
public Ilhenir(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,100 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "a minotaur corpse" )]
public class Meraktus : BaseCreature
{
[Constructable]
public Meraktus() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
{
Name = "Meraktus";
Title = "the Tormented";
Body = 262;
SetStr( 1419, 1438 );
SetDex( 309, 413 );
SetInt( 129, 131 );
SetHits( 4100, 4200 );
SetDamage( 3, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 90 );
SetResistance( ResistanceType.Fire, 65, 70 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 40, 60 );
SetResistance( ResistanceType.Energy, 50, 55 );
//SetSkill( SkillName.Meditation, Unknown );
//SetSkill( SkillName.EvalInt, Unknown );
//SetSkill( SkillName.Magery, Unknown );
//SetSkill( SkillName.Poisoning, Unknown );
SetSkill( SkillName.Anatomy, 0);
SetSkill( SkillName.MagicResist, 107.0, 111.3 );
SetSkill( SkillName.Tactics, 107.0, 117.0 );
SetSkill( SkillName.Wrestling, 100.0, 105.0 );
Fame = 70000;
Karma = -70000;
VirtualArmor = 28; // Don't know what it should be
// TODO: Area Ground Stomp: Damage + Dismount
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich ); // Need to verify
AddLoot(LootPack.Rich); // Need to verify
}
public override int GetAngerSound()
{
return 0x597;
}
public override int GetIdleSound()
{
return 0x596;
}
public override int GetAttackSound()
{
return 0x599;
}
public override int GetHurtSound()
{
return 0x59a;
}
public override int GetDeathSound()
{
return 0x59c;
}
public Meraktus( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,144 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
public class Twaulo : BaseCreature
{
// COMPLETELY guessed beyond stats. Stats/skills come from Stratics and UOGuide. No idea what the special attacks should be.
// Based on Silvani, due to them both using Blue creatures.
[Constructable]
public Twaulo()
: base(AIType.AI_Archer, FightMode.Evil, 18, 1, 0.1, 0.2)
{
Name = "Twaulo";
Title = "of the Glade";
Body = 101;
BaseSoundID = 679;
SetStr( 1751, 1950 );
SetDex( 251, 450 );
SetInt( 801, 1000 );
SetHits( 7500 );
SetDamage( 3, 4 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 75 );
SetResistance( ResistanceType.Fire, 45, 55 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 50, 60 );
SetSkill( SkillName.Archery, 85.0, 100 ); // Guestimate
SetSkill( SkillName.EvalInt, 0 ); // Per Stratics?!?
SetSkill( SkillName.Magery, 0 ); // Per Stratics?!?
SetSkill( SkillName.Meditation, 0 ); // Per Stratics?!?
SetSkill( SkillName.MagicResist, 0 ); // Per Stratics?!?
SetSkill( SkillName.Tactics, 85.0, 100 ); // Stratics says 0?!?
SetSkill( SkillName.Wrestling, 0 ); // Per Stratics?!?
Fame = 50000;
Karma = 50000;
VirtualArmor = 50;
AddItem(new Bow());
PackItem(new Arrow(Utility.RandomMinMax(500, 700)));
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override bool Unprovokable{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 5; } }
public void SpawnPixies( Mobile target )
{
Map map = this.Map;
if ( map == null )
return;
int newPixies = Utility.RandomMinMax( 3, 6 );
for ( int i = 0; i < newPixies; ++i )
{
Pixie pixie = new Pixie();
pixie.Team = this.Team;
pixie.FightMode = FightMode.Closest;
bool validLocation = false;
Point3D loc = this.Location;
for ( int j = 0; !validLocation && j < 10; ++j )
{
int x = X + Utility.Random( 3 ) - 1;
int y = Y + Utility.Random( 3 ) - 1;
int z = map.GetAverageZ( x, y );
if ( validLocation = map.CanFit( x, y, this.Z, 16, false, false ) )
loc = new Point3D( x, y, Z );
else if ( validLocation = map.CanFit( x, y, z, 16, false, false ) )
loc = new Point3D( x, y, z );
}
pixie.MoveToWorld( loc, map );
pixie.Combatant = target;
}
}
public override void AlterDamageScalarFrom( Mobile caster, ref double scalar )
{
if ( 0.1 >= Utility.RandomDouble() )
SpawnPixies( caster );
}
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
defender.Damage( Utility.Random( 20, 10 ), this );
defender.Stam -= Utility.Random( 20, 10 );
defender.Mana -= Utility.Random( 20, 10 );
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if ( 0.1 >= Utility.RandomDouble() )
SpawnPixies( attacker );
}
public Twaulo( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}