#W# Source and Scripts added. Added Scripts/Settings.cs to expose some basic tweak able settings.

This commit is contained in:
WarrentyExpired 2026-08-06 11:06:05 -04:00
parent b51c58f514
commit 3045c83799
3512 changed files with 627673 additions and 0 deletions

View file

@ -0,0 +1,277 @@
using System;
using System.Collections;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a bake kitsune corpse" )]
public class BakeKitsune : BaseCreature
{
[Constructable]
public BakeKitsune() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bake kitsune";
Body = 246;
SetStr( 171, 220 );
SetDex( 126, 145 );
SetInt( 376, 425 );
SetHits( 301, 350 );
SetDamage( 15, 22 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Energy, 30 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 70, 90 );
SetResistance( ResistanceType.Cold, 40, 60 );
SetResistance( ResistanceType.Poison, 40, 60 );
SetResistance( ResistanceType.Energy, 40, 60 );
SetSkill( SkillName.EvalInt, 80.1, 90.0 );
SetSkill( SkillName.Magery, 80.1, 90.0 );
SetSkill( SkillName.MagicResist, 80.1, 100.0 );
SetSkill( SkillName.Tactics, 70.1, 90.0 );
SetSkill( SkillName.Wrestling, 50.1, 55.0 );
Fame = 8000;
Karma = -8000;
Tamable = true;
ControlSlots = 2;
MinTameSkill = 80.7;
if ( Utility.RandomDouble() < .25 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls, 2 );
}
public override int Meat{ get{ return 5; } }
public override int Hides{ get{ return 10; } }
public override HideType HideType{ get{ return HideType.Barbed; } }
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
public override bool ShowFameTitle{ get{ return false; } }
public override bool ClickTitle{ get{ return false; } }
public override bool PropertyTitle{ get{ return false; } }
public override void OnCombatantChange()
{
if ( Combatant == null && !IsBodyMod && !Controlled && m_DisguiseTimer == null && Utility.RandomBool() )
m_DisguiseTimer = Timer.DelayCall( TimeSpan.FromSeconds( Utility.RandomMinMax( 15, 30 ) ), new TimerCallback( Disguise ) );
}
public override bool OnBeforeDeath()
{
RemoveDisguise();
return base.OnBeforeDeath();
}
#region Disguise
private Timer m_DisguiseTimer;
public void Disguise()
{
if ( Combatant != null || IsBodyMod || Controlled )
return;
FixedEffect( 0x376A, 8, 32 );
PlaySound( 0x1FE );
Female = Utility.RandomBool();
if ( Female )
{
BodyMod = 0x191;
Name = NameList.RandomName( "female" );
}
else
{
BodyMod = 0x190;
Name = NameList.RandomName( "male" );
}
Title = "the mystic llama herder";
Hue = Race.Human.RandomSkinHue();
HairItemID = Race.Human.RandomHair( this );
HairHue = Race.Human.RandomHairHue();
FacialHairItemID = Race.Human.RandomFacialHair( this );
FacialHairHue = HairHue;
switch ( Utility.Random( 4 ) )
{
case 0: AddItem( new Shoes( Utility.RandomNeutralHue() ) ); break;
case 1: AddItem( new Boots( Utility.RandomNeutralHue() ) ); break;
case 2: AddItem( new Sandals( Utility.RandomNeutralHue() ) ); break;
case 3: AddItem( new ThighBoots( Utility.RandomNeutralHue() ) ); break;
}
AddItem( new Robe( Utility.RandomNondyedHue() ) );
m_DisguiseTimer = null;
m_DisguiseTimer = Timer.DelayCall( TimeSpan.FromSeconds( 75 ), new TimerCallback( RemoveDisguise ) );
}
public void RemoveDisguise()
{
if ( !IsBodyMod )
return;
Name = "a bake kitsune";
Title = null;
BodyMod = 0;
Hue = 0;
HairItemID = 0;
HairHue = 0;
FacialHairItemID = 0;
FacialHairHue = 0;
DeleteItemOnLayer( Layer.OuterTorso );
DeleteItemOnLayer( Layer.Shoes );
m_DisguiseTimer = null;
}
public void DeleteItemOnLayer( Layer layer )
{
Item item = FindItemOnLayer( layer );
if ( item != null )
item.Delete();
}
#endregion
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 > Utility.RandomDouble() )
{
/* Blood Bath
* Start cliloc 1070826
* Sound: 0x52B
* 2-3 blood spots
* Damage: 2 hps per second for 5 seconds
* End cliloc: 1070824
*/
ExpireTimer timer = (ExpireTimer)m_Table[defender];
if ( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070825 ); // The creature continues to rage!
}
else
defender.SendLocalizedMessage( 1070826 ); // The creature goes into a rage, inflicting heavy damage!
timer = new ExpireTimer( defender, this );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private Mobile m_From;
private int m_Count;
public ExpireTimer( Mobile m, Mobile from ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_Mobile = m;
m_From = from;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
Stop();
m_Table.Remove( m_Mobile );
}
public void DrainLife()
{
if ( m_Mobile.Alive )
m_Mobile.Damage( 2, m_From );
else
DoExpire();
}
protected override void OnTick()
{
DrainLife();
if ( ++m_Count >= 5 )
{
DoExpire();
m_Mobile.SendLocalizedMessage( 1070824 ); // The creature's rage subsides.
}
}
}
public override int GetAngerSound()
{
return 0x4DE;
}
public override int GetIdleSound()
{
return 0x4DD;
}
public override int GetAttackSound()
{
return 0x4DC;
}
public override int GetHurtSound()
{
return 0x4DF;
}
public override int GetDeathSound()
{
return 0x4DB;
}
public BakeKitsune( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( version == 0 && PhysicalResistance > 60 )
{
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 70, 90 );
SetResistance( ResistanceType.Cold, 40, 60 );
SetResistance( ResistanceType.Poison, 40, 60 );
SetResistance( ResistanceType.Energy, 40, 60 );
}
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RemoveDisguise ) );
}
}
}

View file

