Starship/src/main/fox_message.c

290 lines
6.5 KiB
C
Raw Normal View History

#include "global.h"
typedef enum {
MSGCHAR_END,
MSGCHAR_NWL,
MSGCHAR_NP2,
MSGCHAR_NP3,
MSGCHAR_NP4,
MSGCHAR_NP5,
MSGCHAR_NP6,
MSGCHAR_NP7,
MSGCHAR_NP8,
MSGCHAR_NP9,
MSGCHAR_NPA,
MSGCHAR_NPB,
MSGCHAR_SPC,
MSGCHAR_QSP,
MSGCHAR_HSP,
MSGCHAR_NPF,
MSGCHAR_CLF,
MSGCHAR_CUP,
MSGCHAR_CRT,
MSGCHAR_CDN,
MSGCHAR_AUP,
MSGCHAR_ALF,
MSGCHAR_ADN,
MSGCHAR_ART,
MSGCHAR_A,
MSGCHAR_B,
MSGCHAR_C,
MSGCHAR_D,
MSGCHAR_E,
MSGCHAR_F,
MSGCHAR_G,
MSGCHAR_H,
MSGCHAR_I,
MSGCHAR_J,
MSGCHAR_K,
MSGCHAR_L,
MSGCHAR_M,
MSGCHAR_N,
MSGCHAR_O,
MSGCHAR_P,
MSGCHAR_Q,
MSGCHAR_R,
MSGCHAR_S,
MSGCHAR_T,
MSGCHAR_U,
MSGCHAR_V,
MSGCHAR_W,
MSGCHAR_X,
MSGCHAR_Y,
MSGCHAR_Z,
MSGCHAR_a,
MSGCHAR_b,
MSGCHAR_c,
MSGCHAR_d,
MSGCHAR_e,
MSGCHAR_f,
MSGCHAR_g,
MSGCHAR_h,
MSGCHAR_i,
MSGCHAR_j,
MSGCHAR_k,
MSGCHAR_l,
MSGCHAR_m,
MSGCHAR_n,
MSGCHAR_o,
MSGCHAR_p,
MSGCHAR_q,
MSGCHAR_r,
MSGCHAR_s,
MSGCHAR_t,
MSGCHAR_u,
MSGCHAR_v,
MSGCHAR_w,
MSGCHAR_x,
MSGCHAR_y,
MSGCHAR_z,
MSGCHAR_EXM,
MSGCHAR_QST,
MSGCHAR_DSH,
MSGCHAR_CMA,
MSGCHAR_PRD,
MSGCHAR_0,
MSGCHAR_1,
MSGCHAR_2,
MSGCHAR_3,
MSGCHAR_4,
MSGCHAR_5,
MSGCHAR_6,
MSGCHAR_7,
MSGCHAR_8,
MSGCHAR_9,
MSGCHAR_APS,
MSGCHAR_LPR,
MSGCHAR_RPR,
MSGCHAR_CLN,
MSGCHAR_PIP,
} CharCode;
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 > 15 || *msgChar == 12) {
width++;
}
msgChar++;
}
return width;
}
s32 Message_GetCharCount(u16* msgPtr) {
s32 count = 0;
u16* msgChar = msgPtr;
while (*msgChar != 0) {
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 & 3,
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, 0x40, 0,
0x400, 0x400);
}
s32 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, 0x100, D_Tex_800DBA20);
// 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_NP8:
case MSGCHAR_NP9:
case MSGCHAR_NPA:
case MSGCHAR_NPB:
case MSGCHAR_QSP:
case MSGCHAR_HSP:
case MSGCHAR_NPF:
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;
// s32 var_v1;
gDPSetTextureLUT((*gfxPtr)++, G_TT_RGBA16);
gDPLoadTLUT((*gfxPtr)++, 64, 0x100, D_Tex_800DBA20);
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_NP8:
case MSGCHAR_NP9:
case MSGCHAR_NPA:
case MSGCHAR_NPB:
case MSGCHAR_NPF:
break;
}
}
}
s32 Message_NotWhitespace(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 = 0;
switch (msgPtr[i]) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
break;
default:
print = 1;
break;
}
}
return print;
}