incanto 0.66.0 → 0.68.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 (96) hide show
  1. package/bin/_behaviors-loader.mjs +87 -0
  2. package/bin/_pick-server.mjs +48 -0
  3. package/bin/incanto-check.mjs +16 -2
  4. package/bin/incanto-editor.mjs +39 -2
  5. package/bin/incanto-feel.mjs +4 -1
  6. package/bin/incanto-frame.mjs +37 -3
  7. package/bin/incanto-logs.mjs +23 -3
  8. package/bin/incanto-multiplay.mjs +50 -1
  9. package/bin/incanto-play.mjs +3 -1
  10. package/bin/incanto-playtest.mjs +3 -25
  11. package/bin/incanto-verify.mjs +15 -2
  12. package/dist/2d.d.ts +44 -7
  13. package/dist/2d.js +6 -4
  14. package/dist/3d.d.ts +112 -16
  15. package/dist/3d.js +8 -6
  16. package/dist/{audio-player-_UAcHxnC.d.ts → audio-player-DOrq7sP-.d.ts} +62 -4
  17. package/dist/{behavior-BXNLfIJk.d.ts → behavior-DoFPYrgo.d.ts} +117 -2
  18. package/dist/boot-failure-CKYrEcGF.js +47 -0
  19. package/dist/{create-game-DYJCIzO0.js → create-game-DbWtVTxD.js} +91 -29
  20. package/dist/{create-game-Dd7H4bJV.js → create-game-IZIydDwI.js} +16 -10
  21. package/dist/debug.d.ts +1 -1
  22. package/dist/debug.js +3 -2
  23. package/dist/{duplicate-CqSAtdrh.js → duplicate-IWIqk0HJ.js} +1 -1
  24. package/dist/{editor-switch-DAvWQeld.d.ts → editor-switch-CnIOiyNJ.d.ts} +1 -1
  25. package/dist/editor.js +18 -7
  26. package/dist/env.d.ts +1 -1
  27. package/dist/{environment-presets-BlPsEmq6.js → environment-presets-CybQXNqS.js} +100 -11
  28. package/dist/{gameplay-D1RADWu3.js → gameplay-DM1eu_cV.js} +46 -5
  29. package/dist/gameplay.d.ts +75 -6
  30. package/dist/gameplay.js +2 -2
  31. package/dist/index.d.ts +52 -8
  32. package/dist/index.js +9 -7
  33. package/dist/{loader-lQDCwNag.js → loader-BC4PNtJX.js} +173 -1
  34. package/dist/{loader-Cga7FVP4.d.ts → loader-CcB533FR.d.ts} +2 -2
  35. package/dist/net.d.ts +2 -2
  36. package/dist/net.js +1 -1
  37. package/dist/{physics-2d-Cji5A6sX.js → physics-2d-B7Y6dPZO.js} +29 -2
  38. package/dist/{physics-3d-BkHjwJgI.js → physics-3d-bG3n70Ky.js} +30 -3
  39. package/dist/react.d.ts +2 -2
  40. package/dist/react.js +1 -1
  41. package/dist/{register-BmuqYTiY.js → register-3ta-2Xig.js} +148 -22
  42. package/dist/{register-D0CxCveZ.js → register-ibCjm-wH.js} +3 -3
  43. package/dist/{replay-IsZbNu6d.js → replay-CYvhVHHN.js} +28 -4
  44. package/dist/{replay-BHoB6fCU.d.ts → replay-Dvn8aeBd.d.ts} +38 -4
  45. package/dist/{schema-CFeioQRE.d.ts → schema-B6ugCV1Q.d.ts} +11 -0
  46. package/dist/{split-screen-D_i7GRcY.js → split-screen-CYwDkbLF.js} +2 -2
  47. package/dist/{split-screen-eJUFjhi1.d.ts → split-screen-DhrSzZIB.d.ts} +3 -3
  48. package/dist/{src-BTLbXFPZ.js → src-D7RIqXYF.js} +1 -1
  49. package/dist/{teardown-byR9USax.js → teardown-D2NEmxPB.js} +2 -2
  50. package/dist/{test-DgrD0jHD.js → test-8hoHeRmo.js} +140 -32
  51. package/dist/test.d.ts +9 -7
  52. package/dist/test.js +3 -3
  53. package/dist/{touch-DESwnpOc.js → touch-DEAmqGdf.js} +30 -186
  54. package/dist/vite.d.ts +0 -7
  55. package/dist/vite.js +13 -3
  56. package/dist/webgl-unavailable-N9nQqesw.js +228 -0
  57. package/editor/assets/{agent8-9N-Pd_YS.js → agent8-BrrHOjMJ.js} +1 -1
  58. package/editor/assets/debug-BBhKuBNV.js +3 -0
  59. package/editor/assets/{index-CeDhIPTC.js → index-eVd0BToA.js} +92 -92
  60. package/editor/index.html +1 -1
  61. package/package.json +1 -1
  62. package/schemas/scene.schema.json +5 -1
  63. package/skills/incanto-3d-character.md +1 -0
  64. package/skills/incanto-audio.md +49 -0
  65. package/skills/incanto-building-2d-games.md +37 -0
  66. package/skills/incanto-building-3d-games.md +56 -0
  67. package/skills/incanto-editor.md +5 -1
  68. package/skills/incanto-environment.md +2 -2
  69. package/skills/incanto-gameplay-behaviors.md +29 -2
  70. package/skills/incanto-hud.md +14 -1
  71. package/skills/incanto-multiplayer.md +14 -0
  72. package/skills/incanto-node-reference.md +2 -1
  73. package/skills/incanto-performance.md +35 -0
  74. package/skills/incanto-physics-and-input.md +23 -0
  75. package/skills/incanto-playtesting.md +15 -1
  76. package/skills/incanto-save-slots.md +21 -1
  77. package/skills/incanto-scene-json-authoring.md +12 -1
  78. package/skills/incanto-verifying-your-game.md +19 -0
  79. package/skills/incanto-your-first-game.md +4 -4
  80. package/templates-app/beacon-isle-3d/package.json +1 -1
  81. package/templates-app/beacon-isle-3d/src/game.scene.json +38 -19
  82. package/templates-app/beacon-isle-3d/src/main.ts +8 -1
  83. package/templates-app/platformer-2d/package.json +1 -1
  84. package/templates-app/platformer-2d/src/game.scene.json +99 -53
  85. package/templates-app/platformer-2d/src/main.ts +8 -1
  86. package/templates-app/star-survivor/package.json +1 -1
  87. package/templates-app/star-survivor/src/game.scene.json +31 -17
  88. package/templates-app/star-survivor/src/main.ts +8 -1
  89. package/templates-app/tps-3d/package.json +1 -1
  90. package/templates-app/tps-3d/src/game.scene.json +14 -8
  91. package/templates-app/tps-3d/src/main.ts +8 -1
  92. package/templates-app/village-quest-3d/package.json +1 -1
  93. package/templates-app/village-quest-3d/src/grove.scene.json +20 -11
  94. package/templates-app/village-quest-3d/src/main.ts +8 -1
  95. package/templates-app/village-quest-3d/src/village.scene.json +10 -7
  96. package/editor/assets/debug-CkbJICYp.js +0 -3
