Exemple #1
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(8))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 //Hats
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 6:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            }

                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest;

                        if (Utility.RandomBool())
                        {
                            chest = new MetalGoldenChest();
                        }
                        else
                        {
                            chest = new WoodenChest();
                        }

                        if (sos.IsAncient)
                        {
                            chest.Hue = 0x481;
                        }

                        TreasureMapChest.Fill(chest, Math.Max(1, Math.Max(4, sos.Level)));

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;
                        chest.TrapLevel = 0;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
Exemple #2
0
        public override Item Construct(Type type, Mobile from, Item tool)
        {
            // Searing Weapon Support, handled elsewhere
            if (type == typeof(BaseWeapon))
            {
                return(null);
            }

            if (type == typeof(TreasureMap))
            {
                return(new TreasureMap(0, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(WhitePearl))
            {
                return(new WhitePearl());
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if ((from.Map == Map.Felucca || from.Map == Map.Trammel) && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;
                        bool dredge  = HasTypeHook(tool, HookType.Dredging);

                        switch (Utility.Random(17))
                        {
                        case 0:     // Body parts
                        case 1:
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,        // arm
                                0x1CE0, 0x1CE8,        // torso
                                0x1CE1, 0x1CE9,        // head
                                0x1CE2, 0x1CEC         // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            break;
                        }

                        case 2:     // Bone parts
                        case 3:
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            break;
                        }

                        case 4:     // Paintings and portraits
                        case 5:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10), dredge);
                            break;
                        }

                        case 6:     // Pillows
                        case 7:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11), dredge);
                            break;
                        }

                        case 8:     // Shells
                        case 9:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9), dredge);
                            break;
                        }

                        case 10:     //Hats
                        case 11:
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 12:     // Misc
                        case 13:
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                        // unfinished barrel
                                0xA2A,                         // stool
                                0xC1F,                         // broken clock
                                0x1047, 0x1048,                // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4 // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            }

                            break;
                        }

                            #region High Seas
                        case 14:
                        {
                            int[] list = new int[]
                            {
                                0x1E19, 0x1E1A, 0x1E1B,         //Fish heads
                                0x1E2A, 0x1E2B,                 //Oars
                                0x1E71, 0x1E7A,                 //Unfinished drawers
                                0x1E75,                         //Unfinished legs
                            };

                            double ran = Utility.RandomDouble();

                            if (ran < 0.05)
                            {
                                preLoot = new YellowPolkaDotBikini();
                            }
                            else if (ran < 0.25)
                            {
                                preLoot = new ShipwreckedItem(list[Utility.RandomMinMax(3, 7)], dredge);
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(list[Utility.Random(3)], dredge);
                            }
                            break;
                        }
                            #endregion
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest;

                        if (0.01 > Utility.RandomDouble())
                        {
                            chest = new ShipsStrongbox(sos.Level);
                        }
                        else
                        {
                            switch (sos.Level)
                            {
                            case 0: chest = new SOSChest(Utility.RandomBool() ? 0xE43 : 0xE41); break;

                            case 1: chest = new SOSChest(0xA306); break;

                            case 2: chest = new SOSChest(Utility.RandomBool() ? 0xE43 : 0xE41); break;

                            case 3: chest = new SOSChest(0xA308); break;

                            default:
                                if (.33 > Utility.RandomDouble())
                                {
                                    chest = new SOSChest(0xA30A);
                                }
                                else
                                {
                                    chest     = new SOSChest(Utility.RandomBool() ? 0xE41 : 0xE43);
                                    chest.Hue = 0x481;
                                }
                                break;
                            }
                        }

                        TreasureMapChest.Fill(from, chest, Math.Max(1, Math.Min(4, sos.Level)), true);
                        sos.OnSOSComplete(chest);

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;
                        chest.TrapLevel = 0;

                        chest.IsShipwreckedItem = true;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from, tool));
        }
