protected virtual void FinishEffect( Point3D p, Map map, Mobile from )
		{
			from.RevealingAction();

			int count = GetSpawnCount();

			for ( int i = 0; map != null && i < count; ++i )
			{
				BaseCreature spawn;

				switch ( Utility.Random( 5 ) )
				{
					default:
					case 0: spawn = new SeaSerpent(); break;
					case 1: spawn = new DeepSeaSerpent(); break;
					case 2: spawn = new WaterElemental(); break;
					case 3: spawn = new Kraken(); break;
					case 4: spawn = new DeepWaterElemental(); break;
				}

				Spawn( p, map, spawn );

				spawn.Combatant = from;
			}

			Delete();
		}
Beispiel #2
0
        public override bool Give( Mobile m, Item item, bool placeAtFeet )
        {
            // This code is triggered when you've harvested a Map/MIB/Net. You first
            // spawn a critter and then add the special item to his/her pack for loot

            if ( item is TreasureMap || item is MessageInABottle || item is SpecialFishingNet )
            {
                BaseCreature serp;

                switch ( Utility.Random(11) )
                {
                    case 0:  { serp = new DeepSeaSnake(); break; }
                    case 1:  { serp = new DeepWaterElemental(); break; }
                    case 2:  { serp = new FlameShark(); break; }
                    case 3:  { serp = new HurricaneElemental(); break; }
                    case 4:  { serp = new IcebergElemental(); break; }
                    case 5:  { serp = new RoamingKraken(); break; }
                    case 6:  { serp = new StormSerpent(); break; }
                    case 7:  { serp = new TsunamiSerpent(); break; }
                    case 8:  { serp = new GiantWaterStrider(); break; }
                    case 9:  { serp = new DeepSeaSerpent(); break; }
                    default: { serp = new SeaSerpent(); break; }
                }

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

                for ( int i = 0; map != null && i < 20; ++i )
                {
                    int tx = m.X - 10 + Utility.Random( 21 );
                    int ty = m.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;
                    }
                }

                serp.MoveToWorld( new Point3D( x, y, -5 ), map );

                serp.Home = serp.Location;
                serp.RangeHome = 10;

                serp.PackItem( item );

                m.SendLocalizedMessage( 503170 ); // Uh oh! That doesn't look like a fish!

                return true; // we don't want to give the item to the player, it's on the serpent
            }

            // BigFish go into the pack, but why does it look like they are put at feet? R12?
            if ( item is BigFish || item is WoodenChest )
                placeAtFeet = true;

            // Here's where we sometimes replace the Big fish with a Special Item.
            // Note that we have to trigger on the Big Fish to stop folks from
            // macroing on the shore (shallow water) for Magic Weps. This method
            // does not have the right variables for deepwater check

            if ( item is BigFish ) // We know we're in Deepwater, and it's a rare event
            {

                double leet_loot_chance = 0.1;

                if ( leet_loot_chance > Utility.RandomDouble() )
                {
                    switch (Utility.Random(2))
                    {
                        case 0:
                            {
                                BaseWeapon temp_weapon = Loot.RandomWeapon();
                                temp_weapon.DamageLevel = (WeaponDamageLevel)Utility.Random(6);
                                temp_weapon.AccuracyLevel = (WeaponAccuracyLevel)Utility.Random(6);
                                temp_weapon.DurabilityLevel = (WeaponDurabilityLevel)Utility.Random(1);
                                // Item was in the water forever...shouldn't be very durable
                                item = (Item)temp_weapon;
                                break;
                            }
                        default:
                            {
                                BaseArmor temp_armor = Loot.RandomArmor();
                                temp_armor.ProtectionLevel = (ArmorProtectionLevel)Utility.Random(4);
                                temp_armor.Durability = (ArmorDurabilityLevel)Utility.Random(1);
                                // Item was in the water forever...shouldn't be very durable
                                item = (Item)temp_armor;
                                break;
                            }
                    }
                }
                // else just give the fisher a Big Fish

            }
            // Could also easily add variations on the following...but I've left it at Weps/Armor
            // item = Loot.RandomShield();
            // item = Loot.RandomJewelry();
            // item = Loot.RandomInstrument();
            // item = Loot.RandomScroll(2, 8, SpellbookType.Regular);
            // item = Loot.RandomPotion();
            // item = new BankCheck( 1000000 );
            // item = new ShipwreckedItem(5055); // Chain tunic with Shipwreck Label

            return base.Give( m, item, placeAtFeet );  // Here's where you GIVE player the "item"
        }