@@ -122,7 +122,8 @@
122
122
  "props": {
123
123
  "pausePanelPath": "%PauseMenu"
124
124
  }
125
- }
125
+ },
126
+ "uid": "n_59r4gykhbcuemdgu"
126
127
  },
127
128
  {
128
129
  "name": "Terrain",
@@ -1605,7 +1606,8 @@
1605
1606
  "volume": 0.5
1606
1607
  }
1607
1608
  }
1608
- ]
1609
+ ],
1610
+ "uid": "n_z47j96sgcxut952d"
1609
1611
  },
1610
1612
  {
1611
1613
  "name": "Ward1",
@@ -1973,7 +1975,8 @@
1973
1975
  "oncePerTarget": false,
1974
1976
  "repeatEvery": 1.2
1975
1977
  }
1976
- }
1978
+ },
1979
+ "uid": "n_z8vhukdcirpi88je"
1977
1980
  },
1978
1981
  {
1979
1982
  "name": "HissSfx",
@@ -1987,7 +1990,8 @@
1987
1990
  "maxDistance": 30
1988
1991
  }
1989
1992
  }
1990
- ]
1993
+ ],
1994
+ "uid": "n_n468rqi1ozzm61uu"
1991
1995
  },
1992
1996
  {
1993
1997
  "name": "Shade1_2",
@@ -2091,7 +2095,8 @@
2091
2095
  "oncePerTarget": false,
2092
2096
  "repeatEvery": 1.2
2093
2097
  }
