using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Engines.Quests;
using Server.Network;
using Server.Gumps;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class RoyalBritannianGuardOrders : BaseJournal
{
public override TextDefinition Title { get { return 1158159; } } // Royal Britannian Guard Orders
public override TextDefinition Body { get { return 1158160; } }
/*ROYAL BRITANNIAN GUARD
MINISTRY OF PRISONS DETACHMENT
ORIGINAL ORDERS
ROYAL BRITANNIAN GUARD
WRONG PRISON
* DIVISION
From: COMMAND, RBG Yew
To: Lieutenant Bennet Yardley, RBG Yew
Subject: Wrong Prison Treasure
* Expedition
1. RBG Intelligence has indicated the presence of highly prized cache of weapons stashed within the
* deepest confinements of the Prison Dungeon Wrong. Intelligence indicates these weapons were confiscated at the time of
* various assassination attempts among the prisoners before the prison was lost.
2. Official cover story remains in
* place - no outside interference expected and only official RBG personnel are permitted entry.
3. Interview with
* former prison officials indicate weapons under heavy lock and key, suggest specialist assignment of lock picking skills
* and tools.
*The remainder of the document is illegible**/
public override int LabelNumber { get { return 1158171; } } // orders
[Constructable]
public RoyalBritannianGuardOrders()
{
LootType = LootType.Blessed;
}
public RoyalBritannianGuardOrders(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class CorpseOfBennetYardley : Item, IConditionalVisibility
{
public static CorpseOfBennetYardley TramInstance { get; set; }
public static CorpseOfBennetYardley FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new CorpseOfBennetYardley();
TramInstance.MoveToWorld(new Point3D(5688, 653, 0), Map.Trammel);
}
if (FelInstance == null)
{
FelInstance = new CorpseOfBennetYardley();
FelInstance.MoveToWorld(new Point3D(5688, 653, 0), Map.Felucca);
}
}
}
public override bool ForceShowProperties { get { return true; } }
public override int LabelNumber { get { return 1158168; } }
public CorpseOfBennetYardley()
: base(Utility.Random(0xECA, 9))
{
Movable = false;
}
public bool CanBeSeenBy(PlayerMobile pm)
{
if (pm.AccessLevel > AccessLevel.Player)
return true;
var quest = QuestHelper.GetQuest(pm);
return quest != null && !quest.Completed;
}
public override void OnDoubleClick(Mobile from)
{
if (from is PlayerMobile && from.InRange(Location, 2))
{
var quest = QuestHelper.GetQuest((PlayerMobile)from);
if (from is PlayerMobile && quest != null && !quest.Completed)
{
quest.Objectives[0].CurProgress++;
quest.OnCompleted();
Visible = false;
Visible = true;
}
}
}
public CorpseOfBennetYardley(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
public class TreasureHuntingBook : Item
{
[Constructable]
public TreasureHuntingBook()
: base(0xFBE)
{
LootType = LootType.Blessed;
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && IsChildOf(m.Backpack))
{
m.CloseGump(typeof(InternalGump));
BaseGump.SendGump(new InternalGump((PlayerMobile)m));
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1158253); // Treasure Hunting: A Practical Approach
list.Add(1154760, "#1158254"); // By: Vespyr Jones
}
public class InternalGump : BaseGump
{
public InternalGump(PlayerMobile pm)
: base(pm, 10, 10)
{
}
public override void AddGumpLayout()
{
AddImage(0, 0, 0x761C);
AddImage(112, 40, 0x655);
AddHtmlLocalized(113, 350, 342, 280, 1158255, C32216(0x080808), false, true);
}
}
public TreasureHuntingBook(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class BuriedRichesTreasureMap : TreasureMap
{
public TreasureMapChest Chest { get; set; }
public BuriedRichesTreasureMap(int level)
: base(level, Map.Trammel)
{
LootType = LootType.Blessed;
}
public override void Decode(Mobile from)
{
if (QuestHelper.HasQuest((PlayerMobile)from))
{
from.CheckSkill(SkillName.Cartography, 0, 100);
Decoder = from;
DisplayTo(from);
from.SendLocalizedMessage(1158243); // Your time studying Treasure Hunting: A Practical Approach helps you decode the map...
}
else
{
from.PrivateOverheadMessage(MessageType.Regular, 0x21, 1157850, from.NetState); // *You don't make anything of it.*
//m.PrivateOverheadMessage(MessageType.Regular, 1154, 1158244, m.NetState); // *You decide to visit the Provisioner at the Adventurer's Supplies in Vesper before trying to decode the map...*
}
}
public override void DisplayTo(Mobile m)
{
base.DisplayTo(m);
m.PlaySound(0x41A);
m.PrivateOverheadMessage(MessageType.Regular, 1154, 1157722, "Cartography", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
if (m is PlayerMobile && Level == 0)
{
m.CloseGump(typeof(InternalGump));
BaseGump.SendGump(new InternalGump((PlayerMobile)m, this));
}
}
public override void OnChestOpened(Mobile from, TreasureMapChest chest)
{
if (from is PlayerMobile)
{
var quest = QuestHelper.GetQuest((PlayerMobile)from);
if (quest != null)
{
if (Level == 0)
{
TownCryerSystem.CompleteQuest((PlayerMobile)from, 1158239, 1158251, 0x655);
/*Your eyes widen as you pry open the old chest and reveal the treasure within! Even this small cache
* excites you as the thought of bigger and better treasure looms on the horizon! The map is covered
* in ancient runes and marks the location of another treasure hoard. You carefully furl the map and
* set off on your next adventure!*/
from.SendLocalizedMessage(1158245, "", 0x23); // You have found the first zealot treasure! As you dig up the chest a leather bound case appears to contain an additional map. You place it in your backpack for later examination.
chest.DropItem(new BuriedRichesTreasureMap(1));
}
else
{
from.SendLocalizedMessage(1158246, "", 0x23); // You have found the second zealot treasure! As you dig up the chest a leather bound case appears to contain an additional map. You place it in your backpack for later examination.
quest.CompleteQuest();
}
}
}
}
public override void OnBeginDig(Mobile from)
{
if (Completed)
{
from.SendLocalizedMessage(503028); // The treasure for this map has already been found.
}
else if (Decoder != from)
{
from.SendLocalizedMessage(503031); // You did not decode this map and have no clue where to look for the treasure.
}
else if (!from.CanBeginAction(typeof(TreasureMap)))
{
from.SendLocalizedMessage(503020); // You are already digging treasure.
}
else if (from.Map != Facet)
{
from.SendLocalizedMessage(1010479); // You seem to be in the right place, but may be on the wrong facet!
}
else if (from is PlayerMobile && !QuestHelper.HasQuest((PlayerMobile)from))
{
from.SendLocalizedMessage(1158257); // You must be on the "The Treasure Chase" quest offered via the Town Cryer to dig up this treasure.
}
else
{
from.SendLocalizedMessage(503033); // Where do you wish to dig?
from.Target = new TreasureMap.DigTarget(this);
}
}
protected override bool HasRequiredSkill(Mobile from)
{
return true;
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Level == 0)
{
list.Add(1158229); // A mysterious treasure map personally given to you by the Legendary Cartographer in Vesper
}
else
{
list.Add(1158256); // A mysterious treasure map recovered from a treasure hoard
}
}
private class InternalGump : BaseGump
{
public BuriedRichesTreasureMap Map { get; set; }
public InternalGump(PlayerMobile pm, BuriedRichesTreasureMap map)
: base(pm, 10, 10)
{
Map = map;
}
public override void AddGumpLayout()
{
AddBackground(0, 0, 454, 400, 9380);
AddHtmlLocalized(177, 53, 235, 20, CenterLoc, "#1158240", C32216(0xA52A2A), false, false); // A Mysterious Treasure Map
AddHtmlLocalized(177, 80, 235, 40, CenterLoc, Map.Level == 0 ? "#1158241" : "#1158250", C32216(0xA52A2A), false, false); // Given to you by the Master Cartographer
/*The Cartographer has given you a mysterious treasure map and offered you some tips on how to go about
* recovering the treasure. As the Cartographer leaned in and handed you the furled parchment, she told
* you of the origins of this mysterious document. "Legend has it..." she tells you, "this map is the
* lost treasure of an ancient Sosarian Order of Zealots. I'm told over the centuries they would bury
* small portions of their treasure throughout the Britannian countryside in an effort to thwart any
* attempts to recover the hoard in its entirety." Your eyes widen at the thought of a massive treasure
* hoard and you can't wait to find it!*/
AddHtmlLocalized(177, 122, 235, 228, 1158242, true, true);
AddItem(85, 120, 0x14EB, 0);
}
}
public BuriedRichesTreasureMap(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write(Chest);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
Chest = reader.ReadItem() as TreasureMapChest;
}
}
public class TreasureSeekersLockpick : Lockpick
{
public override int LabelNumber { get { return 1158258; } }
public TreasureSeekersLockpick()
{
ItemID = 0x14FD;
}
protected override void BeginLockpick(Mobile from, ILockpickable item)
{
if (from is PlayerMobile &&
item.Locked &&
QuestHelper.HasQuest((PlayerMobile)from) &&
item is TreasureMapChest &&
((TreasureMapChest)item).TreasureMap is BuriedRichesTreasureMap)
{
var chest = (TreasureMapChest)item;
from.PlaySound(0x241);
Timer.DelayCall(TimeSpan.FromMilliseconds(200), () =>
{
if (item.Locked && from.InRange(chest.GetWorldLocation(), 1))
{
from.CheckTargetSkill(SkillName.Lockpicking, item, 0, 100);
// Success! Pick the lock!
from.PrivateOverheadMessage(MessageType.Regular, 1154, 1158252, from.NetState); // *Your recent study of Treasure Hunting helps you pick the lock...*
chest.SendLocalizedMessageTo(from, 502076); // The lock quickly yields to your skill.
from.PlaySound(0x4A);
item.LockPick(from);
}
});
}
else
{
base.BeginLockpick(from, item);
}
}
public TreasureSeekersLockpick(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class MysteriousPotion : Item
{
public override int LabelNumber { get { return 1158286; } } // A Mysterious Potion
public MysteriousPotion()
: base(0xF06)
{
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile)
{
var pm = m as PlayerMobile;
if (QuestHelper.HasQuest(pm))
{
if (!TownCryerSystem.UnderMysteriousPotionEffects(pm))
{
pm.SendGump(new ConfirmCallbackGump(pm, 1158286, 1158287, null, null, confirm: (mob, o) =>
{
TownCryerSystem.AddMysteriousPotionEffects(mob);
mob.FixedParticles(0x376A, 9, 32, 5007, EffectLayer.Waist);
mob.PlaySound(0x1E3);
BasePotion.PlayDrinkEffect(mob);
Delete();
}));
}
else
{
pm.SendLocalizedMessage(1158289); // You have already used this.
}
}
else
{
pm.SendLocalizedMessage(1158285); // You must be on the "A Forced Sacrifice" quest to use this item.
}
}
}
public MysteriousPotion(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class PaladinCorpse : Container
{
public static PaladinCorpse TramInstance { get; set; }
public static PaladinCorpse FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new PaladinCorpse();
TramInstance.MoveToWorld(new Point3D(5396, 118, 0), Map.Trammel);
}
if (FelInstance == null)
{
FelInstance = new PaladinCorpse();
FelInstance.MoveToWorld(new Point3D(5396, 118, 0), Map.Felucca);
}
}
}
public override int LabelNumber { get { return 1158135; } } // the remains of a would-be paladin
public override bool HandlesOnMovement { get { return true; } }
public override bool IsDecoContainer { get { return false; } }
public PaladinCorpse()
: base(0x9F1E)
{
DropItem(new WouldBePaladinChronicles());
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (InRange(m.Location, 2) && !InRange(oldLocation, 2))
{
PrivateOverheadMessage(Server.Network.MessageType.Regular, 1154, 1158137, m.NetState); // *You notice the skeleton clutching a small journal...*
}
}
public PaladinCorpse(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
public class WouldBePaladinChronicles : BaseJournal
{
public override int LabelNumber { get { return 1094837; } } // a journal
public override TextDefinition Title { get { return null; } }
public override TextDefinition Body { get { return 1158138; } }
/**the text is mostly a journal chronicling the adventures of a man who wished to join the Paladins of Trinsic.
* Of particular note is the final entry...*
This is the most shameful entry I will write...for I have fallen
* short of my goal. My only hope is my failures will serve to assist those who come after me with the courage to
* pursue the truth, and with my notes they will find success. I have found strange crystals on the corpses of the
* creatures I slay here. When I touch the crystal, I can feel it absorbed into my being. A growing voice inside me
* compels me to altars located throughout the dungeon. When the voice within grew loud enough I could no longer
* ignore it, I touched my hand to the altar and before me a grand champion stood! I was quick to react to the
* crushing blow my newly summoned opponent sought to deliver, and I was victorious! Alas, the deeper into the
* dungeon I explored, the more powerful the altar champions become and now I find myself in this dire situation....
* To anyone who reads this...do me the honor and defeat the three champions and slay the unbound energy vortexes that
* inhabit the deepest depths of this place...for I feel my time here is shor...*/
public WouldBePaladinChronicles()
{
Movable = false;
}
public override void OnDoubleClick(Mobile m)
{
m.SendGump(new BaseJournalGump(Title, Body));
}
public WouldBePaladinChronicles(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
}