@ -0,0 +1,146 @@
using System;
using Server;
using Server.Items;
using Server.Spells;
namespace Server.Mobiles
{
[CorpseName( "a deathwatchbeetle corpse" )]
[TypeAlias( "Server.Mobiles.DeathWatchBeetle" )]
public class DeathwatchBeetle : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.CrushingBlow;
}
[Constructable]
public DeathwatchBeetle() : base( AIType.AI_Melee, Core.ML ? FightMode.Aggressor : FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a deathwatch beetle";
Body = 242;
SetStr( 136, 160 );
SetDex( 41, 52 );
SetInt( 31, 40 );
SetHits( 121, 145 );
SetMana( 20 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 15, 30 );
SetResistance( ResistanceType.Cold, 15, 30 );
SetResistance( ResistanceType.Poison, 50, 80 );
SetResistance( ResistanceType.Energy, 20, 35 );
SetSkill( SkillName.MagicResist, 50.1, 58.0 );
SetSkill( SkillName.Tactics, 67.1, 77.0 );
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
SetSkill( SkillName.Anatomy, 30.1, 34.0 );
Fame = 1400;
Karma = -1400;
switch ( Utility.Random( 12 ) )
{
case 0: PackItem( new LeatherGorget() ); break;
case 1: PackItem( new LeatherGloves() ); break;
case 2: PackItem( new LeatherArms() ); break;
case 3: PackItem( new LeatherLegs() ); break;
case 4: PackItem( new LeatherCap() ); break;
case 5: PackItem( new LeatherChest() ); break;
}
if ( Utility.RandomDouble() < .5 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
Tamable = true;
MinTameSkill = 41.1;
ControlSlots = 1;
}
public override int GetAngerSound()
{
return 0x4F3;
}
public override int GetIdleSound()
{
return 0x4F2;
}
public override int GetAttackSound()
{
return 0x4F1;
}
public override int GetHurtSound()
{
return 0x4F4;
}
public override int GetDeathSound()
{
return 0x4F0;
}
public override void GenerateLoot()
{
AddLoot( LootPack.LowScrolls, 1 );
AddLoot( LootPack.Potions, 1 );
}
public override void AlterMeleeDamageTo( Mobile to, ref int damage )
{
if ( Utility.RandomBool() && (this.Mana > 14) && to != null )
{
damage = (damage + (damage / 2));
to.SendLocalizedMessage( 1060091 ); // You take extra damage from the crushing attack!
to.PlaySound( 0x1E1 );
to.FixedParticles( 0x377A, 1, 32, 0x26da, 0, 0, 0 );
Mana -= 15;
}
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
Mobile combatant = Combatant;
if ( combatant == null || combatant.Deleted || combatant.Map != Map || !InRange( combatant, 12 ) || !CanBeHarmful( combatant ) || !InLOS( combatant ) )
return;
if( Utility.Random( 10 ) == 0 )
PoisonAttack( combatant );
base.OnDamage( amount, from, willKill );
}
public void PoisonAttack( Mobile m )
{
DoHarmful( m );
this.MovingParticles( m, 0x36D4, 1, 0, false, false, 0x3F, 0, 0x1F73, 1, 0, (EffectLayer)255, 0x100 );
m.ApplyPoison( this, Poison.Regular );
m.SendLocalizedMessage( 1070821, this.Name ); // %s spits a poisonous substance at you!
}
public override int Hides{ get{ return 8; } }
public DeathwatchBeetle( 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,108 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a deathwatchbeetle hatchling corpse" )]
[TypeAlias( "Server.Mobiles.DeathWatchBeetleHatchling" )]
public class DeathwatchBeetleHatchling : BaseCreature
{
[Constructable]
public DeathwatchBeetleHatchling() : base( AIType.AI_Melee, Core.ML ? FightMode.Aggressor : FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a deathwatch beetle hatchling";
Body = 242;
SetStr( 26, 50 );
SetDex( 41, 52 );
SetInt( 21, 30 );
SetHits( 51, 60 );
SetMana( 20 );
SetDamage( 2, 8 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 15, 30 );
SetResistance( ResistanceType.Cold, 15, 30 );
SetResistance( ResistanceType.Poison, 20, 40 );
SetResistance( ResistanceType.Energy, 20, 35 );
SetSkill( SkillName.Wrestling, 30.1, 40.0 );
SetSkill( SkillName.Tactics, 47.1, 57.0 );
SetSkill( SkillName.MagicResist, 30.1, 38.0 );
SetSkill( SkillName.Anatomy, 20.1, 24.0 );
Fame = 700;
Karma = -700;
if( Utility.RandomBool() )
{
Item i = Loot.RandomReagent();
i.Amount = 3;
PackItem( i );
}
switch ( Utility.Random( 12 ) )
{
case 0: PackItem( new LeatherGorget() ); break;
case 1: PackItem( new LeatherGloves() ); break;
case 2: PackItem( new LeatherArms() ); break;
case 3: PackItem( new LeatherLegs() ); break;
case 4: PackItem( new LeatherCap() ); break;
case 5: PackItem( new LeatherChest() ); break;
}
}
public override int GetAngerSound()
{
return 0x4F3;
}
public override int GetIdleSound()
{
return 0x4F2;
}
public override int GetAttackSound()
{
return 0x4F1;
}
public override int GetHurtSound()
{
return 0x4F4;
}
public override int GetDeathSound()
{
return 0x4F0;
}
public override void GenerateLoot()
{
AddLoot( LootPack.LowScrolls, 1 );
AddLoot( LootPack.Potions, 1 );
}
public DeathwatchBeetleHatchling( Serial serial ) : base( serial )
{
}
public override int Hides{ get{ return 8; } }
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,123 @@
using System;
using System.Collections;
using Server.Items;
using Server.ContextMenus;
using Server.Misc;
using Server.Network;
namespace Server.Mobiles
{
public class EliteNinja : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
[Constructable]
public EliteNinja() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SpeechHue = Utility.RandomDyedHue();
Hue = Utility.RandomSkinHue();
Name = "an elite ninja";
Body = ( this.Female = Utility.RandomBool() ) ? 0x191 : 0x190;
SetHits( 251, 350 );
SetStr( 126, 225 );
SetDex( 81, 95 );
SetInt( 151, 165 );
SetDamage( 12, 20 );
SetDamageType( ResistanceType.Physical, 65 );
SetDamageType( ResistanceType.Fire, 15 );
SetDamageType( ResistanceType.Poison, 15 );
SetDamageType( ResistanceType.Energy, 5 );
SetResistance( ResistanceType.Physical, 35, 65 );
SetResistance( ResistanceType.Fire, 40, 60 );
SetResistance( ResistanceType.Cold, 25, 45 );
SetResistance( ResistanceType.Poison, 40, 60 );
SetResistance( ResistanceType.Energy, 35, 55 );
SetSkill( SkillName.Anatomy, 105.0, 120.0 );
SetSkill( SkillName.MagicResist, 80.0, 100.0 );
SetSkill( SkillName.Tactics, 115.0, 130.0 );
SetSkill( SkillName.Wrestling, 95.0, 120.0 );
SetSkill( SkillName.Fencing, 95.0, 120.0 );
SetSkill( SkillName.Macing, 95.0, 120.0 );
SetSkill( SkillName.Swords, 95.0, 120.0 );
SetSkill( SkillName.Ninjitsu, 95.0, 120.0 );
Fame = 8500;
Karma = -8500;
/* TODO:
Uses Smokebombs
Hides
Stealths
Can use Ninjitsu Abilities
Can change weapons during a fight
*/
AddItem( new NinjaTabi() );
AddItem( new LeatherNinjaJacket());
AddItem( new LeatherNinjaHood());
AddItem( new LeatherNinjaPants());
AddItem( new LeatherNinjaMitts());
if( Utility.RandomDouble() < 0.33 )
AddItem( new SmokeBomb() );
switch ( Utility.Random( 8 ))
{
case 0: AddItem( new Tessen() ); break;
case 1: AddItem( new Wakizashi() ); break;
case 2: AddItem( new Nunchaku() ); break;
case 3: AddItem( new Daisho() ); break;
case 4: AddItem( new Sai() ); break;
case 5: AddItem( new Tekagi() ); break;
case 6: AddItem( new Kama() ); break;
case 7: AddItem( new Katana() ); break;
}
Utility.AssignRandomHair( this );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new BookOfNinjitsu() );
}
public override bool BardImmune{ get{ return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 2 );
}
public override bool AlwaysMurderer{ get{ return true; } }
public EliteNinja( 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();
}
}
}

View file