2094
- }
2098
+ },
2099
+ "uid": "n_bq1hz55sxw1i1im1"
2095
2100
  },
2096
2101
  {
2097
2102
  "name": "HissSfx",
@@ -2105,7 +2110,8 @@
2105
2110
  "maxDistance": 30
2106
2111
  }
2107
2112
  }
2108
- ]
2113
+ ],
2114
+ "uid": "n_ny13372zziqzgpom"
2109
2115
  },
2110
2116
  {
2111
2117
  "name": "Shade2_1",
@@ -2209,7 +2215,8 @@
2209
2215
  "oncePerTarget": false,
2210
2216
  "repeatEvery": 1.2
2211
2217
  }
2212
- }
2218
+ },
2219
+ "uid": "n_y9jsyb615rpdggas"
2213
2220
  },
2214
2221
  {
2215
2222
  "name": "HissSfx",
@@ -2223,7 +2230,8 @@
2223
2230
  "maxDistance": 30
2224
2231
  }
2225
2232
  }
2226
- ]
2233
+ ],
2234
+ "uid": "n_r53mg0r2ctvvkvjj"
2227
2235
  },
2228
2236
  {
2229
2237
  "name": "Shade2_2",
@@ -2327,7 +2335,8 @@
2327
2335
  "oncePerTarget": false,
2328
2336
  "repeatEvery": 1.2
2329
2337
  }
2330
- }
2338
+ },
2339
+ "uid": "n_fg4pcm0kcpbzpqui"
2331
2340
  },
2332
2341
  {
2333
2342
  "name": "HissSfx",
@@ -2341,7 +2350,8 @@
2341
2350
  "maxDistance": 30
2342
2351
  }
2343
2352
  }
2344
- ]
2353
+ ],
2354
+ "uid": "n_y5kshgw9213y7eeo"
2345
2355
  },
2346
2356
  {
2347
2357
  "name": "Shade3_1",
@@ -2445,7 +2455,8 @@
2445
2455
  "oncePerTarget": false,
2446
2456
  "repeatEvery": 1.2
2447
2457
  }
2448
- }
2458
+ },
2459
+ "uid": "n_l9e6uonnlyg7m16w"
2449
2460
  },
2450
2461
  {
2451
2462
  "name": "HissSfx",
@@ -2459,7 +2470,8 @@
2459
2470
  "maxDistance": 30
2460
2471
  }
2461
2472
  }
2462
- ]
2473
+ ],
2474
+ "uid": "n_ojzy1ypkshyepyvy"
2463
2475
  },
2464
2476
  {
2465
2477
  "name": "Shade3_2",
@@ -2563,7 +2575,8 @@
2563
2575
  "oncePerTarget": false,
2564
2576
  "repeatEvery": 1.2
2565
2577
  }
2566
- }
2578
+ },
2579
+ "uid": "n_7xn82zimw6skfh3j"
2567
2580
  },
2568
2581
  {
2569
2582
  "name": "HissSfx",
@@ -2577,7 +2590,8 @@
2577
2590
  "maxDistance": 30
2578
2591
  }
2579
2592
  }
2580
- ]
2593
+ ],
2594
+ "uid": "n_l5g65a25w1r2yvby"
2581
2595
  },
2582
2596
  {
2583
2597
  "name": "Player",
@@ -2622,7 +2636,8 @@
2622
2636
  },
2623
2637
  "script": {
2624
2638
  "name": "SwordStrike"
2625
- }
2639
+ },
2640
+ "uid": "n_cyhj8t0qy5t3k94v"
2626
2641
  },
2627
2642
  {
2628
2643
  "name": "Skin",
@@ -2727,7 +2742,8 @@
2727
2742
  "nightDarkness": 0.32,
2728
2743
  "maxSunElevationDeg": 48
2729
2744
  }
2730
- }
2745
+ },
2746
+ "uid": "n_v447j9q4dnw2gwtj"
2731
2747
  },
2732
2748
  {
2733
2749
  "name": "Boss",
@@ -2878,7 +2894,8 @@
2878
2894
  "oncePerTarget": false,
2879
2895
  "repeatEvery": 1.5
2880
2896
  }
2881
- }
2897
+ },
2898
+ "uid": "n_sfo65nky8me2m1lr"
2882
2899
  },
2883
2900
  {
2884
2901
  "name": "RoarSfx",
@@ -2892,7 +2909,8 @@
2892
2909
  "maxDistance": 90
2893
2910
  }
2894
2911
  }
2895
- ]
2912
+ ],
2913
+ "uid": "n_er3epyju7e5xopzg"
2896
2914
  },
2897
2915
  {
2898
2916
  "name": "Camera",
@@ -2997,7 +3015,8 @@
2997
3015
  }
2998
3016
  ]
2999
3017
  }
3000
- ]
3018
+ ],
3019
+ "uid": "n_ndhsdrkhi26aksvr"
3001
3020
  },
3002
3021
  "connections": [
3003
3022
  {
@@ -6,7 +6,7 @@
6
6
  * world with `bun run world`, the game logic never changes.
7
7
  */
8
8
  import { assetUrls, preloadUrls } from 'incanto';
9
- import { createGame3D } from 'incanto/3d';
9
+ import { createGame3D, showBootFailure } from 'incanto/3d';
10
10
  import { BEHAVIORS } from './behaviors';
11
11
  import gameJson from './game.scene.json';
12
12
 
@@ -25,6 +25,13 @@ const game = await createGame3D({
25
25
  scene: gameJson,
26
26
  behaviors: BEHAVIORS,
27
27
  pointer: true,
28
+ }).catch((e) => {
29
+ // Without this the player watches the loading overlay sit at 100% forever:
30
+ // `#loading` is removed on the line below, so anything that rejects here (no
31
+ // WebGL context, a scene that will not load) leaves the bar up and the reason
32
+ // in a console nobody opens.
33
+ showBootFailure(e);
34
+ throw e;
28
35
  });
29
36
 
30
37
  document.querySelector('#loading')?.remove();
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@dimforge/rapier2d-compat": "0.19.3",
14
- "incanto": "^0.66.0",
14
+ "incanto": "^0.68.0",
15
15
  "three": "^0.184.0"
16
16
  },
17
17
  "devDependencies": {
@@ -37,7 +37,7 @@
37
37
  "frameWidth": 192,
38
38
  "frameHeight": 192,
39
39
  "filter": "nearest",
40
- "source": "built-in catalog 'medieval-knight' \u2014 idle 0-5, move 6-11, attack 12-17. URL injected in main.ts so the art ships with the package."
40
+ "source": "built-in catalog 'medieval-knight' — idle 0-5, move 6-11, attack 12-17. URL injected in main.ts so the art ships with the package."
41
41
  },
42
42
  "goblin": {
43
43
  "type": "spritesheet",
@@ -45,19 +45,19 @@
45
45
  "frameWidth": 192,
46
46
  "frameHeight": 192,
47
47
  "filter": "nearest",
48
- "source": "built-in catalog 'goblin' \u2014 idle 0-6, move 7-12. URL injected in main.ts."
48
+ "source": "built-in catalog 'goblin' — idle 0-6, move 7-12. URL injected in main.ts."
49
49
  },
50
50
  "coin": {
51
51
  "type": "texture",
52
52
  "url": "incanto/assets/items/coin.png",
53
53
  "filter": "nearest",
54
- "source": "built-in catalog 'coin' \u2014 gold collectible. URL injected in main.ts."
54
+ "source": "built-in catalog 'coin' — gold collectible. URL injected in main.ts."
55
55
  },
56
56
  "gem": {
57
57
  "type": "texture",
58
58
  "url": "incanto/assets/items/gem.png",
59
59
  "filter": "nearest",
60
- "source": "built-in catalog 'gem' \u2014 valuable collectible. URL injected in main.ts."
60
+ "source": "built-in catalog 'gem' — valuable collectible. URL injected in main.ts."
61
61
  }
62
62
  },
63
63
  "root": {
@@ -86,7 +86,8 @@
86
86
  "props": {
87
87
  "factor": 0.96
88
88
  }
89
- }
89
+ },
90
+ "uid": "n_8s4fwe02mmjaf6o4"
90
91
  },
91
92
  {
92
93
  "name": "Sun",
@@ -103,7 +104,8 @@
103
104
  "props": {
104
105
  "factor": 0.94
105
106
  }
106
- }
107
+ },
108
+ "uid": "n_io1e5nqi1q9p0aor"
107
109
  },
108
110
  {
109
111
  "name": "Cloud1",
@@ -121,7 +123,8 @@
121
123
  "props": {
122
124
  "factor": 0.9
123
125
  }
124
- }
126
+ },
127
+ "uid": "n_u9sglddcy0spenib"
125
128
  },
126
129
  {
127
130
  "name": "Cloud2",
@@ -139,7 +142,8 @@
139
142
  "props": {
140
143
  "factor": 0.9
141
144
  }
142
- }
145
+ },
146
+ "uid": "n_oeoy2ytk9y8tfqal"
143
147
  },
144
148
  {
145
149
  "name": "Cloud3",
@@ -157,7 +161,8 @@
157
161
  "props": {
158
162
  "factor": 0.9
159
163
  }
160
- }
164
+ },
165
+ "uid": "n_glne90a03zy5os5g"
161
166
  },
162
167
  {
163
168
  "name": "CastleFarLayer",
@@ -263,7 +268,8 @@
263
268
  "anchor": [0.5, 0.5]
264
269
  }
265
270
  }
266
- ]
271
+ ],
272
+ "uid": "n_z5d947phu1kzc1n9"
267
273
  },
268
274
  {
269
275
  "name": "CastleNearLayer",
@@ -539,7 +545,8 @@
539
545
  "anchor": [0.5, 0.5]
540
546
  }
541
547
  }
542
- ]
548
+ ],
549
+ "uid": "n_y8xgx8pdy46yi5zb"
543
550
  },
544
551
  {
545
552
  "name": "GroundA",
@@ -827,7 +834,8 @@
827
834
  "color": "#ffd166"
828
835
  }
829
836
  }
830
- ]
837
+ ],
838
+ "uid": "n_sf07oapcipaog0b6"
831
839
  },
832
840
  {
833
841
  "name": "Lift",
@@ -867,7 +875,8 @@
867
875
  "color": "#ffd166"
868
876
  }
869
877
  }
870
- ]
878
+ ],
879
+ "uid": "n_vfuh862g8bfg7swp"
871
880
  },
