diff --git a/Core/Controllers/RepeatableQuestController.cs b/Core/Controllers/RepeatableQuestController.cs index 11fcb8fb..78aa0f93 100644 --- a/Core/Controllers/RepeatableQuestController.cs +++ b/Core/Controllers/RepeatableQuestController.cs @@ -130,7 +130,7 @@ public class RepeatableQuestController // Add repeatable quests of this loops sub-type (daily/weekly) for (var i = 0; i < GetQuestCount(repeatableConfig, pmcData); i++) { - RepeatableQuest quest = new RepeatableQuest(); + var quest = new RepeatableQuest(); var lifeline = 0; while (quest.Id is null && questTypePool.Types.Count > 0) { diff --git a/Core/Generators/RepeatableQuestGenerator.cs b/Core/Generators/RepeatableQuestGenerator.cs index 4099a423..c3485b17 100644 --- a/Core/Generators/RepeatableQuestGenerator.cs +++ b/Core/Generators/RepeatableQuestGenerator.cs @@ -1,16 +1,25 @@ -using Core.Annotations; +using Core.Annotations; using Core.Models.Eft.Common; using Core.Models.Eft.Common.Tables; using Core.Models.Spt.Config; using Core.Models.Spt.Repeatable; +using Core.Models.Utils; +using Core.Utils; namespace Core.Generators; [Injectable] public class RepeatableQuestGenerator { - public RepeatableQuestGenerator() + protected ISptLogger _logger; + protected RandomUtil _randomUtil; + + public RepeatableQuestGenerator( + ISptLogger logger, + RandomUtil randomUtil) { + _logger = logger; + _randomUtil = randomUtil; } /// @@ -23,15 +32,32 @@ public class RepeatableQuestGenerator /// Possible quest types pool /// Repeatable quest config /// RepeatableQuest - public RepeatableQuest GenerateRepeatableQuest( + public RepeatableQuest? GenerateRepeatableQuest( string sessionId, - int? pmcLevel, + int pmcLevel, Dictionary pmcTraderInfo, QuestTypePool questTypePool, RepeatableQuestConfig repeatableConfig ) { - throw new NotImplementedException(); + var questType = _randomUtil.DrawRandomFromList(questTypePool.Types).First(); + + // Get traders from whitelist and filter by quest type availability + var traders = repeatableConfig.TraderWhitelist + .Where((x) => x.QuestTypes.Contains(questType)) + .Select((x) => x.TraderId).ToList(); + // filter out locked traders + traders = traders.Where((x) => pmcTraderInfo[x].Unlocked.GetValueOrDefault(false)).ToList(); + var traderId = _randomUtil.DrawRandomFromList(traders).FirstOrDefault(); + + return questType switch + { + "Elimination" => GenerateEliminationQuest(sessionId, pmcLevel, traderId, questTypePool, repeatableConfig), + "Completion" => GenerateCompletionQuest(sessionId, pmcLevel, traderId, repeatableConfig), + "Exploration" => GenerateExplorationQuest(sessionId, pmcLevel, traderId, questTypePool, repeatableConfig), + "Pickup" => GeneratePickupQuest(sessionId, pmcLevel, traderId, questTypePool, repeatableConfig), + _ => null + }; } /// @@ -159,7 +185,7 @@ public class RepeatableQuestGenerator throw new NotImplementedException(); } - protected object GeneratePickupQuest( + protected RepeatableQuest GeneratePickupQuest( string sessionId, int pmcLevel, string traderId, diff --git a/Core/Utils/RandomUtil.cs b/Core/Utils/RandomUtil.cs index 0f1292fb..ec5205b3 100644 --- a/Core/Utils/RandomUtil.cs +++ b/Core/Utils/RandomUtil.cs @@ -282,7 +282,7 @@ public class RandomUtil /// Whether to draw with replacement. Defaults to true. /// The type of elements in the list. /// A List containing the drawn elements. - public List DrawRandomFromList(List originalList, int count = 1, bool replacement = true) + public IEnumerable DrawRandomFromList(IEnumerable originalList, int count = 1, bool replacement = true) { throw new NotImplementedException("ICloneable needs implemented on types before this can be written"); }