incanto 0.74.0 → 0.75.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.
Files changed (92) hide show
  1. package/bin/incanto-multiplay.mjs +52 -4
  2. package/dist/2d.d.ts +83 -7
  3. package/dist/2d.js +4 -3
  4. package/dist/3d.d.ts +743 -167
  5. package/dist/3d.js +6 -6
  6. package/dist/{agent8-CHTT4unP.js → agent8-B-bh3n0X.js} +1 -1
  7. package/dist/{audio-player-BOrk4eQx.d.ts → audio-player-BRo2uvG6.d.ts} +23 -2
  8. package/dist/{behavior-J1cmVah0.d.ts → behavior-B_245qRy.d.ts} +15 -1
  9. package/dist/{create-game-BAiA-FjP.js → create-game-DVUhHs2B.js} +79 -10
  10. package/dist/{create-game-ssvGvP7W.js → create-game-DnwhJ5nW.js} +83 -7
  11. package/dist/debug.d.ts +1 -1
  12. package/dist/{editor-switch-CFU9mCec.d.ts → editor-switch-O8mxpgRX.d.ts} +1 -1
  13. package/dist/editor.js +1600 -1529
  14. package/dist/env.d.ts +1 -1
  15. package/dist/{environment-presets-BkqlWewf.js → environment-presets-BP77Dl0K.js} +2005 -60
  16. package/dist/{gameplay-Bxe1sMVT.js → gameplay-D-JuGura.js} +9309 -6595
  17. package/dist/gameplay.d.ts +573 -31
  18. package/dist/gameplay.js +3 -2
  19. package/dist/index.d.ts +150 -6
  20. package/dist/index.js +6 -6
  21. package/dist/{loader-BAeWMYfF.d.ts → loader-CbkVdXL8.d.ts} +2 -2
  22. package/dist/net.d.ts +2 -2
  23. package/dist/net.js +2 -2
  24. package/dist/{physics-2d-C-SfvjzH.js → physics-2d-x3bCrQf0.js} +250 -31
  25. package/dist/{physics-3d-rOzeg890.js → physics-3d-Bz2VPQ6D.js} +673 -51
  26. package/dist/{picking-BMV34Pjl.js → picking-Buita5T9.js} +2 -2
  27. package/dist/{save-slots-CEUGeLuB.js → pose-ByFB_J3O.js} +217 -11
  28. package/dist/react.d.ts +2 -2
  29. package/dist/react.js +1 -1
  30. package/dist/{register-CjociOtt.js → register-B768Qedj.js} +596 -2
  31. package/dist/{register-DRQyZKGU.js → register-DxAbTO2T.js} +191 -430
  32. package/dist/{replay-B6BbgGM_.js → replay-DrqQ6dZj.js} +133 -18
  33. package/dist/{replay-wZK5Ok5c.d.ts → replay-W5nCw_cU.d.ts} +21 -2
  34. package/dist/{rng-Bb-IutXB.d.ts → rng-BsXZg3D6.d.ts} +7 -0
  35. package/dist/{split-screen-BxZ5rBe7.js → split-screen-B-dIcQsQ.js} +10 -5
  36. package/dist/{split-screen-D6sx8z3Z.d.ts → split-screen-CiLJf2-C.d.ts} +3 -3
  37. package/dist/{sprite-animation-Bz3DHD_4.js → sprite-animation-SQa5gIu2.js} +8 -6
  38. package/dist/{src-CqtvYtSN.js → src-DLKVc6Hj.js} +1 -1
  39. package/dist/{test-CEl0y2Sw.js → test-HlVUeCSn.js} +487 -82
  40. package/dist/test.d.ts +90 -12
  41. package/dist/test.js +2 -2
  42. package/dist/vite.js +3 -3
  43. package/editor/assets/{agent8-BlzturGi.js → agent8-BXlYM9rv.js} +1 -1
  44. package/editor/assets/{debug-BMUi8usj.js → debug-S42XGP4Y.js} +1 -1
  45. package/editor/assets/index-DgrgUKno.js +11046 -0
  46. package/editor/index.html +1 -1
  47. package/package.json +1 -1
  48. package/schemas/scene.schema.json +1630 -299
  49. package/skills/incanto-3d-character.md +358 -20
  50. package/skills/incanto-audio.md +24 -2
  51. package/skills/incanto-building-2d-games.md +21 -2
  52. package/skills/incanto-building-3d-games.md +38 -3
  53. package/skills/incanto-editor.md +17 -6
  54. package/skills/incanto-environment.md +227 -2
  55. package/skills/incanto-game-feel.md +60 -1
  56. package/skills/incanto-gameplay-behaviors.md +668 -20
  57. package/skills/incanto-hud.md +116 -0
  58. package/skills/incanto-multiplayer.md +141 -2
  59. package/skills/incanto-node-reference.md +393 -16
  60. package/skills/incanto-performance.md +32 -0
  61. package/skills/incanto-physics-and-input.md +241 -13
  62. package/skills/incanto-playtesting.md +2 -2
  63. package/skills/incanto-save-slots.md +61 -2
  64. package/skills/incanto-scene-json-authoring.md +13 -0
  65. package/skills/incanto-verifying-your-game.md +86 -3
  66. package/templates-app/beacon-isle-3d/PROJECT/Status.md +12 -0
  67. package/templates-app/beacon-isle-3d/package.json +1 -1
  68. package/templates-app/beacon-isle-3d/src/game.scene.json +151 -2
  69. package/templates-app/molehill-2d/PROJECT/Status.md +7 -0
  70. package/templates-app/molehill-2d/package.json +1 -1
  71. package/templates-app/molehill-2d/src/game.scene.json +129 -2
  72. package/templates-app/platformer-2d/PROJECT/Status.md +7 -0
  73. package/templates-app/platformer-2d/docs/project-2d-rules.md +3 -2
  74. package/templates-app/platformer-2d/package.json +1 -1
  75. package/templates-app/platformer-2d/src/behaviors.ts +40 -26
  76. package/templates-app/platformer-2d/src/game.scene.json +144 -2
  77. package/templates-app/platformer-2d/verify.ts +18 -1
  78. package/templates-app/star-survivor/PROJECT/Status.md +7 -0
  79. package/templates-app/star-survivor/package.json +1 -1
  80. package/templates-app/star-survivor/src/behaviors.ts +9 -8
  81. package/templates-app/star-survivor/src/game.scene.json +142 -4
  82. package/templates-app/star-survivor/verify.ts +13 -0
  83. package/templates-app/tps-3d/PROJECT/Status.md +6 -0
  84. package/templates-app/tps-3d/package.json +1 -1
  85. package/templates-app/tps-3d/src/game.scene.json +71 -10
  86. package/templates-app/village-quest-3d/PROJECT/Status.md +7 -0
  87. package/templates-app/village-quest-3d/package.json +1 -1
  88. package/templates-app/village-quest-3d/src/behaviors.ts +8 -16
  89. package/templates-app/village-quest-3d/src/grove.scene.json +121 -5
  90. package/templates-app/village-quest-3d/src/village.scene.json +126 -2
  91. package/templates-app/village-quest-3d/verify.ts +52 -2
  92. package/editor/assets/index-CrUCQoaB.js +0 -11046
