#include "d/dolzel.h" // IWYU pragma: keep #include "d/d_msg_class.h" #include #include "d/d_meter2_info.h" #include "d/d_msg_object.h" #include "d/d_msg_unit.h" #include "JSystem/J2DGraph/J2DTextBox.h" #include "d/d_msg_out_font.h" #include "m_Do/m_Do_graphic.h" #include "d/d_lib.h" #include "JSystem/JUtility/JUTFont.h" #if REGION_JPN #define CHAR_CODE_MALE_ICON 0x8189 #define CHAR_CODE_FEMALE_ICON 0x818A #define CHAR_CODE_STAR_ICON 0x819A #define CHAR_CODE_REFMARK 0x81A6 #define CHAR_CODE_THIN_LEFT_ARROW 0x81A9 #define CHAR_CODE_THIN_RIGHT_ARROW 0x81A8 #define CHAR_CODE_THIN_UP_ARROW 0x81AA #define CHAR_CODE_THIN_DOWN_ARROW 0x81AB #else #define CHAR_CODE_MALE_ICON 0xB2 #define CHAR_CODE_FEMALE_ICON 0xB3 #define CHAR_CODE_STAR_ICON 0xB1 #define CHAR_CODE_REFMARK 0x89 #define CHAR_CODE_THIN_LEFT_ARROW 0xB9 #define CHAR_CODE_THIN_RIGHT_ARROW 0xBC #define CHAR_CODE_THIN_UP_ARROW 0xBD #define CHAR_CODE_THIN_DOWN_ARROW 0xBE #endif static bool checkCharInfoCharactor(int c) { if (c != 0x8140 && c != 0x8141 && c != 0x8142 && c != 0x0020 && c != 0x0022 && c != 0x0027 && c != 0x002C && c != 0x002E) { return true; } return false; } static char* changeCodeToChar(u16 param_0) { static char mMoji[3]; mMoji[0] = mMoji[1] = mMoji[2] = 0; mMoji[0] = (param_0 & 0xFF00) >> 8; if (mMoji[0] == 0) { mMoji[0] = param_0 & 0xFF; } else { mMoji[1] = param_0 & 0xFF; } return mMoji; } static u16 change1ByteTo2Bytes(int iCharacter) { static u16 char_table[] = { 0x0000, 0x8142, 0x8175, 0x8176, 0x8141, 0x8145, 0x8392, 0x8340, 0x8342, 0x8344, 0x8346, 0x8348, 0x8383, 0x8385, 0x8387, 0x8362, 0x815B, 0x8341, 0x8343, 0x8345, 0x8347, 0x8349, 0x834A, 0x834C, 0x834E, 0x8350, 0x8352, 0x8354, 0x8356, 0x8358, 0x835A, 0x835C, 0x835E, 0x8360, 0x8363, 0x8365, 0x8367, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, 0x8371, 0x8374, 0x8377, 0x837A, 0x837D, 0x837E, 0x8380, 0x8381, 0x8382, 0x8384, 0x8386, 0x8388, 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8393, 0x814A, 0x814B, }; u16 character2Bytes = iCharacter; if (iCharacter >= '0' && iCharacter <= '9') { character2Bytes = iCharacter + 0x821F; } else if (iCharacter >= 'A' && iCharacter <= 'Z') { character2Bytes = iCharacter + 0x8230; } else if (iCharacter >= 'a' && iCharacter <= 'z') { character2Bytes = iCharacter + 0x8251; } else if (iCharacter >= 0xA0 && iCharacter <= 0xDF) { int sp8 = iCharacter - 0xA0; character2Bytes = char_table[sp8]; } else { switch (iCharacter) { case ' ': character2Bytes = 0x8140; break; case '!': character2Bytes = 0x8149; break; case '\"': character2Bytes = 0x8168; break; case '#': character2Bytes = 0x8194; break; case '$': character2Bytes = 0x8190; break; case '%': character2Bytes = 0x8193; break; case '&': character2Bytes = 0x8195; break; case '\'': character2Bytes = 0x8166; break; case '(': character2Bytes = 0x8169; break; case ')': character2Bytes = 0x816a; break; case '*': character2Bytes = 0x8196; break; case '+': character2Bytes = 0x817b; break; case ',': character2Bytes = 0x8143; break; case '-': character2Bytes = 0x817c; break; case '.': character2Bytes = 0x8144; break; case '/': character2Bytes = 0x815e; break; case ':': character2Bytes = 0x8146; break; case ';': character2Bytes = 0x8147; break; case '<': character2Bytes = 0x8171; break; case '=': character2Bytes = 0x8181; break; case '>': character2Bytes = 0x8172; break; case '?': character2Bytes = 0x8148; break; case 'K': character2Bytes = 0x816d; break; case 'L': character2Bytes = 0x818f; break; case 'M': character2Bytes = 0x816e; break; case 'N': character2Bytes = 0x813f; break; case 'O': character2Bytes = 0x8151; break; case '[': character2Bytes = 0x816f; break; case '\\': character2Bytes = 0x8162; break; case ']': character2Bytes = 0x8170; break; case '^': character2Bytes = 0x8140; break; case '_': character2Bytes = 0; break; } } return character2Bytes; } static u16 changeKataToHira(int iCharacter) { u16 hiraCharacter = iCharacter; if (iCharacter >= 0x8340 && iCharacter <= 0x837E) { hiraCharacter = iCharacter - 0xA1; } else if (iCharacter >= 0x8380 && iCharacter <= 0x8393) { hiraCharacter = iCharacter - 0xA2; } else if (iCharacter == 0x8394) { hiraCharacter = 0x82D4; } return hiraCharacter; } static bool isOutfontKanjiCode(int iCharacter) { switch (iCharacter) { case '\\': case '@': case '$': case 0x81F2: case 0x81F3: return true; default: return false; } } static u32 getFontCCColorTable(u8 i_colorNo, u8 i_fukiKind) { static const u32 colorTable[9] = { 0xFFFFFFFF, 0xF07878FF, 0xAADC8CFF, 0xA0B4DCFF, 0xDCDC82FF, 0xB4C8E6FF, 0xC8A0DCFF, 0xFFFFFFFF, 0xDCAA78FF, }; if (i_colorNo > 8) { return 0xFFFFFFFF; } if (g_MsgObject_HIO_c.mTextColorDebug) { return (g_MsgObject_HIO_c.mTextColorUpperR[i_colorNo] << 0x18) | (g_MsgObject_HIO_c.mTextColorUpperG[i_colorNo] << 0x10) | (g_MsgObject_HIO_c.mTextColorUpperB[i_colorNo] << 0x8) | 0xFF; } u32 color = colorTable[i_colorNo]; if (i_colorNo != 0) { return color; } switch (i_fukiKind) { case 13: return 0x82E6E6FF; case 8: return 0xFFFFFFFF; case 14: return 0x96DC64FF; default: return color; } } static u32 getFontGCColorTable(u8 i_colorNo, u8 i_fukiKind) { static const u32 colorTable[9] = { 0xFFFFFFFF, 0xF07878FF, 0xAADC8CFF, 0xA0B4DCFF, 0xDCDC82FF, 0xB4C8E6FF, 0xC8A0DCFF, 0xFFFFFFFF, 0xDCAA78FF, }; if (i_colorNo > 8) { return 0xFFFFFFFF; } if (g_MsgObject_HIO_c.mTextColorDebug) { return (g_MsgObject_HIO_c.mTextColorLowerR[i_colorNo] << 0x18) | (g_MsgObject_HIO_c.mTextColorLowerG[i_colorNo] << 0x10) | (g_MsgObject_HIO_c.mTextColorLowerB[i_colorNo] << 0x8) | 0xFF; } u32 color = colorTable[i_colorNo]; if (i_colorNo != 0) { return color; } switch (i_fukiKind) { case 13: return 0x82E6E6FF; case 8: return 0xFFFFFFFF; case 14: return 0x96DC64FF; default: return color; } } static u8 getOutFontNumberType(int param_0) { switch (param_0) { case 0: return 0x1F; case 1: return 0x20; case 2: return 0x21; case 3: return 0x22; case 4: return 0x23; case 5: return 0x24; case 6: return 0x25; case 7: return 0x26; case 8: return 0x27; case 9: return 0x28; default: return 0x1F; } } #if VERSION == VERSION_GCN_PAL static void setPlayerName(char* i_player_name, u8 param_2) { if (param_2 != 0) { strcpy(i_player_name, dComIfGs_getPlayerName()); u32 name_length = strlen(i_player_name); char last = i_player_name[name_length - 1]; if (last == 0x73 || last == 0x53 || last == 0x7a || last == 0x5a || last == 0x78 || last == 0x58 || last == 0xdf) { strcat(i_player_name, "'"); } else { strcat(i_player_name, "s"); } } else { strcpy(i_player_name, dComIfGs_getPlayerName()); } } static void setHorseName(char* i_horse_name, u8 param_2) { if (param_2 != 0) { strcpy(i_horse_name, dComIfGs_getHorseName()); u32 name_length = strlen(i_horse_name); char last = i_horse_name[name_length - 1]; if (last == 0x73 || last == 0x53 || last == 0x7a || last == 0x5a || last == 0x78 || last == 0x58 || last == 0xdf) { strcat(i_horse_name, "'"); } else { strcat(i_horse_name, "s"); } } else { strcpy(i_horse_name, dComIfGs_getHorseName()); } } #endif static u8 getPohNum() { u8 num = 0; if (dComIfGs_getPohSpiritNum() < 20) { num = 20 - dComIfGs_getPohSpiritNum(); } else if (dComIfGs_getPohSpiritNum() < 60) { num = 60 - dComIfGs_getPohSpiritNum(); } return num; } jmessage_tReference::jmessage_tReference() { mpStick = new STControl(5, 2, 3, 2, 0.9f, 0.5f, 0, 0x2000); JUT_ASSERT(518, mpStick != NULL); mpStick->setWaitParm(5, 2, 3, 2, 0.9f, 0.5f, 0, 0x800); mActorPos.set(0.0f, 0.0f, 0.0f); mpSelMsgPtr = NULL; mpFont = NULL; mFontSizeX = 0.0f; mFontSizeY = 0.0f; mRubySize = 0.0f; mLineSpace = 0.0f; mCharSpace = 0.0f; mRubyCharSpace = 0.0f; mSelFontSize = 0.0f; mSelRubySize = 0.0f; mSelTBoxWidth = 0.0f; mSelCharSpace = 0.0f; mSelCharSpace = 0.0f; mDistanceScale = 1.0f; mAddCharAllAlphaRate = 0.0f; mCharAllAlphaRate = 0.0f; mAddCharAlpha = 0.0f; mCharAlpha = 0.0f; mStartLineCount = 0; mEndLineCount = 0; mLineCount = 0; field_0x5d2 = 0; mPageNum = 0; mSendTimer = 0; mDemoFrame = 0; mCharCnt = 0; mNowLightCount = 0; mDrawLightCount = 0; resetCharCountBuffer(); mNowColorType = 0; mTopColorType = 0; mButtonTagStopFlag = 0; mPageEndCount = 0; mSelectNum = 0; mSelectType = 0; mSelectPos = 0; mSendFlag = 0; mStopFlag = 0; mpStatus = NULL; mpObjectPtr = NULL; mSelectRubyFlag = 0; mInputFigure = 0; mOutFontRupeeColor = 0; mNowWordCount = 0; mTopWordCount = 0; resetCharactor(); resetWord(); offSelectSetCancelFlag(); offBombNameUseFlag(); setRevoMessageID(0); mBatchColorFlag = 0; mTopTagScale = 0; mNowTagScale = 0; } jmessage_tReference::~jmessage_tReference() { delete mpStick; mpStick = NULL; } void jmessage_tReference::calcDistance() { if (mActorPos.x == 0.0f && mActorPos.y == 0.0f && mActorPos.z == 0.0f) { mDistanceScale = 1.0f; } else { fopAc_ac_c* player = dComIfGp_getPlayer(0); f32 var_f31 = (mActorPos - player->attention_info.position).absXZ(); mDistanceScale = 1.0f; } } u8 jmessage_tReference::getLineMax() { int line_max; #if REGION_JPN if (isKanban()) { line_max = 6; } else if (isBook()) { line_max = 7; } else if (isStaffRoll()) { line_max = 10; } else if (isSaveSeq()) { line_max = 5; } else { line_max = 3; } #else if (isKanban()) { line_max = 7; } else if (isBook()) { line_max = 9; } else if (isStaffRoll()) { line_max = 10; } else if (isSaveSeq()) { line_max = 6; } else { line_max = 4; } #endif return line_max; } bool jmessage_tReference::isKanban() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isKanbanMessage(); } bool jmessage_tReference::isPlaceName() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isPlaceMessage(); } bool jmessage_tReference::isBossName() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isBossMessage(); } bool jmessage_tReference::isSaveSeq() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isSaveMessage(); } bool jmessage_tReference::isBook() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isBookMessage(); } bool jmessage_tReference::isStaffRoll() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isStaffMessage(); } bool jmessage_tReference::isHowl() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isHowlMessage(); } bool jmessage_tReference::isMidona() { if (getObjectPtr() == NULL) { return false; } return getObjectPtr()->isMidonaMessage(); } void jmessage_tReference::resetReference() { mSendTimer = 0; mSendFlag = 0; mStartLineCount = 0; mEndLineCount = 0; mLineCount = 0; field_0x5d2 = 0; mSelectNum = 0; mSelectType = 0; } void jmessage_tReference::pageSend() { field_0x5d2++; mLineCount = 0; mStartLineCount = mEndLineCount; mText[0] = 0; mTextS[0] = 0; mRuby[0] = 0; for (int i = 0; i < 3; i++) { mSelText[i][0] = 0; mSelRuby[i][0] = 0; } mSendFlag = 0; mSendTimer = 0; mSelectNum = 0; mSelectType = 0; mCharCnt = 0; if (mNowColorType != mTopColorType) { mTopColorType = mNowColorType; } mTopWordCount = mNowWordCount; mCharAlpha = 0.0f; if (getForm() == 8) { setAddCharAllAlphaRate(1.0f / (g_MsgObject_HIO_c.mBatchDisplayWeight_8 + 1.0f)); setCharAllAlphaRate(0.0f); } else if (getForm() == 9) { setAddCharAllAlphaRate(1.0f / (g_MsgObject_HIO_c.mBatchDisplayWeight_9 + 1.0f)); setCharAllAlphaRate(0.0f); } mTopTagScale = mNowTagScale; } void jmessage_tReference::selectMessage() { if (mSelectNum != 0) { mpStick->checkTrigger(); if (mSelectType == 0) { if (mpStick->checkUpTrigger()) { if (mSelectNum == 2) { if (mSelectPos == 1) { mSelectPos = 0; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (mSelectNum == 3 && mSelectPos != 0) { mSelectPos--; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (mpStick->checkDownTrigger()) { if (mSelectNum == 2) { if (mSelectPos == 0) { mSelectPos = 1; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (mSelectNum == 3 && mSelectPos < 2) { mSelectPos++; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } } else if (mpStick->checkLeftTrigger()) { if (mSelectPos == 1) { mSelectPos = 0; getObjectPtr()->getSequenceProcessor()->calcStringLength(); Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } else if (mSelectPos == 2) { mSelectPos = 1; getObjectPtr()->getSequenceProcessor()->calcStringLength(); Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (mpStick->checkRightTrigger()) { if (mSelectPos == 0) { mSelectPos = 1; getObjectPtr()->getSequenceProcessor()->calcStringLength(); Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } else if (mSelectPos == 1 && mSelectNum == 3) { mSelectPos = 2; getObjectPtr()->getSequenceProcessor()->calcStringLength(); Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } } } void jmessage_tReference::inputNumber() { mpStick->checkTrigger(); s16 input_val, new_input_val; input_val = new_input_val = getObjectPtr()->getInputValue(); u8 max_figure = 0; if (dComIfGs_getRupee() >= 1000) { max_figure = 3; } else if (dComIfGs_getRupee() >= 100) { max_figure = 2; } else if (dComIfGs_getRupee() >= 10) { max_figure = 1; } if (mpStick->checkUpTrigger()) { switch (mInputFigure) { case 0: new_input_val = input_val + 1; break; case 1: new_input_val = input_val + 10; break; case 2: new_input_val = input_val + 100; break; case 3: new_input_val = input_val + 1000; break; } } else if (mpStick->checkDownTrigger()) { switch (mInputFigure) { case 0: new_input_val = input_val - 1; break; case 1: new_input_val = input_val - 10; break; case 2: new_input_val = input_val - 100; break; case 3: new_input_val = input_val - 1000; break; } } else if (mpStick->checkLeftTrigger()) { if (mInputFigure < max_figure) { mInputFigure++; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (mpStick->checkRightTrigger()) { if (mInputFigure != 0) { mInputFigure--; Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } if (new_input_val < 0) { new_input_val = 0; } if (new_input_val > dComIfGs_getRupee()) { new_input_val = dComIfGs_getRupee(); } if (new_input_val != input_val) { Z2GetAudioMgr()->seStart(Z2SE_SY_TALK_CURSOR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } decideOutFontRupeeColor(new_input_val); getObjectPtr()->setInputValue(new_input_val); } char* jmessage_tReference::getWord(int i_no) { if (i_no >= 10) { JUT_WARN(1093, "%s", "message stack over!!"); JUT_ASSERT(1094, i_no < (10)); } return mWord[i_no]; } void jmessage_tReference::resetWord() { for (int i = 0; i < 10; i++) { mWord[i][0] = 0; } } void jmessage_tReference::setCharactor(u16 i_character) { mCharactor.data[mCharactor.field_0x40c] = i_character; mCharactor.field_0x40c++; } void jmessage_tReference::addCharactor(u16 i_character) { if (i_character == mCharactor.data[mCharactor.field_0x40e]) { mCharactor.field_0x40e++; } } void jmessage_tReference::resetCharactor() { for (int i = 0; i < ARRAY_SIZE(mCharactor.data); i++) { mCharactor.data[i] = 0; } mCharactor.field_0x40c = 0; mCharactor.field_0x40e = 0; mCharactor.mCountBackUp = 0; } void jmessage_tReference::shiftCharCountBuffer() { for (int i = 30; i > 0; i--) { mCharCountBuffer[i] = mCharCountBuffer[i - 1]; } mCharCountBuffer[0] = getNowLightCount(); } void jmessage_tReference::resetCharCountBuffer() { for (int i = 0; i < 31; i++) { mCharCountBuffer[i] = 0; } mLightBatchFlag = false; mBatchFlag = false; resetNowLightCount(); resetDrawLightCount(); } void jmessage_tReference::allsetCharCountBuffer() { for (int i = 0; i < 31; i++) { mCharCountBuffer[i] = getNowLightCount(); } } bool jmessage_tReference::isCharSend() { s16 delay_frame; s16 var_r5; if (getFukiKind() == 8) { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrameSpirit; var_r5 = delay_frame; } else { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrame; var_r5 = delay_frame; } if (var_r5 < 0) { var_r5 *= -1; } if (delay_frame < 0 && getDrawLightCount() >= getCharCountBuffer(var_r5)) { return false; } return true; } bool jmessage_tReference::isLightSend() { s16 delay_frame; s16 var_r5; if (getFukiKind() == 8) { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrameSpirit; var_r5 = delay_frame; } else { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrame; var_r5 = delay_frame; } if (var_r5 < 0) { var_r5 *= -1; } if (delay_frame > 0 && getDrawLightCount() >= getCharCountBuffer(var_r5)) { return false; } return true; } bool jmessage_tReference::isLightEnd() { s16 delay_frame; if (getFukiKind() == 8) { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrameSpirit; } else { delay_frame = g_MsgObject_HIO_c.mHaloDelayFrame; } if (delay_frame < 0) { delay_frame *= -1; } if (getCharCountBuffer(delay_frame) == getCharCountBuffer(0)) { return true; } return false; } void jmessage_tReference::decideOutFontRupeeColor(int i_inputVal) { int price_diff = getObjectPtr()->getNowTotalPrice() - getObjectPtr()->getNowTotalPayment(); if (price_diff > i_inputVal) { mOutFontRupeeColor = 1; } else if (price_diff == i_inputVal) { mOutFontRupeeColor = 0; } else { mOutFontRupeeColor = 2; } } jmessage_tControl::jmessage_tControl() {} jmessage_tMeasureProcessor::jmessage_tMeasureProcessor(jmessage_tReference const* pReference) : TRenderingProcessor(pReference) { jmessage_tReference* reference_p = (jmessage_tReference*)getReference(); reference_p->resetCharactor(); field_0x38 = 1.0f; mTotalLineCnt = 0; field_0x3e = 0; field_0x40 = 0; field_0x48 = 0; field_0x44 = 0; mSelectType = 0; field_0x46 = 0; field_0x47 = 0; field_0x49 = 0; mPageLineMax = reference_p->getLineMax(); field_0x4b = 0; mSeSpeaker = 0; field_0x4d = 0; } void jmessage_tMeasureProcessor::do_begin(void const* pEntry, char const* pszText) { UNUSED(pszText); jmessage_tReference* pReference = (jmessage_tReference*)getReference(); pReference->resetCharactor(); pReference->setRevoMessageID(0); field_0x38 = 1.0f; mSeSpeaker = ((JMSMesgEntry_c*)pEntry)->se_speaker; mSeMood = ((JMSMesgEntry_c*)pEntry)->se_mood; for (int i = 0; i < D_MSG_CLASS_PAGE_CNT_MAX; i++) { pReference->setLineLength(i, 0.0f, 0.0f); pReference->setPageLine(i, 0); pReference->setPageLineMax(i, 0); pReference->setPageType(i, 0); pReference->setLineArrange(i, ((JMSMesgEntry_c*)pEntry)->unk_0xd); pReference->setLineScale(i, 100); if (pReference->isPlaceName() || pReference->isStaffRoll() || pReference->isBossName() || pReference->getFukiKind() == 9) { pReference->setLineArrange(i, 1); } else { if (((JMSMesgEntry_c*)pEntry)->message_id == 0x2A5) { pReference->setLineArrange(i, 1); } #if !REGION_JPN if (((JMSMesgEntry_c*)pEntry)->unk_0xd == 0) { pReference->setLineArrange(i, 1); } #endif } } for (int i = 0; i < 3; i++) { pReference->setSelLength(i, 0.0f); pReference->offSelectRubyFlag(i); } pReference->setPageEndCount(0); mTotalLineCnt = 0; field_0x3e = 0; field_0x40 = 0; field_0x48 = 0; field_0x44 = 0; mSelectType = 0; field_0x46 = 0; field_0x47 = 0; field_0x49 = 0; mPageLineMax = pReference->getLineMax(); pReference->resetWord(); field_0x4b = 0; dMsgObject_c* object_p = pReference->getObjectPtr(); object_p->offAutoMessageFlag(); if (!pReference->isSelectSetCancelFlag()) { object_p->resetSelectBomBag(); } if (pReference->getDistanceScale() != 1.0f) { do_scale(field_0x38); } } void jmessage_tMeasureProcessor::do_end() { if (field_0x49 == 0) { field_0x3e++; } jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (field_0x46 == 0) { if (field_0x49 > 1) { pReference->setPageLine(field_0x40, field_0x3e - (field_0x49 - 1)); pReference->setPageLineMax(field_0x40, field_0x3e - (field_0x49 - 1)); } else { pReference->setPageLine(field_0x40, field_0x3e); pReference->setPageLineMax(field_0x40, field_0x3e); } } pReference->setPageEndCount(field_0x40); do_pageType(field_0x3e); Z2GetSpeechMgr2()->setString(pReference->getCharSoundInfo().data, pReference->getCharSoundInfo().field_0x40c, mSeSpeaker, mSeMood); } void jmessage_tMeasureProcessor::do_character(int iCharacter) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); JUTFont* font = pReference->getFont(); if (field_0x44 == 0) { if (font->isLeadByte_ShiftJIS(iCharacter)) { if (!isOutfontKanjiCode(iCharacter)) { u16 character2Bytes = change1ByteTo2Bytes(iCharacter); pReference->setCharactor(changeKataToHira(character2Bytes)); } } else if (iCharacter < 0x8800 && !isOutfontKanjiCode(iCharacter)) { pReference->setCharactor(changeKataToHira(iCharacter)); } } if (iCharacter == '\n') { mTotalLineCnt++; field_0x3e++; if (field_0x44 != 0) { pReference->setLineArrange(mTotalLineCnt, 1); field_0x44--; } field_0x48 = 0; if (field_0x49 != 0) { field_0x49++; } else { field_0x49 = 1; } if (mSelectType == 0 && field_0x3e >= mPageLineMax) { pReference->setPageLine(field_0x40, mPageLineMax - (field_0x49 - 1)); pReference->setPageLineMax(field_0x40, field_0x3e); do_pageType(mPageLineMax - (field_0x49 - 1)); if (field_0x46 == 0) { field_0x40++; } field_0x3e = 0; mPageLineMax = pReference->getLineMax(); field_0x49 = 0; if (field_0x46 == 0 && field_0x38 > 1.0f && field_0x48 == 0) { field_0x48 = 1; mPageLineMax--; JUT_ASSERT(1637, mPageLineMax > 0); pReference->setPageType(field_0x40, 2); } } if (mTotalLineCnt >= ((4)*10)) { JUT_ASSERT(1650, mTotalLineCnt < ((4)*10)); } } else { if (field_0x49 != 0) { field_0x49 = 0; } pReference->addLineLength(mTotalLineCnt, field_0x38 * font->getWidth(iCharacter) / (f32)font->getCellWidth(), 1.0f); if (field_0x46 != 0) { f32 var_f31 = pReference->getSelFontSize() / (f32)font->getCellWidth(); pReference->addSelLength(field_0x46 - 1, (var_f31 * (field_0x38 * font->getWidth(iCharacter))) + pReference->getSelCharSpace()); } if (field_0x38 > 1.0f) { if (field_0x3e == 1 && pReference->getPageType(field_0x40) == 2) { pReference->setPageType(field_0x40, 4); pReference->setLineScale(mTotalLineCnt, pReference->getLineScale(0)); } else if (field_0x3e == 2 && pReference->getPageType(field_0x40) == 4) { pReference->setPageType(field_0x40, 5); pReference->setLineScale(mTotalLineCnt, pReference->getLineScale(0)); } } } } static void dummyString() { DEAD_STRING("'"); DEAD_STRING("s"); } bool jmessage_tMeasureProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); switch (i_tag & 0xFF0000) { case MSGTAG_GROUP(1): case MSGTAG_GROUP(2): return true; case MSGTAG_GROUP(255): switch (i_tag) { case MSGTAG_COLOR: return true; case MSGTAG_SCALE: { u16 scale = *(u16*)i_data; pReference->setLineScale(mTotalLineCnt, scale); do_scale(scale / 100.0f); return true; } case MSGTAG_RUBY: case 0xFFFF02: { do_rubyset(i_data, i_size); if (field_0x46 != 0) { if (mSelectType == 2) { if (!pReference->isSelectRubyFlag(field_0x46 - 1)) { pReference->onSelectRubyFlag(field_0x46 - 1); } } else if (mSelectType == 3) { if (!pReference->isSelectRubyFlag(field_0x46 - 1)) { pReference->onSelectRubyFlag(field_0x46 - 1); } } } return true; } } case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_INSTANT: pReference->setCharAllAlphaRate(1.0f); return true; case MSGTAG_TYPE: case MSGTAG_BOXATMOST: case MSGTAG_UNK_6: case MSGTAG_PAUSE: case MSGTAG_BOXATLEAST: case MSGTAG_LINE_DOWN: return true; case MSGTAG_CURRENT_LETTER_PAGE: { char buffer[4]; int number = dComIfGp_getMessageCountNumber() / 100; sprintf(buffer, "%d", number); push_word(buffer); return true; } case MSGTAG_MAX_LETTER_PAGE: { char buffer[4]; int number = dComIfGp_getMessageCountNumber() % 100; sprintf(buffer, "%d", number); push_word(buffer); return true; } case MSGTAG_UNK_3: case MSGTAG_AUTOBOX: if (*(u16*)i_data != 0) { dMsgObject_c* objectPtr = pReference->mpObjectPtr; // fakematch, should be getObjectPtr objectPtr->onAutoMessageFlag(); } return true; case MSGTAG_DEMOBOX: pReference->setDemoFrame(*(u32*)i_data); return true; case MSGTAG_PLAYER_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } char player_name[100]; strcpy(player_name, dComIfGs_getPlayerName()); push_word(player_name); return true; } case MSGTAG_HORSE_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } char horse_name[100]; strcpy(horse_name, dComIfGs_getHorseName()); push_word(horse_name); return true; } case MSGTAG_UNK_53: if (field_0x49 != 0) { field_0x49 = 0; } stack_pushCurrent(dMsgObject_getWord()); return true; case MSGTAG_SCENT_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } dMsgObject_c* objectPtr = pReference->getObjectPtr(); const char* smellname = objectPtr->getSmellName(); stack_pushCurrent(smellname); return true; } case MSGTAG_PORTAL_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } dMsgObject_c* objectPtr = pReference->getObjectPtr(); const char* portalname = objectPtr->getPortalName(); stack_pushCurrent(portalname); return true; } case MSGTAG_BOMB_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } dMsgObject_c* objectPtr = pReference->getObjectPtr(); OS_REPORT("ボムカーソル位置 %d\n", dMsgObject_getMsgObjectClass()->getSelectCursorPos()); if (!pReference->isSelectSetCancelFlag()) { pReference->onBombNameUseFlag(); } const char* bombname = objectPtr->getBombName(); stack_pushCurrent(bombname); return true; } case MSGTAG_INSECT_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } dMsgObject_c* objectPtr = pReference->getObjectPtr(); const char* insectname = objectPtr->getInsectName(); stack_pushCurrent(insectname); return true; } case MSGTAG_LETTER_NAME: { if (field_0x49 != 0) { field_0x49 = 0; } dMsgObject_c* objectPtr = pReference->getObjectPtr(); const char* lettername = objectPtr->getLetterName(); stack_pushCurrent(lettername); return true; } case MSGTAG_SELECT_2WAY: JUT_ASSERT(1916, mSelectType != 0); if (field_0x46 == 0) { if (field_0x3e > 0) { pReference->setPageLine(field_0x40, field_0x3e); pReference->setPageLineMax(field_0x40, field_0x3e); do_pageType(field_0x3e); field_0x3e = 0; mPageLineMax = pReference->getLineMax(); field_0x49 = 0; } mSelectType = 2; field_0x44 = 1; field_0x46 = 1; } if (*(u8*)i_data == 1) { pReference->setSelectPos(field_0x47); } field_0x47++; field_0x46++; pReference->setLineArrange(mTotalLineCnt, 1); return true; case MSGTAG_SELECT_3WAY: JUT_ASSERT(1944, mSelectType != 0); if (field_0x46 == 0) { if (field_0x3e > 0) { pReference->setPageLine(field_0x40, field_0x3e); pReference->setPageLineMax(field_0x40, field_0x3e); do_pageType(field_0x3e); field_0x3e = 0; mPageLineMax = pReference->getLineMax(); field_0x49 = 0; } mSelectType = 3; field_0x44 = 2; } if (*(u8*)i_data == 1) { pReference->setSelectPos(field_0x47); } field_0x47++; field_0x46++; pReference->setLineArrange(mTotalLineCnt, 1); return true; case MSGTAG_INLINE_2_FIRST: case MSGTAG_INLINE_3_FIRST: pReference->setSelectPos(field_0x47); case MSGTAG_INLINE_2_NEXT: case MSGTAG_INLINE_3_NEXT: field_0x47++; pReference->setLineArrange(mTotalLineCnt, 0); do_space(0); return true; case MSGTAG_AWAIT_CHOICE: mSelectType = 1; field_0x38 = 1.0f; do_character('\n'); stack_pushCurrent(pReference->getSelMsgPtr()); return true; case MSGTAG_UNK_33: do_name1(); return true; case MSGTAG_ABTN: case MSGTAG_BBTN: case MSGTAG_CSTICK: case MSGTAG_LBTN: case MSGTAG_RBTN: case MSGTAG_XBTN: case MSGTAG_YBTN: case MSGTAG_ZBTN: case MSGTAG_DPAD: case MSGTAG_STICK_CROSS: case MSGTAG_LEFT_ARROW: case MSGTAG_RIGHT_ARROW: case MSGTAG_UP_ARROW: case MSGTAG_DOWN_ARROW: case MSGTAG_STICK_UP: case MSGTAG_STICK_DOWN: case MSGTAG_STICK_LEFT: case MSGTAG_STICK_RIGHT: case MSGTAG_STICK_VERTICAL: case MSGTAG_STICK_HORIZONTAL: case MSGTAG_RED_TARGET: case MSGTAG_YELLOW_TARGET: case MSGTAG_ABTN_STAR: case MSGTAG_WHITE_TARGET: case MSGTAG_WARP_ICON: case MSGTAG_XYBTN: case MSGTAG_YXBTN: case MSGTAG_HEART: case MSGTAG_QUAVER: do_space(i_tag); return true; case MSGTAG_BOMB_BAG_ICON: do_space(i_tag); if (!pReference->isSelectSetCancelFlag()) { dMsgObject_c* objectPtr = pReference->getObjectPtr(); u8 type = *(u8*)i_data & 0xFF; objectPtr->addSelectBomBag(type - 1); } return true; case MSGTAG_INPUT_VALUE: for (int i = 0; i < 4; i++) { do_space(0); } return true; case MSGTAG_ACKNOWLEDGE: return true; case MSGTAG_BOMB_NUM: { char buffer[40]; dMsgObject_c* objectPtr = pReference->getObjectPtr(); u8 sel_bomb_num = objectPtr->getSelectBombNum(); dMsgUnit_setTag(7, sel_bomb_num, buffer); push_word(buffer); return true; } case MSGTAG_BOMB_PRICE: { char buffer[40]; dMsgObject_c* objectPtr = pReference->getObjectPtr(); s16 sel_bomb_price = objectPtr->getSelectBombPrice(); dMsgUnit_setTag(1, sel_bomb_price, buffer); push_word(buffer); return true; } case MSGTAG_BOMB_MAX: { u8 bomb_type = fpcNm_ITEM_NORMAL_BOMB; const u8 type = *(u8*)i_data; if (type == 1) { bomb_type = fpcNm_ITEM_WATER_BOMB; } else if (type == 2) { bomb_type = fpcNm_ITEM_POKE_BOMB; } char buffer[40]; dMsgUnit_setTag(7, dComIfGs_getBombMax(bomb_type), buffer); push_word(buffer); return true; } case MSGTAG_ARROW_MAX: { char buffer[40]; dMsgUnit_setTag(0, dComIfGs_getArrowMax(), buffer); push_word(buffer); return true; } } return true; case MSGTAG_GROUP(4): switch (i_tag & 0xFF00FFFF) { case MSGTAG_GLYPH_DOLLARSIGN: push_word(changeCodeToChar('$')); return true; case MSGTAG_GLYPH_BACKSLASH: push_word(changeCodeToChar('\\')); return true; case MSGTAG_GLYPH_ATMARK: push_word(changeCodeToChar('@')); return true; case MSGTAG_GLYPH_SHARP: push_word(changeCodeToChar(0x81F2)); return true; case MSGTAG_GLYPH_FLAT: push_word(changeCodeToChar(0x81F3)); return true; case MSGTAG_GLYPH_SQRT: push_word(changeCodeToChar(0x81E3)); return true; case MSGTAG_GLYPH_PERCENT: push_word(changeCodeToChar(0x876C)); return true; case MSGTAG_GLYPH_HECTARE: push_word(changeCodeToChar(0x8766)); return true; case MSGTAG_GLYPH_ARE: push_word(changeCodeToChar(0x8765)); return true; case MSGTAG_GLYPH_LITRE: push_word(changeCodeToChar(0x8767)); return true; case MSGTAG_GLYPH_WATT: push_word(changeCodeToChar(0x8768)); return true; case MSGTAG_GLYPH_CALORIE: push_word(changeCodeToChar(0x8769)); return true; case MSGTAG_GLYPH_DOLLAR: push_word(changeCodeToChar(0x876A)); return true; case MSGTAG_GLYPH_CENT: push_word(changeCodeToChar(0x876B)); return true; } return false; case MSGTAG_GROUP(5): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_TIME_INFO: { const u8 type = *(u8*)i_data; if (type == 0) { dMsgUnit_setTag(4, dMeter2Info_getMsgTimeMs(), buffer); } else if (type == 2) { dMsgUnit_setTag(4, dComIfGs_getRaceGameTime(), buffer); } else { dMsgUnit_setTag(4, dMeter2Info_getTimeMs(), buffer); } break; } case 1: dMsgUnit_setTag(0, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case 2: dMsgUnit_setTag(1, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FUNDRAISE_REMAIN: { s16 fund_raise_val = *(u32*)i_data; dMsgObject_c* objectPtr = pReference->getObjectPtr(); objectPtr->setFundRaisingValue(fund_raise_val); dMsgUnit_setTag(10, fund_raise_val - dMsgObject_getFundRaising(), buffer); break; } case MSGTAG_NEW_LETTER_NUM: dMsgUnit_setTag(11, dMeter2Info_getNewLetterNum(), buffer); break; case MSGTAG_POE_NUM: dMsgUnit_setTag(12, getPohNum(), buffer); break; case MSGTAG_BALLOON_SCORE: { int number; u8 type = *(u8*)i_data & 0xFF; if (type == 0) { number = dComIfGp_getMessageCountNumber(); } else { number = dComIfGs_getBalloonScore(); } dMsgUnit_setTag(13, number, buffer); break; } case MSGTAG_INSECT_INFO: { u32 insect_num; if (*(u8*)i_data == 0) { insect_num = dComIfGs_checkGetInsectNum(); } else { insect_num = 24 - dComIfGs_checkGetInsectNum(); } dMsgUnit_setTag(2, insect_num, buffer); break; } case 4: dMsgUnit_setTag(3, 0, buffer); break; case 5: dMsgUnit_setTag(0x10000, dComIfGp_getNeedLightDropNum(), buffer); break; case 6: dMsgUnit_setTag(6, 20 - dComIfGs_getEventReg(0xFF1F), buffer); break; case MSGTAG_FISH_LENGTH: dMsgUnit_setTag(9, (u32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FISH_COUNT: dMsgUnit_setTag(14, (u32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_ROLLGOAL_LV: dMsgUnit_setTag(0x10001, (u32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_RIVER_POINTS: dMsgUnit_setTag(8, dMeter2Info_getNowCount(), buffer); break; default: return false; } push_word(buffer); return true; } case MSGTAG_GROUP(6): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_PLAYER_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setPlayerName(buffer, 1); } else { setPlayerName(buffer, 0); } #endif push_word(buffer); return true; case MSGTAG_HORSE_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setHorseName(buffer, 1); } else { setHorseName(buffer, 0); } #endif push_word(buffer); return true; case MSGTAG_MALE_ICON: push_word(changeCodeToChar(CHAR_CODE_MALE_ICON)); return true; case MSGTAG_FEMALE_ICON: push_word(changeCodeToChar(CHAR_CODE_FEMALE_ICON)); return true; case MSGTAG_STAR_ICON: push_word(changeCodeToChar(CHAR_CODE_STAR_ICON)); return true; case MSGTAG_REFMARK: push_word(changeCodeToChar(CHAR_CODE_REFMARK)); return true; case MSGTAG_THIN_LEFT_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_LEFT_ARROW)); return true; case MSGTAG_THIN_RIGHT_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_RIGHT_ARROW)); return true; case MSGTAG_THIN_UP_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_UP_ARROW)); return true; case MSGTAG_THIN_DOWN_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_DOWN_ARROW)); return true; case MSGTAG_BULLET: case MSGTAG_BULLET_SPACE: do_space(i_tag); return true; } } case MSGTAG_GROUP(3): switch (i_tag & 0xFF00FFFF) { case MSGTAG_WII_ABTN: case MSGTAG_WII_BBTN: case MSGTAG_WII_HOMEBTN: case MSGTAG_WII_MINUSBTN: case MSGTAG_WII_PLUSBTN: case MSGTAG_WII_1BTN: case MSGTAG_WII_2BTN: case MSGTAG_WII_DPAD_ITEM: case MSGTAG_WII_DPAD_UP: case MSGTAG_WII_DPAD_DOWN: case MSGTAG_WII_DPAD_HORIZONTAL: case MSGTAG_WII_DPAD_RIGHT: case MSGTAG_WII_DPAD_LEFT: case MSGTAG_WII_WIIMOTE: case MSGTAG_WII_RETICULE: case MSGTAG_WII_NUNCHUK: case MSGTAG_WII_WIIMOTE2: case MSGTAG_WII_FAIRY: case MSGTAG_WII_CBTN: case MSGTAG_WII_ZBTN: do_space(i_tag); return true; case MSGTAG_WII_MSGID_OVERRIDE: pReference->setRevoMessageID(*(u32*)i_data); return true; } } return false; } void jmessage_tMeasureProcessor::do_scale(f32 i_scale) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); field_0x38 = i_scale * pReference->getDistanceScale(); if (field_0x38 > 1.0f && field_0x48 == 0) { field_0x48 = 1; mPageLineMax--; JUT_ASSERT(0x930, mPageLineMax > 0); #if REGION_JPN if (field_0x3e == 0) { pReference->setPageType(field_0x40, 2); } #else if (field_0x3e == 0) { pReference->setPageType(field_0x40, 2); } else if (field_0x3e == 2 && mPageLineMax == 3) { if (pReference->getPageType(field_0x40) == 4) { pReference->setPageType(field_0x40, 5); } else { pReference->setPageType(field_0x40, 8); } } #endif else { pReference->setPageType(field_0x40, 3); if (field_0x3e == 1 && pReference->getPageType(field_0x40) == 2) { pReference->setPageType(field_0x40, 4); } } } } void jmessage_tMeasureProcessor::do_space(u32 i_tag) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); f32 var_f31 = field_0x38; if (field_0x44 == 0) { u16 character = 0xFFFF; switch (i_tag & 0xFF0000) { case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_ABTN: character = 0xFFE0; break; case MSGTAG_BBTN: character = 0xFFE1; break; case MSGTAG_CSTICK: character = 0xFFE2; break; case MSGTAG_LBTN: character = 0xFFE3; break; case MSGTAG_RBTN: character = 0xFFE4; break; case MSGTAG_XBTN: character = 0xFFE5; break; case MSGTAG_YBTN: character = 0xFFE6; break; case MSGTAG_ZBTN: character = 0xFFE7; break; case MSGTAG_DPAD: character = 0xFFE8; break; case MSGTAG_STICK_CROSS: character = 0xFFE9; break; case MSGTAG_LEFT_ARROW: character = 0xFFEA; break; case MSGTAG_RIGHT_ARROW: character = 0xFFEB; break; case MSGTAG_UP_ARROW: character = 0xFFEC; break; case MSGTAG_DOWN_ARROW: character = 0xFFED; break; case MSGTAG_STICK_UP: character = 0xFFEE; break; case MSGTAG_STICK_DOWN: character = 0xFFF0; break; case MSGTAG_STICK_LEFT: character = 0xFFF1; break; case MSGTAG_STICK_RIGHT: character = 0xFFF2; break; case MSGTAG_STICK_VERTICAL: character = 0xFFF3; break; case MSGTAG_STICK_HORIZONTAL: character = 0xFFF4; break; case MSGTAG_HEART: character = 0xFFF5; break; case MSGTAG_QUAVER: character = 0xFFF6; break; } pReference->setCharactor(character); break; case MSGTAG_GROUP(3): switch (i_tag & 0xFF00FFFF) { case MSGTAG_WII_HOMEBTN: case MSGTAG_WII_MINUSBTN: case MSGTAG_WII_PLUSBTN: pReference->setCharactor(character); break; case MSGTAG_WII_DPAD_ITEM: case MSGTAG_WII_DPAD_UP: case MSGTAG_WII_DPAD_DOWN: case MSGTAG_WII_DPAD_HORIZONTAL: case MSGTAG_WII_DPAD_RIGHT: case MSGTAG_WII_DPAD_LEFT: case MSGTAG_WII_WIIMOTE: case MSGTAG_WII_RETICULE: pReference->setCharactor(character); break; case MSGTAG_WII_NUNCHUK: case MSGTAG_WII_WIIMOTE2: case MSGTAG_WII_FAIRY: case MSGTAG_WII_CBTN: case MSGTAG_WII_ZBTN: case MSGTAG_WII_1BTN: case MSGTAG_WII_2BTN: case MSGTAG_WII_ABTN: case MSGTAG_WII_BBTN: pReference->setCharactor(character); } break; case MSGTAG_GROUP(6): switch (i_tag) { case MSGTAG_BULLET: case MSGTAG_BULLET_SPACE: pReference->setCharactor(character); break; } break; } } if (field_0x49 != 0) { field_0x49 = 0; } pReference->addLineLength(mTotalLineCnt, var_f31, 1.0f); if (field_0x46 != 0) { pReference->addSelLength(field_0x46 - 1, var_f31); } } void jmessage_tMeasureProcessor::do_pageType(int param_0) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (param_0 == 1) { if (pReference->getPageType(field_0x40) == 2) { pReference->setPageType(field_0x40, 1); } } else if (param_0 == 3) { if (pReference->getPageType(field_0x40) == 2) { pReference->setPageType(field_0x40, 6); } else if (pReference->getPageType(field_0x40) == 3) { pReference->setPageType(field_0x40, 7); } } } void jmessage_tMeasureProcessor::do_name1() { const char* name = dComIfGs_getPlayerName(); #if REGION_JPN int c = (((char)name[0] & 0xFF) << 8) | ((char)name[1] & 0xFF); // if first character is hiragana or katakana if ((c >= 0x829F && c <= 0x82F1) || (c >= 0x8340 && c <= 0x8396)) { push_word(changeCodeToChar(c)); } #endif } void jmessage_tMeasureProcessor::do_rubyset(void const* i_data, u32 i_size) { if (field_0x44 == 0) { u8 length = i_size - 1; u8* pRuby = (u8*)i_data; int index = 0; pRuby++; jmessage_tReference* pReference = (jmessage_tReference*)getReference(); while (index < length) { u8 bytes[3]; bytes[0] = pRuby[index++]; bytes[1] = pRuby[index++]; bytes[2] = 0; int character = (((s8)bytes[0] & 0xFF) << 8) | ((s8)bytes[1] & 0xFF); pReference->setCharactor(changeKataToHira(character)); } } } void jmessage_tMeasureProcessor::push_word(char* i_word) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); strcpy(pReference->getWord(field_0x4b), i_word); stack_pushCurrent(pReference->getWord(field_0x4b)); field_0x4b++; } jmessage_tSequenceProcessor::jmessage_tSequenceProcessor(jmessage_tReference const* pReference, jmessage_tControl* pControl) : JMessage::TSequenceProcessor(pReference, pControl), mMeasureProcessor(pReference) { field_0xa8 = 1; field_0xa4 = field_0xa8; field_0xa6 = 0; field_0xad = 0; mMouthCheck = 0; field_0xb1 = 0; field_0xae = 0; mForceForm = 0xFF; field_0xb2 = 0; field_0xaa = 0; field_0xb5 = 0; field_0xac = 0; field_0xb3 = 0; field_0xb4 = 0; } void jmessage_tSequenceProcessor::do_reset() {} void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszText) { mpEntry = pEntry; mpText = pszText; if (((JMSMesgEntry_c*)pEntry)->fuki_kind == 8) { field_0xa8 = g_MsgObject_HIO_c.mDisplaySpeedSpirit; } else { field_0xa8 = g_MsgObject_HIO_c.mDisplaySpeed; } field_0xa4 = field_0xa8; field_0xa6 = 0; field_0xad = 0; mMouthCheck = 0; field_0xb1 = 0; field_0xb2 = 0; field_0xaa = 0; field_0xac = 0; field_0xb4 = ((JMSMesgEntry_c*)pEntry)->se_speaker; field_0xb3 = ((JMSMesgEntry_c*)pEntry)->se_mood; jmessage_tReference* pReference = (jmessage_tReference*)getReference(); pReference->resetCharCnt(); pReference->setNowColorType(0); pReference->setTopColorType(0); pReference->setNowWordCount(0); pReference->setTopWordCount(0); pReference->setBatchColorFlag(0); pReference->setTopTagScale(0); pReference->setNowTagScale(0); pReference->calcDistance(); dComIfGp_setMesgAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->base_anm_id); dComIfGp_setMesgFaceAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->face_anm_id); if (dComIfGp_isHeapLockFlag() == 2) { pReference->setFukiPosType(1); } else { if (dComIfGp_isHeapLockFlag() == 3) { pReference->setFukiPosType(0); } else { pReference->setFukiPosType(((JMSMesgEntry_c*)pEntry)->fuki_pos_type); } } pReference->setFukiKind(((JMSMesgEntry_c*)pEntry)->fuki_kind); if (dMsgObject_getMsgOutputType() != 0xFF) { pReference->setForm(dMsgObject_getMsgOutputType()); } else { pReference->setForm(((JMSMesgEntry_c*)pEntry)->output_type); } pReference->setArrange(((JMSMesgEntry_c*)pEntry)->unk_0xd); pReference->setForm(((JMSMesgEntry_c*)pEntry)->unk_0xd); pReference->setMsgID(((JMSMesgEntry_c*)pEntry)->message_id); if (((JMSMesgEntry_c*)pEntry)->event_label_id != 0) { dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[((JMSMesgEntry_c*)pEntry)->event_label_id]); } dMsgObject_c* objectPtr = pReference->getObjectPtr(); objectPtr->talkStartInit(); mMeasureProcessor.process_messageEntryText(this, pEntry, pszText); if (pReference->isBombNameUseFlag()) { pReference->offBombNameUseFlag(); calcStringLength(); } f32 tboxWidth = pReference->getSelLength(0); if (tboxWidth < pReference->getSelLength(1)) { tboxWidth = pReference->getSelLength(1); } if (tboxWidth < pReference->getSelLength(2)) { tboxWidth = pReference->getSelLength(2); } tboxWidth += 10.0f; if (tboxWidth > pReference->getSelTBoxWidth()) { pReference->setSelTBoxWidth(tboxWidth); } if (dMsgObject_getMsgOutputType() != 0xFF) { field_0xae = dMsgObject_getMsgOutputType(); } else { field_0xae = ((JMSMesgEntry_c*)pEntry)->output_type; } if (mForceForm != 0xFF) { field_0xae = mForceForm; } pReference->setAddCharAlpha(255.0f); pReference->setAddCharAllAlphaRate(1.0f); pReference->setCharAllAlphaRate(1.0f); if (field_0xae == 3) { pReference->setAddCharAllAlphaRate(1.0f / (1.0f + g_MsgObject_HIO_c.mBatchDisplayWeight_3)); pReference->setCharAllAlphaRate(0.0f); } else if (field_0xae == 8) { pReference->setAddCharAllAlphaRate(1.0f / (1.0f + g_MsgObject_HIO_c.mBatchDisplayWeight_8)); pReference->setCharAllAlphaRate(0.0f); } else if (field_0xae == 9) { pReference->setAddCharAllAlphaRate(1.0f / (1.0f + g_MsgObject_HIO_c.mBatchDisplayWeight_9)); pReference->setCharAllAlphaRate(0.0f); } else if (field_0xae == 5) { field_0xa4 = g_MsgObject_HIO_c.mCharDisplayWeight_5; pReference->setAddCharAlpha(255.0f / (1.0f + field_0xa4)); } pReference->resetReference(); field_0xb5 = 0; } void jmessage_tSequenceProcessor::do_end() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (dMsgObject_getSelectWordFlag() != 0) { pReference->setSelectNum(dMsgObject_getSelectWordFlag()); pReference->setSelectType(0); pReference->setSelectPos(0); } mMouthCheck = 0; if (pReference->getSelectNum() == 2) { if (pReference->getSelectType() == 0) { pReference->setStopFlag(2); } else { pReference->setStopFlag(4); } } else { if (pReference->getSelectNum() == 3) { if (pReference->getSelectType() == 0) { if (!pReference->isMidona()) { pReference->setStopFlag(3); } } else { pReference->setStopFlag(5); } } else { if (pReference->getSendFlag() == 5) { pReference->setStopFlag(6); } else { pReference->setStopFlag(7); } } } if (dComIfGp_checkMesgBgm()) { dComIfGp_setMesgBgmOff(); } if (mForceForm != 0xFF) { mForceForm = 0xFF; } if (pReference->isLightBatchFlag()) { pReference->allsetCharCountBuffer(); } pReference->setNowLightCount(0xFF); } bool jmessage_tSequenceProcessor::do_isReady() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); #if DEBUG if (pReference->getRevoMessageID() != 0) { return 0; } #endif if (dComIfGp_checkMesgBgm()) { bool isItemMusicPlaying = true; if (mDoAud_checkPlayingSubBgmFlag() != Z2BGM_ITEM_GET && mDoAud_checkPlayingSubBgmFlag() != Z2BGM_ITEM_GET_MINI) { dComIfGp_setMesgBgmOff(); isItemMusicPlaying = false; } if (isItemMusicPlaying) { return false; } } if (pReference->isButtonTagStopFlag()) { if (mDoCPd_c::getTrigA(PAD_1)) { pReference->offButtonTagStopFlag(); pReference->onLightBatchFlag(); } return false; } if (pReference->isKanban() || pReference->isPlaceName() || pReference->isStaffRoll() || pReference->isBossName() || pReference->isSaveSeq() || pReference->isHowl()) { if (pReference->getStatus() == 2 || pReference->getStatus() == 6 || pReference->getStatus() == 11 || pReference->getStatus() == 5) { if (pReference->getLineCount() < pReference->getNowPageLineMax() || pReference->getStatus() == 11) { field_0xae = 1; field_0xa4 = 0; pReference->onBatchFlag(); pReference->setCharCnt(D_MSG_CLASS_CHAR_CNT_MAX); field_0xa4 = field_0xa8; return true; } if (field_0xaa == pReference->getPageEndCount()) { return true; } pReference->setStopFlag(1); field_0xaa++; } } else if (pReference->isBook()) { if (pReference->getStatus() == 2 || pReference->getStatus() == 6) { if (pReference->getLineCount() < pReference->getNowPageLineMax()) { field_0xae = 1; field_0xa4 = 0; pReference->onBatchFlag(); pReference->setCharCnt(D_MSG_CLASS_CHAR_CNT_MAX); return true; } if (pReference->getPageEndCount() == pReference->getPageNum()) { return true; } pReference->setStopFlag(1); field_0xaa++; } } else if ((pReference->getStatus() == 6 || pReference->getStatus() == 11 || (pReference->getStatus() == 8 || pReference->getStatus() == 9) && pReference->isMidona()) || (pReference->getStatus() == 2 && pReference->isMidona())) { if (pReference->getLineCount() < pReference->getNowPageLineMax()) { switch (field_0xae) { case 0: case 5: case 6: if (mDoCPd_c::getTrigA(PAD_1) || field_0xb2 != 0) { field_0xa4 = 0; pReference->onBatchFlag(); pReference->setCharCnt(D_MSG_CLASS_CHAR_CNT_MAX); } break; case 1: case 3: case 8: case 9: field_0xa4 = 0; pReference->onBatchFlag(); pReference->setCharCnt(D_MSG_CLASS_CHAR_CNT_MAX); break; case 2: if (field_0xb2 != 0) { field_0xa4 = 0; } break; } if (field_0xa4 > 0) { field_0xa4--; return false; } field_0xa6++; #if REGION_JPN if (field_0xa6 >= 1) { #else if (field_0xa6 >= 2) { #endif field_0xa4 = field_0xa8; field_0xa6 = 0; } if (field_0xb1 != 0) { field_0xb1 = 0; } else if (mMouthCheck == 0) { mMouthCheck = 1; } if (field_0xae == 5) { field_0xa4 = g_MsgObject_HIO_c.mCharDisplayWeight_5; } return true; } if (pReference->getPageEndCount() == pReference->getPageNum()) { return true; } pReference->setStopFlag(1); mMouthCheck = 0; field_0xaa++; } return false; } void jmessage_tSequenceProcessor::do_character(int iCharacter) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (field_0xac == 0) { if (JUTFont::isLeadByte_ShiftJIS(iCharacter)) { if (!isOutfontKanjiCode(iCharacter)) { u16 character2Bytes = change1ByteTo2Bytes(iCharacter); pReference->addCharactor(changeKataToHira(character2Bytes)); } } else if (iCharacter < 0x8800 && !isOutfontKanjiCode(iCharacter)) { pReference->addCharactor(changeKataToHira(iCharacter)); } pReference->addNowLightCount(); } if (field_0xb3 != 0) { cXyz actorPos = pReference->getActorPos(); messageSePlay(field_0xb4, field_0xb3, &actorPos); field_0xb3 = 0; } switch(iCharacter) { case '!': mMouthCheck = 0; field_0xb1 = 1; break; case '\n': pReference->addLineCount(); pReference->addEndLineCount(); break; default: if ((0x8140 <= iCharacter && iCharacter <= 0x81FC) || (0x839F <= iCharacter && iCharacter <= 0x879C)) { mMouthCheck = 0; field_0xb1 = 1; } break; } } bool jmessage_tSequenceProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); switch (i_tag & 0xFF0000) { case MSGTAG_GROUP(1): { cXyz pos = pReference->getActorPos(); messageSePlay(field_0xb4, (i_tag & 0xFFFF) & 0xFF, &pos); return true; } case MSGTAG_GROUP(2): dComIfGp_setMesgCameraTagInfo((i_tag & 0xFFFF) & 0xFF); return true; case MSGTAG_GROUP(255): switch (i_tag) { case MSGTAG_COLOR: pReference->setNowColorType(*(u8*)i_data & 0xFF); return true; case MSGTAG_SCALE: pReference->setNowTagScale(*(u16*)i_data & 0xFFFF); return true; case MSGTAG_RUBY: case 0xFFFF02: do_rubyset(i_data, i_size); return true; } case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_PLAYER_NAME: case MSGTAG_HORSE_NAME: push_word(); return true; case MSGTAG_UNK_53: JMessage::TSequenceProcessor::stack_pushCurrent(dMsgObject_getWord()); return true; case MSGTAG_SCENT_NAME: { JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getObjectPtr()->getSmellName()); return true; } case MSGTAG_PORTAL_NAME: { JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getObjectPtr()->getPortalName()); return true; } case MSGTAG_BOMB_NAME: { JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getObjectPtr()->getBombName()); return true; } case MSGTAG_INSECT_NAME: { JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getObjectPtr()->getInsectName()); return true; } case MSGTAG_LETTER_NAME: { JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getObjectPtr()->getLetterName()); return true; } case MSGTAG_LINE_DOWN: return true; case MSGTAG_CURRENT_LETTER_PAGE: case MSGTAG_MAX_LETTER_PAGE: push_word(); return true; case MSGTAG_INSTANT: field_0xb2 = 1; pReference->setBatchColorFlag(1); return true; case MSGTAG_TYPE: field_0xb2 = 0; return true; case MSGTAG_UNK_3: case MSGTAG_AUTOBOX: pReference->setSendTimer(*(u16*)i_data); if (pReference->getSendTimer() == 0) { pReference->setSendFlag(3); } else { pReference->setSendFlag(1); } return true; case MSGTAG_BOXATMOST: pReference->setSendTimer(*(u16*)i_data); pReference->setSendFlag(2); return true; case MSGTAG_BOXATLEAST: dMeter2Info_setMsgKeyWaitTimer(*(u16*)i_data); pReference->setSendTimer(*(u16*)i_data); pReference->setSendFlag(6); return true; case MSGTAG_DEMOBOX: pReference->setDemoFrame(*(u32*)i_data); pReference->setSendFlag(4); return true; case MSGTAG_UNK_6: field_0xa8 = *(u16*)i_data; field_0xa4 = field_0xa8; return true; case MSGTAG_PAUSE: field_0xa4 = *(u16*)i_data; mMouthCheck = 0; return true; case MSGTAG_SELECT_2WAY: if (pReference->getSelectNum() == 0) { pReference->setSelectNum(2); pReference->setSelectType(0); field_0xb2 = 1; } if (*(u8*)i_data == 1) { pReference->setSelectPos(field_0xad); } field_0xad++; field_0xac = 1; return true; case MSGTAG_SELECT_3WAY: if (pReference->getSelectNum() == 0) { pReference->setSelectNum(3); pReference->setSelectType(0); field_0xb2 = 1; } if (*(u8*)i_data == 1) { pReference->setSelectPos(field_0xad); } field_0xad++; field_0xac = 1; return true; case MSGTAG_INLINE_2_NEXT: if (pReference->getSelectNum() != 2 || pReference->getSelectType() != 1) { pReference->setSelectNum(2); pReference->setSelectType(1); } field_0xb2 = 1; return true; case MSGTAG_INLINE_2_FIRST: if (pReference->getSelectNum() != 2 || pReference->getSelectType() != 1) { pReference->setSelectNum(2); pReference->setSelectType(1); pReference->setSelectPos(0); } else { pReference->setSelectPos(1); } field_0xb2 = 1; return true; case MSGTAG_INLINE_3_NEXT: if (pReference->getSelectNum() != 3 || pReference->getSelectType() != 1) { pReference->setSelectNum(3); pReference->setSelectType(1); } field_0xad++; field_0xb2 = 1; return true; case MSGTAG_INLINE_3_FIRST: if (pReference->getSelectNum() != 3 || pReference->getSelectType() != 1) { pReference->setSelectNum(3); pReference->setSelectType(1); } pReference->setSelectPos(field_0xad); field_0xb2 = 1; return true; case MSGTAG_AWAIT_CHOICE: do_character('\n'); JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getSelMsgPtr()); return true; case MSGTAG_UNK_33: do_name1(); return true; case MSGTAG_ABTN: case MSGTAG_BBTN: case MSGTAG_CSTICK: case MSGTAG_LBTN: case MSGTAG_RBTN: case MSGTAG_XBTN: case MSGTAG_YBTN: case MSGTAG_ZBTN: case MSGTAG_DPAD: case MSGTAG_STICK_CROSS: case MSGTAG_LEFT_ARROW: case MSGTAG_RIGHT_ARROW: case MSGTAG_UP_ARROW: case MSGTAG_DOWN_ARROW: case MSGTAG_STICK_UP: case MSGTAG_STICK_DOWN: case MSGTAG_STICK_LEFT: case MSGTAG_STICK_RIGHT: case MSGTAG_STICK_VERTICAL: case MSGTAG_STICK_HORIZONTAL: case MSGTAG_RED_TARGET: case MSGTAG_YELLOW_TARGET: case MSGTAG_ABTN_STAR: case MSGTAG_WHITE_TARGET: case MSGTAG_WARP_ICON: case MSGTAG_XYBTN: case MSGTAG_YXBTN: case MSGTAG_BOMB_BAG_ICON: case MSGTAG_HEART: case MSGTAG_QUAVER: do_space(i_tag); return true; case MSGTAG_INPUT_VALUE: { pReference->decideOutFontRupeeColor(0); dMsgObject_c* object_p = pReference->getObjectPtr(); object_p->setInputValue(0); object_p->onInputFlag(); pReference->resetInputFigure(); pReference->setSendFlag(5); if (*(u32*)i_data == 1) { dComIfGs_onTmpBit(dSv_event_tmp_flag_c::tempBitLabels[80]); } return true; } case MSGTAG_ACKNOWLEDGE: pReference->onButtonTagStopFlag(); return true; case MSGTAG_BOMB_NUM: { char buffer[40]; dMsgObject_c* objectPtr = pReference->getObjectPtr(); u8 sel_bomb_num = objectPtr->getSelectBombNum(); dMsgUnit_setTag(7, sel_bomb_num, buffer); strcpy((char*)pReference->getWord(field_0xb5), buffer); push_word(); return true; } case MSGTAG_BOMB_PRICE: { char buffer[40]; dMsgObject_c* objectPtr = pReference->getObjectPtr(); s16 sel_bomb_price = objectPtr->getSelectBombPrice(); dMsgUnit_setTag(1, sel_bomb_price, buffer); strcpy((char*)pReference->getWord(field_0xb5), buffer); push_word(); return true; } case MSGTAG_BOMB_MAX: case MSGTAG_ARROW_MAX: push_word(); return true; } case MSGTAG_GROUP(4): switch (i_tag & 0xFF00FFFF) { case MSGTAG_GLYPH_DOLLARSIGN: case MSGTAG_GLYPH_BACKSLASH: case MSGTAG_GLYPH_ATMARK: case MSGTAG_GLYPH_SHARP: case MSGTAG_GLYPH_FLAT: case MSGTAG_GLYPH_SQRT: case MSGTAG_GLYPH_PERCENT: case MSGTAG_GLYPH_HECTARE: case MSGTAG_GLYPH_ARE: case MSGTAG_GLYPH_LITRE: case MSGTAG_GLYPH_WATT: case MSGTAG_GLYPH_CALORIE: case MSGTAG_GLYPH_DOLLAR: case MSGTAG_GLYPH_CENT: push_word(); return true; } case MSGTAG_GROUP(5): switch (i_tag & 0xFF00FFFF) { case MSGTAG_TIME_INFO: case 1: case 2: case MSGTAG_INSECT_INFO: case 4: case 5: case 6: case MSGTAG_RIVER_POINTS: case MSGTAG_FISH_LENGTH: case MSGTAG_FUNDRAISE_REMAIN: case MSGTAG_NEW_LETTER_NUM: case MSGTAG_POE_NUM: case MSGTAG_BALLOON_SCORE: case MSGTAG_FISH_COUNT: case MSGTAG_ROLLGOAL_LV: push_word(); return true; } case MSGTAG_GROUP(6): switch (i_tag & 0xFF00FFFF) { case MSGTAG_PLAYER_GENITIV: case MSGTAG_HORSE_GENITIV: case MSGTAG_MALE_ICON: case MSGTAG_FEMALE_ICON: case MSGTAG_STAR_ICON: case MSGTAG_REFMARK: case MSGTAG_THIN_LEFT_ARROW: case MSGTAG_THIN_RIGHT_ARROW: case MSGTAG_THIN_UP_ARROW: case MSGTAG_THIN_DOWN_ARROW: push_word(); return true; case MSGTAG_BULLET: case MSGTAG_BULLET_SPACE: do_space(i_tag); return true; } case MSGTAG_GROUP(3): switch (i_tag & 0xFF00FFFF) { case MSGTAG_WII_ABTN: case MSGTAG_WII_BBTN: case MSGTAG_WII_HOMEBTN: case MSGTAG_WII_MINUSBTN: case MSGTAG_WII_PLUSBTN: case MSGTAG_WII_1BTN: case MSGTAG_WII_2BTN: case MSGTAG_WII_DPAD_ITEM: case MSGTAG_WII_DPAD_UP: case MSGTAG_WII_DPAD_DOWN: case MSGTAG_WII_DPAD_HORIZONTAL: case MSGTAG_WII_DPAD_RIGHT: case MSGTAG_WII_DPAD_LEFT: case MSGTAG_WII_WIIMOTE: case MSGTAG_WII_RETICULE: case MSGTAG_WII_NUNCHUK: case MSGTAG_WII_WIIMOTE2: case MSGTAG_WII_FAIRY: case MSGTAG_WII_CBTN: case MSGTAG_WII_ZBTN: do_space(i_tag); return true; case MSGTAG_WII_MSGID_OVERRIDE: return true; } } return false; } bool jmessage_tSequenceProcessor::do_jump_isReady() { return true; } void jmessage_tSequenceProcessor::do_name1() { const char* name = dComIfGs_getPlayerName(); #if REGION_JPN int c = (((char)name[0] & 0xFF) << 8) | ((char)name[1] & 0xFF); // if first character is hiragana or katakana if ((c >= 0x829F && c <= 0x82F1) || (c >= 0x8340 && c <= 0x8396)) { push_word(); } #endif } void jmessage_tSequenceProcessor::do_space(u32 i_tag) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); pReference->addNowLightCount(); if (field_0xac == 0) { u16 character = 0xFFFF; switch (i_tag) { case MSGTAG_ABTN: character = 0xFFE0; break; case MSGTAG_BBTN: character = 0xFFE1; break; case MSGTAG_CSTICK: character = 0xFFE2; break; case MSGTAG_LBTN: character = 0xFFE3; break; case MSGTAG_RBTN: character = 0xFFE4; break; case MSGTAG_XBTN: character = 0xFFE5; break; case MSGTAG_YBTN: character = 0xFFE6; break; case MSGTAG_ZBTN: character = 0xFFE7; break; case MSGTAG_DPAD: character = 0xFFE8; break; case MSGTAG_STICK_CROSS: character = 0xFFE9; break; case MSGTAG_LEFT_ARROW: character = 0xFFEA; break; case MSGTAG_RIGHT_ARROW: character = 0xFFEB; break; case MSGTAG_UP_ARROW: character = 0xFFEC; break; case MSGTAG_DOWN_ARROW: character = 0xFFED; break; case MSGTAG_STICK_UP: character = 0xFFEE; break; case MSGTAG_STICK_DOWN: character = 0xFFF0; break; case MSGTAG_STICK_LEFT: character = 0xFFF1; break; case MSGTAG_STICK_RIGHT: character = 0xFFF2; break; case MSGTAG_STICK_VERTICAL: character = 0xFFF3; break; case MSGTAG_STICK_HORIZONTAL: character = 0xFFF4; break; case MSGTAG_HEART: character = 0xFFF5; break; case MSGTAG_QUAVER: character = 0xFFF6; } pReference->addCharactor(character); } } void jmessage_tSequenceProcessor::do_rubyset(void const* i_data, u32 i_size) { if (field_0xac == 0) { u8 length = i_size - 1; u8* pRuby = (u8*)i_data; int index = 0; pRuby++; jmessage_tReference* pReference = (jmessage_tReference*)JMessage::TSequenceProcessor::getReference(); while (index < length) { u8 bytes[3]; bytes[0] = pRuby[index++]; bytes[1] = pRuby[index++]; bytes[2] = 0; int character = (((s8)bytes[0] & 0xFF) << 8) | ((s8)bytes[1] & 0xFF); pReference->addCharactor(changeKataToHira(character)); } } } void jmessage_tSequenceProcessor::push_word() { jmessage_tReference* pReference = (jmessage_tReference*)JMessage::TSequenceProcessor::getReference(); JMessage::TSequenceProcessor::stack_pushCurrent(pReference->getWord(field_0xb5)); field_0xb5++; pReference->setNowWordCount(field_0xb5); } void jmessage_tSequenceProcessor::messageSePlay(u8 i_speaker, u8 i_mood, cXyz* i_pos) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); dMsgObject_c* pObject = pReference->getObjectPtr(); if (i_pos != NULL && pObject->isNoDemoFlag()) { if (dComIfGp_roomControl_getStayNo() != 0) { s8 reverb = dComIfGp_getReverb(dComIfGp_roomControl_getStayNo()); OS_REPORT("message se play1===>%d\n", i_mood); Z2GetSpeechMgr2()->playOneShotVoice(i_speaker, i_mood, i_pos, reverb); } else { OS_REPORT("message se play2===>%d\n", i_mood); Z2GetSpeechMgr2()->playOneShotVoice(i_speaker, i_mood, i_pos, 0); } } else { if (dComIfGp_roomControl_getStayNo() != 0) { s8 reverb = dComIfGp_getReverb(dComIfGp_roomControl_getStayNo()); OS_REPORT("message se play3===>%d\n", i_mood); Z2GetSpeechMgr2()->playOneShotVoice(i_speaker, i_mood, NULL, reverb); } else { OS_REPORT("message se play4===>%d\n", i_mood); Z2GetSpeechMgr2()->playOneShotVoice(i_speaker, i_mood, NULL, 0); } } } void jmessage_tSequenceProcessor::do_jump(void const* pEntry, char const* pszText) {} void jmessage_tSequenceProcessor::calcStringLength() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); pReference->onSelectSetCancelFlag(); mMeasureProcessor.process_messageEntryText(this, mpEntry, mpText); pReference->offSelectSetCancelFlag(); } jmessage_tRenderingProcessor::jmessage_tRenderingProcessor(jmessage_tReference const* pReference) : JMessage::TRenderingProcessor(pReference) { mpOutFont = NULL; mCharInfoPtr = NULL; mpCharInfoCnt = 0; field_0x44 = 0.0f; field_0x48 = field_0x4c = 0.0f; mTextInitPosX = mTextInitPosY = 0.0f; mTextInitScaleX = mTextInitScaleY = 1.0f; for (int i = 0; i < 3; i++) { mSelTextInitPosX[i] = mSelTextInitPosY[i] = 0.0f; } field_0x11c = 0; field_0x128 = 0.0f; field_0x12c = 0.0f; field_0x130 = 0.0f; field_0x134 = 0.0f; field_0x14c = 0; field_0x140 = 0; field_0x142 = 0; field_0x144 = 0; field_0x146 = 0; field_0x148 = 0; field_0x14a = 0; field_0x13c = 0; field_0x13e = 0; field_0x184[0] = field_0x184[1] = field_0x184[2] = 0; field_0x14d = 0; field_0x14e = 0; mCCColor = 0xFFFFFFFF; mGCColor = 0xFFFFFFFF; field_0x14f = 0; mColorNo = 0; field_0x151 = 0; field_0x138 = 0.0f; for (int i = 0; i < ARRAY_SIZE(field_0x7c); i++) { field_0x7c[i] = 0.0f; } } void jmessage_tRenderingProcessor::do_reset() {} static void dummyString2() { DEAD_STRING(""); } void jmessage_tRenderingProcessor::do_begin(void const* pEntry, char const* pszText) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); field_0x128 = 0.0f; field_0x12c = 0.0f; field_0x130 = 0.0f; field_0x134 = 0.0f; field_0x14c = 0; field_0x142 = 0; field_0x144 = 0; field_0x146 = 0; field_0x148 = 0; field_0x14a = 0; field_0x13c = 0; field_0x13e = 0; field_0x138 = 0.0f; field_0x184[0] = field_0x184[1] = field_0x184[2] = 0; if (mCharInfoPtr != NULL) { mpCharInfoCnt = (s16*)((u8*)mCharInfoPtr + 0x1068); *mpCharInfoCnt = 0; } field_0x14d = 0; field_0x140 = 0; field_0x44 = 1.0f; field_0x14e = 0; mCCColor = 0xFFFFFFFF; mGCColor = 0xFFFFFFFF; field_0x14f = pReference->getTopWordCount(); field_0x187 = 0; field_0x48 = mTextInitPosX; field_0x4c = mTextInitPosY; field_0x151 = 0; mpOutFont->initialize(); for (int i = 0; i < ARRAY_SIZE(field_0x7c); i++) { field_0x7c[i] = 0.0f; } field_0x11c = 0; strcpy(pReference->getTextPtr(), ""); strcpy(pReference->getTextSPtr(), ""); strcpy(pReference->getRubyPtr(), ""); for (int i = 0; i < 3; i++) { strcpy(pReference->getSelTextPtr(i), ""); strcpy(pReference->getSelRubyPtr(i), ""); } if (1.0f != pReference->getDistanceScale()) { do_scale(field_0x44); } do_color(pReference->getTopColorType()); pReference->resetDrawLightCount(); do_widthcenter(); do_heightcenter(); field_0x13c = pReference->getTopTagScale(); if (field_0x13c != 0) { do_scale(field_0x13c / 100.0f); } } void jmessage_tRenderingProcessor::do_end() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (dMsgObject_getSelectWordFlag() != 0) { for (int i = 0; i < dMsgObject_getSelectWordFlag(); i++) { char buffer[200]; strcpy(buffer, dMsgObject_getSelectWord(i)); if (pReference->getSelectNum() == 2) { strcat(pReference->getSelTextPtr(i + 1), buffer); } else if (pReference->getSelectNum() == 3) { strcat(pReference->getSelTextPtr(i), buffer); } } } u8 batchColorFlag = pReference->getBatchColorFlag(); if (batchColorFlag != 0) { batchColorFlag--; pReference->setBatchColorFlag(batchColorFlag); } } void jmessage_tRenderingProcessor::do_character(int i_character) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); JUTFont* pFont = pReference->getFont(); char local_d4[3]; local_d4[2] = 0; if ((i_character & 0xFF00) != 0) { local_d4[0] = ((i_character & 0xFF00) >> 8); local_d4[1] = i_character & 0xFF; } else { local_d4[0] = i_character & 0xFF; local_d4[1] = 0; } if (i_character == 10) { field_0x142++; if (field_0x14e != 0) { field_0x48 = mSelTextInitPosX[field_0x14e - 1]; } else { field_0x48 = mTextInitPosX; } field_0x4c = field_0x4c + pReference->getLineSpace(); if (field_0x140 != 0 && pReference->getNowPageType() != 4 && pReference->getNowPageType() != 5) { if (field_0x44 > 1.0f) { field_0x44 = 1.0f; } field_0x140 = 0; } do_strcat(local_d4, true, true, false); field_0x12c = 0.0f; if (field_0x14e != 0) { do_rubystrcat(local_d4, pReference->getSelRubyPtr(field_0x14e - 1), pReference->getSelRubyCharSpace(), 0.0f); } else { do_rubystrcat(local_d4, pReference->getRubyPtr(), pReference->getRubyCharSpace(), 0.0f); pReference->addDrawLightCount(); } do_widthcenter(); do_heightcenter(); } else { f32 var_f31; if (field_0x187 == 0) { var_f31 = pReference->getFontSizeX() / pFont->getCellWidth(); if (1.0f != field_0x44) { s16 iVar9 = 0.5f + field_0x44 * pReference->getFontSizeX(); var_f31 = (f32)iVar9 / (f32)pFont->getCellWidth(); } field_0x7c[field_0x142] = var_f31 * pFont->getOffset(i_character); field_0x48 += field_0x7c[field_0x142]; field_0x187 = 1; } if (field_0x14e != 0) { var_f31 = pReference->getSelFontSize() / pFont->getCellWidth(); field_0x48 += (var_f31 * (field_0x44 * pFont->getWidth(i_character)) + pReference->getSelCharSpace()); } else { pReference->addDrawLightCount(); var_f31 = pReference->getFontSizeX() / pFont->getCellWidth(); if (checkCharInfoCharactor(i_character) && mCharInfoPtr != NULL) { f32 var_f29 = (f32)pFont->getWidth() / pFont->getCellWidth(); f32 var_f28 = var_f31 * (field_0x44 * pFont->getWidth(i_character)); f32 var_f27 = var_f29 * (field_0x44 * pReference->getFontSizeY()); f32 var_f30 = 1.0f; if (i_character == 0x8145) { var_f30 = 0.3f; } f32 var_f26 = mTextInitPosY + mTextInitScaleY * (field_0x4c - mTextInitPosY); f32 var_f25 = mTextInitPosX + mTextInitScaleX * (field_0x48 - mTextInitPosX); getCharInfo(0.5f + (var_f25 + (0.5f * var_f28)), field_0x138 + (var_f26 + 0.5f * var_f27), field_0x44 * var_f30, field_0x44 * var_f30, 1.0f); } f32 var_f24 = pReference->getCharSpace(); var_f31 = pReference->getFontSizeX() / pFont->getCellWidth(); if (1.0f != field_0x44) { s16 iVar9 = 0.5f + field_0x44 * pReference->getFontSizeX(); var_f31 = (f32)iVar9 / (f32)pFont->getCellWidth(); } field_0x48 += var_f24 + (var_f31 * pFont->getWidth(i_character)); } if (field_0x14c != 0) { --field_0x14c; if (field_0x14c == 0) { if (field_0x14e != 0) { f32 var_f23 = (field_0x48 - mSelTextInitPosX[field_0x14e - 1] - pReference->getSelCharSpace()); do_rubystrcat(field_0x152, pReference->getSelRubyPtr(field_0x14e - 1), pReference->getSelRubyCharSpace(), var_f23); } else { f32 var_f22 = (field_0x48 - mTextInitPosX) - pReference->getCharSpace(); do_rubystrcat(field_0x152, pReference->getRubyPtr(), pReference->getRubyCharSpace(), var_f22); } } } do_strcat(local_d4, true, true, false); } } bool jmessage_tRenderingProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); switch(i_tag & 0xFF0000) { case MSGTAG_GROUP(1): case MSGTAG_GROUP(2): return 1; case MSGTAG_GROUP(255): switch (i_tag) { case MSGTAG_COLOR: do_color(*(u8*)i_data & 0xFF); return 1; case MSGTAG_SCALE: field_0x13c = *(u16*)i_data & 0xFFFF; do_scale(field_0x13c / 100.0f); return 1; case MSGTAG_RUBY: case 0xFFFF02: do_rubyset(i_data, i_size); return 1; } case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_PLAYER_NAME: case MSGTAG_HORSE_NAME: push_word(); return 1; case MSGTAG_UNK_53: stack_pushCurrent(dMsgObject_getWord()); field_0x151 = dMsgObject_getSelectWordFlag(); return 1; case MSGTAG_SCENT_NAME: stack_pushCurrent(pReference->getObjectPtr()->getSmellName()); return 1; case MSGTAG_PORTAL_NAME: stack_pushCurrent(pReference->getObjectPtr()->getPortalName()); return 1; case MSGTAG_BOMB_NAME: stack_pushCurrent(pReference->getObjectPtr()->getBombName()); return 1; case MSGTAG_INSECT_NAME: stack_pushCurrent(pReference->getObjectPtr()->getInsectName()); return 1; case MSGTAG_LETTER_NAME: stack_pushCurrent(pReference->getObjectPtr()->getLetterName()); return 1; case MSGTAG_LINE_DOWN: do_linedown(*(u16*)i_data); return 1; case MSGTAG_CURRENT_LETTER_PAGE: case MSGTAG_MAX_LETTER_PAGE: push_word(); return 1; case MSGTAG_SELECT_2WAY: if (field_0x14e == 0) { field_0x14e = 1; } case MSGTAG_SELECT_3WAY: field_0x14e++; field_0x11c = 0; field_0x48 = mSelTextInitPosX[field_0x14e - 1]; do_selwidthcenter(field_0x14e - 1); return 1; case MSGTAG_INLINE_2_NEXT: case MSGTAG_INLINE_2_FIRST: do_arrow2(); return 1; case MSGTAG_INLINE_3_NEXT: case MSGTAG_INLINE_3_FIRST: do_arrow2(); return 1; case MSGTAG_AWAIT_CHOICE: do_character('\n'); stack_pushCurrent(pReference->getSelMsgPtr()); return 1; case MSGTAG_UNK_33: do_name1(); return 1; case MSGTAG_ABTN: do_outfont(0, 0); return 1; case MSGTAG_BBTN: do_outfont(1, 0); return 1; case MSGTAG_CSTICK: do_outfont(2, 0); return 1; case MSGTAG_LBTN: do_outfont(3, 0); return 1; case MSGTAG_RBTN: do_outfont(4, 0); return 1; case MSGTAG_XBTN: do_outfont(5, 0); return 1; case MSGTAG_YBTN: do_outfont(6, 0); return 1; case MSGTAG_ZBTN: do_outfont(7, 0); return 1; case MSGTAG_DPAD: do_outfont(8, 0); return 1; case MSGTAG_STICK_CROSS: do_outfont(9, 0); return 1; case MSGTAG_LEFT_ARROW: do_outfont(10, 0); return 1; case MSGTAG_RIGHT_ARROW: do_outfont(11, 0); return 1; case MSGTAG_UP_ARROW: do_outfont(12, 0); return 1; case MSGTAG_DOWN_ARROW: do_outfont(13, 0); return 1; case MSGTAG_STICK_UP: do_outfont(14, 0); return 1; case MSGTAG_STICK_DOWN: do_outfont(15, 0); return 1; case MSGTAG_STICK_LEFT: do_outfont(16, 0); return 1; case MSGTAG_STICK_RIGHT: do_outfont(17, 0); return 1; case MSGTAG_STICK_VERTICAL: do_outfont(18, 0); return 1; case MSGTAG_STICK_HORIZONTAL: do_outfont(19, 0); return 1; case MSGTAG_RED_TARGET: do_outfont(20, 0); return 1; case MSGTAG_YELLOW_TARGET: do_outfont(21, 0); return 1; case MSGTAG_INPUT_VALUE: { do_outfont(30, 0); dMsgObject_c* pMsgObject = pReference->mpObjectPtr; do_numset(pMsgObject->getInputValue()); return 1; } case MSGTAG_ACKNOWLEDGE: return 1; case MSGTAG_ABTN_STAR: do_outfont(23, 0); return 1; case MSGTAG_WHITE_TARGET: do_outfont(24, 0); return 1; case MSGTAG_WARP_ICON: do_outfont(25, 0); return 1; case MSGTAG_XYBTN: { dMsgObject_c* pMsgObject = pReference->getObjectPtr(); if (pMsgObject->getItemEquipButton() == 0) { do_outfont(5, 0); } else { do_outfont(6, 0); } return 1; } case MSGTAG_YXBTN: if (pReference->getObjectPtr()->getItemEquipButton() == 0) { do_outfont(6, 0); } else { do_outfont(5, 0); } return 1; case MSGTAG_BOMB_BAG_ICON: do_outfont(41, 0); return 1; case MSGTAG_HEART: do_outfont(27, 0); return 1; case MSGTAG_QUAVER: do_outfont(28, 0); return 1; case MSGTAG_BOMB_NUM: { char buffer[40]; u8 bombNum = pReference->getObjectPtr()->getSelectBombNum(); dMsgUnit_setTag(7, bombNum, buffer); strcpy(pReference->getWord(field_0x14f), buffer); push_word(); return 1; } case MSGTAG_BOMB_PRICE: { char buffer[40]; s16 bombPrice = pReference->getObjectPtr()->getSelectBombPrice(); dMsgUnit_setTag(1, bombPrice, buffer); strcpy(pReference->getWord(field_0x14f), buffer); push_word(); return 1; } case MSGTAG_BOMB_MAX: case MSGTAG_ARROW_MAX: push_word(); return 1; case MSGTAG_INSTANT: case MSGTAG_TYPE: case MSGTAG_UNK_3: case MSGTAG_AUTOBOX: case MSGTAG_BOXATMOST: case MSGTAG_UNK_6: case MSGTAG_PAUSE: case MSGTAG_DEMOBOX: case MSGTAG_BOXATLEAST: return 1; } case MSGTAG_GROUP(4): switch (i_tag & 0xFF00FFFF) { case MSGTAG_GLYPH_DOLLARSIGN: case MSGTAG_GLYPH_BACKSLASH: case MSGTAG_GLYPH_ATMARK: case MSGTAG_GLYPH_SHARP: case MSGTAG_GLYPH_FLAT: case MSGTAG_GLYPH_SQRT: case MSGTAG_GLYPH_PERCENT: case MSGTAG_GLYPH_HECTARE: case MSGTAG_GLYPH_ARE: case MSGTAG_GLYPH_LITRE: case MSGTAG_GLYPH_WATT: case MSGTAG_GLYPH_CALORIE: case MSGTAG_GLYPH_DOLLAR: case MSGTAG_GLYPH_CENT: push_word(); return 1; } case MSGTAG_GROUP(5): switch (i_tag & 0xFF00FFFF) { case MSGTAG_TIME_INFO: case 1: case 2: case MSGTAG_INSECT_INFO: case 4: case 5: case 6: case MSGTAG_RIVER_POINTS: case MSGTAG_FISH_LENGTH: case MSGTAG_FUNDRAISE_REMAIN: case MSGTAG_NEW_LETTER_NUM: case MSGTAG_POE_NUM: case MSGTAG_BALLOON_SCORE: case MSGTAG_FISH_COUNT: case MSGTAG_ROLLGOAL_LV: push_word(); return 1; } case MSGTAG_GROUP(6): switch (i_tag & 0xFF00FFFF) { case MSGTAG_PLAYER_GENITIV: case MSGTAG_HORSE_GENITIV: case MSGTAG_MALE_ICON: case MSGTAG_FEMALE_ICON: case MSGTAG_STAR_ICON: case MSGTAG_REFMARK: case MSGTAG_THIN_LEFT_ARROW: case MSGTAG_THIN_RIGHT_ARROW: case MSGTAG_THIN_UP_ARROW: case MSGTAG_THIN_DOWN_ARROW: push_word(); return 1; case MSGTAG_BULLET: do_outfont(42, 0); return 1; case MSGTAG_BULLET_SPACE: do_outfont(43, 0); return 1; } case MSGTAG_GROUP(3): switch (i_tag & 0xFF00FFFF) { case MSGTAG_WII_ABTN: do_outfont(0, 0); return 1; case MSGTAG_WII_BBTN: do_outfont(51, 0); return 1; case MSGTAG_WII_HOMEBTN: do_outfont(52, 0); return 1; case MSGTAG_WII_MINUSBTN: do_outfont(53, 0); return 1; case MSGTAG_WII_PLUSBTN: do_outfont(54, 0); return 1; case MSGTAG_WII_1BTN: do_outfont(63, 0); return 1; case MSGTAG_WII_2BTN: do_outfont(64, 0); return 1; case MSGTAG_WII_DPAD_ITEM: do_outfont(50, 0); return 1; case MSGTAG_WII_DPAD_UP: do_outfont(49, 0); return 1; case MSGTAG_WII_DPAD_DOWN: do_outfont(65, 0); return 1; case MSGTAG_WII_DPAD_HORIZONTAL: do_outfont(66, 0); return 1; case MSGTAG_WII_DPAD_RIGHT: do_outfont(67, 0); return 1; case MSGTAG_WII_DPAD_LEFT: do_outfont(68, 0); return 1; case MSGTAG_WII_WIIMOTE: if (dComIfGs_getOptPointer() == 0) { do_outfont(9, 0); } else { do_outfont(44, 0); } return 1; case MSGTAG_WII_RETICULE: do_outfont(69, 0); return 1; case MSGTAG_WII_NUNCHUK: do_outfont(45, 0); return 1; case MSGTAG_WII_WIIMOTE2: do_outfont(44, 0); return 1; case MSGTAG_WII_FAIRY: do_outfont(62, 0); return 1; case MSGTAG_WII_CBTN: do_outfont(2, 0); return 1; case MSGTAG_WII_ZBTN: do_outfont(7, 0); return 1; case MSGTAG_WII_MSGID_OVERRIDE: return 1; default: break; } break; } return 0; } void jmessage_tRenderingProcessor::resetRendering() { if (mCharInfoPtr == NULL) return; for (int i = 0; i < 150; i++) { mCharInfoPtr[i].field_0x14 = 0.0f; mCharInfoPtr[i].field_0x19 = 0; } *mpCharInfoCnt = 0; } void jmessage_tRenderingProcessor::do_widthcenter() { field_0x187 = 0; jmessage_tReference* pReference = (jmessage_tReference*)getReference(); s16 sVar3 = field_0x142 + pReference->getStartLineCount(); if (pReference->getLineArrange(sVar3) == 1 || pReference->getLineArrange(sVar3) == 2) { return; } f32 fVar6 = 0.5f + (pReference->getTBoxWidth() - getLineLength(field_0x142)) / 2; if (fVar6 >= 1.0f) { char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)fVar6); do_strcat(buffer, false, true, true); field_0x48 += fVar6; } } void jmessage_tRenderingProcessor::do_selwidthcenter(int param_1) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); f32 fVar5 = 0.5f + (pReference->getSelTBoxWidth() - pReference->getSelLength(param_1)) / 2; if (fVar5 >= 1.0f) { char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)fVar5); do_strcat(buffer, false, true, false); field_0x48 += fVar5; } } void jmessage_tRenderingProcessor::do_heightcenter() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); field_0x138 = 0.0f; f32 var_f31; if (field_0x142 == 0) { var_f31 = (pReference->getTBoxHeight() - (pReference->getFontSizeY() + (pReference->getLineSpace() * (pReference->getLineMax() - 1)))) / 2; } else { var_f31 = 0.0f; } switch (pReference->getNowPageType()) { case 0: if (field_0x142 == 0) { int nowPageLine = pReference->getNowPageLine(); if (pReference->getLineMax() != (s16)nowPageLine) { var_f31 += pReference->getLineSpace() * (0.5f * (pReference->getLineMax() - (s16)nowPageLine)); } } break; case 1: { if (field_0x142 == 0) { int nowPageLine = pReference->getNowPageLine(); if (nowPageLine == 1) { field_0x138 = pReference->getLineSpace() * (0.5f * (pReference->getLineMax() - (s16)nowPageLine)); var_f31 += field_0x138; } } break; } #if REGION_JPN case 2: if ((s8)pReference->getLineMax() == 3) { int nowPageLine = pReference->getNowPageLine(); field_0x138 = pReference->getLineSpace() * (0.5f * (pReference->getLineMax() - (s16)nowPageLine)); var_f31 += field_0x138; break; } if (field_0x142 == 0) { field_0x138 = pReference->getLineSpace(); var_f31 += field_0x138; } else if (field_0x142 == 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 3: { if (field_0x142 == 1) { int nowPageLine = pReference->getNowPageLine(); field_0x138 = pReference->getLineSpace() * (0.5f * (pReference->getLineMax() - (s16)nowPageLine)); var_f31 += field_0x138; break; } break; } case 4: { if (field_0x142 == 1) { var_f31 += 0.5f * pReference->getLineSpace(); } f32 sp8 = pReference->getLineScale(field_0x142) / 100.0f; f32 dVar15 = (pReference->getLineSpace() - (sp8 * pReference->getFontSizeY())) / 2; field_0x138 += dVar15; var_f31 += dVar15; break; } case 5: { if (field_0x142 >= 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } f32 sp8 = pReference->getLineScale(field_0x142) / 100.0f; f32 dVar15 = (pReference->getLineSpace() - (sp8 * pReference->getFontSizeY())) / 2; field_0x138 += dVar15; var_f31 += dVar15; break; } case 6: if (field_0x142 <= 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 7: if (field_0x142 == 1 || field_0x142 == 2) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 8: if (field_0x142 == 2) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } #else case 2: if (field_0x142 == 0) { field_0x138 = pReference->getLineSpace(); var_f31 += field_0x138; } else { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 3: { int nowPageLine = pReference->getNowPageLine(); field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; break; } case 4: { if (field_0x142 == 0) { int nowPageLine = pReference->getNowPageLine(); field_0x138 = pReference->getLineSpace() * (0.5f * (pReference->getLineMax() - (s16)nowPageLine)); var_f31 += field_0x138; } if (field_0x142 == 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } f32 spC = pReference->getLineScale(field_0x142) / 100.0f; f32 dVar15 = ((pReference->getLineSpace() - (spC * pReference->getFontSizeY())) / 2); field_0x138 += dVar15; var_f31 += dVar15; break; } case 5: { if (field_0x142 >= 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } f32 sp8 = pReference->getLineScale(field_0x142) / 100.0f; f32 dVar15 = (pReference->getLineSpace() - (sp8 * pReference->getFontSizeY())) / 2; field_0x138 += dVar15; var_f31 += dVar15; break; } case 6: if (field_0x142 <= 1) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 7: if (field_0x142 == 1 || field_0x142 == 2) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } break; case 8: if (field_0x142 == 2) { field_0x138 = 0.5f * pReference->getLineSpace(); var_f31 += field_0x138; } #endif } if (field_0x142 == 0) { field_0x138 = 0.0f; } if (0.0f != var_f31) { field_0x4c += var_f31; char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CD[%d]", (int)var_f31); do_strcat(buffer, false, true, true); if (field_0x14e != 0) { do_rubystrcat(buffer, pReference->getSelRubyPtr(field_0x14e - 1), pReference->getSelRubyCharSpace(), 0.0f); } else { do_rubystrcat(buffer, pReference->getRubyPtr(), pReference->getRubyCharSpace(), 0.0f); } } } void jmessage_tRenderingProcessor::do_color(u8 i_colorNo) { jmessage_tReference* reference_p = (jmessage_tReference*)getReference(); mColorNo = i_colorNo; mCCColor = getFontCCColorTable(i_colorNo, reference_p->getFukiKind()); mGCColor = getFontGCColorTable(i_colorNo, reference_p->getFukiKind()); char buffer[40]; sprintf(buffer, "\x1B" "CC[%08x]" "\x1B" "GC[%08x]", mCCColor, mGCColor); do_strcat(buffer, false, false, false); } void jmessage_tRenderingProcessor::do_scale(f32 param_1) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); f32 dVar10 = (param_1 * pReference->getDistanceScale()); int scale_x = 0.5f + (dVar10 * pReference->getFontSizeX()); int iVar2 = 0.5f + (dVar10 * pReference->getFontSizeY()); int uVar6 = pReference->getNowPageType() - 4 == 0; int scale_y = iVar2; if (field_0x44 != dVar10) { int iVar2 = 0.5f + (field_0x44 * pReference->getFontSizeY()); s16 sVar5 = ((s16)scale_y - (s16)iVar2) / 2; field_0x44 = dVar10; field_0x140 += sVar5; do_transY(sVar5, true); field_0x13e = sVar5; } char buffer[32]; sprintf(buffer, "\x1B" "FX[%d]" "\x1B" "FY[%d]", (s16)scale_x, (s16)scale_y); do_strcat(buffer, false, true, false); } void jmessage_tRenderingProcessor::do_linedown(s16 param_0) { char buffer[16]; sprintf(buffer, "\x1B" "CD[%d]", param_0); do_strcat(buffer, false, true, false); } void jmessage_tRenderingProcessor::do_transY(s16 i_transY, bool unused) { if (i_transY != 0) { char buffer0[16]; char buffer1[16]; if (i_transY < 0) { sprintf(buffer0, "\x1B" "CU[%d]", -i_transY); sprintf(buffer1, "\x1B" "CD[%d]", -i_transY); } else { sprintf(buffer0, "\x1B" "CD[%d]", i_transY); sprintf(buffer1, "\x1B" "CU[%d]", i_transY); } field_0x4c -= i_transY; do_strcat(buffer0, false, true, true); jmessage_tReference* pReference = (jmessage_tReference*)getReference(); do_rubystrcat(buffer1, pReference->getRubyPtr(), pReference->getRubyCharSpace(), 0.0f); } } void jmessage_tRenderingProcessor::do_outfont(u8 i_iconNo, u32 i_color) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); JUTFont* pFont = pReference->getFont(); // fakematch f32 cellWidth = pFont->getCellWidth(); f32 width = pFont->getWidth() / cellWidth; int var_r28 = 1; f32 sizeX = (24.0f * field_0x44 * mTextInitScaleX); f32 sizeY = (24.0f * field_0x44 * mTextInitScaleY); f32 posX = (mTextInitPosX + mTextInitScaleX * (field_0x48 - mTextInitPosX)); f32 posY = (mTextInitPosY + mTextInitScaleY * (field_0x4c - mTextInitPosY)); u32 color; if (i_color == 0) { color = mCCColor; } else { color = i_color; } if (i_iconNo == 30) { mpOutFont->setRupeeColor(pReference->getOutFontRupeeColor()); } mpOutFont->drawFont(NULL, i_iconNo, posX - field_0x7c[field_0x142], posY, sizeX, sizeY, color, 0xFF); pReference->addDrawLightCount(); if (mCharInfoPtr != NULL) { getCharInfo(0.5f + (posX + (0.5f * sizeX)), field_0x138 + (posY + (0.5f * sizeY)), field_0x44, field_0x44, 1.0f); } f32 spacing = 0.5f + ((field_0x44 * (sizeX * var_r28)) + pReference->getCharSpace()); field_0x48 += (int)spacing; char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)spacing); do_strcat(buffer, false, true, false); } void jmessage_tRenderingProcessor::do_arrow2() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); JUTFont* pFont = pReference->getFont(); // fakematch f32 cellWidth = pFont->getCellWidth(); f32 dVar11 = pFont->getWidth() / cellWidth; if (field_0x14d == pReference->getSelectPos()) { mpOutFont->drawFont(NULL, 29, (mTextInitPosX + mTextInitScaleX * (field_0x48 - mTextInitPosX)) - field_0x7c[field_0x142], field_0x4c, (dVar11 * (field_0x44 * pReference->getFontSizeX())), dVar11 * (field_0x44 * pReference->getFontSizeY()), mCCColor, 0xFF); } f32 spacing = 0.5f + ((field_0x44 * pReference->getFontSizeX()) + pReference->getCharSpace()); field_0x48 += (int)spacing; char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)spacing); do_strcat(buffer, false, true, false); field_0x14d++; } f32 jmessage_tRenderingProcessor::getLineLength(int i_lineNo) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); int lineNo = i_lineNo + (s16)pReference->getStartLineCount(); f32 var_f31 = pReference->getStrLength(lineNo) * pReference->getFontSizeX(); f32 var_f30 = pReference->getSpaceLength(lineNo) * pReference->getCharSpace(); return var_f31 + var_f30; } void jmessage_tRenderingProcessor::do_strcat(char* i_str, bool param_2, bool param_3, bool param_4) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (pReference->isCharSend() || !param_2) { field_0x11c += strlen(i_str); if (field_0x14e != 0) { if (field_0x11c < 50) { strcat(pReference->getSelTextPtr(field_0x14e - 1), i_str); } else { JUT_WARN(5316, "%s", "TextBox Alloc Byte Over!!"); } } else if (field_0x11c < D_MSG_CLASS_CHAR_CNT_MAX) { if (param_2) { field_0x146++; if (pReference->getBatchColorFlag() != 0) { pReference->setCharCnt(field_0x146); } else if (field_0x146 > pReference->getCharCnt() || (field_0x146 == pReference->getCharCnt() && pReference->getCharAlpha() < 255.0f)) { if (field_0x146 > pReference->getCharCnt()) { pReference->setCharAlpha(0.0f); pReference->setCharCnt(field_0x146); } if (pReference->getCharAlpha() < 255.0f) { pReference->addCharAlpha(); if (field_0x148 != 0) { char* textPtr = pReference->getTextPtr(); textPtr[field_0x148] = 0; strcat(textPtr, field_0x184); } if (field_0x14a != 0) { char* textPtr = pReference->getTextSPtr(); textPtr[field_0x14a] = 0; strcat(textPtr, field_0x184); } u32 charColor = (mCCColor & 0xFFFFFF00) | ((int)pReference->getCharAlpha() & 0xFF); u32 gradColor = (mGCColor & 0xFFFFFF00) | ((int)pReference->getCharAlpha() & 0xFF); char buffer[36]; sprintf(buffer, "\x1b" "CC[%08x]" "\x1b" "GC[%08x]", charColor, gradColor); int length = 0; length = strlen(buffer); if (field_0x11c + length < D_MSG_CLASS_CHAR_CNT_MAX) { field_0x148 = strlen(pReference->getTextPtr()); field_0x14a = strlen(pReference->getTextSPtr()); strcpy(field_0x184, i_str); strcat(pReference->getTextPtr(), buffer); strcat(pReference->getTextSPtr(), buffer); } else { JUT_WARN(5362, "%s", "TextBox Alloc Byte Over!!"); } } } } else if (param_4) { field_0x148 = 0; field_0x14a = 0; } strcat(pReference->getTextPtr(), i_str); if (param_3) { strcat(pReference->getTextSPtr(), i_str); } } else { JUT_WARN(5380, "%s", "TextBox Alloc Byte Over!!"); } } } void jmessage_tRenderingProcessor::do_rubyset(void const* i_data, u32 i_size) { jmessage_tReference* pReference = (jmessage_tReference*) getReference(); JUTFont* pFont = pReference->getFont(); u8 mRubyCnt = i_size - 1; u8* pRuby = (u8*)i_data; int index = 0; JUT_ASSERT(5405, mRubyCnt < (50)); field_0x14c = *(u8*)i_data & 0xFF; pRuby++; field_0x152[0] = 0; field_0x128 = 0.0f; while (index < mRubyCnt) { u8 buffer[3]; buffer[0] = pRuby[index++]; buffer[1] = pRuby[index++]; buffer[2] = 0; strcat(field_0x152, (const char*)buffer); int character = (((char)buffer[0] & 0xFF) << 8) | ((char)buffer[1] & 0xFF); if (field_0x14e != 0) { field_0x128 += (pReference->getSelRubyCharSpace() + pFont->getWidth(character) * (pReference->getSelRubySize() / pFont->getCellWidth())); } else { field_0x128 += (pReference->getRubyCharSpace() + pFont->getWidth(character) * (pReference->getRubySize() / pFont->getCellWidth())); } } if (field_0x14e != 0) { field_0x128 -= pReference->getSelRubyCharSpace(); field_0x130 = field_0x48 - mSelTextInitPosX[field_0x14e - 1]; } else { field_0x128 -= pReference->getRubyCharSpace(); field_0x130 = field_0x48 - mTextInitPosX; } } void jmessage_tRenderingProcessor::do_rubystrcat(char* i_src, char* i_dst, f32 i_charSpace, f32 param_4) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (pReference->isCharSend()) { if (0.0f != param_4) { field_0x134 = param_4; f32 cursor_trans = (0.5f * (field_0x130 + field_0x134) - 0.5f * field_0x128) - field_0x12c; if (cursor_trans >= 1.0f) { char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)cursor_trans); strcat(i_dst, buffer); field_0x12c += (int)cursor_trans; } else if (cursor_trans <= -1.0f) { char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CL[%d]", (int)-cursor_trans); strcat(i_dst, buffer); field_0x12c += (int)cursor_trans; } field_0x12c += field_0x128 + i_charSpace; } strcat(i_dst, i_src); } } void jmessage_tRenderingProcessor::do_name1() { const char* name = dComIfGs_getPlayerName(); #if REGION_JPN int c = (((char)name[0] & 0xFF) << 8) | ((char)name[1] & 0xFF); // if first character is hiragana or katakana if ((c >= 0x829F && c <= 0x82F1) || (c >= 0x8340 && c <= 0x8396)) { push_word(); } #endif } void jmessage_tRenderingProcessor::do_numset(s16 i_num) { if (9999 < i_num) { i_num = 9999; } if (i_num < 0) { i_num = 0; } u32 color = 0xFF0000FF; jmessage_tReference* pReference = (jmessage_tReference*) getReference(); if (pReference->getInputFigure() == 3) { do_outfont(getOutFontNumberType(i_num / 1000), color); } else { do_outfont(getOutFontNumberType(i_num / 1000), 0); } if (pReference->getInputFigure() == 2) { do_outfont(getOutFontNumberType(i_num % 1000 / 100), color); } else { do_outfont(getOutFontNumberType(i_num % 1000 / 100), 0); } if (pReference->getInputFigure() == 1) { do_outfont(getOutFontNumberType(i_num % 100 / 10), color); } else { do_outfont(getOutFontNumberType(i_num % 100 / 10), 0); } if (pReference->getInputFigure() == 0) { do_outfont(getOutFontNumberType(i_num % 10), color); } else { do_outfont(getOutFontNumberType(i_num % 10), 0); } } void jmessage_tRenderingProcessor::push_word() { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); stack_pushCurrent(pReference->getWord(field_0x14f)); field_0x14f++; } void jmessage_tRenderingProcessor::getCharInfo(f32 param_1, f32 param_2, f32 param_3, f32 param_4, f32 param_5) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); if (pReference->isLightSend()) { if (*mpCharInfoCnt >= 150) { JUT_WARN(5608, "%s", "CharInfo stack over!!"); JUT_ASSERT(5609, *mpCharInfoCnt < (150)); } mCharInfoPtr[*mpCharInfoCnt].field_0x00 = param_1; mCharInfoPtr[*mpCharInfoCnt].field_0x04 = param_2; mCharInfoPtr[*mpCharInfoCnt].field_0x08 = param_3; mCharInfoPtr[*mpCharInfoCnt].field_0x0c = param_4; mCharInfoPtr[*mpCharInfoCnt].field_0x10 = param_5; mCharInfoPtr[*mpCharInfoCnt].mColorNo = mColorNo; if (!pReference->isBatchFlag() && mCharInfoPtr[*mpCharInfoCnt].field_0x19 == 0) { mCharInfoPtr[*mpCharInfoCnt].field_0x19 = 1; } (*mpCharInfoCnt)++; } } jmessage_string_tReference::jmessage_string_tReference() { mPanePtr = NULL; mRubyPanePtr = NULL; mpFont = mDoExt_getMesgFont(); for (int i = 0; i < ARRAY_SIZE(mLineLength); i++) { mLineLength[i] = 0.0f; mOutfontLength[i] = 0.0f; } resetCharactor(); } jmessage_string_tReference::~jmessage_string_tReference() { } void jmessage_string_tReference::init(J2DTextBox* panePtr, J2DTextBox* runyPanePtr, JUTFont* font, COutFont_c* outFontPtr, u8 flags) { mPanePtr = panePtr; mRubyPanePtr = runyPanePtr; mOutFontPtr = outFontPtr; mLineCount = 0; mLineMax = D_MSG_CLASS_LINE_MAX; mNowPage = 0; mFlags = flags; if (font != NULL) { mpFont = font; } for (int i = 0; i < ARRAY_SIZE(mLineLength); i++) { mLineLength[i] = 0.0f; mOutfontLength[i] = 0.0f; } if (mOutFontPtr != NULL) { mOutFontPtr->initialize(); } } void jmessage_string_tReference::setCharactor(u16 param_0) {} void jmessage_string_tReference::addCharactor(u16 param_0) {} void jmessage_string_tReference::resetCharactor() {} f32 jmessage_string_tReference::getLineLength(int lineNo) { if (lineNo < 0) { return 0.0f; } if (lineNo < mLineMax) { return mLineLength[lineNo]; } return 0.0f; } void jmessage_string_tReference::addLineLength(int lineNo, f32 length) { if (lineNo >= 0 && lineNo < mLineMax) { mLineLength[lineNo] += length; } } f32 jmessage_string_tReference::getOutfontLength(int param_0) { if (param_0 < 0) return 0.0f; if (param_0 < mLineMax) { return mOutfontLength[param_0]; } return 0.0f; } void jmessage_string_tReference::setOutfontLength(int param_0, f32 param_1) { if (param_0 < 0) return; if (param_0 >= mLineMax) return; mOutfontLength[param_0] = param_1; } void jmessage_string_tReference::clearOutfontLength(int param_0) { if (param_0 < 0) return; if (param_0 >= mLineMax) return; if (mOutfontLength[param_0]) { mOutfontLength[param_0] = 0.0f; } } s16 jmessage_string_tReference::getLineCountNowPage() { s16 rv = -1; s32 iVar4 = mNowPage * mLineMax; s32 uVar1 = iVar4 + mLineMax; if (mLineCount >= iVar4 && mLineCount < uVar1) { rv = mLineCount - iVar4; } return rv; } jmessage_string_tControl::jmessage_string_tControl() {} jmessage_string_tMeasureProcessor::jmessage_string_tMeasureProcessor(jmessage_string_tReference const* pReference) : JMessage::TRenderingProcessor(pReference) { mpReference = (jmessage_string_tReference*)getReference(); mpReference->resetCharactor(); } void jmessage_string_tMeasureProcessor::do_begin(void const* pEntry, char const* pszText) { UNUSED(pEntry); UNUSED(pszText); mpReference->setLineCount(0); mpReference->resetCharactor(); } void jmessage_string_tMeasureProcessor::do_end() { mpReference->addLineCount(); } void jmessage_string_tMeasureProcessor::do_character(int iCharacter) { JUTFont* pFont = mpReference->getFont(); if (JUTFont::isLeadByte_ShiftJIS(iCharacter)) { if (!isOutfontKanjiCode(iCharacter)) { u16 character2Bytes = change1ByteTo2Bytes(iCharacter); mpReference->setCharactor(changeKataToHira(character2Bytes)); } } else if (iCharacter < 0x8800 && !isOutfontKanjiCode(iCharacter)) { mpReference->setCharactor(changeKataToHira(iCharacter)); } f32 charSpace; J2DTextBox::TFontSize fontSize; if (mpReference->getPanePtr() != NULL) { charSpace = mpReference->getPanePtr()->getCharSpace(); mpReference->getPanePtr()->getFontSize(fontSize); } else { charSpace = 0.0f; fontSize.mSizeY = fontSize.mSizeX = 20.0f; } if (iCharacter == '\n') { mpReference->addLineCount(); } else { f32 finalLength = charSpace + fontSize.mSizeX * ((f32)pFont->getWidth(iCharacter) / pFont->getCellWidth()); mpReference->addLineLength(mpReference->getLineCountNowPage(), finalLength); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); } } bool jmessage_string_tMeasureProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { f32 var_f30; J2DTextBox::TFontSize fontsize; if (mpReference->getPanePtr() != NULL) { var_f30 = ((J2DTextBox*)mpReference->getPanePtr())->getCharSpace(); ((J2DTextBox*)mpReference->getPanePtr())->getFontSize(fontsize); } else { var_f30 = 0.0f; fontsize.mSizeX = fontsize.mSizeY = 20.0f; } jmessage_tReference* pReference = (jmessage_tReference*)getReference(); switch(i_tag & 0xFF0000) { case MSGTAG_GROUP(255): switch(i_tag) { case MSGTAG_RUBY: case 0xFFFF02: do_rubyset(i_data, i_size); break; } break; case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_PLAYER_NAME: stack_pushCurrent(dComIfGs_getPlayerName()); break; case MSGTAG_HORSE_NAME: stack_pushCurrent(dComIfGs_getHorseName()); break; case MSGTAG_UNK_53: stack_pushCurrent(dMsgObject_getWord()); break; case MSGTAG_SCENT_NAME: stack_pushCurrent(dMsgObject_getMsgObjectClass()->getSmellName()); break; case MSGTAG_PORTAL_NAME: stack_pushCurrent(dMsgObject_getMsgObjectClass()->getPortalName()); break; case MSGTAG_BOMB_NAME: stack_pushCurrent(dMsgObject_getMsgObjectClass()->getBombName()); break; case MSGTAG_INSECT_NAME: stack_pushCurrent(dMsgObject_getMsgObjectClass()->getInsectName()); break; case MSGTAG_LETTER_NAME: stack_pushCurrent(dMsgObject_getMsgObjectClass()->getLetterName()); break; case MSGTAG_CURRENT_LETTER_PAGE: { char buffer[4]; sprintf(buffer, "%d", dComIfGp_getMessageCountNumber() / 100); stack_pushCurrent(buffer); break; } case MSGTAG_MAX_LETTER_PAGE: { char buffer[4]; sprintf(buffer, "%d", dComIfGp_getMessageCountNumber() % 100); stack_pushCurrent(buffer); break; } case MSGTAG_ABTN: case MSGTAG_BBTN: case MSGTAG_CSTICK: case MSGTAG_LBTN: case MSGTAG_RBTN: case MSGTAG_XBTN: case MSGTAG_YBTN: case MSGTAG_ZBTN: case MSGTAG_DPAD: case MSGTAG_STICK_CROSS: case MSGTAG_LEFT_ARROW: case MSGTAG_RIGHT_ARROW: case MSGTAG_UP_ARROW: case MSGTAG_DOWN_ARROW: case MSGTAG_STICK_UP: case MSGTAG_STICK_DOWN: case MSGTAG_STICK_LEFT: case MSGTAG_STICK_RIGHT: case MSGTAG_STICK_VERTICAL: case MSGTAG_STICK_HORIZONTAL: case MSGTAG_RED_TARGET: case MSGTAG_YELLOW_TARGET: case MSGTAG_ABTN_STAR: case MSGTAG_WHITE_TARGET: case MSGTAG_WARP_ICON: case MSGTAG_XYBTN: case MSGTAG_YXBTN: case MSGTAG_BOMB_BAG_ICON: case MSGTAG_HEART: case MSGTAG_QUAVER: { mpReference->setCharactor(0xFFFF); f32 length = fontsize.mSizeX + var_f30; mpReference->addLineLength(mpReference->getLineCountNowPage(), length); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), length); break; } case MSGTAG_INPUT_VALUE: { int i = 0; fontsize.mSizeX += var_f30; for (; i < 4; i++) { mpReference->addLineLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); } break; } case MSGTAG_BOMB_NUM: { char buffer[40]; u8 bombNum = dMsgObject_getMsgObjectClass()->getSelectBombNum(); dMsgUnit_setTag(7, bombNum, buffer); stack_pushCurrent(buffer); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; } case MSGTAG_BOMB_PRICE: { char buffer[40]; s16 bombPrice = dMsgObject_getMsgObjectClass()->getSelectBombPrice(); dMsgUnit_setTag(1, bombPrice, buffer); stack_pushCurrent(buffer); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; } case MSGTAG_BOMB_MAX: { u8 bombType = fpcNm_ITEM_NORMAL_BOMB; if ((*(u8*)i_data) == 1) { bombType = fpcNm_ITEM_WATER_BOMB; } else if ((*(s8*)i_data & 0xFFU) == 2) { bombType = fpcNm_ITEM_POKE_BOMB; } char buffer[40]; dMsgUnit_setTag(7, dComIfGs_getBombMax(bombType), buffer); stack_pushCurrent(buffer); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; } case MSGTAG_ARROW_MAX: { char buffer[40]; dMsgUnit_setTag(0, dComIfGs_getArrowMax(), buffer); stack_pushCurrent(buffer); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; } } break; case MSGTAG_GROUP(4): switch (i_tag & 0xFF00FFFF) { case MSGTAG_GLYPH_DOLLARSIGN: stack_pushCurrent(changeCodeToChar(0x24)); break; case MSGTAG_GLYPH_BACKSLASH: stack_pushCurrent(changeCodeToChar(0x5C)); break; case MSGTAG_GLYPH_ATMARK: stack_pushCurrent(changeCodeToChar(0x40)); break; case MSGTAG_GLYPH_SHARP: stack_pushCurrent(changeCodeToChar(0x81F2)); break; case MSGTAG_GLYPH_FLAT: stack_pushCurrent(changeCodeToChar(0x81F3)); break; case MSGTAG_GLYPH_SQRT: stack_pushCurrent(changeCodeToChar(0x81E3)); break; case MSGTAG_GLYPH_PERCENT: stack_pushCurrent(changeCodeToChar(0x876C)); break; case MSGTAG_GLYPH_HECTARE: stack_pushCurrent(changeCodeToChar(0x8766)); break; case MSGTAG_GLYPH_ARE: stack_pushCurrent(changeCodeToChar(0x8765)); break; case MSGTAG_GLYPH_LITRE: stack_pushCurrent(changeCodeToChar(0x8767)); break; case MSGTAG_GLYPH_WATT: stack_pushCurrent(changeCodeToChar(0x8768)); break; case MSGTAG_GLYPH_CALORIE: stack_pushCurrent(changeCodeToChar(0x8769)); break; case MSGTAG_GLYPH_DOLLAR: stack_pushCurrent(changeCodeToChar(0x876A)); break; case MSGTAG_GLYPH_CENT: stack_pushCurrent(changeCodeToChar(0x876B)); break; } mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; case MSGTAG_GROUP(5): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_TIME_INFO: if (*(u8*)i_data == 0) { dMsgUnit_setTag(4, dMeter2Info_getMsgTimeMs(), buffer); } else if ((*(s8*)i_data & 0xFFU) == 2) { dMsgUnit_setTag(4, dComIfGs_getRaceGameTime(), buffer); } else { dMsgUnit_setTag(4, dMeter2Info_getTimeMs(), buffer); } break; case 1: dMsgUnit_setTag(0, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case 2: dMsgUnit_setTag(1, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FUNDRAISE_REMAIN: { s16 uVar9 = *(int*)i_data; dMsgObject_getMsgObjectClass()->setFundRaisingValue(uVar9); dMsgUnit_setTag(10, uVar9 - dMsgObject_getFundRaising(), buffer); break; } case MSGTAG_NEW_LETTER_NUM: dMsgUnit_setTag(0xb, dMeter2Info_getNewLetterNum(), buffer); break; case MSGTAG_POE_NUM: dMsgUnit_setTag(0xc, getPohNum(), buffer); break; case MSGTAG_BALLOON_SCORE: { int local_15c; if (*(u8*)i_data == 0) { local_15c = dComIfGp_getMessageCountNumber(); } else { local_15c = dComIfGs_getBalloonScore(); } dMsgUnit_setTag(0xd, local_15c, buffer); break; } case MSGTAG_INSECT_INFO: { int insectNum; if (*(u8*)i_data == 0) { insectNum = dComIfGs_checkGetInsectNum(); } else { insectNum = 0x18 - dComIfGs_checkGetInsectNum(); } dMsgUnit_setTag(2, insectNum, buffer); break; } case 4: dMsgUnit_setTag(3, 0, buffer); break; case 5: dMsgUnit_setTag(0x10000, dComIfGp_getNeedLightDropNum(), buffer); break; case 6: dMsgUnit_setTag(6, 0x14 - dComIfGs_getEventReg(0xff1f), buffer); break; case MSGTAG_FISH_LENGTH: dMsgUnit_setTag(9, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FISH_COUNT: dMsgUnit_setTag(0xe, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_ROLLGOAL_LV: dMsgUnit_setTag(0x10001, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_RIVER_POINTS: dMsgUnit_setTag(8, dMeter2Info_getNowCount(), buffer); break; default: return false; } stack_pushCurrent(buffer); mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; } case MSGTAG_GROUP(6): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_PLAYER_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setPlayerName(buffer, 1); } else { setPlayerName(buffer, 0); } #endif // @bug buffer is uninitialized stack_pushCurrent(buffer); break; case MSGTAG_HORSE_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setHorseName(buffer, 1); } else { setHorseName(buffer, 0); } #endif stack_pushCurrent(buffer); break; case MSGTAG_MALE_ICON: stack_pushCurrent(changeCodeToChar(CHAR_CODE_MALE_ICON)); break; case MSGTAG_FEMALE_ICON: stack_pushCurrent(changeCodeToChar(CHAR_CODE_FEMALE_ICON)); break; case MSGTAG_STAR_ICON: stack_pushCurrent(changeCodeToChar(CHAR_CODE_STAR_ICON)); break; case MSGTAG_REFMARK: stack_pushCurrent(changeCodeToChar(CHAR_CODE_REFMARK)); break; case MSGTAG_THIN_LEFT_ARROW: stack_pushCurrent(changeCodeToChar(CHAR_CODE_THIN_LEFT_ARROW)); break; case MSGTAG_THIN_RIGHT_ARROW: stack_pushCurrent(changeCodeToChar(CHAR_CODE_THIN_RIGHT_ARROW)); break; case MSGTAG_THIN_UP_ARROW: stack_pushCurrent(changeCodeToChar(CHAR_CODE_THIN_UP_ARROW)); break; case MSGTAG_THIN_DOWN_ARROW: stack_pushCurrent(changeCodeToChar(CHAR_CODE_THIN_DOWN_ARROW)); break; case MSGTAG_BULLET: case MSGTAG_BULLET_SPACE: fontsize.mSizeX += var_f30; mpReference->addLineLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); } mpReference->clearOutfontLength(mpReference->getLineCountNowPage()); break; case MSGTAG_GROUP(3): switch(i_tag & 0xFF00FFFF) { case MSGTAG_WII_ABTN: case MSGTAG_WII_BBTN: case MSGTAG_WII_1BTN: case MSGTAG_WII_2BTN: case MSGTAG_WII_NUNCHUK: case MSGTAG_WII_WIIMOTE2: case MSGTAG_WII_FAIRY: case MSGTAG_WII_CBTN: case MSGTAG_WII_ZBTN: mpReference->setCharactor(0xFFFF); fontsize.mSizeX += var_f30; mpReference->addLineLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); break; case MSGTAG_WII_HOMEBTN: case MSGTAG_WII_MINUSBTN: case MSGTAG_WII_PLUSBTN: mpReference->setCharactor(0xFFFF); fontsize.mSizeX += var_f30; mpReference->addLineLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); break; case MSGTAG_WII_DPAD_ITEM: case MSGTAG_WII_DPAD_UP: case MSGTAG_WII_DPAD_DOWN: case MSGTAG_WII_DPAD_HORIZONTAL: case MSGTAG_WII_DPAD_RIGHT: case MSGTAG_WII_DPAD_LEFT: case MSGTAG_WII_WIIMOTE: case MSGTAG_WII_RETICULE: mpReference->setCharactor(0xFFFF); fontsize.mSizeX += var_f30; mpReference->addLineLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); mpReference->setOutfontLength(mpReference->getLineCountNowPage(), fontsize.mSizeX); break; case MSGTAG_WII_MSGID_OVERRIDE: break; } break; } } return true; } void jmessage_string_tMeasureProcessor::do_rubyset(void const* i_data, u32 i_size) { u8 len = i_size - 1; u8* pRuby = (u8*)i_data; int i = 0; pRuby++; while (i < len) { u8 bytes[3]; bytes[0] = pRuby[i++]; bytes[1] = pRuby[i++]; bytes[2] = 0; int character = (((char)bytes[0] & 0xFF) << 8) | ((char)bytes[1] & 0xFF); mpReference->setCharactor(changeKataToHira(character)); } } jmessage_string_tSequenceProcessor::jmessage_string_tSequenceProcessor( jmessage_string_tReference const* pReference, jmessage_string_tControl* pControl) : JMessage::TSequenceProcessor(pReference, pControl), mMeasureProcessor(pReference) {} void jmessage_string_tSequenceProcessor::do_reset() {} void jmessage_string_tSequenceProcessor::do_begin(void const* pEntry, char const* pszText) { mpSeqReference = (jmessage_string_tReference*)JMessage::TSequenceProcessor::getReference(); mMeasureProcessor.process_messageEntryText(this, pEntry, pszText); } void jmessage_string_tSequenceProcessor::do_end() {} bool jmessage_string_tSequenceProcessor::do_isReady() { return true; } void jmessage_string_tSequenceProcessor::do_character(int iCharacter) {} bool jmessage_string_tSequenceProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { switch (i_tag & 0xFF0000) { case MSGTAG_GROUP(0): switch(i_tag) { case MSGTAG_BOXATLEAST: dMeter2Info_setMsgKeyWaitTimer(*(u16*)i_data); break; } break; } return true; } bool jmessage_string_tSequenceProcessor::do_jump_isReady() { return true; } void jmessage_string_tSequenceProcessor::do_jump(void const* pEntry, char const* pszText) {} jmessage_string_tRenderingProcessor::jmessage_string_tRenderingProcessor( jmessage_string_tReference const* pReference) : JMessage::TRenderingProcessor(pReference) { mpReference = (jmessage_string_tReference*)getReference(); do_reset(); } s16 jmessage_string_tRenderingProcessor::getLineCountNowPage() { s16 rv = -1; s32 iVar4 = mpReference->getNowPage() * mpReference->getLineMax(); s32 uVar1 = iVar4 + mpReference->getLineMax(); if (field_0x552 >= iVar4 && field_0x552 < uVar1) { rv = field_0x552 - iVar4; } return rv; } void jmessage_string_tRenderingProcessor::do_reset() { field_0x44 = 0.0f; field_0x3c = 0.0f; field_0x40 = 0.0f; field_0x48 = 0.0f; field_0x4c = 0.0f; field_0x50 = 0.0f; field_0x54[0] = 0; field_0x254[0] = 0; field_0x454[0] = 0; field_0x54e = 0; field_0x550 = 0; field_0x554 = 0; field_0x552 = 0; field_0x486[0] = 0; } void jmessage_string_tRenderingProcessor::do_begin(void const* pEntry, char const* pszText) { do_reset(); do_widthcenter(); do_heightcenter(); } void jmessage_string_tRenderingProcessor::do_end() { if (mpReference->getPanePtr() != NULL) { strcpy(mpReference->getPanePtr()->getStringPtr(), field_0x54); } if (mpReference->getRubyPanePtr() != NULL) { strcpy(mpReference->getRubyPanePtr()->getStringPtr(), field_0x254); } } void jmessage_string_tRenderingProcessor::do_character(int iCharacter) { JUTFont* pFont = mpReference->getFont(); if (JUTFont::isLeadByte_ShiftJIS(iCharacter)) { if (!isOutfontKanjiCode(iCharacter)) { u16 character2Bytes = change1ByteTo2Bytes(iCharacter); mpReference->addCharactor(changeKataToHira(character2Bytes)); } } else { if (iCharacter < 0x8800 && !isOutfontKanjiCode(iCharacter)) { mpReference->addCharactor(changeKataToHira(iCharacter)); } } f32 dVar12; J2DTextBox::TFontSize fontSize; if (mpReference->getPanePtr() != NULL) { dVar12 = ((J2DTextBox*)mpReference->getPanePtr())->getCharSpace(); ((J2DTextBox*)mpReference->getPanePtr())->getFontSize(fontSize); } else { dVar12 = 0.0f; fontSize.mSizeX = fontSize.mSizeY = 20.0f; } char local_a6[3]; local_a6[0] = local_a6[1] = local_a6[2] = 0; if ((iCharacter & 0xFF00) != 0) { local_a6[0] = ((int)(iCharacter & 0xFF00) >> 8); local_a6[1] = iCharacter & 0xFF; } else { local_a6[0] = iCharacter & 0xFF; local_a6[1] = 0; } if (iCharacter == '\n') { do_strcat(local_a6); do_rubystrcat(local_a6); field_0x552++; field_0x48 = 0.0f; field_0x4c = 0.0f; if (mpReference->getPanePtr() != NULL) { field_0x50 += ((J2DTextBox*)mpReference->getPanePtr())->getLineSpace(); } do_widthcenter(); } else { f32 fVar2; f32 fVar1 = dVar12 + fontSize.mSizeX * (pFont->getWidth(iCharacter) / (f32)pFont->getCellWidth()); field_0x4c += fVar1; if (field_0x554 != 0) { field_0x40 += fVar1; field_0x554--; if (field_0x554 == 0) { field_0x40 -= dVar12; fVar2 = (field_0x3c + 0.5f * (field_0x40 - field_0x44)); f32 fVar3 = fVar2 - field_0x48; char acStack_98[16]; if (fVar3 >= 1.0f) { snprintf(acStack_98, sizeof(acStack_98) - 1, "\x1B" "CR[%d]", (int)fVar3); do_rubystrcat(acStack_98); } else { if (fVar3 <= -1.0f) { snprintf(acStack_98, sizeof(acStack_98) - 1, "\x1B" "CL[%d]", (int)-fVar3); do_rubystrcat(acStack_98); } else { fVar3 = 0.0f; } } if (mpReference->getRubyPanePtr() != NULL) { field_0x48 += ((J2DTextBox*)mpReference->getRubyPanePtr())->getCharSpace() + ((int)fVar3 + field_0x44); } else { field_0x48 += (int)fVar3 + field_0x44; } do_rubystrcat(field_0x454); } } do_strcat(local_a6); } } bool jmessage_string_tRenderingProcessor::do_tag(u32 i_tag, void const* i_data, u32 i_size) { jmessage_tReference* pReference = (jmessage_tReference*)getReference(); switch(i_tag & 0xFF0000) { case MSGTAG_GROUP(255): switch(i_tag) { case MSGTAG_COLOR: do_color(*(u8*)i_data & 0xFF); break; case MSGTAG_SCALE: do_scale(*(u16*)i_data / 100.0f); break; case MSGTAG_RUBY: case 0xFFFF02: do_rubyset(i_data, i_size); break; } break; case MSGTAG_GROUP(0): switch (i_tag) { case MSGTAG_PLAYER_NAME: push_word(dComIfGs_getPlayerName()); break; case MSGTAG_HORSE_NAME: push_word(dComIfGs_getHorseName()); break; case MSGTAG_UNK_53: push_word(dMsgObject_getWord()); break; case MSGTAG_SCENT_NAME: push_word(dMsgObject_getMsgObjectClass()->getSmellName()); break; case MSGTAG_PORTAL_NAME: push_word(dMsgObject_getMsgObjectClass()->getPortalName()); break; case MSGTAG_BOMB_NAME: push_word(dMsgObject_getMsgObjectClass()->getBombName()); break; case MSGTAG_INSECT_NAME: push_word(dMsgObject_getMsgObjectClass()->getInsectName()); break; case MSGTAG_LETTER_NAME: push_word(dMsgObject_getMsgObjectClass()->getLetterName()); break; case MSGTAG_LINE_DOWN: do_linedown(*(u16*)i_data); break; case MSGTAG_CURRENT_LETTER_PAGE: { char buffer[4]; sprintf(buffer, "%d", dComIfGp_getMessageCountNumber() / 100); push_word(buffer); break; } case MSGTAG_MAX_LETTER_PAGE: { char buffer[4]; sprintf(buffer, "%d", dComIfGp_getMessageCountNumber() % 100); push_word(buffer); break; } case MSGTAG_ABTN: do_outfont(0); break; case MSGTAG_BBTN: do_outfont(1); break; case MSGTAG_CSTICK: do_outfont(2); break; case MSGTAG_LBTN: do_outfont(3); break; case MSGTAG_RBTN: do_outfont(4); break; case MSGTAG_XBTN: do_outfont(5); break; case MSGTAG_YBTN: do_outfont(6); break; case MSGTAG_ZBTN: do_outfont(7); break; case MSGTAG_DPAD: do_outfont(8); break; case MSGTAG_STICK_CROSS: do_outfont(9); break; case MSGTAG_LEFT_ARROW: do_outfont(10); break; case MSGTAG_RIGHT_ARROW: do_outfont(11); break; case MSGTAG_UP_ARROW: do_outfont(12); break; case MSGTAG_DOWN_ARROW: do_outfont(13); break; case MSGTAG_STICK_UP: do_outfont(14); break; case MSGTAG_STICK_DOWN: do_outfont(15); break; case MSGTAG_STICK_LEFT: do_outfont(16); break; case MSGTAG_STICK_RIGHT: do_outfont(17); break; case MSGTAG_STICK_VERTICAL: do_outfont(18); break; case MSGTAG_STICK_HORIZONTAL: do_outfont(19); break; case MSGTAG_RED_TARGET: do_outfont(20); break; case MSGTAG_YELLOW_TARGET: do_outfont(21); break; case MSGTAG_INPUT_VALUE: do_outfont(30); do_numset(dMsgObject_getMsgObjectClass()->getInputValue()); break; case MSGTAG_ABTN_STAR: do_outfont(23); break; case MSGTAG_WHITE_TARGET: do_outfont(24); break; case MSGTAG_WARP_ICON: do_outfont(25); break; case MSGTAG_XYBTN: if (dMsgObject_getItemEquipButton() == 0) { do_outfont(5); } else { do_outfont(6); } break; case MSGTAG_YXBTN: if (dMsgObject_getItemEquipButton() == 0) { do_outfont(6); } else { do_outfont(5); } break; case MSGTAG_BOMB_BAG_ICON: do_outfont(41); break; case MSGTAG_HEART: do_outfont(27); break; case MSGTAG_QUAVER: do_outfont(28); break; case MSGTAG_BOMB_NUM: { char buffer[40]; u8 num = dMsgObject_getMsgObjectClass()->getSelectBombNum(); dMsgUnit_setTag(7, num, buffer); push_word(buffer); break; } case MSGTAG_BOMB_PRICE: { char buffer[40]; s16 price = dMsgObject_getMsgObjectClass()->getSelectBombPrice(); dMsgUnit_setTag(1, price, buffer); push_word(buffer); break; } case MSGTAG_BOMB_MAX: { u8 bombType = fpcNm_ITEM_NORMAL_BOMB; if ((*(u8*)i_data) == 1) { bombType = fpcNm_ITEM_WATER_BOMB; } else if ((*(s8*)i_data & 0xFFU) == 2) { bombType = fpcNm_ITEM_POKE_BOMB; } char buffer[40]; dMsgUnit_setTag(7, dComIfGs_getBombMax(bombType), buffer); push_word(buffer); break; } case MSGTAG_ARROW_MAX: { char buffer[40]; dMsgUnit_setTag(0, dComIfGs_getArrowMax(), buffer); push_word(buffer); break; } } break; case MSGTAG_GROUP(4): switch (i_tag & 0xFF00FFFF) { case MSGTAG_GLYPH_DOLLARSIGN: push_word(changeCodeToChar(0x24)); break; case MSGTAG_GLYPH_BACKSLASH: push_word(changeCodeToChar(0x5C)); break; case MSGTAG_GLYPH_ATMARK: push_word(changeCodeToChar(0x40)); break; case MSGTAG_GLYPH_SHARP: push_word(changeCodeToChar(0x81F2)); break; case MSGTAG_GLYPH_FLAT: push_word(changeCodeToChar(0x81F3)); break; case MSGTAG_GLYPH_SQRT: push_word(changeCodeToChar(0x81E3)); break; case MSGTAG_GLYPH_PERCENT: push_word(changeCodeToChar(0x876C)); break; case MSGTAG_GLYPH_HECTARE: push_word(changeCodeToChar(0x8766)); break; case MSGTAG_GLYPH_ARE: push_word(changeCodeToChar(0x8765)); break; case MSGTAG_GLYPH_LITRE: push_word(changeCodeToChar(0x8767)); break; case MSGTAG_GLYPH_WATT: push_word(changeCodeToChar(0x8768)); break; case MSGTAG_GLYPH_CALORIE: push_word(changeCodeToChar(0x8769)); break; case MSGTAG_GLYPH_DOLLAR: push_word(changeCodeToChar(0x876A)); break; case MSGTAG_GLYPH_CENT: push_word(changeCodeToChar(0x876B)); break; } break; case MSGTAG_GROUP(5): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_TIME_INFO: if (*(u8*)i_data == 0) { dMsgUnit_setTag(4, dMeter2Info_getMsgTimeMs(), buffer); } else if ((*(s8*)i_data & 0xFFU) == 2) { dMsgUnit_setTag(4, dComIfGs_getRaceGameTime(), buffer); } else { dMsgUnit_setTag(4, dMeter2Info_getTimeMs(), buffer); } break; case 1: dMsgUnit_setTag(0, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case 2: dMsgUnit_setTag(1, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FUNDRAISE_REMAIN: { s16 uVar9 = *(int*)i_data; dMsgObject_getMsgObjectClass()->setFundRaisingValue(uVar9); dMsgUnit_setTag(10, uVar9 - dMsgObject_getFundRaising(), buffer); break; } case MSGTAG_NEW_LETTER_NUM: dMsgUnit_setTag(0xb, dMeter2Info_getNewLetterNum(), buffer); break; case MSGTAG_POE_NUM: dMsgUnit_setTag(0xc, getPohNum(), buffer); break; case MSGTAG_BALLOON_SCORE:{ int local_15c; if (*(u8*)i_data == 0) { local_15c = dComIfGp_getMessageCountNumber(); } else { local_15c = dComIfGs_getBalloonScore(); } dMsgUnit_setTag(0xd, local_15c, buffer); break; } case MSGTAG_INSECT_INFO: { int insectNum; if (*(u8*)i_data == 0) { insectNum = dComIfGs_checkGetInsectNum(); } else { insectNum = 24 - dComIfGs_checkGetInsectNum(); } dMsgUnit_setTag(2, insectNum, buffer); break; } case 4: dMsgUnit_setTag(3, 0, buffer); break; case 5: dMsgUnit_setTag(0x10000, dComIfGp_getNeedLightDropNum(), buffer); break; case 6: dMsgUnit_setTag(6, 20 - dComIfGs_getEventReg(0xFF1F), buffer); break; case MSGTAG_FISH_LENGTH: dMsgUnit_setTag(9, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_FISH_COUNT: dMsgUnit_setTag(0xe, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_ROLLGOAL_LV: dMsgUnit_setTag(0x10001, (s32)dComIfGp_getMessageCountNumber(), buffer); break; case MSGTAG_RIVER_POINTS: dMsgUnit_setTag(8, dMeter2Info_getNowCount(), buffer); break; default: return 0; } push_word(buffer); break; } case MSGTAG_GROUP(6): { char buffer[40]; switch (i_tag & 0xFF00FFFF) { case MSGTAG_PLAYER_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setPlayerName(buffer, 1); } else { setPlayerName(buffer, 0); } #endif // @bug buffer is uninitialized push_word(buffer); break; case MSGTAG_HORSE_GENITIV: #if VERSION == VERSION_GCN_PAL if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_GERMAN) { setHorseName(buffer, 1); } else { setHorseName(buffer, 0); } #endif push_word(buffer); break; case MSGTAG_MALE_ICON: push_word(changeCodeToChar(CHAR_CODE_MALE_ICON)); break; case MSGTAG_FEMALE_ICON: push_word(changeCodeToChar(CHAR_CODE_FEMALE_ICON)); break; case MSGTAG_STAR_ICON: push_word(changeCodeToChar(CHAR_CODE_STAR_ICON)); break; case MSGTAG_REFMARK: push_word(changeCodeToChar(CHAR_CODE_REFMARK)); break; case MSGTAG_THIN_LEFT_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_LEFT_ARROW)); break; case MSGTAG_THIN_RIGHT_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_RIGHT_ARROW)); break; case MSGTAG_THIN_UP_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_UP_ARROW)); break; case MSGTAG_THIN_DOWN_ARROW: push_word(changeCodeToChar(CHAR_CODE_THIN_DOWN_ARROW)); break; case MSGTAG_BULLET: do_outfont(42); break; case MSGTAG_BULLET_SPACE: do_outfont(43); } break; } case MSGTAG_GROUP(3): switch (i_tag & 0xFF00FFFF) { case MSGTAG_WII_ABTN: do_outfont(0); break; case MSGTAG_WII_BBTN: do_outfont(51); break; case MSGTAG_WII_HOMEBTN: do_outfont(52); break; case MSGTAG_WII_MINUSBTN: do_outfont(53); break; case MSGTAG_WII_PLUSBTN: do_outfont(54); break; case MSGTAG_WII_1BTN: do_outfont(63); break; case MSGTAG_WII_2BTN: do_outfont(64); break; case MSGTAG_WII_DPAD_ITEM: do_outfont(50); break; case MSGTAG_WII_DPAD_UP: do_outfont(49); break; case MSGTAG_WII_DPAD_DOWN: do_outfont(65); break; case MSGTAG_WII_DPAD_HORIZONTAL: do_outfont(66); break; case MSGTAG_WII_DPAD_RIGHT: do_outfont(67); break; case MSGTAG_WII_DPAD_LEFT: do_outfont(68); break; case MSGTAG_WII_WIIMOTE: if (dComIfGs_getOptPointer() == 0) { do_outfont(9); } else { do_outfont(44); } break; case MSGTAG_WII_RETICULE: do_outfont(69); break; case MSGTAG_WII_NUNCHUK: do_outfont(45); break; case MSGTAG_WII_WIIMOTE2: do_outfont(44); break; case MSGTAG_WII_FAIRY: do_outfont(62); break; case MSGTAG_WII_CBTN: do_outfont(2); break; case MSGTAG_WII_ZBTN: do_outfont(7); break; } break; } return 1; } void jmessage_string_tRenderingProcessor::do_widthcenter() { J2DPane* pane; f32 scale; f32 width; f32 lineLength; f32 dVar9; char buffer[16]; int outFontLen; if (getLineCountNowPage() >= 0 && mpReference->getPanePtr() != NULL) { if (mpReference->isFlag(1) == 0) { if (mpReference->getPanePtr()->getHBinding() != HBIND_CENTER) { return; } } pane = mpReference->getPanePtr(); scale = 1.0f; scale = mDoGph_gInf_c::getScale(); #if VERSION >= VERSION_WII_USA_R0 for (; pane != NULL; pane = pane->getParentPane()) { if (pane->getUserInfo() == 'n_43') { scale = 1.0f; break; } } #endif width = scale * mpReference->getPanePtr()->getWidth(); lineLength = mpReference->getLineLength(getLineCountNowPage()); dVar9 = (0.5f + (width - lineLength) / 2); if (mpReference->getPanePtr()->getHBinding() == HBIND_CENTER) { snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CL[%d]", (int)mpReference->getOutfontLength(getLineCountNowPage())); do_strcat(buffer); } if (dVar9 >= 1.0f) { field_0x4c += (int)dVar9; if (mpReference->getPanePtr()->getHBinding() != HBIND_CENTER) { snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)dVar9); do_strcat(buffer); } } } } void jmessage_string_tRenderingProcessor::do_heightcenter() { f32 height; J2DTextBox::TFontSize fontSize; f32 lineSpace; f32 dVar11; f32 dVar9; char buffer[16]; if (mpReference->getLineCountNowPage() >= 0 && mpReference->getPanePtr() != NULL) { if (mpReference->isFlag(2) == 0) { if (mpReference->getPanePtr()->getHBinding() != HBIND_CENTER) return; } height = mpReference->getPanePtr()->getHeight(); mpReference->getPanePtr()->getFontSize(fontSize); lineSpace = mpReference->getPanePtr()->getLineSpace(); dVar11 = ((lineSpace * mpReference->getLineCountNowPage()) - (lineSpace - fontSize.mSizeY)); dVar9 = 0.5f + (height - dVar11) / 2; if (dVar9 >= 1.0f) { field_0x50 += dVar9; if (mpReference->getPanePtr()->getHBinding() != HBIND_CENTER) { snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CD[%d]", (int)dVar9); do_strcat(buffer); do_rubystrcat(buffer); } } } } void jmessage_string_tRenderingProcessor::do_strcat(char* i_str) { if (getLineCountNowPage() >= 0) { field_0x54e += strlen(i_str); if (field_0x54e < ARRAY_SIZE(field_0x54)) { strcat(field_0x54, i_str); } else { JUT_WARN(7531, "%s", "Message Alloc Byte Over!!"); } } } void jmessage_string_tRenderingProcessor::do_rubyset(void const* i_data, u32 i_size) { if (getLineCountNowPage() >= 0) { if (mpReference->getRubyPanePtr() != NULL) { JUTFont* pFont = mpReference->getFont(); f32 charSpace = mpReference->getRubyPanePtr()->getCharSpace(); J2DTextBox::TFontSize fontSize; mpReference->getRubyPanePtr()->getFontSize(fontSize); u8 m_rubycount = i_size - 1; u8* pRuby = (u8*)i_data; int i = 0; JUT_ASSERT(7565, m_rubycount < (50)); field_0x554 = *(u8*)i_data & 0xFF; pRuby++; field_0x454[0] = 0; field_0x44 = 0.0f; while (i < (int)m_rubycount) { u8 bytes[3]; bytes[0] = pRuby[i++]; bytes[1] = pRuby[i++]; bytes[2] = 0; strcat(field_0x454, (const char*)bytes); int character = (((char)bytes[0] & 0xFF) << 8) | ((char)bytes[1] & 0xFF); field_0x44 += charSpace + fontSize.mSizeX * ((f32)pFont->getWidth(character) / pFont->getCellWidth()); mpReference->addCharactor(changeKataToHira(character)); } field_0x44 -= charSpace; field_0x3c = field_0x4c; field_0x40 = 0.0f; } } } void jmessage_string_tRenderingProcessor::do_rubystrcat(char* i_str) { if (getLineCountNowPage() >= 0) { field_0x550 += strlen(i_str); if (field_0x550 < ARRAY_SIZE(field_0x254)) { strcat(field_0x254, i_str); } else { JUT_WARN(7613, "%s", "Message Alloc Byte Over!!"); } } } void jmessage_string_tRenderingProcessor::do_outfont(u8 i_iconNo) { if (mpReference->getPanePtr() != NULL) { f32 charSpace = mpReference->getPanePtr()->getCharSpace(); f32 dVar13 = 0.0f; int r28 = 1; J2DTextBox::TFontSize fontSize; mpReference->getPanePtr()->getFontSize(fontSize); if (mpReference->getOutFontPtr() != NULL) { J2DPane* pane = mpReference->getPanePtr(); f32 paneBounds0 = pane->getBounds().i.x; f32 paneBounds1 = pane->getBounds().i.y; f32 scales[2]; scales[0] = mpReference->getPanePtr()->getScaleX(); scales[1] = mpReference->getPanePtr()->getScaleX(); for (pane = pane->getParentPane(); pane != NULL; pane = pane->getParentPane()) { paneBounds0 += pane->getBounds().i.x; paneBounds1 += pane->getBounds().i.y; } f32 stack_2c = fontSize.mSizeX; f32 stack_28 = fontSize.mSizeY; f32 posX = 0.0f; f32 posY = 0.0f; if (mpReference->isFlag(4)) { f32 width = mpReference->getPanePtr()->getWidth(); f32 lineLen = mpReference->getLineLength(getLineCountNowPage()); posX = 0.5f + (width - lineLen) / 2; } if (mpReference->isFlag(8)) { f32 height = mpReference->getPanePtr()->getHeight(); J2DTextBox::TFontSize fontSize; mpReference->getPanePtr()->getFontSize(fontSize); f32 lineSpace = mpReference->getPanePtr()->getLineSpace(); f32 stack_c = (lineSpace * mpReference->getLineCountNowPage() - (lineSpace - fontSize.mSizeY)); posY = 0.5f + (height - stack_c) / 2; } mpReference->getOutFontPtr()->drawFont(mpReference->getPanePtr(), i_iconNo, field_0x4c + posX, field_0x50 + posY, fontSize.mSizeX, fontSize.mSizeY, 0xFFFFFFFF, 0xFF); dVar13 = (0.5f + (charSpace + fontSize.mSizeX * r28)); } field_0x4c += (int) dVar13; char buffer[16]; snprintf(buffer, sizeof(buffer) - 1, "\x1B" "CR[%d]", (int)dVar13); do_strcat(buffer); mpReference->addCharactor(0xFFFF); } } void jmessage_string_tRenderingProcessor::do_color(u8 i_colorNo) { u32 ccColor; u32 gcColor; if (i_colorNo == 0) { ccColor = ((jmessage_string_tReference*)getReference())->getCCColor(); gcColor = ((jmessage_string_tReference*)getReference())->getGCColor(); } else { ccColor = getFontCCColorTable(i_colorNo, 0); gcColor = getFontGCColorTable(i_colorNo, 0); } char buffer[32]; sprintf(buffer, "\x1b" "CC[%08x]" "\x1b" "GC[%08x]", ccColor, gcColor); do_strcat(buffer); } void jmessage_string_tRenderingProcessor::do_scale(f32 i_scale) { J2DTextBox::TFontSize fontSize; mpReference->getPanePtr()->getFontSize(fontSize); s16 scaleX = 0.5f + fontSize.mSizeX * i_scale; s16 scaleY = 0.5f + fontSize.mSizeY * i_scale; char buffer[32]; sprintf(buffer, "\x1b" "FX[%d]" "\x1b" "FY[%d]", scaleX, scaleY); do_strcat(buffer); } void jmessage_string_tRenderingProcessor::do_linedown(s16 i_lineNo) { char buffer[16]; sprintf(buffer, "\x1B" "CD[%d]", i_lineNo); do_strcat(buffer); } void jmessage_string_tRenderingProcessor::do_numset(s16 i_num) { if (9999 < i_num) { i_num = 9999; } if (i_num < 0) { i_num = 0; } do_outfont(getOutFontNumberType(i_num / 1000)); do_outfont(getOutFontNumberType(i_num % 1000 / 100)); do_outfont(getOutFontNumberType(i_num % 100 / 10)); do_outfont(getOutFontNumberType(i_num % 10)); } void jmessage_string_tRenderingProcessor::push_word(char const* i_word) { strcpy(field_0x486, i_word); stack_pushCurrent(field_0x486); }