@idle-screens/saver-metaquarium 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2564,9 +2564,9 @@ function parseChoreography(value, moves) {
2564
2564
  }
2565
2565
  const cue = { b0, beats: Math.min(beats, 512), move: m[2], turn: 0, lift: 0 };
2566
2566
  for (const tok of (m[3] ?? "").replace(/^[,\s]+/, "").split(/\s+/).filter(Boolean)) {
2567
- const mod = /^([>@~^/%*])(.+)$/.exec(tok);
2567
+ const mod = /^([>@~^/%*x=])(.+)$/.exec(tok);
2568
2568
  if (!mod) {
2569
- problems.push(`"${raw}": "${tok}" is not >to, @face, ~turn, ^leap, /lean, %crouch or *groove`);
2569
+ problems.push(`"${raw}": "${tok}" is not >to, @face, ~turn, ^leap, /lean, %crouch, *groove, xspeed or =pose`);
2570
2570
  continue;
2571
2571
  }
2572
2572
  const [, op, arg] = mod;
@@ -2587,6 +2587,12 @@ function parseChoreography(value, moves) {
2587
2587
  } else if (op === "%") {
2588
2588
  if (Number.isFinite(Number(arg)) && Number(arg) > 0) cue.squash = clamp(Number(arg), 0.4, 1.5);
2589
2589
  else problems.push(`"${raw}": crouch "${arg}" is not a height scale`);
2590
+ } else if (op === "=") {
2591
+ if (arg !== "" && Number.isFinite(Number(arg)) && Number(arg) >= 0 && Number(arg) <= 1) cue.pose = Number(arg);
2592
+ else problems.push(`"${raw}": pose "${arg}" is not a fraction of the move (0\u20131)`);
2593
+ } else if (op === "x") {
2594
+ if (Number.isFinite(Number(arg)) && Number(arg) > 0) cue.rate = clamp(Number(arg), 0.25, 4);
2595
+ else problems.push(`"${raw}": speed "${arg}" is not a multiple`);
2590
2596
  } else if (op === "*") {
2591
2597
  if (Number.isFinite(Number(arg)) && Number(arg) > 0) cue.groove = clamp(Number(arg), 0.02, 0.3);
2592
2598
  else problems.push(`"${raw}": groove "${arg}" is not a depth`);
@@ -3304,11 +3310,13 @@ var PARAM_DOCS = {
3304
3310
  cameraDistance: "Distance from the tank centre. 80 is a close-up, 170\u2013220 a village, 300+ a landmark.",
3305
3311
  shot: "A framing: `orbit`, `hero` (three-quarter), `front` (level, long lens), `low`, `top` (a map), `surface`, `macro` (nearest landmark), `cast` (the mix's first three). Azimuth and autoRotate turn it, distance scales it.",
3306
3312
  shotBlend: "Seconds a change of `shot` takes (0 = a cut): the camera moves to the new framing, eased.",
3307
- cameraFollow: "Ride with one fish (cast slot); -1 is the orbit camera, whose params are ignored while following. With `followSpot` on the slot, a spotlit chase.",
3308
- followAngle: "Where round the followed fish the chase camera stands, degrees: 0 behind (default), 90 beside, 180 in front looking back at its face.",
3309
- followDistance: "How far behind the followed fish the camera rides (40\u201370 is a chase). Under ~18 it is the fish's eye; a floor walker sees from its own head height.",
3310
- autoRotate: "Turntable speed, degrees/second. 0 holds the shot (stages, vignettes); 1\u20132 is a slow reveal. frame.state.camera.bearing: where it stands now.",
3311
- followAvoid: "Keep the followed fish in view, 0\u20131: the chase camera rises over low clutter or pulls in, eased. For walks through a village.",
3313
+ cameraFollow: "Ride with one fish (cast slot); -1 is the orbit camera (its params ignored while following).",
3314
+ followAngle: "Where round the followed fish the chase camera stands, degrees: 0 behind (default), 90 beside, 180 facing it. A choreographed dancer is measured from the stage's facing instead.",
3315
+ followDistance: "How far behind the followed fish the camera rides (40\u201370 is a chase). Under ~18 it is the fish's eye (a walker's: its head height).",
3316
+ autoRotate: "Turntable speed, degrees/second. 0 holds the shot, 1\u20132 a slow reveal. frame.state.camera.bearing: where it stands now.",
3317
+ followAvoid: "Keep the followed fish in view, 0\u20131: the chase camera rises or pulls in, eased.",
3318
+ followHeight: "Chase camera height in body lengths over its feet, aimed at them (0.2: feet); -1 off.",
3319
+ followLens: "Chase lens, degrees (0: 55; 25 long).",
3312
3320
  nearFade: "A creature at the lens dissolves, not sliced, 0\u20131. The followed fish never fades.",
3313
3321
  // cast
3314
3322
  fishCount: "How many fish when `fishMix` is empty (all are `fishUrl`).",
@@ -3452,7 +3460,7 @@ geodeMineral world | mineral, \u2026 amethyst agate celestine citrine carneli
3452
3460
  floraPalette world | #rrggbb, \u2026 (\u22646) world \xB7 #ff4fa0, #ffb347, #4fd1ff
3453
3461
  spotRig slot|@mark[/color][*radius], \u2026 (\u22643; they become a, b, c) 0/#ffd27a*24, 1/#ff8ad0*24, 2/#7fdcff*24
3454
3462
  spotCues <sec>s:<spots>, \u2026 loops 4s:-, 7s:a, 7s:b, 12s:a+b
3455
- choreography [a|*:] <beats>:<move> [>to @face ~turn ^leap /lean %crouch *groove],\u2026|\u2026 moves ${STARFISH_MOVE_NAMES.join(" ")}
3463
+ choreography [a|*:] <beats>:<move> [>to @face ~turn ^leap /lean %crouch *groove xspeed =pose],\u2026|\u2026 moves ${STARFISH_MOVE_NAMES.join(" ")}
3456
3464
  signs kind[@place][>target][/#color][*size][:text], \u2026 plank@gate:"Welcome to the reef", neon@home1/#ff4fa0:OPEN, led@plaza:TIDE 4.2M
3457
3465
  kinds plank arrow ring porthole neon led \xB7 places gate plaza courtyard hub fountain home1 home2 home3 centre left right front back
3458
3466
  an arrow points at >target \xB7 text \u2264 plank 24, arrow 16, ring 10, porthole 4 (empty = a fish), neon 14, led 64 (scrolls) \xB7 \u2264 8 signs
@@ -4030,7 +4038,7 @@ function dependencyProblems(params) {
4030
4038
  if (set("danceTempo") && dance === "off" && !choreographed) out.push({ path: "danceTempo", also: ["starfishDance"], message: "does nothing while starfishDance is off" });
4031
4039
  if (choreographed && !starfishSwims) out.push({ path: "choreography", also: ["fishMix"], message: "no starfish in the cast to dance it \u2014 add e.g. starfish:5" });
4032
4040
  if (follow < 0) {
4033
- for (const k of ["followDistance", "followAngle", "followAvoid"]) if (set(k)) out.push({ path: k, also: ["cameraFollow"], message: "does nothing while cameraFollow is -1 (the orbit camera)" });
4041
+ for (const k of ["followDistance", "followAngle", "followAvoid", "followHeight", "followLens"]) if (set(k)) out.push({ path: k, also: ["cameraFollow"], message: "does nothing while cameraFollow is -1 (the orbit camera)" });
4034
4042
  } else if (follow < cast) {
4035
4043
  for (const k of ORBIT_PARAMS) if (set(k)) out.push({ path: k, also: ["cameraFollow"], message: `ignored while cameraFollow rides with slot ${follow} \u2014 they return when it is -1` });
4036
4044
  }
@@ -4262,7 +4270,8 @@ var METAQUARIUM_PARAMS = {
4262
4270
  followDistance: { type: "number", default: 45, min: 0, max: 160, ease: "smooth" },
4263
4271
  /** Where round the followed fish the chase camera stands, degrees: 0 behind
4264
4272
  * it (the default), 90 at its side, 180 in front looking back at its face
4265
- * — a hackerfish's screen, a crab's smile. */
4273
+ * — a hackerfish's screen, a crab's smile. A choreographed dancer is framed
4274
+ * from its stage's front instead, so a spin turns the dancer, not the shot. */
4266
4275
  followAngle: { type: "number", default: 0, min: -180, max: 180, ease: "smooth" },
4267
4276
  /** Keep the followed fish in view (sightline.ts): when a home, a wall, a lamp
4268
4277
  * or a kelp stand comes between it and the chase camera, the camera rises a
@@ -4270,6 +4279,15 @@ var METAQUARIUM_PARAMS = {
4270
4279
  * a game camera's spring arm does — eased, never a snap. 0 (default) is the
4271
4280
  * plain chase camera; 1 the full arm. Not the fish's-eye view (it has none). */
4272
4281
  followAvoid: { type: "number", default: 0, min: 0, max: 1, ease: "smooth" },
4282
+ /** The chase camera's height over the followed fish's feet, in its body
4283
+ * lengths. -1 (default) rides a little above it, looking at its middle;
4284
+ * set, the camera stands at that height aimed at its feet — 0.1–0.3 on a
4285
+ * long lens is a shot of a walker's feet, the floor behind them. */
4286
+ followHeight: { type: "number", default: -1, min: -1, max: 3, ease: "step" },
4287
+ /** The chase camera's lens: degrees of view, top to bottom. 0 (default) is
4288
+ * the orbit camera's 55; 20–30 is a long lens — flatter and tighter, from
4289
+ * further back. */
4290
+ followLens: { type: "number", default: 0, min: 0, max: 90, ease: "step" },
4273
4291
  /** Continuous orbit speed, degrees/second. Zero by default: the tank is
4274
4292
  * still, letting the fish movement carry the scene. Steer up for an orbit. */
4275
4293
  autoRotate: { type: "number", default: 0, min: 0, max: 12, ease: "smooth" },
@@ -4980,4 +4998,4 @@ export {
4980
4998
  paramSpaceWith,
4981
4999
  coerceNum
4982
5000
  };
4983
- //# sourceMappingURL=chunk-42RIVUT4.js.map
5001
+ //# sourceMappingURL=chunk-M2PKNQNY.js.map