@@ -189,7 +189,7 @@ Reads: `attachedBone: Object3D | null`
189
189
  | `weight` | `0.85` | number |
190
190
  | `forwardAxis` | `"+z"` | one of: `+x` `-x` `+y` `-y` `+z` `-z` |
191
191
 
192
- Reads: `attachedBone: Object3D | null`
192
+ Reads: `engaged: number` · `attachedBone: Object3D | null`
193
193
 
194
194
  ## `Camera2D` — `incanto/2d`
195
195
 
@@ -207,8 +207,9 @@ Reads: `attachedBone: Object3D | null`
207
207
  | `zoom` | `1` | number |
208
208
  | `limits` | `[]` | array |
209
209
  | `current` | `false` | boolean |
210
+ | `blendSeconds` | `0` | number |
210
211
 
211
- Methods: `clampedCenter(vw, vh)`
212
+ Methods: `makeCurrent(blendSeconds?)` · `clampedCenter(vw, vh)`
212
213
 
213
214
  Reads: `effectiveZoom: number`
214
215
 
@@ -225,10 +226,14 @@ Reads: `effectiveZoom: number`
225
226
  | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
226
227
  | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
227
228
  | `fov` | `60` | number |
229
+ | `minHorizontalFov` | `0` | number |
228
230
  | `near` | `0.1` | number |
229
231
  | `far` | `1000` | number |
230
232
  | `current` | `false` | boolean |
231
233
  | `lookAt` | `""` | node path |
234
+ | `blendSeconds` | `0` | number |
235
+
236
+ Methods: `makeCurrent(blendSeconds?)` · `viewFov(aspect)`
232
237
 
233
238
  ## `CharacterBody2D` — `incanto/2d`
234
239
 
@@ -248,6 +253,7 @@ Reads: `effectiveZoom: number`
248
253
  | `slopeLimitDeg` | `45` | number |
249
254
  | `stepHeight` | `35` | number |
250
255
  | `collideWithCharacters` | `true` | boolean |
256
+ | `pushes` | `0` | number |
251
257
 
252
258
  Signals: `triggerEnter(other)` · `triggerExit(other)`
253
259
 
@@ -272,6 +278,7 @@ Methods: `moveAndSlide()` · `isOnWall()` · `wallSide()` · `isOnCeiling()` ·
272
278
  | `slopeLimitDeg` | `45` | number |
273
279
  | `stepHeight` | `0.35` | number |
274
280
  | `collideWithCharacters` | `true` | boolean |
281
+ | `pushes` | `0` | number |
275
282
 
276
283
  Signals: `triggerEnter(other)` · `triggerExit(other)`
277
284
 
@@ -295,6 +302,9 @@ Methods: `moveAndSlide()` · `isOnWall()` · `wallNormal()` · `isOnCeiling()`
295
302
  | `dashAction` | `"dash"` | string |
296
303
  | `wallSlideSpeed` | `0` | number |
297
304
  | `wallJumpImpulse` | `[0,0]` | array |
305
+ | `crouchHeight` | `0` | number |
306
+ | `crouchSpeedMultiplier` | `0.5` | number |
307
+ | `crouchAction` | `"crouch"` | string |
298
308
 
299
309
  Signals: `movementStateChanged(state)`
300
310
 
@@ -310,6 +320,7 @@ Signals: `movementStateChanged(state)`
310
320
  | `renderOrder` | `0` | number |
311
321
  | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
312
322
  | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
323
+ | `enabled` | `true` | boolean |
313
324
  | `view` | `"free"` | one of: `free` `firstPerson` `quarter` `side` |
314
325
  | `camDistance` | `4` | number |
315
326
  | `eyeHeight` | `0.64` | number |
@@ -327,12 +338,28 @@ Signals: `movementStateChanged(state)`
327
338
  | `fallGravity` | `2.5` | number |
328
339
  | `floatHeight` | `0.01` | number |
329
340
  | `stepHeight` | `0.35` | number |
341
+ | `swimSpeed` | `1.6` | number |
342
+ | `swimDepth` | `0.35` | number |
343
+ | `diveAction` | `"dive"` | string |
344
+ | `climbSpeed` | `1.5` | number |
345
+ | `ladderGroup` | `"ladder"` | string |
346
+ | `mantleHeight` | `0` | number |
347
+ | `crouchHeight` | `0` | number |
348
+ | `crouchSpeedMultiplier` | `0.5` | number |
349
+ | `crouchAction` | `"crouch"` | string |
350
+ | `dashSpeed` | `0` | number |
351
+ | `dashSeconds` | `0.25` | number |
352
+ | `dashCooldown` | `0` | number |
353
+ | `dashAction` | `"dash"` | string |
354
+ | `dashBackstep` | `false` | boolean |
330
355
  | `mouseLook` | `true` | boolean |
331
356
  | `zoomMin` | `0` | number |
332
357
  | `zoomMax` | `0` | number |
333
358
  | `pitchMin` | `-1.3` | number |
334
359
  | `pitchMax` | `1.5` | number |
360
+ | `pitchStart` | `0` | number |
335
361
  | `cameraCollision` | `true` | boolean |
362
+ | `camera` | `"drive"` | one of: `drive` `none` |
336
363
  | `platformCarry` | `true` | boolean |
337
364
  | `turnSpeed` | `100` | number |
338
365
  | `camLerp` | `25` | number |
@@ -341,9 +368,14 @@ Signals: `movementStateChanged(state)`
341
368
  | `sprintAction` | `"sprint"` | string |
342
369
  | `skinPath` | `"../Skin"` | node path |
343
370
  | `skinYawOffset` | `0` | number |
371
+ | `lockOnAction` | `""` | string |
372
+ | `lockGroup` | `"enemy"` | string |
373
+ | `lockRange` | `12` | number |
344
374
  | `animations` | `{}` | object |
345
375
 
346
- Signals: `movementStateChanged(state)` · `wallJumped`
376
+ Signals: `movementStateChanged(state)` · `wallJumped` · `lockChanged` · `dashed`
377
+
378
+ Methods: `lock(node)` · `unlock()` · `toggleLock()`
347
379
 
348
380
  ## `ColorRect2D` — `incanto/2d`
349
381
 
@@ -382,6 +414,38 @@ Methods: `free()`
382
414
  | `shadowMapSize` | `2048` | number |
383
415
  | `shadowFollowsCamera` | `false` | boolean |
384
416
 
417
+ ## `Flock3D` — `incanto/3d`
418
+
419
+ | Prop | Default | Kind |
420
+ |---|---|---|
421
+ | `position` | `[0,0,0]` | array |
422
+ | `rotation` | `[0,0,0]` | array |
423
+ | `static` | `false` | boolean |
424
+ | `scale` | `[1,1,1]` | array |
425
+ | `visible` | `true` | boolean |
426
+ | `renderOrder` | `0` | number |
427
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
428
+ | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
429
+ | `mesh` | `"box"` | one of: `box` `sphere` `capsule` `plane` `cylinder` `gem` |
430
+ | `size` | `[1,1,1]` | array |
431
+ | `material` | `{}` | object |
432
+ | `transforms` | `[]` | array |
433
+ | `castShadow` | `false` | boolean |
434
+ | `receiveShadow` | `false` | boolean |
435
+ | `collider` | `null` | any JSON — see the skill for the accepted shapes, or object |
436
+ | `count` | `30` | number |
437
+ | `radius` | `20` | number |
438
+ | `height` | `8` | number |
439
+ | `speed` | `6` | number |
440
+ | `turn` | `2.5` | number |
441
+ | `separation` | `1.5` | number |
442
+ | `sight` | `5` | number |
443
+ | `alignment` | `1` | number |
444
+ | `cohesion` | `1` | number |
445
+ | `follow` | `""` | node path |
446
+
447
+ Methods: `boids()`
448
+
385
449
  ## `Flowers3D` — `incanto/3d`
386
450
 
387
451
  | Prop | Default | Kind |
@@ -451,6 +515,7 @@ Methods: `free()`
451
515
  | `zIndex` | `100` | number |
452
516
  | `visible` | `true` | boolean |
453
517
  | `focusNavigation` | `false` | boolean |
518
+ | `letterbox` | `0` | number |
454
519
 
455
520
  Methods: `focusables()` · `focus(widget)`
456
521
 
@@ -489,10 +554,14 @@ Reads: `instanceCount: number`
489
554
  | `renderOrder` | `0` | number |
490
555
  | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
491
556
  | `visible` | `true` | boolean |
492
- | `type` | `"revolute"` | one of: `fixed` `revolute` `rope` `spring` |
557
+ | `type` | `"revolute"` | one of: `fixed` `revolute` `prismatic` `rope` `spring` |
493
558
  | `target` | `""` | node path · **required** |
494
559
  | `anchor` | `[0,0]` | array |
495
560
  | `targetAnchor` | `[0,0]` | array |
561
+ | `axis` | `[0,1]` | array |
562
+ | `limits` | `[]` | array |
563
+ | `motorSpeed` | `0` | number |
564
+ | `motorStrength` | `20` | number |
496
565
  | `length` | `0` | number |
497
566
  | `stiffness` | `50` | number |
498
567
  | `damping` | `5` | number |
@@ -510,10 +579,14 @@ Reads: `instanceCount: number`
510
579
  | `renderOrder` | `0` | number |
511
580
  | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
512
581
  | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
