1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-02-04 02:44:24 +00:00

Create FILENAME_ macros for NTSC filename encoding (#1986)

* Create FILENAME_ macros for NTSC filename encoding

* Add defines/comments for all filename characters

* FILENAME_EXCLAMATION_POINT -> FILENAME_EXCLAMATION_MARK to match kanji file

* hirigana -> hiragana
This commit is contained in:
cadmic 2024-07-17 15:36:17 -07:00 committed by GitHub
parent f0796afb86
commit 4fbb48177f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 113 additions and 56 deletions

View file

@ -23,6 +23,37 @@ typedef enum {
// TODO get these properties from the textures themselves
#define MESSAGE_TEXTURE_STATIC_TEX_SIZE 0x900
// Macros for generating characters in the filename encoding (specified by message 0xFFFC
// and loaded by Font_LoadOrderedFont). For example, FILENAME_UPPERCASE('A') will encode
// the character 'A'.
#if OOT_NTSC
#define FILENAME_DIGIT(c) ((c) - '0')
// 0x0A - 0x59: hiragana
// 0x5A - 0xAA: katakana
#define FILENAME_UPPERCASE(c) ((c) - 'A' + 0xAB)
#define FILENAME_LOWERCASE(c) ((c) - 'a' + 0xC5)
#define FILENAME_SPACE 0xDF
// 0xE0: unknown
#define FILENAME_QUESTION_MARK 0xE1
#define FILENAME_EXCLAMATION_MARK 0xE2
#define FILENAME_COLON 0xE3
#define FILENAME_DASH 0xE4
#define FILENAME_LEFT_PARENTHESES 0xE5
#define FILENAME_RIGHT_PARENTHESES 0xE6
#define FILENAME_DAKUTEN 0xE7
#define FILENAME_HANDAKUTEN 0xE8
#define FILENAME_COMMA 0xE9
#define FILENAME_PERIOD 0xEA
#define FILENAME_SLASH 0xEB
#else
#define FILENAME_DIGIT(c) ((c) - '0')
#define FILENAME_UPPERCASE(c) ((c) - 'A' + 0x0A)
#define FILENAME_LOWERCASE(c) ((c) - 'a' + 0x24)
#define FILENAME_SPACE 0x3E
#define FILENAME_DASH 0x3F
#define FILENAME_PERIOD 0x40
#endif
typedef enum {
/* 0x00 */ MSGMODE_NONE,
/* 0x01 */ MSGMODE_TEXT_START,

View file

@ -1303,7 +1303,7 @@ void Message_Decode(PlayState* play) {
// Substitute the player name control character for the file's player name.
for (playerNameLen = ARRAY_COUNT(gSaveContext.save.info.playerData.playerName); playerNameLen > 0;
playerNameLen--) {
if (gSaveContext.save.info.playerData.playerName[playerNameLen - 1] != 0x3E) {
if (gSaveContext.save.info.playerData.playerName[playerNameLen - 1] != FILENAME_SPACE) {
break;
}
}
@ -1311,21 +1311,21 @@ void Message_Decode(PlayState* play) {
PRINTF("\n名前 ");
for (i = 0; i < playerNameLen; i++) {
curChar2 = gSaveContext.save.info.playerData.playerName[i];
if (curChar2 == 0x3E) {
if (curChar2 == FILENAME_SPACE) {
curChar2 = ' ';
} else if (curChar2 == 0x40) {
} else if (curChar2 == FILENAME_PERIOD) {
curChar2 = '.';
} else if (curChar2 == 0x3F) {
} else if (curChar2 == FILENAME_DASH) {
curChar2 = '-';
} else if (curChar2 < 0xA) {
curChar2 += 0;
} else if (curChar2 <= FILENAME_DIGIT('9')) {
curChar2 -= FILENAME_DIGIT('0');
curChar2 += '0';
} else if (curChar2 < 0x24) {
curChar2 += 0;
curChar2 += '7';
} else if (curChar2 < 0x3E) {
curChar2 += 0;
curChar2 += '=';
} else if (curChar2 <= FILENAME_UPPERCASE('Z')) {
curChar2 -= FILENAME_UPPERCASE('A');
curChar2 += 'A';
} else if (curChar2 <= FILENAME_LOWERCASE('z')) {
curChar2 -= FILENAME_LOWERCASE('a');
curChar2 += 'a';
}
if (curChar2 != ' ') {
Font_LoadChar(font, curChar2 - ' ', charTexIdx);

View file

@ -29,7 +29,16 @@ static char sZeldaMagic[] = { '\0', '\0', '\0', '\x98', '\x09', '\x10', '\x21',
static SavePlayerData sNewSavePlayerData = {
{ '\0', '\0', '\0', '\0', '\0', '\0' }, // newf
0, // deaths
{ 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName
{
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
}, // playerName
0, // n64ddFlag
0x30, // healthCapacity
0x30, // defense
@ -157,7 +166,16 @@ void Sram_InitNewSave(void) {
static SavePlayerData sDebugSavePlayerData = {
{ 'Z', 'E', 'L', 'D', 'A', 'Z' }, // newf
0, // deaths
{ 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName ( "LINK" )
{
FILENAME_UPPERCASE('L'),
FILENAME_UPPERCASE('I'),
FILENAME_UPPERCASE('N'),
FILENAME_UPPERCASE('K'),
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
FILENAME_SPACE,
}, // playerName
0, // n64ddFlag
0xE0, // healthCapacity
0xE0, // health

View file

@ -409,10 +409,14 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) {
static s16 textFadeDirection = 0;
static s16 textFadeTimer = 0;
static u8 noControllerFontIndices[] = {
0x17, 0x18, 0x0C, 0x18, 0x17, 0x1D, 0x1B, 0x18, 0x15, 0x15, 0x0E, 0x1B,
FILENAME_UPPERCASE('N'), FILENAME_UPPERCASE('O'), FILENAME_UPPERCASE('C'), FILENAME_UPPERCASE('O'),
FILENAME_UPPERCASE('N'), FILENAME_UPPERCASE('T'), FILENAME_UPPERCASE('R'), FILENAME_UPPERCASE('O'),
FILENAME_UPPERCASE('L'), FILENAME_UPPERCASE('L'), FILENAME_UPPERCASE('E'), FILENAME_UPPERCASE('R'),
};
static u8 pressStartFontIndices[] = {
0x19, 0x1B, 0x0E, 0x1C, 0x1C, 0x1C, 0x1D, 0x0A, 0x1B, 0x1D,
FILENAME_UPPERCASE('P'), FILENAME_UPPERCASE('R'), FILENAME_UPPERCASE('E'), FILENAME_UPPERCASE('S'),
FILENAME_UPPERCASE('S'), FILENAME_UPPERCASE('S'), FILENAME_UPPERCASE('T'), FILENAME_UPPERCASE('A'),
FILENAME_UPPERCASE('R'), FILENAME_UPPERCASE('T'),
};
static void* effectMaskTextures[] = {
gTitleEffectMask00Tex, gTitleEffectMask01Tex, gTitleEffectMask02Tex,

View file

@ -169,7 +169,10 @@ void FileSelect_FinishFadeIn(GameState* thisx) {
* Update function for `CM_MAIN_MENU`
*/
void FileSelect_UpdateMainMenu(GameState* thisx) {
static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E };
static u8 emptyName[] = {
FILENAME_SPACE, FILENAME_SPACE, FILENAME_SPACE, FILENAME_SPACE,
FILENAME_SPACE, FILENAME_SPACE, FILENAME_SPACE, FILENAME_SPACE,
};
FileSelectState* this = (FileSelectState*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];

View file

@ -373,12 +373,12 @@ void FileSelect_DrawNameEntry(GameState* thisx) {
this->kbdY = 5;
this->kbdX = 4;
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != FILENAME_SPACE)) {
for (i = this->newFileNameCharCount; i < 7; i++) {
this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
}
this->fileNames[this->buttonIndex][i] = 0x3E;
this->fileNames[this->buttonIndex][i] = FILENAME_SPACE;
Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
} else {
@ -392,7 +392,7 @@ void FileSelect_DrawNameEntry(GameState* thisx) {
this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
}
this->fileNames[this->buttonIndex][i] = 0x3E;
this->fileNames[this->buttonIndex][i] = FILENAME_SPACE;
Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
@ -419,12 +419,13 @@ void FileSelect_DrawNameEntry(GameState* thisx) {
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_A) && (this->charPage != this->kbdButton)) {
if (this->kbdButton == FS_KBD_BTN_BACKSPACE) {
if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
if ((this->newFileNameCharCount == 7) &&
(this->fileNames[this->buttonIndex][7] != FILENAME_SPACE)) {
for (i = this->newFileNameCharCount; i < 7; i++) {
this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
}
this->fileNames[this->buttonIndex][i] = 0x3E;
this->fileNames[this->buttonIndex][i] = FILENAME_SPACE;
Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
@ -439,7 +440,7 @@ void FileSelect_DrawNameEntry(GameState* thisx) {
this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
}
this->fileNames[this->buttonIndex][i] = 0x3E;
this->fileNames[this->buttonIndex][i] = FILENAME_SPACE;
Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
@ -448,7 +449,7 @@ void FileSelect_DrawNameEntry(GameState* thisx) {
validName = false;
for (i = 0; i < 8; i++) {
if (this->fileNames[this->buttonIndex][i] != 0x3E) {
if (this->fileNames[this->buttonIndex][i] != FILENAME_SPACE) {
validName = true;
break;
}