Various updates
New doodad interactions: * Sticky Buttons will emit a "sticky:down" event to linked doodads, with a boolean value showing the Sticky Button's state. * Normal Buttons will listen for "sticky:down" -- when a linked Sticky Button is pressed, the normal Button presses in as well, and stays pressed while the sticky:down signal is true. * When the Sticky Button is released (e.g. because it received power from another doodad), any linked buttons which were sticky:down release as well. * Switch doodads emit a new "switch:toggle" event JUST BEFORE sending the "power" event. Sensitive Doodads can listen for switches in particular this way. * The Electric Door listens for switch:toggle; if a Switch is activated, the Electric Door always flips its current state (open to close, or vice versa) and ignores the immediately following power event. This allows doors to toggle on/off regardless of sync with a Switch. Other changes: * When the player character dies by fire, instead of the message saying "Watch out for fire!" it will use the name of the fire swatch that hurt the player. This way levels could make it say "Watch out for spikes!" or "lava" or whatever they want. The "Fire" attribute now just means "instantly kills the player." * Level Editor: You can now edit the Title and Author name of your level in the Page Settings window. * Bugfix: only the player character ends the game by dying in fire. Other mobile doodads just turn dark but don't end the game. * Increase the size of Trapdoor doodad sprites by 150% as they were a bit small for the player character. * Rename the game from "Project: Doodle" to "Sketchy Maze"
|
@ -2,17 +2,30 @@ function main() {
|
|||
var timer = 0;
|
||||
var pressed = false;
|
||||
|
||||
// Has a linked Sticky Button been pressed permanently down?
|
||||
var stickyDown = false;
|
||||
Message.Subscribe("sticky:down", function(down) {
|
||||
stickyDown = down;
|
||||
Self.ShowLayer(stickyDown ? 1 : 0);
|
||||
});
|
||||
|
||||
Events.OnCollide(function(e) {
|
||||
if (!e.Settled) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If a linked Sticky Button is pressed, button stays down too and
|
||||
// doesn't interact.
|
||||
if (stickyDown) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Verify they've touched the button.
|
||||
if (e.Overlap.Y + e.Overlap.H < 24) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pressed) {
|
||||
if (!pressed && !stickyDown) {
|
||||
Sound.Play("button-down.wav")
|
||||
Message.Publish("power", true);
|
||||
pressed = true;
|
||||
|
|
|
@ -8,6 +8,7 @@ function main() {
|
|||
pressed = false;
|
||||
Sound.Play("button-up.wav")
|
||||
Message.Publish("power", false);
|
||||
Message.Publish("sticky:down", false);
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -29,5 +30,6 @@ function main() {
|
|||
Self.ShowLayer(1);
|
||||
pressed = true;
|
||||
Message.Publish("power", true);
|
||||
Message.Publish("sticky:down", true);
|
||||
});
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 415 B After Width: | Height: | Size: 5.2 KiB |
|
@ -1,31 +1,59 @@
|
|||
var animating = false;
|
||||
var opened = false;
|
||||
var powerState = false;
|
||||
|
||||
// Function to handle the door opening or closing.
|
||||
function setPoweredState(powered) {
|
||||
powerState = powered;
|
||||
|
||||
console.log("setPoweredState: %+v", powered)
|
||||
if (powered) {
|
||||
if (animating || opened) {
|
||||
return;
|
||||
}
|
||||
|
||||
animating = true;
|
||||
Sound.Play("electric-door.wav")
|
||||
Self.PlayAnimation("open", function() {
|
||||
opened = true;
|
||||
animating = false;
|
||||
});
|
||||
} else {
|
||||
animating = true;
|
||||
Sound.Play("electric-door.wav")
|
||||
Self.PlayAnimation("close", function() {
|
||||
opened = false;
|
||||
animating = false;
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
Self.AddAnimation("open", 100, [0, 1, 2, 3]);
|
||||
Self.AddAnimation("close", 100, [3, 2, 1, 0]);
|
||||
var animating = false;
|
||||
var opened = false;
|
||||
|
||||
|
||||
Self.SetHitbox(0, 0, 34, 76);
|
||||
|
||||
Message.Subscribe("power", function(powered) {
|
||||
if (powered) {
|
||||
if (animating || opened) {
|
||||
return;
|
||||
}
|
||||
// A linked Switch that activates the door will send the Toggle signal
|
||||
// immediately before the Power signal. The door can just invert its
|
||||
// state on this signal, and ignore the very next Power signal. Ordinary
|
||||
// power sources like Buttons will work as normal, as they emit only a power
|
||||
// signal.
|
||||
var ignoreNextPower = false;
|
||||
Message.Subscribe("switch:toggle", function(powered) {
|
||||
console.log("A switch powered %+v, setPoweredState(%+v) to opposite", powered, powerState);
|
||||
ignoreNextPower = true;
|
||||
setPoweredState(!powerState);
|
||||
})
|
||||
|
||||
animating = true;
|
||||
Sound.Play("electric-door.wav")
|
||||
Self.PlayAnimation("open", function() {
|
||||
opened = true;
|
||||
animating = false;
|
||||
});
|
||||
} else {
|
||||
animating = true;
|
||||
Sound.Play("electric-door.wav")
|
||||
Self.PlayAnimation("close", function() {
|
||||
opened = false;
|
||||
animating = false;
|
||||
})
|
||||
Message.Subscribe("power", function(powered) {
|
||||
if (ignoreNextPower) {
|
||||
ignoreNextPower = false;
|
||||
return;
|
||||
}
|
||||
|
||||
setPoweredState(powered);
|
||||
});
|
||||
|
||||
Events.OnCollide(function(e) {
|
||||
|
|
|
@ -20,6 +20,9 @@ function main() {
|
|||
if (collide === false) {
|
||||
Sound.Play("button-down.wav")
|
||||
state = !state;
|
||||
|
||||
var nonce = Math.random() * 2147483647;
|
||||
Message.Publish("switch:toggle", state);
|
||||
Message.Publish("power", state);
|
||||
showState(state);
|
||||
|
||||
|
|
Before Width: | Height: | Size: 1020 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 970 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 859 B After Width: | Height: | Size: 1007 B |
Before Width: | Height: | Size: 912 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1013 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1009 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 992 B |
Before Width: | Height: | Size: 933 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1011 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 789 B After Width: | Height: | Size: 991 B |
|
@ -5,8 +5,8 @@ function main() {
|
|||
var timer = 0;
|
||||
|
||||
// Set our hitbox based on our orientation.
|
||||
var thickness = 6;
|
||||
var doodadSize = 72;
|
||||
var thickness = 10;
|
||||
var doodadSize = 86;
|
||||
if (direction === "left") {
|
||||
Self.SetHitbox(48, 0, doodadSize, doodadSize);
|
||||
} else if (direction === "right") {
|
||||
|
|
Before Width: | Height: | Size: 831 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 964 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 846 B After Width: | Height: | Size: 1006 B |