@ -0,0 +1,183 @@
using System;
using System.Collections;
using Server;
using Server.Network;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a fan dancer corpse" )]
public class FanDancer : BaseCreature
{
[Constructable]
public FanDancer() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fan dancer";
Body = 247;
BaseSoundID = 0x372;
SetStr( 301, 375 );
SetDex( 201, 255 );
SetInt( 21, 25 );
SetHits( 351, 430 );
SetDamage( 12, 17 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Cold, 10 );
SetDamageType( ResistanceType.Poison, 10 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 50, 70 );
SetResistance( ResistanceType.Cold, 50, 70 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 40, 60 );
SetSkill( SkillName.MagicResist, 100.1, 110.0 );
SetSkill( SkillName.Tactics, 85.1, 95.0 );
SetSkill( SkillName.Wrestling, 85.1, 95.0 );
SetSkill( SkillName.Anatomy, 85.1, 95.0 );
Fame = 9000;
Karma = -9000;
if ( Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
AddItem( new Tessen() );
if ( 0.02 >= Utility.RandomDouble() )
PackItem( new OrigamiPaper() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 2 );
}
public override bool Uncalmable{ get{ return true; } }
/* TODO: Repel Magic
* 10% chance of repelling a melee attack (why did they call it repel magic anyway?)
* Cliloc: 1070844
* Effect: damage is dealt to the attacker, no damage is taken by the fan dancer
*/
public override void OnDamagedBySpell( Mobile attacker )
{
base.OnDamagedBySpell( attacker );
if ( 0.8 > Utility.RandomDouble() && !attacker.InRange( this, 1 ) )
{
/* Fan Throw
* Effect: - To: "0x57D4F5B" - ItemId: "0x27A3" - ItemIdName: "Tessen" - FromLocation: "(992 299, 24)" - ToLocation: "(992 308, 22)" - Speed: "10" - Duration: "0" - FixedDirection: "False" - Explode: "False" - Hue: "0x0" - Render: "0x0"
* Damage: 50-65
*/
Effects.SendPacket( attacker, attacker.Map, new HuedEffect( EffectType.Moving, Serial.Zero, Serial.Zero, 0x27A3, this.Location, attacker.Location, 10, 0, false, false, 0, 0 ) );
AOS.Damage( attacker, this, Utility.RandomMinMax( 50, 65 ), 100, 0, 0, 0, 0 );
}
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if ( 0.8 > Utility.RandomDouble() && !attacker.InRange( this, 1 ) )
{
/* Fan Throw
* Effect: - To: "0x57D4F5B" - ItemId: "0x27A3" - ItemIdName: "Tessen" - FromLocation: "(992 299, 24)" - ToLocation: "(992 308, 22)" - Speed: "10" - Duration: "0" - FixedDirection: "False" - Explode: "False" - Hue: "0x0" - Render: "0x0"
* Damage: 50-65
*/
Effects.SendPacket( attacker, attacker.Map, new HuedEffect( EffectType.Moving, Serial.Zero, Serial.Zero, 0x27A3, this.Location, attacker.Location, 10, 0, false, false, 0, 0 ) );
AOS.Damage( attacker, this, Utility.RandomMinMax( 50, 65 ), 100, 0, 0, 0, 0 );
}
}
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( !IsFanned( defender ) && 0.05 > Utility.RandomDouble() )
{
/* Fanning Fire
* Graphic: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x3709" ItemIdName: "fire column" FromLocation: "(994 325, 16)" ToLocation: "(994 325, 16)" Speed: "10" Duration: "30" FixedDirection: "True" Explode: "False" Hue: "0x0" RenderMode: "0x0" Effect: "0x34" ExplodeEffect: "0x1" ExplodeSound: "0x0" Serial: "0x57D4F5B" Layer: "5" Unknown: "0x0"
* Sound: 0x208
* Start cliloc: 1070833
* Effect: Fire res -10% for 10 seconds
* Damage: 35-45, 100% fire
* End cliloc: 1070834
* Effect does not stack
*/
defender.SendLocalizedMessage( 1070833 ); // The creature fans you with fire, reducing your resistance to fire attacks.
int effect = -(defender.FireResistance / 10);
ResistanceMod mod = new ResistanceMod( ResistanceType.Fire, effect );
defender.FixedParticles( 0x37B9, 10, 30, 0x34, EffectLayer.RightFoot );
defender.PlaySound( 0x208 );
// This should be done in place of the normal attack damage.
//AOS.Damage( defender, this, Utility.RandomMinMax( 35, 45 ), 0, 100, 0, 0, 0 );
defender.AddResistanceMod( mod );
ExpireTimer timer = new ExpireTimer( defender, mod, TimeSpan.FromSeconds( 10.0 ) );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
public bool IsFanned( Mobile m )
{
return m_Table.Contains( m );
}
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private ResistanceMod m_Mod;
public ExpireTimer( Mobile m, ResistanceMod mod, TimeSpan delay ) : base( delay )
{
m_Mobile = m;
m_Mod = mod;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Mobile.SendLocalizedMessage( 1070834 ); // Your resistance to fire attacks has returned.
m_Mobile.RemoveResistanceMod( m_Mod );
Stop();
m_Table.Remove( m_Mobile );
}
}
public FanDancer( 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();
}
}
}

View file

@ -0,0 +1,125 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a fire beetle corpse" )]
[Server.Engines.Craft.Forge]
public class FireBeetle : BaseMount
{
public override bool SubdueBeforeTame{ get{ return true; } } // Must be beaten into submission
public override bool StatLossAfterTame{ get{ return true; } }
public virtual double BoostedSpeed{ get{ return 0.1; } }
public override bool ReduceSpeedWithDamage{ get{ return false; } }
[Constructable]
public FireBeetle() : base( "a fire beetle", 0xA9, 0x3E95, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SetStr( 300 );
SetDex( 100 );
SetInt( 500 );
SetHits( 200 );
SetDamage( 7, 20 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Fire, 100 );
SetResistance( ResistanceType.Physical, 40 );
SetResistance( ResistanceType.Fire, 70, 75 );
SetResistance( ResistanceType.Cold, 10 );
SetResistance( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Energy, 30 );
SetSkill( SkillName.MagicResist, 90.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 100.0 );
Fame = 4000;
Karma = -4000;
Tamable = true;
ControlSlots = 3;
MinTameSkill = 93.9;
PackItem( new SulfurousAsh( Utility.RandomMinMax( 16, 25 ) ) );
PackItem( new IronIngot( 2 ) );
Hue = 0x489;
}
public override void OnHarmfulSpell( Mobile from )
{
if ( !Controlled && ControlMaster == null )
CurrentSpeed = BoostedSpeed;
}
public override void OnCombatantChange()
{
if ( Combatant == null && !Controlled && ControlMaster == null )
CurrentSpeed = PassiveSpeed;
}
public override bool OverrideBondingReqs()
{
return true;
}
public override int GetAngerSound()
{
return 0x21D;
}
public override int GetIdleSound()
{
return 0x21D;
}
public override int GetAttackSound()
{
return 0x162;
}
public override int GetHurtSound()
{
return 0x163;
}
public override int GetDeathSound()
{
return 0x21D;
}
public override int Meat{ get{ return 16; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public override double GetControlChance( Mobile m, bool useBaseSkill )
{
return 1.0;
}
public FireBeetle( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if( version == 0 )
Hue = 0x489;
}
}
}

View file

@ -0,0 +1,220 @@
using System;
using System.Collections;
using Server;
using Server.Network;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a kappa corpse" )]
public class Kappa : BaseCreature
{
[Constructable]
public Kappa() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a kappa";
Body = 240;
SetStr( 186, 230 );
SetDex( 51, 75 );
SetInt( 41, 55 );
SetMana ( 30 );
SetHits( 151, 180 );
SetDamage( 6, 12 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 50 );
SetResistance( ResistanceType.Fire, 35, 50 );
SetResistance( ResistanceType.Cold, 25, 50 );
SetResistance( ResistanceType.Poison, 35, 50 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 60.1, 70.0 );
SetSkill( SkillName.Tactics, 79.1, 89.0 );
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
Fame = 1700;
Karma = -1700;
PackItem( new RawFishSteak( 3 ) );
for( int i = 0; i < 2; i++ )
{
switch ( Utility.Random( 6 ) )
{
case 0: PackItem( new Gears() ); break;
case 1: PackItem( new Hinge() ); break;
case 2: PackItem( new Axle() ); break;
}
}
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(4) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
}
public override int GetAngerSound()
{
return 0x50B;
}
public override int GetIdleSound()
{
return 0x50A;
}
public override int GetAttackSound()
{
return 0x509;
}
public override int GetHurtSound()
{
return 0x50C;
}
public override int GetDeathSound()
{
return 0x508;
}
public override void OnGaveMeleeAttack(Mobile defender)
{
base.OnGaveMeleeAttack (defender);
if ( Utility.RandomBool() )
{
if ( !IsBeingDrained( defender ) && Mana > 14)
{
defender.SendLocalizedMessage( 1070848 ); // You feel your life force being stolen away.
BeginLifeDrain( defender, this );
Mana-=15;
}
}
}
private static Hashtable m_Table = new Hashtable();
public static bool IsBeingDrained( Mobile m )
{
return m_Table.Contains( m );
}
public static void BeginLifeDrain( Mobile m, Mobile from )
{
Timer t = (Timer)m_Table[m];
if ( t != null )
t.Stop();
t = new InternalTimer( from, m );
m_Table[m] = t;
t.Start();
}
public static void DrainLife( Mobile m, Mobile from )
{
if ( m.Alive )
{
int damageGiven = AOS.Damage( m, from, 5, 0, 0, 0, 0, 100 );
from.Hits += damageGiven;
}
else
{
EndLifeDrain( m );
}
}
public static void EndLifeDrain( Mobile m )
{
Timer t = (Timer)m_Table[m];
if ( t != null )
t.Stop();
m_Table.Remove( m );
m.SendLocalizedMessage( 1070849 ); // The drain on your life force is gone.
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
if ( from != null && from.Map != null )
{
int amt=0;
Mobile target = this;
int rand = Utility.Random( 1, 100 );
if ( willKill )
{
amt = ((( rand % 5 ) >> 2 ) + 3);
}
if ( ( Hits < 100 ) && ( rand < 21 ) )
{
target = ( rand % 2 ) < 1 ? this : from;
amt++;
}
if ( amt > 0 )
{
SpillAcid( target, amt );
from.SendLocalizedMessage( 1070820 );
if ( Mana > 14)
Mana -= 15;
amt ^= amt;
}
}
base.OnDamage( amount, from, willKill );
}
public override Item NewHarmfulItem()
{
return new AcidSlime( TimeSpan.FromSeconds(10), 5, 10 );
}
public Kappa( 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;
}
protected override void OnTick()
{
DrainLife( m_Mobile, m_From );
if ( Running && ++m_Count == 5 )
EndLifeDrain( m_Mobile );
}
}
}
}