872
881
  {
873
882
  "name": "Spikes1",
@@ -1041,9 +1050,11 @@
1041
1050
  "type": "Node2D",
1042
1051
  "script": {
1043
1052
  "name": "GoblinSkin"
1044
- }
1053
+ },
1054
+ "uid": "n_uuc954ct6jzjzzlp"
1045
1055
  }
1046
- ]
1056
+ ],
1057
+ "uid": "n_e7bhbakm4c5z78w2"
1047
1058
  },
1048
1059
  {
1049
1060
  "name": "Gob2",
@@ -1088,9 +1099,11 @@
1088
1099
  "type": "Node2D",
1089
1100
  "script": {
1090
1101
  "name": "GoblinSkin"
1091
- }
1102
+ },
1103
+ "uid": "n_ujbgnk7ixsicswwc"
1092
1104
  }
1093
- ]
1105
+ ],
1106
+ "uid": "n_x7fy5n98xwc5stmz"
1094
1107
  },
1095
1108
  {
1096
1109
  "name": "Gob3",
@@ -1135,9 +1148,11 @@
1135
1148
  "type": "Node2D",
1136
1149
  "script": {
1137
1150
  "name": "GoblinSkin"
1138
- }
1151
+ },
1152
+ "uid": "n_3kmb1qlhckw4xnhz"
1139
1153
  }
1140
- ]
1154
+ ],
1155
+ "uid": "n_zrfw1p1gamdfhg6u"
1141
1156
  },
1142
1157
  {
1143
1158
  "name": "Coins",
@@ -1179,9 +1194,11 @@
1179
1194
  "frequency": 1.1,
1180
1195
  "mode": "position"
1181
1196
  }
1182
- }
1197
+ },
1198
+ "uid": "n_5vv5sh2bce9a0rfc"
1183
1199
  }
1184
- ]
1200
+ ],
1201
+ "uid": "n_wq8d9ugbrst7vpg8"
1185
1202
  },
1186
1203
  {
1187
1204
  "name": "Coin2",
@@ -1216,9 +1233,11 @@
1216
1233
  "frequency": 1.1,
1217
1234
  "mode": "position"
1218
1235
  }
1219
- }
1236
+ },
1237
+ "uid": "n_6nl39pc8x81zzfvz"
1220
1238
  }
1221
- ]
1239
+ ],
1240
+ "uid": "n_xopvplhty8l2ydcl"
1222
1241
  },
1223
1242
  {
1224
1243
  "name": "Coin3",
@@ -1253,9 +1272,11 @@
1253
1272
  "frequency": 1.1,
1254
1273
  "mode": "position"
1255
1274
  }
1256
- }
1275
+ },
1276
+ "uid": "n_pieptsthsss398x8"
1257
1277
  }
1258
- ]
1278
+ ],
1279
+ "uid": "n_2h6mru0fxp39x70o"
1259
1280
  },
1260
1281
  {
1261
1282
  "name": "Coin4",
@@ -1290,9 +1311,11 @@
1290
1311
  "frequency": 1.1,
1291
1312
  "mode": "position"
1292
1313
  }
1293
- }
1314
+ },
1315
+ "uid": "n_m5ye4ukey1gs9ri5"
1294
1316
  }
1295
- ]
1317
+ ],
1318
+ "uid": "n_du6tra9442zrc8tx"
1296
1319
  },
1297
1320
  {
1298
1321
  "name": "Coin5",
@@ -1327,9 +1350,11 @@
1327
1350
  "frequency": 1.1,
1328
1351
  "mode": "position"
1329
1352
  }
1330
- }
1353
+ },
1354
+ "uid": "n_mq7njocxg7qlw3dx"
1331
1355
  }
1332
- ]
1356
+ ],
1357
+ "uid": "n_uu6i3uwtlzsh1vft"
1333
1358
  },
