private void InitializeQuestCurios(Area area, Quest quest) { var curio = area.Prop as Curio; if (curio == null || !curio.IsQuestCurio) { return; } if (quest.Goal.Type == "activate") { Assert.IsInstanceOf(typeof(QuestActivateData), quest.Goal.QuestData); if (quest.Goal.StartingItems.Count > 0) { curio.ItemInteractions.Add(new ItemInteraction(1, quest.Goal.StartingItems[0].Id, "loot")); } else { curio.Results.Add(new CurioInteraction(1, "loot")); } } else if (quest.Goal.Type == "gather") { Assert.IsInstanceOf(typeof(QuestGatherData), quest.Goal.QuestData); var gatherData = (QuestGatherData)quest.Goal.QuestData; var curioInteraction = new CurioInteraction(1, "loot"); curioInteraction.Results.Add(new CurioResult(1, 1, gatherData.Item.Id)); curio.Results.Add(curioInteraction); } }
public void LoadCurioLoot(Curio curio, CurioInteraction interaction, CurioResult curioResult, RaidInfo raid, bool keepLoot) { KeepLoot = keepLoot; if (keepLoot) { takeAllButton.gameObject.SetActive(false); passButton.gameObject.SetActive(false); partyInventory.SetDeactivated(); } else { takeAllButton.gameObject.SetActive(true); passButton.gameObject.SetActive(true); partyInventory.SetActivated(); } LootType = LootEventType.Curio; ActionType = LootResultType.Waiting; gameObject.SetActive(true); partyInventory.DiscardAll(); if (curio.IsQuestCurio) { if (curioResult != null) { partyInventory.DistributeItem(new ItemDefinition("quest_item", curioResult.Item, 1)); } } else { if (curioResult.IsCombined) { foreach (var result in interaction.Results) { if (result.IsCombined && result.Item != "Nothing") { foreach (var item in RaidSolver.GenerateLoot(result, raid)) { partyInventory.DistributeItem(item); } } } } else if (curioResult.Item != "Nothing") { foreach (var item in RaidSolver.GenerateLoot(curioResult, raid)) { partyInventory.DistributeItem(item); } } if (RaidSceneManager.RaidPanel.SelectedHero != null) { var extraLoot = RaidSceneManager.RaidPanel.SelectedHero.HeroClass.ExtraCurioLoot; if (extraLoot != null) { foreach (var item in RaidSolver.GenerateLoot(extraLoot.Code, extraLoot.Count, raid)) { partyInventory.DistributeItem(item); } } } } partyInventory.DeactivateEmptySlots(); title.text = LocalizationManager.GetString("str_overlay_loot_chest_title"); description.text = LocalizationManager.GetString("str_overlay_loot_chest_description"); if (partyInventory.HasSomething()) { ScrollOpened(); } else { Close(); } }
public static Dungeon GenerateDungeon(Quest quest, int seed = 0) { if (seed != 0) { Random.InitState(seed); } string[] lengthes = new string[] { "", "short", "medium", "long" }; Dungeon dungeon = new Dungeon(); DungeonGenerationData genData = DarkestDungeonManager.Data.DungeonGenerationData.Find(item => item.Dungeon == quest.Dungeon && item.Length == lengthes[quest.Length] && item.QuestType == quest.Type); DungeonEnviromentData envData = DarkestDungeonManager.Data.DungeonEnviromentData[quest.Dungeon]; int RoomsLeft = genData.BaseRoomNumber; int HallsLeft = genData.BaseCorridorNumber; int xSize = genData.GridSizeX; int ySize = genData.GridSizeY; dungeon.GridSizeX = xSize; dungeon.GridSizeY = ySize; List <GenRoom> Areas = new List <GenRoom>(); GenRoom[,] areaGrid = new GenRoom[xSize, ySize]; GenerateRooms(Areas, areaGrid, RoomsLeft, xSize, ySize); GenRoom hub = GetHub(Areas); List <GenRoom> ExistingRooms = ForceBorderRooms(Areas, hub, RoomsLeft); List <GenHall> ExistingHalls = ForceHallConnection(Areas, hub, ExistingRooms, HallsLeft); dungeon.Rooms = GetFinalRooms(ExistingRooms, genData); dungeon.Hallways = GetFinalHallways(dungeon, ExistingHalls, genData); MarkEntrance(dungeon); switch (quest.Goal.Type) { case "kill_monster": if (quest.Goal.QuestData is QuestKillMonsterData) { var bossData = quest.Goal.QuestData as QuestKillMonsterData; envData.BattleMashes.Find(mash => mash.BossEncounters.Find(encounter => encounter.MonsterSet.Contains(bossData.MonsterNameIds[0])) != null); var bossGenRoom = LongestPathRoom(ExistingRooms.Find(room => room.Id == dungeon.StartingRoomId), ExistingRooms); var bossRoom = dungeon.Rooms[bossGenRoom.Id]; bossRoom.Type = AreaType.Boss; var bossEncounter = envData.BattleMashes.Find(mash => mash.MashId == quest.Difficulty). BossEncounters.Find(encounter => encounter.MonsterSet.Contains(bossData.MonsterNameIds[0])); bossRoom.BattleEncounter = new BattleEncounter(bossEncounter.MonsterSet); } else { Debug.LogError("Missing boss data in dungeon!"); } break; case "activate": if (quest.Goal.QuestData is QuestActivateData) { var activateData = quest.Goal.QuestData as QuestActivateData; var lastRoom = LongestPathRoom(ExistingRooms.Find(room => room.Id == dungeon.StartingRoomId), ExistingRooms); for (int i = 0; i < activateData.Amount; i++) { var availableRooms = ExistingRooms.FindAll(room => room.MinPath >= (float)i / activateData.Amount * lastRoom.MinPath && room.MinPath <= (float)(i + 1) / activateData.Amount * lastRoom.MinPath); int randomRoom = Random.Range(0, availableRooms.Count - 1); var questRoom = dungeon.Rooms[availableRooms[randomRoom].Id]; if (questRoom.Type == AreaType.Empty) { var curio = new Curio(activateData.CurioName); curio.IsQuestCurio = true; if (quest.Goal.StartingItems.Count > 0) { curio.ItemInteractions.Add(new ItemInteraction() { Chance = 1, ItemId = quest.Goal.StartingItems[0].Id, ResultType = "loot", Results = new List <CurioResult>(), }); } questRoom.Type = AreaType.Curio; questRoom.Prop = curio; } else { i--; } } } break; case "gather": if (quest.Goal.QuestData is QuestGatherData) { var gatherData = quest.Goal.QuestData as QuestGatherData; var lastRoom = LongestPathRoom(ExistingRooms.Find(room => room.Id == dungeon.StartingRoomId), ExistingRooms); for (int i = 0; i < gatherData.Item.Amount; i++) { var availableRooms = ExistingRooms.FindAll(room => room.MinPath >= (float)i / gatherData.Item.Amount * lastRoom.MinPath && room.MinPath <= (float)(i + 1) / gatherData.Item.Amount * lastRoom.MinPath); int randomRoom = Random.Range(0, availableRooms.Count - 1); var questRoom = dungeon.Rooms[availableRooms[randomRoom].Id]; if (questRoom.Type == AreaType.Empty) { var curio = new Curio(gatherData.CurioName); curio.IsQuestCurio = true; var curioInteraction = new CurioInteraction(); curioInteraction.Chance = 1; curioInteraction.ResultType = "loot"; curioInteraction.Results = new List <CurioResult>(); curioInteraction.Results.Add(new CurioResult() { Chance = 1, Draws = 1, Item = gatherData.Item.Id, }); curio.Results.Add(curioInteraction); questRoom.Type = AreaType.Curio; questRoom.Prop = curio; } else { i--; } } } break; default: break; } PopulateRooms(dungeon, genData); LoadRoomEnviroment(dungeon, envData, quest.Difficulty); PopulateHalls(dungeon, genData); LoadHallEnviroment(dungeon, envData, quest.Difficulty); dungeon.GridSizeX = 1 + (xSize - 1) * 7; dungeon.GridSizeY = 1 + (ySize - 1) * 7; dungeon.Name = quest.Dungeon; dungeon.DungeonMash = envData.BattleMashes.Find(mash => mash.MashId == quest.Difficulty); dungeon.SharedMash = DarkestDungeonManager.Data.DungeonEnviromentData["shared"]. BattleMashes.Find(mash => mash.MashId == quest.Difficulty); return(dungeon); }
public void LoadCurioLoot(Curio curio, CurioInteraction interaction, CurioResult result, bool keepLoot = false) { loot.LoadCurioLoot(curio, interaction, result, RaidSceneManager.Raid, keepLoot); }
private static void PopulateQuestGoals(Dungeon dungeon, Quest quest, List <GenRoom> existingRooms, DungeonEnviromentData envData) { switch (quest.Goal.Type) { case "kill_monster": var killData = quest.Goal.QuestData as QuestKillMonsterData; if (killData != null) { var bossGenRoom = FindLongestPathRoom(existingRooms.Find(room => room.Id == dungeon.StartingRoomId), existingRooms); var bossRoom = dungeon.Rooms[bossGenRoom.Id]; bossRoom.Type = AreaType.Boss; var bossEncounter = envData.BattleMashes.Find(mash => mash.MashId == quest.Difficulty). BossEncounters.Find(encounter => encounter.MonsterSet.Contains(killData.MonsterNameIds[0])); bossRoom.BattleEncounter = new BattleEncounter(bossEncounter.MonsterSet); } else { Debug.LogError("Missing boss data in dungeon!"); } break; case "activate": var activateData = quest.Goal.QuestData as QuestActivateData; if (activateData != null) { var lastRoom = FindLongestPathRoom(existingRooms.Find(room => room.Id == dungeon.StartingRoomId), existingRooms); for (int i = 0; i < activateData.Amount; i++) { var availableRooms = existingRooms.FindAll(room => room.MinPath >= (float)i / activateData.Amount * lastRoom.MinPath && room.MinPath <= (float)(i + 1) / activateData.Amount * lastRoom.MinPath); int randomRoom = Random.Range(0, availableRooms.Count - 1); var questRoom = dungeon.Rooms[availableRooms[randomRoom].Id]; if (questRoom.Type == AreaType.Empty) { var curio = new Curio(activateData.CurioName) { IsQuestCurio = true }; if (quest.Goal.StartingItems.Count > 0) { curio.ItemInteractions.Add(new ItemInteraction() { Chance = 1, ItemId = quest.Goal.StartingItems[0].Id, ResultType = "loot", Results = new List <CurioResult>(), }); } questRoom.Type = AreaType.Curio; questRoom.Prop = curio; } else { i--; } } } break; case "gather": if (quest.Goal.QuestData is QuestGatherData) { var gatherData = quest.Goal.QuestData as QuestGatherData; var lastRoom = FindLongestPathRoom(existingRooms.Find(room => room.Id == dungeon.StartingRoomId), existingRooms); for (int i = 0; i < gatherData.Item.Amount; i++) { var availableRooms = existingRooms.FindAll(room => room.MinPath >= (float)i / gatherData.Item.Amount * lastRoom.MinPath && room.MinPath <= (float)(i + 1) / gatherData.Item.Amount * lastRoom.MinPath); int randomRoom = Random.Range(0, availableRooms.Count - 1); var questRoom = dungeon.Rooms[availableRooms[randomRoom].Id]; if (questRoom.Type == AreaType.Empty) { var curio = new Curio(gatherData.CurioName) { IsQuestCurio = true }; var curioInteraction = new CurioInteraction(); curioInteraction.Chance = 1; curioInteraction.ResultType = "loot"; curioInteraction.Results = new List <CurioResult>(); curioInteraction.Results.Add(new CurioResult() { Chance = 1, Draws = 1, Item = gatherData.Item.Id, }); curio.Results.Add(curioInteraction); questRoom.Type = AreaType.Curio; questRoom.Prop = curio; } else { i--; } } } break; } }