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); }
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; } }