View file

@ -0,0 +1,176 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a kaze kemono corpse" )]
public class KazeKemono : BaseCreature
{
[Constructable]
public KazeKemono()
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a kaze kemono";
Body = 196;
BaseSoundID = 655;
SetStr( 201, 275 );
SetDex( 101, 155 );
SetInt( 101, 105 );
SetHits( 251, 330 );
SetDamage( 15, 20 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Cold, 10 );
SetDamageType( ResistanceType.Poison, 10 );
SetResistance( ResistanceType.Physical, 50, 70 );
SetResistance( ResistanceType.Fire, 30, 60 );
SetResistance( ResistanceType.Cold, 30, 60 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 60, 80 );
SetSkill( SkillName.MagicResist, 110.1, 125.0 );
SetSkill( SkillName.Tactics, 55.1, 65.0 );
SetSkill( SkillName.Wrestling, 85.1, 95.0 );
SetSkill( SkillName.Anatomy, 25.1, 35.0 );
SetSkill( SkillName.Magery, 95.1, 105.0 );
Fame = 8000;
Karma = -8000;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich, 3 );
}
public override bool BleedImmune { get { return true; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if( 0.1 > Utility.RandomDouble() )
{
/* Flurry of Twigs
* Start cliloc: 1070850
* Effect: Physical resistance -15% for 5 seconds
* End cliloc: 1070852
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(1048 779, 6)" ToLocation: "(1048 779, 6)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
*/
ExpireTimer timer = (ExpireTimer)m_FlurryOfTwigsTable[defender];
if( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070851 ); // The creature lands another blow in your weakened state.
}
else
defender.SendLocalizedMessage( 1070850 ); // The creature's flurry of twigs has made you more susceptible to physical attacks!
int effect = -(defender.PhysicalResistance * 15 / 100);
ResistanceMod mod = new ResistanceMod( ResistanceType.Physical, effect );
defender.FixedEffect( 0x37B9, 10, 5 );
defender.AddResistanceMod( mod );
timer = new ExpireTimer( defender, mod, m_FlurryOfTwigsTable, TimeSpan.FromSeconds( 5.0 ) );
timer.Start();
m_FlurryOfTwigsTable[defender] = timer;
}
else if( 0.05 > Utility.RandomDouble() )
{
/* Chlorophyl Blast
* Start cliloc: 1070827
* Effect: Energy resistance -50% for 10 seconds
* End cliloc: 1070829
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(1048 779, 6)" ToLocation: "(1048 779, 6)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
*/
ExpireTimer timer = (ExpireTimer)m_ChlorophylBlastTable[defender];
if( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070828 ); // The creature continues to hinder your energy resistance!
}
else
defender.SendLocalizedMessage( 1070827 ); // The creature's attack has made you more susceptible to energy attacks!
int effect = -(defender.EnergyResistance / 2);
ResistanceMod mod = new ResistanceMod( ResistanceType.Energy, effect );
defender.FixedEffect( 0x37B9, 10, 5 );
defender.AddResistanceMod( mod );
timer = new ExpireTimer( defender, mod, m_ChlorophylBlastTable, TimeSpan.FromSeconds( 10.0 ) );
timer.Start();
m_ChlorophylBlastTable[defender] = timer;
}
}
private static Hashtable m_FlurryOfTwigsTable = new Hashtable();
private static Hashtable m_ChlorophylBlastTable = new Hashtable();
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private ResistanceMod m_Mod;
private Hashtable m_Table;
public ExpireTimer( Mobile m, ResistanceMod mod, Hashtable table, TimeSpan delay )
: base( delay )
{
m_Mobile = m;
m_Mod = mod;
m_Table = table;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
m_Mobile.RemoveResistanceMod( m_Mod );
Stop();
m_Table.Remove( m_Mobile );
}
protected override void OnTick()
{
if( m_Mod.Type == ResistanceType.Physical )
m_Mobile.SendLocalizedMessage( 1070852 ); // Your resistance to physical attacks has returned.
else
m_Mobile.SendLocalizedMessage( 1070829 ); // Your resistance to energy attacks has returned.
DoExpire();
}
}
public KazeKemono( 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,162 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a lady of the snow corpse" )]
public class LadyOfTheSnow : BaseCreature
{
[Constructable]
public LadyOfTheSnow()
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a lady of the snow";
Body = 252;
BaseSoundID = 0x482;
SetStr( 276, 305 );
SetDex( 106, 125 );
SetInt( 471, 495 );
SetHits( 596, 625 );
SetDamage( 13, 20 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 80 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 40, 55 );
SetResistance( ResistanceType.Cold, 70, 90 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 65, 85 );
SetSkill( SkillName.Magery, 95.1, 110.0 );
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
SetSkill( SkillName.Necromancy, 90, 110.0 );
SetSkill( SkillName.SpiritSpeak, 90.0, 110.0 );
Fame = 15200;
Karma = -15200;
PackReg( 3 );
PackItem( new Necklace() );
if ( 0.25 > Utility.RandomDouble() )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
}
public override int GetDeathSound()
{
return 0x370;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
}
public override bool BleedImmune { get { return true; } }
public override bool CanRummageCorpses { get { return true; } }
public override int TreasureMapLevel { get { return 4; } }
// TODO: Snowball
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if( 0.1 > Utility.RandomDouble() )
{
/* Cold Wind
* Graphics: Message - Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(928 164, 34)" ToLocation: "(928 164, 34)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
* Start cliloc: 1070832
* Damage: 1hp per second for 5 seconds
* End cliloc: 1070830
* Reset cliloc: 1070831
*/
ExpireTimer timer = (ExpireTimer)m_Table[defender];
if( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070831 ); // The freezing wind continues to blow!
}
else
defender.SendLocalizedMessage( 1070832 ); // An icy wind surrounds you, freezing your lungs as you breathe!
timer = new ExpireTimer( defender, this );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private Mobile m_From;
private int m_Count;
public ExpireTimer( Mobile m, Mobile from )
: base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_Mobile = m;
m_From = from;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
Stop();
m_Table.Remove( m_Mobile );
}
public void DrainLife()
{
if( m_Mobile.Alive )
m_Mobile.Damage( 2, m_From );
else
DoExpire();
}
protected override void OnTick()
{
DrainLife();
if( ++m_Count >= 5 )
{
DoExpire();
m_Mobile.SendLocalizedMessage( 1070830 ); // The icy wind dissipates.
}
}
}
public LadyOfTheSnow( 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();
}
}
}

