static QuestGenerationInfo GetQuestInfo(QuestGenerationData genData, Campaign campaign) { QuestGenerationInfo questInfo = new QuestGenerationInfo(); foreach (var dungeon in genData.Dungeons.Values) { if (dungeon.RequiredQuestsCompleted <= campaign.QuestsComleted) { DungeonQuestInfo dungeonInfo = new DungeonQuestInfo(); dungeonInfo.Dungeon = dungeon.Id; dungeonInfo.GeneratedTypes = genData.QuestTypes[dungeonInfo.Dungeon]. QuestTypeSets[campaign.Dungeons[dungeon.Id].MasteryLevel]; questInfo.dungeonQuests.Add(dungeonInfo); } } questInfo.dungeonCount = questInfo.dungeonQuests.Count; questInfo.maxPerDungeon = genData.MaxQuestsPerDungeon; questInfo.questCount = GetQuestNumber(genData, campaign); return(questInfo); }
static void DistributeQuests(QuestGenerationInfo questInfo, QuestGenerationData genData, Campaign campaign) { if (questInfo.dungeonCount * questInfo.maxPerDungeon < questInfo.questCount) { questInfo.questCount = questInfo.dungeonCount * questInfo.maxPerDungeon; } if (questInfo.dungeonCount > questInfo.questCount) { questInfo.questCount = questInfo.dungeonCount; } int questsLeft = questInfo.questCount; float difOneAvailable = campaign.Heroes.FindAll(hero => genData.Difficulties[0].ResolveLevels.Contains(hero.Resolve.Level)).Count; float difTwoAvailable = campaign.Heroes.FindAll(hero => genData.Difficulties[1].ResolveLevels.Contains(hero.Resolve.Level)).Count; float difThreeAvailable = campaign.Heroes.FindAll(hero => genData.Difficulties[2].ResolveLevels.Contains(hero.Resolve.Level)).Count; float allAvailable = difOneAvailable + difTwoAvailable + difThreeAvailable; if (allAvailable == 0) { difOneAvailable = 4; allAvailable = 4; } List <int> difficulties = new List <int>(); int difOnes = Mathf.RoundToInt(difOneAvailable / allAvailable * questsLeft); int difTwos = Mathf.RoundToInt(difTwoAvailable / allAvailable * questsLeft); int difThrees = Mathf.RoundToInt(difThreeAvailable / allAvailable * questsLeft); difOnes += questsLeft - (difOnes + difTwos + difThrees); for (int i = 0; i < difOnes; i++) { difficulties.Add(1); } for (int i = 0; i < difTwos; i++) { difficulties.Add(3); } for (int i = 0; i < difThrees; i++) { difficulties.Add(5); } for (int i = 0; i < questInfo.dungeonQuests.Count; i++) { Quest quest = new Quest(); int difIndex = Random.Range(0, difficulties.Count); quest.Dungeon = questInfo.dungeonQuests[i].Dungeon; quest.Difficulty = difficulties[difIndex]; difficulties.RemoveAt(difIndex); questInfo.dungeonQuests[i].Quests.Add(quest); questsLeft--; if (questsLeft == 0) { break; } } while (questsLeft > 0) { foreach (var dungeonInfo in questInfo.dungeonQuests) { if (questsLeft == 0) { break; } if (dungeonInfo.Quests.Count < questInfo.maxPerDungeon) { if (Random.Range(0, 2) == 0) { Quest quest = new Quest(); int difIndex = Random.Range(0, difficulties.Count); quest.Dungeon = dungeonInfo.Dungeon; quest.Difficulty = difficulties[difIndex]; difficulties.RemoveAt(difIndex); dungeonInfo.Quests.Add(quest); questsLeft--; } } } } foreach (var dungeon in campaign.Dungeons) { var plotMastery = dungeon.Value.CurrentPlotQuest; if (plotMastery != null) { DungeonQuestInfo dungeonQuest = questInfo.dungeonQuests.Find(item => item.Dungeon == dungeon.Value.DungeonName); if (dungeonQuest != null) { dungeonQuest.Quests.Add(plotMastery.Copy()); } else { dungeonQuest = new DungeonQuestInfo() { Dungeon = plotMastery.Dungeon }; dungeonQuest.Quests.Add(plotMastery.Copy()); questInfo.dungeonQuests.Add(dungeonQuest); } } } foreach (var townEventData in campaign.EventModifiers.EventData) { if (townEventData.Type == TownEventDataType.PlotQuest) { var plotQuest = DarkestDungeonManager.Data.QuestDatabase.PlotQuests. Find(quest => quest.Id == townEventData.StringData); if (plotQuest != null && !campaign.CompletedPlot.Contains(plotQuest.Id)) { DungeonQuestInfo dungeonQuest = questInfo.dungeonQuests.Find(item => item.Dungeon == plotQuest.Dungeon); if (dungeonQuest != null) { dungeonQuest.Quests.Add(plotQuest.Copy()); } else { dungeonQuest = new DungeonQuestInfo() { Dungeon = plotQuest.Dungeon }; dungeonQuest.Quests.Add(plotQuest.Copy()); questInfo.dungeonQuests.Add(dungeonQuest); } } } } }