Example #1
0
    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();
        }
    }
Example #3
0
    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);
    }
Example #4
0
 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;
        }
    }