Files
abysmal-isle/Scripts/Services/MondainsLegacyQuests/Gumps/MondainQuestGump.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

720 lines
28 KiB
C#

using System;
using Server.Gumps;
using Server.Mobiles;
namespace Server.Engines.Quests
{
public enum Buttons
{
Close,
CloseQuest,
RefuseQuest,
ResignQuest,
AcceptQuest,
AcceptReward,
PreviousPage,
NextPage,
Complete,
CompleteQuest,
RefuseReward
}
public class MondainQuestGump : BaseQuestGump
{
private const int ButtonOffset = 11;
private readonly object m_Quester;
private readonly PlayerMobile m_From;
private readonly BaseQuest m_Quest;
private readonly bool m_Offer;
private readonly bool m_Completed;
private Section m_Section;
public MondainQuestGump(PlayerMobile from)
: this(from, null, Section.Main, false, false)
{
}
public MondainQuestGump(BaseQuest quest)
: this(quest, Section.Description, true)
{
}
public MondainQuestGump(BaseQuest quest, Section section, bool offer)
: this(null, quest, section, offer, false)
{
}
public MondainQuestGump(BaseQuest quest, Section section, bool offer, bool completed)
: this(null, quest, section, offer, completed)
{
}
public MondainQuestGump(PlayerMobile owner, BaseQuest quest, Section section, bool offer, bool completed)
: this(owner, quest, section, offer, completed, null)
{
}
public MondainQuestGump(PlayerMobile owner, BaseQuest quest, Section section, bool offer, bool completed, object quester)
: base(75, 25)
{
m_Quester = quester;
m_Quest = quest;
m_Section = section;
m_Offer = offer;
m_Completed = completed;
if (quest != null)
m_From = quest.Owner;
else
m_From = owner;
Closable = false;
Disposable = true;
Dragable = true;
Resizable = false;
AddPage(0);
AddImageTiled(50, 20, 400, 460, 0x1404);
AddImageTiled(50, 29, 30, 450, 0x28DC);
AddImageTiled(34, 140, 17, 339, 0x242F);
AddImage(48, 135, 0x28AB);
AddImage(-16, 285, 0x28A2);
AddImage(0, 10, 0x28B5);
AddImage(25, 0, 0x28B4);
AddImageTiled(83, 15, 350, 15, 0x280A);
AddImage(34, 479, 0x2842);
AddImage(442, 479, 0x2840);
AddImageTiled(51, 479, 392, 17, 0x2775);
AddImageTiled(415, 29, 44, 450, 0xA2D);
AddImageTiled(415, 29, 30, 450, 0x28DC);
AddImage(370, 50, 0x589);
if ((int)m_From.AccessLevel > (int)AccessLevel.Counselor && quest != null)
{
AddButton(379, 60, 0x15A9, 0x15A9, (int)Buttons.CompleteQuest, GumpButtonType.Reply, 0);
}
else
{
if (m_Quest == null)
{
AddImage(379, 60, 0x15A9);
}
else
{
AddImage(379, 60, 0x1580);
}
}
AddImage(425, 0, 0x28C9);
AddImage(90, 33, 0x232D);
AddImageTiled(130, 65, 175, 1, 0x238D);
switch ( m_Section )
{
case Section.Main:
SecMain();
break;
case Section.Description:
SecDescription();
break;
case Section.Objectives:
SecObjectives();
break;
case Section.Rewards:
SecRewards();
break;
case Section.Refuse:
SecRefuse();
break;
case Section.Complete:
SecComplete();
break;
case Section.InProgress:
SecInProgress();
break;
case Section.Failed:
SecFailed();
break;
}
}
public enum Section
{
Main,
Description,
Objectives,
Rewards,
Refuse,
Complete,
InProgress,
Failed
}
public virtual void SecMain()
{
if (m_From == null)
return;
AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
int offset = 140;
for (int i = m_From.Quests.Count - 1; i >= 0; i--)
{
BaseQuest quest = m_From.Quests[i];
AddHtmlObject(98, offset, 270, 21, quest.Title, quest.Failed ? 0x3C00 : White, false, false);
AddButton(368, offset, 0x26B0, 0x26B1, ButtonOffset + i, GumpButtonType.Reply, 0);
offset += 21;
}
AddButton(313, 455, 0x2EEC, 0x2EEE, (int)Buttons.Close, GumpButtonType.Reply, 0);
}
public virtual void SecDescription()
{
if (m_Quest == null)
return;
if (!m_Quest.RenderDescription(this, m_Offer))
{
if (m_Offer)
AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
if (m_Quest.Failed)
AddHtmlLocalized(160, 80, 200, 32, 500039, 0x3C00, false, false); // Failed!
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
if (m_Quest.ChainID != QuestChain.None)
AddHtmlLocalized(98, 140, 312, 16, 1075024, 0x2710, false, false); // Description (quest chain)
else
AddHtmlLocalized(98, 140, 312, 16, 1072202, 0x2710, false, false); // Description
AddHtmlObject(98, 156, 312, 180, m_Quest.Description, LightGreen, false, true);
if (m_Offer)
{
AddButton(95, 455, 0x2EE0, 0x2EE2, (int)Buttons.AcceptQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EF2, 0x2EF4, (int)Buttons.RefuseQuest, GumpButtonType.Reply, 0);
}
else
{
AddButton(95, 455, 0x2EF5, 0x2EF7, (int)Buttons.ResignQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EEC, 0x2EEE, (int)Buttons.CloseQuest, GumpButtonType.Reply, 0);
}
if (m_Quest.ShowDescription)
AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
}
}
public virtual void SecObjectives()
{
if (m_Quest == null)
return;
if (m_Offer)
{
AddButton(95, 455, 0x2EE0, 0x2EE2, (int)Buttons.AcceptQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EF2, 0x2EF4, (int)Buttons.RefuseQuest, GumpButtonType.Reply, 0);
}
else
{
AddButton(95, 455, 0x2EF5, 0x2EF7, (int)Buttons.ResignQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EEC, 0x2EEE, (int)Buttons.CloseQuest, GumpButtonType.Reply, 0);
}
if (!m_Quest.RenderObjective(this, m_Offer))
{
if (m_Offer)
AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
if (m_Quest.AllObjectives)
AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following
else
AddHtmlLocalized(98, 156, 312, 16, 1072209, 0x2710, false, false); // Only one of the following
int offset = 172;
for (int i = 0; i < m_Quest.Objectives.Count; i++)
{
BaseObjective objective = m_Quest.Objectives[i];
if (objective is SlayObjective)
{
SlayObjective slay = (SlayObjective)objective;
if (slay != null)
{
AddHtmlLocalized(98, offset, 30, 16, 1072204, 0x15F90, false, false); // Slay
AddLabel(133, offset, 0x481, slay.MaxProgress + " " + slay.Name); // %count% + %name%
offset += 16;
if (m_Offer)
{
if (slay.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(slay.Seconds)); // %est. time remaining%
offset += 16;
}
continue;
}
if (slay.Region != null)
{
AddHtmlLocalized(103, offset, 312, 20, 1018327, 0x15F90, false, false); // Location
AddHtmlObject(223, offset, 312, 20, slay.Region.Name, White, false, false); // %location%
offset += 16;
}
AddHtmlLocalized(103, offset, 120, 16, 3000087, 0x15F90, false, false); // Total
AddLabel(223, offset, 0x481, slay.CurProgress.ToString()); // %current progress%
offset += 16;
if (ReturnTo() != null)
{
AddHtmlLocalized(103, offset, 120, 16, 1074782, 0x15F90, false, false); // Return to
AddLabel(223, offset, 0x481, ReturnTo()); // %return to%
offset += 16;
}
if (slay.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(slay.Seconds)); // %est. time remaining%
offset += 16;
}
}
}
else if (objective is ObtainObjective)
{
ObtainObjective obtain = (ObtainObjective)objective;
if (obtain != null)
{
AddHtmlLocalized(98, offset, 40, 16, 1072205, 0x15F90, false, false); // Obtain
AddLabel(143, offset, 0x481, obtain.MaxProgress + " " + obtain.Name); // %count% + %name%
if (obtain.Image > 0)
AddItem(350, offset, obtain.Image, obtain.Hue); // Image
offset += 16;
if (m_Offer)
{
if (obtain.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(obtain.Seconds)); // %est. time remaining%
offset += 16;
}
else if (obtain.Image > 0)
offset += 16;
continue;
}
AddHtmlLocalized(103, offset, 120, 16, 3000087, 0x15F90, false, false); // Total
AddLabel(223, offset, 0x481, obtain.CurProgress.ToString()); // %current progress%
offset += 16;
if (ReturnTo() != null)
{
AddHtmlLocalized(103, offset, 120, 16, 1074782, 0x15F90, false, false); // Return to
AddLabel(223, offset, 0x481, ReturnTo()); // %return to%
offset += 16;
}
if (obtain.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(obtain.Seconds)); // %est. time remaining%
offset += 16;
}
}
}
else if (objective is DeliverObjective)
{
DeliverObjective deliver = (DeliverObjective)objective;
if (deliver != null)
{
AddHtmlLocalized(98, offset, 40, 16, 1072207, 0x15F90, false, false); // Deliver
AddLabel(143, offset, 0x481, deliver.MaxProgress + " " + deliver.DeliveryName); // %name%
offset += 16;
AddHtmlLocalized(103, offset, 120, 16, 1072379, 0x15F90, false, false); // Deliver to
AddLabel(223, offset, 0x481, deliver.DestName); // %deliver to%
offset += 16;
if (deliver.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(deliver.Seconds)); // %est. time remaining%
offset += 16;
}
}
}
else if (objective is EscortObjective)
{
EscortObjective escort = (EscortObjective)objective;
if (escort != null)
{
AddHtmlLocalized(98, offset, 312, 16, 1072206, 0x15F90, false, false); // Escort to
if (escort.Label == 0)
{
AddHtmlObject(173, offset, 200, 16, escort.Region.Name, White, false, false);
}
else
{
AddHtmlLocalized(173, offset, 200, 16, escort.Label, 0xFFFFFF, false, false);
}
offset += 16;
if (escort.Timed)
{
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(escort.Seconds)); // %est. time remaining%
offset += 16;
}
}
}
else if (objective is ApprenticeObjective)
{
ApprenticeObjective apprentice = (ApprenticeObjective)objective;
if (apprentice != null)
{
AddHtmlLocalized(98, offset, 200, 16, 1077485, "#" + (1044060 + (int)apprentice.Skill) + "\t" + apprentice.MaxProgress, 0x15F90, false, false); // Increase ~1_SKILL~ to ~2_VALUE~
offset += 16;
}
}
else if (objective is SimpleObjective && ((SimpleObjective)objective).Descriptions != null)
{
SimpleObjective obj = (SimpleObjective)objective;
for (int j = 0; j < obj.Descriptions.Count; j++)
{
offset += 16;
AddLabel(98, offset, 0x481, obj.Descriptions[j]);
}
if (obj.Timed)
{
offset += 16;
AddHtmlLocalized(103, offset, 120, 16, 1062379, 0x15F90, false, false); // Est. time remaining:
AddLabel(223, offset, 0x481, FormatSeconds(obj.Seconds)); // %est. time remaining%
}
}
else if (objective.ObjectiveDescription != null)
{
if (objective.ObjectiveDescription is int)
{
AddHtmlLocalized(98, offset, 310, 300, (int)objective.ObjectiveDescription, 0x15F90, false, false);
}
else if (objective.ObjectiveDescription is string)
{
AddHtmlObject(98, offset, 310, 300, (string)objective.ObjectiveDescription, LightGreen, false, false);
}
}
}
AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
}
}
public virtual void SecRewards()
{
if (m_Quest == null)
return;
if (m_Offer)
AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlLocalized(98, 140, 312, 16, 1072201, 0x2710, false, false); // Reward
int offset = 163;
for (int i = 0; i < m_Quest.Rewards.Count; i++)
{
BaseReward reward = m_Quest.Rewards[i];
if (reward != null)
{
AddImage(105, offset, 0x4B9);
AddHtmlObject(133, offset, 280, m_Quest.Rewards.Count == 1 ? 100 : 16, reward.Name, LightGreen, false, false);
offset += 16;
}
}
if (m_Completed)
{
AddButton(95, 455, 0x2EE0, 0x2EE2, (int)Buttons.AcceptReward, GumpButtonType.Reply, 0);
if (m_Quest.CanRefuseReward)
AddButton(313, 430, 0x2EF2, 0x2EF4, (int)Buttons.RefuseReward, GumpButtonType.Reply, 0);
else
AddButton(313, 455, 0x2EE6, 0x2EE8, (int)Buttons.Close, GumpButtonType.Reply, 0);
}
else if (m_Offer)
{
AddButton(95, 455, 0x2EE0, 0x2EE2, (int)Buttons.AcceptQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EF2, 0x2EF4, (int)Buttons.RefuseQuest, GumpButtonType.Reply, 0);
AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
}
else
{
AddButton(95, 455, 0x2EF5, 0x2EF7, (int)Buttons.ResignQuest, GumpButtonType.Reply, 0);
AddButton(313, 455, 0x2EEC, 0x2EEE, (int)Buttons.CloseQuest, GumpButtonType.Reply, 0);
AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
}
}
public virtual void SecRefuse()
{
if (m_Quest == null)
return;
if (m_Offer)
{
AddHtmlLocalized(130, 45, 270, 16, 3006156, 0xFFFFFF, false, false); // Quest Conversation
AddImage(140, 110, 0x4B9);
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlObject(98, 140, 312, 180, m_Quest.Refuse, LightGreen, false, true);
AddButton(313, 455, 0x2EE6, 0x2EE8, (int)Buttons.Close, GumpButtonType.Reply, 0);
}
}
public virtual void SecInProgress()
{
if (m_Quest == null)
return;
AddHtmlLocalized(130, 45, 270, 16, 3006156, 0xFFFFFF, false, false); // Quest Conversation
AddImage(140, 110, 0x4B9);
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlObject(98, 140, 312, 180, m_Quest.Uncomplete, LightGreen, false, true);
AddButton(313, 455, 0x2EE6, 0x2EE8, (int)Buttons.Close, GumpButtonType.Reply, 0);
}
public virtual void SecComplete()
{
if (m_Quest == null)
return;
if (m_Quest.Complete == null)
{
if (QuestHelper.TryDeleteItems(m_Quest))
{
if (QuestHelper.AnyRewards(m_Quest))
{
m_Section = Section.Rewards;
SecRewards();
}
else
m_Quest.GiveRewards();
}
return;
}
AddHtmlLocalized(130, 45, 270, 16, 3006156, 0xFFFFFF, false, false); // Quest Conversation
AddImage(140, 110, 0x4B9);
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlObject(98, 140, 312, 180, m_Quest.Complete, LightGreen, false, true);
AddButton(313, 455, 0x2EE6, 0x2EE8, (int)Buttons.Close, GumpButtonType.Reply, 0);
AddButton(95, 455, 0x2EE9, 0x2EEB, (int)Buttons.Complete, GumpButtonType.Reply, 0);
}
public virtual void SecFailed()
{
if (m_Quest == null)
return;
object fail = m_Quest.FailedMsg;
if (fail == null)
fail = "You have failed to meet the conditions of the quest.";
AddHtmlLocalized(130, 45, 270, 16, 3006156, 0xFFFFFF, false, false); // Quest Conversation
AddImage(140, 110, 0x4B9);
AddHtmlObject(160, 70, 200, 40, m_Quest.Title, DarkGreen, false, false);
AddHtmlObject(98, 140, 312, 240, fail, LightGreen, false, true);
AddButton(313, 455, 0x2EE6, 0x2EE8, (int)Buttons.Close, GumpButtonType.Reply, 0);
}
public virtual string FormatSeconds(int seconds)
{
int hours = seconds / 3600;
seconds -= hours * 3600;
int minutes = seconds / 60;
seconds -= minutes * 60;
if (hours > 0 && minutes > 0)
return hours + ":" + minutes + ":" + seconds;
else if (minutes > 0)
return minutes + ":" + seconds;
else
return seconds.ToString();
}
public virtual string ReturnTo()
{
if (m_Quest == null)
return null;
if (m_Quest.StartingMobile != null)
{
string returnTo = m_Quest.StartingMobile.Name;
if (m_Quest.StartingMobile.Region != null)
returnTo = String.Format("{0} ({1})", returnTo, m_Quest.StartingMobile.Region.Name);
else
returnTo = String.Format("{0}", returnTo);
return returnTo;
}
return null;
}
public override void OnResponse(Server.Network.NetState state, RelayInfo info)
{
if (m_From != null)
m_From.CloseGump(typeof(MondainQuestGump));
switch ( info.ButtonID )
{
// close quest list
case (int)Buttons.Close:
break;
// close quest
case (int)Buttons.CloseQuest:
m_From.SendGump(new MondainQuestGump(m_From));
break;
// accept quest
case (int)Buttons.AcceptQuest:
if (m_Offer)
m_Quest.OnAccept();
break;
// refuse quest
case (int)Buttons.RefuseQuest:
if (m_Offer)
{
m_Quest.OnRefuse();
m_From.SendGump(new MondainQuestGump(m_Quest, Section.Refuse, true));
}
break;
// resign quest
case (int)Buttons.ResignQuest:
if (!m_Offer)
m_From.SendGump(new MondainResignGump(m_Quest));
break;
// accept reward
case (int)Buttons.AcceptReward:
if (!m_Offer && m_Section == Section.Rewards && m_Completed)
m_Quest.GiveRewards();
break;
// refuse reward
case (int)Buttons.RefuseReward:
if (!m_Offer && m_Section == Section.Rewards && m_Completed)
m_Quest.RefuseRewards();
break;
// previous page
case (int)Buttons.PreviousPage:
if (m_Section == Section.Objectives || (m_Section == Section.Rewards && !m_Completed))
{
m_Section = (Section)((int)m_Section - 1);
m_From.SendGump(new MondainQuestGump(m_Quest, m_Section, m_Offer));
}
break;
// next page
case (int)Buttons.NextPage:
if (m_Section == Section.Description || m_Section == Section.Objectives)
{
m_Section = (Section)((int)m_Section + 1);
m_From.SendGump(new MondainQuestGump(m_Quest, m_Section, m_Offer));
}
break;
// player complete quest
case (int)Buttons.Complete:
if (!m_Offer && m_Section == Section.Complete)
{
if (!m_Quest.Completed)
m_From.SendLocalizedMessage(1074861); // You do not have everything you need!
else
{
if (QuestHelper.TryDeleteItems(m_Quest))
{
if (m_Quester != null)
m_Quest.Quester = m_Quester;
if (!QuestHelper.AnyRewards(m_Quest))
m_Quest.GiveRewards();
else
m_From.SendGump(new MondainQuestGump(m_Quest, Section.Rewards, false, true));
}
else
{
m_From.SendLocalizedMessage(1074861); // You do not have everything you need!
}
}
}
break;
// admin complete quest
case (int)Buttons.CompleteQuest:
if ((int)m_From.AccessLevel > (int)AccessLevel.Counselor && m_Quest != null)
QuestHelper.CompleteQuest(m_From, m_Quest);
break;
// show quest
default:
if (m_Section != Section.Main || info.ButtonID >= m_From.Quests.Count + ButtonOffset || info.ButtonID < ButtonOffset)
break;
m_From.SendGump(new MondainQuestGump(m_From.Quests[(int)info.ButtonID - ButtonOffset], Section.Description, false));
break;
}
}
}
}