public void Process(StoryState state) { Menus.MenuSwitcher.ShowBlankMenu(); Components.SpokenTextMenu textMenu; IMenu menuToFind = Windows.WindowSwitcher.GameWindow.MenuManager.FindMenu("story-spokenTextMenu"); if (menuToFind != null) { textMenu = (Components.SpokenTextMenu)menuToFind; } else { textMenu = new Components.SpokenTextMenu("story-spokenTextMenu", Windows.WindowSwitcher.GameWindow.MapViewer.Size); } textMenu.DisplayText(StoryProcessor.ReplaceVariables(question), mugshot); Windows.WindowSwitcher.GameWindow.MenuManager.AddMenu(textMenu, true); Components.OptionSelectionMenu optionMenu = new Components.OptionSelectionMenu("story-optionSelectionMenu", Windows.WindowSwitcher.GameWindow.MapViewer.Size, options); optionMenu.OptionSelected += new Components.OptionSelectionMenu.OptionSelectedDelegate(optionMenu_OptionSelected); Windows.WindowSwitcher.GameWindow.MenuManager.AddMenu(optionMenu, true); Windows.WindowSwitcher.GameWindow.MenuManager.SetActiveMenu(optionMenu); Windows.WindowSwitcher.GameWindow.MenuManager.BlockInput = true; storyState = state; state.Pause(); optionMenu.OptionSelected -= new Components.OptionSelectionMenu.OptionSelectedDelegate(optionMenu_OptionSelected); Windows.WindowSwitcher.GameWindow.MenuManager.RemoveMenu(optionMenu); //if (state.NextSegment == null || !state.NextSegment.UsesSpeechMenu) { Windows.WindowSwitcher.GameWindow.MenuManager.RemoveMenu(textMenu); //} }
public void Process(StoryState state) { Menus.MenuSwitcher.ShowBlankMenu(); Components.SpokenTextMenu textMenu; IMenu menuToFind = Windows.WindowSwitcher.GameWindow.MenuManager.FindMenu("story-spokenTextMenu"); if (menuToFind != null) { textMenu = (Components.SpokenTextMenu)menuToFind; } else { textMenu = new Components.SpokenTextMenu("story-spokenTextMenu", Windows.WindowSwitcher.GameWindow.MapViewer.Size); } textMenu.Click += new EventHandler <SdlDotNet.Widgets.MouseButtonEventArgs>(textMenu_Click); textMenu.KeyDown += new EventHandler <SdlDotNet.Input.KeyboardEventArgs>(textMenu_KeyDown); textMenu.DisplayText(StoryProcessor.ReplaceVariables(text), speaker); Windows.WindowSwitcher.GameWindow.MenuManager.AddMenu(textMenu, true); Windows.WindowSwitcher.GameWindow.MenuManager.BlockInput = false; this.storyState = state; if (Windows.WindowSwitcher.GameWindow.BattleLog.Visible) { Windows.WindowSwitcher.GameWindow.BattleLog.Hide(); } state.Pause(); textMenu.Click -= new EventHandler <SdlDotNet.Widgets.MouseButtonEventArgs>(textMenu_Click); textMenu.KeyDown -= new EventHandler <SdlDotNet.Input.KeyboardEventArgs>(textMenu_KeyDown); if (state.NextSegment == null || !state.NextSegment.UsesSpeechMenu) { Windows.WindowSwitcher.GameWindow.MenuManager.RemoveMenu(textMenu); } }
public Galaxy( TutorialGenerationSettings settings, SectorBackgroundSettings background, NameGeneratorSettings nameGeneratorSettings, CultCache cache, PlayerSettings playerSettings, DirectoryInfo narrativeDirectory, Action <string> log, Action <string> progressCallback = null, uint seed = 0) { Faction ResolveFaction(string name) => cache.GetAll <Faction>().FirstOrDefault(f => f.Name.StartsWith(name, StringComparison.InvariantCultureIgnoreCase)); Background = background; Log = log; var random = new Random(seed == 0 ? (uint)(DateTime.Now.Ticks % uint.MaxValue) : seed); var factions = new List <Faction>(); var protagonistFaction = ResolveFaction(settings.ProtagonistFaction); factions.Add(protagonistFaction); var antagonistFaction = ResolveFaction(settings.AntagonistFaction); factions.Add(antagonistFaction); var bufferFaction = ResolveFaction(settings.BufferFaction); factions.Add(bufferFaction); var questFaction = ResolveFaction(settings.QuestFaction); factions.Add(questFaction); var neutralFactions = settings.NeutralFactions .Select(ResolveFaction) .ToArray(); factions.AddRange(neutralFactions); Factions = factions.ToArray(); foreach (var faction in Factions) { FactionRelationships[faction] = FactionRelationship.Neutral; faction.InfluenceDistance = (faction.InfluenceDistance + 1) / 2; } Zones = GenerateZones(settings.ZoneCount, ref random, progressCallback); GenerateLinks(settings.LinkDensity, progressCallback); CalculateDistanceMatrix(progressCallback); HomeZones[protagonistFaction] = Zones .MaxBy(z => ConnectedRegion(z, protagonistFaction.InfluenceDistance).Count); HomeZones[antagonistFaction] = Zones .MaxBy(z => ConnectedRegion(z, antagonistFaction.InfluenceDistance).Count *z.Distance[HomeZones[protagonistFaction]]); HomeZones[protagonistFaction] = Zones .MaxBy(z => ConnectedRegion(z, protagonistFaction.InfluenceDistance).Count *sqrt(z.Distance[HomeZones[antagonistFaction]])); // var antagonistRegion = ConnectedRegion(HomeZones[antagonistFaction], antagonistFaction.InfluenceDistance); // var protagonistRegion = ConnectedRegion(HomeZones[protagonistFaction], protagonistFaction.InfluenceDistance); // Place the buffer faction in a zone where it has equal distance to the pro/antagonist HQs and where it can control the most territory var bufferDistance = Zones.Min(z => abs(z.Distance[HomeZones[antagonistFaction]] - z.Distance[HomeZones[protagonistFaction]])); var potentialBufferZones = Zones .Where(z => abs(z.Distance[HomeZones[antagonistFaction]] - z.Distance[HomeZones[protagonistFaction]]) == bufferDistance); HomeZones[bufferFaction] = potentialBufferZones.MaxBy(z => ConnectedRegion(z, bufferFaction.InfluenceDistance).Count); // Place neutral headquarters away from existing factions while also maximizing territory foreach (var faction in neutralFactions) { HomeZones[faction] = Zones.MaxBy(z => ConnectedRegion(z, faction.InfluenceDistance).Count * HomeZones.Values.Aggregate(1f, (i, os) => i * sqrt(os.Distance[z]))); } CalculateFactionInfluence(progressCallback); var potentialQuestZones = Zones .Where(z => z.Factions.Contains(antagonistFaction) && z.Factions.Contains(bufferFaction)); if (potentialQuestZones.Any()) { HomeZones[questFaction] = potentialQuestZones .MaxBy(z => z.Distance[HomeZones[antagonistFaction]] * ConnectedRegion(z, questFaction.InfluenceDistance).Count); } else { HomeZones[questFaction] = Zones .Where(z => z.Factions.Contains(antagonistFaction)) .MinBy(z => z.Distance[HomeZones[bufferFaction]]); } CalculateFactionInfluence(progressCallback); Entrance = Zones.Where(z => z.Owner == null).MinBy(z => z.Distance[HomeZones[protagonistFaction]]); DiscoveredZones.Add(Entrance); foreach (var z in Entrance.AdjacentZones) { DiscoveredZones.Add(z); } CalculateFactionInfluence(progressCallback); GenerateNames(cache, nameGeneratorSettings, ref random, progressCallback); progressCallback?.Invoke("Weaving Narrative"); var processor = new StoryProcessor(playerSettings, narrativeDirectory, this, ref random, Log); processor.ProcessStories(); progressCallback?.Invoke("Done!"); if (progressCallback != null) { Thread.Sleep(500); // Inserting Delay to make it seem like it's doing more work lmao } }