diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 34827585..98fe1971 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3899,12 +3899,12 @@ fn_800B2FB0 = .text:0x800B2FB0; // type:function size:0x324 build__20MsgWindowBlurRelatedFv = .text:0x800B32E0; // type:function size:0x84 drawTextBlur__20MsgWindowBlurRelatedFP13dLytTextLight7mVec2_cUc = .text:0x800B3370; // type:function size:0x138 __dt__13TextWindowUnkFv = .text:0x800B34B0; // type:function size:0x40 -fn_800B34F0 = .text:0x800B34F0; // type:function size:0xD0 +toUpperCase__FwPwUl = .text:0x800B34F0; // type:function size:0xD0 __ct__15dTagProcessor_cFv = .text:0x800B35C0; // type:function size:0x260 __dt__15dTagProcessor_cFv = .text:0x800B3820; // type:function size:0x58 format__15dTagProcessor_cFP10dTextBox_cPCwPwUlPUlPve = .text:0x800B3880; // type:function size:0x8C formatV__15dTagProcessor_cFP10dTextBox_cPCwPwUlPUlPvP16__va_list_struct = .text:0x800B3910; // type:function size:0x980 -fn_800B4290__15dTagProcessor_cFP10dTextBox_cPCwPwlPUsP21dLytMsgWindowCharData = .text:0x800B4290; // type:function size:0x5AC +computeCharacterPlacement__15dTagProcessor_cFP10dTextBox_cPCwPwlPUsP21dLytMsgWindowCharData = .text:0x800B4290; // type:function size:0x5AC Process__15dTagProcessor_cFUsPQ34nw4r2ut15PrintContext = .text:0x800B4840; // type:function size:0x10 CalcRect__15dTagProcessor_cFPQ34nw4r2ut4RectUsPQ34nw4r2ut15PrintContext = .text:0x800B4850; // type:function size:0x4 ProcessTags__15dTagProcessor_cFPQ34nw4r2ut4RectUsPQ34nw4r2ut15PrintContext = .text:0x800B4860; // type:function size:0x78C @@ -3919,8 +3919,8 @@ writeHeroname__15dTagProcessor_cFPwPll = .text:0x800B5570; // type:function size writeItem__15dTagProcessor_cFPwPwPll = .text:0x800B5680; // type:function size:0x1DC writeStringArg__15dTagProcessor_cFPwPwPll = .text:0x800B5860; // type:function size:0x1C0 writeNumericArg__15dTagProcessor_cFPwPwPll = .text:0x800B5A20; // type:function size:0x3AC -fn_800B5DD0__15dTagProcessor_cFPwPwPll = .text:0x800B5DD0; // type:function size:0x1FC -fn_800B5FD0__15dTagProcessor_cFUlPwPl = .text:0x800B5FD0; // type:function size:0x10C +writeSingularOrPluralWord__15dTagProcessor_cFPwPwPll = .text:0x800B5DD0; // type:function size:0x1FC +writeSingleCharacter__15dTagProcessor_cFwPwPl = .text:0x800B5FD0; // type:function size:0x10C fn_800B60E0__15dTagProcessor_cFUcPw = .text:0x800B60E0; // type:function size:0x24 fn_800B6110__15dTagProcessor_cFUcPw = .text:0x800B6110; // type:function size:0x24 fn_800B6140__15dTagProcessor_cFUcPw = .text:0x800B6140; // type:function size:0x14 @@ -3930,24 +3930,24 @@ fn_800B6190__15dTagProcessor_cFUcPw = .text:0x800B6190; // type:function size:0x fn_800B61B0__15dTagProcessor_cFUcPw = .text:0x800B61B0; // type:function size:0x18 fn_800B61D0__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B61D0; // type:function size:0x64 changeScale__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextb = .text:0x800B6240; // type:function size:0xDC -writeIcon__15dTagProcessor_cFP10dTextBox_cPwf = .text:0x800B6320; // type:function size:0x12C -fn_800B6450__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B6450; // type:function size:0x340 -fn_800B6790 = .text:0x800B6790; // type:function size:0x750 -makeSpaceForIconMaybe__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextPw = .text:0x800B6EE0; // type:function size:0x1E8 -fn_800B70D0 = .text:0x800B70D0; // type:function size:0x3A4 +saveIconWidth__15dTagProcessor_cFP10dTextBox_cPwf = .text:0x800B6320; // type:function size:0x12C +drawIcon__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B6450; // type:function size:0x340 +drawPicture__15dTagProcessor_cFPQ34nw4r2ut10CharWriterPQ34nw4r2ut15PrintContextUsUc = .text:0x800B6790; // type:function size:0x750 +calcRectIcon__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextPw = .text:0x800B6EE0; // type:function size:0x1E8 +configureWriterForIcon__15dTagProcessor_cFPQ34nw4r2ut17TextWriterBasePQ34nw4r2ut15PrintContextUsl = .text:0x800B70D0; // type:function size:0x3A4 somethingWithScrapperAndMusic__15dTagProcessor_cFPw = .text:0x800B7480; // type:function size:0xB8 restoreColor__15dTagProcessor_cFPQ34nw4r2ut15PrintContextUc = .text:0x800B7540; // type:function size:0x250 writeTextNormal__15dTagProcessor_cFPCwPwPlUcl = .text:0x800B7790; // type:function size:0xD8 symbolToFontIdx__15dTagProcessor_cFl = .text:0x800B7870; // type:function size:0x10 -fn_800B7880__15dTagProcessor_cFUl = .text:0x800B7880; // type:function size:0x210 -fn_800B7A90 = .text:0x800B7A90; // type:function size:0x9C -fn_800B7B30 = .text:0x800B7B30; // type:function size:0x46C +getAnimatedIconReplacement__15dTagProcessor_cFUc = .text:0x800B7880; // type:function size:0x210 +getAnimatedWiggleIconReplacement__15dTagProcessor_cFUc = .text:0x800B7A90; // type:function size:0x9C +getAlphaForAnimatedIcon__15dTagProcessor_cFUc = .text:0x800B7B30; // type:function size:0x46C setStringArg__15dTagProcessor_cFPCwl = .text:0x800B7FA0; // type:function size:0xA0 fn_800B8040__15dTagProcessor_cFScUl = .text:0x800B8040; // type:function size:0x1F0 -fn_800B8230 = .text:0x800B8230; // type:function size:0x10C -fn_800B8340 = .text:0x800B8340; // type:function size:0x18C -fn_800B84D0 = .text:0x800B84D0; // type:function size:0x8C -fn_800B8560__15dTagProcessor_cFl = .text:0x800B8560; // type:function size:0x54 +SetupGXCommon__15dTagProcessor_cFv = .text:0x800B8230; // type:function size:0x10C +SetupGXWithColorMapping__15dTagProcessor_cFQ34nw4r2ut5ColorQ34nw4r2ut5Color = .text:0x800B8340; // type:function size:0x18C +SetupVertexFormat__15dTagProcessor_cFv = .text:0x800B84D0; // type:function size:0x8C +getMarginForCenteredLine__15dTagProcessor_cFl = .text:0x800B8560; // type:function size:0x54 fn_800B85C0__15dTagProcessor_cFl = .text:0x800B85C0; // type:function size:0x290 getMaxNumLines__15dTagProcessor_cFl = .text:0x800B8850; // type:function size:0x38 getTextCommand__15dTagProcessor_cFwPCwPUcPlPPw = .text:0x800B8890; // type:function size:0x38 @@ -3959,8 +3959,8 @@ resetLineData__15dTagProcessor_cFv = .text:0x800B8960; // type:function size:0xD getLineWidth__15dTagProcessor_cFl = .text:0x800B8A40; // type:function size:0x10 setNumericArg0__15dTagProcessor_cFl = .text:0x800B8A50; // type:function size:0xC setNumericArgs__15dTagProcessor_cFPCll = .text:0x800B8A60; // type:function size:0xDC -fn_800B8B40 = .text:0x800B8B40; // type:function size:0x4C -fn_800B8B90 = .text:0x800B8B90; // type:function size:0x4C +executeBtnPressTimer__15dTagProcessor_cFv = .text:0x800B8B40; // type:function size:0x4C +executeBtnWiggleTimer__15dTagProcessor_cFv = .text:0x800B8B90; // type:function size:0x4C execute__15dTagProcessor_cFv = .text:0x800B8BE0; // type:function size:0x34 __sinit_\d_tag_processor_cpp = .text:0x800B8C20; // type:function size:0x654 scope:local __ct__14dTimeAreaMgr_cFv = .text:0x800B9280; // type:function size:0xF0 @@ -9196,7 +9196,7 @@ fn_80167E50 = .text:0x80167E50; // type:function size:0x14 swordRestrictedBokoBase = .text:0x80167E70; // type:function size:0x44 getItemIdForTriforcePieceNum = .text:0x80167EC0; // type:function size:0x10 fn_80167ED0 = .text:0x80167ED0; // type:function size:0x88 -fn_80167F60 = .text:0x80167F60; // type:function size:0x74 +shouldUseSingular__Fl = .text:0x80167F60; // type:function size:0x74 __ct__17dLytCommonArrow_cFv = .text:0x80167FE0; // type:function size:0x148 __dt__56sFStateMgr_c<17dLytCommonArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x80168130; // type:function size:0xA4 scope:weak __dt__86sStateMgr_c<17dLytCommonArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801681E0; // type:function size:0xA0 scope:weak @@ -28220,10 +28220,10 @@ lbl_804E3850 = .rodata:0x804E3850; // type:object size:0x10 lbl_804E3860 = .rodata:0x804E3860; // type:object size:0x80 data:4byte lbl_804E38E0 = .rodata:0x804E38E0; // type:object size:0x80 data:4byte lbl_804E3960 = .rodata:0x804E3960; // type:object size:0x80 data:4byte -lbl_804E39E0 = .rodata:0x804E39E0; // type:object size:0x10 data:2byte -lbl_804E39F0 = .rodata:0x804E39F0; // type:object size:0x240 -lbl_804E3C30 = .rodata:0x804E3C30; // type:object size:0x1004 -lbl_804E4C34 = .rodata:0x804E4C34; // type:object size:0x1C data:string +sReplacementSequences = .rodata:0x804E39E0; // type:object size:0x10 scope:local data:2byte +sUpperCaseChars = .rodata:0x804E39F0; // type:object size:0x240 scope:local data:2byte +sMsgWindowFlags = .rodata:0x804E3C30; // type:object size:0x1004 scope:local +@LOCAL@symbolToFontIdx__15dTagProcessor_cFl@index = .rodata:0x804E4C34; // type:object size:0x1C scope:local data:string lbl_804E4C50 = .rodata:0x804E4C50; // type:object size:0x18 lbl_804E4C68 = .rodata:0x804E4C68; // type:object size:0xC data:string lbl_804E4C74 = .rodata:0x804E4C74; // type:object size:0xC data:string @@ -31051,9 +31051,9 @@ __vt__9dWindow_c = .data:0x80510820; // type:object size:0x8C scope:weak __vt__Q23d2d10ResAccIf_c = .data:0x805108B0; // type:object size:0x18 __vt__12UnkTextThing = .data:0x805108C8; // type:object size:0xC scope:weak __vt__13TextWindowUnk = .data:0x805108D8; // type:object size:0x10 -lbl_805108E8 = .data:0x805108E8; // type:object size:0x10 -lbl_805108F8 = .data:0x805108F8; // type:object size:0x14 data:string -jumptable_8051090C = .data:0x8051090C; // type:object size:0x80 scope:local +@22737 = .data:0x805108E8; // type:object size:0xF scope:local data:string +@22908 = .data:0x805108F8; // type:object size:0x14 scope:local data:string +@23581 = .data:0x8051090C; // type:object size:0x80 scope:local __vt__15dTagProcessor_c = .data:0x8051098C; // type:object size:0x14 lbl_805109A0 = .data:0x805109A0; // type:object size:0x20 lbl_805109C0 = .data:0x805109C0; // type:object size:0x20 @@ -41379,8 +41379,8 @@ SCRAPPER_PICKUP_TARGET = .sbss:0x805753A0; // type:object size:0x8 data:4byte @GUARD@setupGX__10dTextBox_cCFv@sFogColor = .sbss:0x805753A8; // type:object size:0x1 scope:local data:byte @LOCAL@setupGX__10dTextBox_cCFv@sFogColor = .sbss:0x805753AC; // type:object size:0x4 scope:local data:4byte sInstance__12UnkTextThing = .sbss:0x805753B0; // type:object size:0x4 data:4byte -lbl_805753B8 = .sbss:0x805753B8; // type:object size:0x1 data:byte -lbl_805753BC = .sbss:0x805753BC; // type:object size:0x4 data:4byte +@GUARD@SetupGXCommon__15dTagProcessor_cFv@fog = .sbss:0x805753B8; // type:object size:0x1 scope:local data:byte +@LOCAL@SetupGXCommon__15dTagProcessor_cFv@fog = .sbss:0x805753BC; // type:object size:0x4 scope:local data:4byte sInstance__14dTimeAreaMgr_c = .sbss:0x805753C0; // type:object size:0x4 data:4byte TIMESHIFT_TRANSITION_BORDER_COLOR = .sbss:0x805753C4; // type:object size:0x1 data:byte CURR_TIMESHIFT_STONE_ACTIVE = .sbss:0x805753C8; // type:object size:0x8 data:4byte @@ -44475,28 +44475,26 @@ lbl_80579848 = .sdata2:0x80579848; // type:object size:0x4 align:4 data:float lbl_80579850 = .sdata2:0x80579850; // type:object size:0x8 align:8 data:double lbl_80579858 = .sdata2:0x80579858; // type:object size:0x4 align:4 data:float lbl_80579860 = .sdata2:0x80579860; // type:object size:0x8 align:8 data:double -lbl_80579868 = .sdata2:0x80579868; // type:object size:0x4 -lbl_8057986C = .sdata2:0x8057986C; // type:object size:0x4 align:4 data:float -lbl_80579870 = .sdata2:0x80579870; // type:object size:0x4 data:4byte -lbl_80579874 = .sdata2:0x80579874; // type:object size:0x4 data:4byte -lbl_80579878 = .sdata2:0x80579878; // type:object size:0x4 data:4byte -lbl_8057987C = .sdata2:0x8057987C; // type:object size:0x4 data:4byte -lbl_80579880 = .sdata2:0x80579880; // type:object size:0x8 align:8 data:double -lbl_80579888 = .sdata2:0x80579888; // type:object size:0x4 align:4 data:float -lbl_8057988C = .sdata2:0x8057988C; // type:object size:0x4 align:4 data:float -lbl_80579890 = .sdata2:0x80579890; // type:object size:0x4 align:4 data:float -lbl_80579894 = .sdata2:0x80579894; // type:object size:0x4 align:4 data:float -lbl_80579898 = .sdata2:0x80579898; // type:object size:0x4 align:4 data:float -lbl_805798A0 = .sdata2:0x805798A0; // type:object size:0x8 align:8 data:double -lbl_805798A8 = .sdata2:0x805798A8; // type:object size:0x4 align:4 data:float -lbl_805798AC = .sdata2:0x805798AC; // type:object size:0x4 align:4 data:float -lbl_805798B0 = .sdata2:0x805798B0; // type:object size:0x4 align:4 data:float -lbl_805798B4 = .sdata2:0x805798B4; // type:object size:0x4 align:4 data:float -lbl_805798B8 = .sdata2:0x805798B8; // type:object size:0x4 align:4 data:float -lbl_805798BC = .sdata2:0x805798BC; // type:object size:0x4 align:4 data:float -lbl_805798C0 = .sdata2:0x805798C0; // type:object size:0x4 align:4 data:float -lbl_805798C4 = .sdata2:0x805798C4; // type:object size:0x4 align:4 data:float -lbl_805798C8 = .sdata2:0x805798C8; // type:object size:0x4 align:4 data:float +replacementSeq0xDF = .sdata2:0x80579868; // type:object size:0x4 scope:local +@22225 = .sdata2:0x8057986C; // type:object size:0x4 scope:local align:4 data:float +@18649 = .sdata2:0x80579870; // type:object size:0x8 scope:local data:4byte +@18655 = .sdata2:0x80579878; // type:object size:0x8 scope:local data:4byte +@22351 = .sdata2:0x80579880; // type:object size:0x8 scope:local align:8 data:double +@22464 = .sdata2:0x80579888; // type:object size:0x4 scope:local align:4 data:float +@22465 = .sdata2:0x8057988C; // type:object size:0x4 scope:local align:4 data:float +@22466 = .sdata2:0x80579890; // type:object size:0x4 scope:local align:4 data:float +@22467 = .sdata2:0x80579894; // type:object size:0x4 scope:local align:4 data:float +@22656 = .sdata2:0x80579898; // type:object size:0x4 scope:local align:4 data:float +@22660 = .sdata2:0x805798A0; // type:object size:0x8 scope:local align:8 data:double +@23100 = .sdata2:0x805798A8; // type:object size:0x4 scope:local align:4 data:float +@23882 = .sdata2:0x805798AC; // type:object size:0x4 scope:local align:4 data:float +@23883 = .sdata2:0x805798B0; // type:object size:0x4 scope:local align:4 data:float +@23884 = .sdata2:0x805798B4; // type:object size:0x4 scope:local align:4 data:float +@23885 = .sdata2:0x805798B8; // type:object size:0x4 scope:local align:4 data:float +@23886 = .sdata2:0x805798BC; // type:object size:0x4 scope:local align:4 data:float +@23887 = .sdata2:0x805798C0; // type:object size:0x4 scope:local align:4 data:float +@23888 = .sdata2:0x805798C4; // type:object size:0x4 scope:local align:4 data:float +@23889 = .sdata2:0x805798C8; // type:object size:0x4 scope:local align:4 data:float lbl_805798D0 = .sdata2:0x805798D0; // type:object size:0x4 align:4 data:float lbl_805798D4 = .sdata2:0x805798D4; // type:object size:0x4 align:4 data:float lbl_805798D8 = .sdata2:0x805798D8; // type:object size:0x4 align:4 data:float diff --git a/configure.py b/configure.py index e43ace26..6c725c13 100644 --- a/configure.py +++ b/configure.py @@ -456,7 +456,7 @@ config.libs = [ Object(Matching, "d/lyt/d_window.cpp"), Object(Matching, "d/d_textunk.cpp"), Object(NonMatching, "d/d_textwindow_unk.cpp"), - Object(NonMatching, "d/d_tag_processor.cpp"), + Object(Matching, "d/d_tag_processor.cpp"), Object(NonMatching, "toBeSorted/time_area_mgr.cpp"), Object(NonMatching, "toBeSorted/nand_request_thread.cpp"), Object(NonMatching, "toBeSorted/nand_result_tracker.cpp"), diff --git a/include/d/d_font_manager.h b/include/d/d_font_manager.h index bbdd2b93..a0e46b54 100644 --- a/include/d/d_font_manager.h +++ b/include/d/d_font_manager.h @@ -6,6 +6,14 @@ class dFontMng_c { public: + enum FontType_e { + NORMAL_0, + NORMAL_1, + SPECIAL_0, + SPECIAL_1, + PICTURE, + }; + dFontMng_c(); ~dFontMng_c(); diff --git a/include/d/d_message.h b/include/d/d_message.h index 47c2d84d..73293ac4 100644 --- a/include/d/d_message.h +++ b/include/d/d_message.h @@ -136,6 +136,8 @@ public: bool advanceUntilEvent(s32 searchParam3, s32 *pOutParams1n2); bool advanceUntil(s32 searchType, s32 searchParam3, s32 *pOutParams1n2); + static void playSound(u32); + u16 getField_0x44() const; u16 getNextFiFlow() const; @@ -176,7 +178,6 @@ protected: void setField0x3C(); bool checkField0x3C() const; bool shouldHideKillCountForActor(s32 id) const; - static void playSound(u32); void createLytMiniGame(); void clearMinigame(); diff --git a/include/d/d_tag_processor.h b/include/d/d_tag_processor.h index 449c1388..e8f44c16 100644 --- a/include/d/d_tag_processor.h +++ b/include/d/d_tag_processor.h @@ -9,7 +9,7 @@ struct dLytMsgWindowCharData; struct LineData { f32 mLineWidths[0x32]; - u32 mNumLines; + s32 mNumLines; }; // inofficial name @@ -28,7 +28,12 @@ public: nw4r::ut::Operation ProcessTags(nw4r::ut::Rect *rect, u16 ch, nw4r::ut::PrintContext *ctx); - f32 fn_800B8560(s32); + u8 getAnimatedWiggleIconReplacement(u8 arg); + u8 symbolToFontIdx(s32 s); + u8 getAnimatedIconReplacement(u8); + + u8 getAlphaForAnimatedIcon(u8 arg); + f32 getMarginForCenteredLine(s32); f32 fn_800B85C0(s32); void somethingWithScrapperAndMusic(wchar_t* src); @@ -37,8 +42,8 @@ public: wchar_t *writeStringArg(wchar_t *dest, wchar_t *src, s32 *, s32); wchar_t *writeNumericArg(wchar_t *dest, wchar_t *src, s32 *, s32); void fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); - void fn_800B6450(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); - void makeSpaceForIconMaybe(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, wchar_t *ptr); + void drawIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void calcRectIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, wchar_t *ptr); void fn_800B61D0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); void setFramesLeftOnPause(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); void fn_800B5500(u8 cmdLen, wchar_t *ptr); @@ -54,7 +59,10 @@ public: void restoreColor(nw4r::ut::PrintContext *ctx, u8 windowType); void setScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); - u8 symbolToFontIdx(s32 s); + void SetupGXCommon(); + void SetupGXWithColorMapping(nw4r::ut::Color min, nw4r::ut::Color max); + void SetupVertexFormat(); + void setStringArg(const wchar_t *arg, s32 index); static s32 getMaxNumLines(s32 arg); @@ -63,17 +71,17 @@ public: static void process0xFCommand(wchar_t _0xf, const wchar_t *src, s32 *outCmd); static f32 fn_800B8040(s8, u32); - wchar_t *fn_800B5FD0(u32, wchar_t *, s32 *); + wchar_t *writeSingleCharacter(wchar_t, wchar_t *, s32 *); wchar_t *writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *, u8 cmdLen, s32); wchar_t *writeHeroname(wchar_t *dest, s32 *, s32); - wchar_t *fn_800B5DD0(wchar_t *dest, wchar_t *src, s32 *, s32); + wchar_t *writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, s32 *, s32); void fn_800B5520(wchar_t *src); - void writeIcon(dTextBox_c *textBox, wchar_t *cmd, f32); - char fn_800B7880(u32); - void fn_800B70D0(nw4r::ut::TextWriterBase *, nw4r::ut::PrintContext *ctx, u16 c, s32); + void saveIconWidth(dTextBox_c *textBox, wchar_t *cmd, f32); + void configureWriterForIcon(nw4r::ut::TextWriterBase *, nw4r::ut::PrintContext *ctx, u16 c, s32); + void drawPicture(nw4r::ut::CharWriter *w, nw4r::ut::PrintContext *ctx, u16, u8); void - fn_800B4290(dTextBox_c *textBox, const wchar_t *src, wchar_t *dest, s32, u16 *, dLytMsgWindowCharData *charData); + computeCharacterPlacement(dTextBox_c *textBox, const wchar_t *src, wchar_t *dest, s32, u16 *, dLytMsgWindowCharData *charData); void resetSomething(); void resetLineData(); @@ -82,10 +90,17 @@ public: f32 getLineWidth(s32 i); s32 tickPauseFrame(); s32 tick0x830(); + + void executeBtnPressTimer(); + void executeBtnWiggleTimer(); void execute(); void setTextbox(dTextBox_c *box) { - field_0x004 = box; + mpTextBox = box; + } + + dTextBox_c *getTextBox() const { + return mpTextBox; } s32 getNumLinesMaybe() const { @@ -188,7 +203,7 @@ private: } } - /* 0x004 */ dTextBox_c *field_0x004; + /* 0x004 */ dTextBox_c *mpTextBox; /* 0x008 */ wchar_t field_0x008[4][256]; /* 0x808 */ wchar_t field_0x808[4]; /* 0x810 */ f32 field_0x810; @@ -196,7 +211,7 @@ private: /* 0x818 */ f32 field_0x818; /* 0x81C */ s32 field_0x81C; /* 0x820 */ s32 field_0x820; - /* 0x824 */ s32 field_0x824; + /* 0x824 */ u32 field_0x824; /* 0x828 */ s32 field_0x828; /* 0x82C */ s32 field_0x82C; /* 0x830 */ s32 field_0x830; @@ -227,11 +242,10 @@ private: /* 0x894 */ s32 field_0x894; /* 0x898 */ s32 field_0x898; /* 0x89C */ s32 mNumericArgs[10]; - /* 0x8C4 */ s32 mNumericArgsCopy[10]; - /* 0x8EC */ s32 field_0x8EC; - /* 0x8EC */ s32 field_0x8F0; - /* 0x8F4 */ s32 field_0x8F4; - /* 0x8F8 */ s32 field_0x8F8; + /* 0x8C4 */ s32 mFirstNumericArg; // For pluralization + /* 0x8C8 */ s32 mButtonPressAnimTimer; + /* 0x8CC */ s32 mButtonWiggleAnimTimer; + /* 0x8D0 */ s32 mNumericArgsCopy[11]; // probably not an array /* 0x8FC */ s32 field_0x8FC; /* 0x900 */ s32 field_0x900; /* 0x904 */ f32 field_0x904; diff --git a/include/d/d_textunk.h b/include/d/d_textunk.h index eea6de23..065e1562 100644 --- a/include/d/d_textunk.h +++ b/include/d/d_textunk.h @@ -75,6 +75,13 @@ public: return 1.0f; } + inline static f32 getFn800B1FC0() { + if (sInstance != nullptr) { + return sInstance->fn_800B1FC0(); + } + return 1.0f; + } + inline static f32 getFn800B1FD0() { if (sInstance != nullptr) { return sInstance->fn_800B1FD0(); @@ -128,6 +135,20 @@ public: return 0.0f; } + inline static s16 getAnimBtnTransitionDuration() { + if (sInstance != nullptr) { + return sInstance->field_0x7AA; + } + return 0; + } + + inline static s16 getAnimBtnTotalDuration() { + if (sInstance != nullptr) { + return sInstance->field_0x7AA + sInstance->field_0x7AC; + } + return 0; + } + static UnkTextThing *getInstance() { return sInstance; } diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index 65b800b8..7f832a40 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -16,4 +16,10 @@ DowsingTarget::DowsingSlot dowsingSlotForIndex(s32 index); s32 getLytIndexForDowsingIndex(s32 index); u16 getDowsingItemIdForIndex(s32 index); +/** + * FR: -1, 0, 1 singular, else plural + * Otherwise: -1, 1 singular, else plural + */ +bool shouldUseSingular(s32 amount); + #endif diff --git a/include/d/lyt/msg_window/d_lyt_msg_window.h b/include/d/lyt/msg_window/d_lyt_msg_window.h index a11113e6..069c4889 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window.h @@ -93,6 +93,10 @@ public: return mpTagProcessor; } + s32 getField_0x784() const { + return field_0x784; + } + u8 getField_0x80D() const { return field_0x80D; } @@ -105,6 +109,10 @@ public: return mTextOptionSelection; } + void onFlag0x820(u16 flag) { + field_0x820 |= flag; + } + private: bool setTextToDisplay(const wchar_t *text); void createSubMsgManager(u8 type); diff --git a/include/toBeSorted/music_mgrs.h b/include/toBeSorted/music_mgrs.h index cbd56564..476c1293 100644 --- a/include/toBeSorted/music_mgrs.h +++ b/include/toBeSorted/music_mgrs.h @@ -3,12 +3,15 @@ #include "common.h" -extern "C" void *BGM_MGR; +class BgmMgr; + +extern "C" BgmMgr *BGM_MGR; extern "C" void fn_8035E000(); -extern "C" void fn_8035E860(void *); -extern "C" void fn_8035E310(void *); -extern "C" void fn_8035E820(void *); -extern "C" void fn_8035E880(void *); +extern "C" void fn_8035E860(BgmMgr *); +extern "C" void fn_8035E310(BgmMgr *); +extern "C" void fn_8035E820(BgmMgr *); +extern "C" void fn_8035E880(BgmMgr *); +extern "C" void fn_8035E790(BgmMgr *, UNKWORD, void *); extern "C" void *ENEMY_SOUND_MGR; extern "C" void fn_80362150(void *, u16); diff --git a/src/d/d_tag_processor.cpp b/src/d/d_tag_processor.cpp index 7da58f43..37e39f03 100644 --- a/src/d/d_tag_processor.cpp +++ b/src/d/d_tag_processor.cpp @@ -1,11 +1,18 @@ #include "d/d_tag_processor.h" #include "common.h" +#include "d/a/d_a_base.h" #include "d/d_font_manager.h" #include "d/d_message.h" #include "d/d_textunk.h" #include "d/d_textwindow_unk.h" +#include "d/lyt/d_lyt_util_items.h" +#include "d/lyt/d_textbox.h" #include "d/lyt/msg_window/d_lyt_msg_window.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m_color.h" #include "nw4r/lyt/lyt_types.h" #include "nw4r/ut/ut_CharWriter.h" #include "nw4r/ut/ut_Color.h" @@ -15,55 +22,93 @@ #include "nw4r/ut/ut_TextWriterBase.h" #include "sized_string.h" #include "toBeSorted/file_manager.h" +#include "toBeSorted/music_mgrs.h" #include +#define READ_U8(src, off) (*((const u8 *)((const u8 *)src + off))) +#define READ_S8(src, off) (*((const s8 *)((const u8 *)src + off))) +#define READ_U16(src, off) (*((const u16 *)((const u8 *)src + off))) +#define READ_S16(src, off) (*((const s16 *)((const u8 *)src + off))) +#define READ_U32(src, off) (*((const u32 *)((const u8 *)src + off))) + +// picture_00.brfnt +enum PictureFontIdx { + FONT_BTN_A = 0, + FONT_BTN_B = 1, + FONT_BTN_MINUS = 2, + FONT_BTN_PLUS = 3, + FONT_BTN_1 = 4, + FONT_BTN_2 = 5, + FONT_BTN_C = 6, + FONT_BTN_Z = 7, + FONT_BTN_NUN_STK = 8, + FONT_BTN_NUN_STK_UP = 9, + FONT_BTN_NUN_STK_DOWN = 10, + FONT_BTN_NUN_STK_LEFT = 11, + FONT_BTN_NUN_STK_RIGHT = 12, + FONT_BTN_NUN_STK_WIGGLE_VERTICAL = 13, + FONT_BTN_NUN_STK_WIGGLE_HORIZONTAL = 14, + FONT_BTN_CROSS_FULL = 15, + FONT_BTN_CROSS_UP = 16, + FONT_BTN_CROSS_DOWN = 17, + FONT_BTN_CORSS_LEFT = 18, + FONT_BTN_CROSS_RIGHT = 19, + FONT_ARROW_UP = 20, + FONT_ARROW_DOWN = 21, + FONT_ARROW_LEFT = 22, + FONT_ARROW_RIGHT = 23, + FONT_CURSOR = 24, + FONT_X = 25, + FONT_HOLE = 26, +}; + nw4r::ut::Color FontColors1[] = { - nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), - nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), - nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), - nw4r::ut::Color(0xdc, 0xf5, 0xfa, 0xff), - nw4r::ut::Color(0x91, 0xff, 0x6e, 0xff), - nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), - nw4r::ut::Color(0xeb, 0xc8, 0xff, 0xff), - nw4r::ut::Color(0x14, 0xd7, 0x46, 0xff), - nw4r::ut::Color(0x19, 0xa5, 0xeb, 0xff), - nw4r::ut::Color(0xf0, 0x3c, 0x1e, 0xff), - nw4r::ut::Color(0xc8, 0xc8, 0xc8, 0xff), - nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), - nw4r::ut::Color(0x32, 0x23, 0x46, 0xff), + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), // #ff4b32ff + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), // #ff4b32ff + nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), // #faaf05ff + nw4r::ut::Color(0xdc, 0xf5, 0xfa, 0xff), // #dcf5faff + nw4r::ut::Color(0x91, 0xff, 0x6e, 0xff), // #91ff6eff + nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), // #ffbe1eff + nw4r::ut::Color(0xeb, 0xc8, 0xff, 0xff), // #ebc8ffff + nw4r::ut::Color(0x14, 0xd7, 0x46, 0xff), // #14d746ff + nw4r::ut::Color(0x19, 0xa5, 0xeb, 0xff), // #19a5ebff + nw4r::ut::Color(0xf0, 0x3c, 0x1e, 0xff), // #f03c1eff + nw4r::ut::Color(0xc8, 0xc8, 0xc8, 0xff), // #c8c8c8ff + nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), // #faaf05ff + nw4r::ut::Color(0x32, 0x23, 0x46, 0xff), // #322346ff nw4r::ut::Color(), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0xf6, 0xf6, 0xde, 0xff), - nw4r::ut::Color(0xe6, 0xe6, 0xa0, 0xff), - nw4r::ut::Color(0xe8, 0xad, 0x55, 0xff), - nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), - nw4r::ut::Color(0xf5, 0xf2, 0xeb, 0xff), - nw4r::ut::Color(0x64, 0x5f, 0x69, 0xff), - nw4r::ut::Color(0x5e, 0x51, 0x46, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0xf6, 0xf6, 0xde, 0xff), // #f6f6deff + nw4r::ut::Color(0xe6, 0xe6, 0xa0, 0xff), // #e6e6a0ff + nw4r::ut::Color(0xe8, 0xad, 0x55, 0xff), // #e8ad55ff + nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), // #fffae6ff + nw4r::ut::Color(0xf5, 0xf2, 0xeb, 0xff), // #f5f2ebff + nw4r::ut::Color(0x64, 0x5f, 0x69, 0xff), // #645f69ff + nw4r::ut::Color(0x5e, 0x51, 0x46, 0xff), // #5e5146ff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff nw4r::ut::Color(), - nw4r::ut::Color(0xfa, 0xf6, 0xe7, 0xff), - nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), - nw4r::ut::Color(0x4c, 0x32, 0x0f, 0xff), + nw4r::ut::Color(0xfa, 0xf6, 0xe7, 0xff), // #faf6e7ff + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), // #ffffffff + nw4r::ut::Color(0x4c, 0x32, 0x0f, 0xff), // #4c320fff nw4r::ut::Color(), nw4r::ut::Color(), nw4r::ut::Color(), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff nw4r::ut::Color(), - nw4r::ut::Color(0xf6, 0xf2, 0xea, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xf6, 0xf2, 0xea, 0xff), // #f6f2eaff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff nw4r::ut::Color(), nw4r::ut::Color(), - nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), // #ffffffff nw4r::ut::Color(), - nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), - nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), - nw4r::ut::Color(0x74, 0x6d, 0x5c, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), // #ede2d0ff + nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), // #202020ff + nw4r::ut::Color(0x74, 0x6d, 0x5c, 0xff), // #746d5cff nw4r::ut::Color(), nw4r::ut::Color(), nw4r::ut::Color(), @@ -71,58 +116,136 @@ nw4r::ut::Color FontColors1[] = { }; nw4r::ut::Color FontColors2[] = { - nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), - nw4r::ut::Color(0xcd, 0x4b, 0x32, 0xff), - nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), - nw4r::ut::Color(0x7d, 0xc3, 0xff, 0xff), - nw4r::ut::Color(0x64, 0xc8, 0x41, 0xff), - nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), - nw4r::ut::Color(0x91, 0x5f, 0xff, 0xff), - nw4r::ut::Color(0xaf, 0xe6, 0x2d, 0xff), - nw4r::ut::Color(0xb4, 0xe6, 0xff, 0xff), - nw4r::ut::Color(0xff, 0x91, 0x78, 0xff), - nw4r::ut::Color(0xe6, 0xe6, 0xc8, 0xff), - nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), - nw4r::ut::Color(0x50, 0x4b, 0x5f, 0xff), + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), // #ff4b32ff + nw4r::ut::Color(0xcd, 0x4b, 0x32, 0xff), // #cd4b32ff + nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), // #ffe68cff + nw4r::ut::Color(0x7d, 0xc3, 0xff, 0xff), // #7dc3ffff + nw4r::ut::Color(0x64, 0xc8, 0x41, 0xff), // #64c841ff + nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), // #ffbe1eff + nw4r::ut::Color(0x91, 0x5f, 0xff, 0xff), // #915fffff + nw4r::ut::Color(0xaf, 0xe6, 0x2d, 0xff), // #afe62dff + nw4r::ut::Color(0xb4, 0xe6, 0xff, 0xff), // #b4e6ffff + nw4r::ut::Color(0xff, 0x91, 0x78, 0xff), // #ff9178ff + nw4r::ut::Color(0xe6, 0xe6, 0xc8, 0xff), // #e6e6c8ff + nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), // #ffe68cff + nw4r::ut::Color(0x50, 0x4b, 0x5f, 0xff), // #504b5fff nw4r::ut::Color(), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0xe7, 0xd7, 0xed, 0xff), - nw4r::ut::Color(0xa5, 0x96, 0x6e, 0xff), - nw4r::ut::Color(0xb5, 0x52, 0x2e, 0xff), - nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), - nw4r::ut::Color(0xe1, 0xc8, 0x9b, 0xff), - nw4r::ut::Color(0x55, 0x50, 0x5a, 0xff), - nw4r::ut::Color(0x35, 0x2d, 0x27, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0xe7, 0xd7, 0xed, 0xff), // #e7d7edff + nw4r::ut::Color(0xa5, 0x96, 0x6e, 0xff), // #a5966eff + nw4r::ut::Color(0xb5, 0x52, 0x2e, 0xff), // #b5522eff + nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), // #fffae6ff + nw4r::ut::Color(0xe1, 0xc8, 0x9b, 0xff), // #e1c89bff + nw4r::ut::Color(0x55, 0x50, 0x5a, 0xff), // #55505aff + nw4r::ut::Color(0x35, 0x2d, 0x27, 0xff), // #352d27ff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff nw4r::ut::Color(), - nw4r::ut::Color(0xe3, 0xcc, 0x8f, 0xff), - nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), - nw4r::ut::Color(0x3a, 0x25, 0x09, 0xff), + nw4r::ut::Color(0xe3, 0xcc, 0x8f, 0xff), // #e3cc8fff + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), // #ffffffff + nw4r::ut::Color(0x3a, 0x25, 0x09, 0xff), // #3a2509ff nw4r::ut::Color(), nw4r::ut::Color(), nw4r::ut::Color(), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff nw4r::ut::Color(), - nw4r::ut::Color(0xe1, 0xc7, 0x9b, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xe1, 0xc7, 0x9b, 0xff), // #e1c79bff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff nw4r::ut::Color(), nw4r::ut::Color(), - nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), // #ffffffff nw4r::ut::Color(), - nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), - nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), - nw4r::ut::Color(0x4b, 0x47, 0x3f, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), // #caaf81ff + nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), // #202020ff + nw4r::ut::Color(0x4b, 0x47, 0x3f, 0xff), // #4b473fff nw4r::ut::Color(), nw4r::ut::Color(), nw4r::ut::Color(), nw4r::ut::Color(), }; -extern const u16 flags[2050] = { +static const wchar_t replacementSeq0xDF[] = {0x53, 0x53}; + +struct ReplacementSequence { + /* 0x00 */ wchar_t origChar; + /* 0x02 */ u8 replacementSequenceLen; + /* 0x04 */ const wchar_t *replacementSequence; +}; + +static const ReplacementSequence sReplacementSequences[] = { + {0xDF, 2, replacementSeq0xDF}, + { 0, 0, nullptr} +}; + +static const wchar_t sUpperCaseChars[] = { + L'A', L'B', L'C', L'D', L'E', L'F', L'G', L'H', L'I', L'J', L'K', L'L', L'M', L'N', + L'O', L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W', L'X', L'Y', L'Z', 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, + 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0000, 0x00D8, 0x00D9, 0x00DA, + 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x0178, 0x0000, 0x0100, 0x0000, 0x0102, 0x0000, 0x0104, 0x0000, 0x0106, 0x0000, + 0x0108, 0x0000, 0x010A, 0x0000, 0x010C, 0x0000, 0x010E, 0x0000, 0x0110, 0x0000, 0x0112, 0x0000, 0x0114, 0x0000, + 0x0116, 0x0000, 0x0118, 0x0000, 0x011A, 0x0000, 0x011C, 0x0000, 0x011E, 0x0000, 0x0120, 0x0000, 0x0122, 0x0000, + 0x0124, 0x0000, 0x0126, 0x0000, 0x0128, 0x0000, 0x012A, 0x0000, 0x012C, 0x0000, 0x012E, 0x0000, 0x0049, 0x0000, + 0x0132, 0x0000, 0x0134, 0x0000, 0x0136, 0x0000, 0x0000, 0x0139, 0x0000, 0x013B, 0x0000, 0x013D, 0x0000, 0x013F, + 0x0000, 0x0141, 0x0000, 0x0143, 0x0000, 0x0145, 0x0000, 0x0147, 0x0000, 0x0000, 0x014A, 0x0000, 0x014C, 0x0000, + 0x014E, 0x0000, 0x0150, 0x0000, 0x0152, 0x0000, 0x0154, 0x0000, 0x0156, 0x0000, 0x0158, 0x0000, 0x015A, 0x0000, + 0x015C, 0x0000, 0x015E, 0x0000, 0x0160, 0x0000, 0x0162, 0x0000, 0x0164, 0x0000, 0x0166, 0x0000, 0x0168, 0x0000, + 0x016A, 0x0000, 0x016C, 0x0000, 0x016E, 0x0000, 0x0170, 0x0000, 0x0172, 0x0000, 0x0174, 0x0000, 0x0176, 0x0000, + 0x0000, 0x0179, 0x0000, 0x017B, 0x0000, 0x017D, 0x0053, 0x0000, +}; + +s32 toUpperCase(wchar_t orig, wchar_t *out, u32 maxLen) { + if (maxLen < 3) { + return -1; + } + + if (orig >= L'a' && orig <= 383) { + const ReplacementSequence *seq = sReplacementSequences; + s32 len = seq->replacementSequenceLen; + while (true) { + if (seq->replacementSequenceLen == 0) { + break; + } + if (seq->origChar == orig) { + s32 len = seq->replacementSequenceLen; + const wchar_t *r = seq->replacementSequence; + s32 i = seq->replacementSequenceLen; + do { + *out = *r; + out++; + r++; + } while (--i); + *out = L'\0'; + return len; + } + seq++; + } + u32 ret = 1; + wchar_t replacement = sUpperCaseChars[orig - L'a']; + if (replacement == L'\0') { + replacement = orig; + ret = 0; + } + out[0] = replacement; + out[1] = L'\0'; + return ret; + } + out[0] = orig; + out[1] = L'\0'; + return 0; +} + +const u16 sMsgWindowFlags[2050] = { 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, }; @@ -175,9 +298,13 @@ dTagProcessor_c::dTagProcessor_c() { field_0x81C = 0; field_0x820 = 0; setNumericArg0(0); + mButtonPressAnimTimer = 0; + mButtonWiggleAnimTimer = 0; + mFirstNumericArg = 0; + + mNumericArgsCopy[0] = 0; mNumericArgsCopy[1] = 0; mNumericArgsCopy[2] = 0; - mNumericArgsCopy[0] = 0; mNumericArgsCopy[3] = 0; mNumericArgsCopy[4] = 0; mNumericArgsCopy[5] = 0; @@ -185,10 +312,7 @@ dTagProcessor_c::dTagProcessor_c() { mNumericArgsCopy[7] = 0; mNumericArgsCopy[8] = 0; mNumericArgsCopy[9] = 0; - field_0x8EC = 0; - field_0x8F0 = 0; - field_0x8F4 = 0; - field_0x8F8 = 0; + mNumericArgsCopy[10] = 0; field_0xEE5 = 0; field_0xEE6 = 0; @@ -206,7 +330,7 @@ dTagProcessor_c::dTagProcessor_c() { field_0xEE2 = 0; field_0xEE3 = 0; field_0xEE4 = 0; - field_0x004 = nullptr; + mpTextBox = nullptr; mMsgWindowSubtype = dLytMsgWindow_c::MSG_WINDOW_36; field_0x90D = 4; field_0xEF0 = 0; @@ -297,9 +421,8 @@ void dTagProcessor_c::formatV( } break; case 0x10000: { - const u8 *endPtrU8 = (const u8 *)endPtr; - u8 a = endPtrU8[0]; - u8 b = endPtrU8[1]; + u8 a = READ_U8(endPtr, 0); + u8 b = READ_U8(endPtr, 1); switch (a) { case 0: state2 = 0; break; case 1: state1 = 0; break; @@ -320,9 +443,8 @@ void dTagProcessor_c::formatV( bVar3 = true; } break; case 0x10001: { - const u8 *endPtrU8 = (const u8 *)endPtr; - u8 a = endPtrU8[0]; - u8 b = endPtrU8[1]; + u8 a = READ_U8(endPtr, 0); + u8 b = READ_U8(endPtr, 1); switch (a) { case 0: state2 = 1; break; case 1: state1 = 1; break; @@ -332,9 +454,8 @@ void dTagProcessor_c::formatV( bVar3 = true; } break; case 0x10002: { - const u8 *endPtrU8 = (const u8 *)endPtr; - u8 a = endPtrU8[0]; - u8 b = endPtrU8[1]; + u8 a = READ_U8(endPtr, 0); + u8 b = READ_U8(endPtr, 1); switch (a) { case 0: state2 = 2; break; case 1: state1 = 2; break; @@ -344,9 +465,8 @@ void dTagProcessor_c::formatV( bVar3 = true; } break; case 0x10003: { - const u8 *endPtrU8 = (const u8 *)endPtr; - u8 a = endPtrU8[0]; - u8 b = endPtrU8[1]; + u8 a = READ_U8(endPtr, 0); + u8 b = READ_U8(endPtr, 1); switch (a) { case 0: state2 = 3; break; case 1: state1 = 3; break; @@ -357,7 +477,7 @@ void dTagProcessor_c::formatV( } break; case 0x10008: if (textBox != nullptr) { - currScale = fn_800B8040(((u8 *)endPtr)[0], mMsgWindowSubtype); + currScale = fn_800B8040(READ_U8(endPtr, 0), mMsgWindowSubtype); currScale *= textBox->getMyScale(); } writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); @@ -373,7 +493,7 @@ void dTagProcessor_c::formatV( case 0x10010: fn_800B5520(endPtr); break; case 0x20004: if (textBox != nullptr) { - writeIcon(textBox, endPtr, currScale); + saveIconWidth(textBox, endPtr, currScale); } writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); break; @@ -382,7 +502,7 @@ void dTagProcessor_c::formatV( case 0x20002: writePtr = writeStringArg(writePtr, endPtr, &local_b4, state4); break; case 0x20003: writePtr = writeNumericArg(writePtr, endPtr, &local_b4, state4); break; - case 0x30004: writePtr = fn_800B5DD0(writePtr, endPtr, &local_b4, state4); break; + case 0x30004: writePtr = writeSingularOrPluralWord(writePtr, endPtr, &local_b4, state4); break; case 0x30001: field_0xEF1 = 1; writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); @@ -412,7 +532,7 @@ void dTagProcessor_c::formatV( src += 3; } else if (state4 != 0 && field_0x90E != 0) { // Note: Return ignored here - fn_800B5FD0(c, &getTmpBuffer()[local_b4], &local_b4); + writeSingleCharacter(c, &getTmpBuffer()[local_b4], &local_b4); src++; onWriteTmpBuffer(); } else { @@ -440,12 +560,12 @@ void dTagProcessor_c::formatV( const nw4r::ut::Font *fnt = textBox->GetFont(); mLineData.mLineWidths[mLineData.mNumLines] += currScale * fnt->GetCharWidth(*src) + textBox->GetCharSpace(); - writePtr = fn_800B5FD0(*src, writePtr, nullptr); + writePtr = writeSingleCharacter(*src, writePtr, nullptr); src++; } } else { - writePtr = fn_800B5FD0(c, writePtr, nullptr); + writePtr = writeSingleCharacter(c, writePtr, nullptr); src++; } } @@ -459,7 +579,7 @@ end: } } -void dTagProcessor_c::fn_800B4290( +void dTagProcessor_c::computeCharacterPlacement( dTextBox_c *textBox, const wchar_t *src_, wchar_t *dest, s32 unkArg, u16 *pOutLen, dLytMsgWindowCharData *charData ) { const wchar_t *src = src_; @@ -477,6 +597,9 @@ void dTagProcessor_c::fn_800B4290( f32 posX = 0.0f; f32 posY = 0.0f; + // Float order + 1.0f; + if (textBox != nullptr) { currScale *= textBox->getMyScale(); } @@ -496,10 +619,10 @@ beginning: switch (cmd) { case 0x0F0F0F0F: { if (lineNum / getMaxNumLines(mMsgWindowSubtype) == unkArg) { - nw4r::lyt::Size fontSize = field_0x004->GetFontSize(); - posX = fn_800B8560(lineNum); + nw4r::lyt::Size fontSize = getTextBox()->GetFontSize(); + posX = getMarginForCenteredLine(lineNum); if ((mMsgWindowSubtype < dLytMsgWindow_c::MSG_WINDOW_WOOD || - mMsgWindowSubtype >= dLytMsgWindow_c::MSG_WINDOW_10) && + mMsgWindowSubtype >= dLytMsgWindow_c::MSG_WINDOW_LINK + 1) && mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_DEMO) { posX = 0.0f; } @@ -523,7 +646,7 @@ beginning: } posY = (fn_800B85C0(lineNum) - (fontSize.height * (currScale / tmp) / 2.0f)) - tmp3; } else { - posY = (posY - (fontSize.height * (currScale / tmp) + field_0x004->GetLineSpace())); + posY = (posY - (fontSize.height * (currScale / tmp) + getTextBox()->GetLineSpace())); } if (!b2) { b2 = true; @@ -540,14 +663,14 @@ beginning: case 0x10003: b1 = true; break; case 0x10008: { if (b2) { - f32 newScale = fn_800B8040(*(u8 *)endPtr, mMsgWindowSubtype); + f32 newScale = fn_800B8040(READ_U8(endPtr, 0), mMsgWindowSubtype); f32 baseScale = fn_800B8040(0, mMsgWindowSubtype); if (textBox != nullptr) { newScale *= textBox->getMyScale(); baseScale *= textBox->getMyScale(); } if (currScale != newScale) { - nw4r::lyt::Size fontSize = field_0x004->GetFontSize(); + nw4r::lyt::Size fontSize = mpTextBox->GetFontSize(); posY -= (fontSize.height * ((currScale - newScale) / baseScale) / 2.0f) * UnkTextThing::getField0x788(); currScale = newScale; @@ -562,7 +685,7 @@ beginning: tmp *= textBox->getMyScale(); } if (currScale != tmp) { - nw4r::lyt::Size _size = field_0x004->GetFontSize(); + nw4r::lyt::Size _size = mpTextBox->GetFontSize(); currScale = tmp; } } @@ -570,8 +693,8 @@ beginning: case 0x20004: if (b2) { *writePtr = -1; - const nw4r::ut::Font *fnt = dFontMng_c::getFont(4); - wchar_t c = fn_800B7880(*(u8 *)endPtr); + const nw4r::ut::Font *fnt = dFontMng_c::getFont(dFontMng_c::PICTURE); + s8 c = getAnimatedIconReplacement(READ_U8(endPtr, 0)); f32 tmp = UnkTextThing::getField0x764(); f32 wid = tmp / fnt->GetWidth() * currScale; f32 charSpace = textBox->GetCharSpace(); @@ -606,7 +729,7 @@ beginning: if (b2) { *writePtr = c; const nw4r::ut::Font *fnt = textBox->GetFont(); - f32 tmp = currScale * fnt->GetCharWidth(*src) * 0.5f; + f32 tmp = currScale * fnt->GetCharWidth(READ_U16(src, 0)) * 0.5f; posX += tmp; if (charData != nullptr) { wchar_t s = *writePtr; @@ -690,115 +813,115 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n case 0x10004: // Pause if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEED == 0 && field_0x8F0 == field_0x838) { + if (field_0xEED == 0 && mNumericArgsCopy[8] == field_0x838) { setFramesLeftOnPause(rect, ctx, cmdLen, endPtr); field_0xEED = 1; field_0x838++; } - field_0x8F0++; + mNumericArgsCopy[8]++; } break; case 0x10005: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEEE == 0 && field_0x8F4 == field_0x83C) { + if (field_0xEEE == 0 && mNumericArgsCopy[9] == field_0x83C) { fn_800B5500(cmdLen, endPtr); field_0xEEE = 1; field_0x83C++; } - field_0x8F4++; + mNumericArgsCopy[9]++; } break; case 0x10007: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEE5 == 0 && mNumericArgsCopy[3] == field_0x87C) { + if (field_0xEE5 == 0 && mNumericArgsCopy[0] == field_0x87C) { fn_800B60E0(cmdLen, endPtr); field_0xEE5 = 1; field_0x87C++; } - mNumericArgsCopy[3]++; + mNumericArgsCopy[0]++; } break; case 0x10008: fn_800B61D0(rect, ctx, cmdLen, endPtr); break; case 0x30000: changeScale(rect, ctx, false); break; case 0x10009: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEE6 == 0 && mNumericArgsCopy[4] == field_0x880) { + if (field_0xEE6 == 0 && mNumericArgsCopy[1] == field_0x880) { fn_800B6110(cmdLen, endPtr); field_0xEE6 = 1; field_0x880++; } - mNumericArgsCopy[4]++; + mNumericArgsCopy[1]++; } break; case 0x1000A: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEE7 == 0 && mNumericArgsCopy[5] == field_0x884) { + if (field_0xEE7 == 0 && mNumericArgsCopy[2] == field_0x884) { fn_800B6140(cmdLen, endPtr); field_0xEE7 = 1; field_0x884++; } - mNumericArgsCopy[5]++; + mNumericArgsCopy[2]++; } break; case 0x1000B: // Sound if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEE8 == 0 && mNumericArgsCopy[6] == field_0x888) { + if (field_0xEE8 == 0 && mNumericArgsCopy[3] == field_0x888) { playSound(cmdLen, endPtr); field_0xEE8 = 1; field_0x888++; } - mNumericArgsCopy[6]++; + mNumericArgsCopy[3]++; } break; case 0x1000C: // "entrypoint" if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEEA == 0 && mNumericArgsCopy[8] == field_0x890) { + if (field_0xEEA == 0 && mNumericArgsCopy[5] == field_0x890) { fn_800B6170(cmdLen, endPtr); field_0xEEA = 1; field_0x890++; } - mNumericArgsCopy[8]++; + mNumericArgsCopy[5]++; } break; case 0x1000D: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEEB == 0 && mNumericArgsCopy[9] == field_0x894) { + if (field_0xEEB == 0 && mNumericArgsCopy[6] == field_0x894) { fn_800B6190(cmdLen, endPtr); field_0xEEB = 1; field_0x894++; } - mNumericArgsCopy[9]++; + mNumericArgsCopy[6]++; } break; case 0x1000E: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEEC == 0 && field_0x8EC == field_0x898) { + if (field_0xEEC == 0 && mNumericArgsCopy[7] == field_0x898) { fn_800B61B0(cmdLen, endPtr); field_0xEEC = 1; field_0x898++; } - field_0x8EC++; + mNumericArgsCopy[7]++; } break; case 0x20004: if (field_0xEE3 != 0) { if (rect == nullptr) { - fn_800B6450(rect, ctx, cmdLen, endPtr); + drawIcon(rect, ctx, cmdLen, endPtr); } else { - makeSpaceForIconMaybe(rect, ctx, endPtr); + calcRectIcon(rect, ctx, endPtr); } } break; case 0x10011: if (rect == nullptr && field_0xEE1 == 0) { - if (field_0xEEF == 0 && field_0x8F8 == field_0x840) { + if (field_0xEEF == 0 && mNumericArgsCopy[10] == field_0x840) { fn_800B5540(endPtr); field_0xEEF = 1; field_0x840++; } - field_0x8F8++; + mNumericArgsCopy[10]++; } break; } @@ -807,16 +930,19 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr) { - if (mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_22 && mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_DEMO && - field_0xEE0 != 0) { + if (mMsgWindowSubtype == dLytMsgWindow_c::MSG_WINDOW_22 || mMsgWindowSubtype == dLytMsgWindow_c::MSG_WINDOW_DEMO) { + return; + } + + if (field_0xEE0 != 0) { int arg = ptr[0]; - nw4r::lyt::Size textBoxSize = field_0x004->GetSize(); - nw4r::lyt::Size fontSize = field_0x004->GetFontSize(); - int i1 = getMaxNumLines(mMsgWindowSubtype); - if (arg % i1 == 0 && mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_31 && + nw4r::lyt::Size textBoxSize = getTextBox()->GetSize(); + nw4r::lyt::Size fontSize = getTextBox()->GetFontSize(); + if (arg % getMaxNumLines(mMsgWindowSubtype) == 0 && mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_31 && mMsgWindowSubtype != dLytMsgWindow_c::MSG_WINDOW_8) { - int u = 0; int v = 0; + int u = 0; + // similar code in fn_800B85C0 for (int i = arg; i < arg + getMaxNumLines(mMsgWindowSubtype) && i < 0x32; i++) { f32 f6 = getLineWidth(i); if (f6 > 0.0f) { @@ -830,42 +956,43 @@ void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext