/** * Ashita SDK - Copyright (c) 2023 Ashita Development Team * Contact: https://www.ashitaxi.com/ * Contact: https://discord.gg/Ashita * * This file is part of Ashita. * * Ashita is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Ashita is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Ashita. If not, see . */ #ifndef ASHITA_SDK_CHAT_H_INCLUDED #define ASHITA_SDK_CHAT_H_INCLUDED #if defined(_MSC_VER) && (_MSC_VER >= 1020) #pragma once #endif #include #include #include namespace Ashita::Chat { /** * Warning: * * There is a bug with the retail client that can break inline coloring when the client needs to * wrap long lines of text into multiple lines. If the players client is configured where the chat * window is too small to display a single chat line, the client will look for an optimal position * in the text to break it into parts. When this happens it only looks for and stores color codes * that start with 0x1E. Codes that start with 0x1F (color table 2) are ignored and incorrectly * recolored when the split lines begins. * * It is recommended to avoid 0x1F color codes as much as possible and only use 0x1E codes instead! */ namespace Helpers { constexpr auto HeaderOpen = "\x1E\x51[\x1E\x06"; constexpr auto HeaderClose = "\x1E\x51]\x1E\x01 "; } // namespace Helpers namespace Colors { constexpr auto Reset = "\x1E\x01"; constexpr auto Normal = "\x1E\x01"; constexpr auto White = "\x1E\x01"; constexpr auto LawnGreen = "\x1E\x02"; constexpr auto MediumSlateBlue = "\x1E\x03"; constexpr auto Magenta = "\x1E\x05"; constexpr auto Cyan = "\x1E\x06"; constexpr auto Moccasin = "\x1E\x07"; constexpr auto Coral = "\x1E\x08"; constexpr auto DimGrey = "\x1E\x41"; constexpr auto Grey = "\x1E\x43"; constexpr auto Salmon = "\x1E\x44"; constexpr auto Yellow = "\x1E\x45"; constexpr auto RoyalBlue = "\x1E\x47"; constexpr auto DarkMagenta = "\x1E\x48"; constexpr auto Violet = "\x1E\x49"; constexpr auto Tomato = "\x1E\x4C"; constexpr auto MistyRose = "\x1E\x4D"; constexpr auto PaleGoldenRod = "\x1E\x4E"; constexpr auto Lime = "\x1E\x4F"; constexpr auto PaleGreen = "\x1E\x50"; constexpr auto DarkOrchid = "\x1E\x51"; constexpr auto Aqua = "\x1E\x52"; constexpr auto SpringGreen = "\x1E\x53"; constexpr auto DarkSalmon = "\x1E\x55"; constexpr auto MediumSpringGreen = "\x1E\x58"; constexpr auto MediumPurple = "\x1E\x59"; constexpr auto Azure = "\x1E\x5A"; constexpr auto LightCyan = "\x1E\x5C"; constexpr auto LightGoldenRodYellow = "\x1E\x60"; constexpr auto Plum = "\x1E\x69"; } // namespace Colors namespace FFXiSymbols { constexpr auto FireIcon = "\xEF\x1F"; constexpr auto IceIcon = "\xEF\x20"; constexpr auto WindIcon = "\xEF\x21"; constexpr auto EarthIcon = "\xEF\x22"; constexpr auto LightningIcon = "\xEF\x23"; constexpr auto WaterIcon = "\xEF\x24"; constexpr auto LightIcon = "\xEF\x25"; constexpr auto DarknessIcon = "\xEF\x26"; constexpr auto TranslateOpen = "\xEF\x27"; constexpr auto TranslateClose = "\xEF\x28"; constexpr auto On = "\xEF\x29"; constexpr auto Off = "\xEF\x2A"; constexpr auto OnFrench = "\xEF\x2B"; constexpr auto OffFrench = "\xEF\x2C"; constexpr auto OnGerman = "\xEF\x2D"; constexpr auto OffGerman = "\xEF\x2E"; } // namespace FFXiSymbols namespace UnicodeSymbols { /** * The names of these symbols are taken from the following sources: * * https://en.wikipedia.org/wiki/Hiragana * https://en.wikipedia.org/wiki/Kanji * https://en.wikipedia.org/wiki/Katakana * https://en.wikipedia.org/wiki/List_of_Japanese_typographic_symbols * https://www.ssec.wisc.edu/~tomw/java/unicode.html * https://www.key-shortcut.com/en/writing-systems/%E3%81%B2%E3%82%89%E3%81%8C%E3%81%AA-japanese * https://en.wikipedia.org/wiki/List_of_logic_symbols */ constexpr auto IdeographicComma = "\x81\x41"; constexpr auto IdeographicFullStop = "\x81\x42"; constexpr auto Comma = "\x81\x43"; constexpr auto FullStop = "\x81\x44"; constexpr auto MiddleDot = "\x81\x45"; constexpr auto Colon = "\x81\x46"; constexpr auto SemiColon = "\x81\x47"; constexpr auto QuestionMark = "\x81\x48"; constexpr auto ExclamationMark = "\x81\x49"; constexpr auto VoicedSoundMark = "\x81\x4A"; constexpr auto SemiVoicedSoundMark = "\x81\x4B"; constexpr auto Apostrophe = "\x81\x4C"; constexpr auto Accent = "\x81\x4D"; constexpr auto CircumflexAccent = "\x81\x4F"; constexpr auto Macron = "\x81\x50"; constexpr auto LowLine = "\x81\x51"; constexpr auto KatakanaIterationMark = "\x81\x52"; constexpr auto KatakanaVoicedIterationMark = "\x81\x53"; constexpr auto HiraganaIterationMark = "\x81\x54"; constexpr auto HiraganaVoicedIterationMark = "\x81\x55"; constexpr auto Ditto = "\x81\x56"; constexpr auto Repetition = "\x81\x57"; constexpr auto Unknown8158 = "\x81\x58"; constexpr auto Unknown8159 = "\x81\x59"; constexpr auto Maru = "\x81\x5A"; constexpr auto Unknown815B = "\x81\x5B"; constexpr auto Unknown815C = "\x81\x5C"; constexpr auto Unknown815D = "\x81\x5D"; constexpr auto Solidus = "\x81\x5E"; constexpr auto ReverseSolidus = "\x81\x5F"; constexpr auto Tilde = "\x81\x60"; constexpr auto Wave = "\x81\x60"; constexpr auto ParallelVerticalLines = "\x81\x61"; constexpr auto VerticalLine = "\x81\x62"; constexpr auto Pipe = "\x81\x62"; constexpr auto HorizontalEllipsis = "\x81\x63"; constexpr auto TwoDotLeader = "\x81\x64"; constexpr auto Unknown8165 = "\x81\x65"; constexpr auto Unknown8166 = "\x81\x66"; constexpr auto Unknown8167 = "\x81\x67"; constexpr auto Unknown8168 = "\x81\x68"; constexpr auto LeftParenthesis = "\x81\x69"; constexpr auto RightParenthesis = "\x81\x6A"; constexpr auto LeftTortoiseBracket = "\x81\x6B"; constexpr auto RightTortoiseBracket = "\x81\x6C"; constexpr auto LeftSquareBracket = "\x81\x6D"; constexpr auto RightSquareBracket = "\x81\x6E"; constexpr auto LeftCurlyBracket = "\x81\x6F"; constexpr auto RightCurlyBracket = "\x81\x70"; constexpr auto LeftAngleBracket = "\x81\x71"; constexpr auto RightAngleBracket = "\x81\x72"; constexpr auto LeftDoubleAngleBracket = "\x81\x73"; constexpr auto RightDoubleAngleBracket = "\x81\x74"; constexpr auto LeftCornerBracket = "\x81\x75"; constexpr auto RightCornerBracket = "\x81\x76"; constexpr auto LeftWhiteCornerBracket = "\x81\x77"; constexpr auto RightWhiteCornerBracket = "\x81\x78"; constexpr auto LeftBlackLenticularBracket = "\x81\x79"; constexpr auto RightBlackLenticularBracket = "\x81\x7A"; constexpr auto Plus = "\x81\x7B"; constexpr auto Minus = "\x81\x7C"; constexpr auto PlusMinus = "\x81\x7D"; constexpr auto Multiply = "\x81\x7E"; constexpr auto Divide = "\x81\x7F"; constexpr auto Unknown8180 = "\x81\x80"; // Copy of 817F constexpr auto Equals = "\x81\x81"; constexpr auto NotEquals = "\x81\x82"; constexpr auto LessThan = "\x81\x83"; constexpr auto GreaterThan = "\x81\x84"; constexpr auto LessThanOrEquals = "\x81\x85"; constexpr auto GreaterThanOrEquals = "\x81\x86"; constexpr auto Infinite = "\x81\x87"; constexpr auto Therefore = "\x81\x88"; constexpr auto Male = "\x81\x89"; constexpr auto Female = "\x81\x8A"; constexpr auto Degree = "\x81\x8B"; constexpr auto Arcminute = "\x81\x8C"; constexpr auto Arcsecond = "\x81\x8D"; constexpr auto DegreeCelsius = "\x81\x8E"; constexpr auto Unknown818F = "\x81\x8F"; // Copy of 815F constexpr auto Dollar = "\x81\x90"; constexpr auto Cent = "\x81\x91"; constexpr auto Pounds = "\x81\x92"; constexpr auto Percent = "\x81\x93"; constexpr auto Pound = "\x81\x94"; constexpr auto Hashtag = "\x81\x94"; constexpr auto Ampersand = "\x81\x95"; constexpr auto Asterisk = "\x81\x96"; constexpr auto At = "\x81\x97"; constexpr auto Section = "\x81\x98"; constexpr auto WhiteStar = "\x81\x99"; // Colors inversed, but proper naming based on look. constexpr auto BlackStar = "\x81\x9A"; // Colors inversed, but proper naming based on look. constexpr auto WhiteCircle = "\x81\x9B"; // Colors inversed, but proper naming based on look. constexpr auto BlackCircle = "\x81\x9C"; // Colors inversed, but proper naming based on look. constexpr auto Bullseye = "\x81\x9D"; constexpr auto CircleJot = "\x81\x9D"; constexpr auto WhiteDiamond = "\x81\x9E"; // Colors inversed, but proper naming based on look. constexpr auto BlackDiamond = "\x81\x9F"; // Colors inversed, but proper naming based on look. constexpr auto WhiteSquare = "\x81\xA0"; constexpr auto BlackSquare = "\x81\xA1"; constexpr auto WhiteTriangleUp = "\x81\xA2"; constexpr auto BlackTriangleUp = "\x81\xA3"; constexpr auto WhiteTriangleDown = "\x81\xA4"; constexpr auto BlackTriangleDown = "\x81\xA5"; constexpr auto ReferenceMark = "\x81\xA6"; constexpr auto PostalMark = "\x81\xA7"; constexpr auto RightArrow = "\x81\xA8"; constexpr auto LeftArrow = "\x81\xA9"; constexpr auto UpArrow = "\x81\xAA"; constexpr auto DownArrow = "\x81\xAB"; constexpr auto Geta = "\x81\xAC"; constexpr auto ElementOf = "\x81\xAD"; constexpr auto ContainsAsMember = "\x81\xAE"; constexpr auto SubsetOrEquals = "\x81\xAF"; constexpr auto SupersetOrEquals = "\x81\xB0"; constexpr auto Subset = "\x81\xB1"; constexpr auto Superset = "\x81\xB2"; constexpr auto Union = "\x81\xB3"; constexpr auto Intersection = "\x81\xB4"; constexpr auto LogicalAnd = "\x81\xB5"; constexpr auto LogicalOr = "\x81\xB6"; constexpr auto Not = "\x81\xB7"; constexpr auto Unknown81B8 = "\x81\xB8"; // Copy of 81AD constexpr auto Unknown81B9 = "\x81\xB9"; // Copy of 81AE constexpr auto Unknown81BA = "\x81\xBA"; // Copy of 81AF constexpr auto Unknown81BB = "\x81\xBB"; // Copy of 81B0 constexpr auto Unknown81BC = "\x81\xBC"; // Copy of 81B1 constexpr auto Unknown81BD = "\x81\xBD"; // Copy of 81B2 constexpr auto Unknown81BE = "\x81\xBE"; // Copy of 81B3 constexpr auto Unknown81BF = "\x81\xBF"; // Copy of 81B4 constexpr auto Unknown81C0 = "\x81\xC0"; // Copy of 81B5 constexpr auto Unknown81C1 = "\x81\xC1"; // Copy of 81B6 constexpr auto Unknown81C2 = "\x81\xC2"; // Copy of 81B7 constexpr auto Implies = "\x81\xC3"; constexpr auto Iif = "\x81\xC4"; constexpr auto ForAll = "\x81\xC5"; constexpr auto ForEach = "\x81\xC5"; constexpr auto Exists = "\x81\xC6"; constexpr auto Angle = "\x81\xC7"; constexpr auto Unknown81C8 = "\x81\xC8"; // Copy of 81B5 constexpr auto Unknown81C9 = "\x81\xC9"; // Copy of 81B6 constexpr auto Unknown81CA = "\x81\xCA"; // Copy of 81B7 constexpr auto Unknown81CB = "\x81\xCB"; // Copy of 81C3 constexpr auto Unknown81CC = "\x81\xCC"; // Copy of 81C4 constexpr auto Unknown81CD = "\x81\xCD"; // Copy of 81C5 constexpr auto Unknown81CE = "\x81\xCE"; // Copy of 81C6 constexpr auto Unknown81CF = "\x81\xCF"; // Copy of 81C7 constexpr auto Bot = "\x81\xD0"; constexpr auto Falsum = "\x81\xD0"; constexpr auto UpTack = "\x81\xD0"; constexpr auto Tie = "\x81\xD1"; constexpr auto Partial = "\x81\xD2"; constexpr auto Nabla = "\x81\xD3"; constexpr auto IdenticalTo = "\x81\xD4"; constexpr auto ApproximatelyEqual = "\x81\xD5"; constexpr auto MuchLessThan = "\x81\xD6"; constexpr auto MuchGreaterThan = "\x81\xD7"; constexpr auto SquareRoot = "\x81\xD8"; constexpr auto InvertedLazyS = "\x81\xD9"; constexpr auto Unknown81DA = "\x81\xDA"; // Copy of 81CF constexpr auto Unknown81DB = "\x81\xDB"; // Copy of 81D0 constexpr auto Unknown81DC = "\x81\xDC"; // Copy of 81D1 constexpr auto Unknown81DD = "\x81\xDD"; // Copy of 81D2 constexpr auto Unknown81DE = "\x81\xDE"; // Copy of 81D3 constexpr auto Unknown81DF = "\x81\xDF"; // Copy of 81D4 constexpr auto Unknown81E0 = "\x81\xE0"; // Copy of 81D5 constexpr auto Unknown81E1 = "\x81\xE1"; // Copy of 81D6 constexpr auto Unknown81E2 = "\x81\xE2"; // Copy of 81D7 constexpr auto Unknown81E3 = "\x81\xE3"; // Copy of 81D8 constexpr auto Unknown81E4 = "\x81\xE4"; // Copy of 81D9 constexpr auto Proportional = "\x81\xE5"; constexpr auto Because = "\x81\xE6"; constexpr auto Integral = "\x81\xE7"; constexpr auto DoubleIntegral = "\x81\xE8"; constexpr auto AWithOverRing = "\x81\xE9"; constexpr auto PerMil = "\x81\xEA"; constexpr auto PerMile = "\x81\xEA"; constexpr auto MusicSharp = "\x81\xEB"; constexpr auto MusicFlat = "\x81\xEC"; constexpr auto MusicEighthNote = "\x81\xED"; constexpr auto Dagger = "\x81\xEE"; constexpr auto DoubleDagger = "\x81\xEF"; } // namespace UnicodeSymbols /** * Displays the given text colored using the 0x1E color table. * * @param {uint8_t} n - The number of the color to use. * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Color1(const uint8_t n, const std::string& str) { std::string res; res += "\x1E"; res += (char)n; res += str; res += "\x1E\x01"; return res; } /** * Displays the given text colored using the 0x1F color table. * * @param {uint8_t} n - The number of the color to use. * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Color2(const uint8_t n, const std::string& str) { std::string res; res += "\x1F"; res += (char)n; res += str; res += "\x1E\x01"; return res; } /** * Displays the given text surrounded by colored brackets. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Header(const std::string& str) { std::string res; res += Helpers::HeaderOpen; res += str; res += Helpers::HeaderClose; return res; } /** * Displays the given text in a dark red color. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Critical(const std::string& str) { return Color1(76, str); } /** * Displays the given text in a red color. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Error(const std::string& str) { return Color1(68, str); } /** * Displays the given text in a plain color. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Message(const std::string& str) { return Color1(106, str); } /** * Displays the given text in a green color. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Success(const std::string& str) { return Color1(2, str); } /** * Displays the given text in a yellow color. * * @param {std::string} str - The string to display. * @return {std::string} The colorized string. */ inline std::string Warning(const std::string& str) { return Color1(104, str); } } // namespace Ashita::Chat #endif // ASHITA_SDK_CHAT_H_INCLUDED