//
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
namespace MUnique.OpenMU.Persistence.Initialization;
using MUnique.OpenMU.DataModel;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.DataModel.Configuration.Quests;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic;
///
/// Extension methods to make quest creation easier.
///
internal static class QuestDefinitionExtensions
{
///
/// Adds a to this quest definition.
///
/// The quest definition.
/// The amount.
/// The monster number.
/// The context.
/// The game configuration.
/// This quest definition.
public static QuestDefinition WithMonsterKillRequirement(this QuestDefinition questDefinition, int amount, short monsterNumber, IContext context, GameConfiguration gameConfiguration)
{
var killRequirement = context.CreateNew();
var parentNumber = (ushort)((ushort)questDefinition.Number | (questDefinition.Group << 10));
killRequirement.SetGuid(parentNumber.ToSigned(), monsterNumber, questDefinition.QualifiedCharacter?.Number ?? 0);
killRequirement.MinimumNumber = amount;
killRequirement.Monster = gameConfiguration.Monsters.First(m => m.Number == monsterNumber);
questDefinition.RequiredMonsterKills.Add(killRequirement);
return questDefinition;
}
///
/// Adds a of to this quest definition.
///
/// The quest definition.
/// The money amount.
/// The context.
/// This quest definition.
public static QuestDefinition WithMoneyReward(this QuestDefinition questDefinition, int moneyAmount, IContext context)
{
var reward = context.CreateNew();
reward.Value = moneyAmount;
reward.RewardType = QuestRewardType.Money;
questDefinition.Rewards.Add(reward);
return questDefinition;
}
///
/// Adds a of to this quest definition.
///
/// The quest definition.
/// The experience amount.
/// The context.
/// This quest definition.
public static QuestDefinition WithExperienceReward(this QuestDefinition questDefinition, int experienceAmount, IContext context)
{
var reward = context.CreateNew();
reward.Value = experienceAmount;
reward.RewardType = QuestRewardType.Experience;
questDefinition.Rewards.Add(reward);
return questDefinition;
}
///
/// Adds a of to this quest definition.
///
/// The quest definition.
/// The item group.
/// The item number.
/// The context.
/// The game configuration.
/// The item level.
/// The item option.
/// if set to true [has luck].
/// if set to true [has skill].
/// This quest definition.
public static QuestDefinition WithItemReward(
this QuestDefinition questDefinition,
int itemGroup,
int itemNumber,
IContext context,
GameConfiguration gameConfiguration,
byte itemLevel = 0,
int itemOption = 0,
bool hasLuck = false,
bool hasSkill = false)
{
var reward = context.CreateNew();
reward.RewardType = QuestRewardType.Item;
var item = context.CreateNew- ();
item.Definition = gameConfiguration.Items.First(def => def.Group == itemGroup && def.Number == itemNumber);
item.HasSkill = item.Definition.Skill != null && hasSkill;
item.Durability = item.IsWearable() ? item.GetMaximumDurabilityOfOnePiece() : item.Durability;
item.Level = itemLevel;
if (hasLuck
&& item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.FirstOrDefault(o => o.OptionType == ItemOptionTypes.Luck) is { } luckOption)
{
var optionLink = context.CreateNew();
optionLink.ItemOption = luckOption;
item.ItemOptions.Add(optionLink);
}
if (itemOption > 0
&& item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.FirstOrDefault(o => o.OptionType == ItemOptionTypes.Option) is { } optionOption)
{
var optionLink = context.CreateNew();
optionLink.ItemOption = optionOption;
optionLink.Level = itemOption / 4;
item.ItemOptions.Add(optionLink);
}
reward.ItemReward = item;
questDefinition.Rewards.Add(reward);
return questDefinition;
}
///
/// Adds a to this quest definition.
///
/// The quest definition.
/// The item group.
/// The item number.
/// The context.
/// The game configuration.
/// The durability.
/// The item level.
/// The item option (4 ~ 12).
/// If set to true, the item must have luck.
/// If set to true, the item must have skill.
/// The item count, default 1.
/// This quest definition.
public static QuestDefinition WithItemRequirement(
this QuestDefinition questDefinition,
int itemGroup,
int itemNumber,
IContext context,
GameConfiguration gameConfiguration,
byte durability = 0,
byte itemLevel = 0,
int itemOption = 0,
bool hasLuck = false,
bool hasSkill = false,
byte itemCount = 1)
{
var requirement = context.CreateNew();
requirement.MinimumNumber = itemCount;
var item = context.CreateNew
- ();
item.Definition = gameConfiguration.Items.First(def => def.Group == itemGroup && def.Number == itemNumber);
item.HasSkill = item.Definition.Skill != null && hasSkill;
item.Durability = durability;
item.Level = itemLevel;
if (hasLuck
&& item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.FirstOrDefault(o => o.OptionType == ItemOptionTypes.Luck) is { } luckOption)
{
var optionLink = context.CreateNew();
optionLink.ItemOption = luckOption;
item.ItemOptions.Add(optionLink);
}
if (itemOption > 0
&& item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.FirstOrDefault(o => o.OptionType == ItemOptionTypes.Option) is { } optionOption)
{
var optionLink = context.CreateNew();
optionLink.ItemOption = optionOption;
optionLink.Level = itemOption / 4;
item.ItemOptions.Add(optionLink);
}
requirement.Item = item.Definition; // TODO?
questDefinition.RequiredItems.Add(requirement);
return questDefinition;
}
}