Beispiel #3
0
        public override void SendSuccessTo( Mobile from, Item item, HarvestResource resource )
        {
            if ( item is BigFish )
            {
                // Deleted this message since you can now get loot, which is notta fish
                // I wish I knew how to send "custom" message to the screen like...
                // "Whoa! You just reeled in something very interesting"

                // from.SendLocalizedMessage( 1042635 ); // Your fishing pole bends as you pull a big fish from the depths!

                ((BigFish)item).Fisher = from;
            }
            else if ( item is WoodenChest )
            {
                from.SendLocalizedMessage( 503175 ); // You pull up a heavy chest from the depths of the ocean!
            }
            else
            {
                int number;
                string name;

                if ( item is BaseMagicFish )
                {
                    number = 1008124;
                    name = "a mess of small fish";
                }
                else if ( item is Fish )
                {
                    number = 1008124;
                    name = "a fish";
                }
                else if ( item is BaseShoes )
                {
                    number = 1008124;
                    name = item.ItemData.Name;
                }
                else if ( item is TreasureMap )
                {
                    number = 1008125;
                    name = "a sodden piece of parchment";
                }
                else if ( item is MessageInABottle )
                {
                    number = 1008125;
                    name = "a bottle, with a message in it";
                }
                else if (item is SpecialFishingNet)
                {
                    number = 1008125;
                    name = "a special fishing net"; // TODO: this is just a guess--what should it really be named?
                }
                else
                {
                    number = 1043297; // It's Some Other Stuff...

                    // Console.WriteLine(item.ItemData.Name);

                    if ((item.ItemData.Flags & TileFlag.ArticleA) != 0)
                        name = "a " + item.ItemData.Name;
                    else if ((item.ItemData.Flags & TileFlag.ArticleAn) != 0)
                        name = "an " + item.ItemData.Name;
                    else
                        name = item.ItemData.Name;

                    if (number == 1043297)
                        from.SendLocalizedMessage(number, name);
                    else
                        from.SendLocalizedMessage(number, true, name);

                }

                double temp_random_dbl = Utility.RandomDouble();
                // Console.WriteLine("Trying to spawn Random Monster when 0.05 > {0}", temp_random_dbl);

                if ( 0.05 > temp_random_dbl )  // Spawn a monster ~ every 20 tries
                {
                     BaseCreature serp2;

                     switch (Utility.Random(11))
                     {
                         case 0:  { serp2 = new DeepSeaSnake(); break; }
                         case 1:  { serp2 = new DeepWaterElemental(); break; }
                         case 2:  { serp2 = new FlameShark(); break; }
                         case 3:  { serp2 = new HurricaneElemental(); break; }
                         case 4:  { serp2 = new IcebergElemental(); break; }
                         case 5:  { serp2 = new RoamingKraken(); break; }
                         case 6:  { serp2 = new StormSerpent(); break; }
                         case 7:  { serp2 = new TsunamiSerpent(); break; }
                         case 8:  { serp2 = new GiantWaterStrider(); break; }
                         case 9:  { serp2 = new DeepSeaSerpent(); break; }
                         default: { serp2 = new SeaSerpent(); break; }

                     }

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

                     for (int i = 0; map != null && i < 20; ++i)
                     {
                         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;
                         }
                     }

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

                }
            }
        }
Beispiel #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, Map.Felucca);
			}
			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, (int)(from.Skills[SkillName.Fishing].Value - 75.0)))
					{
						Item preLoot = null;

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

									preLoot = new ShipwreckedItem(Utility.RandomList(list));
									break;
								}
							case 1: // Bone parts
								{
									var list = new[]
									{
										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
								{
									var list = new[]
									{
										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;
						}
						chest.Breakable = false;
						chest.Locked = false;

						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);
							var 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 = sos.Level;

						TreasureMapChest.Fill(chest, soslevel, from.Expansion);

						if (!sos.IsAncient)
						{
							chest.Locked = false;
						}

						double chance = Utility.RandomDouble();
						BaseCreature mibmonster1;
						BaseCreature mibmonster2;
						mibmonster1 = new DeepWaterElemental();
						if (chance <= 0.02 && from.Skills[SkillName.Fishing].Base >= 115)
						{
							mibmonster2 = new Osiredon();
							int choice = Utility.Random(5);
							switch (choice)
							{
								case 4:
									mibmonster2.PackItem(new SmallFishingNetDeed());
									break;
								case 3:
									mibmonster2.PackItem(new LargeFishingNetDeed());
									break;
								case 2:
									mibmonster2.PackItem(new Shell());
									break;
								case 1:
									mibmonster2.PackItem(new Anchor());
									break;
								case 0:
									mibmonster2.PackItem(new Hook());
									break;
							}
						}
						else if (soslevel < 5)
						{
							mibmonster2 = new WaterElemental();
						}
						else
						{
							mibmonster2 = new DeepWaterElemental();
						}
						int x = from.X, y = from.Y;

						Map map = from.Map;

						mibmonster1.MoveToWorld(new Point3D(x, y, -5), map);
						mibmonster2.MoveToWorld(new Point3D(x, y, -5), map);

						mibmonster1.Home = mibmonster1.Location;
						mibmonster1.HomeMap = mibmonster1.Map;
						mibmonster1.RangeHome = 10;

						mibmonster2.Home = mibmonster2.Location;
						mibmonster2.HomeMap = mibmonster2.Map;
						mibmonster2.RangeHome = 10;

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

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

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

						sos.Delete();

						return chest;
					}
				}
			}

			return base.Construct(type, from);
		}