using Server.Engines.Craft; using Server.Engines.PartySystem; using Server.Mobiles; using Server.SkillHandlers; using Server.Spells; using System; using System.Collections.Generic; using System.Linq; namespace Server.Items { public enum TreasureLevel { Stash, Supply, Cache, Hoard, Trove } public enum TreasurePackage { Artisan, Assassin, Mage, Ranger, Warrior } public enum TreasureFacet { Trammel, Felucca, Ilshenar, Malas, Tokuno, TerMur, Eodon } public enum ChestQuality { None, Rusty, Standard, Gold } public static class TreasureMapInfo { public static bool NewSystem => true; /// /// This is called from BaseCreature. Instead of editing EVERY creature that drops a map, we'll simply convert it here. /// /// public static int ConvertLevel(int level) { if (!NewSystem || level == -1) return level; switch (level) { default: return (int)TreasureLevel.Stash; case 2: case 3: return (int)TreasureLevel.Supply; case 4: case 5: return (int)TreasureLevel.Cache; case 6: return (int)TreasureLevel.Hoard; case 7: return (int)TreasureLevel.Trove; } } public static TreasureFacet GetFacet(IEntity e) { return GetFacet(e.Location, e.Map); } public static int PackageLocalization(TreasurePackage package) { switch (package) { case TreasurePackage.Artisan: return 1158989; case TreasurePackage.Assassin: return 1158987; case TreasurePackage.Mage: return 1158986; case TreasurePackage.Ranger: return 1158990; case TreasurePackage.Warrior: return 1158988; } return 0; } public static TreasureFacet GetFacet(IPoint2D p, Map map) { if (map == Map.TerMur) { if (SpellHelper.IsEodon(map, new Point3D(p.X, p.Y, 0))) { return TreasureFacet.Eodon; } return TreasureFacet.TerMur; } if (map == Map.Felucca) { return TreasureFacet.Felucca; } if (map == Map.Malas) { return TreasureFacet.Malas; } if (map == Map.Ilshenar) { return TreasureFacet.Ilshenar; } if (map == Map.Tokuno) { return TreasureFacet.Tokuno; } return TreasureFacet.Trammel; } public static IEnumerable GetRandomEquipment(TreasureLevel level, TreasurePackage package, TreasureFacet facet, int amount) { Type[] weapons = GetWeaponList(level, package, facet); Type[] armor = GetArmorList(level, package, facet); Type[] jewels = GetJewelList(level, package, facet); Type[] list; for (int i = 0; i < amount; i++) { switch (Utility.Random(5)) { default: case 0: list = weapons; break; case 1: case 2: list = armor; break; case 3: case 4: list = jewels; break; } yield return list[Utility.Random(list.Length)]; } } public static Type[] GetWeaponList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { Type[] list = null; switch (facet) { case TreasureFacet.Trammel: case TreasureFacet.Felucca: list = _WeaponTable[(int)package][0]; break; case TreasureFacet.Ilshenar: list = _WeaponTable[(int)package][1]; break; case TreasureFacet.Malas: list = _WeaponTable[(int)package][2]; break; case TreasureFacet.Tokuno: list = _WeaponTable[(int)package][3]; break; case TreasureFacet.TerMur: list = _WeaponTable[(int)package][4]; break; case TreasureFacet.Eodon: list = _WeaponTable[(int)package][5]; break; } // tram/fel lists are always default if (list == null || list.Length == 0) { list = _WeaponTable[(int)package][0]; } return list; } public static Type[] GetArmorList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { Type[] list = null; switch (facet) { case TreasureFacet.Trammel: case TreasureFacet.Felucca: list = _ArmorTable[(int)package][0]; break; case TreasureFacet.Ilshenar: list = _ArmorTable[(int)package][1]; break; case TreasureFacet.Malas: list = _ArmorTable[(int)package][2]; break; case TreasureFacet.Tokuno: list = _ArmorTable[(int)package][3]; break; case TreasureFacet.TerMur: list = _ArmorTable[(int)package][4]; break; case TreasureFacet.Eodon: list = _ArmorTable[(int)package][5]; break; } // tram/fel lists are always default if (list == null || list.Length == 0) { list = _ArmorTable[(int)package][0]; } return list; } public static Type[] GetJewelList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { if (facet == TreasureFacet.TerMur) { return _JewelTable[1]; } else { return _JewelTable[0]; } } public static SkillName[] GetTranscendenceList(TreasureLevel level, TreasurePackage package) { if (level == TreasureLevel.Supply || level == TreasureLevel.Cache) { return null; } return _TranscendenceTable[(int)package]; } public static SkillName[] GetAlacrityList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { if (level == TreasureLevel.Stash || (facet == TreasureFacet.Felucca && level == TreasureLevel.Cache)) { return null; } return _AlacrityTable[(int)package]; } public static SkillName[] GetPowerScrollList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { if (facet != TreasureFacet.Felucca) return null; if (level >= TreasureLevel.Cache) { return _PowerscrollTable[(int)package]; } return null; } public static Type[] GetCraftingMaterials(TreasureLevel level, TreasurePackage package, ChestQuality quality) { if (package == TreasurePackage.Artisan && level <= TreasureLevel.Supply && quality != ChestQuality.None) { return _MaterialTable[(int)quality - 1]; } return null; } public static Type[] GetSpecialMaterials(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { if (package == TreasurePackage.Artisan && level == TreasureLevel.Supply) { return _SpecialMaterialTable[(int)facet]; } return null; } public static Type[] GetDecorativeList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { Type[] list = null; if (level >= TreasureLevel.Cache) { list = _DecorativeTable[(int)package]; if (facet == TreasureFacet.Malas) { list.Concat(new Type[] { typeof(CoffinPiece) }); } } else if (level == TreasureLevel.Supply) { list = _DecorativeMinorArtifacts; } return list; } public static Type[] GetReagentList(TreasureLevel level, TreasurePackage package, TreasureFacet facet) { if (level != TreasureLevel.Stash || package != TreasurePackage.Mage) return null; switch (facet) { case TreasureFacet.Felucca: case TreasureFacet.Trammel: return Loot.RegTypes; case TreasureFacet.Malas: return Loot.NecroRegTypes; case TreasureFacet.TerMur: return Loot.MysticRegTypes; } return null; } public static Recipe[] GetRecipeList(TreasureLevel level, TreasurePackage package) { if (package == TreasurePackage.Artisan && level == TreasureLevel.Supply) { return Recipe.Recipes.Values.ToArray(); } return null; } public static Type[] GetSpecialLootList(TreasureLevel level, TreasurePackage package) { if (level == TreasureLevel.Stash) return null; Type[] list; if (level == TreasureLevel.Supply) { list = _SpecialSupplyLoot[(int)package]; } else { list = _SpecialCacheHordeAndTrove; } if (package > TreasurePackage.Artisan) { list.Concat(_FunctionalMinorArtifacts); } return list; } public static int GetGemCount(ChestQuality quality, TreasureLevel level) { int baseAmount = 0; switch (quality) { case ChestQuality.Rusty: baseAmount = 7; break; case ChestQuality.Standard: baseAmount = Utility.RandomBool() ? 7 : 9; break; case ChestQuality.Gold: baseAmount = Utility.RandomList(7, 9, 11); break; } return baseAmount + ((int)level * 5); } public static int GetGoldCount(TreasureLevel level) { switch (level) { default: case TreasureLevel.Stash: return Utility.RandomMinMax(10000, 40000); case TreasureLevel.Supply: return Utility.RandomMinMax(20000, 50000); case TreasureLevel.Cache: return Utility.RandomMinMax(30000, 60000); case TreasureLevel.Hoard: return Utility.RandomMinMax(40000, 70000); case TreasureLevel.Trove: return Utility.RandomMinMax(50000, 70000); } } public static int GetRefinementRolls(ChestQuality quality) { switch (quality) { default: case ChestQuality.Rusty: return 2; case ChestQuality.Standard: return 4; case ChestQuality.Gold: return 6; } } public static int GetResourceAmount(TreasureLevel level) { switch (level) { case TreasureLevel.Stash: return 50; case TreasureLevel.Supply: return 100; } return 0; } public static int GetRegAmount(ChestQuality quality) { switch (quality) { default: case ChestQuality.Rusty: return 20; case ChestQuality.Standard: return 40; case ChestQuality.Gold: return 60; } } public static int GetSpecialResourceAmount(ChestQuality quality) { switch (quality) { default: case ChestQuality.Rusty: return 1; case ChestQuality.Standard: return 2; case ChestQuality.Gold: return 3; } } public static int GetEquipmentAmount(Mobile from, TreasureLevel level, TreasurePackage package) { int amount = 0; switch (level) { default: case TreasureLevel.Stash: amount = 6; break; case TreasureLevel.Supply: amount = 8; break; case TreasureLevel.Cache: amount = package == TreasurePackage.Assassin ? 24 : 12; break; case TreasureLevel.Hoard: amount = 18; break; case TreasureLevel.Trove: amount = 36; break; } Party p = Party.Get(from); if (p != null && p.Count > 1) { for (int i = 0; i < p.Count - 1; i++) { if (Utility.RandomBool()) { amount++; } } } return amount; } public static void GetMinMaxBudget(TreasureLevel level, Item item, out int min, out int max) { int preArtifact = Imbuing.GetMaxWeight(item) + 100; min = max = 0; switch (level) { default: case TreasureLevel.Stash: case TreasureLevel.Supply: min = 250; max = preArtifact; break; case TreasureLevel.Cache: case TreasureLevel.Hoard: case TreasureLevel.Trove: min = 500; max = 1300; break; } } private static readonly Type[][][] _WeaponTable = new Type[][][] { new Type[][] // Artisan { new Type[] { typeof(HammerPick), typeof(SledgeHammerWeapon), typeof(SmithyHammer), typeof(WarAxe), typeof(WarHammer), typeof(Axe), typeof(BattleAxe), typeof(DoubleAxe), typeof(ExecutionersAxe), typeof(Hatchet), typeof(LargeBattleAxe), typeof(OrnateAxe), typeof(TwoHandedAxe), typeof(Pickaxe) }, // Trammel, Felucca null, // Ilshenar null, // Malas null, // Tokuno new Type[] { typeof(HammerPick), typeof(SledgeHammerWeapon), typeof(SmithyHammer), typeof(WarAxe), typeof(WarHammer), typeof(Axe), typeof(BattleAxe), typeof(DoubleAxe), typeof(ExecutionersAxe), typeof(Hatchet), typeof(LargeBattleAxe), typeof(OrnateAxe), typeof(TwoHandedAxe), typeof(Pickaxe), typeof(DualShortAxes) }, // TerMur new Type[] { } // Eodon }, new Type[][] // Assassin { new Type[] { typeof(Dagger), typeof(Kryss), typeof(Cleaver), typeof(Cutlass), typeof(ElvenMachete) }, null, null, null, new Type[] { typeof(Dagger), typeof(Kryss), typeof(Cleaver), typeof(Cutlass) }, new Type[] { typeof(Dagger), typeof(Kryss), typeof(Cleaver), typeof(Cutlass), typeof(BladedWhip), typeof(BarbedWhip), typeof(SpikedWhip) }, }, new Type[][] // Mage { new Type[] { typeof(BlackStaff), typeof(ShepherdsCrook), typeof(GnarledStaff), typeof(QuarterStaff) }, null, null, null, null, null, }, new Type[][] // Ranger { new Type[] { typeof(Bow), typeof(Crossbow), typeof(HeavyCrossbow), typeof(CompositeBow), typeof(ButcherKnife), typeof(SkinningKnife) }, new Type[] { typeof(Bow), typeof(Crossbow), typeof(HeavyCrossbow), typeof(CompositeBow), typeof(ButcherKnife), typeof(SkinningKnife), typeof(SoulGlaive) }, new Type[] { typeof(Bow), typeof(Crossbow), typeof(HeavyCrossbow), typeof(CompositeBow), typeof(ButcherKnife), typeof(SkinningKnife), typeof(ElvenCompositeLongbow) }, null, new Type[] { typeof(Bow), typeof(Crossbow), typeof(HeavyCrossbow), typeof(CompositeBow), typeof(ButcherKnife), typeof(SkinningKnife), typeof(GargishButcherKnife), typeof(Cyclone), typeof(SoulGlaive) }, null, }, new Type[][] // Warrior { new Type[] { typeof(Lance), typeof(Pike), typeof(Pitchfork), typeof(ShortSpear), typeof(WarFork), typeof(Club), typeof(Mace), typeof(Maul), typeof(WarAxe), typeof(Bardiche), typeof(Broadsword), typeof(CrescentBlade), typeof(Halberd), typeof(Longsword), typeof(Scimitar), typeof(VikingSword) }, null, null, new Type[] { typeof(Lance), typeof(Pike), typeof(Pitchfork), typeof(ShortSpear), typeof(WarFork), typeof(Club), typeof(Mace), typeof(Maul), typeof(WarAxe), typeof(Bardiche), typeof(Broadsword), typeof(CrescentBlade), typeof(Halberd), typeof(Longsword), typeof(Scimitar), typeof(VikingSword), typeof(Bokuto), typeof(Daisho) }, null, null, }, }; private static readonly Type[][][] _ArmorTable = new Type[][][] { new Type[][] // Artisan { new Type[] { typeof(Bonnet), typeof(Cap), typeof(Circlet), typeof(ElvenGlasses), typeof(FeatheredHat), typeof(FlowerGarland), typeof(JesterHat), typeof(SkullCap), typeof(StrawHat), typeof(TallStrawHat), typeof(WideBrimHat) }, // Trammel/Fel null, // Ilshenar null, // Malas null, // Tokuno null, // TerMur new Type[] { typeof(Bonnet), typeof(Cap), typeof(Circlet), typeof(ElvenGlasses), typeof(FeatheredHat), typeof(FlowerGarland), typeof(JesterHat), typeof(SkullCap), typeof(StrawHat), typeof(TallStrawHat), typeof(WideBrimHat), typeof(ChefsToque) }, // Eodon }, new Type[][] // Assassin { new Type[] { typeof(ChainLegs), typeof(ChainCoif), typeof(ChainChest), typeof(RingmailLegs), typeof(RingmailGloves), typeof(RingmailChest), typeof(RingmailArms), typeof(Bandana) }, // Trammel/Fel null, // Ilshenar null, // Malas new Type[] { typeof(ChainLegs), typeof(ChainCoif), typeof(ChainChest), typeof(RingmailLegs), typeof(RingmailGloves), typeof(RingmailArms), typeof(RingmailArms), typeof(Bandana), typeof(LeatherSuneate), typeof(LeatherMempo), typeof(LeatherJingasa), typeof(LeatherHiroSode), typeof(LeatherHaidate), typeof(LeatherDo) }, // Tokuno null, // TerMur null, // Eodon }, new Type[][] // Mage { new Type[] { typeof(LeafGloves), typeof(LeafLegs), typeof(LeafTonlet), typeof(LeafGorget), typeof(LeafArms),typeof(LeafChest), typeof(LeatherArms), typeof(LeatherChest), typeof(LeatherLegs), typeof(LeatherGloves), typeof(LeatherGorget), typeof(WizardsHat) }, // Trammel/Fel null, // Ilshenar new Type[] { typeof(LeafGloves), typeof(LeafLegs), typeof(LeafTonlet), typeof(LeafGorget), typeof(LeafArms),typeof(LeafChest), typeof(LeatherArms), typeof(LeatherChest), typeof(LeatherLegs), typeof(LeatherGloves), typeof(LeatherGorget), typeof(WizardsHat), typeof(BoneLegs), typeof(BoneHelm), typeof(BoneGloves), typeof(BoneChest), typeof(BoneArms) }, // Malas null, // Tokuno new Type[] { typeof(LeatherArms), typeof(LeatherChest), typeof(LeatherLegs), typeof(LeatherGloves), typeof(LeatherGorget), typeof(WizardsHat) }, // TerMur new Type[] { typeof(LeatherArms), typeof(LeatherChest), typeof(LeatherLegs), typeof(LeatherGloves), typeof(LeatherGorget), typeof(WizardsHat) }, // Eodon }, new Type[][] // Ranger { new Type[] { typeof(HidePants), typeof(HidePauldrons), typeof(HideGorget), typeof(HideFemaleChest), typeof(HideChest), typeof(HideGloves), typeof(StuddedLegs), typeof(StuddedGorget), typeof(StuddedGloves), typeof(StuddedChest), typeof(StuddedBustierArms), typeof(StuddedArms), typeof(RavenHelm), typeof(VultureHelm), typeof(WingedHelm) }, // Trammel/Fel null, // Ilshenar null, // Malas new Type[] { typeof(StuddedLegs), typeof(StuddedGorget), typeof(StuddedGloves), typeof(StuddedChest), typeof(StuddedBustierArms), typeof(StuddedArms) }, // Tokuno new Type[] { typeof(HidePants), typeof(HidePauldrons), typeof(HideGorget), typeof(HideFemaleChest), typeof(HideChest), typeof(HideGloves), typeof(StuddedLegs), typeof(StuddedGorget), typeof(StuddedGloves), typeof(StuddedChest), typeof(StuddedBustierArms), typeof(StuddedArms), typeof(GargishLeatherKilt), typeof(GargishLeatherLegs), typeof(GargishLeatherArms), typeof(GargishLeatherChest) }, // TerMur new Type[] { typeof(StuddedLegs), typeof(StuddedGorget), typeof(StuddedGloves), typeof(StuddedChest), typeof(StuddedBustierArms), typeof(StuddedArms), typeof(TigerPeltSkirt), typeof(TigerPeltShorts), typeof(TigerPeltLegs), typeof(TigerPeltLongSkirt), typeof(TigerPeltHelm), typeof(TigerPeltChest), typeof(TigerPeltCollar), typeof(TigerPeltBustier), typeof(VultureHelm), typeof(TribalMask) }, // Eodon }, new Type[][] // Warrior { new Type[] { typeof(PlateLegs), typeof(PlateHelm), typeof(PlateGorget), typeof(PlateGloves), typeof(PlateChest), typeof(PlateArms), typeof(Bascinet), typeof(CloseHelm), typeof(Helmet), typeof(LeatherCap), typeof(NorseHelm), typeof(TricorneHat), typeof(BronzeShield), typeof(Buckler), typeof(ChaosShield), typeof(HeaterShield), typeof(MetalKiteShield), typeof(MetalShield), typeof(OrderShield), typeof(WoodenKiteShield) }, // Trammel/Fel null, // Ilshenar new Type[] { typeof(PlateLegs), typeof(PlateHelm), typeof(PlateGorget), typeof(PlateGloves), typeof(PlateChest), typeof(PlateArms), typeof(Bascinet), typeof(CloseHelm), typeof(Helmet), typeof(LeatherCap), typeof(NorseHelm), typeof(TricorneHat), typeof(BronzeShield), typeof(Buckler), typeof(ChaosShield), typeof(HeaterShield), typeof(MetalKiteShield), typeof(MetalShield), typeof(OrderShield), typeof(WoodenKiteShield), typeof(DragonHelm), typeof(DragonGloves), typeof(DragonChest), typeof(DragonArms), typeof(DragonLegs) }, // Malas new Type[] { typeof(PlateLegs), typeof(PlateHelm), typeof(PlateGorget), typeof(PlateGloves), typeof(PlateChest), typeof(PlateArms), typeof(Bascinet), typeof(CloseHelm), typeof(Helmet), typeof(LeatherCap), typeof(NorseHelm), typeof(TricorneHat), typeof(BronzeShield), typeof(Buckler), typeof(ChaosShield), typeof(HeaterShield), typeof(MetalKiteShield), typeof(MetalShield), typeof(OrderShield), typeof(WoodenKiteShield), typeof(PlateSuneate), typeof(PlateMempo), typeof(PlateHiroSode), typeof(PlateHatsuburi), typeof(PlateHaidate), typeof(PlateDo), typeof(PlateBattleKabuto), typeof(DecorativePlateKabuto), typeof(LightPlateJingasa), typeof(SmallPlateJingasa) }, // Tokuno new Type[] { typeof(PlateLegs), typeof(PlateHelm), typeof(PlateGorget), typeof(PlateGloves), typeof(PlateChest), typeof(PlateArms), typeof(Bascinet), typeof(CloseHelm), typeof(Helmet), typeof(LeatherCap), typeof(NorseHelm), typeof(TricorneHat), typeof(BronzeShield), typeof(Buckler), typeof(ChaosShield), typeof(HeaterShield), typeof(MetalKiteShield), typeof(MetalShield), typeof(OrderShield), typeof(WoodenKiteShield), typeof(GargishPlateArms), typeof(GargishPlateChest), typeof(GargishPlateKilt), typeof(GargishPlateLegs), typeof(GargishStoneKilt), typeof(GargishStoneLegs), typeof(GargishStoneArms), typeof(GargishStoneChest) }, // TerMur new Type[] { typeof(PlateLegs), typeof(PlateHelm), typeof(PlateGorget), typeof(PlateGloves), typeof(PlateChest), typeof(PlateArms), typeof(Bascinet), typeof(CloseHelm), typeof(Helmet), typeof(LeatherCap), typeof(NorseHelm), typeof(TricorneHat), typeof(BronzeShield), typeof(Buckler), typeof(ChaosShield), typeof(HeaterShield), typeof(MetalKiteShield), typeof(MetalShield), typeof(OrderShield), typeof(WoodenKiteShield), typeof(DragonTurtleHideHelm), typeof(DragonTurtleHideLegs), typeof(DragonTurtleHideChest), typeof(DragonTurtleHideBustier), typeof(DragonTurtleHideArms) }, // Eodon } }; public static Type[][] _MaterialTable = new Type[][] { new Type[] { typeof(SpinedLeather), typeof(OakBoard), typeof(AshBoard), typeof(DullCopperIngot), typeof(ShadowIronIngot), typeof(CopperIngot) }, new Type[] { typeof(HornedLeather), typeof(YewBoard), typeof(HeartwoodBoard), typeof(BronzeIngot), typeof(GoldIngot), typeof(AgapiteIngot) }, new Type[] { typeof(BarbedLeather), typeof(BloodwoodBoard), typeof(FrostwoodBoard), typeof(ValoriteIngot), typeof(VeriteIngot) } }; public static Type[][] _JewelTable = new Type[][] { new Type[] { typeof(GoldRing), typeof(GoldBracelet), typeof(SilverRing), typeof(SilverBracelet) }, // standard new Type[] { typeof(GoldRing), typeof(GoldBracelet), typeof(SilverRing), typeof(SilverBracelet), typeof(GargishBracelet) }, // Ranger/TerMur }; public static Type[][] _DecorativeTable = new Type[][] { new Type[] { typeof(SkullTiledFloorAddonDeed) }, new Type[] { typeof(AncientWeapon3) }, new Type[] { typeof(DecorativeHourglass) }, new Type[] { typeof(AncientWeapon1), typeof(CreepingVine) }, new Type[] { typeof(AncientWeapon2) }, }; public static Type[][] _SpecialMaterialTable = new Type[][] { null, // tram null, // fel null, // ilsh new Type[] { typeof(LuminescentFungi), typeof(BarkFragment), typeof(Blight), typeof(Corruption), typeof(Muculent), typeof(Putrefaction), typeof(Scourge), typeof(Taint) }, // malas null, // tokuno TreasureMapChest.ImbuingIngreds, // ter null, // eodon }; public static Type[][] _SpecialSupplyLoot = new Type[][] { new Type[] { typeof(LegendaryMapmakersGlasses), typeof(ManaPhasingOrb), typeof(RunedSashOfWarding), typeof(ShieldEngravingTool), null }, new Type[] { typeof(ForgedPardon), typeof(LegendaryMapmakersGlasses), typeof(ManaPhasingOrb), typeof(RunedSashOfWarding), typeof(Skeletonkey), typeof(MasterSkeletonKey), typeof(SurgeShield) }, new Type[] { typeof(LegendaryMapmakersGlasses), typeof(ManaPhasingOrb), typeof(RunedSashOfWarding) }, new Type[] { typeof(LegendaryMapmakersGlasses), typeof(ManaPhasingOrb), typeof(RunedSashOfWarding), typeof(TastyTreat) }, new Type[] { typeof(LegendaryMapmakersGlasses), typeof(ManaPhasingOrb), typeof(RunedSashOfWarding) }, }; public static Type[] _SpecialCacheHordeAndTrove = new Type[] { typeof(OctopusNecklace), typeof(SkullGnarledStaff), typeof(SkullLongsword) }; public static Type[] _DecorativeMinorArtifacts = new Type[] { typeof(CandelabraOfSouls), typeof(GoldBricks), typeof(PhillipsWoodenSteed), typeof(AncientShipModelOfTheHMSCape), typeof(AdmiralsHeartyRum) }; public static Type[] _FunctionalMinorArtifacts = new Type[] { typeof(ArcticDeathDealer), typeof(BlazeOfDeath), typeof(BurglarsBandana), typeof(CavortingClub), typeof(DreadPirateHat), typeof(EnchantedTitanLegBone), typeof(GwennosHarp), typeof(IolosLute), typeof(LunaLance), typeof(NightsKiss), typeof(NoxRangersHeavyCrossbow), typeof(PolarBearMask), typeof(VioletCourage), typeof(HeartOfTheLion), typeof(ColdBlood), typeof(AlchemistsBauble), typeof(CaptainQuacklebushsCutlass), typeof(ShieldOfInvulnerability), }; public static SkillName[][] _TranscendenceTable = new SkillName[][] { new SkillName[] { SkillName.ArmsLore, SkillName.Blacksmith, SkillName.Carpentry, SkillName.Cartography, SkillName.Cooking, SkillName.Cooking, SkillName.Fletching, SkillName.Mining, SkillName.Tailoring }, new SkillName[] { SkillName.Anatomy, SkillName.DetectHidden, SkillName.Fencing, SkillName.Poisoning, SkillName.RemoveTrap, SkillName.Snooping, SkillName.Stealth }, new SkillName[] { SkillName.Magery, SkillName.Meditation, SkillName.MagicResist, SkillName.Spellweaving }, new SkillName[] { SkillName.Alchemy, SkillName.AnimalLore, SkillName.AnimalTaming, SkillName.Archery, }, new SkillName[] { SkillName.Chivalry, SkillName.Focus, SkillName.Parry, SkillName.Swords, SkillName.Tactics, SkillName.Wrestling }, }; public static SkillName[][] _AlacrityTable = new SkillName[][] { new SkillName[] { SkillName.ArmsLore, SkillName.Blacksmith, SkillName.Carpentry, SkillName.Cartography, SkillName.Cooking, SkillName.Cooking, SkillName.Fletching, SkillName.Mining, SkillName.Tailoring, SkillName.Lumberjacking }, new SkillName[] { SkillName.DetectHidden, SkillName.Fencing, SkillName.Hiding, SkillName.Lockpicking, SkillName.Poisoning, SkillName.RemoveTrap, SkillName.Snooping, SkillName.Stealing, SkillName.Stealth }, new SkillName[] { SkillName.Alchemy, SkillName.EvalInt, SkillName.Inscribe, SkillName.Magery, SkillName.Meditation, SkillName.Spellweaving, SkillName.SpiritSpeak }, new SkillName[] { SkillName.AnimalLore, SkillName.AnimalTaming, SkillName.Archery, SkillName.Musicianship, SkillName.Peacemaking, SkillName.Provocation, SkillName.Tinkering, SkillName.Tracking, SkillName.Veterinary }, new SkillName[] { SkillName.Chivalry, SkillName.Focus, SkillName.Macing, SkillName.Parry, SkillName.Swords, SkillName.Wrestling }, }; public static SkillName[][] _PowerscrollTable = new SkillName[][] { null, new SkillName[] { SkillName.Ninjitsu }, new SkillName[] { SkillName.Magery, SkillName.Meditation, SkillName.Mysticism, SkillName.Spellweaving, SkillName.SpiritSpeak }, new SkillName[] { SkillName.AnimalTaming, SkillName.Discordance, SkillName.Provocation, SkillName.Veterinary }, new SkillName[] { SkillName.Bushido, SkillName.Chivalry, SkillName.Focus, SkillName.Healing, SkillName.Parry, SkillName.Swords, SkillName.Tactics }, }; public static void Fill(Mobile from, TreasureMapChest chest, TreasureMap tMap) { TreasureLevel level = tMap.TreasureLevel; TreasurePackage package = tMap.Package; TreasureFacet facet = tMap.TreasureFacet; ChestQuality quality = chest.ChestQuality; chest.Movable = false; chest.Locked = true; chest.TrapType = TrapType.ExplosionTrap; switch ((int)level) { default: case 0: chest.RequiredSkill = 5; chest.TrapPower = 25; chest.TrapLevel = 1; break; case 1: chest.RequiredSkill = 45; chest.TrapPower = 75; chest.TrapLevel = 3; break; case 2: chest.RequiredSkill = 75; chest.TrapPower = 125; chest.TrapLevel = 5; break; case 3: chest.RequiredSkill = 80; chest.TrapPower = 150; chest.TrapLevel = 6; break; case 4: chest.RequiredSkill = 80; chest.TrapPower = 170; chest.TrapLevel = 7; break; } chest.LockLevel = chest.RequiredSkill - 10; chest.MaxLockLevel = chest.RequiredSkill + 40; if (Engines.JollyRoger.JollyRogerEvent.Instance.Running && 0.10 > Utility.RandomDouble()) { chest.DropItem(new MysteriousFragment()); } #region Refinements if (level == TreasureLevel.Stash) { RefinementComponent.Roll(chest, GetRefinementRolls(quality), 0.9); } #endregion #region TMaps bool dropMap = false; if (level < TreasureLevel.Trove && 0.1 > Utility.RandomDouble()) { chest.DropItem(new TreasureMap(tMap.Level + 1, chest.Map)); dropMap = true; } #endregion Type[] list = null; int amount = 0; double dropChance = 0.0; #region Gold int goldAmount = GetGoldCount(level); Bag lootBag = new BagOfGold(); while (goldAmount > 0) { if (goldAmount <= 20000) { lootBag.DropItem(new Gold(goldAmount)); goldAmount = 0; } else { lootBag.DropItem(new Gold(20000)); goldAmount -= 20000; } chest.DropItem(lootBag); } #endregion #region Regs list = GetReagentList(level, package, facet); if (list != null) { amount = GetRegAmount(quality); lootBag = new BagOfRegs(); for (int i = 0; i < amount; i++) { lootBag.DropItemStacked(Loot.Construct(list)); } chest.DropItem(lootBag); list = null; } #endregion #region Gems amount = GetGemCount(quality, level); if (amount > 0) { lootBag = new BagOfGems(); foreach (Type gemType in Loot.GemTypes) { Item gem = Loot.Construct(gemType); gem.Amount = amount; lootBag.DropItem(gem); } chest.DropItem(lootBag); } #endregion #region Crafting Resources // TODO: DO each drop, or do only 1 drop? list = GetCraftingMaterials(level, package, quality); if (list != null) { amount = GetResourceAmount(level); foreach (Type type in list) { Item craft = Loot.Construct(type); craft.Amount = amount; chest.DropItem(craft); } list = null; } #endregion #region Special Resources // TODO: DO each drop, or do only 1 drop? list = GetSpecialMaterials(level, package, facet); if (list != null) { amount = GetSpecialResourceAmount(quality); foreach (Type type in list) { Item specialCraft = Loot.Construct(type); specialCraft.Amount = amount; chest.DropItem(specialCraft); } list = null; } #endregion #region Special Scrolls amount = (int)level + 1; if (dropMap) { amount--; } if (amount > 0) { SkillName[] transList = GetTranscendenceList(level, package); SkillName[] alacList = GetAlacrityList(level, package, facet); SkillName[] pscrollList = GetPowerScrollList(level, package, facet); List> scrollList = new List>(); if (transList != null) { foreach (SkillName sk in transList) { scrollList.Add(new Tuple(1, sk)); } } if (alacList != null) { foreach (SkillName sk in alacList) { scrollList.Add(new Tuple(2, sk)); } } if (pscrollList != null) { foreach (SkillName sk in pscrollList) { scrollList.Add(new Tuple(3, sk)); } } if (scrollList.Count > 0) { for (int i = 0; i < amount; i++) { Tuple random = scrollList[Utility.Random(scrollList.Count)]; switch (random.Item1) { case 1: chest.DropItem(new ScrollOfTranscendence(random.Item2, Utility.RandomMinMax(1.0, chest.Map == Map.Felucca ? 7.0 : 5.0) / 10)); break; case 2: chest.DropItem(new ScrollOfAlacrity(random.Item2)); break; case 3: chest.DropItem(new PowerScroll(random.Item2, 110.0)); break; } } } } #endregion #region Decorations switch (level) { case TreasureLevel.Stash: dropChance = 0.00; break; case TreasureLevel.Supply: dropChance = 0.10; break; case TreasureLevel.Cache: dropChance = 0.20; break; case TreasureLevel.Hoard: dropChance = 0.40; break; case TreasureLevel.Trove: dropChance = 0.50; break; } if (Utility.RandomDouble() < dropChance) { list = GetDecorativeList(level, package, facet); if (list != null) { if (list.Length > 0) { Item deco = Loot.Construct(list[Utility.Random(list.Length)]); if (_DecorativeMinorArtifacts.Any(t => t == deco.GetType())) { Container pack = new Backpack { Hue = 1278 }; pack.DropItem(deco); chest.DropItem(pack); } else { chest.DropItem(deco); } } list = null; } } switch (level) { case TreasureLevel.Stash: dropChance = 0.00; break; case TreasureLevel.Supply: dropChance = 0.10; break; case TreasureLevel.Cache: dropChance = 0.20; break; case TreasureLevel.Hoard: dropChance = 0.50; break; case TreasureLevel.Trove: dropChance = 0.75; break; } if (Utility.RandomDouble() < dropChance) { list = GetSpecialLootList(level, package); if (list != null) { if (list.Length > 0) { Type type = MutateType(list[Utility.Random(list.Length)], facet); Item deco; if (type == null) { deco = TreasureMapChest.GetRandomRecipe(); } else { deco = Loot.Construct(type); } if (deco is SkullGnarledStaff || deco is SkullLongsword) { if (package == TreasurePackage.Artisan) { ((IQuality)deco).Quality = ItemQuality.Exceptional; } else { int min, max; GetMinMaxBudget(level, deco, out min, out max); RunicReforging.GenerateRandomItem(deco, from is PlayerMobile ? ((PlayerMobile)from).RealLuck : from.Luck, min, max, chest.Map); } } if (_FunctionalMinorArtifacts.Any(t => t == type)) { Container pack = new Backpack { Hue = 1278 }; pack.DropItem(deco); chest.DropItem(pack); } else { chest.DropItem(deco); } } list = null; } } #endregion #region Magic Equipment amount = GetEquipmentAmount(from, level, package); foreach (Type type in GetRandomEquipment(level, package, facet, amount)) { Item item = Loot.Construct(type); int min, max; GetMinMaxBudget(level, item, out min, out max); if (item != null) { RunicReforging.GenerateRandomItem(item, from is PlayerMobile ? ((PlayerMobile)from).RealLuck : from.Luck, min, max, chest.Map); chest.DropItem(item); } } list = null; #endregion } private static Type MutateType(Type type, TreasureFacet facet) { if (type == typeof(SkullGnarledStaff)) { type = typeof(GargishSkullGnarledStaff); } else if (type == typeof(SkullLongsword)) { type = typeof(GargishSkullLongsword); } return type; } } }