implement mega marble

This commit is contained in:
RandomityGuy 2022-12-07 13:02:23 +05:30
parent 1d24fb1976
commit d261a15cb2
2 changed files with 88 additions and 8 deletions

View file

@ -178,6 +178,8 @@ class Marble extends GameObject {
public var _radius = 0.2; public var _radius = 0.2;
var _prevRadius:Float;
var _maxRollVelocity = 15; var _maxRollVelocity = 15;
var _angularAcceleration = 75; var _angularAcceleration = 75;
var _jumpImpulse = 7.5; var _jumpImpulse = 7.5;
@ -221,6 +223,7 @@ class Marble extends GameObject {
var superBounceEnableTime:Float = -1e8; var superBounceEnableTime:Float = -1e8;
var shockAbsorberEnableTime:Float = -1e8; var shockAbsorberEnableTime:Float = -1e8;
var helicopterEnableTime:Float = -1e8; var helicopterEnableTime:Float = -1e8;
var megaMarbleEnableTime:Float = -1e8;
var teleportEnableTime:Null<Float> = null; var teleportEnableTime:Null<Float> = null;
var teleportDisableTime:Null<Float> = null; var teleportDisableTime:Null<Float> = null;
@ -233,6 +236,7 @@ class Marble extends GameObject {
var trailEmitterNode:ParticleEmitter; var trailEmitterNode:ParticleEmitter;
var rollSound:Channel; var rollSound:Channel;
var rollMegaSound:Channel;
var slipSound:Channel; var slipSound:Channel;
var superbounceSound:Channel; var superbounceSound:Channel;
@ -247,8 +251,8 @@ class Marble extends GameObject {
public var prevPos:Vector; public var prevPos:Vector;
var cloak:Bool = false; var cloak:Bool = false;
var teleporting:Bool = false; var teleporting:Bool = false;
var isUltra:Bool = false;
public var cubemapRenderer:CubemapRenderer; public var cubemapRenderer:CubemapRenderer;
@ -324,6 +328,16 @@ class Marble extends GameObject {
} else } else
this._radius = avgRadius; this._radius = avgRadius;
this._prevRadius = this._radius;
if (isUltra) {
this.rollMegaSound = AudioManager.playSound(ResourceLoader.getResource("data/sound/mega_roll.wav", ResourceLoader.getAudio, this.soundResources),
this.getAbsPos().getPosition(), true);
this.rollMegaSound.volume = 0;
}
this.isUltra = isUltra;
this.collider = new SphereCollisionEntity(cast this); this.collider = new SphereCollisionEntity(cast this);
this.addChild(marbleDts); this.addChild(marbleDts);
@ -527,7 +541,7 @@ class Marble extends GameObject {
if (!_bounceYet) { if (!_bounceYet) {
_bounceYet = true; _bounceYet = true;
playBoundSound(-surfaceDot); playBoundSound(currentTime, -surfaceDot);
} }
if (noBounce) { if (noBounce) {
@ -777,16 +791,22 @@ class Marble extends GameObject {
this._bounceNormal = normal; this._bounceNormal = normal;
} }
function playBoundSound(contactVel:Float) { function playBoundSound(time:Float, contactVel:Float) {
if (minVelocityBounceSoft <= contactVel) { if (minVelocityBounceSoft <= contactVel) {
var hardBounceSpeed = minVelocityBounceHard; var hardBounceSpeed = minVelocityBounceHard;
var bounceSoundNum = Math.floor(Math.random() * 4); var bounceSoundNum = Math.floor(Math.random() * 4);
var sndList = [ var sndList = (time - this.megaMarbleEnableTime < 10) ? [
"data/sound/mega_bouncehard1.wav",
"data/sound/mega_bouncehard2.wav",
"data/sound/mega_bouncehard3.wav",
"data/sound/mega_bouncehard4.wav"
] : [
"data/sound/bouncehard1.wav", "data/sound/bouncehard1.wav",
"data/sound/bouncehard2.wav", "data/sound/bouncehard2.wav",
"data/sound/bouncehard3.wav", "data/sound/bouncehard3.wav",
"data/sound/bouncehard4.wav" "data/sound/bouncehard4.wav"
]; ];
var snd = ResourceLoader.getResource(sndList[bounceSoundNum], ResourceLoader.getAudio, this.soundResources); var snd = ResourceLoader.getResource(sndList[bounceSoundNum], ResourceLoader.getAudio, this.soundResources);
var gain = bounceMinGain; var gain = bounceMinGain;
gain = Util.clamp(Math.pow(contactVel / 12, 1.5), 0, 1); gain = Util.clamp(Math.pow(contactVel / 12, 1.5), 0, 1);
@ -800,10 +820,15 @@ class Marble extends GameObject {
} }
} }
function updateRollSound(contactPct:Float, slipAmount:Float) { function updateRollSound(time:TimeState, contactPct:Float, slipAmount:Float) {
var rSpat = rollSound.getEffect(Spatialization); var rSpat = rollSound.getEffect(Spatialization);
rSpat.position = this.getAbsPos().getPosition(); rSpat.position = this.getAbsPos().getPosition();
if (this.rollMegaSound != null) {
var rmspat = this.rollMegaSound.getEffect(Spatialization);
rmspat.position = this.getAbsPos().getPosition();
}
var sSpat = slipSound.getEffect(Spatialization); var sSpat = slipSound.getEffect(Spatialization);
sSpat.position = this.getAbsPos().getPosition(); sSpat.position = this.getAbsPos().getPosition();
@ -830,13 +855,25 @@ class Marble extends GameObject {
if (slipVolume < 0) if (slipVolume < 0)
slipVolume = 0; slipVolume = 0;
rollSound.volume = rollVolume; if (time.currentAttemptTime - this.megaMarbleEnableTime < 10) {
rollMegaSound.volume = rollVolume;
rollSound.volume = 0;
} else {
rollSound.volume = rollVolume;
rollMegaSound.volume = 0;
}
slipSound.volume = slipVolume; slipSound.volume = slipVolume;
if (rollSound.getEffect(Pitch) == null) { if (rollSound.getEffect(Pitch) == null) {
rollSound.addEffect(new Pitch()); rollSound.addEffect(new Pitch());
} }
if (rollMegaSound != null) {
if (rollMegaSound.getEffect(Pitch) == null) {
rollMegaSound.addEffect(new Pitch());
}
}
var pitch = Util.clamp(rollVel.length() / 15, 0, 1) * 0.75 + 0.75; var pitch = Util.clamp(rollVel.length() / 15, 0, 1) * 0.75 + 0.75;
// #if js // #if js
@ -846,6 +883,11 @@ class Marble extends GameObject {
// #end // #end
var rPitch = rollSound.getEffect(Pitch); var rPitch = rollSound.getEffect(Pitch);
rPitch.value = pitch; rPitch.value = pitch;
if (rollMegaSound != null) {
var rPitch = rollMegaSound.getEffect(Pitch);
rPitch.value = pitch;
}
} }
function testMove(velocity:Vector, position:Vector, deltaT:Float, radius:Float, testPIs:Bool):{position:Vector, t:Float} { function testMove(velocity:Vector, position:Vector, deltaT:Float, radius:Float, testPIs:Bool):{position:Vector, t:Float} {
@ -1449,7 +1491,7 @@ class Marble extends GameObject {
} while (true); } while (true);
this.queuedContacts = []; this.queuedContacts = [];
this.updateRollSound(contactTime / timeState.dt, this._slipAmount); this.updateRollSound(timeState, contactTime / timeState.dt, this._slipAmount);
} }
public function update(timeState:TimeState, collisionWorld:CollisionWorld, pathedInteriors:Array<PathedInterior>) { public function update(timeState:TimeState, collisionWorld:CollisionWorld, pathedInteriors:Array<PathedInterior>) {
@ -1519,6 +1561,22 @@ class Marble extends GameObject {
} }
updatePowerupStates(timeState.currentAttemptTime, timeState.dt); updatePowerupStates(timeState.currentAttemptTime, timeState.dt);
if (this._radius != 0.6666 && timeState.currentAttemptTime - this.megaMarbleEnableTime < 10) {
this._prevRadius = this._radius;
this._radius = 0.6666;
this.collider.radius = 0.6666;
var marbledts = cast(this.getChildAt(0), DtsObject);
marbledts.scale(this._radius / this._prevRadius);
} else if (timeState.currentAttemptTime - this.megaMarbleEnableTime > 10) {
if (this._radius != this._prevRadius) {
this._radius = this._prevRadius;
this.collider.radius = this._radius;
var marbledts = cast(this.getChildAt(0), DtsObject);
marbledts.scale(this._prevRadius / 0.6666);
}
}
this.updateTeleporterState(timeState); this.updateTeleporterState(timeState);
this.trailEmitter(); this.trailEmitter();
@ -1592,6 +1650,10 @@ class Marble extends GameObject {
this.helicopterEnableTime = time; this.helicopterEnableTime = time;
} }
public function enableMegaMarble(time:Float) {
this.megaMarbleEnableTime = time;
}
function updateTeleporterState(time:TimeState) { function updateTeleporterState(time:TimeState) {
var teleportFadeCompletion:Float = 0; var teleportFadeCompletion:Float = 0;
@ -1633,6 +1695,7 @@ class Marble extends GameObject {
this.superBounceEnableTime = Math.NEGATIVE_INFINITY; this.superBounceEnableTime = Math.NEGATIVE_INFINITY;
this.shockAbsorberEnableTime = Math.NEGATIVE_INFINITY; this.shockAbsorberEnableTime = Math.NEGATIVE_INFINITY;
this.helicopterEnableTime = Math.NEGATIVE_INFINITY; this.helicopterEnableTime = Math.NEGATIVE_INFINITY;
this.megaMarbleEnableTime = Math.NEGATIVE_INFINITY;
this.lastContactNormal = new Vector(0, 0, 1); this.lastContactNormal = new Vector(0, 0, 1);
this.cloak = false; this.cloak = false;
if (this.teleporting) { if (this.teleporting) {
@ -1643,5 +1706,11 @@ class Marble extends GameObject {
this.teleporting = false; this.teleporting = false;
this.teleportDisableTime = null; this.teleportDisableTime = null;
this.teleportEnableTime = null; this.teleportEnableTime = null;
if (this._radius != this._prevRadius) {
this._radius = this._prevRadius;
this.collider.radius = this._radius;
var marbledts = cast(this.getChildAt(0), DtsObject);
marbledts.scale(this._prevRadius / 0.6666);
}
} }
} }

View file

@ -1,9 +1,11 @@
package shapes; package shapes;
import src.ResourceLoaderWorker;
import src.MarbleWorld; import src.MarbleWorld;
import src.ResourceLoader; import src.ResourceLoader;
import src.TimeState; import src.TimeState;
import mis.MissionElement.MissionElementItem; import mis.MissionElement.MissionElementItem;
import src.AudioManager;
class MegaMarble extends PowerUp { class MegaMarble extends PowerUp {
public function new(element:MissionElementItem) { public function new(element:MissionElementItem) {
@ -19,8 +21,15 @@ class MegaMarble extends PowerUp {
public override function init(level:MarbleWorld, onFinish:Void->Void) { public override function init(level:MarbleWorld, onFinish:Void->Void) {
super.init(level, () -> { super.init(level, () -> {
ResourceLoader.load("sound/pumegamarblevoice.wav").entry.load(() -> { ResourceLoader.load("sound/pumegamarblevoice.wav").entry.load(() -> {
var worker = new ResourceLoaderWorker(onFinish);
worker.loadFile("sound/mega_bouncehard1.wav");
worker.loadFile("sound/mega_bouncehard2.wav");
worker.loadFile("sound/mega_bouncehard3.wav");
worker.loadFile("sound/mega_bouncehard4.wav");
worker.loadFile("sound/mega_roll.wav");
worker.loadFile("sound/dosuperjump.wav");
this.pickupSound = ResourceLoader.getResource("data/sound/pumegamarblevoice.wav", ResourceLoader.getAudio, this.soundResources); this.pickupSound = ResourceLoader.getResource("data/sound/pumegamarblevoice.wav", ResourceLoader.getAudio, this.soundResources);
onFinish(); worker.run();
}); });
}); });
} }
@ -30,6 +39,8 @@ class MegaMarble extends PowerUp {
} }
public function use(timeState:TimeState) { public function use(timeState:TimeState) {
this.level.marble.enableMegaMarble(timeState.currentAttemptTime);
this.level.deselectPowerUp(); this.level.deselectPowerUp();
AudioManager.playSound(ResourceLoader.getResource('data/sound/dosuperjump.wav', ResourceLoader.getAudio, this.soundResources));
} }
} }