From 120b9bdf0e241b0fc579aad2ce481315cfc00ee8 Mon Sep 17 00:00:00 2001
From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com>
Date: Wed, 10 Jul 2024 12:13:04 +0530
Subject: [PATCH] various fixes: platinum gem on end game, fix spawn chances,
fix weird states regarding player leaves
---
src/DifBuilder.hx | 4 +--
src/MarbleWorld.hx | 7 +++++
src/gui/MPEndGameGui.hx | 39 +++++++++++++++++++------
src/gui/MPPreGameDlg.hx | 14 +++++++++
src/gui/PlayGui.hx | 8 +++++-
src/modes/HuntMode.hx | 64 ++++++++++++++++++++++-------------------
src/net/NetCommands.hx | 11 -------
src/net/NetPacket.hx | 4 +++
8 files changed, 99 insertions(+), 52 deletions(-)
diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx
index 2f134a81..75753e8b 100644
--- a/src/DifBuilder.hx
+++ b/src/DifBuilder.hx
@@ -375,9 +375,9 @@ class DifBuilder {
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
- 'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2_medium' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
+ 'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2_medium' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2_medium.png',
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
- 'multiplayer/interiors/platinumquest/pq_ray_wall_combo_small' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo.png',
+ 'multiplayer/interiors/platinumquest/pq_ray_wall_combo_small' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_small.png',
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
];
diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx
index 1596950f..b743533d 100644
--- a/src/MarbleWorld.hx
+++ b/src/MarbleWorld.hx
@@ -2071,10 +2071,17 @@ class MarbleWorld extends Scheduler {
#if js
lock = true;
+ var loadPerTick = 500; // Stack limits???
+ var loadedFuncs = 0;
var func = this.resourceLoadFuncs.shift();
var consumeFn;
consumeFn = () -> {
+ if (loadedFuncs >= loadPerTick) {
+ lock = false;
+ return;
+ }
+ loadedFuncs += 1;
this._resourcesLoaded++;
this.loadingGui.setProgress((1 - resourceLoadFuncs.length / _loadingLength));
if (this.resourceLoadFuncs.length != 0) {
diff --git a/src/gui/MPEndGameGui.hx b/src/gui/MPEndGameGui.hx
index 1ac4902d..336c903b 100644
--- a/src/gui/MPEndGameGui.hx
+++ b/src/gui/MPEndGameGui.hx
@@ -141,15 +141,23 @@ class MPEndGameGui extends GuiImage {
middleCtrl.extent = new Vector(800, 480);
this.addChild(middleCtrl);
+ var hasPlatinum = false;
+ var scores = @:privateAccess MarbleGame.instance.world.playGui.playerList;
+ for (player in scores) {
+ if (player.p > 0) {
+ hasPlatinum = true;
+ break;
+ }
+ }
+
var headerML = new GuiText(domcasual36);
headerML.position = new Vector(25, 83);
headerML.extent = new Vector(750, 14);
headerML.horizSizing = Width;
headerML.text.textColor = 0xFFFFFF;
- headerML.text.text = " Name Score Marble";
+ headerML.text.text = ' Name Score ${hasPlatinum ? " " : ""} Marble';
middleCtrl.addChild(headerML);
- var scores = @:privateAccess MarbleGame.instance.world.playGui.playerList;
var ourRank = scores.indexOf(scores.filter(x -> x.us == true)[0]) + 1;
var rankSuffix = ourRank == 1 ? "st" : (ourRank == 2 ? "nd" : (ourRank == 3 ? "rd" : "th"));
@@ -181,6 +189,10 @@ class MPEndGameGui extends GuiImage {
middleCtrl.addChild(yellowGem);
var blueGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(469, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "blue.gem"]);
middleCtrl.addChild(blueGem);
+ if (hasPlatinum) {
+ var platinumGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(521, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "platinum.gem"]);
+ middleCtrl.addChild(platinumGem);
+ }
var playerContainer = new GuiControl();
playerContainer.horizSizing = Center;
@@ -191,7 +203,7 @@ class MPEndGameGui extends GuiImage {
var idx = 0;
- function addPlayer(rank:Int, playerName:String, score:Int, r:Int, y:Int, b:Int, marbleCat:Int, marbleSel:Int) {
+ function addPlayer(rank:Int, playerName:String, score:Int, r:Int, y:Int, b:Int, p:Int, marbleCat:Int, marbleSel:Int) {
var container = new GuiControl();
container.position = new Vector(0, 44 * idx);
container.extent = new Vector(750, 44);
@@ -227,16 +239,27 @@ class MPEndGameGui extends GuiImage {
container.addChild(playerY);
var playerB = new GuiText(domcasual36);
- playerB.text.textColor = 0x0000FF;
+ playerB.text.textColor = 0x4040FF;
playerB.text.text = '${b}';
playerB.justify = Center;
playerB.position = new Vector(452, 3);
playerB.extent = new Vector(52, 14);
container.addChild(playerB);
- var marble = buildObjectShow(MarbleSelectGui.marbleData[marbleCat][marbleSel].dts, new Vector(524, -10), new Vector(64, 64), 2.4, 0, [
- "base.marble" => MarbleSelectGui.marbleData[marbleCat][marbleSel].skin + ".marble"
- ]);
+ if (hasPlatinum) {
+ var playerB = new GuiText(domcasual36);
+ playerB.text.textColor = 0xCCCCCC;
+ playerB.text.text = '${p}';
+ playerB.justify = Center;
+ playerB.position = new Vector(504, 3);
+ playerB.extent = new Vector(52, 14);
+ container.addChild(playerB);
+ }
+
+ var marble = buildObjectShow(MarbleSelectGui.marbleData[marbleCat][marbleSel].dts, new Vector((hasPlatinum ? 52 : 0) + 524, -10),
+ new Vector(64, 64), 2.4, 0, [
+ "base.marble" => MarbleSelectGui.marbleData[marbleCat][marbleSel].skin + ".marble"
+ ]);
container.addChild(marble);
@@ -255,7 +278,7 @@ class MPEndGameGui extends GuiImage {
marb = c.marbleId;
}
- addPlayer(r, player.name, player.score, player.r, player.y, player.b, cat, marb);
+ addPlayer(r, player.name, player.score, player.r, player.y, player.b, player.p, cat, marb);
r += 1;
}
}
diff --git a/src/gui/MPPreGameDlg.hx b/src/gui/MPPreGameDlg.hx
index c2154ba6..46b0f43b 100644
--- a/src/gui/MPPreGameDlg.hx
+++ b/src/gui/MPPreGameDlg.hx
@@ -58,6 +58,10 @@ class MPPreGameDlg extends GuiControl {
leaveBtn.extent = new Vector(94, 45);
leaveBtn.pressedAction = (e) -> {
MarbleGame.instance.quitMission(true);
+ if (Net.isMP && Net.isClient) {
+ Net.disconnect();
+ MarbleGame.canvas.setContent(new JoinServerGui());
+ }
}
dialogImg.addChild(leaveBtn);
@@ -240,6 +244,8 @@ class MPPreGameDlg extends GuiControl {
ready: Net.lobbyHostReady,
spectate: Net.hostSpectate
});
+ spectateBtn.pressed = Net.hostSpectate;
+ readyBtn.pressed = Net.lobbyHostReady;
}
if (Net.isClient) {
playerListArr.push({
@@ -247,6 +253,8 @@ class MPPreGameDlg extends GuiControl {
ready: Net.lobbyClientReady,
spectate: Net.clientSpectate
});
+ spectateBtn.pressed = Net.clientSpectate;
+ readyBtn.pressed = Net.lobbyClientReady;
}
if (Net.clientIdMap != null) {
for (c => v in Net.clientIdMap) {
@@ -279,6 +287,12 @@ class MPPreGameDlg extends GuiControl {
playerListLeft.setTexts(playerListCompiled);
playerListRight.setTexts(playerListStateCompiled);
+ if (playerListArr.length == 1) {
+ // Disable spectating
+ Net.hostSpectate = false;
+ Net.clientSpectate = false;
+ }
+
// if (!showingCustoms)
// playerList.setTexts(playerListArr.map(player -> {
// return '
${player.name}';
diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx
index 9bfd74b0..7ce2826c 100644
--- a/src/gui/PlayGui.hx
+++ b/src/gui/PlayGui.hx
@@ -51,6 +51,7 @@ class PlayerInfo {
var r:Int;
var y:Int;
var b:Int;
+ var p:Int;
}
class PlayGui {
@@ -720,7 +721,8 @@ class PlayGui {
score: 0,
r: 0,
y: 0,
- b: 0
+ b: 0,
+ p: 0
});
redrawPlayerList();
}
@@ -748,6 +750,9 @@ class PlayGui {
if (score == 5) {
f[0].b += 1;
}
+ if (score == 10) {
+ f[0].p += 1;
+ }
}
if (id == Net.clientId) {
@@ -765,6 +770,7 @@ class PlayGui {
player.r = scoreboardPacket.rBoard.exists(player.id) ? scoreboardPacket.rBoard.get(player.id) : 0;
player.y = scoreboardPacket.yBoard.exists(player.id) ? scoreboardPacket.yBoard.get(player.id) : 0;
player.b = scoreboardPacket.bBoard.exists(player.id) ? scoreboardPacket.bBoard.get(player.id) : 0;
+ player.p = scoreboardPacket.pBoard.exists(player.id) ? scoreboardPacket.pBoard.get(player.id) : 0;
}
redrawPlayerList();
}
diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx
index a913257c..e7013f8c 100644
--- a/src/modes/HuntMode.hx
+++ b/src/modes/HuntMode.hx
@@ -228,7 +228,7 @@ class HuntMode extends NullMode {
}
override function getPreloadFiles() {
- return ['data/sound/opponentdiamond.wav'];
+ return ['data/sound/opponentdiamond.wav', 'data/sound/firewrks.wav'];
}
function setupGems() {
@@ -285,33 +285,36 @@ class HuntMode extends NullMode {
var pos = furthest.gem.getAbsPos().getPosition();
var results = [];
- var search = gemOctree.radiusSearch(pos, gemGroupRadius);
- for (elem in search) {
- var gemElem:GemSpawnPoint = cast elem;
- var gemPos = gemElem.gem.getAbsPos().getPosition();
+ while (results.length == 0) {
+ var search = gemOctree.radiusSearch(pos, gemGroupRadius);
+ for (elem in search) {
+ var gemElem:GemSpawnPoint = cast elem;
+ var gemPos = gemElem.gem.getAbsPos().getPosition();
- if (level.mission.missionInfo.game == "PlatinumQuest") {
- // Spawn chances!
- var chance = switch (gemElem.gem.gemColor) {
- case "red":
- level.mission.missionInfo.spawnchancered != null ? Std.parseFloat(level.mission.missionInfo.spawnchancered) : 0.9;
- case "yellow":
- level.mission.missionInfo.spawnchanceyellow != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceyellow) : 0.65;
- case "blue":
- level.mission.missionInfo.spawnchanceblue != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceblue) : 0.35;
- case "platinum":
- level.mission.missionInfo.spawnchanceplatinum != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceplatinum) : 0.18;
- default:
- 1.0;
- };
- if (Math.random() > chance)
- continue; // Don't spawn!
+ if (level.mission.missionInfo.game == "PlatinumQuest") {
+ // Spawn chances!
+ var chance = switch (gemElem.gem.gemColor.toLowerCase()) {
+ case "red.gem":
+ level.mission.missionInfo.spawnchancered != null ? Std.parseFloat(level.mission.missionInfo.spawnchancered) : 0.9;
+ case "yellow.gem":
+ level.mission.missionInfo.spawnchanceyellow != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceyellow) : 0.65;
+ case "blue.gem":
+ level.mission.missionInfo.spawnchanceblue != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceblue) : 0.35;
+ case "platinum.gem":
+ level.mission.missionInfo.spawnchanceplatinum != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceplatinum) : 0.18;
+ default:
+ 1.0;
+ };
+ var choice = Math.random();
+ if (choice > chance)
+ continue; // Don't spawn!
+ }
+
+ results.push({
+ gem: gemElem.netIndex,
+ weight: this.gemGroupRadius - gemPos.distance(pos) + rng.randRange(0, getGemWeight(gemElem.gem) + 3)
+ });
}
-
- results.push({
- gem: gemElem.netIndex,
- weight: this.gemGroupRadius - gemPos.distance(pos) + rng.randRange(0, getGemWeight(gemElem.gem) + 3)
- });
}
results.sort((a, b) -> {
if (a.weight > b.weight)
@@ -437,13 +440,14 @@ class HuntMode extends NullMode {
}
function getGemWeight(gem:Gem) {
- if (gem.gemColor == "red")
+ var col = gem.gemColor.toLowerCase();
+ if (col == "red.gem")
return 0;
- if (gem.gemColor == "yellow")
+ if (col == "yellow.gem")
return 1;
- if (gem.gemColor == "blue")
+ if (col == "blue.gem")
return 4;
- if (gem.gemColor == "platinum")
+ if (col == "platinum.gem")
return 9;
return 0;
}
diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx
index 5ed0ebf7..e396b41d 100644
--- a/src/net/NetCommands.hx
+++ b/src/net/NetCommands.hx
@@ -284,17 +284,6 @@ class NetCommands {
var conn = Net.clientIdMap.get(clientId);
if (MarbleGame.instance.world != null) {
MarbleGame.instance.world.removePlayer(conn);
-
- var allReady = true;
- for (id => client in Net.clientIdMap) {
- if (client.state != GameplayState.GAME && client != conn) {
- allReady = false;
- break;
- }
- }
- if (allReady && MarbleGame.instance.world.serverStartTicks == 0) {
- MarbleGame.instance.world.allClientsReady();
- }
}
Net.clientIdMap.remove(clientId);
if (MarbleGame.canvas.content is MPPlayMissionGui) {
diff --git a/src/net/NetPacket.hx b/src/net/NetPacket.hx
index a06bbcc2..04e316cf 100644
--- a/src/net/NetPacket.hx
+++ b/src/net/NetPacket.hx
@@ -317,12 +317,14 @@ class ScoreboardPacket implements NetPacket {
var rBoard:Map;
var yBoard:Map;
var bBoard:Map;
+ var pBoard:Map;
public function new() {
scoreBoard = new Map();
rBoard = new Map();
yBoard = new Map();
bBoard = new Map();
+ pBoard = new Map();
}
public inline function deserialize(b:InputBitStream) {
@@ -333,6 +335,7 @@ class ScoreboardPacket implements NetPacket {
rBoard[id] = b.readInt(10);
yBoard[id] = b.readInt(10);
bBoard[id] = b.readInt(10);
+ pBoard[id] = b.readInt(10);
}
}
@@ -347,6 +350,7 @@ class ScoreboardPacket implements NetPacket {
b.writeInt(rBoard[key], 10);
b.writeInt(yBoard[key], 10);
b.writeInt(bBoard[key], 10);
+ b.writeInt(pBoard[key], 10);
}
}
}