1#ifndef YAZE_APP_EDITOR_MESSAGE_MESSAGE_DATA_H
2#define YAZE_APP_EDITOR_MESSAGE_MESSAGE_DATA_H
8#include "absl/strings/str_cat.h"
9#include "absl/strings/str_format.h"
10#include "absl/strings/str_replace.h"
22static const std::unordered_map<uint8_t, wchar_t> CharEncoder = {
23 {0x00,
'A'}, {0x01,
'B'}, {0x02,
'C'}, {0x03,
'D'}, {0x04,
'E'},
24 {0x05,
'F'}, {0x06,
'G'}, {0x07,
'H'}, {0x08,
'I'}, {0x09,
'J'},
25 {0x0A,
'K'}, {0x0B,
'L'}, {0x0C,
'M'}, {0x0D,
'N'}, {0x0E,
'O'},
26 {0x0F,
'P'}, {0x10,
'Q'}, {0x11,
'R'}, {0x12,
'S'}, {0x13,
'T'},
27 {0x14,
'U'}, {0x15,
'V'}, {0x16,
'W'}, {0x17,
'X'}, {0x18,
'Y'},
28 {0x19,
'Z'}, {0x1A,
'a'}, {0x1B,
'b'}, {0x1C,
'c'}, {0x1D,
'd'},
29 {0x1E,
'e'}, {0x1F,
'f'}, {0x20,
'g'}, {0x21,
'h'}, {0x22,
'i'},
30 {0x23,
'j'}, {0x24,
'k'}, {0x25,
'l'}, {0x26,
'm'}, {0x27,
'n'},
31 {0x28,
'o'}, {0x29,
'p'}, {0x2A,
'q'}, {0x2B,
'r'}, {0x2C,
's'},
32 {0x2D,
't'}, {0x2E,
'u'}, {0x2F,
'v'}, {0x30,
'w'}, {0x31,
'x'},
33 {0x32,
'y'}, {0x33,
'z'}, {0x34,
'0'}, {0x35,
'1'}, {0x36,
'2'},
34 {0x37,
'3'}, {0x38,
'4'}, {0x39,
'5'}, {0x3A,
'6'}, {0x3B,
'7'},
35 {0x3C,
'8'}, {0x3D,
'9'}, {0x3E,
'!'}, {0x3F,
'?'}, {0x40,
'-'},
36 {0x41,
'.'}, {0x42,
','}, {0x44,
'>'}, {0x45,
'('}, {0x46,
')'},
37 {0x4C,
'"'}, {0x51,
'\''}, {0x59,
' '}, {0x5A,
'<'}, {0x5F, L
'¡'},
38 {0x60, L
'¡'}, {0x61, L
'¡'}, {0x62, L
' '}, {0x63, L
' '}, {0x64, L
' '},
39 {0x65,
' '}, {0x66,
'_'},
62 return s.find(
Contents) != std::string::npos;
66 std::string replacedString = s;
67 size_t pos = replacedString.find(
Contents);
68 while (pos != std::string::npos) {
72 return replacedString;
84 std::vector<DictionaryEntry> dictionary);
98 MessageData(
int id,
int address,
const std::string& rawString,
99 const std::vector<uint8_t>& rawData,
100 const std::string& parsedString,
101 const std::vector<uint8_t>& parsedData)
124 std::string messageString,
125 const std::vector<DictionaryEntry>& dictionary) {
126 std::stringstream protons;
127 bool command =
false;
128 for (
const auto& c : messageString) {
131 }
else if (c ==
']') {
141 std::string protonsString = protons.str();
142 std::string replacedString =
144 std::string finalString =
145 absl::StrReplaceAll(replacedString, {{
CHEESE,
""}});
151 const std::vector<DictionaryEntry>& dictionary) {
168 std::string description) {
179 arg ?
"\\[" +
Token +
":?([0-9A-F]{1,2})\\]" :
"\\[" +
Token +
"\\]";
180 Pattern = absl::StrReplaceAll(
Pattern, {{
"[",
"\\["}, {
"]",
"\\]"}});
187 return absl::StrFormat(
"[%s:%02X]",
Token, value);
189 return absl::StrFormat(
"[%s]",
Token);
197 std::smatch
MatchMe(std::string dfrag)
const {
200 std::regex_match(dfrag, match, pattern);
210static const std::vector<TextElement> TextCommands = {
211 TextElement(0x6B,
"W",
true,
"Window border"),
212 TextElement(0x6D,
"P",
true,
"Window position"),
213 TextElement(0x6E,
"SPD",
true,
"Scroll speed"),
214 TextElement(0x7A,
"S",
true,
"Text draw speed"),
215 TextElement(0x77,
"C",
true,
"Text color"),
216 TextElement(0x6A,
"L",
false,
"Player name"),
217 TextElement(0x74,
"1",
false,
"Line 1"),
218 TextElement(0x75,
"2",
false,
"Line 2"),
219 TextElement(0x76,
"3",
false,
"Line 3"),
220 TextElement(0x7E,
"K",
false,
"Wait for key"),
221 TextElement(0x73,
"V",
false,
"Scroll text"),
222 TextElement(0x78,
"WT",
true,
"Delay X"),
223 TextElement(0x6C,
"N",
true,
"BCD number"),
224 TextElement(0x79,
"SFX",
true,
"Sound effect"),
225 TextElement(0x71,
"CH3",
false,
"Choose 3"),
226 TextElement(0x72,
"CH2",
false,
"Choose 2 high"),
227 TextElement(0x6F,
"CH2L",
false,
"Choose 2 low"),
228 TextElement(0x68,
"CH2I",
false,
"Choose 2 indented"),
229 TextElement(0x69,
"CHI",
false,
"Choose item"),
230 TextElement(0x67,
"IMG",
false,
"Next attract image"),
231 TextElement(0x80,
BANKToken,
false,
"Bank marker (automatic)"),
232 TextElement(0x70,
"NONO",
false,
"Crash"),
237static const std::vector<TextElement> SpecialChars = {
238 TextElement(0x43,
"...",
false,
"Ellipsis …"),
239 TextElement(0x4D,
"UP",
false,
"Arrow ↑"),
240 TextElement(0x4E,
"DOWN",
false,
"Arrow ↓"),
241 TextElement(0x4F,
"LEFT",
false,
"Arrow ←"),
242 TextElement(0x50,
"RIGHT",
false,
"Arrow →"),
243 TextElement(0x5B,
"A",
false,
"Button Ⓐ"),
244 TextElement(0x5C,
"B",
false,
"Button Ⓑ"),
245 TextElement(0x5D,
"X",
false,
"Button ⓧ"),
246 TextElement(0x5E,
"Y",
false,
"Button ⓨ"),
247 TextElement(0x52,
"HP1L",
false,
"1 HP left"),
248 TextElement(0x53,
"HP1R",
false,
"1 HP right"),
249 TextElement(0x54,
"HP2L",
false,
"2 HP left"),
250 TextElement(0x55,
"HP3L",
false,
"3 HP left"),
251 TextElement(0x56,
"HP3R",
false,
"3 HP right"),
252 TextElement(0x57,
"HP4L",
false,
"4 HP left"),
253 TextElement(0x58,
"HP4R",
false,
"4 HP right"),
254 TextElement(0x47,
"HY0",
false,
"Hieroglyph ☥"),
255 TextElement(0x48,
"HY1",
false,
"Hieroglyph 𓈗"),
256 TextElement(0x49,
"HY2",
false,
"Hieroglyph Ƨ"),
257 TextElement(0x4A,
"LFL",
false,
"Link face left"),
258 TextElement(0x4B,
"LFR",
false,
"Link face right"),
The Rom class is used to load, save, and modify Rom data.
const std::string DICTIONARYTOKEN
uint8_t FindDictionaryEntry(uint8_t value)
ParsedElement FindMatchingElement(const std::string &str)
constexpr uint8_t DICTOFF
constexpr int kPointersDictionaries
constexpr int kTextDataEnd
std::vector< DictionaryEntry > BuildDictionaryEntries(app::Rom *rom)
const uint8_t kMessageTerminator
const std::string BANKToken
uint8_t FindMatchingCharacter(char value)
TextElement FindMatchingSpecial(uint8_t value)
TextElement FindMatchingCommand(uint8_t b)
std::vector< uint8_t > ParseMessageToData(std::string str)
constexpr int kNumDictionaryEntries
std::string ParseTextDataByte(uint8_t value)
std::string ReplaceAllDictionaryWords(std::string str, std::vector< DictionaryEntry > dictionary)
DictionaryEntry()=default
std::string ReplaceInstancesOfIn(std::string s)
std::vector< uint8_t > Data
bool ContainedInString(std::string s)
DictionaryEntry(uint8_t i, std::string s)
std::string ContentsParsed
std::vector< uint8_t > DataParsed
std::vector< uint8_t > Data
MessageData(const MessageData &other)
void SetMessage(const std::string &message, const std::vector< DictionaryEntry > &dictionary)
std::string OptimizeMessageForDictionary(std::string messageString, const std::vector< DictionaryEntry > &dictionary)
MessageData(int id, int address, const std::string &rawString, const std::vector< uint8_t > &rawData, const std::string &parsedString, const std::vector< uint8_t > &parsedData)
ParsedElement(TextElement textElement, uint8_t value)
TextElement(uint8_t id, std::string token, bool arg, std::string description)
std::smatch MatchMe(std::string dfrag) const
std::string GetParameterizedToken(uint8_t value=0)
bool operator==(const TextElement &other) const
std::string StrictPattern