mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-02-10 20:22:26 +03:00
290 lines
6.5 KiB
C
290 lines
6.5 KiB
C
|
#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;
|
||
|
}
|