From 6bb695e6b33ff34fa4c00d761510c476cc0c4ca7 Mon Sep 17 00:00:00 2001 From: WBmarioo <64marioluigii@gmail.com> Date: Tue, 10 Mar 2026 18:14:38 -0500 Subject: [PATCH 1/5] Fix Bob-omb Buddy and Cannon Lid (#1125) --- mods/star-road/actors/bobomb_buddy_geo.bin | Bin 3311 -> 4112 bytes .../cannon_lid_seg8_texture_08004058.tex | Bin 0 -> 4150 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/star-road/textures/cannon_lid_seg8_texture_08004058.tex diff --git a/mods/star-road/actors/bobomb_buddy_geo.bin b/mods/star-road/actors/bobomb_buddy_geo.bin index f7f376a1a24221956bdc179e806b638335ce128f..97619e7b82578fd370b3867a01af3d6efdf845fa 100644 GIT binary patch literal 4112 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 diff --git a/mods/star-road/textures/cannon_lid_seg8_texture_08004058.tex b/mods/star-road/textures/cannon_lid_seg8_texture_08004058.tex new file mode 100644 index 0000000000000000000000000000000000000000..c64a1cbe1bb9558f3685054fe7fc36a518954997 GIT binary patch literal 4150 zcmZ`+A*|y@5VcgY(4>-KprJu41qK=#ntfO8sjgIAqxLEp8U_Xi1_lNi1_lNO1_lP2 zP2U^utk?P1lSaGt&dhsnX4bj?&Kse{PywBm*3YP-@bI;{{8#QN3kx7 zpNgN?3I6>6TX{=TY?4$Gm%(yL(qgi(UrUm~QX0;5kJYWbzkkoO)n+#H(>ROwzRazL z90419`dSW)v*&mvmhmG_I4iL?1DBAG?>x7_3pq3oaJ`m1&*gr;=;LV^gOW7vP{pE_ow{CFK3^SdwM_Xj(il)&bdw&a1_JWl6x9`VqV5$ zQA^a*d;<@wd$cmfIB3qOUKVe8Gw|R$Gxp|_;aqdhzIjnfzNuwXZ6z<;piy-Y+i>4k z@+KBBY}GxVVK$@2!RF1ct70viO(}if%lSOWIF53?-lXexQr6({ju$@@Z-MXe42$@- z*SLre@o`=Nzbs4H_B%P8E^>d4a=G1Qw?9bTY@>LeE7aB3IP?v52wJ1F;Qxm0Ym~1m z$-0YVr zJ&nMRurDtut`m=JcM-Q?AH4opZ;V4eTGQxW>U{;i)!u6+Ki8bZ^>;~kPsOM1^>vi; z?(H_p2F7=*<3rrKiL@ana)kR&9>xz?;a(cP)@rVu+w|hvL0or*e&jv^1DY$~HIGs1 z`?TjXITSccQHO*am`inUA{>uT{mNtZneGIhL$4}v)qc{yy&&&hYG|)Lehd9OaOh#= z!g>%t8%A;Uet~a1!oAb}vriGe;To^JMn8ARb(94CZx45QJx94gXX*7n@XUL7Aimen z*>wF?lA;d!KjTOG11`1u*VmaAOVMdH^}4ql*jEQ<>@IE>P$Z5Fn|;1Qn3%fhb5cs zdIM z`)eFxe5(ytt%a{Y_Kw)bA#bH9J89azY`Y_7l6IB@dU8BJq{3_@-3@)8E!1CesRcE) zZ;I*zW;nz78wZCwx!{0)X6vn_CHsN7tPYZaN7kN|i{8`iAP#qh-we%d`iNut^zKdA z^LGLGdd@od8sN7q*a*;*CnhA{S$}2S;_rY$@R4L9MFHvz@jId zPnb(<^`S3g7#p-H7V7}*#=-Pj4eZ&k)XY5N>jCTKeo3V1GO3z0a3Bv_T{$)S(3dfc zWsZQUHHbL8fB$2AaB7hAuutVWtYN8KhD7=dU@{x*IlQ^N9;Ftv2-a z{tl~I;2m=}4Yu-34f&im!;M$f=y{mlaL)eFjI%vQ?~FshBQEe*TeA@F^B7K8iH{oK zdH(*;*WCB0&nRP^Tz%ihcSv@MBfFUo7^qG*Rl9^us?Rrm0aOB`$Tzs z{PNt#>)*bsz(3Snx#iP*MDdGr;_Cc({mKV>&qY^Xmk`HXd}sN?-@w4K_jYFUZ90v| U`}wEY^YtJP^9{LiW;~JqKXep!b^rhX literal 0 HcmV?d00001 From 1f3de4fe0afb2567071cdac44ba2fa1e19aec533 Mon Sep 17 00:00:00 2001 From: ColbyRayz! <118496277+ColbyRayz@users.noreply.github.com> Date: Tue, 10 Mar 2026 16:15:00 -0700 Subject: [PATCH 2/5] fixed error models in sm74 jrb area 2 and mad toads transparency (#1126) --- mods/sm74/levels/level_jrb_entry.lvl | Bin 137970 -> 137978 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/sm74/levels/level_jrb_entry.lvl b/mods/sm74/levels/level_jrb_entry.lvl index 712df327f80b54efe8bb17455c4832518db9506b..fd757d73e9fdeefbf3be661354297187ce9324a1 100644 GIT binary patch delta 9607 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 delta 9624 zcmV;JC1=|DwFvUH2nj@4PES)pNlu@E3AG6U_4I#Thevg74FjKKy9aldQrz9$-JygK z0t7+=A-GF%DNvl^MT@&Tl;SQ0iWGN(TfQ}el=k+$aR2zap5Iz~&R$36%;C(L_TC5o zhv2b)wEr{zr~XgCGymuQul!&7zW}fNU;DrFf9wCoKL)(@`S|)R9Ayj~WsI*L`t;f# z`N4k=N(B56hU$k1WQ-W1$UEl`l>i1y31o=`;z$93v~OgQfw2MxIbcz26bl8QI3N~^ z>l?*`92X@(@nK0E5FeJrht~m66QIN>5lV=XfJ7*%ZI3ZbH)Fe-tHqhhEeD2~dY(x?xgsP)zs4A)fs-fDb7OIKrfLf?Ns)y>L2B02lj2fYa=sVB|HAR7_2?~D# zfv7nOM$J$N2u3Y@qfpcewM4B!E7TT+p*AQSgrWAR9g0AapdIRnqEH9a2}Gf;s0-?h zx`8gJC+dN^qh6o~>Vxk4^+pfDeZRiQI~sucqkian&>sy(gU~=U1PnsM(J(X=jR3>Y zD3s2BBuWd?`Tu~tqp@fV8jXGgW6*yDG#-sZ6Tx^i1x-ei&{QxPO-IwvPiO|1hGwH# zXeOEiW}$g#F8UeG2XoN^-{=>#2rWd5!6LK_Ek#SvaL2L>(E-X2CWBc z(I&JJZ9tpBMzjrWMO)Bzuodk>JJAlb8|*~CqP=Jj+6VTc186_`4IKpg(Gh=i7#%`K z!C{Ew=omPRPCy)nxzp$rI*HDJQ|Nbe4xL5k!8!B?x`-~IOW-29imsr`=udD3UGt4@ zq8sQss^)(k>K$|&-9mT4ZS(-$NB7V}a34jZ$LJAy0v@C1=oxy7UVvxlHF||!qBr0b zib3ztTjarSp(5;${V)dpxR-xF#RM}zG53uWmRMj7BzD+hg9CuYad2!L3&#bqaXjBB zAx?nf<3u0YuYI5|!QQsA^W4Ni^IfiyS+{syPV--2&&W}FFU#92Tl zoE>MwS#b`K4d=$Wa88^DAa{2sgyv zfkwC~4#Z7x5D3KMJ;AscZVrNROWXp7;8vgoZi8FnP#gwY;|Ls%+v0X09JhxWjw2zr z$5FV0Z!Q9AB#45gk&u5o<4(9E?gBdDu24JSZjig;9=N-2t~1nbpa(4N2Dvxxg?r*Y zpcn3s`{BNL0O*GY;eq&jJQxhb!|+f%1P=#8@hChJkH9~Gk$5Z~gGb{Z!5BONkH_Qi zL@*vt!ISYMJQYmF)A2O?6P^L4;n{c=o{8sxS$H0vi+{%R!CZg52rtA7@GoE?UW%9C z#dsN5f>+`dcsX7LR^YXG4PK4cfi-v|-hkKRO<)7winrj+cpKP)ci^R-?RY2N4s{RS zjd$U_U^o5^@58_1{a_zHgb(5a_%Jw#kKv>E2tE#u;#2q}K7mhzllUAyi_hTS!C8C} zU%=<_AK(JMf-isLOZY0djIZNs_)mNTT*J5VEqoK-0k`m7-{>CXyZAojd-wt5`}h%l z2umJ=hd3JQLzwZtegLAO;{oJn_$hvZpM$6Pg>Up4zrru^8}JIp;CJ{f_K>$w5%DK} z1Oup^Bpya6A%GDM!H6K5C?bI-##b$5OB@M+*WP6TBo==}0IU@YSO@~M4svYBu}K`@ z-J-V&$O5(+2gHS7Bp&2=BtAquk^pi7k`N*RNd%FAB!q%L9&zFAQ#C;@{&BH zASpodlOlhlFeyZefuf`&DM5;ZlB5(VOUjVaqyi~V%8|;X5~)b4k*cH$sYz;(>ZA^- zO=^+)q#mhD8j*&i0ck?MBaKNAX-Wb~a}rFNk(Q(d2_daXC}~C7k}%SSv?CEDoOB?O zq&?{fqbPVcSv*}xXVQsu1)WJZsGUi7sGUg<$lZTQPpI8VFUUPfZ>T*tPJyLA z!DxRHT33WFA;R7Lvu} z7qSQ}CQHb2vWzSR%gG9eMab7Tmb@Vz8bjWZ7^r>}Q$+nKqm&XVAaj4J zsiKlPYN?^IX)GE* zLo?G%G$Z7UGz-m6v(c+*PH_cD;(Y&+}El3N{qO=GtOiR$>v>1#_(UP<* zEkjGw^6;u0j4RR#va2lD4OvXh#}FyV5SSGwlw!8|_7V z(jK5Url?MDaEf%JPiln$YT=?FTU4x>NNQFJ67OUKaBbUYnLf24nt=tMe! zPNh@mWICNrqd(DEbS9laf2MQjY&xILqjTvZx{xlQOXy1=tFRmK8EmidtXIEj)vKX;4XbepVBAb8GTM)(Ud*X`2lz9@C?gC5${3SOFb*VB%re6?u*^YN763Vb#e#nbV6h$n460w9JF-yXdvt%qONX}BQ)GQTC2~x8(EImud(t`Bt z8%uy-POLlY#=5dztS9Ti`m#Q(HyeMz`m=s)5F5z8XG7T# zHkgfI!`U$Q0~^IgvaxIo8_mYEaqLGniA`h^*i<%!O=i>CH1-pl#b&Y@>}NKI&1Uo2 zJT{jtVhh;?1zXP6u+?l8ThG?9wO~El0I{BJgjmlu!FVIv46%`I z0h`!Xh)rx8*uj6cgH3FwukM1_!FGe4Y!AdvwijY2`xRm*+Xu0e{RXjj@a|04LZ;b#aqS<5ih&^LZ*%S7Xy z&N$_YOD?$OhHD;+2XF^s@z^{bkIUomgggO{&y(=PJP}XMlkucH6;H`i@U%P)PYu%Y zbUXw9hNpiA8Thw6Gta~`g3LS%&(5>)tROqj!E^ImJSWJ_^YHvUAI}T&^8&muFT@Li z!n_DC&WrJ)pg1qVOY>5^By77ZFT*SF^1K|Vz$@}9yfUu@s_?21Rd_XClh@$YK}}wZ z*X4D1ZBUoj;|+NOULQ2%jd&CO9d8Vp@Ic;-2l0QVpcxP5EqDlT4qEV*5G{Bs-iEj4 zp*)1zci@q{Gw;MZ@@~8s&NF~yXbRwHf1rVA zD83VoMI-Q?Xd;3{QxOP)L^Ba0nu}l%B3g)0(Mq%gp`x{DE5bw@&{l+t_M)AL0PRJj z=qRE@2hdS;5?w_X(OL8m-9v|;#Bp&smg!_#nFgej>E*XFgZu`3 zD>KS0GPBGCvdFA5hs-XsfgCcY%p-HlTp*9kD+|c{G9M@)3(6w0uq*_M$fB}@EG~xWffUd){xafe@$6S)|GW+ZP`H9 zm-S?0*+@2&fwGDGPBxQ4vZ)M_&1JA`C0oiCvW;vlLuFeT2HR;TBV@SjAR}da*-3Vk zQL?M-B0I|-vb*did&^$3C+IEvK=hV*G)8tQbmYgYP$e-mLIa|(`^Wu*U7bV4Ol1FL#&eDtbxB=Qf2ykm>V~=wOP4nZ z0v~_yQoVwB3CmuA*AP#k<285#`HgxD`K@{f@m9qsf9ok%Ct$#hbkM5oZnVVqj0(kXR1omQvO8T2Th*c zokeHX+2K_-olED`Idoo~N9WcBbbg&r7uJ7;bU|HA7u7{{NnJu0*JX5RT}qeN<#btH zNmtYrbX8qNSJsqP*VS|_T~pV9aUES-*VpxQUEN4G)D3hK{he;CgLG3JsGI9x-AuRC zEp&)(twVJy-ByR`HlVEz*X?yX9Rb?wNQm~j14Mfr1vyH0gox6eAa~N8VYaL80wRB5 z&RaV}?yS2(bcXqEpgZL5x`*zqd+DB_x9+3+>wdZ~=&uLpL3*J69t_fh^)NkD4*|pU za6L+o)FZ$s{evE>$LP^uto~6?(Bt(uFhNh$Q}kp#2~5#b^>jT={{*J%8G5#!rDuZK zdXAo_=jxxqJUw48(hKzhut@)+m+F5ddNEk4m+6&ygQ#EJUZYoowR)Z2s5j{K zV58oox9Tl=GuW!P>79Cq-VS!^U3#zHqj!V7`d7VQ|EBkW{rZ6Rc&d61>qGjWJ^~Ku zS|x(`WU0a8CcBFX{{W61b?Z>MQ!P{u5l$H}rpXeNEp4 z*YzEJTi?=m!EOCO-`Dr_LvUY5>&N<$egYor=lYp`s$YO-`n7(gUxL^AjgHap^ji?4 zJq8(n;|Gwzh8b!IV1^rIq!Bj0A~VB9248b0&z@Slfc9`@jwET&?GU5O(KxQ zBsD2aa+3_CFeyzMliH*LX-t1w^NmSw(t&SG29wETG~a?uCbP+AvYIR)o5^l+nVcpE z$YpYyd?v5S1M->trjRLU3V=eUFhn6!#1uEhOi@tWlz=F1NUeDGka% z6oEC$n{uWsC~qo2u3#!cR4|nwSAy+U1cgmy-}==|RZ|62Gu2HkQ`3Lc0JThQQ_s{j zbwE8+-+2G`*Nsd=(*S&D8XJ%2s;8+5G)+KL6J(m3VABjVHzB5#X=z%3RwmShnKq_1 z2s3R>I}>5TK|9mlM41jI5=5Dfri1q0y-liAmWBQr_roZV2 z2AJ>7U^B=JG(*53Gt_@K8exW;VP+&4Zbq9Q%qTG0j4|WPk7g_wXU0Q}GZP?BFcZxb zGucc6Q_NIf{RvDp(;%jr=@3)R42Y?)?hN1hv&}3s6U;VqAkQ&B`(Dk3JlD*Fm}}-k zo)6oa2Yxb(%tEsOEHb~CrDlm)43?W^V2N1)vBa!|SORk^pss&{yvnSGyxOdRSZ&rq ztTyW)R-5$@tIY@eHGPP5DGHG9l%u-E(w zvDfT_*bB4!z;6)VzCGrE*$?(W$6<5G90Z5W5p&!eGe^O3a{}VHISFyxoPvDHoQ61M z&Okn6&O$zG&Y6D;=DhhGTrd|QUo?L}Tr`&;Uow{=E}1J3m&{ejSIwUgSIsrZ*L>T* z279{hTmP21X>Nd9=C-+K?wUK`p1E%xnTO^9cw`=%r{;-?22ag1^U}O9&%sOc%Dgpi z%xm!0yfc2*V`GfR`dNP%VT*tV#uyOD#8L=i8DwTTgn)mMfGVxA+A83z1=QHn~k^lY-WY>;hg13?gMp(&{8d({kb zGaC#!*fxg}G$v&2F_@z&5)b@^-re@(#Px?y`{Bd9=FH93479>v8U}RaK@gs=k4$I95`<; z*h}^gdl6i+m+hbSs=WgKwAbuSd&6D_H|;HmoAx&3+x8B`ZJ50SyxsTgU2qj%J+yxh z?0xXiKC(}2w0#Vo*r)b|eQuwD7xtxnV_(}>;EjE2Jub$+voTQp9Cpb01MK}z*N`a$ zb__Ce9D+Fk!JLF(PQeo6G~lo_z&U3@fQ#kgx;QR2i0k6Hgf4-L4-&dWE~!i65`&~J znM>(Xxa1(EOXbqKG%htr>(asNZ(M(RkkVyvnOsKqEy(0DyKFA2%L1~&S~*<~mmTDE zxm;eC$K?ijT|QUP6>#}ML01T(peqbf&=qmTT`^Y_6o*SKHNcH9>7x$JKZBTwPG#HGrt^8bW_==o&#Z zbd4bzy6;?57wDRRrY^`ecfqciYw23J5YW=Kf@lfLT7giAVCV>QZCq>D7PN8gT!ae; z?Ob~o%yfm0u24I>UaqI>0eZRKuAl4c`hb3} zzZ>YjcLTscH^>cjL)>66)D3@gBi#r$9E^0M+!#07{Q$z^# zWH-f4b3eJMV49omX1SSe2AJh$ySeUXHwVmh^V~wWz|D7yzyi0#Eq1@SrC_mJ;g-8) zZY5am*0|Mfm0Jr|yA5u=Tjw@{^=^yX>^8ZrV6)rdw!3X^C)n=xxZQtlm)i?=yWiYC z_p93v_PImupgZ6WgM;pvJL->Yljg;HfL& zDe2L1!yqOT}zteV`}J`yTxFkELcv^HLF^pI^JD(>!Y|lB2(W zjuKY*(E71$%(MP9-}5iF-G25!ZU1sxa?q2lT%AV{Z<8P!;>i-rqb0%+%QM`#9!{y#=$!Bqr_s|GwQ6@2~ip5m9hy zhPU)x?)5^WT9pldjSMLn6#4P^o3~C#Yn^Q8gt1NgJA z>-E#uVqHXE)!X2xE*_BLUoM~WAwiu&%13-`n`>*vD)Zt?ZEX_7+N%TZ{=Ln6pRX4Y z0cWmyM2C<2_59(w=`H`b&nJM+auE@2n+3uBu3cD2RIPS@L7l@t-S+ySr%kN)eeH?) z`+c%xWJpjO@0SDI1ZuSn3Jd%AK~9Ly;W9n`&%>$Mv28o=2lMHkablLK9Y_4*W2DfT zqt3_gx#73p#q(6v9?!R*wRmqrCBr&~`0fP03-v>HrviSX-VXZ5d5!hy8v3}-$L>JS zTA!lx)W)0J@I~1 zSijHjY-QmwAS9|)WJKrBpW7m>_YPC=D|(APK4;TJ*YTSl)6nyU-h7wg8KGJyVxafcGCBXO98643mB(f{qcq2dFOuM9hbL;-rH(%G>qasWE)d+vTRk6t*7N&N{XbOnq2dpfe5lk{ea8~({jmhW z-TuR&cpvgoaR2vT1m!{^J}l1OB}akm*>mK}p56OCvhokVB7!5rJ~f17&sm^A^ZefV zyfE+mV~_*(K|l2V>klMv^T&pNIWOMnl=#zm3+WW{es|TY)v8^&T8Yx|yzWV-z5i!_ z{`Z^U-g6!l8S4A;OwHrJ|90|jF|b`|yO6+^ArYVNF>Z%o_)?4tY|$}1IIv|{L^IfZ zj?WwZd3tgL{2ujR?`e}8v5KR^C>|MvFt_@3QAeI);J%DvOt z{k1$KJSwuQ_o7IG|9)6sGyeS0OYkF}%5_TAH67sbKd?DGrg}fF)I6Qm)3<+!j-*(O5X|V*)@0+)OEhD{) zKW?`q9FG6TAISgmiFp1$d?IYFhZF*y1^86{hg5UaiR{2hm zOZnNV5y2rr;eo;M*!nM9kC&g>GHtjfoZ&^y!P|teE;rJeYOGb6%f)quvtV<)c^5r{2qG46YxG@{NXqP?B7qH z|6jNKf1X$GM2zowARyqMXAgZ^?cY!AUtbPiJbRz*CjP&lBkwWhdjGqB?!TPG&$g5F zzn!YT-tm{u=wI8kzFl_+X_+rDDl*7>V~>dJ8rU&BsAXtij`zR9R>jTmXc^q*qU^&* zbEvJ~rd!k!e>IsOqC;FXcp4|!eM2`{Nb2{yw O=q@BC=KlfZ2SWviu*Tv5 From 52446ded91f151aa9f1e21500075693e0c75aa30 Mon Sep 17 00:00:00 2001 From: Altiami Date: Tue, 10 Mar 2026 16:15:25 -0700 Subject: [PATCH 3/5] Merry-Go-Round Fixes (includes fixes for rooms and remote object-spawned objects) (#1094) --- src/engine/behavior_script.c | 17 ++++++++++- src/engine/surface_load.c | 5 +++- src/game/behaviors/bbh_merry_go_round.inc.c | 31 +++++++++++++++++++-- src/game/behaviors/boo.inc.c | 16 ++++------- src/game/object_helpers.c | 22 ++++++++++----- 5 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index bd6218775..8af14f249 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -797,7 +797,22 @@ static s32 bhv_cmd_load_collision_data(void) { // Command 0x2D: Sets the home position of the object to its current position. // Usage: SET_HOME() static s32 bhv_cmd_set_home(void) { - if (!(gCurrentObject->coopFlags & (COOP_OBJ_FLAG_LUA | COOP_OBJ_FLAG_NETWORK))) { + // COOP: only set home via behavior for the following cases + if ( + // if the object wasn't created via Lua + !(gCurrentObject->coopFlags & COOP_OBJ_FLAG_LUA) + // if the object wasn't created via network + // OR + // the object has never had its home set via behavior AND its home is default (e.g. (0, 0, 0)) + // (this case handles an object that needs its home set via behavior after being spawned by another player) + && ( + !(gCurrentObject->coopFlags & COOP_OBJ_FLAG_NETWORK) + || ( + !gCurrentObject->setHome + && gCurrentObject->oHomeX == 0.0f && gCurrentObject->oHomeY == 0.0f && gCurrentObject->oHomeZ == 0.0f + ) + ) + ) { gCurrentObject->oHomeX = gCurrentObject->oPosX; gCurrentObject->oHomeY = gCurrentObject->oPosY; gCurrentObject->oHomeZ = gCurrentObject->oPosZ; diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index d78d7999d..345a73202 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -806,7 +806,10 @@ static void load_object_collision_model_internal(bool isSOC) { for (s32 i = 0; i < MAX_PLAYERS; i++) { f32 dist = dist_between_objects(gCurrentObject, gMarioStates[i].marioObj); - if (dist < tangibleDist) { anyPlayerInTangibleRange = TRUE; } + if (dist < tangibleDist) { + anyPlayerInTangibleRange = TRUE; + break; + } } // If the object collision is supposed to be loaded more than the diff --git a/src/game/behaviors/bbh_merry_go_round.inc.c b/src/game/behaviors/bbh_merry_go_round.inc.c index 3f38561c9..6cf25c912 100644 --- a/src/game/behaviors/bbh_merry_go_round.inc.c +++ b/src/game/behaviors/bbh_merry_go_round.inc.c @@ -10,6 +10,9 @@ * in the enclosure nor in the room around it. */ static void handle_merry_go_round_music(void) { + // COOP: raise scope of this variable since floor check is no longer strictly tied to music + u16 marioFloorType = 0; + // If the music should play, play it and check whether it still should. // Otherwise, don't play it and check whether it should. if (o->oMerryGoRoundMusicShouldPlay == FALSE) { @@ -23,7 +26,7 @@ static void handle_merry_go_round_music(void) { // Get Mario's floor and floor surface type struct Surface *marioFloor = NULL; struct Object *marioObject = gMarioObjects[0]; - u16 marioFloorType = 0; + // COOP: `marioFloorType` originally here if (marioObject) { find_floor(marioObject->oPosX, marioObject->oPosY, marioObject->oPosZ, &marioFloor); @@ -37,7 +40,9 @@ static void handle_merry_go_round_music(void) { // The cur_obj_is_mario_on_platform check is redundant since the merry-go-round // has surface type 0x1A, so Mario cannot be on the merry-go-round // without being on a floor with surface type 0x1A (SURFACE_MGR_MUSIC). - gMarioOnMerryGoRound = cur_obj_is_any_player_on_platform(); + + // COOP: `gMarioOnMerryGoRound` is used to determine if the merry-go-round Boos should be active + // for co-op, this means that this check needs to be separated from the music check, since music is client-side. if (cur_obj_is_mario_on_platform() || marioFloorType == SURFACE_MGR_MUSIC) { // If Mario is in the merry-go-round's enclosure, play only the merry-go-round music. play_secondary_music(SEQ_EVENT_MERRY_GO_ROUND, 0, 78, 50); @@ -60,6 +65,28 @@ static void handle_merry_go_round_music(void) { cur_obj_play_sound_1(SOUND_ENV_MERRY_GO_ROUND_CREAKING); } } + + // COOP: floor check happens here + // `marioFloorType` refers to the local player's character + gMarioOnMerryGoRound = marioFloorType == SURFACE_MGR_MUSIC || cur_obj_is_any_player_on_platform(); + if (!gMarioOnMerryGoRound) { + // check the other Marios' floors + // starting at 1 since local player was already checked + for (s32 i = 1; i < MAX_PLAYERS; i++) { + if (!is_player_active(&gMarioStates[i])) { continue; } + + struct Object *marioObject = gMarioStates[i].marioObj; + if (marioObject == NULL) { continue; } + + struct Surface *marioFloor = NULL; + find_floor(marioObject->oPosX, marioObject->oPosY, marioObject->oPosZ, &marioFloor); + + if (marioFloor != NULL && marioFloor->type == SURFACE_MGR_MUSIC) { + gMarioOnMerryGoRound = TRUE; + break; + } + } + } } /** diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 37bd4b6fe..5561e19c3 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -56,16 +56,11 @@ void bhv_boo_init(void) { static s32 boo_should_be_stopped(void) { if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - for (s32 i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].currentRoom != BBH_DYNAMIC_SURFACE_ROOM && gMarioStates[i].currentRoom != BBH_NEAR_MERRY_GO_ROUND_ROOM) { return TRUE; } - } - return FALSE; - /*if (!gMarioOnMerryGoRound) { + if (!gMarioOnMerryGoRound) { return TRUE; } else { return FALSE; - }*/ + } } else { if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { return TRUE; @@ -384,9 +379,7 @@ static void boo_chase_mario(f32 a0, s16 a1, f32 a2) { if (boo_vanish_or_appear()) { o->oInteractType = 0x8000; - - u8 isMerryGoRoundBoo = (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)); - if (!isMerryGoRoundBoo && cur_obj_lateral_dist_from_obj_to_home(player) > 1500.0f) { + if (cur_obj_lateral_dist_from_obj_to_home(player) > 1500.0f) { sp1A = cur_obj_angle_to_home(); } else { sp1A = angleToPlayer; @@ -535,7 +528,8 @@ static void (*sBooActions[])(void) = { }; void bhv_boo_loop(void) { - if (o->oAction < 3) { + // COOP: only sync when Boo isn't in a death state + if (o->oAction < 3 || o->oAction == 5) { if (!sync_object_is_initialized(o->oSyncID)) { struct SyncObject* so = boo_sync_object_init(); if (so) { so->syncDeathEvent = FALSE; } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 695a3fbd0..f0bf4d162 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -2942,19 +2942,27 @@ void bhv_init_room(void) { void cur_obj_enable_rendering_if_mario_in_room(void) { if (!o) { return; } if (o->oRoom == -1) { return; } - if (gMarioCurrentRoom == 0) { return; } + // COOP: if any active player character's room is 0, then either: + // 1) There are no rooms in the area + // 2) They are on an object surface with no explicit room + // In vanilla, a room of 0 stops the game from checking if the object shouldn't be rendered + // In coop, this needs to be respected to ensure the object remains active in areas with rooms u8 marioInRoom = FALSE; + // check if any player character can "see" the object's room for (s32 i = 0; i < MAX_PLAYERS; i++) { - if (gMarioStates[i].currentRoom != 0) { + if (is_player_active(&gMarioStates[i])) { + // TODO: separate rendering and activation + if (gMarioStates[i].currentRoom == 0) { return; } s16 currentRoom = gMarioStates[i].currentRoom; - if (currentRoom == o->oRoom) { - marioInRoom = TRUE; - } else if (gDoorAdjacentRooms[currentRoom][0] == o->oRoom) { - marioInRoom = TRUE; - } else if (gDoorAdjacentRooms[currentRoom][1] == o->oRoom) { + if ( + currentRoom == o->oRoom + || gDoorAdjacentRooms[currentRoom][0] == o->oRoom + || gDoorAdjacentRooms[currentRoom][1] == o->oRoom + ) { marioInRoom = TRUE; + break; } } } From 5ca41153a61b22539927c2107151c60ae7f510c5 Mon Sep 17 00:00:00 2001 From: EmeraldLockdown <86802223+EmeraldLoc@users.noreply.github.com> Date: Tue, 10 Mar 2026 18:33:38 -0500 Subject: [PATCH 4/5] Fix freecam not being toggleable after teleport warp (#1133) This was happening because the previous mode would be reset before it was actually called. It was unique to `WARP_TYPE_SAME_AREA`. The solution is explained in the code comment. Also added some unused keywords to suppress warnings. --- src/game/camera.c | 16 ++++++++-------- src/game/level_update.c | 9 +++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/game/camera.c b/src/game/camera.c index 9983130d9..962e0fb3e 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1781,7 +1781,7 @@ s32 unused_update_mode_5_camera(UNUSED struct Camera *c, UNUSED Vec3f focus, UNU return 0; } -static void stub_camera_1(UNUSED s32 unused) { +UNUSED static void stub_camera_1(UNUSED s32 unused) { } void mode_boss_fight_camera(struct Camera *c) { @@ -5614,7 +5614,7 @@ void set_focus_rel_mario(struct Camera *c, f32 leftRight, f32 yOff, f32 forwBack * @param forwBack offset to Mario's front/back, relative to his faceAngle * @param yawOff offset to Mario's faceAngle, changes the direction of `leftRight` and `forwBack` */ -static void unused_set_pos_rel_mario(struct Camera *c, f32 leftRight, f32 yOff, f32 forwBack, s16 yawOff) { +UNUSED static void unused_set_pos_rel_mario(struct Camera *c, f32 leftRight, f32 yOff, f32 forwBack, s16 yawOff) { if (!c) { return; } u16 yaw = sMarioCamState->faceAngle[1] + yawOff; @@ -7606,7 +7606,7 @@ void cutscene_unsoften_music(UNUSED struct Camera *c) { seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60); } -static void stub_camera_5(UNUSED struct Camera *c) { +UNUSED static void stub_camera_5(UNUSED struct Camera *c) { } BAD_RETURN(s32) cutscene_unused_start(UNUSED struct Camera *c) { @@ -8133,7 +8133,7 @@ BAD_RETURN(s32) cutscene_dance_rotate_move_towards_mario(struct Camera *c) { /** * Speculated to be dance-related due to its proximity to the other dance functions */ -static BAD_RETURN(s32) cutscene_dance_unused(UNUSED struct Camera *c) { +UNUSED static BAD_RETURN(s32) cutscene_dance_unused(UNUSED struct Camera *c) { } /** @@ -9089,7 +9089,7 @@ BAD_RETURN(s32) cutscene_death_stomach_goto_mario(struct Camera *c) { /** * Ah, yes */ -static void unused_water_death_move_to_side_of_mario(struct Camera *c) { +UNUSED static void unused_water_death_move_to_side_of_mario(struct Camera *c) { water_death_move_to_mario_side(c); } @@ -9377,7 +9377,7 @@ BAD_RETURN(s32) cutscene_enter_pyramid_top(struct Camera *c) { } } -static void unused_cutscene_goto_cvar(struct Camera *c) { +UNUSED static void unused_cutscene_goto_cvar(struct Camera *c) { if (!c) { return; } f32 dist; @@ -9543,7 +9543,7 @@ BAD_RETURN(s32) cutscene_read_message_start(struct Camera *c) { sCutsceneVars[0].angle[0] = 0; } -static void unused_cam_to_mario(struct Camera *c) { +UNUSED static void unused_cam_to_mario(struct Camera *c) { if (!c) { return; } Vec3s dir; @@ -10972,7 +10972,7 @@ void cutscene_palette_editor(struct Camera *c) { &gDjuiPaletteToggle->base, ( m->action == ACT_IDLE || - m->action == ACT_PALETTE_EDITOR_CAP + m->action == ACT_PALETTE_EDITOR_CAP ) && !capMissing ); } diff --git a/src/game/level_update.c b/src/game/level_update.c index 7a69632d3..1ad390601 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -18,6 +18,7 @@ #include "sound_init.h" #include "mario.h" #include "camera.h" +#include "bettercamera.h" #include "object_list_processor.h" #include "ingame_menu.h" #include "obj_behaviors.h" @@ -471,6 +472,14 @@ void init_mario_after_warp(void) { if (gCurrentArea) { reset_camera(gCurrentArea->camera); + if (sWarpDest.type == WARP_TYPE_SAME_AREA && gCurrentArea->camera->mode == CAMERA_MODE_NEWCAM) { + // When we warp to a level in the same area, the camera mode never has the chance + // to reset. This is bad if our camera mode is newcam, since when init cam is called + // our old camera mode will be set to newcam, which causes newcam to not be able to be + // turned off. The fix is setting our mode to newcam's old mode + gCurrentArea->camera->mode = gNewCamera.savedMode; + gCurrentArea->camera->defMode = gNewCamera.savedDefMode; + } } sWarpDest.type = WARP_TYPE_NOT_WARPING; sDelayedWarpOp = WARP_OP_NONE; From 8b4fadc89e0121514259f4e568fb0ab436920495 Mon Sep 17 00:00:00 2001 From: Blockyyy <88585273+Blockyyy@users.noreply.github.com> Date: Wed, 11 Mar 2026 01:07:29 +0100 Subject: [PATCH 5/5] what happened (#1138) --- autogen/convert_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py index 0ec22b12c..9a9f7d53a 100644 --- a/autogen/convert_functions.py +++ b/autogen/convert_functions.py @@ -951,7 +951,7 @@ def build_function(function, do_extern): sparam = build_param(fid, param, i) param_var, param_value = sparam.split('=') param_type = param_var.replace(pid, '').strip() - s += ' %s = (%s) NULL;\n' % (param_var.strip(), param_type) + s += ' %s = (%s) %s;\n' % (param_var.strip(), param_type, "NULL" if '*' in param_type else "0") s += ' if (top >= %d) {\n' % (i) s += ' %s = %s\n' % (pid, param_value.strip()) s += ' if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %%u for function \'%%s\'", %d, "%s"); return 0; }\n' % (i, fid)