Пример #1
0
    public bool IsPossible(NarrationPlace narrationPlace, params string[] tags)
    {
        switch (narrationPlace)
        {
        case NarrationPlace.Campaign:
            if (MaxCampaignOccurrences > 0)
            {
                if (DarkestDungeonManager.Campaign.NarrationCampaignInfo.ContainsKey(AudioEvent))
                {
                    if (DarkestDungeonManager.Campaign.NarrationCampaignInfo[AudioEvent] >= MaxCampaignOccurrences)
                    {
                        return(false);
                    }
                }
            }
            break;

        case NarrationPlace.Raid:
            if (MaxRaidOccurrences > 0)
            {
                if (DarkestDungeonManager.Campaign.NarrationRaidInfo.ContainsKey(AudioEvent))
                {
                    if (DarkestDungeonManager.Campaign.NarrationRaidInfo[AudioEvent] >= MaxRaidOccurrences)
                    {
                        return(false);
                    }
                }
            }
            goto case NarrationPlace.Campaign;

        case NarrationPlace.Town:
            if (MaxTownVisitOccurrences > 0)
            {
                if (DarkestDungeonManager.Campaign.NarrationTownInfo.ContainsKey(AudioEvent))
                {
                    if (DarkestDungeonManager.Campaign.NarrationTownInfo[AudioEvent] >= MaxTownVisitOccurrences)
                    {
                        return(false);
                    }
                }
            }
            goto case NarrationPlace.Campaign;
        }

        if (Tags.Count > 0)
        {
            if (CheckAllTags)
            {
                for (int i = 0; i < Tags.Count; i++)
                {
                    if (tags.Length == 0)
                    {
                        return(false);
                    }

                    for (int j = 0; j < tags.Length; j++)
                    {
                        if (tags[j] == Tags[i])
                        {
                            break;
                        }

                        if (j == tags.Length - 1)
                        {
                            return(false);
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < tags.Length; i++)
                {
                    if (Tags.Contains(tags[i]))
                    {
                        return(true);
                    }
                }

                return(false);
            }
        }
        return(true);
    }
Пример #2
0
    public static void ExecuteNarration(string id, NarrationPlace place, params string[] tags)
    {
        if (!DarkestDungeonManager.Data.Narration.ContainsKey(id))
        {
            return;
        }

        NarrationEntry narrationEntry = DarkestDungeonManager.Data.Narration[id];

        if (!RandomSolver.CheckSuccess(narrationEntry.Chance))
        {
            return;
        }

        var possibleEvents = narrationEntry.AudioEvents.FindAll(audioEvent => audioEvent.IsPossible(place, tags));

        if (possibleEvents.Count == 0)
        {
            return;
        }

        float maxPriority = possibleEvents.Max(audio => audio.Priority);

        possibleEvents.RemoveAll(lowPriorityEvent => lowPriorityEvent.Priority < maxPriority);

        NarrationAudioEvent narrationEvent = id == "combat_start" ?
                                             possibleEvents[0] : possibleEvents[RandomSolver.Next(possibleEvents.Count)];

        if (narrationEvent.QueueOnlyOnEmpty && NarrationQueue.Count > 0)
        {
            return;
        }

        if (id == "town_visit_start")
        {
            for (int i = 0; i < 3; i++)
            {
                if (RandomSolver.CheckSuccess(narrationEvent.Chance))
                {
                    break;
                }
                else
                {
                    narrationEvent = possibleEvents[RandomSolver.Next(possibleEvents.Count)];
                }

                if (i == 2)
                {
                    return;
                }
            }
        }
        else if (!RandomSolver.CheckSuccess(narrationEvent.Chance))
        {
            return;
        }

        var narrationInstanse = RuntimeManager.CreateInstance("event:" + narrationEvent.AudioEvent);

        if (narrationInstanse != null)
        {
            NarrationQueue.Add(narrationInstanse);
        }

        switch (place)
        {
        case NarrationPlace.Campaign:
            if (narrationEvent.MaxCampaignOccurrences > 0)
            {
                if (!DarkestDungeonManager.Campaign.NarrationCampaignInfo.ContainsKey(narrationEvent.AudioEvent))
                {
                    DarkestDungeonManager.Campaign.NarrationCampaignInfo.Add(narrationEvent.AudioEvent, 0);
                }

                DarkestDungeonManager.Campaign.NarrationCampaignInfo[narrationEvent.AudioEvent]++;
            }
            break;

        case NarrationPlace.Raid:
            if (narrationEvent.MaxRaidOccurrences > 0)
            {
                if (!DarkestDungeonManager.Campaign.NarrationRaidInfo.ContainsKey(narrationEvent.AudioEvent))
                {
                    DarkestDungeonManager.Campaign.NarrationRaidInfo.Add(narrationEvent.AudioEvent, 0);
                }

                DarkestDungeonManager.Campaign.NarrationRaidInfo[narrationEvent.AudioEvent]++;
            }
            goto case NarrationPlace.Campaign;

        case NarrationPlace.Town:
            if (narrationEvent.MaxTownVisitOccurrences > 0)
            {
                if (!DarkestDungeonManager.Campaign.NarrationTownInfo.ContainsKey(narrationEvent.AudioEvent))
                {
                    DarkestDungeonManager.Campaign.NarrationTownInfo.Add(narrationEvent.AudioEvent, 0);
                }

                DarkestDungeonManager.Campaign.NarrationTownInfo[narrationEvent.AudioEvent]++;
            }
            goto case NarrationPlace.Campaign;
        }
    }