View file

@ -0,0 +1,111 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an oni corpse" )]
public class Oni : BaseCreature
{
[Constructable]
public Oni() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an oni";
Body = 241;
SetStr( 801, 910 );
SetDex( 151, 300 );
SetInt( 171, 195 );
SetHits( 401, 530 );
SetDamage( 14, 20 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 65, 80 );
SetResistance( ResistanceType.Fire, 50, 70 );
SetResistance( ResistanceType.Cold, 35, 50 );
SetResistance( ResistanceType.Poison, 45, 70 );
SetResistance( ResistanceType.Energy, 45, 65 );
SetSkill( SkillName.EvalInt, 100.1, 125.0 );
SetSkill( SkillName.Magery, 96.1, 106.0 );
SetSkill( SkillName.Anatomy, 85.1, 95.0 );
SetSkill( SkillName.MagicResist, 85.1, 100.0 );
SetSkill( SkillName.Tactics, 86.1, 101.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 12000;
Karma = -12000;
if ( Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
// TODO: Brain (0x1CF0) or Skull (0x1AE3) or Body Part (0x1CE3)
}
public override int GetAngerSound()
{
return 0x4E3;
}
public override int GetIdleSound()
{
return 0x4E2;
}
public override int GetAttackSound()
{
return 0x4E1;
}
public override int GetHurtSound()
{
return 0x4E4;
}
public override int GetDeathSound()
{
return 0x4E0;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 3 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 4; } }
/* TODO: Angry Fire
* cliloc 1070823
* Action: 4 4 1 true false 1
* Damage: 50-85, 60 phys, 20 fire, 20 nrgy according to the guide
* With 45/49/70 res I got 48
* 50: 30/10/10 -> 16 + 5 + 3 = 24
* 85: 51/17/17 -> 28 + 8 + 5 = 41
*/
public Oni( 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,132 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a rai-ju corpse" )]
public class RaiJu : BaseCreature
{
[Constructable]
public RaiJu() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a Rai-Ju";
Body = 199;
BaseSoundID = 0x346;
SetStr( 151, 225 );
SetDex( 81, 135 );
SetInt( 176, 180 );
SetHits( 201, 280 );
SetDamage( 12, 15 );
SetDamageType( ResistanceType.Physical, 10 );
SetDamageType( ResistanceType.Fire, 10 );
SetDamageType( ResistanceType.Cold, 10 );
SetDamageType( ResistanceType.Poison, 10 );
SetDamageType( ResistanceType.Energy, 60 );
SetResistance( ResistanceType.Physical, 45, 65 );
SetResistance( ResistanceType.Fire, 70, 85 );
SetResistance( ResistanceType.Cold, 30, 60 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 60, 80 );
SetSkill( SkillName.Wrestling, 85.1, 95.0 );
SetSkill( SkillName.Tactics, 55.1, 65.0 );
SetSkill( SkillName.MagicResist, 110.1, 125.0 );
SetSkill( SkillName.Anatomy, 25.1, 35.0 );
Fame = 8000;
Karma = -8000;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich, 2 );
AddLoot( LootPack.Gems, 2 );
}
public override bool BleedImmune{ get{ return true; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 > Utility.RandomDouble() && !IsStunned( defender ) )
{
/* Lightning Fist
* Cliloc: 1070839
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(884 715, 10)" ToLocation: "(884 715, 10)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
* Damage: 35-65, 100% energy, resistable
* Freezes for 4 seconds
* Effect cannot stack
*/
defender.FixedEffect( 0x37B9, 10, 5 );
defender.SendLocalizedMessage( 1070839 ); // The creature attacks with stunning force!
// This should be done in place of the normal attack damage.
//AOS.Damage( defender, this, Utility.RandomMinMax( 35, 65 ), 0, 0, 0, 0, 100 );
defender.Frozen = true;
ExpireTimer timer = new ExpireTimer( defender, TimeSpan.FromSeconds( 4.0 ) );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
public bool IsStunned( Mobile m )
{
return m_Table.Contains( m );
}
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
public ExpireTimer( Mobile m, TimeSpan delay ) : base( delay )
{
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
m_Mobile.Frozen = false;
Stop();
m_Table.Remove( m_Mobile );
}
protected override void OnTick()
{
m_Mobile.SendLocalizedMessage( 1005603 ); // You can move again!
DoExpire();
}
}
public RaiJu( 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();
}
}
}

View file

@ -0,0 +1,120 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a revenant lion corpse" )]
public class RevenantLion : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public RevenantLion() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a Revenant Lion";
Body = 251;
SetStr( 276, 325 );
SetDex( 156, 175 );
SetInt( 76, 105 );
SetHits( 251, 280 );
SetDamage( 18, 24 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Cold, 30 );
SetDamageType( ResistanceType.Poison, 10 );
SetDamageType( ResistanceType.Energy, 30 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 55, 65 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 80.1, 90.0 );
SetSkill( SkillName.Magery, 80.1, 90.0 );
SetSkill( SkillName.Poisoning, 120.1, 130.0 );
SetSkill( SkillName.MagicResist, 70.1, 90.0 );
SetSkill( SkillName.Tactics, 60.1, 80.0 );
SetSkill( SkillName.Wrestling, 80.1, 88.0 );
Fame = 4000;
Karma = -4000;
PackNecroReg( 6, 8 );
switch ( Utility.Random( 10 ))
{
case 0: PackItem( new LeftArm() ); break;
case 1: PackItem( new RightArm() ); break;
case 2: PackItem( new Torso() ); break;
case 3: PackItem( new Bone() ); break;
case 4: PackItem( new RibCage() ); break;
case 5: PackItem( new RibCage() ); break;
case 6: PackItem( new BonePile() ); break;
case 7: PackItem( new BonePile() ); break;
case 8: PackItem( new BonePile() ); break;
case 9: PackItem( new BonePile() ); break;
}
}
public override int GetAngerSound()
{
return 0x518;
}
public override int GetIdleSound()
{
return 0x517;
}
public override int GetAttackSound()
{
return 0x516;
}
public override int GetHurtSound()
{
return 0x519;
}
public override int GetDeathSound()
{
return 0x515;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich, 2 );
AddLoot( LootPack.MedScrolls, 2 );
// TODO: Bone Pile
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Greater; } }
public override Poison HitPoison{ get{ return Poison.Greater; } }
public RevenantLion( 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,121 @@
using System;
using System.Collections;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ronin corpse" )]
public class Ronin : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
[Constructable]
public Ronin() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SpeechHue = Utility.RandomDyedHue();
Hue = Utility.RandomSkinHue();
Name = "a ronin";
Body = (( this.Female = Utility.RandomBool() ) ? Body = 0x191 : Body = 0x190);
Hue = Utility.RandomSkinHue();
SetStr( 326, 375 );
SetDex( 31, 45 );
SetInt( 101, 110 );
SetHits( 301, 400 );
SetMana( 101, 110 );
SetDamage( 17, 25 );
SetDamageType( ResistanceType.Physical, 90 );
SetDamageType( ResistanceType.Poison, 10 );
SetResistance( ResistanceType.Physical, 55, 75 );
SetResistance( ResistanceType.Fire, 40, 60 );
SetResistance( ResistanceType.Cold, 35, 55 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 55, 75 );
SetSkill( SkillName.MagicResist, 42.6, 57.5 );
SetSkill( SkillName.Tactics, 115.1, 130.0 );
SetSkill( SkillName.Wrestling, 92.6, 107.5 );
SetSkill( SkillName.Anatomy, 110.1, 125.0 );
SetSkill( SkillName.Fencing, 92.6, 107.5 );
SetSkill( SkillName.Macing, 92.6, 107.5 );
SetSkill( SkillName.Swords, 92.6, 107.5 );
Fame = 8500;
Karma = -8500;
AddItem( new SamuraiTabi() );
AddItem( new LeatherHiroSode());
AddItem( new LeatherDo());
switch ( Utility.Random( 4 ))
{
case 0: AddItem( new LightPlateJingasa()); break;
case 1: AddItem( new ChainHatsuburi() ); break;
case 2: AddItem( new DecorativePlateKabuto() ); break;
case 3: AddItem( new LeatherJingasa()); break;
}
switch ( Utility.Random( 3 ))
{
case 0: AddItem( new StuddedHaidate()); break;
case 1: AddItem( new LeatherSuneate() ); break;
case 2: AddItem( new PlateSuneate() ); break;
}
if( Utility.RandomDouble() > .2 )
AddItem( new NoDachi() );
else
AddItem( new Halberd() );
PackItem( new Wakizashi() );
PackItem( new Longsword() );
Utility.AssignRandomHair( this );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.DropItem( new BookOfBushido() );
}
// TODO: Bushido abilities
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 2 );
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool BardImmune{ get{ return true; } }
public override bool CanRummageCorpses{ get{ return true; } }
public Ronin( 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();
}
}
}

