server-master/srcs/WingsAPI.Game/Quests/CharacterQuest.cs
2026-02-10 18:21:30 +01:00

102 lines
No EOL
3.5 KiB
C#

using System.Collections.Generic;
using WingsEmu.DTOs.Quests;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Game.Quests;
public class CharacterQuest : CharacterQuestDto
{
private readonly IRandomGenerator _randomGenerator;
public CharacterQuest(QuestDto quest, QuestSlotType slotType, IRandomGenerator randomGenerator)
{
Quest = quest;
_randomGenerator = randomGenerator;
SlotType = slotType;
QuestId = quest.Id;
ObjectiveAmount = new Dictionary<int, CharacterQuestObjectiveDto>();
InitializeObjectiveAmount();
}
public QuestDto Quest { get; }
private void InitializeObjectiveAmount()
{
foreach (QuestObjectiveDto objective in Quest.Objectives)
{
ObjectiveAmount.TryAdd(objective.ObjectiveIndex, new CharacterQuestObjectiveDto
{
CurrentAmount = 0,
RequiredAmount = RandomizeObjectiveAmount(objective)
});
}
}
public void ResetQuestProgress()
{
foreach (KeyValuePair<int, CharacterQuestObjectiveDto> objective in ObjectiveAmount)
{
ObjectiveAmount[objective.Key].CurrentAmount = 0;
}
}
private int RandomizeObjectiveAmount(QuestObjectiveDto objective)
{
switch (Quest.QuestType)
{
// Random values
case QuestType.KILL_MONSTER_BY_VNUM: // 1
case QuestType.DROP_HARDCODED: // 2
case QuestType.COMPLETE_TIMESPACE: // 7
case QuestType.CRAFT_WITHOUT_KEEPING: // 8
case QuestType.KILL_PLAYER_IN_REGION: // 27
return objective.Data1 != -1 && objective.Data2 != -1 ? _randomGenerator.RandomNumber(objective.Data1, objective.Data2 + 1) :
objective.Data1 == -1 ? objective.Data2 : objective.Data1;
case QuestType.DELIVER_ITEM_TO_NPC: // 4
case QuestType.CAPTURE_WITHOUT_KEEPING: // 5
case QuestType.CAPTURE_AND_KEEP: // 6
return objective.Data2 != -1 && objective.Data3 != -1 ? _randomGenerator.RandomNumber(objective.Data2, objective.Data3 + 1) :
objective.Data2 == -1 ? objective.Data3 : objective.Data2;
// Fixed values
case QuestType.DROP_CHANCE: // 3
case QuestType.DROP_IN_TIMESPACE: // 13
case QuestType.GIVE_ITEM_TO_NPC: // 14
case QuestType.DIALOG_WHILE_HAVING_ITEM: //16
case QuestType.DROP_CHANCE_2: // 17
case QuestType.COLLECT: // 20
case QuestType.GIVE_ITEM_TO_NPC_2: // 24
return objective.Data2;
case QuestType.COMPLETE_TIMESPACE_WITH_ATLEAST_X_POINTS: // 11
return objective.Data3;
case QuestType.GIVE_NPC_GOLD: //18
return objective.Data1 * 10000;
// Handled differently
case QuestType.DIALOG: // 12
case QuestType.DIALOG_WHILE_WEARING: // 15
case QuestType.GO_TO_MAP: // 19
case QuestType.USE_ITEM_ON_TARGET: // 21
case QuestType.DIALOG_2: // 22
case QuestType.NOTHING: // 23
break;
case QuestType.WIN_RAID_AND_TALK_TO_NPC: // 25
return objective.Data1;
case QuestType.KILL_X_MOBS_SOUND_FLOWER: // 26
return objective.Data0;
// Not used
case QuestType.DIE_X_TIMES: // 9
case QuestType.EARN_REPUTATION: // 10
return 1;
}
return 0;
}
}