v0.11.0 last minute tweaks

* When playing as the Bird, the dive attack is able to destroy other
  mobile doodads such as Azulians and Thieves.
* The Box has been made invulnerable so it can't be destroyed by Anvils
  or player-controlled Birds.
* Bugfixes with pop-up modals:
  * The quit game confirm modal doesn't appear if another modal is
    already active on screen.
  * The Escape key can dismiss Alert and Confirm modals.
* Add "Level" menu items to Play Mode to restart the level or retry from
  the last checkpoint (in case of softlocks, etc.)
This commit is contained in:
Noah 2022-02-21 13:09:51 -08:00
parent d5bff15efd
commit d0ae46402b
2 changed files with 36 additions and 6 deletions

View File

@ -144,9 +144,24 @@ function AI_ScanForPlayer() {
// If under control of the player character. // If under control of the player character.
function player() { function player() {
var playerSpeed = 12; let playerSpeed = 12,
diving = false,
falling = false;
// The player can dive by moving downwards and laterally, but
// de-cheese their ability to just sweep across the ground; if
// they aren't seen to be moving downwards, cancel the dive.
let lastPoint = Self.Position();
setInterval(() => {
let nowAt = Self.Position();
if (nowAt.Y > lastPoint.Y) {
falling = true;
} else {
falling = false;
}
lastPoint = nowAt;
}, 100);
Self.SetInventory(true);
Events.OnKeypress((ev) => { Events.OnKeypress((ev) => {
Vx = 0; Vx = 0;
Vy = 0; Vy = 0;
@ -158,31 +173,45 @@ function player() {
} }
// Dive! // Dive!
if (ev.Down && ev.Right) { if (ev.Down && ev.Right && falling) {
Self.StopAnimation(); Self.StopAnimation();
Self.ShowLayerNamed("dive-right"); Self.ShowLayerNamed("dive-right");
} else if (ev.Down && ev.Left) { diving = falling;
} else if (ev.Down && ev.Left && falling) {
Self.StopAnimation(); Self.StopAnimation();
Self.ShowLayerNamed("dive-left"); Self.ShowLayerNamed("dive-left");
diving = falling;
} else if (ev.Right) { } else if (ev.Right) {
// Fly right. // Fly right.
if (!Self.IsAnimating()) { if (!Self.IsAnimating()) {
Self.PlayAnimation("fly-right", null); Self.PlayAnimation("fly-right", null);
} }
Vx = playerSpeed; Vx = playerSpeed;
diving = false;
} else if (ev.Left) { } else if (ev.Left) {
// Fly left. // Fly left.
if (!Self.IsAnimating()) { if (!Self.IsAnimating()) {
Self.PlayAnimation("fly-left", null); Self.PlayAnimation("fly-left", null);
} }
Vx = -playerSpeed; Vx = -playerSpeed;
diving = false;
} else { } else {
// Hover in place. // Hover in place.
if (!Self.IsAnimating()) { if (!Self.IsAnimating()) {
Self.PlayAnimation("fly-"+direction); Self.PlayAnimation("fly-"+direction);
} }
diving = false;
} }
// Self.SetVelocity(Vector(Vx, Vy)); // Player is invulnerable while diving.
}) Self.SetInvulnerable(diving);
});
Events.OnCollide((e) => {
// If the player is diving at an enemy mob, destroy it.
if (diving && e.Settled && e.Actor.IsMobile() && !e.Actor.Invulnerable()) {
Sound.Play("crumbly-break.wav");
e.Actor.Destroy();
}
});
} }

View File

@ -5,6 +5,7 @@ const speed = 4,
function main() { function main() {
Self.SetMobile(true); Self.SetMobile(true);
Self.SetInvulnerable(true);
Self.SetGravity(true); Self.SetGravity(true);
Self.SetHitbox(0, 0, size, size); Self.SetHitbox(0, 0, size, size);