From fe7aa8371a9d0658d18714f3069eb54f24e4b1a3 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 19 Sep 2020 11:46:12 +1000 Subject: [PATCH] Attempt to decompile menuRenderItemMarquee --- src/game/game_0e5ce0.c | 327 ++++++++++++++++++++-------- src/include/game/data/data_0160b0.h | 8 +- src/include/game/game_0e5ce0.h | 2 +- src/include/game/game_0f09f0.h | 2 +- src/include/game/game_1531a0.h | 8 +- src/include/types.h | 6 +- 6 files changed, 246 insertions(+), 107 deletions(-) diff --git a/src/game/game_0e5ce0.c b/src/game/game_0e5ce0.c index 519167474..22346590b 100644 --- a/src/game/game_0e5ce0.c +++ b/src/game/game_0e5ce0.c @@ -35,10 +35,10 @@ const char var7f1adfb8[] = ""; const char var7f1adfbc[] = ""; const char var7f1adfc0[] = "%d\n"; -u32 var80071190 = 0x00000000; -u32 var80071194 = 0x00000000; -u32 var80071198 = 0x00000000; -u32 var8007119c = 0x00000000; +s32 var80071190 = 0x00000000; +s32 var80071194 = 0x00000000; +s32 var80071198 = 0x00000000; +s32 var8007119c = 0x00000000; u32 var800711a0 = 0x00000000; u32 var800711a4 = 0x00000000; u32 var800711a8 = 0x0000000b; @@ -58,96 +58,6 @@ u32 var800711dc = 0x32330000; u32 var800711e0 = 0x573a573b; u32 var800711e4 = 0x573c573d; u32 var800711e8 = 0x00000000; -u32 var800711ec = 0x20000000; -u32 var800711f0 = 0x00000002; -u32 var800711f4 = 0x0000000c; -u32 var800711f8 = 0x0000000a; -u32 var800711fc = 0xffffffff; -u32 var80071200 = 0x00000003; -u32 var80071204 = 0x00000033; -u32 var80071208 = 0x0000000a; -u32 var8007120c = 0xffffffff; -u32 var80071210 = 0x00000003; -u32 var80071214 = 0x0000000c; -u32 var80071218 = 0x00000003; -u32 var8007121c = 0x0000004b; -u32 var80071220 = 0xffffffff; -u32 var80071224 = 0x00000037; -u32 var80071228 = 0x00000013; -u32 var8007122c = 0x00000040; -u32 var80071230 = 0xffffffff; -u32 var80071234 = 0x0000003f; -u32 var80071238 = 0x00000013; -u32 var8007123c = 0xffffffff; -u32 var80071240 = 0x0000000a; -u32 var80071244 = 0x0000003f; -u32 var80071248 = 0x0000000a; -u32 var8007124c = 0x0000004b; -u32 var80071250 = 0xffffffff; -u32 var80071254 = 0x00000033; -u32 var80071258 = 0x00000017; -u32 var8007125c = 0x00000037; -u32 var80071260 = 0xffffffff; -u32 var80071264 = 0x0000003b; -u32 var80071268 = 0x00000017; -u32 var8007126c = 0x00000044; -u32 var80071270 = 0xffffffff; -u32 var80071274 = 0x00000043; -u32 var80071278 = 0x00000017; -u32 var8007127c = 0xffffffff; -u32 var80071280 = 0x00000011; -u32 var80071284 = 0x00000043; -u32 var80071288 = 0x00000011; -u32 var8007128c = 0x0000004b; -u32 var80071290 = 0xffffffff; -u32 var80071294 = 0x00000037; -u32 var80071298 = 0x0000001b; -u32 var8007129c = 0x00000048; -u32 var800712a0 = 0xffffffff; -u32 var800712a4 = 0x00000047; -u32 var800712a8 = 0x0000001b; -u32 var800712ac = 0xffffffff; -u32 var800712b0 = 0x00000018; -u32 var800712b4 = 0x00000047; -u32 var800712b8 = 0x00000018; -u32 var800712bc = 0x0000004b; -u32 var800712c0 = 0xffffffff; -u32 var800712c4 = 0x00000031; -u32 var800712c8 = 0x0000001f; -u32 var800712cc = 0x0000004b; -u32 var800712d0 = 0xffffffff; -u32 var800712d4 = 0x0000002b; -u32 var800712d8 = 0x0000001c; -u32 var800712dc = 0xffffffff; -u32 var800712e0 = 0x00000026; -u32 var800712e4 = 0x0000002b; -u32 var800712e8 = 0x00000026; -u32 var800712ec = 0x0000004b; -u32 var800712f0 = 0xffffffff; -u32 var800712f4 = 0x0000001e; -u32 var800712f8 = 0x00000023; -u32 var800712fc = 0x00000025; -u32 var80071300 = 0xffffffff; -u32 var80071304 = 0x00000025; -u32 var80071308 = 0x00000023; -u32 var8007130c = 0xffffffff; -u32 var80071310 = 0x0000002d; -u32 var80071314 = 0x00000025; -u32 var80071318 = 0x0000002d; -u32 var8007131c = 0x0000004b; -u32 var80071320 = 0xffffffff; -u32 var80071324 = 0x00000022; -u32 var80071328 = 0x00000034; -u32 var8007132c = 0x0000004b; -u32 var80071330 = 0xffffffff; -u32 var80071334 = 0x0000000c; -u32 var80071338 = 0x0000001e; -u32 var8007133c = 0xffffffff; -u32 var80071340 = 0x0000003b; -u32 var80071344 = 0x0000000c; -u32 var80071348 = 0x0000003b; -u32 var8007134c = 0x0000004b; -u32 var80071350 = 0xffffffff; GLOBAL_ASM( glabel func0f0e5ce0 @@ -7526,7 +7436,7 @@ Gfx *menuRenderItemScrollable(Gfx *gdl, struct menurenderthing *thing) char *streams[2]; char *inptr; s32 inheading; - s16 *unk14 = thing->unk14; + s16 *unk14 = thing->unk14.s16; u32 colour; s32 x; s32 y; @@ -10181,6 +10091,231 @@ glabel menuRenderItemMarquee /* f0eda30: 27bd0088 */ addiu $sp,$sp,0x88 ); +u32 var800711ec = 0x20000000; + +// Mismatch at 718 +//Gfx *menuRenderItemMarquee(Gfx *gdl, struct menurenderthing *thing) +//{ +// u16 *unk14 = thing->unk14.u16; // 84 +// char *text = menuResolveParam2Text(thing->item); // 80 +// s32 x; // 7c +// s32 y; // 78 +// u32 colour; // 74 +// s32 i = 0; // 70 +// s32 textwidth; // 6c +// s32 textheight; // 68 +// char string[] = {' ', '\0'}; // 64 - var800711ec +// s32 hasmore; +// u32 font2 = var8007fb0c; // 5c +// u32 font1 = var8007fb10; // 58 +// +// if (thing->item->param1 & 0x00000200) { +// font2 = var8007fb04; +// font1 = var8007fb08; +// } +// +// if (!text) { +// return gdl; +// } +// +// // 5b8 +// if (thing->unk10->unk40 < 0) { +// colour = g_MenuColourPalettes[thing->unk10->colour1index].unk18; +// } else { +// colour = colourBlend( +// g_MenuColourPalettes[thing->unk10->colour2index].unk18, +// g_MenuColourPalettes[thing->unk10->colour1index].unk18, +// thing->unk10->colourweight); +// } +// +// // 644 +// if (thing->unk10->unk0c) { +// colour = colourBlend(colour, 0, 127) & 0xffffff00 | colour & 0xff; +// } +// +// // 674 +// x = thing->x + thing->width - *unk14; +// y = thing->y + 2; +// hasmore = true; +// +// while (hasmore == true) { +// if (text[i] == '\0') { +// hasmore = false; +// } else { +// string[0] = text[i]; +// textMeasure(&textheight, &textwidth, string, font1, font2, 0); +// +// if (x + textwidth > thing->x) { +// hasmore = false; +// } else { +// x += textwidth; +// hasmore = true; +// i++; +// } +// } +// } +// +// // 718 +// // thing->x is loaded into a0 but should be t4. Additionally, the loads of +// // thing->x and g_ScreenWidthMultiplier are swapped. +// var80071190 = thing->x * g_ScreenWidthMultiplier; +// var80071194 = (thing->x + thing->width) * g_ScreenWidthMultiplier; +// var80071198 = thing->y; +// var8007119c = thing->y + thing->height - 1; +// +// if (var80071190 < 0) { +// var80071190 = 0; +// } +// +// if (var80071194 < 0) { +// var80071194 = 0; +// } +// +// if (var80071198 < 0) { +// var80071198 = 0; +// } +// +// if (var8007119c < 0) { +// var8007119c = 0; +// } +// +// if (var80071190 > viGetBufX()) { +// var80071190 = viGetBufX(); +// } +// +// if (var80071194 > viGetBufX()) { +// var80071194 = viGetBufX(); +// } +// +// if (var80071198 > viGetBufY()) { +// var80071198 = viGetBufY(); +// } +// +// if (var8007119c > viGetBufY()) { +// var8007119c = viGetBufY(); +// } +// +// if (var80071194 < var80071190) { +// var80071194 = var80071190; +// } +// +// if (var8007119c < var80071198) { +// var8007119c = var80071198; +// } +// +// gDPSetScissor(gdl++, G_SC_NON_INTERLACE, var80071190, var80071198, var80071194, var8007119c); +// +// func0f153d24(); +// +// if (thing->item->param1 & 0x00000800) { +// func0f153ce8(thing->x, thing->x + thing->width, 0xe); +// } else { +// func0f153ce8(thing->x, thing->x, 0xe); +// } +// +// gdl = func0f153628(gdl); +// gdl = textRenderWhite(gdl, &x, &y, &text[i], font1, font2, +// colour, thing->width + thing->x - x, thing->height, 0, 0); +// gdl = func0f153780(gdl); +// gdl = func0f0f50fc(gdl); +// +// func0f153d3c(); +// +// unk14[2] = thing->width; +// +// return gdl; +//} + +u32 var800711f0 = 0x00000002; +u32 var800711f4 = 0x0000000c; +u32 var800711f8 = 0x0000000a; +u32 var800711fc = 0xffffffff; +u32 var80071200 = 0x00000003; +u32 var80071204 = 0x00000033; +u32 var80071208 = 0x0000000a; +u32 var8007120c = 0xffffffff; +u32 var80071210 = 0x00000003; +u32 var80071214 = 0x0000000c; +u32 var80071218 = 0x00000003; +u32 var8007121c = 0x0000004b; +u32 var80071220 = 0xffffffff; +u32 var80071224 = 0x00000037; +u32 var80071228 = 0x00000013; +u32 var8007122c = 0x00000040; +u32 var80071230 = 0xffffffff; +u32 var80071234 = 0x0000003f; +u32 var80071238 = 0x00000013; +u32 var8007123c = 0xffffffff; +u32 var80071240 = 0x0000000a; +u32 var80071244 = 0x0000003f; +u32 var80071248 = 0x0000000a; +u32 var8007124c = 0x0000004b; +u32 var80071250 = 0xffffffff; +u32 var80071254 = 0x00000033; +u32 var80071258 = 0x00000017; +u32 var8007125c = 0x00000037; +u32 var80071260 = 0xffffffff; +u32 var80071264 = 0x0000003b; +u32 var80071268 = 0x00000017; +u32 var8007126c = 0x00000044; +u32 var80071270 = 0xffffffff; +u32 var80071274 = 0x00000043; +u32 var80071278 = 0x00000017; +u32 var8007127c = 0xffffffff; +u32 var80071280 = 0x00000011; +u32 var80071284 = 0x00000043; +u32 var80071288 = 0x00000011; +u32 var8007128c = 0x0000004b; +u32 var80071290 = 0xffffffff; +u32 var80071294 = 0x00000037; +u32 var80071298 = 0x0000001b; +u32 var8007129c = 0x00000048; +u32 var800712a0 = 0xffffffff; +u32 var800712a4 = 0x00000047; +u32 var800712a8 = 0x0000001b; +u32 var800712ac = 0xffffffff; +u32 var800712b0 = 0x00000018; +u32 var800712b4 = 0x00000047; +u32 var800712b8 = 0x00000018; +u32 var800712bc = 0x0000004b; +u32 var800712c0 = 0xffffffff; +u32 var800712c4 = 0x00000031; +u32 var800712c8 = 0x0000001f; +u32 var800712cc = 0x0000004b; +u32 var800712d0 = 0xffffffff; +u32 var800712d4 = 0x0000002b; +u32 var800712d8 = 0x0000001c; +u32 var800712dc = 0xffffffff; +u32 var800712e0 = 0x00000026; +u32 var800712e4 = 0x0000002b; +u32 var800712e8 = 0x00000026; +u32 var800712ec = 0x0000004b; +u32 var800712f0 = 0xffffffff; +u32 var800712f4 = 0x0000001e; +u32 var800712f8 = 0x00000023; +u32 var800712fc = 0x00000025; +u32 var80071300 = 0xffffffff; +u32 var80071304 = 0x00000025; +u32 var80071308 = 0x00000023; +u32 var8007130c = 0xffffffff; +u32 var80071310 = 0x0000002d; +u32 var80071314 = 0x00000025; +u32 var80071318 = 0x0000002d; +u32 var8007131c = 0x0000004b; +u32 var80071320 = 0xffffffff; +u32 var80071324 = 0x00000022; +u32 var80071328 = 0x00000034; +u32 var8007132c = 0x0000004b; +u32 var80071330 = 0xffffffff; +u32 var80071334 = 0x0000000c; +u32 var80071338 = 0x0000001e; +u32 var8007133c = 0xffffffff; +u32 var80071340 = 0x0000003b; +u32 var80071344 = 0x0000000c; +u32 var80071348 = 0x0000003b; +u32 var8007134c = 0x0000004b; +u32 var80071350 = 0xffffffff; + GLOBAL_ASM( glabel func0f0eda34 /* f0eda34: 27bdffa8 */ addiu $sp,$sp,-88 @@ -13134,7 +13269,7 @@ Gfx *menuRenderItem(Gfx *gdl, struct menurenderthing *thing) case MENUITEMTYPE_SLIDER: return menuRenderItemSlider(gdl); case MENUITEMTYPE_CHECKBOX: return menuRenderItemCheckbox(gdl); case MENUITEMTYPE_SCROLLABLE: return menuRenderItemScrollable(gdl, thing); - case MENUITEMTYPE_MARQUEE: return menuRenderItemMarquee(gdl); + case MENUITEMTYPE_MARQUEE: return menuRenderItemMarquee(gdl, thing); case MENUITEMTYPE_LABEL: return menuRenderItemLabel(gdl); case MENUITEMTYPE_METER: return menuRenderItemMeter(gdl, thing); case MENUITEMTYPE_SEPARATOR: return menuRenderItemSeparator(gdl, thing); diff --git a/src/include/game/data/data_0160b0.h b/src/include/game/data/data_0160b0.h index f3646358d..222593fab 100644 --- a/src/include/game/data/data_0160b0.h +++ b/src/include/game/data/data_0160b0.h @@ -139,10 +139,10 @@ extern struct hudmessageconfig g_HudMessageConfigs[]; extern u32 var80071170; extern u32 var80071180; extern u32 var80071184; -extern u32 var80071190; -extern u32 var80071194; -extern u32 var80071198; -extern u32 var8007119c; +extern s32 var80071190; +extern s32 var80071194; +extern s32 var80071198; +extern s32 var8007119c; extern u32 var800711a0; extern u32 var800711a4; extern u32 var800711ac; diff --git a/src/include/game/game_0e5ce0.h b/src/include/game/game_0e5ce0.h index 9721dc86c..66fd15629 100644 --- a/src/include/game/game_0e5ce0.h +++ b/src/include/game/game_0e5ce0.h @@ -36,7 +36,7 @@ char *menuItemScrollableGetText(u32 type); Gfx *menuRenderItemScrollable(Gfx *gdl, struct menurenderthing *thing); u32 func0f0ed264(void); void func0f0ed514(u16 *arg0); -Gfx *menuRenderItemMarquee(Gfx *gdl); +Gfx *menuRenderItemMarquee(Gfx *gdl, struct menurenderthing *thing); u32 func0f0eda34(void); void func0f0edb50(u16 *arg0); Gfx *menuRenderItem07(Gfx *gdl); diff --git a/src/include/game/game_0f09f0.h b/src/include/game/game_0f09f0.h index a34eddc0a..7e658c4b0 100644 --- a/src/include/game/game_0f09f0.h +++ b/src/include/game/game_0f09f0.h @@ -47,7 +47,7 @@ void func0f0f372c(u8 *arg0, f32 x, f32 y, f32 arg3, f32 arg4, f32 arg5, f32 arg6 void func0f0f37a4(u8 *arg0); u32 func0f0f38b0(void); u32 func0f0f5004(void); -u32 func0f0f50fc(void); +Gfx *func0f0f50fc(Gfx *gdl); u32 func0f0f5360(void); u32 func0f0f74a8(void); u32 func0f0f7594(void); diff --git a/src/include/game/game_1531a0.h b/src/include/game/game_1531a0.h index 52569215d..5d73fe871 100644 --- a/src/include/game/game_1531a0.h +++ b/src/include/game/game_1531a0.h @@ -22,9 +22,9 @@ u32 func0f153b6c(void); void func0f153c20(s32 x, s32 y, f32 arg2, s32 arg3); u32 func0f153c50(void); u32 func0f153c88(void); -u32 func0f153ce8(void); -u32 func0f153d24(void); -u32 func0f153d3c(void); +void func0f153ce8(s32 x1, s32 x2, u32 arg2); +void func0f153d24(void); +void func0f153d3c(void); u32 func0f153d50(void); u32 func0f153d88(void); void func0f153e38(u32 colour1, u32 colour2); @@ -43,7 +43,7 @@ u32 func0f1566cc(void); u32 func0f156790(void); u32 func0f156a24(void); Gfx *textRender(Gfx *gdl, s32 *x, s32 *y, char *text, u32 arg4, u32 arg5, s32 arg6, u32 colour, s16 arg8, s16 arg9, u32 arg10, u32 arg11); -void textMeasure(s32 *textheight, s32 *textwidth, char *text, u32 arg3, u32 arg4, u32 arg5); +void textMeasure(s32 *textheight, s32 *textwidth, char *text, u32 font1, u32 font2, u32 arg5); void textWrap(s32 width, char *in, char *out, u32 font1, u32 font2); u32 func0f1577f0(void); u32 func0f1578c8(void); diff --git a/src/include/types.h b/src/include/types.h index f1aae14cf..3088b615c 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6809,7 +6809,11 @@ struct menurenderthing { struct menuitem *item; bool focused; struct menurenderthing10 *unk10; - s16 *unk14; + + union { + s16 *s16; + u16 *u16; + } unk14; }; struct menucolourpalette {