From 30ae3c5405e70d6dfdf79bd0ab7bdb5702e4ab06 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Thu, 15 Jun 2023 01:18:50 +0530 Subject: [PATCH] more ultra stuff and fixes --- src/DtsObject.hx | 79 ++++++++++++++++++--------- src/InstanceManager.hx | 2 + src/Macros.hx | 6 +- src/MarbleWorld.hx | 58 +++++++------------- src/mis/MissionElement.hx | 3 +- src/rewind/RewindFrame.hx | 7 +-- src/shaders/DefaultCubemapMaterial.hx | 3 + src/shaders/DirLight.hx | 2 +- src/shapes/AntiGravity.hx | 11 ++-- src/shapes/Blast.hx | 1 + src/shapes/Checkpoint.hx | 29 +++++++--- src/shapes/SuperJump.hx | 1 + src/triggers/CheckpointTrigger.hx | 14 ++++- 13 files changed, 127 insertions(+), 89 deletions(-) diff --git a/src/DtsObject.hx b/src/DtsObject.hx index 2cb0c2ac..652ea3d8 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -46,7 +46,7 @@ var dtsMaterials = [ "bumper-rubber" => {friction: 0.5, restitution: 0.0, force: 15.0}, "triang-side" => {friction: 0.5, restitution: 0.0, force: 15.0}, "triang-top" => {friction: 0.5, restitution: 0.0, force: 15.0}, - "pball-round-side" => {friction: 0.5, restitution: 0.0, force: 15.0}, + "bumper" => {friction: 0.5, restitution: 0.0, force: 15.0}, "pball-round-top" => {friction: 0.5, restitution: 0.0, force: 15.0}, "pball-round-bottm" => {friction: 0.5, restitution: 0.0, force: 15.0} ]; @@ -705,6 +705,13 @@ class DtsObject extends GameObject { }); } + function normalizeSafe(v:Vector) { + var mag = ((v.x * v.x) <= 1e-4) && ((v.y * v.y) <= 1e-4) && ((v.z * v.z) <= 1e-4) ? 0.0 : v.length(); + if (mag > 1e-4) { + v.scale(1 / mag); + } + } + function createTextureSpaceMatrix(i0:Int, i1:Int, i2:Int) { var t0 = new Vector(); var t1 = new Vector(); @@ -715,8 +722,8 @@ class DtsObject extends GameObject { var edge1 = new Vector(); var edge2 = new Vector(); var cp = new Vector(); - edge1.set(vertices[i1].x - vertices[i0].x, vertices[i1].y - vertices[i0].y, vertices[i1].z - vertices[i0].z); - edge2.set(vertices[i2].x - vertices[i0].x, vertices[i2].y - vertices[i0].y, vertices[i2].z - vertices[i0].z); + edge1.set(vertices[i1].x - vertices[i0].x, dtsMesh.uv[i1].x - dtsMesh.uv[i0].x, dtsMesh.uv[i1].y - dtsMesh.uv[i0].y); + edge2.set(vertices[i2].x - vertices[i0].x, dtsMesh.uv[i2].x - dtsMesh.uv[i0].x, dtsMesh.uv[i2].y - dtsMesh.uv[i0].y); var fVar1 = vertices[i1].x - vertices[i0].x; var fVar2 = vertices[i2].x - vertices[i0].x; var fVar4 = dtsMesh.uv[i1].x - dtsMesh.uv[i0].x; @@ -773,25 +780,28 @@ class DtsObject extends GameObject { } // v0 - t0.normalize(); - b0.normalized(); + normalizeSafe(t0); + normalizeSafe(b0); var n0 = t0.cross(b0); + n0.x *= -1; if (n0.dot(vertexNormals[i0]) < 0.0) { n0.scale(-1); } // v1 - t1.normalize(); - b1.normalized(); + normalizeSafe(t1); + normalizeSafe(b1); var n1 = t1.cross(b1); + n1.x *= -1; if (n1.dot(vertexNormals[i1]) < 0.0) { n1.scale(-1); } // v2 - t2.normalize(); - b2.normalized(); + normalizeSafe(t2); + normalizeSafe(b2); var n2 = t2.cross(b2); + n2.x *= -1; if (n2.dot(vertexNormals[i2]) < 0.0) { n2.scale(-1); } @@ -802,9 +812,6 @@ class DtsObject extends GameObject { b0.x *= -1; b1.x *= -1; b2.x *= -1; - n0.x *= -1; - n1.x *= -1; - n2.x *= -1; return [ { @@ -866,17 +873,6 @@ class DtsObject extends GameObject { geometrydata.normals.push(new Vector(normal.x, normal.y, normal.z)); } - var tbn = createTextureSpaceMatrix(i1, i2, i3); - geometrydata.tangents.push(tbn[0].tangent); - geometrydata.tangents.push(tbn[1].tangent); - geometrydata.tangents.push(tbn[2].tangent); - geometrydata.bitangents.push(tbn[0].bitangent); - geometrydata.bitangents.push(tbn[1].bitangent); - geometrydata.bitangents.push(tbn[2].bitangent); - geometrydata.texNormals.push(tbn[0].normal); - geometrydata.texNormals.push(tbn[1].normal); - geometrydata.texNormals.push(tbn[2].normal); - geometrydata.indices.push(i1); geometrydata.indices.push(i2); geometrydata.indices.push(i3); @@ -897,6 +893,17 @@ class DtsObject extends GameObject { addTriangleFromIndices(i1, i2, i3, materialIndex); + var tbn = createTextureSpaceMatrix(dtsMesh.indices[i], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]); + geometrydata.tangents.push(tbn[2].tangent); + geometrydata.tangents.push(tbn[1].tangent); + geometrydata.tangents.push(tbn[0].tangent); + geometrydata.bitangents.push(tbn[2].bitangent); + geometrydata.bitangents.push(tbn[1].bitangent); + geometrydata.bitangents.push(tbn[0].bitangent); + geometrydata.texNormals.push(tbn[2].normal); + geometrydata.texNormals.push(tbn[1].normal); + geometrydata.texNormals.push(tbn[0].normal); + i += 3; } } else if (drawType == TSDrawPrimitive.Strip) { @@ -915,6 +922,17 @@ class DtsObject extends GameObject { addTriangleFromIndices(i1, i2, i3, materialIndex); + var tbn = createTextureSpaceMatrix(dtsMesh.indices[i], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]); + geometrydata.tangents.push(tbn[2].tangent); + geometrydata.tangents.push(tbn[1].tangent); + geometrydata.tangents.push(tbn[0].tangent); + geometrydata.bitangents.push(tbn[2].bitangent); + geometrydata.bitangents.push(tbn[1].bitangent); + geometrydata.bitangents.push(tbn[0].bitangent); + geometrydata.texNormals.push(tbn[2].normal); + geometrydata.texNormals.push(tbn[1].normal); + geometrydata.texNormals.push(tbn[0].normal); + k++; } } else if (drawType == TSDrawPrimitive.Fan) { @@ -926,6 +944,17 @@ class DtsObject extends GameObject { addTriangleFromIndices(i1, i2, i3, materialIndex); + var tbn = createTextureSpaceMatrix(dtsMesh.indices[primitive.firstElement], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]); + geometrydata.tangents.push(tbn[2].tangent); + geometrydata.tangents.push(tbn[1].tangent); + geometrydata.tangents.push(tbn[0].tangent); + geometrydata.bitangents.push(tbn[2].bitangent); + geometrydata.bitangents.push(tbn[1].bitangent); + geometrydata.bitangents.push(tbn[0].bitangent); + geometrydata.texNormals.push(tbn[2].normal); + geometrydata.texNormals.push(tbn[1].normal); + geometrydata.texNormals.push(tbn[0].normal); + i++; } } @@ -1118,14 +1147,12 @@ class DtsObject extends GameObject { var v1 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeLow].vis; var v2 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeHigh].vis; - if (this.identifier == "RoundBumper") { - trace('Bumper: ${v1} ${v2}'); - } var v = Util.lerp(v1, v2, t); meshVisibilities[visIterIdx] = v; updateSubObjectOpacity(visIterIdx); affectedCount++; } else { + updateSubObjectOpacity(visIterIdx); meshVisibilities[visIterIdx] = this.dts.objectStates[visIterIdx].vis; } vis >>= 1; diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 388a018b..aabd5ac9 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -74,6 +74,8 @@ class InstanceManager { if (dtsShader != null) { if (instance.gameObject.animateSubObjectOpacities) { subOpacity = instance.gameObject.getSubObjectOpacity(instance.emptyObj); + if (subOpacity == 0) + continue; // Do not draw minfo.meshbatch.shadersChanged = true; } diff --git a/src/Macros.hx b/src/Macros.hx index 7e86ca98..ef819c80 100644 --- a/src/Macros.hx +++ b/src/Macros.hx @@ -78,9 +78,11 @@ class MarbleWorldMacros { shape = new Helicopter(cast element); else if (dataBlockLowerCase == "eastereggitem") shape = new EasterEgg(cast element); - else if (dataBlockLowerCase == "checkpointshape") + else if (dataBlockLowerCase == "checkpointshape") { shape = new Checkpoint(cast element); - else if (dataBlockLowerCase == "ductfan") + if (_previousCheckpointTrigger != null) + _previousCheckpointTrigger.checkpoint = cast shape; + } else if (dataBlockLowerCase == "ductfan") shape = new DuctFan(); else if (dataBlockLowerCase == "smallductfan") shape = new SmallDuctFan(); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index a1211c22..22de1e09 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,5 +1,6 @@ package src; +import h3d.scene.fwd.Light; import rewind.RewindManager; import Macros.MarbleWorldMacros; #if js @@ -156,12 +157,14 @@ class MarbleWorld extends Scheduler { public var newOrientationQuat = new Quat(); // Checkpoint - var currentCheckpoint:{obj:DtsObject, elem:MissionElementBase} = null; + var currentCheckpoint:DtsObject = null; var currentCheckpointTrigger:CheckpointTrigger = null; var checkpointCollectedGems:Map = []; var checkpointHeldPowerup:PowerUp = null; var checkpointUp:Vector = null; var cheeckpointBlast:Float = 0; + var checkpointSequence:Int = 0; + var _previousCheckpointTrigger:CheckpointTrigger; // Replay public var replay:Replay; @@ -316,6 +319,7 @@ class MarbleWorld extends Scheduler { var ls = cast(scene.lightSystem, h3d.scene.fwd.LightSystem); ls.ambientLight.load(ambientColor); + // ls.shadowLight.setDirection(new Vector(0, 0, -1)); this.ambient = ambientColor; // ls.perPixelLighting = false; @@ -461,6 +465,7 @@ class MarbleWorld extends Scheduler { this.checkpointHeldPowerup = null; this.checkpointUp = null; this.cheeckpointBlast = 0; + this.checkpointSequence = 0; if (this.endPad != null) this.endPad.inFinish = false; @@ -493,7 +498,7 @@ class MarbleWorld extends Scheduler { var startquat = this.getStartPositionAndOrientation(); - this.marble.setPosition(startquat.position.x, startquat.position.y, startquat.position.z + 1.5); + this.marble.setPosition(startquat.position.x, startquat.position.y, startquat.position.z + 0.727843); var oldtransform = this.marble.collider.transform.clone(); oldtransform.setPosition(startquat.position); this.marble.collider.setTransform(oldtransform); @@ -723,6 +728,7 @@ class MarbleWorld extends Scheduler { trigger = new DestinationTrigger(element, cast this); } else if (datablockLowercase == "checkpointtrigger") { trigger = new CheckpointTrigger(element, cast this); + _previousCheckpointTrigger = cast trigger; } else { Console.error("Unknown trigger: " + element.datablock); onFinish(); @@ -1721,22 +1727,20 @@ class MarbleWorld extends Scheduler { } /** Sets a new active checkpoint. */ - public function saveCheckpointState(shape:{obj:DtsObject, elem:MissionElementBase}, trigger:CheckpointTrigger = null) { + public function saveCheckpointState(shape:DtsObject, trigger:CheckpointTrigger = null) { if (this.currentCheckpoint != null) - if (this.currentCheckpoint.obj == shape.obj) - return; + if (this.currentCheckpoint == shape) + return false; var disableOob = false; - if (shape != null) { - if (shape.elem.fields.exists('disableOob')) { - disableOob = MisParser.parseBoolean(shape.elem.fields.get('disableOob')[0]); - } - } if (trigger != null) { disableOob = trigger.disableOOB; + if (checkpointSequence > trigger.seqNum) + return false; } + checkpointSequence = trigger.seqNum; // (shape.srcElement as any) ?.disableOob || trigger?.element.disableOob; if (disableOob && this.outOfBounds) - return; // The checkpoint is configured to not work when the player is already OOB + return false; // The checkpoint is configured to not work when the player is already OOB this.currentCheckpoint = shape; this.currentCheckpointTrigger = trigger; this.checkpointCollectedGems.clear(); @@ -1750,34 +1754,15 @@ class MarbleWorld extends Scheduler { this.checkpointHeldPowerup = this.marble.heldPowerup; this.displayAlert("Checkpoint reached!"); AudioManager.playSound(ResourceLoader.getResource('data/sound/checkpoint.wav', ResourceLoader.getAudio, this.soundResources)); + return true; } /** Resets to the last stored checkpoint state. */ public function loadCheckpointState() { var marble = this.marble; // Determine where to spawn the marble - var offset = new Vector(0, 0, 3); - var add = ""; // (this.currentCheckpoint.srcElement as any)?.add || this.currentCheckpointTrigger?.element.add; - if (this.currentCheckpoint.elem.fields.exists('add')) { - add = this.currentCheckpoint.elem.fields.get('add')[0]; - } - var sub = ""; - if (this.currentCheckpoint.elem.fields.exists('sub')) { - sub = this.currentCheckpoint.elem.fields.get('sub')[0]; - } - if (this.currentCheckpointTrigger != null) { - if (this.currentCheckpointTrigger.add != null) - offset = this.currentCheckpointTrigger.add; - } - if (add != "") { - offset = MisParser.parseVector3(add); - offset.x = -offset.x; - } - if (sub != "") { - offset = MisParser.parseVector3(sub).multiply(-1); - offset.x = -offset.x; - } - var mpos = this.currentCheckpoint.obj.getAbsPos().getPosition().add(offset); + var offset = new Vector(0, 0, 0.727843); + var mpos = this.currentCheckpoint.getAbsPos().getPosition().add(offset); this.marble.setPosition(mpos.x, mpos.y, mpos.z); marble.velocity.load(new Vector(0, 0, 0)); marble.omega.load(new Vector(0, 0, 0)); @@ -1786,7 +1771,7 @@ class MarbleWorld extends Scheduler { Console.log('Marble Velocity: ${marble.velocity.x} ${marble.velocity.y} ${marble.velocity.z}'); Console.log('Marble Angular: ${marble.omega.x} ${marble.omega.y} ${marble.omega.z}'); // Set camera orientation - var euler = this.currentCheckpoint.obj.getRotationQuat().toEuler(); + var euler = this.currentCheckpoint.getRotationQuat().toEuler(); this.marble.camera.CameraYaw = euler.z + Math.PI / 2; this.marble.camera.CameraPitch = 0.45; this.marble.camera.nextCameraYaw = this.marble.camera.CameraYaw; @@ -1804,9 +1789,6 @@ class MarbleWorld extends Scheduler { 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')) { - gravityField = this.currentCheckpoint.elem.fields.get('gravity')[0]; - } if (this.currentCheckpointTrigger != null) { if (@:privateAccess this.currentCheckpointTrigger.element.fields.exists('gravity')) { gravityField = @:privateAccess this.currentCheckpointTrigger.element.fields.get('gravity')[0]; @@ -1815,7 +1797,7 @@ class MarbleWorld extends Scheduler { if (MisParser.parseBoolean(gravityField)) { // In this case, we set the gravity to the relative "up" vector of the checkpoint shape. var up = new Vector(0, 0, 1); - up.transform(this.currentCheckpoint.obj.getRotationQuat().toMatrix()); + up.transform(this.currentCheckpoint.getRotationQuat().toMatrix()); this.setUp(up, this.timeState, true); } else { // Otherwise, we restore gravity to what was stored. diff --git a/src/mis/MissionElement.hx b/src/mis/MissionElement.hx index 2b3a0b5c..e49a6041 100644 --- a/src/mis/MissionElement.hx +++ b/src/mis/MissionElement.hx @@ -235,8 +235,7 @@ class MissionElementTrigger extends MissionElementBase { // checkpoint stuff: var respawnpoint:Null; - var add:Null; - var sub:Null; + var sequence:Null; var gravity:Null; var disableOob:Null; // teleport/destination trigger stuff: diff --git a/src/rewind/RewindFrame.hx b/src/rewind/RewindFrame.hx index 5b320b23..83f3ade9 100644 --- a/src/rewind/RewindFrame.hx +++ b/src/rewind/RewindFrame.hx @@ -39,7 +39,7 @@ class RewindFrame { }; var checkpointState:{ - currentCheckpoint:{obj:DtsObject, elem:MissionElementBase}, + currentCheckpoint:DtsObject, currentCheckpointTrigger:CheckpointTrigger, checkpointCollectedGems:Map, checkpointHeldPowerup:PowerUp, @@ -91,10 +91,7 @@ class RewindFrame { timeState: oobState.timeState != null ? oobState.timeState.clone() : null }; c.checkpointState = { - currentCheckpoint: checkpointState.currentCheckpoint != null ? { - obj: checkpointState.currentCheckpoint.obj, - elem: checkpointState.currentCheckpoint.elem, - } : null, + currentCheckpoint: checkpointState.currentCheckpoint, currentCheckpointTrigger: checkpointState.currentCheckpointTrigger, checkpointCollectedGems: checkpointState.checkpointCollectedGems.copy(), checkpointHeldPowerup: checkpointState.checkpointHeldPowerup, diff --git a/src/shaders/DefaultCubemapMaterial.hx b/src/shaders/DefaultCubemapMaterial.hx index fc77f3c9..aebefbf0 100644 --- a/src/shaders/DefaultCubemapMaterial.hx +++ b/src/shaders/DefaultCubemapMaterial.hx @@ -91,6 +91,9 @@ class DefaultCubemapMaterial extends hxsl.Shader { outCol.z = a * pow(outCol.z, b); } + // outCol *= 0.001; + // outCol += diffuse; + // outCol *= (shading * bumpDot) + ambient; pixelColor = outCol; } } diff --git a/src/shaders/DirLight.hx b/src/shaders/DirLight.hx index 80cb947c..083d55d9 100644 --- a/src/shaders/DirLight.hx +++ b/src/shaders/DirLight.hx @@ -33,7 +33,7 @@ class DirLight extends Light { } override function getShadowDirection():h3d.Vector { - return absPos.front(); + return new h3d.Vector(0, 0, -1); } override function emit(ctx) { diff --git a/src/shapes/AntiGravity.hx b/src/shapes/AntiGravity.hx index ee55e274..3c6a543f 100644 --- a/src/shapes/AntiGravity.hx +++ b/src/shapes/AntiGravity.hx @@ -17,6 +17,7 @@ class AntiGravity extends PowerUp { this.pickUpName = "Gravity Defier"; this.autoUse = true; this.useInstancing = true; + this.animateSubObjectOpacities = true; if (norespawn) this.cooldownDuration = Math.NEGATIVE_INFINITY; } @@ -59,8 +60,8 @@ class AntiGravity extends PowerUp { normalTex.mipMap = Nearest; var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1); shader.doGammaRamp = false; - // var dtsTex = material.mainPass.getShader(shaders.DtsTexture); - // dtsTex.passThrough = true; + var dtsTex = material.mainPass.getShader(shaders.DtsTexture); + dtsTex.passThrough = true; material.mainPass.removeShader(material.textureShader); material.mainPass.addShader(shader); var thisprops:Dynamic = material.getDefaultProps(); @@ -79,8 +80,7 @@ class AntiGravity extends PowerUp { var glowpass = material.mainPass.clone(); glowpass.addShader(trivialShader); var dtsshader = glowpass.getShader(shaders.DtsTexture); - if (dtsshader != null) - glowpass.removeShader(dtsshader); + dtsshader.passThrough = true; glowpass.setPassName("glow"); glowpass.depthTest = LessEqual; glowpass.enableLights = false; @@ -89,8 +89,7 @@ class AntiGravity extends PowerUp { material.mainPass.setPassName("glowPre"); material.mainPass.addShader(trivialShader); dtsshader = material.mainPass.getShader(shaders.DtsTexture); - if (dtsshader != null) - material.mainPass.removeShader(dtsshader); + dtsshader.passThrough = true; material.mainPass.enableLights = false; var thisprops:Dynamic = material.getDefaultProps(); diff --git a/src/shapes/Blast.hx b/src/shapes/Blast.hx index d555e613..b0ce0b1c 100644 --- a/src/shapes/Blast.hx +++ b/src/shapes/Blast.hx @@ -14,6 +14,7 @@ class Blast extends PowerUp { this.showSequences = true; this.identifier = "Blast"; this.pickUpName = "Blast PowerUp"; + this.ambientRotate = false; this.autoUse = true; } diff --git a/src/shapes/Checkpoint.hx b/src/shapes/Checkpoint.hx index e0782168..ef4f8be2 100644 --- a/src/shapes/Checkpoint.hx +++ b/src/shapes/Checkpoint.hx @@ -4,11 +4,14 @@ import collision.CollisionInfo; import mis.MisParser; import src.DtsObject; import src.ResourceLoader; +import src.Util; import mis.MissionElement.MissionElementStaticShape; class Checkpoint extends DtsObject { public var disableOOB = false; + var lastActivatedTime:Float = Math.POSITIVE_INFINITY; + var element:MissionElementStaticShape; public function new(element:MissionElementStaticShape) { @@ -29,11 +32,24 @@ class Checkpoint extends DtsObject { }); } - public override function onMarbleContact(time:src.TimeState, ?contact:CollisionInfo) { - this.level.saveCheckpointState({ - obj: this, - elem: this.element - }, null); + public override function update(timeState:src.TimeState) { + // Override the keyframe + var currentCompletion = getCurrentCompletion(timeState); + this.sequenceKeyframeOverride.set(this.dts.sequences[0], currentCompletion * (this.dts.sequences[0].numKeyFrames - 1)); + this.sequenceKeyframeOverride.set(this.dts.sequences[1], 0); // Always + super.update(timeState); + } + + function getCurrentCompletion(timeState:src.TimeState) { + var elapsed = timeState.timeSinceLoad - this.lastActivatedTime; + var completion = Util.clamp(elapsed / this.dts.sequences[0].duration, 0, 1); + return completion; + } + + override function reset() { + super.reset(); + lastActivatedTime = Math.POSITIVE_INFINITY; + meshVisibilities = [0, 1, 0]; // pls } override function postProcessMaterial(matName:String, material:h3d.mat.Material) { @@ -57,8 +73,7 @@ class Checkpoint extends DtsObject { material.mainPass.setPassName("glowPre"); material.mainPass.addShader(trivialShader); dtsshader = material.mainPass.getShader(shaders.DtsTexture); - if (dtsshader != null) - material.mainPass.removeShader(dtsshader); + dtsshader.passThrough = true; material.mainPass.enableLights = false; material.mainPass.setBlendMode(Alpha); } diff --git a/src/shapes/SuperJump.hx b/src/shapes/SuperJump.hx index 76013256..0009df43 100644 --- a/src/shapes/SuperJump.hx +++ b/src/shapes/SuperJump.hx @@ -43,6 +43,7 @@ class SuperJump extends PowerUp { this.isTSStatic = false; this.identifier = "SuperJump"; this.pickUpName = "Jump Boost PowerUp"; + this.showSequences = false; sjEmitterParticleData = new ParticleData(); sjEmitterParticleData.identifier = "superJumpParticle"; sjEmitterParticleData.texture = ResourceLoader.getResource("data/particles/twirl.png", ResourceLoader.getTexture, this.textureResources); diff --git a/src/triggers/CheckpointTrigger.hx b/src/triggers/CheckpointTrigger.hx index b670d018..7dbb7065 100644 --- a/src/triggers/CheckpointTrigger.hx +++ b/src/triggers/CheckpointTrigger.hx @@ -1,5 +1,6 @@ package triggers; +import shapes.Checkpoint; import h3d.Vector; import src.MarbleWorld; import mis.MissionElement.MissionElementTrigger; @@ -9,12 +10,15 @@ import mis.MisParser; class CheckpointTrigger extends Trigger { public var disableOOB = false; public var add:Vector = null; + public var checkpoint:Checkpoint; + public var seqNum:Int; override public function new(element:MissionElementTrigger, level:MarbleWorld) { super(element, level); this.disableOOB = element.fields.exists('disableOob') ? MisParser.parseBoolean(element.fields['disableOob'][0]) : false; this.add = element.fields.exists('add') ? MisParser.parseVector3(element.fields['add'][0]) : null; + this.seqNum = element.fields.exists('sequence') ? Std.parseInt(element.sequence) : 1; } public override function init(onFinish:() -> Void) { @@ -25,9 +29,15 @@ class CheckpointTrigger extends Trigger { public override function onMarbleEnter(time:src.TimeState) { super.onMarbleEnter(time); - var shape = this.level.namedObjects.get(this.element.respawnpoint); + var shape = checkpoint; if (shape == null) return; - this.level.saveCheckpointState(shape, this); + if (this.level.saveCheckpointState(shape, this)) { + shape.lastActivatedTime = time.timeSinceLoad; + for (obj in this.level.dtsObjects) { + if (obj.identifier == "Checkpoint" && obj != shape) + cast(obj, Checkpoint).lastActivatedTime = Math.POSITIVE_INFINITY; + } + } } }