Starship/src/engine/fox_message.c
petrie911 b3929bea72
Docs update, added list of all SFX Ids used in the game. (#217)
* docs

* format

* format plz

* stuff

* more stuff

* more names and such

* torch update
2024-04-20 16:18:31 -03:00

190 lines
5.2 KiB
C

#include "global.h"
u16* Message_PtrFromId(u16 msgId) {
s32 i;
MsgLookup* lookup = gMsgLookup;
while (lookup->msgId != -1) {
if (lookup->msgId == msgId) {
return lookup->msgPtr;
}
lookup++;
}
return NULL;
}
u16 Message_IdFromPtr(u16* msgPtr) {
s32 i;
MsgLookup* lookup = gMsgLookup;
while (lookup->msgPtr != NULL) {
if (lookup->msgPtr == msgPtr) {
return lookup->msgId;
}
lookup++;
}
return -1;
}
s32 Message_GetWidth(u16* msgPtr) {
s32 width = 0;
u16* msgChar = msgPtr;
while (*msgChar != MSGCHAR_END) {
if ((*msgChar >= MSGCHAR_CLF) || (*msgChar == MSGCHAR_SPC)) {
width++;
}
msgChar++;
}
return width;
}
s32 Message_GetCharCount(u16* msgPtr) {
s32 count = 0;
u16* msgChar = msgPtr;
while (*msgChar != MSGCHAR_END) {
count++;
msgChar++;
}
return count;
}
void Message_DisplayChar(Gfx** gfxPtr, u16 msgChar, s32 xpos, s32 ypos) {
gDPLoadTextureBlock_4b((*gfxPtr)++, gTextCharTextures[msgChar >> 2], G_IM_FMT_CI, 16, 13, msgChar % 4U,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
gSPTextureRectangle((*gfxPtr)++, xpos << 2, ypos << 2, (xpos + 13) << 2, (ypos + 13) << 2, G_TX_RENDERTILE, 64, 0,
1024, 1024);
}
bool Message_DisplayText(Gfx** gfxPtr, u16* msgPtr, s32 xPos, s32 yPos, s32 len) {
s32 xChar = xPos;
s32 yChar = yPos;
s32 i;
s32 print;
gDPSetPrimColor((*gfxPtr)++, 0x00, 0x00, 255, 255, 255, 255);
gDPSetTextureLUT((*gfxPtr)++, G_TT_RGBA16);
gDPLoadTLUT((*gfxPtr)++, 64, 256, gTextCharPalettes);
// bug: if the for loop is skipped, print is never initialized
for (i = 0; msgPtr[i] != MSGCHAR_END && i < len; i++) {
print = false;
switch (msgPtr[i]) {
case MSGCHAR_NWL:
xChar = xPos;
yChar += 13;
break;
case MSGCHAR_CLF:
case MSGCHAR_CUP:
case MSGCHAR_CRT:
case MSGCHAR_CDN:
gDPSetPrimColor((*gfxPtr)++, 0x00, 0x00, 255, 255, 0, 255);
Message_DisplayChar(gfxPtr, msgPtr[i], xChar, yChar);
xChar += 14;
print = true;
gDPSetPrimColor((*gfxPtr)++, 0x00, 0x00, 255, 255, 255, 255);
break;
case MSGCHAR_SPC:
default:
Message_DisplayChar(gfxPtr, msgPtr[i], xChar, yChar);
xChar += 7;
print = true;
break;
case MSGCHAR_NP2:
case MSGCHAR_NP3:
case MSGCHAR_NP4:
case MSGCHAR_NP5:
case MSGCHAR_NP6:
case MSGCHAR_NP7:
case MSGCHAR_PRI0:
case MSGCHAR_PRI1:
case MSGCHAR_PRI2:
case MSGCHAR_PRI3:
case MSGCHAR_QSP:
case MSGCHAR_HSP:
case MSGCHAR_NXT:
break;
}
}
return print;
}
void Message_DisplayScrollingText(Gfx** gfxPtr, u16* msgPtr, s32 xPos, s32 yPos, s32 yRangeHi, s32 yRangeLo, s32 len) {
s32 var_s2 = xPos;
s32 var_s4 = yPos;
s32 i;
gDPSetTextureLUT((*gfxPtr)++, G_TT_RGBA16);
gDPLoadTLUT((*gfxPtr)++, 64, 256, gTextCharPalettes);
for (i = 0; msgPtr[i] != 0 && i < len; i++) {
switch (msgPtr[i]) {
case MSGCHAR_NWL:
var_s2 = xPos;
var_s4 += 15;
break;
case MSGCHAR_QSP:
var_s2 += 2;
break;
case MSGCHAR_HSP:
var_s2 += 3;
break;
case MSGCHAR_SPC:
var_s2 += 7;
break;
default:
if ((yRangeLo < var_s4) && (var_s4 < yRangeHi)) {
Message_DisplayChar(gfxPtr, msgPtr[i], var_s2, var_s4);
}
var_s2 += 7;
break;
case MSGCHAR_NP2:
case MSGCHAR_NP3:
case MSGCHAR_NP4:
case MSGCHAR_NP5:
case MSGCHAR_NP6:
case MSGCHAR_NP7:
case MSGCHAR_PRI0:
case MSGCHAR_PRI1:
case MSGCHAR_PRI2:
case MSGCHAR_PRI3:
case MSGCHAR_NXT:
break;
}
}
}
bool Message_IsPrintingChar(u16* msgPtr, s32 charPos) {
s32 i;
s32 print;
// bug: if the for loop is skipped, print is never initialized
for (i = 0; msgPtr[i] != 0 && i < charPos; i++) {
print = false;
switch (msgPtr[i]) {
case MSGCHAR_NWL:
case MSGCHAR_NP2:
case MSGCHAR_NP3:
case MSGCHAR_NP4:
case MSGCHAR_NP5:
case MSGCHAR_NP6:
case MSGCHAR_NP7:
case MSGCHAR_PRI0:
case MSGCHAR_PRI1:
case MSGCHAR_PRI2:
case MSGCHAR_PRI3:
case MSGCHAR_SPC:
case MSGCHAR_QSP:
case MSGCHAR_HSP:
case MSGCHAR_NXT:
break;
default:
print = true;
break;
}
}
return print;
}