コード例 #1
0
        public static string ProcessOutput(string text)
        {
            var blocks = Regex.Matches(text, @"{(.*?) (.*?)}(([^(\r\n|\r|\n)]*(\r\n|\r|\n)+)+){\/\1}", RegexOptions.Multiline);

            foreach (Match block in blocks)
            {
                if (block.Groups.Count >= 4)
                {
                    var blockType  = block.Groups[1].Value.ToLower();
                    var expression = block.Groups[2].Value;
                    var body       = block.Groups[3].Value;

                    if (blockType == "if")
                    {
                        var testResult = EmbeddedFunctionsHelper.Conditional(expression).Success;
                        var bodyParts  = body.Split(new string[] { "{else}" }, StringSplitOptions.None);

                        if (testResult && bodyParts.Length >= 1)
                        {
                            text = text.Replace(block.Value, bodyParts[0].Trim());
                        }
                        else if (!testResult && bodyParts.Length == 2)
                        {
                            text = text.Replace(block.Value, bodyParts[1].Trim());
                        }
                        else
                        {
                            text = text.Replace(block.Value, "");
                        }
                    }
                }
            }

            return(text);
        }
コード例 #2
0
        private void UpdateDialogue(DialogueScreen screen)
        {
            _output.Text = OutputHelpers.ProcessOutput(screen.Says.Trim());

            _choices.Items.Clear();
            _choices.Items.AddRange(
                screen.Choices.Where(c => string.IsNullOrEmpty(c.DisplayCondition) ||
                                     EmbeddedFunctionsHelper.Conditional(c.DisplayCondition).Success));
        }
コード例 #3
0
        public void PlayerWon(Encounter encounter)
        {
            Exit();

            if (!string.IsNullOrEmpty(encounter.OnVictoryAction))
            {
                var output = EmbeddedFunctionsHelper.Action(encounter.OnVictoryAction);
                if (!string.IsNullOrEmpty(output) && _application.ActiveScreen is GameScreen)
                {
                    (_application.ActiveScreen as GameScreen).AppendOutput(output);
                }
            }
        }
コード例 #4
0
        private void _choices_SelectionChanged(object sender, DialogueScreenChoice e)
        {
            if (e == null)
            {
                return;
            }

            var output = EmbeddedFunctionsHelper.Action(e.Action);

            if (!string.IsNullOrEmpty(output))
            {
                _output.Text = output;
            }

            _choices.SetSelection(e, false);
        }
コード例 #5
0
        public void PlayerDied(Encounter encounter)
        {
            Exit();

            if (!string.IsNullOrEmpty(encounter.OnDefeatAction))
            {
                var result = EmbeddedFunctionsHelper.Conditional(encounter.OnDefeatAction);
                if (result.Success)
                {
                    if (!string.IsNullOrEmpty(result.Output) && _application.ActiveScreen is GameScreen)
                    {
                        (_application.ActiveScreen as GameScreen).AppendOutput(result.Output);
                    }

                    return;
                }
            }

            _application.SwitchTo <GameOverForm>();
        }
コード例 #6
0
        private void _battleActionListBox_SelectionChanged(object sender, BattleActions action)
        {
            _battleActionListBox.ClearSelection();

            bool playerIsDefending   = false;
            var  playerCombatProfile = GameManager.Instance.State.GetPlayerCombatProfile();

            //TODO: Take equipped items into consideration

            switch (action)
            {
            case BattleActions.Attack:
                var result = CombatHelper.ResolveAttack(playerCombatProfile, _currentEnemy);
                switch (result.Result)
                {
                case AttackResultCode.Missed:
                    _outputBox.AddOutput($"Player attack missed enemy {_currentEnemy.Name}");
                    break;

                case AttackResultCode.ArmorBlocked:
                    _outputBox.AddOutput($"Enemy {_currentEnemy.Name}'s armor blocked the attack");
                    break;

                case AttackResultCode.DidDamage:
                    _outputBox.AddOutput($"Player did {result.DamageDone} damage to {_currentEnemy.Name}");

                    _currentEnemy.Health -= result.DamageDone;
                    SetHealth(_enemyHealth, Math.Max(0, _currentEnemy.Health), false);
                    break;
                }

                break;

            case BattleActions.Defend:
                playerIsDefending           = true;
                playerCombatProfile.Defense = Convert.ToInt32(playerCombatProfile.Defense * 1.3);
                playerCombatProfile.Armor   = Convert.ToInt32(playerCombatProfile.Armor * 1.2);

                _outputBox.AddOutput("Player is defending");

                break;

            case BattleActions.Run:
                if (!string.IsNullOrEmpty(_encounter.RunConditional))
                {
                    var conditionalResult = EmbeddedFunctionsHelper.Conditional(_encounter.RunConditional);

                    if (!string.IsNullOrEmpty(conditionalResult.Output))
                    {
                        _outputBox.AddOutput(conditionalResult.Output);
                    }

                    if (conditionalResult.Success)
                    {
                        TriggerContinue(EncounterState.RunAway);
                    }
                }
                else
                {
                    TriggerContinue(EncounterState.RunAway);
                }

                return;

            case BattleActions.Continue:
                switch (_encounterState)
                {
                case EncounterState.Default:
                    break;

                case EncounterState.RunAway:
                    EncounterManager.Instance.Exit();
                    break;

                case EncounterState.PlayerWon:
                    EncounterManager.Instance.PlayerWon(_encounter);
                    break;

                case EncounterState.PlayerDied:
                    EncounterManager.Instance.PlayerDied(_encounter);
                    break;
                }

                return;
            }

            if (_currentEnemy.Health > 0)
            {
                if (!_enemyIsStunned)
                {
                    var result = CombatHelper.ResolveAttack(_currentEnemy, playerCombatProfile);
                    switch (result.Result)
                    {
                    case AttackResultCode.Missed:
                        _outputBox.AddOutput($"{_currentEnemy.Name}'s attack missed player");
                        break;

                    case AttackResultCode.ArmorBlocked:
                        _outputBox.AddOutput($"Player's armor blocked the attack");
                        break;

                    case AttackResultCode.DidDamage:
                        _outputBox.AddOutput($"{_currentEnemy.Name} did {result.DamageDone} damage to player");

                        GameManager.Instance.State.Health -= result.DamageDone;
                        SetHealth(_playerHealth, GameManager.Instance.State.Health, false);
                        break;
                    }
                }
                {
                    _enemyIsStunned = false;
                    _outputBox.AddOutput($"{_currentEnemy.Name}'s was temporarily stunned");
                }


                if (playerIsDefending && DiceHelper.RollD6() >= 5)
                {
                    _enemyIsStunned = true;
                    _outputBox.AddOutput($"{_currentEnemy.Name}'s is stunned");
                }
            }
            else
            {
                _outputBox.AddOutput($"{_currentEnemy.Name} died!");

                if (_encounter.Enemies.Any())
                {
                    NextEnemy();
                    _outputBox.AddOutput($"New enemy {_currentEnemy.Name} appeared!");
                }
                else
                {
                    _outputBox.AddOutput($"Victory! Player successfully defeated encounter!");
                    TriggerContinue(EncounterState.PlayerWon);
                }
            }

            if (GameManager.Instance.State.Health <= 0)
            {
                GameManager.Instance.State.Health = 0;
                SetHealth(_playerHealth, GameManager.Instance.State.Health, false);

                _outputBox.AddOutput("Player died :'(");
                TriggerContinue(EncounterState.PlayerDied);
            }
        }