Files
abysmal-isle/Scripts/Services/MondainsLegacyQuests/BaseReward.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

346 lines
8.6 KiB
C#

#region References
using System;
using Server.Engines.Craft;
using Server.Items;
#endregion
namespace Server.Engines.Quests
{
public class BaseReward
{
private static readonly int[] m_SatchelHues = new[]
{0x1C, 0x37, 0x71, 0x3A, 0x62, 0x44, 0x59, 0x13, 0x21, 0x3, 0xD, 0x3F,}; // TODO update
private static readonly int[] m_RewardBagHues = new[]
{
// from, to,
0x385, 0x3E9, 0x4B0, 0x4E6, 0x514, 0x54A, 0x578, 0x5AE, 0x5DC, 0x612, 0x640, 0x676, 0x6A5, 0x6DA, 0x708, 0x774
};
public BaseReward(object name)
: this(null, 1, name)
{ }
public BaseReward(Type type, object name)
: this(type, 1, name)
{ }
public BaseReward(Type type, int amount, object name)
{
Type = type;
Amount = amount;
Name = name;
}
public BaseQuest Quest { get; set; }
public Type Type { get; set; }
public int Amount { get; set; }
public object Name { get; set; }
public static int SatchelHue()
{
return m_SatchelHues[Utility.Random(m_SatchelHues.Length)];
}
public static int RewardBagHue()
{
if (Utility.RandomDouble() < 0.005)
{
return 0;
}
int row = Utility.Random(m_RewardBagHues.Length / 2) * 2;
return Utility.RandomMinMax(m_RewardBagHues[row], m_RewardBagHues[row + 1]);
}
public static int StrongboxHue()
{
return Utility.RandomMinMax(0x898, 0x8B0);
}
public static void ApplyMods(Item item)
{
if (item != null)
{
if (Core.SA && RandomItemGenerator.Enabled)
{
RunicReforging.GenerateRandomItem(item, 0, 10, 850);
}
else
{
int attributeCount = Utility.RandomMinMax(1, 5);
if(item is BaseJewel)
BaseRunicTool.ApplyAttributesTo((BaseJewel)item, false, 0, attributeCount, 10, 100);
else if (item is BaseWeapon)
BaseRunicTool.ApplyAttributesTo((BaseWeapon)item, false, 0, attributeCount, 10, 100);
else if (item is BaseRanged)
BaseRunicTool.ApplyAttributesTo((BaseRanged)item, false, 0, attributeCount, 10, 100);
else if (item is BaseArmor)
BaseRunicTool.ApplyAttributesTo((BaseArmor)item, false, 0, attributeCount, 10, 100);
}
}
}
public static Item Jewlery()
{
BaseJewel item = Loot.RandomJewelry();
ApplyMods(item);
return item;
}
public static Item FletcherRecipe()
{
return GetRecipe(Enum.GetValues(typeof(BowRecipes)));
}
public static Item FletcherRunic()
{
var ran = Utility.RandomDouble();
if (Core.HS)
{
if (ran <= 0.0001)
{
return new RunicFletcherTool(CraftResource.Heartwood, 15);
}
else if (ran <= 0.0005)
{
return new RunicFletcherTool(CraftResource.YewWood, 25);
}
else if (ran <= 0.0025)
{
return new RunicFletcherTool(CraftResource.AshWood, 35);
}
else if (ran <= 0.005)
{
return new RunicFletcherTool(CraftResource.OakWood, 45);
}
}
else if (ran <= 0.01)
{
switch (Utility.Random(4))
{
case 0:
return new RunicFletcherTool(CraftResource.OakWood, 45);
case 1:
return new RunicFletcherTool(CraftResource.AshWood, 35);
case 2:
return new RunicFletcherTool(CraftResource.YewWood, 25);
case 3:
return new RunicFletcherTool(CraftResource.Heartwood, 15);
}
}
return null;
}
public static Item RangedWeapon()
{
BaseWeapon item = Loot.RandomRangedWeapon(false, true);
ApplyMods(item);
return item;
}
public static Item TailorRecipe()
{
return GetRecipe(new int[] { 501, 502, 503, 504, 505, 550, 551, 552 });
}
public static Item Armor()
{
BaseArmor item = Loot.RandomArmor(false, true);
ApplyMods(item);
return item;
}
public static Item SmithRecipe()
{
return GetRecipe(new int[] { 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 350, 351, 352, 353, 354 });
}
public static Item Weapon()
{
BaseWeapon item = Loot.RandomWeapon(false, true);
ApplyMods(item);
return item;
}
public static Item TinkerRecipe()
{
RecipeScroll recipe = null;
if (0.01 > Utility.RandomDouble())
{
recipe = new RecipeScroll(Utility.RandomList(450, 451, 452, 453));
}
return recipe;
}
public static Item AlchemyRecipe()
{
RecipeScroll recipes;
if (Core.TOL)
{
recipes = GetRecipe(new int[] { 400, 401, 402 });
}
else
{
recipes = GetRecipe(new int[] { 400, 401, 402, 454 });
}
return recipes;
}
public static Item CarpentryRecipe()
{
int[] array = new int[24];
for (int i = 0; i <= 20; i++)
{
array[i] = 100 + i;
}
array[21] = 150;
array[22] = 151;
array[23] = 152;
return GetRecipe(array);
}
public static Item CarpenterRunic()
{
var ran = Utility.RandomDouble();
if (Core.HS)
{
if (ran <= 0.0001)
{
return new RunicDovetailSaw(CraftResource.Heartwood, 15);
}
else if (ran <= 0.0005)
{
return new RunicDovetailSaw(CraftResource.YewWood, 25);
}
else if (ran <= 0.0025)
{
return new RunicDovetailSaw(CraftResource.AshWood, 35);
}
else if (ran <= 0.005)
{
return new RunicDovetailSaw(CraftResource.OakWood, 45);
}
}
else if (ran <= 0.01)
{
switch (Utility.Random(4))
{
case 0:
return new RunicDovetailSaw(CraftResource.OakWood, 45);
case 1:
return new RunicDovetailSaw(CraftResource.AshWood, 35);
case 2:
return new RunicDovetailSaw(CraftResource.YewWood, 25);
case 3:
return new RunicDovetailSaw(CraftResource.Heartwood, 15);
}
}
return null;
}
public static Item RandomFurniture()
{
if (0.005 >= Utility.RandomDouble())
{
return Loot.Construct(ElvishFurniture);
}
return null;
}
public static Type[] ElvishFurniture =
{
typeof(WarriorStatueSouthDeed),
typeof(WarriorStatueEastDeed),
typeof(SquirrelStatueSouthDeed),
typeof(SquirrelStatueEastDeed),
typeof(ElvenDresserSouthDeed),
typeof(ElvenDresserEastDeed),
typeof(TallElvenBedSouthDeed),
typeof(TallElvenBedEastDeed),
typeof(StoneAnvilSouthDeed),
typeof(StoneAnvilEastDeed),
typeof(OrnateElvenChestEastDeed)
};
public static Item CookRecipe()
{
return GetRecipe(Enum.GetValues(typeof(CookRecipes)));
}
public static RecipeScroll GetRecipe(Array list)
{
var recipes = new int[list.Length];
int index = 0;
int mid = -1;
foreach (int i in list)
{
int val = i - (i / 100) * 100;
if (val >= 50 && mid == -1)
{
mid = index;
}
recipes[index] = i;
index += 1;
}
if (list.Length == 0) // empty list
{
return null;
}
var ran = Utility.RandomDouble();
if (mid == -1 && ran <= 0.33) // only lesser recipes in list
{
return new RecipeScroll(recipes[Utility.Random(list.Length)]);
}
else if (mid == 0 && ran <= 0.01) // only greater recipes in list
{
return new RecipeScroll(recipes[Utility.Random(list.Length)]);
}
else
{
if (ran <= 0.01)
{
return new RecipeScroll(recipes[Utility.RandomMinMax(mid, list.Length - 1)]);
}
else if (ran <= 0.33)
{
return new RecipeScroll(recipes[Utility.Random(mid)]);
}
}
return null;
}
public virtual void GiveReward()
{ }
}
}