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

584 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Server;
using Server.Mobiles;
using Server.Items;
using Server.Gumps;
using Server.Engines.Points;
using Server.Engines.Quests;
namespace Server.Engines.Khaldun
{
public class GoingGumshoeQuest : BaseQuest
{
public override bool DoneOnce { get { return true; } }
/* Going Gumshoe */
public override object Title { get { return 1158588; } }
/*You've heard rumblings of Pagan Cultists causing petty crimes in the more upscale sections of Britannia's cities,
* but to your understanding these are sympathizers taking advantage of fear to make some easy coin. Still, if the
* Crown is rolling out a new division of the RBG to investigate...something...you bet there's an opportunity for
* you! You should find Inspector Jasper and inquire further.*/
public override object Description { get { return 1158589; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Find Inspector Jasper, and inquire about the Town Cryer article at the new Detective Branch in East Britain */
public override object Uncomplete { get { return 1158590; } }
public override object Complete { get { return null; } }
public override int AcceptSound { get { return 0x2E8; } }
public override int CompleteMessage { get { return 1158616; } } // // You've found Chief Inspector Jasper! Speak to him to learn more!
public GoingGumshoeQuest()
{
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
AddObjective(new InternalObjective());
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class GoingGumshoeQuest2 : BaseQuest
{
public override bool DoneOnce { get { return true; } }
/* Going Gumshoe */
public override object Title { get { return 1158588; } }
/*You can drop the coffee pods with the investigators outside...*looks up*...oh, you aren't here for the delivery? I warned
* them talking with reporters was a terrible idea - we've been getting walk-ins like you since the article broke, lads
* and ladies thinking they can become renowned detectives - Ha! Think you've got the intellect? The cunning and wisdom
* to sniff a case where it leads you? Well I guess we'll see about that. I've got bigger cases to deal with, you can
* take this one. Something about vandalism and a funeral at the Britain Cemetery. Report back to me if you find anything
* worthwhile - and I do mean worthwhile! Don't come back to me with half baked theories and bogus evidence. I need facts!
* Oh - and read this, you'll need it if you even hope to break a single case.*/
public override object Description { get { return 1158592; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/*What are you still doing here? Didn't I send you to the cemetery? */
public override object Uncomplete { get { return 1158594; } }
public override object Complete { get { return null; } }
public override int AcceptSound { get { return 0x2E8; } }
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
// Note to whoever reads this: This is stupid but I find no easier way to do this...
public bool VisitedHeastone1 { get; set; }
public bool VisitedHeastone2 { get; set; }
public bool VisitedHeastone3 { get; set; }
public bool VisitedHeastone4 { get; set; }
public bool ClueBook1_1 { get; set; }
public bool ClueBook1_2 { get; set; }
public bool ClueDust1 { get; set; }
public bool ClueBook2_1 { get; set; }
public bool ClueBook2_2 { get; set; }
public bool ClueDust2 { get; set; }
public bool ClueBook3_1 { get; set; }
public bool ClueBook3_2 { get; set; }
public bool ClueDust3 { get; set; }
public bool ClueBook4_1 { get; set; }
public bool ClueBook4_2 { get; set; }
public bool ClueDust4 { get; set; }
public bool IsComplete
{
get
{
return ClueBook1_1 && ClueBook1_2 && ClueDust1 &&
ClueBook2_1 && ClueBook2_2 && ClueDust2 &&
ClueBook3_1 && ClueBook3_2 && ClueDust3 &&
ClueBook4_1 && ClueBook4_2 && ClueDust4;
}
}
public GoingGumshoeQuest2()
{
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
AddObjective(new InternalObjective());
}
public override void OnAccept()
{
base.OnAccept();
Item book = new DetectiveBook();
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, book, false))
{
Owner.BankBox.DropItem(book);
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(VisitedHeastone1);
writer.Write(VisitedHeastone2);
writer.Write(VisitedHeastone3);
writer.Write(VisitedHeastone4);
writer.Write(ClueBook1_1);
writer.Write(ClueBook1_2);
writer.Write(ClueDust1);
writer.Write(ClueBook2_1);
writer.Write(ClueBook2_2);
writer.Write(ClueDust2);
writer.Write(ClueBook3_1);
writer.Write(ClueBook3_2);
writer.Write(ClueDust3);
writer.Write(ClueBook4_1);
writer.Write(ClueBook4_2);
writer.Write(ClueDust4);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
VisitedHeastone1 = reader.ReadBool();
VisitedHeastone2 = reader.ReadBool();
VisitedHeastone3 = reader.ReadBool();
VisitedHeastone4 = reader.ReadBool();
ClueBook1_1 = reader.ReadBool();
ClueBook1_2 = reader.ReadBool();
ClueDust1 = reader.ReadBool();
ClueBook2_1 = reader.ReadBool();
ClueBook2_2 = reader.ReadBool();
ClueDust2 = reader.ReadBool();
ClueBook3_1 = reader.ReadBool();
ClueBook3_2 = reader.ReadBool();
ClueDust3 = reader.ReadBool();
ClueBook4_1 = reader.ReadBool();
ClueBook4_2 = reader.ReadBool();
ClueDust4 = reader.ReadBool();
}
private class InternalObjective : BaseObjective
{
/* You have been assigned as a probationary investigator with the Detective Branch of the RBG. Pursue leads and follow the clues where they lead you... */
public override object ObjectiveDescription { get { return 1158593; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class GoingGumshoeQuest3 : BaseQuest
{
public override bool DoneOnce { get { return true; } }
/* Going Gumshoe */
public override object Title { get { return 1158588; } }
/**You approach Inspector Jasper and show him the evidence you have discovered as well as your report
* on the state of your investigation* Would you look at that, I suspect you aren't as useless as you
* look. With a little luck you may even crack this case wide open! It looks like these notes are encrypted
* - we need to find out what they say. There's a cryptologist at the Lycaeum who I've worked with in the
* past. Get his help and we should be a step closer to figuring out what all this means.*/
public override object Description { get { return 1158595; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/*What are you still doing here? Didn't I send you to the Lycaeum?*/
public override object Uncomplete { get { return 1158597; } }
public override object Complete { get { return null; } }
public override int AcceptSound { get { return 0x2E8; } }
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
public Item BookCase { get; set; }
public bool FoundCipherBook { get; set; }
public bool BegunDecrypting { get; set; }
public bool IsComplete
{
get { return BegunDecrypting; }
}
public GoingGumshoeQuest3()
{
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
AddObjective(new InternalObjective());
if (!World.Loading)
{
BookCase = GetBookcase();
}
}
private LibraryBookcase GetBookcase()
{
IPooledEnumerable eable = Map.Trammel.GetItemsInBounds(Bounds[Utility.Random(Bounds.Length)]);
List<Item> bookcases = new List<Item>();
foreach (Item item in eable)
{
if (item is LibraryBookcase)
{
bookcases.Add(item);
}
}
if (bookcases.Count > 0)
{
var bookcase = bookcases[Utility.Random(bookcases.Count)];
ColUtility.Free(bookcases);
return (LibraryBookcase)bookcase;
}
Console.WriteLine("Error: GoingGumshoeQuest3 has no bookcases. setup LibraryBookcase per EA via [CreateWorld command.");
return null;
}
public static bool CheckBookcase(Mobile from, Item item)
{
if (from is PlayerMobile)
{
var quest = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)from);
if (quest != null && !quest.FoundCipherBook)
{
if (quest.BookCase == null)
{
quest.BookCase = quest.GetBookcase();
}
if (item == quest.BookCase)
{
quest.FoundCipherBook = true;
from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x47E, 1158713, from.NetState);
// *You find the cipher text hidden among the books! Return to the Cryptologist to tell him where it is!*
var region = Region.Find(from.Location, from.Map);
if (region is QuestRegion)
{
((QuestRegion)region).ClearFromMessageTable(from);
}
return true;
}
}
}
return false;
}
public static Rectangle2D[] Bounds =
{
new Rectangle2D(4285, 961, 10, 18),
new Rectangle2D(4325, 961, 10, 18),
new Rectangle2D(4285, 989, 10, 18),
new Rectangle2D(4325, 989, 10, 18)
};
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(BookCase);
writer.Write(FoundCipherBook);
writer.Write(BegunDecrypting);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
BookCase = reader.ReadItem();
FoundCipherBook = reader.ReadBool();
BegunDecrypting = reader.ReadBool();
if (BookCase == null)
{
Timer.DelayCall(() => GetBookcase());
}
}
private class InternalObjective : BaseObjective
{
/* Go to the Lycaeum in Moonglow and enlist the assistance of the Cryptologist to help decode the evidence. Return to Inspector Jasper
* when you have more to report. */
public override object ObjectiveDescription { get { return 1158596; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
private class QuestRegion : Region
{
public static void Initialize()
{
new QuestRegion();
}
public QuestRegion()
: base("Going Gumshoe Quest Region",
Map.Trammel,
Region.DefaultPriority,
GoingGumshoeQuest3.Bounds)
{
Register();
}
private Dictionary<Mobile, DateTime> _MessageTable;
public override void OnLocationChanged(Mobile m, Point3D oldLocation)
{
base.OnLocationChanged(m, oldLocation);
if (m is PlayerMobile)
{
var quest = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)m);
if (quest != null && !quest.FoundCipherBook && 0.2 > Utility.RandomDouble())
{
var rec = GoingGumshoeQuest3.Bounds.FirstOrDefault(b => b.Contains(m.Location));
if (rec.Contains(quest.BookCase) && CanGiveMessage(m))
{
//m.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x47E, 1158714, m.NetState);
m.SendLocalizedMessage(1158714);
// *Your keen senses detect the books in this library have been recently disturbed...*
_MessageTable[m] = DateTime.UtcNow + TimeSpan.FromSeconds(15);
}
}
}
}
private bool CanGiveMessage(Mobile m)
{
if (_MessageTable == null)
{
_MessageTable = new Dictionary<Mobile, DateTime>();
return true;
}
if (_MessageTable.ContainsKey(m))
{
return _MessageTable[m] < DateTime.UtcNow;
}
return true;
}
public void ClearFromMessageTable(Mobile m)
{
if (_MessageTable != null && _MessageTable.ContainsKey(m))
{
_MessageTable.Remove(m);
if (_MessageTable.Count == 0)
{
_MessageTable = null;
}
}
}
}
}
public class GoingGumshoeQuest4 : BaseQuest
{
public override bool DoneOnce { get { return true; } }
/* Going Gumshoe */
public override object Title { get { return 1158588; } }
/*I must say, you've done fine work. The Cryptologist's courier arrived shortly before you did, and thanks to
* him we know what this is all about. There's one final piece of the puzzle, and hopefully for us whoever
* is at the bottom of this won't have known to look for a dead man. There is a Sage called Humbolt that
* once lived in Papua. Tragically his life was taken from us too soon, but his spirit still wanders around
* his old home. If anyone can put all the pieces together, it's him. Go to Papua and find him.*/
public override object Description { get { return 1158634; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/*Go to Papau and search for the spirit of Sage Humbolt*/
public override object Uncomplete { get { return 1158635; } }
public override object Complete { get { return null; } }
public override int AcceptSound { get { return 0x2E8; } }
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
public bool IsComplete { get; set; }
public GoingGumshoeQuest4()
{
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
AddObjective(new InternalObjective());
}
public override void GiveRewards()
{
Item reward = new DetectiveCredentials();
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, reward, false))
{
Owner.BankBox.DropItem(reward);
}
reward = new GumshoeTitleDeed();
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, reward, false))
{
Owner.BankBox.DropItem(reward);
}
base.GiveRewards();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(IsComplete);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
IsComplete = reader.ReadBool();
}
private class InternalObjective : BaseObjective
{
/* Go to Papau and search for the spirit of Sage Humbolt */
public override object ObjectiveDescription { get { return 1158635; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}