diff --git a/src/Analytics.hx b/src/Analytics.hx index b388024b..7d397572 100644 --- a/src/Analytics.hx +++ b/src/Analytics.hx @@ -103,9 +103,9 @@ class Analytics { language: language(), referrer: referrer(), screen: screen(), - title: "MBHaxe Platinum", + title: "MBHaxe Gold", url: "/", - website: "e6da43f0-fc6a-49cb-a4a9-4b7e7745e538", + website: "737bbe05-ad2e-43a5-820b-4e3014f5683e", name: eventName } }; @@ -120,7 +120,7 @@ class Analytics { return js.Browser.window.location.hostname; #end #if hl - return "marbleblast.randomityguy.me"; + return "marbleblastgold.randomityguy.me"; #end } diff --git a/src/CameraController.hx b/src/CameraController.hx index 0488eb11..aadfc705 100644 --- a/src/CameraController.hx +++ b/src/CameraController.hx @@ -133,20 +133,10 @@ class CameraController extends Object { public function enableSpectate() { spectate = true; - if (@:privateAccess this.level.playGui.setSpectateMenu(true)) { - if (Util.isTouchDevice()) { - MarbleGame.instance.touchInput.setSpectatorControls(true); - MarbleGame.instance.touchInput.setSpectatorControlsVisibility(false); - } - } } public function stopSpectate() { spectate = false; - @:privateAccess this.level.playGui.setSpectateMenu(false); - if (Util.isTouchDevice()) { - MarbleGame.instance.touchInput.setSpectatorControls(false); - } } public function orbit(mouseX:Float, mouseY:Float, isTouch:Bool = false) { @@ -263,315 +253,6 @@ class CameraController extends Object { return Math.pow(Math.abs(value), 1.6) * (value >= 0 ? 1 : -1); } - function doOverviewCamera(currentTime:Float, dt:Float) { - var angle = Util.adjustedMod(2 * currentTime * Math.PI / 100.0, 2 * Math.PI); - var distance = overviewWidth.multiply(2.0 / 3.0); - var offset = new Vector(Math.sin(angle) * distance.x, Math.cos(angle) * distance.y); - var position = overviewCenter.add(offset); - - var top = overviewCenter.z + (overviewWidth.z / 2) + overviewHeight; - position.z = top; - - var posDist = Math.sqrt((position.x - overviewCenter.x) * (position.x - overviewCenter.x) - + (position.y - overviewCenter.y) * (position.y - overviewCenter.y)); - var upOffset = Math.tan(0.5) * posDist / 2; - // position.load(position.add(new Vector(0, 0, upOffset))); - - var camera = level.scene.camera; - camera.pos.load(position); - camera.target.load(overviewCenter); - camera.up.x = 0; - camera.up.y = 0; - camera.up.z = 1; - } - - function doSpectateCamera(currentTime:Float, dt:Float) { - var camera = level.scene.camera; - - var lerpt = 1 - Math.pow(0.5, dt / 0.016); // Math.min(1, 1 - Math.pow(0.6, dt / 0.032)); // hxd.Math.min(1, 1 - Math.pow(0.6, dt * 600)); - - var gamepadX = applyNonlinearScale(rescaleDeadZone(Gamepad.getAxis(Settings.gamepadSettings.cameraXAxis), Settings.gamepadSettings.axisDeadzone)); - var gamepadY = rescaleDeadZone(Gamepad.getAxis(Settings.gamepadSettings.cameraYAxis), Settings.gamepadSettings.axisDeadzone); - - if (gamepadX != 0.0 || gamepadY != 0.0) { - wasLastGamepadInput = true; - } - var cameraPitchDelta = (Key.isDown(Settings.controlsSettings.camBackward) ? 1 : 0) - - (Key.isDown(Settings.controlsSettings.camForward) ? 1 : 0) - + gamepadY; - if (Settings.gamepadSettings.invertYAxis || Settings.controlsSettings.invertYAxis) - cameraPitchDelta = -cameraPitchDelta; - var cameraYawDelta = (Key.isDown(Settings.controlsSettings.camRight) ? 1 : 0) - (Key.isDown(Settings.controlsSettings.camLeft) ? 1 : 0) + gamepadX; - if (Settings.gamepadSettings.invertXAxis) - cameraYawDelta = -cameraYawDelta; - - if (MarbleGame.instance.paused) { - cameraYawDelta = 0; - cameraPitchDelta = 0; - } - var gamePadSensitivity = 1.0; - if (wasLastGamepadInput) { - gamePadSensitivity = Settings.gamepadSettings.cameraSensitivity; // It defaults to 0.6 - } - - var deltaX = 0.75 * 5 * cameraYawDelta * dt * gamePadSensitivity; - var deltaY = 0.75 * 5 * cameraPitchDelta * dt * gamePadSensitivity; - - if (spectateMarbleIndex != -1) { - // Center the pitch - if (Util.isTouchDevice()) { // Do this only on touch devices - if (!Settings.controlsSettings.alwaysFreeLook - && !Key.isDown(Settings.controlsSettings.freelook) - && !MarbleGame.instance.touchInput.cameraInput.pressed - && deltaY == 0.0) { - var rescaledY = deltaY; - if (rescaledY <= 0.0) - rescaledY = 0.4 - rescaledY * -0.75; - else - rescaledY = rescaledY * 1.1 + 0.4; - var movePitchDelta = (rescaledY - CameraPitch); - var movePitchSpeed = computePitchSpeedFromDelta(Math.abs(movePitchDelta)) * dt * 0.8; - if (movePitchDelta <= 0.0) { - movePitchDelta = -movePitchDelta; - if (movePitchDelta < movePitchSpeed) - movePitchSpeed = movePitchDelta; - movePitchDelta = -movePitchSpeed; - movePitchSpeed = movePitchDelta; - } else if (movePitchSpeed > movePitchDelta) { - movePitchSpeed = movePitchDelta; - } - deltaY = movePitchSpeed; - } - } - } - - nextCameraYaw += deltaX; - nextCameraPitch += deltaY; - - var limits = spectateMarbleIndex == -1 ? 0.0001 : Math.PI / 4; - - nextCameraPitch = Math.max(-Math.PI / 2 + limits, Math.min(Math.PI / 2 - 0.0001, nextCameraPitch)); - - CameraYaw = nextCameraYaw; // Util.lerp(CameraYaw, nextCameraYaw, lerpt); - CameraPitch = nextCameraPitch; // Util.lerp(CameraPitch, nextCameraPitch, lerpt); - - CameraPitch = Math.max(-Math.PI / 2 + limits, Math.min(Math.PI / 2 - 0.0001, CameraPitch)); // Util.clamp(CameraPitch, -Math.PI / 12, Math.PI / 2); - - function getRotQuat(v1:Vector, v2:Vector) { - function orthogonal(v:Vector) { - var x = Math.abs(v.x); - var y = Math.abs(v.y); - var z = Math.abs(v.z); - var other = x < y ? (x < z ? new Vector(1, 0, 0) : new Vector(0, 0, 1)) : (y < z ? new Vector(0, 1, 0) : new Vector(0, 0, 1)); - return v.cross(other); - } - - var u = v1.normalized(); - var v = v2.normalized(); - if (u.multiply(-1).equals(v)) { - var q = new Quat(); - var o = orthogonal(u).normalized(); - q.x = o.x; - q.y = o.y; - q.z = o.z; - q.w = 0; - return q; - } - var half = u.add(v).normalized(); - var q = new Quat(); - q.w = u.dot(half); - var vr = u.cross(half); - q.x = vr.x; - q.y = vr.y; - q.z = vr.z; - return q; - } - var orientationQuat = level.getOrientationQuat(currentTime); - - if (spectateMarbleIndex == -1) { - @:privateAccess level.playGui.setSpectateMenuText(0); - var up = new Vector(0, 0, 1); - up.transform(orientationQuat.toMatrix()); - var directionVector = new Vector(1, 0, 0); - - var q1 = new Quat(); - q1.initRotateAxis(0, 1, 0, CameraPitch); - directionVector.transform(q1.toMatrix()); - q1.initRotateAxis(0, 0, 1, CameraYaw); - directionVector.transform(q1.toMatrix()); - directionVector.transform(orientationQuat.toMatrix()); - - var dy = Gamepad.getAxis(Settings.gamepadSettings.moveYAxis) * CameraSpeed * dt; - var dx = -Gamepad.getAxis(Settings.gamepadSettings.moveXAxis) * CameraSpeed * dt; - - if (Key.isDown(Settings.controlsSettings.forward)) { - dy += CameraSpeed * dt; - } - if (Key.isDown(Settings.controlsSettings.backward)) { - dy -= CameraSpeed * dt; - } - if (Key.isDown(Settings.controlsSettings.left)) { - dx += CameraSpeed * dt; - } - if (Key.isDown(Settings.controlsSettings.right)) { - dx -= CameraSpeed * dt; - } - - if (MarbleGame.instance.touchInput.movementInput.pressed) { - dx = -MarbleGame.instance.touchInput.movementInput.value.x * CameraSpeed * dt; - dy = -MarbleGame.instance.touchInput.movementInput.value.y * CameraSpeed * dt; - } - - if ((!Util.isTouchDevice() && Key.isDown(Settings.controlsSettings.powerup)) - || (Util.isTouchDevice() && MarbleGame.instance.touchInput.powerupButton.pressed) - || Gamepad.isDown(Settings.gamepadSettings.powerup)) { - dx *= 2; - dy *= 2; - } - - if (Key.isPressed(Settings.controlsSettings.blast) - || (MarbleGame.instance.touchInput.blastbutton.pressed && MarbleGame.instance.touchInput.blastbutton.didPressIt) - || Gamepad.isPressed(Settings.gamepadSettings.blast)) { - var freeMarbleIndex = -1; - - MarbleGame.instance.touchInput.blastbutton.didPressIt = false; - - for (i in 0...level.marbles.length) { - var marble = level.marbles[i]; - @:privateAccess if ((marble.connection != null && !marble.connection.spectator)) { - freeMarbleIndex = i; - break; - } - } - spectateMarbleIndex = freeMarbleIndex; - MarbleGame.instance.touchInput.setSpectatorControlsVisibility(true); - return; - } - - var sideDir = directionVector.cross(up); - - var moveDir = directionVector.multiply(dy).add(sideDir.multiply(dx)); - camera.pos.load(camera.pos.add(moveDir)); - - camera.up = up; - camera.target = camera.pos.add(directionVector); - } else { - @:privateAccess level.playGui.setSpectateMenuText(1); - if (Key.isPressed(Settings.controlsSettings.left) - || (Util.isTouchDevice() - && MarbleGame.instance.touchInput.leftButton.pressed - && MarbleGame.instance.touchInput.leftButton.didPressIt)) { - if (Util.isTouchDevice()) - MarbleGame.instance.touchInput.leftButton.didPressIt = false; - spectateMarbleIndex = (spectateMarbleIndex - 1 + level.marbles.length) % level.marbles.length; - @:privateAccess while (level.marbles[spectateMarbleIndex].connection == null - || level.marbles[spectateMarbleIndex].connection.spectator) { - spectateMarbleIndex = (spectateMarbleIndex - 1 + level.marbles.length) % level.marbles.length; - } - } - - if (Key.isPressed(Settings.controlsSettings.right) - || (Util.isTouchDevice() - && MarbleGame.instance.touchInput.rightButton.pressed - && MarbleGame.instance.touchInput.rightButton.didPressIt)) { - if (Util.isTouchDevice()) - MarbleGame.instance.touchInput.rightButton.didPressIt = false; - spectateMarbleIndex = (spectateMarbleIndex + 1 + level.marbles.length) % level.marbles.length; - @:privateAccess while (level.marbles[spectateMarbleIndex].connection == null - || level.marbles[spectateMarbleIndex].connection.spectator) { - spectateMarbleIndex = (spectateMarbleIndex + 1 + level.marbles.length) % level.marbles.length; - } - } - - if (Key.isPressed(Settings.controlsSettings.blast) - || (MarbleGame.instance.touchInput.blastbutton.pressed && MarbleGame.instance.touchInput.blastbutton.didPressIt) - || Gamepad.isPressed(Settings.gamepadSettings.blast)) { - if (Util.isTouchDevice()) - MarbleGame.instance.touchInput.blastbutton.didPressIt = false; - spectateMarbleIndex = -1; - MarbleGame.instance.touchInput.setSpectatorControlsVisibility(false); - return; - } - if (@:privateAccess level.marbles.length <= spectateMarbleIndex) { - spectateMarbleIndex = -1; - MarbleGame.instance.touchInput.setSpectatorControlsVisibility(false); - return; - } - - var marblePosition = @:privateAccess level.marbles[spectateMarbleIndex].lastRenderPos; - var up = new Vector(0, 0, 1); - up.transform(orientationQuat.toMatrix()); - var directionVector = new Vector(1, 0, 0); - var cameraVerticalTranslation = new Vector(0, 0, 0.3); - - var q1 = new Quat(); - q1.initRotateAxis(0, 1, 0, CameraPitch); - directionVector.transform(q1.toMatrix()); - cameraVerticalTranslation.transform(q1.toMatrix()); - q1.initRotateAxis(0, 0, 1, CameraYaw); - directionVector.transform(q1.toMatrix()); - cameraVerticalTranslation.transform(q1.toMatrix()); - directionVector.transform(orientationQuat.toMatrix()); - cameraVerticalTranslation.transform(orientationQuat.toMatrix()); - camera.up = up; - camera.pos = marblePosition.sub(directionVector.multiply(CameraDistance)); - camera.target = marblePosition.add(cameraVerticalTranslation); - - var closeness = 0.1; - var rayCastOrigin = marblePosition.add(level.marbles[spectateMarbleIndex].currentUp.multiply(marble._radius)); - - var processedShapes = []; - for (i in 0...3) { - var rayCastDirection = camera.pos.sub(rayCastOrigin); - rayCastDirection = rayCastDirection.add(rayCastDirection.normalized().multiply(2)); - - var rayCastLen = rayCastDirection.length(); - - var results = level.collisionWorld.rayCast(rayCastOrigin, rayCastDirection.normalized(), rayCastLen); - - var firstHit:octree.IOctreeObject.RayIntersectionData = null; - var firstHitDistance = 1e8; - for (result in results) { - if (!processedShapes.contains(result.object) - && (firstHit == null || (rayCastOrigin.distance(result.point) < firstHitDistance))) { - firstHit = result; - firstHitDistance = rayCastOrigin.distance(result.point); - } - } - if (firstHit != null) - processedShapes.push(firstHit.object); - - if (firstHit != null) { - if (firstHitDistance < CameraDistance) { - // camera.pos = marblePosition.sub(directionVector.multiply(firstHit.distance * 0.7)); - var plane = new Plane(firstHit.normal.x, firstHit.normal.y, firstHit.normal.z, firstHit.point.dot(firstHit.normal)); - var normal = firstHit.normal.multiply(-1); - // var position = firstHit.point; - - var projected = plane.project(camera.pos.toPoint()); - var dist = plane.distance(camera.pos.toPoint()); - - if (dist >= closeness) - continue; - - camera.pos = projected.toVector().add(normal.multiply(-closeness)); - - var forwardVec = marblePosition.sub(camera.pos).normalized(); - var rightVec = camera.up.cross(forwardVec).normalized(); - var upVec = forwardVec.cross(rightVec); - - camera.target = marblePosition.add(upVec.multiply(0.3)); - camera.up = upVec; - continue; - } - } - break; - } - } - - this.setPosition(camera.pos.x, camera.pos.y, camera.pos.z); - } - function rescaleDeadZone(value:Float, deadZone:Float) { if (deadZone >= value) { if (-deadZone <= value) @@ -587,16 +268,6 @@ class CameraController extends Object { // this.level.scene.camera.target = marblePosition.add(cameraVerticalTranslation); // camera.position.add(cameraVerticalTranslation); - if (overview) { - doOverviewCamera(currentTime, dt); - return; - } - - if (spectate) { - doSpectateCamera(currentTime, dt); - return; - } - var camera = level.scene.camera; var lerpt = 1 - Math.pow(0.5, dt / 0.016); // Math.min(1, 1 - Math.pow(0.6, dt / 0.032)); // hxd.Math.min(1, 1 - Math.pow(0.6, dt * 600)); diff --git a/src/Marble.hx b/src/Marble.hx index 4bb9f9cf..f459ef67 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -278,7 +278,6 @@ class Marble extends GameObject { var forcefield:DtsObject; var helicopter:DtsObject; - var megaHelicopter:DtsObject; var superBounceEnableTime:Float = -1e8; var shockAbsorberEnableTime:Float = -1e8; var helicopterEnableTime:Float = -1e8; @@ -569,21 +568,9 @@ class Marble extends GameObject { this.helicopter.y = 1e8; this.helicopter.z = 1e8; - this.megaHelicopter = new DtsObject(); - this.megaHelicopter.dtsPath = "data/shapes/items/megahelicopter.dts"; - this.megaHelicopter.useInstancing = false; - this.megaHelicopter.identifier = "MegaHelicopter"; - this.megaHelicopter.showSequences = true; - this.megaHelicopter.isBoundingBoxCollideable = false; - // this.addChild(this.helicopter); - this.megaHelicopter.x = 1e8; - this.megaHelicopter.y = 1e8; - this.megaHelicopter.z = 1e8; - var worker = new ResourceLoaderWorker(onFinish); worker.addTask(fwd -> level.addDtsObject(this.forcefield, fwd)); worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd)); - worker.addTask(fwd -> level.addDtsObject(this.megaHelicopter, fwd)); worker.run(); loadMarbleAttributes(); @@ -2418,49 +2405,43 @@ class Marble extends GameObject { move.d = new Vector(); move.d.x = Gamepad.getAxis(Settings.gamepadSettings.moveYAxis); move.d.y = -Gamepad.getAxis(Settings.gamepadSettings.moveXAxis); - if (@:privateAccess !MarbleGame.instance.world.playGui.isChatFocused()) { - if (Key.isDown(Settings.controlsSettings.forward)) { - move.d.x -= 1; - } - if (Key.isDown(Settings.controlsSettings.backward)) { - move.d.x += 1; - } - if (Key.isDown(Settings.controlsSettings.left)) { - move.d.y += 1; - } - if (Key.isDown(Settings.controlsSettings.right)) { - move.d.y -= 1; - } - move.d.x = Util.clamp(move.d.x, -1, 1); - move.d.y = Util.clamp(move.d.y, -1, 1); - if (Key.isDown(Settings.controlsSettings.jump) - || MarbleGame.instance.touchInput.jumpButton.pressed - || Gamepad.isDown(Settings.gamepadSettings.jump)) { - move.jump = true; - } - if ((!Util.isTouchDevice() && Key.isDown(Settings.controlsSettings.powerup)) - || (Util.isTouchDevice() && MarbleGame.instance.touchInput.powerupButton.pressed) - || Gamepad.isDown(Settings.gamepadSettings.powerup)) { - move.powerup = true; - } - if (Key.isDown(Settings.controlsSettings.blast) - || (MarbleGame.instance.touchInput.blastbutton.pressed) - || Gamepad.isDown(Settings.gamepadSettings.blast)) - move.blast = true; + if (Key.isDown(Settings.controlsSettings.forward)) { + move.d.x -= 1; + } + if (Key.isDown(Settings.controlsSettings.backward)) { + move.d.x += 1; + } + if (Key.isDown(Settings.controlsSettings.left)) { + move.d.y += 1; + } + if (Key.isDown(Settings.controlsSettings.right)) { + move.d.y -= 1; + } + move.d.x = Util.clamp(move.d.x, -1, 1); + move.d.y = Util.clamp(move.d.y, -1, 1); + if (Key.isDown(Settings.controlsSettings.jump) + || MarbleGame.instance.touchInput.jumpButton.pressed + || Gamepad.isDown(Settings.gamepadSettings.jump)) { + move.jump = true; + } + if ((!Util.isTouchDevice() && Key.isDown(Settings.controlsSettings.powerup)) + || (Util.isTouchDevice() && MarbleGame.instance.touchInput.powerupButton.pressed) + || Gamepad.isDown(Settings.gamepadSettings.powerup)) { + move.powerup = true; + } - if (Key.isDown(Settings.controlsSettings.respawn) || Gamepad.isDown(Settings.gamepadSettings.respawn)) { - move.respawn = true; - if (Net.isMP) { - @:privateAccess Key.keyPressed[Settings.controlsSettings.respawn] = 0; - Gamepad.releaseKey(Settings.gamepadSettings.respawn); - } + if (Key.isDown(Settings.controlsSettings.respawn) || Gamepad.isDown(Settings.gamepadSettings.respawn)) { + move.respawn = true; + if (Net.isMP) { + @:privateAccess Key.keyPressed[Settings.controlsSettings.respawn] = 0; + Gamepad.releaseKey(Settings.gamepadSettings.respawn); } + } - if (MarbleGame.instance.touchInput.movementInput.pressed) { - move.d.y = -MarbleGame.instance.touchInput.movementInput.value.x; - move.d.x = MarbleGame.instance.touchInput.movementInput.value.y; - } + if (MarbleGame.instance.touchInput.movementInput.pressed) { + move.d.y = -MarbleGame.instance.touchInput.movementInput.value.x; + move.d.x = MarbleGame.instance.touchInput.movementInput.value.y; } return move; } @@ -2606,30 +2587,16 @@ class Marble extends GameObject { this.forcefield.y = 1e8; this.forcefield.z = 1e8; } - if (megaEnabled) { - this.helicopter.setPosition(1e8, 1e8, 1e8); - if (helicopterEnabled) { - this.megaHelicopter.setPosition(x, y, z); - this.megaHelicopter.setRotationQuat(this.level.getOrientationQuat(timeState.currentAttemptTime)); - if (selfMarble) - this.helicopterSound.pause = false; - } else { - this.megaHelicopter.setPosition(1e8, 1e8, 1e8); - if (selfMarble) - this.helicopterSound.pause = true; - } + + if (helicopterEnabled) { + this.helicopter.setPosition(x, y, z); + this.helicopter.setRotationQuat(this.level.getOrientationQuat(timeState.currentAttemptTime)); + if (selfMarble) + this.helicopterSound.pause = false; } else { - this.megaHelicopter.setPosition(1e8, 1e8, 1e8); - if (helicopterEnabled) { - this.helicopter.setPosition(x, y, z); - this.helicopter.setRotationQuat(this.level.getOrientationQuat(timeState.currentAttemptTime)); - if (selfMarble) - this.helicopterSound.pause = false; - } else { - this.helicopter.setPosition(1e8, 1e8, 1e8); - if (selfMarble) - this.helicopterSound.pause = true; - } + this.helicopter.setPosition(1e8, 1e8, 1e8); + if (selfMarble) + this.helicopterSound.pause = true; } } diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 860ff110..cf7f81bd 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -1,10 +1,6 @@ package src; -import gui.JoinServerGui; -import gui.MPPreGameDlg; -import gui.MPExitGameDlg; import gui.GuiControl; -import gui.MPPlayMissionGui; import gui.MainMenuGui; #if !js import gui.ReplayCenterGui; @@ -33,7 +29,6 @@ import src.Debug; import src.Gamepad; import src.Analytics; import net.Net; -import net.MasterServerClient; import net.NetCommands; @:publicFields @@ -210,7 +205,6 @@ class MarbleGame { } public function update(dt:Float) { - MasterServerClient.process(); Net.checkPacketTimeout(dt); if (world != null) { if (world._disposed) { @@ -255,10 +249,6 @@ class MarbleGame { if (((Key.isPressed(Key.ESCAPE) #if js && paused #end) || Gamepad.isPressed(["start"])) && world.finishTime == null && world._ready) { - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg - || (Net.isMP && paused && !(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPExitGameDlg))) { - return; // don't pause - } handlePauseGame(); } } @@ -287,47 +277,22 @@ class MarbleGame { } public function showPauseUI() { - if (world.isMultiplayer) { - exitGameDlg = new MPExitGameDlg(() -> { - canvas.popDialog(exitGameDlg); - paused = !paused; - var w = getWorld(); - w.setCursorLock(true); - }, () -> { - canvas.popDialog(exitGameDlg); - quitMission(Net.isClient); - if (Net.isMP && Net.isClient) { - Net.disconnect(); - canvas.setContent(new JoinServerGui()); - } - }); - } else { - exitGameDlg = new ExitGameDlg((sender) -> { - canvas.popDialog(exitGameDlg); - var w = getWorld(); - if (MarbleGame.instance.toRecord) { - MarbleGame.canvas.pushDialog(new ReplayNameDlg(() -> { - quitMission(); - })); - } else { - quitMission(Net.isClient); - if (Net.isMP && Net.isClient) { - Net.disconnect(); - } - } - }, (sender) -> { - canvas.popDialog(exitGameDlg); - paused = !paused; - var w = getWorld(); - w.setCursorLock(true); - }, (sender) -> { - canvas.popDialog(exitGameDlg); - var w = getWorld(); - w.restart(w.marble, true); - // world.setCursorLock(true); - paused = !paused; - }); - } + exitGameDlg = new ExitGameDlg((sender) -> { + canvas.popDialog(exitGameDlg); + var w = getWorld(); + quitMission(Net.isClient); + }, (sender) -> { + canvas.popDialog(exitGameDlg); + paused = !paused; + var w = getWorld(); + w.setCursorLock(true); + }, (sender) -> { + canvas.popDialog(exitGameDlg); + var w = getWorld(); + w.restart(w.marble, true); + // world.setCursorLock(true); + paused = !paused; + }); canvas.pushDialog(exitGameDlg); } @@ -378,18 +343,12 @@ class MarbleGame { if (world.isWatching) { canvas.setContent(Type.createInstance(replayEndClass, [])); } else { - if (Net.isMP) { - var lobby = new MPPlayMissionGui(Net.isHost); - canvas.setContent(lobby); - } else { - if (!world.mission.isClaMission && !world.mission.isCustom) { - PlayMissionGui.currentCategoryStatic = world.mission.type; - PlayMissionGui.currentSelectionStatic = world.mission.index; - PlayMissionGui.currentGameStatic = world.mission.game; - } - var pmg = new PlayMissionGui(); - canvas.setContent(pmg); + if (!world.mission.isClaMission && !world.mission.isCustom) { + PlayMissionGui.currentCategoryStatic = world.mission.type; + PlayMissionGui.currentSelectionStatic = world.mission.index; } + var pmg = new PlayMissionGui(); + canvas.setContent(pmg); } world.dispose(); world = null; diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 7dbb1467..e6c25065 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -4,7 +4,6 @@ import net.NetPacket.ExplodableUpdatePacket; import net.TrapdoorPredictionStore; import shapes.Explodable; import net.ExplodablePredictionStore; -import gui.MPPreGameDlg; import src.Radar; import rewind.InputRecorder; import net.NetPacket.ScoreboardPacket; @@ -12,12 +11,9 @@ import net.NetPacket.PowerupPickupPacket; import net.Move; import net.NetPacket.GemSpawnPacket; import net.BitStream.OutputBitStream; -import net.MasterServerClient; import gui.MarbleSelectGui; -import gui.MPPlayMissionGui; import collision.CollisionPool; import net.GemPredictionStore; -import modes.HuntMode; import net.NetPacket.MarbleNetFlags; import net.PowerupPredictionStore; import net.MarblePredictionStore; @@ -295,7 +291,7 @@ class MarbleWorld extends Scheduler { public function initLoading() { Console.log("*** LOADING MISSION: " + mission.path); - this.loadingGui = new LoadingGui(this.mission.title, this.mission.game, this.isMultiplayer); + this.loadingGui = new LoadingGui(this.mission.title); MarbleGame.canvas.setContent(this.loadingGui); if (this.mission.isClaMission) { this.mission.download(() -> loadBegin()); @@ -367,39 +363,22 @@ class MarbleWorld extends Scheduler { public function postInit() { // Add the sky at the last so that cubemap reflections work - this.playGui.init(this.scene2d, this.mission.game.toLowerCase(), () -> { - this.scene.addChild(this.sky); + this.playGui.init(this.scene2d); + this.scene.addChild(this.sky); - if (this.isMultiplayer) { - // Add us - if (Net.isHost) { - this.playGui.addPlayer(0, Settings.highscoreName.substr(0, 15), true); - } else { - this.playGui.addPlayer(Net.clientId, Settings.highscoreName.substr(0, 15), true); - } - for (client in Net.clientIdMap) { - this.playGui.addPlayer(client.id, client.name.substr(0, 15), false); - } - } + this._ready = true; + var musicFileName = 'data/sound/music/' + this.mission.missionInfo.music; + if (ResourceLoader.exists(musicFileName)) + AudioManager.playMusic(ResourceLoader.getResource(musicFileName, ResourceLoader.getAudio, this.soundResources), this.mission.missionInfo.music); + else + AudioManager.playShell(); + MarbleGame.canvas.clearContent(); + if (this.endPad != null) + this.endPad.generateCollider(); - this._ready = true; - var musicFileName = 'data/sound/music/' + this.mission.missionInfo.music; - if (ResourceLoader.exists(musicFileName)) - AudioManager.playMusic(ResourceLoader.getResource(musicFileName, ResourceLoader.getAudio, this.soundResources), this.mission.missionInfo.music); - else - AudioManager.playShell(); - MarbleGame.canvas.clearContent(); - if (this.endPad != null) - this.endPad.generateCollider(); - if (this.isMultiplayer) { - this.playGui.formatGemHuntCounter(0); - this.playGui.formatCountdownTimer(0, 0); - } else { - this.playGui.formatGemCounter(this.gemCount, this.totalGems); - } - Console.log("MISSION LOADED"); - start(); - }); + this.playGui.formatGemCounter(this.gemCount, this.totalGems); + Console.log("MISSION LOADED"); + start(); } public function initScene(onFinish:Void->Void) { @@ -491,7 +470,6 @@ class MarbleWorld extends Scheduler { "sound/bumperding1.wav", "sound/bumper1.wav", "sound/jump.wav", - "sound/mega_roll.wav", "sound/bouncehard1.wav", "sound/bouncehard2.wav", "sound/bouncehard3.wav", @@ -500,8 +478,6 @@ class MarbleWorld extends Scheduler { "sound/ready.wav", "sound/set.wav", "sound/go.wav", - "sound/alarm.wav", - "sound/alarm_timeout.wav", "sound/missinggems.wav", "shapes/images/glow_bounce.dts", "shapes/images/glow_bounce.png", @@ -514,32 +490,8 @@ class MarbleWorld extends Scheduler { "shapes/items/gem.dts", // Ew ew "shapes/items/gemshine.png", "shapes/items/enviro1.jpg", + "shapes/balls/base.marble.png" ]; - if (this.game == "ultra" || Net.isMP) { - marblefiles.push("shapes/balls/pack1/marble20.normal.png"); - marblefiles.push("shapes/balls/pack1/marble18.normal.png"); - marblefiles.push("shapes/balls/pack1/marble01.normal.png"); - marblefiles.push("sound/blast.wav"); - } - // Hacky - if (client == null) { - marblefiles.push(StringTools.replace(Settings.optionsSettings.marbleModel, "data/", "")); - - if (Settings.optionsSettings.marbleCategoryIndex == 0) - marblefiles.push("shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png"); - else - marblefiles.push("shapes/balls/pack1/" + Settings.optionsSettings.marbleSkin + ".marble.png"); - } else { - var marbleDts = MarbleSelectGui.marbleData[client.getMarbleCatId()][client.getMarbleId()].dts; // FIXME - marblefiles.push(StringTools.replace(marbleDts, "data/", "")); - - var marbleSkin = MarbleSelectGui.marbleData[client.getMarbleCatId()][client.getMarbleId()].skin; - - if (client.getMarbleCatId() == 0) - marblefiles.push("shapes/balls/" + marbleSkin + ".marble.png"); - else - marblefiles.push("shapes/balls/pack1/" + marbleSkin + ".marble.png"); - } var gameModeFiles = this.gameMode.getPreloadFiles(); for (file in marblefiles) { @@ -602,7 +554,6 @@ class MarbleWorld extends Scheduler { } public function showPreGame() { - MarbleGame.canvas.pushDialog(new MPPreGameDlg()); this.setCursorLock(false); if (Util.isTouchDevice()) { MarbleGame.instance.touchInput.setControlsEnabled(false); @@ -622,8 +573,6 @@ class MarbleWorld extends Scheduler { this.initMarble(cc, () -> { var addedMarble = clientMarbles.get(cc); this.restart(addedMarble); // spawn it - this.playGui.addPlayer(cc.id, cc.getName(), false); - this.playGui.redrawPlayerList(); // Sort all the marbles so that they are updated in a deterministic order this.marbles.sort((a, b) -> @:privateAccess { @@ -639,8 +588,6 @@ class MarbleWorld extends Scheduler { this.initMarble(cc, () -> { var addedMarble = clientMarbles.get(cc); this.restart(addedMarble); // spawn it - this.playGui.addPlayer(cc.id, cc.getName(), false); - this.playGui.redrawPlayerList(); // Sort all the marbles so that they are updated in a deterministic order this.marbles.sort((a, b) -> @:privateAccess { @@ -779,17 +726,6 @@ class MarbleWorld extends Scheduler { this.marble.mode = Start; sky.follow = marble.camera; - if (isMultiplayer) { - for (client => marble in clientMarbles) { - this.cancel(marble.oobSchedule); - var marbleStartQuat = this.gameMode.getSpawnTransform(); - marble.setMarblePosition(marbleStartQuat.position.x, marbleStartQuat.position.y, marbleStartQuat.position.z); - marble.reset(); - marble.setMode(Start); - } - this.playGui.resetPlayerScores(); - } - var missionInfo:MissionElementScriptObject = cast this.mission.root.elements.filter((element) -> element._type == MissionElementType.ScriptObject && element._name == "MissionInfo")[0]; if (missionInfo.starthelptext != null) @@ -936,14 +872,8 @@ class MarbleWorld extends Scheduler { for (client => marble in this.clientMarbles) marble.setMode(Play); - this.playGui.redrawPlayerList(); // Update spectators display - this.playGui.setCenterText('go'); this.playGui.doStateChangeSound('go'); - - var huntMode = cast(this.gameMode, HuntMode); - - huntMode.freeSpawns(); } } if (this.multiplayerStarted) { @@ -1400,96 +1330,7 @@ class MarbleWorld extends Scheduler { this.gameMode.onRestart(); } - public function getWorldStateForClientJoin() { - var packets = []; - // First, gem spawn packet - var bs = new OutputBitStream(); - bs.writeByte(GemSpawn); - var packet = new GemSpawnPacket(); - - var hunt = cast(this.gameMode, HuntMode); - if (@:privateAccess hunt.activeGemSpawnGroup != null) { - var activeGemIds = []; - for (gemId in @:privateAccess hunt.activeGemSpawnGroup) { - if (@:privateAccess hunt.gemSpawnPoints[gemId].gem != null && @:privateAccess !hunt.gemSpawnPoints[gemId].gem.pickedUp) { - activeGemIds.push(gemId); - } - } - packet.gemIds = activeGemIds; - packet.serialize(bs); - packets.push(bs.getBytes()); - } - - // Marble states - for (marb in this.marbles) { - var oldFlags = @:privateAccess marb.netFlags; - @:privateAccess marb.netFlags = MarbleNetFlags.DoBlast | MarbleNetFlags.DoMega | MarbleNetFlags.DoHelicopter | MarbleNetFlags.DoShockAbsorber | MarbleNetFlags.DoSuperBounce | MarbleNetFlags.PickupPowerup | MarbleNetFlags.GravityChange | MarbleNetFlags.UsePowerup; - - if (oldFlags & MarbleNetFlags.UpdateTrapdoor > 0) { - @:privateAccess marb.netFlags |= MarbleNetFlags.UpdateTrapdoor; - } - - var innerMove = @:privateAccess marb.lastMove; - if (innerMove == null) { - innerMove = new Move(); - innerMove.d = new Vector(0, 0); - } - var motionDir = @:privateAccess marb.moveMotionDir; - if (motionDir == null) { - motionDir = marb.getMarbleAxis()[1]; - } - - var move = new NetMove(innerMove, motionDir, timeState, timeState.ticks, 65535); - - packets.push(@:privateAccess marb.packUpdate(move, timeState)); - - @:privateAccess marb.netFlags = oldFlags; - } - - // Powerup states - for (powerup in this.powerUps) { - if (powerup.currentOpacity != 1.0) { // it must be picked up or something - if (@:privateAccess powerup.pickupClient != -1) { - var b = new OutputBitStream(); - b.writeByte(NetPacketType.PowerupPickup); - var pickupPacket = new PowerupPickupPacket(); - pickupPacket.clientId = @:privateAccess powerup.pickupClient; - pickupPacket.serverTicks = @:privateAccess powerup.pickupTicks; - pickupPacket.powerupItemId = powerup.netIndex; - pickupPacket.serialize(b); - packets.push(b.getBytes()); - } - } - } - - // Explosion states - for (exp in this.explodables) { - if (this.timeState.ticks < (exp.lastContactTick + exp.renewTime >> 5)) { - var b = new OutputBitStream(); - b.writeByte(NetPacketType.ExplodableUpdate); - var explPacket = new ExplodableUpdatePacket(); - explPacket.explodableId = exp.netId; - explPacket.serverTicks = timeState.ticks; - explPacket.serialize(b); - packets.push(b.getBytes()); - } - } - - // Scoreboard! - var b = new OutputBitStream(); - b.writeByte(NetPacketType.ScoreBoardInfo); - var sbPacket = new ScoreboardPacket(); - for (player in @:privateAccess this.playGui.playerList) { - sbPacket.scoreBoard.set(player.id, player.score); - sbPacket.rBoard.set(player.id, player.r); - sbPacket.yBoard.set(player.id, player.y); - sbPacket.bBoard.set(player.id, player.b); - } - sbPacket.serialize(b); - packets.push(b.getBytes()); - - return packets; - } + public function getWorldStateForClientJoin() {} inline function hasPredictionFlag(mask:Int, clientId:Int):Bool { return (mask & (1 << clientId)) != 0; @@ -1600,14 +1441,6 @@ class MarbleWorld extends Scheduler { t.update(advanceTimeState); } - var huntMode:HuntMode = cast this.gameMode; - if (@:privateAccess huntMode.activeGemSpawnGroup != null) { - for (activeGem in @:privateAccess huntMode.activeGemSpawnGroup) { - var g = @:privateAccess huntMode.gemSpawnPoints[activeGem].gem; - if (g != null && g.pickUpClient != -1 && marbleNeedsPrediction & (1 << g.pickUpClient) > 0) - huntMode.setGemHiddenStatus(activeGem, gemPredictions.getState(activeGem)); - } - } // } // } @@ -1710,13 +1543,7 @@ class MarbleWorld extends Scheduler { return -1; } - public function spawnHuntGemsClientSide(gemIds:Array, expireds:Array) { - if (this.isMultiplayer && Net.isClient) { - var huntMode:HuntMode = cast this.gameMode; - huntMode.setActiveSpawnSphere(gemIds, expireds); - // radar.blink(); - } - } + public function spawnHuntGemsClientSide(gemIds:Array, expireds:Array) {} public function removePlayer(cc:GameConnection) { var otherMarble = this.clientMarbles[cc]; @@ -1726,7 +1553,6 @@ class MarbleWorld extends Scheduler { this.scene.removeChild(otherMarble); this.collisionWorld.removeMarbleEntity(otherMarble.collider); this.collisionWorld.removeMovingEntity(otherMarble.collider); - this.playGui.removePlayer(cc.id); this.clientMarbles.remove(cc); otherMarble.dispose(); this.marbles.remove(otherMarble); @@ -1877,17 +1703,6 @@ class MarbleWorld extends Scheduler { this.tickSchedule(timeState.currentAttemptTime); - if (Key.isPressed(Settings.controlsSettings.blast) - || (MarbleGame.instance.touchInput.blastbutton.pressed) - || Gamepad.isPressed(Settings.gamepadSettings.blast) - && !this.isWatching - && this.game == "ultra") { - this.marble.useBlast(timeState); - if (this.isRecording) { - this.replay.recordMarbleStateFlags(false, false, false, true); - } - } - if (this.isWatching && this.replay.currentPlaybackFrame.marbleStateFlags.has(UsedBlast)) this.marble.useBlast(timeState); @@ -2305,7 +2120,7 @@ class MarbleWorld extends Scheduler { } if (finishTime != null) this.timeState.gameplayClock = finishTime.gameplayClock; - playGui.formatTimer(this.timeState.gameplayClock, determineClockColor(this.timeState.gameplayClock)); + playGui.formatTimer(this.timeState.gameplayClock); if (!this.isWatching && this.isRecording) this.replay.recordTimeState(timeState.currentAttemptTime, timeState.gameplayClock, this.bonusTime); @@ -2313,14 +2128,11 @@ class MarbleWorld extends Scheduler { public function updateBlast(marble:Marble, timestate:TimeState) { if (Net.isMP) { - if (this.marble == marble) { - this.playGui.setBlastValue(marble.blastTicks / (25000 >> 5)); - } + if (this.marble == marble) {} } else if (this.game == "ultra") { if (marble.blastAmount < 1) { marble.blastAmount = Util.clamp(marble.blastAmount + (timeState.dt / 25), 0, 1); } - this.playGui.setBlastValue(marble.blastAmount); } } @@ -2455,6 +2267,7 @@ class MarbleWorld extends Scheduler { var pointercontainer = js.Browser.document.querySelector("#pointercontainer"); pointercontainer.hidden = false; #end + var wasRecording = this.isRecording; this.schedule(this.timeState.currentAttemptTime + 3, () -> { this.isRecording = false; // Stop recording here }, "stopRecordingTimeout"); @@ -2475,10 +2288,15 @@ class MarbleWorld extends Scheduler { #end } if (MarbleGame.instance.toRecord) { - MarbleGame.canvas.pushDialog(new ReplayNameDlg(endGameCode)); - } else { - endGameCode(); + if (this.isRecording) { + this.isRecording = false; // Stop recording here if we haven't already + this.clearScheduleId("stopRecordingTimeout"); + } + if (wasRecording) { + this.saveReplay(); + } } + endGameCode(); }, (sender) -> { var restartGameCode = () -> { MarbleGame.canvas.popDialog(egg); @@ -2492,26 +2310,16 @@ class MarbleWorld extends Scheduler { // @:privateAccess playGui.playGuiCtrl.render(scene2d); } if (MarbleGame.instance.toRecord) { - MarbleGame.canvas.pushDialog(new ReplayNameDlg(() -> { - this.isRecording = true; - restartGameCode(); - })); - } else { - restartGameCode(); - } - }, (sender) -> { - var nextLevelCode = () -> { - var nextMission = mission.getNextMission(); - if (nextMission != null) { - MarbleGame.instance.playMission(nextMission); + if (this.isRecording) { + this.clearScheduleId("stopRecordingTimeout"); + } + if (wasRecording) { + this.saveReplay(); + this.isRecording = true; // Start a new recording for the restarted game } } - if (MarbleGame.instance.toRecord) { - MarbleGame.canvas.pushDialog(new ReplayNameDlg(nextLevelCode)); - } else { - nextLevelCode(); - } - }, mission, finishTime, this.replay.write()); + restartGameCode(); + }, mission, finishTime); MarbleGame.canvas.pushDialog(egg); this.setCursorLock(false); return 0; @@ -2560,13 +2368,6 @@ class MarbleWorld extends Scheduler { public function addBonusTime(t:Float) { this.bonusTime += t; - if (t > 0) { - this.playGui.addMiddleMessage('-${t}s', 0x99ff99); - } else if (t < 0) { - this.playGui.addMiddleMessage('+${- t}s', 0xff9999); - } else { - this.playGui.addMiddleMessage('+0s', 0xcccccc); - } } /** Get the current interpolated orientation quaternion. */ @@ -2818,33 +2619,26 @@ class MarbleWorld extends Scheduler { } public function saveReplay() { - this.replay.name = MarbleGame.instance.recordingName; - #if hl - sys.FileSystem.createDirectory(haxe.io.Path.join([Settings.settingsDir, "data", "replays"])); - var replayPath = haxe.io.Path.join([Settings.settingsDir, "data", "replays", '${this.replay.name}.mbr']); - if (sys.FileSystem.exists(replayPath)) { - var count = 1; - var found = false; - while (!found) { - replayPath = haxe.io.Path.join([Settings.settingsDir, "data", "replays", '${this.replay.name} (${count}).mbr']); - if (!sys.FileSystem.exists(replayPath)) { - this.replay.name += ' (${count})'; - found = true; - } else { - count++; - } - } - } var replayBytes = this.replay.write(); - sys.io.File.saveBytes(replayPath, replayBytes); + var defaultFilename = '${this.mission.title} ${this.finishTime == null ? "Unfinished Run" : Std.string(this.finishTime.gameplayClock)}.mbr'; + #if hl + hxd.File.saveAs(replayBytes, { + title: 'Save Replay', + fileTypes: [ + { + name: "Replay (*.mbr)", + extensions: ["mbr"] + } + ], + defaultPath: defaultFilename + }); #end #if js - var replayBytes = this.replay.write(); var blob = new js.html.Blob([replayBytes.getData()], { type: 'application/octet-stream' }); var url = js.html.URL.createObjectURL(blob); - var fname = '${this.replay.name}.mbr'; + var fname = defaultFilename; var element = js.Browser.document.createElement('a'); element.setAttribute('href', url); element.setAttribute('download', fname); diff --git a/src/MissionList.hx b/src/MissionList.hx index 3d8dfa32..c1f84e43 100644 --- a/src/MissionList.hx +++ b/src/MissionList.hx @@ -4,12 +4,13 @@ import haxe.Json; import mis.MisParser; import src.ResourceLoader; import src.Mission; -import src.Console; -import src.MissionList; +import src.Util; @:publicFields class MissionList { - static var missionList:Map>>; + static var beginnerMissions:Array; + static var intermediateMissions:Array; + static var advancedMissions:Array; static var customMissions:Array; static var missions:Map; @@ -23,110 +24,58 @@ class MissionList { return; missions = new Map(); - missionList = []; - function parseDifficulty(game:String, mispath:String, difficulty:String) { + function parseDifficulty(difficulty:String) { #if (hl && !android) - var difficultyFiles = ResourceLoader.fileSystem.dir('data/${mispath}/' + difficulty); + var difficultyFiles = ResourceLoader.fileSystem.dir("data/missions/" + difficulty); #end #if (js || android) - var difficultyFiles = ResourceLoader.fileSystem.dir('${mispath}/' + difficulty); + var difficultyFiles = ResourceLoader.fileSystem.dir("missions/" + difficulty); #end var difficultyMissions = []; for (file in difficultyFiles) { if (file.extension == "mis") { - var misParser = new MisParser(file.getText()); + var misParser = new MisParser(Util.toASCII(file.getBytes())); var mInfo = misParser.parseMissionInfo(); var mission = Mission.fromMissionInfo(file.path, mInfo); - if (game != "custom") - mission.game = game; - else if (mInfo.game != null && mInfo.game != "") - mission.game = mInfo.game.toLowerCase(); - else - mission.game = game; // Last case scenario - if (game == "custom") - mission.isCustom = true; - // do egg thing - if (StringTools.contains(file.getText().toLowerCase(), 'datablock = "easteregg"')) { // Ew - mission.hasEgg = true; - } + mission.game = "gold"; missions.set(file.path, mission); difficultyMissions.push(mission); } + if (file.isDirectory) { + var retdir = parseDifficulty(difficulty + "/" + file.name); + difficultyMissions = difficultyMissions.concat(retdir); + } } difficultyMissions.sort((a, b) -> Std.parseInt(a.missionInfo.level) - Std.parseInt(b.missionInfo.level)); - - for (i in 0...difficultyMissions.length) { - difficultyMissions[i].index = i; - } - - for (i in 0...difficultyMissions.length - 1) { - @:privateAccess difficultyMissions[i].next = difficultyMissions[i + 1]; - } return difficultyMissions; } - var goldMissions:Map> = []; - var platinumMissions:Map> = []; - var ultraMissions:Map> = []; - var multiplayerMissions:Map> = []; - - goldMissions.set("beginner", parseDifficulty("gold", "missions_mbg", "beginner")); - goldMissions.set("intermediate", parseDifficulty("gold", "missions_mbg", "intermediate")); - goldMissions.set("advanced", parseDifficulty("gold", "missions_mbg", "advanced")); - - platinumMissions.set("beginner", parseDifficulty("platinum", "missions_mbp", "beginner")); - platinumMissions.set("intermediate", parseDifficulty("platinum", "missions_mbp", "intermediate")); - platinumMissions.set("advanced", parseDifficulty("platinum", "missions_mbp", "advanced")); - platinumMissions.set("expert", parseDifficulty("platinum", "missions_mbp", "expert")); - - ultraMissions.set("beginner", parseDifficulty("ultra", "missions_mbu", "beginner")); - ultraMissions.set("intermediate", parseDifficulty("ultra", "missions_mbu", "intermediate")); - ultraMissions.set("advanced", parseDifficulty("ultra", "missions_mbu", "advanced")); - - multiplayerMissions.set("beginner", parseDifficulty("multiplayer", "multiplayer/hunt", "beginner")); - multiplayerMissions.set("intermediate", parseDifficulty("multiplayer", "multiplayer/hunt", "intermediate")); - multiplayerMissions.set("advanced", parseDifficulty("multiplayer", "multiplayer/hunt", "advanced")); - - customMissions = parseDifficulty("custom", "missions", "custom"); - - @:privateAccess goldMissions["beginner"][goldMissions["beginner"].length - 1].next = goldMissions["intermediate"][0]; - @:privateAccess goldMissions["intermediate"][goldMissions["intermediate"].length - 1].next = goldMissions["advanced"][0]; - @:privateAccess goldMissions["advanced"][goldMissions["advanced"].length - 1].next = goldMissions["beginner"][0]; - @:privateAccess platinumMissions["beginner"][platinumMissions["beginner"].length - 1].next = platinumMissions["intermediate"][0]; - @:privateAccess platinumMissions["intermediate"][platinumMissions["intermediate"].length - 1].next = platinumMissions["advanced"][0]; - @:privateAccess platinumMissions["advanced"][platinumMissions["advanced"].length - 1].next = platinumMissions["expert"][0]; - @:privateAccess platinumMissions["expert"][platinumMissions["expert"].length - 1].next = platinumMissions["beginner"][0]; - @:privateAccess ultraMissions["beginner"][ultraMissions["beginner"].length - 1].next = ultraMissions["intermediate"][0]; - @:privateAccess ultraMissions["intermediate"][ultraMissions["intermediate"].length - 1].next = ultraMissions["advanced"][0]; - @:privateAccess ultraMissions["advanced"][ultraMissions["advanced"].length - 1].next = ultraMissions["beginner"][0]; - - // Hypercube uses MBG logic - ultraMissions["advanced"][ultraMissions["advanced"].length - 1].game = "gold"; - - missionList.set("gold", goldMissions); - missionList.set("platinum", platinumMissions); - missionList.set("ultra", ultraMissions); - missionList.set("multiplayer", multiplayerMissions); - - Console.log("Loaded MissionList"); - Console.log("Gold Beginner: " + goldMissions["beginner"].length); - Console.log("Gold Intermediate: " + goldMissions["intermediate"].length); - Console.log("Gold Advanced: " + goldMissions["advanced"].length); - Console.log("Platinum Beginner: " + platinumMissions["beginner"].length); - Console.log("Platinum Intermediate: " + platinumMissions["intermediate"].length); - Console.log("Platinum Advanced: " + platinumMissions["advanced"].length); - Console.log("Platinum Expert: " + platinumMissions["expert"].length); - Console.log("Ultra Beginner: " + ultraMissions["beginner"].length); - Console.log("Ultra Intermediate: " + ultraMissions["intermediate"].length); - Console.log("Ultra Advanced: " + ultraMissions["advanced"].length); - Console.log("Multiplayer Beginner: " + multiplayerMissions["beginner"].length); - Console.log("Multiplayer Intermediate: " + multiplayerMissions["intermediate"].length); - Console.log("Multiplayer Advanced: " + multiplayerMissions["advanced"].length); - Console.log("Custom: " + customMissions.length); + beginnerMissions = parseDifficulty("beginner"); + intermediateMissions = parseDifficulty("intermediate"); + advancedMissions = parseDifficulty("advanced"); + customMissions = parseDifficulty("custom"); // parseCLAList(); _build = true; } + + static function parseCLAList() { + var claJson:Array = Json.parse(ResourceLoader.fileSystem.get("data/cla_list.json").getText()); + + for (missionData in claJson) { + var mission = new Mission(); + mission.id = missionData.id; + mission.artist = missionData.artist; + mission.title = missionData.name; + mission.description = missionData.desc; + mission.qualifyTime = missionData.time; + mission.goldTime = missionData.goldTime; + mission.path = missionData.baseName; + mission.isClaMission = true; + + customMissions.push(mission); + } + } } diff --git a/src/Settings.hx b/src/Settings.hx index 3d668542..953c8f0d 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -222,6 +222,7 @@ class Settings { public static var levelStatistics:Map = []; + public static var progression = [24, 24, 52]; public static var highscoreName = ""; public static var userId = ""; @@ -276,6 +277,7 @@ class Settings { controls: controlsSettings, touch: touchSettings, gamepad: gamepadSettings, + progression: progression, stats: playStatistics, server: serverSettings, highscoreName: highscoreName, @@ -461,6 +463,7 @@ class Settings { optionsSettings.rewindTimescale = 1; } #end + progression = json.progression; highscoreName = json.highscoreName; if (highscoreName == null) { highscoreName = ""; diff --git a/src/gui/EndGameGui.hx b/src/gui/EndGameGui.hx index cc293be8..fc8154f2 100644 --- a/src/gui/EndGameGui.hx +++ b/src/gui/EndGameGui.hx @@ -1,8 +1,5 @@ package gui; -import src.Leaderboards; -import hxd.BitmapData; -import h2d.Tile; import src.MarbleGame; import src.Settings.Score; import src.Settings.Settings; @@ -19,8 +16,7 @@ class EndGameGui extends GuiControl { var scoreSubmitted:Bool = false; - public function new(continueFunc:GuiControl->Void, restartFunc:GuiControl->Void, nextLevelFunc:GuiControl->Void, mission:Mission, timeState:TimeState, - replayData:haxe.io.Bytes) { + public function new(continueFunc:GuiControl->Void, restartFunc:GuiControl->Void, mission:Mission, timeState:TimeState) { super(); this.horizSizing = Width; this.vertSizing = Height; @@ -35,57 +31,30 @@ class EndGameGui extends GuiControl { return [normal, hover, pressed]; } - var pg = new GuiImage(ResourceLoader.getResource("data/ui/endgame/base.png", ResourceLoader.getImage, this.imageResources).toTile()); + var pg = new GuiImage(ResourceLoader.getResource("data/ui/play/playgui.png", ResourceLoader.getImage, this.imageResources).toTile()); pg.horizSizing = Center; pg.vertSizing = Center; - pg.position = new Vector(28, 20); - pg.extent = new Vector(584, 440); + pg.position = new Vector(77, 9); + pg.extent = new Vector(485, 461); var continueButton = new GuiButton(loadButtonImages("data/ui/endgame/continue")); continueButton.horizSizing = Right; continueButton.vertSizing = Bottom; - continueButton.position = new Vector(460, 307); - continueButton.extent = new Vector(104, 54); + continueButton.position = new Vector(333, 386); + continueButton.extent = new Vector(113, 47); continueButton.accelerator = hxd.Key.ENTER; continueButton.gamepadAccelerator = ["A"]; - continueButton.pressedAction = (e) -> continueFunc(continueButton); + continueButton.pressedAction = (e) -> continueFunc(this); var restartButton = new GuiButton(loadButtonImages("data/ui/endgame/replay")); restartButton.horizSizing = Right; restartButton.vertSizing = Bottom; - restartButton.position = new Vector(460, 363); - restartButton.extent = new Vector(104, 54); + restartButton.position = new Vector(51, 388); + restartButton.extent = new Vector(104, 48); restartButton.gamepadAccelerator = ["B"]; - restartButton.pressedAction = (e) -> restartFunc(restartButton); - - var nextLevel = new GuiControl(); - nextLevel.position = new Vector(326, 307); - nextLevel.extent = new Vector(130, 110); - - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - - var nextLevelPreview = new GuiImage(tmpprevtile); - nextLevelPreview.position = new Vector(-15, 0); - nextLevelPreview.extent = new Vector(160, 110); - nextLevel.addChild(nextLevelPreview); - - mission.getNextMission()?.getPreviewImage(t -> { - nextLevelPreview.bmp.tile = t; - }); - - var nextLevelBtn = new GuiButton(loadButtonImages('data/ui/endgame/level_window')); - nextLevelBtn.horizSizing = Width; - nextLevelBtn.vertSizing = Height; - nextLevelBtn.position = new Vector(0, 0); - nextLevelBtn.extent = new Vector(130, 110); - nextLevelBtn.gamepadAccelerator = ["X"]; - nextLevelBtn.pressedAction = (e) -> nextLevelFunc(nextLevelBtn); - nextLevel.addChild(nextLevelBtn); + restartButton.pressedAction = (e) -> restartFunc(this); function setButtonStates(enabled:Bool) { - nextLevelBtn.disabled = !enabled; continueButton.disabled = !enabled; restartButton.disabled = !enabled; } @@ -98,9 +67,7 @@ class EndGameGui extends GuiControl { var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); var domcasual32b = new BitmapFont(domcasual32fontdata.entry); @:privateAccess domcasual32b.loader = ResourceLoader.loader; - var domcasual32 = domcasual32b.toSdfFont(cast 28 * Settings.uiScale, MultiChannel); - var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel); - var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); var expo50fontdata = ResourceLoader.getFileEntry("data/font/EXPON.fnt"); var expo50b = new BitmapFont(expo50fontdata.entry); @@ -110,12 +77,8 @@ class EndGameGui extends GuiControl { function mlFontLoader(text:String) { switch (text) { - case "DomCasual24": - return domcasual24; case "DomCasual32": return domcasual32; - case "DomCasual64": - return domcasual64; case "Arial14": return arial14; case "Expo32": @@ -125,261 +88,84 @@ class EndGameGui extends GuiControl { } } - var egResult = new GuiMLText(domcasual32, mlFontLoader); - egResult.position = new Vector(313, 54); - egResult.extent = new Vector(244, 69); - egResult.text.text = '

${Util.formatTime(timeState.gameplayClock)}

'; - egResult.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - egTitleText.position = new Vector(34, 54); - egTitleText.extent = new Vector(247, 69); - pg.addChild(egTitleText); - - var egTopThreeText = new GuiMLText(domcasual32, mlFontLoader); - egTopThreeText.position = new Vector(341, 114); - egTopThreeText.extent = new Vector(209, 34); - egTopThreeText.text.text = 'Top 5 Times:'; // Make toggleable 3-5 - egTopThreeText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - pg.addChild(egTopThreeText); - - var text = '

'; - // Check for ultimate time TODO - if (mission.ultimateTime > 0 && timeState.gameplayClock < mission.ultimateTime) { - text += 'You beat the Ultimate Time!'; - } else { - if (mission.goldTime > 0 && timeState.gameplayClock < mission.goldTime) { - if (mission.game == "gold" || mission.game.toLowerCase() == "ultra") - text += 'You beat the Gold Time!'; - else - text += 'You beat the Platinum Time!'; - } else { - if (mission.qualifyTime > timeState.gameplayClock) { - text += "You beat the Par Time!"; - } else { - text += 'You didn\'t pass the Par Time!'; - } - } - } - text += '

'; + var congrats = new GuiMLText(expo50, mlFontLoader); + congrats.text.textColor = 0xffff00; + congrats.text.text = 'Final Time: ${Util.formatTime(timeState.gameplayClock)}'; + congrats.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + congrats.position = new Vector(43, 24); + congrats.extent = new Vector(408, 50); + pg.addChild(congrats); var finishMessage = new GuiMLText(expo32, mlFontLoader); finishMessage.text.textColor = 0x00ff00; - finishMessage.text.text = text; - finishMessage.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; + var qualified = mission.qualifyTime > timeState.gameplayClock; + if (qualified) + finishMessage.text.text = timeState.gameplayClock < mission.goldTime ? 'You beat the GOLD time!' : "You've qualified!"; + else + finishMessage.text.text = 'You failed to qualify!'; + finishMessage.text.filter = new DropShadow(1, 0.785, 0, 1, 0, 0.4, 1, true); // finishMessage.justify = Center; - finishMessage.position = new Vector(25, 120); - finishMessage.extent = new Vector(293, 211); + finishMessage.position = new Vector(155, 74); + if (timeState.gameplayClock < mission.goldTime) { + finishMessage.position.x = 110; + } + if (!qualified) + finishMessage.position.x = 125; + finishMessage.extent = new Vector(400, 100); pg.addChild(finishMessage); - var qualified = mission.qualifyTime > timeState.gameplayClock; - var scoreData:Array = Settings.getScores(mission.path); - while (scoreData.length < 5) { - scoreData.push({name: "Matan W.", time: 5999.999}); + while (scoreData.length < 3) { + scoreData.push({name: "Nardo Polo", time: 5999.999}); } - egFirstLine.text.text = '

1. ${StringTools.htmlEscape(scoreData[0].name)}

'; - egSecondLine.text.text = '

2. ${StringTools.htmlEscape(scoreData[1].name)}

'; - egThirdLine.text.text = '

3. ${StringTools.htmlEscape(scoreData[2].name)}

'; - egFourthLine.text.text = '

4. ${StringTools.htmlEscape(scoreData[3].name)}

'; - egFifthLine.text.text = '

5. ${StringTools.htmlEscape(scoreData[4].name)}

'; - var lineelems = [ - egFirstLineScore, - egSecondLineScore, - egThirdLineScore, - egFourthLineScore, - egFifthLineScore - ]; - - for (i in 0...5) { - if (scoreData[i].time < mission.ultimateTime) { - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } else { - if (scoreData[i].time < mission.goldTime) { - if (mission.game == "gold" || mission.game.toLowerCase() == "ultra") - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - else - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } else { - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } - } - } - - var leftColumn = new GuiMLText(domcasual24, mlFontLoader); + var leftColumn = new GuiMLText(domcasual32, mlFontLoader); 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0x777777 - }; - leftColumn.position = new Vector(25, 165); - leftColumn.extent = new Vector(293, 211); + leftColumn.text.textColor = 0x000000; + leftColumn.text.text = 'Qualify Time:
Gold Time:
Elapsed Time:
Bonus Time:

Best Times:
'; + for (i in 0...3) { + leftColumn.text.text += '${i + 1}. ${scoreData[i].name}
'; + } + leftColumn.text.filter = new DropShadow(1.414, 0.785, 0xffffff, 1, 0, 0.4, 1, true); + leftColumn.position = new Vector(108, 113); + leftColumn.extent = new Vector(208, 50); pg.addChild(leftColumn); var elapsedTime = Math.max(timeState.currentAttemptTime - 3.5, 0); var bonusTime = Math.max(0, Std.int((elapsedTime - timeState.gameplayClock) * 1000) / 1000); - var rightColumn = new GuiMLText(domcasual24, mlFontLoader); + var rightColumn = new GuiMLText(domcasual32, mlFontLoader); 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0x777777 - }; - rightColumn.position = new Vector(235, 165); - rightColumn.extent = new Vector(293, 211); + rightColumn.text.textColor = 0x000000; + rightColumn.text.text = '${Util.formatTime(mission.qualifyTime == Math.POSITIVE_INFINITY ? 5999.999 : mission.qualifyTime)}

${Util.formatTime(elapsedTime)}
${Util.formatTime(bonusTime)}


'; + for (i in 0...3) { + if (scoreData[i].time < mission.goldTime) + rightColumn.text.text += '
'; + else + rightColumn.text.text += '${Util.formatTime(scoreData[i].time)}
'; + } + rightColumn.text.filter = new DropShadow(1.414, 0.785, 0xffffff, 1, 0, 0.4, 1, true); + rightColumn.position = new Vector(274, 113); + rightColumn.extent = new Vector(208, 50); pg.addChild(rightColumn); + var rightColumnGold = new GuiMLText(domcasual32, mlFontLoader); + rightColumnGold.text.lineSpacing = 5; + rightColumnGold.text.textColor = 0xFFFF00; + rightColumnGold.text.text = '
${Util.formatTime(mission.goldTime)}




'; + for (i in 0...3) { + if (scoreData[i].time < mission.goldTime) + rightColumnGold.text.text += '${Util.formatTime(scoreData[i].time)}
'; + else + rightColumnGold.text.text += '
'; + } + rightColumnGold.text.filter = new DropShadow(1.414, 0.785, 0x00000, 1, 0, 0.4, 1, true); + rightColumnGold.position = new Vector(274, 113); + rightColumnGold.extent = new Vector(208, 50); + pg.addChild(rightColumnGold); + pg.addChild(continueButton); pg.addChild(restartButton); - pg.addChild(nextLevel); - pg.addChild(egFirstLine); - pg.addChild(egSecondLine); - pg.addChild(egThirdLine); - pg.addChild(egFourthLine); - pg.addChild(egFifthLine); this.addChild(pg); @@ -388,15 +174,14 @@ class EndGameGui extends GuiControl { var idx = scoreTimes.indexOf(timeState.gameplayClock); - // if (Settings.progression[mission.difficultyIndex] == mission.index && qualified) { - // Settings.progression[mission.difficultyIndex]++; - // } + if (mission.difficultyIndex != -1) { + if (Settings.progression[mission.difficultyIndex] == mission.index && qualified) { + Settings.progression[mission.difficultyIndex]++; + } + } Settings.save(); - var rewindUsed = MarbleGame.instance.world.rewindUsed; - var cheatsUsed = MarbleGame.instance.world.cheatsUsed; - - if (idx <= 4) { + if (idx <= 2) { setButtonStates(false); var end = new EnterNameDlg(idx, (name) -> { setButtonStates(true); @@ -407,64 +192,32 @@ class EndGameGui extends GuiControl { scoreData.push(myScore); scoreData.sort((a, b) -> a.time == b.time ? 0 : (a.time > b.time ? 1 : -1)); - egFirstLine.text.text = '

1. ${scoreData[0].name}

'; - egSecondLine.text.text = '

2. ${scoreData[1].name}

'; - egThirdLine.text.text = '

3. ${scoreData[2].name}

'; - egFourthLine.text.text = '

4. ${scoreData[3].name}

'; - egFifthLine.text.text = '

5. ${scoreData[4].name}

'; - - for (i in 0...5) { - if (scoreData[i].time < mission.ultimateTime) { - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } else { - if (scoreData[i].time < mission.goldTime) { - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } else { - lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - } - } + leftColumn.text.text = 'Qualify Time:
Gold Time:
Elapsed Time:
Bonus Time:

Best Times:
'; + for (i in 0...3) { + leftColumn.text.text += '${i + 1}. ${scoreData[i].name}
'; } - if (!cheatsUsed) { // dont submit or save if we have cheated - Settings.saveScore(mission.path, myScore); - var lbPath = mission.path; - if (mission.isClaMission) - lbPath = 'custom/${mission.id}'; - Leaderboards.submitScore(lbPath, myScore.time, rewindUsed, (sendReplay, rowId) -> { - if (sendReplay && !mission.isClaMission) { - Leaderboards.submitReplay(rowId, replayData); - } - }); + rightColumn.text.text = '${Util.formatTime(mission.qualifyTime == Math.POSITIVE_INFINITY ? 5999.999 : mission.qualifyTime)}

${Util.formatTime(elapsedTime)}
${Util.formatTime(bonusTime)}


'; + for (i in 0...3) { + if (scoreData[i].time < mission.goldTime) + rightColumn.text.text += '
'; + else + rightColumn.text.text += '${Util.formatTime(scoreData[i].time)}
'; } + rightColumnGold.text.text = '
${Util.formatTime(mission.goldTime)}




'; + for (i in 0...3) { + if (scoreData[i].time < mission.goldTime) + rightColumnGold.text.text += '${Util.formatTime(scoreData[i].time)}
'; + else + rightColumnGold.text.text += '
'; + } + + Settings.saveScore(mission.path, myScore); + scoreSubmitted = true; }); this.addChild(end); - } else { - // Check if we can submit LB scores - var lbPath = mission.path; - if (mission.isClaMission) - lbPath = 'custom/${mission.id}'; - Leaderboards.getScores(lbPath, All, (scores) -> { - var hasMyScore = false; - var myTopScoreLB = 0.0; - for (score in scores) { - if (score.name == Settings.highscoreName) { - hasMyScore = true; - myTopScoreLB = score.score; - break; - } - } - if (!cheatsUsed) { - if (!hasMyScore || (hasMyScore && myTopScoreLB > timeState.gameplayClock)) { - Leaderboards.submitScore(lbPath, timeState.gameplayClock, rewindUsed, (sendReplay, rowId) -> { - if (sendReplay && !mission.isClaMission) { - Leaderboards.submitReplay(rowId, replayData); - } - }); - } - } - }); } } } diff --git a/src/gui/EnterNameDlg.hx b/src/gui/EnterNameDlg.hx index 39993473..e66d4746 100644 --- a/src/gui/EnterNameDlg.hx +++ b/src/gui/EnterNameDlg.hx @@ -1,8 +1,5 @@ package gui; -import h2d.Tile; -import hxd.BitmapData; -import h2d.filter.DropShadow; import src.Settings; import hxd.res.BitmapFont; import h3d.Vector; @@ -33,75 +30,67 @@ class EnterNameDlg extends GuiControl { var domcasual32b = new BitmapFont(domcasual32fontdata.entry); @:privateAccess domcasual32b.loader = ResourceLoader.loader; var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - var domcasual48 = domcasual32b.toSdfFont(cast 42 * Settings.uiScale, MultiChannel); + + var expo50fontdata = ResourceLoader.getFileEntry("data/font/EXPON.fnt"); + var expo50b = new BitmapFont(expo50fontdata.entry); + @:privateAccess expo50b.loader = ResourceLoader.loader; + var expo50 = expo50b.toSdfFont(cast 35 * Settings.uiScale, MultiChannel); + var expo32 = expo50b.toSdfFont(cast 24 * Settings.uiScale, MultiChannel); function mlFontLoader(text:String) { switch (text) { case "DomCasual32": return domcasual32; - case "DomCasual48": - return domcasual48; case "Arial14": return arial14; + case "Expo50": + return expo50; default: return null; } } - var dlg = new GuiImage(ResourceLoader.getResource("data/ui/endgame/enternamebox.png", ResourceLoader.getImage, this.imageResources).toTile()); + var dlg = new GuiImage(ResourceLoader.getResource("data/ui/common/dialog.png", ResourceLoader.getImage, this.imageResources).toTile()); dlg.horizSizing = Center; dlg.vertSizing = Center; - dlg.position = new Vector(110, 112); - dlg.extent = new Vector(420, 256); + dlg.position = new Vector(112, 111); + dlg.extent = new Vector(416, 257); this.addChild(dlg); var enterNameEdit = new GuiTextInput(domcasual32); enterNameEdit.text.textColor = 0; enterNameEdit.text.selectionColor.setColor(0xFFFFFFFF); enterNameEdit.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(enterNameEdit.text.font.lineHeight)); - enterNameEdit.position = new Vector(28, 130); - enterNameEdit.extent = new Vector(363, 38); + enterNameEdit.position = new Vector(87, 136); + enterNameEdit.extent = new Vector(255, 36); enterNameEdit.text.text = Settings.highscoreName; haxe.Timer.delay(() -> { enterNameEdit.text.focus(); }, 5); - var okbutton = new GuiButton(loadButtonImages("data/ui/endgame/ok")); - okbutton.position = new Vector(151, 184); - okbutton.extent = new Vector(110, 55); + var okbutton = new GuiButton(loadButtonImages("data/ui/common/ok")); + okbutton.position = new Vector(163, 182); + okbutton.extent = new Vector(78, 59); okbutton.accelerator = hxd.Key.ENTER; okbutton.gamepadAccelerator = ["A"]; okbutton.pressedAction = (sender) -> { MarbleGame.canvas.popDialog(this); Settings.highscoreName = enterNameEdit.text.text; - if (StringTools.trim(Settings.highscoreName) == "") - Settings.highscoreName = "Player"; - okFunc(Settings.highscoreName); + okFunc(enterNameEdit.text.text); } dlg.addChild(okbutton); - var wnd = new GuiImage(ResourceLoader.getResource("data/ui/endgame/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - wnd.horizSizing = Width; - wnd.vertSizing = Height; - wnd.position = new Vector(16, 119); - wnd.extent = new Vector(388, 56); + var wnd = new GuiImage(ResourceLoader.getResource("data/ui/common/window.png", ResourceLoader.getImage, this.imageResources).toTile()); + wnd.position = new Vector(58, 124); + wnd.extent = new Vector(295, 55); dlg.addChild(wnd); var enterNameText = new GuiMLText(domcasual32, mlFontLoader); - enterNameText.text.textColor = 0xFFFFFF; - enterNameText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - enterNameText.position = new Vector(37, 23); - enterNameText.extent = new Vector(345, 85); + enterNameText.text.textColor = 0; + enterNameText.position = new Vector(41, 30); + enterNameText.extent = new Vector(345, 14); // enterNameText.justify = Center; - if (place != -1) - enterNameText.text.text = '

Well Done!
You have the${["", " second", " third", " fourth", " fifth"][place]} top time!

'; - else - enterNameText.text.text = '

Enter your desired display name

'; + enterNameText.text.text = '

Congratulations!
You got the${["", " 2nd", " 3rd"][place]} best time!

'; dlg.addChild(enterNameText); dlg.addChild(enterNameEdit); diff --git a/src/gui/ExitGameDlg.hx b/src/gui/ExitGameDlg.hx index 0488bd35..1032f8e5 100644 --- a/src/gui/ExitGameDlg.hx +++ b/src/gui/ExitGameDlg.hx @@ -1,6 +1,5 @@ package gui; -import src.MarbleGame; import hxd.res.BitmapFont; import h3d.Vector; import src.ResourceLoader; @@ -25,57 +24,53 @@ class ExitGameDlg extends GuiControl { var dialogImg = new GuiImage(ResourceLoader.getResource("data/ui/common/dialog.png", ResourceLoader.getImage, this.imageResources).toTile()); dialogImg.horizSizing = Center; dialogImg.vertSizing = Center; - dialogImg.position = new Vector(162, 160); - dialogImg.extent = new Vector(315, 160); + dialogImg.position = new Vector(134, 148); + dialogImg.extent = new Vector(388, 186); - var overlay = new GuiImage(ResourceLoader.getResource("data/ui/common/quitfromthislvl_overlay.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - overlay.horizSizing = Right; - overlay.vertSizing = Bottom; - overlay.position = new Vector(36, 22); - overlay.extent = new Vector(235, 42); + var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual32b = new BitmapFont(domcasual32fontdata.entry); + @:privateAccess domcasual32b.loader = ResourceLoader.loader; + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + + var exitGameText = new GuiText(domcasual32); + exitGameText.text.textColor = 0x000000; + exitGameText.text.text = "Exit from this Level?"; + exitGameText.justify = Center; + exitGameText.position = new Vector(95, 46); + exitGameText.extent = new Vector(198, 23); + exitGameText.horizSizing = Center; + exitGameText.vertSizing = Bottom; var yesButton = new GuiButton(loadButtonImages("data/ui/common/yes")); - yesButton.position = new Vector(19, 103); - yesButton.extent = new Vector(86, 40); - yesButton.vertSizing = Top; + yesButton.position = new Vector(47, 107); + yesButton.extent = new Vector(88, 52); + yesButton.vertSizing = Bottom; yesButton.horizSizing = Right; + yesButton.pressedAction = (e) -> yesFunc(this); yesButton.accelerator = hxd.Key.ENTER; yesButton.gamepadAccelerator = ["A"]; - yesButton.pressedAction = (sender) -> yesFunc(yesButton); var noButton = new GuiButton(loadButtonImages("data/ui/common/no")); - noButton.position = new Vector(105, 102); - noButton.extent = new Vector(86, 40); - noButton.vertSizing = Top; + noButton.position = new Vector(151, 107); + noButton.extent = new Vector(83, 55); + noButton.vertSizing = Bottom; noButton.horizSizing = Right; + noButton.pressedAction = (e) -> noFunc(this); noButton.gamepadAccelerator = ["B"]; - noButton.pressedAction = (sender) -> noFunc(noButton); var restartButton = new GuiButton(loadButtonImages("data/ui/common/restart")); - restartButton.position = new Vector(214, 104); - restartButton.extent = new Vector(86, 40); - restartButton.vertSizing = Top; + restartButton.position = new Vector(249, 107); + restartButton.extent = new Vector(103, 56); + restartButton.vertSizing = Bottom; restartButton.horizSizing = Right; + restartButton.pressedAction = (e) -> restartFunc(this); restartButton.gamepadAccelerator = ["X"]; - restartButton.pressedAction = (sender) -> restartFunc(restartButton); - dialogImg.addChild(overlay); + dialogImg.addChild(exitGameText); dialogImg.addChild(yesButton); dialogImg.addChild(noButton); dialogImg.addChild(restartButton); this.addChild(dialogImg); - - var jukeboxButton = new GuiButton(loadButtonImages("data/ui/jukebox/jb_pausemenu")); - jukeboxButton.vertSizing = Top; - jukeboxButton.horizSizing = Left; - jukeboxButton.position = new Vector(439, 403); - jukeboxButton.extent = new Vector(187, 65); - jukeboxButton.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new JukeboxDlg()); - } - - this.addChild(jukeboxButton); } } diff --git a/src/gui/GuiObjectShow.hx b/src/gui/GuiObjectShow.hx index 95ea1825..a7dcd5ad 100644 --- a/src/gui/GuiObjectShow.hx +++ b/src/gui/GuiObjectShow.hx @@ -48,6 +48,7 @@ class GuiObjectShow extends GuiControl { var props = parent.getProperties(this.sceneBitmap); props.isAbsolute = true; this.sceneBitmap.setPosition(off.x, off.y); + this.sceneBitmap.visible = this.visible; } super.render(scene2d, parent); var renderRect = this.getRenderRectangle(); @@ -62,6 +63,11 @@ class GuiObjectShow extends GuiControl { sceneBitmap.height = renderRect.extent.y; } + public function setVisible(val:Bool) { + this.visible = val; + this.sceneBitmap.visible = val; + } + public override function update(dt:Float, mouseState:MouseState) { super.update(dt, mouseState); timeState.currentAttemptTime += dt; diff --git a/src/gui/HelpCreditsGui.hx b/src/gui/HelpCreditsGui.hx index 309a83a9..7ff107e5 100644 --- a/src/gui/HelpCreditsGui.hx +++ b/src/gui/HelpCreditsGui.hx @@ -1,6 +1,5 @@ package gui; -import h2d.Scene; import h3d.shader.AlphaChannel; import src.DtsObject; import hxd.res.BitmapFont; @@ -12,30 +11,42 @@ import src.Settings; import src.Util; class HelpCreditsGui extends GuiImage { - var manualPageList:GuiTextListCtrl; + var page = 0; + var hcText:GuiMLText; + var hcText2:GuiMLText; + var startPadCtrl:GuiObjectShow; + var endPadCtrl:GuiObjectShow; + var gem1Ctrl:GuiObjectShow; + var gem2Ctrl:GuiObjectShow; + var gem3Ctrl:GuiObjectShow; + var superSpeedCtrl:GuiObjectShow; + var superJumpCtrl:GuiObjectShow; + var shockAbsorberCtrl:GuiObjectShow; + var helicopterCtrl:GuiObjectShow; + var timeTravelCtrl:GuiObjectShow; + var antiGravityCtrl:GuiObjectShow; + var ductFanCtrl:GuiObjectShow; + var tornadoCtrl:GuiObjectShow; + var trapdoorCtrl:GuiObjectShow; + var oilSlickCtrl:GuiObjectShow; + var landMineCtrl:GuiObjectShow; + var bumperCtrl:GuiObjectShow; + var superBounceCtrl:GuiObjectShow; public function new() { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); + var img = ResourceLoader.getImage("data/ui/background.jpg"); super(img.resource.toTile()); - this.position = new Vector(0, 0); + this.position = new Vector(); this.extent = new Vector(640, 480); this.horizSizing = Width; this.vertSizing = Height; - var wnd = new GuiImage(ResourceLoader.getResource("data/ui/manual/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - wnd.position = new Vector(0, 0); - wnd.extent = new Vector(640, 480); - wnd.horizSizing = Center; - wnd.vertSizing = Center; - this.addChild(wnd); + var helpGui = new GuiImage(ResourceLoader.getResource("data/ui/help/help_gui.png", ResourceLoader.getImage, this.imageResources).toTile()); + helpGui.horizSizing = Center; + helpGui.vertSizing = Center; + helpGui.position = new Vector(15, 10); + helpGui.extent = new Vector(609, 460); + this.addChild(helpGui); function loadButtonImages(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -44,97 +55,409 @@ class HelpCreditsGui extends GuiImage { return [normal, hover, pressed]; } - var homeButton = new GuiButton(loadButtonImages("data/ui/manual/home")); - homeButton.position = new Vector(274, 385); - homeButton.extent = new Vector(94, 46); + var nextButton = new GuiButton(loadButtonImages("data/ui/play/next")); + nextButton.position = new Vector(482, 376); + nextButton.extent = new Vector(75, 60); + nextButton.pressedAction = (sender) -> nextPage(); + helpGui.addChild(nextButton); + + var prevButton = new GuiButton(loadButtonImages("data/ui/play/prev")); + prevButton.position = new Vector(58, 383); + prevButton.extent = new Vector(77, 58); + prevButton.pressedAction = (sender) -> previousPage(); + helpGui.addChild(prevButton); + + var homeButton = new GuiButton(loadButtonImages("data/ui/play/back")); + homeButton.position = new Vector(278, 378); + homeButton.extent = new Vector(79, 61); homeButton.accelerator = hxd.Key.ESCAPE; homeButton.gamepadAccelerator = ["B"]; homeButton.pressedAction = (sender) -> { MarbleGame.canvas.setContent(new MainMenuGui()); } - wnd.addChild(homeButton); + helpGui.addChild(homeButton); + + var helpWindow = new GuiImage(ResourceLoader.getResource("data/ui/help/help_window.png", ResourceLoader.getImage, this.imageResources).toTile()); + helpWindow.position = new Vector(30, 31); + helpWindow.extent = new Vector(549, 338); + helpGui.addChild(helpWindow); var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); var arial14b = new BitmapFont(arial14fontdata.entry); @:privateAccess arial14b.loader = ResourceLoader.loader; - var arial14 = arial14b.toSdfFont(cast 11.7 * Settings.uiScale, MultiChannel); + var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - var pagefiles = []; - for (i in 1...23) { - var pg = ResourceLoader.load('ui/manual/pages/${i}.txt').entry; - pagefiles.push(pg); - } - var pagetxt = pagefiles.map(x -> x.getText()); - var pageheadings = pagetxt.map(x -> x.substr(0, x.indexOf("\n"))); + var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual32b = new BitmapFont(domcasual32fontdata.entry); + @:privateAccess domcasual32b.loader = ResourceLoader.loader; + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - var scrollCtrl1 = new GuiControl(); - scrollCtrl1.position = new Vector(29, 24); - scrollCtrl1.extent = new Vector(176, 352); - wnd.addChild(scrollCtrl1); - - manualPageList = new GuiTextListCtrl(arial14, pageheadings); - manualPageList.position = new Vector(0, 0); - manualPageList.extent = new Vector(176, 352); - manualPageList.scrollable = true; - scrollCtrl1.addChild(manualPageList); - - var scrollCtrl2 = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - scrollCtrl2.position = new Vector(219, 28); - scrollCtrl2.extent = new Vector(386, 342); - scrollCtrl2.childrenHandleScroll = true; - wnd.addChild(scrollCtrl2); - - var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); - var arial14b = new BitmapFont(arial14fontdata.entry); - @:privateAccess arial14b.loader = ResourceLoader.loader; - var arial14 = arial14b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); - - 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 18 * Settings.uiScale, MultiChannel); - var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); + var expo50fontdata = ResourceLoader.getFileEntry("data/font/EXPON.fnt"); + var expo50b = new BitmapFont(expo50fontdata.entry); + @:privateAccess expo50b.loader = ResourceLoader.loader; + var expo50 = expo50b.toSdfFont(cast 35 * Settings.uiScale, MultiChannel); + var expo32 = expo50b.toSdfFont(cast 24 * Settings.uiScale, MultiChannel); function mlFontLoader(text:String) { switch (text) { - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - case "Arial16": + case "DomCasual32": + return domcasual32; + case "Arial14": return arial14; + case "Expo32": + return expo32; + case "Expo50": + return expo50; default: return null; } } - var manualContent = new GuiMLText(arial14, mlFontLoader); - manualContent.position = new Vector(0, 20); - manualContent.extent = new Vector(376, 322); - manualContent.text.textColor = 0; - manualContent.scrollable = true; - scrollCtrl2.addChild(manualContent); + hcText = new GuiMLText(domcasual32, mlFontLoader); + hcText.position = new Vector(40, 24); + hcText.extent = new Vector(488, 274); + hcText.text.textColor = 0; + hcText.text.lineSpacing = 5; + helpWindow.addChild(hcText); - manualPageList.onSelectedFunc = (idx) -> { - if (idx != -1) { - var txt = pagetxt[idx]; - var txtlines = txt.split('\n'); - txtlines[0] = '

${txtlines[0]}

'; - var finaltxt = txtlines.join('
') + '
'; - manualContent.text.text = finaltxt; - scrollCtrl2.setScrollMax(manualContent.text.textHeight); - scrollCtrl2.updateScrollVisual(); - } - }; + hcText2 = new GuiMLText(domcasual32, mlFontLoader); + hcText2.position = new Vector(40, 24); + hcText2.extent = new Vector(488, 274); + hcText2.text.textColor = 0; + hcText2.text.lineSpacing = 5; + helpWindow.addChild(hcText2); + + startPadCtrl = buildObjectShow("data/shapes/pads/startarea.dts", new Vector(30, 82), new Vector(79, 66), 8, 0.5); + helpWindow.addChild(startPadCtrl); + + endPadCtrl = buildObjectShow("data/shapes/pads/endarea.dts", new Vector(31, 146), new Vector(79, 66), 8, 0.5); + helpWindow.addChild(endPadCtrl); + + gem1Ctrl = buildObjectShow("data/shapes/items/gem.dts", new Vector(17, 234), new Vector(79, 66), 2.5, 0.4); + helpWindow.addChild(gem1Ctrl); + + gem2Ctrl = buildObjectShow("data/shapes/items/gem.dts", new Vector(43, 215), new Vector(79, 66), 2.5, 0.4, ["base.gem" => "purple.gem"]); + helpWindow.addChild(gem2Ctrl); + + gem3Ctrl = buildObjectShow("data/shapes/items/gem.dts", new Vector(45, 250), new Vector(79, 66), 2.5, 0.4, ["base.gem" => "green.gem"]); + helpWindow.addChild(gem3Ctrl); + + superSpeedCtrl = buildObjectShow("data/shapes/items/superspeed.dts", new Vector(30, 73), new Vector(79, 66), 3.5, 0.35); + helpWindow.addChild(superSpeedCtrl); + + superJumpCtrl = buildObjectShow("data/shapes/items/superjump.dts", new Vector(31, 137), new Vector(79, 66), 3.5, 0.35); + helpWindow.addChild(superJumpCtrl); + + shockAbsorberCtrl = buildObjectShow("data/shapes/items/shockabsorber.dts", new Vector(33, 204), new Vector(72, 61), 3.5, 0.35); + helpWindow.addChild(shockAbsorberCtrl); + + superBounceCtrl = buildObjectShow("data/shapes/items/superbounce.dts", new Vector(35, 260), new Vector(72, 61), 3.5, 0.35); + helpWindow.addChild(superBounceCtrl); + + helicopterCtrl = buildObjectShow("data/shapes/images/helicopter.dts", new Vector(30, 82), new Vector(79, 66), 2, 0.35); + helpWindow.addChild(helicopterCtrl); + + timeTravelCtrl = buildObjectShow("data/shapes/items/timetravel.dts", new Vector(31, 146), new Vector(79, 66), 3.5, 0.35); + helpWindow.addChild(timeTravelCtrl); + + antiGravityCtrl = buildObjectShow("data/shapes/items/antigravity.dts", new Vector(35, 217), new Vector(72, 61), 3.5, 0.35); + helpWindow.addChild(antiGravityCtrl); + + ductFanCtrl = buildObjectShow("data/shapes/hazards/ductfan.dts", new Vector(30, 82), new Vector(79, 66), 4, 0.5); + helpWindow.addChild(ductFanCtrl); + + tornadoCtrl = buildObjectShow("data/shapes/hazards/tornado.dts", new Vector(26, 155), new Vector(91, 66), 18, 0.35); + for (mat in tornadoCtrl.sceneObject.materials) { + mat.blendMode = None; + } + helpWindow.addChild(tornadoCtrl); + + trapdoorCtrl = buildObjectShow("data/shapes/hazards/trapdoor.dts", new Vector(35, 217), new Vector(77, 76), 8, 0.35); + helpWindow.addChild(trapdoorCtrl); + + oilSlickCtrl = buildObjectShow("data/shapes/hazards/oilslick.dts", new Vector(35, 217), new Vector(77, 76), 8, 0.35); + helpWindow.addChild(oilSlickCtrl); + + landMineCtrl = buildObjectShow("data/shapes/hazards/landmine.dts", new Vector(26, 155), new Vector(91, 66), 1.5, 0.35); + helpWindow.addChild(landMineCtrl); + + bumperCtrl = buildObjectShow("data/shapes/bumpers/pball_round.dts", new Vector(30, 82), new Vector(79, 66), 1.8, 0.5); + helpWindow.addChild(bumperCtrl); + + redrawPage(); } - public override function render(scene2d:Scene, ?parent:h2d.Flow) { - super.render(scene2d, parent); + function redrawPage() { + page = cast Util.adjustedMod(page, 12); - manualPageList.onSelectedFunc(0); + if (page == 0) { + hcText2.text.text = ""; + hcText.text.text = '

Overview


' + + + "Roll your marble through a rich cartoon landscape of moving platforms and dangerous hazards. Along the way find power ups to increase your speed, jumping ability or flight power, and use them to collect the hidden gems and race to the finish for the fastest time."; + } + if (page == 1) { + hcText2.text.text = ""; + hcText.text.text = '

Basic Controls


' + + + formatText("The marble can be moved forward, back, left and right by pressing , , and , respectively. Pressing causes the marble to jump, and pressing uses whatever powerup you currently have available. All movement is relative to the view direction."); + } + if (page == 2) { + startPadCtrl.setVisible(false); + endPadCtrl.setVisible(false); + gem1Ctrl.setVisible(false); + gem2Ctrl.setVisible(false); + gem3Ctrl.setVisible(false); + hcText2.text.text = ""; + hcText.text.text = '

Camera Controls


' + + + formatText("The camera direction can be changed by moving the mouse or by pressing , , or . In order to look up and down freely with the mouse, hold down . You can turn free look on always from the Mouse pane of the Control Options screen."); + startPadCtrl.render(MarbleGame.canvas.scene2d); + endPadCtrl.render(MarbleGame.canvas.scene2d); + gem1Ctrl.render(MarbleGame.canvas.scene2d); + gem2Ctrl.render(MarbleGame.canvas.scene2d); + gem3Ctrl.render(MarbleGame.canvas.scene2d); + } + if (page == 3) { + startPadCtrl.setVisible(true); + endPadCtrl.setVisible(true); + gem1Ctrl.setVisible(true); + gem2Ctrl.setVisible(true); + gem3Ctrl.setVisible(true); + superJumpCtrl.setVisible(false); + superSpeedCtrl.setVisible(false); + shockAbsorberCtrl.setVisible(false); + superBounceCtrl.setVisible(false); + hcText.text.text = '

Goals


'; + hcText2.position = new Vector(110, 41); + hcText2.extent = new Vector(418, 274); + hcText2.text.text = "

Start Pad - this is where you start the level.

End Pad - roll your marble here to end the level.

Gems - if a level has gems, you must pick them all up before you can exit."; + startPadCtrl.render(MarbleGame.canvas.scene2d); + endPadCtrl.render(MarbleGame.canvas.scene2d); + gem1Ctrl.render(MarbleGame.canvas.scene2d); + gem2Ctrl.render(MarbleGame.canvas.scene2d); + gem3Ctrl.render(MarbleGame.canvas.scene2d); + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + superJumpCtrl.render(MarbleGame.canvas.scene2d); + superSpeedCtrl.render(MarbleGame.canvas.scene2d); + shockAbsorberCtrl.render(MarbleGame.canvas.scene2d); + superBounceCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 4) { + startPadCtrl.setVisible(false); + endPadCtrl.setVisible(false); + gem1Ctrl.setVisible(false); + gem2Ctrl.setVisible(false); + gem3Ctrl.setVisible(false); + superJumpCtrl.setVisible(true); + superSpeedCtrl.setVisible(true); + shockAbsorberCtrl.setVisible(true); + superBounceCtrl.setVisible(true); + helicopterCtrl.setVisible(false); + timeTravelCtrl.setVisible(false); + antiGravityCtrl.setVisible(false); + hcText.text.text = '

Bonus Items (1/2)


'; + hcText2.position = new Vector(110, 30); + hcText2.extent = new Vector(418, 274); + hcText2.text.text = "

Super Speed PowerUp - gives you a burst of speed.

Super Jump PowerUp - gives you a big jump up.

Shock Absorber PowerUp - absorbs bounce impacts.

Super Bounce PowerUp - makes you bounce higher."; + startPadCtrl.render(MarbleGame.canvas.scene2d); + endPadCtrl.render(MarbleGame.canvas.scene2d); + gem1Ctrl.render(MarbleGame.canvas.scene2d); + gem2Ctrl.render(MarbleGame.canvas.scene2d); + gem3Ctrl.render(MarbleGame.canvas.scene2d); + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + superJumpCtrl.render(MarbleGame.canvas.scene2d); + superSpeedCtrl.render(MarbleGame.canvas.scene2d); + shockAbsorberCtrl.render(MarbleGame.canvas.scene2d); + superBounceCtrl.render(MarbleGame.canvas.scene2d); + helicopterCtrl.render(MarbleGame.canvas.scene2d); + timeTravelCtrl.render(MarbleGame.canvas.scene2d); + antiGravityCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 5) { + superJumpCtrl.setVisible(false); + superSpeedCtrl.setVisible(false); + shockAbsorberCtrl.setVisible(false); + superBounceCtrl.setVisible(false); + helicopterCtrl.setVisible(true); + timeTravelCtrl.setVisible(true); + antiGravityCtrl.setVisible(true); + ductFanCtrl.setVisible(false); + tornadoCtrl.setVisible(false); + trapdoorCtrl.setVisible(false); + hcText.text.text = '

Bonus Items (2/2)


'; + hcText2.position = new Vector(110, 35); + hcText2.extent = new Vector(418, 274); + hcText2.text.text = "

Gyrocopter PowerUp - slows your fall in the air.

Time Travel - takes some time off the clock.

Gravity Modifier - Changes the direction of \"down\" - the new down is in the direction of the arrow."; + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + superJumpCtrl.render(MarbleGame.canvas.scene2d); + superSpeedCtrl.render(MarbleGame.canvas.scene2d); + shockAbsorberCtrl.render(MarbleGame.canvas.scene2d); + superBounceCtrl.render(MarbleGame.canvas.scene2d); + helicopterCtrl.render(MarbleGame.canvas.scene2d); + timeTravelCtrl.render(MarbleGame.canvas.scene2d); + antiGravityCtrl.render(MarbleGame.canvas.scene2d); + ductFanCtrl.render(MarbleGame.canvas.scene2d); + tornadoCtrl.render(MarbleGame.canvas.scene2d); + trapdoorCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 6) { + helicopterCtrl.setVisible(false); + timeTravelCtrl.setVisible(false); + antiGravityCtrl.setVisible(false); + ductFanCtrl.setVisible(true); + tornadoCtrl.setVisible(true); + trapdoorCtrl.setVisible(true); + bumperCtrl.setVisible(false); + landMineCtrl.setVisible(false); + oilSlickCtrl.setVisible(false); + hcText.text.text = '

Hazards (1/2)


'; + hcText2.position = new Vector(110, 38); + hcText2.extent = new Vector(418, 274); + hcText2.text.text = "

Duct Fan - be careful this doesn't blow you away!

Tornado - it'll pull you in and spit you out.

Trap Door - keep moving when you're rolling over one of these."; + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + helicopterCtrl.render(MarbleGame.canvas.scene2d); + timeTravelCtrl.render(MarbleGame.canvas.scene2d); + antiGravityCtrl.render(MarbleGame.canvas.scene2d); + ductFanCtrl.render(MarbleGame.canvas.scene2d); + tornadoCtrl.render(MarbleGame.canvas.scene2d); + trapdoorCtrl.render(MarbleGame.canvas.scene2d); + bumperCtrl.render(MarbleGame.canvas.scene2d); + landMineCtrl.render(MarbleGame.canvas.scene2d); + oilSlickCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 7) { + ductFanCtrl.setVisible(false); + tornadoCtrl.setVisible(false); + trapdoorCtrl.setVisible(false); + bumperCtrl.setVisible(true); + landMineCtrl.setVisible(true); + oilSlickCtrl.setVisible(true); + hcText.text.text = '

Hazards (2/2)


'; + hcText2.position = new Vector(110, 30); + hcText2.extent = new Vector(418, 274); + hcText2.text.text = "

Bumper - this'll bounce you if you touch it.

Land Mine - Warning! Explodes on contact!

Oil Slick - you won't have much traction on these surfaces"; + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + ductFanCtrl.render(MarbleGame.canvas.scene2d); + tornadoCtrl.render(MarbleGame.canvas.scene2d); + trapdoorCtrl.render(MarbleGame.canvas.scene2d); + bumperCtrl.render(MarbleGame.canvas.scene2d); + landMineCtrl.render(MarbleGame.canvas.scene2d); + oilSlickCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 8) { + bumperCtrl.setVisible(false); + landMineCtrl.setVisible(false); + oilSlickCtrl.setVisible(false); + hcText2.text.text = ""; + hcText.text.text = '

About GarageGames


' + + + "GarageGames is a unique Internet publishing label for independent games and gamemakers. Our mission is to provide the independent developer with tools, knowledge, co-conspirators - whatever is needed to unleash the creative spirit and get great innovative independent games to market."; + bumperCtrl.render(MarbleGame.canvas.scene2d); + landMineCtrl.render(MarbleGame.canvas.scene2d); + oilSlickCtrl.render(MarbleGame.canvas.scene2d); + } + if (page == 9) { + hcText2.text.text = ""; + hcText.text.text = '

About the Torque


' + + + "The Torque Game Engine (TGE) is a full featured AAA title engine with the latest in scripting, geometry, particle effects, animation and texturing, as well as award winning multi-player networking code. For $100 per programmer, you get the source to the engine!"; + } + if (page == 10) { + hcText.text.text = '

The Marble Blast Team


' + + "ÂAlex Swanson
ÂJeff Tunnell
ÂLiam Ryan
ÂRick Overman
ÂTimothy Clarke
ÂPat Wilson"; + hcText2.position = new Vector(343, 24); + hcText2.extent = new Vector(155, 274); + hcText2.text.text = '


' + + "Mark Frohnmayer
Brian Hahn
Tim Gift
Kevin Ryan
Jay Moore
John Quigley"; + hcText2.render(MarbleGame.canvas.scene2d, @:privateAccess hcText2.parent._flow); + } + if (page == 11) { + hcText2.text.text = ""; + hcText.text.text = '

Special Thanks


' + + "We'd like to thank Nullsoft, for the SuperPiMP Install System, " + + "and Markus F.X.J. Oberhumer, Laszlo Molnar and the rest of the UPX team for the UPX executable packer." + + " Thanks also to Kurtis Seebaldt for his work on integrating Ogg/Vorbis streaming into the Torque engine, and to the Ogg/Vorbis team."; + } + } + + function nextPage() { + page++; + redrawPage(); + } + + function previousPage() { + page--; + redrawPage(); + } + + function formatText(text:String) { + var start = 0; + var pos = text.indexOf("", start + 5); + if (end == -1) + break; + var pre = text.substr(0, pos); + var post = text.substr(end + 1); + var func = text.substr(pos + 6, end - (pos + 6)); + var funcdata = func.split(' ').map(x -> x.toLowerCase()); + var val = ""; + if (funcdata[0] == "bind") { + if (funcdata[1] == "moveforward") + val = Util.getKeyForButton(Settings.controlsSettings.forward); + if (funcdata[1] == "movebackward") + val = Util.getKeyForButton(Settings.controlsSettings.backward); + if (funcdata[1] == "moveleft") + val = Util.getKeyForButton(Settings.controlsSettings.left); + if (funcdata[1] == "moveright") + val = Util.getKeyForButton(Settings.controlsSettings.right); + if (funcdata[1] == "panup") + val = Util.getKeyForButton(Settings.controlsSettings.camForward); + if (funcdata[1] == "pandown") + val = Util.getKeyForButton(Settings.controlsSettings.camBackward); + if (funcdata[1] == "turnleft") + val = Util.getKeyForButton(Settings.controlsSettings.camLeft); + if (funcdata[1] == "turnright") + val = Util.getKeyForButton(Settings.controlsSettings.camRight); + if (funcdata[1] == "jump") + val = Util.getKeyForButton(Settings.controlsSettings.jump); + if (funcdata[1] == "mousefire") + val = Util.getKeyForButton(Settings.controlsSettings.powerup); + if (funcdata[1] == "freelook") + val = Util.getKeyForButton(Settings.controlsSettings.freelook); + } + start = val.length + pos; + text = pre + val + post; + pos = text.indexOf(" = null) { + var oShow = new GuiObjectShow(); + var dtsObj = new DtsObject(); + dtsObj.dtsPath = dtsPath; + dtsObj.ambientRotate = true; + dtsObj.ambientSpinFactor /= -2; + dtsObj.showSequences = false; + dtsObj.useInstancing = false; + if (matnameOverride != null) { + for (key => value in matnameOverride) { + dtsObj.matNameOverride.set(key, value); + } + } + dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway + for (mat in dtsObj.materials) { + mat.mainPass.enableLights = false; + if (mat.blendMode != Alpha && mat.blendMode != Add) + mat.mainPass.addShader(new AlphaChannel()); + } + oShow.sceneObject = dtsObj; + oShow.position = position; + oShow.extent = extent; + oShow.renderDistance = dist; + oShow.renderPitch = pitch; + return oShow; } } diff --git a/src/gui/JoinServerGui.hx b/src/gui/JoinServerGui.hx deleted file mode 100644 index 2da1deae..00000000 --- a/src/gui/JoinServerGui.hx +++ /dev/null @@ -1,349 +0,0 @@ -package gui; - -import net.MasterServerClient; -import net.MasterServerClient.RemoteServerInfo; -import net.Net; -import h2d.filter.DropShadow; -import hxd.res.BitmapFont; -import src.MarbleGame; -import src.ResourceLoader; -import h3d.Vector; -import src.Util; -import src.Settings; - -class JoinServerGui extends GuiImage { - public function new() { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); - super(img.resource.toTile()); - - 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 18 * Settings.uiScale, MultiChannel); - var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); - - function mlFontLoader(text:String) { - switch (text) { - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - default: - return null; - } - } - - this.horizSizing = Width; - this.vertSizing = Height; - this.position = new Vector(); - this.extent = new Vector(640, 480); - - var passwordPopup = new GuiControl(); - passwordPopup.position = new Vector(0, 0); - passwordPopup.extent = new Vector(640, 480); - passwordPopup.horizSizing = Width; - passwordPopup.vertSizing = Height; - - var passwordWindow = new GuiImage(ResourceLoader.getResource("data/ui/mp/join/window2.png", ResourceLoader.getImage, this.imageResources).toTile()); - passwordWindow.horizSizing = Center; - passwordWindow.vertSizing = Center; - passwordWindow.position = new Vector(144, 199); - passwordWindow.extent = new Vector(508, 202); - passwordPopup.addChild(passwordWindow); - - var passwordTitle = new GuiText(markerFelt32); - passwordTitle.position = new Vector(22, 28); - passwordTitle.extent = new Vector(463, 14); - passwordTitle.text.textColor = 0xFFFFFF; - passwordTitle.horizSizing = Center; - passwordTitle.justify = Center; - passwordTitle.text.text = "Password Required"; - passwordTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - passwordWindow.addChild(passwordTitle); - - var passwordBar = new GuiImage(ResourceLoader.getResource("data/ui/mp/join/textbar.png", ResourceLoader.getImage, this.imageResources).toTile()); - passwordBar.position = new Vector(22, 73); - passwordBar.extent = new Vector(463, 47); - passwordWindow.addChild(passwordBar); - - var passwordInput = new GuiTextInput(markerFelt24); - passwordInput.position = new Vector(30, 79); - passwordInput.extent = new Vector(447, 38); - passwordInput.horizSizing = Center; - passwordInput.text.textColor = 0; - passwordWindow.addChild(passwordInput); - - var passwordCancel = new GuiButton(loadButtonImages("data/ui/mp/join/cancel")); - passwordCancel.position = new Vector(29, 126); - passwordCancel.extent = new Vector(94, 45); - passwordCancel.pressedAction = (e) -> { - passwordInput.text.text = ""; - MarbleGame.canvas.popDialog(passwordPopup, false); - } - passwordWindow.addChild(passwordCancel); - - var passwordJoin = new GuiButton(loadButtonImages("data/ui/mp/join/join")); - passwordJoin.position = new Vector(385, 126); - passwordJoin.extent = new Vector(94, 45); - passwordWindow.addChild(passwordJoin); - - var window = new GuiImage(ResourceLoader.getResource("data/ui/mp/join/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - window.horizSizing = Center; - window.vertSizing = Center; - window.position = new Vector(-60, 5); - window.extent = new Vector(759, 469); - - var serverInfoContainer = new GuiControl(); - serverInfoContainer.position = new Vector(520, 58); - serverInfoContainer.extent = new Vector(210, 166); - window.addChild(serverInfoContainer); - - var serverInfo = new GuiMLText(markerFelt24, mlFontLoader); - serverInfo.position = new Vector(0, 0); - serverInfo.extent = new Vector(210, 166); - serverInfo.text.text = '

Select a Server

'; - serverInfo.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - serverInfo.text.textColor = 0xFFFFFF; - serverInfoContainer.addChild(serverInfo); - - var serverListContainer = new GuiControl(); - serverListContainer.position = new Vector(30, 80); - serverListContainer.extent = new Vector(475, 290); - window.addChild(serverListContainer); - - function imgLoader(path:String) { - var t = switch (path) { - case "ready": - ResourceLoader.getResource("data/ui/mp/play/Ready.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "notready": - ResourceLoader.getResource("data/ui/mp/play/NotReady.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "pc": - ResourceLoader.getResource("data/ui/mp/play/platform_desktop_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "mac": - ResourceLoader.getResource("data/ui/mp/play/platform_mac_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "web": - ResourceLoader.getResource("data/ui/mp/play/platform_web_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "android": - ResourceLoader.getResource("data/ui/mp/play/platform_android_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "unknown": - ResourceLoader.getResource("data/ui/mp/play/platform_unknown_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case _: - return null; - }; - if (t != null) - t.scaleToSize(t.width * (Settings.uiScale), t.height * (Settings.uiScale)); - return t; - } - - var ourServerList:Array = []; - - var curSelection = -1; - var serverList = new GuiMLTextListCtrl(markerFelt18, [], imgLoader); - serverList.position = new Vector(0, 0); - serverList.extent = new Vector(475, 63); - serverList.scrollable = true; - serverList.textYOffset = -6; - serverList.onSelectedFunc = (sel) -> { - curSelection = sel; - - if (curSelection == -1) { - serverInfo.text.text = '

Select a Server

or Host your own

'; - } else { - var server = ourServerList[curSelection]; - serverInfo.text.text = '

${StringTools.htmlEscape(server.name)}

Hosted by ${StringTools.htmlEscape(server.host)}

${StringTools.htmlEscape(server.description)}

'; - } - } - serverListContainer.addChild(serverList); - - var serverDisplays = []; - - var platformToString = ["unknown", "pc", "mac", "web", "android"]; - - function updateServerListDisplay() { - serverDisplays = ourServerList.map(x -> - '${StringTools.htmlEscape(x.name)} ${x.players}/${x.maxPlayers}'); - serverList.setTexts(serverDisplays); - } - - MasterServerClient.connectToMasterServer(() -> { - MasterServerClient.instance.getServerList((servers) -> { - ourServerList = servers; - updateServerListDisplay(); - }); - }); - - 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.serverSettings.name, Settings.serverSettings.description, Settings.serverSettings.maxPlayers, - Settings.serverSettings.password, () -> { - MarbleGame.canvas.setContent(new MPPlayMissionGui(true)); - }); - } - window.addChild(hostBtn); - - var joinFunc = (password:String) -> { - if (curSelection != -1) { - var selectedServerVersion = ourServerList[curSelection].version; - if (selectedServerVersion != MarbleGame.currentVersion) { - var pup = new MessageBoxOkDlg("You are using a different version of the game than the server. Please update your game."); - MarbleGame.canvas.pushDialog(pup); - return; - } - - MarbleGame.canvas.setContent(new MPMessageGui("Please Wait", "Connecting")); - var failed = true; - haxe.Timer.delay(() -> { - if (MarbleGame.canvas.content is MPMessageGui) { - var loadGui:MPMessageGui = cast MarbleGame.canvas.content; - if (loadGui != null) { - loadGui.setTexts("Error", "Failed to connect to server"); - } - } - }, 15000); - Net.joinServer(ourServerList[curSelection].id, password, () -> { - failed = false; - Net.remoteServerInfo = ourServerList[curSelection]; - }); - } - } - - var joinBtn = new GuiButton(loadButtonImages("data/ui/mp/join/join")); - joinBtn.position = new Vector(628, 379); - joinBtn.extent = new Vector(93, 45); - joinBtn.pressedAction = (e) -> { - if (curSelection != -1) { - if (ourServerList[curSelection].passworded) { - MarbleGame.canvas.pushDialog(passwordPopup); - } else { - joinFunc(""); - } - } - } - window.addChild(joinBtn); - - var usernameBtn = new GuiButton(loadButtonImages("data/ui/mp/join/username")); - usernameBtn.position = new Vector(216, 379); - usernameBtn.extent = new Vector(125, 45); - usernameBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new EnterNameDlg(-1, (n) -> {})); - } - window.addChild(usernameBtn); - - passwordJoin.pressedAction = (e) -> { - joinFunc(passwordInput.text.text); - } - - var refreshing = false; - var refreshBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/join/refresh/refresh-1")); - refreshBtn.position = new Vector(126, 379); - refreshBtn.extent = new Vector(45, 45); - refreshBtn.pressedAction = (e) -> { - if (refreshing) - return; - refreshBtn.disabled = true; - refreshing = true; - MasterServerClient.connectToMasterServer(() -> { - MasterServerClient.instance.getServerList((servers) -> { - ourServerList = servers; - updateServerListDisplay(); - refreshing = false; - refreshBtn.disabled = false; - }); - }, () -> { - refreshing = false; - refreshBtn.disabled = false; - }); - } - window.addChild(refreshBtn); - - var serverSettingsBtn = new GuiButton(loadButtonImages("data/ui/mp/play/settings")); - serverSettingsBtn.position = new Vector(171, 379); - serverSettingsBtn.extent = new Vector(45, 45); - serverSettingsBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPServerDlg()); - } - window.addChild(serverSettingsBtn); - - var exitBtn = new GuiButton(loadButtonImages("data/ui/mp/join/leave")); - exitBtn.position = new Vector(32, 379); - exitBtn.extent = new Vector(93, 45); - exitBtn.pressedAction = (e) -> { - MarbleGame.canvas.setContent(new MainMenuGui()); - } - window.addChild(exitBtn); - - var titleText = new GuiText(markerFelt32); - titleText.position = new Vector(30, 20); - titleText.extent = new Vector(647, 30); - titleText.justify = Center; - titleText.text.text = "Join Server"; - titleText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - titleText.text.textColor = 0xFFFFFF; - window.addChild(titleText); - - var listTitle = new GuiText(markerFelt24); - listTitle.position = new Vector(30, 48); - listTitle.extent = new Vector(480, 22); - listTitle.text.textColor = 0xDDDDEE; - listTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - listTitle.text.text = " Server Name Players"; - window.addChild(listTitle); - - this.addChild(window); - - if (StringTools.trim(Settings.highscoreName).length == 0 - || Settings.highscoreName == "" - || Settings.highscoreName == "Player" - || Settings.highscoreName == null) { - haxe.Timer.delay(() -> MarbleGame.canvas.pushDialog(new EnterNameDlg(-1, (n) -> {})), 50); // Pls enter name - } - } -} diff --git a/src/gui/LoadingGui.hx b/src/gui/LoadingGui.hx index caf51518..c58df043 100644 --- a/src/gui/LoadingGui.hx +++ b/src/gui/LoadingGui.hx @@ -5,23 +5,12 @@ import h3d.Vector; import src.ResourceLoader; import src.MarbleGame; import src.Settings; -import src.Util; class LoadingGui extends GuiImage { public var setProgress:Float->Void; - public function new(missionName:String, game:String, isMultiplayer:Bool = false) { - function chooseBg() { - if (game == "gold") - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (game == "platinum") - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - if (game == "ultra") - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - } - - var img = chooseBg(); + public function new(missionName:String) { + var img = ResourceLoader.getImage("data/ui/background.jpg"); super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; @@ -47,16 +36,16 @@ class LoadingGui extends GuiImage { var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); var mapName = new GuiText(domcasual32); - mapName.position = new Vector(6, 33); - mapName.extent = new Vector(456, 14); + mapName.position = new Vector(134, 78); + mapName.extent = new Vector(323, 32); mapName.text.text = missionName; mapName.text.textColor = 0; mapName.justify = Center; var progress = new GuiProgress(); - progress.vertSizing = Top; - progress.position = new Vector(194, 145); - progress.extent = new Vector(225, 56); + progress.vertSizing = Bottom; + progress.position = new Vector(153, 133); + progress.extent = new Vector(269, 78); progress.progress = 0.5; setProgress = (progressPz) -> { @@ -64,20 +53,19 @@ class LoadingGui extends GuiImage { } var cancelButton = new GuiButton(loadButtonImages("data/ui/loading/cancel")); - cancelButton.position = new Vector(333, 243); - cancelButton.extent = new Vector(112, 59); + cancelButton.position = new Vector(320, 233); + cancelButton.extent = new Vector(88, 50); cancelButton.pressedAction = (sender) -> { MarbleGame.instance.quitMission(); } var overlay = new GuiImage(ResourceLoader.getResource("data/ui/loading/overlay.png", ResourceLoader.getImage, this.imageResources).toTile()); - overlay.position = new Vector(188, 139); - overlay.extent = new Vector(242, 75); + overlay.position = new Vector(151, 131); + overlay.extent = new Vector(278, 86); loadingGui.addChild(mapName); loadingGui.addChild(progress); - if (!isMultiplayer) - loadingGui.addChild(cancelButton); + loadingGui.addChild(cancelButton); loadingGui.addChild(overlay); this.addChild(loadingGui); diff --git a/src/gui/MPEndGameGui.hx b/src/gui/MPEndGameGui.hx deleted file mode 100644 index 5535e23d..00000000 --- a/src/gui/MPEndGameGui.hx +++ /dev/null @@ -1,313 +0,0 @@ -package gui; - -import net.NetCommands; -import net.Net; -import h3d.shader.AlphaChannel; -import hxd.res.BitmapFont; -import src.MarbleGame; -import src.ResourceLoader; -import h3d.Vector; -import src.Settings; -import src.DtsObject; - -class MPEndGameGui extends GuiImage { - public function new() { - var img = ResourceLoader.getImage('data/ui/exit/black.png'); - super(img.resource.toTile()); - this.horizSizing = Width; - this.vertSizing = Height; - this.position = new Vector(0, 0); - this.extent = new Vector(640, 480); - - var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual24b = new BitmapFont(domcasual24fontdata.entry); - @:privateAccess domcasual24b.loader = ResourceLoader.loader; - var domcasual24 = domcasual24b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); - - var domcasual36 = domcasual24b.toSdfFont(cast 32 * Settings.uiScale, MultiChannel); - - var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); - var arial14b = new BitmapFont(arial14fontdata.entry); - @:privateAccess arial14b.loader = ResourceLoader.loader; - var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - var arialb14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); - var arialb14b = new BitmapFont(arialb14fontdata.entry); - @:privateAccess arialb14b.loader = ResourceLoader.loader; - var arialBold14 = arialb14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - 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 expo50fontdata = ResourceLoader.getFileEntry("data/font/EXPON.fnt"); - var expo50b = new BitmapFont(expo50fontdata.entry); - @:privateAccess expo50b.loader = ResourceLoader.loader; - var expo50 = expo50b.toSdfFont(cast 35 * Settings.uiScale, MultiChannel); - - function mlFontLoader(text:String) { - switch (text) { - case "DomCasual24": - return domcasual24; - case "Arial14": - return arial14; - case "ArialBold14": - return arialBold14; - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - case "MarkerFelt20": - return markerFelt20; - case "MarkerFelt26": - return markerFelt26; - default: - return null; - } - } - - 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 sidebar = new GuiImage(ResourceLoader.getResource("data/ui/mp/end/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - sidebar.position = new Vector(587, 141); - sidebar.extent = new Vector(53, 198); - sidebar.horizSizing = Left; - sidebar.vertSizing = Center; - this.addChild(sidebar); - - var lobbyBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/end/lobby")); - lobbyBtn.position = new Vector(5, 53); - lobbyBtn.extent = new Vector(49, 49); - lobbyBtn.vertSizing = Top; - lobbyBtn.pressedAction = (e) -> { - MarbleGame.instance.quitMission(); - } - if (Net.isClient) { - lobbyBtn.disabled = true; - } - sidebar.addChild(lobbyBtn); - - var restartBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/end/restart")); - restartBtn.position = new Vector(5, 7); - restartBtn.extent = new Vector(49, 49); - restartBtn.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(this); - MarbleGame.instance.paused = false; - NetCommands.completeRestartGame(); - } - if (Net.isClient) { - restartBtn.disabled = true; - } - sidebar.addChild(restartBtn); - - var exitBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/end/exit")); - exitBtn.position = new Vector(5, 99); - exitBtn.extent = new Vector(49, 49); - exitBtn.vertSizing = Top; - exitBtn.horizSizing = Left; - exitBtn.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(this); - MarbleGame.instance.paused = false; - MarbleGame.instance.quitMission(); - Net.disconnect(); - MarbleGame.canvas.setContent(new JoinServerGui()); - } - sidebar.addChild(exitBtn); - - var middleCtrl = new GuiControl(); - middleCtrl.horizSizing = Center; - middleCtrl.vertSizing = Height; - middleCtrl.position = new Vector(-80, 0); - 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 ${hasPlatinum ? " " : ""} Marble'; - middleCtrl.addChild(headerML); - - var ourRank = scores.indexOf(scores.filter(x -> x.us == true)[0]) + 1; - var rankSuffix = ourRank == 1 ? "st" : (ourRank == 2 ? "nd" : (ourRank == 3 ? "rd" : "th")); - - var col0 = 0xCFB52B; - var col1 = 0xCDCDCD; - var col2 = 0xD19275; - var col3 = 0xFFEE99; - - var rankColor = ourRank == 1 ? col0 : (ourRank == 2 ? col1 : (ourRank == 3 ? col2 : col3)); - - var titleML = new GuiText(expo50); - titleML.position = new Vector(25, 6); - titleML.extent = new Vector(750, 14); - titleML.justify = Center; - titleML.horizSizing = Width; - titleML.text.textColor = rankColor; - titleML.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - titleML.text.text = 'You have won ' + ourRank + rankSuffix + ' place!'; - middleCtrl.addChild(titleML); - - var redGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(365, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "red.gem"]); - middleCtrl.addChild(redGem); - var yellowGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(417, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "yellow.gem"]); - 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; - playerContainer.vertSizing = Height; - playerContainer.position = new Vector(25, 125); - playerContainer.extent = new Vector(750, 275); - middleCtrl.addChild(playerContainer); - - var idx = 0; - - 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); - - var playerNameT = new GuiText(domcasual36); - playerNameT.text.textColor = 0xFFFFFF; - playerNameT.text.text = '${rank}. ${playerName}'; - playerNameT.position = new Vector(0, 3); - playerNameT.extent = new Vector(300, 14); - container.addChild(playerNameT); - - var playerScore = new GuiText(domcasual36); - playerScore.text.textColor = 0xFFFFFF; - playerScore.text.text = '${score}'; - playerScore.position = new Vector(287, 3); - playerScore.extent = new Vector(310, 14); - container.addChild(playerScore); - - var playerR = new GuiText(domcasual36); - playerR.text.textColor = 0xFF0000; - playerR.text.text = '${r}'; - playerR.justify = Center; - playerR.position = new Vector(348, 3); - playerR.extent = new Vector(52, 14); - container.addChild(playerR); - - var playerY = new GuiText(domcasual36); - playerY.text.textColor = 0xFFFF00; - playerY.text.text = '${y}'; - playerY.justify = Center; - playerY.position = new Vector(400, 3); - playerY.extent = new Vector(52, 14); - container.addChild(playerY); - - var playerB = new GuiText(domcasual36); - 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); - - 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); - - playerContainer.addChild(container); - - idx += 1; - } - - var r = 1; - for (player in scores) { - var cat = Settings.optionsSettings.marbleCategoryIndex; - var marb = Settings.optionsSettings.marbleIndex; - if (!player.us) { - var c = Net.clientIdMap[player.id]; - cat = c.marbleCatId; - marb = c.marbleId; - } - - addPlayer(r, player.name, player.score, player.r, player.y, player.b, player.p, cat, marb); - r += 1; - } - } - - function buildObjectShow(dtsPath:String, position:Vector, extent:Vector, dist:Float = 5, pitch:Float = 0, matnameOverride:Map = null) { - var oShow = new GuiObjectShow(); - var dtsObj = new DtsObject(); - dtsObj.dtsPath = dtsPath; - dtsObj.ambientRotate = true; - dtsObj.ambientSpinFactor /= -2; - dtsObj.showSequences = false; - dtsObj.useInstancing = false; - if (matnameOverride != null) { - for (key => value in matnameOverride) { - dtsObj.matNameOverride.set(key, value); - } - } - dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway - for (mat in dtsObj.materials) { - mat.mainPass.enableLights = false; - mat.mainPass.culling = None; - if (mat.blendMode != Alpha && mat.blendMode != Add) - mat.mainPass.addShader(new AlphaChannel()); - } - oShow.sceneObject = dtsObj; - oShow.position = position; - oShow.extent = extent; - oShow.renderDistance = dist; - oShow.renderPitch = pitch; - return oShow; - } -} diff --git a/src/gui/MPExitGameDlg.hx b/src/gui/MPExitGameDlg.hx deleted file mode 100644 index 8cabbee2..00000000 --- a/src/gui/MPExitGameDlg.hx +++ /dev/null @@ -1,173 +0,0 @@ -package gui; - -import net.NetCommands; -import h2d.filter.DropShadow; -import net.Net; -import src.MarbleGame; -import hxd.res.BitmapFont; -import h3d.Vector; -import src.ResourceLoader; -import src.Settings; -import hxd.Key; - -class MPExitGameDlg extends GuiControl { - public function new(resumeFunc:() -> Void, exitFunc:() -> Void) { - 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 dialogImg = new GuiImage(ResourceLoader.getResource("data/ui/mp/team/teamjoin.png", ResourceLoader.getImage, this.imageResources).toTile()); - dialogImg.horizSizing = Center; - dialogImg.vertSizing = Center; - dialogImg.position = new Vector(146, 115); - dialogImg.extent = new Vector(347, 250); - this.addChild(dialogImg); - - 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; - partialRestart.pressedAction = (e) -> { - MarbleGame.instance.paused = false; - NetCommands.partialRestartGame(); - MarbleGame.canvas.popDialog(this); - } - dialogImg.addChild(partialRestart); - if (!Net.isHost) { - partialRestart.disabled = true; - } - - var disconnectBtn = new GuiButton(Net.isHost ? loadButtonImages("data/ui/mp/exit/levelselect") : loadButtonImages("data/ui/mp/exit/disconnect")); - disconnectBtn.position = new Vector(22, 132); - disconnectBtn.extent = new Vector(114, 45); - disconnectBtn.vertSizing = Top; - disconnectBtn.pressedAction = (e) -> exitFunc(); - dialogImg.addChild(disconnectBtn); - - var resumeBtn = new GuiButton(loadButtonImages("data/ui/mp/exit/resume")); - resumeBtn.position = new Vector(133, 132); - resumeBtn.extent = new Vector(94, 45); - resumeBtn.vertSizing = Top; - resumeBtn.pressedAction = (e) -> resumeFunc(); - dialogImg.addChild(resumeBtn); - - var serverSettingsBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/settings")); - serverSettingsBtn.position = new Vector(155, 184); - serverSettingsBtn.extent = new Vector(45, 45); - serverSettingsBtn.vertSizing = Top; - serverSettingsBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPServerDlg()); - }; - dialogImg.addChild(serverSettingsBtn); - if (!Net.isHost) { - serverSettingsBtn.disabled = true; - } - - var kickBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/kick")); - kickBtn.position = new Vector(68, 184); - kickBtn.extent = new Vector(45, 45); - kickBtn.vertSizing = Top; - kickBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPKickBanDlg()); - } - dialogImg.addChild(kickBtn); - if (!Net.isHost) { - kickBtn.disabled = true; - } - - var optionsBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/playersettings")); - optionsBtn.position = new Vector(242, 184); - optionsBtn.extent = new Vector(45, 45); - optionsBtn.vertSizing = Top; - optionsBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new OptionsDlg(true)); - } - dialogImg.addChild(optionsBtn); - - var quickspawnBtn = new GuiButton(loadButtonImages("data/ui/mp/exit/respawn")); - quickspawnBtn.position = new Vector(224, 132); - quickspawnBtn.extent = new Vector(104, 45); - quickspawnBtn.vertSizing = Top; - quickspawnBtn.pressedAction = (e) -> { - MarbleGame.instance.paused = false; - @:privateAccess Key.keyPressed[Settings.controlsSettings.respawn] = Key.getFrame() - 1; // jank - MarbleGame.canvas.popDialog(this); - } - dialogImg.addChild(quickspawnBtn); - - 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; - completeRestart.pressedAction = (e) -> { - MarbleGame.instance.paused = false; - NetCommands.completeRestartGame(); - MarbleGame.canvas.popDialog(this); - } - dialogImg.addChild(completeRestart); - if (!Net.isHost) { - completeRestart.disabled = true; - } - - 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 markerFelt38 = markerFelt32b.toSdfFont(cast 31 * Settings.uiScale, MultiChannel); - - var exitTitle = new GuiText(markerFelt38); - exitTitle.position = new Vector(8, 28); - exitTitle.extent = new Vector(331, 30); - exitTitle.justify = Center; - exitTitle.text.text = "Ingame Options"; - exitTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - dialogImg.addChild(exitTitle); - - var restartTitle = new GuiText(markerFelt32); - restartTitle.position = new Vector(20, 88); - restartTitle.extent = new Vector(114, 14); - restartTitle.justify = Center; - restartTitle.text.text = "Restart:"; - restartTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - dialogImg.addChild(restartTitle); - - var jukeboxButton = new GuiButton(loadButtonImages("data/ui/jukebox/jb_pausemenu")); - jukeboxButton.vertSizing = Top; - jukeboxButton.horizSizing = Left; - jukeboxButton.position = new Vector(439, 403); - jukeboxButton.extent = new Vector(187, 65); - jukeboxButton.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new JukeboxDlg()); - } - - this.addChild(jukeboxButton); - } -} diff --git a/src/gui/MPKickBanDlg.hx b/src/gui/MPKickBanDlg.hx deleted file mode 100644 index c8ca7bea..00000000 --- a/src/gui/MPKickBanDlg.hx +++ /dev/null @@ -1,116 +0,0 @@ -package gui; - -import net.ClientConnection; -import net.NetCommands; -import net.Net; -import h2d.filter.DropShadow; -import hxd.res.BitmapFont; -import h3d.prim.Polygon; -import h3d.scene.Mesh; -import h3d.shader.AlphaChannel; -import src.MarbleGame; -import h3d.Vector; -import src.ResourceLoader; -import src.DtsObject; -import src.Settings; -import src.ResourceLoaderWorker; - -class MPKickBanDlg extends GuiImage { - public function new() { - var img = ResourceLoader.getImage("data/ui/mp/kickban/window.png"); - super(img.resource.toTile()); - this.horizSizing = Center; - this.vertSizing = Center; - this.position = new Vector(226, 137); - this.extent = new Vector(409, 316); - - 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 closeBtn = new GuiButton(loadButtonImages("data/ui/mp/team/close")); - closeBtn.position = new Vector(247, 254); - closeBtn.extent = new Vector(94, 45); - closeBtn.vertSizing = Bottom; - closeBtn.horizSizing = Right; - closeBtn.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(this); - } - this.addChild(closeBtn); - - var kickBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/kickban/kick")); - kickBtn.position = new Vector(77, 254); - kickBtn.extent = new Vector(94, 45); - kickBtn.vertSizing = Bottom; - kickBtn.horizSizing = Right; - kickBtn.disabled = true; - this.addChild(kickBtn); - - var kickTitle = new GuiText(markerFelt32); - kickTitle.text.textColor = 0xFFFFFF; - kickTitle.text.text = "Kick Players"; - kickTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - kickTitle.justify = Center; - kickTitle.position = new Vector(11, 17); - kickTitle.extent = new Vector(388, 14); - this.addChild(kickTitle); - - var playerNames = []; - var playerIds = []; - for (c in Net.clients) { - playerNames.push(c.getName()); - playerIds.push(c.id); - } - - var kickPlayerId = -1; - - var playerList = new GuiTextListCtrl(markerFelt18, playerNames, 0); - playerList.position = new Vector(120, 60); - playerList.extent = new Vector(188, 180); - playerList.scrollable = true; - playerList.textYOffset = -6; - playerList.onSelectedFunc = (sel) -> { - kickBtn.disabled = false; - kickPlayerId = playerIds[sel]; - } - this.addChild(playerList); - - kickBtn.pressedAction = (e) -> { - if (Net.clientIdMap.exists(kickPlayerId)) { - var playerToKick = kickPlayerId; - playerNames.remove(Net.clientIdMap.get(playerToKick).getName()); - playerIds.remove(playerToKick); - playerList.setTexts(playerNames); - kickBtn.disabled = true; - NetCommands.getKickedClient(Net.clientIdMap.get(playerToKick)); - var cc = cast(Net.clientIdMap.get(playerToKick), ClientConnection); - cc.socket.close(); - } - } - } -} diff --git a/src/gui/MPMarbleSelectGui.hx b/src/gui/MPMarbleSelectGui.hx deleted file mode 100644 index b7643617..00000000 --- a/src/gui/MPMarbleSelectGui.hx +++ /dev/null @@ -1,238 +0,0 @@ -package gui; - -import net.Net; -import net.NetCommands; -import h2d.filter.DropShadow; -import hxd.res.BitmapFont; -import h3d.prim.Polygon; -import h3d.scene.Mesh; -import h3d.shader.AlphaChannel; -import src.MarbleGame; -import h3d.Vector; -import src.ResourceLoader; -import src.DtsObject; -import src.Settings; -import src.ResourceLoaderWorker; - -class MPMarbleSelectGui extends GuiImage { - public function new() { - var img = ResourceLoader.getImage("data/ui/mp/team/teamcreate.png"); - super(img.resource.toTile()); - this.horizSizing = Center; - this.vertSizing = Center; - this.position = new Vector(73, -59); - this.extent = new Vector(493, 361); - - var categoryNames = ["Official Marbles", "MBUltra"]; - - var curSelection:Int = Settings.optionsSettings.marbleIndex; - var curCategorySelection:Int = Settings.optionsSettings.marbleCategoryIndex; - - 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(); - 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 18 * Settings.uiScale, MultiChannel); - var markerFelt28 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - var selectBtn = new GuiButton(loadButtonImages("data/ui/mp/play/choose")); - selectBtn.horizSizing = Center; - selectBtn.vertSizing = Top; - selectBtn.position = new Vector(199, 270); - selectBtn.extent = new Vector(95, 45); - selectBtn.pressedAction = (e) -> { - Settings.optionsSettings.marbleIndex = curSelection; - Settings.optionsSettings.marbleCategoryIndex = curCategorySelection; - Settings.optionsSettings.marbleSkin = MarbleSelectGui.marbleData[curCategorySelection][curSelection].skin; - Settings.optionsSettings.marbleModel = MarbleSelectGui.marbleData[curCategorySelection][curSelection].dts; - Settings.optionsSettings.marbleShader = MarbleSelectGui.marbleData[curCategorySelection][curSelection].shader; - Settings.save(); - MarbleGame.canvas.popDialog(this); - - // Transmit changes to the server/clients - if (Net.isClient) { - NetCommands.setPlayerData(Net.clientId, Settings.highscoreName, Settings.optionsSettings.marbleIndex, - Settings.optionsSettings.marbleCategoryIndex, true); - } - if (Net.isHost) { - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - } - } - this.addChild(selectBtn); - - var marbleShow = buildObjectShow(MarbleSelectGui.marbleData[curCategorySelection][curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, - 0, [ - "base.marble" => MarbleSelectGui.marbleData[curCategorySelection][curSelection].skin + ".marble" - ]); - marbleShow.horizSizing = Center; - marbleShow.vertSizing = Bottom; - marbleShow.visible = true; - this.addChild(marbleShow); - - var titleText = new GuiMLText(markerFelt28, null); - titleText.text.textColor = 0xFFFFFF; - titleText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - titleText.horizSizing = Center; - titleText.vertSizing = Bottom; - titleText.position = new Vector(140, 67); - titleText.extent = new Vector(213, 27); - titleText.text.text = '

${categoryNames[curCategorySelection]}

'; - this.addChild(titleText); - - var marbleText = new GuiMLText(markerFelt24, null); - marbleText.text.textColor = 0xFFFFFF; - marbleText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - marbleText.horizSizing = Center; - marbleText.vertSizing = Bottom; - marbleText.position = new Vector(86, 243); - marbleText.extent = new Vector(320, 22); - marbleText.text.text = '

${MarbleSelectGui.marbleData[curCategorySelection][curSelection].name}

'; - this.addChild(marbleText); - - var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - changeMarbleText.horizSizing = Center; - changeMarbleText.position = new Vector(96, 26); - changeMarbleText.extent = new Vector(300, 39); - this.addChild(changeMarbleText); - - function setMarbleSelection(idx:Int, categoryIdx:Int) { - if (categoryIdx < 0) - categoryIdx = MarbleSelectGui.marbleData.length + categoryIdx; - if (categoryIdx >= MarbleSelectGui.marbleData.length) - categoryIdx -= MarbleSelectGui.marbleData.length; - - if (idx < 0) - idx = MarbleSelectGui.marbleData[categoryIdx].length + idx; - if (idx >= MarbleSelectGui.marbleData[categoryIdx].length) - idx -= MarbleSelectGui.marbleData[categoryIdx].length; - curSelection = idx; - curCategorySelection = categoryIdx; - var marble = MarbleSelectGui.marbleData[categoryIdx][idx]; - - titleText.text.text = '

${categoryNames[curCategorySelection]}

'; - marbleText.text.text = '

${marble.name}

'; - - var dtsObj = new DtsObject(); - dtsObj.dtsPath = marble.dts; - dtsObj.ambientRotate = true; - dtsObj.ambientSpinFactor /= -2; - dtsObj.showSequences = false; - dtsObj.useInstancing = false; - dtsObj.matNameOverride.set("base.marble", marble.skin + ".marble"); - - ResourceLoader.load(dtsObj.dtsPath).entry.load(() -> { - var dtsFile = ResourceLoader.loadDts(dtsObj.dtsPath); - var directoryPath = haxe.io.Path.directory(dtsObj.dtsPath); - var texToLoad = []; - for (i in 0...dtsFile.resource.matNames.length) { - var matName = dtsObj.matNameOverride.exists(dtsFile.resource.matNames[i]) ? dtsObj.matNameOverride.get(dtsFile.resource.matNames[i]) : dtsFile.resource.matNames[i]; - var fullNames = ResourceLoader.getFullNamesOf(directoryPath + '/' + matName).filter(x -> haxe.io.Path.extension(x) != "dts"); - var fullName = fullNames.length > 0 ? fullNames[0] : null; - if (fullName != null) { - texToLoad.push(fullName); - } - } - - var worker = new ResourceLoaderWorker(() -> { - dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway - for (mat in dtsObj.materials) { - mat.mainPass.enableLights = false; - mat.mainPass.culling = None; - if (mat.blendMode != Alpha && mat.blendMode != Add) - mat.mainPass.addShader(new AlphaChannel()); - } - marbleShow.changeObject(dtsObj); - }); - - for (texPath in texToLoad) { - worker.loadFile(texPath); - } - worker.run(); - }); - } - - var nextBtn = new GuiButton(loadButtonImages("data/ui/mp/play/next")); - nextBtn.position = new Vector(296, 270); - nextBtn.extent = new Vector(75, 45); - nextBtn.pressedAction = (e) -> { - setMarbleSelection(curSelection + 1, curCategorySelection); - } - this.addChild(nextBtn); - - var prevBtn = new GuiButton(loadButtonImages("data/ui/mp/play/prev")); - prevBtn.position = new Vector(123, 270); - prevBtn.extent = new Vector(75, 45); - prevBtn.pressedAction = (e) -> { - setMarbleSelection(curSelection - 1, curCategorySelection); - } - - var nextCategoryBtn = new GuiButton(loadButtonImages("data/ui/mp/play/nextcat")); - nextCategoryBtn.position = new Vector(371, 270); - nextCategoryBtn.extent = new Vector(85, 45); - nextCategoryBtn.pressedAction = (e) -> { - setMarbleSelection(0, curCategorySelection + 1); - } - this.addChild(nextCategoryBtn); - - var prevCategoryBtn = new GuiButton(loadButtonImages("data/ui/mp/play/prevcat")); - prevCategoryBtn.position = new Vector(37, 270); - prevCategoryBtn.extent = new Vector(85, 45); - prevCategoryBtn.pressedAction = (e) -> { - setMarbleSelection(0, curCategorySelection - 1); - } - this.addChild(prevCategoryBtn); - - setMarbleSelection(curSelection, curCategorySelection); - this.addChild(prevBtn); - } - - function buildObjectShow(dtsPath:String, position:Vector, extent:Vector, dist:Float = 5, pitch:Float = 0, matnameOverride:Map = null) { - var oShow = new GuiObjectShow(); - var dtsObj = new DtsObject(); - dtsObj.dtsPath = dtsPath; - dtsObj.ambientRotate = true; - dtsObj.ambientSpinFactor /= -2; - dtsObj.showSequences = false; - dtsObj.useInstancing = false; - if (matnameOverride != null) { - for (key => value in matnameOverride) { - dtsObj.matNameOverride.set(key, value); - } - } - dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway - for (mat in dtsObj.materials) { - mat.mainPass.enableLights = false; - mat.mainPass.culling = None; - if (mat.blendMode != Alpha && mat.blendMode != Add) - mat.mainPass.addShader(new AlphaChannel()); - } - oShow.sceneObject = dtsObj; - oShow.position = position; - oShow.extent = extent; - oShow.renderDistance = dist; - oShow.renderPitch = pitch; - return oShow; - } -} diff --git a/src/gui/MPMessageGui.hx b/src/gui/MPMessageGui.hx deleted file mode 100644 index d75a5a67..00000000 --- a/src/gui/MPMessageGui.hx +++ /dev/null @@ -1,106 +0,0 @@ -package gui; - -import net.Net; -import hxd.res.BitmapFont; -import src.ResourceLoader; -import h3d.Vector; -import src.MarbleGame; -import src.Util; -import src.Settings; - -class MPMessageGui extends GuiImage { - public function new(titleText:String, msgText:String) { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); - super(img.resource.toTile()); - - 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]; - } - - var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); - var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); - @:privateAccess markerFelt32b.loader = ResourceLoader.loader; - var markerFelt48 = markerFelt32b.toSdfFont(cast 42 * Settings.uiScale, MultiChannel); - var markerFelt28 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - this.horizSizing = Width; - this.vertSizing = Height; - this.position = new Vector(0, 0); - this.extent = new Vector(640, 480); - - var container = new GuiControl(); - container.horizSizing = Center; - container.vertSizing = Center; - container.position = new Vector(80, 60); - container.extent = new Vector(640, 480); - - this.addChild(container); - - var wnd = new GuiImage(ResourceLoader.getResource("data/ui/mp/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - wnd.position = new Vector(64, 91); - wnd.extent = new Vector(511, 297); - wnd.horizSizing = Center; - wnd.vertSizing = Center; - container.addChild(wnd); - - var title = new GuiText(markerFelt48); - title.text.text = titleText; - title.text.textColor = 0xFFFFFF; - title.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - title.horizSizing = Center; - title.position = new Vector(47, 26); - title.extent = new Vector(416, 14); - title.justify = Center; - wnd.addChild(title); - - var msg = new GuiText(markerFelt28); - msg.text.text = msgText; - msg.text.textColor = 0xFFFFFF; - msg.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - msg.horizSizing = Relative; - msg.vertSizing = Relative; - msg.position = new Vector(15, 136); - msg.extent = new Vector(483, 65); - msg.justify = Center; - wnd.addChild(msg); - - var cancelBtn = new GuiButton(loadButtonImages('data/ui/mp/join/cancel')); - cancelBtn.position = new Vector(208, 210); - cancelBtn.extent = new Vector(94, 45); - cancelBtn.horizSizing = Center; - cancelBtn.vertSizing = Top; - cancelBtn.pressedAction = (e) -> { - Net.disconnect(); - MarbleGame.canvas.setContent(new JoinServerGui()); - } - wnd.addChild(cancelBtn); - - setTexts = (t, m) -> { - title.text.text = t; - msg.text.text = m; - } - } - - public dynamic function setTexts(titleText:String, msgText:String) {} -} diff --git a/src/gui/MPPlayMissionGui.hx b/src/gui/MPPlayMissionGui.hx deleted file mode 100644 index 4661c092..00000000 --- a/src/gui/MPPlayMissionGui.hx +++ /dev/null @@ -1,748 +0,0 @@ -package gui; - -import src.Marbleland; -import h2d.Scene; -import hxd.Key; -import gui.GuiControl.MouseState; -import h2d.Tile; -import hxd.BitmapData; -import h2d.filter.DropShadow; -import hxd.res.BitmapFont; -import src.MarbleGame; -import src.ResourceLoader; -import h3d.Vector; -import src.Util; -import src.Settings; -import src.Mission; -import src.MissionList; -import net.ClientConnection.NetPlatform; -import net.Net; -import net.NetCommands; -import haxe.ds.Option; - -class MPPlayMissionGui extends GuiImage { - static var currentSelectionStatic:Int = -1; - static var currentCategoryStatic:String = "beginner"; - - public static var allChats:Array = []; - - static var setLevelFn:(String, Int) -> Void; - static var playSelectedLevel:(String, Int) -> Void; - static var setLevelStr:String->Void; - - var currentSelection:Int = 0; - var currentCategory:String = "beginner"; - var currentList:Array; - var setSelectedFunc:Int->Void; - var setScoreHover:Bool->Void; - var setCategoryFunc:(String, ?String, ?Bool) -> Void; - var buttonHoldFunc:(dt:Float, mouseState:MouseState) -> Void; - - var buttonCooldown:Float = 0.5; - var maxButtonCooldown:Float = 0.5; - - #if js - var previewTimeoutHandle:Option = None; - #end - #if hl - var previewToken:Int = 0; - #end - - var playerListCtrl:GuiMLTextListCtrl; - var chatInput:GuiTextInput; - var chatScroll:GuiScrollCtrl; - var chatBox:GuiMLText; - - public function new(isHost:Bool = true) { - MissionList.buildMissionList(); - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); - super(img.resource.toTile()); - - if (currentSelectionStatic == -1) { - currentSelectionStatic = 0; - } - - // currentSelection = currentSelectionStatic; - // currentCategory = currentCategoryStatic; - - MarbleGame.instance.toRecord = false; - - 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 domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual24b = new BitmapFont(domcasual24fontdata.entry); - @:privateAccess domcasual24b.loader = ResourceLoader.loader; - var domcasual24 = domcasual24b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); - - var domcasual32 = domcasual24b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); - var arial14b = new BitmapFont(arial14fontdata.entry); - @:privateAccess arial14b.loader = ResourceLoader.loader; - var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - var arialb14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); - var arialb14b = new BitmapFont(arialb14fontdata.entry); - @:privateAccess arialb14b.loader = ResourceLoader.loader; - var arialBold14 = arialb14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - 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); - - function mlFontLoader(text:String) { - switch (text) { - case "DomCasual24": - return domcasual24; - case "Arial14": - return arial14; - case "ArialBold14": - return arialBold14; - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - case "MarkerFelt20": - return markerFelt20; - case "MarkerFelt26": - return markerFelt26; - default: - return null; - } - } - - this.horizSizing = Width; - this.vertSizing = Height; - this.position = new Vector(); - this.extent = new Vector(640, 480); - - var window = new GuiImage(ResourceLoader.getResource("data/ui/mp/play/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - window.horizSizing = Center; - window.vertSizing = Center; - window.position = new Vector(-60, 5); - window.extent = new Vector(800, 600); - - var leaveBtn = new GuiButton(loadButtonImages("data/ui/mp/play/leave")); - leaveBtn.position = new Vector(59, 514); - leaveBtn.extent = new Vector(93, 44); - leaveBtn.pressedAction = (e) -> { - Net.disconnect(); - MarbleGame.canvas.setContent(new JoinServerGui()); - } - window.addChild(leaveBtn); - - var searchBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/search")); - searchBtn.position = new Vector(255, 514); - searchBtn.extent = new Vector(44, 44); - searchBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPSearchGui(currentCategory == "custom")); - } - window.addChild(searchBtn); - if (Net.isClient) - searchBtn.disabled = true; - - var kickBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/kick")); - kickBtn.position = new Vector(304, 514); - kickBtn.extent = new Vector(44, 44); - kickBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPKickBanDlg()); - } - window.addChild(kickBtn); - if (Net.isClient) - kickBtn.disabled = true; - - 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.isClient) - serverSettingsBtn.disabled = true; - - var marbleSelectBtn = new GuiButton(loadButtonImages("data/ui/mp/play/marble")); - marbleSelectBtn.position = new Vector(206, 514); - marbleSelectBtn.extent = new Vector(44, 44); - marbleSelectBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPMarbleSelectGui()); - } - window.addChild(marbleSelectBtn); - - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - - var pmPreview = new GuiImage(tmpprevtile); - pmPreview.position = new Vector(485, 44); - pmPreview.extent = new Vector(248, 187); - window.addChild(pmPreview); - - var difficultyPopover = new GuiControl(); - difficultyPopover.horizSizing = Width; - difficultyPopover.vertSizing = Height; - difficultyPopover.position = new Vector(); - difficultyPopover.extent = new Vector(640, 480); - - var difficultyPopoverInner = new GuiImage(tmpprevtile); - difficultyPopoverInner.horizSizing = Center; - difficultyPopoverInner.vertSizing = Center; - difficultyPopoverInner.position = new Vector(); - difficultyPopoverInner.extent = new Vector(800, 600); - difficultyPopoverInner.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(difficultyPopover, false); - } - difficultyPopover.addChild(difficultyPopoverInner); - - var difficultySelector = new GuiButton(loadButtonImagesExt("data/ui/mp/play/difficulty_beginner")); - difficultySelector.position = new Vector(161, 47); - difficultySelector.extent = new Vector(204, 44); - if (isHost) - difficultySelector.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(difficultyPopover); - }; - else - difficultySelector.disabled = true; - window.addChild(difficultySelector); - - var difficultyCloseButton = new GuiButton(loadButtonImages("data/ui/mp/play/difficultymenu")); - difficultyCloseButton.position = new Vector(129, 61); - difficultyCloseButton.extent = new Vector(268, 193); - difficultyPopoverInner.addChild(difficultyCloseButton); - - var catFuncBuilder = (cat:String) -> { - return () -> { - currentList = MissionList.missionList["multiplayer"][cat]; - currentCategory = cat; - setCategoryFunc(cat); - } - } - var beginnerFn = catFuncBuilder("beginner"); - var intermediateFn = catFuncBuilder("intermediate"); - var advancedFn = catFuncBuilder("advanced"); - var customFn = catFuncBuilder("custom"); - - var difficulty0 = new GuiButtonText(loadButtonImages("data/ui/mp/play/difficultysel"), markerFelt24); - difficulty0.position = new Vector(43, 42); - difficulty0.ratio = -1 / 16; - difficulty0.setExtent(new Vector(180, 31)); - difficulty0.txtCtrl.text.text = "Intermediate"; - difficulty0.pressedAction = (e) -> { - intermediateFn(); - } - difficultyCloseButton.addChild(difficulty0); - - var difficulty1 = new GuiButtonText(loadButtonImages("data/ui/mp/play/difficultysel"), markerFelt24); - difficulty1.position = new Vector(43, 72); - difficulty1.ratio = -1 / 16; - difficulty1.setExtent(new Vector(180, 31)); - difficulty1.txtCtrl.text.text = "Advanced"; - difficulty1.pressedAction = (e) -> { - advancedFn(); - } - difficultyCloseButton.addChild(difficulty1); - - var difficulty2 = new GuiButtonText(loadButtonImages("data/ui/mp/play/difficultysel"), markerFelt24); - difficulty2.position = new Vector(43, 116); - difficulty2.ratio = -1 / 16; - difficulty2.setExtent(new Vector(180, 31)); - difficulty2.txtCtrl.text.text = "Custom"; - difficulty2.pressedAction = (e) -> { - customFn(); - } - difficultyCloseButton.addChild(difficulty2); - - var pmPreviewFrame = new GuiImage(ResourceLoader.getResource('data/ui/mp/play/levelframe.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmPreviewFrame.position = new Vector(0, 0); - pmPreviewFrame.extent = new Vector(248, 187); - pmPreview.addChild(pmPreviewFrame); - - var prevBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/prev")); - prevBtn.position = new Vector(491, 514); - prevBtn.extent = new Vector(73, 44); - prevBtn.gamepadAccelerator = ["dpadLeft"]; - prevBtn.pressedAction = (sender) -> { - NetCommands.setLobbyLevelIndex(currentCategory, currentSelection - 1); - } - if (isHost) - window.addChild(prevBtn); - - var nextBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/play/next")); - nextBtn.position = new Vector(659, 514); - nextBtn.extent = new Vector(73, 44); - nextBtn.gamepadAccelerator = ["dpadRight"]; - - nextBtn.pressedAction = (sender) -> { - NetCommands.setLobbyLevelIndex(currentCategory, currentSelection + 1); - } - if (isHost) - window.addChild(nextBtn); - - var playBtn = new GuiButton(loadButtonImages("data/ui/mp/play/play")); - playBtn.position = new Vector(565, 514); - playBtn.extent = new Vector(93, 44); - playBtn.pressedAction = (sender) -> { - NetCommands.toggleReadiness(Net.isClient ? Net.clientId : 0); - // MarbleGame.instance.playMission(currentList[currentSelection], true); - } - window.addChild(playBtn); - - var pmDescContainer = new GuiControl(); - pmDescContainer.position = new Vector(43, 99); - pmDescContainer.extent = new Vector(427, 99); - window.addChild(pmDescContainer); - - var pmDesc = new GuiMLText(markerFelt18, mlFontLoader); - pmDesc.position = new Vector(0, 0); - pmDesc.extent = new Vector(427, 99); - pmDesc.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - parTime.text.lineSpacing = -1; - window.addChild(parTime); - - function imgLoader(path:String) { - var t = switch (path) { - case "ready": - ResourceLoader.getResource("data/ui/mp/play/Ready.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "notready": - ResourceLoader.getResource("data/ui/mp/play/NotReady.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "pc": - ResourceLoader.getResource("data/ui/mp/play/platform_desktop_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "mac": - ResourceLoader.getResource("data/ui/mp/play/platform_mac_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "web": - ResourceLoader.getResource("data/ui/mp/play/platform_web_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "android": - ResourceLoader.getResource("data/ui/mp/play/platform_android_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "unknown": - ResourceLoader.getResource("data/ui/mp/play/platform_unknown_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case _: - return null; - }; - if (t != null) - t.scaleToSize(t.width * (Settings.uiScale), t.height * (Settings.uiScale)); - return t; - } - - var playersBox = new GuiControl(); - playersBox.position = new Vector(463, 279); - playersBox.extent = new Vector(305, 229); - window.addChild(playersBox); - - playerListCtrl = new GuiMLTextListCtrl(markerFelt18, [], imgLoader); - playerListCtrl.position = new Vector(0, 26); - playerListCtrl.extent = new Vector(305, 203); - playerListCtrl.scrollable = true; - playerListCtrl.textYOffset = -6; - playersBox.addChild(playerListCtrl); - - var playerListTitle = new GuiText(markerFelt24); - playerListTitle.position = new Vector(7, 0); - playerListTitle.extent = new Vector(275, 22); - playerListTitle.text.text = "Players"; - playerListTitle.text.textColor = 0xBDCFE4; - playerListTitle.justify = Center; - playerListTitle.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - playersBox.addChild(playerListTitle); - - chatScroll = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile()); - chatScroll.position = new Vector(47, 282); - chatScroll.extent = new Vector(407, 193); - chatScroll.childrenHandleScroll = true; - chatScroll.scrollToBottom = true; - window.addChild(chatScroll); - - chatBox = new GuiMLText(markerFelt18, mlFontLoader); - chatBox.text.textColor = 0x000000; - chatBox.horizSizing = Width; - chatBox.position = new Vector(0, 0); - chatBox.extent = new Vector(396, 1184); - chatScroll.addChild(chatBox); - - var chatInputContainer = new GuiControl(); - chatInputContainer.position = new Vector(50, 476); - chatInputContainer.extent = new Vector(402, 30); - window.addChild(chatInputContainer); - - chatInput = new GuiTextInput(markerFelt18); - chatInput.text.textColor = 0x000000; - chatInput.horizSizing = Width; - chatInput.position = new Vector(50, 0); - chatInput.extent = new Vector(352, 30); - chatInputContainer.addChild(chatInput); - @:privateAccess chatInput.text.interactive.forceAnywherefocus = true; - - var chatInputFocusTxt = new GuiText(markerFelt18); - chatInputFocusTxt.position = new Vector(0, 0); - chatInputFocusTxt.extent = new Vector(50, 30); - chatInputFocusTxt.text.text = "Chat:"; - chatInputFocusTxt.text.textColor = 0x000000; - chatInputFocusTxt.justify = Center; - chatInputContainer.addChild(chatInputFocusTxt); - - chatInput.text.onKeyDown = (e) -> { - if (e.keyCode == Key.ENTER) { - if (StringTools.trim(chatInput.text.text) != "") { - var sendText = '${StringTools.htmlEscape(Settings.highscoreName.substr(0, 20))}: ${StringTools.htmlEscape(chatInput.text.text.substr(0, 100))}'; - if (Net.isClient) { - NetCommands.sendChatMessage(StringTools.htmlEscape(sendText)); - } - if (Net.isHost) { - NetCommands.sendServerChatMessage(StringTools.htmlEscape(sendText)); - } - } - chatInput.text.text = ""; - haxe.Timer.delay(() -> chatInput.text.focus(), 10); - } - @:privateAccess Key.keyPressed[e.keyCode] = 0; // consume keys - } - - this.addChild(window); - - buttonHoldFunc = (dt:Float, mouseState:MouseState) -> { - var prevBox = prevBtn.getRenderRectangle(); - var nextBox = nextBtn.getRenderRectangle(); - - if (prevBox.inRect(mouseState.position) && mouseState.button == Key.MOUSE_LEFT) { - if (buttonCooldown <= 0) { - prevBtn.pressedAction(new GuiEvent(prevBtn)); - buttonCooldown = maxButtonCooldown; - maxButtonCooldown *= 0.75; - } - } - - if (nextBox.inRect(mouseState.position) && mouseState.button == Key.MOUSE_LEFT) { - if (buttonCooldown <= 0) { - nextBtn.pressedAction(new GuiEvent(nextBtn)); - buttonCooldown = maxButtonCooldown; - maxButtonCooldown *= 0.75; - } - } - - if (buttonCooldown > 0 && mouseState.button == Key.MOUSE_LEFT) - buttonCooldown -= dt; - - if (mouseState.button != Key.MOUSE_LEFT) { - maxButtonCooldown = 0.5; - buttonCooldown = maxButtonCooldown; - } - } - - setCategoryFunc = function(category:String, ?sort:String = null, ?doRender:Bool = true) { - if (category == "custom") { - currentList = Marbleland.multiplayerMissions; - } else - currentList = MissionList.missionList["multiplayer"][category]; - - @:privateAccess difficultySelector.anim.frames = loadButtonImagesExt('data/ui/mp/play/difficulty_${category}'); - - if (category == "beginner") { - difficulty0.txtCtrl.text.text = "Intermediate"; - difficulty1.txtCtrl.text.text = "Advanced"; - difficulty2.txtCtrl.text.text = "Custom"; - difficulty0.pressedAction = (e) -> { - intermediateFn(); - } - difficulty1.pressedAction = (e) -> { - advancedFn(); - } - difficulty2.pressedAction = (e) -> { - customFn(); - } - } - if (category == "intermediate") { - difficulty0.txtCtrl.text.text = "Beginner"; - difficulty1.txtCtrl.text.text = "Advanced"; - difficulty2.txtCtrl.text.text = "Custom"; - difficulty0.pressedAction = (e) -> { - beginnerFn(); - } - difficulty1.pressedAction = (e) -> { - advancedFn(); - } - difficulty2.pressedAction = (e) -> { - customFn(); - } - } - if (category == "custom") { - difficulty0.txtCtrl.text.text = "Beginner"; - difficulty1.txtCtrl.text.text = "Intermediate"; - difficulty2.txtCtrl.text.text = "Advanced"; - difficulty0.pressedAction = (e) -> { - beginnerFn(); - } - difficulty1.pressedAction = (e) -> { - intermediateFn(); - } - difficulty2.pressedAction = (e) -> { - advancedFn(); - } - } - - if (sort != null) { - currentList = currentList.copy(); // Don't modify the originals - if (sort == "alpha") { - currentList.sort((x, y) -> x.title > y.title ? 1 : (x.title < y.title ? -1 : 0)); - } - if (sort == "date") { - currentList.sort((x, y) -> x.addedAt > y.addedAt ? 1 : (x.addedAt < y.addedAt ? -1 : 0)); - } - } - - currentCategoryStatic = currentCategory; - - NetCommands.setLobbyLevelIndex(category, 0); - // if (doRender) - // this.render(cast(this.parent, Canvas).scene2d); - } - - setSelectedFunc = function setSelected(index:Int) { - if (index > currentList.length - 1) { - index = currentList.length - 1; - } - if (index < 0) { - index = 0; - } - - currentSelection = index; - currentSelectionStatic = currentSelection; - - var currentMission = currentList[currentSelection]; - - if (index == 0) { - prevBtn.disabled = true; - } else - prevBtn.disabled = false; - if (index == Math.max(currentList.length - 1, 0)) { - nextBtn.disabled = true; - } else - nextBtn.disabled = false; - - // if (currentCategory != "custom" - // && Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)] < currentSelection) { - // noQualText.text.visible = true; - // filt.matrix.identity(); - // filt.matrix.colorGain(0, 96 / 255); - // pmPlay.disabled = true; - // } else { - playBtn.disabled = false; - // } - - if (currentMission == null) { - currentMission = new Mission(); - currentMission.title = ""; - currentMission.description = ""; - currentMission.path = "bruh"; - currentSelection = -1; - } - - pmDesc.text.text = '

#${currentSelection + 1}: ${StringTools.htmlEscape(currentMission.title)}

' - + '${StringTools.htmlEscape(currentMission.description)}'; - - parTime.text.text = 'Duration: ${Util.formatTime(currentMission.qualifyTime)}
' - + 'Author: ${StringTools.htmlEscape(currentMission.artist)}'; - - // pmPreview.bmp.tile = tmpprevtile; - #if js - switch (previewTimeoutHandle) { - case None: - previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - var prevpath = currentMission.getPreviewImage(prevImg -> { - pmPreview.bmp.tile = prevImg; - }); - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } - }, 75)); - case Some(previewTimeoutHandle_id): - js.Browser.window.clearTimeout(previewTimeoutHandle_id); - previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - var prevpath = currentMission.getPreviewImage(prevImg -> { - pmPreview.bmp.tile = prevImg; - }); - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } - }, 75)); - } - #end - #if hl - var pTok = previewToken++; - var prevpath = currentMission.getPreviewImage(prevImg -> { - if (pTok + 1 != previewToken) - return; - pmPreview.bmp.tile = prevImg; - }); // Shit be sync - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } - #end - } - - playSelectedLevel = (cat:String, index:Int) -> { - // if (custSelected) { - // NetCommands.playCustomLevel(MPCustoms.missionList[custSelectedIdx].path); - // } else { - if (cat == "custom") { - var curMission = Marbleland.multiplayerMissions[index]; // mission[index]; - MarbleGame.instance.playMission(curMission, true); - } else { - var curMission = MissionList.missionList["multiplayer"][cat][index]; // mission[index]; - MarbleGame.instance.playMission(curMission, true); - } - // } - } - - setLevelFn = (cat:String, index:Int) -> { - if (currentCategory != cat) { - currentCategory = cat; - setCategoryFunc(cat); - } - setSelectedFunc(index); - } - - currentList = MissionList.missionList["multiplayer"]["beginner"]; - - // setCategoryFunc(currentCategoryStatic, null, false); - if (Net.isHost) { - NetCommands.setLobbyLevelIndex(currentCategoryStatic, currentSelectionStatic); - } else { - setCategoryFunc(currentCategoryStatic, null, false); - } - updateLobbyNames(); - redrawChat(); - haxe.Timer.delay(() -> { - this.chatScroll.updateScrollVisual(); - }, 50); - } - - public override function render(scene2d:Scene, ?parent:h2d.Flow) { - super.render(scene2d, parent); - setSelectedFunc(currentSelectionStatic); - } - - public override function update(dt:Float, mouseState:MouseState) { - super.update(dt, mouseState); - - buttonHoldFunc(dt, mouseState); - - if (Key.isPressed(Key.LEFT)) - setSelectedFunc(currentSelection - 1); - if (Key.isPressed(Key.RIGHT)) - setSelectedFunc(currentSelection + 1); - } - - inline function platformToString(platform:NetPlatform) { - return switch (platform) { - case Unknown: return "unknown"; - case Android: return "android"; - case MacOS: return "mac"; - case PC: return "pc"; - case Web: return "web"; - } - } - - public function updateLobbyNames() { - var playerListArr = []; - if (Net.isHost) { - playerListArr.push({ - name: Settings.highscoreName, - platform: Net.getPlatform(), - ready: Net.lobbyHostReady - }); - } - if (Net.isClient) { - playerListArr.push({ - name: Settings.highscoreName, - platform: Net.getPlatform(), - ready: Net.lobbyClientReady - }); - } - if (Net.clientIdMap != null) { - for (c => v in Net.clientIdMap) { - playerListArr.push({ - name: v.name, - platform: v.platform, - ready: v.lobbyReady - }); - } - } - - var playerListCompiled = playerListArr.map(player -> - '${StringTools.htmlEscape(player.name)}${player.ready ? "Ready" : ""}'); - playerListCtrl.setTexts(playerListCompiled); - - // if (!showingCustoms) - // playerList.setTexts(playerListArr.map(player -> { - // return '${player.name}'; - // })); - } - - public static function addChatMessage(s:String) { - var realText = StringTools.htmlEscape(s); - allChats.push(realText); - if (allChats.length > 100) { - allChats = allChats.slice(allChats.length - 100); - } - if (MarbleGame.canvas.content is MPPlayMissionGui) { - var mpp = cast(MarbleGame.canvas.content, MPPlayMissionGui); - mpp.redrawChat(); - } - } - - public function redrawChat() { - var joined = allChats.join("
"); - this.chatBox.text.text = StringTools.replace(joined, '#F29515', '#000000'); - this.chatScroll.setScrollMax(chatBox.text.textHeight); - this.chatScroll.updateScrollVisual(); - } -} diff --git a/src/gui/MPPreGameDlg.hx b/src/gui/MPPreGameDlg.hx deleted file mode 100644 index 90153c78..00000000 --- a/src/gui/MPPreGameDlg.hx +++ /dev/null @@ -1,329 +0,0 @@ -package gui; - -import net.NetCommands; -import h2d.filter.DropShadow; -import net.Net; -import src.MarbleGame; -import hxd.res.BitmapFont; -import h3d.Vector; -import src.ResourceLoader; -import src.Settings; -import src.Console; -import net.MasterServerClient; - -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); - leaveBtn.pressedAction = (e) -> { - MarbleGame.instance.quitMission(true); - if (Net.isMP && Net.isClient) { - Net.disconnect(); - MarbleGame.canvas.setContent(new JoinServerGui()); - } - } - dialogImg.addChild(leaveBtn); - - var playBtn = new GuiButton(loadButtonImagesExt("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; - playBtn.disabled = true; - playBtn.pressedAction = (e) -> { - for (id => client in Net.clientIdMap) { - client.state = GAME; - } - if (Settings.serverSettings.forceSpectators) { - for (id => client in Net.clientIdMap) { - client.spectator = true; // Make them spectator - } - } - var b = Net.sendPlayerInfosBytes(); // Update spectator status - for (cc in Net.clients) { - cc.sendBytes(b); - } - - if (MarbleGame.instance.world != null) { - Console.log('All are ready, starting'); - MarbleGame.instance.world.allClientsReady(); - } - Net.serverInfo.state = "PLAYING"; - MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state - } - if (Net.isHost) - 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); - kickBtn.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MPKickBanDlg()); - } - 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); - spectateBtn.buttonType = Toggle; - spectateBtn.pressedAction = (e) -> { - NetCommands.toggleSpectate(Net.isHost ? 0 : Net.clientId); - updatePlayerList(); - } - 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 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - dialogImg.addChild(levelName); - - var levelDesc = new GuiMLText(markerFelt18, null); - levelDesc.text.textColor = 0xFFFFFF; - levelDesc.position = new Vector(60, 185); - levelDesc.extent = new Vector(516, 63); - levelDesc.text.text = StringTools.htmlEscape(MarbleGame.instance.world.mission.description); - levelDesc.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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 playerListLeft = new GuiTextListCtrl(markerFelt18, [], 0xFFFFFF, { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - color: 0, - alpha: 1 - }); - playerListLeft.selectedColor = 0xFFFFFF; - playerListLeft.selectedFillColor = 0x6092E5; - playerListLeft.selectedFillColorAlpha = 0.0; - playerListLeft.horizSizing = Width; - playerListLeft.position = new Vector(-1, -1); - playerListLeft.extent = new Vector(525, 2880); - playerListLeft.scrollable = true; - playerListLeft.textYOffset = -6; - playerListContainer.addChild(playerListLeft); - - var playerListRight = new GuiTextListCtrl(markerFelt18, [], 0xFFFFFF, { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - color: 0, - alpha: 1 - }); - playerListRight.selectedColor = 0xFFFFFF; - playerListRight.selectedFillColor = 0x6092E5; - playerListRight.selectedFillColorAlpha = 0.0; - playerListRight.horizSizing = Width; - playerListRight.position = new Vector(420, -1); - playerListRight.extent = new Vector(300, 2880); - playerListRight.scrollable = true; - playerListRight.textYOffset = -6; - playerListContainer.addChild(playerListRight); - playerListContainer.setScrollMax(playerListLeft.calculateFullHeight()); - - this.updatePlayerList = () -> { - var allReady = true; - var playerListArr = []; - if (Net.isHost) { - playerListArr.push({ - name: Settings.highscoreName, - ready: Net.lobbyHostReady, - spectate: Net.hostSpectate - }); - spectateBtn.anim.currentFrame = Net.hostSpectate ? 2 : 0; - readyBtn.anim.currentFrame = Net.lobbyHostReady ? 2 : 0; - } - if (Net.isClient) { - playerListArr.push({ - name: Settings.highscoreName, - ready: Net.lobbyClientReady, - spectate: Net.clientSpectate - }); - spectateBtn.anim.currentFrame = Net.clientSpectate ? 2 : 0; - readyBtn.anim.currentFrame = Net.lobbyClientReady ? 2 : 0; - spectateBtn.pressed = Net.clientSpectate; - readyBtn.pressed = Net.lobbyClientReady; - } - if (Net.clientIdMap != null) { - for (c => v in Net.clientIdMap) { - playerListArr.push({ - name: v.name, - ready: v.lobbyReady, - spectate: v.spectator - }); - } - } - for (p in playerListArr) { - if (!p.ready) { - allReady = false; - break; - } - } - - playBtn.disabled = !allReady; - - if (playerListArr.length > 1) { - spectateBtn.anim.visible = true; - spectateBtn.disabled = false; - } else { - spectateBtn.anim.visible = false; - spectateBtn.disabled = true; - } - - var playerListCompiled = playerListArr.map(player -> player.spectate ? '[S] ${player.name}' : player.name); - var playerListStateCompiled = playerListArr.map(player -> player.ready ? "[Ready]" : "[Waiting]"); - playerListLeft.setTexts(playerListCompiled); - playerListRight.setTexts(playerListStateCompiled); - - playerListContainer.setScrollMax(playerListLeft.calculateFullHeight()); - - if (playerListArr.length == 1) { - // Disable spectating - Net.hostSpectate = false; - Net.clientSpectate = false; - } - - // if (!showingCustoms) - // playerList.setTexts(playerListArr.map(player -> { - // return '${player.name}'; - // })); - } - - readyBtn.pressedAction = (e) -> { - NetCommands.toggleReadiness(Net.isHost ? 0 : Net.clientId); - updatePlayerList(); - } - - // Make everyone un-lobby ready (again!) - for (c in Net.clients) { - c.lobbyReady = false; - c.spectator = false; - } - Net.hostSpectate = false; - Net.lobbyClientReady = false; - Net.lobbyHostReady = false; - if (Net.isHost) { - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - } - updatePlayerList(); - } - - public dynamic function updatePlayerList() {} -} diff --git a/src/gui/MPSearchGui.hx b/src/gui/MPSearchGui.hx deleted file mode 100644 index d6560f55..00000000 --- a/src/gui/MPSearchGui.hx +++ /dev/null @@ -1,282 +0,0 @@ -package gui; - -import net.NetCommands; -import src.Marbleland; -import h2d.Tile; -import hxd.BitmapData; -import src.MarbleGame; -import hxd.res.BitmapFont; -import h3d.Vector; -import src.ResourceLoader; -import src.Settings; -import src.MissionList; - -class MPSearchGui extends GuiImage { - public function new(isCustom:Bool) { - var img = ResourceLoader.getImage("data/ui/mp/search/window.png"); - super(img.resource.toTile()); - - this.horizSizing = Center; - this.vertSizing = Center; - this.position = new Vector(76, 8); - this.extent = new Vector(487, 463); - - var missionList = []; - if (!isCustom) { - for (diffName => diff in MissionList.missionList["multiplayer"]) { - for (mis in diff) { - missionList.push({ - mis: mis, - name: mis.title, - artist: mis.artist, - path: mis.path, - difficulty: diffName, - }); - } - } - } else { - var customsList = Marbleland.multiplayerMissions; - for (mis in customsList) { - missionList.push({ - mis: mis, - name: mis.title, - artist: mis.artist, - path: mis.path, - difficulty: "custom" - }); - } - } - - var displayList = missionList.map(x -> x.name); - displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1)); - missionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1)); - var retrieveMissionList = missionList; - - var searchMissionList:GuiTextListCtrl = null; - var scrollCtrl:GuiScrollCtrl = null; - - var currentSortBy = "title"; - - function sortBy(type:String, txt:String = "") { - if (type == "title") { - retrieveMissionList = missionList.filter(x -> StringTools.contains(x.name.toLowerCase(), txt.toLowerCase())); - displayList = retrieveMissionList.map(x -> x.name); - displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1)); - retrieveMissionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1)); - } - if (type == "artist") { - retrieveMissionList = missionList.filter(x -> StringTools.contains(x.artist.toLowerCase(), txt.toLowerCase())); - retrieveMissionList.sort((x, y) -> x.artist > y.artist ? 1 : (x.artist == y.artist ? 0 : -1)); - displayList = retrieveMissionList.map(x -> '${x.name} By ${x.artist}'); - } - if (type == "file") { - retrieveMissionList = missionList.filter(x -> StringTools.contains(x.path.toLowerCase(), txt.toLowerCase())); - retrieveMissionList.sort((x, y) -> x.path > y.path ? 1 : (x.path == y.path ? 0 : -1)); - var idxofslash = 0; - displayList = retrieveMissionList.map(x -> { - var idxofslash = 0; - var slashcount = 0; - for (i in 0...x.path.length) { - if (x.path.charCodeAt(x.path.length - i - 1) == '/'.code) { - slashcount++; - if (slashcount == 2) { - idxofslash = x.path.length - i - 1; - break; - } - } - } - return '${x.path.substr(idxofslash + 1)}'; - }); - } - searchMissionList.setTexts(displayList); - scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight()); - } - - 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(); - var disabledObj = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources); - var disabled = disabledObj != null ? disabledObj.toTile() : null; - 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 18 * Settings.uiScale, MultiChannel); - var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); - - var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual32b = new BitmapFont(domcasual32fontdata.entry); - @:privateAccess domcasual32b.loader = ResourceLoader.loader; - var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel); - var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); - - var searchCancel = new GuiButton(loadButtonImages("data/ui/mp/search/cancel")); - searchCancel.vertSizing = Top; - searchCancel.position = new Vector(21, 395); - searchCancel.extent = new Vector(94, 45); - searchCancel.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(this); - } - this.addChild(searchCancel); - - var selectedIdx:Int = -1; - - var searchPlay = new GuiButton(loadButtonImages("data/ui/mp/search/play")); - searchPlay.position = new Vector(370, 395); - searchPlay.extent = new Vector(94, 45); - searchPlay.disabled = true; - searchPlay.pressedAction = (e) -> { - if (selectedIdx != -1) { - var mis = retrieveMissionList[selectedIdx]; - - if (mis.difficulty == "custom") { - var idx = Marbleland.multiplayerMissions.indexOf(mis.mis); - NetCommands.setLobbyLevelIndex(mis.difficulty, idx); - } else { - var idx = MissionList.missionList["multiplayer"][mis.difficulty].indexOf(mis.mis); - NetCommands.setLobbyLevelIndex(mis.difficulty, idx); - } - MarbleGame.canvas.popDialog(this); - } - } - this.addChild(searchPlay); - - var searchTitle = new GuiText(domcasual24); - searchTitle.position = new Vector(52, 23); - searchTitle.extent = new Vector(64, 25); - searchTitle.text.textColor = 0x696969; - searchTitle.text.text = "Title:"; - this.addChild(searchTitle); - - var searchEdit = new GuiTextInput(domcasual24); - searchEdit.text.textColor = 0; - searchEdit.text.selectionColor.setColor(0xFFFFFFFF); - searchEdit.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(searchEdit.text.font.lineHeight)); - searchEdit.position = new Vector(91, 23); - searchEdit.extent = new Vector(373, 29); - searchEdit.onTextChange = (txt) -> { - sortBy(currentSortBy, txt); - }; - this.addChild(searchEdit); - - scrollCtrl = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile()); - scrollCtrl.position = new Vector(18, 68); - scrollCtrl.extent = new Vector(447, 317); - scrollCtrl.childrenHandleScroll = true; - this.addChild(scrollCtrl); - - searchMissionList = new GuiTextListCtrl(markerFelt24, displayList, 0xFFFFFF); - searchMissionList.selectedColor = 0xFFFFFF; - searchMissionList.selectedFillColor = 0x7585E3; - searchMissionList.horizSizing = Width; - searchMissionList.position = new Vector(4, -1); - searchMissionList.extent = new Vector(432, 2880); - searchMissionList.textYOffset = -6; - searchMissionList.scrollable = true; - searchMissionList.onSelectedFunc = (sel) -> { - selectedIdx = sel; - if (retrieveMissionList.length <= selectedIdx || selectedIdx < 0) { - searchPlay.disabled = true; - } else { - searchPlay.disabled = false; - } - } - scrollCtrl.addChild(searchMissionList); - scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight()); - - var optionsPopup:GuiButton = null; - - var searchOptions = new GuiButton(loadButtonImages("data/ui/mp/search/options")); - searchOptions.vertSizing = Top; - searchOptions.horizSizing = Right; - searchOptions.position = new Vector(121, 398); - searchOptions.extent = new Vector(94, 45); - searchOptions.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(optionsPopup); - } - this.addChild(searchOptions); - - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - - optionsPopup = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]); - optionsPopup.horizSizing = Width; - optionsPopup.vertSizing = Height; - optionsPopup.position = new Vector(0, 0); - optionsPopup.extent = new Vector(640, 480); - optionsPopup.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(optionsPopup, false); - } - - var optionsPopupInner = new GuiControl(); - optionsPopupInner.horizSizing = Center; - optionsPopupInner.vertSizing = Center; - optionsPopupInner.position = new Vector(80, 7); - optionsPopupInner.extent = new Vector(480, 465); - optionsPopup.addChild(optionsPopupInner); - - var optionsBgR = ResourceLoader.getResource('data/ui/mp/play/moremenu.png', ResourceLoader.getImage, this.imageResources).toTile(); - - var optionsBg = new GuiImage(optionsBgR); - optionsBg.position = new Vector(0, 281); - optionsBg.extent = new Vector(348, 148); - optionsPopupInner.addChild(optionsBg); - - var searchByFile = new GuiButton(loadButtonImages("data/ui/mp/search/file")); - searchByFile.buttonType = Radio; - searchByFile.position = new Vector(229, 45); - searchByFile.extent = new Vector(67, 45); - searchByFile.pressedAction = (e) -> { - searchTitle.text.text = "File:"; - currentSortBy = "file"; - sortBy("file"); - }; - optionsBg.addChild(searchByFile); - - var searchByartist = new GuiButton(loadButtonImages("data/ui/mp/search/artist")); - searchByartist.buttonType = Radio; - searchByartist.position = new Vector(159, 45); - searchByartist.extent = new Vector(71, 45); - searchByartist.pressedAction = (e) -> { - searchTitle.text.text = "Artist:"; - currentSortBy = "artist"; - sortBy("artist"); - }; - optionsBg.addChild(searchByartist); - - var searchByTitle = new GuiButton(loadButtonImages("data/ui/mp/search/name")); - searchByTitle.buttonType = Radio; - searchByTitle.position = new Vector(92, 45); - searchByTitle.extent = new Vector(68, 45); - searchByTitle.pressed = true; - searchByTitle.pressedAction = (e) -> { - searchTitle.text.text = "Title:"; - currentSortBy = "title"; - sortBy("title"); - }; - optionsBg.addChild(searchByTitle); - - var searchRandom = new GuiButton(loadButtonImages("data/ui/mp/search/random")); - searchRandom.vertSizing = Top; - searchRandom.position = new Vector(44, 45); - searchRandom.extent = new Vector(44, 44); - searchRandom.pressedAction = (e) -> { - var mis = retrieveMissionList[Math.floor(Math.random() * missionList.length)]; - - if (mis.difficulty == "custom") { - var idx = Marbleland.multiplayerMissions.indexOf(mis.mis); - NetCommands.setLobbyLevelIndex(mis.difficulty, idx); - } else { - var idx = MissionList.missionList["multiplayer"][mis.difficulty].indexOf(mis.mis); - NetCommands.setLobbyLevelIndex(mis.difficulty, idx); - } - } - optionsBg.addChild(searchRandom); - } -} diff --git a/src/gui/MPServerDlg.hx b/src/gui/MPServerDlg.hx deleted file mode 100644 index e040d38b..00000000 --- a/src/gui/MPServerDlg.hx +++ /dev/null @@ -1,361 +0,0 @@ -package gui; - -import net.MasterServerClient; -import net.Net; -import h2d.filter.DropShadow; -import src.Marbleland; -import h2d.Tile; -import hxd.BitmapData; -import src.MarbleGame; -import hxd.res.BitmapFont; -import h3d.Vector; -import src.ResourceLoader; -import src.Settings; -import src.MissionList; -import net.NetCommands; - -class MPServerDlg extends GuiImage { - public function new() { - var img = ResourceLoader.getImage("data/ui/mp/settings/serversettings.png"); - super(img.resource.toTile()); - - this.horizSizing = Center; - this.vertSizing = Center; - this.position = new Vector(100, 17); - this.extent = new Vector(440, 486); - - 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]; - } - - 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 cancelBtn = new GuiButton(loadButtonImages("data/ui/mp/join/cancel")); - cancelBtn.vertSizing = Top; - cancelBtn.horizSizing = Left; - cancelBtn.position = new Vector(123, 424); - cancelBtn.extent = new Vector(94, 45); - cancelBtn.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(this); - } - this.addChild(cancelBtn); - - var saveBtn = new GuiButton(loadButtonImages("data/ui/mp/join/save")); - saveBtn.horizSizing = Left; - saveBtn.vertSizing = Top; - saveBtn.position = new Vector(223, 424); - saveBtn.extent = new Vector(94, 45); - this.addChild(saveBtn); - - var title = new GuiText(markerFelt32); - title.text.text = "Server Settings"; - title.text.textColor = 0xFFFFFF; - title.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - title.justify = Center; - title.position = new Vector(11, 21); - title.extent = new Vector(418, 14); - title.horizSizing = Width; - this.addChild(title); - - // var showPwdTitle = new GuiText(markerFelt18); - // showPwdTitle.text.text = "Show Password"; - // showPwdTitle.text.textColor = 0xFFFFFF; - // showPwdTitle.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); - // showPwdTitle.position = new Vector(259, 94); - // showPwdTitle.extent = new Vector(129, 14); - // showPwdTitle.horizSizing = Left; - // this.addChild(showPwdTitle); - - // var showPasswords = new GuiButton(loadButtonImages("data/ui/mp/lb_chkbx")); - // showPasswords.buttonType = Toggle; - // showPasswords.horizSizing = Left; - // showPasswords.position = new Vector(389, 86); - // 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; - var curServerCompetitive = Settings.serverSettings.competitiveMode; - var curServerOldSpawns = Settings.serverSettings.oldSpawns; - - 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; - Settings.serverSettings.competitiveMode = curServerCompetitive; - Settings.serverSettings.oldSpawns = curServerOldSpawns; - 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, Settings.serverSettings.competitiveMode, Settings.serverSettings.oldSpawns); - } - Settings.save(); - MarbleGame.canvas.popDialog(this); - } - - var serverSettingsContainer = new GuiControl(); - serverSettingsContainer.vertSizing = Height; - serverSettingsContainer.horizSizing = Left; - serverSettingsContainer.position = new Vector(16, 65); - serverSettingsContainer.extent = new Vector(390, 346); - this.addChild(serverSettingsContainer); - - var serverName = new GuiText(markerFelt18); - serverName.text.text = "Server Name:"; - serverName.text.textColor = 0xFFFFFF; - serverName.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - serverName.position = new Vector(0, 0); - serverName.extent = new Vector(206, 14); - serverSettingsContainer.addChild(serverName); - - var serverNameEditBg = new GuiImage(ResourceLoader.getResource("data/ui/mp/settings/inputbg.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - serverNameEditBg.position = new Vector(93, 0); - serverNameEditBg.extent = new Vector(297, 35); - serverSettingsContainer.addChild(serverNameEditBg); - - var serverNameEdit = new GuiTextInput(markerFelt18); - serverNameEdit.position = new Vector(3, 3); - serverNameEdit.extent = new Vector(291, 29); - serverNameEdit.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - password.position = new Vector(0, 39); - password.extent = new Vector(206, 14); - serverSettingsContainer.addChild(password); - - var passwordEditBg = new GuiImage(ResourceLoader.getResource("data/ui/mp/settings/inputbg.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - passwordEditBg.position = new Vector(93, 6 + 29); - passwordEditBg.extent = new Vector(297, 35); - serverSettingsContainer.addChild(passwordEditBg); - - var passwordEdit = new GuiTextInput(markerFelt18); - passwordEdit.position = new Vector(3, 3); - passwordEdit.extent = new Vector(291, 29); - passwordEdit.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - serverDescTitle.position = new Vector(0, 39 * 2); - serverDescTitle.extent = new Vector(206, 14); - serverSettingsContainer.addChild(serverDescTitle); - - var serverDescEditBg = new GuiImage(ResourceLoader.getResource("data/ui/mp/settings/inputbg.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - serverDescEditBg.position = new Vector(0, 39 * 3); - serverDescEditBg.extent = new Vector(297 + 93, 35); - serverSettingsContainer.addChild(serverDescEditBg); - - var serverDescEdit = new GuiTextInput(markerFelt18); - serverDescEdit.position = new Vector(3, 3); - serverDescEdit.extent = new Vector(291 + 93, 29); - serverDescEdit.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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: " + curServerMaxPlayers; - maxPlayers.text.textColor = 0xFFFFFF; - maxPlayers.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - maxPlayers.position = new Vector(0, 39 * 4); - maxPlayers.extent = new Vector(206, 14); - serverSettingsContainer.addChild(maxPlayers); - - 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) -> { - 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) -> { - curServerMaxPlayers = Std.int(Math.min(8, curServerMaxPlayers + 1)); - maxPlayers.text.text = "Max Players: " + curServerMaxPlayers; - }; - serverSettingsContainer.addChild(playerPlus); - - var forceSpectators = new GuiText(markerFelt18); - forceSpectators.text.text = "Force Spectators:"; - forceSpectators.text.textColor = 0xFFFFFF; - forceSpectators.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - forceSpectators.position = new Vector(0, 39 * 5); - forceSpectators.extent = new Vector(206, 14); - serverSettingsContainer.addChild(forceSpectators); - - var forceSpectatorsChk = new GuiButton(loadButtonImages("data/ui/mp/lb_chkbx")); - forceSpectatorsChk.position = new Vector(359, 9 * 2 + 29 * 6 + 2); - forceSpectatorsChk.extent = new Vector(31, 31); - forceSpectatorsChk.buttonType = Toggle; - 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.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - quickRespawn.position = new Vector(0, 39 * 6); - quickRespawn.extent = new Vector(206, 14); - serverSettingsContainer.addChild(quickRespawn); - - var quickRespawnChk = new GuiButton(loadButtonImages("data/ui/mp/lb_chkbx")); - quickRespawnChk.position = new Vector(359, 9 * 3 + 29 * 7 + 4); - quickRespawnChk.extent = new Vector(31, 31); - quickRespawnChk.buttonType = Toggle; - quickRespawnChk.pressed = curServerQuickRespawn; - quickRespawnChk.pressedAction = (sender) -> { - curServerQuickRespawn = !curServerQuickRespawn; - }; - serverSettingsContainer.addChild(quickRespawnChk); - - var competitive = new GuiText(markerFelt18); - competitive.text.text = "Competitive Mode:"; - competitive.text.textColor = 0xFFFFFF; - competitive.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - competitive.position = new Vector(0, 39 * 7); - competitive.extent = new Vector(206, 14); - serverSettingsContainer.addChild(competitive); - - var competitiveChk = new GuiButton(loadButtonImages("data/ui/mp/lb_chkbx")); - competitiveChk.position = new Vector(359, 9 * 4 + 29 * 8 + 4); - competitiveChk.extent = new Vector(31, 31); - competitiveChk.buttonType = Toggle; - competitiveChk.pressed = curServerCompetitive; - competitiveChk.pressedAction = (sender) -> { - curServerCompetitive = !curServerCompetitive; - }; - serverSettingsContainer.addChild(competitiveChk); - - var oldSpawns = new GuiText(markerFelt18); - oldSpawns.text.text = "Old Spawns:"; - oldSpawns.text.textColor = 0xFFFFFF; - oldSpawns.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - oldSpawns.position = new Vector(0, 39 * 8); - oldSpawns.extent = new Vector(206, 14); - serverSettingsContainer.addChild(oldSpawns); - - var oldSpawnsChk = new GuiButton(loadButtonImages("data/ui/mp/lb_chkbx")); - oldSpawnsChk.position = new Vector(359, 9 * 5 + 29 * 9 + 4); - oldSpawnsChk.extent = new Vector(31, 31); - oldSpawnsChk.buttonType = Toggle; - oldSpawnsChk.pressed = curServerOldSpawns; - oldSpawnsChk.pressedAction = (sender) -> { - curServerOldSpawns = !curServerOldSpawns; - }; - serverSettingsContainer.addChild(oldSpawnsChk); - } -} diff --git a/src/gui/MainMenuGui.hx b/src/gui/MainMenuGui.hx index 0e17bb8c..1f16a315 100644 --- a/src/gui/MainMenuGui.hx +++ b/src/gui/MainMenuGui.hx @@ -1,44 +1,42 @@ package gui; -import h2d.filter.DropShadow; import src.MarbleGame; import gui.GuiControl.MouseState; import hxd.res.BitmapFont; import h3d.Vector; import src.ResourceLoader; import src.Settings; -import src.Util; -import src.Replay; -import src.Marbleland; -import src.MissionList; class MainMenuGui extends GuiImage { public function new() { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); + var img = ResourceLoader.getImage("data/ui/background.jpg"); super(img.resource.toTile()); var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); var domcasual32b = new BitmapFont(domcasual32fontdata.entry); @:privateAccess domcasual32b.loader = ResourceLoader.loader; - var domcasual32 = domcasual32b.toSdfFont(cast 42 * Settings.uiScale, MultiChannel); + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); this.horizSizing = Width; this.vertSizing = Height; this.position = new Vector(); this.extent = new Vector(640, 480); - var mainMenuContent = new GuiControl(); - mainMenuContent.horizSizing = Center; - mainMenuContent.vertSizing = Center; - mainMenuContent.position = new Vector(-130, -110); - mainMenuContent.extent = new Vector(900, 700); + var versionText = new GuiText(domcasual32); + + versionText.horizSizing = Center; + versionText.vertSizing = Top; + versionText.position = new Vector(289, 450); + versionText.extent = new Vector(62, 18); + versionText.text.text = "1.1.12"; + versionText.text.textColor = 0; + this.addChild(versionText); + + var homebase = new GuiImage(ResourceLoader.getResource("data/ui/home/homegui.png", ResourceLoader.getImage, this.imageResources).toTile()); + homebase.horizSizing = Center; + homebase.vertSizing = Center; + homebase.extent = new Vector(349, 477); + homebase.position = new Vector(145, 1); + this.addChild(homebase); function loadButtonImages(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -47,167 +45,40 @@ class MainMenuGui extends GuiImage { return [normal, hover, pressed]; } - function loadStaticButtonImages(path:String) { - var normal = ResourceLoader.getResource('${path}.png', ResourceLoader.getImage, this.imageResources).toTile(); - var hover = ResourceLoader.getResource('${path}.png', ResourceLoader.getImage, this.imageResources).toTile(); - var pressed = ResourceLoader.getResource('${path}.png', ResourceLoader.getImage, this.imageResources).toTile(); - return [normal, hover, pressed]; - } - - var siteButton = new GuiButton(loadButtonImages('data/ui/menu/site')); - siteButton.horizSizing = Right; - siteButton.vertSizing = Top; - siteButton.position = new Vector(363, 664); - siteButton.extent = new Vector(400, 30); - siteButton.pressedAction = (sender) -> { - #if sys - hxd.System.openURL("https://marbleblast.com"); - #end - #if js - js.Browser.window.open("https://marbleblast.com"); - #end - } - mainMenuContent.addChild(siteButton); - - var motdButton = new GuiButton(loadButtonImages('data/ui/menu/changelog')); - motdButton.horizSizing = Left; - motdButton.vertSizing = Top; - motdButton.position = new Vector(706, 536); - motdButton.extent = new Vector(191, 141); - motdButton.pressedAction = (sender) -> { - MarbleGame.canvas.pushDialog(new VersionGui()); - } - mainMenuContent.addChild(motdButton); - - var playButton = new GuiButton(loadButtonImages("data/ui/menu/play")); - playButton.position = new Vector(-5, -2); - playButton.extent = new Vector(247, 164); + var playButton = new GuiButton(loadButtonImages("data/ui/home/play")); + playButton.position = new Vector(50, 113); + playButton.extent = new Vector(270, 95); playButton.gamepadAccelerator = ["A"]; playButton.pressedAction = (sender) -> { cast(this.parent, Canvas).setContent(new PlayMissionGui()); } - mainMenuContent.addChild(playButton); + homebase.addChild(playButton); - var lbButton = new GuiButton(loadButtonImages("data/ui/menu/online")); - lbButton.position = new Vector(-5, 128); - lbButton.extent = new Vector(247, 164); - lbButton.pressedAction = (sender) -> { - MarbleGame.canvas.setContent(new JoinServerGui()); + var helpButton = new GuiButton(loadButtonImages("data/ui/home/help")); + helpButton.position = new Vector(59, 200); + helpButton.extent = new Vector(242, 84); + helpButton.pressedAction = (sender) -> { + MarbleGame.canvas.setContent(new HelpCreditsGui()); } - mainMenuContent.addChild(lbButton); + homebase.addChild(helpButton); - var optionsButton = new GuiButton(loadButtonImages("data/ui/menu/options")); - optionsButton.position = new Vector(-5, 258); - optionsButton.extent = new Vector(247, 164); + var optionsButton = new GuiButton(loadButtonImages("data/ui/home/options")); + optionsButton.position = new Vector(55, 279); + optionsButton.extent = new Vector(253, 83); optionsButton.pressedAction = (sender) -> { cast(this.parent, Canvas).setContent(new OptionsDlg()); } - mainMenuContent.addChild(optionsButton); + homebase.addChild(optionsButton); - #if hl - var exitButton = new GuiButton(loadButtonImages("data/ui/menu/quit")); - exitButton.position = new Vector(-5, 388); - exitButton.extent = new Vector(247, 164); + var exitButton = new GuiButton(loadButtonImages("data/ui/home/exit")); + exitButton.position = new Vector(82, 358); + exitButton.extent = new Vector(203, 88); exitButton.pressedAction = (sender) -> { #if hl Sys.exit(0); #end }; - mainMenuContent.addChild(exitButton); - #end - #if js - var exitButton = new GuiButton(loadButtonImages("data/ui/menu/download")); - exitButton.position = new Vector(-5, 388); - exitButton.extent = new Vector(247, 164); - exitButton.pressedAction = (sender) -> { - js.Browser.window.open("https://github.com/RandomityGuy/MBHaxe"); - }; - mainMenuContent.addChild(exitButton); - #end - - var replButton = new GuiButton(loadButtonImages("data/ui/menu/replay")); - replButton.horizSizing = Left; - replButton.vertSizing = Top; - replButton.position = new Vector(552, 536); - replButton.extent = new Vector(191, 141); - replButton.pressedAction = (sender) -> { - #if hl - MarbleGame.canvas.setContent(new ReplayCenterGui()); - #end - #if js - hxd.File.browse((replayToLoad) -> { - replayToLoad.load((replayData) -> { - var replay = new Replay(""); - if (!replay.read(replayData)) { - cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - // Idk do something to notify the user here - } else { - var repmis = replay.mission; - #if js - repmis = StringTools.replace(repmis, "data/", ""); - #end - if (MissionList.missions == null) - MissionList.buildMissionList(); - var mi = replay.customId == 0 ? MissionList.missions.get(repmis) : Marbleland.missions.get(replay.customId); - if (mi.isClaMission) { - mi.download(() -> { - MarbleGame.instance.watchMissionReplay(mi, replay, MainMenuGui); - }); - } else { - if (mi != null) { - cast(this.parent, Canvas).marbleGame.watchMissionReplay(mi, replay, MainMenuGui); - } else { - cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - } - } - } - }); - }, { - title: "Select replay file", - fileTypes: [ - { - name: "Replay (*.mbr)", - extensions: ["mbr"] - } - ], - }); - #end - }; - mainMenuContent.addChild(replButton); - - var helpButton = new GuiButton(loadButtonImages("data/ui/menu/help")); - helpButton.horizSizing = Left; - helpButton.vertSizing = Top; - helpButton.position = new Vector(398, 536); - helpButton.extent = new Vector(191, 141); - helpButton.pressedAction = (sender) -> { - MarbleGame.canvas.setContent(new HelpCreditsGui()); - } - mainMenuContent.addChild(helpButton); - - this.addChild(mainMenuContent); - - var mbp = new GuiImage(ResourceLoader.getResource("data/ui/menu/mbp.png", ResourceLoader.getImage, this.imageResources).toTile()); - mbp.horizSizing = Left; - mbp.vertSizing = Bottom; - mbp.position = new Vector(476, 12); - mbp.extent = new Vector(153, 150); - this.addChild(mbp); - - var versionText = new GuiMLText(domcasual32, null); - - versionText.horizSizing = Left; - versionText.vertSizing = Bottom; - versionText.position = new Vector(502, 61); - versionText.extent = new Vector(97, 72); - versionText.text.text = '

${MarbleGame.currentVersion}

'; - versionText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - this.addChild(versionText); + homebase.addChild(exitButton); var kofi = new GuiButton(loadButtonImages("data/ui/kofi1")); kofi.horizSizing = Left; @@ -238,44 +109,5 @@ class MainMenuGui extends GuiImage { #end } this.addChild(github); - - #if js - var mbg = new GuiButton(loadStaticButtonImages("data/ui/icon_mbg")); - mbg.horizSizing = Right; - mbg.vertSizing = Top; - mbg.position = new Vector(0, 380); - mbg.extent = new Vector(76, 76); - mbg.pressedAction = (sender) -> { - js.Browser.window.open("https://marbleblastgold.randomityguy.me"); - } - this.addChild(mbg); - - var mbu = new GuiButton(loadStaticButtonImages("data/ui/icon_mbu")); - mbu.horizSizing = Right; - mbu.vertSizing = Top; - mbu.position = new Vector(76, 380); - mbu.extent = new Vector(76, 76); - mbu.pressedAction = (sender) -> { - js.Browser.window.open("https://marbleblastultra.randomityguy.me"); - } - this.addChild(mbu); - #end - - #if js - var urlParams = new js.html.URLSearchParams(js.Browser.window.location.search); - var playParam = urlParams.get("app"); - if (playParam == "1" || playParam == "true") { - // Get people to download the native app instead! Bruh - if (!Util.isIOS()) { - // If we aren't on iOS, then only we force them to download the native app, since thats the only valid use of PWA in this case - haxe.Timer.delay(() -> { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Please download the native app for a better experience! The game will run better and smoother that way!", - () -> { - js.Browser.window.open("https://github.com/RandomityGuy/MBHaxe/blob/master/README.md"); - })); - }, 100); - } - } - #end } } diff --git a/src/gui/MessageBoxOkDlg.hx b/src/gui/MessageBoxOkDlg.hx index b18e679e..8fccd5e3 100644 --- a/src/gui/MessageBoxOkDlg.hx +++ b/src/gui/MessageBoxOkDlg.hx @@ -44,7 +44,7 @@ class MessageBoxOkDlg extends GuiControl { var okButton = new GuiButton(loadButtonImages("data/ui/common/ok")); okButton.position = new Vector(117, 85); - okButton.extent = new Vector(88, 41); + okButton.extent = new Vector(78, 59); okButton.vertSizing = Top; okButton.accelerator = hxd.Key.ENTER; okButton.gamepadAccelerator = ["A"]; diff --git a/src/gui/MessageBoxYesNoDlg.hx b/src/gui/MessageBoxYesNoDlg.hx index f85e98c0..3f05edfe 100644 --- a/src/gui/MessageBoxYesNoDlg.hx +++ b/src/gui/MessageBoxYesNoDlg.hx @@ -44,7 +44,7 @@ class MessageBoxYesNoDlg extends GuiControl { var yesButton = new GuiButton(loadButtonImages("data/ui/common/yes")); yesButton.position = new Vector(44, 94); - yesButton.extent = new Vector(82, 35); + yesButton.extent = new Vector(82, 47); yesButton.vertSizing = Top; yesButton.accelerator = hxd.Key.ENTER; yesButton.gamepadAccelerator = ["A"]; @@ -56,7 +56,7 @@ class MessageBoxYesNoDlg extends GuiControl { var noButton = new GuiButton(loadButtonImages("data/ui/common/no")); noButton.position = new Vector(151, 94); - noButton.extent = new Vector(75, 35); + noButton.extent = new Vector(75, 47); noButton.vertSizing = Top; noButton.accelerator = hxd.Key.ESCAPE; noButton.gamepadAccelerator = ["B"]; diff --git a/src/gui/OptionsDlg.hx b/src/gui/OptionsDlg.hx index eb4bc39d..ba49600a 100644 --- a/src/gui/OptionsDlg.hx +++ b/src/gui/OptionsDlg.hx @@ -1,9 +1,5 @@ package gui; -import haxe.DynamicAccess; -import hxd.BitmapData; -import h2d.filter.DropShadow; -import h2d.Text; import gui.GuiControl.MouseState; import src.AudioManager; import hxd.Key; @@ -20,23 +16,9 @@ import src.Settings; class OptionsDlg extends GuiImage { var musicSliderFunc:(dt:Float, mouseState:MouseState) -> Void; - public function new(pause:Bool = false) { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - if (!pause) - super(img.resource.toTile()); - else - super(tmpprevtile); + public function new() { + var img = ResourceLoader.getImage("data/ui/background.jpg"); + super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; this.position = new Vector(); @@ -54,348 +36,342 @@ class OptionsDlg extends GuiImage { return [normal, hover, pressed]; } - var window = new GuiImage(ResourceLoader.getResource("data/ui/options/window.png", ResourceLoader.getImage, this.imageResources).toTile()); - window.horizSizing = Center; - window.vertSizing = Center; - window.position = new Vector(-72, -47); - window.extent = new Vector(784, 573); - this.addChild(window); + var tabs = new GuiControl(); + tabs.horizSizing = Center; + tabs.vertSizing = Center; + tabs.position = new Vector(60, 15); + tabs.extent = new Vector(520, 450); + this.addChild(tabs); - var generalBtn = new GuiButton(loadButtonImages('data/ui/options/general')); - generalBtn.position = new Vector(102, 19); - generalBtn.extent = new Vector(134, 65); - window.addChild(generalBtn); + var setTab:String->Void = null; - var hotkeysBtn = new GuiButton(loadButtonImages('data/ui/options/hotkeys')); - hotkeysBtn.position = new Vector(325, 19); - hotkeysBtn.extent = new Vector(134, 65); - window.addChild(hotkeysBtn); + var graphicsTab = new GuiImage(ResourceLoader.getResource("data/ui/options/graf_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); + graphicsTab.position = new Vector(58, 44); + graphicsTab.extent = new Vector(149, 86); - var miscBtn = new GuiButton(loadButtonImages('data/ui/options/misc')); - miscBtn.position = new Vector(548, 19); - miscBtn.extent = new Vector(134, 65); - window.addChild(miscBtn); + var controlsTab = new GuiImage(ResourceLoader.getResource("data/ui/options/cntr_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); + controlsTab.position = new Vector(315, 15); + controlsTab.extent = new Vector(149, 65); - var generalPanel:GuiScrollCtrl = null; + var rewindTab = new GuiImage(ResourceLoader.getResource("data/ui/options/rwnd_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); + rewindTab.position = new Vector(459, 76); + rewindTab.extent = new Vector(59, 162); - var applyFunc:Void->Void = () -> { - generalPanel.scrollY = 0; - Settings.applySettings(); - }; + var boxFrame = new GuiImage(ResourceLoader.getResource("data/ui/options/options_base.png", ResourceLoader.getImage, this.imageResources).toTile()); + boxFrame.position = new Vector(25, 14); + boxFrame.extent = new Vector(470, 422); + boxFrame.horizSizing = Center; + boxFrame.vertSizing = Center; - var homeBtn = new GuiButton(loadButtonImages('data/ui/options/home')); - homeBtn.position = new Vector(292, 482); - homeBtn.extent = new Vector(94, 46); - homeBtn.pressedAction = (sender) -> { + var audioTab = new GuiImage(ResourceLoader.getResource("data/ui/options/aud_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); + audioTab.position = new Vector(204, 33); + audioTab.extent = new Vector(114, 75); + + tabs.addChild(audioTab); + tabs.addChild(controlsTab); + tabs.addChild(rewindTab); + tabs.addChild(boxFrame); + tabs.addChild(graphicsTab); + + var mainPane = new GuiControl(); + mainPane.position = new Vector(60, 15); + mainPane.extent = new Vector(520, 480); + mainPane.horizSizing = Center; + mainPane.vertSizing = Center; + this.addChild(mainPane); + + // GRAPHICS PANEL + var graphicsPane = new GuiControl(); + graphicsPane.position = new Vector(35, 110); + graphicsPane.extent = new Vector(438, 298); + + mainPane.addChild(graphicsPane); + var applyFunc:Void->Void = null; + + var mainMenuButton = new GuiButton(loadButtonImages("data/ui/options/mainm")); + mainMenuButton.position = new Vector(330, 356); + mainMenuButton.extent = new Vector(121, 53); + mainMenuButton.pressedAction = (sender) -> { applyFunc(); - if (!pause) - MarbleGame.canvas.setContent(new MainMenuGui()); + MarbleGame.canvas.setContent(new MainMenuGui()); + } + mainPane.addChild(mainMenuButton); + + // Hacky radio box logic + var windowBoxes = []; + + function updateWindowFunc(sender:GuiButton) { + for (box in windowBoxes) { + if (box != sender) + box.pressed = false; + } + } + + var gfxWindow = new GuiButton(loadButtonImages("data/ui/options/grafwindo")); + gfxWindow.position = new Vector(174, 116); + gfxWindow.extent = new Vector(97, 55); + gfxWindow.buttonType = Toggle; + gfxWindow.pressedAction = (sender) -> { + updateWindowFunc(gfxWindow); + } + if (!Settings.optionsSettings.isFullScreen) { + gfxWindow.pressed = true; + } + graphicsPane.addChild(gfxWindow); + windowBoxes.push(gfxWindow); + + var gfxFull = new GuiButton(loadButtonImages("data/ui/options/grafful")); + gfxFull.position = new Vector(288, 118); + gfxFull.extent = new Vector(61, 55); + gfxFull.buttonType = Toggle; + gfxFull.pressedAction = (sender) -> { + updateWindowFunc(gfxFull); + } + if (Settings.optionsSettings.isFullScreen) { + gfxFull.pressed = true; + } + graphicsPane.addChild(gfxFull); + windowBoxes.push(gfxFull); + + var gfxText = new GuiImage(ResourceLoader.getResource("data/ui/options/graf_txt.png", ResourceLoader.getImage, this.imageResources).toTile()); + gfxText.horizSizing = Right; + gfxText.vertSizing = Bottom; + gfxText.position = new Vector(12, 12); + gfxText.extent = new Vector(146, 261); + graphicsPane.addChild(gfxText); + + var resolutionBoxes = []; + + function updateResolutionFunc(sender:GuiButton) { + for (box in resolutionBoxes) { + if (box != sender) + box.pressed = false; + } + } + + var gfx640480 = new GuiButton(loadButtonImages("data/ui/options/graf640")); + gfx640480.position = new Vector(157, -3); + gfx640480.extent = new Vector(84, 53); + gfx640480.buttonType = Radio; + resolutionBoxes.push(gfx640480); + gfx640480.pressedAction = (sender) -> { + updateResolutionFunc(gfx640480); + } + graphicsPane.addChild(gfx640480); + if (Settings.optionsSettings.screenWidth == 640) + gfx640480.pressed = true; + + var gfx800600 = new GuiButton(loadButtonImages("data/ui/options/graf800")); + gfx800600.position = new Vector(237, 0); + gfx800600.extent = new Vector(86, 51); + gfx800600.buttonType = Radio; + resolutionBoxes.push(gfx800600); + gfx800600.pressedAction = (sender) -> { + updateResolutionFunc(gfx800600); + } + graphicsPane.addChild(gfx800600); + if (Settings.optionsSettings.screenWidth == 800) + gfx800600.pressed = true; + + var gfx1024768 = new GuiButton(loadButtonImages("data/ui/options/graf1024")); + gfx1024768.position = new Vector(320, -1); + gfx1024768.extent = new Vector(94, 51); + gfx1024768.buttonType = Radio; + resolutionBoxes.push(gfx1024768); + gfx1024768.pressedAction = (sender) -> { + updateResolutionFunc(gfx1024768); + } + if (Settings.optionsSettings.screenWidth == 1024) + gfx1024768.pressed = true; + graphicsPane.addChild(gfx1024768); + + var driverBoxes = []; + + function updateDriverFunc(sender:GuiButton) { + for (box in driverBoxes) { + if (box != sender) + box.pressed = false; + } + } + + var gfxopengl = new GuiButton(loadButtonImages("data/ui/options/grafopgl")); + gfxopengl.position = new Vector(165, 58); + gfxopengl.extent = new Vector(97, 54); + gfxopengl.buttonType = Radio; + driverBoxes.push(gfxopengl); + gfxopengl.pressedAction = (sender) -> { + updateDriverFunc(gfxopengl); + } + if (Settings.optionsSettings.videoDriver == 0) { + gfxopengl.pressed = true; + } + graphicsPane.addChild(gfxopengl); + + var gfxd3d = new GuiButton(loadButtonImages("data/ui/options/grafdir3d")); + gfxd3d.position = new Vector(270, 59); + gfxd3d.extent = new Vector(104, 52); + gfxd3d.buttonType = Radio; + driverBoxes.push(gfxd3d); + gfxd3d.pressedAction = (sender) -> { + updateDriverFunc(gfxd3d); + } + if (Settings.optionsSettings.videoDriver == 1) { + gfxd3d.pressed = true; + } + graphicsPane.addChild(gfxd3d); + + var applyButton = new GuiButton(loadButtonImages("data/ui/options/grafapply")); + applyButton.position = new Vector(188, 239); + applyButton.extent = new Vector(106, 60); + applyButton.pressedAction = (sender) -> applyFunc(); + graphicsPane.addChild(applyButton); + + var bitBoxes = []; + + function updateBitsFunc(sender:GuiButton) { + for (box in bitBoxes) { + if (box != sender) + box.pressed = false; + } + } + + var gfx16 = new GuiButton(loadButtonImages("data/ui/options/graf16bt")); + gfx16.position = new Vector(179, 170); + gfx16.extent = new Vector(79, 54); + gfx16.buttonType = Radio; + bitBoxes.push(gfx16); + gfx16.pressedAction = (sender) -> { + updateBitsFunc(gfx16); + } + if (Settings.optionsSettings.colorDepth == 0) { + gfx16.pressed = true; + } + graphicsPane.addChild(gfx16); + + var gfx32 = new GuiButton(loadButtonImages("data/ui/options/graf32bt")); + gfx32.position = new Vector(272, 174); + gfx32.extent = new Vector(84, 51); + gfx32.buttonType = Radio; + bitBoxes.push(gfx32); + gfx32.pressedAction = (sender) -> { + updateBitsFunc(gfx32); + } + if (Settings.optionsSettings.colorDepth == 1) { + gfx32.pressed = true; + } + graphicsPane.addChild(gfx32); + + var shadowsButton = new GuiButton(loadButtonImages("data/ui/options/graf_chkbx")); + shadowsButton.position = new Vector(141, 233); + shadowsButton.extent = new Vector(46, 54); + shadowsButton.buttonType = Toggle; + graphicsPane.addChild(shadowsButton); + if (Settings.optionsSettings.shadows) { + shadowsButton.pressed = true; + } + + // AUDIO PANEL + + var audioPane = new GuiControl(); + audioPane.position = new Vector(41, 91); + audioPane.extent = new Vector(425, 281); + // mainPane.addChild(audioPane); + + var audSndSlide = new GuiImage(ResourceLoader.getResource("data/ui/options/aud_snd_slide.png", ResourceLoader.getImage, this.imageResources).toTile()); + audSndSlide.position = new Vector(14, 92); + audSndSlide.extent = new Vector(388, 34); + audioPane.addChild(audSndSlide); + + var audMusSlide = new GuiImage(ResourceLoader.getResource("data/ui/options/aud_mus_slide.png", ResourceLoader.getImage, this.imageResources).toTile()); + audMusSlide.position = new Vector(17, 32); + audMusSlide.extent = new Vector(381, 40); + audioPane.addChild(audMusSlide); + + var audMusKnob = new GuiSlider(ResourceLoader.getResource("data/ui/options/aud_mus_knb.png", ResourceLoader.getImage, this.imageResources).toTile()); + audMusKnob.position = new Vector(137, 37); + audMusKnob.extent = new Vector(250, 34); + audMusKnob.sliderValue = Settings.optionsSettings.musicVolume; + audMusKnob.pressedAction = (sender) -> { + Settings.optionsSettings.musicVolume = audMusKnob.sliderValue; + } + audioPane.addChild(audMusKnob); + + var audSndKnob = new GuiSlider(ResourceLoader.getResource("data/ui/options/aud_snd_knb.png", ResourceLoader.getImage, this.imageResources).toTile()); + audSndKnob.position = new Vector(137, 95); + audSndKnob.extent = new Vector(254, 37); + audSndKnob.sliderValue = Settings.optionsSettings.soundVolume; + var testingSnd = AudioManager.playSound(ResourceLoader.getResource("data/sound/testing.wav", ResourceLoader.getAudio, this.soundResources), null, true); + testingSnd.pause = true; + audSndKnob.slidingSound = testingSnd; + audSndKnob.pressedAction = (sender) -> { + Settings.optionsSettings.soundVolume = audSndKnob.sliderValue; + } + audioPane.addChild(audSndKnob); + + musicSliderFunc = (dt:Float, mouseState:MouseState) -> { + if (mouseState.button == Key.MOUSE_LEFT) { + var musRect = audMusKnob.getRenderRectangle(); + if (musRect.inRect(mouseState.position)) { + Settings.optionsSettings.musicVolume = audMusKnob.sliderValue; + AudioManager.updateVolumes(); + } + var sndRect = audSndKnob.getRenderRectangle(); + if (sndRect.inRect(mouseState.position)) { + Settings.optionsSettings.soundVolume = audSndKnob.sliderValue; + AudioManager.updateVolumes(); + } + } + } + + var audTxtWndo = new GuiImage(ResourceLoader.getResource("data/ui/options/aud_txt_wndo.png", ResourceLoader.getImage, this.imageResources).toTile()); + audTxtWndo.position = new Vector(26, 130); + audTxtWndo.extent = new Vector(396, 132); + audioPane.addChild(audTxtWndo); + + var audInfo = new GuiText(arial14); + audInfo.position = new Vector(24, 41); + audInfo.extent = new Vector(330, 56); + audInfo.text.textColor = 0x000000; + audInfo.text.text = "Vendor: Creative Labs Inc. +Version: OpenAL 1.0 +Renderer: Software +Extensions: EAX 2.0, EAX 3.0, EAX Unified, and EAX-AC3"; + audTxtWndo.addChild(audInfo); + + applyFunc = () -> { + if (gfx640480.pressed) { + Settings.optionsSettings.screenWidth = 640; + Settings.optionsSettings.screenHeight = 480; + } + if (gfx800600.pressed) { + Settings.optionsSettings.screenWidth = 800; + Settings.optionsSettings.screenHeight = 600; + } + if (gfx1024768.pressed) { + Settings.optionsSettings.screenWidth = 1024; + Settings.optionsSettings.screenHeight = 768; + } + if (gfxFull.pressed) + Settings.optionsSettings.isFullScreen = true; else - MarbleGame.canvas.popDialog(this); - } - window.addChild(homeBtn); + Settings.optionsSettings.isFullScreen = false; + if (gfx16.pressed) + Settings.optionsSettings.colorDepth = 0; + else + Settings.optionsSettings.colorDepth = 1; + if (gfxopengl.pressed) + Settings.optionsSettings.videoDriver = 0; + else + Settings.optionsSettings.videoDriver = 1; + Settings.optionsSettings.shadows = shadowsButton.pressed; - var applyBtn = new GuiButton(loadButtonImages('data/ui/options/apply')); - applyBtn.position = new Vector(398, 482); - applyBtn.extent = new Vector(94, 46); - applyBtn.pressedAction = (sender) -> { - applyFunc(); - } - window.addChild(applyBtn); + Settings.optionsSettings.musicVolume = audMusKnob.sliderValue; + Settings.optionsSettings.soundVolume = audSndKnob.sliderValue; - generalPanel = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile()); - generalPanel.position = new Vector(30, 88); - generalPanel.extent = new Vector(726, 364); - generalPanel.maxScrollY = 394 * Settings.uiScale; - window.addChild(generalPanel); - - var currentTab = "general"; - - var hotkeysPanel = new GuiControl(); - hotkeysPanel.position = new Vector(30, 88); - hotkeysPanel.extent = new Vector(726, 394); - - var miscPanel = new GuiControl(); - miscPanel.position = new Vector(30, 88); - miscPanel.extent = new Vector(726, 394); - - 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 18 * Settings.uiScale, MultiChannel); - var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); - - var optBtns = []; - var optSliders = []; - - var transparentbmp = new hxd.BitmapData(1, 1); - transparentbmp.setPixel(0, 0, 0); - var transparentTile = Tile.fromBitmap(transparentbmp); - - var currentDropDown:GuiImage = null; - - function setAllBtnState(enabled:Bool) { - for (b in optBtns) { - b.disabled = !enabled; - } - for (s in optSliders) { - s.enabled = enabled; - } + Settings.applySettings(); } - window.pressedAction = (sender) -> { - if (currentDropDown != null) { - var dropdownparent = currentDropDown.parent; - currentDropDown.parent.removeChild(currentDropDown); - currentDropDown = null; - if (dropdownparent is GuiScrollCtrl) - cast(dropdownparent, GuiScrollCtrl).enabled = true; - haxe.Timer.delay(() -> setAllBtnState(true), 5); // delay this a bit to avoid update(); - } - } - - function makeOption(text:String, valueFunc:Void->String, yPos:Float, parent:GuiControl, size:String, options:Array, onSelect:Int->Void, - right:Bool = false, smallfont:Bool = false) { - var textObj = new GuiText(smallfont ? markerFelt24 : markerFelt32); - textObj.position = new Vector(right ? 388 : 7, yPos); - textObj.extent = new Vector(212, 14); - textObj.text.text = text; - textObj.text.textColor = 0xFFFFFF; - textObj.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - parent.addChild(textObj); - - var optDropdownImg = new GuiImage(ResourceLoader.getResource('data/ui/options/dropdown-${size}.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - - var dropDownYPos = yPos + 39; - - optDropdownImg.position = new Vector(right ? 552 : 222, yPos + 39); - optDropdownImg.extent = new Vector(163, 79 + switch (size) { - case 'small': 0; - case 'medium': 20; - case 'large': 42; - case 'xlarge': 97; - default: 0; - }); - - var optDropdown = new GuiButtonText(loadButtonImages('data/ui/options/dropdown'), markerFelt24); - optDropdown.position = new Vector(right ? 552 : 222, yPos - 12); - optDropdown.setExtent(new Vector(163, 56)); - optDropdown.txtCtrl.text.text = valueFunc(); - optDropdown.txtCtrl.text.textColor = 0; - optDropdown.pressedAction = (sender) -> { - if (currentDropDown == null) { - var pScroll = parent.getRenderRectangle(); - optDropdownImg.position.y = dropDownYPos - pScroll.scroll.y; - parent.addChild(optDropdownImg); - optDropdownImg.render(MarbleGame.canvas.scene2d, @:privateAccess parent._flow); - currentDropDown = optDropdownImg; - if (parent is GuiScrollCtrl) - cast(parent, GuiScrollCtrl).enabled = false; - setAllBtnState(false); - return; - } - if (currentDropDown == optDropdownImg) { - parent.removeChild(optDropdownImg); - currentDropDown = null; - haxe.Timer.delay(() -> { - setAllBtnState(true); - if (parent is GuiScrollCtrl) - cast(parent, GuiScrollCtrl).enabled = true; - }, 5); // delay this a bit to avoid update(); - return; - } - } - parent.addChild(optDropdown); - - var optDropdownList = new GuiTextListCtrl(markerFelt24, options); - optDropdownList.position = new Vector(11, 15); - optDropdownList.extent = new Vector(135, 47 + switch (size) { - case 'small': 0; - case 'medium': 20; - case 'large': 42; - case 'xlarge': 97; - default: 0; - }); - optDropdownList.scrollable = true; - optDropdownList.textYOffset = -5; - optDropdownList.onSelectedFunc = (idx) -> { - onSelect(idx); - optDropdown.txtCtrl.text.text = valueFunc(); - }; - optDropdownImg.addChild(optDropdownList); - - optBtns.push(optDropdown); - } - - function makeSlider(text:String, value:Float, yPos:Float, parent:GuiControl, onChange:Float->Void, right:Bool = false, smallfont:Bool = false) { - var textObj = new GuiText(smallfont ? markerFelt24 : markerFelt32); - textObj.position = new Vector(right ? 388 : 7, yPos); - textObj.extent = new Vector(212, 14); - textObj.text.text = text; - textObj.text.textColor = 0xFFFFFF; - textObj.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - parent.addChild(textObj); - - var sliderBar = new GuiImage(ResourceLoader.getResource("data/ui/options/bar.png", ResourceLoader.getImage, this.imageResources).toTile()); - sliderBar.position = new Vector(right ? 552 : 226, yPos + 3 + 5); - sliderBar.extent = new Vector(154, 19); - parent.addChild(sliderBar); - - var optSlider = new GuiSlider(ResourceLoader.getResource("data/ui/options/slider.png", ResourceLoader.getImage, this.imageResources).toTile()); - optSlider.position = new Vector(right ? 550 : 220, yPos - 8 + 5); - optSlider.extent = new Vector(150, 41); - optSlider.sliderValue = value; - optSlider.pressedAction = (sender) -> { - onChange(optSlider.sliderValue); - } - parent.addChild(optSlider); - - optSliders.push(optSlider); - } - - var yPos = 18; - - makeOption("Screen Resolution:", () -> '${Settings.optionsSettings.screenWidth} x ${Settings.optionsSettings.screenHeight}', yPos, generalPanel, - "xlarge", [ - "1024 x 800", - "1280 x 720", - "1366 x 768", - "1440 x 900", - "1600 x 900", - "1920 x 1080" - ], (idx) -> { - switch (idx) { - case 0: - Settings.optionsSettings.screenWidth = 1024; - Settings.optionsSettings.screenHeight = 800; - case 1: - Settings.optionsSettings.screenWidth = 1280; - Settings.optionsSettings.screenHeight = 720; - case 2: - Settings.optionsSettings.screenWidth = 1366; - Settings.optionsSettings.screenHeight = 768; - case 3: - Settings.optionsSettings.screenWidth = 1440; - Settings.optionsSettings.screenHeight = 900; - case 4: - Settings.optionsSettings.screenWidth = 1600; - Settings.optionsSettings.screenHeight = 900; - case 5: - Settings.optionsSettings.screenWidth = 1920; - Settings.optionsSettings.screenHeight = 1080; - } - }); - makeOption("Screen Style:", () -> '${Settings.optionsSettings.isFullScreen ? "Full Screen" : "Windowed"}', yPos, generalPanel, "small", - ["Windowed", "Full Screen"], (idx) -> { - Settings.optionsSettings.isFullScreen = idx == 1; - }, true); - - yPos += 56; - - makeOption("Frame Rate:", () -> '${Settings.optionsSettings.frameRateVis ? "Visible" : "Hidden"}', yPos, generalPanel, "small", ["Visible", "Hidden"], - (idx) -> { - Settings.optionsSettings.frameRateVis = idx == 0; - }); - makeOption("OoB Insults:", () -> '${Settings.optionsSettings.oobInsults ? "Enabled" : "Disabled"}', yPos, generalPanel, "small", - ["Disabled", "Enabled"], (idx) -> { - Settings.optionsSettings.oobInsults = idx == 1; - }, true); - - yPos += 56; - - makeOption("Free-Look:", () -> '${Settings.controlsSettings.alwaysFreeLook ? "Enabled" : "Disabled"}', yPos, generalPanel, "small", - ["Disabled", "Enabled"], (idx) -> { - Settings.controlsSettings.alwaysFreeLook = idx == 1; - }); - makeOption("Invert Y:", () -> '${Settings.controlsSettings.invertYAxis ? "Yes" : "No"}', yPos, generalPanel, "small", ["No", "Yes"], (idx) -> { - Settings.controlsSettings.invertYAxis = idx == 1; - }, true); - - yPos += 56; - - makeOption("Reflective Marble:", () -> '${Settings.optionsSettings.reflectiveMarble ? "Enabled" : "Disabled"}', yPos, generalPanel, "small", - ["Disabled", "Enabled"], (idx) -> { - Settings.optionsSettings.reflectiveMarble = idx == 1; - }); - #if hl - makeOption("FPS:", () -> { - if (Settings.optionsSettings.vsync) - return "VSync"; - if (Settings.optionsSettings.fpsLimit == -1) - return "Unlimited"; - return '${Math.floor(Settings.optionsSettings.fpsLimit)}'; - }, yPos, generalPanel, "xlarge", - ["VSync", "60", "120", "200", "500", "Unlimited"], (idx) -> { - switch (idx) { - case 0: - Settings.optionsSettings.vsync = true; - case 1: - Settings.optionsSettings.fpsLimit = 60; - Settings.optionsSettings.vsync = false; - case 2: - Settings.optionsSettings.fpsLimit = 120; - Settings.optionsSettings.vsync = false; - case 3: - Settings.optionsSettings.fpsLimit = 200; - Settings.optionsSettings.vsync = false; - case 4: - Settings.optionsSettings.fpsLimit = 500; - Settings.optionsSettings.vsync = false; - case 5: - Settings.optionsSettings.fpsLimit = -1; - Settings.optionsSettings.vsync = false; - } - }, true); - #end - #if js - makeOption("Vertical Sync:", () -> '${Settings.optionsSettings.vsync ? "Enabled" : "Disabled"}', yPos, generalPanel, "small", ["Disabled", "Enabled"], - (idx) -> { - Settings.optionsSettings.vsync = idx == 1; - }, true); - #end - - yPos += 56; - - makeOption("Rewind:", () -> '${Settings.optionsSettings.rewindEnabled ? "Enabled" : "Disabled"}', yPos, generalPanel, "small", - ["Disabled", "Enabled"], (idx) -> { - Settings.optionsSettings.rewindEnabled = idx == 1; - }, false); - - makeSlider("Rewind Speed:", (Settings.optionsSettings.rewindTimescale - 0.1) / (1 - 0.1), yPos, generalPanel, (val) -> { - Settings.optionsSettings.rewindTimescale = cast(0.1 + val * (1 - 0.1)); - }, true); - - yPos += 56; - - makeSlider("Music Volume:", Settings.optionsSettings.musicVolume, yPos, generalPanel, (val) -> { - Settings.optionsSettings.musicVolume = val; - AudioManager.updateVolumes(); - }); - makeSlider("Sound Volume:", Settings.optionsSettings.soundVolume, yPos, generalPanel, (val) -> { - Settings.optionsSettings.soundVolume = val; - AudioManager.updateVolumes(); - }, true); - - yPos += 56; - - makeSlider("Field of View:", (Settings.optionsSettings.fovX - 60) / (140 - 60), yPos, generalPanel, (val) -> { - Settings.optionsSettings.fovX = cast(60 + val * (140 - 60)); - }); - makeSlider("Mouse Speed:", (Settings.controlsSettings.cameraSensitivity - 0.12) / (1.2 - 0.12), yPos, generalPanel, (val) -> { - Settings.controlsSettings.cameraSensitivity = cast(0.12 + val * (1.2 - 0.12)); - }, true); + // REWIND PANEL function getConflictingBinding(bindingName:String, key:Int) { if (Settings.controlsSettings.forward == key && bindingName != "Move Forward") @@ -450,280 +426,368 @@ class OptionsDlg extends GuiImage { } } - function makeRemapOption(text:String, yPos:Int, defaultVal:String, bindingFunc:Int->Void, parent:GuiControl, right:Bool = false) { - var textObj = new GuiText(markerFelt32); - textObj.position = new Vector(right ? 368 : 5, yPos); - textObj.extent = new Vector(212, 14); - textObj.text.text = text; - textObj.text.textColor = 0xFFFFFF; - textObj.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - parent.addChild(textObj); + var rewindPane = new GuiControl(); + rewindPane.position = new Vector(41, 91); + rewindPane.extent = new Vector(425, 281); - var remapBtn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); - remapBtn.position = new Vector(right ? 363 + 203 : 203, yPos - 3); - remapBtn.txtCtrl.text.text = defaultVal; - remapBtn.setExtent(new Vector(152, 49)); - remapBtn.pressedAction = (sender) -> { - remapFunc(text, bindingFunc, remapBtn); - } + var rwndTimescaleSlide = new GuiImage(ResourceLoader.getResource("data/ui/options/rwnd_timescale.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + rwndTimescaleSlide.position = new Vector(29, 44); + rwndTimescaleSlide.extent = new Vector(381, 33); + rewindPane.addChild(rwndTimescaleSlide); - parent.addChild(remapBtn); + var rwndTxt = new GuiImage(ResourceLoader.getResource("data/ui/options/rwnd_txt.png", ResourceLoader.getImage, this.imageResources).toTile()); + rwndTxt.position = new Vector(32, 83); + rwndTxt.extent = new Vector(146, 261); + rewindPane.addChild(rwndTxt); + + var rewindTimescaleKnob = new GuiSlider(ResourceLoader.getResource("data/ui/options/aud_mus_knb.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + rewindTimescaleKnob.position = new Vector(144, 44); + rewindTimescaleKnob.extent = new Vector(250, 34); + rewindTimescaleKnob.sliderValue = (Settings.optionsSettings.rewindTimescale - 0.1) / (1 - 0.1); + rewindTimescaleKnob.pressedAction = (sender) -> { + Settings.optionsSettings.rewindTimescale = cast(0.1 + rewindTimescaleKnob.sliderValue * (1 - 0.1)); + } + rewindPane.addChild(rewindTimescaleKnob); + + var rewindBtn = new GuiButtonText(loadButtonImages("data/ui/options/cntr_rwnd"), arial14); + rewindBtn.position = new Vector(142, 122); + rewindBtn.setExtent(new Vector(118, 48)); + rewindBtn.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.rewind); + rewindBtn.pressedAction = (sender) -> { + remapFunc("Rewind", (key) -> Settings.controlsSettings.rewind = key, rewindBtn); + } + rewindPane.addChild(rewindBtn); + + var rwndEnableButton = new GuiButton(loadButtonImages("data/ui/options/graf_chkbx")); + rwndEnableButton.position = new Vector(112, 72); + + rwndEnableButton.extent = new Vector(46, 54); + rwndEnableButton.buttonType = Toggle; + rwndEnableButton.pressedAction = (sender) -> { + Settings.optionsSettings.rewindEnabled = !rwndEnableButton.pressed; + } + rewindPane.addChild(rwndEnableButton); + if (Settings.optionsSettings.rewindEnabled) { + rwndEnableButton.pressed = true; } - function makeButton(text:String, yPos:Int, buttonText:String, pressedAction:() -> Void, parent:GuiControl, right:Bool = false) { - var textObj = new GuiText(markerFelt32); - textObj.position = new Vector(right ? 368 : 5, yPos); - textObj.extent = new Vector(212, 14); - textObj.text.text = text; - textObj.text.textColor = 0xFFFFFF; - textObj.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - parent.addChild(textObj); + // CONTROLS PANEL + var controlsPane = new GuiControl(); + controlsPane.position = new Vector(44, 58); + controlsPane.extent = new Vector(459, 339); + // MARBLE PANEL + var marbleControlsPane = new GuiImage(ResourceLoader.getResource("data/ui/options/cntrl_marb_bse.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + marbleControlsPane.position = new Vector(0, 5); + marbleControlsPane.extent = new Vector(438, 320); + controlsPane.addChild(marbleControlsPane); - var btn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); - btn.position = new Vector(right ? 363 + 203 : 203, yPos - 3); - btn.txtCtrl.text.text = buttonText; - btn.setExtent(new Vector(152, 49)); - btn.pressedAction = (sender) -> { - pressedAction(); - } + var cameraControlsPane:GuiImage = null; + var mouseControlsPane:GuiImage = null; - parent.addChild(btn); + var moveForward = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_fw"), arial14); + moveForward.position = new Vector(82, 104); + moveForward.setExtent(new Vector(117, 51)); + moveForward.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.forward); + moveForward.pressedAction = (sender) -> { + remapFunc("Move Forward", (key) -> Settings.controlsSettings.forward = key, moveForward); + } + marbleControlsPane.addChild(moveForward); + + var moveRight = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_rt"), arial14); + moveRight.position = new Vector(230, 167); + moveRight.setExtent(new Vector(112, 45)); + moveRight.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.right); + moveRight.pressedAction = (sender) -> { + remapFunc("Move Right", (key) -> Settings.controlsSettings.right = key, moveRight); + } + marbleControlsPane.addChild(moveRight); + + var mouseFire = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_pwr"), arial14); + mouseFire.position = new Vector(310, 84); + mouseFire.setExtent(new Vector(120, 51)); + mouseFire.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.powerup); + mouseFire.pressedAction = (sender) -> { + remapFunc("Use PowerUp", (key) -> Settings.controlsSettings.powerup = key, mouseFire); + } + marbleControlsPane.addChild(mouseFire); + + var moveBackward = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_bak"), arial14); + moveBackward.position = new Vector(135, 235); + moveBackward.setExtent(new Vector(118, 48)); + moveBackward.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.backward); + moveBackward.pressedAction = (sender) -> { + remapFunc("Move Backward", (key) -> Settings.controlsSettings.backward = key, moveBackward); + } + marbleControlsPane.addChild(moveBackward); + + var moveLeft = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_lft"), arial14); + moveLeft.position = new Vector(19, 189); + moveLeft.setExtent(new Vector(108, 45)); + moveLeft.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.left); + moveLeft.pressedAction = (sender) -> { + remapFunc("Move Left", (key) -> Settings.controlsSettings.left = key, moveLeft); + } + marbleControlsPane.addChild(moveLeft); + + var moveJmp = new GuiButtonText(loadButtonImages("data/ui/options/cntr_mrb_jmp"), arial14); + moveJmp.position = new Vector(299, 231); + moveJmp.setExtent(new Vector(120, 47)); + moveJmp.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.jump); + moveJmp.pressedAction = (sender) -> { + remapFunc("Jump", (key) -> Settings.controlsSettings.jump = key, moveJmp); + } + marbleControlsPane.addChild(moveJmp); + + var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual24b = new BitmapFont(domcasual24fontdata.entry); + @:privateAccess domcasual24b.loader = ResourceLoader.loader; + var domcasual24 = domcasual24b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + + var transparentbmp = new hxd.BitmapData(1, 1); + transparentbmp.setPixel(0, 0, 0); + var transparentTile = Tile.fromBitmap(transparentbmp); + + var marbleToCameraButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + marbleToCameraButton.position = new Vector(138, 26); + marbleToCameraButton.extent = new Vector(121, 40); + marbleToCameraButton.pressedAction = (sender) -> { + controlsPane.removeChild(marbleControlsPane); + controlsPane.addChild(cameraControlsPane); + this.render(cast(this.parent, Canvas).scene2d); + } + marbleControlsPane.addChild(marbleToCameraButton); + + var marbleToMouseButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + marbleToMouseButton.position = new Vector(277, 0); + marbleToMouseButton.extent = new Vector(121, 43); + marbleToMouseButton.pressedAction = (sender) -> { + controlsPane.addChild(mouseControlsPane); + controlsPane.removeChild(marbleControlsPane); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); + } + marbleControlsPane.addChild(marbleToMouseButton); + + // CAMERA PANEL + cameraControlsPane = new GuiImage(ResourceLoader.getResource("data/ui/options/cntrl_cam_bse.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + cameraControlsPane.position = new Vector(0, 5); + cameraControlsPane.extent = new Vector(438, 320); + + var panUp = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_up"), arial14); + panUp.position = new Vector(29, 133); + panUp.setExtent(new Vector(108, 42)); + panUp.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.camForward); + panUp.pressedAction = (sender) -> { + remapFunc("Rotate Camera Up", (key) -> Settings.controlsSettings.camForward = key, panUp); + } + cameraControlsPane.addChild(panUp); + + var turnRight = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_rt"), arial14); + turnRight.position = new Vector(312, 99); + turnRight.setExtent(new Vector(103, 36)); + turnRight.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.camRight); + turnRight.pressedAction = (sender) -> { + remapFunc("Rotate Camera Right", (key) -> Settings.controlsSettings.camRight = key, turnRight); + } + cameraControlsPane.addChild(turnRight); + + var panDown = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_dwn"), arial14); + panDown.position = new Vector(42, 213); + panDown.setExtent(new Vector(109, 39)); + panDown.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.camBackward); + panDown.pressedAction = (sender) -> { + remapFunc("Rotate Camera Down", (key) -> Settings.controlsSettings.camBackward = key, panDown); + } + cameraControlsPane.addChild(panDown); + + var turnLeft = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_lft"), arial14); + turnLeft.position = new Vector(319, 210); + turnLeft.setExtent(new Vector(99, 36)); + turnLeft.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.camLeft); + turnLeft.pressedAction = (sender) -> { + remapFunc("Rotate Camera Left", (key) -> Settings.controlsSettings.camLeft = key, turnLeft); + } + cameraControlsPane.addChild(turnLeft); + + var cameraToMarbleButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + cameraToMarbleButton.position = new Vector(13, 45); + cameraToMarbleButton.extent = new Vector(121, 40); + cameraToMarbleButton.pressedAction = (sender) -> { + controlsPane.addChild(marbleControlsPane); + controlsPane.removeChild(cameraControlsPane); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); + } + cameraControlsPane.addChild(cameraToMarbleButton); + + var cameraToMouseButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + cameraToMouseButton.position = new Vector(276, 7); + cameraToMouseButton.extent = new Vector(121, 40); + cameraToMouseButton.pressedAction = (sender) -> { + controlsPane.addChild(mouseControlsPane); + controlsPane.removeChild(cameraControlsPane); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); + } + cameraControlsPane.addChild(cameraToMouseButton); + + // MOUSE CONTROLS + + mouseControlsPane = new GuiImage(ResourceLoader.getResource("data/ui/options/cntrl_mous_base.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + mouseControlsPane.position = new Vector(-17, -47); + mouseControlsPane.extent = new Vector(470, 425); + + var freelook = new GuiButtonText(loadButtonImages("data/ui/options/cntrl_mous_bttn"), arial14); + freelook.position = new Vector(219, 225); + freelook.setExtent(new Vector(105, 45)); + freelook.txtCtrl.text.text = Util.getKeyForButton2(Settings.controlsSettings.freelook); + freelook.pressedAction = (sender) -> { + remapFunc("Free Look", (key) -> Settings.controlsSettings.freelook = key, freelook); } + mouseControlsPane.addChild(freelook); + + var mouseToMarbleButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + mouseToMarbleButton.position = new Vector(26, 95); + mouseToMarbleButton.extent = new Vector(121, 40); + mouseToMarbleButton.pressedAction = (sender) -> { + controlsPane.addChild(marbleControlsPane); + controlsPane.removeChild(mouseControlsPane); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); + } + mouseControlsPane.addChild(mouseToMarbleButton); + + var mouseToCameraButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + mouseToCameraButton.position = new Vector(153, 71); + mouseToCameraButton.extent = new Vector(121, 40); + mouseToCameraButton.pressedAction = (sender) -> { + controlsPane.addChild(cameraControlsPane); + controlsPane.removeChild(mouseControlsPane); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); + } + mouseControlsPane.addChild(mouseToCameraButton); + + var invertAxis = new GuiButton(loadButtonImages("data/ui/options/cntrl_mous_invrt")); + invertAxis.position = new Vector(95, 249); + invertAxis.extent = new Vector(43, 53); + invertAxis.buttonType = Toggle; + invertAxis.pressed = Settings.controlsSettings.invertYAxis; + invertAxis.pressedAction = (sender) -> { + Settings.controlsSettings.invertYAxis = !Settings.controlsSettings.invertYAxis; + } + mouseControlsPane.addChild(invertAxis); + + var alwaysFreelook = new GuiButton(loadButtonImages("data/ui/options/cntrl_mous_freel")); + alwaysFreelook.position = new Vector(365, 269); + alwaysFreelook.extent = new Vector(43, 53); + alwaysFreelook.buttonType = Toggle; + alwaysFreelook.pressed = Settings.controlsSettings.alwaysFreeLook; + alwaysFreelook.pressedAction = (sender) -> { + Settings.controlsSettings.alwaysFreeLook = !Settings.controlsSettings.alwaysFreeLook; + } + mouseControlsPane.addChild(alwaysFreelook); + + var mouseSensitivity = new GuiSlider(ResourceLoader.getResource("data/ui/options/cntrl_mous_knb.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + mouseSensitivity.position = new Vector(147, 148); + mouseSensitivity.extent = new Vector(254, 34); + mouseSensitivity.sliderValue = (Settings.controlsSettings.cameraSensitivity - 0.12) / (1.2 - 0.12); + mouseSensitivity.pressedAction = (sender) -> { + Settings.controlsSettings.cameraSensitivity = 0.12 + (1.2 - 0.12) * mouseSensitivity.sliderValue; + } + mouseControlsPane.addChild(mouseSensitivity); + + // INVISIBLE BUTTON SHIT + var audioTabBtn = new GuiButton([transparentTile, transparentTile, transparentTile]); + audioTabBtn.position = new Vector(213, 39); + audioTabBtn.extent = new Vector(92, 42); + audioTabBtn.pressedAction = (sender) -> setTab("Audio"); + mainPane.addChild(audioTabBtn); + + var controlsTabBtn = new GuiButton([transparentTile, transparentTile, transparentTile]); + controlsTabBtn.position = new Vector(331, 24); + controlsTabBtn.extent = new Vector(117, 42); + controlsTabBtn.pressedAction = (sender) -> setTab("Controls"); + mainPane.addChild(controlsTabBtn); + + var graphicsTabBtn = new GuiButton([transparentTile, transparentTile, transparentTile]); + graphicsTabBtn.position = new Vector(70, 48); + graphicsTabBtn.extent = new Vector(117, 48); + graphicsTabBtn.pressedAction = (sender) -> setTab("Graphics"); + mainPane.addChild(graphicsTabBtn); + + var rewindTabBtn = new GuiButton([transparentTile, transparentTile, transparentTile]); + rewindTabBtn.position = new Vector(480, 76); + rewindTabBtn.extent = new Vector(48, 160); + rewindTabBtn.pressedAction = (sender) -> setTab("Rewind"); + mainPane.addChild(rewindTabBtn); + + // Touch Controls buttons??? if (Util.isTouchDevice()) { - var textObj = new GuiText(markerFelt32); - textObj.position = new Vector(5, 38); - textObj.extent = new Vector(212, 14); - textObj.text.text = "Touch Controls"; - textObj.text.textColor = 0xFFFFFF; - textObj.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - hotkeysPanel.addChild(textObj); + var touchControlsTxt = new GuiText(domcasual24); + touchControlsTxt.text.text = "Touch Controls:"; + touchControlsTxt.text.color = new Vector(0, 0, 0); + touchControlsTxt.position = new Vector(200, 465); + touchControlsTxt.extent = new Vector(200, 40); - var remapBtn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); - remapBtn.position = new Vector(5 + 203, 35); - remapBtn.txtCtrl.text.text = "Edit"; - remapBtn.setExtent(new Vector(152, 49)); - if (!pause) - remapBtn.pressedAction = (sender) -> { - MarbleGame.canvas.setContent(new TouchCtrlsEditGui()); - } - hotkeysPanel.addChild(remapBtn); + var touchControlsEdit = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_dwn"), domcasual24); + touchControlsEdit.position = new Vector(300, 455); + touchControlsEdit.txtCtrl.text.text = "Edit"; + touchControlsEdit.setExtent(new Vector(109, 39)); + touchControlsEdit.pressedAction = (sender) -> { + MarbleGame.canvas.setContent(new TouchCtrlsEditGui()); + } - makeOption("Hide Controls:", () -> '${Settings.touchSettings.hideControls ? "Yes" : "No"}', 38, hotkeysPanel, "small", ["No", "Yes"], (idx) -> { - Settings.touchSettings.hideControls = idx == 1; - }, true); - - makeSlider("Button-Camera Factor:", (Settings.touchSettings.buttonJoystickMultiplier) / 3, 86, hotkeysPanel, (val) -> { - Settings.touchSettings.buttonJoystickMultiplier = val * 3; - }, false, true); - - makeSlider("Camera Swipe Extent:", (Settings.touchSettings.cameraSwipeExtent - 5) / (35 - 5), 86, hotkeysPanel, (val) -> { - Settings.touchSettings.cameraSwipeExtent = 5 + (35 - 5) * val; - }, true, true); - - makeOption("Dynamic Joystick:", () -> '${Settings.touchSettings.dynamicJoystick ? "Yes" : "No"}', 134, hotkeysPanel, "small", ["No", "Yes"], - (idx) -> { - Settings.touchSettings.dynamicJoystick = idx == 1; - }, false, true); - } else { - makeRemapOption("Move Forward:", 38, Util.getKeyForButton2(Settings.controlsSettings.forward), (key) -> Settings.controlsSettings.forward = key, - hotkeysPanel); - makeRemapOption("Move Left:", 38, Util.getKeyForButton2(Settings.controlsSettings.left), (key) -> Settings.controlsSettings.left = key, - hotkeysPanel, true); - makeRemapOption("Move Backward:", 86, Util.getKeyForButton2(Settings.controlsSettings.backward), - (key) -> Settings.controlsSettings.backward = key, hotkeysPanel); - makeRemapOption("Move Right:", 86, Util.getKeyForButton2(Settings.controlsSettings.right), (key) -> Settings.controlsSettings.right = key, - hotkeysPanel, true); - makeRemapOption("Look Up:", 134, Util.getKeyForButton2(Settings.controlsSettings.camForward), (key) -> Settings.controlsSettings.camForward = key, - hotkeysPanel); - makeRemapOption("Look Left:", 134, Util.getKeyForButton2(Settings.controlsSettings.camLeft), (key) -> Settings.controlsSettings.camLeft = key, - hotkeysPanel, true); - makeRemapOption("Look Down:", 182, Util.getKeyForButton2(Settings.controlsSettings.camBackward), - (key) -> Settings.controlsSettings.camBackward = key, hotkeysPanel); - makeRemapOption("Look Right:", 182, Util.getKeyForButton2(Settings.controlsSettings.camRight), (key) -> Settings.controlsSettings.camRight = key, - hotkeysPanel, true); - makeRemapOption("Jump:", 230, Util.getKeyForButton2(Settings.controlsSettings.jump), (key) -> Settings.controlsSettings.jump = key, hotkeysPanel); - makeRemapOption("Use Powerup:", 230, Util.getKeyForButton2(Settings.controlsSettings.powerup), (key) -> Settings.controlsSettings.powerup = key, - hotkeysPanel, true); - makeRemapOption("Free Look:", 278, Util.getKeyForButton2(Settings.controlsSettings.freelook), (key) -> Settings.controlsSettings.freelook = key, - hotkeysPanel); - makeRemapOption("Respawn:", 278, Util.getKeyForButton2(Settings.controlsSettings.respawn), (key) -> Settings.controlsSettings.respawn = key, - hotkeysPanel, true); - makeRemapOption("Blast:", 326, Util.getKeyForButton2(Settings.controlsSettings.blast), (key) -> Settings.controlsSettings.blast = key, - hotkeysPanel); - makeRemapOption("Rewind:", 326, Util.getKeyForButton2(Settings.controlsSettings.rewind), (key) -> Settings.controlsSettings.rewind = key, - hotkeysPanel, true); + mainPane.addChild(touchControlsTxt); + mainPane.addChild(touchControlsEdit); } - // MISC PANEL - makeButton("Import Progress:", 38, "Import", () -> { - hxd.File.browse((sel) -> { - sel.load((data) -> { - try { - // convert to string - var jsonStr = data.toString(); - // parse JSON - var json = haxe.Json.parse(jsonStr); - - var highScoreData:DynamicAccess> = json.highScores; - for (key => value in highScoreData) { - Settings.highScores.set(key, value); - } - var easterEggData:DynamicAccess = json.easterEggs; - if (easterEggData != null) { - for (key => value in easterEggData) { - Settings.easterEggs.set(key, value); - } - } - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Progress data imported successfully!")); - Settings.save(); - } catch (e) { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Failed to import progress data: " + e.message)); - } - }); - }, { - title: "Select a progress file to import", - fileTypes: [ - {name: "JSON files", extensions: ["json"]}, - {name: "All files", extensions: ["*"]} - ], - }); - }, miscPanel); - makeButton("Export Progress:", 38, "Export", () -> { - #if sys - #if MACOS_BUNDLE - // open the finder to that folder - Sys.command('open "${Settings.settingsDir}"'); - #else - // Just open the folder in the explorer.exe - Sys.command('explorer.exe "${Settings.settingsDir}"'); - #end - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The settings.json file contains your progress data. You can copy it to another device or share it with others.")); - #end - #if js - // Serialize Settings to JSON - var localStorage = js.Browser.getLocalStorage(); - if (localStorage != null) { - var settingsData = localStorage.getItem("MBHaxeSettings"); - if (settingsData != null) { - // Download this - var replayBytes = settingsData; - var blob = new js.html.Blob([haxe.io.Bytes.ofString(replayBytes).getData()], { - type: 'application/octet-stream' - }); - var url = js.html.URL.createObjectURL(blob); - var fname = 'settings.json'; - var element = js.Browser.document.createElement('a'); - element.setAttribute('href', url); - element.setAttribute('download', fname); - - element.style.display = 'none'; - js.Browser.document.body.appendChild(element); - - element.click(); - - js.Browser.document.body.removeChild(element); - js.html.URL.revokeObjectURL(url); - } + setTab = function(tab:String) { + tabs.removeChild(audioTab); + tabs.removeChild(controlsTab); + tabs.removeChild(rewindTab); + tabs.removeChild(boxFrame); + tabs.removeChild(graphicsTab); + mainPane.removeChild(graphicsPane); + mainPane.removeChild(audioPane); + mainPane.removeChild(controlsPane); + mainPane.removeChild(rewindPane); + if (tab == "Graphics") { + tabs.addChild(audioTab); + tabs.addChild(controlsTab); + tabs.addChild(rewindTab); + tabs.addChild(boxFrame); + tabs.addChild(graphicsTab); + mainPane.addChild(graphicsPane); } - #end - }, miscPanel, true); - - generalBtn.pressedAction = (e) -> { - if (currentTab != "general") { - currentTab = "general"; - hotkeysPanel.parent?.removeChild(hotkeysPanel); - miscPanel.parent?.removeChild(miscPanel); - generalPanel.scrollY = 0; - window.addChild(generalPanel); - MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh + if (tab == "Audio") { + tabs.addChild(graphicsTab); + tabs.addChild(controlsTab); + tabs.addChild(rewindTab); + tabs.addChild(boxFrame); + tabs.addChild(audioTab); + mainPane.addChild(audioPane); } - }; - - hotkeysBtn.pressedAction = (e) -> { - if (currentTab != "hotkeys") { - currentTab = "hotkeys"; - generalPanel.parent?.removeChild(generalPanel); - miscPanel.parent?.removeChild(miscPanel); - window.addChild(hotkeysPanel); - MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh + if (tab == "Controls") { + tabs.addChild(audioTab); + tabs.addChild(graphicsTab); + tabs.addChild(rewindTab); + tabs.addChild(boxFrame); + tabs.addChild(controlsTab); + mainPane.addChild(controlsPane); } - }; - - miscBtn.pressedAction = (e) -> { - if (currentTab != "misc") { - currentTab = "misc"; - generalPanel.parent?.removeChild(generalPanel); - hotkeysPanel.parent?.removeChild(hotkeysPanel); - window.addChild(miscPanel); - MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh + if (tab == "Rewind") { + tabs.addChild(audioTab); + tabs.addChild(graphicsTab); + tabs.addChild(controlsTab); + tabs.addChild(boxFrame); + tabs.addChild(rewindTab); + mainPane.addChild(rewindPane); } - }; - - // // Touch Controls buttons??? - // if (Util.isTouchDevice()) { - // var touchControlsTxt = new GuiText(domcasual24); - // touchControlsTxt.text.text = "Touch Controls:"; - // touchControlsTxt.text.color = new Vector(0, 0, 0); - // touchControlsTxt.position = new Vector(200, 465); - // touchControlsTxt.extent = new Vector(200, 40); - // var touchControlsEdit = new GuiButtonText(loadButtonImages("data/ui/options/cntr_cam_dwn"), domcasual24); - - // touchControlsEdit.position = new Vector(300, 455); - // touchControlsEdit.txtCtrl.text.text = "Edit"; - // touchControlsEdit.setExtent(new Vector(109, 39)); - // touchControlsEdit.pressedAction = (sender) -> { - // MarbleGame.canvas.setContent(new TouchCtrlsEditGui()); - // } - // mainPane.addChild(touchControlsTxt); - // mainPane.addChild(touchControlsEdit); - // } - // setTab = function(tab:String) { - // tabs.removeChild(audioTab); - // tabs.removeChild(controlsTab); - // tabs.removeChild(boxFrame); - // tabs.removeChild(graphicsTab); - // mainPane.removeChild(graphicsPane); - // mainPane.removeChild(audioPane); - // mainPane.removeChild(controlsPane); - // if (tab == "Graphics") { - // tabs.addChild(audioTab); - // tabs.addChild(controlsTab); - // tabs.addChild(boxFrame); - // tabs.addChild(graphicsTab); - // mainPane.addChild(graphicsPane); - // } - // if (tab == "Audio") { - // tabs.addChild(graphicsTab); - // tabs.addChild(controlsTab); - // tabs.addChild(boxFrame); - // tabs.addChild(audioTab); - // mainPane.addChild(audioPane); - // } - // if (tab == "Controls") { - // tabs.addChild(audioTab); - // tabs.addChild(graphicsTab); - // tabs.addChild(boxFrame); - // tabs.addChild(controlsTab); - // mainPane.addChild(controlsPane); - // } - // this.render(MarbleGame.canvas.scene2d); - // } + this.render(MarbleGame.canvas.scene2d); + } } public override function update(dt:Float, mouseState:MouseState) { diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 17ced146..3a3218ea 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -1,9 +1,5 @@ package gui; -import net.NetPacket.ScoreboardPacket; -import net.Net; -import src.ProfilerUI; -import hxd.App; import hxd.res.Image; import hxd.Window; import h3d.shader.AlphaMult; @@ -34,38 +30,14 @@ import src.Settings; import src.Util; import src.AudioManager; -@:publicFields -@:structInit -class MiddleMessage { - var ctrl:GuiText; - var age:Float; -} - -@:publicFields -@:structInit -class PlayerInfo { - var id:Int; - var name:String; - var us:Bool; - var score:Int; - var r:Int; - var y:Int; - var b:Int; - var p:Int; -} - class PlayGui { var scene2d:h2d.Scene; public function new() {} var timerNumbers:Array = []; - var timerPoint:GuiAnim; - var timerColon:GuiAnim; - - var countdownNumbers:Array = []; - var countdownPoint:GuiAnim; - var countdownIcon:GuiImage; + var timerPoint:GuiImage; + var timerColon:GuiImage; var gemCountNumbers:Array = []; var gemCountSlash:GuiImage; @@ -80,11 +52,6 @@ class PlayGui { var powerupImageSceneTargetBitmap:Bitmap; var powerupImageObject:DtsObject; - var blastBarTile:h2d.Tile; - var blastBarGreenTile:h2d.Tile; - var blastBarGrayTile:h2d.Tile; - var blastBarChargedTile:h2d.Tile; - var RSGOCenterText:Anim; var helpTextForeground:GuiText; @@ -92,56 +59,19 @@ class PlayGui { var alertTextForeground:GuiText; var alertTextBackground:GuiText; - var blastBar:GuiControl; - var blastFill:GuiImage; - var blastFrame:GuiImage; - - var playerListContainer:GuiControl; - var playerListCtrl:GuiMLTextListCtrl; - var playerListScoresCtrl:GuiMLTextListCtrl; - var playerList:Array = []; - var imageResources:Array> = []; var textureResources:Array> = []; var soundResources:Array> = []; var playGuiCtrl:GuiControl; - var chatCtrl:ChatCtrl; - var spectatorCtrl:GuiControl; - var spectatorTxt:GuiMLText; - var spectatorTxtMode:Int = -1; var resizeEv:Void->Void; var _init:Bool; - var fpsMeter:GuiText; - - var middleMessages:Array = []; - public function dispose() { if (_init) { playGuiCtrl.dispose(); - - if (playerListContainer != null) { - playerListContainer.dispose(); - playerListContainer = null; - playerListCtrl.dispose(); - playerListCtrl = null; - playerListScoresCtrl.dispose(); - playerListScoresCtrl = null; - } - - if (chatCtrl != null) { - chatCtrl.dispose(); - chatCtrl = null; - } - - if (spectatorCtrl != null) { - spectatorCtrl.dispose(); - spectatorCtrl = null; - } - gemImageScene.dispose(); gemImageSceneTarget.dispose(); gemImageSceneTargetBitmap.remove(); @@ -164,7 +94,7 @@ class PlayGui { } } - public function init(scene2d:h2d.Scene, game:String, onFinish:Void->Void) { + public function init(scene2d:h2d.Scene) { this.scene2d = scene2d; this._init = true; @@ -179,26 +109,12 @@ class PlayGui { var tile = ResourceLoader.getResource('data/ui/game/numbers/${i}.png', ResourceLoader.getImage, this.imageResources).toTile(); numberTiles.push(tile); } - for (i in 0...10) { - var tile = ResourceLoader.getResource('data/ui/game/numbers/${i}_green.png', ResourceLoader.getImage, this.imageResources).toTile(); - numberTiles.push(tile); - } - for (i in 0...10) { - var tile = ResourceLoader.getResource('data/ui/game/numbers/${i}_red.png', ResourceLoader.getImage, this.imageResources).toTile(); - numberTiles.push(tile); - } for (i in 0...7) { timerNumbers.push(new GuiAnim(numberTiles)); } - if (MarbleGame.instance.world.isMultiplayer) { - for (i in 0...3) { - countdownNumbers.push(new GuiAnim(numberTiles)); - } - } - - for (i in 0...6) { + for (i in 0...4) { gemCountNumbers.push(new GuiAnim(numberTiles)); } @@ -211,40 +127,24 @@ class PlayGui { powerupBox = new GuiImage(ResourceLoader.getResource('data/ui/game/powerup.png', ResourceLoader.getImage, this.imageResources).toTile()); initTimer(); - initGemCounter(() -> { - initCenterText(); - initPowerupBox(); - if (game == 'ultra' || Net.isMP) - initBlastBar(); - initTexts(); - if (Settings.optionsSettings.frameRateVis) - initFPSMeter(); + initGemCounter(); + initCenterText(); + initPowerupBox(); + initTexts(); - if (MarbleGame.instance.world.isMultiplayer) { - initPlayerList(); - initChatHud(); - if (Net.hostSpectate || Net.clientSpectate) - initSpectatorMenu(); + if (Util.isTouchDevice()) { + MarbleGame.instance.touchInput.showControls(this.playGuiCtrl, false); + } - initGemCountdownTimer(); - } + playGuiCtrl.render(scene2d); - if (Util.isTouchDevice()) { - MarbleGame.instance.touchInput.showControls(this.playGuiCtrl, game == 'ultra' || MarbleGame.instance.world.isMultiplayer); - } + resizeEv = () -> { + var wnd = Window.getInstance(); + playGuiCtrl.render(MarbleGame.canvas.scene2d); + powerupImageSceneTargetBitmap.x = wnd.width - 88; + }; - playGuiCtrl.render(scene2d); - - resizeEv = () -> { - var wnd = Window.getInstance(); - playGuiCtrl.render(MarbleGame.canvas.scene2d); - powerupImageSceneTargetBitmap.x = wnd.width - 88; - }; - - Window.getInstance().addResizeEvent(resizeEv); - - onFinish(); - }); + Window.getInstance().addResizeEvent(resizeEv); } public function initTimer() { @@ -253,25 +153,13 @@ class PlayGui { timerCtrl.position = new Vector(215, 1); timerCtrl.extent = new Vector(234, 58); - var timerTransparency = new GuiImage(ResourceLoader.getResource('data/ui/game/transparency.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - timerTransparency.position = new Vector(14, -7); - timerTransparency.extent = new Vector(228, 71); - timerCtrl.addChild(timerTransparency); - timerNumbers[0].position = new Vector(23, 0); timerNumbers[0].extent = new Vector(43, 55); timerNumbers[1].position = new Vector(47, 0); timerNumbers[1].extent = new Vector(43, 55); - var colonCols = [ - ResourceLoader.getResource('data/ui/game/numbers/colon.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/colon_green.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/colon_red.png', ResourceLoader.getImage, this.imageResources).toTile() - ]; - - timerColon = new GuiAnim(colonCols); + timerColon = new GuiImage(ResourceLoader.getResource('data/ui/game/numbers/colon.png', ResourceLoader.getImage, this.imageResources).toTile()); timerColon.position = new Vector(67, 0); timerColon.extent = new Vector(43, 55); @@ -281,13 +169,7 @@ class PlayGui { timerNumbers[3].position = new Vector(107, 0); timerNumbers[3].extent = new Vector(43, 55); - var pointCols = [ - ResourceLoader.getResource('data/ui/game/numbers/point.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/point_green.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/point_red.png', ResourceLoader.getImage, this.imageResources).toTile() - ]; - - timerPoint = new GuiAnim(pointCols); + timerPoint = new GuiImage(ResourceLoader.getResource('data/ui/game/numbers/point.png', ResourceLoader.getImage, this.imageResources).toTile()); timerPoint.position = new Vector(127, 0); timerPoint.extent = new Vector(43, 55); @@ -313,44 +195,6 @@ class PlayGui { playGuiCtrl.addChild(timerCtrl); } - public function initGemCountdownTimer() { - var timerCtrl = new GuiControl(); - timerCtrl.horizSizing = HorizSizing.Center; - timerCtrl.position = new Vector(215, 1); - timerCtrl.extent = new Vector(374, 58); - - countdownNumbers[0].position = new Vector(33, 10); - countdownNumbers[0].extent = new Vector(28, 37); - - countdownNumbers[1].position = new Vector(49, 10); - countdownNumbers[1].extent = new Vector(28, 37); - - var pointCols = [ - ResourceLoader.getResource('data/ui/game/numbers/point.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/point_green.png', ResourceLoader.getImage, this.imageResources).toTile(), - ResourceLoader.getResource('data/ui/game/numbers/point_red.png', ResourceLoader.getImage, this.imageResources).toTile() - ]; - - countdownPoint = new GuiAnim(pointCols); - countdownPoint.position = new Vector(59, 10); - countdownPoint.extent = new Vector(28, 37); - - countdownNumbers[2].position = new Vector(70, 10); - countdownNumbers[2].extent = new Vector(28, 37); - - countdownIcon = new GuiImage(ResourceLoader.getResource("data/ui/game/timerhuntrespawn.png", ResourceLoader.getImage, this.imageResources).toTile()); - countdownIcon.position = new Vector(0, 10); - countdownIcon.extent = new Vector(36, 36); - - timerCtrl.addChild(countdownIcon); - timerCtrl.addChild(countdownNumbers[0]); - timerCtrl.addChild(countdownNumbers[1]); - timerCtrl.addChild(countdownPoint); - timerCtrl.addChild(countdownNumbers[2]); - - playGuiCtrl.addChild(timerCtrl); - } - public function initCenterText() { RSGOCenterText.x = scene2d.width / 2 - RSGOCenterText.frames[0].width * Settings.uiScale / 2; RSGOCenterText.y = scene2d.height * 0.3; // - RSGOCenterText.frames[0].height / 2; @@ -396,36 +240,28 @@ class PlayGui { curState = state; } - public function initGemCounter(onFinish:Void->Void) { + public function initGemCounter() { gemCountNumbers[0].position = new Vector(30, 0); gemCountNumbers[0].extent = new Vector(43, 55); gemCountNumbers[1].position = new Vector(54, 0); gemCountNumbers[1].extent = new Vector(43, 55); - gemCountNumbers[2].position = new Vector(78, 0); - gemCountNumbers[2].extent = new Vector(43, 55); - gemCountSlash = new GuiImage(ResourceLoader.getResource('data/ui/game/numbers/slash.png', ResourceLoader.getImage, this.imageResources).toTile()); - gemCountSlash.position = new Vector(99, 0); + gemCountSlash.position = new Vector(75, 0); gemCountSlash.extent = new Vector(43, 55); + gemCountNumbers[2].position = new Vector(96, 0); + gemCountNumbers[2].extent = new Vector(43, 55); + gemCountNumbers[3].position = new Vector(120, 0); gemCountNumbers[3].extent = new Vector(43, 55); - gemCountNumbers[4].position = new Vector(144, 0); - gemCountNumbers[4].extent = new Vector(43, 55); - - gemCountNumbers[5].position = new Vector(168, 0); - gemCountNumbers[5].extent = new Vector(43, 55); - playGuiCtrl.addChild(gemCountNumbers[0]); playGuiCtrl.addChild(gemCountNumbers[1]); - playGuiCtrl.addChild(gemCountNumbers[2]); playGuiCtrl.addChild(gemCountSlash); + playGuiCtrl.addChild(gemCountNumbers[2]); playGuiCtrl.addChild(gemCountNumbers[3]); - playGuiCtrl.addChild(gemCountNumbers[4]); - playGuiCtrl.addChild(gemCountNumbers[5]); this.gemImageScene = new h3d.scene.Scene(); // var gemImageRenderer = cast(this.gemImageScene.renderer, h3d.scene.Renderer); @@ -441,40 +277,28 @@ class PlayGui { // gemImageSceneTargetBitmap.blendMode = None; // gemImageSceneTargetBitmap.addShader(new ColorKey()); - var GEM_COLORS = ["blue", "red", "yellow", "purple", "green", "turquoise", "orange", "black"]; - var gemColor = GEM_COLORS[Math.floor(Math.random() * GEM_COLORS.length)]; - - if (MarbleGame.instance.world.mission.missionInfo.game == "PlatinumQuest") - gemColor = "platinum"; - gemImageObject = new DtsObject(); gemImageObject.dtsPath = "data/shapes/items/gem.dts"; gemImageObject.ambientRotate = true; gemImageObject.showSequences = false; - gemImageObject.matNameOverride.set('base.gem', gemColor + ".gem"); // gemImageObject.matNameOverride.set("base.gem", "base.gem."); gemImageObject.ambientSpinFactor /= -2; // ["base.gem"] = color + ".gem"; - ResourceLoader.load("shapes/items/gem.dts").entry.load(() -> { - ResourceLoader.load("shapes/items/" + gemColor + ".gem.png").entry.load(() -> { - gemImageObject.init(null, () -> { - for (mat in gemImageObject.materials) { - mat.mainPass.enableLights = false; + gemImageObject.init(null, () -> { + for (mat in gemImageObject.materials) { + mat.mainPass.enableLights = false; - // Huge hacks - if (mat.blendMode != Add) { - var alphaShader = new h3d.shader.AlphaChannel(); - mat.mainPass.addShader(alphaShader); - } - } - gemImageScene.addChild(gemImageObject); - var gemImageCenter = gemImageObject.getBounds().getCenter(); + // Huge hacks + if (mat.blendMode != Add) { + var alphaShader = new h3d.shader.AlphaChannel(); + mat.mainPass.addShader(alphaShader); + } + } + gemImageScene.addChild(gemImageObject); + var gemImageCenter = gemImageObject.getBounds().getCenter(); - gemImageScene.camera.pos = new Vector(0, 3, gemImageCenter.z); - gemImageScene.camera.target = new Vector(gemImageCenter.x, gemImageCenter.y, gemImageCenter.z); - onFinish(); - }); - }); + gemImageScene.camera.pos = new Vector(0, 3, gemImageCenter.z); + gemImageScene.camera.target = new Vector(gemImageCenter.x, gemImageCenter.y, gemImageCenter.z); }); } @@ -511,7 +335,7 @@ class PlayGui { helpTextCtrl.horizSizing = Width; helpTextBackground = new GuiText(bfont); - helpTextBackground.text.textColor = 0x777777; + helpTextBackground.text.textColor = 0x000000; helpTextBackground.position = new Vector(1, 1); helpTextBackground.extent = new Vector(640, 14); helpTextBackground.vertSizing = Height; @@ -530,13 +354,13 @@ class PlayGui { helpTextCtrl.addChild(helpTextForeground); var alertTextCtrl = new GuiControl(); - alertTextCtrl.position = new Vector(0, 371); - alertTextCtrl.extent = new Vector(640, 105); + alertTextCtrl.position = new Vector(0, 418); + alertTextCtrl.extent = new Vector(640, 58); alertTextCtrl.vertSizing = Top; alertTextCtrl.horizSizing = Width; alertTextBackground = new GuiText(bfont); - alertTextBackground.text.textColor = 0x776622; + alertTextBackground.text.textColor = 0x000000; alertTextBackground.position = new Vector(1, 1); alertTextBackground.extent = new Vector(640, 32); alertTextBackground.vertSizing = Height; @@ -544,7 +368,7 @@ class PlayGui { alertTextBackground.justify = Center; alertTextForeground = new GuiText(bfont); - alertTextForeground.text.textColor = 0xffEE99; + alertTextForeground.text.textColor = 0xFFFF00; alertTextForeground.position = new Vector(0, 0); alertTextForeground.extent = new Vector(640, 32); alertTextForeground.vertSizing = Height; @@ -558,400 +382,6 @@ class PlayGui { playGuiCtrl.addChild(alertTextCtrl); } - function initFPSMeter() { - var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual32b = new BitmapFont(domcasual32fontdata.entry); - @:privateAccess domcasual32b.loader = ResourceLoader.loader; - var bfont = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - var fpsMeterCtrl = new GuiImage(ResourceLoader.getResource("data/ui/game/transparency-fps.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - fpsMeterCtrl.position = new Vector(534, 448); - fpsMeterCtrl.horizSizing = Left; - fpsMeterCtrl.vertSizing = Top; - fpsMeterCtrl.extent = new Vector(106, 32); - - fpsMeter = new GuiText(bfont); - fpsMeter.horizSizing = Width; - fpsMeter.vertSizing = Height; - fpsMeter.position = new Vector(10, 3); - fpsMeter.text.textColor = 0; - fpsMeter.extent = new Vector(106, 32); - fpsMeterCtrl.addChild(fpsMeter); - - playGuiCtrl.addChild(fpsMeterCtrl); - } - - public function initChatHud() { - this.chatCtrl = new ChatCtrl(); - this.chatCtrl.position = new Vector(playGuiCtrl.extent.x - 201, 150); - this.chatCtrl.extent = new Vector(200, 250); - this.chatCtrl.horizSizing = Left; - this.playGuiCtrl.addChild(chatCtrl); - } - - public inline function isChatFocused() { - return this.chatCtrl?.chatFocused; - } - - public inline function addChatMessage(str:String) { - this.chatCtrl.addChatMessage(str); - } - - function initBlastBar() { - blastBar = new GuiControl(); - blastBar.position = new Vector(6, 445); - blastBar.extent = new Vector(120, 28); - blastBar.vertSizing = Top; - this.playGuiCtrl.addChild(blastBar); - - blastFill = new GuiImage(ResourceLoader.getResource("data/ui/game/blastbar_bargreen.png", ResourceLoader.getImage, this.imageResources).toTile()); - blastFill.position = new Vector(5, 5); - blastFill.extent = new Vector(58, 17); - blastBar.addChild(blastFill); - - blastFrame = new GuiImage(ResourceLoader.getResource("data/ui/game/blastbar.png", ResourceLoader.getImage, this.imageResources).toTile()); - blastFrame.position = new Vector(0, 0); - blastFrame.extent = new Vector(120, 28); - blastBar.addChild(blastFrame); - - blastBarTile = ResourceLoader.getResource("data/ui/game/blastbar.png", ResourceLoader.getImage, this.imageResources).toTile(); - blastBarGreenTile = ResourceLoader.getResource("data/ui/game/blastbar_bargreen.png", ResourceLoader.getImage, this.imageResources).toTile(); - blastBarGrayTile = ResourceLoader.getResource("data/ui/game/blastbar_bargray.png", ResourceLoader.getImage, this.imageResources).toTile(); - blastBarChargedTile = ResourceLoader.getResource("data/ui/game/blastbar_charged.png", ResourceLoader.getImage, this.imageResources).toTile(); - } - - public function setBlastValue(value:Float) { - if (Net.clientSpectate || Net.hostSpectate) { - MarbleGame.instance.touchInput.blastbutton.setEnabled(true); - return; // Is not changed - } - if (value <= 1) { - if (blastFill.extent.y == 16) { // Was previously charged - blastFrame.bmp.tile = blastBarTile; - } - var oldVal = blastFill.extent.x; - blastFill.extent = new Vector(Util.lerp(0, 110, value), 17); - if (oldVal < 22 && blastFill.extent.x >= 22) { - blastFill.bmp.tile = blastBarGreenTile; - MarbleGame.instance.touchInput.blastbutton.setEnabled(true); - } - if (oldVal >= 22 && blastFill.extent.x < 22) { - blastFill.bmp.tile = blastBarGrayTile; - MarbleGame.instance.touchInput.blastbutton.setEnabled(false); - } - } else { - blastFill.extent = new Vector(0, 16); // WE will just use this extra number to store whether it was previously charged or not - blastFrame.bmp.tile = blastBarChargedTile; - MarbleGame.instance.touchInput.blastbutton.setEnabled(true); - } - this.blastBar.render(scene2d); - } - - function initPlayerList() { - var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual32b = new BitmapFont(domcasual32fontdata.entry); - @:privateAccess domcasual32b.loader = ResourceLoader.loader; - var bfont = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - playerListContainer = new GuiControl(); - playerListContainer.horizSizing = Right; - playerListContainer.vertSizing = Height; - playerListContainer.position = new Vector(20, 100); - playerListContainer.extent = new Vector(380, 380); - this.playGuiCtrl.addChild(playerListContainer); - - var imgLoader = (s:String) -> { - var t = switch (s) { - case "high": - ResourceLoader.getResource("data/ui/mp/play/connection-high.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "medium": - ResourceLoader.getResource("data/ui/mp/play/connection-medium.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "low": - ResourceLoader.getResource("data/ui/mp/play/connection-low.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "matanny": - ResourceLoader.getResource("data/ui/mp/play/connection-matanny.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "unknown": - ResourceLoader.getResource("data/ui/mp/play/connection-unknown.png", ResourceLoader.getImage, this.imageResources).toTile(); - default: - null; - }; - if (t != null) - t.scaleToSize(t.width * (Settings.uiScale), t.height * (Settings.uiScale)); - return t; - } - - playerListCtrl = new GuiMLTextListCtrl(bfont, [], imgLoader, { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - color: 0, - alpha: 1 - }); - - playerListCtrl.position = new Vector(33, 3); - playerListCtrl.extent = new Vector(210, 271); - playerListCtrl.scrollable = true; - playerListCtrl.onSelectedFunc = (sel) -> {} - playerListContainer.addChild(playerListCtrl); - - playerListScoresCtrl = new GuiMLTextListCtrl(bfont, [], imgLoader, { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - color: 0, - alpha: 1 - }); - - playerListScoresCtrl.position = new Vector(233, 3); - playerListScoresCtrl.extent = new Vector(280, 271); - playerListScoresCtrl.scrollable = true; - playerListScoresCtrl.onSelectedFunc = (sel) -> {} - playerListContainer.addChild(playerListScoresCtrl); - } - - public function redrawPlayerList() { - var pl = []; - var plScores = []; - var col0 = "#CFB52B"; - var col1 = "#CDCDCD"; - var col2 = "#D19275"; - var col3 = "#FFEE99"; - var prevLead = playerList[0].us; - playerList.sort((a, b) -> a.score > b.score ? -1 : (a.score < b.score ? 1 : 0)); - for (i in 0...playerList.length) { - var item = playerList[i]; - var color = switch (i) { - case 0: - col0; - case 1: - col1; - case 2: - col2; - default: - col3; - }; - var isSpectating = false; - if (item.us) { - if (Net.isHost) - isSpectating = Net.hostSpectate; - if (Net.isClient) - isSpectating = Net.clientSpectate; - } else { - isSpectating = Net.clientIdMap[item.id].spectator; - } - pl.push('${i + 1}. ${isSpectating ? "[S] " : ""}${Util.rightPad(StringTools.htmlEscape(item.name), 25, 3)}'); - var connPing = item.us ? (Net.isHost ? 0 : Net.clientConnection.pingTicks) : (item.id == 0 ? 0 : Net.clientIdMap[item.id].pingTicks); - var pingStatus = "unknown"; - if (connPing <= 5) - pingStatus = "high"; - else if (connPing <= 8) - pingStatus = "medium"; - else if (connPing <= 16) - pingStatus = "low"; - else if (connPing < 32) - pingStatus = "matanny"; - plScores.push('${item.score}'); - } - playerListCtrl.setTexts(pl); - playerListScoresCtrl.setTexts(plScores); - - if ((playerList[0].us && !prevLead)) { - gemCountNumbers[0].anim.currentFrame += 10; - gemCountNumbers[1].anim.currentFrame += 10; - gemCountNumbers[2].anim.currentFrame += 10; - } - if (prevLead && !playerList[0].us) { - gemCountNumbers[0].anim.currentFrame -= 10; - gemCountNumbers[1].anim.currentFrame -= 10; - gemCountNumbers[2].anim.currentFrame -= 10; - } - } - - public function addPlayer(id:Int, name:String, us:Bool) { - if (playerListCtrl != null) { - playerList.push({ - id: id, - name: name, - us: us, - score: 0, - r: 0, - y: 0, - b: 0, - p: 0 - }); - redrawPlayerList(); - } - } - - public function removePlayer(id:Int) { - if (playerListCtrl != null) { - var f = playerList.filter(x -> x.id == id); - if (f.length != 0) - playerList.remove(f[0]); - redrawPlayerList(); - } - } - - public function incrementPlayerScore(id:Int, score:Int) { - var f = playerList.filter(x -> x.id == id); - if (f.length != 0) { - f[0].score += score; - if (score == 1) { - f[0].r += 1; - } - if (score == 2) { - f[0].y += 1; - } - if (score == 5) { - f[0].b += 1; - } - if (score == 10) { - f[0].p += 1; - } - if (f[0].us && Net.isClient) { - @:privateAccess formatGemHuntCounter(f[0].score); - } - } - - if (id == Net.clientId) { - if (Net.isClient) - AudioManager.playSound(ResourceLoader.getResource('data/sound/gotgem.wav', ResourceLoader.getAudio, this.soundResources)); - } else if (Net.isClient) - AudioManager.playSound(ResourceLoader.getResource('data/sound/opponentdiamond.wav', ResourceLoader.getAudio, this.soundResources)); - - redrawPlayerList(); - } - - public function updatePlayerScores(scoreboardPacket:ScoreboardPacket) { - for (player in playerList) { - player.score = scoreboardPacket.scoreBoard.exists(player.id) ? scoreboardPacket.scoreBoard.get(player.id) : 0; - 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(); - } - - public function resetPlayerScores() { - for (player in playerList) { - player.score = 0; - player.r = 0; - player.y = 0; - player.b = 0; - player.p = 0; - } - - redrawPlayerList(); - } - - public function initSpectatorMenu() { - spectatorCtrl = new GuiControl(); - spectatorCtrl.vertSizing = Top; - spectatorCtrl.position = new Vector(0, 330); - spectatorCtrl.extent = new Vector(302, 150); - - var specWnd = new GuiImage(ResourceLoader.getResource("data/ui/mp/play/spectator.png", ResourceLoader.getImage, this.imageResources).toTile()); - specWnd.horizSizing = Width; - specWnd.vertSizing = Top; - specWnd.position = new Vector(0, 0); - specWnd.extent = new Vector(302, 150); - - spectatorCtrl.addChild(specWnd); - - var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - var domcasual24b = new BitmapFont(domcasual24fontdata.entry); - @:privateAccess domcasual24b.loader = ResourceLoader.loader; - var domcasual24 = domcasual24b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); - - var domcasual32 = domcasual24b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - - var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); - var arial14b = new BitmapFont(arial14fontdata.entry); - @:privateAccess arial14b.loader = ResourceLoader.loader; - var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - var arialb14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); - var arialb14b = new BitmapFont(arialb14fontdata.entry); - @:privateAccess arialb14b.loader = ResourceLoader.loader; - var arialBold14 = arialb14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - 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); - - function mlFontLoader(text:String) { - switch (text) { - case "DomCasual24": - return domcasual24; - case "Arial14": - return arial14; - case "ArialBold14": - return arialBold14; - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - case "MarkerFelt20": - return markerFelt20; - case "MarkerFelt26": - return markerFelt26; - default: - return null; - } - } - - spectatorTxt = new GuiMLText(markerFelt24, mlFontLoader); - spectatorTxt.position = new Vector(6, 9); - spectatorTxt.extent = new Vector(282, 14); - spectatorTxt.text.textColor = 0x000000; - - specWnd.addChild(spectatorTxt); - playGuiCtrl.addChild(spectatorCtrl); - } - - public function setSpectateMenu(enabled:Bool) { - if (enabled && spectatorCtrl == null) { - initSpectatorMenu(); - spectatorCtrl.render(MarbleGame.canvas.scene2d, @:privateAccess playGuiCtrl._flow); - blastFill.bmp.visible = false; - blastFrame.bmp.visible = false; - return true; - } - if (!enabled && spectatorCtrl != null) { - spectatorCtrl.dispose(); - spectatorCtrl = null; - blastFill.bmp.visible = true; - blastFrame.bmp.visible = true; - spectatorTxtMode = -1; - return true; - } - return false; - } - - public function setSpectateMenuText(mode:Int) { - if (spectatorTxtMode != mode) { - if (mode == 0) { - spectatorTxt.text.text = '

Spectator Info

- Toggle Fly / Orbit: ${Util.getKeyForButton2(Settings.controlsSettings.blast)}'; - } - if (mode == 1) { - spectatorTxt.text.text = '

Spectator Info

- Toggle Fly / Orbit: ${Util.getKeyForButton2(Settings.controlsSettings.blast)} -
Prev Player: ${Util.getKeyForButton2(Settings.controlsSettings.left)} -
Next Player: ${Util.getKeyForButton2(Settings.controlsSettings.right)}
'; - } - - spectatorTxtMode = mode; - } - } - public function setHelpTextOpacity(value:Float) { @:privateAccess helpTextForeground.text._textColorVec.a = value; @:privateAccess helpTextBackground.text._textColorVec.a = value; @@ -1027,8 +457,6 @@ class PlayGui { } public function formatGemCounter(collected:Int, total:Int) { - if (MarbleGame.instance.world.isMultiplayer) - return; if (total == 0) { for (number in gemCountNumbers) { number.anim.visible = false; @@ -1043,53 +471,19 @@ class PlayGui { gemImageSceneTargetBitmap.visible = true; } - var totalHundredths = Math.floor(total / 100); - var totalTenths = Math.floor(total / 10) % 10; + var totalTenths = Math.floor(total / 10); var totalOnes = total % 10; - var collectedHundredths = Math.floor(collected / 100); - var collectedTenths = Math.floor(collected / 10) % 10; + var collectedTenths = Math.floor(collected / 10); var collectedOnes = collected % 10; - gemCountNumbers[0].anim.currentFrame = collectedHundredths; - gemCountNumbers[1].anim.currentFrame = collectedTenths; - gemCountNumbers[2].anim.currentFrame = collectedOnes; - gemCountNumbers[3].anim.currentFrame = totalHundredths; - gemCountNumbers[4].anim.currentFrame = totalTenths; - gemCountNumbers[5].anim.currentFrame = totalOnes; + gemCountNumbers[0].anim.currentFrame = collectedTenths; + gemCountNumbers[1].anim.currentFrame = collectedOnes; + gemCountNumbers[2].anim.currentFrame = totalTenths; + gemCountNumbers[3].anim.currentFrame = totalOnes; } - public function formatGemHuntCounter(collected:Int) { - var collectedHundredths = Math.floor(collected / 100); - var collectedTenths = Math.floor(collected / 10) % 10; - var collectedOnes = collected % 10; - - if (collected >= 100) - gemCountNumbers[0].anim.visible = true; - else - gemCountNumbers[0].anim.visible = false; - if (collected >= 10) - gemCountNumbers[1].anim.visible = true; - else - gemCountNumbers[1].anim.visible = false; - gemCountNumbers[2].anim.visible = true; - gemCountNumbers[3].anim.visible = false; - gemCountNumbers[4].anim.visible = false; - gemCountNumbers[5].anim.visible = false; - - var off = playerList[0].us ? 10 : 0; - - gemCountNumbers[0].anim.currentFrame = off + collectedHundredths; - gemCountNumbers[1].anim.currentFrame = off + collectedTenths; - gemCountNumbers[2].anim.currentFrame = off + collectedOnes; - gemCountSlash.bmp.visible = false; - gemImageSceneTargetBitmap.visible = true; - } - - // 0: default - // 1: green - // 2: red - public function formatTimer(time:Float, color:Int = 0) { + public function formatTimer(time:Float) { var et = time * 1000; var thousandth = et % 10; var hundredth = Math.floor((et % 1000) / 10); @@ -1100,58 +494,17 @@ class PlayGui { var secondsOne = seconds % 10; var secondsTen = (seconds - secondsOne) / 10; var minutesOne = minutes % 10; - var minutesTen = ((minutes - minutesOne) / 10) % 10; + var minutesTen = (minutes - minutesOne) / 10; var hundredthOne = hundredth % 10; var hundredthTen = (hundredth - hundredthOne) / 10; - timerNumbers[0].anim.currentFrame = minutesTen + color * 10; - timerNumbers[1].anim.currentFrame = minutesOne + color * 10; - timerNumbers[2].anim.currentFrame = secondsTen + color * 10; - timerNumbers[3].anim.currentFrame = secondsOne + color * 10; - timerNumbers[4].anim.currentFrame = hundredthTen + color * 10; - timerNumbers[5].anim.currentFrame = hundredthOne + color * 10; - timerNumbers[6].anim.currentFrame = thousandth + color * 10; - - timerPoint.anim.currentFrame = color; - timerColon.anim.currentFrame = color; - } - - public function formatCountdownTimer(time:Float, color:Int = 0) { - if (time == 0) { - countdownNumbers[0].anim.visible = false; - countdownNumbers[1].anim.visible = false; - countdownNumbers[2].anim.visible = false; - countdownPoint.anim.visible = false; - countdownIcon.bmp.visible = false; - } else { - countdownNumbers[0].anim.visible = true; - countdownNumbers[1].anim.visible = true; - countdownNumbers[2].anim.visible = true; - countdownPoint.anim.visible = true; - countdownIcon.bmp.visible = true; - } - - var et = time * 1000; - var hundredth = Math.floor((et % 1000) / 10); - var totalSeconds = Math.floor(et / 1000); - var seconds = totalSeconds % 60; - - var secondsOne = seconds % 10; - var secondsTen = (seconds - secondsOne) / 10; - var hundredthOne = hundredth % 10; - var hundredthTen = (hundredth - hundredthOne) / 10; - - if (secondsTen > 0) { - countdownNumbers[0].anim.visible = true; - countdownNumbers[0].anim.currentFrame = secondsTen + color * 10; - } else { - countdownNumbers[0].anim.visible = false; - } - - countdownNumbers[1].anim.currentFrame = secondsOne + color * 10; - countdownNumbers[2].anim.currentFrame = hundredthTen + color * 10; - - countdownPoint.anim.currentFrame = color; + timerNumbers[0].anim.currentFrame = minutesTen; + timerNumbers[1].anim.currentFrame = minutesOne; + timerNumbers[2].anim.currentFrame = secondsTen; + timerNumbers[3].anim.currentFrame = secondsOne; + timerNumbers[4].anim.currentFrame = hundredthTen; + timerNumbers[5].anim.currentFrame = hundredthOne; + timerNumbers[6].anim.currentFrame = thousandth; } public function render(engine:h3d.Engine) { @@ -1175,59 +528,5 @@ class PlayGui { if (this.powerupImageObject != null) this.powerupImageObject.update(timeState); this.powerupImageScene.setElapsedTime(timeState.dt); - - if (this.fpsMeter != null) { - this.fpsMeter.text.text = '${Math.floor(ProfilerUI.instance.fps)} FPS'; - } - this.updateMiddleMessages(timeState.dt); - if (Net.isMP) { - this.chatCtrl.updateChat(timeState.dt); - } - } - - function updateMiddleMessages(dt:Float) { - var itermessages = this.middleMessages.copy(); - if (itermessages.length > 0) { - var thismsg = itermessages.shift(); - thismsg.age += dt; - if (thismsg.age > 0.6) { - this.middleMessages.remove(thismsg); - thismsg.ctrl.parent.removeChild(thismsg.ctrl); // Delete it - } else { - if (thismsg.age >= 0.3) { - thismsg.ctrl.text.alpha = 1 - (thismsg.age - 0.3) / 0.3; - } - thismsg.ctrl.text.y -= (0.1 / playGuiCtrl.extent.y) * scene2d.height; - } - } - } - - public function addMiddleMessage(text:String, color:Int) { - if (this.middleMessages.length > 10) - return; - var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); - var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); - @:privateAccess markerFelt32b.loader = ResourceLoader.loader; - var markerFelt32 = markerFelt32b.toSdfFont(cast 44 * Settings.uiScale, MultiChannel); - - var middleMsg = new GuiText(markerFelt32); - middleMsg.position = new Vector(200, 50); - middleMsg.extent = new Vector(400, 100); - middleMsg.horizSizing = Center; - middleMsg.vertSizing = Center; - middleMsg.text.text = text; - middleMsg.justify = Center; - middleMsg.text.textColor = color; - middleMsg.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - 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, @:privateAccess this.playGuiCtrl._flow); - middleMsg.text.y -= (25 / playGuiCtrl.extent.y) * scene2d.height; - - this.middleMessages.push({ctrl: middleMsg, age: 0}); } } diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index 6b99621e..146688a6 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -1,10 +1,6 @@ package gui; -import src.Http; -import src.Leaderboards; -import net.ClientConnection.NetPlatform; -import src.Marbleland; -import h2d.filter.DropShadow; +import src.MarbleGame; import src.Replay; import haxe.ds.Option; import hxd.Key; @@ -26,70 +22,38 @@ import hxd.res.BitmapFont; import src.ResourceLoader; import h3d.Vector; import src.Util; -import src.MarbleGame; import src.MissionList; class PlayMissionGui extends GuiImage { static var currentSelectionStatic:Int = -1; static var currentCategoryStatic:String = "beginner"; - static var currentGameStatic:String = "platinum"; - static var currentSortType:Int = 1; - var currentGame:String = "platinum"; var currentSelection:Int = 0; var currentCategory:String = "beginner"; var currentList:Array; var setSelectedFunc:Int->Void; - var setScoreHover:Bool->Void; - var setCategoryFunc:(String, String, ?String, ?Bool) -> Void; + var setCategoryFunc:(String, ?Bool) -> Void; var buttonHoldFunc:(dt:Float, mouseState:MouseState) -> Void; - var pmScoreButton:GuiButton; - var scoreButtonHover:Bool = false; - var scoreButtonDirty:Bool = true; - var scoreShowing:Bool = false; - var buttonCooldown:Float = 0.5; var maxButtonCooldown:Float = 0.5; #if js var previewTimeoutHandle:Option = None; - var lbRequest:Int = 0; - #end - #if hl - var previewToken:Int = 0; - var lbToken:Int = 0; - var lbRequest:src.Http.HttpRequest = null; #end public function new() { MissionList.buildMissionList(); - // if (currentSelectionStatic == -1) - // currentSelectionStatic = cast Math.min(MissionList.missionList["platinum"]["beginner"].length - 1, - // Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)]); - if (currentSelectionStatic == -1) { - currentSelectionStatic = MissionList.missionList["platinum"]["beginner"].length - 1; - } + if (currentSelectionStatic == -1) + currentSelectionStatic = cast Math.min(MissionList.beginnerMissions.length - 1, + Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)]); - // currentSelection = PlayMissionGui.currentSelectionStatic; + currentSelection = PlayMissionGui.currentSelectionStatic; currentCategory = PlayMissionGui.currentCategoryStatic; - currentGame = PlayMissionGui.currentGameStatic; - MarbleGame.instance.toRecord = false; - - function chooseBg() { - if (currentGame == "gold") - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (currentGame == "platinum") - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - if (currentGame == "ultra") - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - } - - var img = chooseBg(); + var img = ResourceLoader.getImage("data/ui/background.jpg"); super(img.resource.toTile()); this.horizSizing = Width; @@ -97,12 +61,12 @@ class PlayMissionGui extends GuiImage { this.extent = new Vector(640, 480); this.position = new Vector(0, 0); - var container = new GuiControl(); - container.horizSizing = Width; - container.vertSizing = Height; - container.extent = new Vector(640, 480); - container.position = new Vector(0, 0); - this.addChild(container); + var localContainer = new GuiControl(); + localContainer.horizSizing = Center; + localContainer.vertSizing = Center; + localContainer.position = new Vector(-1, 44); + localContainer.extent = new Vector(651, 392); + this.addChild(localContainer); function loadButtonImages(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -112,6 +76,136 @@ class PlayMissionGui extends GuiImage { return [normal, hover, pressed, disabled]; } + var tabAdvanced = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_adv.png", ResourceLoader.getImage, this.imageResources).toTile()); + tabAdvanced.position = new Vector(410, 21); + tabAdvanced.extent = new Vector(166, 43); + tabAdvanced.pressedAction = (sender) -> { + currentList = MissionList.advancedMissions; + currentCategory = "advanced"; + setCategoryFunc("advanced"); + } + localContainer.addChild(tabAdvanced); + + var tabIntermediate = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_inter.png", ResourceLoader.getImage, this.imageResources).toTile()); + tabIntermediate.position = new Vector(213, 6); + tabIntermediate.extent = new Vector(205, 58); + tabIntermediate.pressedAction = (sender) -> { + currentList = MissionList.intermediateMissions; + currentCategory = "intermediate"; + setCategoryFunc("intermediate"); + } + localContainer.addChild(tabIntermediate); + + var tabCustom = new GuiImage(ResourceLoader.getResource("data/ui/play/cust_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); + tabCustom.position = new Vector(589, 91); + tabCustom.extent = new Vector(52, 198); + tabCustom.pressedAction = (sender) -> { + #if (js || android || MACOS_BUNDLE) + var mbo = new MessageBoxYesNoDlg("The custom level browser is not available in this game.\n Please play Marble Blast Platinum to get access to 5000+ cummunity made customs of both Marble Blast Gold and Marble Blast Platinum. Visit download link?", + () -> { + #if sys + hxd.System.openURL("https://github.com/RandomityGuy/MBHaxe"); + #end + #if js + js.Browser.window.open("https://github.com/RandomityGuy/MBHaxe"); + #end + }, () -> {}); + + MarbleGame.canvas.pushDialog(mbo); + #else + currentList = MissionList.customMissions; + currentCategory = "custom"; + setCategoryFunc("custom"); + #end + } + localContainer.addChild(tabCustom); + + var pmBox = new GuiImage(ResourceLoader.getResource("data/ui/play/playgui.png", ResourceLoader.getImage, this.imageResources).toTile()); + pmBox.position = new Vector(0, 42); + pmBox.extent = new Vector(610, 351); + pmBox.horizSizing = Width; + pmBox.vertSizing = Height; + localContainer.addChild(pmBox); + + var textWnd = new GuiImage(ResourceLoader.getResource("data/ui/play/text_window.png", ResourceLoader.getImage, this.imageResources).toTile()); + textWnd.horizSizing = Width; + textWnd.vertSizing = Height; + textWnd.position = new Vector(31, 29); + textWnd.extent = new Vector(276, 229); + pmBox.addChild(textWnd); + + var temprev = new BitmapData(1, 1); + temprev.setPixel(0, 0, 0); + var tmpprevtile = Tile.fromBitmap(temprev); + + var pmPreview = new GuiImage(tmpprevtile); + pmPreview.position = new Vector(312, 42); + pmPreview.extent = new Vector(258, 193); + pmBox.addChild(pmPreview); + var filt = new ColorMatrix(Matrix.I()); + pmPreview.bmp.filter = filt; + + var replayPlayButton = new GuiImage(ResourceLoader.getResource("data/ui/play/playback.png", ResourceLoader.getImage, this.imageResources).toTile()); + replayPlayButton.position = new Vector(38, 315); + replayPlayButton.extent = new Vector(18, 18); + replayPlayButton.pressedAction = (sender) -> { + hxd.File.browse((replayToLoad) -> { + replayToLoad.load((replayData) -> { + var replay = new Replay(""); + if (!replay.read(replayData)) { + cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); + // Idk do something to notify the user here + } else { + var repmis = replay.mission; + + // Strip data/ from the mission name + if (StringTools.startsWith(repmis, "data/")) { + repmis = repmis.substr(5); + } + + var mi = MissionList.missions.get(repmis); + + // try with data/ added + if (mi == null) { + if (!StringTools.contains(repmis, "data/")) + repmis = "data/" + repmis; + mi = MissionList.missions.get(repmis); + } + + var playMis = mi; + if (playMis != null) { + cast(this.parent, Canvas).marbleGame.watchMissionReplay(playMis, replay, PlayMissionGui); + } else { + cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); + } + } + }); + }, { + title: "Select replay file", + fileTypes: [ + { + name: "Replay (*.mbr)", + extensions: ["mbr"] + } + ], + }); + }; + pmBox.addChild(replayPlayButton); + + var replayRecordButton = new GuiImage(ResourceLoader.getResource("data/ui/play/record.png", ResourceLoader.getImage, this.imageResources).toTile()); + replayRecordButton.position = new Vector(56, 315); + replayRecordButton.extent = new Vector(18, 18); + replayRecordButton.pressedAction = (sender) -> { + cast(this.parent, Canvas).marbleGame.toRecord = true; + cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); + }; + pmBox.addChild(replayRecordButton); + + var levelWnd = new GuiImage(ResourceLoader.getResource("data/ui/play/level_window.png", ResourceLoader.getImage, this.imageResources).toTile()); + levelWnd.position = new Vector(); + levelWnd.extent = new Vector(258, 194); + pmPreview.addChild(levelWnd); + var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); var domcasual24b = new BitmapFont(domcasual24fontdata.entry); @:privateAccess domcasual24b.loader = ResourceLoader.loader; @@ -123,843 +217,68 @@ class PlayMissionGui extends GuiImage { var arial14b = new BitmapFont(arial14fontdata.entry); @:privateAccess arial14b.loader = ResourceLoader.loader; var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - var arial12 = arial14b.toSdfFont(cast 10 * Settings.uiScale, MultiChannel); var arialb14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); var arialb14b = new BitmapFont(arialb14fontdata.entry); @:privateAccess arialb14b.loader = ResourceLoader.loader; var arialBold14 = arialb14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - 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 markerFelt16 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); - var markerFelt18 = markerFelt32b.toSdfFont(cast 17 * Settings.uiScale, MultiChannel); - var markerFelt26 = markerFelt32b.toSdfFont(cast 22 * Settings.uiScale, MultiChannel); + var levelBkgnd = new GuiText(domcasual24); + levelBkgnd.position = new Vector(5, 156); + levelBkgnd.extent = new Vector(254, 24); + levelBkgnd.text.textColor = 0x000000; + levelBkgnd.justify = Center; + levelBkgnd.text.text = "Beginner Level 3"; + levelWnd.addChild(levelBkgnd); - function mlFontLoader(text:String) { - switch (text) { - case "DomCasual24": - return domcasual24; - case "Arial12": - return arial14; - case "Arial14": - return arial14; - case "ArialBold14": - return arialBold14; - case "MarkerFelt32": - return markerFelt32; - case "MarkerFelt24": - return markerFelt24; - case "MarkerFelt18": - return markerFelt18; - case "MarkerFelt20": - return markerFelt20; - case "MarkerFelt26": - return markerFelt26; - default: - return null; - } - } + var levelFgnd = new GuiText(domcasual24); + levelFgnd.position = new Vector(4, 155); + levelFgnd.extent = new Vector(254, 24); + levelFgnd.text.textColor = 0xFFFFFF; + levelFgnd.justify = Center; + levelFgnd.text.text = "Beginner Level 3"; + levelWnd.addChild(levelFgnd); - function imgLoader(path:String) { - var t = switch (path) { - case "pc": - ResourceLoader.getResource("data/ui/mp/play/platform_desktop_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "mac": - ResourceLoader.getResource("data/ui/mp/play/platform_mac_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "web": - ResourceLoader.getResource("data/ui/mp/play/platform_web_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "android": - ResourceLoader.getResource("data/ui/mp/play/platform_android_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "unknown": - ResourceLoader.getResource("data/ui/mp/play/platform_unknown_white.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "rewind": - ResourceLoader.getResource("data/ui/mp/play/rewind_ico.png", ResourceLoader.getImage, this.imageResources).toTile(); - case "watch": - ResourceLoader.getResource("data/ui/play/record.png", ResourceLoader.getImage, this.imageResources).toTile(); - case _: - return null; - }; - if (t != null) - t.scaleToSize(t.width * (Settings.uiScale), t.height * (Settings.uiScale)); - return t; - } - - var pmBox = new GuiImage(ResourceLoader.getResource('data/ui/play/window.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmBox.horizSizing = Center; - pmBox.vertSizing = Center; - pmBox.position = new Vector(-80. - 10); - pmBox.extent = new Vector(800, 500); - container.addChild(pmBox); - - var pmDifficultyPopup:GuiControl = null; - - var pmDifficulty = new GuiButton(loadButtonImages("data/ui/play/difficulty_beginner")); - pmDifficulty.position = new Vector(168, 98); - pmDifficulty.extent = new Vector(203, 43); - pmDifficulty.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(pmDifficultyPopup); - }; - pmBox.addChild(pmDifficulty); - - var pmDifficultyMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_platinum.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDifficultyMarble.position = new Vector(151, 11); - pmDifficultyMarble.extent = new Vector(21, 22); - pmDifficulty.addChild(pmDifficultyMarble); - - var pmMenuButton = new GuiButton(loadButtonImages("data/ui/play/menu")); - pmMenuButton.position = new Vector(119, 325); - pmMenuButton.extent = new Vector(92, 43); - pmMenuButton.accelerator = hxd.Key.ESCAPE; - pmMenuButton.gamepadAccelerator = ["B"]; - pmMenuButton.pressedAction = (sender) -> { - cast(this.parent, Canvas).setContent(new MainMenuGui()); - }; - pmBox.addChild(pmMenuButton); - - var pmMorePop:GuiControl = null; - - var pmMore = new GuiButton(loadButtonImages("data/ui/play/more")); - pmMore.position = new Vector(217, 325); - pmMore.extent = new Vector(92, 43); - pmMore.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(pmMorePop); - }; - pmBox.addChild(pmMore); - - var pmSearch = new GuiButton(loadButtonImages("data/ui/play/search")); - pmSearch.position = new Vector(315, 325); - pmSearch.extent = new Vector(43, 43); - pmSearch.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new SearchGui(currentGame, currentCategory == "custom")); - } - pmBox.addChild(pmSearch); - - var sortAlphaImgs = loadButtonImages("data/ui/play/sort_alpha"); - var sortDateImgs = loadButtonImages("data/ui/play/sort_date"); - - var pmSort = new GuiButton(sortAlphaImgs); - pmSort.position = new Vector(366, 325); - pmSort.extent = new Vector(43, 43); - pmSort.pressedAction = (e) -> { - currentSortType = (currentSortType + 1) % 2; - if (currentSortType == 0) { - @:privateAccess pmSort.anim.frames = sortAlphaImgs; - } - if (currentSortType == 1) { - @:privateAccess pmSort.anim.frames = sortDateImgs; - } - setCategoryFunc(currentGame, currentCategoryStatic, currentSortType == 1 ? "date" : "alpha"); - // MarbleGame.canvas.pushDialog(new SearchGui(currentGame, currentCategory == "custom")); - } - - if (currentSortType == 0) { - @:privateAccess pmSort.anim.frames = sortAlphaImgs; - } - if (currentSortType == 1) { - @:privateAccess pmSort.anim.frames = sortDateImgs; - } - - pmBox.addChild(pmSort); - - var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); - pmPrev.position = new Vector(436, 325); - pmPrev.extent = new Vector(72, 43); - pmPrev.gamepadAccelerator = ["dpadLeft"]; - pmPrev.pressedAction = (sender) -> { - setSelectedFunc(currentSelection - 1); - } - pmBox.addChild(pmPrev); + var noQualText = new GuiText(domcasual32); + noQualText.position = new Vector(0, 84); + noQualText.extent = new Vector(254, 32); + noQualText.text.textColor = 0xCCCCCC; + noQualText.justify = Center; + noQualText.text.text = "Not Qualified!"; + levelWnd.addChild(noQualText); var pmPlay = new GuiButton(loadButtonImages("data/ui/play/play")); - pmPlay.position = new Vector(510, 325); - pmPlay.extent = new Vector(92, 43); + pmPlay.position = new Vector(391, 257); + pmPlay.extent = new Vector(121, 62); pmPlay.gamepadAccelerator = ["A"]; pmPlay.pressedAction = (sender) -> { // Wacky hacks currentList[currentSelection].index = currentSelection; - currentList[currentSelection].difficultyIndex = ["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory); + currentList[currentSelection].difficultyIndex = ["beginner", "intermediate", "advanced"].indexOf(currentCategory); currentSelectionStatic = currentSelection; currentCategoryStatic = currentCategory; cast(this.parent, Canvas).marbleGame.playMission(currentList[currentSelection]); } pmBox.addChild(pmPlay); + var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); + pmPrev.position = new Vector(321, 260); + pmPrev.extent = new Vector(77, 58); + pmPrev.gamepadAccelerator = ["dpadLeft"]; + pmPrev.pressedAction = (sender) -> { + setSelectedFunc(currentSelection - 1); + } + pmBox.addChild(pmPrev); + var pmNext = new GuiButton(loadButtonImages("data/ui/play/next")); - pmNext.position = new Vector(604, 325); - pmNext.extent = new Vector(72, 43); + pmNext.position = new Vector(507, 262); + pmNext.extent = new Vector(75, 60); pmNext.gamepadAccelerator = ["dpadRight"]; pmNext.pressedAction = (sender) -> { setSelectedFunc(currentSelection + 1); } pmBox.addChild(pmNext); - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - - var pmPreview = new GuiImage(tmpprevtile); - pmPreview.position = new Vector(429, 96); - pmPreview.extent = new Vector(256, 194); - var filt = new ColorMatrix(Matrix.I()); - pmPreview.bmp.filter = filt; - pmBox.addChild(pmPreview); - - var pmPreviewFrame = new GuiImage(ResourceLoader.getResource('data/ui/play/levelframe.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmPreviewFrame.position = new Vector(0, 0); - pmPreviewFrame.extent = new Vector(256, 194); - pmPreview.addChild(pmPreviewFrame); - - var noQualText = new GuiText(markerFelt32); - noQualText.position = new Vector(0, 78); - noQualText.extent = new Vector(256, 14); - noQualText.text.textColor = 0xCCCCCC; - noQualText.justify = Center; - noQualText.text.text = "Not Qualified!"; - pmPreview.addChild(noQualText); - - var pmEgg = new GuiImage(ResourceLoader.getResource('data/ui/play/eggfound.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmEgg.position = new Vector(228, 157); - pmEgg.extent = new Vector(14, 21); - pmPreview.addChild(pmEgg); - - var pmDescription = new GuiMLText(markerFelt18, mlFontLoader); - pmDescription.position = new Vector(110, 145); - pmDescription.extent = new Vector(320, 146); - pmBox.addChild(pmDescription); - - var pmDescriptionRight = new GuiMLText(markerFelt18, mlFontLoader); - pmDescriptionRight.position = new Vector(110, 145); - pmDescriptionRight.extent = new Vector(320, 146); - pmBox.addChild(pmDescriptionRight); - - var pmParText = new GuiMLText(markerFelt18, mlFontLoader); - pmParText.position = new Vector(110, 292); - pmParText.extent = new Vector(320, 14); - pmBox.addChild(pmParText); - - var pmParTextRight = new GuiMLText(markerFelt18, mlFontLoader); - pmParTextRight.position = new Vector(110, 292); - pmParTextRight.extent = new Vector(320, 14); - pmBox.addChild(pmParTextRight); - - var pmScoreText = new GuiMLText(markerFelt18, mlFontLoader); - pmScoreText.position = new Vector(441, 292); - pmScoreText.extent = new Vector(235, 14); - pmBox.addChild(pmScoreText); - - var scoreView:LeaderboardsKind = All; - var showLBs = false; - - pmScoreButton = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]); - pmScoreButton.position = new Vector(438, 282); - pmScoreButton.extent = new Vector(240, 39); - pmScoreButton.pressedAction = (e) -> { - if (showLBs) { - scoreView = cast((cast(scoreView, Int) + 1) % 3); - } else { - scoreShowing = !scoreShowing; - } - setSelectedFunc(currentSelection); - }; - pmBox.addChild(pmScoreButton); - - // Difficulty popup - pmDifficultyPopup = new GuiControl(); - pmDifficultyPopup.horizSizing = Width; - pmDifficultyPopup.vertSizing = Height; - pmDifficultyPopup.position = new Vector(0, 0); - pmDifficultyPopup.extent = new Vector(640, 480); - - var pmDifficultyPopupInner = new GuiImage(tmpprevtile); - pmDifficultyPopupInner.position = new Vector(-80, -10); - pmDifficultyPopupInner.extent = new Vector(800, 500); - pmDifficultyPopupInner.horizSizing = Center; - pmDifficultyPopupInner.vertSizing = Center; - pmDifficultyPopup.addChild(pmDifficultyPopupInner); - pmDifficultyPopupInner.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(pmDifficultyPopup, false); - } - - var pmDifficultyCtrl = new GuiImage(tmpprevtile); - pmDifficultyCtrl.position = new Vector(-19, 116); - pmDifficultyCtrl.extent = new Vector(583, 252); - pmDifficultyPopupInner.addChild(pmDifficultyCtrl); - - var pmDifficultyBgCtrl = new GuiControl(); - pmDifficultyBgCtrl.position = new Vector(0, 0); - pmDifficultyBgCtrl.extent = new Vector(583, 252); - pmDifficultyBgCtrl.horizSizing = Width; - pmDifficultyBgCtrl.vertSizing = Height; - pmDifficultyCtrl.addChild(pmDifficultyBgCtrl); - - var pmDifficultyBgTL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tl.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgTL.position = new Vector(0, 0); - pmDifficultyBgTL.extent = new Vector(49, 45); - pmDifficultyBgTL.horizSizing = Right; - pmDifficultyBgTL.vertSizing = Bottom; - pmDifficultyBgCtrl.addChild(pmDifficultyBgTL); - - var pmDifficultyBgTR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tr.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgTR.position = new Vector(534, 0); - pmDifficultyBgTR.extent = new Vector(49, 45); - pmDifficultyBgTR.horizSizing = Left; - pmDifficultyBgTR.vertSizing = Bottom; - pmDifficultyBgCtrl.addChild(pmDifficultyBgTR); - - var pmDifficultyBgBL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/bl.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgBL.position = new Vector(0, 190); - pmDifficultyBgBL.extent = new Vector(49, 62); - pmDifficultyBgBL.horizSizing = Right; - pmDifficultyBgBL.vertSizing = Top; - pmDifficultyBgCtrl.addChild(pmDifficultyBgBL); - - var pmDifficultyBgBR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/br.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgBR.position = new Vector(534, 190); - pmDifficultyBgBR.extent = new Vector(49, 62); - pmDifficultyBgBR.horizSizing = Left; - pmDifficultyBgBR.vertSizing = Top; - pmDifficultyBgCtrl.addChild(pmDifficultyBgBR); - - var pmDifficultyBgL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/l.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgL.position = new Vector(0, 45); - pmDifficultyBgL.extent = new Vector(49, 145); - pmDifficultyBgL.horizSizing = Right; - pmDifficultyBgL.vertSizing = Height; - pmDifficultyBgCtrl.addChild(pmDifficultyBgL); - - var pmDifficultyBgR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/r.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgR.position = new Vector(534, 45); - pmDifficultyBgR.extent = new Vector(49, 145); - pmDifficultyBgR.horizSizing = Left; - pmDifficultyBgR.vertSizing = Height; - pmDifficultyBgCtrl.addChild(pmDifficultyBgR); - - var pmDifficultyBgB = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/b.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgB.position = new Vector(49, 190); - pmDifficultyBgB.extent = new Vector(485, 62); - pmDifficultyBgB.horizSizing = Width; - pmDifficultyBgB.vertSizing = Top; - pmDifficultyBgCtrl.addChild(pmDifficultyBgB); - - var pmDifficultyBgC = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/c.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyBgC.position = new Vector(49, 45); - pmDifficultyBgC.extent = new Vector(485, 145); - pmDifficultyBgC.horizSizing = Width; - pmDifficultyBgC.vertSizing = Height; - pmDifficultyBgCtrl.addChild(pmDifficultyBgC); - - var pmDifficultyTopC = new GuiControl(); - pmDifficultyTopC.horizSizing = Width; - pmDifficultyTopC.vertSizing = Bottom; - pmDifficultyTopC.position = new Vector(49, 0); - pmDifficultyTopC.extent = new Vector(485, 45); - pmDifficultyBgCtrl.addChild(pmDifficultyTopC); - - var pmDifficultyTopCT = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/t.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyTopCT.position = new Vector(0, 0); - pmDifficultyTopCT.extent = new Vector(231, 45); - pmDifficultyTopCT.horizSizing = Width; - pmDifficultyTopCT.vertSizing = Bottom; - pmDifficultyTopC.addChild(pmDifficultyTopCT); - - var pmDifficultyTopCTab = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tabt.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDifficultyTopCTab.position = new Vector(231, 0); - pmDifficultyTopCTab.extent = new Vector(25, 45); - pmDifficultyTopCTab.horizSizing = Left; - pmDifficultyTopCTab.vertSizing = Bottom; - pmDifficultyTopC.addChild(pmDifficultyTopCTab); - - var pmDifficultyTopC2 = new GuiControl(); - pmDifficultyTopC2.horizSizing = Left; - pmDifficultyTopC2.vertSizing = Bottom; - pmDifficultyTopC2.position = new Vector(293, 0); - pmDifficultyTopC2.extent = new Vector(243, 45); - pmDifficultyBgCtrl.addChild(pmDifficultyTopC2); - - var pmDifficultyTopCT2 = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/t.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmDifficultyTopCT2.position = new Vector(13, 0); - pmDifficultyTopCT2.extent = new Vector(230, 45); - pmDifficultyTopCT2.horizSizing = Width; - pmDifficultyTopCT2.vertSizing = Bottom; - pmDifficultyTopC2.addChild(pmDifficultyTopCT2); - - var pmDifficultyTopCTab2 = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tabt.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDifficultyTopCTab2.position = new Vector(-12, 0); - pmDifficultyTopCTab2.extent = new Vector(25, 45); - pmDifficultyTopCTab2.horizSizing = Right; - pmDifficultyTopCTab2.vertSizing = Bottom; - pmDifficultyTopC2.addChild(pmDifficultyTopCTab2); - - var pmDifficultyUltraAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyUltraAdvanced.position = new Vector(277, 134); - pmDifficultyUltraAdvanced.ratio = -1 / 16; - pmDifficultyUltraAdvanced.setExtent(new Vector(120, 31)); - pmDifficultyUltraAdvanced.txtCtrl.text.text = " Advanced"; - pmDifficultyUltraAdvanced.pressedAction = (e) -> { - currentList = MissionList.missionList["ultra"]["advanced"]; - currentCategory = "advanced"; - setCategoryFunc("ultra", "advanced"); - } - pmDifficultyCtrl.addChild(pmDifficultyUltraAdvanced); - - var pmDifficultyUltraBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyUltraBeginner.position = new Vector(277, 75); - pmDifficultyUltraBeginner.ratio = -1 / 16; - pmDifficultyUltraBeginner.setExtent(new Vector(120, 31)); - pmDifficultyUltraBeginner.txtCtrl.text.text = " Beginner"; - pmDifficultyUltraBeginner.pressedAction = (e) -> { - currentList = MissionList.missionList["ultra"]["beginner"]; - currentCategory = "beginner"; - setCategoryFunc("ultra", "beginner"); - } - pmDifficultyCtrl.addChild(pmDifficultyUltraBeginner); - - var pmDifficultyUltraIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyUltraIntermediate.position = new Vector(277, 104); - pmDifficultyUltraIntermediate.ratio = -1 / 16; - pmDifficultyUltraIntermediate.setExtent(new Vector(120, 31)); - pmDifficultyUltraIntermediate.txtCtrl.text.text = " Intermediate"; - pmDifficultyUltraIntermediate.pressedAction = (e) -> { - currentList = MissionList.missionList["ultra"]["intermediate"]; - currentCategory = "intermediate"; - setCategoryFunc("ultra", "intermediate"); - } - pmDifficultyCtrl.addChild(pmDifficultyUltraIntermediate); - - var pmDifficultyGoldAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyGoldAdvanced.position = new Vector(37, 134); - pmDifficultyGoldAdvanced.ratio = -1 / 16; - pmDifficultyGoldAdvanced.setExtent(new Vector(120, 31)); - pmDifficultyGoldAdvanced.txtCtrl.text.text = " Advanced"; - pmDifficultyGoldAdvanced.pressedAction = (e) -> { - currentList = MissionList.missionList["gold"]["advanced"]; - currentCategory = "advanced"; - setCategoryFunc("gold", "advanced"); - } - pmDifficultyCtrl.addChild(pmDifficultyGoldAdvanced); - - var pmDifficultyGoldBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyGoldBeginner.position = new Vector(37, 75); - pmDifficultyGoldBeginner.ratio = -1 / 16; - pmDifficultyGoldBeginner.setExtent(new Vector(120, 31)); - pmDifficultyGoldBeginner.txtCtrl.text.text = " Beginner"; - pmDifficultyGoldBeginner.pressedAction = (e) -> { - currentList = MissionList.missionList["gold"]["beginner"]; - currentCategory = "beginner"; - setCategoryFunc("gold", "beginner"); - } - pmDifficultyCtrl.addChild(pmDifficultyGoldBeginner); - - var pmDifficultyGoldIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyGoldIntermediate.position = new Vector(37, 104); - pmDifficultyGoldIntermediate.ratio = -1 / 16; - pmDifficultyGoldIntermediate.setExtent(new Vector(120, 31)); - pmDifficultyGoldIntermediate.txtCtrl.text.text = " Intermediate"; - pmDifficultyGoldIntermediate.pressedAction = (e) -> { - currentList = MissionList.missionList["gold"]["intermediate"]; - currentCategory = "intermediate"; - setCategoryFunc("gold", "intermediate"); - } - pmDifficultyCtrl.addChild(pmDifficultyGoldIntermediate); - - var pmDifficultyPlatinumAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyPlatinumAdvanced.position = new Vector(157, 134); - pmDifficultyPlatinumAdvanced.ratio = -1 / 16; - pmDifficultyPlatinumAdvanced.setExtent(new Vector(120, 31)); - pmDifficultyPlatinumAdvanced.txtCtrl.text.text = " Advanced"; - pmDifficultyPlatinumAdvanced.pressedAction = (e) -> { - currentList = MissionList.missionList["platinum"]["advanced"]; - currentCategory = "advanced"; - setCategoryFunc("platinum", "advanced"); - } - pmDifficultyCtrl.addChild(pmDifficultyPlatinumAdvanced); - - var pmDifficultyPlatinumBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyPlatinumBeginner.position = new Vector(157, 75); - pmDifficultyPlatinumBeginner.ratio = -1 / 16; - pmDifficultyPlatinumBeginner.setExtent(new Vector(120, 31)); - pmDifficultyPlatinumBeginner.txtCtrl.text.text = " Beginner"; - pmDifficultyPlatinumBeginner.pressedAction = (e) -> { - currentList = MissionList.missionList["platinum"]["beginner"]; - currentCategory = "beginner"; - setCategoryFunc("platinum", "beginner"); - } - pmDifficultyCtrl.addChild(pmDifficultyPlatinumBeginner); - - var pmDifficultyPlatinumIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyPlatinumIntermediate.position = new Vector(157, 104); - pmDifficultyPlatinumIntermediate.ratio = -1 / 16; - pmDifficultyPlatinumIntermediate.setExtent(new Vector(120, 31)); - pmDifficultyPlatinumIntermediate.txtCtrl.text.text = " Intermediate"; - pmDifficultyPlatinumIntermediate.pressedAction = (e) -> { - currentList = MissionList.missionList["platinum"]["intermediate"]; - currentCategory = "intermediate"; - setCategoryFunc("platinum", "intermediate"); - } - pmDifficultyCtrl.addChild(pmDifficultyPlatinumIntermediate); - - var pmDifficultyPlatinumExpert = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyPlatinumExpert.position = new Vector(157, 164); - pmDifficultyPlatinumExpert.ratio = -1 / 16; - pmDifficultyPlatinumExpert.setExtent(new Vector(120, 31)); - pmDifficultyPlatinumExpert.txtCtrl.text.text = " Expert"; - pmDifficultyPlatinumExpert.pressedAction = (e) -> { - currentList = MissionList.missionList["platinum"]["expert"]; - currentCategory = "expert"; - setCategoryFunc("platinum", "expert"); - } - pmDifficultyCtrl.addChild(pmDifficultyPlatinumExpert); - - var pmGameUltra = new GuiText(markerFelt24); - pmGameUltra.text.text = " Ultra"; - pmGameUltra.text.textColor = 0; - pmGameUltra.position = new Vector(277, 33); - pmGameUltra.extent = new Vector(120, 31); - pmDifficultyCtrl.addChild(pmGameUltra); - - var pmGameUltraMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_ultra.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmGameUltraMarble.position = new Vector(95, 5); - pmGameUltraMarble.extent = new Vector(21, 22); - pmGameUltra.addChild(pmGameUltraMarble); - - var pmGameGold = new GuiText(markerFelt24); - pmGameGold.text.text = " Gold Levels"; - pmGameGold.text.textColor = 0; - pmGameGold.position = new Vector(37, 33); - pmGameGold.extent = new Vector(120, 31); - pmDifficultyCtrl.addChild(pmGameGold); - - var pmGameGoldMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_gold.png', ResourceLoader.getImage, this.imageResources).toTile()); - pmGameGoldMarble.position = new Vector(95, 5); - pmGameGoldMarble.extent = new Vector(21, 22); - pmGameGold.addChild(pmGameGoldMarble); - - var pmGamePlatinum = new GuiText(markerFelt24); - pmGamePlatinum.text.text = " Platinum"; - pmGamePlatinum.text.textColor = 0; - pmGamePlatinum.position = new Vector(157, 33); - pmGamePlatinum.extent = new Vector(120, 31); - pmDifficultyCtrl.addChild(pmGamePlatinum); - - var pmGamePlatinumMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_platinum.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmGamePlatinumMarble.position = new Vector(95, 5); - pmGamePlatinumMarble.extent = new Vector(21, 22); - pmGamePlatinum.addChild(pmGamePlatinumMarble); - - var pmGameCustom = new GuiText(markerFelt24); - pmGameCustom.horizSizing = Left; - pmGameCustom.text.text = " Custom Levels"; - pmGameCustom.text.textColor = 0; - pmGameCustom.position = new Vector(395, 33); - pmGameCustom.extent = new Vector(120, 31); - pmDifficultyCtrl.addChild(pmGameCustom); - - var pmDifficultyGoldCustom = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyGoldCustom.position = new Vector(397, 75); - pmDifficultyGoldCustom.ratio = -1 / 16; - pmDifficultyGoldCustom.setExtent(new Vector(120, 31)); - pmDifficultyGoldCustom.txtCtrl.text.text = " Gold"; - pmDifficultyGoldCustom.pressedAction = (e) -> { - if (Marbleland.goldMissions.length == 0) { - var mbo = new MessageBoxOkDlg("Level list has not been downloaded yet. Please try again later"); - MarbleGame.canvas.pushDialog(mbo); - } else { - currentCategory = "custom"; - setCategoryFunc("gold", "custom", currentSortType == 1 ? "date" : "alpha"); - } - } - pmDifficultyCtrl.addChild(pmDifficultyGoldCustom); - - var pmDifficultyPlatinumCustom = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyPlatinumCustom.position = new Vector(397, 104); - pmDifficultyPlatinumCustom.ratio = -1 / 16; - pmDifficultyPlatinumCustom.setExtent(new Vector(120, 31)); - pmDifficultyPlatinumCustom.txtCtrl.text.text = " Platinum"; - pmDifficultyPlatinumCustom.pressedAction = (e) -> { - if (Marbleland.platinumMissions.length == 0) { - var mbo = new MessageBoxOkDlg("Level list has not been downloaded yet. Please try again later"); - MarbleGame.canvas.pushDialog(mbo); - } else { - currentCategory = "custom"; - setCategoryFunc("platinum", "custom", currentSortType == 1 ? "date" : "alpha"); - } - } - pmDifficultyCtrl.addChild(pmDifficultyPlatinumCustom); - - var pmDifficultyUltraCustom = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyUltraCustom.position = new Vector(397, 134); - pmDifficultyUltraCustom.ratio = -1 / 16; - pmDifficultyUltraCustom.setExtent(new Vector(120, 31)); - pmDifficultyUltraCustom.txtCtrl.text.text = " Ultra"; - pmDifficultyUltraCustom.pressedAction = (e) -> { - if (Marbleland.ultraMissions.length == 0) { - var mbo = new MessageBoxOkDlg("Level list has not been downloaded yet. Please try again later"); - MarbleGame.canvas.pushDialog(mbo); - } else { - currentCategory = "custom"; - setCategoryFunc("ultra", "custom", currentSortType == 1 ? "date" : "alpha"); - } - } - pmDifficultyCtrl.addChild(pmDifficultyUltraCustom); - - var pmDifficultyCustomCustom = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); - pmDifficultyCustomCustom.position = new Vector(397, 164); - pmDifficultyCustomCustom.ratio = -1 / 16; - pmDifficultyCustomCustom.setExtent(new Vector(120, 31)); - pmDifficultyCustomCustom.txtCtrl.text.text = " Custom"; - pmDifficultyCustomCustom.pressedAction = (e) -> { - if (MissionList.customMissions.length == 0) { - var mbo = new MessageBoxOkDlg("No custom missions are installed!"); - MarbleGame.canvas.pushDialog(mbo); - } else { - currentCategory = "custom"; - setCategoryFunc("custom", "custom"); - } - } - pmDifficultyCtrl.addChild(pmDifficultyCustomCustom); - - var pmDividerR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-r.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDividerR.horizSizing = Left; - pmDividerR.position = new Vector(530, 62); - pmDividerR.extent = new Vector(12, 12); - pmDifficultyCtrl.addChild(pmDividerR); - - var pmDividerL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-l.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDividerL.horizSizing = Right; - pmDividerL.position = new Vector(39, 62); - pmDividerL.extent = new Vector(12, 12); - pmDifficultyCtrl.addChild(pmDividerL); - - var pmDividerC = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-c.png', ResourceLoader.getImage, this.imageResources) - .toTile()); - pmDividerC.horizSizing = Width; - pmDividerC.position = new Vector(51, 62); - pmDividerC.extent = new Vector(479, 12); - pmDifficultyCtrl.addChild(pmDividerC); - - pmMorePop = new GuiControl(); - pmMorePop.horizSizing = Width; - pmMorePop.vertSizing = Height; - pmMorePop.position = new Vector(0, 0); - pmMorePop.extent = new Vector(640, 480); - - var pmMorePopInner = new GuiImage(tmpprevtile); - pmMorePopInner.position = new Vector(0, 0); - pmMorePopInner.extent = new Vector(640, 480); - pmMorePopInner.horizSizing = Center; - pmMorePopInner.vertSizing = Center; - pmMorePop.addChild(pmMorePopInner); - pmMorePopInner.pressedAction = (e) -> { - MarbleGame.canvas.popDialog(pmMorePop, false); - } - - var pmMorePopCtrl = new GuiControl(); - pmMorePopCtrl.horizSizing = Center; - pmMorePopCtrl.vertSizing = Center; - pmMorePopCtrl.position = new Vector(-80, -10); - pmMorePopCtrl.extent = new Vector(800, 500); - pmMorePop.addChild(pmMorePopCtrl); - - var pmMorePopDlg = new GuiButton(loadButtonImages("data/ui/play/moremenu")); - pmMorePopDlg.position = new Vector(92, 204); - pmMorePopDlg.extent = new Vector(338, 146); - pmMorePopCtrl.addChild(pmMorePopDlg); - - var pmMarbleSelect = new GuiButton(loadButtonImages("data/ui/play/marble")); - pmMarbleSelect.position = new Vector(50, 46); - pmMarbleSelect.extent = new Vector(43, 43); - pmMarbleSelect.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new MarbleSelectGui()); - } - pmMorePopDlg.addChild(pmMarbleSelect); - - var pmStats = new GuiButton(loadButtonImages("data/ui/play/statistics")); - pmStats.position = new Vector(101, 46); - pmStats.extent = new Vector(43, 43); - pmStats.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new StatisticsGui(this.currentGame)); - } - pmMorePopDlg.addChild(pmStats); - - var pmAchievements = new GuiButton(loadButtonImages("data/ui/play/achiev")); - pmAchievements.position = new Vector(150, 46); - pmAchievements.extent = new Vector(43, 43); - pmAchievements.pressedAction = (e) -> { - MarbleGame.canvas.pushDialog(new AchievementsGui()); - } - pmMorePopDlg.addChild(pmAchievements); - - var pmEditorToggle = new GuiButton(loadButtonImages("data/ui/play/editor")); - pmEditorToggle.position = new Vector(198, 46); - pmEditorToggle.extent = new Vector(43, 43); - pmEditorToggle.disabled = true; - pmMorePopDlg.addChild(pmEditorToggle); - - var pmRecord = new GuiButton(loadButtonImages("data/ui/play/replay")); - pmRecord.position = new Vector(247, 46); - pmRecord.extent = new Vector(43, 43); - pmRecord.pressedAction = (sender) -> { - MarbleGame.instance.toRecord = true; - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); - }; - pmMorePopDlg.addChild(pmRecord); - - var scoreScroll = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources) - .toTile()); - scoreScroll.position = new Vector(110, 170); - scoreScroll.extent = new Vector(407, 143); - scoreScroll.childrenHandleScroll = true; - scoreScroll.scrollToBottom = true; - // window.addChild(chatScroll); - - var scoreBox = new GuiMLText(markerFelt16, mlFontLoader); - scoreBox.text.loadImage = imgLoader; - scoreBox.text.onHyperlink = (url) -> { - if (url == "watch") { - var currentMission = currentList[currentSelection]; - var lbPath = currentMission.path; - if (currentMission.isClaMission) - lbPath = 'custom/${currentMission.id}'; - Leaderboards.watchTopReplay(lbPath, scoreView, (b) -> { - if (b != null) { - var replayF = new Replay(""); - if (replayF.read(b)) { - var repmis = replayF.mission; - // Strip data/ from the mission name - if (StringTools.startsWith(repmis, "data/")) { - repmis = repmis.substr(5); - } - - var mi = replayF.customId == 0 ? MissionList.missions.get(repmis) : Marbleland.missions.get(replayF.customId); - - // try with data/ added - if (mi == null && replayF.customId == 0) { - if (!StringTools.contains(repmis, "data/")) - repmis = "data/" + repmis; - mi = MissionList.missions.get(repmis); - } - - if (mi.isClaMission) { - mi.download(() -> { - MarbleGame.instance.watchMissionReplay(mi, replayF, PlayMissionGui); - }); - } else { - MarbleGame.instance.watchMissionReplay(mi, replayF, PlayMissionGui); - } - } else { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Could not load replay for this level.")); - } - } else { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("No top replay found for this level.")); - } - }); - } - } - scoreBox.text.textColor = 0xF4E4CE; - scoreBox.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - scoreBox.text.lineSpacing = -1; - scoreBox.horizSizing = Width; - scoreBox.position = new Vector(0, 0); - scoreBox.extent = new Vector(407, 1184); - var scores = [ - '1. Nardo Polo99:59:999', - '2. Nardo Polo99:59:999', - '3. Nardo Polo99:59:999', - '4. Nardo Polo99:59:999', - '5. Nardo Polo99:59:999', - ]; - scoreBox.text.text = '

Loading scores

'; // scores.join('
'); - scoreBox.text.imageVerticalAlign = Top; - scoreScroll.addChild(scoreBox); - - var lbImgs = loadButtonImages("data/ui/play/lb"); - var infoImgs = loadButtonImages("data/ui/play/info"); - - var pmLBToggle = new GuiButton(lbImgs); - pmLBToggle.position = new Vector(118, 98); - pmLBToggle.extent = new Vector(43, 43); - pmLBToggle.pressedAction = (e) -> { - showLBs = !showLBs; - if (!showLBs) { - @:privateAccess pmLBToggle.anim.frames = lbImgs; - } else { - @:privateAccess pmLBToggle.anim.frames = infoImgs; - } - - // pmScoreButton.disabled = showLBs; - // pmScoreText.text.visible = !showLBs; - - setSelectedFunc(currentSelection); - if (showLBs) { - pmBox.addChild(scoreScroll); - } else { - pmBox.removeChild(scoreScroll); - } - pmBox.render(MarbleGame.canvas.scene2d, pmBox.parent._flow); - // setCategoryFunc(currentGame, currentCategoryStatic, currentSortType == 1 ? "date" : "alpha"); - // MarbleGame.canvas.pushDialog(new SearchGui(currentGame, currentCategory == "custom")); - } - - if (!showLBs) { - @:privateAccess pmLBToggle.anim.frames = lbImgs; - } else { - @:privateAccess pmLBToggle.anim.frames = infoImgs; - } - - pmBox.addChild(pmLBToggle); - - // var replayPlayButton = new GuiImage(ResourceLoader.getResource("data/ui/play/playback.png", ResourceLoader.getImage, this.imageResources).toTile()); - // replayPlayButton.position = new Vector(38, 315); - // replayPlayButton.extent = new Vector(18, 18); - // replayPlayButton.pressedAction = (sender) -> { - // hxd.File.browse((replayToLoad) -> { - // replayToLoad.load((replayData) -> { - // var replay = new Replay(""); - // if (!replay.read(replayData)) { - // cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - // // Idk do something to notify the user here - // } else { - // var repmis = replay.mission; - // #if js - // repmis = StringTools.replace(repmis, "data/", ""); - // #end - // var playMis = MissionList.missions.get(repmis); - // if (playMis != null) { - // cast(this.parent, Canvas).marbleGame.watchMissionReplay(playMis, replay); - // } else { - // cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - // } - // } - // }); - // }, { - // title: "Select replay file", - // fileTypes: [ - // { - // name: "Replay (*.mbr)", - // extensions: ["mbr"] - // } - // ], - // }); - // }; - // pmBox.addChild(replayPlayButton); - buttonHoldFunc = (dt:Float, mouseState:MouseState) -> { var prevBox = pmPrev.getRenderRectangle(); var nextBox = pmNext.getRenderRectangle(); @@ -989,115 +308,166 @@ class PlayMissionGui extends GuiImage { } } - currentList = MissionList.missionList["platinum"]["beginner"]; + var pmBack = new GuiButton(loadButtonImages("data/ui/play/back")); + pmBack.position = new Vector(102, 260); + pmBack.extent = new Vector(79, 61); + pmBack.gamepadAccelerator = ["B"]; + pmBack.pressedAction = (sender) -> { + cast(this.parent, Canvas).setContent(new MainMenuGui()); + }; + pmBox.addChild(pmBack); - setCategoryFunc = function(game:String, category:String, ?sort:String = null, ?doRender:Bool = true) { - currentList = category == "custom" ? (switch (game) { - case 'gold' if (Marbleland.goldMissions.length != 0): Marbleland.goldMissions; - case 'platinum' if (Marbleland.platinumMissions.length != 0): Marbleland.platinumMissions; - case 'ultra' if (Marbleland.ultraMissions.length != 0): Marbleland.ultraMissions; - case 'custom' if (MissionList.customMissions.length != 0): MissionList.customMissions; - default: currentList; - }) : MissionList.missionList[game][category]; + var transparentbmp = new hxd.BitmapData(1, 1); + transparentbmp.setPixel(0, 0, 0); + var transparentTile = Tile.fromBitmap(transparentbmp); - @:privateAccess pmDifficulty.anim.frames = loadButtonImages('data/ui/play/difficulty_${category}'); - if (game != "custom") { - pmDifficultyMarble.bmp.visible = true; - pmDifficultyMarble.bmp.tile = ResourceLoader.getResource('data/ui/play/marble_${game}.png', ResourceLoader.getImage, this.imageResources) - .toTile(); - } else { - pmDifficultyMarble.bmp.visible = false; + var skipButton = new GuiButton([transparentTile, transparentTile, transparentTile]); + skipButton.horizSizing = Left; + skipButton.vertSizing = Top; + skipButton.position = new Vector(625, 465); + skipButton.extent = new Vector(18, 19); + skipButton.pressedAction = (sender) -> { + var currentDifficulty = ["beginner", "intermediate", "advanced"].indexOf(currentCategory); + if (currentDifficulty == -1) + return; + var currentProgression = Settings.progression[currentDifficulty]; + if (currentProgression + 1 == currentSelection) { + Settings.progression[currentDifficulty]++; } + setSelectedFunc(currentSelection); + }; + this.addChild(skipButton); - if (game == "platinum") { - pmAchievements.disabled = false; - } else { - pmAchievements.disabled = true; + function mlFontLoader(text:String) { + switch (text) { + case "DomCasual24": + return domcasual24; + case "Arial14": + return arial14; + case "ArialBold14": + return arialBold14; + default: + return null; } + } + var pmDescription = new GuiMLText(arial14, mlFontLoader); + pmDescription.position = new Vector(61, 52); + pmDescription.extent = new Vector(215, 174); + pmDescription.text.textColor = 0x000000; + // We're gonna use  to align shit lmao, its too hacky i know + var descText = 'Learn The Super Speed

' + 'ÂTest Align'; + descText += '

Best Times:
'; + for (i in 0...3) { + descText += '
ÂÂ${i + 1}. Nardo Polo'; + } + pmDescription.text.text = descText; + pmBox.addChild(pmDescription); + + // Oh god this is yet another hack cause I cant do that tab thing torque does so thats bruh + var pmDescriptionOther = new GuiMLText(arial14, mlFontLoader); + pmDescriptionOther.position = new Vector(61, 52); + pmDescriptionOther.extent = new Vector(215, 174); + pmDescriptionOther.text.textColor = 0x000000; + var descText2 = '

' + 'ÂTest Align'; + descText2 += '


'; + for (i in 0...3) { + descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ99:59.999'; + } + pmDescriptionOther.text.text = descText2; + pmBox.addChild(pmDescriptionOther); + + var tabBeginner = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_begin.png", ResourceLoader.getImage, this.imageResources).toTile()); + tabBeginner.position = new Vector(29, 2); + tabBeginner.extent = new Vector(184, 55); + tabBeginner.pressedAction = (sender) -> { + currentList = MissionList.beginnerMissions; + currentCategory = "beginner"; + setSelectedFunc(cast Math.min(Settings.progression[0], currentList.length - 1)); + setCategoryFunc("beginner"); + } + localContainer.addChild(tabBeginner); + + currentList = MissionList.beginnerMissions; + + setCategoryFunc = function(category:String, ?doRender:Bool = true) { + localContainer.removeChild(tabBeginner); + localContainer.removeChild(tabIntermediate); + localContainer.removeChild(tabAdvanced); + localContainer.removeChild(tabCustom); + localContainer.removeChild(pmBox); + if (doRender) + AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); + if (category == "beginner") { + localContainer.addChild(tabIntermediate); + localContainer.addChild(tabAdvanced); + localContainer.addChild(tabCustom); + localContainer.addChild(pmBox); + localContainer.addChild(tabBeginner); + currentList = MissionList.beginnerMissions; + } + if (category == "intermediate") { + localContainer.addChild(tabBeginner); + localContainer.addChild(tabAdvanced); + localContainer.addChild(tabCustom); + localContainer.addChild(pmBox); + localContainer.addChild(tabIntermediate); + currentList = MissionList.intermediateMissions; + } + if (category == "advanced") { + localContainer.addChild(tabBeginner); + localContainer.addChild(tabIntermediate); + localContainer.addChild(tabCustom); + localContainer.addChild(pmBox); + localContainer.addChild(tabAdvanced); + currentList = MissionList.advancedMissions; + } if (category == "custom") { - pmSort.anim.visible = true; - pmSort.disabled = false; - } else { - pmSort.anim.visible = false; - pmSort.disabled = true; + localContainer.addChild(tabBeginner); + localContainer.addChild(tabIntermediate); + localContainer.addChild(tabAdvanced); + localContainer.addChild(pmBox); + localContainer.addChild(tabCustom); + currentList = MissionList.customMissions; } - - if (sort != null) { - currentList = currentList.copy(); // Don't modify the originals - if (sort == "alpha") { - currentList.sort((x, y) -> x.title > y.title ? 1 : (x.title < y.title ? -1 : 0)); - } - if (sort == "date") { - currentList.sort((x, y) -> x.addedAt > y.addedAt ? 1 : (x.addedAt < y.addedAt ? -1 : 0)); - } - } - currentCategoryStatic = currentCategory; - - if (currentGame != game) { - currentGameStatic = game; - currentGame = game; - this.bmp.tile = chooseBg().resource.toTile(); - } - - setSelectedFunc(currentList.length - 1); - // if (doRender) - // this.render(cast(this.parent, Canvas).scene2d); + if (currentCategory != "custom") + setSelectedFunc(cast Math.min(currentList.length - 1, Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)])); + else + setSelectedFunc(currentList.length - 1); + if (doRender) + this.render(cast(this.parent, Canvas).scene2d); } - setScoreHover = (isHover) -> { - var currentMission = currentList[currentSelection]; - - if (!showLBs) { - pmScoreText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - var scoreTextTime = ""; - var scoreData = Settings.getScores(currentMission.path); - if (scoreData.length == 0) { - scoreTextTime = '99:59.999'; - } else { - var topScore = scoreData[0]; - var scoreColor = "#FFFFFF"; - if (topScore.time < currentMission.ultimateTime) { - scoreColor = "#FFCC33"; - } else if (topScore.time < currentMission.goldTime) { - if (currentMission.game == "gold" || currentMission.game.toLowerCase() == "ultra") - scoreColor = "#FFFF00" - else - scoreColor = "#CCCCCC"; - } - - scoreTextTime = '${Util.formatTime(topScore.time)}'; - } - - if (isHover) { - pmScoreText.text.text = '

${this.scoreShowing ? "Hide" : "Show"} 5 Top Times

'; - } else { - pmScoreText.text.text = '

Best Time: ${scoreTextTime}

'; - } - } else { - var kindList = ["All Scores", "Rewind Only", "No Rewind"]; - - pmScoreText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - if (isHover) { - pmScoreText.text.text = '

Show ${kindList[(cast(scoreView, Int) + 1) % 3]}

'; - } else { - pmScoreText.text.text = '

Showing: ${kindList[cast(scoreView, Int)]}

'; + function splitTextWithPadding(textElement:Text, textStr:String) { + var maxWidth = textElement.maxWidth; + textElement.maxWidth = null; + var splits = []; + var currentText = "Â"; + var textSplit = textStr.split(" "); + for (i in 0...textSplit.length) { + var prevText = currentText; + currentText += textSplit[i]; + if (i != textSplit.length - 1) + currentText += " "; + textElement.text = currentText; + if (textElement.textWidth > maxWidth) { + splits.push(StringTools.trim(prevText)); + currentText = "Â" + textSplit[i]; + if (i != textSplit.length - 1) + currentText += " "; } } + textElement.maxWidth = maxWidth; + splits.push(currentText); + return splits.join('\n'); } - var lbToken:Int = 0; + var goldBadge = ResourceLoader.getResource("data/ui/play/goldscore.png", ResourceLoader.getImage, this.imageResources).toTile(); + goldBadge.dy = 2.5 * Settings.uiScale; + goldBadge.dx = 8 * Settings.uiScale; + var gbWidth = goldBadge.width; + var gbHeight = goldBadge.height; setSelectedFunc = function setSelected(index:Int) { if (index > currentList.length - 1) { @@ -1121,31 +491,18 @@ class PlayMissionGui extends GuiImage { } else pmNext.disabled = false; - if (pmPreview.children.contains(pmEgg)) - pmPreview.removeChild(pmEgg); - if (currentMission.hasEgg) { - if (Settings.easterEggs.exists(currentMission.path)) { - pmEgg.bmp.tile = ResourceLoader.getResource('data/ui/play/eggfound.png', ResourceLoader.getImage, this.imageResources).toTile(); - } else { - pmEgg.bmp.tile = ResourceLoader.getResource('data/ui/play/eggnotfound.png', ResourceLoader.getImage, this.imageResources).toTile(); - } - - pmPreview.addChild(pmEgg); - pmEgg.render(MarbleGame.canvas.scene2d, @:privateAccess pmPreview._flow); + if (currentCategory != "custom" + && Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)] < currentSelection) { + noQualText.text.visible = true; + filt.matrix.identity(); + filt.matrix.colorGain(0, 96 / 255); + pmPlay.disabled = true; + } else { + noQualText.text.visible = false; + filt.matrix.identity(); + pmPlay.disabled = false; } - // if (currentCategory != "custom" - // && Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)] < currentSelection) { - // noQualText.text.visible = true; - // filt.matrix.identity(); - // filt.matrix.colorGain(0, 96 / 255); - // pmPlay.disabled = true; - // } else { - noQualText.text.visible = false; - filt.matrix.identity(); - pmPlay.disabled = false; - // } - if (currentMission == null) { noQualText.text.visible = true; filt.matrix.identity(); @@ -1161,174 +518,76 @@ class PlayMissionGui extends GuiImage { currentSelection = -1; } - pmDescription.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - pmDescription.text.lineSpacing = -1; + var scoreData:Array = Settings.getScores(currentMission.path); + while (scoreData.length < 3) { + scoreData.push({name: "Nardo Polo", time: 5999.999}); + } - pmDescriptionRight.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - pmDescriptionRight.text.lineSpacing = -1; - - var descText = '

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

'; - - if (!showLBs) { - if (this.scoreShowing) { - var scoreData:Array = Settings.getScores(currentMission.path); - while (scoreData.length < 5) { - scoreData.push({name: "Matan W.", time: 5999.999}); - } - - var rightText = '
'; - - for (i in 0...5) { - var score = scoreData[i]; - - var scoreColor = "#FFFFFF"; - if (score.time < currentMission.ultimateTime) { - scoreColor = "#FFCC33"; - } else if (score.time < currentMission.goldTime) { - if (currentMission.game == "gold" || currentMission.game.toLowerCase() == "ultra") - scoreColor = "#FFFF00"; - else - scoreColor = "#CCCCCC"; - } - - var scoreTextTime = '

${Util.formatTime(score.time)}

'; - rightText += scoreTextTime; - - descText += '${i + 1}. ${StringTools.htmlEscape(score.name)}
'; - } - - pmDescriptionRight.text.text = rightText; - } else { - descText += '

Author: ${StringTools.htmlEscape(currentMission.artist)}

'; - descText += '${StringTools.htmlEscape(currentMission.description)}'; - pmDescriptionRight.text.text = ''; - } - } else { - pmDescriptionRight.text.text = ''; - #if hl - if (lbRequest != null) - Http.cancel(lbRequest); - #end - #if js - if (lbRequest != 0) - Http.cancel(lbRequest); - #end - var lTok = lbToken++; - var lbPath = currentMission.path; - if (currentMission.isClaMission) - lbPath = 'custom/${currentMission.id}'; - var req = Leaderboards.getScores(lbPath, scoreView, (scoreList) -> { - if (lTok + 1 != lbToken || !showLBs) - return; - var sFmt = []; - var i = 1; - for (score in scoreList) { - sFmt.push('${i}. - ${StringTools.htmlEscape(score.name.substr(0, 30))} - ${Util.formatTime(score.score)} - - ${score.rewind == 1 ? ' ' : ""}'); - i++; - } - scoreBox.text.text = 'Leaderboards - ${scoreList.length != 0 ? 'Top Replay:' : ""} -
' - + sFmt.join('
'); - }); - lbRequest = req; - scoreBox.text.text = 'Leaderboards

Loading scores

'; - - scoreScroll.setScrollMax(scoreBox.text.textHeight); - scoreScroll.updateScrollVisual(); + var descText = '${currentMission.title}

' + + splitTextWithPadding(pmDescription.text, StringTools.htmlEscape(Util.unescape(currentMission.description))); + if (currentMission.qualifyTime != Math.POSITIVE_INFINITY) { + descText += '
Time To Qualify: ${Util.formatTime(currentMission.qualifyTime)}
'; + } + descText += '

Best Times:
'; + for (i in 0...3) { + descText += '
ÂÂ${i + 1}. ${scoreData[i].name}'; } pmDescription.text.text = descText; - pmParText.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - pmParTextRight.text.dropShadow = { - dx: 1 * Settings.uiScale, - dy: 1 * Settings.uiScale, - alpha: 0.5, - color: 0 - }; - if (!showLBs) { - if (this.scoreShowing) { - if (currentMission.game == "platinum") { - pmParText.text.text = 'Platinum: ${Util.formatTime(currentMission.goldTime)}'; - pmParTextRight.text.text = '

Ultimate: ${Util.formatTime(currentMission.ultimateTime)}

'; - } - if (currentMission.game == "gold") { - pmParText.text.text = 'Qualify: ${(currentMission.qualifyTime != Math.POSITIVE_INFINITY) ? Util.formatTime(currentMission.qualifyTime) : "N/A"}'; - pmParTextRight.text.text = '

Gold: ${Util.formatTime(currentMission.goldTime)}

'; - } - if (currentMission.game.toLowerCase() == "ultra") { - pmParText.text.text = 'Gold: ${Util.formatTime(currentMission.goldTime)}'; - pmParTextRight.text.text = '

Ultimate: ${Util.formatTime(currentMission.ultimateTime)}

'; - } - } else { - pmParText.text.text = '

${currentMission.game == "gold" ? "Qualify" : "Par"} Time: ${(currentMission.qualifyTime != Math.POSITIVE_INFINITY) ? Util.formatTime(currentMission.qualifyTime) : "N/A"}

'; - pmParTextRight.text.text = ''; - } - } else { - pmParText.text.text = ''; - pmParTextRight.text.text = ''; + var descText2 = '

' + + + '${splitTextWithPadding(pmDescriptionOther.text, StringTools.htmlEscape(Util.unescape(currentMission.description)))}'; + descText2 += '

'; + if (currentMission.qualifyTime != Math.POSITIVE_INFINITY) { + descText2 += '
Time To Qualify: ${Util.formatTime(currentMission.qualifyTime)}
'; } + descText2 += '
'; + for (i in 0...3) { + descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ${Util.formatTime(scoreData[i].time)}'; + if (scoreData[i].time < currentMission.goldTime) { + descText2 += ''; + } + } + pmDescriptionOther.text.lineHeightMode = TextOnly; + pmDescriptionOther.text.text = descText2; + pmDescriptionOther.text.loadImage = (name) -> goldBadge; + goldBadge.scaleToSize((gbWidth / gbHeight) * arialBold14.lineHeight, arialBold14.lineHeight); + pmDescription.text.lineSpacing = pmDescriptionOther.text.lineSpacing; - setScoreHover(scoreButtonHover); - - // pmPreview.bmp.tile = tmpprevtile; + #if android + pmPreview.bmp.tile = currentMission.getPreviewImageSync(); + #else + pmPreview.bmp.tile = tmpprevtile; + #end #if js switch (previewTimeoutHandle) { case None: previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - var prevpath = currentMission.getPreviewImage(prevImg -> { + currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } }, 75)); case Some(previewTimeoutHandle_id): js.Browser.window.clearTimeout(previewTimeoutHandle_id); previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - var prevpath = currentMission.getPreviewImage(prevImg -> { + currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } }, 75)); } #end - #if hl - var pTok = previewToken++; - var prevpath = currentMission.getPreviewImage(prevImg -> { - if (pTok + 1 != previewToken) - return; + #if (hl && !android) + currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); // Shit be sync - if (prevpath != pmPreview.bmp.tile.getTexture().name) { - pmPreview.bmp.tile = tmpprevtile; - } #end + + levelBkgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; + + levelFgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; } - var cSS = currentSelectionStatic; - setCategoryFunc(currentGame, currentCategoryStatic, currentCategoryStatic == "custom" ? (currentSortType == 1 ? "date" : "alpha") : null, false); + setCategoryFunc(currentCategoryStatic, false); #if js var kofi = new GuiButton(loadButtonImages("data/ui/kofi1")); @@ -1346,8 +605,6 @@ class PlayMissionGui extends GuiImage { } this.addChild(kofi); #end - - setSelectedFunc(cSS); } public override function render(scene2d:Scene, ?parent:h2d.Flow) { @@ -1364,32 +621,5 @@ class PlayMissionGui extends GuiImage { setSelectedFunc(currentSelection - 1); if (Key.isPressed(Key.RIGHT)) setSelectedFunc(currentSelection + 1); - - if (scoreButtonDirty) { - setScoreHover(scoreButtonHover); - scoreButtonDirty = false; - } - - if (pmScoreButton.getHitTestRect().inRect(mouseState.position)) { - if (!scoreButtonHover) { - scoreButtonDirty = true; - } - scoreButtonHover = true; - } else { - if (scoreButtonHover) { - scoreButtonDirty = true; - } - scoreButtonHover = false; - } - } - - inline function platformToString(platform:NetPlatform) { - return switch (platform) { - case Unknown: return "unknown"; - case Android: return "android"; - case MacOS: return "mac"; - case PC: return "pc"; - case Web: return "web"; - } } } diff --git a/src/gui/TouchCtrlsEditGui.hx b/src/gui/TouchCtrlsEditGui.hx index 6da9ec1b..ef6747ba 100644 --- a/src/gui/TouchCtrlsEditGui.hx +++ b/src/gui/TouchCtrlsEditGui.hx @@ -8,19 +8,10 @@ import h3d.Vector; import src.ResourceLoader; import src.MarbleGame; import src.Settings; -import src.Util; class TouchCtrlsEditGui extends GuiImage { public function new() { - function chooseBg() { - var rand = Math.random(); - if (rand >= 0 && rand <= 0.244) - return ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); - if (rand > 0.244 && rand <= 0.816) - return ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); - return ResourceLoader.getImage('data/ui/backgrounds/ultra/${cast (Math.floor(Util.lerp(1, 9, Math.random())), Int)}.jpg'); - } - var img = chooseBg(); + var img = ResourceLoader.getImage("data/ui/background.jpg"); super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; @@ -39,11 +30,11 @@ class TouchCtrlsEditGui extends GuiImage { @:privateAccess domcasual32b.loader = ResourceLoader.loader; var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - var mainMenuButton = new GuiButton(loadButtonImages("data/ui/menu/options")); - mainMenuButton.position = new Vector(380, 15); - mainMenuButton.extent = new Vector(247, 164); + var mainMenuButton = new GuiButton(loadButtonImages("data/ui/options/mainm")); + mainMenuButton.position = new Vector(500, 400); + mainMenuButton.extent = new Vector(121, 53); mainMenuButton.horizSizing = Left; - mainMenuButton.vertSizing = Bottom; + mainMenuButton.vertSizing = Top; mainMenuButton.pressedAction = (sender) -> { MarbleGame.canvas.setContent(new OptionsDlg()); } @@ -64,9 +55,6 @@ class TouchCtrlsEditGui extends GuiImage { var powerupBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/energy.png").resource, new Vector(Settings.touchSettings.powerupButtonPos[0], Settings.touchSettings.powerupButtonPos[1]), Settings.touchSettings.powerupButtonSize); - var blastBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/explosion.png").resource, - new Vector(Settings.touchSettings.blastButtonPos[0], Settings.touchSettings.blastButtonPos[1]), Settings.touchSettings.blastButtonSize); - var rewindBtn = new TouchEditButton(ResourceLoader.getImage("data/ui/touch/rewind.png").resource, new Vector(Settings.touchSettings.rewindButtonPos[0], Settings.touchSettings.rewindButtonPos[1]), Settings.touchSettings.rewindButtonSize); @@ -74,7 +62,6 @@ class TouchCtrlsEditGui extends GuiImage { sender.setSelected(true); powerupBtn.setSelected(false); joystick.setSelected(false); - blastBtn.setSelected(false); rewindBtn.setSelected(false); } @@ -87,7 +74,6 @@ class TouchCtrlsEditGui extends GuiImage { sender.setSelected(true); jumpBtn.setSelected(false); joystick.setSelected(false); - blastBtn.setSelected(false); rewindBtn.setSelected(false); } @@ -96,37 +82,10 @@ class TouchCtrlsEditGui extends GuiImage { Settings.touchSettings.powerupButtonSize = rvalue; } - blastBtn.onClick = (sender, mousePos) -> { - sender.setSelected(true); - jumpBtn.setSelected(false); - powerupBtn.setSelected(false); - joystick.setSelected(false); - rewindBtn.setSelected(false); - } - - blastBtn.onChangeCb = (sender, value, rvalue) -> { - Settings.touchSettings.blastButtonPos = [value.x, value.y]; - Settings.touchSettings.blastButtonSize = rvalue; - } - - rewindBtn.onClick = (sender, mousePos) -> { - sender.setSelected(true); - jumpBtn.setSelected(false); - powerupBtn.setSelected(false); - joystick.setSelected(false); - blastBtn.setSelected(false); - } - - rewindBtn.onChangeCb = (sender, value, rvalue) -> { - Settings.touchSettings.rewindButtonPos = [value.x, value.y]; - Settings.touchSettings.rewindButtonSize = rvalue; - } - joystick.onClick = (mousePos) -> { joystick.setSelected(true); jumpBtn.setSelected(false); powerupBtn.setSelected(false); - blastBtn.setSelected(false); rewindBtn.setSelected(false); } @@ -140,7 +99,6 @@ class TouchCtrlsEditGui extends GuiImage { this.addChild(joystick); this.addChild(jumpBtn); this.addChild(powerupBtn); - this.addChild(blastBtn); this.addChild(rewindBtn); } } diff --git a/src/modes/GameMode.hx b/src/modes/GameMode.hx index b4c6c6a5..342514f7 100644 --- a/src/modes/GameMode.hx +++ b/src/modes/GameMode.hx @@ -35,11 +35,6 @@ interface GameMode { class GameModeFactory { public static function getGameMode(level:MarbleWorld, mode:String):GameMode { - if (mode != null) { - if (mode.toLowerCase() == "hunt") { - return new HuntMode(level); - } - } return new NullMode(level); } } diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx deleted file mode 100644 index d457c28f..00000000 --- a/src/modes/HuntMode.hx +++ /dev/null @@ -1,857 +0,0 @@ -package modes; - -import gui.MPEndGameGui; -import net.NetCommands; -import net.BitStream.OutputBitStream; -import net.NetPacket.GemPickupPacket; -import net.NetPacket.GemSpawnPacket; -import octree.IOctreeObject; -import octree.IOctreeObject.RayIntersectionData; -import h3d.col.Bounds; -import octree.IOctreeElement; -import shapes.GemBeam; -import h3d.Quat; -import h3d.Vector; -import shapes.Gem; -import mis.MisParser; -import mis.MissionElement.MissionElementSimGroup; -import octree.Octree; -import mis.MissionElement.MissionElementTrigger; -import mis.MissionElement.MissionElementType; -import src.Mission; -import src.Marble; -import src.AudioManager; -import src.ResourceLoader; -import net.Net; -import src.MarbleGame; -import src.Util; -import src.Settings; - -@:structInit -@:publicFields -class GemSpawnPoint implements IOctreeObject { - var gem:Gem; - var gemBeam:GemBeam; - var weight:Float; - - var boundingBox:Bounds; - var netIndex:Int; - - var priority:Int; - - public function new(vec:Vector, spawn:Gem, netIndex:Int) { - boundingBox = new Bounds(); - boundingBox.addPoint(vec.add(new Vector(-0.5, -0.5, -0.5)).toPoint()); - boundingBox.addPoint(vec.add(new Vector(0.5, 0.5, 0.5)).toPoint()); - this.gem = spawn; - this.netIndex = netIndex; - this.gem.netIndex = netIndex; - this.weight = 0.0; - } - - public function getElementType() { - return 2; - } - - public function setPriority(priority:Int) { - this.priority = priority; - } - - public function rayCast(rayOrigin:Vector, rayDirection:Vector, resultSet:Array, bestT:Float):Float { - throw new haxe.exceptions.NotImplementedException(); // Not applicable - } -} - -class HuntMode extends NullMode { - var playerSpawnPoints:Array = []; - var spawnPointTaken = []; - var gemOctree:Octree; - var gemGroupRadius:Float; - var maxGemsPerGroup:Int; - var rng:RandomLCG = new RandomLCG(100); - var rng2:RandomLCG = new RandomLCG(100); - var gemSpawnPoints:Array; - var lastSpawn:GemSpawnPoint; - var activeGemSpawnGroup:Array; - var gemBeams:Array = []; - var gemToBeamMap:Map = []; - var gemToBlackBeamMap:Map = []; - var activeGems:Array = []; - var points:Int = 0; - var gemsCentroid:Vector; - var idealSpawnIndex:Int; - var expiredGems:Map = []; - var competitiveTimerStartTicks:Int; - - override function missionScan(mission:Mission) { - function scanMission(simGroup:MissionElementSimGroup) { - var elToRemove = []; - for (element in simGroup.elements) { - if ([MissionElementType.Trigger].contains(element._type)) { - var spawnSphere:MissionElementTrigger = cast element; - var dbname = spawnSphere.datablock.toLowerCase(); - if (dbname == "spawntrigger") { - playerSpawnPoints.push(spawnSphere); - spawnPointTaken.push(false); - } - } else if (element._type == MissionElementType.SimGroup) { - var scanPls = true; - if (Net.connectedServerInfo.oldSpawns) { - if (element._name.toLowerCase() == "newversion") { - // Remove this - elToRemove.push(element); - scanPls = false; - } - } else { - if (element._name.toLowerCase() == "oldversion") { - // Remove this - elToRemove.push(element); - scanPls = false; - } - } - if (scanPls) - scanMission(cast element); - } - } - while (elToRemove.length > 0) { - simGroup.elements.remove(elToRemove.pop()); - } - } - scanMission(mission.root); - }; - - override function getSpawnTransform() { - var idx = Net.connectedServerInfo.competitiveMode ? idealSpawnIndex : Math.floor(rng2.randRange(0, playerSpawnPoints.length - 1)); - if (!Net.connectedServerInfo.competitiveMode) { - var allTaken = true; - for (spw in spawnPointTaken) { - if (!spw) { - allTaken = false; - break; - } - } - if (!allTaken) { - while (spawnPointTaken[idx]) { - idx = Math.floor(rng2.randRange(0, playerSpawnPoints.length - 1)); - } - spawnPointTaken[idx] = true; - } - } - - var randomSpawn = playerSpawnPoints[idx]; - var spawnPos = MisParser.parseVector3(randomSpawn.position); - spawnPos.x *= -1; - var spawnRot = MisParser.parseRotation(randomSpawn.rotation); - spawnRot.x *= -1; - spawnRot.w *= -1; - var spawnMat = spawnRot.toMatrix(); - var up = spawnMat.up(); - - if (MisParser.parseBoolean(randomSpawn.g)) - up.load(up.multiply(-1)); - - spawnPos = spawnPos.add(up); // 1.5 -> 0.5 - return { - position: spawnPos, - orientation: spawnRot, - up: up - } - } - - public function freeSpawns() { - for (i in 0...playerSpawnPoints.length) { - spawnPointTaken[i] = false; - } - } - - override function getRespawnTransform(marble:Marble) { - var lastContactPos = marble.lastContactPosition; - if (lastContactPos == null) { - var idx = Math.floor(rng2.randRange(0, playerSpawnPoints.length - 1)); - var randomSpawn = playerSpawnPoints[idx]; - var spawnPos = MisParser.parseVector3(randomSpawn.position); - spawnPos.x *= -1; - var spawnRot = MisParser.parseRotation(randomSpawn.rotation); - spawnRot.x *= -1; - spawnRot.w *= -1; - var spawnMat = spawnRot.toMatrix(); - var up = spawnMat.up(); - if (MisParser.parseBoolean(randomSpawn.g)) - up.load(up.multiply(-1)); - - spawnPos = spawnPos.add(up); // 1.5 -> 0.5 - return { - position: spawnPos, - orientation: spawnRot, - up: up - } - } - // Pick closest spawn point - var closestSpawn:MissionElementTrigger = null; - var closestDistance = 1e10; - for (spawn in playerSpawnPoints) { - var pos = MisParser.parseVector3(spawn.position); - pos.x *= -1; - var dist = pos.distance(lastContactPos); - if (dist < closestDistance) { - closestDistance = dist; - closestSpawn = spawn; - } - } - if (closestSpawn != null) { - var spawnPos = MisParser.parseVector3(closestSpawn.position); - spawnPos.x *= -1; - var spawnRot = MisParser.parseRotation(closestSpawn.rotation); - spawnRot.x *= -1; - spawnRot.w *= -1; - var spawnMat = spawnRot.toMatrix(); - var up = spawnMat.up(); - if (MisParser.parseBoolean(closestSpawn.g)) - up.load(up.multiply(-1)); - - spawnPos = spawnPos.add(up); // 1.5 -> 0.5 - - return { - position: spawnPos, - orientation: spawnRot, - up: up - } - } - return null; - } - - function prepareGems() { - if (this.gemSpawnPoints == null) { - this.gemOctree = new Octree(); - this.gemSpawnPoints = []; - this.gemsCentroid = new Vector(); - for (gem in this.level.gems) { - var spawn:GemSpawnPoint = new GemSpawnPoint(gem.getAbsPos().getPosition(), gem, gemSpawnPoints.length); - gem.setHide(true); - gem.pickedUp = true; - this.gemSpawnPoints.push(spawn); - this.gemOctree.insert(spawn); - gem.setHide(true); - this.level.collisionWorld.removeEntity(gem.boundingCollider); // remove from octree to make it easy - if (level.isMultiplayer) { - @:privateAccess level.gemPredictions.alloc(); - } - gemsCentroid.load(gemsCentroid.add(gem.getAbsPos().getPosition())); - } - if (gemSpawnPoints.length > 0) - gemsCentroid.load(gemsCentroid.multiply(1.0 / gemSpawnPoints.length)); - - var closestSpawnIndex = 0; - var closestSpawnDistance = 1e8; - for (i in 0...playerSpawnPoints.length) { - var spawn = playerSpawnPoints[i]; - var spawnPos = MisParser.parseVector3(spawn.position); - spawnPos.x *= -1; - if (spawnPos.distance(gemsCentroid) < closestSpawnDistance) { - closestSpawnDistance = spawnPos.distance(gemsCentroid); - closestSpawnIndex = i; - } - } - idealSpawnIndex = closestSpawnIndex; - } - for (i in 0...spawnPointTaken.length) { - spawnPointTaken[i] = false; - } - } - - override function getPreloadFiles() { - return [ - 'data/sound/opponentdiamond.wav', - 'data/sound/firewrks.wav', - 'data/shapes/items/blue.gem.png', - 'data/shapes/items/red.gem.png', - 'data/shapes/items/yellow.gem.png', - 'data/shapes/items/platinum.gem.png' - ]; - } - - function setupGems() { - hideExisting(); - this.activeGems = []; - this.activeGemSpawnGroup = []; - this.rng.setSeed(cast Math.random() * 10000); - this.rng2.setSeed(cast Math.random() * 10000); - prepareGems(); - spawnHuntGems(); - } - - function spawnHuntGems(force:Bool = false) { - if (activeGems.length != 0 && !force) - return; - var gemGroupRadius = 15.0; - var maxGemsPerSpawn = 7; - if (level.mission.missionInfo.maxgemsperspawn != null && level.mission.missionInfo.maxgemsperspawn != "") - maxGemsPerSpawn = Std.parseInt(level.mission.missionInfo.maxgemsperspawn); - if (level.mission.missionInfo.radiusfromgem != null && level.mission.missionInfo.radiusfromgem != "") - gemGroupRadius = Std.parseFloat(level.mission.missionInfo.radiusfromgem); - var spawnBlock = gemGroupRadius * 2; - if (level.mission.missionInfo.spawnblock != null && level.mission.missionInfo.spawnblock != "") - spawnBlock = Std.parseFloat(level.mission.missionInfo.spawnblock); - - var minPointsPerSpawn = 5; - var minGemsPerSpawn = 3; - var maxSpawnSearchLoops = 15; - - var lastPos = null; - if (lastSpawn != null) - lastPos = lastSpawn.gem.getAbsPos().getPosition(); - - // On MP, instead of blocking around the last gem, block around the player - // currently in the lead. This should create closer games and discourage - // camping for gems. - if (@:privateAccess level.playGui.playerList.length > 1) { - var leadName = @:privateAccess level.playGui.playerList[0].name; - var leadMarble = null; - if (Settings.highscoreName == leadName) { - leadMarble = level.marble; - } else { - for (marble in level.marbles) { - if (@:privateAccess marble.connection != null && @:privateAccess marble.connection.name == leadName) { - leadMarble = marble; - break; - } - } - } - if (leadMarble != null) - lastPos = leadMarble.getAbsPos().getPosition(); - - var blockFactor = Util.clamp((((@:privateAccess level.playGui.playerList[0].score / Math.max(@:privateAccess - level.playGui.playerList[@:privateAccess level.playGui.playerList.length - 1].score, 1.0)) - 1) * 2), 0, 3); - - spawnBlock *= blockFactor; - } - - var furthestDist = 0.0; - var furthest = null; - var validGem = null; - - for (i in 0...10) { - var gem = gemSpawnPoints[Std.int(rng.randRange(0, gemSpawnPoints.length - 1))]; - if (lastPos != null) { - var dist = gem.gem.getAbsPos().getPosition().distance(lastPos) + gem.weight; - if (dist < spawnBlock) { - if (dist > furthestDist) { - furthestDist = dist; - furthest = gem; - } - continue; - } else { - validGem = gem; - break; - } - } else { - validGem = gem; - break; - } - } - if (validGem == null && furthest != null) { - validGem = furthest; - } - - if (validGem == null) { - validGem = gemSpawnPoints[Std.int(rng.randRange(0, gemSpawnPoints.length - 1))]; - } - var pos = validGem.gem.getAbsPos().getPosition(); - - var results = []; - var spawned = 1; - var points = 1 + getGemWeight(validGem.gem); - var loops = 0; - var searchRadius = gemGroupRadius; - while ((results.length == 0 || points < minPointsPerSpawn) && loops < 2) { - var search = gemOctree.radiusSearch(pos, searchRadius); - for (elem in search) { - var gemElem:GemSpawnPoint = cast elem; - var gemPos = gemElem.gem.getAbsPos().getPosition(); - - if (level.mission.missionInfo.game == "PlatinumQuest") { - if (Net.connectedServerInfo.oldSpawns) { - // 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! - } else { - // Spawn chances! - var chance = switch (gemElem.gem.gemColor.toLowerCase()) { - case "red.gem": - level.mission.missionInfo.redspawnchance != null ? Std.parseFloat(level.mission.missionInfo.redspawnchance) : 0.9; - case "yellow.gem": - level.mission.missionInfo.yellowspawnchance != null ? Std.parseFloat(level.mission.missionInfo.yellowspawnchance) : 0.65; - case "blue.gem": - level.mission.missionInfo.bluespawnchance != null ? Std.parseFloat(level.mission.missionInfo.bluespawnchance) : 0.35; - case "platinum.gem": - level.mission.missionInfo.platinumspawnchance != null ? Std.parseFloat(level.mission.missionInfo.platinumspawnchance) : 0.18; - default: - 1.0; - }; - var choice = Math.random(); - if (choice > chance) - continue; // Don't spawn! - } - } - - results.push({ - gem: gemElem.netIndex, - weight: searchRadius - gemPos.distance(pos) + rng.randRange(0, getGemWeight(gemElem.gem) + 3) - }); - points += getGemWeight(gemElem.gem) + 1; - } - loops++; - searchRadius *= 2; - } - results.sort((a, b) -> { - if (a.weight > b.weight) - return -1; - if (a.weight < b.weight) - return 1; - return 0; - }); - var spawnSet = results.slice(0, maxGemsPerSpawn).map(x -> x.gem); - - // Get the furthest gem - var maxDist = 0.0; - for (gem in spawnSet) { - var dist = gemSpawnPoints[gem].gem.getAbsPos().getPosition().distance(pos); - if (dist > maxDist) - maxDist = dist; - } - - // Apply spawn weights - for (gem in spawnSet) { - var dist = gemSpawnPoints[gem].gem.getAbsPos().getPosition().distance(pos); - dist /= maxDist; - dist = Math.floor((1 - dist) * 10); - gemSpawnPoints[gem].weight += dist; - } - - // Fix spawn weights so we don't get gems with 10000 spawn weight - var min = 9999.0; - for (gem in gemSpawnPoints) { - if (gem.weight < min) { - min = gem.weight; - } - } - - for (gem in gemSpawnPoints) { - gem.weight -= min; - } - - if (force) { - for (activeGem in activeGemSpawnGroup) - spawnSet.remove(activeGem); - } - - for (gem in spawnSet) { - spawnGem(gem); - } - if (!force) - activeGemSpawnGroup = spawnSet; - else { - var uncollectedGems = []; - for (g in activeGemSpawnGroup) { - if (!gemSpawnPoints[g].gem.pickedUp) - uncollectedGems.push(g); - } - activeGemSpawnGroup = uncollectedGems.concat(spawnSet); - } - - if (level.isMultiplayer && Net.isHost) { - var bs = new OutputBitStream(); - bs.writeByte(GemSpawn); - var packet = new GemSpawnPacket(); - packet.gemIds = activeGemSpawnGroup; - packet.expireds = []; - for (i in 0...packet.gemIds.length) { - if (expiredGems.exists(gemSpawnPoints[packet.gemIds[i]].gem)) { - packet.expireds.push(true); - } else { - packet.expireds.push(false); - } - } - packet.serialize(bs); - Net.sendPacketToIngame(bs); - } - - lastSpawn = furthest; - } - - function spawnGem(spawn:Int, expired:Bool = false) { - var gem = gemSpawnPoints[spawn]; - gem.gem.setHide(false); - gem.gem.pickedUp = false; - this.level.collisionWorld.addEntity(gem.gem.boundingCollider); - activeGems.push(gem.gem); - if (!expired) { - if (gem.gemBeam == null) { - gem.gemBeam = new GemBeam(StringTools.replace(gem.gem.gemColor, '.gem', '')); - - var gemPos = gem.gem.getAbsPos().getPosition(); - - gem.gemBeam.setPosition(gemPos.x, gemPos.y, gemPos.z); - gem.gemBeam.setRotationQuat(gem.gem.getRotationQuat().clone()); - // gem.gemBeam.setOpacity(0.99); - this.gemBeams.push(gem.gemBeam); - - this.gemToBeamMap.set(gem.gem, gem.gemBeam); - - level.addDtsObject(gem.gemBeam, () -> { - // Please be fast lol - }); - } else { - gem.gemBeam.setHide(false); - } - } else { - if (gemToBlackBeamMap.exists(gem.gem)) { - gemToBlackBeamMap.get(gem.gem).setHide(false); - } else { - var blackBeam = new GemBeam("black"); - var pos = gem.gem.getAbsPos().getPosition(); - blackBeam.setPosition(gem.gem.x, gem.gem.y, gem.gem.z); - blackBeam.setRotationQuat(gem.gem.getRotationQuat().clone()); - blackBeam.setHide(false); - level.addDtsObject(blackBeam, () -> {}); - gemToBlackBeamMap.set(gem.gem, blackBeam); - } - } - } - - public inline function setGemHiddenStatus(gemId:Int, status:Bool) { - var gemSpawn = gemSpawnPoints[gemId]; - if (gemSpawn.gem != null) { - gemSpawn.gem.pickedUp = status; - gemSpawn.gem.setHide(status); - - if (expiredGems.exists(gemSpawn.gem)) { - var blackBeam = gemToBlackBeamMap.get(gemSpawn.gem); - blackBeam.setHide(status); - gemSpawn.gemBeam.setHide(true); - } else { - gemSpawn.gemBeam.setHide(status); - } - if (status) - this.activeGems.push(gemSpawn.gem); - else - this.activeGems.remove(gemSpawn.gem); - } else { - throw new haxe.Exception("Setting gem status for non existent gem!"); - } - } - - public function setActiveSpawnSphere(gems:Array, expireds:Array) { - hideExisting(); - expiredGems = []; - for (i in 0...gems.length) { - var gem = gems[i]; - spawnGem(gem, expireds[i]); - if (expireds[i]) { - expiredGems.set(gemSpawnPoints[gem].gem, true); - } - } - activeGemSpawnGroup = gems; - } - - function getGemWeight(gem:Gem) { - var col = gem.gemColor.toLowerCase(); - if (col == "red.gem") - return 0; - if (col == "yellow.gem") - return 1; - if (col == "blue.gem") - return 4; - if (col == "platinum.gem") - return 9; - return 0; - } - - function hideExisting() { - lastSpawn = null; - if (gemSpawnPoints != null) { - for (gs in gemSpawnPoints) { - gs.gem.setHide(true); - gs.gem.pickedUp = true; - if (gs.gemBeam != null) { - gs.gemBeam.setHide(true); - } - if (gemToBlackBeamMap.exists(gs.gem)) { - gemToBlackBeamMap.get(gs.gem).setHide(true); - } - } - } - } - - override public function getStartTime() { - return level.mission.qualifyTime; - } - - override function onRespawn(marble:Marble) { - if (marble.controllable && activeGemSpawnGroup.length != 0) { - var gemAvg = new Vector(); - for (gi in activeGemSpawnGroup) { - var g = gemSpawnPoints[gi]; - gemAvg = gemAvg.add(g.boundingBox.getCenter().toVector()); - } - gemAvg.scale(1 / activeGemSpawnGroup.length); - var delta = gemAvg.sub(marble.getAbsPos().getPosition()); - var gravFrame = level.getOrientationQuat(0).toMatrix(); - var v1 = gravFrame.front(); - var v2 = gravFrame.right(); - var deltaRot = new Vector(delta.dot(v2), delta.dot(v1)); - if (deltaRot.length() >= 0.001) { - var ang = Math.atan2(deltaRot.x, deltaRot.y); - marble.camera.CameraYaw = ang; - marble.camera.nextCameraYaw = ang; - } - } - } - - override function onRestart() { - setupGems(); - points = 0; - competitiveTimerStartTicks = 0; - @:privateAccess level.playGui.formatGemHuntCounter(points); - if (gemSpawnPoints != null) - for (gem in gemSpawnPoints) { - gem.weight = 0.0; - } - } - - override function onMissionLoad() { - prepareGems(); - competitiveTimerStartTicks = 0; - } - - override function onClientRestart() { - prepareGems(); - competitiveTimerStartTicks = 0; - } - - override function onTimeExpire() { - if (level.finishTime != null) - return; - - AudioManager.playSound(ResourceLoader.getResource("data/sound/firewrks.wav", ResourceLoader.getAudio, @:privateAccess level.soundResources)); - // AudioManager.playSound(ResourceLoader.getResource('data/sound/finish.wav', ResourceLoader.getAudio, @:privateAccess level.soundResources)); - level.finishTime = level.timeState.clone(); - level.marble.setMode(Finish); - level.marble.camera.finish = true; - level.finishYaw = level.marble.camera.CameraYaw; - level.finishPitch = level.marble.camera.CameraPitch; - // if (level.isMultiplayer) { - // @:privateAccess level.playGui.doMPEndGameMessage(); - // } else { - // level.displayAlert("Congratulations! You've finished!"); - // } - level.cancel(@:privateAccess level.oobSchedule); - level.cancel(@:privateAccess level.marble.oobSchedule); - for (marble in level.marbles) { - marble.setMode(Finish); - level.cancel(@:privateAccess marble.oobSchedule); - } - if (Net.isHost) - NetCommands.timerRanOut(); - - // Stop the ongoing sounds - if (@:privateAccess level.timeTravelSound != null) { - @:privateAccess level.timeTravelSound.stop(); - @:privateAccess level.timeTravelSound = null; - } - - if (@:privateAccess level.alarmSound != null) { - @:privateAccess level.alarmSound.stop(); - @:privateAccess level.alarmSound = null; - } - - level.schedule(level.timeState.currentAttemptTime + 2, () -> { - if (Util.isTouchDevice()) { - MarbleGame.instance.touchInput.setControlsEnabled(false); - } - #if js - var pointercontainer = js.Browser.document.querySelector("#pointercontainer"); - pointercontainer.hidden = false; - #end - MarbleGame.canvas.pushDialog(new MPEndGameGui()); - level.setCursorLock(false); - return 0; - }); - } - - override function onGemPickup(marble:Marble, gem:Gem) { - if ((@:privateAccess !marble.isNetUpdate && Net.isHost) || !Net.isMP) { - if (marble == level.marble) - AudioManager.playSound(ResourceLoader.getResource('data/sound/gotgem.wav', ResourceLoader.getAudio, @:privateAccess this.level.soundResources)); - else - AudioManager.playSound(ResourceLoader.getResource('data/sound/opponentdiamond.wav', ResourceLoader.getAudio, - @:privateAccess this.level.soundResources)); - } - activeGems.remove(gem); - - var wasExpiredGem = false; - - if (expiredGems.exists(gem)) { - wasExpiredGem = true; - } - if (gemToBlackBeamMap.exists(gem)) { - gemToBlackBeamMap.get(gem).setHide(true); - } - - var beam = gemToBeamMap.get(gem); - beam.setHide(true); - - var incr = 0; - switch (gem.gemColor.toLowerCase()) { - case "red.gem": - incr = 1; - case "yellow.gem": - incr = 2; - case "blue.gem": - incr = 5; - case "platinum.gem": - incr = 10; - } - - if (@:privateAccess !marble.isNetUpdate) { - if (marble == level.marble) { - switch (gem.gemColor.toLowerCase()) { - case "red.gem": - points += 1; - @:privateAccess level.playGui.addMiddleMessage('+1', 0xFF6666); - case "yellow.gem": - points += 2; - @:privateAccess level.playGui.addMiddleMessage('+2', 0xFFFF66); - case "blue.gem": - points += 5; - @:privateAccess level.playGui.addMiddleMessage('+5', 0x6666FF); - case "platinum.gem": - points += 10; - @:privateAccess level.playGui.addMiddleMessage('+10', 0xdddddd); - } - if (Net.isHost) - @:privateAccess level.playGui.formatGemHuntCounter(points); - } - } - - if (this.level.isMultiplayer && Net.isHost) { - if (Net.connectedServerInfo.competitiveMode && !wasExpiredGem) { - if (competitiveTimerStartTicks == 0) { - NetCommands.setCompetitiveTimerStartTicks(this.level.timeState.ticks); - } - var remaining = 0; - for (g in activeGems) - if (!expiredGems.exists(g)) - remaining++; - if (remaining == 3) { - var currentTime = level.timeState.ticks; - var endTime = competitiveTimerStartTicks + (20000 >> 5); - var remainingTicks = (endTime - currentTime); - if (remainingTicks > (15000 >> 5)) { - NetCommands.setCompetitiveTimerStartTicks(currentTime - (5000 >> 5)); - } - } - if (remaining == 2) { - var currentTime = level.timeState.ticks; - var endTime = competitiveTimerStartTicks + (20000 >> 5); - var remainingTicks = (endTime - currentTime); - if (remainingTicks > (10000 >> 5)) { - NetCommands.setCompetitiveTimerStartTicks(currentTime - (10000 >> 5)); - } - } - if (remaining == 1) { - var currentTime = level.timeState.ticks; - var endTime = competitiveTimerStartTicks + (20000 >> 5); - var remainingTicks = (endTime - currentTime); - if (remainingTicks > (5000 >> 5)) { - NetCommands.setCompetitiveTimerStartTicks(currentTime - (15000 >> 5)); - } - } - if (remaining == 0) { - NetCommands.setCompetitiveTimerStartTicks(0); - spawnNextGemCluster(); - } - } - - var packet = new GemPickupPacket(); - packet.clientId = @:privateAccess marble.connection == null ? 0 : @:privateAccess marble.connection.id; - packet.gemId = gem.netIndex; - packet.serverTicks = level.timeState.ticks; - packet.scoreIncr = incr; - var os = new OutputBitStream(); - os.writeByte(GemPickup); - packet.serialize(os); - Net.sendPacketToIngame(os); - - // Settings.playStatistics.totalMPScore += incr; - - @:privateAccess level.playGui.incrementPlayerScore(packet.clientId, packet.scoreIncr); - } - if (wasExpiredGem) - expiredGems.remove(gem); - if (this.level.isMultiplayer && Net.isClient) { - gem.pickUpClient = @:privateAccess marble.connection == null ? Net.clientId : @:privateAccess marble.connection.id; - } - if (!this.level.isMultiplayer || Net.isHost) { - spawnHuntGems(); - } - } - - public function setCompetitiveTimerStartTicks(ticks:Int) { - competitiveTimerStartTicks = ticks; - } - - function spawnNextGemCluster() { - // Expire all existing - for (g in activeGems) { - expiredGems.set(g, true); - var gemBeam = gemToBeamMap.get(g); - gemBeam.setHide(true); - if (gemToBlackBeamMap.exists(g)) { - gemToBlackBeamMap.get(g).setHide(false); - } else { - var blackBeam = new GemBeam("black"); - var pos = g.getAbsPos().getPosition(); - blackBeam.setPosition(g.x, g.y, g.z); - blackBeam.setRotationQuat(g.getRotationQuat().clone()); - blackBeam.setHide(false); - level.addDtsObject(blackBeam, () -> {}); - gemToBlackBeamMap.set(g, blackBeam); - } - } - spawnHuntGems(true); - } - - override function update(t:src.TimeState) { - if (Net.connectedServerInfo.competitiveMode) { - if (competitiveTimerStartTicks != 0) { - var currentTime = Net.isHost ? t.ticks : @:privateAccess level.marble.serverTicks; - var endTime = competitiveTimerStartTicks + (20000 >> 5); - @:privateAccess level.playGui.formatCountdownTimer(Math.max(0, (endTime - currentTime) * 0.032), 0); - if (Net.isHost && endTime < currentTime) { - spawnNextGemCluster(); - NetCommands.setCompetitiveTimerStartTicks(0); - } - } else { - @:privateAccess level.playGui.formatCountdownTimer(0, 0); - } - } - } - - override public function timeMultiplier() { - return -1; - } -} diff --git a/src/net/MasterServerClient.hx b/src/net/MasterServerClient.hx deleted file mode 100644 index 3d806309..00000000 --- a/src/net/MasterServerClient.hx +++ /dev/null @@ -1,324 +0,0 @@ -package net; - -import gui.MPMessageGui; -import gui.JoinServerGui; -import gui.MessageBoxOkDlg; -import src.MarbleGame; -import haxe.Json; -import net.Net.ServerInfo; -import haxe.net.WebSocket; -import src.Console; - -typedef RemoteServerInfo = { - id:String, - name:String, - host:String, - description:String, - players:Int, - maxPlayers:Int, - platform:Int, - version:String, - passworded:Bool -} - -class MasterServerClient { - #if js - static var serverIp = "wss://mbpmaster.randomityguy.me:8443"; - #else - static var serverIp = "ws://51.75.65.148:8084"; - #end - public static var instance:MasterServerClient; - - var ws:WebSocket; - var serverListCb:Array->Void; - - var open = false; - - static var wsToken:Int = 0; - - #if hl - var wsThread:sys.thread.Thread; - - static var responses:sys.thread.Deque<() -> Void> = new sys.thread.Deque<() -> Void>(); - - var toSend:sys.thread.Deque = new sys.thread.Deque(); - var stopping:Bool = false; - var stopMutex:sys.thread.Mutex = new sys.thread.Mutex(); - #end - - public function new(onOpenFunc:() -> Void, onErrorFunc:() -> Void) { - #if hl - wsThread = sys.thread.Thread.create(() -> { - hl.Gc.enable(false); - hl.Gc.blocking(true); // Wtf is this shit - #end - wsToken++; - - var myToken = wsToken; - - ws = WebSocket.create(serverIp); - #if hl - hl.Gc.enable(true); - hl.Gc.blocking(false); - #end - ws.onopen = () -> { - open = true; - #if hl - responses.add(() -> onOpenFunc()); - #end - #if js - onOpenFunc(); - #end - } - ws.onmessageString = (m) -> { - #if hl - responses.add(() -> handleMessage(m)); - #end - #if js - handleMessage(m); - #end - } - ws.onerror = (m) -> { - #if hl - responses.add(() -> { - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Failed to connect to master server: " + m)); - }); - if (onErrorFunc != null) - responses.add(() -> { - onErrorFunc(); - }); - #end - #if js - MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Failed to connect to master server: " + m)); - if (onErrorFunc != null) - onErrorFunc(); - #end - #if hl - stopMutex.acquire(); - #end - if (myToken == wsToken) { - open = false; - ws = null; - instance = null; - } - #if hl - stopping = true; - stopMutex.release(); - if (myToken == wsToken) { - wsThread = null; - } - #end - } - ws.onclose = (?e) -> { - #if hl - stopMutex.acquire(); - #end - if (myToken == wsToken) { - open = false; - ws = null; - instance = null; - } - #if hl - stopping = true; - stopMutex.release(); - if (myToken == wsToken) { - wsThread = null; - } - #end - } - #if hl - while (true) { - stopMutex.acquire(); - if (stopping) - break; - while (true) { - var s = toSend.pop(false); - if (s == null) - break; - #if hl - hl.Gc.blocking(true); - #end - ws.sendString(s); - #if hl - hl.Gc.blocking(false); - #end - } - - #if hl - hl.Gc.blocking(true); - #end - ws.process(); - #if hl - hl.Gc.blocking(false); - #end - stopMutex.release(); - Sys.sleep(0.1); - } - #end - #if hl - }); - #end - } - - public static function process() { - #if sys - var resp = responses.pop(false); - if (resp != null) { - resp(); - } - #end - } - - public static function connectToMasterServer(onConnect:() -> Void, onError:() -> Void = null) { - if (instance == null) - instance = new MasterServerClient(onConnect, onError); - else { - if (instance.open) - onConnect(); - else { - if (instance != null && instance.ws != null) - instance.ws.close(); - instance = new MasterServerClient(onConnect, onError); - } - } - } - - public static function disconnectFromMasterServer() { - if (instance != null && instance.ws != null) { - instance.ws.close(); - if (instance != null) { - instance.open = false; - instance.ws = null; - instance = null; - } - } - } - - public static function requestTurnCredentials() { - if (instance != null && instance.open) { - instance.queueMessage(Json.stringify({ - type: "turn_credentials" - })); - } - } - - function queueMessage(m:String) { - #if hl - toSend.add(m); - #end - #if js - ws.sendString(m); - #end - } - - public function heartBeat() { - queueMessage(Json.stringify({ - type: "heartbeat" - })); - } - - public function sendServerInfo(serverInfo:ServerInfo) { - queueMessage(Json.stringify({ - type: "serverInfo", - id: serverInfo.id, - name: serverInfo.name, - host: serverInfo.hostname, - description: serverInfo.description, - players: serverInfo.players, - maxPlayers: serverInfo.maxPlayers, - password: serverInfo.password, - state: serverInfo.state, - platform: serverInfo.platform, - version: MarbleGame.currentVersion - })); - } - - public function sendConnectToServer(serverId:String, sdp:String, password:String) { - queueMessage(Json.stringify({ - type: "connect", - id: serverId, - sdp: sdp, - password: password - })); - } - - public function getServerList(serverListCb:Array->Void) { - this.serverListCb = serverListCb; - queueMessage(Json.stringify({ - type: "serverList" - })); - } - - function handleMessage(message:String) { - var conts = Json.parse(message); - Console.log('Received ${conts.type}'); - if (conts.type == "serverList") { - if (serverListCb != null) { - serverListCb(conts.servers); - } - } - if (conts.type == "connect") { - if (!Net.isHost) { - queueMessage(Json.stringify({ - type: "connectFailed", - success: false, - reason: "The server has shut down" - })); - return; - } - var joiningPrivate = conts.isPrivate; - - if (Net.serverInfo.players >= Net.serverInfo.maxPlayers) { - queueMessage(Json.stringify({ - type: "connectFailed", - success: false, - reason: "The server is full" - })); - return; - } - - var pubCount = 1; // Self - for (cid => cc in Net.clientIdMap) { - pubCount++; - } - - if (!joiningPrivate && pubCount >= Net.serverInfo.maxPlayers) { - queueMessage(Json.stringify({ - type: "connectFailed", - success: false, - reason: "The server is full" - })); - return; - } - - Net.addClientFromSdp(conts.sdp, (sdpReply) -> { - queueMessage(Json.stringify({ - success: true, - type: "connectResponse", - sdp: sdpReply, - clientId: conts.clientId - })); - }); - } - if (conts.type == "connectResponse") { - Console.log("Remote Description Received!"); - var sdpObj = Json.parse(conts.sdp); - if (@:privateAccess Net.client != null) - @:privateAccess Net.client.setRemoteDescription(sdpObj.sdp, sdpObj.type); - } - if (conts.type == "connectFailed") { - if (MarbleGame.canvas.content is MPMessageGui) { - var loadGui:MPMessageGui = cast MarbleGame.canvas.content; - if (loadGui != null) { - loadGui.setTexts("Error", conts.reason); - } - } - } - if (conts.type == "turn_credentials") { - Net.turnServers = conts.turn_servers; - if (@:privateAccess Net.onTurnServersReceived != null) { - @:privateAccess Net.onTurnServersReceived(); - } - } - } -} diff --git a/src/net/MoveManager.hx b/src/net/MoveManager.hx index 270c3668..6c63fb22 100644 --- a/src/net/MoveManager.hx +++ b/src/net/MoveManager.hx @@ -76,7 +76,7 @@ class MoveManager { if (!MarbleGame.instance.paused) { move.d.x = Gamepad.getAxis(Settings.gamepadSettings.moveYAxis); move.d.y = -Gamepad.getAxis(Settings.gamepadSettings.moveXAxis); - if (@:privateAccess !MarbleGame.instance.world.playGui.isChatFocused()) { + if (true) { if (Key.isDown(Settings.controlsSettings.forward)) { move.d.x -= 1; } @@ -100,11 +100,6 @@ class MoveManager { move.powerup = true; } - if (Key.isDown(Settings.controlsSettings.blast) - || (MarbleGame.instance.touchInput.blastbutton.pressed) - || Gamepad.isDown(Settings.gamepadSettings.blast)) - move.blast = true; - if (Key.isDown(Settings.controlsSettings.respawn) || Gamepad.isDown(Settings.gamepadSettings.respawn)) { move.respawn = true; @:privateAccess Key.keyPressed[Settings.controlsSettings.respawn] = 0; diff --git a/src/net/Net.hx b/src/net/Net.hx index 04923aa3..061723af 100644 --- a/src/net/Net.hx +++ b/src/net/Net.hx @@ -1,14 +1,9 @@ package net; import net.NetPacket.ExplodableUpdatePacket; -import gui.MPMessageGui; import gui.MessageBoxOkDlg; -import gui.JoinServerGui; -import gui.MPPreGameDlg; import net.NetPacket.ScoreboardPacket; -import gui.MPPlayMissionGui; import gui.Canvas; -import net.MasterServerClient.RemoteServerInfo; import src.ResourceLoader; import src.AudioManager; import net.NetPacket.GemPickupPacket; @@ -101,7 +96,6 @@ class Net { public static var clientIdMap:Map = []; 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"]; @@ -112,38 +106,9 @@ class Net { public static function hostServer(name:String, description:String, maxPlayers:Int, password:String, onHosted:() -> Void) { serverInfo = new ServerInfo(name, Settings.highscoreName, description, 1, maxPlayers, password, "LOBBY", getPlatform()); - MasterServerClient.connectToMasterServer(() -> { - isHost = true; - isClient = false; - clientId = 0; - isMP = true; - MasterServerClient.instance.sendServerInfo(serverInfo); - Net.connectedServerInfo = { - name: name, - description: description, - competitiveMode: Settings.serverSettings.competitiveMode, - quickRespawn: Settings.serverSettings.quickRespawn, - forceSpectator: Settings.serverSettings.forceSpectators, - oldSpawns: Settings.serverSettings.oldSpawns - }; - onHosted(); - }); } - public static function addClientFromSdp(sdpString:String, onFinishSdp:String->Void, turnTried:Bool = false) { - if (Net.turnServers.length == 0 && !turnTried) { - MasterServerClient.requestTurnCredentials(); - Net.onTurnServersReceived = () -> { - Net.onTurnServersReceived = null; - addClientFromSdp(sdpString, onFinishSdp, true); - }; - return; - } - var peer = new RTCPeerConnection(stunServers.concat(Net.turnServers), "0.0.0.0"); - var sdpObj = Json.parse(sdpString); - peer.setRemoteDescription(sdpObj.sdp, sdpObj.type); - addClient(peer, onFinishSdp); - } + public static function addClientFromSdp(sdpString:String, onFinishSdp:String->Void, turnTried:Bool = false) {} static function addClient(peer:RTCPeerConnection, onFinishSdp:String->Void) { var candidates = []; @@ -222,170 +187,7 @@ class Net { clientIdMap[id] = ghost; } - public static function joinServer(serverName:String, password:String, connectedCb:() -> Void, turnTried:Bool = false) { - MasterServerClient.connectToMasterServer(() -> { - if (Net.turnServers.length == 0 && !turnTried) { - MasterServerClient.requestTurnCredentials(); - Net.onTurnServersReceived = () -> { - Net.onTurnServersReceived = null; - joinServer(serverName, password, connectedCb, true); - }; - return; - } - - client = new RTCPeerConnection(stunServers.concat(Net.turnServers), "0.0.0.0"); - var candidates = []; - - var closing = false; - - isMP = true; - isHost = false; - isClient = true; - - var closeFunc = (msg:String, forceShow:Bool) -> { - if (closing) - return; - closing = true; - var weLeftOurselves = !Net.isClient; // If we left ourselves, this would be set to false due to order of ops, disconnect being called first, and then the datachannel closing - disconnect(); - if (MarbleGame.instance.world != null) { - MarbleGame.instance.quitMission(); - } - if (!weLeftOurselves || forceShow) { - if (MarbleGame.canvas.content is MPMessageGui) { - var loadGui:MPMessageGui = cast MarbleGame.canvas.content; - if (loadGui != null) { - loadGui.setTexts("Error", msg); - } - } else { - MarbleGame.canvas.setContent(new MPMessageGui("Error", msg)); - } - } - } - - client.onLocalCandidate = (c) -> { - Console.log('Local candidate: ' + c); - if (c != "") - candidates.push('a=${c}'); - } - client.onStateChange = (s) -> { - switch (s) { - case RTC_CLOSED: - Console.log("RTC State change: Connection closed!"); - closeFunc("Connection closed", false); - case RTC_CONNECTED: - Console.log("RTC State change: Connected!"); - case RTC_CONNECTING: - Console.log("RTC State change: Connecting..."); - case RTC_DISCONNECTED: - Console.log("RTC State change: Disconnected!"); - case RTC_FAILED: - Console.log("RTC State change: Failed!"); - case RTC_NEW: - Console.log("RTC State change: New..."); - } - } - - var sdpFinished = false; - var finishSdp = () -> { - if (sdpFinished) - return; - sdpFinished = true; - if (client == null) - return; - Console.log("Local Description Set!"); - var sdpObj = StringTools.trim(client.localDescription); - sdpObj = sdpObj + '\r\n' + candidates.join('\r\n') + '\r\n'; - MasterServerClient.instance.sendConnectToServer(serverName, Json.stringify({ - sdp: sdpObj, - type: "offer" - }), password); - } - - client.onGatheringStateChange = (s) -> { - switch (s) { - case RTC_GATHERING_COMPLETE: - Console.log("Gathering complete!"); - case RTC_GATHERING_INPROGRESS: - Console.log("Gathering in progress..."); - case RTC_GATHERING_NEW: - Console.log("Gathering new..."); - } - if (s == RTC_GATHERING_COMPLETE) { - finishSdp(); - } - } - - // haxe.Timer.delay(() -> { - // finishSdp(); - // }, 5000); - - clientDatachannel = client.createDatachannel("mp"); - clientDatachannelUnreliable = client.createDatachannelWithOptions("unreliable", true, null, 600); - - var openFlags = 0; - - var onDatachannelOpen = (idx:Int) -> { - if (!Net.isMP) { - // Close - client.close(); - return; - } - openFlags |= idx; - if (openFlags == 3) { - if (MarbleGame.canvas.content is MPMessageGui) { - var loadGui:MPMessageGui = cast MarbleGame.canvas.content; - if (loadGui != null) { - loadGui.setTexts("Please Wait", "Handshaking"); - } - } - Console.log("Successfully connected!"); - clients.set(client, new ClientConnection(0, client, clientDatachannel, clientDatachannelUnreliable)); // host is always 0 - clientIdMap[0] = clients[client]; - clientConnection = cast clients[client]; - onConnectedToServer(); - haxe.Timer.delay(() -> connectedCb(), 1500); // 1.5 second delay to do the RTT calculation - } - } - var onDatachannelMessage = (dc:RTCDataChannel, b:haxe.io.Bytes) -> { - onPacketReceived(clientConnection, client, clientDatachannel, new InputBitStream(b)); - } - - var onDatachannelClose = (dc:RTCDataChannel) -> { - closeFunc("Disconnected", false); - } - - var onDatachannelError = (msg:String) -> { - Console.log('Errored out due to ${msg}'); - closeFunc("Connection error", false); - } - - clientDatachannel.onOpen = (n) -> { - onDatachannelOpen(1); - } - clientDatachannel.onMessage = (b) -> { - onDatachannelMessage(clientDatachannel, b); - } - clientDatachannel.onClosed = () -> { - onDatachannelClose(clientDatachannel); - } - clientDatachannel.onError = (msg) -> { - onDatachannelError(msg); - } - clientDatachannelUnreliable.onOpen = (n) -> { - onDatachannelOpen(2); - } - clientDatachannelUnreliable.onMessage = (b) -> { - onDatachannelMessage(clientDatachannelUnreliable, b); - } - clientDatachannelUnreliable.onClosed = () -> { - onDatachannelClose(clientDatachannelUnreliable); - } - clientDatachannelUnreliable.onError = (msg) -> { - onDatachannelError(msg); - } - }); - } + public static function joinServer(serverName:String, password:String, connectedCb:() -> Void, turnTried:Bool = false) {} public static function disconnect() { if (Net.isClient) { @@ -403,14 +205,12 @@ class Net { Net.clientIdMap.clear(); Net.clientConnection = null; Net.serverInfo = null; - Net.remoteServerInfo = null; Net.connectedServerInfo = null; Net.lobbyHostReady = false; Net.lobbyClientReady = false; Net.hostReady = false; Net.hostSpectate = false; Net.clientSpectate = false; - MPPlayMissionGui.allChats = []; // MultiplayerLevelSelectGui.custSelected = false; } if (Net.isHost) { @@ -425,16 +225,13 @@ class Net { Net.clientIdAllocs = 1; Net.clients.clear(); Net.clientIdMap.clear(); - MasterServerClient.disconnectFromMasterServer(); Net.serverInfo = null; - Net.remoteServerInfo = null; Net.connectedServerInfo = null; Net.lobbyHostReady = false; Net.lobbyClientReady = false; Net.hostReady = false; Net.hostSpectate = false; Net.clientSpectate = false; - MPPlayMissionGui.allChats = []; // MultiplayerLevelSelectGui.custSelected = false; } } @@ -474,34 +271,11 @@ class Net { if (MarbleGame.instance.world != null) { MarbleGame.instance.quitMission(); } - if (!(MarbleGame.canvas.content is MPMessageGui)) { - var loadGui = new MPMessageGui("Error", "Timed out"); - MarbleGame.canvas.setContent(loadGui); - } } } } } } - if (wsAccum >= 15.0) { - wsAccum = 0; - if (Net.isHost) { - if (MasterServerClient.instance != null) - MasterServerClient.instance.sendServerInfo(serverInfo); // Heartbeat - else - MasterServerClient.connectToMasterServer(() -> { - MasterServerClient.instance.sendServerInfo(serverInfo); // Heartbeat - }); - } - if (Net.isClient) { - if (MasterServerClient.instance != null) - MasterServerClient.instance.heartBeat(); - else - MasterServerClient.connectToMasterServer(() -> { - MasterServerClient.instance.heartBeat(); - }); - } - } } static function onClientConnect(c:RTCPeerConnection, dc:RTCDataChannel, dcu:RTCDataChannel) { @@ -580,16 +354,6 @@ class Net { for (k => v in clients) { // Recount serverInfo.players++; } - - MasterServerClient.instance.sendServerInfo(serverInfo); // notify the server of the new player - - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } } static function onConnectedToServer() { @@ -617,17 +381,7 @@ class Net { serverInfo.players++; } - MasterServerClient.instance.sendServerInfo(serverInfo); // notify the server of the player leave - // AudioManager.playSound(ResourceLoader.getAudio("data/sound/infotutorial.wav").resource); - - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } } static function onClientHandshakeComplete(conn:ClientConnection) { @@ -637,14 +391,12 @@ class Net { // } else { NetCommands.sendServerSettingsClient(conn, Settings.serverSettings.name, Settings.serverSettings.description, Settings.serverSettings.quickRespawn, Settings.serverSettings.forceSpectators, Settings.serverSettings.competitiveMode, Settings.serverSettings.oldSpawns); - NetCommands.setLobbyLevelIndexClient(conn, MPPlayMissionGui.currentCategoryStatic, MPPlayMissionGui.currentSelectionStatic); // } if (serverInfo.state == "PLAYING") { // We initiated the game, directly add in the marble // if (MultiplayerLevelSelectGui.custSelected) { // NetCommands.playCustomLevelMidJoinClient(conn, MultiplayerLevelSelectGui.custPath); // } else - NetCommands.playLevelMidJoinClient(conn, MPPlayMissionGui.currentCategoryStatic, MPPlayMissionGui.currentSelectionStatic); MarbleGame.instance.world.addJoiningClient(conn, () -> {}); var playerInfoBytes = sendPlayerInfosBytes(); for (dc => cc in clients) { @@ -791,7 +543,6 @@ class Net { var gemPickupPacket = new GemPickupPacket(); gemPickupPacket.deserialize(input); if (MarbleGame.instance.world != null && !MarbleGame.instance.world._disposed) { - @:privateAccess MarbleGame.instance.world.playGui.incrementPlayerScore(gemPickupPacket.clientId, gemPickupPacket.scoreIncr); @:privateAccess MarbleGame.instance.world.gemPredictions.acknowledgeGemPickup(gemPickupPacket); } @@ -827,19 +578,10 @@ class Net { Net.clientSpectate = cspectator; } } - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } case ScoreBoardInfo: var scoreboardPacket = new ScoreboardPacket(); scoreboardPacket.deserialize(input); - if (MarbleGame.instance.world != null && !MarbleGame.instance.world._disposed) { - @:privateAccess MarbleGame.instance.world.playGui.updatePlayerScores(scoreboardPacket); - } case ExplodableUpdate: var explodableUpdatePacket = new ExplodableUpdatePacket(); diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index f7b96fd6..5ba5d951 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -1,19 +1,11 @@ package net; -import gui.MPMessageGui; import gui.MessageBoxOkDlg; -import gui.JoinServerGui; -import gui.MPExitGameDlg; -import gui.MPEndGameGui; -import gui.MPPreGameDlg; -import gui.MPPlayMissionGui; import net.ClientConnection.NetPlatform; import gui.EndGameGui; -import modes.HuntMode; import net.ClientConnection.GameplayState; import net.Net.NetPacketType; import src.MarbleGame; -import src.MissionList; import src.Console; import src.Marbleland; import src.Settings; @@ -23,16 +15,7 @@ import src.ResourceLoader; @:build(net.RPCMacro.build()) class NetCommands { - @:rpc(server) public static function setLobbyLevelIndex(category:String, i:Int) { - if (MPPlayMissionGui.setLevelFn == null) { - MPPlayMissionGui.currentCategoryStatic = category; - MPPlayMissionGui.currentSelectionStatic = i; - } else { - MPPlayMissionGui.currentCategoryStatic = category; - MPPlayMissionGui.currentSelectionStatic = i; - MPPlayMissionGui.setLevelFn(category, i); - } - } + @:rpc(server) public static function setLobbyLevelIndex(category:String, i:Int) {} // @:rpc(server) public static function setLobbyCustLevelName(str:String) { // if (MPPlayMissionGui.setLevelFn != null) { @@ -43,13 +26,7 @@ class NetCommands { // } // } - @:rpc(server) public static function playLevel(category:String, levelIndex:Int) { - MPPlayMissionGui.playSelectedLevel(category, levelIndex); - if (Net.isHost) { - Net.serverInfo.state = "WAITING"; - MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the wait state - } - } + @:rpc(server) public static function playLevel(category:String, levelIndex:Int) {} // @:rpc(server) public static function playCustomLevel(levelPath:String) { // var levelEntry = MPCustoms.missionList.filter(x -> x.path == levelPath)[0]; @@ -65,18 +42,7 @@ class NetCommands { // } @:rpc(server) public static function playLevelMidJoin(category:String, levelIndex:Int) { - if (Net.isClient) { - MissionList.buildMissionList(); - if (category == "custom") { - var curMission = Marbleland.multiplayerMissions[levelIndex]; - MarbleGame.instance.playMission(curMission, true); - } else { - var difficultyMissions = MissionList.missionList['multiplayer'][category]; - var curMission = difficultyMissions[levelIndex]; - MarbleGame.instance.playMission(curMission, true); - } - @:privateAccess MarbleGame.instance.world._skipPreGame = true; - } + if (Net.isClient) {} } // @:rpc(server) public static function playCustomLevelMidJoin(path:String) { @@ -86,76 +52,22 @@ class NetCommands { // } @:rpc(server) public static function enterLobby() { - if (Net.isClient) { - MarbleGame.canvas.setContent(new MPPlayMissionGui(false)); - } + if (Net.isClient) {} } @:rpc(server) public static function setNetworkRNG(rng:Float) { Net.networkRNG = rng; if (MarbleGame.instance.world != null) { var gameMode = MarbleGame.instance.world.gameMode; - if (gameMode is modes.HuntMode) { - var hunt:modes.HuntMode = cast gameMode; - @:privateAccess hunt.rng.setSeed(cast rng); - @:privateAccess hunt.rng2.setSeed(cast rng); - } } } @:rpc(client) public static function toggleReadiness(clientId:Int) { - if (Net.isHost) { - if (clientId == 0) - Net.lobbyHostReady = !Net.lobbyHostReady; - else - Net.clientIdMap[clientId].toggleLobbyReady(); - var allReady = true; - for (id => client in Net.clientIdMap) { - if (!client.lobbyReady) { - allReady = false; - break; - } - } - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - - if (allReady && Net.lobbyHostReady) { - // if (MultiplayerLevelSelectGui.custSelected) { - // NetCommands.playCustomLevel(MultiplayerLevelSelectGui.custPath); - // } else - if (MarbleGame.instance.world == null) { - NetCommands.playLevel(MPPlayMissionGui.currentCategoryStatic, MPPlayMissionGui.currentSelectionStatic); - } else {} - } - } + if (Net.isHost) {} } @:rpc(client) public static function toggleSpectate(clientId:Int) { - if (Net.isHost) { - if (clientId == 0) - Net.hostSpectate = !Net.hostSpectate; - else - Net.clientIdMap[clientId].toggleSpectate(); - - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - } + if (Net.isHost) {} } @:rpc(client) public static function clientIsReady(clientId:Int) { @@ -170,12 +82,6 @@ class NetCommands { Console.log("Mid game join for client " + clientId); // Send em our present world state if (MarbleGame.instance.world != null) { - var packets = MarbleGame.instance.world.getWorldStateForClientJoin(); - var c = Net.clientIdMap[clientId]; - - for (packet in packets) { - c.sendBytes(packet); - } Net.clientIdMap[clientId].ready(); if (Settings.serverSettings.forceSpectators) { @@ -199,9 +105,6 @@ class NetCommands { MarbleGame.instance.world.allClientsReady(); } } - } else { - // Send the start ticks - NetCommands.setStartTicksMidJoinClient(c, MarbleGame.instance.world.serverStartTicks, MarbleGame.instance.world.timeState.ticks); } } } @@ -222,23 +125,6 @@ class NetCommands { @:privateAccess MarbleGame.instance.world.marble.serverTicks = ticks; } MarbleGame.instance.world.startTime = MarbleGame.instance.world.timeState.timeSinceLoad + 3.5 + 0.032; // 1 extra tick - - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - MarbleGame.canvas.popDialog(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1]); - MarbleGame.instance.world.setCursorLock(true); - if (Util.isTouchDevice()) { - MarbleGame.canvas.render(MarbleGame.canvas.scene2d); - MarbleGame.instance.touchInput.setControlsEnabled(true); - } - MarbleGame.instance.world.marble.camera.stopOverview(); - AudioManager.playSound(ResourceLoader.getAudio('data/sound/spawn.wav').resource); - } - - if (Net.clientSpectate || Net.hostSpectate) { - MarbleGame.instance.world.marble.camera.enableSpectate(); - } else { - MarbleGame.instance.world.marble.camera.stopSpectate(); - } } } @@ -250,137 +136,27 @@ class NetCommands { } } - @:rpc(server) public static function timerRanOut() { - if (Net.isClient && MarbleGame.instance.world != null) { - if (MarbleGame.instance.paused) { - MarbleGame.instance.handlePauseGame(); // Unpause - } - var huntMode:HuntMode = cast MarbleGame.instance.world.gameMode; - huntMode.onTimeExpire(); - } - if (Net.isHost) { - Net.serverInfo.state = "WAITING"; - MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state - } - } + @:rpc(server) public static function timerRanOut() {} - @:rpc(server) public static function clientDisconnected(clientId:Int) { - var conn = Net.clientIdMap.get(clientId); - if (MarbleGame.instance.world != null) { - MarbleGame.instance.world.removePlayer(conn); - } - Net.clientIdMap.remove(clientId); - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { - cast(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1], MPPreGameDlg).updatePlayerList(); - } - } + @:rpc(server) public static function clientDisconnected(clientId:Int) {} @:rpc(server) public static function clientJoin(clientId:Int) {} - @:rpc(client) public static function clientLeave(clientId:Int) { - if (Net.isHost) { - @:privateAccess Net.onClientLeave(cast Net.clientIdMap[clientId]); - } - } + @:rpc(client) public static function clientLeave(clientId:Int) {} - @:rpc(server) public static function serverClosed() { - if (Net.isClient) { - if (MarbleGame.instance.world != null) { - MarbleGame.instance.quitMission(); - } - MarbleGame.canvas.setContent(new MPMessageGui("Info", "Server closed")); - } - } + @:rpc(server) public static function serverClosed() {} - @:rpc(server) public static function getKicked() { - if (Net.isClient) { - Net.disconnect(); - MarbleGame.canvas.setContent(new MPMessageGui("Info", "You have been kicked from the server")); - } - } + @:rpc(server) public static function getKicked() {} - @:rpc(client) public static function setPlayerData(clientId:Int, name:String, marble:Int, marbleCat:Int, needRetransmit:Bool) { - if (Net.isHost) { - Net.clientIdMap[clientId].setName(name); - Net.clientIdMap[clientId].setMarbleId(marble, marbleCat); - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - if (needRetransmit) { - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - } - } - } + @:rpc(client) public static function setPlayerData(clientId:Int, name:String, marble:Int, marbleCat:Int, needRetransmit:Bool) {} - @:rpc(client) public static function transmitPlatform(clientId:Int, platform:Int) { - if (Net.isHost) { - Net.clientIdMap[clientId].platform = platform; - if (MarbleGame.canvas.content is MPPlayMissionGui) { - cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); - } - } - } + @:rpc(client) public static function transmitPlatform(clientId:Int, platform:Int) {} - @:rpc(server) public static function endGame() { - for (c => v in Net.clientIdMap) { - v.state = LOBBY; - v.lobbyReady = false; - } - if (Net.isClient) { - if (MarbleGame.instance.world != null) { - MarbleGame.instance.quitMission(); - } - } - if (Net.isHost) { - Net.lobbyHostReady = false; - Net.hostReady = false; + @:rpc(server) public static function endGame() {} - Net.serverInfo.state = "LOBBY"; - MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state - var b = Net.sendPlayerInfosBytes(); - for (cc in Net.clients) { - cc.sendBytes(b); - } - } - } + @:rpc(server) public static function completeRestartGame() {} - @:rpc(server) public static function completeRestartGame() { - if (Net.isClient) { - var gui = MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1]; - if (gui is MPEndGameGui || gui is MPExitGameDlg) { - MarbleGame.instance.paused = false; - MarbleGame.canvas.popDialog(gui); - // egg.retryFunc(null); - } - } - var world = MarbleGame.instance.world; - world.completeRestart(); - if (Net.isClient) { - world.restartMultiplayerState(); - } - } - - @:rpc(server) public static function partialRestartGame() { - if (Net.isClient) { - var gui = MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1]; - if (gui is MPEndGameGui || gui is MPExitGameDlg) { - MarbleGame.instance.paused = false; - MarbleGame.canvas.popDialog(gui); - // egg.retryFunc(null); - } - } - var world = MarbleGame.instance.world; - world.partialRestart(); - if (Net.isClient) { - world.restartMultiplayerState(); - } - } + @:rpc(server) public static function partialRestartGame() {} @:rpc(server) public static function ping(sendTime:Float) { if (Net.isClient) { @@ -419,20 +195,16 @@ class NetCommands { @:rpc(server) public static function sendServerChatMessage(msg:String) { if (MarbleGame.instance.world != null) { if (MarbleGame.instance.world._ready) { - @:privateAccess MarbleGame.instance.world.playGui.addChatMessage(msg); + // @:privateAccess MarbleGame.instance.world.playGui.addChatMessage(msg); } } else { // if (MarbleGame.canvas.content is MultiplayerLevelSelectGui) { // cast(MarbleGame.canvas.content, MultiplayerLevelSelectGui).addChatMessage(msg); // } } - MPPlayMissionGui.addChatMessage(msg); } @:rpc(server) public static function setCompetitiveTimerStartTicks(ticks:Int) { - if (MarbleGame.instance.world != null) { - var huntMode = cast(MarbleGame.instance.world.gameMode, HuntMode); - huntMode.setCompetitiveTimerStartTicks(ticks); - } + if (MarbleGame.instance.world != null) {} } } diff --git a/src/touch/BlastButton.hx b/src/touch/BlastButton.hx deleted file mode 100644 index 38be5a6c..00000000 --- a/src/touch/BlastButton.hx +++ /dev/null @@ -1,23 +0,0 @@ -package touch; - -import src.MarbleGame; -import touch.TouchInput.Touch; -import h3d.Vector; -import hxd.Window; -import src.ResourceLoader; -import src.Settings; - -class BlastButton extends TouchButton { - public var didPressIt:Bool = true; - - public function new() { - var mode = MarbleGame.instance.world != null ? @:privateAccess MarbleGame.instance.world.marble.camera.spectate : false; - super(ResourceLoader.getImage(mode ? "data/ui/touch/video-camera.png" : "data/ui/touch/explosion.png").resource, - new Vector(Settings.touchSettings.blastButtonPos[0], Settings.touchSettings.blastButtonPos[1]), Settings.touchSettings.blastButtonSize); - this.setEnabled(false); - this.onClick = () -> { - this.pressed = true; - didPressIt = true; - } - } -} diff --git a/src/touch/SpectatorChangeTargetButton.hx b/src/touch/SpectatorChangeTargetButton.hx deleted file mode 100644 index 47b153d1..00000000 --- a/src/touch/SpectatorChangeTargetButton.hx +++ /dev/null @@ -1,25 +0,0 @@ -package touch; - -import src.MarbleGame; -import touch.TouchInput.Touch; -import h3d.Vector; -import hxd.Window; -import src.ResourceLoader; -import src.Settings; - -class SpectatorChangeTargetButton extends TouchButton { - public var didPressIt:Bool = true; - - public function new(rightFacing:Bool) { - super(ResourceLoader.getImage(rightFacing ? "data/ui/touch/right.png" : "data/ui/touch/left.png").resource, new Vector(rightFacing ? 560 : 70, 120), - 60); - if (!rightFacing) { - this.guiElement.horizSizing = Right; - } - this.setEnabled(false); - this.onClick = () -> { - this.pressed = true; - didPressIt = true; - } - } -} diff --git a/src/touch/TouchInput.hx b/src/touch/TouchInput.hx index f0921018..37bcfeee 100644 --- a/src/touch/TouchInput.hx +++ b/src/touch/TouchInput.hx @@ -42,12 +42,9 @@ class TouchInput { public var jumpButton:JumpButton; public var powerupButton:PowerupButton; - public var blastbutton:BlastButton; public var pauseButton:PauseButton; public var rewindButton:RewindButton; public var restartButton:RestartButton; - public var leftButton:SpectatorChangeTargetButton; - public var rightButton:SpectatorChangeTargetButton; public var currentTouchState:TouchEventState; @@ -60,7 +57,6 @@ class TouchInput { this.movementInput = new MovementInput(); this.jumpButton = new JumpButton(); this.powerupButton = new PowerupButton(); - this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); this.rewindButton = new RewindButton(); this.restartButton = new RestartButton(); @@ -112,8 +108,6 @@ class TouchInput { public function showControls(parentGui:GuiControl, ultra:Bool) { jumpButton.dispose(); powerupButton.dispose(); - if (ultra) - blastbutton.dispose(); movementInput.dispose(); pauseButton.dispose(); restartButton.dispose(); @@ -124,8 +118,6 @@ class TouchInput { this.powerupButton = new PowerupButton(); if (Settings.optionsSettings.rewindEnabled && !MarbleGame.instance.world.isMultiplayer) this.rewindButton = new RewindButton(); - if (ultra) - this.blastbutton = new BlastButton(); this.pauseButton = new PauseButton(); if (!MarbleGame.instance.world.isMultiplayer) this.restartButton = new RestartButton(); @@ -136,8 +128,6 @@ class TouchInput { powerupButton.add(parentGui); if (Settings.optionsSettings.rewindEnabled && !MarbleGame.instance.world.isMultiplayer) rewindButton.add(parentGui); - if (ultra) - blastbutton.add(parentGui); movementInput.add(parentGui); cameraInput.add(parentGui); cameraInput.enabled = true; @@ -145,26 +135,18 @@ class TouchInput { if (Settings.touchSettings.hideControls) { this.jumpButton.setVisible(false); this.powerupButton.setVisible(false); - if (this.blastbutton != null) - this.blastbutton.setVisible(false); this.movementInput.setVisible(false); this.pauseButton.setVisible(false); if (this.restartButton != null) this.restartButton.setVisible(false); if (this.rewindButton != null) this.rewindButton.setVisible(false); - if (this.leftButton != null) - this.leftButton.setVisible(false); - if (this.rightButton != null) - this.rightButton.setVisible(false); } } public function setControlsEnabled(enabled:Bool) { this.jumpButton.setVisible(enabled); this.powerupButton.setVisible(enabled); - if (this.blastbutton != null) - this.blastbutton.setVisible(enabled); this.movementInput.setVisible(enabled); this.pauseButton.setVisible(enabled); if (this.restartButton != null) @@ -172,31 +154,19 @@ class TouchInput { if (this.rewindButton != null) this.rewindButton.setVisible(enabled); this.cameraInput.enabled = enabled; - if (this.leftButton != null) - this.leftButton.setVisible(enabled); - if (this.rightButton != null) - this.rightButton.setVisible(enabled); if (Settings.touchSettings.hideControls) { this.jumpButton.setVisible(false); this.powerupButton.setVisible(false); - if (this.blastbutton != null) - this.blastbutton.setVisible(false); this.movementInput.setVisible(false); if (this.rewindButton != null) this.rewindButton.setVisible(false); - if (this.leftButton != null) - this.leftButton.setVisible(false); - if (this.rightButton != null) - this.rightButton.setVisible(false); } } public function hideControls(parentGui:GuiControl) { jumpButton.remove(parentGui); powerupButton.remove(parentGui); - if (this.blastbutton != null) - blastbutton.remove(parentGui); movementInput.remove(parentGui); pauseButton.remove(parentGui); if (this.restartButton != null) @@ -204,14 +174,6 @@ class TouchInput { cameraInput.remove(parentGui); if (this.rewindButton != null) rewindButton.remove(parentGui); - if (this.leftButton != null) { - leftButton.remove(parentGui); - leftButton.dispose(); - } - if (this.rightButton != null) { - rightButton.remove(parentGui); - rightButton.dispose(); - } jumpButton.dispose(); powerupButton.dispose(); movementInput.dispose(); @@ -221,41 +183,4 @@ class TouchInput { if (this.rewindButton != null) rewindButton.dispose(); } - - public function setSpectatorControls(enabled:Bool) { - var tile = ResourceLoader.getImage(enabled ? "data/ui/touch/video-camera.png" : "data/ui/touch/explosion.png").resource; - @:privateAccess this.blastbutton.guiElement.graphics.content.state.tail.texture = tile.toTexture(); - if (enabled) { - jumpButton.setVisible(false); - if (this.leftButton == null) { // both are added at same time so it doesnt matter - var par = jumpButton.guiElement.parent; - this.leftButton = new SpectatorChangeTargetButton(false); - this.rightButton = new SpectatorChangeTargetButton(true); - this.leftButton.add(par); - this.rightButton.add(par); - this.leftButton.guiElement.render(MarbleGame.canvas.scene2d, @:privateAccess par._flow); - this.rightButton.guiElement.render(MarbleGame.canvas.scene2d, @:privateAccess par._flow); - } - } else { - jumpButton.setVisible(true); - if (this.leftButton != null) { - this.leftButton.remove(this.leftButton.guiElement.parent); - this.leftButton.dispose(); - this.leftButton = null; - } - if (this.rightButton != null) { - this.rightButton.remove(this.rightButton.guiElement.parent); - this.rightButton.dispose(); - this.rightButton = null; - } - } - } - - public function setSpectatorControlsVisibility(enabled:Bool) { - if (this.leftButton != null) { - this.leftButton.setVisible(enabled); - this.rightButton.setVisible(enabled); - this.movementInput.setVisible(!enabled); - } - } }