Path: blob/master/RSDKv5/RSDK/Storage/Legacy/TextLegacy.cpp
1168 views
1RSDK::Legacy::TextMenu RSDK::Legacy::gameMenu[LEGACY_TEXTMENU_COUNT];2int32 RSDK::Legacy::textMenuSurfaceNo = 0;34RSDK::Legacy::v3::FontCharacter RSDK::Legacy::v3::fontCharacterList[LEGACY_v3_FONTCHAR_COUNT];56void RSDK::Legacy::v3::LoadTextFile(TextMenu *menu, const char *filePath, uint8 mapCode)7{8bool32 finished = false;9FileInfo info;10InitFileInfo(&info);1112if (LoadFile(&info, filePath, FMODE_RB)) {13menu->textDataPos = 0;14menu->rowCount = 0;15menu->entryStart[menu->rowCount] = menu->textDataPos;16menu->entrySize[menu->rowCount] = 0;1718uint8 fileBuffer = ReadInt8(&info);19if (fileBuffer == 0xFF) {20fileBuffer = ReadInt8(&info);2122while (!finished) {23uint16 character = ReadInt8(&info);24character |= ReadInt8(&info) << 8;2526if (character != '\n') {27if (character == '\r') {28menu->rowCount += 1;29if (menu->rowCount >= 512) {30finished = true;31}32else {33menu->entryStart[menu->rowCount] = menu->textDataPos;34menu->entrySize[menu->rowCount] = 0;35}36}37else {38if (mapCode) {39int32 i = 0;40while (i < 1024) {41if (fontCharacterList[i].id == character) {42character = i;43i = 1025;44}45else {46++i;47}48}4950if (i == 1024)51character = 0;52}53menu->textData[menu->textDataPos++] = character;54menu->entrySize[menu->rowCount]++;55}56}5758if (!finished) {59finished = info.readPos >= info.fileSize;60if (menu->textDataPos >= LEGACY_TEXTDATA_COUNT)61finished = true;62}63}64}65else {66uint16 character = fileBuffer;67if (character != '\n') {68if (character == '\r') {69menu->rowCount++;70menu->entryStart[menu->rowCount] = menu->textDataPos;71menu->entrySize[menu->rowCount] = 0;72}73else {74if (mapCode) {75int32 i = 0;76while (i < 1024) {77if (fontCharacterList[i].id == character) {78character = i;79i = 1025;80}81else {82++i;83}84}8586if (i == 1024)87character = 0;88}89menu->textData[menu->textDataPos++] = character;90menu->entrySize[menu->rowCount]++;91}92}9394while (!finished) {95character = ReadInt8(&info);96if (character != '\n') {97if (character == '\r') {98menu->rowCount++;99if (menu->rowCount > 511) {100finished = true;101}102else {103menu->entryStart[menu->rowCount] = menu->textDataPos;104menu->entrySize[menu->rowCount] = 0;105}106}107else {108if (mapCode) {109int32 i = 0;110while (i < 1024) {111if (fontCharacterList[i].id == character) {112character = i;113i = 1025;114}115else {116++i;117}118}119120if (i == 1024)121character = 0;122}123124menu->textData[menu->textDataPos++] = character;125menu->entrySize[menu->rowCount]++;126}127}128129if (!finished) {130finished = info.readPos >= info.fileSize;131if (menu->textDataPos >= LEGACY_TEXTDATA_COUNT)132finished = true;133}134}135}136menu->rowCount++;137138CloseFile(&info);139}140}141142void RSDK::Legacy::v4::LoadTextFile(TextMenu *menu, const char *filePath)143{144FileInfo info;145InitFileInfo(&info);146147if (LoadFile(&info, filePath, FMODE_RB)) {148menu->textDataPos = 0;149menu->rowCount = 0;150menu->entryStart[menu->rowCount] = menu->textDataPos;151menu->entrySize[menu->rowCount] = 0;152153while (menu->textDataPos < LEGACY_TEXTDATA_COUNT && info.readPos < info.fileSize) {154uint8 character = ReadInt8(&info);155if (character != '\n') {156if (character == '\r') {157menu->rowCount++;158menu->entryStart[menu->rowCount] = menu->textDataPos;159menu->entrySize[menu->rowCount] = 0;160}161else {162menu->textData[menu->textDataPos++] = character;163menu->entrySize[menu->rowCount]++;164}165}166}167168menu->rowCount++;169CloseFile(&info);170}171}172173void RSDK::Legacy::SetupTextMenu(TextMenu *menu, int32 rowCount)174{175menu->textDataPos = 0;176menu->rowCount = rowCount;177}178void RSDK::Legacy::AddTextMenuEntry(TextMenu *menu, const char *text)179{180menu->entryStart[menu->rowCount] = menu->textDataPos;181menu->entrySize[menu->rowCount] = 0;182menu->entryHighlight[menu->rowCount] = false;183184int32 textLength = StrLength(text);185for (int32 i = 0; i < textLength;) {186if (text[i] != '\0') {187menu->textData[menu->textDataPos++] = text[i];188menu->entrySize[menu->rowCount]++;189++i;190}191else {192break;193}194}195menu->rowCount++;196}197void RSDK::Legacy::SetTextMenuEntry(TextMenu *menu, const char *text, int32 rowID)198{199menu->entryStart[rowID] = menu->textDataPos;200menu->entrySize[rowID] = 0;201menu->entryHighlight[menu->rowCount] = false;202203int32 textLength = StrLength(text);204for (int32 i = 0; i < textLength;) {205if (text[i] != '\0') {206menu->textData[menu->textDataPos++] = text[i];207menu->entrySize[rowID]++;208++i;209}210else {211break;212}213}214}215void RSDK::Legacy::EditTextMenuEntry(TextMenu *menu, const char *text, int32 rowID)216{217int32 entryPos = menu->entryStart[rowID];218menu->entrySize[rowID] = 0;219menu->entryHighlight[menu->rowCount] = false;220221int32 textLength = StrLength(text);222for (int32 i = 0; i < textLength;) {223if (text[i] != '\0') {224menu->textData[entryPos++] = text[i];225menu->entrySize[rowID]++;226++i;227}228else {229break;230}231}232}233234void RSDK::Legacy::v3::LoadFontFile(const char *filePath)235{236FileInfo info;237InitFileInfo(&info);238239if (LoadFile(&info, filePath, FMODE_RB)) {240int32 count = 0;241while (info.readPos < info.fileSize) {242fontCharacterList[count].id = ReadInt8(&info);243fontCharacterList[count].id += ReadInt8(&info) << 8;244fontCharacterList[count].id += ReadInt8(&info) << 16;245fontCharacterList[count].id += ReadInt8(&info) << 24;246247fontCharacterList[count].srcX = ReadInt8(&info);248fontCharacterList[count].srcX += ReadInt8(&info) << 8;249250fontCharacterList[count].srcY = ReadInt8(&info);251fontCharacterList[count].srcY += ReadInt8(&info) << 8;252253fontCharacterList[count].width = ReadInt8(&info) + 1;254fontCharacterList[count].width += ReadInt8(&info) << 8;255256fontCharacterList[count].height = ReadInt8(&info) + 1;257fontCharacterList[count].height += ReadInt8(&info) << 8;258259fontCharacterList[count].pivotX = ReadInt8(&info);260uint8 fileBuffer = ReadInt8(&info);261if (fileBuffer > 0x80) {262fontCharacterList[count].pivotX += (fileBuffer - 0x80) << 8;263fontCharacterList[count].pivotX += -0x8000;264}265else {266fontCharacterList[count].pivotX += fileBuffer << 8;267}268269fontCharacterList[count].pivotY = ReadInt8(&info);270fileBuffer = ReadInt8(&info);271if (fileBuffer > 0x80) {272fontCharacterList[count].pivotY += (fileBuffer - 0x80) << 8;273fontCharacterList[count].pivotY += -0x8000;274}275else {276fontCharacterList[count].pivotY += fileBuffer << 8;277}278279fontCharacterList[count].xAdvance = ReadInt8(&info);280fileBuffer = ReadInt8(&info);281if (fileBuffer > 0x80) {282fontCharacterList[count].xAdvance += (fileBuffer - 0x80) << 8;283fontCharacterList[count].xAdvance += -0x8000;284}285else {286fontCharacterList[count].xAdvance += fileBuffer << 8;287}288289// Unused290ReadInt8(&info);291ReadInt8(&info);292293count++;294}295CloseFile(&info);296}297}298299void RSDK::Legacy::v3::DrawBitmapText(void *menu, int32 XPos, int32 YPos, int32 scale, int32 spacing, int32 rowStart, int32 rowCount)300{301TextMenu *tMenu = (TextMenu *)menu;302int32 Y = YPos << 9;303if (rowCount < 0)304rowCount = tMenu->rowCount;305if (rowStart + rowCount > tMenu->rowCount)306rowCount = tMenu->rowCount - rowStart;307308while (rowCount > 0) {309int32 X = XPos << 9;310for (int32 i = 0; i < tMenu->entrySize[rowStart]; ++i) {311uint16 c = tMenu->textData[tMenu->entryStart[rowStart] + i];312FontCharacter *fChar = &fontCharacterList[c];313DrawSpriteScaled(FLIP_NONE, X >> 9, Y >> 9, -fChar->pivotX, -fChar->pivotY, scale, scale, fChar->width, fChar->height, fChar->srcX,314fChar->srcY, textMenuSurfaceNo);315X += fChar->xAdvance * scale;316}317Y += spacing * scale;318rowStart++;319rowCount--;320}321}322323