Exemple #3
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            return(preLoot);
                        }

                        sos.Delete();

                        WoodenChest chest = new WoodenChest();

                        TreasureMapChest.Fill(chest, Utility.RandomMinMax(1, 3));

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
Exemple #4
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                //if ( from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland( from ) )
                //	level = 0;
                //else
                level = 1;

                return(new TreasureMap(level, /*from.Map == Map.Felucca ?*/ Map.Felucca /* : Map.Trammel*/));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(/*from.Map == Map.Felucca ?*/ Map.Felucca /* : Map.Trammel*/));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(8))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 //Hats
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 6:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            }

                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest = null;

                        switch (Utility.Random(3))
                        {
                        case 0: chest = new MetalGoldenChest(); break;

                        case 1: chest = new MetalChest(); break;

                        default:
                        case 2: chest = new WoodenChest(); break;
                        }

                        if (sos.IsAncient)
                        {
                            int hue = 1150;

                            if (0.20 > Utility.RandomDouble())
                            {
                                switch (Utility.Random((chest is WoodenChest) ? 6 : 14))
                                {
                                case 0: hue = 1193; break;

                                case 1: hue = 1281; break;

                                case 2: hue = 1190; break;

                                case 3: hue = 1165; break;

                                case 4: hue = 1160; break;

                                case 5: hue = 1126; break;

                                case 6: hue = CraftResources.GetInfo(CraftResource.Valorite).Hue; break;

                                case 7: hue = CraftResources.GetInfo(CraftResource.Verite).Hue; break;

                                case 8: hue = CraftResources.GetInfo(CraftResource.Agapite).Hue; break;

                                case 9: hue = CraftResources.GetInfo(CraftResource.Gold).Hue; break;

                                case 10: hue = CraftResources.GetInfo(CraftResource.Bronze).Hue; break;

                                case 11: hue = CraftResources.GetInfo(CraftResource.Copper).Hue; break;

                                case 12: hue = CraftResources.GetInfo(CraftResource.ShadowIron).Hue; break;

                                case 13: hue = CraftResources.GetInfo(CraftResource.DullCopper).Hue; break;
                                }
                            }

                            chest.Hue = hue;
                        }
                        else if ((chest is MetalChest || chest is MetalGoldenChest) && (0.5 * sos.Level) >= Utility.RandomDouble())
                        {
                            int           randhue  = Utility.Random(120);
                            CraftResource resource = CraftResource.None;

                            if (randhue >= 118)
                            {
                                resource = CraftResource.Valorite;
                            }
                            else if (randhue >= 115)
                            {
                                resource = CraftResource.Verite;
                            }
                            else if (randhue >= 110)
                            {
                                resource = CraftResource.Agapite;
                            }
                            else if (randhue >= 100)
                            {
                                resource = CraftResource.Gold;
                            }
                            else if (randhue >= 90)
                            {
                                resource = CraftResource.Bronze;
                            }
                            else if (randhue >= 70)
                            {
                                resource = CraftResource.Copper;
                            }
                            else if (randhue >= 40)
                            {
                                resource = CraftResource.ShadowIron;
                            }
                            else
                            {
                                resource = CraftResource.DullCopper;
                            }

                            chest.Hue = CraftResources.GetInfo(resource).Hue;
                        }

                        int soslevel = Math.Max(1, Math.Max(4, sos.Level));

                        TreasureMapChest.Fill(chest, soslevel);

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable           = true;
                        chest.Locked            = false;
                        chest.Name              = "treasure chest";
                        chest.IsShipwreckedItem = true;

                        if (sos.Level > 0)
                        {
                            chest.TrapType  = TrapType.ExplosionTrap;
                            chest.TrapPower = soslevel * Utility.RandomMinMax(5, 15);
                            chest.TrapLevel = 0;
                        }
                        else
                        {
                            chest.TrapType  = TrapType.None;
                            chest.TrapPower = 0;
                            chest.TrapLevel = 0;
                        }

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
Exemple #5
0
        public override Item Construct(Type type, Mobile from, object[] args)
        {
            if (type == typeof(TreasureMap))
            {
                return(new TreasureMap(1, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {                   // build a level N mib based on the good fishing map level
                if (args != null && args.Length == 2 && args[0] == typeof(MessageInABottle) && args[1] is int)
                {
                    return(new MessageInABottle(SafeMap(from.Map), (int)args[1]));
                }
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            return(preLoot);
                        }

                        Container chest = null;

                        if (sos.Level >= 4 && Utility.RandomChance(10))
                        {
                            chest = new MetalGoldenChest();
                        }
                        else
                        {
                            chest = new WoodenChest();
                        }

                        // regular sos's have a chance at a 1, 2 or 3. high level sos's are high level chests
                        int level = (sos.Level >= 4) ? sos.Level : Utility.RandomMinMax(1, 3);
                        TreasureMapChest.Fill((chest as LockableContainer), level);

                        // add 50% more gold since we are decreasing the chance to get rares
                        Item[] golds = chest.FindItemsByType(typeof(Gold));
                        if (golds != null && golds.Length > 0)
                        {
                            int total = 0;
                            for (int tx = 0; tx < golds.Length; tx++)
                            {
                                total += (golds[tx] as Gold).Amount;
                            }

                            // add 50% more gold
                            chest.DropItem(new Gold(total / 2));

                            // add some cursed gold
                            chest.DropItem(new CursedGold(total / 8));
                        }

                        // adjust high end loot by removing high end weapons and armor
                        if (sos.Level >= 4)
                        {
                            // trim the high end weps and armor so as not to to give away all the highend weapons usually reserved for Treasure Map hunters
                            Item[] lootz     = chest.FindItemsByType(new Type[] { typeof(EnchantedScroll), typeof(BaseArmor), typeof(BaseWeapon) });
                            int    LootzKeep = level == 4 ? Utility.RandomList(2) + 2 : Utility.RandomList(3) + 2;

                            if (lootz != null && lootz.Length > LootzKeep)
                            {
                                // remove some items as we're dropping too much for the sea chest
                                int toDel = lootz.Length - LootzKeep;
                                for (int ox = 0; ox < toDel; ox++)
                                {
                                    Item dx = lootz[ox];
                                    chest.RemoveItem(dx);
                                    dx.Delete();
                                }
                            }
                        }

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        // add Good Fishing bonus lootz
                        if (Utility.RandomChance(sos.Level * 8))
                        {
                            switch (sos.Level)
                            {
                            case 1:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0DBB),                                                 // 3515 (0x0DBB) Seaweed
                                        new AddonDeed(0x0C2E),                                                 // 3118 (0x0C2E) debris
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x154D),                                                          // 5453 (0x054D) water barrel – empty or filled we don't have them on ai yet.
                                        new AddonDeed(0x0DC9),                                                          // 3529 (0x0DC9) fishing net – unhued and oddly shaped
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 2:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1E9A),                                                 // 7834 (0x1E9A) hook
                                        new AddonDeed(0x1E9D),                                                 // 7837 (0x1E9D) pulleys
                                        new AddonDeed(0x1E9E),                                                 // 7838 (0x1E9E) Pulley
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1EA0),                                                 // 7840 (0x1EA0) Rope
                                        new AddonDeed(0x1EA9, Direction.South),                                // 7849 (0x1EA9) Winch – south
                                        new AddonDeed(0x1EAC, Direction.East),                                 // 7852 (0x1EAC) Winch – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 3:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0FCD, Direction.South),                                               // 4045 (0x0FCD) string of shells – south
                                        new AddonDeed(0x0FCE, Direction.South),                                               // 4046 (0x0FCE) string of shells – south
                                        new AddonDeed(0x0FCF, Direction.South),                                               // 4047 (0x0FCF) – string of shells – south
                                        new AddonDeed(0x0FD0, Direction.South),                                               // 4048 (0x0FD0) – string of shells – south
                                        new AddonDeed(0x0FD1, Direction.East),                                                // 4049 (0x0FD1) – string of shells – east
                                        new AddonDeed(0x0FD2, Direction.East),                                                // 4050 (0x0FD2) – string of shells – east
                                        new AddonDeed(0x0FD3, Direction.East),                                                // 4051 (0x0FD3) – string of shells – east
                                        new AddonDeed(0x0FD4, Direction.East),                                                // 4052 (0x0FD4) – string of shells – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    switch (Utility.Random(4))
                                    {
                                    case 0:
                                        // 4099 (0x1003) – Spittoon
                                        chest.DropItem(new ShipwreckedItem(0x1003));
                                        break;

                                    case 1:
                                        // 4091 (0x0FFB) – Skull mug 1
                                        chest.DropItem(new ShipwreckedItem(0x0FFB));
                                        break;

                                    case 2:
                                        // 4092 (0x0FFC) – Skull mug 2
                                        chest.DropItem(new ShipwreckedItem(0x0FFC));
                                        break;

                                    case 3:
                                        // 3700 (0x0E74) Cannon Balls
                                        chest.DropItem(new AddonDeed(0x0E74));
                                        break;
                                    }
                                }
                                break;

                            case 4:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0C2C),                                                 // 3116 (0x0C2C) Ruined Painting
                                        new AddonDeed(0x0C18),                                                 // 3096 (0x0C18) Covered chair - (server birth on osi)
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1EA3, Direction.South),                                                 // 7843 (0x1EA3) net – south
                                        new AddonDeed(0x1EA4, Direction.East),                                                  // 7844 (0x1EA4) net – east
                                        new AddonDeed(0x1EA5, Direction.South),                                                 // 7845 (0x1EA5) net – south
                                        new AddonDeed(0x1EA6, Direction.East),                                                  // 7846 (0x1EA6) net – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 5:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkFlowerTapestrySouthDeed(),
                                        new DarkFlowerTapestryEastDeed(),
                                        new LightTapestrySouthDeed(),
                                        new LightTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkTapestrySouthDeed(),
                                        new DarkTapestryEastDeed(),
                                        new LightFlowerTapestrySouthDeed(),
                                        new LightFlowerTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;
                            }
                        }

                        // 1 in 1000 chance at the actual item (rare)
                        if (Utility.RandomChance(.1))
                        {
                            switch (sos.Level)
                            {
                            case 1:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0DBB,                                         // 3515 (0x0DBB) Seaweed
                                        0x0C2E,                                         // 3118 (0x0C2E) debris
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x154D,                                                 // 5453 (0x054D) water barrel – empty or filled we don't have them on ai yet.
                                        0x0DC9,                                                 // 3529 (0x0DC9) fishing net – unhued and oddly shaped
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 2:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x1E9A,                                         // 7834 (0x1E9A) hook
                                        0x1E9D,                                         // 7837 (0x1E9D) pulleys
                                        0x1E9E,                                         // 7838 (0x1E9E) Pulley
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1EA0,                                         // 7840 (0x1EA0) Rope
                                        0x1EA9,                                         // 7849 (0x1EA9) Winch – south
                                        0x1EAC,                                         // 7852 (0x1EAC) Winch – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 3:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0FCD,                                         // 4045 (0x0FCD) string of shells – south
                                        0x0FCE,                                         // 4046 (0x0FCE) string of shells – south
                                        0x0FCF,                                         // 4047 (0x0FCF) – string of shells – south
                                        0x0FD0,                                         // 4048 (0x0FD0) – string of shells – south
                                        0x0FD1,                                         // 4049 (0x0FD1) – string of shells – east
                                        0x0FD2,                                         // 4050 (0x0FD2) – string of shells – east
                                        0x0FD3,                                         // 4051 (0x0FD3) – string of shells – east
                                        0x0FD4,                                         // 4052 (0x0FD4) – string of shells – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1003,                                         // 4099 (0x1003) – Spittoon
                                        0x0FFB,                                         // 4091 (0x0FFB) – Skull mug 1
                                        0x0FFC,                                         // 4092 (0x0FFC) – Skull mug 2
                                        0x0E74,                                         // 3700 (0x0E74) Cannon Balls
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 4:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0C2C,                                         // 3116 (0x0C2C) Ruined Painting
                                        0x0C18,                                         // 3096 (0x0C18) Covered chair - (server birth on osi)
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1EA3,                                         // 7843 (0x1EA3) net – south
                                        0x1EA4,                                         // 7844 (0x1EA4) net – east
                                        0x1EA5,                                         // 7845 (0x1EA5) net – south
                                        0x1EA6,                                         // 7846 (0x1EA6) net – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 5:                                     // same frequent drop
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkFlowerTapestrySouthDeed(),
                                        new DarkFlowerTapestryEastDeed(),
                                        new LightTapestrySouthDeed(),
                                        new LightTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkTapestrySouthDeed(),
                                        new DarkTapestryEastDeed(),
                                        new LightFlowerTapestrySouthDeed(),
                                        new LightFlowerTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;
                            }
                        }

                        (chest as LockableContainer).Movable   = true;
                        (chest as LockableContainer).Locked    = false;
                        (chest as LockableContainer).TrapType  = TrapType.None;
                        (chest as LockableContainer).TrapPower = 0;
                        (chest as LockableContainer).TrapLevel = 0;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from, args));
        }
