diff --git a/src/Marble.hx b/src/Marble.hx index 889af939..82e9ee12 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1861,7 +1861,7 @@ class Marble extends GameObject { this.updateRollSound(timeState, contactTime / timeState.dt, this._slipAmount); - var megaMarbleDurationTicks = Net.connectedServerInfo.competitiveMode ? 156 : 312; + var megaMarbleDurationTicks = Net.isMP && Net.connectedServerInfo.competitiveMode ? 156 : 312; if (this.megaMarbleUseTick > 0) { if (Net.isHost) { @@ -2531,7 +2531,7 @@ class Marble extends GameObject { } inline function isMegaMarbleEnabled(timeState:TimeState) { - var megaMarbleTicks = Net.connectedServerInfo.competitiveMode ? 156 : 312; + var megaMarbleTicks = Net.isMP && Net.connectedServerInfo.competitiveMode ? 156 : 312; if (this.level == null) return false; if (!this.level.isMultiplayer) { diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index ed685f89..568f0783 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -208,7 +208,8 @@ 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) { + 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 } paused = !paused; diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 413b9c22..f5f040d6 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -787,9 +787,6 @@ class MarbleWorld extends Scheduler { for (interior in this.interiors) interior.reset(); - this.oldOrientationQuat = new Quat(); - this.newOrientationQuat = new Quat(); - this.orientationChangeTime = -1e8; this.setUp(this.marble, startquat.up, this.timeState, true); this.deselectPowerUp(this.marble); @@ -2618,6 +2615,14 @@ class MarbleWorld extends Scheduler { /** Get the current interpolated orientation quaternion. */ public function getOrientationQuat(time:Float) { + if (this.oldOrientationQuat.lengthSq() == 0.0) { + this.oldOrientationQuat = new Quat(); + // this.oldOrientationQuat.init(this.marble.currentUp.toPoint()); + } + if (this.newOrientationQuat.lengthSq() == 0.0) { + this.newOrientationQuat = new Quat(); + // this.newOrientationQuat.initNormal(this.marble.currentUp.toPoint()); + } if (time < this.orientationChangeTime) return this.oldOrientationQuat; if (time > this.orientationChangeTime + 0.3) @@ -2651,7 +2656,7 @@ class MarbleWorld extends Scheduler { var u = v1.normalized(); var v = v2.normalized(); - if (u.dot(v) == -1) { + if (Math.abs(u.dot(v) + 1) < hxd.Math.EPSILON) { var q = new Quat(); var o = orthogonal(u).normalized(); q.x = o.x; diff --git a/src/Marbleland.hx b/src/Marbleland.hx index ac071055..d7df9414 100644 --- a/src/Marbleland.hx +++ b/src/Marbleland.hx @@ -82,6 +82,8 @@ class Marbleland { mission.isClaMission = true; mission.addedAt = missionData.addedAt; mission.gameMode = missionData.gameMode; + if (mission.gameMode != null) + mission.gameMode = mission.gameMode.toLowerCase(); var game = missionData.modification; if (isMultiplayer) { diff --git a/src/Mission.hx b/src/Mission.hx index 85d3f283..3d5a8341 100644 --- a/src/Mission.hx +++ b/src/Mission.hx @@ -267,7 +267,7 @@ class Mission { alarmStart = 15; return alarmStart; } - alarmStart = 0; + var alarmStart = this.qualifyTime; if (this.missionInfo.alarmstarttime != null) alarmStart -= MisParser.parseNumber(this.missionInfo.alarmstarttime); else { diff --git a/src/gui/MPPreGameDlg.hx b/src/gui/MPPreGameDlg.hx index 14653886..c2154ba6 100644 --- a/src/gui/MPPreGameDlg.hx +++ b/src/gui/MPPreGameDlg.hx @@ -268,8 +268,10 @@ class MPPreGameDlg extends GuiControl { 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); diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 1ee8eaa5..a93e8550 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -190,10 +190,10 @@ class PlayGui { for (i in 0...3) { countdownNumbers.push(new GuiAnim(numberTiles)); } + } - for (i in 0...6) { - gemCountNumbers.push(new GuiAnim(numberTiles)); - } + for (i in 0...6) { + gemCountNumbers.push(new GuiAnim(numberTiles)); } var rsgo = []; diff --git a/src/mis/MissionElement.hx b/src/mis/MissionElement.hx index 456d514a..ca94315c 100644 --- a/src/mis/MissionElement.hx +++ b/src/mis/MissionElement.hx @@ -254,6 +254,7 @@ class MissionElementTrigger extends MissionElementBase { var keepangular:Null; var keepcamera:Null; var camerayaw:Null; + var g:Null; public function new() { _type = MissionElementType.Trigger; diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx index 1b456f3e..9ee143d4 100644 --- a/src/modes/HuntMode.hx +++ b/src/modes/HuntMode.hx @@ -113,6 +113,10 @@ class HuntMode extends NullMode { 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, @@ -139,6 +143,9 @@ class HuntMode extends NullMode { 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, @@ -166,6 +173,9 @@ class HuntMode extends NullMode { 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 { @@ -375,7 +385,14 @@ class HuntMode extends NullMode { if (gemSpawn.gem != null) { gemSpawn.gem.pickedUp = status; gemSpawn.gem.setHide(status); - gemSpawn.gemBeam.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 @@ -387,10 +404,15 @@ class HuntMode extends NullMode { 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) {