diff --git a/dev-assets/doodads/regions/Makefile b/dev-assets/doodads/regions/Makefile index 7d8c6b2..6ea450f 100644 --- a/dev-assets/doodads/regions/Makefile +++ b/dev-assets/doodads/regions/Makefile @@ -23,7 +23,12 @@ build: doodad convert -t "Power Source" power-64.png power-source.doodad doodad install-script power.js power-source.doodad + # Warp Door + doodad convert -t "Invisible Warp Door" warp-door-64.png reg-warp-door.doodad + doodad edit-doodad --tag "color=invisible" reg-warp-door.doodad + doodad install-script ../warp-door/warp-door.js reg-warp-door.doodad + for i in *.doodad; do\ doodad edit-doodad --tag "category=technical" $${i};\ done - cp *.doodad ../../../assets/doodads/ \ No newline at end of file + cp *.doodad ../../../assets/doodads/ diff --git a/dev-assets/doodads/regions/warp-door-64.png b/dev-assets/doodads/regions/warp-door-64.png new file mode 100644 index 0000000..f2b31d4 Binary files /dev/null and b/dev-assets/doodads/regions/warp-door-64.png differ diff --git a/dev-assets/doodads/warp-door/Makefile b/dev-assets/doodads/warp-door/Makefile index a4842e1..90d80b2 100644 --- a/dev-assets/doodads/warp-door/Makefile +++ b/dev-assets/doodads/warp-door/Makefile @@ -17,10 +17,10 @@ build: doodad install-script warp-door.js warp-door-orange.doodad for i in *.doodad; do\ - doodad edit-doodad --tag "category=doors" $${i};\ + doodad edit-doodad --tag "category=doors" --hitbox=34,76 $${i};\ done for i in warp-door-*.doodad; do\ doodad edit-doodad --tag "category=doors,gizmos" $${i};\ done - cp *.doodad ../../../assets/doodads/ \ No newline at end of file + cp *.doodad ../../../assets/doodads/ diff --git a/dev-assets/doodads/warp-door/warp-door.js b/dev-assets/doodads/warp-door/warp-door.js index 0cb6e1a..10b587f 100644 --- a/dev-assets/doodads/warp-door/warp-door.js +++ b/dev-assets/doodads/warp-door/warp-door.js @@ -1,7 +1,5 @@ // Warp Doors function main() { - Self.SetHitbox(0, 0, 34, 76); - // Are we a blue or orange door? Regular warp door will be 'none' var color = Self.GetTag("color"); var isStateDoor = color === 'blue' || color === 'orange'; @@ -23,6 +21,11 @@ function main() { Self.AddAnimation("close", animSpeed, ["orange-4", "orange-3", "orange-2", "orange-1"]); spriteDefault = "orange-1"; spriteDisabled = "orange-off"; + } else if (color === 'invisible') { + // Invisible Warp Door region. + Self.Hide(); + Self.AddAnimation("open", animSpeed, [0, 0]); + Self.AddAnimation("close", animSpeed, [0, 0]); } else { Self.AddAnimation("open", animSpeed, ["door-2", "door-3", "door-4"]); Self.AddAnimation("close", animSpeed, ["door-4", "door-3", "door-2", "door-1"]); @@ -48,6 +51,10 @@ function main() { }); } + // For player groundedness work-around + var playerLastY = []; // last sampling of Y values + var lastUsed = time.Now(); + // The player Uses the door. var flashedCooldown = false; // "Locked Door" flashed message. Events.OnUse(function(e) { @@ -74,6 +81,40 @@ function main() { return; } + // The player must be grounded or have no gravity to open the door. + if (!e.Actor.Grounded() && e.Actor.HasGravity()) { + // Work-around: if two Boxes are stacked atop each other the player can + // get stuck if he jumps on top. He may not be Grounded but isn't changing + // effective Y position and a warp door may work as a good way out. + var yValue = e.Actor.Position().Y; + + // Collect a sampling of last few Y values. If the player Y position + // is constant the last handful of frames, treat them as if they're + // grounded (or else they can't activate the warp door). + playerLastY.unshift(yValue); + if (playerLastY.length < 6) { + return; + } + + // We have enough history. + playerLastY.pop(); + + // Hasn't moved? + var isGrounded = true; + for (var i = 0; i < playerLastY.length; i++) { + if (yValue !== playerLastY[i]) { + isGrounded = false; + break; + } + } + + if (!isGrounded) { + return; + } + + // Player was effectively grounded! No change in Y position. + } + // Freeze the player. e.Actor.Freeze()