Files
yaze/src/app/editor/message/message_preview.cc
scawful ce6cde438c Refactor message handling and improve message editor functionality
- Combined TextCommands and SpecialChars into a single vector for streamlined matching in FindMatchingElement.
- Removed unnecessary logging in ParseMessageToData for cleaner error handling.
- Updated FindRealDictionaryEntry function signature for improved readability.
- Enhanced DrawCurrentMessage to strip newline characters from input before parsing.
- Added command parameter input in DrawTextCommands for better user interaction.
- Cleaned up unused ToString methods in MessageData and TextElement structures.
2025-05-10 12:52:34 -04:00

117 lines
3.4 KiB
C++

#include "app/editor/message/message_preview.h"
namespace yaze {
namespace editor {
void MessagePreview::DrawTileToPreview(int x, int y, int srcx, int srcy,
int pal, int sizex, int sizey) {
const int num_x_tiles = 16;
const int img_width = 512; // (imgwidth/2)
int draw_id = srcx + (srcy * 32);
for (int yl = 0; yl < sizey * 8; yl++) {
for (int xl = 0; xl < 4; xl++) {
int mx = xl;
int my = yl;
// Formula information to get tile index position in the array.
int tx = ((draw_id / num_x_tiles) * img_width) + ((draw_id & 0xF) << 2);
uint8_t pixel = font_gfx16_data_2_[tx + (yl * 64) + xl];
// nx,ny = object position, xx,yy = tile position, xl,yl = pixel
// position
int index = x + (y * 172) + (mx * 2) + (my * 172);
if ((pixel & 0x0F) != 0) {
current_preview_data_[index + 1] = (uint8_t)((pixel & 0x0F) + (0 * 4));
}
if (((pixel >> 4) & 0x0F) != 0) {
current_preview_data_[index + 0] =
(uint8_t)(((pixel >> 4) & 0x0F) + (0 * 4));
}
}
}
}
void MessagePreview::DrawStringToPreview(const std::string& str) {
for (const auto& c : str) {
DrawCharacterToPreview(c);
}
}
void MessagePreview::DrawCharacterToPreview(char c) {
std::vector<uint8_t> text;
text.push_back(FindMatchingCharacter(c));
DrawCharacterToPreview(text);
}
void MessagePreview::DrawCharacterToPreview(const std::vector<uint8_t>& text) {
for (const uint8_t& value : text) {
if (skip_next) {
skip_next = false;
continue;
}
if (value < 100) {
int srcy = value >> 4;
int srcx = value & 0xF;
if (text_position >= 170) {
text_position = 0;
text_line++;
}
DrawTileToPreview(text_position, text_line * 16, srcx, srcy, 0, 1, 2);
text_position += width_array[value];
} else if (value == kLine1) {
text_position = 0;
text_line = 0;
} else if (value == kScrollVertical) {
text_position = 0;
text_line += 1;
} else if (value == kLine2) {
text_position = 0;
text_line = 1;
} else if (value == kLine3) {
text_position = 0;
text_line = 2;
} else if (value == 0x6B || value == 0x6D || value == 0x6E ||
value == 0x77 || value == 0x78 || value == 0x79 ||
value == 0x7A) {
skip_next = true;
continue;
} else if (value == 0x6C) // BCD numbers.
{
DrawCharacterToPreview('0');
skip_next = true;
continue;
} else if (value == 0x6A) {
// Includes parentheses to be longer, since player names can be up to 6
// characters.
const std::string name = "(NAME)";
DrawStringToPreview(name);
} else if (value >= DICTOFF && value < (DICTOFF + 97)) {
int pos = value - DICTOFF;
if (pos < 0 || pos >= all_dictionaries_.size()) {
// Invalid dictionary entry.
std::cerr << "Invalid dictionary entry: " << pos << std::endl;
continue;
}
auto dictionary_entry = FindRealDictionaryEntry(value, all_dictionaries_);
DrawCharacterToPreview(dictionary_entry.Data);
}
}
}
void MessagePreview::DrawMessagePreview(const MessageData& message) {
// From Parsing.
text_line = 0;
std::fill(current_preview_data_.begin(), current_preview_data_.end(), 0);
text_position = 0;
DrawCharacterToPreview(message.Data);
shown_lines = 0;
}
} // namespace editor
} // namespace yaze