diff --git a/dev-assets/doodads/azulian/azulian-red.js b/dev-assets/doodads/azulian/azulian-red.js index a138408..f631e40 100644 --- a/dev-assets/doodads/azulian/azulian-red.js +++ b/dev-assets/doodads/azulian/azulian-red.js @@ -7,6 +7,7 @@ function main() { var direction = "right"; + Self.SetMobile(true); Self.SetGravity(true); Self.AddAnimation("walk-left", 100, ["red-wl1", "red-wl2", "red-wl3", "red-wl4"]); Self.AddAnimation("walk-right", 100, ["red-wr1", "red-wr2", "red-wr3", "red-wr4"]); diff --git a/dev-assets/doodads/azulian/azulian.js b/dev-assets/doodads/azulian/azulian.js index 1599b48..a01881c 100644 --- a/dev-assets/doodads/azulian/azulian.js +++ b/dev-assets/doodads/azulian/azulian.js @@ -7,6 +7,7 @@ function main() { var animStart = animEnd = 0; var animFrame = animStart; + Self.SetMobile(true); Self.SetGravity(true); Self.SetHitbox(7, 4, 17, 28); Self.AddAnimation("walk-left", 100, ["blu-wl1", "blu-wl2", "blu-wl3", "blu-wl4"]); diff --git a/dev-assets/doodads/build.sh b/dev-assets/doodads/build.sh index c50d5dd..5a72c6a 100755 --- a/dev-assets/doodads/build.sh +++ b/dev-assets/doodads/build.sh @@ -115,6 +115,33 @@ objects() { doodad convert -t "Exit Flag" exit-flag.png exit-flag.doodad doodad install-script exit-flag.js exit-flag.doodad + doodad convert -t "Start Flag" start-flag.png start-flag.doodad + + cp *.doodad ../../../assets/doodads/ + + cd ../crumbly-floor + + doodad convert -t "Crumbly Floor" floor.png shake1.png shake2.png \ + fall1.png fall2.png fall3.png fall4.png fallen.png \ + crumbly-floor.doodad + doodad install-script crumbly-floor.js crumbly-floor.doodad + cp *.doodad ../../../assets/doodads/ + + cd .. +} + +onoff() { + cd on-off/ + + doodad convert -t "State Button" blue-button.png orange-button.png state-button.doodad + doodad install-script state-button.js state-button.doodad + + doodad convert -t "State Block (Blue)" blue-on.png blue-off.png state-block-blue.doodad + doodad install-script state-block-blue.js state-block-blue.doodad + + doodad convert -t "State Block (Orange)" orange-off.png orange-on.png state-block-orange.doodad + doodad install-script state-block-orange.js state-block-orange.doodad + cp *.doodad ../../../assets/doodads/ cd .. @@ -126,5 +153,6 @@ doors trapdoors azulians objects +onoff doodad edit-doodad -quiet -lock -author "Noah" ../../assets/doodads/*.doodad doodad edit-doodad -hide ../../assets/doodads/azu-blu.doodad diff --git a/dev-assets/doodads/crumbly-floor/crumbly-floor.js b/dev-assets/doodads/crumbly-floor/crumbly-floor.js new file mode 100644 index 0000000..155be86 --- /dev/null +++ b/dev-assets/doodads/crumbly-floor/crumbly-floor.js @@ -0,0 +1,60 @@ +// Crumbly Floor. +function main() { + Self.SetHitbox(0, 0, 65, 7); + + Self.AddAnimation("shake", 100, ["shake1", "shake2", "floor", "shake1", "shake2", "floor"]); + Self.AddAnimation("fall", 100, ["fall1", "fall2", "fall3", "fall4"]); + + // Recover time for the floor to respawn. + var recover = 5000; + + // States of the floor. + var stateSolid = 0; + var stateShaking = 1; + var stateFalling = 2; + var stateFallen = 3; + var state = stateSolid; + + // Started the animation? + var startedAnimation = false; + + Events.OnCollide(function(e) { + // Only trigger for mobile characters. + if (!e.Actor.IsMobile()) { + return; + } + + // If the floor is falling, the player passes right thru. + if (state === stateFalling || state === stateFallen) { + return; + } + + // Floor is solid until it begins to fall. + if (e.InHitbox && (state === stateSolid || state === stateShaking)) { + // Only activate when touched from the top. + if (e.Overlap.Y > 0) { + return false; + } + + // Begin the animation sequence if we're in the solid state. + if (state === stateSolid) { + state = stateShaking; + Self.PlayAnimation("shake", function() { + state = stateFalling; + Self.PlayAnimation("fall", function() { + state = stateFallen; + Self.ShowLayerNamed("fallen"); + + // Recover after a while. + setTimeout(function() { + Self.ShowLayer(0); + state = stateSolid; + }, recover); + }); + }) + } + + return false; + } + }); +} diff --git a/dev-assets/doodads/crumbly-floor/fall1.png b/dev-assets/doodads/crumbly-floor/fall1.png new file mode 100644 index 0000000..bc9710c Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/fall1.png differ diff --git a/dev-assets/doodads/crumbly-floor/fall2.png b/dev-assets/doodads/crumbly-floor/fall2.png new file mode 100644 index 0000000..1524b6d Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/fall2.png differ diff --git a/dev-assets/doodads/crumbly-floor/fall3.png b/dev-assets/doodads/crumbly-floor/fall3.png new file mode 100644 index 0000000..5b05d93 Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/fall3.png differ diff --git a/dev-assets/doodads/crumbly-floor/fall4.png b/dev-assets/doodads/crumbly-floor/fall4.png new file mode 100644 index 0000000..97e8ee0 Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/fall4.png differ diff --git a/dev-assets/doodads/crumbly-floor/fallen.png b/dev-assets/doodads/crumbly-floor/fallen.png new file mode 100644 index 0000000..dd5e57f Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/fallen.png differ diff --git a/dev-assets/doodads/crumbly-floor/floor.png b/dev-assets/doodads/crumbly-floor/floor.png new file mode 100644 index 0000000..f89f16e Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/floor.png differ diff --git a/dev-assets/doodads/crumbly-floor/shake1.png b/dev-assets/doodads/crumbly-floor/shake1.png new file mode 100644 index 0000000..4881adf Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/shake1.png differ diff --git a/dev-assets/doodads/crumbly-floor/shake2.png b/dev-assets/doodads/crumbly-floor/shake2.png new file mode 100644 index 0000000..42e770d Binary files /dev/null and b/dev-assets/doodads/crumbly-floor/shake2.png differ diff --git a/dev-assets/doodads/doors/electric-door.js b/dev-assets/doodads/doors/electric-door.js index d424ba3..9aa75af 100644 --- a/dev-assets/doodads/doors/electric-door.js +++ b/dev-assets/doodads/doors/electric-door.js @@ -23,8 +23,8 @@ function main() { }); } else { animating = true; - opened = false; Self.PlayAnimation("close", function() { + opened = false; animating = false; }) } diff --git a/dev-assets/doodads/objects/start-flag.png b/dev-assets/doodads/objects/start-flag.png new file mode 100644 index 0000000..125550e Binary files /dev/null and b/dev-assets/doodads/objects/start-flag.png differ diff --git a/dev-assets/doodads/on-off/blue-button.png b/dev-assets/doodads/on-off/blue-button.png new file mode 100644 index 0000000..184627a Binary files /dev/null and b/dev-assets/doodads/on-off/blue-button.png differ diff --git a/dev-assets/doodads/on-off/blue-off.png b/dev-assets/doodads/on-off/blue-off.png new file mode 100644 index 0000000..6275e2b Binary files /dev/null and b/dev-assets/doodads/on-off/blue-off.png differ diff --git a/dev-assets/doodads/on-off/blue-on.png b/dev-assets/doodads/on-off/blue-on.png new file mode 100644 index 0000000..e200231 Binary files /dev/null and b/dev-assets/doodads/on-off/blue-on.png differ diff --git a/dev-assets/doodads/on-off/orange-button.png b/dev-assets/doodads/on-off/orange-button.png new file mode 100644 index 0000000..ec5ef16 Binary files /dev/null and b/dev-assets/doodads/on-off/orange-button.png differ diff --git a/dev-assets/doodads/on-off/orange-off.png b/dev-assets/doodads/on-off/orange-off.png new file mode 100644 index 0000000..1ce8f1e Binary files /dev/null and b/dev-assets/doodads/on-off/orange-off.png differ diff --git a/dev-assets/doodads/on-off/orange-on.png b/dev-assets/doodads/on-off/orange-on.png new file mode 100644 index 0000000..c56e09e Binary files /dev/null and b/dev-assets/doodads/on-off/orange-on.png differ diff --git a/dev-assets/doodads/on-off/state-block-blue.js b/dev-assets/doodads/on-off/state-block-blue.js new file mode 100644 index 0000000..0b287e3 --- /dev/null +++ b/dev-assets/doodads/on-off/state-block-blue.js @@ -0,0 +1,28 @@ +// Blue State Block +function main() { + Self.SetHitbox(0, 0, 33, 33); + + // Blue block is ON by default. + var state = true; + + Message.Subscribe("broadcast:state-change", function(newState) { + state = !newState; + console.warn("BLUE BLOCK Received state=%+v, set mine to %+v", newState, state); + + // Layer 0: ON + // Layer 1: OFF + if (state) { + Self.ShowLayer(0); + } else { + Self.ShowLayer(1); + } + }); + + Events.OnCollide(function(e) { + if (e.Actor.IsMobile() && e.InHitbox) { + if (state) { + return false; + } + } + }); +} diff --git a/dev-assets/doodads/on-off/state-block-orange.js b/dev-assets/doodads/on-off/state-block-orange.js new file mode 100644 index 0000000..634d5e8 --- /dev/null +++ b/dev-assets/doodads/on-off/state-block-orange.js @@ -0,0 +1,28 @@ +// Orange State Block +function main() { + Self.SetHitbox(0, 0, 33, 33); + + // Orange block is OFF by default. + var state = false; + + Message.Subscribe("broadcast:state-change", function(newState) { + state = newState; + console.warn("ORANGE BLOCK Received state=%+v, set mine to %+v", newState, state); + + // Layer 0: OFF + // Layer 1: ON + if (state) { + Self.ShowLayer(1); + } else { + Self.ShowLayer(0); + } + }); + + Events.OnCollide(function(e) { + if (e.Actor.IsMobile() && e.InHitbox) { + if (state) { + return false; + } + } + }); +} diff --git a/dev-assets/doodads/on-off/state-button.js b/dev-assets/doodads/on-off/state-button.js new file mode 100644 index 0000000..51a2af3 --- /dev/null +++ b/dev-assets/doodads/on-off/state-button.js @@ -0,0 +1,47 @@ +// State Block Control Button +function main() { + console.log("%s initialized!", Self.Doodad.Title); + Self.SetHitbox(0, 0, 33, 33); + + // When the button is activated, don't keep toggling state until we're not + // being touched again. + var colliding = false; + + // Button is "OFF" by default. + var state = false; + + Events.OnCollide(function(e) { + if (colliding) { + return false; + } + + // Only trigger for mobile characters. + if (e.Actor.IsMobile()) { + console.log("Mobile actor %s touched the on/off button!", e.Actor.Actor.Filename); + + // Only activate if touched from the bottom or sides. + if (e.Overlap.Y === 0) { + console.log("... but touched the top!"); + return false; + } + + colliding = true; + console.log(" -> emit state change"); + state = !state; + Message.Broadcast("broadcast:state-change", state); + + if (state) { + Self.ShowLayer(1); + } else { + Self.ShowLayer(0); + } + } + + // Always a solid button. + return false; + }); + + Events.OnLeave(function(e) { + colliding = false; + }) +}