View file

@ -0,0 +1,240 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a rune beetle corpse" )]
public class RuneBeetle : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public RuneBeetle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a rune beetle";
Body = 244;
SetStr( 401, 460 );
SetDex( 121, 170 );
SetInt( 376, 450 );
SetHits( 301, 360 );
SetDamage( 15, 22 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Poison, 10 );
SetDamageType( ResistanceType.Energy, 70 );
SetResistance( ResistanceType.Physical, 40, 65 );
SetResistance( ResistanceType.Fire, 35, 50 );
SetResistance( ResistanceType.Cold, 35, 50 );
SetResistance( ResistanceType.Poison, 75, 95 );
SetResistance( ResistanceType.Energy, 40, 60 );
SetSkill( SkillName.EvalInt, 100.1, 125.0 );
SetSkill( SkillName.Magery, 100.1, 110.0 );
SetSkill( SkillName.Poisoning, 120.1, 140.0 );
SetSkill( SkillName.MagicResist, 95.1, 110.0 );
SetSkill( SkillName.Tactics, 78.1, 93.0 );
SetSkill( SkillName.Wrestling, 70.1, 77.5 );
Fame = 15000;
Karma = -15000;
if ( Utility.RandomDouble() < .25 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
switch ( Utility.Random( 10 ))
{
case 0: PackItem( new LeftArm() ); break;
case 1: PackItem( new RightArm() ); break;
case 2: PackItem( new Torso() ); break;
case 3: PackItem( new Bone() ); break;
case 4: PackItem( new RibCage() ); break;
case 5: PackItem( new RibCage() ); break;
case 6: PackItem( new BonePile() ); break;
case 7: PackItem( new BonePile() ); break;
case 8: PackItem( new BonePile() ); break;
case 9: PackItem( new BonePile() ); break;
}
Tamable = true;
ControlSlots = 3;
MinTameSkill = 93.9;
}
public override int GetAngerSound()
{
return 0x4E8;
}
public override int GetIdleSound()
{
return 0x4E7;
}
public override int GetAttackSound()
{
return 0x4E6;
}
public override int GetHurtSound()
{
return 0x4E9;
}
public override int GetDeathSound()
{
return 0x4E5;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
AddLoot( LootPack.MedScrolls, 1 );
}
public override Poison PoisonImmune{ get{ return Poison.Greater; } }
public override Poison HitPoison{ get{ return Poison.Greater; } }
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies | FoodType.GrainsAndHay; } }
public override bool CanAngerOnTame { get { return true; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.05 > Utility.RandomDouble() )
{
/* Rune Corruption
* Start cliloc: 1070846 "The creature magically corrupts your armor!"
* Effect: All resistances -70 (lowest 0) for 5 seconds
* End ASCII: "The corruption of your armor has worn off"
*/
ExpireTimer timer = (ExpireTimer)m_Table[defender];
if ( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070845 ); // The creature continues to corrupt your armor!
}
else
defender.SendLocalizedMessage( 1070846 ); // The creature magically corrupts your armor!
List<ResistanceMod> mods = new List<ResistanceMod>();
if ( Core.ML )
{
if ( defender.PhysicalResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Physical, -(defender.PhysicalResistance / 2) ) );
if ( defender.FireResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Fire, -(defender.FireResistance / 2) ) );
if ( defender.ColdResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Cold, -(defender.ColdResistance / 2) ) );
if ( defender.PoisonResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Poison, -(defender.PoisonResistance / 2) ) );
if ( defender.EnergyResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Energy, -(defender.EnergyResistance / 2) ) );
}
else
{
if ( defender.PhysicalResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Physical, (defender.PhysicalResistance > 70) ? -70 : -defender.PhysicalResistance ) );
if ( defender.FireResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Fire, (defender.FireResistance > 70) ? -70 : -defender.FireResistance ) );
if ( defender.ColdResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Cold, (defender.ColdResistance > 70) ? -70 : -defender.ColdResistance ) );
if ( defender.PoisonResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Poison, (defender.PoisonResistance > 70) ? -70 : -defender.PoisonResistance ) );
if ( defender.EnergyResistance > 0 )
mods.Add( new ResistanceMod( ResistanceType.Energy, (defender.EnergyResistance > 70) ? -70 : -defender.EnergyResistance ) );
}
for ( int i = 0; i < mods.Count; ++i )
defender.AddResistanceMod( mods[i] );
defender.FixedEffect( 0x37B9, 10, 5 );
timer = new ExpireTimer( defender, mods, TimeSpan.FromSeconds( 5.0 ) );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private List<ResistanceMod> m_Mods;
public ExpireTimer( Mobile m, List<ResistanceMod> mods, TimeSpan delay ) : base( delay )
{
m_Mobile = m;
m_Mods = mods;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
for ( int i = 0; i < m_Mods.Count; ++i )
m_Mobile.RemoveResistanceMod( m_Mods[i] );
Stop();
m_Table.Remove( m_Mobile );
}
protected override void OnTick()
{
m_Mobile.SendMessage( "The corruption of your armor has worn off" );
DoExpire();
}
}
public RuneBeetle( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if( version < 1 )
{
for ( int i = 0; i < Skills.Length; ++i )
{
Skills[i].Cap = Math.Max( 100.0, Skills[i].Cap * 0.9 );
if ( Skills[i].Base > Skills[i].Cap )
{
Skills[i].Base = Skills[i].Cap;
}
}
}
}
}
}

View file

