Files
abysmal-isle/Scripts/Quests/CloakOfHumility/CloakOfHumilityQuest.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

490 lines
20 KiB
C#
Raw Permalink Blame History

using System;
using Server.Items;
using Server.Mobiles;
using System.Collections.Generic;
using Server.Gumps;
using Server.Commands;
using System.Linq;
namespace Server.Engines.Quests
{
public class TheQuestionsQuest : BaseQuest
{
public TheQuestionsQuest() : base()
{
AddObjective(new QuestionAndAnswerObjective(4, m_EntryTable));
}
public override bool ShowDescription { get { return false; } }
public override QuestChain ChainID { get { return QuestChain.CloakOfHumility; } }
public override Type NextQuest { get { return typeof(CommunityServiceMuseumQuest); } }
public override object Title { get { return 1075850; } } // Know Thy Humility
/*Greetings my friend! My name is Gareth, and I represent a group of citizens who wish to rejuvenate interest in our
* kingdom's noble heritage. 'Tis our belief that one of Britannia's greatest triumphs was the institution of the Virtues,
* neglected though they be now. To that end I have a set of tasks prepared for one who would follow a truly Humble path.
* Art thou interested in joining our effort?*/
public override object Description { get { return 1075675; } }
//I wish that thou wouldest reconsider.
public override object Refuse { get { return 1075677; } }
//Wonderful! First, let us see if thou art reading from the same roll of parchment as we are. *smiles*
public override object Uncomplete { get { return 1075676; } }
/*Very good! I can see that ye hath more than just a passing interest in our work. There are many trials before thee, but
* I have every hope that ye shall have the diligence and fortitude to carry on to the very end. Before we begin, please
* prepare thyself by thinking about the virtue of Humility. Ponder not only its symbols, but also its meanings. Once ye
* believe that thou art ready, speak with me again.*/
public override object Complete { get { return 1075714; } }
/*Ah... no, that is not quite right. Truly, Humility is something that takes time and experience to understand. I wish to
* challenge thee to seek out more knowledge concerning this virtue, and tomorrow let us speak again about what thou hast
* learned.<br>*/
public override object FailedMsg { get { return 1075713; } }
public override bool RenderObjective(MondainQuestGump g, bool offer)
{
if (offer)
g.AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
g.AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
g.AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
g.AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
g.AddHtmlObject(160, 70, 200, 40, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
g.AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following
int offset = 172;
string str;
foreach (QuestionAndAnswerObjective obj in Objectives.OfType<QuestionAndAnswerObjective>())
{
if (offer)
str = String.Format("Answer {0} questions correctly.", obj.MaxProgress);
else
str = String.Format("Answer {0}/{1} questions answered correctly.", obj.CurProgress, obj.MaxProgress);
g.AddHtmlObject(98, offset, 312, 16, str, BaseQuestGump.LightGreen, false, false);
offset += 16;
}
return true;
}
public override void OnAccept()
{
base.OnAccept();
Owner.SendGump(new QAndAGump(Owner, this));
}
public override void OnResign(bool chain)
{
base.OnResign(chain);
m_CooldownTable[Owner] = DateTime.UtcNow + TimeSpan.FromHours(24);
}
public override bool CanOffer()
{
DefragCooldown();
if (!m_CooldownTable.ContainsKey(Owner) || Owner.AccessLevel > AccessLevel.Player)
return base.CanOffer();
return false;
}
private static void DefragCooldown()
{
List<Mobile> toRemove = new List<Mobile>();
foreach (KeyValuePair<Mobile, DateTime> kvp in m_CooldownTable)
{
if (kvp.Value < DateTime.UtcNow)
toRemove.Add(kvp.Key);
}
foreach (Mobile m in toRemove)
{
if (m_CooldownTable.ContainsKey(m))
m_CooldownTable.Remove(m);
}
}
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 static void Configure()
{
m_EntryTable[0] = new QuestionAndAnswerEntry(1075708, new object[] { 1075709 }, new object[] { 1075710, 1075711, 1075712 }); //<center>Finish this truism: Humility shows us...</center>
m_EntryTable[1] = new QuestionAndAnswerEntry(1075678, new object[] { 1075679 }, new object[] { 1075680, 1075681, 1075682 }); //<center>What is the symbol of Humility?</center>
m_EntryTable[2] = new QuestionAndAnswerEntry(1075683, new object[] { 1075685 }, new object[] { 1075684, 1075686, 1075687 }); //<center>What opposes Humility?</center>
m_EntryTable[3] = new QuestionAndAnswerEntry(1075688, new object[] { 1075691 }, new object[] { 1075689, 1075690, 1075692 }); //<center>What is the color of Humility?</center>
m_EntryTable[4] = new QuestionAndAnswerEntry(1075693, new object[] { 1075697 }, new object[] { 1075694, 1075695, 1075696 }); //<center>How doth one find Humility?</center>
m_EntryTable[5] = new QuestionAndAnswerEntry(1075698, new object[] { 1075700 }, new object[] { 1075699, 1075601, 1075602 }); //<center>Which city embodies the need for Humility?</center>
m_EntryTable[6] = new QuestionAndAnswerEntry(1075703, new object[] { 1075705 }, new object[] { 1075704, 1075706, 1075707 }); //<center>By name, which den of evil challenges one<6E>s humility?</center>
}
private static QuestionAndAnswerEntry[] m_EntryTable = new QuestionAndAnswerEntry[7];
public static QuestionAndAnswerEntry[] EntryTable { get { return m_EntryTable; } }
private static Dictionary<Mobile, DateTime> m_CooldownTable = new Dictionary<Mobile, DateTime>();
public static Dictionary<Mobile, DateTime> CooldownTable { get { return m_CooldownTable; } }
}
public class CommunityServiceMuseumQuest : BaseQuest
{
public CommunityServiceMuseumQuest() : base()
{
AddObjective(new CollectionsObtainObjective(typeof(ShepherdsCrookOfHumility), "Shepherd's Crook of Humility", 1));
}
public override QuestChain ChainID { get { return QuestChain.CloakOfHumility; } }
public override Type NextQuest { get { return typeof(CommunityServiceZooQuest); } }
//Community Service - Museum
public override object Title { get { return 1075716; } }
/*'Tis time to help out the community of Britannia. Visit the Vesper Museum and donate to their collection, and eventually thou will
* be able to receive a replica of the Shepherd's Crook of Humility. Once ye have it, return to me. Art thou willing to do this?*/
public override object Description { get { return 1075717; } }
//I wish that thou wouldest reconsider.
public override object Refuse { get { return 1075719; } }
//Hello my friend. The museum sitteth in southern Vesper. If ye go downstairs, ye will discover a small donation chest.
//That is the place where ye should leave thy donation.
public override object Uncomplete { get { return 1075720; } }
/*Terrific! The Museum is a worthy cause. Many will benefit from the inspiration and learning that thine donation hath supported.*/
public override object Complete { get { return 1075721; } }
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 CommunityServiceZooQuest : BaseQuest
{
public CommunityServiceZooQuest()
: base()
{
AddObjective(new CollectionsObtainObjective(typeof(ForTheLifeOfBritanniaSash), "Life of Britannia Sash", 1));
}
public override QuestChain ChainID { get { return QuestChain.CloakOfHumility; } }
public override Type NextQuest { get { return typeof(CommunityServiceLibraryQuest); } }
//Community Service <20> Zoo
public override object Title { get { return 1075722; } }
/*Now, go on and donate to the Moonglow Zoo. Givest thou enough to receive a 'For the Life of Britannia' sash. Once ye have it,
* return it to me. Wilt thou continue?*/
public override object Description { get { return 1075723; } }
//I wish that thou wouldest reconsider.
public override object Refuse { get { return 1075725; } }
//Hello again. The zoo lies a short ways south of Moonglow. Close to the entrance thou wilt discover a small donation chest.
//That is where thou shouldest leave thy donation.
public override object Uncomplete { get { return 1075726; } }
/*Wonderful! The Zoo is a very special place from which people young and old canst benefit. Thanks to thee, it can continue to thrive.*/
public override object Complete { get { return 1075727; } }
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 CommunityServiceLibraryQuest : BaseQuest
{
public CommunityServiceLibraryQuest()
: base()
{
AddObjective(new CollectionsObtainObjective(typeof(SpecialPrintingOfVirtue), "Special Painint of 'Virtue' Book", 1));
}
public override QuestChain ChainID { get { return QuestChain.CloakOfHumility; } }
public override Type NextQuest { get { return typeof(WhosMostHumbleQuest); } }
//Community Service <20> Library
public override object Title { get { return 1075728; } }
/*I have one more charity for thee, my diligent friend. Go forth and donate to the Britain Library and do that which is necessary to receive
* a special printing of <20>Virtue<75>, by Lord British. Once in hand, bring the book back with ye. Art thou ready?*/
public override object Description { get { return 1075729; } }
//I wish that thou wouldest reconsider.
public override object Refuse { get { return 1075731; } }
//Art thou having trouble? The Library lieth north of Castle British's gates. I believe the representatives in charge of the
//donations are easy enough to find. They await thy visit, amongst the many tomes of knowledge.
public override object Uncomplete { get { return 1075732; } }
/*Very good! The library is of great import to the people of Britannia. Thou hath done a worthy deed and this is thy last
* required donation. I encourage thee to continue contributing to thine community, beyond the obligations of this endeavor.*/
public override object Complete { get { return 1075733; } }
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 WhosMostHumbleQuest : BaseQuest
{
private List<Item> m_QuestItems = new List<Item>();
private List<Mobile> m_GivenTo = new List<Mobile>();
private Dictionary<int, HumilityQuestMobileInfo> m_Infos = new Dictionary<int, HumilityQuestMobileInfo>();
public Dictionary<int, HumilityQuestMobileInfo> Infos { get { return m_Infos; } }
public override bool CanRefuseReward { get { return true; } }
public WhosMostHumbleQuest()
: base()
{
AddObjective(new ObtainObjective(typeof(IronChain), "Iron Chain", 1));
AddReward(new BaseReward(typeof(GoldShield), "A Gold Shield"));
}
public override QuestChain ChainID { get { return QuestChain.CloakOfHumility; } }
//Who's Most Humble
public override object Title { get { return 1075734; } }
/*Thou art challenged to find seven citizens spread out among the towns of Britannia: Skara Brae, Minoc, Britain, and
* one of the towns upon an isle at sea. Each citizen wilt reveal some thought concerning Humility. But who doth best
* exemplify the virtue? Here, thou needeth wear this plain grey cloak, for they wilt know ye by it. Wilt thou continue?*/
public override object Description { get { return 1075735; } }
//'Tis a difficult quest, but well worth it. Wilt thou reconsider?
public override object Refuse { get { return 1075737; } }
/*There art no less than seven 'humble citizens' spread across the Britannia proper. I know that they can be found in the
* towns of Minoc, Skara Brae and Britain. Another may be upon an island at sea, the name of which escapes me at the moment.
* Thou needeth visit all seven to solve the puzzle. Be diligent, for they have a tendency to wander about.<BR><BR><br>Dost
* thou wear the plain grey cloak?*/
public override object Uncomplete { get { return 1075738; } }
/*Noble friend, thou hast performed tremendously! On behalf of the Rise of Britannia I wish to reward thee with this golden
* shield, a symbol of accomplishment and pride for the many things that thou hast done for our people.<BR><BR><br>Dost thou accept?*/
public override object Complete { get { return 1075782; } }
public override void OnAccept()
{
base.OnAccept();
Owner.SendGump(new QuestInfoGump(1075736)); // Excellent. When thou hast satisfied the needs of the most humble, thou wilt be given an item meant for me. Take this <B>brass ring</B> to start ye on the way.
Item cloak = new GreyCloak();
Item ring = new BrassRing();
m_QuestItems.Add(cloak);
m_QuestItems.Add(ring);
Owner.Backpack.DropItem(cloak);
Owner.Backpack.DropItem(ring);
List<Type> itemTypes = new List<Type>(HumilityQuestMobileInfo.ItemTypes);
List<Type> mobTypes = new List<Type>(HumilityQuestMobileInfo.MobileTypes);
for (int i = 0; i < 25; i++)
{
int ran = Utility.RandomMinMax(1, itemTypes.Count - 2);
Type t = itemTypes[ran];
itemTypes.Remove(t);
itemTypes.Insert(Utility.RandomMinMax(1, itemTypes.Count - 2), t);
}
for (int i = 0; i < 25; i++)
{
int ran = Utility.RandomMinMax(0, mobTypes.Count - 2);
if (ran > 0)
{
Type t = mobTypes[ran];
mobTypes.Remove(t);
mobTypes.Insert(Utility.RandomMinMax(1, mobTypes.Count - 2), t);
}
}
for (int i = 0; i < mobTypes.Count; i++)
{
int mobIndex = HumilityQuestMobileInfo.GetNPCIndex(mobTypes[i]);
int need = i;
int give = need + 1;
Type needs = itemTypes[need];
Type gives = itemTypes[give];
m_Infos[mobIndex] = new HumilityQuestMobileInfo(needs, gives, HumilityQuestMobileInfo.GetLoc(needs), HumilityQuestMobileInfo.GetLoc(gives));
}
}
public override void OnResign(bool chain)
{
foreach (Item item in m_QuestItems)
{
if (item != null && !item.Deleted)
item.Delete();
}
base.OnResign(chain);
}
public override void GiveRewards()
{
foreach (Item item in m_QuestItems)
{
if(item != null && !item.Deleted)
item.Delete();
}
Owner.SendGump(new QuestInfoGump(1075783));
base.GiveRewards();
}
public override void RefuseRewards()
{
foreach (Item item in m_QuestItems)
{
if (item is GreyCloak)
((GreyCloak)item).Owner = Owner;
else if (item != null && !item.Deleted)
item.Delete();
}
Owner.SendGump(new QuestInfoGump(1075784));
base.RefuseRewards();
}
public void AddQuestItem(Item item, Mobile from)
{
if (!m_QuestItems.Contains(item))
m_QuestItems.Add(item);
OnGivenTo(from);
}
public void RemoveQuestItem(Item item)
{
if (m_QuestItems.Contains(item))
m_QuestItems.Remove(item);
}
public void OnGivenTo(Mobile m)
{
m_GivenTo.Add(m);
}
public bool HasGivenTo(Mobile m)
{
return m_GivenTo.Contains(m);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(m_QuestItems.Count);
foreach (Item item in m_QuestItems)
writer.Write(item);
writer.Write(m_Infos.Count);
foreach(KeyValuePair<int, HumilityQuestMobileInfo> kvp in m_Infos)
{
writer.Write(kvp.Key);
kvp.Value.Serialize(writer);
}
writer.Write(m_GivenTo.Count);
foreach (Mobile m in m_GivenTo)
writer.Write(m);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
Item item = reader.ReadItem();
if (item != null && !item.Deleted)
m_QuestItems.Add(item);
}
count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
int mobIndex = reader.ReadInt();
m_Infos[mobIndex] = new HumilityQuestMobileInfo(reader);
}
count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
Mobile m = reader.ReadMobile();
if (m != null)
m_GivenTo.Add(m);
}
}
}
}