private string AdjustString(string str, Player player, List <Player> party) { string res = str.Replace(ThisPlayer, player.Name); if (res.Contains(RelatedPlayer)) { RelationTag relTag = (RelationTag)RequiredTags.FirstOrDefault(t => t is RelationTag); RelationTag tag = (RelationTag)player.Tags .FirstOrDefault(t => t is RelationTag && string.Compare(t.Name, relTag.Name, true) == 0); if (tag != null) { res = res.Replace(RelatedPlayer, party.FirstOrDefault(p => p.ID == tag.RelatesToID)?.Name); } } int playerRelativeIndex = 0; var restOfParty = party.Where(p => p.ID != player.ID); while (res.Contains(OtherPlayer)) { if (!res.Contains(OtherPlayer + (playerRelativeIndex + 1).ToString())) { Console.WriteLine(OtherPlayer + (playerRelativeIndex + 1).ToString()); throw new Exception($"{OtherPlayer}-tag used incorrectly, expected to find {OtherPlayer}{(playerRelativeIndex + 1)}"); } else { res = res.Replace(OtherPlayer + (playerRelativeIndex + 1).ToString(), restOfParty.ElementAt(playerRelativeIndex).Name); } playerRelativeIndex++; } return(res); }