@ -0,0 +1,193 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a tsuki wolf corpse" )]
public class TsukiWolf : BaseCreature
{
[Constructable]
public TsukiWolf()
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a tsuki wolf";
Body = 250;
switch( Utility.Random( 3 ) )
{
case 0: Hue = Utility.RandomNeutralHue(); break; //No, this really isn't accurate ;->
}
SetStr( 401, 450 );
SetDex( 151, 200 );
SetInt( 66, 76 );
SetHits( 376, 450 );
SetMana( 40 );
SetDamage( 14, 18 );
SetDamageType( ResistanceType.Physical, 90 );
SetDamageType( ResistanceType.Cold, 5 );
SetDamageType( ResistanceType.Energy, 5 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 50, 70 );
SetResistance( ResistanceType.Cold, 50, 70 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 50, 70 );
SetSkill( SkillName.Anatomy, 65.1, 72.0 );
SetSkill( SkillName.MagicResist, 65.1, 70.0 );
SetSkill( SkillName.Tactics, 95.1, 110.0 );
SetSkill( SkillName.Wrestling, 97.6, 107.5 );
Fame = 8500;
Karma = -8500;
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(1) );
switch( Utility.Random( 10 ) )
{
case 0: PackItem( new LeftArm() ); break;
case 1: PackItem( new RightArm() ); break;
case 2: PackItem( new Torso() ); break;
case 3: PackItem( new Bone() ); break;
case 4: PackItem( new RibCage() ); break;
case 5: PackItem( new RibCage() ); break;
case 6: PackItem( new BonePile() ); break;
case 7: PackItem( new BonePile() ); break;
case 8: PackItem( new BonePile() ); break;
case 9: PackItem( new BonePile() ); break;
}
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Rich );
}
public override int Meat { get { return 4; } }
public override int Hides { get { return 25; } }
public override FoodType FavoriteFood { get { return FoodType.Meat; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if( 0.1 > Utility.RandomDouble() )
{
/* Blood Bath
* Start cliloc 1070826
* Sound: 0x52B
* 2-3 blood spots
* Damage: 2 hps per second for 5 seconds
* End cliloc: 1070824
*/
ExpireTimer timer = (ExpireTimer)m_Table[defender];
if( timer != null )
{
timer.DoExpire();
defender.SendLocalizedMessage( 1070825 ); // The creature continues to rage!
}
else
defender.SendLocalizedMessage( 1070826 ); // The creature goes into a rage, inflicting heavy damage!
timer = new ExpireTimer( defender, this );
timer.Start();
m_Table[defender] = timer;
}
}
private static Hashtable m_Table = new Hashtable();
private class ExpireTimer : Timer
{
private Mobile m_Mobile;
private Mobile m_From;
private int m_Count;
public ExpireTimer( Mobile m, Mobile from )
: base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_Mobile = m;
m_From = from;
Priority = TimerPriority.TwoFiftyMS;
}
public void DoExpire()
{
Stop();
m_Table.Remove( m_Mobile );
}
public void DrainLife()
{
if( m_Mobile.Alive )
m_Mobile.Damage( 2, m_From );
else
DoExpire();
}
protected override void OnTick()
{
DrainLife();
if( ++m_Count >= 5 )
{
DoExpire();
m_Mobile.SendLocalizedMessage( 1070824 ); // The creature's rage subsides.
}
}
}
public TsukiWolf( 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();
}
public override int GetAngerSound()
{
return 0x52D;
}
public override int GetIdleSound()
{
return 0x52C;
}
public override int GetAttackSound()
{
return 0x52B;
}
public override int GetHurtSound()
{
return 0x52E;
}
public override int GetDeathSound()
{
return 0x52A;
}
}
}

View file

@ -0,0 +1,185 @@
using System;
using System.Collections;
using Server.Items;
namespace Server.Mobiles
{
[TypeAlias( "Server.Mobiles.Yamadon" )]
[CorpseName( "a yamandon corpse" )]
public class Yamandon : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.DoubleStrike;
}
[Constructable]
public Yamandon() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a yamandon";
Body = 249;
SetStr( 786, 930 );
SetDex( 251, 365 );
SetInt( 101, 115 );
SetHits( 1601, 1800 );
SetDamage( 19, 35 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 20 );
SetDamageType( ResistanceType.Energy, 10 );
SetResistance( ResistanceType.Physical, 65, 85 );
SetResistance( ResistanceType.Fire, 70, 90 );
SetResistance( ResistanceType.Cold, 50, 70 );
SetResistance( ResistanceType.Poison, 50, 70 );
SetResistance( ResistanceType.Energy, 50, 70 );
SetSkill( SkillName.Anatomy, 115.1, 130.0 );
SetSkill( SkillName.MagicResist, 117.6, 132.5 );
SetSkill( SkillName.Poisoning, 120.1, 140.0 );
SetSkill( SkillName.Tactics, 117.1, 132.0 );
SetSkill( SkillName.Wrestling, 112.6, 132.5 );
Fame = 22000;
Karma = -22000;
if ( Utility.RandomDouble() < .50 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
PackItem( new Eggs( 2 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich );
AddLoot( LootPack.FilthyRich, 2 );
AddLoot( LootPack.Gems, 6 );
}
public override bool ReacquireOnMovement{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Utility.RandomBool() ? Poison.Deadly : Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 5; } }
public override int Hides{ get{ return 20; } }
public override void OnDamagedBySpell( Mobile attacker )
{
base.OnDamagedBySpell( attacker );
DoCounter( attacker );
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
DoCounter( attacker );
}
private void DoCounter( Mobile attacker )
{
if( this.Map == null )
return;
if ( attacker is BaseCreature && ((BaseCreature)attacker).BardProvoked )
return;
if ( 0.2 > Utility.RandomDouble() )
{
/* Counterattack with Hit Poison Area
* 20-25 damage, unresistable
* Lethal poison, 100% of the time
* Particle effect: Type: "2" From: "0x4061A107" To: "0x0" ItemId: "0x36BD" ItemIdName: "explosion" FromLocation: "(296 615, 17)" ToLocation: "(296 615, 17)" Speed: "1" Duration: "10" FixedDirection: "True" Explode: "False" Hue: "0xA6" RenderMode: "0x0" Effect: "0x1F78" ExplodeEffect: "0x1" ExplodeSound: "0x0" Serial: "0x4061A107" Layer: "255" Unknown: "0x0"
* Doesn't work on provoked monsters
*/
Mobile target = null;
if ( attacker is BaseCreature )
{
Mobile m = ((BaseCreature)attacker).GetMaster();
if( m != null )
target = m;
}
if ( target == null || !target.InRange( this, 18 ) )
target = attacker;
this.Animate( 10, 4, 1, true, false, 0 );
ArrayList targets = new ArrayList();
foreach ( Mobile m in target.GetMobilesInRange( 8 ) )
{
if ( m == this || !CanBeHarmful( m ) )
continue;
if ( m is BaseCreature && (((BaseCreature)m).Controlled || ((BaseCreature)m).Summoned || ((BaseCreature)m).Team != this.Team) )
targets.Add( m );
else if ( m.Player && m.Alive )
targets.Add( m );
}
for ( int i = 0; i < targets.Count; ++i )
{
Mobile m = (Mobile)targets[i];
DoHarmful( m );
AOS.Damage( m, this, Utility.RandomMinMax( 20, 25 ), true, 0, 0, 0, 100, 0 );
m.FixedParticles( 0x36BD, 1, 10, 0x1F78, 0xA6, 0, (EffectLayer)255 );
m.ApplyPoison( this, Poison.Lethal );
}
}
}
public override int GetAttackSound()
{
return 1260;
}
public override int GetAngerSound()
{
return 1262;
}
public override int GetDeathSound()
{
return 1259; //Other Death sound is 1258... One for Yamadon, one for Serado?
}
public override int GetHurtSound()
{
return 1263;
}
public override int GetIdleSound()
{
return 1261;
}
public Yamandon( 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,142 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "a wrinkly yomotsu corpse" )]
public class YomotsuElder : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.DoubleStrike;
}
[Constructable]
public YomotsuElder() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a yomotsu elder";
Body = 255;
BaseSoundID = 0x452;
SetStr( 686, 830 );
SetDex( 251, 365 );
SetInt( 17, 31 );
SetHits( 801, 900 );
SetDamage( 19, 27 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 85 );
SetResistance( ResistanceType.Fire, 30, 50 );
SetResistance( ResistanceType.Cold, 45, 65 );
SetResistance( ResistanceType.Poison, 35, 55 );
SetResistance( ResistanceType.Energy, 25, 50 );
SetSkill( SkillName.Anatomy, 115.1, 130.0 );
SetSkill( SkillName.MagicResist, 100.1, 120.0 );
SetSkill( SkillName.Tactics, 115.1, 130.0 );
SetSkill( SkillName.Wrestling, 110.1, 130.0 );
Fame = 12000;
Karma = -12000;
PackItem( new GreenGourd() );
PackItem( new ExecutionersAxe() );
switch ( Utility.Random( 3 ) )
{
case 0: PackItem( new LongPants() ); break;
case 1: PackItem( new ShortPants() ); break;
}
switch ( Utility.Random( 6 ) )
{
case 0: PackItem( new Shoes() ); break;
case 1: PackItem( new Sandals() ); break;
case 2: PackItem( new Boots() ); break;
case 3: PackItem( new ThighBoots() ); break;
}
if ( Utility.RandomDouble() < .25 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
}
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
public override int Meat{ get{ return 1; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 3 );
AddLoot( LootPack.Gems, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 5; } }
// TODO: Axe Throw
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 > Utility.RandomDouble() )
{
/* Maniacal laugh
* Cliloc: 1070840
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(884 715, 10)" ToLocation: "(884 715, 10)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
* Paralyzes for 4 seconds, or until hit
*/
defender.FixedEffect( 0x37B9, 10, 5 );
defender.SendLocalizedMessage( 1070840 ); // You are frozen as the creature laughs maniacally.
defender.Paralyze( TimeSpan.FromSeconds( 4.0 ) );
}
}
public YomotsuElder( 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();
}
public override int GetIdleSound()
{
return 0x42A;
}
public override int GetAttackSound()
{
return 0x435;
}
public override int GetHurtSound()
{
return 0x436;
}
public override int GetDeathSound()
{
return 0x43A;
}
}
}

