Exemplo n.º 1
0
        internal static TextFragment ParseVariableFragment(string content)
        {
            if (content.StartsWith(TextDecoderConsts.PlayerVariable, StringComparison.OrdinalIgnoreCase))
            {
                // Samples:
                // [Player1:f]
                // [Player1]
                // [Player]

                var playerReference = new PlayerReferenceFragment();

                var parameterBegin = content.IndexOf(TextDecoderConsts.VariableParametersStart);

                string playerTag;
                if (parameterBegin == -1)
                {
                    playerTag = content;
                }
                else
                {
                    playerTag = content.Substring(0, parameterBegin);

                    var gender = content.Substring(parameterBegin + 1, content.Length - 1 - parameterBegin);
                    if (ParserHelper.ParseRequiredGender(gender, out var requiredGender))
                    {
                        playerReference.RequiredGender = requiredGender;
                    }
                    else
                    {
                        throw new ArgumentException("Gender parameter of player tag could not be parsed: " +
                                                    content);
                    }
                }

                playerReference.PlayerIndex = ParsePlayerIndex(playerTag);
                return(playerReference);
            }

            if (content.StartsWith(TextDecoderConsts.SipsVariable, StringComparison.OrdinalIgnoreCase))
            {
                var sipsFragment = new SipsFragment();

                var parameterBegin = content.IndexOf(TextDecoderConsts.VariableParametersStart);

                string sipsTag;
                if (parameterBegin == -1)
                {
                    sipsTag = content;
                }
                else
                {
                    sipsTag = content.Substring(0, parameterBegin);
                    sipsFragment.MinSips = int.Parse(content.Substring(parameterBegin + 1));
                }

                if (sipsTag.Length > TextDecoderConsts.SipsVariable.Length)
                {
                    sipsFragment.SipsIndex = int.Parse(sipsTag.Substring(TextDecoderConsts.SipsVariable.Length));
                }

                return(sipsFragment);
            }

            return(new RawTextFragment(content));
        }
Exemplo n.º 2
0
        private void AppendFragments(StringBuilder builder, IReadOnlyList <TextFragment> fragments, IReadOnlyDictionary <int, PlayerInfo> players, IReadOnlyDictionary <int, int> sips)
        {
            PlayerReferenceFragment lastPlayerReferenceFragment = null;

            foreach (var fragment in fragments)
            {
                if (fragment is RawTextFragment rawTextFragment)
                {
                    builder.Append(rawTextFragment.Text);
                }
                else if (fragment is PlayerReferenceFragment playerReferenceFragment)
                {
                    if (BoldPlayerNames)
                    {
                        builder.Append("**");
                    }
                    builder.Append(players[playerReferenceFragment.PlayerIndex].Name);
                    if (BoldPlayerNames)
                    {
                        builder.Append("**");
                    }

                    lastPlayerReferenceFragment = playerReferenceFragment;
                }
                else if (fragment is SipsFragment sipsFragment)
                {
                    if (BoldSips)
                    {
                        builder.Append("**");
                    }

                    var sip = sips[sipsFragment.SipsIndex];
                    if (sip == 1)
                    {
                        builder.Append(_textResource["OneSip"]);
                    }
                    else
                    {
                        builder.AppendFormat(_textResource["Sips"], sip);
                    }

                    if (BoldSips)
                    {
                        builder.Append("**");
                    }
                }
                else if (fragment is GenderBasedSelectionFragment genderBasedSelectionFragment)
                {
                    var referencedPlayer = genderBasedSelectionFragment.ReferencedPlayerIndex ??
                                           lastPlayerReferenceFragment?.PlayerIndex ?? players.First().Key;

                    var player = players[referencedPlayer];
                    builder.Append(player.Gender == Gender.Female
                        ? genderBasedSelectionFragment.FemaleText
                        : genderBasedSelectionFragment.MaleText);
                }
                else if (fragment is RandomTextFragment randomTextFragment)
                {
                    var index = _selection.GetRandomNumber(randomTextFragment.Texts.Count);
                    builder.Append(randomTextFragment.Texts[index]);
                }
                else if (fragment is RandomNumberFragment randomNumberFragment)
                {
                    builder.Append(_selection.SelectRandomNumber(randomNumberFragment.Numbers));
                }
                else
                {
                    throw new ArgumentException($"The fragment of type {fragment.GetType().Name} is not supported.");
                }
            }
        }