using ModernUO.Serialization; using System; using System.Collections.Generic; namespace Server.Mobiles { [SerializationGenerator(0, false)] public partial class KazeKemono : BaseCreature { private static readonly Dictionary m_FlurryOfTwigsTable = new(); private static readonly Dictionary m_ChlorophylBlastTable = new(); [Constructible] public KazeKemono() : base(AIType.AI_Mage) { 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 string CorpseName => "a kaze kemono corpse"; public override string DefaultName => "a kaze kemono"; public override bool BleedImmune => true; public override void GenerateLoot() { AddLoot(LootPack.Rich, 3); } public override void OnGaveMeleeAttack(Mobile defender, int damage) { base.OnGaveMeleeAttack(defender, damage); if (Utility.RandomDouble() < 0.1) { /* 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" */ if (m_FlurryOfTwigsTable.Remove(defender, out var timer)) { timer.DoExpire(); defender.SendLocalizedMessage(1070851); // The creature lands another blow in your weakened state. } else { // The creature's flurry of twigs has made you more susceptible to physical attacks! defender.SendLocalizedMessage(1070850); } var effect = -(defender.PhysicalResistance * 15 / 100); var mod = new ResistanceMod(ResistanceType.Physical, "PhysicalResistFlurryOfTwigs", 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; return; } if (Utility.RandomDouble() < 0.05) { /* Chlorophyll 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" */ if (m_ChlorophylBlastTable.TryGetValue(defender, out var timer)) { timer.DoExpire(); defender.SendLocalizedMessage(1070828); // The creature continues to hinder your energy resistance! } else { // The creature's attack has made you more susceptible to energy attacks! defender.SendLocalizedMessage(1070827); } var effect = -(defender.EnergyResistance / 2); var mod = new ResistanceMod(ResistanceType.Energy, "EnergyResistChlorophyllBlast", 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 class ExpireTimer : Timer { private readonly Mobile m_Mobile; private readonly ResistanceMod m_Mod; private readonly Dictionary m_Table; public ExpireTimer(Mobile m, ResistanceMod mod, Dictionary table, TimeSpan delay) : base(delay) { m_Mobile = m; m_Mod = mod; m_Table = table; } public void DoExpire() { m_Mobile.RemoveResistanceMod(m_Mod); Stop(); } 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(); m_Table.Remove(m_Mobile); } } } }