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,91 @@ 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+ /* *
273+ * Ball color is stored in TEV color 0
274+ */
275+ nw4r::g3d::ResMatTevColor tevColor = bwg_ball_mat.GetResMatTevColor ();
276+ ASSERT (tevColor.IsValid ());
277+ tevColor.GXSetTevColor (GX_TEVREG0, color);
278+
279+ /* *
280+ * Patch the shader to use TEVREG0
281+ */
282+ nw4r::g3d::ResTev tev = bwg_ball_mat.GetResTev ();
283+
284+ // TODO: Need to decompile GXSetTevColorOp to set the result of the shader
285+ #if 0
286+ // Texture color * 1/4 to keep pattern but lower color impact
287+ tev.GXSetTevColorIn(GX_TEVSTAGE3, GX_CC_ZERO, GX_CC_HALF, GX_CC_TEXC,
288+ GX_CC_ZERO);
289+
290+ // Multiply by ball color in TEV register
291+ tev.GXSetTevColorIn(GX_TEVSTAGE4, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0,
292+ GX_CC_ZERO);
293+
294+ // Activate shader stages
295+ tev.SetNumTevStages(tev.GetNumTevStages() + 2);
296+ #else
297+ tev.GXSetTevColorIn (GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_CPREV, GX_CC_HALF,
298+ GX_CC_ZERO);
299+ #endif
300+ }
301+
302+ void InterceptBwlBallColor (RPGrpModelG3D* pModel, RPGrpModelG3D* pModelMirror) {
303+ ASSERT_PTR (pModel);
304+ ASSERT_PTR (pModelMirror);
305+
306+ nw4r::g3d::ResMdl mdl =
307+ pModel->GetModelEx ()->getScnMdlSimple ()->GetResMdl ();
308+
309+ ASSERT (mdl.IsValid ());
310+
311+ nw4r::g3d::ResMdl mdlMirror =
312+ pModelMirror->GetModelEx ()->getScnMdlSimple ()->GetResMdl ();
313+
314+ ASSERT (mdlMirror.IsValid ());
315+
316+ kiwi::Color color =
317+ kiwi::Color::FromHsv (kiwi::Random ().NextF32 (1 .0f ), 0 .5f , 1 .0f );
318+
319+ PatchBwlBallColor (mdl, color);
320+ PatchBwlBallColor (mdlMirror, color);
321+ }
322+
323+ /* *
324+ * @brief InterceptBwlBallColor trampoline
325+ */
326+ TRAMPOLINE_DEF (0x804d1174 , 0x804d1178 ){
327+ // clang-format off
328+ TRAMPOLINE_BEGIN
329+
330+ mr r3, r5
331+ mr r4, r6
332+ bl InterceptBwlBallColor
333+
334+ TRAMPOLINE_END
335+ rlwinm r0, r4, 0x3 , 0x0 , 0x1C // original instruction
336+ blr
337+ // clang-format on
338+ }
339+
257340/* *****************************************************************************
258341 *
259342 * Random Island Time
0 commit comments