From cc5759134251f3f6cecfc7171270a34e90985110 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Thu, 20 Jun 2024 18:24:10 +0530 Subject: [PATCH] make everything use a better performant drop shadow instead, add pre game support, more clientside fixes --- src/MarbleWorld.hx | 10 ++ src/Settings.hx | 22 ++++ src/gui/EndGameGui.hx | 112 ++++++++++++++++--- src/gui/EnterNameDlg.hx | 7 +- src/gui/JoinServerGui.hx | 22 ++-- src/gui/JukeboxDlg.hx | 14 ++- src/gui/MPExitGameDlg.hx | 29 ++++- src/gui/MPMarbleSelectGui.hx | 14 ++- src/gui/MPPlayMissionGui.hx | 34 ++++-- src/gui/MPPreGameDlg.hx | 200 ++++++++++++++++++++++++++++++++++ src/gui/MPServerDlg.hx | 137 ++++++++++++++++++++--- src/gui/MainMenuGui.hx | 7 +- src/gui/MarbleSelectGui.hx | 14 ++- src/gui/OptionsDlg.hx | 28 ++++- src/gui/PlayGui.hx | 7 +- src/gui/PlayMissionGui.hx | 36 +++++- src/net/ClientConnection.hx | 1 - src/net/MasterServerClient.hx | 49 +++------ src/net/Net.hx | 45 +++++--- src/net/NetCommands.hx | 9 ++ src/net/RPCMacro.hx | 8 ++ 21 files changed, 683 insertions(+), 122 deletions(-) create mode 100644 src/gui/MPPreGameDlg.hx diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 91d0a311..01273ff0 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,5 +1,6 @@ package src; +import gui.MPPreGameDlg; import src.Radar; import rewind.InputRecorder; import net.NetPacket.ScoreboardPacket; @@ -550,6 +551,15 @@ class MarbleWorld extends Scheduler { Net.serverInfo.state = "PLAYING"; MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state } + if (this.isMultiplayer) { + // Push the pre - game + showPreGame(); + } + } + + public function showPreGame() { + MarbleGame.canvas.pushDialog(new MPPreGameDlg()); + this.setCursorLock(false); } public function addJoiningClient(cc:GameConnection, onAdded:() -> Void) { diff --git a/src/Settings.hx b/src/Settings.hx index 2da00feb..c02a533a 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -96,6 +96,15 @@ typedef GamepadSettings = { var rewind:Array; } +typedef ServerSettings = { + var name:String; + var description:String; + var maxPlayers:Int; + var password:String; + var forceSpectators:Bool; + var quickRespawn:Bool; +} + typedef PlayStatistics = { var oobs:Int; var respawns:Int; @@ -189,6 +198,15 @@ class Settings { totalTime: 0, } + public static var serverSettings:ServerSettings = { + name: "Multiplayer Server", + password: "", + maxPlayers: 8, + description: "My cool server", + forceSpectators: false, + quickRespawn: true + } + public static var levelStatistics:Map = []; public static var highscoreName = ""; @@ -244,6 +262,7 @@ class Settings { touch: touchSettings, gamepad: gamepadSettings, stats: playStatistics, + server: serverSettings, highscoreName: highscoreName, marbleIndex: optionsSettings.marbleIndex, marbleSkin: optionsSettings.marbleSkin, @@ -379,6 +398,9 @@ class Settings { levelStatistics.set(key, value); } } + if (json.serverSettings != null) { + serverSettings = json.serverSettings; + } #if js if (optionsSettings.marbleIndex == null) { optionsSettings.marbleIndex = 0; diff --git a/src/gui/EndGameGui.hx b/src/gui/EndGameGui.hx index a97da4ff..81c35757 100644 --- a/src/gui/EndGameGui.hx +++ b/src/gui/EndGameGui.hx @@ -127,73 +127,133 @@ class EndGameGui extends GuiControl { egResult.position = new Vector(313, 54); egResult.extent = new Vector(244, 69); egResult.text.text = '

${Util.formatTime(timeState.gameplayClock)}

'; - egResult.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + egResult.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; pg.addChild(egResult); var egFirstLine = new GuiMLText(domcasual24, mlFontLoader); egFirstLine.position = new Vector(340, 150); egFirstLine.extent = new Vector(210, 25); - egFirstLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFirstLine.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFirstLine); var egSecondLine = new GuiMLText(domcasual24, mlFontLoader); egSecondLine.position = new Vector(341, 178); egSecondLine.extent = new Vector(209, 25); - egSecondLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egSecondLine.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egSecondLine); var egThirdLine = new GuiMLText(domcasual24, mlFontLoader); egThirdLine.position = new Vector(341, 206); egThirdLine.extent = new Vector(209, 25); - egThirdLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egThirdLine.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egThirdLine); var egFourthLine = new GuiMLText(domcasual24, mlFontLoader); egFourthLine.position = new Vector(341, 234); egFourthLine.extent = new Vector(209, 25); - egFourthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFourthLine.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFourthLine); var egFifthLine = new GuiMLText(domcasual24, mlFontLoader); egFifthLine.position = new Vector(341, 262); egFifthLine.extent = new Vector(209, 25); - egFifthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFifthLine.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFifthLine); var egFirstLineScore = new GuiMLText(domcasual24, mlFontLoader); egFirstLineScore.position = new Vector(475, 150); egFirstLineScore.extent = new Vector(210, 25); - egFirstLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFirstLineScore.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFirstLineScore); var egSecondLineScore = new GuiMLText(domcasual24, mlFontLoader); egSecondLineScore.position = new Vector(476, 178); egSecondLineScore.extent = new Vector(209, 25); - egSecondLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egSecondLineScore.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egSecondLineScore); var egThirdLineScore = new GuiMLText(domcasual24, mlFontLoader); egThirdLineScore.position = new Vector(476, 206); egThirdLineScore.extent = new Vector(209, 25); - egThirdLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egThirdLineScore.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egThirdLineScore); var egFourthLineScore = new GuiMLText(domcasual24, mlFontLoader); egFourthLineScore.position = new Vector(476, 234); egFourthLineScore.extent = new Vector(209, 25); - egFourthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFourthLineScore.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFourthLineScore); var egFifthLineScore = new GuiMLText(domcasual24, mlFontLoader); egFifthLineScore.position = new Vector(476, 262); egFifthLineScore.extent = new Vector(209, 25); - egFifthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + egFifthLineScore.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; pg.addChild(egFifthLineScore); var egTitleText = new GuiMLText(expo50, mlFontLoader); egTitleText.text.textColor = 0xffff00; egTitleText.text.text = 'Your Time:'; - egTitleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + egTitleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; egTitleText.position = new Vector(34, 54); egTitleText.extent = new Vector(247, 69); pg.addChild(egTitleText); @@ -202,7 +262,12 @@ class EndGameGui extends GuiControl { egTopThreeText.position = new Vector(341, 114); egTopThreeText.extent = new Vector(209, 34); egTopThreeText.text.text = 'Top 5 Times:'; // Make toggleable 3-5 - egTopThreeText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + egTopThreeText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; pg.addChild(egTopThreeText); var text = '

'; @@ -228,7 +293,12 @@ class EndGameGui extends GuiControl { var finishMessage = new GuiMLText(expo32, mlFontLoader); finishMessage.text.textColor = 0x00ff00; finishMessage.text.text = text; - finishMessage.text.filter = new DropShadow(1, 0.785, 0, 1, 0, 0.4, 1, true); + finishMessage.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; // finishMessage.justify = Center; finishMessage.position = new Vector(25, 120); finishMessage.extent = new Vector(293, 211); @@ -274,7 +344,12 @@ class EndGameGui extends GuiControl { leftColumn.text.lineSpacing = 5; leftColumn.text.textColor = 0xFFFFFF; leftColumn.text.text = 'Par Time:
${mission.game == "gold" || mission.game.toLowerCase() == "ultra" ? 'Gold Time:' : 'Platinum Time:'}
${mission.ultimateTime != 0 ? 'Ultimate Time:
' : ''}
Time Passed:
Clock Bonuses:
'; - leftColumn.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + leftColumn.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; leftColumn.position = new Vector(25, 165); leftColumn.extent = new Vector(293, 211); pg.addChild(leftColumn); @@ -286,7 +361,12 @@ class EndGameGui extends GuiControl { rightColumn.text.lineSpacing = 5; rightColumn.text.textColor = 0xFFFFFF; rightColumn.text.text = '${Util.formatTime(mission.qualifyTime == Math.POSITIVE_INFINITY ? 5999.999 : mission.qualifyTime)}
${Util.formatTime(mission.goldTime)}
${mission.ultimateTime != 0 ? '${Util.formatTime(mission.ultimateTime)}
' : ''}
${Util.formatTime(elapsedTime)}
${Util.formatTime(bonusTime)}
'; - rightColumn.text.filter = new DropShadow(1.414, 0.785, 0xffffff, 1, 0, 0.4, 1, true); + rightColumn.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0x777777 + }; rightColumn.position = new Vector(235, 165); rightColumn.extent = new Vector(293, 211); pg.addChild(rightColumn); diff --git a/src/gui/EnterNameDlg.hx b/src/gui/EnterNameDlg.hx index d82836c1..ae8ae8f7 100644 --- a/src/gui/EnterNameDlg.hx +++ b/src/gui/EnterNameDlg.hx @@ -87,7 +87,12 @@ class EnterNameDlg extends GuiControl { var enterNameText = new GuiMLText(domcasual32, mlFontLoader); enterNameText.text.textColor = 0xFFFFFF; - enterNameText.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + enterNameText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; enterNameText.position = new Vector(37, 23); enterNameText.extent = new Vector(345, 85); // enterNameText.justify = Center; diff --git a/src/gui/JoinServerGui.hx b/src/gui/JoinServerGui.hx index 1b6ecb48..3d67d6fa 100644 --- a/src/gui/JoinServerGui.hx +++ b/src/gui/JoinServerGui.hx @@ -95,15 +95,11 @@ class JoinServerGui extends GuiImage { }); }); - var maxPlayers = 8; - var privateSlots = 0; - var privateGame = false; - var hostBtn = new GuiButton(loadButtonImages("data/ui/mp/join/host")); hostBtn.position = new Vector(521, 379); hostBtn.extent = new Vector(93, 45); hostBtn.pressedAction = (e) -> { - Net.hostServer('${Settings.highscoreName}\'s Server', maxPlayers, privateSlots, privateGame, () -> { + Net.hostServer(Settings.serverSettings.name, Settings.serverSettings.description, Settings.serverSettings.maxPlayers, "", () -> { MarbleGame.canvas.setContent(new MPPlayMissionGui(true)); }); } @@ -134,7 +130,7 @@ class JoinServerGui extends GuiImage { // } } }, 15000); - Net.joinServer(ourServerList[curSelection].name, false, () -> { + Net.joinServer(ourServerList[curSelection].name, "", () -> { failed = false; Net.remoteServerInfo = ourServerList[curSelection]; }); @@ -168,7 +164,12 @@ class JoinServerGui extends GuiImage { titleText.extent = new Vector(647, 30); titleText.justify = Center; titleText.text.text = "Join Server"; - titleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + titleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; titleText.text.textColor = 0xFFFFFF; window.addChild(titleText); @@ -177,7 +178,12 @@ class JoinServerGui extends GuiImage { serverInfoHeader.extent = new Vector(210, 166); serverInfoHeader.justify = Center; serverInfoHeader.text.text = "Select a Server"; - serverInfoHeader.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + serverInfoHeader.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; serverInfoHeader.text.textColor = 0xFFFFFF; window.addChild(serverInfoHeader); diff --git a/src/gui/JukeboxDlg.hx b/src/gui/JukeboxDlg.hx index 524cc71b..1c4a8d5a 100644 --- a/src/gui/JukeboxDlg.hx +++ b/src/gui/JukeboxDlg.hx @@ -50,7 +50,12 @@ class JukeboxDlg extends GuiImage { var songTitle = new GuiMLText(markerFelt24, null); songTitle.position = new Vector(61, 262); songTitle.extent = new Vector(416, 22); - songTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000007F, 1, 0, 0.4, 1, true); + songTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; songTitle.text.textColor = 0xFFFFFF; songTitle.text.text = '

Title: ${songList[selectedIdx]}

'; this.addChild(songTitle); @@ -58,7 +63,12 @@ class JukeboxDlg extends GuiImage { var songStatus = new GuiMLText(markerFelt24, null); songStatus.position = new Vector(56, 283); songStatus.extent = new Vector(421, 22); - songStatus.text.filter = new DropShadow(1.414, 0.785, 0x0000007F, 1, 0, 0.4, 1, true); + songStatus.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; songStatus.text.textColor = 0xFFFFFF; songStatus.text.text = '

${playing ? "Playing" : "Stopped"}

'; this.addChild(songStatus); diff --git a/src/gui/MPExitGameDlg.hx b/src/gui/MPExitGameDlg.hx index 9f6a1964..8e34c33e 100644 --- a/src/gui/MPExitGameDlg.hx +++ b/src/gui/MPExitGameDlg.hx @@ -18,6 +18,13 @@ class MPExitGameDlg extends GuiControl { this.extent = new Vector(640, 480); function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed]; + } + + function loadButtonImagesExt(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -32,7 +39,7 @@ class MPExitGameDlg extends GuiControl { dialogImg.extent = new Vector(347, 250); this.addChild(dialogImg); - var partialRestart = new GuiButton(loadButtonImages("data/ui/mp/exit/partial")); + var partialRestart = new GuiButton(loadButtonImagesExt("data/ui/mp/exit/partial")); partialRestart.position = new Vector(133, 80); partialRestart.extent = new Vector(94, 45); partialRestart.vertSizing = Top; @@ -55,7 +62,7 @@ class MPExitGameDlg extends GuiControl { resumeBtn.pressedAction = (e) -> resumeFunc(); dialogImg.addChild(resumeBtn); - var serverSettingsBtn = new GuiButton(loadButtonImages("data/ui/mp/play/settings")); + var serverSettingsBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/settings")); serverSettingsBtn.position = new Vector(195, 184); serverSettingsBtn.extent = new Vector(45, 45); serverSettingsBtn.vertSizing = Top; @@ -67,7 +74,7 @@ class MPExitGameDlg extends GuiControl { serverSettingsBtn.disabled = true; } - var kickBtn = new GuiButton(loadButtonImages("data/ui/mp/play/kick")); + var kickBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/kick")); kickBtn.position = new Vector(108, 184); kickBtn.extent = new Vector(45, 45); kickBtn.vertSizing = Top; @@ -82,7 +89,7 @@ class MPExitGameDlg extends GuiControl { quickspawnBtn.vertSizing = Top; dialogImg.addChild(quickspawnBtn); - var completeRestart = new GuiButton(loadButtonImages("data/ui/mp/exit/complete")); + var completeRestart = new GuiButton(loadButtonImagesExt("data/ui/mp/exit/complete")); completeRestart.position = new Vector(224, 80); completeRestart.extent = new Vector(104, 45); completeRestart.vertSizing = Top; @@ -102,7 +109,12 @@ class MPExitGameDlg extends GuiControl { exitTitle.extent = new Vector(331, 30); exitTitle.justify = Center; exitTitle.text.text = "Ingame Options"; - exitTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + exitTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; dialogImg.addChild(exitTitle); var restartTitle = new GuiText(markerFelt32); @@ -110,7 +122,12 @@ class MPExitGameDlg extends GuiControl { restartTitle.extent = new Vector(114, 14); restartTitle.justify = Center; restartTitle.text.text = "Restart:"; - restartTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + restartTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; dialogImg.addChild(restartTitle); var jukeboxButton = new GuiButton(loadButtonImages("data/ui/jukebox/jb_pausemenu")); diff --git a/src/gui/MPMarbleSelectGui.hx b/src/gui/MPMarbleSelectGui.hx index 11bdd661..59929bae 100644 --- a/src/gui/MPMarbleSelectGui.hx +++ b/src/gui/MPMarbleSelectGui.hx @@ -68,7 +68,12 @@ class MPMarbleSelectGui extends GuiImage { var titleText = new GuiMLText(markerFelt28, null); titleText.text.textColor = 0xFFFFFF; - titleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + titleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; titleText.horizSizing = Center; titleText.vertSizing = Bottom; titleText.position = new Vector(140, 67); @@ -78,7 +83,12 @@ class MPMarbleSelectGui extends GuiImage { var marbleText = new GuiMLText(markerFelt24, null); marbleText.text.textColor = 0xFFFFFF; - marbleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + marbleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; marbleText.horizSizing = Center; marbleText.vertSizing = Bottom; marbleText.position = new Vector(86, 243); diff --git a/src/gui/MPPlayMissionGui.hx b/src/gui/MPPlayMissionGui.hx index e28fd217..16d1fab5 100644 --- a/src/gui/MPPlayMissionGui.hx +++ b/src/gui/MPPlayMissionGui.hx @@ -158,20 +158,23 @@ class MPPlayMissionGui extends GuiImage { searchBtn.pressedAction = (e) -> { MarbleGame.canvas.pushDialog(new MPSearchGui(false)); } - window.addChild(searchBtn); + if (Net.isHost) + window.addChild(searchBtn); var kickBtn = new GuiButton(loadButtonImages("data/ui/mp/play/kick")); kickBtn.position = new Vector(304, 514); kickBtn.extent = new Vector(44, 44); - window.addChild(kickBtn); + if (Net.isHost) + window.addChild(kickBtn); - var serverSettingsBtn = new GuiButton(loadButtonImages("data/ui/mp/play/settings")); + var serverSettingsBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/settings")); serverSettingsBtn.position = new Vector(157, 514); serverSettingsBtn.extent = new Vector(44, 44); serverSettingsBtn.pressedAction = (e) -> { MarbleGame.canvas.pushDialog(new MPServerDlg()); } - window.addChild(serverSettingsBtn); + if (Net.isHost) + window.addChild(serverSettingsBtn); var marbleSelectBtn = new GuiButton(loadButtonImages("data/ui/mp/play/marble")); marbleSelectBtn.position = new Vector(206, 514); @@ -213,6 +216,8 @@ class MPPlayMissionGui extends GuiImage { difficultySelector.pressedAction = (e) -> { MarbleGame.canvas.pushDialog(difficultyPopover); }; + else + difficultySelector.disabled = true; window.addChild(difficultySelector); var difficultyCloseButton = new GuiButton(loadButtonImages("data/ui/mp/play/difficultymenu")); @@ -305,14 +310,24 @@ class MPPlayMissionGui extends GuiImage { var pmDesc = new GuiMLText(markerFelt18, mlFontLoader); pmDesc.position = new Vector(0, 0); pmDesc.extent = new Vector(427, 99); - pmDesc.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmDesc.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; pmDesc.text.lineSpacing = -1; pmDescContainer.addChild(pmDesc); var parTime = new GuiMLText(markerFelt18, mlFontLoader); parTime.position = new Vector(43, 190); parTime.extent = new Vector(416, 44); - parTime.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + parTime.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; parTime.text.lineSpacing = -1; window.addChild(parTime); @@ -341,7 +356,12 @@ class MPPlayMissionGui extends GuiImage { playerListTitle.text.text = "Players"; playerListTitle.text.textColor = 0xBDCFE4; playerListTitle.justify = Center; - playerListTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + playerListTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; playersBox.addChild(playerListTitle); this.addChild(window); diff --git a/src/gui/MPPreGameDlg.hx b/src/gui/MPPreGameDlg.hx new file mode 100644 index 00000000..98b93b56 --- /dev/null +++ b/src/gui/MPPreGameDlg.hx @@ -0,0 +1,200 @@ +package gui; + +import h2d.filter.DropShadow; +import net.Net; +import src.MarbleGame; +import hxd.res.BitmapFont; +import h3d.Vector; +import src.ResourceLoader; +import src.Settings; + +class MPPreGameDlg extends GuiControl { + public function new() { + super(); + + this.horizSizing = Width; + this.vertSizing = Height; + this.position = new Vector(); + this.extent = new Vector(640, 480); + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed]; + } + + function loadButtonImagesExt(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed, disabled]; + } + + var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); + var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); + @:privateAccess markerFelt32b.loader = ResourceLoader.loader; + var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + var markerFelt24 = markerFelt32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + var markerFelt20 = markerFelt32b.toSdfFont(cast 18.5 * Settings.uiScale, MultiChannel); + var markerFelt18 = markerFelt32b.toSdfFont(cast 17 * Settings.uiScale, MultiChannel); + var markerFelt26 = markerFelt32b.toSdfFont(cast 22 * Settings.uiScale, MultiChannel); + + var dialogImg = new GuiImage(ResourceLoader.getResource("data/ui/mp/pre/window.png", ResourceLoader.getImage, this.imageResources).toTile()); + dialogImg.horizSizing = Center; + dialogImg.vertSizing = Center; + dialogImg.position = new Vector(0, 0); + dialogImg.extent = new Vector(640, 480); + this.addChild(dialogImg); + + var leaveBtn = new GuiButton(loadButtonImages("/data/ui/mp/pre/leave")); + leaveBtn.horizSizing = Left; + leaveBtn.vertSizing = Top; + leaveBtn.position = new Vector(499, 388); + leaveBtn.extent = new Vector(94, 45); + dialogImg.addChild(leaveBtn); + + var playBtn = new GuiButton(loadButtonImages("/data/ui/mp/pre/play")); + playBtn.horizSizing = Right; + playBtn.vertSizing = Top; + playBtn.position = new Vector(406, 388); + playBtn.extent = new Vector(94, 45); + playBtn.buttonType = Toggle; + dialogImg.addChild(playBtn); + + var readyBtn = new GuiButton(loadButtonImages("/data/ui/mp/pre/ready")); + readyBtn.horizSizing = Right; + readyBtn.vertSizing = Top; + readyBtn.position = new Vector(53, 394); + readyBtn.extent = new Vector(133, 33); + readyBtn.buttonType = Toggle; + dialogImg.addChild(readyBtn); + + var kickBtn = new GuiButton(loadButtonImages("/data/ui/mp/play/kick")); + kickBtn.horizSizing = Right; + kickBtn.vertSizing = Bottom; + kickBtn.position = new Vector(360, 388); + kickBtn.extent = new Vector(45, 45); + if (Net.isHost) + dialogImg.addChild(kickBtn); + + var spectateBtn = new GuiButton(loadButtonImages("/data/ui/mp/pre/spectate")); + spectateBtn.horizSizing = Right; + spectateBtn.vertSizing = Top; + spectateBtn.position = new Vector(190, 394); + spectateBtn.extent = new Vector(127, 33); + dialogImg.addChild(spectateBtn); + + var serverTitle = new GuiText(markerFelt24); + serverTitle.text.textColor = 0xFFFFFF; + serverTitle.position = new Vector(60, 59); + serverTitle.extent = new Vector(525, 30); + serverTitle.text.text = Net.isHost ? Settings.serverSettings.name : Net.connectedServerInfo.name; + serverTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + serverTitle.justify = Center; + dialogImg.addChild(serverTitle); + + var serverDesc = new GuiText(markerFelt24); + serverDesc.text.textColor = 0xFFFFFF; + serverDesc.position = new Vector(60, 92); + serverDesc.extent = new Vector(525, 66); + serverDesc.text.text = Net.isHost ? Settings.serverSettings.description : Net.connectedServerInfo.description; + serverDesc.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + serverDesc.justify = Center; + dialogImg.addChild(serverDesc); + + var levelName = new GuiText(markerFelt24); + levelName.text.textColor = 0xFFFFFF; + levelName.position = new Vector(60, 158); + levelName.extent = new Vector(525, 22); + levelName.text.text = MarbleGame.instance.world.mission.title; + levelName.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + dialogImg.addChild(levelName); + + var levelDesc = new GuiText(markerFelt18); + levelDesc.text.textColor = 0xFFFFFF; + levelDesc.position = new Vector(60, 185); + levelDesc.extent = new Vector(516, 63); + levelDesc.text.text = MarbleGame.instance.world.mission.description; + levelDesc.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + dialogImg.addChild(levelDesc); + + var playerTitle = new GuiText(markerFelt18); + playerTitle.text.textColor = 0xDDDDEE; + playerTitle.position = new Vector(60, 263); + playerTitle.extent = new Vector(525, 14); + playerTitle.text.text = "Player Status"; + playerTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + dialogImg.addChild(playerTitle); + + var playerListContainer = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + playerListContainer.position = new Vector(57, 286); + playerListContainer.extent = new Vector(525, 99); + playerListContainer.childrenHandleScroll = true; + // playerList.maxScrollY = 394 * Settings.uiScale; + dialogImg.addChild(playerListContainer); + + var playerListLeftShadow = new GuiTextListCtrl(markerFelt18, [ + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName + ], 0); + playerListLeftShadow.horizSizing = Width; + playerListLeftShadow.position = new Vector(0, 0); + playerListLeftShadow.extent = new Vector(525, 99); + playerListLeftShadow.scrollable = true; + playerListLeftShadow.textYOffset = -6; + playerListContainer.addChild(playerListLeftShadow); + + var playerListLeft = new GuiTextListCtrl(markerFelt18, [ + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName, + Settings.highscoreName + ], 0xFFFFFF); + playerListLeft.horizSizing = Width; + playerListLeft.position = new Vector(-1, -1); + playerListLeft.extent = new Vector(525, 99); + playerListLeft.scrollable = true; + playerListLeft.textYOffset = -6; + playerListContainer.addChild(playerListLeft); + + playerListContainer.setScrollMax(playerListLeft.calculateFullHeight()); + } +} diff --git a/src/gui/MPServerDlg.hx b/src/gui/MPServerDlg.hx index 0c34e10b..41f716c6 100644 --- a/src/gui/MPServerDlg.hx +++ b/src/gui/MPServerDlg.hx @@ -1,5 +1,7 @@ package gui; +import net.MasterServerClient; +import net.Net; import h2d.filter.DropShadow; import src.Marbleland; import h2d.Tile; @@ -10,6 +12,7 @@ import h3d.Vector; import src.ResourceLoader; import src.Settings; import src.MissionList; +import net.NetCommands; class MPServerDlg extends GuiImage { public function new() { @@ -57,7 +60,12 @@ class MPServerDlg extends GuiImage { var title = new GuiText(markerFelt32); title.text.text = "Server Settings"; title.text.textColor = 0xFFFFFF; - title.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + title.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; title.justify = Center; title.position = new Vector(11, 21); title.extent = new Vector(418, 14); @@ -80,6 +88,33 @@ class MPServerDlg extends GuiImage { // showPasswords.extent = new Vector(31, 31); // this.addChild(showPasswords); + // State variables + var curServerName = Settings.serverSettings.name; + var curServerPassword = Settings.serverSettings.password; + var curServerDescription = Settings.serverSettings.description; + var curServerMaxPlayers = Settings.serverSettings.maxPlayers; + var curServerForceSpectators = Settings.serverSettings.forceSpectators; + var curServerQuickRespawn = Settings.serverSettings.quickRespawn; + + saveBtn.pressedAction = (e) -> { + Settings.serverSettings.name = curServerName; + Settings.serverSettings.password = curServerPassword; + Settings.serverSettings.description = curServerDescription; + Settings.serverSettings.maxPlayers = curServerMaxPlayers; + Settings.serverSettings.forceSpectators = curServerForceSpectators; + Settings.serverSettings.quickRespawn = curServerQuickRespawn; + if (Net.isHost) { + Net.serverInfo.name = curServerName; + Net.serverInfo.description = curServerDescription; + Net.serverInfo.maxPlayers = curServerMaxPlayers; + Net.serverInfo.password = curServerPassword; + MasterServerClient.instance.sendServerInfo(Net.serverInfo); // Update data on master server + NetCommands.sendServerSettings(Settings.serverSettings.name, Settings.serverSettings.description, Settings.serverSettings.quickRespawn, + Settings.serverSettings.forceSpectators); + } + MarbleGame.canvas.popDialog(this); + } + var serverSettingsContainer = new GuiControl(); serverSettingsContainer.vertSizing = Height; serverSettingsContainer.horizSizing = Left; @@ -90,7 +125,12 @@ class MPServerDlg extends GuiImage { var serverName = new GuiText(markerFelt18); serverName.text.text = "Server Name:"; serverName.text.textColor = 0xFFFFFF; - serverName.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + serverName.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; serverName.position = new Vector(0, 0); serverName.extent = new Vector(206, 14); serverSettingsContainer.addChild(serverName); @@ -104,14 +144,29 @@ class MPServerDlg extends GuiImage { var serverNameEdit = new GuiTextInput(markerFelt18); serverNameEdit.position = new Vector(3, 3); serverNameEdit.extent = new Vector(291, 29); - serverNameEdit.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + serverNameEdit.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; serverNameEdit.horizSizing = Left; + serverNameEdit.text.textColor = 0; + serverNameEdit.text.text = curServerName; + serverNameEdit.onTextChange = (t) -> { + curServerName = t; + } serverNameEditBg.addChild(serverNameEdit); var password = new GuiText(markerFelt18); password.text.text = "Password:"; password.text.textColor = 0xFFFFFF; - password.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + password.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; password.position = new Vector(0, 39); password.extent = new Vector(206, 14); serverSettingsContainer.addChild(password); @@ -125,14 +180,29 @@ class MPServerDlg extends GuiImage { var passwordEdit = new GuiTextInput(markerFelt18); passwordEdit.position = new Vector(3, 3); passwordEdit.extent = new Vector(291, 29); - passwordEdit.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + passwordEdit.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; passwordEdit.horizSizing = Left; + passwordEdit.text.textColor = 0; + passwordEdit.text.text = curServerPassword; + passwordEdit.onTextChange = (t) -> { + curServerPassword = t; + } passwordEditBg.addChild(passwordEdit); var serverDescTitle = new GuiText(markerFelt18); serverDescTitle.text.text = "Server Info:"; serverDescTitle.text.textColor = 0xFFFFFF; - serverDescTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + serverDescTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; serverDescTitle.position = new Vector(0, 39 * 2); serverDescTitle.extent = new Vector(206, 14); serverSettingsContainer.addChild(serverDescTitle); @@ -146,14 +216,29 @@ class MPServerDlg extends GuiImage { var serverDescEdit = new GuiTextInput(markerFelt18); serverDescEdit.position = new Vector(3, 3); serverDescEdit.extent = new Vector(291 + 93, 29); - serverDescEdit.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + serverDescEdit.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; serverDescEdit.horizSizing = Left; + serverDescEdit.text.textColor = 0; + serverDescEdit.text.text = curServerDescription; + serverDescEdit.onTextChange = (t) -> { + curServerDescription = t; + } serverDescEditBg.addChild(serverDescEdit); var maxPlayers = new GuiText(markerFelt18); - maxPlayers.text.text = "Max Players: 8"; + maxPlayers.text.text = "Max Players: " + curServerMaxPlayers; maxPlayers.text.textColor = 0xFFFFFF; - maxPlayers.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + maxPlayers.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; maxPlayers.position = new Vector(0, 39 * 4); maxPlayers.extent = new Vector(206, 14); serverSettingsContainer.addChild(maxPlayers); @@ -161,19 +246,30 @@ class MPServerDlg extends GuiImage { var playerMinus = new GuiButton(loadButtonImages("data/ui/mp/settings/minus")); playerMinus.position = new Vector(331, 9 + 29 * 5); playerMinus.extent = new Vector(31, 31); - playerMinus.pressedAction = (sender) -> {}; + playerMinus.pressedAction = (sender) -> { + curServerMaxPlayers = Std.int(Math.max(1, curServerMaxPlayers - 1)); + maxPlayers.text.text = "Max Players: " + curServerMaxPlayers; + }; serverSettingsContainer.addChild(playerMinus); var playerPlus = new GuiButton(loadButtonImages("data/ui/mp/settings/plus")); playerPlus.position = new Vector(359, 9 + 29 * 5); playerPlus.extent = new Vector(31, 31); - playerPlus.pressedAction = (sender) -> {}; + playerPlus.pressedAction = (sender) -> { + Settings.serverSettings.maxPlayers = Std.int(Math.min(8, Settings.serverSettings.maxPlayers + 1)); + maxPlayers.text.text = "Max Players: " + Settings.serverSettings.maxPlayers; + }; serverSettingsContainer.addChild(playerPlus); var forceSpectators = new GuiText(markerFelt18); forceSpectators.text.text = "Force Spectators:"; forceSpectators.text.textColor = 0xFFFFFF; - forceSpectators.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + forceSpectators.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; forceSpectators.position = new Vector(0, 39 * 5); forceSpectators.extent = new Vector(206, 14); serverSettingsContainer.addChild(forceSpectators); @@ -182,13 +278,21 @@ class MPServerDlg extends GuiImage { forceSpectatorsChk.position = new Vector(359, 9 * 2 + 29 * 6 + 2); forceSpectatorsChk.extent = new Vector(31, 31); forceSpectatorsChk.buttonType = Toggle; - forceSpectatorsChk.pressedAction = (sender) -> {}; + forceSpectatorsChk.pressed = curServerForceSpectators; + forceSpectatorsChk.pressedAction = (sender) -> { + curServerForceSpectators = !curServerForceSpectators; + }; serverSettingsContainer.addChild(forceSpectatorsChk); var quickRespawn = new GuiText(markerFelt18); quickRespawn.text.text = "Allow Quick Respawn:"; quickRespawn.text.textColor = 0xFFFFFF; - quickRespawn.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + quickRespawn.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; quickRespawn.position = new Vector(0, 39 * 6); quickRespawn.extent = new Vector(206, 14); serverSettingsContainer.addChild(quickRespawn); @@ -197,7 +301,10 @@ class MPServerDlg extends GuiImage { quickRespawnChk.position = new Vector(359, 9 * 3 + 29 * 7 + 4); quickRespawnChk.extent = new Vector(31, 31); quickRespawnChk.buttonType = Toggle; - quickRespawnChk.pressedAction = (sender) -> {}; + quickRespawnChk.pressed = curServerQuickRespawn; + quickRespawnChk.pressedAction = (sender) -> { + curServerQuickRespawn = !curServerQuickRespawn; + }; serverSettingsContainer.addChild(quickRespawnChk); } } diff --git a/src/gui/MainMenuGui.hx b/src/gui/MainMenuGui.hx index 72d6c193..59452c53 100644 --- a/src/gui/MainMenuGui.hx +++ b/src/gui/MainMenuGui.hx @@ -182,7 +182,12 @@ class MainMenuGui extends GuiImage { versionText.position = new Vector(502, 61); versionText.extent = new Vector(97, 72); versionText.text.text = "

1.5.4

"; - versionText.text.filter = new DropShadow(1.414, 0.785, 0x3333337F, 1, 0, 0.7, 1, true); + versionText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; this.addChild(versionText); var kofi = new GuiButton(loadButtonImages("data/ui/kofi1")); diff --git a/src/gui/MarbleSelectGui.hx b/src/gui/MarbleSelectGui.hx index e18a53cf..db4948a0 100644 --- a/src/gui/MarbleSelectGui.hx +++ b/src/gui/MarbleSelectGui.hx @@ -553,7 +553,12 @@ class MarbleSelectGui extends GuiImage { var titleText = new GuiMLText(markerFelt28, null); titleText.text.textColor = 0xFFFFFF; - titleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + titleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; titleText.horizSizing = Center; titleText.vertSizing = Bottom; titleText.position = new Vector(140, 67); @@ -563,7 +568,12 @@ class MarbleSelectGui extends GuiImage { var marbleText = new GuiMLText(markerFelt24, null); marbleText.text.textColor = 0xFFFFFF; - marbleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + marbleText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; marbleText.horizSizing = Center; marbleText.vertSizing = Bottom; marbleText.position = new Vector(86, 243); diff --git a/src/gui/OptionsDlg.hx b/src/gui/OptionsDlg.hx index 72958ac5..0e97cafe 100644 --- a/src/gui/OptionsDlg.hx +++ b/src/gui/OptionsDlg.hx @@ -147,7 +147,12 @@ class OptionsDlg extends GuiImage { textObj.extent = new Vector(212, 14); textObj.text.text = text; textObj.text.textColor = 0xFFFFFF; - textObj.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + textObj.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; parent.addChild(textObj); var optDropdownImg = new GuiImage(ResourceLoader.getResource('data/ui/options/dropdown-${size}.png', ResourceLoader.getImage, this.imageResources) @@ -220,7 +225,12 @@ class OptionsDlg extends GuiImage { textObj.extent = new Vector(212, 14); textObj.text.text = text; textObj.text.textColor = 0xFFFFFF; - textObj.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + textObj.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; parent.addChild(textObj); var sliderBar = new GuiImage(ResourceLoader.getResource("data/ui/options/bar.png", ResourceLoader.getImage, this.imageResources).toTile()); @@ -399,7 +409,12 @@ class OptionsDlg extends GuiImage { textObj.extent = new Vector(212, 14); textObj.text.text = text; textObj.text.textColor = 0xFFFFFF; - textObj.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + textObj.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; parent.addChild(textObj); var remapBtn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); @@ -444,7 +459,12 @@ class OptionsDlg extends GuiImage { textObj.extent = new Vector(212, 14); textObj.text.text = "Touch Controls"; textObj.text.textColor = 0xFFFFFF; - textObj.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + textObj.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; hotkeysPanel.addChild(textObj); var remapBtn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 524b8413..ad87d784 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -887,7 +887,12 @@ class PlayGui { middleMsg.text.text = text; middleMsg.justify = Center; middleMsg.text.textColor = color; - middleMsg.text.filter = new h2d.filter.DropShadow(1.414, 0.785, 0x000000F, 1, 0, 0.4, 1, true); + middleMsg.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; // new h2d.filter.DropShadow(1.414, 0.785, 0x000000F, 1, 0, 0.4, 1, true); this.playGuiCtrl.addChild(middleMsg); middleMsg.render(scene2d); middleMsg.text.y -= (25 / playGuiCtrl.extent.y) * scene2d.height; diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index 211dc909..b2fbdc85 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -892,8 +892,12 @@ class PlayMissionGui extends GuiImage { setScoreHover = (isHover) -> { var currentMission = currentList[currentSelection]; - pmScoreText.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); - + pmScoreText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; var scoreTextTime = ""; var scoreData = Settings.getScores(currentMission.path); if (scoreData.length == 0) { @@ -982,10 +986,20 @@ class PlayMissionGui extends GuiImage { currentSelection = -1; } - pmDescription.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmDescription.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; pmDescription.text.lineSpacing = -1; - pmDescriptionRight.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmDescriptionRight.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; pmDescriptionRight.text.lineSpacing = -1; var descText = '

#${currentList.indexOf(currentMission) + 1}: ${currentMission.title}

'; @@ -1025,8 +1039,18 @@ class PlayMissionGui extends GuiImage { } pmDescription.text.text = descText; - pmParText.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); - pmParTextRight.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmParText.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + pmParTextRight.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; if (this.scoreShowing) { if (currentMission.game == "platinum") { pmParText.text.text = 'Platinum: ${Util.formatTime(currentMission.goldTime)}'; diff --git a/src/net/ClientConnection.hx b/src/net/ClientConnection.hx index 2b9c763c..2c5efacc 100644 --- a/src/net/ClientConnection.hx +++ b/src/net/ClientConnection.hx @@ -76,7 +76,6 @@ abstract class GameConnection { var lobbyReady:Bool; var platform:NetPlatform; var marbleId:Int; - var isPrivate:Bool; function new(id:Int) { this.id = id; diff --git a/src/net/MasterServerClient.hx b/src/net/MasterServerClient.hx index 045b5f3b..cab214ad 100644 --- a/src/net/MasterServerClient.hx +++ b/src/net/MasterServerClient.hx @@ -9,17 +9,19 @@ import src.Console; typedef RemoteServerInfo = { name:String, + description:String, players:Int, maxPlayers:Int, platform:Int, - version:String + version:String, + passworded:Bool } class MasterServerClient { #if js static var serverIp = "wss://mbomaster.randomityguy.me:8443"; #else - static var serverIp = "ws://89.58.58.191:8080"; + static var serverIp = "ws://89.58.58.191:8084"; #end public static var instance:MasterServerClient; @@ -208,31 +210,23 @@ class MasterServerClient { queueMessage(Json.stringify({ type: "serverInfo", name: serverInfo.name, + description: serverInfo.description, players: serverInfo.players, maxPlayers: serverInfo.maxPlayers, - privateSlots: serverInfo.privateSlots, - privateServer: serverInfo.privateServer, - inviteCode: serverInfo.inviteCode, + password: serverInfo.password, state: serverInfo.state, platform: serverInfo.platform, version: "MBP" // MarbleGame.currentVersion })); } - public function sendConnectToServer(serverName:String, sdp:String, isInvite:Bool = false) { - if (!isInvite) { - queueMessage(Json.stringify({ - type: "connect", - serverName: serverName, - sdp: sdp - })); - } else { - queueMessage(Json.stringify({ - type: "connectInvite", - sdp: sdp, - inviteCode: serverName - })); - } + public function sendConnectToServer(serverName:String, sdp:String, password:String) { + queueMessage(Json.stringify({ + type: "connect", + serverName: serverName, + sdp: sdp, + password: password + })); } public function getServerList(serverListCb:Array->Void) { @@ -269,20 +263,13 @@ class MasterServerClient { })); return; } - var pubSlotsAvail = Net.serverInfo.maxPlayers - Net.serverInfo.privateSlots; - var privSlotsAvail = Net.serverInfo.privateSlots; var pubCount = 1; // Self - var privCount = 0; for (cid => cc in Net.clientIdMap) { - if (cc.isPrivate) { - privCount++; - } else { - pubCount++; - } + pubCount++; } - if (!joiningPrivate && pubCount >= pubSlotsAvail) { + if (!joiningPrivate && pubCount >= Net.serverInfo.maxPlayers) { queueMessage(Json.stringify({ type: "connectFailed", success: false, @@ -291,11 +278,7 @@ class MasterServerClient { return; } - if (joiningPrivate && privCount >= privSlotsAvail) { - joiningPrivate = false; // Join publicly - } - - Net.addClientFromSdp(conts.sdp, joiningPrivate, (sdpReply) -> { + Net.addClientFromSdp(conts.sdp, (sdpReply) -> { queueMessage(Json.stringify({ success: true, type: "connectResponse", diff --git a/src/net/Net.hx b/src/net/Net.hx index 3ed402a0..b8382c94 100644 --- a/src/net/Net.hx +++ b/src/net/Net.hx @@ -40,26 +40,33 @@ enum abstract NetPacketType(Int) from Int to Int { @:publicFields class ServerInfo { var name:String; + var description:String; var players:Int; var maxPlayers:Int; - var privateSlots:Int; - var privateServer:Bool; - var inviteCode:Int; + var password:String; var state:String; var platform:NetPlatform; - public function new(name:String, players:Int, maxPlayers:Int, privateSlots:Int, privateServer:Bool, inviteCode:Int, state:String, platform:NetPlatform) { + public function new(name:String, description:String, players:Int, maxPlayers:Int, password:String, state:String, platform:NetPlatform) { this.name = name; + this.description = description; this.players = players; this.maxPlayers = maxPlayers; - this.privateSlots = privateSlots; - this.privateServer = privateServer; - this.inviteCode = inviteCode; + this.password = password; this.state = state; this.platform = platform; } } +@:publicFields +@:structInit +class ConnectedServerInfo { + var name:String; + var description:String; + var quickRespawn:Bool; + var forceSpectator:Bool; +} + class Net { static var client:RTCPeerConnection; static var clientDatachannel:RTCDataChannel; @@ -81,13 +88,14 @@ class Net { public static var clientConnection:ClientConnection; public static var serverInfo:ServerInfo; public static var remoteServerInfo:RemoteServerInfo; + public static var connectedServerInfo:ConnectedServerInfo; static var stunServers = ["stun:stun.l.google.com:19302"]; public static var turnServer:String = ""; - public static function hostServer(name:String, maxPlayers:Int, privateSlots:Int, privateServer:Bool, onHosted:() -> Void) { - serverInfo = new ServerInfo(name, 1, maxPlayers, privateSlots, privateServer, Std.int(999999 * Math.random()), "LOBBY", getPlatform()); + public static function hostServer(name:String, description:String, maxPlayers:Int, password:String, onHosted:() -> Void) { + serverInfo = new ServerInfo(name, description, 1, maxPlayers, password, "LOBBY", getPlatform()); MasterServerClient.connectToMasterServer(() -> { isHost = true; isClient = false; @@ -98,14 +106,14 @@ class Net { }); } - public static function addClientFromSdp(sdpString:String, privateJoin:Bool, onFinishSdp:String->Void) { + public static function addClientFromSdp(sdpString:String, onFinishSdp:String->Void) { var peer = new RTCPeerConnection(stunServers, "0.0.0.0"); var sdpObj = Json.parse(sdpString); peer.setRemoteDescription(sdpObj.sdp, sdpObj.type); - addClient(peer, privateJoin, onFinishSdp); + addClient(peer, onFinishSdp); } - static function addClient(peer:RTCPeerConnection, privateJoin:Bool, onFinishSdp:String->Void) { + static function addClient(peer:RTCPeerConnection, onFinishSdp:String->Void) { var candidates = []; peer.onLocalCandidate = (c) -> { Console.log('Local candidate: ' + c); @@ -173,7 +181,7 @@ class Net { } } if (reliable != null && unreliable != null) - onClientConnect(peer, reliable, unreliable, privateJoin); + onClientConnect(peer, reliable, unreliable); } } @@ -182,7 +190,7 @@ class Net { clientIdMap[id] = ghost; } - public static function joinServer(serverName:String, isInvite:Bool, connectedCb:() -> Void) { + public static function joinServer(serverName:String, password:String, connectedCb:() -> Void) { MasterServerClient.connectToMasterServer(() -> { client = new RTCPeerConnection(stunServers, "0.0.0.0"); var candidates = []; @@ -250,7 +258,7 @@ class Net { MasterServerClient.instance.sendConnectToServer(serverName, Json.stringify({ sdp: sdpObj, type: "offer" - }), isInvite); + }), password); } client.onGatheringStateChange = (s) -> { @@ -355,6 +363,7 @@ class Net { Net.clientConnection = null; Net.serverInfo = null; Net.remoteServerInfo = null; + Net.connectedServerInfo = null; Net.lobbyHostReady = false; Net.lobbyClientReady = false; Net.hostReady = false; @@ -375,6 +384,7 @@ class Net { MasterServerClient.disconnectFromMasterServer(); Net.serverInfo = null; Net.remoteServerInfo = null; + Net.connectedServerInfo = null; Net.lobbyHostReady = false; Net.lobbyClientReady = false; Net.hostReady = false; @@ -444,7 +454,7 @@ class Net { } } - static function onClientConnect(c:RTCPeerConnection, dc:RTCDataChannel, dcu:RTCDataChannel, joiningPrivate:Bool) { + static function onClientConnect(c:RTCPeerConnection, dc:RTCDataChannel, dcu:RTCDataChannel) { if (!Net.isMP) { c.close(); return; @@ -456,7 +466,6 @@ class Net { } var cc = new ClientConnection(clientId, c, dc, dcu); clients.set(c, cc); - cc.isPrivate = joiningPrivate; clientIdMap[clientId] = clients[c]; cc.lastRecvTime = Console.time(); // So it doesnt get timed out @@ -569,6 +578,8 @@ class Net { // if (MultiplayerLevelSelectGui.custSelected) { // NetCommands.setLobbyCustLevelNameClient(conn, MultiplayerLevelSelectGui.custPath); // } else { + NetCommands.sendServerSettingsClient(conn, Settings.serverSettings.name, Settings.serverSettings.description, Settings.serverSettings.quickRespawn, + Settings.serverSettings.forceSpectators); NetCommands.setLobbyLevelIndexClient(conn, MPPlayMissionGui.currentCategoryStatic, MPPlayMissionGui.currentSelectionStatic); // } diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index fbd9a8bd..7fda73d0 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -326,6 +326,15 @@ class NetCommands { } } + @:rpc(server) public static function sendServerSettings(name:String, desc:String, quickRespawn:Bool, forceSpectator:Bool) { + Net.connectedServerInfo = { + name: name, + description: desc, + quickRespawn: quickRespawn, + forceSpectator: forceSpectator + }; + } + // @:rpc(client) public static function sendChatMessage(msg:String) { // if (Net.isHost) { // sendServerChatMessage(msg); diff --git a/src/net/RPCMacro.hx b/src/net/RPCMacro.hx index 55a57670..dedd9750 100644 --- a/src/net/RPCMacro.hx +++ b/src/net/RPCMacro.hx @@ -36,6 +36,14 @@ class RPCMacro { serializeFns.push(macro stream.writeInt32($i{argName})); } + case TPath({ + name: 'Bool' + }): { + deserializeFns.push(macro var $argName = stream.readFlag()); + callExprs.push(macro $i{argName}); + serializeFns.push(macro stream.writeFlag($i{argName})); + } + case TPath({ name: 'Float' }): {