ModernUO/Projects/UOContent/Skills/AnimalLore.cs
Kamron Batman 974062b0d4
feat: Adds leather/metal food, fixes weapons/armors with wrong materials (#1718)
### Summary
- Fixes the name `Vegies` to `Veggies`
- Adds feeding leather to goats
- Adds metal for Lava Lizards
- Fixes Bone Helm being classified as plate instead of bone.
- Fixes wooden shields not classified as wood.

### Note
On OSI, the preferred foods on the animal lore gump doesn't contain all possible favorite food categories. Furthermore, the one listed is not necessarily always the "first" in the list of possible categories. We aren't going to try and fix that since it isn't important.
2024-04-04 19:43:02 -07:00

427 lines
15 KiB
C#

using System;
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
using Server.Targeting;
namespace Server.SkillHandlers
{
public static class AnimalLore
{
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.AnimalLore].Callback = OnUse;
}
public static TimeSpan OnUse(Mobile m)
{
m.Target = new InternalTarget();
m.SendLocalizedMessage(500328); // What animal should I look at?
return TimeSpan.FromSeconds(1.0);
}
private class InternalTarget : Target
{
public InternalTarget() : base(8, false, TargetFlags.None)
{
}
protected override void OnTarget(Mobile from, object targeted)
{
if (!from.Alive)
{
from.SendLocalizedMessage(500331); // The spirits of the dead are not the province of animal lore.
}
else if (targeted is not BaseCreature c)
{
from.SendLocalizedMessage(500329); // That's not an animal!
}
else if (c.IsDeadPet)
{
from.SendLocalizedMessage(500331); // The spirits of the dead are not the province of animal lore.
}
else if (!c.Body.IsAnimal && c.Body is { IsMonster: false, IsSea: false })
{
from.SendLocalizedMessage(500329); // That's not an animal!
}
else if (!c.Controlled && from.Skills.AnimalLore.Value < 100.0)
{
// At your skill level, you can only lore tamed creatures.
from.SendLocalizedMessage(1049674);
}
else if (!c.Controlled && !c.Tamable && from.Skills.AnimalLore.Value < 110.0)
{
// At your skill level, you can only lore tamed or tameable creatures.
from.SendLocalizedMessage(1049675);
}
else if (!from.CheckTargetSkill(SkillName.AnimalLore, c, 0.0, 120.0))
{
from.SendLocalizedMessage(500334); // You can't think of anything you know offhand.
}
else
{
from.CloseGump<AnimalLoreGump>();
from.SendGump(new AnimalLoreGump(c));
}
}
}
}
public class AnimalLoreGump : Gump
{
private const int LabelColor = 0x24E5;
public AnimalLoreGump(BaseCreature c) : base(250, 50)
{
AddPage(0);
AddImage(100, 100, 2080);
AddImage(118, 137, 2081);
AddImage(118, 207, 2081);
AddImage(118, 277, 2081);
AddImage(118, 347, 2083);
AddHtml(147, 108, 210, 18, $"<center><i>{c.Name}</i></center>");
AddButton(240, 77, 2093, 2093, 2);
AddImage(140, 138, 2091);
AddImage(140, 335, 2091);
var pages = Core.AOS ? 5 : 3;
var page = 0;
AddPage(++page);
AddImage(128, 152, 2086);
AddHtmlLocalized(147, 150, 160, 18, 1049593, 200); // Attributes
AddHtmlLocalized(153, 168, 160, 18, 1049578, LabelColor); // Hits
AddHtml(280, 168, 75, 18, FormatAttributes(c.Hits, c.HitsMax));
AddHtmlLocalized(153, 186, 160, 18, 1049579, LabelColor); // Stamina
AddHtml(280, 186, 75, 18, FormatAttributes(c.Stam, c.StamMax));
AddHtmlLocalized(153, 204, 160, 18, 1049580, LabelColor); // Mana
AddHtml(280, 204, 75, 18, FormatAttributes(c.Mana, c.ManaMax));
AddHtmlLocalized(153, 222, 160, 18, 1028335, LabelColor); // Strength
AddHtml(320, 222, 35, 18, FormatStat(c.Str));
AddHtmlLocalized(153, 240, 160, 18, 3000113, LabelColor); // Dexterity
AddHtml(320, 240, 35, 18, FormatStat(c.Dex));
AddHtmlLocalized(153, 258, 160, 18, 3000112, LabelColor); // Intelligence
AddHtml(320, 258, 35, 18, FormatStat(c.Int));
if (Core.AOS)
{
var y = 276;
if (Core.SE)
{
var bd = BaseInstrument.GetBaseDifficulty(c);
if (c.Uncalmable)
{
bd = 0;
}
AddHtmlLocalized(153, 276, 160, 18, 1070793, LabelColor); // Barding Difficulty
AddHtml(320, y, 35, 18, FormatDouble(bd));
y += 18;
}
AddImage(128, y + 2, 2086);
AddHtmlLocalized(147, y, 160, 18, 1049594, 200); // Loyalty Rating
y += 18;
AddHtmlLocalized(
153,
y,
160,
18,
!c.Controlled || c.Loyalty == 0 ? 1061643 : 1049595 + c.Loyalty / 10,
LabelColor
);
}
else
{
AddImage(128, 278, 2086);
AddHtmlLocalized(147, 276, 160, 18, 3001016, 200); // Miscellaneous
AddHtmlLocalized(153, 294, 160, 18, 1049581, LabelColor); // Armor Rating
AddHtml(320, 294, 35, 18, FormatStat(c.VirtualArmor));
}
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, pages);
if (Core.AOS)
{
AddPage(++page);
AddImage(128, 152, 2086);
AddHtmlLocalized(147, 150, 160, 18, 1061645, 200); // Resistances
AddHtmlLocalized(153, 168, 160, 18, 1061646, LabelColor); // Physical
AddHtml(320, 168, 35, 18, FormatElement(c.PhysicalResistance));
AddHtmlLocalized(153, 186, 160, 18, 1061647, LabelColor); // Fire
AddHtml(320, 186, 35, 18, FormatElement(c.FireResistance, "#FF0000"));
AddHtmlLocalized(153, 204, 160, 18, 1061648, LabelColor); // Cold
AddHtml(320, 204, 35, 18, FormatElement(c.ColdResistance, "#000080"));
AddHtmlLocalized(153, 222, 160, 18, 1061649, LabelColor); // Poison
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonResistance, "#008000"));
AddHtmlLocalized(153, 240, 160, 18, 1061650, LabelColor); // Energy
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyResistance, "#BF80FF"));
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
AddPage(++page);
AddImage(128, 152, 2086);
AddHtmlLocalized(147, 150, 160, 18, 1017319, 200); // Damage
AddHtmlLocalized(153, 168, 160, 18, 1061646, LabelColor); // Physical
AddHtml(320, 168, 35, 18, FormatElement(c.PhysicalDamage));
AddHtmlLocalized(153, 186, 160, 18, 1061647, LabelColor); // Fire
AddHtml(320, 186, 35, 18, FormatElement(c.FireDamage, "#FF0000"));
AddHtmlLocalized(153, 204, 160, 18, 1061648, LabelColor); // Cold
AddHtml(320, 204, 35, 18, FormatElement(c.ColdDamage, "#000080"));
AddHtmlLocalized(153, 222, 160, 18, 1061649, LabelColor); // Poison
AddHtml(320, 222, 35, 18, FormatElement(c.PoisonDamage, "#008000"));
AddHtmlLocalized(153, 240, 160, 18, 1061650, LabelColor); // Energy
AddHtml(320, 240, 35, 18, FormatElement(c.EnergyDamage, "#BF80FF"));
if (Core.ML)
{
AddHtmlLocalized(153, 258, 160, 18, 1076750, LabelColor); // Base Damage
AddHtml(300, 258, 55, 18, FormatDamage(c.DamageMin, c.DamageMax));
}
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
}
AddPage(++page);
AddImage(128, 152, 2086);
AddHtmlLocalized(147, 150, 160, 18, 3001030, 200); // Combat Ratings
AddHtmlLocalized(153, 168, 160, 18, 1044103, LabelColor); // Wrestling
AddHtml(320, 168, 35, 18, FormatSkill(c, SkillName.Wrestling));
AddHtmlLocalized(153, 186, 160, 18, 1044087, LabelColor); // Tactics
AddHtml(320, 186, 35, 18, FormatSkill(c, SkillName.Tactics));
AddHtmlLocalized(153, 204, 160, 18, 1044086, LabelColor); // Magic Resistance
AddHtml(320, 204, 35, 18, FormatSkill(c, SkillName.MagicResist));
AddHtmlLocalized(153, 222, 160, 18, 1044061, LabelColor); // Anatomy
AddHtml(320, 222, 35, 18, FormatSkill(c, SkillName.Anatomy));
if (c is CuSidhe)
{
AddHtmlLocalized(153, 240, 160, 18, 1044077, LabelColor); // Healing
AddHtml(320, 240, 35, 18, FormatSkill(c, SkillName.Healing));
}
else
{
AddHtmlLocalized(153, 240, 160, 18, 1044090, LabelColor); // Poisoning
AddHtml(320, 240, 35, 18, FormatSkill(c, SkillName.Poisoning));
}
// TODO: Add remaining combat skills
AddImage(128, 260, 2086);
AddHtmlLocalized(147, 258, 160, 18, 3001032, 200); // Lore & Knowledge
AddHtmlLocalized(153, 276, 160, 18, 1044085, LabelColor); // Magery
AddHtml(320, 276, 35, 18, FormatSkill(c, SkillName.Magery));
AddHtmlLocalized(153, 294, 160, 18, 1044076, LabelColor); // Evaluating Intelligence
AddHtml(320, 294, 35, 18, FormatSkill(c, SkillName.EvalInt));
AddHtmlLocalized(153, 312, 160, 18, 1044106, LabelColor); // Meditation
AddHtml(320, 312, 35, 18, FormatSkill(c, SkillName.Meditation));
// TODO: Add remaining skills
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
AddPage(++page);
AddImage(128, 152, 2086);
AddHtmlLocalized(147, 150, 160, 18, 1049563, 200); // Preferred Foods
var foodPref = 3000340;
if ((c.FavoriteFood & FoodType.Meat) != 0)
{
foodPref = 1049564; // Meat
}
else if ((c.FavoriteFood & FoodType.FruitsAndVeggies) != 0)
{
foodPref = 1049565; // Fruits and Vegetables
}
else if ((c.FavoriteFood & FoodType.GrainsAndHay) != 0)
{
foodPref = 1049566; // Grains and Hay
}
else if ((c.FavoriteFood & FoodType.Fish) != 0)
{
foodPref = 1049568; // Fish
}
else if ((c.FavoriteFood & FoodType.Metal) != 0)
{
foodPref = 1049567; // Metal
}
else if ((c.FavoriteFood & FoodType.Eggs) != 0)
{
foodPref = 1044477; // Eggs
}
// TODO: Add 1115752 "Blackrock Stew" as a food type
AddHtmlLocalized(153, 168, 160, 18, foodPref, LabelColor);
AddImage(128, 188, 2086);
AddHtmlLocalized(147, 186, 160, 18, 1049569, 200); // Pack Instincts
var packInstinct = 3000340;
if ((c.PackInstinct & PackInstinct.Canine) != 0)
{
packInstinct = 1049570; // Canine
}
else if ((c.PackInstinct & PackInstinct.Ostard) != 0)
{
packInstinct = 1049571; // Ostard
}
else if ((c.PackInstinct & PackInstinct.Feline) != 0)
{
packInstinct = 1049572; // Feline
}
else if ((c.PackInstinct & PackInstinct.Arachnid) != 0)
{
packInstinct = 1049573; // Arachnid
}
else if ((c.PackInstinct & PackInstinct.Daemon) != 0)
{
packInstinct = 1049574; // Daemon
}
else if ((c.PackInstinct & PackInstinct.Bear) != 0)
{
packInstinct = 1049575; // Bear
}
else if ((c.PackInstinct & PackInstinct.Equine) != 0)
{
packInstinct = 1049576; // Equine
}
else if ((c.PackInstinct & PackInstinct.Bull) != 0)
{
packInstinct = 1049577; // Bull
}
AddHtmlLocalized(153, 204, 160, 18, packInstinct, LabelColor);
// TODO: Add Pet Slots
// TODO: Add Abilities
if (!Core.AOS)
{
AddImage(128, 224, 2086);
AddHtmlLocalized(147, 222, 160, 18, 1049594, 200); // Loyalty Rating
AddHtmlLocalized(
153,
240,
160,
18,
!c.Controlled || c.Loyalty == 0 ? 1061643 : 1049595 + c.Loyalty / 10,
LabelColor
);
}
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
}
private static string FormatSkill(BaseCreature c, SkillName name)
{
var skill = c.Skills[name];
if (skill.Base < 10.0)
{
return "<div align=right>---</div>";
}
return $"<div align=right>{skill.Value:F1}</div>";
}
private static string FormatAttributes(int cur, int max)
{
if (max == 0)
{
return "<div align=right>---</div>";
}
return $"<div align=right>{cur}/{max}</div>";
}
private static string FormatStat(int val)
{
if (val == 0)
{
return "<div align=right>---</div>";
}
return $"<div align=right>{val}</div>";
}
private static string FormatDouble(double val)
{
if (val == 0)
{
return "<div align=right>---</div>";
}
return $"<div align=right>{val:F1}</div>";
}
private static string FormatElement(int val, string color = null)
{
if (color == null)
{
return val == 0 ? "<div align=right>---</div>" : $"<div align=right>{val}%</div>";
}
return val == 0
? $"<BASEFONT COLOR={color}><div align=right>---</div>"
: $"<BASEFONT COLOR={color}><div align=right>{val}%</div>";
}
private static string FormatDamage(int min, int max)
{
if (min <= 0 || max <= 0)
{
return "<div align=right>---</div>";
}
return $"<div align=right>{min}-{max}</div>";
}
}
}