513
- | `type` | `"spherical"` | one of: `fixed` `spherical` `rope` `spring` |
582
+ | `type` | `"spherical"` | one of: `fixed` `spherical` `revolute` `prismatic` `rope` `spring` |
514
583
  | `target` | `""` | node path · **required** |
515
584
  | `anchor` | `[0,0,0]` | array |
516
585
  | `targetAnchor` | `[0,0,0]` | array |
586
+ | `axis` | `[0,1,0]` | array |
587
+ | `limits` | `[]` | array |
588
+ | `motorSpeed` | `0` | number |
589
+ | `motorStrength` | `20` | number |
517
590
  | `length` | `0` | number |
518
591
  | `stiffness` | `50` | number |
519
592
  | `damping` | `5` | number |
@@ -743,6 +816,8 @@ Reads: `effectiveRenderOrder: number`
743
816
  | `shimmer` | `0` | number |
744
817
  | `blend` | `"add"` | one of: `add` `normal` |
745
818
  | `maxParticles` | `256` | number |
819
+ | `emitBox` | `[0,0]` | array |
820
+ | `drift` | `[0,0]` | array |
746
821
 
747
822
  Signals: `finished`
748
823
 
@@ -784,6 +859,8 @@ Reads: `aliveCount: number`
784
859
  | `blend` | `"add"` | one of: `add` `normal` |
785
860
  | `depthTest` | `true` | boolean |
786
861
  | `maxParticles` | `256` | number |
862
+ | `emitBox` | `[0,0,0]` | array |
863
+ | `drift` | `[0,0,0]` | array |
787
864
 
788
865
  Signals: `finished`
789
866
 
@@ -791,6 +868,28 @@ Methods: `particles()` · `replay()` · `free()`
791
868
 
792
869
  Reads: `aliveCount: number`
793
870
 
871
+ ## `Ragdoll3D` — `incanto/3d`
872
+
873
+ | Prop | Default | Kind |
874
+ |---|---|---|
875
+ | `position` | `[0,0,0]` | array |
876
+ | `rotation` | `[0,0,0]` | array |
877
+ | `static` | `false` | boolean |
878
+ | `scale` | `[1,1,1]` | array |
879
+ | `visible` | `true` | boolean |
880
+ | `renderOrder` | `0` | number |
881
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
882
+ | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
883
+ | `target` | `"../Skin"` | node path |
884
+ | `mass` | `70` | number |
885
+ | `damping` | `3` | number |
886
+ | `lifetime` | `0` | number |
887
+ | `collide` | `true` | boolean |
888
+
889
+ Signals: `activated` · `reset`
890
+
891
+ Methods: `limbs()` · `activate(pose?)` · `reset()` · `free()`
892
+
794
893
  ## `Respawn` — `incanto`
795
894
 
796
895
  | Prop | Default | Kind |
@@ -854,6 +953,7 @@ Reads: `velocity: number[]`
854
953
  | `angularVelocity` | `[0,0,0]` | array |
855
954
  | `linearDamping` | `0` | number |
856
955
  | `angularDamping` | `0` | number |
956
+ | `buoyancy` | `0` | number |
857
957
 
858
958
  Signals: `triggerEnter(other)` · `triggerExit(other)`
859
959
 
@@ -1113,9 +1213,10 @@ Reads: `pointCount: number`
1113
1213
  | `leafFadeEnd` | `0` | number |
1114
1214
  | `leafShadows` | `true` | boolean |
1115
1215
  | `drape` | `null` | any JSON — see the skill for the accepted shapes, or boolean |
1216
+ | `avoidWater` | `true` | boolean |
1116
1217
  | `terrain` | `""` | node path |
1117
1218
 
1118
- Methods: `free()`
1219
+ Methods: `trunks()` · `free()`
1119
1220
 
1120
1221
  ## `UILayer` — `incanto/2d`
1121
1222
 
@@ -1195,6 +1296,7 @@ Methods: `press()`
1195
1296
  | `draggable` | `false` | boolean |
1196
1297
  | `dropTarget` | `false` | boolean |
1197
1298
  | `charsPerSecond` | `40` | number |
1299
+ | `autoAdvanceSeconds` | `0` | number |
1198
1300
  | `width` | `520` | number |
1199
1301
 
1200
1302
  Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped` · `lineShown` · `choiceMade` · `dialogueFinished`
@@ -1251,6 +1353,29 @@ Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped`
1251
1353
 
1252
1354
  Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped` · `changed`
1253
1355
 
1356
+ ## `UiMinimap` — `incanto`
1357
+
1358
+ | Prop | Default | Kind |
1359
+ |---|---|---|
1360
+ | `anchor` | `"topLeft"` | one of: `topLeft` `top` `topRight` `left` `center` `right` `bottomLeft` `bottom` `bottomRight` |
1361
+ | `visible` | `true` | boolean |
1362
+ | `focusable` | `false` | boolean |
1363
+ | `draggable` | `false` | boolean |
1364
+ | `dropTarget` | `false` | boolean |
1365
+ | `size` | `160` | number |
1366
+ | `radius` | `40` | number |
1367
+ | `follow` | `""` | node path |
1368
+ | `dots` | `{}` | object |
1369
+ | `heading` | `""` | node path |
1370
+ | `self` | `"#ffffff"` | string |
1371
+ | `dotSize` | `6` | number |
1372
+ | `background` | `"rgba(0,0,0,0.45)"` | string |
1373
+ | `shape` | `"circle"` | one of: `circle` `square` |
1374
+
1375
+ Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped`
1376
+
1377
+ Methods: `centre()` · `markers()`
1378
+
1254
1379
  ## `UiMuteToggle` — `incanto`