Exemple #6
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                         // unfinished barrel
                                0xA2A,                                          // stool
                                0xC1F,                                          // broken clock
                                0x1047, 0x1048,                                 // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4,                 // barrel staves
                                0xB5B, 0xB4F, 0xB5E, 0xB57, 0xB53,              // chairs
                                0x1560, 0x1562, 0x155D, 0x155E, 0x1582, 0x1634, //Deco Bows/Swords
                                0x156C, 0x157E, 0x1580, 0x1565, 0x1578, 0x1569, //Deco Shields/Axe
                                0xC1B, 0xC10, 0xC19, 0xC2C, 0xC2D, 0xB95,       // Ruined things/Sign
                                0xE31, 0x19AA, 0x1853, 0x9FB, 0xA05, 0xA26,     // Light sources
                                0x1EA7, 0x26AC, 0x1879, 0x1005, 0x185B, 0xEFB,  // Misc items
                                0x1810, 0xEFC, 0X14F8, 0x166E                   // More Misc Items
                                //
                                // *** Can easily add more stuff to fish up while doing chest!!
                                //
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            // This statement converts to Item and tags "... from shipwreck"
                            break;
                        }
                        }

                        if (preLoot != null)                    // Drew a "0-5" in above Case Stmt and have preLoot
                        {
                            if (0.143 > Utility.RandomDouble()) // Spawn weak monster ~ every 7 tries
                            {
                                BaseCreature serp1;

                                switch (Utility.Random(5))
                                {
                                case 0:  { serp1 = new IcebergSnake(); break; }

                                case 1:  { serp1 = new SeaSlime(); break; }

                                case 2:  { serp1 = new SeaWorm(); break; }

                                case 3:  { serp1 = new ToxicSlime(); break; }

                                default: { serp1 = new OilSlime(); break; }
                                }

                                int x = from.X, y = from.Y;
                                Map map = from.Map;

                                for (int ii = 0; map != null && ii < 20; ++ii)
                                {
                                    int  tx = from.X - 10 + Utility.Random(21);
                                    int  ty = from.Y - 10 + Utility.Random(21);
                                    Tile t  = map.Tiles.GetLandTile(tx, ty);

                                    if (t.Z == -5 && ((t.ID >= 0xA8 && t.ID <= 0xAB) || (t.ID >= 0x136 && t.ID <= 0x137)) && !Spells.SpellHelper.CheckMulti(new Point3D(tx, ty, -5), map))
                                    {
                                        x = tx;
                                        y = ty;
                                        break;
                                    }
                                }

                                serp1.MoveToWorld(new Point3D(x, y, -5), map);
                                serp1.Home      = serp1.Location;
                                serp1.RangeHome = 10;
                                from.SendLocalizedMessage(503170); // Uh oh! That doesn't look like a fish!
                            }

                            return(preLoot);
                        }

                        sos.Delete();

                        WoodenChest chest = new WoodenChest();

                        TreasureMapChest.Fill(chest, Utility.RandomMinMax(1, 4));

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }