Big API refactor
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
// A gem is a grabbable collectible: walking onto it (or pushing it into the
|
||||
// player) fires this `grab()` hook instead of blocking. We bump the player's gem
|
||||
// count and remove ourselves from the board.
|
||||
fn grab() {
|
||||
fn grab(me, state) {
|
||||
add_gems(1);
|
||||
die();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//
|
||||
// A heart is a grabbable collectible: walking onto it fires `grab()` instead
|
||||
// of blocking. It restores 1 health and removes itself from the board.
|
||||
fn grab() {
|
||||
fn grab(me, state) {
|
||||
alter_health(1);
|
||||
die();
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// A gem is a grabbable collectible: walking onto it (or pushing it into the
|
||||
// player) fires this `grab()` hook instead of blocking. We bump the player's gem
|
||||
// count and remove ourselves from the board.
|
||||
fn grab() {
|
||||
fn grab(me, state) {
|
||||
let colors = [
|
||||
"red",
|
||||
"orange",
|
||||
@@ -16,7 +16,7 @@ fn grab() {
|
||||
];
|
||||
|
||||
for c in colors {
|
||||
if Me.has_tag(`BUILTIN_key_${c}`) {
|
||||
if me.has_tag(`BUILTIN_key_${c}`) {
|
||||
set_key(c, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,17 +6,17 @@
|
||||
// pusher shares one compiled copy and learns its direction from the
|
||||
// `BUILTIN_pusher_<dir>` tag the map loader attached to it.
|
||||
|
||||
fn tick(dt) {
|
||||
fn tick(me, state, dt) {
|
||||
// Only queue a step when idle. `move` shoves the chain ahead via step_object
|
||||
// and is a no-op when blocked; the delay pads each step out to ~0.5s (move
|
||||
// itself costs 0.25s), matching the old global pusher heartbeat.
|
||||
//
|
||||
// The direction is read here, at the top level of the hook, because `Me` is a
|
||||
// per-object scope constant and is not visible inside other script functions.
|
||||
if Queue.length() == 0 {
|
||||
let dir = if Me.has_tag("BUILTIN_pusher_north") { North }
|
||||
else if Me.has_tag("BUILTIN_pusher_south") { South }
|
||||
else if Me.has_tag("BUILTIN_pusher_east") { East }
|
||||
if !me.waiting {
|
||||
let dir = if me.has_tag("BUILTIN_pusher_north") { North }
|
||||
else if me.has_tag("BUILTIN_pusher_south") { South }
|
||||
else if me.has_tag("BUILTIN_pusher_east") { East }
|
||||
else { West };
|
||||
move(dir);
|
||||
delay(0.25);
|
||||
|
||||
@@ -8,24 +8,24 @@
|
||||
// can't decide that with `can_shift` alone — `can_shift(j) == false` is ambiguous
|
||||
// between "j is empty" and "j is a blocked solid" — so we seed with `can_shift`
|
||||
// and then cascade-demote using `passable` to spot the genuine holes.
|
||||
fn tick(dt) {
|
||||
fn tick(me, state, dt) {
|
||||
// Only start a new rotation when the previous one (and its delay) has drained,
|
||||
// exactly like the built-in pusher's pacing.
|
||||
if Queue.length() != 0 { return; }
|
||||
if me.waiting { return; }
|
||||
|
||||
// Direction from the builtin tag; clockwise unless explicitly counter-clockwise.
|
||||
let cw = !Me.has_tag("BUILTIN_spinner_ccw");
|
||||
let cw = !me.has_tag("BUILTIN_spinner_ccw");
|
||||
|
||||
// The 8 neighbour offsets in clockwise order, starting at North.
|
||||
let cw_ring = [
|
||||
[Me.x, Me.y-1], // N
|
||||
[Me.x+1, Me.y-1], // NE
|
||||
[Me.x+1, Me.y], // E
|
||||
[Me.x+1, Me.y+1], // SE
|
||||
[Me.x, Me.y+1], // S
|
||||
[Me.x-1, Me.y+1], // SW
|
||||
[Me.x-1, Me.y], // W
|
||||
[Me.x-1, Me.y-1], // NW
|
||||
[me.x, me.y-1], // N
|
||||
[me.x+1, me.y-1], // NE
|
||||
[me.x+1, me.y], // E
|
||||
[me.x+1, me.y+1], // SE
|
||||
[me.x, me.y+1], // S
|
||||
[me.x-1, me.y+1], // SW
|
||||
[me.x-1, me.y], // W
|
||||
[me.x-1, me.y-1], // NW
|
||||
];
|
||||
|
||||
// For CCW, it's the same list in reverse
|
||||
@@ -45,10 +45,10 @@ fn tick(dt) {
|
||||
// line spins '/'-'\'-, slash-swapped for counter-clockwise. Frame state lives in
|
||||
// the board Registry, keyed per spinner, since script scope resets each tick.
|
||||
let frames = if cw { [47, 0xc4, 92, 0xb3] } else { [92, 0xc4, 47, 0xb3] };
|
||||
let fkey = `spin_${Me.id}`;
|
||||
let fkey = `spin_${me.id}`;
|
||||
let f = Registry.get_or(fkey, 0);
|
||||
set_tile(frames[f % 4]);
|
||||
Registry.set(fkey, (f + 1) % 4);
|
||||
|
||||
delay(0.5);
|
||||
me.delay(0.5);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user