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); } } }