117 lines
4.8 KiB
C
117 lines
4.8 KiB
C
// Written by Moisés.
|
|
// NOTE: This is an earlier version to-be-replaced.
|
|
#include <memory.h>
|
|
#include <textbox.h>
|
|
|
|
// Helper function
|
|
// https://decomp.me/scratch/9H1Uy
|
|
u32 convertUTF8StringToUTF16(char* src, u16* buffer) {
|
|
u32 string_length = 0;
|
|
|
|
// If the source string starts with a null char (0), we assume the string empty.
|
|
if (*src != 0) {
|
|
// Copy the char from the source string into the bufferination.
|
|
// Then advance to the next char until we find the null char (0).
|
|
do {
|
|
*buffer = *src;
|
|
src++;
|
|
buffer++;
|
|
string_length++;
|
|
} while (*src != 0);
|
|
}
|
|
// Make sure to add the null char at the end of the bufferination string,
|
|
// and then return the length of the string.
|
|
*buffer = 0;
|
|
return string_length;
|
|
}
|
|
|
|
// Begin printing ASCII text stored in a char*
|
|
textbox* print_text(const char* message, const s16 X_pos, const s16 Y_pos, const u8 number_of_lines, const s16 textbox_width, const u32 txtbox_flags, const void* module) {
|
|
textbox* (*ptr_textbox_create)(void*, void*, u32) = textbox_create;
|
|
void (*ptr_textbox_setPos)(textbox*, u16, u16, s32) = textbox_setPos;
|
|
void (*ptr_textbox_setDimensions)(textbox*, s8, s16, u8, u8) = textbox_setDimensions;
|
|
void (*ptr_textbox_setMessagePtr)(textbox*, u16*, s32, s16) = textbox_setMessagePtr;
|
|
u16* (*ptr_convertUTF16ToCustomTextFormat)(u16*) = convertUTF16ToCustomTextFormat;
|
|
void* (*ptr_malloc)(s32, u32) = malloc;
|
|
|
|
textbox* txtbox = NULL;
|
|
|
|
// Allocate memory for the text buffer
|
|
u16* text_buffer = (u16*) ptr_malloc(0, 100);
|
|
|
|
// Create the textbox data structure
|
|
if (module != NULL) {
|
|
txtbox = ptr_textbox_create(module, HUD_camera, txtbox_flags);
|
|
}
|
|
|
|
if (txtbox != NULL && text_buffer != NULL && message != NULL) {
|
|
// Set text position and dimensions
|
|
ptr_textbox_setPos(txtbox, X_pos, Y_pos, 1);
|
|
ptr_textbox_setDimensions(txtbox, number_of_lines, textbox_width, 0, 0);
|
|
|
|
// Convert the ASCII message to the CV64 custom format
|
|
convertUTF8StringToUTF16(message, text_buffer);
|
|
ptr_convertUTF16ToCustomTextFormat(text_buffer);
|
|
|
|
// Set the text buffer pointer to the textbox data structure
|
|
ptr_textbox_setMessagePtr(txtbox, text_buffer, 0, 0);
|
|
}
|
|
// We return the textbox so that we can modify its properties once it begins printing
|
|
// (say to show, hide the text)
|
|
return txtbox;
|
|
}
|
|
|
|
// Begin printing signed integer
|
|
textbox* print_number(const s32 number, u16* text_buffer, const s16 X_pos, const s16 Y_pos, const u8 number_of_digits, const u32 txtbox_flags, const u32 additional_text_flag, const void* module) {
|
|
textbox* (*ptr_textbox_create)(void*, void*, u32) = textbox_create;
|
|
void (*ptr_textbox_setPos)(textbox*, u16, u16, s32) = textbox_setPos;
|
|
void (*ptr_textbox_setDimensions)(textbox*, s8, s16, u8, u8) = textbox_setDimensions;
|
|
void (*ptr_textbox_setMessagePtr)(textbox*, u16*, s32, s16) = textbox_setMessagePtr;
|
|
void (*ptr_text_convertIntNumberToText)(u32, u16*, u8, u32) = text_convertIntNumberToText;
|
|
|
|
textbox* txtbox = NULL;
|
|
|
|
// Create the textbox data structure
|
|
if (module != NULL) {
|
|
txtbox = ptr_textbox_create(module, HUD_camera, txtbox_flags);
|
|
}
|
|
|
|
if (txtbox != NULL && text_buffer != NULL) {
|
|
// Set text position and dimensions
|
|
ptr_textbox_setPos(txtbox, X_pos, Y_pos, 1);
|
|
ptr_textbox_setDimensions(txtbox, 1, 100, 0, 0);
|
|
|
|
// Convert the number to the CV64 custom format
|
|
ptr_text_convertIntNumberToText(number, text_buffer, number_of_digits, additional_text_flag);
|
|
|
|
// Set the text buffer pointer to the textbox data structure
|
|
ptr_textbox_setMessagePtr(txtbox, text_buffer, 0, 0);
|
|
}
|
|
// We return the textbox so that we can modify its properties once it begins printing
|
|
// (say to show, hide the text)
|
|
return txtbox;
|
|
}
|
|
|
|
// Update the value of a number that began printing after calling "print_number()"
|
|
void update_printed_number(textbox* txtbox, const s32 number, u16* text_buffer, const u8 number_of_digits, const u32 additional_text_flag) {
|
|
void (*ptr_text_convertIntNumberToText)(u32, u16*, u8, u32) = text_convertIntNumberToText;
|
|
|
|
if (text_buffer != NULL) {
|
|
ptr_text_convertIntNumberToText(number, text_buffer, number_of_digits, additional_text_flag);
|
|
txtbox->flags |= 0x1000000; // Needed to make sure the number updates properly
|
|
}
|
|
}
|
|
|
|
void display_text(textbox* txtbox, const u8 display_textbox) {
|
|
if (txtbox != NULL) {
|
|
if (display_textbox == TRUE) {
|
|
// Show text
|
|
txtbox->flags &= ~HIDE_TEXTBOX;
|
|
}
|
|
else {
|
|
// Hide text
|
|
txtbox->flags |= HIDE_TEXTBOX;
|
|
}
|
|
}
|
|
}
|