private void checkForSuffix(Token token, string part, string normalized) { if (part.Length > normalized.Length) { var prefixLength = part.StartsWith("(") ? 1 : 0; var suffixLength = part.Length - normalized.Length - prefixLength; token.Suffix = part.Substring(part.Length - suffixLength, suffixLength); } }
private void checkForTitleReference(Token token, string part) { const string titleTag = "[Card]"; if (part.Contains(titleTag)) { token.IsTitleReference = true; if (part.Length > titleTag.Length && !part.EndsWith("]")) { token.Text = part.Substring(0, titleTag.Length); token.Suffix = part.Substring(titleTag.Length, part.Length - titleTag.Length); } else { token.Text = part; } } }
private CardEffect ParseCardEffect(Card card, string text, bool isFirst) { if (text == null) return null; var effect = new CardEffect(); var count = 0; foreach (var part in text.Split(' ')) { if (string.IsNullOrEmpty(part)) continue; count++; var token = new Token(); var partText = part; var normalized = part.TrimStart('(').TrimEnd('.', ',', ':', '"', '\'', ')'); var escaped = part.StartsWith("~"); if (part.Length > 0 && part.EndsWith(":") && char.IsUpper(part.GetFirstLetter())) { token.IsTrigger = true; token.Text = part; if (count == 2) { effect.Tokens.First().IsTrigger = true; } checkForTitleReference(token, part); } else { token.Prefix = count > 1 ? " " : string.Empty; if (!escaped && normalized != "Attack") { //NOTE: A Sphere token has priority over a Trait token if (_cardService.Traits().Any(x => string.Equals(x, normalized + ".")) && !_cardService.Spheres().Any(x => string.Equals(x, normalized))) { token.IsTrait = true; token.Text = token.Prefix + part.Trim(','); checkForSuffix(token, part, normalized); effect.Tokens.Add(token); continue; } } token.ImagePath = GetImagePath(normalized); if (token.IsIcon) { if (part.StartsWith("(")) token.Prefix = token.Prefix + "("; token.Text = normalized; checkForSuffix(token, part, normalized); effect.Tokens.Add(token); continue; } else if (part.StartsWith("**") && part.EndsWith("**")) { token.IsStrong = true; partText = part.Replace("**", string.Empty); } else if (part.StartsWith("*") && part.EndsWith("*")) { token.IsEmphasized = true; partText = part.Trim('*'); } token.Text = token.Prefix + partText.TrimStart('~'); } checkForTitleReference(token, partText); effect.Tokens.Add(token); } foreach (var phrase in strongPhrases) { if (text.ToLower().Contains(phrase)) { if (!effect.Tokens[0].IsTrigger) { effect.IsCritical = true; } } } return effect; }