1334
1359
  {
1335
1360
  "name": "Coin6",
@@ -1364,9 +1389,11 @@
1364
1389
  "frequency": 1.1,
1365
1390
  "mode": "position"
1366
1391
  }
1367
- }
1392
+ },
1393
+ "uid": "n_zj0kivs2h857q5e7"
1368
1394
  }
1369
- ]
1395
+ ],
1396
+ "uid": "n_tp127zrp3ch4b25i"
1370
1397
  },
1371
1398
  {
1372
1399
  "name": "Coin7",
@@ -1401,9 +1428,11 @@
1401
1428
  "frequency": 1.1,
1402
1429
  "mode": "position"
1403
1430
  }
1404
- }
1431
+ },
1432
+ "uid": "n_joega2rmwl1i2d6d"
1405
1433
  }
1406
- ]
1434
+ ],
1435
+ "uid": "n_cd5iiio55efypp8v"
1407
1436
  },
1408
1437
  {
1409
1438
  "name": "Coin8",
@@ -1438,9 +1467,11 @@
1438
1467
  "frequency": 1.1,
1439
1468
  "mode": "position"
1440
1469
  }
1441
- }
1470
+ },
1471
+ "uid": "n_zr79uqirzpuftjxx"
1442
1472
  }
1443
- ]
1473
+ ],
1474
+ "uid": "n_61i9ty82m2dxshpo"
1444
1475
  },
1445
1476
  {
1446
1477
  "name": "Coin9",
@@ -1475,9 +1506,11 @@
1475
1506
  "frequency": 1.1,
1476
1507
  "mode": "position"
1477
1508
  }
1478
- }
1509
+ },
1510
+ "uid": "n_3umxgv0yreehqbs6"
1479
1511
  }
1480
- ]
1512
+ ],
1513
+ "uid": "n_kiwir1wrpzuwzvg7"
1481
1514
  },
1482
1515
  {
1483
1516
  "name": "Coin10",
@@ -1512,9 +1545,11 @@
1512
1545
  "frequency": 1.1,
1513
1546
  "mode": "position"
1514
1547
  }
1515
- }
1548
+ },
1549
+ "uid": "n_rhmo04zqmdtg5tvi"
1516
1550
  }
1517
- ]
1551
+ ],
1552
+ "uid": "n_oj1mt1w1k2969kvc"
1518
1553
  },
1519
1554
  {
1520
1555
  "name": "Coin11",
@@ -1549,9 +1584,11 @@
1549
1584
  "frequency": 1.1,
1550
1585
  "mode": "position"
1551
1586
  }
1552
- }
1587
+ },
1588
+ "uid": "n_xuclkqerz63mv8vb"
1553
1589
  }
1554
- ]
1590
+ ],
1591
+ "uid": "n_o7bgy9m9u8rasljg"
1555
1592
  },
1556
1593
  {
1557
1594
  "name": "Coin12",
@@ -1586,9 +1623,11 @@
1586
1623
  "frequency": 1.1,
1587
1624
  "mode": "position"
1588
1625
  }
1589
- }
1626
+ },
1627
+ "uid": "n_uuegetn54zqs9bof"
1590
1628
  }
1591
- ]
1629
+ ],
1630
+ "uid": "n_hxub1s4s6cgvredd"
1592
1631
  }
1593
1632
  ]
1594
1633
  },
@@ -1625,9 +1664,11 @@
1625
1664
  "frequency": 0.9,
1626
1665
  "mode": "position"
1627
1666
  }
1628
- }
1667
+ },
1668
+ "uid": "n_vqc3id2780ba623r"
1629
1669
  }
1630
- ]
1670
+ ],
1671
+ "uid": "n_6a6rs0myo1q0rlxe"
1631
1672
  },
1632
1673
  {
1633
1674
  "name": "Gem2",
@@ -1662,9 +1703,11 @@
1662
1703
  "frequency": 0.9,
1663
1704
  "mode": "position"
1664
1705
  }