1255
1380
 
1256
1381
  | Prop | Default | Kind |
@@ -1411,6 +1536,60 @@ Methods: `choose(value)`
1411
1536
 
1412
1537
  Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped` · `changed`
1413
1538
 
1539
+ ## `UiWaypoint` — `incanto`
1540
+
1541
+ | Prop | Default | Kind |
1542
+ |---|---|---|
1543
+ | `anchor` | `"topLeft"` | one of: `topLeft` `top` `topRight` `left` `center` `right` `bottomLeft` `bottom` `bottomRight` |
1544
+ | `visible` | `true` | boolean |
1545
+ | `focusable` | `false` | boolean |
1546
+ | `draggable` | `false` | boolean |
1547
+ | `dropTarget` | `false` | boolean |
1548
+ | `target` | `""` | node path |
1549
+ | `label` | `""` | string |
1550
+ | `color` | `"#ffd54f"` | string |
1551
+ | `size` | `22` | number |
1552
+ | `distance` | `true` | boolean |
1553
+ | `clamp` | `true` | boolean |
1554
+ | `margin` | `40` | number |
1555
+ | `hideWithin` | `0` | number |
1556
+ | `arriveWithin` | `0` | number |
1557
+ | `from` | `""` | node path |
1558
+
1559
+ Signals: `dragStarted` · `dragCancelled` · `droppedOn` · `dropped` · `arrived`
1560
+
1561
+ Methods: `distanceNow()` · `screen(view?)`
1562
+
1563
+ ## `Vehicle3D` — `incanto/3d`
1564
+
1565
+ | Prop | Default | Kind |
1566
+ |---|---|---|
1567
+ | `position` | `[0,0,0]` | array |
1568
+ | `rotation` | `[0,0,0]` | array |
1569
+ | `static` | `false` | boolean |
1570
+ | `scale` | `[1,1,1]` | array |
1571
+ | `visible` | `true` | boolean |
1572
+ | `renderOrder` | `0` | number |
1573
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
1574
+ | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
1575
+ | `wheels` | `[]` | array |
1576
+ | `suspensionStiffness` | `30` | number |
1577
+ | `suspensionCompression` | `2.3` | number |
1578
+ | `suspensionRelaxation` | `3.5` | number |
1579
+ | `maxTravel` | `0.3` | number |
1580
+ | `friction` | `2.5` | number |
1581
+ | `sideFriction` | `1` | number |
1582
+ | `maxSteerDeg` | `32` | number |
1583
+ | `engineForce` | `1500` | number |
1584
+ | `brakeForce` | `40` | number |
1585
+ | `moveAction` | `"move"` | string |
1586
+ | `brakeAction` | `"brake"` | string |
1587
+ | `enabled` | `true` | boolean |
1588
+
1589
+ Methods: `wheel(i)` · `specs()`
1590
+
1591
+ Reads: `body: RigidBody3D` · `maxSteer: number`
1592
+
1414
1593
  ## `VoxelGrid3D` — `incanto/3d`
1415
1594
 
1416
1595
  | Prop | Default | Kind |
@@ -1446,6 +1625,7 @@ Methods: `blockCount()` · `tileAt(x, y, z)` · `setBlocks(blocks)` · `addBlock
1446
1625
  | `opacity` | `0.8` | number |
1447
1626
  | `waveHeight` | `0.04` | number |
1448
1627
  | `waveSpeed` | `1` | number |
1628
+ | `drag` | `1.5` | number |
1449
1629
  | `quality` | `"fancy"` | one of: `fancy` `simple` |
1450
1630
  | `colors` | `{}` | object |
1451
1631
  | `reflection` | `true` | boolean |
@@ -1474,7 +1654,7 @@ Methods: `blockCount()` · `tileAt(x, y, z)` · `setBlocks(blocks)` · `addBlock
1474
1654
 
1475
1655
  Signals: `entered(body)` · `exited(body)`
1476
1656
 
1477
- Methods: `underwaterAt(camX, camY, camZ)` · `free()` · `heightAt(x, z)`
1657
+ Methods: `underwaterAt(camX, camY, camZ)` · `free()` · `heightAt(x, z)` · `depthAt(x, y, z)`
1478
1658
 
1479
1659
  ## `WaterCutout3D` — `incanto/3d`
1480
1660
 
@@ -1491,12 +1671,76 @@ Methods: `underwaterAt(camX, camY, camZ)` · `free()` · `heightAt(x, z)`
1491
1671
  | `size` | `[2,1,1]` | array |
1492
1672
  | `enabled` | `true` | boolean |
1493
1673
 
1674
+ ## `Weather3D` — `incanto/3d`
1675
+
1676
+ | Prop | Default | Kind |
1677
+ |---|---|---|
1678
+ | `position` | `[0,0,0]` | array |
1679
+ | `rotation` | `[0,0,0]` | array |
1680
+ | `static` | `false` | boolean |
1681
+ | `scale` | `[1,1,1]` | array |
1682
+ | `visible` | `true` | boolean |
1683
+ | `renderOrder` | `0` | number |
1684
+ | `orderGroup` | `"effects"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
1685
+ | `snapToGround` | `null` | any JSON — see the skill for the accepted shapes, or boolean or number |
1686
+ | `preset` | `"custom"` | one of: `custom` `fire` `smoke` `sparks` `fireworks` `explosion` `flash` `lightning` `rain` `snow` `magic` |
1687
+ | `emitting` | `true` | boolean |
1688
+ | `worldSpace` | `false` | boolean |
1689
+ | `rate` | `40` | number |
1690
+ | `burst` | `0` | number |
1691
+ | `lifetime` | `[0.6,1.2]` | array |
1692
+ | `speed` | `[40,120]` | array |
1693
+ | `directionDeg` | `-90` | number |
1694
+ | `spreadDeg` | `30` | number |
1695
+ | `gravity` | `[0,0]` | array |
1696
+ | `drag` | `0` | number |
1697
+ | `sizeStart` | `8` | number |
1698
+ | `sizeEnd` | `2` | number |
1699
+ | `colorStart` | `"#ffffff"` | string |
1700
+ | `colorEnd` | `"#ffffff"` | string |
1701
+ | `paletteColors` | `[]` | array |
1702
+ | `alphaStart` | `1` | number |
1703
+ | `alphaEnd` | `0` | number |
1704
+ | `shimmer` | `0` | number |
1705
+ | `blend` | `"add"` | one of: `add` `normal` |
1706
+ | `depthTest` | `true` | boolean |
1707
+ | `maxParticles` | `256` | number |
1708
+ | `emitBox` | `[0,0,0]` | array |
1709
+ | `drift` | `[0,0,0]` | array |
1710
+ | `kind` | `"rain"` | one of: `rain` `snow` |
1711
+ | `intensity` | `0.6` | number |
1712
+ | `radius` | `20` | number |
1713
+ | `height` | `12` | number |
1714
+ | `wind` | `[0,0]` | array |
1715
+ | `follow` | `""` | node path |
1716
+
1717
+ Signals: `finished`
1718
+
1494
1719
  ## Gameplay behaviors — `incanto/gameplay`
