private IDialog createQuestionsDialog(IGameFactory factory) { IDialogOption option1 = factory.Dialog.GetDialogOption("Where are you from?"); option1.AddText(Characters.Beman, "I'm from Sweden."); IDialogOption option2 = factory.Dialog.GetDialogOption("What do you do?"); option2.AddText(Characters.Beman, "I'm a hobbyist game developer."); IDialogOption option3 = factory.Dialog.GetDialogOption("Can I start a scene?"); option3.ExitDialogWhenFinished = true; option3.AddText(Characters.Beman, "Go for it, though remember that the user can skip the scene by pressing any key on the keyboard"); option3.AddAsyncConditionalActions(startAScene); IDialogOption option4 = factory.Dialog.GetDialogOption("That's all I have..."); option4.ChangeDialogWhenFinished = StartDialog; IDialog dialog = factory.Dialog.GetDialog("Dialog: Beman- Questions"); dialog.AddOptions(option1, option2, option3, option4); return(dialog); }
public IDialogOption GetDialogOption(string text, ITextConfig config = null, ITextConfig hoverConfig = null, ITextConfig hasBeenChosenConfig = null, bool speakOption = true, bool showOnce = false) { var game = _resolver.Container.Resolve <IGame>(); config = config ?? _defaults.Idle; hoverConfig = hoverConfig ?? _defaults.Hovered; hasBeenChosenConfig = hasBeenChosenConfig ?? _defaults.Chosen; ILabel label = _ui.GetLabel($"Dialog option: {text}", text, game.Settings.VirtualResolution.Width, 20f, 0f, 0f, config: config, addToUi: false); label.RenderLayer = _defaults.RenderLayer; label.Enabled = true; TypedParameter labelParam = new TypedParameter(typeof(ILabel), label); NamedParameter speakParam = new NamedParameter("speakOption", speakOption); NamedParameter showOnceParam = new NamedParameter("showOnce", showOnce); NamedParameter hoverParam = new NamedParameter("hoverConfig", hoverConfig); NamedParameter wasChosenParam = new NamedParameter("hasBeenChosenConfig", hasBeenChosenConfig); TypedParameter playerParam = new TypedParameter(typeof(ICharacter), _gameState.Player); IDialogActions dialogActions = _resolver.Container.Resolve <IDialogActions>(playerParam); TypedParameter dialogActionsParam = new TypedParameter(typeof(IDialogActions), dialogActions); IDialogOption option = _resolver.Container.Resolve <IDialogOption>(labelParam, speakParam, showOnceParam, hoverParam, wasChosenParam, playerParam, dialogActionsParam); return(option); }
private void createStartDialog(IGameFactory factory, IDialog questionsDialog, IDialog shadersDialog) { StartDialog.StartupActions.AddPlayerText("Hello there!"); StartDialog.StartupActions.AddText(Characters.Beman, "Hello yourself!"); StartDialog.StartupActions.AddConditionalActions(() => Repeat.OnceOnly("BemanStartDialog")); StartDialog.StartupActions.AddText(Characters.Beman, "God, that's a relief.", "It's good to see I'm not alone in this place."); IDialogOption option1 = factory.Dialog.GetDialogOption("Who are you?", showOnce: true); option1.AddText(Characters.Beman, "I am Beman, and you are?"); option1.AddPlayerText("I am Cris."); IDialogOption option2 = factory.Dialog.GetDialogOption("What is this place?"); option2.AddText(Characters.Beman, "I have no idea. I just woke up here."); option2.AddPlayerText("Wow, seems like we share a similar story."); IDialogOption option3 = factory.Dialog.GetDialogOption("Tell me a little bit about yourself.", speakOption: false); option3.AddText(Characters.Beman, "What do you want to know?"); option3.ChangeDialogWhenFinished = questionsDialog; IDialogOption option4 = factory.Dialog.GetDialogOption("Can I set a shader?"); option4.AddText(Characters.Beman, "Sure, choose a shader..."); option4.ChangeDialogWhenFinished = shadersDialog; IDialogOption option5 = factory.Dialog.GetDialogOption("I'll be going now."); option5.AddText(Characters.Beman, "Ok, see you around."); option5.ExitDialogWhenFinished = true; StartDialog.AddOptions(option1, option2, option3, option4, option5); }
private IDialog createShadersDialog(IGameFactory factory) { IDialogOption option1 = factory.Dialog.GetDialogOption("Normal"); IDialogOption option2 = factory.Dialog.GetDialogOption("Grayscale"); IDialogOption option3 = factory.Dialog.GetDialogOption("Sepia"); IDialogOption option4 = factory.Dialog.GetDialogOption("Soft Sepia"); IDialogOption option5 = factory.Dialog.GetDialogOption("Vignette"); IDialogOption option6 = factory.Dialog.GetDialogOption("Blur me!"); IDialogOption option7 = factory.Dialog.GetDialogOption("Shake the screen!"); IDialogOption option8 = factory.Dialog.GetDialogOption("Actually, I don't want a shader!"); setShaderOption(option1, () => Shaders.SetStandardShader()); setShaderOption(option2, () => Shaders.SetGrayscaleShader()); setShaderOption(option3, () => Shaders.SetSepiaShader()); setShaderOption(option4, () => Shaders.SetSoftSepiaShader()); setShaderOption(option5, () => Shaders.SetVignetteShader()); setShaderOption(option6, () => Shaders.SetBlurShader()); setShaderOption(option7, () => Shaders.SetShakeShader()); setShaderOption(option8, () => Shaders.TurnOffShader()); IDialog dialog = factory.Dialog.GetDialog("Dialog: Beman- Shaders"); dialog.AddOptions(option1, option2, option3, option4, option5, option6, option7, option8); return(dialog); }
public async Task LayoutAsync(IObject dialogGraphics, IList <IDialogOption> options) { float y = 0f; for (int index = options.Count - 1; index >= 0; index--) { IDialogOption option = options[index]; _game.State.UI.Add(option.Label); if (!option.Label.Visible) { continue; } option.Label.Y = y; int retries = 1000; while (option.Label.TextHeight <= 5f && retries > 0) { await Task.Delay(1); //todo: find a better way (we need to wait at least one render loop for the text height to be correct) retries--; } y += option.Label.TextHeight; } if (dialogGraphics.Image == null) { dialogGraphics.Image = new EmptyImage(_game.Settings.VirtualResolution.Width, y); } dialogGraphics.Animation.Sprite.ScaleTo(_game.Settings.VirtualResolution.Width, y); }
private void CreateDataWindowButtonForDialog(IDialogOption option) { DataWindowButton btn = null; if (option.IsApplyBehavior) { btn = DataWindowButton.FromAsync(option.Caption, async() => await OnApplyExecuteAsync(), OnApplyCanExecute); btn.IsDefault = option.IsDefault; } if (option.IsOkBehavior) { btn = DataWindowButton.FromAsync(option.Caption, async() => await OnOkExecuteAsync(), OnOkCanExecute); btn.IsDefault = option.IsDefault; } if (option.IsCancelBehavior) { btn = DataWindowButton.FromAsync(option.Caption, async() => await OnCancelExecuteAsync(), OnCancelCanExecute); btn.IsCancel = true; } AddCustomButton(btn); }
//Main Method /// <summary> /// </summary> /// <param name="parentViewModel"></param> /// <param name="dialogOption"></param> /// <param name="dialogCallback"></param> public void ShowDialog(object parentViewModel, IDialogOption dialogOption, Action <IDialogResult> dialogCallback = null) { Guard.ArgumentIsNotNull(parentViewModel, nameof(parentViewModel)); if (parentViewModel.GetType().IsStringOrValueType()) { throw new AggregateException("parentViewModel object cant be an string or value type"); } var busyIndicator = parentViewModel as IBusyIndicator; try { if (busyIndicator != null && !busyIndicator.IsBusy) { busyIndicator.ShowBusy(); } var window = GetOrCreateDialog(parentViewModel, dialogOption.View, dialogOption.DialogType); var dialogAware = dialogOption.View.CastAs <IDialogAware>(); var activeAware = dialogOption.View.CastAs <IActiveAware>(); window.Title = dialogOption.Title; window.DialogCommands.Clear(); window.Shown += (s, e) => { dialogAware?.DialogActivating(dialogOption.Parameters, dialogOption.CustomCommands); if (activeAware != null && !activeAware.IsActive) { activeAware.IsActive = true; } window.DialogCommands.AddRange(dialogOption.CustomCommands); }; window.Closing += (s, e) => { var closingResult = new DialogClosingResult(window.MessageBoxResult); dialogAware?.DialogClosing(closingResult); e.Cancel = closingResult.Cancel; }; window.Closed += (s, e) => { RemoveFromCache(parentViewModel, (IDialogWindow)s); var closedResult = new DialogResult(window.MessageBoxResult, dialogOption.Parameters); dialogAware?.DialogClosed(closedResult); dialogCallback?.Invoke(closedResult); }; window.ShowDialog(); } finally { busyIndicator.HideBusy(); } }
private async Task OnExecuteWithDialogOptionActionAsync(IDialogOption dialogOption) { if (DialogCommand is not null) { Log.Info("User pressed dialog option, executing command"); // Not everyone is using the ICatelCommand, make sure to check if execution is allowed if (DialogCommand.CanExecute(dialogOption)) { DialogCommand.Execute(dialogOption); } } }
private async Task dialogLoop() { TaskCompletionSource <IDialogOption> selectedOptionTask = new TaskCompletionSource <IDialogOption> (null); List <Action <object, MouseButtonEventArgs> > callbacks = new List <Action <object, MouseButtonEventArgs> > (Options.Count); foreach (var option in Options) { Action <object, MouseButtonEventArgs> callback = (sender, args) => selectedOptionTask.TrySetResult(option); callbacks.Add(callback); option.Label.MouseClicked.Subscribe(callback); } Graphics.Visible = true; await _dialogLayout.LayoutAsync(Graphics, Options); if (!Options.Any(o => o.Label.Visible)) { Graphics.Visible = false; return; } IDialogOption selectedOption = await selectedOptionTask.Task; for (int index = 0; index < Options.Count; index++) { Options[index].Label.MouseClicked.Unsubscribe(callbacks[index]); } if (!ShowWhileOptionsAreRunning) { Graphics.Visible = false; } await selectedOption.RunAsync(); await Task.Delay(300); //This delay is to avoid player clicks for skipping speech to accidentally trigger a new dialog option Graphics.Visible = !selectedOption.ExitDialogWhenFinished && selectedOption.ChangeDialogWhenFinished == null; if (selectedOption.ChangeDialogWhenFinished != null) { await selectedOption.ChangeDialogWhenFinished.RunAsync(); } else if (!selectedOption.ExitDialogWhenFinished) { await dialogLoop(); } }
public override void SetResult(IDialogOption result) { try { Argument.IsNotNull(() => result); if (result is IDialogOption <T> ) { Result = (result as IDialogOption <T>).DialogCallback(); } else { throw new InvalidCastException(); } } catch (InvalidCastException ex) { Log.Error(ex, $"Cannot set result value, expected type {typeof(T)} was {result.GetType()}"); } }
public IDialogOption GetDialogOption(string text, ITextConfig config = null, ITextConfig hoverConfig = null, ITextConfig hasBeenChosenConfig = null, bool speakOption = true, bool showOnce = false) { var game = _resolver.Container.Resolve <IGame>(); if (config == null) { config = new AGSTextConfig(autoFit: AutoFit.TextShouldWrapAndLabelShouldFitHeight, brush: _brushLoader.LoadSolidBrush(Colors.White), font: _fontLoader.LoadFont(null, 10f)); } if (hoverConfig == null) { hoverConfig = new AGSTextConfig(autoFit: AutoFit.TextShouldWrapAndLabelShouldFitHeight, brush: _brushLoader.LoadSolidBrush(Colors.Yellow), font: _fontLoader.LoadFont(null, 10f)); } if (hasBeenChosenConfig == null) { hasBeenChosenConfig = new AGSTextConfig(autoFit: AutoFit.TextShouldWrapAndLabelShouldFitHeight, brush: _brushLoader.LoadSolidBrush(Colors.Gray), font: _fontLoader.LoadFont(null, 10f)); } ILabel label = _ui.GetLabel($"Dialog option: {text}", text, game.Settings.VirtualResolution.Width, 20f, 0f, 0f, config: config, addToUi: false); label.Enabled = true; TypedParameter labelParam = new TypedParameter(typeof(ILabel), label); NamedParameter speakParam = new NamedParameter("speakOption", speakOption); NamedParameter showOnceParam = new NamedParameter("showOnce", showOnce); NamedParameter hoverParam = new NamedParameter("hoverConfig", hoverConfig); NamedParameter wasChosenParam = new NamedParameter("hasBeenChosenConfig", hasBeenChosenConfig); TypedParameter playerParam = new TypedParameter(typeof(ICharacter), _gameState.Player); IDialogActions dialogActions = _resolver.Container.Resolve <IDialogActions>(playerParam); TypedParameter dialogActionsParam = new TypedParameter(typeof(IDialogActions), dialogActions); IDialogOption option = _resolver.Container.Resolve <IDialogOption>(labelParam, speakParam, showOnceParam, hoverParam, wasChosenParam, playerParam, dialogActionsParam); return(option); }
private void setShaderOption(IDialogOption option, Action setShader) { option.AddText(Characters.Beman, "Your wish is my command."); option.AddActions(setShader); option.ExitDialogWhenFinished = true; }
public static DialogNode <TContent> CreateExitNode(TContent content, IDialogOption <TContent> endOption) { return(new DialogNode <TContent>(content, new List <IDialogOption <TContent> > { endOption })); }
private async Task RunOptionExecuteAsync(IDialogOption option) { Result.SetResult(option); }
private async Task WrapDialogOptionAsync(Func <Task> commonButtonTask, IDialogOption dialogOption) { await OnExecuteWithDialogOptionActionAsync(dialogOption); await commonButtonTask(); }