1665
- }
1706
+ },
1707
+ "uid": "n_jnnqf3j7hygbeoaj"
1666
1708
  }
1667
- ]
1709
+ ],
1710
+ "uid": "n_s022vg0kuqj75it6"
1668
1711
  },
1669
1712
  {
1670
1713
  "name": "Player",
@@ -1720,7 +1763,8 @@
1720
1763
  }
1721
1764
  }
1722
1765
  }
1723
- ]
1766
+ ],
1767
+ "uid": "n_h5em8g8jljkl2xtq"
1724
1768
  },
1725
1769
  {
1726
1770
  "name": "Camera",
@@ -1736,7 +1780,8 @@
1736
1780
  "lookahead": 90,
1737
1781
  "limits": [480, 210, 2320, 348]
1738
1782
  }
1739
- }
1783
+ },
1784
+ "uid": "n_9shnryenkaqcr3l2"
1740
1785
  },
1741
1786
  {
1742
1787
  "name": "SfxJump",
@@ -1816,7 +1861,7 @@
1816
1861
  "type": "Label",
1817
1862
  "props": {
1818
1863
  "position": [20, 30],
1819
- "text": "\u25c6 0",
1864
+ "text": "◆ 0",
1820
1865
  "fontSize": 26,
1821
1866
  "color": "#ffd166"
1822
1867
  }
@@ -1826,7 +1871,7 @@
1826
1871
  "type": "Label",
1827
1872
  "props": {
1828
1873
  "position": [20, 64],
1829
- "text": "\u2665\u2665\u2665",
1874
+ "text": "♥♥♥",
1830
1875
  "fontSize": 26,
1831
1876
  "color": "#ff6b81"
1832
1877
  }
@@ -1846,12 +1891,13 @@
1846
1891
  "type": "Label",
1847
1892
  "props": {
1848
1893
  "position": [20, 100],
1849
- "text": "A/D run \u00b7 Space jump (double-jump!) \u00b7 stomp goblins \u00b7 reach the gold flag",
1894
+ "text": "A/D run · Space jump (double-jump!) · stomp goblins · reach the gold flag",
1850
1895
  "fontSize": 15,
1851
1896
  "color": "#1d2a44"
1852
1897
  }
1853
1898
  }
1854
- ]
1899
+ ],
1900
+ "uid": "n_ng718r3uiw1madux"
1855
1901
  },
1856
1902
  {
1857
1903
  "name": "BannerLayer",
@@ -14,7 +14,7 @@
14
14
  * height/stomp/knockback/checkpoint-respawn/platform-carry), GoblinSkin,
15
15
  * FollowCam (follow + screen-shake), ParallaxLayer, HudUpdater.
16
16
  */
17
- import { createGame2D } from 'incanto/2d';
17
+ import { createGame2D, showBootFailure } from 'incanto/2d';
18
18
  import goblinUrl from 'incanto/assets/characters/goblin.png';
19
19
  // Built-in sprite art ships in the package — import the URLs and inject them into
20
20
  // the scene's asset placeholders before boot (the engine clones the scene).
@@ -49,6 +49,13 @@ const game = await createGame2D({
49
49
  canvas,
50
50
  scene,
51
51
  behaviors,
52
+ }).catch((e) => {
53
+ // Without this the player watches the loading overlay sit at 100% forever:
54
+ // `#loading` is removed on the line below, so anything that rejects here (no
55
+ // WebGL context, a scene that will not load) leaves the bar up and the reason
56
+ // in a console nobody opens.
57
+ showBootFailure(e);
58
+ throw e;
52
59
  });
53
60
 
54
61
  document.querySelector('#loading')?.remove();
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@dimforge/rapier2d-compat": "0.19.3",
14
- "incanto": "^0.66.0",
14
+ "incanto": "^0.68.0",
15
15
  "three": "^0.184.0"
16
16
  },
17
17
  "devDependencies": {