1495
1720
 
1496
1721
  Ready-made `Behavior`s auto-registered by `createGame2D`/`createGame3D` (opt out
1497
1722
  with `gameplay: false`). Attach via `"script": {"name": "...", "props": {...}}` and
1498
1723
  wire their signals through scene `connections`. Full guide: `incanto-gameplay-behaviors.md`.
1499
1724
 
1725
+ ### `Blast`
1726
+
1727
+ | Prop | Default | Kind |
1728
+ |---|---|---|
1729
+ | `enabled` | `true` | boolean |
1730
+ | `radius` | `4` | number |
1731
+ | `damage` | `40` | number |
1732
+ | `falloff` | `"linear"` | one of: `linear` `none` |
1733
+ | `groups` | `""` | string |
1734
+ | `when` | `"died"` | string |
1735
+ | `self` | `false` | boolean |
1736
+ | `throughWalls` | `true` | boolean |
1737
+
1738
+ Signals: `blasted`
1739
+
1740
+ Methods: `blast()`
1741
+
1742
+ Reads: `spent: boolean`
1743
+
1500
1744
  ### `Buoyancy`
1501
1745
 
1502
1746
  | Prop | Default | Kind |
@@ -1522,6 +1766,27 @@ Signals: `submerged` · `surfaced`
1522
1766
 
1523
1767
  Methods: `shake(magnitude, seconds?)`
1524
1768
 
1769
+ ### `Carry`
1770
+
1771
+ | Prop | Default | Kind |
1772
+ |---|---|---|
1773
+ | `enabled` | `true` | boolean |
1774
+ | `action` | `"grab"` | string |
1775
+ | `throwAction` | `"throw"` | string |
1776
+ | `range` | `2.2` | number |
1777
+ | `group` | `"carryable"` | string |
1778
+ | `maxMass` | `30` | number |
1779
+ | `holdDistance` | `1.2` | number |
1780
+ | `holdHeight` | `0.5` | number |
1781
+ | `throwSpeed` | `9` | number |
1782
+ | `gain` | `14` | number |
1783
+ | `inheritMotion` | `1` | number |
1784
+ | `facePath` | `"../Skin"` | node path |
1785
+
1786
+ Signals: `grabbed` · `dropped` · `thrown`
1787
+
1788
+ Methods: `grab()` · `drop()` · `throw()`
1789
+
1525
1790
  ### `Chase`
1526
1791
 
1527
1792
  | Prop | Default | Kind |
@@ -1534,12 +1799,27 @@ Methods: `shake(magnitude, seconds?)`
1534
1799
  | `stopRange` | `0` | number |
1535
1800
  | `loseRange` | `0` | number |
1536
1801
  | `moveParent` | `false` | boolean |
1802
+ | `requireSight` | `false` | boolean |
1537
1803
  | `ground` | `null` | any JSON — see the skill for the accepted shapes, or boolean |
1538
1804
  | `facePath` | `""` | node path |
1539
1805
  | `turnSpeed` | `100` | number |
1540
1806
 
1541
1807
  Signals: `reachedTarget` · `lostTarget`
1542
1808
 
1809
+ Reads: `chasing: Node | null`
1810
+
1811
+ ### `ChaseCamera`
1812
+
1813
+ | Prop | Default | Kind |
1814
+ |---|---|---|
1815
+ | `enabled` | `true` | boolean |
1816
+ | `target` | `""` | node path · **required** |
1817
+ | `back` | `8` | number |
1818
+ | `up` | `3` | number |
1819
+ | `smoothing` | `0.85` | number |
1820
+
1821
+ Methods: `snap()`
1822
+
1543
1823
  ### `Checkpoint`
1544
1824
 
1545
1825
  | Prop | Default | Kind |
@@ -1552,6 +1832,8 @@ Signals: `reachedTarget` · `lostTarget`
1552
1832
 
1553
1833
  Signals: `activated`
1554
1834
 
1835
+ Methods: `announce()`
1836
+
1555
1837
  ### `Clickable`
