51 std::vector<TextElement> commands_and_chars = TextCommands;
52 commands_and_chars.insert(commands_and_chars.end(), SpecialChars.begin(),
54 for (
auto& text_element : commands_and_chars) {
55 match = text_element.MatchMe(str);
56 if (match.size() > 0) {
57 if (text_element.HasArgument) {
58 std::string arg = match[1].str().substr(1);
59 return ParsedElement(text_element, std::stoi(arg,
nullptr, 16));
66 const auto dictionary_element =
69 match = dictionary_element.MatchMe(str);
70 if (match.size() > 0) {
72 DICTOFF + std::stoi(match[1].str(),
nullptr, 16));
78 if (CharEncoder.contains(value)) {
79 char c = CharEncoder.at(value);
87 text_element != std::nullopt) {
88 return text_element->GenericToken;
93 special_element != std::nullopt) {
94 return special_element->GenericToken;
99 if (dictionary >= 0) {
101 static_cast<unsigned char>(dictionary));
108 std::vector<uint8_t> bytes;
109 std::string temp_string = std::move(str);
111 while (pos < temp_string.size()) {
113 if (temp_string[pos] ==
'[') {
114 int next = temp_string.find(
']', pos);
122 const auto dictionary_element =
125 if (!parsedElement.
Active) {
126 util::logf(
"Error parsing message: %s", temp_string);
128 }
else if (parsedElement.
Parent == dictionary_element) {
129 bytes.push_back(parsedElement.
Value);
131 bytes.push_back(parsedElement.
Parent.
ID);
134 bytes.push_back(parsedElement.
Value);
153 std::vector<DictionaryEntry> AllDictionaries;
155 std::vector<uint8_t> bytes;
156 std::stringstream stringBuilder;
162 int temppush_backress =
167 while (address < temppush_backress) {
168 uint8_t uint8_tDictionary = rom->
data()[address++];
169 bytes.push_back(uint8_tDictionary);
173 AllDictionaries.push_back(
DictionaryEntry{(uint8_t)i, stringBuilder.str()});
176 std::ranges::sort(AllDictionaries,
181 return AllDictionaries;
206 const std::vector<uint8_t>& rom_data,
int* current_pos) {
208 int pos = *current_pos;
209 uint8_t current_byte;
210 std::vector<uint8_t> temp_bytes_raw;
211 std::vector<uint8_t> temp_bytes_parsed;
212 std::string current_message_raw;
213 std::string current_message_parsed;
217 current_byte = rom_data[pos++];
220 message_data.
ID = message_data.
ID + 1;
222 message_data.
RawString = current_message_raw;
223 message_data.
Data = temp_bytes_raw;
227 temp_bytes_raw.clear();
228 temp_bytes_parsed.clear();
229 current_message_raw.clear();
230 current_message_parsed.clear();
233 }
else if (current_byte == 0xFF) {
237 temp_bytes_raw.push_back(current_byte);
241 if (text_element != std::nullopt) {
242 current_message_raw.append(text_element->GetParamToken());
243 current_message_parsed.append(text_element->GetParamToken());
244 temp_bytes_parsed.push_back(current_byte);
250 if (dictionary >= 0) {
251 current_message_raw.append(
"[");
253 current_message_raw.append(
":");
254 current_message_raw.append(
util::HexWord(
static_cast<unsigned char>(dictionary)));
255 current_message_raw.append(
"]");
257 auto mutable_rom_data =
const_cast<uint8_t*
>(rom_data.data());
263 for (uint32_t i = address; i < address_end; i++) {
264 temp_bytes_parsed.push_back(rom_data[i]);
272 if (CharEncoder.contains(current_byte)) {
273 std::string str =
"";
274 str.push_back(CharEncoder.at(current_byte));
275 current_message_raw.append(str);
276 current_message_parsed.append(str);
277 temp_bytes_parsed.push_back(current_byte);
286 std::vector<MessageData>& message_data,
287 const std::vector<DictionaryEntry>& dictionary_entries) {
288 std::vector<std::string> parsed_messages;
290 for (
auto& message : message_data) {
291 std::string parsed_message =
"";
293 for (
size_t pos = 0; pos < message.Data.size(); ++pos) {
294 uint8_t
byte = message.
Data[pos];
298 if (text_element != std::nullopt) {
301 text_element->ID ==
kLine2 || text_element->ID ==
kLine3) {
302 parsed_message.append(
"\n");
305 if (text_element->HasArgument && pos + 1 < message.Data.size()) {
306 uint8_t arg_byte = message.Data[pos + 1];
307 parsed_message.append(text_element->GetParamToken(arg_byte));
310 parsed_message.append(text_element->GetParamToken());
317 if (special_element != std::nullopt) {
318 parsed_message.append(special_element->GetParamToken());
325 for (
const auto& entry : dictionary_entries) {
326 if (entry.ID ==
byte -
DICTOFF) {
331 parsed_message.append(dic_entry.
Contents);
336 if (CharEncoder.contains(
byte)) {
337 parsed_message.push_back(CharEncoder.at(
byte));
340 parsed_messages.push_back(parsed_message);
343 return parsed_messages;
347 std::vector<MessageData> list_of_texts;
350 std::vector<uint8_t> raw_message;
351 std::vector<uint8_t> parsed_message;
352 std::string current_raw_message;
353 std::string current_parsed_message;
355 uint8_t current_byte = 0;
356 while (current_byte != 0xFF) {
357 current_byte = rom[pos++];
359 list_of_texts.push_back(
360 MessageData(message_id++, pos, current_raw_message, raw_message,
361 current_parsed_message, parsed_message));
363 parsed_message.clear();
364 current_raw_message.clear();
365 current_parsed_message.clear();
367 }
else if (current_byte == 0xFF) {
371 raw_message.push_back(current_byte);
374 if (text_element != std::nullopt) {
375 parsed_message.push_back(current_byte);
376 if (text_element->HasArgument) {
377 current_byte = rom[pos++];
378 raw_message.push_back(current_byte);
379 parsed_message.push_back(current_byte);
382 current_raw_message.append(text_element->GetParamToken(current_byte));
383 current_parsed_message.append(text_element->GetParamToken(current_byte));
394 if (special_element != std::nullopt) {
395 current_raw_message.append(special_element->GetParamToken());
396 current_parsed_message.append(special_element->GetParamToken());
397 parsed_message.push_back(current_byte);
403 if (dictionary >= 0) {
409 uint32_t address_end =
412 for (uint32_t i = address; i < address_end; i++) {
413 parsed_message.push_back(rom[i]);
421 if (CharEncoder.contains(current_byte)) {
422 std::string str =
"";
423 str.push_back(CharEncoder.at(current_byte));
424 current_raw_message.append(str);
425 current_parsed_message.append(str);
426 parsed_message.push_back(current_byte);
430 return list_of_texts;
434 std::vector<std::string>& parsed_messages,
435 std::vector<MessageData>& expanded_messages,
436 std::vector<DictionaryEntry>& dictionary) {
437 static Rom expanded_message_rom;
438 if (!expanded_message_rom.
LoadFromFile(expanded_message_path,
false).ok()) {
439 return absl::InternalError(
"Failed to load expanded message ROM");
442 auto parsed_expanded_messages =
445 for (
const auto& expanded_message : expanded_messages) {
446 parsed_messages.push_back(parsed_expanded_messages[expanded_message.ID]);
448 return absl::OkStatus();