55#include " hooks/Swf/items_Swf.h"
66#include " hooks/trampoline.h"
77
8+ #include < Pack/RPGraphics.h>
89#include < Pack/RPKernel.h>
910#include < Pack/RPSystem.h>
1011#include < Sports2/Sp2Cmn.h>
12+ #include < nw4r/g3d.h>
1113
1214#include < libkiwi.h>
1315
@@ -45,7 +47,7 @@ u32 InterceptBgm(u32 id) {
4547/* *
4648 * @brief InterceptBgm trampoline
4749 */
48- TRAMPOLINE_DEF (0x802B722C , 0x802B7230 ) {
50+ TRAMPOLINE_DEF (0x802B722C , 0x802B7230 ){
4951 // clang-format off
5052 TRAMPOLINE_BEGIN
5153
@@ -64,8 +66,6 @@ TRAMPOLINE_DEF(0x802B722C, 0x802B7230) {
6466 *
6567 ******************************************************************************/
6668
67- namespace {
68-
6969/* *
7070 * @brief Generates a random Mii favorite color
7171 */
@@ -117,8 +117,6 @@ kiwi::Color GetRandomFavoriteColor() {
117117 // r.NextF32(0.40f, 1.0f));
118118}
119119
120- } // namespace
121-
122120/* *
123121 * @brief Generates a random RFL favorite color
124122 *
@@ -241,7 +239,7 @@ TRAMPOLINE_DEF(0x801f546c, 0x801f5514){
241239/* *
242240 * @brief InterceptFavoriteColorHat trampoline
243241 */
244- TRAMPOLINE_DEF (0x801032c4 , 0x801032c8 ){
242+ TRAMPOLINE_DEF (0x801032c4 , 0x801032c8 ) {
245243 // clang-format off
246244 TRAMPOLINE_BEGIN
247245
@@ -254,6 +252,71 @@ TRAMPOLINE_DEF(0x801032c4, 0x801032c8){
254252 // clang-format on
255253}
256254
255+ /* *****************************************************************************
256+ *
257+ * Random Bowling Ball Color
258+ *
259+ ******************************************************************************/
260+ /* *
261+ * @brief Overrides the bowling ball model color based on the randomizer
262+ * settings
263+ *
264+ * @param mdl Ball model
265+ */
266+ void PatchBwlBallColor (nw4r::g3d::ResMdl mdl, kiwi::Color color) {
267+ ASSERT (mdl.IsValid ());
268+
269+ nw4r::g3d::ResMat bwg_ball_mat = mdl.GetResMat (" bwg_ball_mat" );
270+ ASSERT (bwg_ball_mat.IsValid ());
271+
272+ // Ball color is stored in TEV color 0
273+ nw4r::g3d::ResMatTevColor tevColor = bwg_ball_mat.GetResMatTevColor ();
274+ ASSERT (tevColor.IsValid ());
275+
276+ tevColor.GXSetTevColor (GX_TEVREG0, color);
277+
278+ // TODO: Patch the shader to use the TEV color
279+ ;
280+ }
281+
282+ void InterceptBwlBallColor (RPGrpModelG3D* pModel, RPGrpModelG3D* pModelMirror) {
283+ ASSERT_PTR (pModel);
284+ ASSERT_PTR (pModelMirror);
285+
286+ nw4r::g3d::ResMdl mdl =
287+ pModel->GetModelEx ()->getScnMdlSimple ()->GetResMdl ();
288+
289+ ASSERT (mdl.IsValid ());
290+
291+ nw4r::g3d::ResMdl mdlMirror =
292+ pModelMirror->GetModelEx ()->getScnMdlSimple ()->GetResMdl ();
293+
294+ ASSERT (mdlMirror.IsValid ());
295+
296+ kiwi::Color color =
297+ kiwi::Color::FromHsv (kiwi::Random ().NextF32 (1 .0f ), 0 .5f , 1 .0f );
298+
299+ PatchBwlBallColor (mdl, color);
300+ PatchBwlBallColor (mdlMirror, color);
301+ }
302+
303+ /* *
304+ * @brief InterceptBwlBallColor trampoline
305+ */
306+ TRAMPOLINE_DEF (0x804d1174 , 0x804d1178 ){
307+ // clang-format off
308+ TRAMPOLINE_BEGIN
309+
310+ mr r3, r5
311+ mr r4, r6
312+ bl InterceptBwlBallColor
313+
314+ TRAMPOLINE_END
315+ rlwinm r0, r4, 0x3 , 0x0 , 0x1C // original instruction
316+ blr
317+ // clang-format on
318+ }
319+
257320/* *****************************************************************************
258321 *
259322 * Random Island Time
0 commit comments