Skip to content

Commit 0d9360f

Browse files
NexIsDumbFuroYT
authored andcommitted
Bring dev/scripted-game-modes
1 parent 1cfe6ca commit 0d9360f

File tree

19 files changed

+323
-107
lines changed

19 files changed

+323
-107
lines changed

assets/data/gamemodes/botplay.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"displayName": "Botplay Mode",
3+
"modeID": "codename.botplay"
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"displayName": "Co-Op Mode (Switched)",
3+
"modeID": "codename.coop-opponent",
4+
"scripts": ["opponent", "coop"]
5+
}

assets/data/gamemodes/coop.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"displayName": "Co-Op Mode",
3+
"modeID": "codename.coop"
4+
}

assets/data/gamemodes/list.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
solo
2+
opponent
3+
coop
4+
coop-switched
5+
botplay
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"displayName": "Opponent Mode",
3+
"modeID": "codename.opponent"
4+
}

assets/data/gamemodes/solo.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"displayName": "Solo Mode",
3+
"modeID": "codename.solo"
4+
}

source/funkin/backend/chart/Chart.hx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,41 @@ class Chart {
9797
data.setFieldDefault("vocalsSuffix", "");
9898
data.setFieldDefault("needsVoices", true);
9999
data.setFieldDefault("difficulties", []);
100+
101+
var songNameLower = songName.toLowerCase();
102+
var metaPath = Paths.file('songs/${songNameLower}/meta.json');
103+
var metaDiffPath = Paths.file('songs/${songNameLower}/meta-${difficulty.toLowerCase()}.json');
104+
105+
var blacklist:Array<String> = [];
106+
var data:ChartMetaData = null;
107+
var fromMods:Bool = fromMods;
108+
for (path in [metaDiffPath, metaPath]) {
109+
if (Assets.exists(path)) {
110+
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
111+
try {
112+
var temp = CoolUtil.parseJson(path);
113+
114+
// Backwards compatibility (they both can be null so != true) - Nex
115+
var coopExlc = false;
116+
if (Reflect.hasField(temp, "coopAllowed") && Reflect.field(temp, "coopAllowed") != true) {
117+
blacklist = blacklist.concat(["codename.coop", "codename.coop-opponent"]);
118+
Reflect.deleteField(temp, "coopAllowed");
119+
coopExlc = true;
120+
}
121+
if (Reflect.hasField(temp, "opponentModeAllowed") && Reflect.field(temp, "opponentModeAllowed") != true) {
122+
if (!coopExlc) blacklist.push("codename.coop-opponent");
123+
blacklist.push("codename.opponent");
124+
Reflect.deleteField(temp, "opponentModeAllowed");
125+
}
126+
127+
data = temp;
128+
} catch(e) {
129+
Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
130+
}
131+
if (data != null) break;
132+
}
133+
}
134+
data.setFieldDefault("excludedGameModes", blacklist);
100135
data.setFieldDefault("variants", []);
101136
data.setFieldDefault("metas", []);
102137

source/funkin/backend/chart/ChartData.hx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ typedef ChartMetaData = {
3232
public var ?icon:String;
3333
public var ?color:FlxColor;
3434

35-
public var ?coopAllowed:Bool;
36-
public var ?opponentModeAllowed:Bool;
35+
public var ?excludedGameModes:Array<String>;
3736

3837
public var ?metas:Map<String, ChartMetaData>;
3938
public var ?instSuffix:String;

source/funkin/backend/scripting/Script.hx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,4 +402,4 @@ class Script extends FlxBasic implements IFlxDestroyable {
402402
* Called when the script is loaded.
403403
*/
404404
public function onLoad() {}
405-
}
405+
}

source/funkin/backend/scripting/events/menu/freeplay/FreeplaySongSelectEvent.hx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package funkin.backend.scripting.events.menu.freeplay;
22

3+
import funkin.menus.FreeplayState.FreeplayGameMode;
4+
35
final class FreeplaySongSelectEvent extends CancellableEvent {
46
/**
57
* Song name that is about to be played
@@ -14,11 +16,26 @@ final class FreeplaySongSelectEvent extends CancellableEvent {
1416
*/
1517
public var variant:String;
1618
/**
17-
* Whenever opponent mode is enabled or not.
18-
*/
19-
public var opponentMode:Bool;
20-
/**
21-
* Whenever coop mode is enabled.
19+
* Used game mode's data.
2220
*/
23-
public var coopMode:Bool;
21+
public var gameMode:FreeplayGameMode;
22+
23+
24+
// Backwards compat
25+
@:noCompletion public var opponentMode(get, set):Bool;
26+
@:noCompletion private function get_opponentMode() return gameMode.modeID == "codename.opponent" || gameMode.modeID == "codename.coop-opponent";
27+
@:noCompletion private function set_opponentMode(val:Bool) {
28+
gameMode = coopMode ?
29+
(val ? new FreeplayGameMode("Co-Op Mode (Switched)", "codename.coop-opponent", ["coop-switched", "opponent", "coop"]) : new FreeplayGameMode("Opponent Mode", "codename.opponent", ["opponent"])) :
30+
(val ? new FreeplayGameMode("Opponent Mode", "codename.opponent", ["opponent"]) : null);
31+
return val;
32+
}
33+
@:noCompletion public var coopMode(get, set):Bool;
34+
@:noCompletion private function get_coopMode() return gameMode.modeID == "codename.coop" || gameMode.modeID == "codename.coop-opponent";
35+
@:noCompletion private function set_coopMode(val:Bool) {
36+
gameMode = opponentMode ?
37+
(val ? new FreeplayGameMode("Co-Op Mode (Switched)", "codename.coop-opponent", ["coop-switched", "opponent", "coop"]) : new FreeplayGameMode("Co-Op Mode", "codename.coop", ["coop"])) :
38+
(val ? new FreeplayGameMode("Co-Op Mode", "codename.coop", ["coop"]) : null);
39+
return val;
40+
}
2441
}

0 commit comments

Comments
 (0)