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