// // 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; } }