1556
1838
 
1557
1839
  | Prop | Default | Kind |
@@ -1585,6 +1867,8 @@ Signals: `changed` · `earned` · `spent` · `refused`
1585
1867
 
1586
1868
  Methods: `canAfford(cost)` · `spend(cost)` · `earn(gain)` · `setAmount(next)` · `announce()`
1587
1869
 
1870
+ Reads: `room: number`
1871
+
1588
1872
  ### `DamageOnContact`
1589
1873
 
1590
1874
  | Prop | Default | Kind |
@@ -1658,10 +1942,27 @@ Methods: `shake(magnitude, seconds?)`
1658
1942
  | `freezeOnEnd` | `true` | boolean |
1659
1943
  | `bannerPath` | `"%Banner"` | node path |
1660
1944
  | `pausePanelPath` | `"%PauseMenu"` | node path |
1945
+ | `titlePanelPath` | `""` | node path |
1946
+ | `saveSlots` | `""` | string |
1661
1947
 
1662
1948
  Signals: `flowChanged`
1663
1949
 
1664
- Methods: `gameOver(text?, color?)` · `win(text?, color?)` · `pause()` · `resume()` · `restart()` · `goToScene(sceneJson, opts?)`
1950
+ Methods: `save(slot?)` · `hasSave(slot?)` · `continueFrom(slot?)` · `screen(path)` · `back()` · `gameOver(text?, color?)` · `win(text?, color?)` · `pause()` · `resume()` · `restart()` · `goToScene(sceneJson, opts?)`
1951
+
1952
+ ### `GroupCamera`
1953
+
1954
+ | Prop | Default | Kind |
1955
+ |---|---|---|
1956
+ | `enabled` | `true` | boolean |
1957
+ | `targets` | `"player"` | string |
1958
+ | `offset` | `[0,12,14]` | array |
1959
+ | `minZoom` | `1` | number |
1960
+ | `maxZoom` | `2.5` | number |
1961
+ | `padding` | `0.25` | number |
1962
+ | `smoothing` | `0.15` | number |
1963
+ | `lookAtGroup` | `true` | boolean |
1964
+
1965
+ Methods: `members()` · `snap()`
1665
1966
 
1666
1967
  ### `Health`
1667
1968
 
