From 7b00b995d10030c69bc04f5693d2b2ecee7e5bbd Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 14 Dec 2022 18:51:20 +0530 Subject: [PATCH] add blast support to replay, fix mega bugs --- src/Marble.hx | 2 +- src/MarbleWorld.hx | 50 +++++++++++++++++++++------------ src/Replay.hx | 9 ++++-- src/gui/PlayGui.hx | 30 +++++++++++--------- src/touch/RestartButton.hx | 4 +++ src/triggers/TeleportTrigger.hx | 2 +- 6 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/Marble.hx b/src/Marble.hx index e190fa78..4891532d 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1579,7 +1579,7 @@ class Marble extends GameObject { move.d = new Vector(this.level.replay.currentPlaybackFrame.marbleX, this.level.replay.currentPlaybackFrame.marbleY, 0); } else { if (this.level.isRecording) { - this.level.replay.recordMarbleStateFlags(move.jump, move.powerup, false); + this.level.replay.recordMarbleStateFlags(move.jump, move.powerup, false, false); this.level.replay.recordMarbleInput(move.d.x, move.d.y); } } diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index cc4286a1..9ab3f76d 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -363,6 +363,7 @@ class MarbleWorld extends Scheduler { "shapes/pads/green.jpg", "shapes/items/gem.dts", // Ew ew "shapes/items/gemshine.png", + "shapes/items/enviro1.jpg", ]; if (this.game == "ultra") { marblefiles.push("shapes/balls/pack1/marble20.normal.png"); @@ -1102,6 +1103,24 @@ class MarbleWorld extends Scheduler { } } + public function performRestart() { + this.respawnPressedTime = timeState.timeSinceLoad; + this.restart(); + if (!this.isWatching) { + Settings.playStatistics.respawns++; + + if (!Settings.levelStatistics.exists(mission.path)) { + Settings.levelStatistics.set(mission.path, { + oobs: 0, + respawns: 1, + totalTime: 0, + }); + } else { + Settings.levelStatistics[mission.path].respawns++; + } + } + } + public function update(dt:Float) { if (!_ready) { return; @@ -1131,23 +1150,8 @@ class MarbleWorld extends Scheduler { ProfilerUI.measure("updateTimer"); this.updateTimer(dt); - if ((Key.isPressed(Settings.controlsSettings.respawn) || MarbleGame.instance.touchInput.restartButton.pressed) - && this.finishTime == null) { - this.respawnPressedTime = timeState.timeSinceLoad; - this.restart(); - if (!this.isWatching) { - Settings.playStatistics.respawns++; - - if (!Settings.levelStatistics.exists(mission.path)) { - Settings.levelStatistics.set(mission.path, { - oobs: 0, - respawns: 1, - totalTime: 0, - }); - } else { - Settings.levelStatistics[mission.path].respawns++; - } - } + if ((Key.isPressed(Settings.controlsSettings.respawn)) && this.finishTime == null) { + performRestart(); return; } @@ -1168,8 +1172,14 @@ class MarbleWorld extends Scheduler { && !this.isWatching && this.game == "ultra") { this.marble.useBlast(); + if (this.isRecording) { + this.replay.recordMarbleStateFlags(false, false, false, true); + } } + if (this.isWatching && this.replay.currentPlaybackFrame.marbleStateFlags.has(UsedBlast)) + this.marble.useBlast(); + // Replay gravity if (this.isWatching) { if (this.replay.currentPlaybackFrame.gravityChange) { @@ -1769,12 +1779,16 @@ class MarbleWorld extends Scheduler { this.marble.camera.nextCameraYaw = this.marble.camera.CameraYaw; this.marble.camera.nextCameraPitch = this.marble.camera.CameraPitch; this.marble.camera.oob = false; + @:privateAccess this.marble.superBounceEnableTime = -1e8; + @:privateAccess this.marble.shockAbsorberEnableTime = -1e8; + @:privateAccess this.marble.helicopterEnableTime = -1e8; + @:privateAccess this.marble.megaMarbleEnableTime = -1e8; this.blastAmount = this.cheeckpointBlast; if (this.isRecording) { this.replay.recordCameraState(this.marble.camera.CameraYaw, this.marble.camera.CameraPitch); this.replay.recordMarbleInput(0, 0); this.replay.recordMarbleState(mpos, marble.velocity, marble.getRotationQuat(), marble.omega); - this.replay.recordMarbleStateFlags(false, false, true); + this.replay.recordMarbleStateFlags(false, false, true, false); } var gravityField = ""; // (this.currentCheckpoint.srcElement as any) ?.gravity || this.currentCheckpointTrigger?.element.gravity; if (this.currentCheckpoint.elem.fields.exists('gravity')) { diff --git a/src/Replay.hx b/src/Replay.hx index ad279189..b4b99990 100644 --- a/src/Replay.hx +++ b/src/Replay.hx @@ -16,6 +16,7 @@ enum ReplayMarbleState { UsedPowerup; Jumped; InstantTeleport; + UsedBlast; } @:publicFields @@ -99,6 +100,8 @@ class ReplayFrame { interpFrame.marbleStateFlags.set(UsedPowerup); if (this.marbleStateFlags.has(Jumped)) interpFrame.marbleStateFlags.set(Jumped); + if (this.marbleStateFlags.has(UsedBlast)) + interpFrame.marbleStateFlags.set(UsedBlast); // Input interpFrame.marbleX = this.marbleX; @@ -246,7 +249,7 @@ class Replay { var currentPlaybackFrameIdx:Int; var currentPlaybackTime:Float; - var version:Int = 3; + var version:Int = 4; public function new(mission:String) { this.mission = mission; @@ -276,13 +279,15 @@ class Replay { currentRecordFrame.marbleAngularVelocity = angularVelocity.clone(); } - public function recordMarbleStateFlags(jumped:Bool, usedPowerup:Bool, instantTeleport:Bool) { + public function recordMarbleStateFlags(jumped:Bool, usedPowerup:Bool, instantTeleport:Bool, usedBlast:Bool) { if (jumped) currentRecordFrame.marbleStateFlags.set(Jumped); if (usedPowerup) currentRecordFrame.marbleStateFlags.set(UsedPowerup); if (instantTeleport) currentRecordFrame.marbleStateFlags.set(InstantTeleport); + if (usedBlast) + currentRecordFrame.marbleStateFlags.set(UsedBlast); } public function recordPowerupPickup(powerup:PowerUp) { diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 6c5a29bf..2c325583 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -309,23 +309,25 @@ class PlayGui { // gemImageObject.matNameOverride.set("base.gem", "base.gem."); gemImageObject.ambientSpinFactor /= -2; // ["base.gem"] = color + ".gem"; - ResourceLoader.load("shapes/items/" + gemColor + ".gem.png").entry.load(() -> { - gemImageObject.init(null, () -> { - for (mat in gemImageObject.materials) { - mat.mainPass.enableLights = false; + 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; - // Huge hacks - if (mat.blendMode != Add) { - var alphaShader = new h3d.shader.AlphaChannel(); - mat.mainPass.addShader(alphaShader); + // 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.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); + onFinish(); + }); }); }); } diff --git a/src/touch/RestartButton.hx b/src/touch/RestartButton.hx index f09ca93e..589f24cc 100644 --- a/src/touch/RestartButton.hx +++ b/src/touch/RestartButton.hx @@ -10,5 +10,9 @@ class RestartButton extends TouchButton { super(ResourceLoader.getImage("data/ui/touch/refresh.png").resource, new Vector(135, 55 + offset), 35); this.guiElement.horizSizing = Right; this.guiElement.vertSizing = Bottom; + this.onClick = () -> { + if (MarbleGame.instance.world.finishTime == null) + MarbleGame.instance.world.performRestart(); + } } } diff --git a/src/triggers/TeleportTrigger.hx b/src/triggers/TeleportTrigger.hx index 8b789d44..8fa74631 100644 --- a/src/triggers/TeleportTrigger.hx +++ b/src/triggers/TeleportTrigger.hx @@ -89,7 +89,7 @@ class TeleportTrigger extends Trigger { this.level.marble.prevPos.load(position); this.level.marble.setPosition(position.x, position.y, position.z); if (this.level.isRecording) { - this.level.replay.recordMarbleStateFlags(false, false, true); + this.level.replay.recordMarbleStateFlags(false, false, true, false); } if (!MisParser.parseBoolean(chooseNonNull(this.element.keepvelocity, destination.element.keepvelocity)))