diff --git a/src/Console.hx b/src/Console.hx index 18a76104..a6ac8bef 100644 --- a/src/Console.hx +++ b/src/Console.hx @@ -190,6 +190,13 @@ class Console { MarbleGame.instance.world.rollback(t); } else if (cmdType == 'addDummy') { Net.addDummyConnection(); + } else if (cmdType == 'setfps') { + var scale = Std.parseFloat(cmdSplit[1]); + if (Math.isNaN(scale)) + scale = 1; + MarbleGame.instance.fpsLimit = scale; + MarbleGame.instance.limitingFps = true; + log("Set FPS to " + scale); } else { error("Unknown command"); } diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 5ae632d9..c50fbc60 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -59,6 +59,10 @@ class MarbleGame { var console:ConsoleDlg; var _exitingToMenu:Bool = false; + var fpsLimit:Float = 60; + var limitingFps:Bool = false; + var fpsLimitAccum:Float = 0.0; + public function new(scene2d:h2d.Scene, scene:h3d.scene.Scene) { Console.log("Initializing the game..."); canvas = new Canvas(scene2d, cast this); @@ -185,6 +189,16 @@ class MarbleGame { public function update(dt:Float) { MasterServerClient.process(); + + if (limitingFps) { + fpsLimitAccum += dt; + if (fpsLimitAccum < 1.0 / fpsLimit) { + return; + } + fpsLimitAccum -= (1.0 / fpsLimit); + dt = 1.0 / fpsLimit; + } + if (world != null) { if (world._disposed) { world = null; diff --git a/src/gui/GuiXboxOptionsList.hx b/src/gui/GuiXboxOptionsList.hx index a89cc1aa..978fce71 100644 --- a/src/gui/GuiXboxOptionsList.hx +++ b/src/gui/GuiXboxOptionsList.hx @@ -26,14 +26,17 @@ class GuiXboxOptionsList extends GuiControl { var _prevMousePos:Vector; var usedGamepad:Bool = false; + var enableButtons:Bool = true; + public var selected:Bool = false; public var list:GuiXboxOptionsListCollection; - public function new(icon:Int, name:String, values:Array, midcolumn:Float = 0.3, textOff = 155.5) { + public function new(icon:Int, name:String, values:Array, midcolumn:Float = 0.3, textOff = 155.5, enableButtons:Bool = true) { super(); this.options = values; + this.enableButtons = enableButtons; var baseImage = ResourceLoader.getResource("data/ui/xbox/optionsCursorArray.png", ResourceLoader.getImage, this.imageResources).toTile(); var inactiveImage = baseImage.sub(0, 2, 815, 94); @@ -65,27 +68,29 @@ class GuiXboxOptionsList extends GuiControl { var rightShadeFilter = new h2d.filter.ColorMatrix(cmat); rightShadeFilter.enable = false; - leftButton = new GuiAnim([arrowButtonImage, arrowButtonImagePressed]); - leftButton.position = new Vector(815 * midcolumn, 0); - leftButton.extent = new Vector(114, 94); - leftButton.anim.filter = leftShadeFilter; - this.addChild(leftButton); + if (enableButtons) { + leftButton = new GuiAnim([arrowButtonImage, arrowButtonImagePressed]); + leftButton.position = new Vector(815 * midcolumn, 0); + leftButton.extent = new Vector(114, 94); + leftButton.anim.filter = leftShadeFilter; + this.addChild(leftButton); - var leftButtonIcon = new GuiAnim([leftArrow, leftArrowSelected]); - leftButtonIcon.position = new Vector(39, 36); - leftButtonIcon.extent = new Vector(22, 22); - leftButton.addChild(leftButtonIcon); + var leftButtonIcon = new GuiAnim([leftArrow, leftArrowSelected]); + leftButtonIcon.position = new Vector(39, 36); + leftButtonIcon.extent = new Vector(22, 22); + leftButton.addChild(leftButtonIcon); - rightButton = new GuiAnim([arrowButtonImage, arrowButtonImagePressed]); - rightButton.position = new Vector(815 * 0.8, 0); - rightButton.extent = new Vector(114, 94); - rightButton.anim.filter = rightShadeFilter; - this.addChild(rightButton); + rightButton = new GuiAnim([arrowButtonImage, arrowButtonImagePressed]); + rightButton.position = new Vector(815 * 0.8, 0); + rightButton.extent = new Vector(114, 94); + rightButton.anim.filter = rightShadeFilter; + this.addChild(rightButton); - var rightButtonIcon = new GuiAnim([rightArrow, rightArrowSelected]); - rightButtonIcon.position = new Vector(52, 36); - rightButtonIcon.extent = new Vector(22, 22); - rightButton.addChild(rightButtonIcon); + var rightButtonIcon = new GuiAnim([rightArrow, rightArrowSelected]); + rightButtonIcon.position = new Vector(52, 36); + rightButtonIcon.extent = new Vector(22, 22); + rightButton.addChild(rightButtonIcon); + } var arial14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); var arial14b = new BitmapFont(arial14fontdata.entry); @@ -148,100 +153,102 @@ class GuiXboxOptionsList extends GuiControl { optionText.text.textColor = 0x787878; } } - var leftBtnRect = leftButton.getHitTestRect(); - leftBtnRect.position = leftBtnRect.position.add(new Vector(15, 21)); - leftBtnRect.extent.set(83, 53); - var rightBtnRect = rightButton.getHitTestRect(); - rightBtnRect.position = rightBtnRect.position.add(new Vector(15, 21)); - rightBtnRect.extent.set(83, 53); - if (leftBtnRect.inRect(mouseState.position) || rightBtnRect.inRect(mouseState.position)) { - if (Key.isPressed(Key.MOUSE_LEFT)) { - AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); + if (enableButtons) { + var leftBtnRect = leftButton.getHitTestRect(); + leftBtnRect.position = leftBtnRect.position.add(new Vector(15, 21)); + leftBtnRect.extent.set(83, 53); + var rightBtnRect = rightButton.getHitTestRect(); + rightBtnRect.position = rightBtnRect.position.add(new Vector(15, 21)); + rightBtnRect.extent.set(83, 53); + if (leftBtnRect.inRect(mouseState.position) || rightBtnRect.inRect(mouseState.position)) { + if (Key.isPressed(Key.MOUSE_LEFT)) { + AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); + } } - } - // Left Button - if (leftBtnRect.inRect(mouseState.position)) { - if (Key.isDown(Key.MOUSE_LEFT)) { - leftButton.anim.currentFrame = 1; - leftButton.anim.filter.enable = true; + // Left Button + if (leftBtnRect.inRect(mouseState.position)) { + if (Key.isDown(Key.MOUSE_LEFT)) { + leftButton.anim.currentFrame = 1; + leftButton.anim.filter.enable = true; + } else { + leftButton.anim.currentFrame = 1; + leftButton.anim.filter.enable = false; + } + if (Key.isReleased(Key.MOUSE_LEFT)) { + var newOption = currentOption - 1; + if (newOption < 0) + newOption = options.length - 1; + + var doChange = true; + if (onChangeFunc != null) + doChange = onChangeFunc(newOption); + if (doChange) { + currentOption = newOption; + optionText.text.text = options[currentOption]; + } + } } else { - leftButton.anim.currentFrame = 1; + leftButton.anim.currentFrame = 0; leftButton.anim.filter.enable = false; } - if (Key.isReleased(Key.MOUSE_LEFT)) { - var newOption = currentOption - 1; - if (newOption < 0) - newOption = options.length - 1; - - var doChange = true; - if (onChangeFunc != null) - doChange = onChangeFunc(newOption); - if (doChange) { - currentOption = newOption; - optionText.text.text = options[currentOption]; + // Right Button + if (rightBtnRect.inRect(mouseState.position)) { + if (Key.isDown(Key.MOUSE_LEFT)) { + rightButton.anim.currentFrame = 1; + rightButton.anim.filter.enable = true; + } else { + rightButton.anim.currentFrame = 1; + rightButton.anim.filter.enable = false; + } + if (Key.isReleased(Key.MOUSE_LEFT)) { + var newOption = currentOption + 1; + if (newOption >= options.length) + newOption = 0; + + var doChange = true; + if (onChangeFunc != null) + doChange = onChangeFunc(newOption); + if (doChange) { + currentOption = newOption; + optionText.text.text = options[currentOption]; + } } - } - } else { - leftButton.anim.currentFrame = 0; - leftButton.anim.filter.enable = false; - } - // Right Button - if (rightBtnRect.inRect(mouseState.position)) { - if (Key.isDown(Key.MOUSE_LEFT)) { - rightButton.anim.currentFrame = 1; - rightButton.anim.filter.enable = true; } else { - rightButton.anim.currentFrame = 1; + rightButton.anim.currentFrame = 0; rightButton.anim.filter.enable = false; } - if (Key.isReleased(Key.MOUSE_LEFT)) { - var newOption = currentOption + 1; - if (newOption >= options.length) - newOption = 0; + if (selected || alwaysActive) { + if (Key.isPressed(Key.LEFT) || Gamepad.isPressed(['dpadLeft']) || (Gamepad.getAxis('analogX') < -0.75 && !usedGamepad)) { + var newOption = currentOption - 1; + if (newOption < 0) + newOption = options.length - 1; - var doChange = true; - if (onChangeFunc != null) - doChange = onChangeFunc(newOption); - if (doChange) { - currentOption = newOption; - optionText.text.text = options[currentOption]; + var doChange = true; + if (onChangeFunc != null) + doChange = onChangeFunc(newOption); + if (doChange) { + currentOption = newOption; + optionText.text.text = options[currentOption]; + } } - } - } else { - rightButton.anim.currentFrame = 0; - rightButton.anim.filter.enable = false; - } - if (selected || alwaysActive) { - if (Key.isPressed(Key.LEFT) || Gamepad.isPressed(['dpadLeft']) || (Gamepad.getAxis('analogX') < -0.75 && !usedGamepad)) { - var newOption = currentOption - 1; - if (newOption < 0) - newOption = options.length - 1; + if (Key.isPressed(Key.RIGHT) || Gamepad.isPressed(['dpadRight']) || (Gamepad.getAxis('analogX') > 0.75 && !usedGamepad)) { + var newOption = currentOption + 1; + if (newOption >= options.length) + newOption = 0; - var doChange = true; - if (onChangeFunc != null) - doChange = onChangeFunc(newOption); - if (doChange) { - currentOption = newOption; - optionText.text.text = options[currentOption]; + var doChange = true; + if (onChangeFunc != null) + doChange = onChangeFunc(newOption); + if (doChange) { + currentOption = newOption; + optionText.text.text = options[currentOption]; + } } + if (Math.abs(Gamepad.getAxis('analogX')) > 0.75) + usedGamepad = true; + else + usedGamepad = false; } - if (Key.isPressed(Key.RIGHT) || Gamepad.isPressed(['dpadRight']) || (Gamepad.getAxis('analogX') > 0.75 && !usedGamepad)) { - var newOption = currentOption + 1; - if (newOption >= options.length) - newOption = 0; - - var doChange = true; - if (onChangeFunc != null) - doChange = onChangeFunc(newOption); - if (doChange) { - currentOption = newOption; - optionText.text.text = options[currentOption]; - } - } - if (Math.abs(Gamepad.getAxis('analogX')) > 0.75) - usedGamepad = true; - else - usedGamepad = false; } super.update(dt, mouseState); } diff --git a/src/gui/MPServerListGui.hx b/src/gui/MPServerListGui.hx index c6a380dc..00fd7b3c 100644 --- a/src/gui/MPServerListGui.hx +++ b/src/gui/MPServerListGui.hx @@ -59,10 +59,20 @@ class MPServerListGui extends GuiImage { function imgLoader(path:String) { switch (path) { - case "locked": - return ResourceLoader.getResource("data/ui/xbox/DemoOutOfTimeIcon.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "unlocked": + case "ready": return ResourceLoader.getResource("data/ui/xbox/Ready.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "notready": + return ResourceLoader.getResource("data/ui/xbox/NotReady.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "pc": + return ResourceLoader.getResource("data/ui/xbox/platform_desktop.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "mac": + return ResourceLoader.getResource("data/ui/xbox/platform_mac.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "web": + return ResourceLoader.getResource("data/ui/xbox/platform_web.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "android": + return ResourceLoader.getResource("data/ui/xbox/platform_android.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "unknown": + return ResourceLoader.getResource("data/ui/xbox/platform_unknown.png", ResourceLoader.getImage, this.imageResources).toTile(); } return null; } @@ -84,9 +94,10 @@ class MPServerListGui extends GuiImage { serverWnd.addChild(serverList); var ourServerList:Array = []; + var platformToString = ["unknown", "pc", "mac", "web", "android"]; function updateServerListDisplay() { - serverDisplays = ourServerList.map(x -> x.name); + serverDisplays = ourServerList.map(x -> return '${x.name}'); serverList.setTexts(serverDisplays); } diff --git a/src/gui/MultiplayerLevelSelectGui.hx b/src/gui/MultiplayerLevelSelectGui.hx index 0bd93187..021e19e9 100644 --- a/src/gui/MultiplayerLevelSelectGui.hx +++ b/src/gui/MultiplayerLevelSelectGui.hx @@ -268,7 +268,7 @@ class MultiplayerLevelSelectGui extends GuiImage { levelWnd.addChild(levelInfoLeft); var levelNames = difficultyMissions.map(x -> x.title); - var levelSelectOpts = new GuiXboxOptionsList(6, "Level", levelNames); + var levelSelectOpts = new GuiXboxOptionsList(6, "Level", levelNames, 0.3, 155.5, isHost); function setLevel(idx:Int) { // if (lock) diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index d1f9bd26..84ec457b 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -75,6 +75,8 @@ class PlayGui { var playerListContainer:GuiControl; var playerListCtrl:GuiMLTextListCtrl; var playerListScoresCtrl:GuiMLTextListCtrl; + var playerListShadowCtrl:GuiMLTextListCtrl; + var playerListScoresShadowCtrl:GuiMLTextListCtrl; var playerList:Array = []; var imageResources:Array> = []; @@ -634,9 +636,25 @@ class PlayGui { // 'Player 2 2' // ]; - var ds = new h2d.filter.DropShadow(1.414, 0.785, 0x000000, 1, 0, 0.4, 1, true); + // var ds = new h2d.filter.DropShadow(1.414, 0.785, 0x000000, 1, 0, 0.4, 1, true); - playerListCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader, ds); + playerListShadowCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader); + + playerListShadowCtrl.position = new Vector(28, 44); + playerListShadowCtrl.extent = new Vector(392, 271); + playerListShadowCtrl.scrollable = true; + playerListShadowCtrl.onSelectedFunc = (sel) -> {} + playerListContainer.addChild(playerListShadowCtrl); + + playerListScoresShadowCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader); + + playerListScoresShadowCtrl.position = new Vector(278, 44); + playerListScoresShadowCtrl.extent = new Vector(392, 271); + playerListScoresShadowCtrl.scrollable = true; + playerListScoresShadowCtrl.onSelectedFunc = (sel) -> {} + playerListContainer.addChild(playerListScoresShadowCtrl); + + playerListCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader); playerListCtrl.position = new Vector(27, 43); playerListCtrl.extent = new Vector(392, 271); @@ -644,7 +662,7 @@ class PlayGui { playerListCtrl.onSelectedFunc = (sel) -> {} playerListContainer.addChild(playerListCtrl); - playerListScoresCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader, ds); + playerListScoresCtrl = new GuiMLTextListCtrl(arial14, [], imgLoader); playerListScoresCtrl.position = new Vector(277, 43); playerListScoresCtrl.extent = new Vector(392, 271); @@ -656,13 +674,19 @@ class PlayGui { public function redrawPlayerList() { var pl = []; var plScores = []; + var plShadow = []; + var plShadowScores = []; playerList.sort((a, b) -> a.score > b.score ? -1 : (a.score < b.score ? 1 : 0)); for (item in playerList) { pl.push('${Util.rightPad(item.name, 25, 3)}'); plScores.push('${item.score}'); + plShadow.push('${Util.rightPad(item.name, 25, 3)}'); + plShadowScores.push('${item.score}'); } playerListCtrl.setTexts(pl); playerListScoresCtrl.setTexts(plScores); + playerListShadowCtrl.setTexts(plShadow); + playerListScoresShadowCtrl.setTexts(plShadowScores); } public function doMPEndGameMessage() { diff --git a/src/net/MasterServerClient.hx b/src/net/MasterServerClient.hx index 93047736..a9756f70 100644 --- a/src/net/MasterServerClient.hx +++ b/src/net/MasterServerClient.hx @@ -12,7 +12,7 @@ typedef RemoteServerInfo = { name:String, players:Int, maxPlayers:Int, - platform:String, + platform:Int, } class MasterServerClient { @@ -78,7 +78,8 @@ class MasterServerClient { privateSlots: serverInfo.privateSlots, privateServer: serverInfo.privateServer, inviteCode: serverInfo.inviteCode, - state: serverInfo.state + state: serverInfo.state, + platform: serverInfo.platform })); }