@@ -1672,13 +1973,18 @@ Methods: `gameOver(text?, color?)` · `win(text?, color?)` · `pause()` · `resu
1672
1973
  | `regenPerSec` | `0` | number |
1673
1974
  | `invulnerableFor` | `0` | number |
1674
1975
  | `freeOnDeath` | `false` | boolean |
1976
+ | `knockback` | `0` | number |
1977
+ | `knockbackSeconds` | `0.15` | number |
1978
+ | `knockUp` | `0` | number |
1979
+ | `staggerSeconds` | `0` | number |
1980
+ | `applyKnockback` | `true` | boolean |
1675
1981
  | `freeParent` | `false` | boolean |
1676
1982
 
1677
- Signals: `damaged(amount, current)` · `healed(amount, current)` · `died` · `revived` · `healthChanged`
1983
+ Signals: `damaged(amount, current)` · `healed(amount, current)` · `died` · `revived` · `healthChanged` · `staggerEnded`
1678
1984
 
1679
- Methods: `damage(n)` · `protect(seconds)` · `heal(n)` · `revive(hp?)` · `reviveFull()` · `kill()` · `announce()`
1985
+ Methods: `takeLift()` · `damage(n, from?)` · `protect(seconds)` · `heal(n)` · `revive(hp?)` · `reviveFull()` · `kill()` · `announce()`
1680
1986
 
1681
- Reads: `isDead: boolean` · `invulnerableRemaining: number`
1987
+ Reads: `staggered: boolean` · `knocked: boolean` · `kickVelocity: number[]` · `isDead: boolean` · `invulnerableRemaining: number`
1682
1988
 
1683
1989
  ### `Interactable`
1684
1990
 
@@ -1707,6 +2013,25 @@ Signals: `expired`
1707
2013
 
1708
2014
  Methods: `startTimer()`
1709
2015
 
2016
+ ### `Mount`
2017
+
2018
+ | Prop | Default | Kind |
2019
+ |---|---|---|
2020
+ | `enabled` | `true` | boolean |
2021
+ | `rider` | `""` | node path · **required** |
2022
+ | `steed` | `".."` | node path |
2023
+ | `drive` | `""` | node path |
2024
+ | `walk` | `""` | node path |
2025
+ | `skin` | `"Skin"` | string |
2026
+ | `saddle` | `""` | node path |
2027
+ | `skinOnSaddle` | `[0,0,0]` | array |
2028
+ | `skinOnRider` | `[0,0,0]` | array |
2029
+ | `dismountAt` | `[1.8,0.3,0]` | array |
2030
+
2031
+ Signals: `mounted` · `dismounted`
2032
+
2033
+ Methods: `mount()` · `dismount()` · `toggle()`
2034
+
1710
2035
  ### `MoveTo`
1711
2036
 
1712
2037
  | Prop | Default | Kind |
@@ -1719,7 +2044,7 @@ Methods: `startTimer()`
1719
2044
 
1720
2045
  Signals: `arrived`
1721
2046
 
1722
- Methods: `start()`
2047
+ Methods: `start()` · `finish()`
1723
2048
 
1724
2049
  ### `Oscillate`
1725
2050
 
@@ -1739,12 +2064,14 @@ Methods: `start()`
1739
2064
  | `speed` | `120` | number |
1740
2065
  | `loop` | `false` | boolean |
1741
2066
  | `moveParent` | `false` | boolean |
2067
+ | `path` | `""` | node path |
2068
+ | `autoStart` | `true` | boolean |
1742
2069
  | `facePath` | `""` | node path |
1743
2070
  | `turnSpeed` | `100` | number |
1744
2071
 
1745
2072
  Signals: `waypointReached` · `arrived`
1746
2073
 
1747
- Methods: `setPath(waypoints)` · `stop()`
2074
+ Methods: `setPath(waypoints)` · `start()` · `stop()`
1748
2075
 
1749
2076
  Reads: `moving: boolean`
1750
2077
 
@@ -1764,6 +2091,18 @@ Reads: `moving: boolean`
1764
2091
 
1765
2092
  Signals: `reachedPoint(index)`
1766
2093
 
2094
+ ### `Phases`
2095
+
2096
+ | Prop | Default | Kind |
2097
+ |---|---|---|
2098
+ | `enabled` | `true` | boolean |
2099
+ | `at` | `[]` | array |
2100
+ | `health` | `""` | node path |
2101
+
2102
+ Signals: `phaseChanged` · `phase2` · `phase3` · `phase4` · `phase5`
2103
+
2104
+ Methods: `read(current, max)` · `announce()`
2105
+
1767
2106
  ### `Pickup`
1768
2107
 
1769
2108
  | Prop | Default | Kind |
@@ -1782,7 +2121,7 @@ Signals: `collected(value, other)`
1782
2121
  | `enabled` | `true` | boolean |
1783
2122
  | `prefabs` | `""` | string |
1784
2123
 
1785
- Methods: `names()` · `make(name)`
2124
+ Methods: `names()` · `template(name)` · `make(name)`
1786
2125
 
1787
2126
  ### `Projectile`
1788
2127
 
@@ -1793,7 +2132,7 @@ Methods: `names()` · `make(name)`
1793
2132
  | `direction` | `null` | any JSON — see the skill for the accepted shapes, or array or string |
1794
2133
  | `gravity` | `0` | number |
1795
2134
 
1796
- Methods: `aim(direction?)`
2135
+ Methods: `aim(direction?, carry?)`
1797
2136
 
1798
2137
  ### `SavePoint`
1799
2138
 
@@ -1806,10 +2145,11 @@ Methods: `aim(direction?)`
1806
2145
  | `scene` | `""` | string |
1807
2146
  | `restoreOnReady` | `false` | boolean |
1808
2147
  | `probeOnReady` | `false` | boolean |
2148
+ | `keep` | `[]` | node path |
1809
2149
 
1810
2150
  Signals: `saved` · `saveFailed` · `restored` · `noSave` · `hasSave`
1811
2151
 
1812
- Methods: `probe()` · `slotScene()` · `save()` · `restore()` · `clear()`
2152
+ Methods: `probe()` · `slotScene()` · `save()` · `restore()` · `clear()` · `announce()`
1813
2153
 
1814
2154
  Reads: `playtime: number`
1815
2155
 
@@ -1828,6 +2168,41 @@ Methods: `addScore(n)` · `setScore(value)` · `loseLife()` · `announce()`
1828
2168
 
1829
2169
  Reads: `won: boolean` · `lost: boolean`
1830
2170
 
2171
+ ### `Shatter`
2172
+
2173
+ | Prop | Default | Kind |
2174
+ |---|---|---|
2175
+ | `enabled` | `true` | boolean |
2176
+ | `pieces` | `8` | number |
2177
+ | `impulse` | `4` | number |
2178
+ | `spin` | `6` | number |
2179
+ | `lifetime` | `2.5` | number |
2180
+ | `when` | `"died"` | string |
2181
+ | `mesh` | `""` | node path |
2182
+ | `free` | `true` | boolean |
2183
+
2184
+ Signals: `shattered`
2185
+
2186
+ Methods: `break()`
2187
+
2188
+ ### `Sight`
2189
+
2190
+ | Prop | Default | Kind |
2191
+ |---|---|---|
2192
+ | `enabled` | `true` | boolean |
2193
+ | `range` | `12` | number |
2194
+ | `coneDeg` | `70` | number |
2195
+ | `targetGroup` | `"player"` | string |
2196
+ | `facingPath` | `"../Skin"` | node path |
2197
+ | `eyeHeight` | `0.6` | number |
2198
+ | `chestHeight` | `0.3` | number |
2199
+ | `fillSeconds` | `0` | number |
2200
+ | `los` | `true` | boolean |
2201
+
2202
+ Signals: `spotted` · `lost`
2203
+
2204
+ Methods: `sees(node)` · `seen()`
2205
+
1831
2206
  ### `Spawner`
1832
2207
 
1833
2208
  | Prop | Default | Kind |
@@ -1853,12 +2228,14 @@ Reads: `liveCount: number`
1853
2228
  |---|---|---|
1854
2229
  | `enabled` | `true` | boolean |
1855
2230
  | `targetGroup` | `"enemy"` | string |
2231
+ | `requireSight` | `false` | boolean |
1856
2232
  | `range` | `6` | number |
1857
2233
  | `damage` | `10` | number |
1858
2234
  | `cooldown` | `0.6` | number |
1859
2235
  | `shelf` | `""` | node path |
1860
2236
  | `prefab` | `""` | string |
1861
2237
  | `muzzle` | `[]` | array |
2238
+ | `arc` | `"flat"` | one of: `flat` `low` `high` |
1862
2239
  | `into` | `""` | node path |
1863
2240
  | `facePath` | `""` | node path |
1864
2241
  | `turnSpeed` | `100` | number |