View file

@ -0,0 +1,142 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a glowing yomotsu corpse" )]
public class YomotsuPriest : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.DoubleStrike;
}
[Constructable]
public YomotsuPriest() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a yomotsu priest";
Body = 253;
BaseSoundID = 0x452;
SetStr( 486, 530 );
SetDex( 101, 115 );
SetInt( 601, 670 );
SetHits( 486, 530 );
SetDamage( 8, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 85 );
SetResistance( ResistanceType.Fire, 30, 50 );
SetResistance( ResistanceType.Cold, 45, 65 );
SetResistance( ResistanceType.Poison, 35, 55 );
SetResistance( ResistanceType.Energy, 25, 50 );
SetSkill( SkillName.EvalInt, 92.6, 107.5 );
SetSkill( SkillName.Magery, 105.1, 115.0 );
SetSkill( SkillName.Meditation, 100.1, 110.0 );
SetSkill( SkillName.MagicResist, 112.6, 122.5 );
SetSkill( SkillName.Tactics, 55.1, 105.0 );
SetSkill( SkillName.Wrestling, 47.6, 57.5 );
Fame = 9000;
Karma = -9000;
PackItem( new GreenGourd() );
PackItem( new ExecutionersAxe() );
switch ( Utility.Random( 3 ) )
{
case 0: PackItem( new LongPants() ); break;
case 1: PackItem( new ShortPants() ); break;
}
switch ( Utility.Random( 6 ) )
{
case 0: PackItem( new Shoes() ); break;
case 1: PackItem( new Sandals() ); break;
case 2: PackItem( new Boots() ); break;
case 3: PackItem( new ThighBoots() ); break;
}
if ( Utility.RandomDouble() < .25 ) PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
}
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
public override int Meat{ get{ return 1; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 4);
}
public override bool CanRummageCorpses{ get{ return true; } }
// TODO: Body Transformation
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 > Utility.RandomDouble() )
{
/* Maniacal laugh
* Cliloc: 1070840
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(884 715, 10)" ToLocation: "(884 715, 10)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
* Paralyzes for 4 seconds, or until hit
*/
defender.FixedEffect( 0x37B9, 10, 5 );
defender.SendLocalizedMessage( 1070840 ); // You are frozen as the creature laughs maniacally.
defender.Paralyze( TimeSpan.FromSeconds( 4.0 ) );
}
}
public YomotsuPriest( 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();
}
public override int GetIdleSound()
{
return 0x42A;
}
public override int GetAttackSound()
{
return 0x435;
}
public override int GetHurtSound()
{
return 0x436;
}
public override int GetDeathSound()
{
return 0x43A;
}
}
}

View file

@ -0,0 +1,139 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a yomotsu corpse" )]
public class YomotsuWarrior : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.DoubleStrike;
}
[Constructable]
public YomotsuWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a yomotsu warrior";
Body = 245;
BaseSoundID = 0x452;
SetStr( 486, 530 );
SetDex( 151, 165 );
SetInt( 17, 31 );
SetHits( 486, 530 );
SetMana( 17, 31 );
SetDamage( 8, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 65, 85 );
SetResistance( ResistanceType.Fire, 30, 50 );
SetResistance( ResistanceType.Cold, 45, 65 );
SetResistance( ResistanceType.Poison, 35, 55 );
SetResistance( ResistanceType.Energy, 25, 50 );
SetSkill( SkillName.Anatomy, 85.1, 95.0 );
SetSkill( SkillName.MagicResist, 82.6, 90.5 );
SetSkill( SkillName.Tactics, 95.1, 105.0 );
SetSkill( SkillName.Wrestling, 97.6, 107.5 );
Fame = 4200;
Karma = -4200;
PackItem( new GreenGourd() );
PackItem( new ExecutionersAxe() );
if( Utility.RandomBool() )
PackItem( new LongPants() );
else
PackItem( new ShortPants() );
switch ( Utility.Random( 4 ) )
{
case 0: PackItem( new Shoes() ); break;
case 1: PackItem( new Sandals() ); break;
case 2: PackItem( new Boots() ); break;
case 3: PackItem( new ThighBoots() ); break;
}
if ( Utility.RandomDouble() < .25 )
PackItem( Engines.Plants.Seed.RandomBonsaiSeed() );
}
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
public override int Meat{ get{ return 1; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Rich, 2 );
AddLoot( LootPack.Gems,2);
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 3; } }
// TODO: Throwing Dagger
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 > Utility.RandomDouble() )
{
/* Maniacal laugh
* Cliloc: 1070840
* Effect: Type: "3" From: "0x57D4F5B" To: "0x0" ItemId: "0x37B9" ItemIdName: "glow" FromLocation: "(884 715, 10)" ToLocation: "(884 715, 10)" Speed: "10" Duration: "5" FixedDirection: "True" Explode: "False"
* Paralyzes for 4 seconds, or until hit
*/
defender.FixedEffect( 0x37B9, 10, 5 );
defender.SendLocalizedMessage( 1070840 ); // You are frozen as the creature laughs maniacally.
defender.Paralyze( TimeSpan.FromSeconds( 4.0 ) );
}
}
public YomotsuWarrior( 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();
}
public override int GetIdleSound()
{
return 0x42A;
}
public override int GetAttackSound()
{
return 0x435;
}
public override int GetHurtSound()
{
return 0x436;
}
public override int GetDeathSound()
{
return 0x43A;
}
}
}