From 9c37ec4216691f8650172b1d76f57edc9deabe5e Mon Sep 17 00:00:00 2001 From: Rapandrasmus <78219215+Rapandrasmus@users.noreply.github.com> Date: Thu, 23 Nov 2023 17:19:39 +0100 Subject: [PATCH] Bop Refactor + Tweaks/Fixes (#582) * blue bear tweaks * OnBeatPulse callback added * Fixing humming bug in BM + Metronome fix + Some games conversion to onbeatpulse * clappy trio to drumming practice * rest of the games converted * two minor changes --- Assets/Resources/Sfx/games/blueBear/whiff.wav | Bin 13600 -> 63404 bytes .../Sfx/games/blueBear/whiff.wav.meta | 4 +- Assets/Scripts/Conductor.cs | 15 +-- Assets/Scripts/GameManager.cs | 18 +++ Assets/Scripts/Games/BlueBear/BlueBear.cs | 26 ++-- .../Scripts/Games/BoardMeeting/BMExecutive.cs | 10 +- .../Games/BoardMeeting/BoardMeeting.cs | 14 +- Assets/Scripts/Games/CatchyTune/CatchyTune.cs | 50 +++---- .../Games/CheerReaders/CheerReaders.cs | 10 +- Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs | 9 +- Assets/Scripts/Games/DJSchool/DJSchool.cs | 127 ++++++------------ Assets/Scripts/Games/DogNinja/DogNinja.cs | 34 +++-- Assets/Scripts/Games/DoubleDate/DoubleDate.cs | 9 +- .../DrummingPractice/DrummingPractice.cs | 15 ++- Assets/Scripts/Games/FanClub/FanClub.cs | 42 +++--- .../Scripts/Games/FlipperFlop/FlipperFlop.cs | 11 +- Assets/Scripts/Games/ForkLifter/ForkLifter.cs | 10 -- .../Games/ForkLifter/ForkLifterPlayer.cs | 11 -- Assets/Scripts/Games/KarateMan/KarateMan.cs | 5 + .../Scripts/Games/KarateMan/KarateManJoe.cs | 11 +- Assets/Scripts/Games/Lockstep/Lockstep.cs | 15 ++- .../Scripts/Games/MeatGrinder/MeatGrinder.cs | 5 +- Assets/Scripts/Games/Minigame.cs | 6 + Assets/Scripts/Games/MunchyMonk/MunchyMonk.cs | 28 ++-- .../Scripts/Games/OctopusMachine/Octopus.cs | 6 +- .../Games/OctopusMachine/OctopusMachine.cs | 29 ++-- .../Scripts/Games/RhythmRally/RhythmRally.cs | 19 ++- .../Scripts/Games/RhythmSomen/RhythmSomen.cs | 64 +++++---- Assets/Scripts/Games/Ringside/Ringside.cs | 29 ++-- .../Games/SamuraiSliceNtr/SamuraiSliceNtr.cs | 14 +- Assets/Scripts/Games/SpaceDance/SpaceDance.cs | 23 ++-- Assets/Scripts/Games/TapTrial/TapTrial.cs | 9 +- Assets/Scripts/Games/TheDazzles/TheDazzles.cs | 23 ++-- Assets/Scripts/Games/TossBoys/TossBoys.cs | 16 +-- Assets/Scripts/Games/TossBoys/TossKid.cs | 2 +- Assets/Scripts/Games/TrickClass/TrickClass.cs | 20 +-- 36 files changed, 365 insertions(+), 374 deletions(-) diff --git a/Assets/Resources/Sfx/games/blueBear/whiff.wav b/Assets/Resources/Sfx/games/blueBear/whiff.wav index 3dec6f93babe95c04af9ac0f4dbb7e9d262fc9d4..5c6bbd89958b514f7535e7df677ae9e4f6536b14 100644 GIT binary patch literal 63404 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 literal 13600 zcmXwg1zZ%}_x_#P+1XAyMGyrHKtVwP16#4XySo$hwez*RyRkbl5f#M*k*;OCXQ%G} ze&7G+$9#5oxI1&tx#v9Rxo7S@+pk;a&i;u23~oQD)1;XT!qfl&3>{!4I-vo;ff`I0 zyI`y%0sRjw@Eg1acf)PywG~c*jbJUG!~fwWFcG$eEnria0!N~6OWfH*c3LCc}WkU z-_!Tm0I*W*@+P^Od?tJ+Y%kJD7RX=8N60>ieMQU2AkjNfg2+o)jfF#! z59XKfz4<%bBlb4akiJH3r+n%4Y&N%*o5?<6S~6$p51!jpW6JK{;=bp~c1Ueg%$#AI zVS@36ImQMZGIs{`nL6pY#@vK=g&Nr}1*SYBA0!{B_^6Cl-Biw2+>__XnoBo`zldIm zuSvJbpDSi5;$+iAONp+;cd|+h#QB0K7{lQ(7*D}J@g<%Yt~B>R+Mms0rg{9_n_U_1 zrc|LDxTe|nSld`CO<~4?`rx`2`sb!@jxaikolTE-Pjh)Z6Twfip|q9EM>a(MPFYWr zu34%Ikgu0?lI)Z%P*lnvNUY>V(HPk})eiN3m0p>l`mVa8yd`sr4~f!6zM_AHv3MBw z*}cbh-Sk_3S2ww~wzi30XFO>)s}wYu~Oqa6-+490W+9`4Z-)~ZNOc+ z#u?x`%v{FRqOqhCKM8c8T2Lvp5qGhP$i_GE;gS=I){2c%hh(~#5xGwAwt`a2TsbDQD zWbSZ>@yo)Kf?@n8`Z<#Xb`x8KH}U2CTqd7RXBoa2J5IC`>BRoh>(UyjKsuA01Nzco z)Frwfa1ob9;Z8JizYbI^#a=?(UBEOyUk;m+(#CCVvL> z6mM4l_Fk=Bu52ZHC;cv2LADkof&F|cFXHU9&|`E{t`wKp_1hiDy0B!?d5J}QQn(cN z$9`hti83-y~{Cch%^MYFD zq1h_FoR8<$vnH@sd{bGbcB=L(TdARDvgW!Xhn$1aa3{_RV?;xVw!F&y!n(;+V*G1b zV%_4fQWXDN_+A>NaLIGz;i^I2!GRBgV*)9!j`C?_x*$^!CY&WcDt#|a7KyM}roAVb zPGo}UtL|s6-js~-V;9nyPJ?N^eyVY+;};#yZgMR)^{ETeUoyQk?$iyf99%KCW{~l@ z<%E5!r=?(`s=2=_mTsfTRGgU|oGn!#fQRL?Gw@(cEg7CvNI(a5$Gwy3FMSgl7n_&(E`EIEL+@)ux=Uq_H`>g{ z9R;36>{}+?Sz;h7LjDMUb^ST_XLONFpGGVXUzBtry}Z-B^zH5Xwd&PiqqK=#S~aCq zRLx1%00Pn%k*fLR#ow!ew}0sw+LFTW@_}-d|3Cx%GVPebs{*Z*~^Wb>%85 zLWaiVC(tSKvF=IUha2IWiWRRjH*fN?&*)W>`yBic6AG#(SUQ55IlZFSc6R?0NM*x5A0TIErRvVCUP z^8{tcdRtQqAAX*f`}|{C&h6LA_j$iZxQe`+Hp*ynqRFhdpjPiwbK0h)-cEYcq*1-I z+Lw|{;Y!Tlim#^f54`>Urp?DKKPrnFR)iULdcG2yBu`;SOKF9yNGa`R*>X%rnSQV4@6zY){}!ubq(- zVi(4rZ%(w@-X~s zmxXl22xl$bTOAnMKXg*i=AhGo*~&ZAiLz<=lXDNeZvAY_vtFP6(KV4IHtL+F>vdE{;D$}ciO!T z{F7`qsOuVsrPg%L%2+j2J9F%cm{k>vCQpF9nj{warnvh2?*HQL)q2Nn?up$OdTPT> z*R$uJrj}K*ySfAP*0E#w#Tt8s%QIB-LYaovyh3+ky!WtuS|p9pQm>9^e;Mn8S^ zYG3x#d(NBbkBs@NT^T{OE#9Rc>OQIa)NVI>D7(FERqH*rI_VAmn0hn#N7v%jwU4NU znuCqTCvEJC4_`mI-{faQQrcM~D6)&L=7a6V{bO0XCvV5MC+^#Srpw({FT-DTd38HC zzibR~B{sMJiK#iWPE0foYt(;rA9L?fT@qXS#eHuS7CaG;E!=QjwzGCq>drn#51bot z``5ce#nJYon9ln{+@HR)rX61}c23yT+|i5s9!?z*5l$pkMZZ#9IIw^I-it>MUwiVj z=ymXmw5-#|FCNXkwmsWYr;B*k$A41MwCl4{7Z$CETrqm?(|-Ese;NIsuV2Ieo^ln- zXKGSOx&39)+}sh*M%}BqaWAXYt%8?}i*E@t8qH4J*)lW9t4sSKgGP4l-8*4;$Sw5} z#bmszeoFqx_Y=N^mQ+<9FZ9XjlpX$d`{z;LhWuDokWk4xo{7_g-bSUzjceW`?n1MY z=m+(k{!O$B*)?XB&a3Eb@l4BP(3<~g*jaq4e6&54*r-|&C~9`3)9!vldj4&WYxmnT z%f0?iD0);N`d;#7$G00rjcVhJpLCPU))loZI_?l zZ?S9rd_`Je7P*c~uCaYif3@Ph`RB&+9;K6iY{@;D*Rv>Dchk7tu+P+q*{eJg-lLfy zj*iL-%$Lq!)vgHVC@PY_PmEM}2WG@Xr#$a;DP5OP5HbP^i>^LNzdZiZ&WAC-${Zue zuhKWt8dbU159K=Wk9mA`cI`4(6Y0Fr88J_yxuW;S9ToR#uE8L@r5}|y%Efn{zDveEvxGMBj)wt8yP1$@85XzU+gwi$44*FAk_MRc!n-D)-3aPY;{D8}W5>*%d545=&9_%pPPI zIeql%QRbn8GA^`x(+VU;CoYaZ(_n)(8!vG-(c4N2^YhPX)o9kt1Mjjh28<+HhE=Gd}fUj?ro zKZ<$S=P~_^dZo%cQ}&vgtt<)p8Qv+1h5G@P&((G5# zzLfK+1KKV~&+K%heRjgTP$-yNQ}E?%cILy>yZC+m(~$R;uO0qSHN)r*nq!FNE1R1V z*QJo1kM~&9{YaN?|mCfEszV!NJpW~X7lh2l1R@~FPZvXST z?jzexkq~q)I=%JmjM<}oXFi)ZeNNY@k)z)CoRpLoFwkP8?_1a7KI0Gv- zI=w($)5#@)k3bABffev5Y|6xTj*V#&*62!DU*Ayjnr(I&@hjkaNq%fT z_&V?F$?t;-HcHI% zY|UCH9cnuy-IDHXuSylRY|?Z}14Zy4?|$;zf(M>-)63GdZ|wW~uYP7fe@(ov{7~|F z{kLxgTgtlYdRW_ddf_7Z7{7oBuIWE57qvN@m!# zSYGhs%lq8$+~J?xU;KX9e~X3-rmYoTI*F+TluPHj{c3Ym8q|>p|QEiWqx4Iwcl|CupI>> zW$QFgysN$K+DEFhvKUdGK#x{4eu4QdLX&QfZXbUz#lr7dl`({m2>SIN~_zR6EbxHTGwYkM0Sy z%~R?uvUD>>86FsA);7-h)CJFG_ZgekwAqks>|-Wu!OpQBJ3oT>O)epq2szT4jkhPd0urG&iOhB?fQ(Ji`ymXLn<4opgkDncw`t z$l!|LwZXFjJ-(~GnyX#%yOLn?0=^n{VG0~S48yCQm5wgGUs132q26TdWfeNb)N`sO zwSt}q4vQbDHfvSd>6%FGWv?pl3?H%24eyU$wECpHG1-bQb9ZyRapbs%GA+18TngKs zzT|pgan&Z4QzcR5M{3#|!c2QiJuF(sR%#>Dlsktlkbd(OM*N6*+;muze$l4L9`&yU zF84AjDrB{CiK1HE6kF#WWBOBFQrfR@>W|g=_wq;lEGs-%Oq5P2-CKI5Jh28E0vr@` zkI0wb)L!*T^Q-i$=Re2)TfnU#cc?p@Y_uY}cg(t|lm=-bZ++ydB5907Emo5^@lV`8 zo*bvx*4ucb=1N)B-%mwd{~r1K;cr3l*|OtR5}mH@s(!I?qqVu)#PueYNC{0(KSS{C zFj06?*#3~Sfvp3&`v2p*L#tE_5Us;~_=1k^BV5e-^-+#pxh&QNeF?Rwm2A* zxo)_wneM)>Ko?$@TlZSe8G4x_EVpbgoZqPlOeoioU(fgC`*Mew`<@zisq2Glox7>$ zC^MB$#(2S1GFcKLyC4(F8c3t1+hk5fNA(142k*~5D|~zU1bD4h|5YX_|5ZGZ#fviq zXZWX{hR$e_SLke#B2wBb}@u)QMW& zoAoOQ>>1oX$j?98`@CAM^pc;Ewvcv}evyn9m1CS|ruA{%x*DuzOwFpAs;V)S|5R`l z*;R?P59^#p!rqA9gpCqClm3ydl#f#y)$P3AdDA{S{q6>4sTf z-_Z>AQTg8pj0-(c|9XR>$VQQaA_~KP1^fHCRT9Y*!XN(%9GsXYU2kl(`Lv;|_ILHS z>dmzYb=&J$-G#cN##)=3I?nY3$1$^DmFTW)t@5Vwn>FJ_-xRw-Sk>b&^QgC;3%n zta^(&T^*|atLmy8En6qj3ua&mU>o0%Rd_;NC+srY2g_S?wMlD=H}*6b^g9hPrgY0c zHmk$!zQwG7FK~>!A<-+kYj63q^w$N{4~h=b2L$=O(6&<8$Ya`-vis6UlEadXQmI^_n4vhPn5o>Q z@=~8u{*~Pp=L**fnqVP(GJVzA$U4aQTi3Jtd->Or;NmvL#U)|oDV3Skmvlv@nT~g! zN^UmhNA{JMc^L!W*9!=bi?|bUKSCDqvHre#1A^21-*_q13PrNCK-d5T)6X1~<&<$y zovS*$a&GywviwqgX|wVTm6jTZ{*vXnQ_Zvn(P;IvqvEbQ+54#9t-!^>w}OWT>HUZM zjMr4jKZt)5M==E)%~nud98z;o-Q?;nm1`@0Rs5=4P<^=ehF)#y>|9F!;z#0f!eydp z$t|f^u|qw?dzIfb{|LWL-Yd1cGy+Xa^?hZve27dYeS+qqk>ENzfWAzXy3!q~)=U#` zSYtSAIB7Uw&>7-PNtTVaH;%uqqn>cC4>ka;LsF7xX{O|-I92jiG7Ry`YDs{kQrt^? zm1G2a(0cK5tN>dB5;&d5;kLM+P);h2N^wtc#kz*M%3Lel6R6LgDeS-S6y9DKAd-vk zi8Ccnq)X*Tl-< z)Bn|f)SuLc8uUh$Rpy-O(eQ)uByzTdP$Z~NYB8^UnmScI)i_m#npcfgwvuN_C6du1 zBf((ZU@#{`(Q?^2z;?*2Ho1%sOnc0$EI+Kk@yq2+2XG~@1OA%WD>^KFu28E-Yc6YO z%|>mO_6O?okwPlpCfzC?BV3Bb@GLWnwo_kR8y#J3BQ38?2aI`!_6Ct*vEipN*ivkB zJDYn>uo94svjTr&DbZIb6opHkNx#b)$#J<}c3Re0woRHLy(X=Y#!5>>zQXzVXD}Pq z=jzk_+}oXx9jyJA?UA*&HPM#jSmEkM>%hx3jH5V_|}{m$Fp7Oxw^a*^Bf#grbMm zY*BYs=1Mz~6R|ODjXTUS&HB@P*<>=FH$>Uz~Ks6C>y)I}QpHA3@Udjyrt&V&2$ zuH;FnNh#5e^t$S`+?)3)^HT-<lhH#kzw|f5Dy>3_c)_3Oifw{+J{{HvGqFsZ#jEg6*eTx3?4zI2ADKIB8GD4)a54NU z7y~*1KkxyT@zXepS;}l-A{j0Hk{Ux@p=jy@wT6oFETs=KZ<$5RD5eK1;cMUkEDc|W zXW}{d2*DQOzA%m4D{Mp*;4|=7_!z+;L8@SgpdK+uIGMDO@5u^bHgOBJ-WMDs(uFC) z5d|HI6MOHfIWd#Twiu3Q;9N5t9!I_uKlXbVXLsMw?*5&+y2YfRnnRjWwN%|s)m^z;K3lp}Tt+4c z&)^xbfVo61bJkhgnnvma>a=yo(N5KLgRfa>ALlNjqq$u$4nHE4N& zYad&L{ffiO9Y-JHZi7dHf5?WCOxZMrSvf%Mrw#XB<1@+UxYv92dqs*YS#n)eEp!Ov zH~@YzngY*;I}Tt|)pvUxW7}?~DCqKFa2r zmtOHcdwm1^8wEV_KkehC=_HR5A168j88gFq(#o0Fm}^Z*#x44P>+0$<4CTg$X5RYC zan{|KUc_4XQmmTTAgYr*lH=+PUU@!~e3$#ky`O4}G?Ufqlt<)UrIBKx@H3dl%yiAP zr`i5mMb`Ibvk5c1%!HM;D(yzc1a~NXoxRVSU?#W=9s?IxfyLq*@z;1IenEfwoH8+aA#kiRut{E?Y>tP`@!wpaYb$kGfggf}2+!A&v3ph3B&90*td3t+R zcmh4uZqjXVWxG#Pq$kaj=c!}R&K=GYH2GQVlpd0=S8P+9kuQ=hlAf0|kgOEX5N#KF zq4~Qz+P_}ScjtyM>7G*eAUENbxi7la9y2|Mt>NCnA-J#5M|4}XP(+hfvWLh`_7Oh7 zbq{c0;zC%9y^zZupPD)_aYVxhm()V#pEwx zCGkkG2p@>G0w(?#H;FyY#51>;QS37oux**!%r`Crn?MXA(?xobQ`}4%E$c4(S2|oG z6dxpui8?$F%;MGTUC$GD3m4|x>VS@=t_t@@YKW&NJ)1oPf#96*nTU~WkQ1t7>Tc@c z$`$^R|E^+K} z=DEtp5;ejs#F;AMh`?Xa7{3WV@-}t>vxDwP z51^OP3()6QdKshOcJi6<5=bb`tZ#?t+&f3j2fg#Bsa; zw1i%K7I%Of&kf}g_*~c*vtyI6CEy=00lSA!5eyW(!#m?{>>ySO?!a_jf@~bkTA20B zWBQ!uE@g55aBrYCduGrQW)?GrHEFgP~t=4e&VyD z-K35~(q(Wp}o5w078?CFoi1nun(2xoWr!`;2AaX2E&k zZ{b2hfaagOL^Yuj$gnnGEm#h&!_~Zz^KeNh+ug=SG6U!e&wbBMkJWPlS+WJou-$nT zsKSN`))EJVPsn$o-s1k^3!=f~4`Q5P4*n9^@-95fH|3Y{ANfW64el=6itWm7X8Unh z`4q4RyM+f6^~j^*fzspB9LYc8FwsQeYrGg**`@Rc_X`JO^|E-ISDOM%;U>39VjX7h z=RD;KqgK(S++l13@h^E%93tDJxTX4~_R?S)gZi$zf%>X4Q~s|6l2ybGK?}SF6v7CY z#YggcQ7uR~-xjja0PDd6oS3EQX>>PQLjUV&=xOTt?)isqPD?%4-FjCa_f6`aC)dMM z^Qi@t+w+*MfWPn^#4WVXktOmM=ZO47N63+6i7=n|BWNxdhgX0L{9U#+<4sSX=DA)v z>N$2hb~#tLa@@;2xlA;F3#18hg-yiMrMKn1R4+CAywbc&ya=yk?KzEHlYmxq)`))) zzfmnq3_F`T;@E4QV-7K$GCnenGbzp8%%jY^%zrE*`*3G-cRE!-v7R36YS<5tBDN6Y zgo8wrrSIf36z}9)Wk;o~WSV4#_%E`+Rs0}W&9`Tdd%C*!Iy*VzT>`4g!_v2zrfeZ@s|U7}6VYPHKXm^xXxST2(R$!uX4uz~TT)UIU5IO`JA z3_~})qb|RWt*g=7jYdnPL*VZ0@n>GJ!Tc8(g})@;kS7rPHWkefJrk`GbtDH9!*CC1 z3qGQHqqY1CE`e*v-RFMu$zTyC#bx*qyr;lJTq55R>4m@FYPL@t#N&ZWHz(MWUr5NOl%p#H-9J#&|SLU~+4u5{OA7wL*}9&$W!NS)B}%<+RI(J=;*w;jEK%M{9wKidPm|x0y_Bw$JP^$k9>&8!3EvlHfE!>r z)Un?5W@@OXGs-lJnKSez`U!g+4#s+84Z$b43jD?{<2t+me~I#o*7#{G0rSCrfVZe- zY9hOY>Cbd!G)y@i#=K#kv4LD68_VW1BKA33%&msEuz4uTLPbqT1M!mRBn%-vLXOym za?vR8fv?~iabE00`jTg~$B)jY1DQ~!FO$WF!*2KsVj($7lq^n@luJ%a8cF;m^CZ_L zTgCNAxnLp4<4+gG1Suqn21RPS;PzBW%8h? zxwx75phzN`Nt%RtM1tT9_AhXwO1l<(6YdkLeye0N(CW$-G$)Zv6qCwyW~!KMb|<%; z{{+Wk3-M~)gHIPUK`3$%G|>gkZP$ch!ZhN5prxQ1ABtbcwAcuc4Bv9~*|#+Bnd?z` z{5*P3TV@zLnqA18rfcXR*3B(L)p&P+23vvcLU@p4O|fOzHEagvhsIU{Hh@al7dD3{ zU{A0MWP-t97We`dV~z1Ucw2!>U?m*FH)KmuXT)~rP$pDDlnP#>m7jZ%=T@;TnQG5) zs@nD1X>xQ!v&%8ZG-qd*$92t}OD&`qv(x!rpdPM3eUyvNN*L)e*$3HK*=!jvZ6y69 z4iL2ywi67&M!`&uXDC`lCwKy=ChkA3>F(>)VA_Yh#D&5eU_IWAC>17%{KUh=n0TXT zut+M3BIAgY*bao?t!x%Ogz|Bnc091pu=lXPv43@paY6TSPX^PI+XwTow}Q>WB++-V zQhH4KQd%T!ChI2?%Y3DJ@m^7haFt*exXTS<2789MQ=L8RUbZV%i}jK1uU+nJjBuGp zx#=BT7vRPh3LlA1OPa~Xp^Cs##aG2l#Y=fTc{5p+q)aqWxDQu=2V67e5Vg|P$eHJ; zb~JMCaJF>0T~>E}&t^K1JoFB|*@^^SAp8{8+6|JZ6 z6sii{0w2SM2n8R|owhRccFYgo!4`ZxE-91O=pGd zdUgWWo&UghM-mT$a%7Q1sPy$1dX~D4O~b$ACHM}!6>h{PU>CqHIDk*#9`OTb&=9J>Diiq+QGFD4NimeQ5~=o-TegJ*9j~` z8S6~25iy|zX|oOk_$j=#V4YySU=qsSlLSR*E%+o>1YA%9+w=Fi5u6@bYBypvA)3!D zXzk<^9l`uyh9X3-V$ZTkTnBytBoNbJs4nswzEbc)zzOCN0m5a%{=&yG5V{(% zT77t%_u!>{}yemKHrB+B38k$>B8 zm$>)bSG13k!*_vMP>EuyHFg<$i(SOlVoMPZpF-~qu=}VV3p|VT2!JL0BXkt=1eBsR zrSH59MNKWzE*_!tGSVXqYl3w{SYCk5$ND3b+y)atGgRaK32uht{yX}iO74cpcdKDO zj0OV`RxTrcS7HCVGX+b;>Z3i)OtfkhfFg1#ltUA*gbk3~5vXpuJwi?mf06IQcjKS) z8SpkjOK;!=8?pD;FRU7iz&qg*;2ey>^L?TRf=n{ZwOJ%5GQFt6A%M}fj3%7^F!}y;E!r} z(~%dG5tjC&wRR<>c>p0_%I`zok4LY0{2V@mkL5e_hf(eNK*U*>VIH)gD4GtQ01}JF zx?u4(y;ERnmrh+ zLzU|%5qFJ6w!H`!Aj>v{dHe=6((Pz`Banp#^4<9)bS&k~d`CDF)zjC)@u+6r4omOho7% zh$J6JUh9Ekv>YLO4T??)=8suG4)~66&;TQ`uizc>O&4U@2<$TG1A2hIpdPpaL*aF# z=|a8@;@FX#7Z=8j;j*|wu9lPXgZKvsQ=QO=?!(657VyPJU|X?ASPe#DF02kSp|j_R z$I>trdK!HNvcOSfH7{@uPDae~4B8-r;!T41XB*OQ4jNM#%!Lo(T9naPc_SYN+avrb zpqbb4cHYJR;BWA2`58!?Q^xb}#uA$Tz+C zi3pV^_-p)q{xeVU(Qq)b?q$Se(THshflJ^#dS#=ys6l*j7%V~vNJXd!_ci1tta60qxtm*VpKV3jyU7=e~j}L%~-{t4vp{?xBzyec%6pk z))B}$lM!mtKr1AD6w+`Bvi3MI3=BoOOhoAD4^mJJThK1lQ+Nxp#}0(SZm=2Rvse`U zJzyU=0FH+X(F)vV2nP+3U(_gnd;~AT^T;2ok=&th z653fCkF@BCM!gZWo<_1iK|A7m3bBeA*&q^eXCShAQzT~!lGX|NHX5;Z3Yvo&ASTct z+^GPAu605MlF}4;qB+uS6q3CiVP_$-MLLS%Ca9-CG-tWcFHW+NEzY6*W+TGbGB^*# zZ7*bt!AP6wD8l9=8*D=>J{J&@3lUpjNP0ZtgpSD0?Lbdt@4m?E-O=YLWa}~LH4Wt} zbN@SLqtW+4_GpMk9F8mxksbfQQiQ1jB=vuJ)m@Y~-9=|t;T6R8caS~qp!xbf!g@7Y zV`3o>Nn|GtkRY6i(8#ptP@xtzkO304Y7y2VkS(Loh?*k3nxoHfLo@kz6alZ%te*=%pzJ6Y>7s|!f3gUm_)mfs_#kZqkf$|BnhLc_5yBzT z$cV1}pKTrJ-GHpYApOuIK4Lr;oda~01YIiwa&(UjX^bPTMoUWQ#UlwEx&kGIs3!(` z{ySXAyLQwsjSdRB(d&QjPSisE*Tx_V;AqAq&|UxQTMm>+A0_HtfzJOYS%lgN)IUJI sBDzNhN)FNc|NrlQ=O}6VPxk-X{`dX=efPi5|958z~HbpQYW diff --git a/Assets/Resources/Sfx/games/blueBear/whiff.wav.meta b/Assets/Resources/Sfx/games/blueBear/whiff.wav.meta index 1ccc70674..f297b90b7 100644 --- a/Assets/Resources/Sfx/games/blueBear/whiff.wav.meta +++ b/Assets/Resources/Sfx/games/blueBear/whiff.wav.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2448776798073114dbaa07b1c4a83cd8 +guid: b570a8e729c2e6c47bfe22048bcc0e8c AudioImporter: externalObjects: {} serializedVersion: 6 @@ -18,5 +18,5 @@ AudioImporter: ambisonic: 0 3D: 1 userData: - assetBundleName: + assetBundleName: ctrbear/common assetBundleVariant: diff --git a/Assets/Scripts/Conductor.cs b/Assets/Scripts/Conductor.cs index 0ec70500b..c32069a53 100644 --- a/Assets/Scripts/Conductor.cs +++ b/Assets/Scripts/Conductor.cs @@ -76,12 +76,10 @@ namespace HeavenStudio // Conductor is currently paused, but not fully stopped public bool isPaused; - // Last reported beat based on song position - private double lastReportedBeat = 0f; - // Metronome tick sound enabled public bool metronome = false; Util.Sound metronomeSound; + private int _metronomeTally = 0; // pitch values private float timelinePitch = 1f; @@ -204,6 +202,7 @@ namespace HeavenStudio songPosBeat = GetBeatFromSongPos(time); startBeat = songPosBeat; + _metronomeTally = 0; startTime = DateTime.Now; absTimeAdjust = 0; @@ -363,13 +362,10 @@ namespace HeavenStudio { if (metronome && isPlaying) { - if (ReportBeat(ref lastReportedBeat)) + if (songPositionInBeatsAsDouble >= Math.Ceiling(startBeat) + _metronomeTally) { - metronomeSound = Util.SoundByte.PlayOneShot("metronome", lastReportedBeat); - } - else if (songPositionInBeats < lastReportedBeat) - { - lastReportedBeat = Mathf.Round(songPositionInBeats); + metronomeSound = Util.SoundByte.PlayOneShot("metronome", Math.Ceiling(startBeat) + _metronomeTally); + _metronomeTally++; } } else @@ -382,6 +378,7 @@ namespace HeavenStudio } } + [Obsolete("Conductor.ReportBeat is deprecated. Please use the OnBeatPulse callback instead.")] public bool ReportBeat(ref double lastReportedBeat, double offset = 0, bool shiftBeatToOffset = true) { bool result = songPositionInBeats + (shiftBeatToOffset ? offset : 0f) >= (lastReportedBeat) + 1f; diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 1496704e5..483430651 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -47,6 +47,7 @@ namespace HeavenStudio [NonSerialized] public bool playOnStart; [NonSerialized] public double startBeat; [NonSerialized] public GameObject currentGameO; + private Minigame _currentMinigame; [NonSerialized] public bool autoplay; [NonSerialized] public bool canInput = true; [NonSerialized] public RiqEntity currentSection, nextSection; @@ -70,6 +71,7 @@ namespace HeavenStudio public event Action onBeatChanged; public event Action onSectionChange; + public event Action onBeatPulse; public int BeatmapEntities() { @@ -493,6 +495,13 @@ namespace HeavenStudio } } + if (cond.songPositionInBeatsAsDouble >= Math.Ceiling(_playStartBeat) + _pulseTally) + { + if (_currentMinigame != null) _currentMinigame.OnBeatPulse(Math.Ceiling(_playStartBeat) + _pulseTally); + onBeatPulse?.Invoke(Math.Ceiling(_playStartBeat) + _pulseTally); + _pulseTally++; + } + float seekTime = 8f; //seek ahead to preload games that have assetbundles SeekAheadAndPreload(cond.songPositionInBeatsAsDouble, seekTime); @@ -580,10 +589,15 @@ namespace HeavenStudio #region Play Events + private double _playStartBeat = 0; + private int _pulseTally = 0; + public void Play(double beat, float delay = 0f) { bool paused = Conductor.instance.isPaused; Debug.Log("Playing at " + beat); + _playStartBeat = beat; + _pulseTally = 0; canInput = true; if (!paused) { @@ -951,6 +965,10 @@ namespace HeavenStudio Destroy(currentGameO); currentGameO = Instantiate(GetGame(game)); + if (currentGameO.TryGetComponent(out var minigame)) + { + _currentMinigame = minigame; + } currentGameO.transform.parent = eventCaller.GamesHolder.transform; currentGameO.name = game; diff --git a/Assets/Scripts/Games/BlueBear/BlueBear.cs b/Assets/Scripts/Games/BlueBear/BlueBear.cs index db5795390..3d908c539 100644 --- a/Assets/Scripts/Games/BlueBear/BlueBear.cs +++ b/Assets/Scripts/Games/BlueBear/BlueBear.cs @@ -126,9 +126,9 @@ namespace HeavenStudio.Games public GameObject individualBagHolder; [Header("Variables")] - static int rightCrumbAppearThreshold = 15; - static int leftCrumbAppearThreshold = 30; - static int eatenTreats = 0; + private int rightCrumbAppearThreshold = 15; + private int leftCrumbAppearThreshold = 30; + private int eatenTreats = 0; bool crying; private List _allStoryEvents = new(); [SerializeField] private SuperCurveObject.Path[] _treatCurves; @@ -236,7 +236,6 @@ namespace HeavenStudio.Games private void Awake() { instance = this; - if (Conductor.instance.isPlaying || Conductor.instance.isPaused) EatTreat(true); _allStoryEvents = EventCaller.GetAllInGameManagerList("blueBear", new string[] { "story" }); UpdateStory(); } @@ -292,12 +291,12 @@ namespace HeavenStudio.Games if (PlayerInput.GetIsAction(InputAction_Left) && !IsExpectingInputNow(InputAction_Left.inputLockCategory)) { - SoundByte.PlayOneShotGame("blueBear/whiff"); + SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false)); Bite(true); } else if (PlayerInput.GetIsAction(InputAction_Right) && !IsExpectingInputNow(InputAction_Right.inputLockCategory)) { - SoundByte.PlayOneShotGame("blueBear/whiff"); + SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false)); Bite(false); } @@ -373,12 +372,14 @@ namespace HeavenStudio.Games { HandleTreatsOnStart(beat); HandleEmotions(beat); + HandleCrumbs(beat); } public override void OnGameSwitch(double beat) { HandleTreatsOnStart(beat); HandleEmotions(beat); + HandleCrumbs(beat); } private void HandleTreatsOnStart(double gameswitchBeat) @@ -412,6 +413,15 @@ namespace HeavenStudio.Games } } + private void HandleCrumbs(double beat) + { + var allEventsBeforeBeat = EventCaller.GetAllInGameManagerList("blueBear", new string[] { "crumb" }).FindAll(x => x.beat < beat); + if (allEventsBeforeBeat.Count == 0) return; + var lastCrumbEvent = allEventsBeforeBeat[^1]; + SetCrumbThreshold(lastCrumbEvent["right"], lastCrumbEvent["left"], lastCrumbEvent["reset"]); + EatTreat(false); + } + public void SetCrumbThreshold(int rightThreshold, int leftThreshold, bool reset) { rightCrumbAppearThreshold = rightThreshold; @@ -419,9 +429,9 @@ namespace HeavenStudio.Games if (reset) eatenTreats = 0; } - public void EatTreat(bool onlyCheck = false) + public void EatTreat(bool appendTreats = true) { - if (!onlyCheck) eatenTreats++; + if (appendTreats) eatenTreats++; if (eatenTreats >= leftCrumbAppearThreshold) { leftCrumb.SetActive(true); diff --git a/Assets/Scripts/Games/BoardMeeting/BMExecutive.cs b/Assets/Scripts/Games/BoardMeeting/BMExecutive.cs index 560180489..6e4577760 100644 --- a/Assets/Scripts/Games/BoardMeeting/BMExecutive.cs +++ b/Assets/Scripts/Games/BoardMeeting/BMExecutive.cs @@ -22,6 +22,14 @@ namespace HeavenStudio.Games.Scripts_BoardMeeting game = BoardMeeting.instance; } + private void OnDestroy() + { + if (rollLoop != null) + { + rollLoop.Stop(); + } + } + public void Prepare() { if (spinning) return; @@ -78,7 +86,7 @@ namespace HeavenStudio.Games.Scripts_BoardMeeting public void Bop() { - if (!canBop || spinning || !anim.IsAnimationNotPlaying() || preparing) return; + if (!canBop || spinning || preparing) return; if (smileCounter > 0) { anim.DoScaledAnimationAsync("SmileBop", 0.5f); diff --git a/Assets/Scripts/Games/BoardMeeting/BoardMeeting.cs b/Assets/Scripts/Games/BoardMeeting/BoardMeeting.cs index f5efe82e0..845e6d2c1 100644 --- a/Assets/Scripts/Games/BoardMeeting/BoardMeeting.cs +++ b/Assets/Scripts/Games/BoardMeeting/BoardMeeting.cs @@ -92,8 +92,8 @@ namespace HeavenStudio.Games public BMExecutive firstSpinner; [SerializeField] float shakeIntensity = 0.5f; public bool shouldBop = true; - bool assistantCanBop = true; - bool executivesCanBop = true; + private bool assistantCanBop = true; + private bool executivesCanBop = true; public GameEvent bop = new GameEvent(); [NonSerialized] public Sound chairLoopSound = null; int missCounter = 0; @@ -126,10 +126,6 @@ namespace HeavenStudio.Games if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1) && shouldBop) - { - SingleBop(); - } if (PlayerInput.GetIsAction(InputAction_BasicPressing) && !IsExpectingInputNow(InputAction_BasicPress.inputLockCategory)) { if (executives[executiveCount - 1].spinning) @@ -147,6 +143,12 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (!shouldBop) return; + SingleBop(); + } + void SingleBop() { if (assistantCanBop) diff --git a/Assets/Scripts/Games/CatchyTune/CatchyTune.cs b/Assets/Scripts/Games/CatchyTune/CatchyTune.cs index 9fca5387c..5f2503024 100644 --- a/Assets/Scripts/Games/CatchyTune/CatchyTune.cs +++ b/Assets/Scripts/Games/CatchyTune/CatchyTune.cs @@ -208,13 +208,13 @@ namespace HeavenStudio.Games // print("current beat: " + conductor.songPositionInBeatsAsDouble); if (stopCatchLeft > 0 && stopCatchLeft <= cond.songPositionInBeatsAsDouble) { - plalinAnim.Play("idle", 0, 0); + plalinAnim.DoScaledAnimationAsync("idle", 0.5f); stopCatchLeft = 0; } if (stopCatchRight > 0 && stopCatchRight <= cond.songPositionInBeatsAsDouble) { - alalinAnim.Play("idle", 0, 0); + alalinAnim.DoScaledAnimationAsync("idle", 0.5f); stopCatchRight = 0; } @@ -236,19 +236,6 @@ namespace HeavenStudio.Games heartMessage.SetActive(false); } - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (bopLeft && stopCatchLeft == 0) - { - plalinAnim.Play("bop", 0, 0); - } - - if (bopRight && stopCatchRight == 0) - { - alalinAnim.Play("bop", 0, 0); - } - } - if (PlayerInput.GetIsAction(InputAction_Left) && !IsExpectingInputNow(InputAction_Left.inputLockCategory)) { catchWhiff(false); @@ -260,6 +247,19 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (bopLeft && stopCatchLeft == 0) + { + plalinAnim.DoScaledAnimationAsync("bop", 0.5f); + } + + if (bopRight && stopCatchRight == 0) + { + alalinAnim.DoScaledAnimationAsync("bop", 0.5f); + } + } + public void DropFruit(double beat, int side, bool smile, bool isPineapple, float endSmile) { var objectToSpawn = isPineapple ? pineappleBase : orangeBase; @@ -344,23 +344,23 @@ namespace HeavenStudio.Games case (int)WhoBops.Plalin: if (stopCatchLeft == 0) { - plalinAnim.Play("bop", 0, 0); + plalinAnim.DoScaledAnimationAsync("bop", 0.5f); } break; case (int)WhoBops.Alalin: if (stopCatchRight == 0) { - alalinAnim.Play("bop", 0, 0); + alalinAnim.DoScaledAnimationAsync("bop", 0.5f); } break; case (int)WhoBops.Both: if (stopCatchRight == 0) { - alalinAnim.Play("bop", 0, 0); + alalinAnim.DoScaledAnimationAsync("bop", 0.5f); } if (stopCatchLeft == 0) { - plalinAnim.Play("bop", 0, 0); + plalinAnim.DoScaledAnimationAsync("bop", 0.5f); } break; default: @@ -374,12 +374,12 @@ namespace HeavenStudio.Games if (side) { - alalinAnim.Play(anim, 0, 0); + alalinAnim.DoScaledAnimationAsync(anim, 0.5f); stopCatchRight = beat + 0.9f; } else { - plalinAnim.Play(anim, 0, 0); + plalinAnim.DoScaledAnimationAsync(anim, 0.5f); stopCatchLeft = beat + 0.9f; } @@ -402,12 +402,12 @@ namespace HeavenStudio.Games if (side) { - alalinAnim.Play("miss" + fruitType, 0, 0); + alalinAnim.DoScaledAnimationAsync("miss" + fruitType, 0.5f); stopCatchRight = beat + 0.7f; } else { - plalinAnim.Play("miss" + fruitType, 0, 0); + plalinAnim.DoScaledAnimationAsync("miss" + fruitType, 0.5f); stopCatchLeft = beat + 0.7f; } } @@ -438,12 +438,12 @@ namespace HeavenStudio.Games if (side) { - alalinAnim.Play("whiff", 0, 0); + alalinAnim.DoScaledAnimationAsync("whiff", 0.5f); stopCatchRight = beat + 0.5f; } else { - plalinAnim.Play("whiff", 0, 0); + plalinAnim.DoScaledAnimationAsync("whiff", 0.5f); stopCatchLeft = beat + 0.5f; } } diff --git a/Assets/Scripts/Games/CheerReaders/CheerReaders.cs b/Assets/Scripts/Games/CheerReaders/CheerReaders.cs index c04ee4bb6..0af61ec29 100644 --- a/Assets/Scripts/Games/CheerReaders/CheerReaders.cs +++ b/Assets/Scripts/Games/CheerReaders/CheerReaders.cs @@ -262,13 +262,15 @@ namespace HeavenStudio.Games UpdateCameraZoom(); } + public override void OnBeatPulse(double beat) + { + if (!shouldBop) return; + BopSingle(); + } + void Update() { var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1) && shouldBop) - { - BopSingle(); - } if (cond.isPlaying && !cond.isPaused) { diff --git a/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs b/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs index b78cc9eb3..a3906fec2 100644 --- a/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs +++ b/Assets/Scripts/Games/ClappyTrio/ClappyTrio.cs @@ -135,13 +135,14 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (shouldBop) Bop(Conductor.instance.songPositionInBeatsAsDouble); + } + void Update() { var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (shouldBop) Bop(cond.songPositionInBeatsAsDouble); - } if (cond.isPlaying && !cond.isPaused) { float normalizedBeat = cond.GetPositionFromBeat(signStartBeat, signLength); diff --git a/Assets/Scripts/Games/DJSchool/DJSchool.cs b/Assets/Scripts/Games/DJSchool/DJSchool.cs index fdc3dcb6e..953c5239d 100644 --- a/Assets/Scripts/Games/DJSchool/DJSchool.cs +++ b/Assets/Scripts/Games/DJSchool/DJSchool.cs @@ -165,95 +165,48 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (!goBop) return; + if (student.isHolding) + { + student.anim.DoScaledAnimationAsync("HoldBop", 0.5f); + } + else if (!student.swiping && student.anim.IsAnimationNotPlaying()) + { + student.anim.DoScaledAnimationAsync("IdleBop", 0.5f); + } + + var yellowState = djYellowAnim.GetCurrentAnimatorStateInfo(0); + if (yellowState.IsName("Hey")) + { + //PostScratchoFace(); + } + if (!andStop && !djYellowHolding) + { + float normalizedSmileBeat = Conductor.instance.GetPositionFromBeat(smileBeat, 3f); + if (normalizedSmileBeat >= 0 && normalizedSmileBeat <= 1f) djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.Happy); + else if (!djYellowScript.HeadSpriteCheck(DJYellow.DJExpression.CrossEyed)) djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.NeutralLeft); + djYellowScript.Reverse(djYellowScript.HeadSpriteCheck(DJYellow.DJExpression.CrossEyed)); + if (djYellowBopLeft) + { + djYellowAnim.DoScaledAnimationAsync("IdleBop2", 0.5f); + } + else + { + djYellowAnim.DoScaledAnimationAsync("IdleBop", 0.5f); + } + djYellowBopLeft = !djYellowBopLeft; + + } + else if (djYellowHolding) + { + djYellowAnim.DoScaledAnimationAsync("HoldBop", 0.5f); + } + } + private void Update() { - #region old script - //var cond = Conductor.instance; - - //if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - //{ - // if (cond.songPositionInBeatsAsDouble >= bop.startBeat && cond.songPositionInBeatsAsDouble < bop.startBeat + bop.length) - // { - // if (student.anim.IsAnimationNotPlaying()) - // { - // if (student.isHolding) - // { - // student.anim.Play("HoldBop", 0, 0); - // } - // else - // { - // student.anim.Play("IdleBop", 0, 0); - // } - // } - // if (djYellowAnim.IsAnimationNotPlaying()) - // { - // var yellowState = djYellowAnim.GetCurrentAnimatorStateInfo(0); - // if (yellowState.IsName("Hey")) - // { - // PostScratchoFace(); - // } - - // if (djYellowHolding) - // { - // djYellowAnim.Play("HoldBop", 0, 0); - // } - // else - // { - // // todo: split between left and right bop based on beat - // djYellowAnim.Play("IdleBop", 0, 0); - // } - // } - // } - //} - #endregion - - if (Conductor.instance.ReportBeat(ref lastReportedBeat)) - { - if (goBop) - { - if (student.isHolding) - { - student.anim.DoScaledAnimationAsync("HoldBop", 0.5f); - } - else if (!student.swiping && student.anim.IsAnimationNotPlaying()) - { - student.anim.DoScaledAnimationAsync("IdleBop", 0.5f); - } - - var yellowState = djYellowAnim.GetCurrentAnimatorStateInfo(0); - if (yellowState.IsName("Hey")) - { - //PostScratchoFace(); - } - if (!andStop && !djYellowHolding) - { - float normalizedSmileBeat = Conductor.instance.GetPositionFromBeat(smileBeat, 3f); - if (normalizedSmileBeat >= 0 && normalizedSmileBeat <= 1f) djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.Happy); - else if (!djYellowScript.HeadSpriteCheck(DJYellow.DJExpression.CrossEyed)) djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.NeutralLeft); - djYellowScript.Reverse(djYellowScript.HeadSpriteCheck(DJYellow.DJExpression.CrossEyed)); - if (djYellowBopLeft) - { - djYellowAnim.DoScaledAnimationAsync("IdleBop2", 0.5f); - } - else - { - djYellowAnim.DoScaledAnimationAsync("IdleBop", 0.5f); - } - djYellowBopLeft = !djYellowBopLeft; - - } - else if (djYellowHolding) - { - djYellowAnim.DoScaledAnimationAsync("HoldBop", 0.5f); - } - } - - } - else if (Conductor.instance.songPositionInBeatsAsDouble < lastReportedBeat) - { - lastReportedBeat = Math.Round(Conductor.instance.songPositionInBeatsAsDouble); - } - if(PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress) && !student.isHolding) //Start hold miss { student.OnMissHoldForPlayerInput(); diff --git a/Assets/Scripts/Games/DogNinja/DogNinja.cs b/Assets/Scripts/Games/DogNinja/DogNinja.cs index b14379f2b..388d8a62a 100644 --- a/Assets/Scripts/Games/DogNinja/DogNinja.cs +++ b/Assets/Scripts/Games/DogNinja/DogNinja.cs @@ -17,11 +17,12 @@ namespace HeavenStudio.Games.Loaders { new GameAction("Bop", "Bop") { - function = delegate { DogNinja.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity["toggle"]); }, - defaultLength = 0.5f, + function = delegate { DogNinja.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length, eventCaller.currentEntity["auto"], eventCaller.currentEntity["toggle"]); }, + resizable = true, parameters = new List() { - new Param("toggle", false, "Enable Bopping", "Whether to bop to the beat or not"), + new Param("toggle", true, "Enable Bopping", "Whether to bop to the beat or not"), + new Param("auto", false, "Enable Bopping (Auto)", "Whether to bop to the beat or not automatically"), } }, new GameAction("Prepare", "Prepare") @@ -141,7 +142,7 @@ namespace HeavenStudio.Games private double lastReportedBeat = 0f; private bool birdOnScreen = false; - static bool dontBop = false; + bool dontBop = false; private const string sfxNum = "dogNinja/"; public static DogNinja instance; @@ -213,6 +214,12 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (dontBop) return; + DogAnim.DoScaledAnimationAsync("Bop", 0.5f); + } + private void Update() { if (DogAnim.GetBool("needPrepare") && DogAnim.IsAnimationNotPlaying()) @@ -258,17 +265,18 @@ namespace HeavenStudio.Games } } - private void LateUpdate() + public void Bop(double beat, float length, bool auto, bool bop) { - if (Conductor.instance.ReportBeat(ref lastReportedBeat) && DogAnim.IsAnimationNotPlaying() && !dontBop) - { - DogAnim.DoScaledAnimationAsync("Bop", 0.5f); - } - } + dontBop = !auto; + if (!bop) return; + List actions = new(); - public void Bop(double beat, bool bop) - { - dontBop = !bop; + for (int i = 0; i < length; i++) + { + actions.Add(new(beat + i, delegate { DogAnim.DoScaledAnimationAsync("Bop", 0.5f); })); + } + + if (actions.Count > 0) BeatAction.New(this, actions); } public static void QueueObject(double beat, int direction, int typeL, int typeR, bool prepare, bool muteThrow) diff --git a/Assets/Scripts/Games/DoubleDate/DoubleDate.cs b/Assets/Scripts/Games/DoubleDate/DoubleDate.cs index e1f50fb7d..e82f6aa52 100644 --- a/Assets/Scripts/Games/DoubleDate/DoubleDate.cs +++ b/Assets/Scripts/Games/DoubleDate/DoubleDate.cs @@ -138,6 +138,11 @@ namespace HeavenStudio.Games clouds.transform.position = Vector3.left * ((Time.realtimeSinceStartup * cloudSpeed) % cloudDistance); } + public override void OnBeatPulse(double beat) + { + if (shouldBop) SingleBop(); + } + void Update() { var cond = Conductor.instance; @@ -162,10 +167,6 @@ namespace HeavenStudio.Games } queuedBalls.Clear(); } - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1) && shouldBop) - { - SingleBop(); - } } else { diff --git a/Assets/Scripts/Games/DrummingPractice/DrummingPractice.cs b/Assets/Scripts/Games/DrummingPractice/DrummingPractice.cs index 7ae3ddd66..071711e07 100644 --- a/Assets/Scripts/Games/DrummingPractice/DrummingPractice.cs +++ b/Assets/Scripts/Games/DrummingPractice/DrummingPractice.cs @@ -144,16 +144,17 @@ namespace HeavenStudio.Games PersistColor(beat); } + public override void OnBeatPulse(double beat) + { + if (goBop) + { + Bop(); + } + } + private void Update() { var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBop) - { - Bop(); - } - } if (isMoving && cond.isPlaying && !cond.isPaused) { diff --git a/Assets/Scripts/Games/FanClub/FanClub.cs b/Assets/Scripts/Games/FanClub/FanClub.cs index 6defe4d95..bdadd7419 100644 --- a/Assets/Scripts/Games/FanClub/FanClub.cs +++ b/Assets/Scripts/Games/FanClub/FanClub.cs @@ -204,8 +204,6 @@ namespace HeavenStudio.Games private List Spectators; //bop-type animations - private GameEvent bop = new GameEvent(); - private GameEvent specBop = new GameEvent(); private GameEvent noBop = new GameEvent(); private GameEvent noResponse = new GameEvent(); private GameEvent noCall = new GameEvent(); @@ -356,30 +354,28 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + var cond = Conductor.instance; + if (goBopIdol) + { + if (!(cond.songPositionInBeatsAsDouble >= noBop.startBeat && cond.songPositionInBeatsAsDouble < noBop.startBeat + noBop.length)) + { + idolAnimator.Play("IdolBeat" + GetPerformanceSuffix(), 0, 0); + Blue.PlayAnimState("Beat"); + Orange.PlayAnimState("Beat"); + } + } + if (goBopSpec) + { + if (!(cond.songPositionInBeatsAsDouble >= noSpecBop.startBeat && cond.songPositionInBeatsAsDouble < noSpecBop.startBeat + noSpecBop.length)) + BopAll(); + } + } + private void Update() { var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBopIdol) - { - if (!(cond.songPositionInBeatsAsDouble >= noBop.startBeat && cond.songPositionInBeatsAsDouble < noBop.startBeat + noBop.length)) - { - idolAnimator.Play("IdolBeat" + GetPerformanceSuffix(), 0, 0); - Blue.PlayAnimState("Beat"); - Orange.PlayAnimState("Beat"); - } - } - } - - if (cond.ReportBeat(ref specBop.lastReportedBeat, specBop.startBeat % 1)) - { - if (goBopSpec) - { - if (!(cond.songPositionInBeatsAsDouble >= noSpecBop.startBeat && cond.songPositionInBeatsAsDouble < noSpecBop.startBeat + noSpecBop.length)) - BopAll(); - } - } //idol jumping physics float jumpPos = cond.GetPositionFromBeat(idolJumpStartTime, 1f); diff --git a/Assets/Scripts/Games/FlipperFlop/FlipperFlop.cs b/Assets/Scripts/Games/FlipperFlop/FlipperFlop.cs index e8eb46f47..3af0b6a5a 100644 --- a/Assets/Scripts/Games/FlipperFlop/FlipperFlop.cs +++ b/Assets/Scripts/Games/FlipperFlop/FlipperFlop.cs @@ -230,16 +230,17 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (goBopFlip) SingleBop((int)WhoBops.Flippers); + if (goBopTuck) SingleBop((int)WhoBops.CaptainTuck); + } + private void Update() { var cond = Conductor.instance; if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBopFlip) SingleBop((int)WhoBops.Flippers); - if (goBopTuck) SingleBop((int)WhoBops.CaptainTuck); - } if (isWalking) { float normalizedBeat = cond.GetPositionFromBeat(walkStartBeat, walkLength); diff --git a/Assets/Scripts/Games/ForkLifter/ForkLifter.cs b/Assets/Scripts/Games/ForkLifter/ForkLifter.cs index 26e904d00..b615576ab 100644 --- a/Assets/Scripts/Games/ForkLifter/ForkLifter.cs +++ b/Assets/Scripts/Games/ForkLifter/ForkLifter.cs @@ -69,16 +69,6 @@ namespace HeavenStudio.Games.Loaders }, resizable = true }, - new GameAction("bop", "Bop") - { - function = delegate { var e = eventCaller.currentEntity; ForkLifter.instance.Bop(e.beat, e.length, e["bop"], e["autoBop"]); }, - parameters = new List() - { - new Param("bop", true, "Keep Bopping", "Should Fork bop for the duration of the block?"), - new Param("autoBop", false, "Keep Bopping (Auto)", "Should Fork bop indefinitely?"), - }, - resizable = true, - }, }, new List() {"rvl", "normal"}, "rvlfork", "en", diff --git a/Assets/Scripts/Games/ForkLifter/ForkLifterPlayer.cs b/Assets/Scripts/Games/ForkLifter/ForkLifterPlayer.cs index d3eed38de..ec2a95818 100644 --- a/Assets/Scripts/Games/ForkLifter/ForkLifterPlayer.cs +++ b/Assets/Scripts/Games/ForkLifter/ForkLifterPlayer.cs @@ -27,7 +27,6 @@ namespace HeavenStudio.Games.Scripts_ForkLifter public int currentEarlyPeasOnFork; public int currentPerfectPeasOnFork; public int currentLatePeasOnFork; - private double lastReportedBeat; private bool isEating = false; @@ -49,16 +48,6 @@ namespace HeavenStudio.Games.Scripts_ForkLifter { Stab(null); } - - if (Conductor.instance.ReportBeat(ref lastReportedBeat) && anim.IsAnimationNotPlaying() && shouldBop) - { - SingleBop(); - } - } - - public void SingleBop() - { - anim.DoScaledAnimationAsync("Player_Bop", 0.5f); } public void Eat() diff --git a/Assets/Scripts/Games/KarateMan/KarateMan.cs b/Assets/Scripts/Games/KarateMan/KarateMan.cs index 06acb99d0..9fca97f8b 100644 --- a/Assets/Scripts/Games/KarateMan/KarateMan.cs +++ b/Assets/Scripts/Games/KarateMan/KarateMan.cs @@ -1166,6 +1166,11 @@ namespace HeavenStudio.Games Wind.windMain = windStrength; } + public override void OnBeatPulse(double beat) + { + Joe.RequestBop(); + } + public void ToggleBop(double beat, float length, bool toggle, bool autoBop) { Joe.bop.length = autoBop ? float.MaxValue : 0; diff --git a/Assets/Scripts/Games/KarateMan/KarateManJoe.cs b/Assets/Scripts/Games/KarateMan/KarateManJoe.cs index 75f163641..dbc543d38 100644 --- a/Assets/Scripts/Games/KarateMan/KarateManJoe.cs +++ b/Assets/Scripts/Games/KarateMan/KarateManJoe.cs @@ -51,6 +51,12 @@ namespace HeavenStudio.Games.Scripts_KarateMan } public bool inNuriLock { get { return (Conductor.instance.songPositionInBeatsAsDouble >= noNuriJabTime && Conductor.instance.songPositionInBeatsAsDouble < noNuriJabTime + 1f); } } + public void RequestBop() + { + var cond = Conductor.instance; + if (cond.songPositionInBeatsAsDouble > bop.startBeat && cond.songPositionInBeatsAsDouble < bop.startBeat + bop.length && cond.songPositionInBeatsAsDouble >= unPrepareTime && !inCombo) Bop(); + } + private void Update() { var cond = Conductor.instance; @@ -95,11 +101,6 @@ namespace HeavenStudio.Games.Scripts_KarateMan anim.Play("Beat", -1, 0); } - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1, false) && cond.songPositionInBeatsAsDouble > bop.startBeat && cond.songPositionInBeatsAsDouble < bop.startBeat + bop.length && cond.songPositionInBeatsAsDouble >= unPrepareTime && !inCombo) - { - Bop(); - } - if (inCombo && shouldComboId == -2) { float missProg = cond.GetPositionFromBeat(lastComboMissTime, 3f); diff --git a/Assets/Scripts/Games/Lockstep/Lockstep.cs b/Assets/Scripts/Games/Lockstep/Lockstep.cs index f425f735f..fad8de7ff 100644 --- a/Assets/Scripts/Games/Lockstep/Lockstep.cs +++ b/Assets/Scripts/Games/Lockstep/Lockstep.cs @@ -336,18 +336,19 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (goBop) + { + PlayStepperAnim("Bop", true, 0.5f); + } + } + private void Update() { var cond = Conductor.instance; if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBop) - { - PlayStepperAnim("Bop", true, 0.5f); - } - } if (queuedInputs.Count > 0) { foreach (var input in queuedInputs) diff --git a/Assets/Scripts/Games/MeatGrinder/MeatGrinder.cs b/Assets/Scripts/Games/MeatGrinder/MeatGrinder.cs index 934b2eab9..f03d79db6 100644 --- a/Assets/Scripts/Games/MeatGrinder/MeatGrinder.cs +++ b/Assets/Scripts/Games/MeatGrinder/MeatGrinder.cs @@ -157,10 +157,9 @@ namespace HeavenStudio.Games } } - private void LateUpdate() + public override void OnBeatPulse(double beat) { - if (Conductor.instance.ReportBeat(ref lastReportedBeat) - && !BossAnim.IsPlayingAnimationName("BossCall") + if (!BossAnim.IsPlayingAnimationName("BossCall") && !BossAnim.IsPlayingAnimationName("BossSignal") && bossBop) { diff --git a/Assets/Scripts/Games/Minigame.cs b/Assets/Scripts/Games/Minigame.cs index 24cc4c8bf..632bb8810 100644 --- a/Assets/Scripts/Games/Minigame.cs +++ b/Assets/Scripts/Games/Minigame.cs @@ -412,6 +412,12 @@ namespace HeavenStudio.Games } } + // mainly for bopping logic + public virtual void OnBeatPulse(double beat) + { + + } + public static MultiSound PlaySoundSequence(string game, string name, double startBeat, params SoundSequence.SequenceParams[] args) { Minigames.Minigame gameInfo = GameManager.instance.GetGameInfo(game); diff --git a/Assets/Scripts/Games/MunchyMonk/MunchyMonk.cs b/Assets/Scripts/Games/MunchyMonk/MunchyMonk.cs index 699ab5bd2..9de0976dc 100644 --- a/Assets/Scripts/Games/MunchyMonk/MunchyMonk.cs +++ b/Assets/Scripts/Games/MunchyMonk/MunchyMonk.cs @@ -349,24 +349,24 @@ namespace HeavenStudio.Games } } - private void LateUpdate() + public override void OnBeatPulse(double beat) { - if (Conductor.instance.ReportBeat(ref lastReportedBeat)) { - if ((MonkAnim.IsAnimationNotPlaying() || MonkAnim.IsPlayingAnimationName("Bop") || MonkAnim.IsPlayingAnimationName("Idle")) + if ((MonkAnim.IsAnimationNotPlaying() || MonkAnim.IsPlayingAnimationName("Bop") || MonkAnim.IsPlayingAnimationName("Idle")) && monkBop - && !isStaring) - { - MonkAnim.DoScaledAnimationAsync("Bop", 0.5f); - } + && !isStaring) + { + MonkAnim.DoScaledAnimationAsync("Bop", 0.5f); + } - if (!MonkAnim.IsPlayingAnimationName("Blush") || !MonkAnim.IsPlayingAnimationName("Stare")) { - if (growLevel == 4) BrowAnim.DoScaledAnimationAsync("Bop", 0.5f); - if (growLevel > 0) StacheAnim.DoScaledAnimationAsync($"Bop{growLevel}", 0.5f); - } + if (!MonkAnim.IsPlayingAnimationName("Blush") || !MonkAnim.IsPlayingAnimationName("Stare")) + { + if (growLevel == 4) BrowAnim.DoScaledAnimationAsync("Bop", 0.5f); + if (growLevel > 0) StacheAnim.DoScaledAnimationAsync($"Bop{growLevel}", 0.5f); + } - if (CloudMonkey.activeInHierarchy) { - CloudMonkey.GetComponent().DoScaledAnimationAsync("Bop", 0.5f); - } + if (CloudMonkey.activeInHierarchy) //Why activeInHierarchy? - Rasmus + { + CloudMonkey.GetComponent().DoScaledAnimationAsync("Bop", 0.5f); //DONT DO THIS!!! GetComponent is a really expensive operation - Rasmus } } diff --git a/Assets/Scripts/Games/OctopusMachine/Octopus.cs b/Assets/Scripts/Games/OctopusMachine/Octopus.cs index 532a4bfd5..b00e04977 100644 --- a/Assets/Scripts/Games/OctopusMachine/Octopus.cs +++ b/Assets/Scripts/Games/OctopusMachine/Octopus.cs @@ -17,7 +17,6 @@ namespace HeavenStudio.Games.Scripts_OctopusMachine public bool isSqueezed; public bool isPreparing; public double queuePrepare; - public double lastReportedBeat = 0f; double lastSqueezeBeat; bool isActive = true; @@ -65,10 +64,9 @@ namespace HeavenStudio.Games.Scripts_OctopusMachine } } - void LateUpdate() + public void RequestBop() { - if (Conductor.instance.ReportBeat(ref lastReportedBeat) - && !anim.IsPlayingAnimationName("Bop") + if (!anim.IsPlayingAnimationName("Bop") && !anim.IsPlayingAnimationName("Happy") && !anim.IsPlayingAnimationName("Angry") && !anim.IsPlayingAnimationName("Oops") diff --git a/Assets/Scripts/Games/OctopusMachine/OctopusMachine.cs b/Assets/Scripts/Games/OctopusMachine/OctopusMachine.cs index 2127d53d0..18fdf4eeb 100644 --- a/Assets/Scripts/Games/OctopusMachine/OctopusMachine.cs +++ b/Assets/Scripts/Games/OctopusMachine/OctopusMachine.cs @@ -206,7 +206,6 @@ namespace HeavenStudio.Games bool autoAction; double intervalStartBeat; float beatInterval = 1f; - double lastReportedBeat; static List queuedSqueezes = new(); static List queuedReleases = new(); @@ -253,6 +252,23 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (bopIterate >= 3) + { + bopStatus = + bopIterate = 0; + autoAction = false; + } + + if (autoAction) bopIterate++; + + foreach (var octo in octopodes) + { + octo.RequestBop(); + } + } + private void Update() { BackgroundColorUpdate(); @@ -261,17 +277,6 @@ namespace HeavenStudio.Games if (Text.text is "Wrong! Try Again!" or "Good!") Text.text = ""; queuePrepare = double.MaxValue; } - - if (Conductor.instance.ReportBeat(ref lastReportedBeat)) - { - if (bopIterate >= 3) { - bopStatus = - bopIterate = 0; - autoAction = false; - } - - if (autoAction) bopIterate++; - } } public void ChangeText(string text, string youText) diff --git a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs index 28607ab70..0b808c355 100644 --- a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs +++ b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs @@ -152,7 +152,6 @@ namespace HeavenStudio.Games public Paddlers paddlers; - public GameEvent bop = new GameEvent(); private bool goBop = true; public static RhythmRally instance; @@ -357,16 +356,6 @@ namespace HeavenStudio.Games } } - - // Paddler bop animation. - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBop && !inPose) - { - BopSingle(); - } - } - opponentServing = false; //update camera @@ -375,6 +364,14 @@ namespace HeavenStudio.Games GameCamera.AdditionalFoV = cameraFOV; } + public override void OnBeatPulse(double beat) + { + if (goBop && !inPose) + { + BopSingle(); + } + } + public void Bop(double beat, float length, bool bop, bool bopAuto) { goBop = bopAuto; diff --git a/Assets/Scripts/Games/RhythmSomen/RhythmSomen.cs b/Assets/Scripts/Games/RhythmSomen/RhythmSomen.cs index 71b453230..ec54051b5 100644 --- a/Assets/Scripts/Games/RhythmSomen/RhythmSomen.cs +++ b/Assets/Scripts/Games/RhythmSomen/RhythmSomen.cs @@ -84,22 +84,20 @@ namespace HeavenStudio.Games instance = this; } - // Update is called once per frame + public override void OnBeatPulse(double beat) + { + if (shouldBop) SomenPlayer.DoScaledAnimationAsync("HeadBob", 0.5f); + } + void Update() { - var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1) && shouldBop) - { - SomenPlayer.Play("HeadBob", -1, 0); - } - if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress)) { SoundByte.PlayOneShotGame("rhythmSomen/somen_mistake"); - FrontArm.Play("ArmPluck", -1, 0); - backArm.Play("BackArmNothing", 0, 0); + FrontArm.DoScaledAnimationAsync("ArmPluck", 0.5f); + backArm.DoScaledAnimationAsync("BackArmNothing", 0.5f); hasSlurped = false; - EffectSweat.Play("BlobSweating", -1, 0); + EffectSweat.DoScaledAnimationAsync("BlobSweating", 0.5f); ScoreMiss(); } } @@ -108,7 +106,7 @@ namespace HeavenStudio.Games { if (!missed) { - backArm.Play("BackArmLift", 0, 0); + backArm.DoScaledAnimationAsync("BackArmLift", 0.5f); FrontArm.DoScaledAnimationAsync("ArmSlurp", 0.5f); hasSlurped = true; BeatAction.New(instance, new List() @@ -117,8 +115,8 @@ namespace HeavenStudio.Games { if (hasSlurped) { - backArm.Play("BackArmNothing", 0, 0); - FrontArm.Play("ArmNothing", 0, 0); + backArm.DoScaledAnimationAsync("BackArmNothing", 0.5f); + FrontArm.DoScaledAnimationAsync("ArmNothing", 0.5f); } }) }); @@ -136,7 +134,7 @@ namespace HeavenStudio.Games { new BeatAction.Action(beat + i, delegate { - SomenPlayer.Play("HeadBob", -1, 0); + SomenPlayer.DoScaledAnimationAsync("HeadBob", 0.5f); }) }); } @@ -155,9 +153,9 @@ namespace HeavenStudio.Games BeatAction.New(instance, new List() { - new BeatAction.Action(beat, delegate { FarCrane.Play("Drop", -1, 0);}), - new BeatAction.Action(beat + 1.0f, delegate { FarCrane.Play("Open", -1, 0);}), - new BeatAction.Action(beat + 1.5f, delegate { FarCrane.Play("Lift", -1, 0);}), + new BeatAction.Action(beat, delegate { FarCrane.DoScaledAnimationAsync("Drop", 0.5f);}), + new BeatAction.Action(beat + 1.0f, delegate { FarCrane.DoScaledAnimationAsync("Open", 0.5f);}), + new BeatAction.Action(beat + 1.5f, delegate { FarCrane.DoScaledAnimationAsync("Lift", 0.5f);}), }); } @@ -174,9 +172,9 @@ namespace HeavenStudio.Games BeatAction.New(instance, new List() { - new BeatAction.Action(beat, delegate { CloseCrane.Play("DropClose", -1, 0);}), - new BeatAction.Action(beat + 1.0f, delegate { CloseCrane.Play("OpenClose", -1, 0);}), - new BeatAction.Action(beat + 1.5f, delegate { CloseCrane.Play("LiftClose", -1, 0);}), + new BeatAction.Action(beat, delegate { CloseCrane.DoScaledAnimationAsync("DropClose", 0.5f);}), + new BeatAction.Action(beat + 1.0f, delegate { CloseCrane.DoScaledAnimationAsync("OpenClose", 0.5f);}), + new BeatAction.Action(beat + 1.5f, delegate { CloseCrane.DoScaledAnimationAsync("LiftClose", 0.5f);}), }); } @@ -195,12 +193,12 @@ namespace HeavenStudio.Games BeatAction.New(instance, new List() { - new BeatAction.Action(beat, delegate { CloseCrane.Play("DropClose", -1, 0);}), - new BeatAction.Action(beat, delegate { FarCrane.Play("Drop", -1, 0);}), - new BeatAction.Action(beat + 1.0f, delegate { CloseCrane.Play("OpenClose", -1, 0);}), - new BeatAction.Action(beat + 1.0f, delegate { FarCrane.Play("Open", -1, 0);}), - new BeatAction.Action(beat + 1.5f, delegate { CloseCrane.Play("LiftClose", -1, 0);}), - new BeatAction.Action(beat + 1.5f, delegate { FarCrane.Play("Lift", -1, 0);}), + new BeatAction.Action(beat, delegate { CloseCrane.DoScaledAnimationAsync("DropClose", 0.5f);}), + new BeatAction.Action(beat, delegate { FarCrane.DoScaledAnimationAsync("Drop", 0.5f);}), + new BeatAction.Action(beat + 1.0f, delegate { CloseCrane.DoScaledAnimationAsync("OpenClose", 0.5f);}), + new BeatAction.Action(beat + 1.0f, delegate { FarCrane.DoScaledAnimationAsync("Open", 0.5f);}), + new BeatAction.Action(beat + 1.5f, delegate { CloseCrane.DoScaledAnimationAsync("LiftClose", 0.5f);}), + new BeatAction.Action(beat + 1.5f, delegate { FarCrane.DoScaledAnimationAsync("Lift", 0.5f);}), }); } @@ -212,35 +210,35 @@ namespace HeavenStudio.Games BeatAction.New(instance, new List() { - new BeatAction.Action(beat, delegate { EffectExclam.Play("ExclamAppear", -1, 0);}), + new BeatAction.Action(beat, delegate { EffectExclam.DoScaledAnimationAsync("ExclamAppear", 0.5f);}), }); } public void CatchSuccess(PlayerActionEvent caller, float state) { - backArm.Play("BackArmNothing", 0, 0); + backArm.DoScaledAnimationAsync("BackArmNothing", 0, 0); hasSlurped = false; splashEffect.Play(); if (state >= 1f || state <= -1f) { SoundByte.PlayOneShotGame("rhythmSomen/somen_splash"); - FrontArm.Play("ArmPluckNG", -1, 0); - EffectSweat.Play("BlobSweating", -1, 0); + FrontArm.DoScaledAnimationAsync("ArmPluckNG", 0.5f); + EffectSweat.DoScaledAnimationAsync("BlobSweating", 0.5f); missed = true; return; } SoundByte.PlayOneShotGame("rhythmSomen/somen_catch"); SoundByte.PlayOneShotGame("rhythmSomen/somen_catch_old", volume: 0.25f); - FrontArm.Play("ArmPluckOK", -1, 0); - EffectHit.Play("HitAppear", -1, 0); + FrontArm.DoScaledAnimationAsync("ArmPluckOK", 0.5f); + EffectHit.DoScaledAnimationAsync("HitAppear", 0.5f); missed = false; } public void CatchMiss(PlayerActionEvent caller) { missed = true; - EffectShock.Play("ShockAppear", -1, 0); + EffectShock.DoScaledAnimationAsync("ShockAppear", 0.5f); } public void CatchEmpty(PlayerActionEvent caller) diff --git a/Assets/Scripts/Games/Ringside/Ringside.cs b/Assets/Scripts/Games/Ringside/Ringside.cs index d70d7615e..5da8b759b 100644 --- a/Assets/Scripts/Games/Ringside/Ringside.cs +++ b/Assets/Scripts/Games/Ringside/Ringside.cs @@ -218,26 +218,27 @@ namespace HeavenStudio.Games ReporterBlink(); } + public override void OnBeatPulse(double beat) + { + if (shouldBop && canBop) + { + if (UnityEngine.Random.Range(1, 18) == 1) + { + wrestlerAnim.DoScaledAnimationAsync("BopPec"); + } + else + { + wrestlerAnim.DoScaledAnimationAsync("Bop"); + } + } + } + void Update() { var cond = Conductor.instance; if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (shouldBop && canBop) - { - if (UnityEngine.Random.Range(1, 18) == 1) - { - wrestlerAnim.DoScaledAnimationAsync("BopPec"); - } - else - { - wrestlerAnim.DoScaledAnimationAsync("Bop"); - } - } - } if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress) && !shouldNotInput) { if ((PlayerInput.CurrentControlStyle != InputController.ControlStyles.Touch) diff --git a/Assets/Scripts/Games/SamuraiSliceNtr/SamuraiSliceNtr.cs b/Assets/Scripts/Games/SamuraiSliceNtr/SamuraiSliceNtr.cs index e50fe1559..13d41c7e2 100644 --- a/Assets/Scripts/Games/SamuraiSliceNtr/SamuraiSliceNtr.cs +++ b/Assets/Scripts/Games/SamuraiSliceNtr/SamuraiSliceNtr.cs @@ -169,16 +169,14 @@ namespace HeavenStudio.Games instance = this; } - // Update is called once per frame + public override void OnBeatPulse(double beat) + { + if (goBopSamurai) player.Bop(); + if (goBopChild) childParent.GetComponent().Bop(); + } + void Update() { - var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (goBopSamurai) player.Bop(); - if (goBopChild) childParent.GetComponent().Bop(); - } - if (PlayerInput.GetIsAction(InputAction_AltDown)) DoStep(); if (PlayerInput.GetIsAction(InputAction_AltUp) && player.isStepping()) diff --git a/Assets/Scripts/Games/SpaceDance/SpaceDance.cs b/Assets/Scripts/Games/SpaceDance/SpaceDance.cs index 978a4d3eb..45668df13 100644 --- a/Assets/Scripts/Games/SpaceDance/SpaceDance.cs +++ b/Assets/Scripts/Games/SpaceDance/SpaceDance.cs @@ -228,6 +228,18 @@ namespace HeavenStudio.Games colorEnd = defaultBGColor; } + public override void OnBeatPulse(double beat) + { + if (shouldBop) + { + Bop(); + } + if (spaceGrampsShouldBop) + { + GrampsBop(); + } + } + // Update is called once per frame void Update() { @@ -237,17 +249,6 @@ namespace HeavenStudio.Games { scroll.NormalizedX -= xBaseSpeed * xScrollMultiplier * Time.deltaTime; scroll.NormalizedY -= yBaseSpeed * yScrollMultiplier * Time.deltaTime; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (shouldBop) - { - Bop(); - } - if (spaceGrampsShouldBop) - { - GrampsBop(); - } - } if (isShootingStar) { float normalizedBeat = cond.GetPositionFromBeat(shootingStarStartBeat, shootingStarLength); diff --git a/Assets/Scripts/Games/TapTrial/TapTrial.cs b/Assets/Scripts/Games/TapTrial/TapTrial.cs index dd69a99a6..0d43147b5 100644 --- a/Assets/Scripts/Games/TapTrial/TapTrial.cs +++ b/Assets/Scripts/Games/TapTrial/TapTrial.cs @@ -123,15 +123,16 @@ namespace HeavenStudio.Games instance = this; } + public override void OnBeatPulse(double beat) + { + if (shouldBop) SingleBop(); + } + private void Update() { var cond = Conductor.instance; if (cond.isPlaying && !cond.isPaused) { - if (shouldBop && cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - SingleBop(); - } GiraffeUpdate(cond); JumpUpdate(cond); ScrollUpdate(cond); diff --git a/Assets/Scripts/Games/TheDazzles/TheDazzles.cs b/Assets/Scripts/Games/TheDazzles/TheDazzles.cs index b1ef7e9a6..2a35b7e28 100644 --- a/Assets/Scripts/Games/TheDazzles/TheDazzles.cs +++ b/Assets/Scripts/Games/TheDazzles/TheDazzles.cs @@ -257,23 +257,24 @@ namespace HeavenStudio.Games instance = this; } + public override void OnBeatPulse(double beat) + { + if (shouldBop) + { + foreach (var girl in npcGirls) + { + girl.Bop(); + } + player.Bop(); + } + } + void Update() { var cond = Conductor.instance; if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (shouldBop) - { - foreach (var girl in npcGirls) - { - girl.Bop(); - } - player.Bop(); - } - } if (queuedPoses.Count > 0) { foreach (var pose in queuedPoses) diff --git a/Assets/Scripts/Games/TossBoys/TossBoys.cs b/Assets/Scripts/Games/TossBoys/TossBoys.cs index 92ba26420..31c46cd3e 100644 --- a/Assets/Scripts/Games/TossBoys/TossBoys.cs +++ b/Assets/Scripts/Games/TossBoys/TossBoys.cs @@ -262,20 +262,20 @@ namespace HeavenStudio.Games return default(SuperCurveObject.Path); } + public override void OnBeatPulse(double beat) + { + if (shouldBop) + { + SingleBop(); + } + } + private void Update() { var cond = Conductor.instance; BackgroundColorUpdate(); if (cond.isPlaying && !cond.isPaused) { - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) - { - if (shouldBop) - { - SingleBop(); - } - } - if (PlayerInput.CurrentControlStyle == InputController.ControlStyles.Touch) { TossKid next = GetCurrentReceiver(); diff --git a/Assets/Scripts/Games/TossBoys/TossKid.cs b/Assets/Scripts/Games/TossBoys/TossKid.cs index deba5d36c..d7d6a4f79 100644 --- a/Assets/Scripts/Games/TossBoys/TossKid.cs +++ b/Assets/Scripts/Games/TossBoys/TossKid.cs @@ -41,7 +41,7 @@ namespace HeavenStudio.Games.Scripts_TossBoys public void Bop() { - if (!anim.IsAnimationNotPlaying() || crouch || preparing) return; + if (crouch || preparing) return; DoAnimationScaledAsync("Bop", 0.5f); } diff --git a/Assets/Scripts/Games/TrickClass/TrickClass.cs b/Assets/Scripts/Games/TrickClass/TrickClass.cs index 4fb962988..31dda092e 100644 --- a/Assets/Scripts/Games/TrickClass/TrickClass.cs +++ b/Assets/Scripts/Games/TrickClass/TrickClass.cs @@ -116,18 +116,20 @@ namespace HeavenStudio.Games instance = this; } + public override void OnBeatPulse(double beat) + { + var cond = Conductor.instance; + if (!goBop) return; + if ((!playerReady) && cond.songPositionInBeatsAsDouble > playerBopStart) + playerAnim.DoScaledAnimationAsync("Bop"); + + if (cond.songPositionInBeatsAsDouble > girlBopStart) + girlAnim.DoScaledAnimationAsync("Bop"); + } + private void Update() { var cond = Conductor.instance; - if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1) && goBop) - { - if ((!playerReady) && cond.songPositionInBeatsAsDouble > playerBopStart) - playerAnim.DoScaledAnimationAsync("Bop"); - - if (cond.songPositionInBeatsAsDouble > girlBopStart) - girlAnim.DoScaledAnimationAsync("Bop"); - } - if (cond.isPlaying && !cond.isPaused) { if (queuedInputs.Count > 0)