add blast support to replay, fix mega bugs

This commit is contained in:
RandomityGuy 2022-12-14 18:51:20 +05:30
parent 50ae6803dc
commit 7b00b995d1
6 changed files with 61 additions and 36 deletions

View file

@ -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);
}
}

View file

@ -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')) {

View file

@ -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) {

View file

@ -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();
});
});
});
}

View file

@ -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();
}
}
}

View file

@ -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)))