From 44cb0e9ffebbbe89a0a45eb6fc2db4480b96062a Mon Sep 17 00:00:00 2001 From: Snirozu <72814880+Snirozu@users.noreply.github.com> Date: Sat, 21 Dec 2024 22:44:06 +0100 Subject: [PATCH] ko --- art/flashFiles/heart.fla | Bin 0 -> 36302 bytes assets/preload/images/heart.png | Bin 0 -> 773 bytes assets/preload/sounds/fav.ogg | Bin 0 -> 12569 bytes assets/preload/sounds/unfav.ogg | Bin 0 -> 7522 bytes hmm.json | 2 +- source/Main.hx | 13 +- source/backend/ClientPrefs.hx | 9 +- source/backend/Controls.hx | 2 + source/online/GameClient.hx | 6 +- source/online/states/OnlineState.hx | 11 ++ source/online/states/ResultsState.hx | 10 +- source/online/states/RoomState.hx | 2 +- source/online/states/SetupModsState.hx | 7 +- source/online/states/SkinsState.hx | 15 +- .../online/substates/RoomSettingsSubstate.hx | 4 +- source/options/ControlsSubState.hx | 1 + source/options/GameplaySettingsSubState.hx | 6 + source/options/VisualsUISubState.hx | 2 +- source/states/FreeplayState.hx | 137 ++++++++++++++++-- source/states/MainMenuState.hx | 5 +- source/states/PlayState.hx | 55 ++++--- source/states/TitleState.hx | 5 + source/substates/GameplayChangersSubstate.hx | 3 + 23 files changed, 230 insertions(+), 65 deletions(-) create mode 100644 art/flashFiles/heart.fla create mode 100644 assets/preload/images/heart.png create mode 100644 assets/preload/sounds/fav.ogg create mode 100644 assets/preload/sounds/unfav.ogg diff --git a/art/flashFiles/heart.fla b/art/flashFiles/heart.fla new file mode 100644 index 0000000000000000000000000000000000000000..69fd0d8aeaae3dc2e07201ff3e67e61996c3b94f GIT binary patch literal 36302 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
Sh{POT_MyOiNl0uZ_s08tzvh6@b{TZqwv7J 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 literal 0 HcmV?d00001 diff --git a/assets/preload/images/heart.png b/assets/preload/images/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe4f4fc636d9ce114a2464e5a033e0181a8e1ee GIT binary patch literal 773 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 VqzPF|ktG)fA|Q7v6~yA={x2_CkURhY literal 0 HcmV?d00001 diff --git a/assets/preload/sounds/unfav.ogg b/assets/preload/sounds/unfav.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5c8d0eb1a317e6225db309bcb25fc063c09218cc GIT binary patch literal 7522 zcmbVR2UOF^*8hhZ5Mw|}z=)wI2uLVO5D)^P#846f0s_*dcTiYagNBwMQUW4PKmvqS z6c!LzT~Vq?6)84UP*AY9b=OtDNl@Ru_nq^;bG|u~$=o}4CNuZ`?%X@zynnwdBm{jc zO!8VsS5!y^rVLAti4O=%;Io8m&Op#tP@oq=g6~e4Gk@lf!k-BPltr<&GBTSl`L7Zu zyta@I821Q^4b^jw-;aq53vd@Kk8!{l=;Mv`@%qLX>_R#7N5zQ&d1>$=Iaxc~kZ9(% z6pU+PQcze7e}L{lr;yC~Jv)*UjbttkdR8>LgDc$}4!YLPj*cX!?|mn_l{MWQCc3td ztwd{g7{r&tQ!xFEiF`K*LPC(AIu213;(+6FYOpD#9D9DRUq7dmlhcn1%*79UZ!ktd zau6f}F|ZPOrAd22bmXoJ^lKp3XB}!M05h*Xg$1 zAXD(u?t#sh#C#4Vj1iVAzBLkpb6~(;h+>LCNFtoSd^WDWG#)Iqb}S6U0LO&v3S=Ex zWUsfNM<>;t-{?>`8c!OMT=0y$NB75}uK{h)bf@Bt_avClCOFOl zRq!?P-%GjxFW?|5l_4eJ47g#wzd$Vvuq>(uZY{O;OF$sI<`JfBqU`M`0a5n2nkQR6 zbtQ*huGPgWEf-iYa!hd%*b+B_AdI`df#Bd^Q{=WLU;&f?_||eUajPR zcupv*p_J8-&05aR!{(HP<&-sb)kY3CuXg{R^@r!!#jAq~Jckso{twUT!K1B#H?`_G zzFj+``6N(iB1z$&27sWRe5u`ndxT2Uou(O2({$bF=KtMe!05D*5qkv=u00Wm3PEBHst)Q7Z;Wc~->HwPvCO0y>ZxYOmmR8x-X2tj9As0J$BS$V zmS3BJzyw2pk36wPWvdXw1O~CyQ;huVHMWrsE!*tR)w%Au5L9=-^enp zG67kIZPEtUWYg2`pgSG@*T0eVE8UT|I#liew^w&|bu0@hGa5C@sSPK(X^a}WeJ6QD zH*?oSpZcfWl&PeyW*zGi^GQJRevn{q_Eil{U~X7hm<-7^Bb@vX(k+9Rx;FP@{c3!$ zXQu8?KgdEK&rBU*2%4ZwmE_bulOfFpmo=}Oou;^UGivn=awi>$rlbf=`AI8_X6554Cd__)hJkZsA z5LntnjNUk%-9Y@U4REERMURr@oLVdh3r*T!#c_dyP0`&-xM5XVtlH4BrlzI|qct{w z6Ihrp+SJso2kZx+1$aIRWlJf1$(8Qrb!N`8j;?M#vq}7%TiifJLY~rT*}yS^T`_H#u#BnWX!lnnAZTPo z{ymK40=bF=4owiy$vh6=p}BN2AoFP28ep0h1U2@+AWV;K!Kj4o5y|zQ5>TBGghCIt z0>x1#jdUGu7*ShiZX3f)!_W4kxO5%|ka#jLfegq%4($()7rSK!%S|)@+1A-n!g3JEyS&yxmZ7l_wDY`w z60@kbr3aWx2ucCbo=E0rWk?k+DsTj!l~3a*X>=BT03C<`TL(FtxC&Tcx#B32zuuS? zyfPsV?3Fn|7%WXd5|=9iM+oqmgk1bm1xQMS_yFHT+OCC?(B_{J39bxOZ)rjZM#ggMZqf?yOc2<>X<7Js zWdk@Hgg!uamjtn?T z2HeKLf{Q(ug2&2B_h3T*$Z@4mdo(4-qRMHTdyfgCFxXz$h5tkg+v< zIWC9KEEWvV$P$1CI^(lIXRQ^ma9r?1fGJ?fkog%pjVxICyBt}P&%$wmJ%L{`AT@2> zJ}1LwGa)-!1Bzuv<{1%)2GGyn4-hlXr3!w6g#cIFa=L;C zu#eT3X235MdAJU7Xd|91jYJC07FRDr9N^ReyScX+-y4X2$G4B7k9A~LO69k%-Lb~P)zHIY_TbL>wyA?4ua6Tosk_HvSeav zW?@ORv9%{toLp#h5FPH zwdXVcP8AXoyoyEC^#m(G{8ur5w0co}M03~IP@T@*9u4(eM4AVY8Yo7!fJ&s$NVG;D4Cy^`W9o zT+l1|!ftMIQFl6`+MdsMSQd9S{i0)lD=Yw8Wn7OKL5p85uKaWvbCrmd4W<&=6GWAb z=NsW9xC%x{I=yGiiSopZBVH^hHLn`adT+4S^$M!P z>{%2ZO!D@gHTFJEXuc@cVKDo8!Bnr=znRTemM&1u*hUjs8cvcwzIukK_7>5r5XRFV zsP)~jkZ9UI zS!)qW_;f=4VRmbyT4!IKySeC}F;N?m)T174Y+@@h{Sd;)kv^$p{3)@k7xhp}Q|~un z|2BPs{^jT2eDw_n-cG`g;$dy^%UOe69bf8_=7%e{C@?3h5T4_ZpCyk7fMNl~h5_J=c$*gBeJwqJ2WTU9vrcKKSiXI%zl<{KDqM7Wo2FV0RFOK) zUVjSb<(%Iz|2Ckvf&CQrr^AdoZ@7R~?U!)H z_Rv8{u>-?bkDm>Th*))!6Gu??_Rsg#=pv$~=iAzwaPpfrZ4%!u-ylEYea`vZY(qqd z{buM)^6d0M1={Z}Iv1y3bSu3i4lA%S4$yAqTluz}4OZVnmd(w#JLnCQQ%KLoO4E#L z`mL~3ys9mR+#4PdxZmXAM6BPODP25ou{33LwfCsC+$PtvnO;$q`Zwe7&(3Nlo17oS zUm0+T!@9GTr0b$%dYiY7AI6ILtb8zd*8S%1tbmD1&U7KVsK6WN5-Woh<+10Y>C#{Mt5@WFpo;KMzTIz!d+OE-ek!3 z-Q}pB>9UWtRX19zx2iu2;AN+fUA(a{96Lk&_JyZ|;U`V+ zC1$nTA}yL2{@Kv-5!;3M%C!B9V$Y&#F*NTzNikAa zl*{0(%#B3u;IU-qEa^8bJapA%iXSe@aF6Ia_hbZPL^Ov(*C%7JlQtHQjCKF?5VP__ z4sJHxLRI}7+r&sJ z`|6c-Q-P2#q!M^M_0qY+qt+{T)Wm7kSLPB34_l;c+}%{2X?YbNhOu{r^GT2EGG$Ot zntmCEB)#t4Hw>|?bn!dyc*v?NhYAVD7WKPs>AY?;0%H6d8xG~@1o(R#G0mA3CkOu@7@dw{-d7!D zFCP5tI~ab-#ph#_>*2i@WwyQi9Njr!^FZ|>XLX2uks8HYB|3pTRkryV%RQ>d#rAX?+%d1XzTgR=#74~%5 zdUagcpnG4L)tQPtAnkBKxAHDW})3M3QyQaL>_ z5HrSYy+}ta#@GFr)z!_^9mQGYp$|ee8pa` zcDbFF@jP|xy+QW5{hRQbtpiQOS0P7W^3ZP0k=JD+&0Tq`!uPGz$Def2H>>&N^ukwL zNuN~*5WzyReHy<-!C>aI9->s*X(SZ}LNM2_m~c@LPFFcB#cM$IDl z3TIuZHFVl#5|2~MFdB)j(bvD|czN;E{Fe=yM%`mEIc>CAg{9wPLi&^E$Ugf@KmC4E z`uU;4X=65#xj_eok&qmbd4+ElHp#mdI8h*RFh6iz2;v2~c9(RB7QFtmbipoD#gql8 zFXYsYs} zWL1aH^>^wW*;Hh3dQg>IzN}2M>?wW!W7#9v+H7Gt(JSuHdA`fpOjF#)S1S4n6wY3c zfQnFQy#QO0o6)<_<(_@wFKd%ONzaX_S{zhpVAZNWLQa;L?RCpE*#_k?df%9Mt7>aj zt7G+o;$V&~CZjL(@V6cdk+MtettGr`t=Pzrj=5Wlg9G@%$f(U_bA;GO3iYVcpAUK3 z&0bI&G}k%gQ7Om1|NHa4Udfvw`|e-)>9%4swLC3N{AHL{=aL)M=W6z~meZ02G}Uy; zgPg~)q8uy}vrvnqF=ZP1MT~UyRP|(ybw6ZI&&zK5sbQ%ap<93Z*3Re{E%)Al_Ld~S z2>%-cHT~gUl;6S(oQ941RywVB?%kPmcgAu(I~6)Z{xn?u=C4I`gxl>s^2M`Tmc93o z=ngGyDFNfAk>qRX6PPok-fXHW5yocANXsiIuv`Ly7i>fV68-T}u~);h!qh$_BM$lJ zb|fbkEhWw=88#A*_BVYYK1c6JY$8par|#_wPhxHiXt{kS`_eN0Tu?piX7uZVIc(peQf+cz%;N?f}LL!_mpIX6opv+FDVts$yjObxhS)G$y<> z`&Sc3i7@f{vuZz~7lu|?$1ZQ);ka|k$m}F)6?;0~ z!RtXSMmxOawnszNGqqi-m!}AKKcD$M?avQ^`&SRMf^BKCuT#s8^`88=xb5(#=f{ik z2u}wChVu!&`z+EvzI!;8<-Enh+;>pquN{?{$|rOZeC_NHJW-fXD!KgB=$%P$>047; zYUa-&TCcl3ieVUo;aVL~3x`-`{VB)VWmVPq<&K)ULvx#uIPy#n-Vblj&+_wwZ)jJM z8Vx_14NJe4Qq#23sSCJ5lf-cY>;q`vUn0iqkJnzL*f_2iV{n7-me&NZ++AI__zpgL z-!kypwAp(wXy_402fP+vr(UdLEt-lAq4z`?ctQ+{@0JhS>n+<(IPtegN00f`0(Qu}#^k`Z13i7s8$5$PzmM5AjqTd@KHG%dm3X1~b&9X0C1 z`NG8Ax-E4`^l~wm-F*4=0PIC=casz*$DsPoT(_B}^W!J@YfmUA>;+-#2!8kZd?c}Y zhreg8ZzeTXp~0T|ypY^4%7lZIY{ICeFu5@>Qm1`nC7%oyx1yluI{%Q98du z=Bdwc7vJvOSG96u{4?Q1MCjzZ1&@j_%4b^Ay0ptaFCFYy_rG>tTHIr?Y|}ir zTB^xzwP)}Y8d`sL^%g$=Wy$sB$X)N|=&`*z2=uT1%>gavfB8(=e*UjO`j`7pc9q{I zN4|GG_ho6uUFhA>uC6m)_qvaNy+-XGx#AwcVx5z0pPVRi|G<<&u{XTbhLFLN%|} { - return Lumod.scriptsRootPath = Paths.mods(Mods.currentModDirectory + "/lumod"); + Lumod.scriptPathHandler = scriptPath -> { + var defaultPath:String = 'lumod/' + scriptPath; + + // check if script exists in any of loaded mods + var path:String = Paths.modFolders(defaultPath); + if (FileSystem.exists(path)) + return path; + + return defaultPath; } Lumod.classResolver = Deflection.resolveClass; diff --git a/source/backend/ClientPrefs.hx b/source/backend/ClientPrefs.hx index f8d123ab..85b0c3ec 100644 --- a/source/backend/ClientPrefs.hx +++ b/source/backend/ClientPrefs.hx @@ -59,7 +59,8 @@ class SaveVariables { 'instakill' => false, 'practice' => false, 'botplay' => false, - 'opponentplay' => false + 'opponentplay' => false, + 'nospecialnotes' => false, ]; public var comboOffset:Array = [0, 0, 0, 0]; @@ -90,6 +91,8 @@ class SaveVariables { public var disableLagDetection:Bool = false; public var groupSongsBy:String = 'No Grouping'; public var hiddenSongs:Array = []; //format: 'songname-originfolder' + public var favSongs:Array = []; //format: 'songname-originfolder' + public var modchartSkinChanges:Bool = false; public function new() { @@ -120,6 +123,7 @@ class ClientPrefs { 'reset' => [R], 'taunt' => [SPACE], 'sidebar' => [GRAVEACCENT], + 'fav' => [Q], 'volume_mute' => [ZERO], 'volume_up' => [NUMPADPLUS, PLUS], @@ -144,7 +148,8 @@ class ClientPrefs { 'pause' => [START], 'reset' => [BACK], 'taunt' => [A], - 'sidebar' => [] + 'sidebar' => [], + 'fav' => [] ]; public static var defaultKeys:Map> = null; public static var defaultButtons:Map> = null; diff --git a/source/backend/Controls.hx b/source/backend/Controls.hx index 03fc2ad8..50d06574 100644 --- a/source/backend/Controls.hx +++ b/source/backend/Controls.hx @@ -81,12 +81,14 @@ class Controls public var RESET(get, never):Bool; public var TAUNT(get, never):Bool; public var SIDEBAR(get, never):Bool; + public var FAV(get, never):Bool; private function get_ACCEPT() return justPressed('accept'); private function get_BACK() return justPressed('back'); private function get_PAUSE() return justPressed('pause'); private function get_RESET() return justPressed('reset'); private function get_TAUNT() return justPressed('taunt'); private function get_SIDEBAR() return justPressed('sidebar'); + private function get_FAV() return justPressed('fav'); //Gamepad & Keyboard stuff public var keyboardBinds:Map>; diff --git a/source/online/GameClient.hx b/source/online/GameClient.hx index 4b1d4758..26e87cd2 100644 --- a/source/online/GameClient.hx +++ b/source/online/GameClient.hx @@ -196,9 +196,9 @@ class GameClient { options.set("skinURL", OnlineMods.getModURL(ClientPrefs.data.modSkin[0])); } - if (asHost) { - options.set("gameplaySettings", ClientPrefs.data.gameplaySettings); - } + // if (asHost) { + // options.set("gameplaySettings", ClientPrefs.data.gameplaySettings); + // } return options; } diff --git a/source/online/states/OnlineState.hx b/source/online/states/OnlineState.hx index 12b18c13..73b2abfd 100644 --- a/source/online/states/OnlineState.hx +++ b/source/online/states/OnlineState.hx @@ -332,6 +332,17 @@ class OnlineState extends MusicBeatState { // FlxG.openURL(GameClient.serverAddress + "/rooms"); FlxG.switchState(() -> new FindRoomState()); case "host": + var count:Float = 0; + for (mod in Mods.getModDirectories()) { + var url = OnlineMods.getModURL(mod); + if (url == null || !(url.startsWith('https://') || url.startsWith('http://'))) + count++; + } + + if (count > 0) { + Alert.alert('WARNING', count + ' of your mods doesn\'t have a valid URL set!'); + } + disableInput = true; GameClient.createRoom(GameClient.serverAddress, onRoomJoin); case "options": diff --git a/source/online/states/ResultsState.hx b/source/online/states/ResultsState.hx index d9bcc902..97703c0c 100644 --- a/source/online/states/ResultsState.hx +++ b/source/online/states/ResultsState.hx @@ -199,13 +199,13 @@ class ResultsState extends MusicBeatState { switch (GameClient.room.state.winCondition) { case 0: - winner = (getPlayer(1).score >= getPlayer(2).score ? 0 : 1); - if (getPlayer(1).score == getPlayer(2).score) - winner = -1; - case 1: winner = (p1Accuracy >= p2Accuracy ? 0 : 1); if (p1Accuracy == p2Accuracy) winner = -1; + case 1: + winner = (getPlayer(1).score >= getPlayer(2).score ? 0 : 1); + if (getPlayer(1).score == getPlayer(2).score) + winner = -1; case 2: winner = (getPlayer(1).misses <= getPlayer(2).misses ? 0 : 1); if (getPlayer(1).misses == getPlayer(2).misses) @@ -416,7 +416,7 @@ class ResultsState extends MusicBeatState { if (FlxG.keys.justPressed.F12) { trace('reloading lumod'); Lumod.cache.scripts.clear(); - luaLoad(); + lmLoad(); } if (luaValue == false) diff --git a/source/online/states/RoomState.hx b/source/online/states/RoomState.hx index 6ae78b02..63bbf6b2 100644 --- a/source/online/states/RoomState.hx +++ b/source/online/states/RoomState.hx @@ -615,7 +615,7 @@ class RoomState extends MusicBeatState { if (FlxG.keys.justPressed.F12) { trace('reloading lumod'); Lumod.cache.scripts.clear(); - luaLoad(); + lmLoad(); } if (!GameClient.isConnected()) diff --git a/source/online/states/SetupModsState.hx b/source/online/states/SetupModsState.hx index 21f4a1b6..1b2e8e79 100644 --- a/source/online/states/SetupModsState.hx +++ b/source/online/states/SetupModsState.hx @@ -151,10 +151,11 @@ class SetupModsState extends MusicBeatState { item.text = "> " + item.text + " <"; item.alpha = 1; } - if (modsInput[item.ID].startsWith("http://") || modsInput[item.ID].startsWith("https://")) - item.color = FlxColor.LIME; - else + + if (modsInput[item.ID] == null || !(modsInput[item.ID].startsWith('https://') || modsInput[item.ID].startsWith('http://'))) item.color = FlxColor.RED; + else + item.color = FlxColor.LIME; item.screenCenter(X); } } diff --git a/source/online/states/SkinsState.hx b/source/online/states/SkinsState.hx index bac30b66..9fbf2bd8 100644 --- a/source/online/states/SkinsState.hx +++ b/source/online/states/SkinsState.hx @@ -374,7 +374,7 @@ class SkinsState extends MusicBeatState { camFollow.setPosition(FlxG.width / 2, FlxG.height / 2); if (stopUpdates) { - camFollow.y += !ClientPrefs.data.lowQuality ? 800 : 200; + camFollow.y += !ClientPrefs.data.lowQuality ? 600 : 200; return; } @@ -396,6 +396,9 @@ class SkinsState extends MusicBeatState { if (controls.NOTE_RIGHT) { character.members[0].playAnim("singRIGHT"); } + if (controls.TAUNT) { + character.members[0].playAnim("taunt"); + } } } else { @@ -433,11 +436,7 @@ class SkinsState extends MusicBeatState { })); } - if (controls.BACK) { - switchState(() -> Type.createInstance(backClass, [])); - } - - if (controls.ACCEPT) { + if (!FlxG.keys.pressed.SHIFT && controls.ACCEPT) { var charName = charactersName[curCharacter]; if (charName.endsWith("-player")) charName = charName.substring(0, charName.length - "-player".length); @@ -468,6 +467,10 @@ class SkinsState extends MusicBeatState { character.members[0].playAnim("hey", true); } + if (controls.BACK || (!FlxG.keys.pressed.SHIFT && controls.ACCEPT)) { + switchState(() -> Type.createInstance(backClass, [])); + } + if (FlxG.keys.justPressed.EIGHT) { Mods.currentModDirectory = charactersMod.get(charactersName[curCharacter]); switchState(() -> new CharacterEditorState(charactersName[curCharacter], false, true)); diff --git a/source/online/substates/RoomSettingsSubstate.hx b/source/online/substates/RoomSettingsSubstate.hx index 11acad09..1ea4f45f 100644 --- a/source/online/substates/RoomSettingsSubstate.hx +++ b/source/online/substates/RoomSettingsSubstate.hx @@ -119,9 +119,9 @@ class RoomSettingsSubstate extends MusicBeatSubstate { if (GameClient.room.state.winCondition != prevCond) { switch (GameClient.room.state.winCondition) { case 0: - winCondition.descText.text = 'Player with the most Score wins!'; - case 1: winCondition.descText.text = 'Player with the highest Accuracy wins!'; + case 1: + winCondition.descText.text = 'Player with the most Score wins!'; case 2: winCondition.descText.text = 'Player with the least Misses wins!'; case 3: diff --git a/source/options/ControlsSubState.hx b/source/options/ControlsSubState.hx index c58db57e..11b9e180 100644 --- a/source/options/ControlsSubState.hx +++ b/source/options/ControlsSubState.hx @@ -35,6 +35,7 @@ class ControlsSubState extends MusicBeatSubstate [true, 'Back', 'back', 'Back'], [true, 'Pause', 'pause', 'Pause'], [true, 'Sidebar', 'sidebar', 'Sidebar'], + [true, 'Favorite', 'fav', 'Favorite'], [false], [false, 'VOLUME'], [false, 'Mute', 'volume_mute', 'Volume Mute'], diff --git a/source/options/GameplaySettingsSubState.hx b/source/options/GameplaySettingsSubState.hx index a90e9d42..98006e37 100644 --- a/source/options/GameplaySettingsSubState.hx +++ b/source/options/GameplaySettingsSubState.hx @@ -133,6 +133,12 @@ class GameplaySettingsSubState extends BaseOptionsMenu 'bool'); addOption(option); + var option:Option = new Option('Modchart Skin Changes', + 'If enabled, the song events will change the character of your active skin', + 'modchartSkinChanges', + 'bool'); + addOption(option); + super(); } diff --git a/source/options/VisualsUISubState.hx b/source/options/VisualsUISubState.hx index b827aa61..c705adc7 100644 --- a/source/options/VisualsUISubState.hx +++ b/source/options/VisualsUISubState.hx @@ -202,7 +202,7 @@ class VisualsUISubState extends BaseOptionsMenu "How should songs on Freeplay menu be group by?", 'groupSongsBy', 'string', - ['No Grouping', 'Alphabetically', 'Modpack', 'Hidden']); + ['No Grouping', 'Alphabetically', 'Modpack', 'Favorites', 'Hidden']); addOption(option); super(); diff --git a/source/states/FreeplayState.hx b/source/states/FreeplayState.hx index f36a4cb4..5ad69e65 100644 --- a/source/states/FreeplayState.hx +++ b/source/states/FreeplayState.hx @@ -34,6 +34,7 @@ import backend.WeekData; import backend.Highscore; import backend.Song; import openfl.media.Sound; +import flixel.system.FlxAssets.FlxGraphicAsset; import lime.utils.Assets; import openfl.utils.Assets as OpenFlAssets; @@ -78,6 +79,7 @@ class FreeplayState extends MusicBeatState private var grpSongs:FlxTypedGroup; private var grpIcons:FlxTypedGroup; + private var grpHearts:FlxTypedGroup; private var curPlaying:Bool = false; private var initSongs:Array = []; @@ -100,6 +102,8 @@ class FreeplayState extends MusicBeatState var selectedScore:Int = 0; static var bustSound:FlxSound; + static var favSound:FlxSound; + static var unfavSound:FlxSound; var explods:FlxTypedGroup; // var dTime:Alphabet = new Alphabet(0, 0, "0:00", false); @@ -227,6 +231,11 @@ class FreeplayState extends MusicBeatState grpIcons.cameras = [itemsCamera]; add(grpIcons); + grpHearts = new FlxTypedGroup(); + grpHearts.cameras = [itemsCamera]; + grpHearts.recycle(Heart); + add(grpHearts); + // if (!ClientPrefs.data.disableFreeplayAlphabet) randomText = new Alphabet(90, 320, "RANDOM", true); // else @@ -262,6 +271,18 @@ class FreeplayState extends MusicBeatState bustSound.persist = true; } + if (favSound == null) { + favSound = new FlxSound(); + favSound.loadEmbedded(Paths.sound('fav')); + favSound.persist = true; + } + + if (unfavSound == null) { + unfavSound = new FlxSound(); + unfavSound.loadEmbedded(Paths.sound('unfav')); + unfavSound.persist = true; + } + explods = new FlxTypedGroup(); explods.cameras = [itemsCamera]; explods.add(new Explod()); @@ -317,27 +338,36 @@ class FreeplayState extends MusicBeatState newGroup = MIX; case 'Hidden': newGroup = HIDDEN; + case 'Favorites': + newGroup = FAV; default: newGroup = NONE; } if (newGroup != searchGroup) { searchGroup = newGroup; searchGroupValue = 0; + } - switch (searchGroup) { - case ALPHABET: - searchGroupVList = ['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op', 'qr', 'st', 'uv', 'wx', 'yz']; - case MOD: - searchGroupVList = modList; - case MIX: - searchGroupVList = []; - case HIDDEN: - searchGroupVList = ['Hidden', 'Visible']; - default: - searchGroupVList = []; - } + switch (searchGroup) { + case ALPHABET: + searchGroupVList = ['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op', 'qr', 'st', 'uv', 'wx', 'yz']; + case MOD: + searchGroupVList = modList; + case MIX: + searchGroupVList = []; + case HIDDEN: + searchGroupVList = ['Hidden', 'Visible']; + case FAV: + searchGroupVList = ['Favorites', 'Not Favorited']; + default: + searchGroupVList = []; } + if (searchGroupValue < 0) + searchGroupValue = 0; + if (searchGroupValue > searchGroupVList.length - 1) + searchGroupValue = searchGroupVList.length - 1; + scoreText = new FlxText(FlxG.width * 0.7, 5, 0, "", 32); scoreText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, RIGHT); scoreText.scrollFactor.set(); @@ -706,6 +736,24 @@ class FreeplayState extends MusicBeatState holdTime = 0; } + if (controls.FAV && curSelected != -1) { + var songId = songs[curSelected].songName + '-' + songs[curSelected].folder; + if (ClientPrefs.data.favSongs.contains(songId)) { + ClientPrefs.data.favSongs.remove(songId); + + unfavSound.volume = 1; + unfavSound.play(true); + } + else { + ClientPrefs.data.favSongs.push(songId); + + favSound.volume = 1; + favSound.play(true); + } + ClientPrefs.saveSettings(); + search(); + } + if (controls.RESET && curSelected != -1 && !FlxG.keys.pressed.ALT) { var songId = songs[curSelected].songName + '-' + songs[curSelected].folder; if (ClientPrefs.data.hiddenSongs.contains(songId)) { @@ -1498,7 +1546,7 @@ class FreeplayState extends MusicBeatState private function updateGroupTitle() { var textValue = ''; switch (searchGroup) { - case MOD, HIDDEN: + case MOD, HIDDEN, FAV: textValue = searchGroupVList[searchGroupValue] ?? ''; case ALPHABET: textValue = searchGroupVList[searchGroupValue].charAt(0).toUpperCase() + '-' + searchGroupVList[searchGroupValue].charAt(1).toUpperCase(); @@ -1716,9 +1764,13 @@ class FreeplayState extends MusicBeatState function search(?init:Bool = false) { grpIcons.clear(); grpSongs.clear(); + grpHearts.killMembers(); _lastVisibles = []; songs = []; + if (!init) + instPlaying = -1; + if (searchGroupValue < 0) searchGroupValue = searchGroupVList.length - 1; if (searchGroupValue > searchGroupVList.length - 1) @@ -1751,6 +1803,14 @@ class FreeplayState extends MusicBeatState continue; } + var isFavorited = ClientPrefs.data.favSongs.contains(song.songName + '-' + song.folder); + if (searchGroup == FAV) { + if (isFavorited && searchGroupValue == 1) + continue; + if (!isFavorited && searchGroupValue == 0) + continue; + } + if ( searchString.length < 1 || song.songName.toLowerCase().replace('-', ' ').contains(searchString.toLowerCase()) || @@ -1769,6 +1829,17 @@ class FreeplayState extends MusicBeatState grpIcons.add(arr[1]); // icon } songs.push(song); + + if (isFavorited) { + grpHearts.recycle(Heart).target = arr[1]; + } + + var diff = Difficulty.getString(curDifficulty); + var trackSuffix = diff == "Erect" || diff == "Nightmare" ? "-erect" : ""; + var track = song.songName.toLowerCase() + trackSuffix; + if (track == trackPlaying) + instPlaying = i; + i++; } } @@ -1825,7 +1896,6 @@ class FreeplayState extends MusicBeatState return; } - instPlaying = -1; changeSelection(); updateTexts(); } @@ -1906,6 +1976,7 @@ enum GroupType { MOD; MIX; HIDDEN; + FAV; } class Explod extends FlxSprite { @@ -1947,4 +2018,42 @@ class Explod extends FlxSprite { super.update(elapsed); } +} + +class Heart extends LockInSprite { + public function new(?target:FlxSprite) { + super(target, Paths.image('heart')); + } +} + +class LockInSprite extends FlxSprite { + public var target(default, set):FlxSprite; + + public function new(target:FlxSprite, ?asset:FlxGraphicAsset) { + super(0, 0, asset); + + this.target = target; + } + + override function update(elapsed) { + super.update(elapsed); + + if (target == null || !target.alive) { + kill(); + return; + } + + x = target.x; + y = target.y; + alpha = target.alpha; + scale.x = target.scale.x; + scale.y = target.scale.y; + visible = target.active && target.visible; + } + + function set_target(v:FlxSprite) { + target = v; + revive(); + return target; + } } \ No newline at end of file diff --git a/source/states/MainMenuState.hx b/source/states/MainMenuState.hx index beec58c0..ceab0ec0 100644 --- a/source/states/MainMenuState.hx +++ b/source/states/MainMenuState.hx @@ -15,6 +15,7 @@ import objects.AchievementPopup; import states.editors.MasterEditorMenu; import options.OptionsState; +@:build(lumod.LuaScriptClass.build()) class MainMenuState extends MusicBeatState { public static var psychEngineVersion:String = '0.7.1h'; // This is also used for Discord RPC @@ -40,10 +41,6 @@ class MainMenuState extends MusicBeatState public function new() { super(); - - // if (TitleState.offlineMode) { - // optionShit.remove('online'); - // } } override function create() diff --git a/source/states/PlayState.hx b/source/states/PlayState.hx index 6b153e73..97b27dc8 100644 --- a/source/states/PlayState.hx +++ b/source/states/PlayState.hx @@ -272,6 +272,7 @@ class PlayState extends MusicBeatState return cpuControlled; } public var practiceMode:Bool = false; + public var noSpecialNotes:Bool = false; public var botplaySine:Float = 0; @:unreflective public var botplayTxt:FlxText; @@ -547,6 +548,7 @@ class PlayState extends MusicBeatState practiceMode = ClientPrefs.getGameplaySetting('practice'); cpuControlled = ClientPrefs.getGameplaySetting('botplay'); opponentMode = ClientPrefs.getGameplaySetting('opponentplay'); + noSpecialNotes = ClientPrefs.getGameplaySetting('nospecialnotes'); }); preloadTasks.push(() -> { @@ -1297,29 +1299,40 @@ class PlayState extends MusicBeatState public function addCharacterToList(newCharacter:String, type:Int) { switch(type) { case 0: - if (boyfriend.isSkin) + if (!ClientPrefs.data.modchartSkinChanges && boyfriend.isSkin) return; if(!boyfriendMap.exists(newCharacter)) { - var newBoyfriend:Character = new Character(0, 0, newCharacter, true); + var newBoyfriend:Character; + if (boyfriend.isSkin && newCharacter == SONG.player1) + newBoyfriend = boyfriend; + else { + newBoyfriend = new Character(0, 0, newCharacter, true); + boyfriendGroup.add(newBoyfriend); + startCharacterPos(newBoyfriend); + newBoyfriend.alpha = 0.00001; + startCharacterScripts(newBoyfriend.curCharacter); + } + boyfriendMap.set(newCharacter, newBoyfriend); - boyfriendGroup.add(newBoyfriend); - startCharacterPos(newBoyfriend); - newBoyfriend.alpha = 0.00001; - startCharacterScripts(newBoyfriend.curCharacter); } case 1: - if (dad.isSkin) + if (!ClientPrefs.data.modchartSkinChanges && dad.isSkin) return; if(!dadMap.exists(newCharacter)) { - var newDad:Character = new Character(0, 0, newCharacter); + var newDad:Character; + if (dad.isSkin && newCharacter == SONG.player2) + newDad = dad; + else { + newDad = new Character(0, 0, newCharacter); + dadGroup.add(newDad); + startCharacterPos(newDad, true); + newDad.alpha = 0.00001; + startCharacterScripts(newDad.curCharacter); + } dadMap.set(newCharacter, newDad); - dadGroup.add(newDad); - startCharacterPos(newDad, true); - newDad.alpha = 0.00001; - startCharacterScripts(newDad.curCharacter); } case 2: @@ -1992,9 +2005,11 @@ class PlayState extends MusicBeatState } } else { - gottaHitNote = songNotes[1] > maniaKeys - 1; + gottaHitNote = songNotes[1] < maniaKeys; } + if (noSpecialNotes && songNotes[3] != null) + continue; if (playsAsBF() ? gottaHitNote : !gottaHitNote && daStrumTime - lastStrumTime > 10) { playingNoteCount++; @@ -3038,7 +3053,7 @@ class PlayState extends MusicBeatState switch(charType) { case 0: - if (boyfriend.isSkin) + if (!ClientPrefs.data.modchartSkinChanges && boyfriend.isSkin) return; if(boyfriend.curCharacter != value2) { @@ -3055,7 +3070,7 @@ class PlayState extends MusicBeatState setOnScripts('boyfriendName', boyfriend.curCharacter); case 1: - if (dad.isSkin) + if (!ClientPrefs.data.modchartSkinChanges && dad.isSkin) return; if(dad.curCharacter != value2) { @@ -4380,15 +4395,15 @@ class PlayState extends MusicBeatState } super.stepHit(); - - if (!GameClient.isConnected() && swingMode && (curStep % 4 == 3)) { // here in the funkin crew we call that a functional audio resyncing algorithm - setSongTime(Conductor.songPosition + Conductor.calculateCrochet(Conductor.bpm) / 4); - } if(curStep == lastStepHit) { return; } + if (!GameClient.isConnected() && swingMode && (curStep % 4 == 3)) { // here in the funkin crew we call that a functional audio resyncing algorithm + setSongTime(Conductor.songPosition + Conductor.calculateCrochet(Conductor.bpm) / 4); + } + lastStepHit = curStep; setOnScripts('curStep', curStep); callOnScripts('onStepHit'); @@ -4893,7 +4908,7 @@ class PlayState extends MusicBeatState #end function isInvalidScore() { - return cpuControlled || controls.moodyBlues != null; + return cpuControlled || controls.moodyBlues != null || noSpecialNotes; } // MULTIPLAYER STUFF HERE diff --git a/source/states/TitleState.hx b/source/states/TitleState.hx index ed2934c3..c8e0d313 100644 --- a/source/states/TitleState.hx +++ b/source/states/TitleState.hx @@ -358,6 +358,11 @@ class TitleState extends MusicBeatState override function update(elapsed:Float) { + if (FlxG.keys.justPressed.DELETE) { + lumod.Lumod.cache.scripts.clear(); + trace("cleared lumod cache"); + } + if (FlxG.sound.music != null) Conductor.songPosition = FlxG.sound.music.time; // FlxG.watch.addQuick('amp', FlxG.sound.music.amplitude); diff --git a/source/substates/GameplayChangersSubstate.hx b/source/substates/GameplayChangersSubstate.hx index 2d55b66b..41f93e6f 100644 --- a/source/substates/GameplayChangersSubstate.hx +++ b/source/substates/GameplayChangersSubstate.hx @@ -83,6 +83,9 @@ class GameplayChangersSubstate extends MusicBeatSubstate optionsArray.push(option); } + var option:GameplayOption = new GameplayOption('No Special Notes', 'nospecialnotes', 'bool', false); + optionsArray.push(option); + GameClient.send("status", "In the Game Changers Menu"); }