Noah Petherbridge
1205dc2cd3
* Add methods `Invulnerable() bool` and `SetInvulnerable(bool)` to the Actor API accessible in JavaScript (e.g. `Self.SetInvulnerable(true)`) * The Anvil is invulnerable - when played as, it can crush other mobs by jumping on them but is not defeated by those mobs at the same time. * Anvils don't destroy invulnerable mobs, such as other Anvils. * Bugfix: the Electric Door is considered to be opened from the first frame of animation when the door begins opening, and remains opened until the final frame of animation when it is closing. * New cheat code: `megaton weight` to play as the Anvil by default.
53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
// Anvil
|
|
var falling = false;
|
|
|
|
function main() {
|
|
// Note: doodad is not "solid" but hurts if it falls on you.
|
|
Self.SetHitbox(0, 0, 48, 25);
|
|
Self.SetMobile(true);
|
|
Self.SetGravity(true);
|
|
Self.SetInvulnerable(true);
|
|
|
|
// Monitor our Y position to tell if we've been falling.
|
|
let lastPoint = Self.Position();
|
|
setInterval(() => {
|
|
let nowAt = Self.Position();
|
|
if (nowAt.Y > lastPoint.Y) {
|
|
falling = true;
|
|
} else {
|
|
falling = false;
|
|
}
|
|
lastPoint = nowAt;
|
|
}, 100);
|
|
|
|
Events.OnCollide((e) => {
|
|
if (!e.Settled) {
|
|
return;
|
|
}
|
|
|
|
// Were we falling?
|
|
if (falling) {
|
|
if (e.InHitbox) {
|
|
if (e.Actor.IsPlayer()) {
|
|
// Fatal to the player.
|
|
Sound.Play("crumbly-break.wav");
|
|
FailLevel("Watch out for anvils!");
|
|
return;
|
|
}
|
|
else if (e.Actor.IsMobile() && !e.Actor.Invulnerable()) {
|
|
// Destroy mobile doodads.
|
|
Sound.Play("crumbly-break.wav");
|
|
e.Actor.Destroy();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// When we receive power, we reset to our original position.
|
|
let origPoint = Self.Position();
|
|
Message.Subscribe("power", (powered) => {
|
|
Self.MoveTo(origPoint);
|
|
Self.SetVelocity(Vector(0, 0));
|
|
});
|
|
}
|