incanto 0.40.1 → 0.41.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.
- package/dist/2d.js +3 -3
- package/dist/3d.js +3 -3
- package/dist/{create-game-B7c5icho.js → create-game-CZpENyin.js} +3 -3
- package/dist/{create-game-p-O66Y_U.js → create-game-u7TDbvln.js} +3 -3
- package/dist/debug.d.ts +35 -1
- package/dist/debug.js +183 -2
- package/dist/{environment-presets-CIZXGKnS.js → environment-presets-pGTHb_V4.js} +1 -1
- package/dist/index.js +3 -3
- package/dist/net.js +2 -2
- package/dist/{physics-2d-CxIqR1cW.js → physics-2d-CEnZFcpM.js} +1 -1
- package/dist/{physics-3d-CgIHivyL.js → physics-3d-CumBBvQo.js} +1 -1
- package/dist/react.js +1 -1
- package/dist/{register-D5v8iqjZ.js → register-DnycZ91Q.js} +1 -1
- package/dist/{register-DMFJI-c_.js → register-DuTlY56W.js} +2 -0
- package/dist/{register-CgMO5JBY.js → register-MSZvnHkp.js} +1 -1
- package/dist/{replay-D_QY5Xm3.js → replay-DcWg4LT5.js} +1 -1
- package/dist/{test-DUrGse_6.js → test-B4kSwQzq.js} +9 -9
- package/dist/test.js +2 -2
- package/dist/vite.js +1 -1
- package/editor/assets/{agent8-CFq3LMrx.js → agent8-DCHkff44.js} +1 -1
- package/editor/assets/debug-uHHxqj0a.js +3 -0
- package/editor/assets/{index-CRwy6mq9.js → index-i1mIkyMA.js} +3 -3
- package/editor/index.html +1 -1
- package/package.json +1 -1
- package/skills/incanto-verifying-your-game.md +19 -2
- package/templates-app/beacon-isle-3d/package.json +1 -1
- package/templates-app/tps-3d/package.json +1 -1
- package/templates-app/village-quest-3d/package.json +1 -1
- package/editor/assets/debug-C2aomumK.js +0 -3
package/dist/2d.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
2
|
-
import { a as AssetStore2D, i as syncTree2D, r as Renderer2D, t as createGame2D } from "./create-game-
|
|
3
|
-
import { _ as RigidBody2D, a as parseCells, c as ColorRect2D, d as AnimatedSprite2D, f as Sprite2D, g as PhysicsBody2D, h as CharacterBody2D, i as mergeSolidRects, l as CharacterController2D, m as Area2D, n as UILayer, o as Particles2D, p as Joint2D, r as TileMap2D, s as Label, t as registerNodes2D, u as Camera2D, v as StaticBody2D, y as Node2D } from "./register-
|
|
4
|
-
import { n as enablePhysics2D, t as Physics2D } from "./physics-2d-
|
|
2
|
+
import { a as AssetStore2D, i as syncTree2D, r as Renderer2D, t as createGame2D } from "./create-game-CZpENyin.js";
|
|
3
|
+
import { _ as RigidBody2D, a as parseCells, c as ColorRect2D, d as AnimatedSprite2D, f as Sprite2D, g as PhysicsBody2D, h as CharacterBody2D, i as mergeSolidRects, l as CharacterController2D, m as Area2D, n as UILayer, o as Particles2D, p as Joint2D, r as TileMap2D, s as Label, t as registerNodes2D, u as Camera2D, v as StaticBody2D, y as Node2D } from "./register-MSZvnHkp.js";
|
|
4
|
+
import { n as enablePhysics2D, t as Physics2D } from "./physics-2d-CEnZFcpM.js";
|
|
5
5
|
//#region src/2d/library-sprite.ts
|
|
6
6
|
/**
|
|
7
7
|
* Turn a library sprite-animation JSON into a scene-ready spritesheet asset
|
package/dist/3d.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { A as Water3D, F as PhysicsBody3D, I as RigidBody3D, L as StaticBody3D, M as WaterCutout3D, N as Area3D, P as CharacterBody3D, R as Node3D, V as WATER_MAX_RIPPLES, j as WATER_CUTOUT_MAX } from "./gameplay-By8mslMc.js";
|
|
2
|
-
import { A as Terrain3D, B as keyboardIntensity, C as resolveFlowerDensity, D as BoneLookAt3D, E as Camera3D, F as InstancedMesh3D, G as acquireTexture, H as rigPose, I as MeshInstance3D, M as TERRAIN_THEMES, N as terrainThemeLayers, O as BoneAttachment3D, P as Joint3D, R as QUARTER_PITCH, S as Flowers3D, T as CharacterController3D, U as TextureCache3D, V as movementState, W as acquireOwnTexture, _ as LoftMesh3D, a as Tree3D, b as Foliage3D, c as buildRiverRings, d as riverCarveChannels, f as riverStepFor, g as ModelInstance3D, h as Particles3D, i as VoxelGrid3D, j as DEFAULT_TERRAIN_TEXTURE_BASE, k as Billboard3D, l as findRiverCoverageGaps, m as traceDownhillPath, n as registerNodes3D, o as Trail3D, p as smoothCourse, r as VOXEL_PALETTE, s as River3D, u as projectToRiver, v as DirectionalLight3D, w as FLOWER_VARIETIES, x as DENSITY_PRESETS, y as OmniLight3D, z as cameraRelative } from "./environment-presets-
|
|
3
|
-
import { a as Environment3D, c as parseEnvironment3D, d as AssetStore3D, i as syncTree, l as sunDirectionFromElevationAzimuth, o as setEnvironment3D, r as Renderer3D, s as horizonColorFromSky, t as createGame3D, u as sunDirectionFromSky } from "./create-game-
|
|
2
|
+
import { A as Terrain3D, B as keyboardIntensity, C as resolveFlowerDensity, D as BoneLookAt3D, E as Camera3D, F as InstancedMesh3D, G as acquireTexture, H as rigPose, I as MeshInstance3D, M as TERRAIN_THEMES, N as terrainThemeLayers, O as BoneAttachment3D, P as Joint3D, R as QUARTER_PITCH, S as Flowers3D, T as CharacterController3D, U as TextureCache3D, V as movementState, W as acquireOwnTexture, _ as LoftMesh3D, a as Tree3D, b as Foliage3D, c as buildRiverRings, d as riverCarveChannels, f as riverStepFor, g as ModelInstance3D, h as Particles3D, i as VoxelGrid3D, j as DEFAULT_TERRAIN_TEXTURE_BASE, k as Billboard3D, l as findRiverCoverageGaps, m as traceDownhillPath, n as registerNodes3D, o as Trail3D, p as smoothCourse, r as VOXEL_PALETTE, s as River3D, u as projectToRiver, v as DirectionalLight3D, w as FLOWER_VARIETIES, x as DENSITY_PRESETS, y as OmniLight3D, z as cameraRelative } from "./environment-presets-pGTHb_V4.js";
|
|
3
|
+
import { a as Environment3D, c as parseEnvironment3D, d as AssetStore3D, i as syncTree, l as sunDirectionFromElevationAzimuth, o as setEnvironment3D, r as Renderer3D, s as horizonColorFromSky, t as createGame3D, u as sunDirectionFromSky } from "./create-game-u7TDbvln.js";
|
|
4
4
|
import { n as splatWeights, t as buildHeightmap } from "./heightmap-CRK0M4jT.js";
|
|
5
|
-
import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-
|
|
5
|
+
import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-CumBBvQo.js";
|
|
6
6
|
//#region src/3d/terrain-nav.ts
|
|
7
7
|
function buildTerrainNav(terrain, opts) {
|
|
8
8
|
const cellSize = opts?.cellSize ?? 2;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { n as loadScene, o as computeViewport, s as resolveViewport, v as diagnose, w as registerBehavior } from "./loader-r49nDwB4.js";
|
|
3
|
-
import { h as Engine, m as AudioPlayer } from "./register-
|
|
3
|
+
import { h as Engine, m as AudioPlayer } from "./register-DuTlY56W.js";
|
|
4
4
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
5
5
|
import { i as resolveRendering, n as attachTouchControls } from "./touch-BoNg_MnF.js";
|
|
6
6
|
import { i as openBundledEditor, n as crossFade, r as devServerLibrary, t as teardown } from "./teardown-CCtAMDLB.js";
|
|
7
7
|
import { n as registerGameplayBehaviors } from "./gameplay-By8mslMc.js";
|
|
8
|
-
import { g as PhysicsBody2D, n as UILayer, t as registerNodes2D, u as Camera2D, y as Node2D } from "./register-
|
|
8
|
+
import { g as PhysicsBody2D, n as UILayer, t as registerNodes2D, u as Camera2D, y as Node2D } from "./register-MSZvnHkp.js";
|
|
9
9
|
import { t as debugSources } from "./debug-draw-BM3DsvtT.js";
|
|
10
|
-
import { n as enablePhysics2D } from "./physics-2d-
|
|
10
|
+
import { n as enablePhysics2D } from "./physics-2d-CEnZFcpM.js";
|
|
11
11
|
import { Box3, BufferAttribute, BufferGeometry, Color, LineBasicMaterial, LineSegments, LinearFilter, NearestFilter, OrthographicCamera, Raycaster, SRGBColorSpace, Scene, TextureLoader, Vector2, Vector3, WebGLRenderer } from "three";
|
|
12
12
|
//#region src/2d/assets.ts
|
|
13
13
|
/**
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { n as loadScene, v as diagnose, w as registerBehavior } from "./loader-r49nDwB4.js";
|
|
3
|
-
import { _ as qualityCaps, h as Engine, m as AudioPlayer, y as qualityRendering } from "./register-
|
|
3
|
+
import { _ as qualityCaps, h as Engine, m as AudioPlayer, y as qualityRendering } from "./register-DuTlY56W.js";
|
|
4
4
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
5
5
|
import { i as resolveRendering, n as attachTouchControls } from "./touch-BoNg_MnF.js";
|
|
6
6
|
import { a as poseFromRenderer, i as openBundledEditor, n as crossFade, r as devServerLibrary, t as teardown } from "./teardown-CCtAMDLB.js";
|
|
7
7
|
import { B as createCausticsQuad, F as PhysicsBody3D, R as Node3D, n as registerGameplayBehaviors } from "./gameplay-By8mslMc.js";
|
|
8
8
|
import { t as debugSources } from "./debug-draw-BM3DsvtT.js";
|
|
9
|
-
import { E as Camera3D, U as TextureCache3D, g as ModelInstance3D, n as registerNodes3D, t as resolveEnvironmentHdri, v as DirectionalLight3D } from "./environment-presets-
|
|
10
|
-
import { n as enablePhysics3D } from "./physics-3d-
|
|
9
|
+
import { E as Camera3D, U as TextureCache3D, g as ModelInstance3D, n as registerNodes3D, t as resolveEnvironmentHdri, v as DirectionalLight3D } from "./environment-presets-pGTHb_V4.js";
|
|
10
|
+
import { n as enablePhysics3D } from "./physics-3d-CumBBvQo.js";
|
|
11
11
|
import { ACESFilmicToneMapping, AmbientLight, Box3, BufferAttribute, BufferGeometry, Color, DepthTexture, EquirectangularReflectionMapping, FloatType, Fog, HalfFloatType, LineBasicMaterial, LineSegments, Matrix4, Mesh, PCFShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, Quaternion, Raycaster, Scene, ShaderMaterial, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
|
|
12
12
|
import { VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm";
|
|
13
13
|
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
package/dist/debug.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ interface DocumentLike {
|
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region src/debug/index.d.ts
|
|
10
|
-
type DebugPanelId = "explorer" | "inspector" | "logs" | "stats";
|
|
10
|
+
type DebugPanelId = "explorer" | "inspector" | "logs" | "stats" | "time";
|
|
11
11
|
/** Menu entries that are switches rather than panels. */
|
|
12
12
|
type DebugSwitchId = "colliders";
|
|
13
13
|
/** `all` is every collider in the world; `selected` follows the Explorer. */
|
|
@@ -64,6 +64,15 @@ declare class DebugOverlay {
|
|
|
64
64
|
private editing;
|
|
65
65
|
/** Which bulky values are unfolded, per node ('transforms', 'collider.vertices'). */
|
|
66
66
|
private readonly detailOpen;
|
|
67
|
+
/**
|
|
68
|
+
* The scale to come back to when a pause is lifted.
|
|
69
|
+
*
|
|
70
|
+
* Captured only from a RUNNING scale: pausing an already-frozen game (a
|
|
71
|
+
* hit-stop, a previous pause) must not record 0 as the thing to restore, or
|
|
72
|
+
* Resume does nothing and the game looks hung.
|
|
73
|
+
*/
|
|
74
|
+
private resumeScale;
|
|
75
|
+
private timeEls;
|
|
67
76
|
/** Pointer inside the inspector — it stops refreshing under your hand. */
|
|
68
77
|
private hovering;
|
|
69
78
|
constructor(engine: Engine, container: HTMLElement, doc: DocumentLike, statsSource?: (() => Partial<RendererStats>) | undefined, actions?: DebugAction[]);
|
|
@@ -107,6 +116,31 @@ declare class DebugOverlay {
|
|
|
107
116
|
private renderValueRow;
|
|
108
117
|
private trackEditing;
|
|
109
118
|
private pushLog;
|
|
119
|
+
/**
|
|
120
|
+
* Set game time, defensively. `timeScale` multiplies every dt in the engine,
|
|
121
|
+
* so a NaN from a text field would poison physics, timers and animation in
|
|
122
|
+
* one frame, and a negative would run the simulation backwards through code
|
|
123
|
+
* that has never been asked to.
|
|
124
|
+
*/
|
|
125
|
+
setTimeScale(next: number): void;
|
|
126
|
+
/** Freeze or unfreeze game time. Rendering keeps running — this is a pause,
|
|
127
|
+
* not a stop: the camera still moves and the overlay stays interactive. */
|
|
128
|
+
setPaused(paused: boolean): void;
|
|
129
|
+
get paused(): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Advance exactly one frame, pausing first.
|
|
132
|
+
*
|
|
133
|
+
* Stepping a RUNNING game is meaningless — the next real frame lands a
|
|
134
|
+
* millisecond later and swamps the step — so this pauses and then steps,
|
|
135
|
+
* which is also the only way the button is useful twice in a row.
|
|
136
|
+
*/
|
|
137
|
+
nextFrame(): void;
|
|
138
|
+
/** Push the engine's current time state into the panel, without rebuilding it. */
|
|
139
|
+
private syncTime;
|
|
140
|
+
private renderTime;
|
|
141
|
+
/** After a committed edit the field must show what the ENGINE took — a
|
|
142
|
+
* rejected 'abc' or a clamped -2 has to be visible, not left on screen. */
|
|
143
|
+
private syncTimeAfterEdit;
|
|
110
144
|
private renderLogs;
|
|
111
145
|
}
|
|
112
146
|
//#endregion
|
package/dist/debug.js
CHANGED
|
@@ -192,6 +192,9 @@ function detailText(value, json) {
|
|
|
192
192
|
function isPlainObject(value) {
|
|
193
193
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
194
194
|
}
|
|
195
|
+
/** The slider's ceiling. Beyond this the number box is the tool — a 0..8 slider
|
|
196
|
+
* makes the 0.1-to-1 range, where slow-motion debugging actually lives, unusable. */
|
|
197
|
+
const TIME_SLIDER_MAX = 2;
|
|
195
198
|
/** Attach the overlay; null when no DOM is available (headless). */
|
|
196
199
|
function attachDebugOverlay(engine, opts = {}) {
|
|
197
200
|
const doc = opts.doc ?? (typeof document !== "undefined" ? document : null);
|
|
@@ -235,6 +238,15 @@ var DebugOverlay = class {
|
|
|
235
238
|
editing = 0;
|
|
236
239
|
/** Which bulky values are unfolded, per node ('transforms', 'collider.vertices'). */
|
|
237
240
|
detailOpen = /* @__PURE__ */ new WeakMap();
|
|
241
|
+
/**
|
|
242
|
+
* The scale to come back to when a pause is lifted.
|
|
243
|
+
*
|
|
244
|
+
* Captured only from a RUNNING scale: pausing an already-frozen game (a
|
|
245
|
+
* hit-stop, a previous pause) must not record 0 as the thing to restore, or
|
|
246
|
+
* Resume does nothing and the game looks hung.
|
|
247
|
+
*/
|
|
248
|
+
resumeScale = 1;
|
|
249
|
+
timeEls = null;
|
|
238
250
|
/** Pointer inside the inspector — it stops refreshing under your hand. */
|
|
239
251
|
hovering = false;
|
|
240
252
|
constructor(engine, container, doc, statsSource, actions = []) {
|
|
@@ -282,6 +294,7 @@ var DebugOverlay = class {
|
|
|
282
294
|
this.renderExplorer();
|
|
283
295
|
this.renderStats();
|
|
284
296
|
if (this.editing === 0 && !this.hovering) this.renderInspector();
|
|
297
|
+
this.syncTime();
|
|
285
298
|
}));
|
|
286
299
|
}
|
|
287
300
|
isOpen(id) {
|
|
@@ -314,11 +327,18 @@ var DebugOverlay = class {
|
|
|
314
327
|
this.openStatsChip();
|
|
315
328
|
return;
|
|
316
329
|
}
|
|
317
|
-
if (this.panels.has(id))
|
|
330
|
+
if (this.panels.has(id)) {
|
|
331
|
+
if (id === "explorer") this.renderExplorer();
|
|
332
|
+
if (id === "inspector") this.renderInspector();
|
|
333
|
+
if (id === "logs") this.renderLogs();
|
|
334
|
+
if (id === "time") this.renderTime();
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
318
337
|
const panel = new FloatingPanel(this.doc, this.container, {
|
|
319
338
|
explorer: "Explorer",
|
|
320
339
|
inspector: "Inspector",
|
|
321
|
-
logs: "Logs"
|
|
340
|
+
logs: "Logs",
|
|
341
|
+
time: "Time"
|
|
322
342
|
}[id], {
|
|
323
343
|
explorer: {
|
|
324
344
|
x: 12,
|
|
@@ -337,6 +357,12 @@ var DebugOverlay = class {
|
|
|
337
357
|
y: 380,
|
|
338
358
|
w: 532,
|
|
339
359
|
h: 200
|
|
360
|
+
},
|
|
361
|
+
time: {
|
|
362
|
+
x: 556,
|
|
363
|
+
y: 44,
|
|
364
|
+
w: 260,
|
|
365
|
+
h: 150
|
|
340
366
|
}
|
|
341
367
|
}[id]);
|
|
342
368
|
panel.onClose = () => this.close(id);
|
|
@@ -352,6 +378,7 @@ var DebugOverlay = class {
|
|
|
352
378
|
if (id === "explorer") this.renderExplorer();
|
|
353
379
|
if (id === "inspector") this.renderInspector();
|
|
354
380
|
if (id === "logs") this.renderLogs();
|
|
381
|
+
if (id === "time") this.renderTime();
|
|
355
382
|
}
|
|
356
383
|
close(id) {
|
|
357
384
|
if (id === "inspector") this.hovering = false;
|
|
@@ -453,6 +480,7 @@ var DebugOverlay = class {
|
|
|
453
480
|
["explorer", "Explorer"],
|
|
454
481
|
["inspector", "Inspector"],
|
|
455
482
|
["logs", "Logs"],
|
|
483
|
+
["time", "Time"],
|
|
456
484
|
["stats", "Stats"],
|
|
457
485
|
["colliders", "Colliders"]
|
|
458
486
|
]) {
|
|
@@ -849,6 +877,148 @@ var DebugOverlay = class {
|
|
|
849
877
|
if (this.logRows.length > MAX_LOG_ROWS) this.logRows.splice(0, this.logRows.length - MAX_LOG_ROWS);
|
|
850
878
|
this.renderLogs();
|
|
851
879
|
}
|
|
880
|
+
/**
|
|
881
|
+
* Set game time, defensively. `timeScale` multiplies every dt in the engine,
|
|
882
|
+
* so a NaN from a text field would poison physics, timers and animation in
|
|
883
|
+
* one frame, and a negative would run the simulation backwards through code
|
|
884
|
+
* that has never been asked to.
|
|
885
|
+
*/
|
|
886
|
+
setTimeScale(next) {
|
|
887
|
+
if (!Number.isFinite(next)) return;
|
|
888
|
+
this.engine.timeScale = Math.max(0, next);
|
|
889
|
+
this.syncTime();
|
|
890
|
+
}
|
|
891
|
+
/** Freeze or unfreeze game time. Rendering keeps running — this is a pause,
|
|
892
|
+
* not a stop: the camera still moves and the overlay stays interactive. */
|
|
893
|
+
setPaused(paused) {
|
|
894
|
+
if (paused) {
|
|
895
|
+
if (this.engine.timeScale > 0) this.resumeScale = this.engine.timeScale;
|
|
896
|
+
this.engine.timeScale = 0;
|
|
897
|
+
} else this.engine.timeScale = this.resumeScale > 0 ? this.resumeScale : 1;
|
|
898
|
+
this.syncTime();
|
|
899
|
+
}
|
|
900
|
+
get paused() {
|
|
901
|
+
return this.engine.timeScale === 0;
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* Advance exactly one frame, pausing first.
|
|
905
|
+
*
|
|
906
|
+
* Stepping a RUNNING game is meaningless — the next real frame lands a
|
|
907
|
+
* millisecond later and swamps the step — so this pauses and then steps,
|
|
908
|
+
* which is also the only way the button is useful twice in a row.
|
|
909
|
+
*/
|
|
910
|
+
nextFrame() {
|
|
911
|
+
if (!this.paused) this.setPaused(true);
|
|
912
|
+
this.engine.step();
|
|
913
|
+
this.syncTime();
|
|
914
|
+
}
|
|
915
|
+
/** Push the engine's current time state into the panel, without rebuilding it. */
|
|
916
|
+
syncTime() {
|
|
917
|
+
const els = this.timeEls;
|
|
918
|
+
if (!els) return;
|
|
919
|
+
const scale = this.engine.timeScale;
|
|
920
|
+
const text = String(Math.round(scale * 1e3) / 1e3);
|
|
921
|
+
if (this.editing === 0) {
|
|
922
|
+
els.slider.value = String(Math.min(scale, TIME_SLIDER_MAX));
|
|
923
|
+
els.box.value = text;
|
|
924
|
+
}
|
|
925
|
+
els.readout.textContent = `timeScale ${text}${this.paused ? " · paused" : ""}`;
|
|
926
|
+
els.pause.textContent = this.paused ? "▶ Resume" : "⏸ Pause";
|
|
927
|
+
}
|
|
928
|
+
renderTime() {
|
|
929
|
+
const panel = this.panels.get("time");
|
|
930
|
+
if (!panel) return;
|
|
931
|
+
clear(panel.body);
|
|
932
|
+
this.timeEls = null;
|
|
933
|
+
const readout = this.doc.createElement("div");
|
|
934
|
+
applyStyle(readout, {
|
|
935
|
+
marginBottom: "6px",
|
|
936
|
+
opacity: "0.85"
|
|
937
|
+
});
|
|
938
|
+
panel.body.appendChild(readout);
|
|
939
|
+
const slider = this.doc.createElement("input");
|
|
940
|
+
slider.type = "range";
|
|
941
|
+
slider.min = "0";
|
|
942
|
+
slider.max = String(TIME_SLIDER_MAX);
|
|
943
|
+
slider.step = "0.05";
|
|
944
|
+
slider.value = String(Math.min(this.engine.timeScale, TIME_SLIDER_MAX));
|
|
945
|
+
applyStyle(slider, {
|
|
946
|
+
width: "100%",
|
|
947
|
+
marginBottom: "6px"
|
|
948
|
+
});
|
|
949
|
+
this.trackEditing(slider);
|
|
950
|
+
slider.addEventListener("input", () => this.setTimeScale(Number(slider.value)));
|
|
951
|
+
panel.body.appendChild(slider);
|
|
952
|
+
const row = this.doc.createElement("div");
|
|
953
|
+
applyStyle(row, {
|
|
954
|
+
display: "flex",
|
|
955
|
+
gap: "6px",
|
|
956
|
+
alignItems: "center",
|
|
957
|
+
marginBottom: "8px"
|
|
958
|
+
});
|
|
959
|
+
const box = this.doc.createElement("input");
|
|
960
|
+
box.type = "number";
|
|
961
|
+
box.min = "0";
|
|
962
|
+
box.step = "0.05";
|
|
963
|
+
box.value = String(this.engine.timeScale);
|
|
964
|
+
applyStyle(box, inputStyle("72px"));
|
|
965
|
+
this.trackEditing(box);
|
|
966
|
+
box.addEventListener("change", () => {
|
|
967
|
+
const next = Number(box.value);
|
|
968
|
+
if (Number.isFinite(next)) this.setTimeScale(next);
|
|
969
|
+
this.syncTimeAfterEdit();
|
|
970
|
+
});
|
|
971
|
+
row.appendChild(box);
|
|
972
|
+
for (const preset of [
|
|
973
|
+
.25,
|
|
974
|
+
.5,
|
|
975
|
+
1,
|
|
976
|
+
2
|
|
977
|
+
]) {
|
|
978
|
+
const chip = this.doc.createElement("div");
|
|
979
|
+
chip.textContent = `${preset}×`;
|
|
980
|
+
applyStyle(chip, {
|
|
981
|
+
cursor: "pointer",
|
|
982
|
+
opacity: "0.7",
|
|
983
|
+
padding: "2px 4px"
|
|
984
|
+
});
|
|
985
|
+
chip.addEventListener("click", () => this.setTimeScale(preset));
|
|
986
|
+
row.appendChild(chip);
|
|
987
|
+
}
|
|
988
|
+
panel.body.appendChild(row);
|
|
989
|
+
const buttons = this.doc.createElement("div");
|
|
990
|
+
applyStyle(buttons, {
|
|
991
|
+
display: "flex",
|
|
992
|
+
gap: "8px"
|
|
993
|
+
});
|
|
994
|
+
const pause = this.doc.createElement("div");
|
|
995
|
+
applyStyle(pause, buttonStyle());
|
|
996
|
+
pause.addEventListener("click", () => this.setPaused(!this.paused));
|
|
997
|
+
buttons.appendChild(pause);
|
|
998
|
+
const step = this.doc.createElement("div");
|
|
999
|
+
step.textContent = "⏭ Next frame";
|
|
1000
|
+
step.title = "Pauses, then advances one fixed step";
|
|
1001
|
+
applyStyle(step, buttonStyle());
|
|
1002
|
+
step.addEventListener("click", () => this.nextFrame());
|
|
1003
|
+
buttons.appendChild(step);
|
|
1004
|
+
panel.body.appendChild(buttons);
|
|
1005
|
+
this.timeEls = {
|
|
1006
|
+
slider,
|
|
1007
|
+
box,
|
|
1008
|
+
readout,
|
|
1009
|
+
pause
|
|
1010
|
+
};
|
|
1011
|
+
this.syncTime();
|
|
1012
|
+
}
|
|
1013
|
+
/** After a committed edit the field must show what the ENGINE took — a
|
|
1014
|
+
* rejected 'abc' or a clamped -2 has to be visible, not left on screen. */
|
|
1015
|
+
syncTimeAfterEdit() {
|
|
1016
|
+
const els = this.timeEls;
|
|
1017
|
+
if (!els) return;
|
|
1018
|
+
const scale = this.engine.timeScale;
|
|
1019
|
+
els.slider.value = String(Math.min(scale, TIME_SLIDER_MAX));
|
|
1020
|
+
els.box.value = String(Math.round(scale * 1e3) / 1e3);
|
|
1021
|
+
}
|
|
852
1022
|
renderLogs() {
|
|
853
1023
|
const panel = this.panels.get("logs");
|
|
854
1024
|
if (!panel) return;
|
|
@@ -924,6 +1094,17 @@ function stringify(part) {
|
|
|
924
1094
|
return String(part);
|
|
925
1095
|
}
|
|
926
1096
|
}
|
|
1097
|
+
/** A clickable chip that reads as a button in the overlay's flat style. */
|
|
1098
|
+
function buttonStyle() {
|
|
1099
|
+
return {
|
|
1100
|
+
background: "rgba(255,255,255,0.08)",
|
|
1101
|
+
border: "1px solid rgba(255,255,255,0.2)",
|
|
1102
|
+
borderRadius: "4px",
|
|
1103
|
+
padding: "4px 8px",
|
|
1104
|
+
cursor: "pointer",
|
|
1105
|
+
userSelect: "none"
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
927
1108
|
function inputStyle(width) {
|
|
928
1109
|
return {
|
|
929
1110
|
width,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as registerCoreNodes } from "./register-
|
|
1
|
+
import { t as registerCoreNodes } from "./register-DuTlY56W.js";
|
|
2
2
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
3
3
|
import { t as Rng } from "./rng-DP-SR7eg.js";
|
|
4
4
|
import { i as getNodeSchema, l as registerNode } from "./registry-IyWCGe4q.js";
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { C as getBehavior, E as Signal, S as clearBehaviors, T as registeredBehaviors, _ as InputMap, a as SCENE_FORMAT, b as behaviorSchema, c as SceneTree, d as resolveConstants, f as Node, g as resolveOrderGroups, h as effectiveOrder, i as serializeNode, l as CONST_REF_KEY, m as ORDER_GROUP_BASE, n as loadScene, o as computeViewport, p as parseNodePath, r as Scene, s as resolveViewport, u as isConstRef, w as registerBehavior, x as behaviorSignals, y as Behavior } from "./loader-r49nDwB4.js";
|
|
2
|
-
import { A as T_PREFIX, B as synthSfx, C as behaviorsWithoutSave, D as LogManager, E as createSaveStore, F as ROLLOFF_MODELS, G as AudioBuses, H as WebAudioMusicBackend, I as spatialGain, L as spatialPan, M as translationKey, N as SfxEngine, O as BASE_LOCALE, P as isAudioContextAvailable, R as SFX_PRESETS, S as SaveSlots, T as restoreBehaviors, U as crossfadeGains, V as MusicManager, W as fadeGain, a as UiSlider, b as readDeviceHints, c as UiButton, d as UiBanner, f as UiBar, g as Settings, h as Engine, i as UiSelect, j as suggestLocale, k as Localization, l as UiDialogue, m as AudioPlayer, n as UiImage, o as UiToggle, p as UiText, r as UiPanel, s as Timer, t as registerCoreNodes, u as HudLayer, v as qualityEnvironment, w as captureBehaviors, x as suggestQuality, z as SFX_PRESET_NAMES } from "./register-
|
|
2
|
+
import { A as T_PREFIX, B as synthSfx, C as behaviorsWithoutSave, D as LogManager, E as createSaveStore, F as ROLLOFF_MODELS, G as AudioBuses, H as WebAudioMusicBackend, I as spatialGain, L as spatialPan, M as translationKey, N as SfxEngine, O as BASE_LOCALE, P as isAudioContextAvailable, R as SFX_PRESETS, S as SaveSlots, T as restoreBehaviors, U as crossfadeGains, V as MusicManager, W as fadeGain, a as UiSlider, b as readDeviceHints, c as UiButton, d as UiBanner, f as UiBar, g as Settings, h as Engine, i as UiSelect, j as suggestLocale, k as Localization, l as UiDialogue, m as AudioPlayer, n as UiImage, o as UiToggle, p as UiText, r as UiPanel, s as Timer, t as registerCoreNodes, u as HudLayer, v as qualityEnvironment, w as captureBehaviors, x as suggestQuality, z as SFX_PRESET_NAMES } from "./register-DuTlY56W.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { t as Rng } from "./rng-DP-SR7eg.js";
|
|
5
|
-
import { n as startRecording, r as auditScene, t as replay } from "./replay-
|
|
5
|
+
import { n as startRecording, r as auditScene, t as replay } from "./replay-DcWg4LT5.js";
|
|
6
6
|
import { n as jsonEquals, r as jsonKind, t as jsonClone } from "./json-BLk7H2Qa.js";
|
|
7
7
|
import { a as getNodeSignals, c as mergeStaticSignals, i as getNodeSchema, l as registerNode, n as clearRegistry, o as getNodeType, r as createNode, u as registeredTypes } from "./registry-IyWCGe4q.js";
|
|
8
8
|
import { t as createNoise2D } from "./noise-CGUMx44x.js";
|
|
@@ -172,6 +172,6 @@ function newUid() {
|
|
|
172
172
|
//#endregion
|
|
173
173
|
//#region src/index.ts
|
|
174
174
|
/** Engine version. Kept in sync with package.json by the release pipeline. */
|
|
175
|
-
const VERSION = "0.
|
|
175
|
+
const VERSION = "0.41.0";
|
|
176
176
|
//#endregion
|
|
177
177
|
export { AudioBuses, AudioPlayer, BASE_LOCALE, Behavior, CONST_REF_KEY, Engine, HudLayer, IncantoError, InputMap, Localization, LogManager, MusicManager, Node, ORDER_GROUP_BASE, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, ParticleSim, ROLLOFF_MODELS, Rng, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, SaveSlots, Scene, SceneTree, Settings, SfxEngine, Signal, T_PREFIX, Timer, TouchControls, UiBanner, UiBar, UiButton, UiDialogue, UiImage, UiPanel, UiSelect, UiSlider, UiText, UiToggle, VERSION, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, mergeStaticSignals, newUid, parseNodePath, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveConstants, resolveOrderGroups, resolveRendering, resolveViewport, restoreBehaviors, serializeNode, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
|
package/dist/net.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as loadScene } from "./loader-r49nDwB4.js";
|
|
2
|
-
import { h as Engine } from "./register-
|
|
2
|
+
import { h as Engine } from "./register-DuTlY56W.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { t as jsonClone } from "./json-BLk7H2Qa.js";
|
|
5
5
|
import { n as createAgent8Server } from "./agent8-CvsfVskX.js";
|
|
6
|
-
import { i as applySyncPatch, n as NetworkSpawner, r as NetworkManager, t as registerNodesNet } from "./register-
|
|
6
|
+
import { i as applySyncPatch, n as NetworkSpawner, r as NetworkManager, t as registerNodesNet } from "./register-DnycZ91Q.js";
|
|
7
7
|
//#region src/net/loopback.ts
|
|
8
8
|
/**
|
|
9
9
|
* In-memory multiplayer hub implementing the SAME kernel contract as
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { v as diagnose } from "./loader-r49nDwB4.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
|
-
import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-
|
|
4
|
+
import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-MSZvnHkp.js";
|
|
5
5
|
import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
|
|
6
6
|
//#region src/2d/physics/physics-2d.ts
|
|
7
7
|
var physics_2d_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -3,7 +3,7 @@ import { v as diagnose } from "./loader-r49nDwB4.js";
|
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { F as PhysicsBody3D, I as RigidBody3D, N as Area3D, P as CharacterBody3D, R as Node3D, z as validateCollider3D } from "./gameplay-By8mslMc.js";
|
|
5
5
|
import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
|
|
6
|
-
import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-
|
|
6
|
+
import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-pGTHb_V4.js";
|
|
7
7
|
import { Euler, Matrix4, Quaternion, Vector3 } from "three";
|
|
8
8
|
//#region src/3d/physics/collider-lines.ts
|
|
9
9
|
/**
|
package/dist/react.js
CHANGED
|
@@ -156,7 +156,7 @@ function IncantoCanvas(props) {
|
|
|
156
156
|
pointer: latest.pointer,
|
|
157
157
|
...keyboard !== void 0 ? { keyboard } : {}
|
|
158
158
|
};
|
|
159
|
-
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-
|
|
159
|
+
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-u7TDbvln.js").then((n) => n.n)).createGame3D(o) : async (o) => (await import("./create-game-CZpENyin.js").then((n) => n.n)).createGame2D(o)))(opts);
|
|
160
160
|
if (disposed) {
|
|
161
161
|
next.dispose();
|
|
162
162
|
return;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { E as Signal, f as Node, t as buildNodeJson } from "./loader-r49nDwB4.js";
|
|
2
|
-
import { t as registerCoreNodes } from "./register-
|
|
2
|
+
import { t as registerCoreNodes } from "./register-DuTlY56W.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { n as jsonEquals, t as jsonClone } from "./json-BLk7H2Qa.js";
|
|
5
5
|
import { l as registerNode } from "./registry-IyWCGe4q.js";
|
|
@@ -1980,6 +1980,8 @@ var Engine = class {
|
|
|
1980
1980
|
step() {
|
|
1981
1981
|
const scene = this._scene;
|
|
1982
1982
|
if (!scene) return;
|
|
1983
|
+
this._time += this.fixedStep;
|
|
1984
|
+
this._unscaledTime += this.fixedStep;
|
|
1983
1985
|
scene.tree.fixedUpdate(this.fixedStep);
|
|
1984
1986
|
this.fixedUpdated.emit(this.fixedStep);
|
|
1985
1987
|
scene.tree.update(this.fixedStep);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { f as Node, h as effectiveOrder } from "./loader-r49nDwB4.js";
|
|
2
|
-
import { t as registerCoreNodes } from "./register-
|
|
2
|
+
import { t as registerCoreNodes } from "./register-DuTlY56W.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { t as Rng } from "./rng-DP-SR7eg.js";
|
|
5
5
|
import { i as getNodeSchema, l as registerNode } from "./registry-IyWCGe4q.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { n as loadScene, w as registerBehavior } from "./loader-r49nDwB4.js";
|
|
2
|
-
import { h as Engine } from "./register-
|
|
2
|
+
import { h as Engine } from "./register-DuTlY56W.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
|
-
import { n as startRecording } from "./replay-
|
|
4
|
+
import { n as startRecording } from "./replay-DcWg4LT5.js";
|
|
5
5
|
import { n as jsonEquals, t as jsonClone } from "./json-BLk7H2Qa.js";
|
|
6
6
|
import { i as getNodeSchema, s as mergeStaticProps } from "./registry-IyWCGe4q.js";
|
|
7
7
|
import { n as registerGameplayBehaviors } from "./gameplay-By8mslMc.js";
|
|
8
|
-
import { t as registerNodes2D } from "./register-
|
|
9
|
-
import { n as registerNodes3D, t as resolveEnvironmentHdri } from "./environment-presets-
|
|
10
|
-
import { t as registerNodesNet } from "./register-
|
|
8
|
+
import { t as registerNodes2D } from "./register-MSZvnHkp.js";
|
|
9
|
+
import { n as registerNodes3D, t as resolveEnvironmentHdri } from "./environment-presets-pGTHb_V4.js";
|
|
10
|
+
import { t as registerNodesNet } from "./register-DnycZ91Q.js";
|
|
11
11
|
import { Box3, Euler, Matrix4, PerspectiveCamera, Quaternion, Vector3 } from "three";
|
|
12
12
|
//#region src/test/framing.ts
|
|
13
13
|
/**
|
|
@@ -1244,10 +1244,10 @@ async function runScript(json, opts) {
|
|
|
1244
1244
|
engine.setScene(scene);
|
|
1245
1245
|
const physics = opts.physics ?? "auto";
|
|
1246
1246
|
if (physics === "2d" || physics === "auto" && scene.dimension === "2d") {
|
|
1247
|
-
const { enablePhysics2D } = await import("./physics-2d-
|
|
1247
|
+
const { enablePhysics2D } = await import("./physics-2d-CEnZFcpM.js").then((n) => n.r);
|
|
1248
1248
|
await enablePhysics2D(engine);
|
|
1249
1249
|
} else if (physics === "3d" || physics === "auto" && scene.dimension === "3d") {
|
|
1250
|
-
const { enablePhysics3D } = await import("./physics-3d-
|
|
1250
|
+
const { enablePhysics3D } = await import("./physics-3d-CumBBvQo.js").then((n) => n.r);
|
|
1251
1251
|
await enablePhysics3D(engine);
|
|
1252
1252
|
}
|
|
1253
1253
|
const failures = [];
|
|
@@ -1360,10 +1360,10 @@ async function createPlaySession(json, opts = {}) {
|
|
|
1360
1360
|
engine.setScene(scene);
|
|
1361
1361
|
const physics = opts.physics ?? "auto";
|
|
1362
1362
|
if (physics === "2d" || physics === "auto" && scene.dimension === "2d") {
|
|
1363
|
-
const { enablePhysics2D } = await import("./physics-2d-
|
|
1363
|
+
const { enablePhysics2D } = await import("./physics-2d-CEnZFcpM.js").then((n) => n.r);
|
|
1364
1364
|
await enablePhysics2D(engine);
|
|
1365
1365
|
} else if (physics === "3d" || physics === "auto" && scene.dimension === "3d") {
|
|
1366
|
-
const { enablePhysics3D } = await import("./physics-3d-
|
|
1366
|
+
const { enablePhysics3D } = await import("./physics-3d-CumBBvQo.js").then((n) => n.r);
|
|
1367
1367
|
await enablePhysics3D(engine);
|
|
1368
1368
|
}
|
|
1369
1369
|
const stepMs = 1e3 / (opts.fixedHz ?? 60);
|
package/dist/test.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { r as auditScene } from "./replay-
|
|
2
|
-
import { a as registerAllNodes, c as feelReport, d as findPlayer, f as playtest, h as framingText, i as findFloatingProps, l as feelText, m as describeFraming, n as createPlaySession, o as runScript, p as playtestText, r as describeCapture, s as validateScene, t as captureScene, u as failingReplays } from "./test-
|
|
1
|
+
import { r as auditScene } from "./replay-DcWg4LT5.js";
|
|
2
|
+
import { a as registerAllNodes, c as feelReport, d as findPlayer, f as playtest, h as framingText, i as findFloatingProps, l as feelText, m as describeFraming, n as createPlaySession, o as runScript, p as playtestText, r as describeCapture, s as validateScene, t as captureScene, u as failingReplays } from "./test-B4kSwQzq.js";
|
|
3
3
|
export { auditScene, captureScene, createPlaySession, describeCapture, describeFraming, failingReplays, feelReport, feelText, findFloatingProps, findPlayer, framingText, playtest, playtestText, registerAllNodes, runScript, validateScene };
|
package/dist/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as validateScene } from "./test-
|
|
1
|
+
import { s as validateScene } from "./test-B4kSwQzq.js";
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { basename, dirname, join, normalize, relative, resolve, sep } from "node:path";
|
|
4
4
|
//#region src/vite/index.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
1
|
+
import{n as e}from"./index-i1mIkyMA.js";async function t(t){return new n((await e(()=>import(`./GameServer-C56iOUgF.js`),[],import.meta.url)).GameServer,t)}var n=class{raw;active=new Map;reconnecting=!1;disposed=!1;constructor(e,t){this.raw=new e({...t})}get account(){return this.raw.account}get connected(){return this.raw.connected}connect(){return this.raw.connected?Promise.resolve(!0):(this.disposed=!1,this.rawConnect())}rawConnect(){return this.raw.connect({onDisconnect:()=>void this.reconnect()})}disconnect(){this.disposed=!0;for(let e of this.active.values())e.off();return this.active.clear(),this.raw.disconnect()}remoteFunction(e,t,n){return this.raw.remoteFunction(e,t,n)}track(e){let t=Symbol(`sub`),n={make:e,off:e()};return this.active.set(t,n),()=>{n.off(),this.active.delete(t)}}async reconnect(){if(!this.disposed&&!this.reconnecting){this.reconnecting=!0;try{await this.rawConnect();for(let e of this.active.values())e.off(),e.off=e.make()}finally{this.reconnecting=!1}}}subscribeRoomState(e,t){return this.track(()=>this.raw.subscribeRoomState(e,t))}subscribeRoomMyState(e,t){return this.track(()=>this.raw.subscribeRoomMyState(e,t))}subscribeRoomAllUserStates(e,t){return this.track(()=>this.raw.subscribeRoomAllUserStates(e,e=>{let n={};for(let t of e??[]){if(!t||typeof t.account!=`string`||t.__leaved)continue;let{account:e,__updated:r,__leaved:i,...a}=t;n[e]=a}t(n)}))}subscribeRoomCollection(e,t,n){return this.track(()=>this.raw.subscribeRoomCollection(e,t,({items:e})=>{let t={};for(let n of e??[])n&&typeof n.__id==`string`&&(t[n.__id]=n);n(t)}))}onRoomMessage(e,t,n){return this.track(()=>this.raw.onRoomMessage(e,t,n))}onRoomUserJoin(e,t){return this.track(()=>this.raw.onRoomUserJoin(e,t))}onRoomUserLeave(e,t){return this.track(()=>this.raw.onRoomUserLeave(e,t))}subscribeGlobalState(e){return this.track(()=>this.raw.subscribeGlobalState(e))}subscribeGlobalMyState(e){return this.track(()=>this.raw.subscribeGlobalMyState(e))}subscribeGlobalUserState(e,t){return this.track(()=>this.raw.subscribeGlobalUserState(e,t))}subscribeGlobalCollection(e,t){return this.track(()=>this.raw.subscribeGlobalCollection(e,({items:e})=>{let n={};for(let t of e??[])t&&typeof t.__id==`string`&&(n[t.__id]=t);t(n)}))}subscribeAsset(e,t){return this.track(()=>this.raw.subscribeAsset(e,t))}onGlobalMessage(e,t){return this.track(()=>this.raw.onGlobalMessage(e,t))}};export{t as createAgent8Server};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{i as e,r as t,t as n}from"./index-i1mIkyMA.js";function r(e,t,n,r,i,a,o=180,s=120){let c=Math.max(o,n),l=Math.max(s,r);return{x:Math.min(Math.max(0,e),Math.max(0,i-c)),y:Math.min(Math.max(0,t),Math.max(0,a-l)),w:c,h:l}}function i(e,t){for(let[n,r]of Object.entries(t))e.style[n]=r}var a=`rgba(18, 20, 26, 0.92)`,o=`1px solid rgba(255,255,255,0.14)`,s=`12px ui-monospace, SFMono-Regular, Menlo, monospace`,c=class{host;el;body;onClose=()=>{};x;y;w;h;constructor(e,t,n,r){this.host=t,this.x=r.x,this.y=r.y,this.w=r.w,this.h=r.h,this.el=e.createElement(`div`),i(this.el,{position:`absolute`,background:a,border:o,borderRadius:`8px`,color:`rgba(255,255,255,0.88)`,font:s,display:`flex`,flexDirection:`column`,overflow:`hidden`,zIndex:`40`,pointerEvents:`auto`,boxShadow:`0 8px 28px rgba(0,0,0,0.45)`});let c=e.createElement(`div`);c.textContent=n,i(c,{padding:`6px 28px 6px 10px`,background:`rgba(255,255,255,0.07)`,cursor:`move`,userSelect:`none`,touchAction:`none`,fontWeight:`700`}),this.el.appendChild(c);let l=e.createElement(`div`);l.textContent=`×`,l.title=`close`,i(l,{position:`absolute`,top:`2px`,right:`8px`,cursor:`pointer`,fontSize:`16px`,lineHeight:`20px`,opacity:`0.7`}),l.addEventListener(`click`,()=>this.onClose()),this.el.appendChild(l),this.body=e.createElement(`div`),i(this.body,{flex:`1`,overflow:`auto`,padding:`8px 10px`}),this.el.appendChild(this.body);let u=e.createElement(`div`);u.textContent=`◢`,i(u,{position:`absolute`,right:`2px`,bottom:`0`,cursor:`nwse-resize`,opacity:`0.5`,userSelect:`none`,touchAction:`none`}),this.el.appendChild(u),this.wireDrag(c,(e,t)=>{this.x+=e,this.y+=t,this.layout()}),this.wireDrag(u,(e,t)=>{this.w+=e,this.h+=t,this.layout()}),this.layout(),t.appendChild(this.el)}remove(){this.el.remove()}layout(){let e=this.host.getBoundingClientRect(),t=r(this.x,this.y,this.w,this.h,e.width,e.height);this.x=t.x,this.y=t.y,this.w=t.w,this.h=t.h,i(this.el,{left:`${t.x}px`,top:`${t.y}px`,width:`${t.w}px`,height:`${t.h}px`})}wireDrag(e,t){let n=null,r=0,i=0;e.addEventListener(`pointerdown`,t=>{n=t.pointerId,r=t.clientX,i=t.clientY,e.setPointerCapture?.(t.pointerId)}),e.addEventListener(`pointermove`,e=>{e.pointerId===n&&(t(e.clientX-r,e.clientY-i),r=e.clientX,i=e.clientY)});let a=e=>{e.pointerId===n&&(n=null)};e.addEventListener(`pointerup`,a),e.addEventListener(`pointercancel`,a)}},l=96,u=200,d=8192;function f(e){return Array.isArray(e)?`Array(${e.length})`:`Object(${Object.keys(e).length} keys)`}function p(e,t){if(Array.isArray(e)&&e.some(e=>typeof e==`object`&&!!e)){let t=e.slice(0,u).map(e=>JSON.stringify(e)),n=e.length-u;return t.join(`
|
|
2
|
+
`)+(n>0?`\n… ${n} more`:``)}return t.length>d?`${t.slice(0,d)} … (${t.length-d} more chars)`:t}function m(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var h=2;function g(e,t={}){let n=t.doc??(typeof document<`u`?document:null);if(!n)return null;let r=t.container??(typeof document<`u`?document.body:null);return!r||typeof r.appendChild!=`function`?null:new y(e,r,n,t.statsSource,t.actions)}var _=300,v=[`log`,`info`,`warn`,`error`,`debug`],y=class{engine;container;doc;statsSource;actions;panels=new Map;cleanups=[];menuButton;dropdown=null;selected=null;collapsedFlags=new Map;statsChip=null;logRows=[];levelEnabled={debug:!0,info:!0,warn:!0,error:!0};consoleCapture=!1;consolePatched=[];frame=0;editing=0;detailOpen=new WeakMap;resumeScale=1;timeEls=null;hovering=!1;constructor(e,t,n,r,a=[]){this.engine=e,this.container=t,this.doc=n,this.statsSource=r,this.actions=a,this.menuButton=n.createElement(`div`),this.menuButton.textContent=`☰ debug`,i(this.menuButton,{position:`absolute`,top:`8px`,left:`8px`,padding:`4px 10px`,background:`rgba(18,20,26,0.85)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,color:`rgba(255,255,255,0.85)`,font:`12px ui-monospace, Menlo, monospace`,cursor:`pointer`,userSelect:`none`,zIndex:`50`,pointerEvents:`auto`}),this.menuButton.addEventListener(`click`,()=>this.toggleDropdown()),t.style.position||(t.style.position=`relative`),t.appendChild(this.menuButton),this.cleanups.push(e.log.added.connect(e=>{this.pushLog({level:e.level,source:`engine`,text:e.parts.map(S).join(` `)})})),this.cleanups.push(e.sceneChanged.connect(()=>{this.selected=null,this.applyColliderScope(),this.renderExplorer(),this.renderInspector()})),this.cleanups.push(e.updated.connect(()=>{this.frame+=1,this.frame%30==0&&(this.renderExplorer(),this.renderStats(),this.editing===0&&!this.hovering&&this.renderInspector(),this.syncTime())}))}isOpen(e){return e===`colliders`?this.colliderMode!==`off`:e===`stats`?this.statsChip!==null:this.panels.has(e)}colliderMode=`off`;setColliders(e){this.colliderMode=e,this.applyColliderScope()}applyColliderScope(){let e=this.colliderMode;for(let t of n(`2d`).concat(n(`3d`)))t.debugDraw=e!==`off`,t.debugScope=e===`selected`?this.selected:null}open(e){if(e===`stats`){this.openStatsChip();return}if(this.panels.has(e)){e===`explorer`&&this.renderExplorer(),e===`inspector`&&this.renderInspector(),e===`logs`&&this.renderLogs(),e===`time`&&this.renderTime();return}let t=new c(this.doc,this.container,{explorer:`Explorer`,inspector:`Inspector`,logs:`Logs`,time:`Time`}[e],{explorer:{x:12,y:44,w:240,h:320},inspector:{x:264,y:44,w:280,h:320},logs:{x:12,y:380,w:532,h:200},time:{x:556,y:44,w:260,h:150}}[e]);t.onClose=()=>this.close(e),e===`inspector`&&(t.body.addEventListener(`pointerenter`,()=>{this.hovering=!0}),t.body.addEventListener(`pointerleave`,()=>{this.hovering=!1})),this.panels.set(e,t),e===`explorer`&&this.renderExplorer(),e===`inspector`&&this.renderInspector(),e===`logs`&&this.renderLogs(),e===`time`&&this.renderTime()}close(e){if(e===`inspector`&&(this.hovering=!1),e===`stats`){this.statsChip?.remove(),this.statsChip=null;return}let t=this.panels.get(e);t&&(t.remove(),this.panels.delete(e))}toggle(e){if(e===`colliders`){this.setColliders({off:`all`,all:`selected`,selected:`off`}[this.colliderMode]);return}this.isOpen(e)?this.close(e):this.open(e)}setLevelEnabled(e,t){this.levelEnabled[e]=t,this.renderLogs()}setConsoleCapture(e){if(e!==this.consoleCapture)if(this.consoleCapture=e,e){this.renderLogs();let e=console;for(let t of v){let n=e[t];e[t]=(...e)=>{n.apply(console,e);let r=t===`log`?`info`:t;this.pushLog({level:r,source:`console`,text:e.map(S).join(` `)})},this.consolePatched.push(()=>{e[t]=n})}}else{for(let e of this.consolePatched)e();this.consolePatched=[],this.renderLogs()}}dispose(){this.engine.debugSelection=null,this.setColliders(`off`),this.setConsoleCapture(!1);for(let e of this.cleanups)e();for(let e of[...this.panels.keys()])this.close(e);this.close(`stats`),this.dropdown?.remove(),this.dropdown=null,this.menuButton.remove()}menuLabel(e,t){let n=e===`colliders`&&this.colliderMode!==`off`?` · ${this.colliderMode}`:``;return`${this.isOpen(e)?`✓ `:``}${t}${n}`}toggleDropdown(){if(this.dropdown){this.dropdown.remove(),this.dropdown=null;return}let e=this.doc.createElement(`div`);i(e,{position:`absolute`,top:`34px`,left:`8px`,background:`rgba(18,20,26,0.95)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,font:`12px ui-monospace, Menlo, monospace`,color:`rgba(255,255,255,0.85)`,zIndex:`60`,pointerEvents:`auto`,overflow:`hidden`});for(let[t,n]of[[`explorer`,`Explorer`],[`inspector`,`Inspector`],[`logs`,`Logs`],[`time`,`Time`],[`stats`,`Stats`],[`colliders`,`Colliders`]]){let r=this.doc.createElement(`div`);r.textContent=this.menuLabel(t,n),i(r,{padding:`6px 14px`,cursor:`pointer`,userSelect:`none`}),r.addEventListener(`click`,()=>{if(this.toggle(t),t===`colliders`){r.textContent=this.menuLabel(t,n);return}this.dropdown?.remove(),this.dropdown=null}),e.appendChild(r)}for(let t of this.actions){let n=this.doc.createElement(`div`);n.textContent=t.label,i(n,{padding:`6px 14px`,cursor:`pointer`,userSelect:`none`,borderTop:`1px solid rgba(255,255,255,0.14)`,color:`rgba(158,232,220,0.95)`}),n.addEventListener(`click`,()=>{this.dropdown?.remove(),this.dropdown=null,t.run()}),e.appendChild(n)}this.container.appendChild(e),this.dropdown=e}openStatsChip(){if(this.statsChip)return;let e=this.doc.createElement(`div`);i(e,{position:`absolute`,top:`8px`,right:`8px`,padding:`4px 10px`,background:`rgba(18,20,26,0.85)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,color:`rgba(255,255,255,0.85)`,font:`12px ui-monospace, Menlo, monospace`,textAlign:`right`,whiteSpace:`pre`,userSelect:`none`,pointerEvents:`none`,zIndex:`70`}),this.container.appendChild(e),this.statsChip=e,this.renderStats()}renderStats(){let e=this.statsChip;if(!e)return;let t=this.engine.stats(),n=this.statsSource?.()??{},r=[`nodes ${t.nodes}`,...n.triangles===void 0?[]:[`tris ${x(n.triangles)}`],...n.drawCalls===void 0?[]:[`calls ${n.drawCalls}`]].join(` · `);e.textContent=`${Math.round(t.fps)} fps · ${t.frameMs.toFixed(1)} ms\n${r}`}renderExplorer(){let e=this.panels.get(`explorer`);if(!e)return;let t=e.body.scrollTop;b(e.body);let n=this.engine.scene?.root;if(!n){e.body.scrollTop=t;return}let r=(e,t)=>{let n=e.constructor,a=e.children.length>0,o=this.collapsedFlags.get(e)===!0,s=this.doc.createElement(`div`);i(s,{display:`flex`,alignItems:`center`,cursor:`pointer`,padding:`1px 2px`,borderRadius:`3px`,background:e===this.selected?`rgba(110,160,255,0.25)`:`transparent`});let c=this.doc.createElement(`span`);c.textContent=a?o?`▸`:`▾`:`·`,i(c,{width:`14px`,flex:`none`,textAlign:`center`,opacity:a?`0.85`:`0.25`,userSelect:`none`}),a&&c.addEventListener(`click`,t=>{t.stopPropagation?.(),this.collapsedFlags.set(e,!o),this.renderExplorer()}),s.appendChild(c);let l=this.doc.createElement(`span`);l.textContent=e.name,i(l,{whiteSpace:`nowrap`}),s.appendChild(l);let u=this.doc.createElement(`span`);if(u.textContent=` ${n.typeName}`,i(u,{opacity:`0.45`,whiteSpace:`nowrap`,fontSize:`10px`}),s.appendChild(u),a&&o){let t=this.doc.createElement(`span`);t.textContent=` (${e.children.length})`,i(t,{opacity:`0.35`,fontSize:`10px`}),s.appendChild(t)}if(s.addEventListener(`click`,()=>{this.selected=e,this.engine.debugSelection=e,this.applyColliderScope(),this.open(`inspector`),this.renderExplorer(),this.renderInspector()}),t.appendChild(s),a&&!o){let n=this.doc.createElement(`div`);i(n,{marginLeft:`8px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`});for(let t of e.children)r(t,n);t.appendChild(n)}};r(n,e.body),e.body.scrollTop=t}renderInspector(){let e=this.panels.get(`inspector`);if(!e)return;let n=e.body.scrollTop;b(e.body);let r=this.selected;if(r&&r.tree===null&&(this.selected=null,this.engine.debugSelection=null,this.applyColliderScope(),r=null),!r){let t=this.doc.createElement(`div`);t.textContent=`select a node in the Explorer`,i(t,{opacity:`0.6`}),e.body.appendChild(t);return}let a=r.constructor,o=this.doc.createElement(`div`);if(o.textContent=`${r.getPath()} · ${a.typeName}${r.uid?` · ${r.uid}`:``}`,i(o,{fontWeight:`700`,marginBottom:`6px`,whiteSpace:`pre-wrap`}),e.body.appendChild(o),r.groups.size>0){let t=this.doc.createElement(`div`);t.textContent=`groups: ${[...r.groups].join(`, `)}`,i(t,{opacity:`0.7`,marginBottom:`6px`}),e.body.appendChild(t)}let s=t(a),c=r;for(let t of Object.keys(s)){let n=s[t];this.renderValueRow(e.body,r,t,{read:()=>c[t],write:e=>{c[t]=e},options:n?.options,variants:n?.variants})}e.body.scrollTop=n}renderValueRow(t,n,r,a){let o=a.read(),s=a.options,c={get[r](){return a.read()},set[r](e){a.write(e)}},u=this.doc.createElement(`div`);i(u,{display:`flex`,gap:`6px`,alignItems:`center`,margin:`2px 0`});let d=this.doc.createElement(`div`);d.textContent=r,i(d,{minWidth:`84px`,opacity:`0.75`}),u.appendChild(d);let h=(e,t)=>{let a=this.doc.createElement(`input`);return a.type=`number`,a.value=String(e),i(a,w(`70px`)),this.trackEditing(a),a.addEventListener(`change`,()=>{let e=Number(a.value);Number.isFinite(e)?t(e):a.value=String(n[r])}),a};if(typeof o==`number`)u.appendChild(h(o,e=>{c[r]=e}));else if(typeof o==`boolean`){let e=this.doc.createElement(`input`);e.type=`checkbox`,e.checked=o,this.trackEditing(e),e.addEventListener(`change`,()=>{c[r]=e.checked}),u.appendChild(e)}else if(typeof o==`string`&&s&&s.length>0){let e=this.doc.createElement(`select`);for(let t of s.includes(o)?s:[o,...s]){let n=this.doc.createElement(`option`);n.value=t,n.textContent=t,t===o&&(n.selected=!0),e.appendChild(n)}e.value=o,this.trackEditing(e),e.addEventListener(`change`,()=>{c[r]=e.value}),i(e,w(`110px`)),u.appendChild(e)}else if(typeof o==`string`){let e=this.doc.createElement(`input`);e.type=`text`,e.value=o,this.trackEditing(e),i(e,w(`140px`)),e.addEventListener(`change`,()=>{c[r]=e.value}),u.appendChild(e)}else if(Array.isArray(o)&&o.length<=8&&o.every(e=>typeof e==`number`))for(let e=0;e<o.length;e++)u.appendChild(h(o[e],t=>{let n=[...c[r]];n[e]=t,c[r]=n}));else if(m(o)){let s=this.doc.createElement(`div`);i(s,{marginLeft:`10px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`});let c=a.variants?.tag,l=Object.keys(o);c&&!l.includes(c)&&l.unshift(c);let d=a.path??r;for(let t of l){let r=t===c;this.renderValueRow(s,n,t,{path:`${d}.${t}`,read:()=>a.read()[t]??(r?``:null),write:n=>{if(r&&a.variants){let t=a.variants.byTag[String(n)];if(t!==void 0){a.write(e(t));return}}a.write({...a.read(),[t]:n})},options:r&&a.variants?Object.keys(a.variants.byTag):void 0})}t.appendChild(u),t.appendChild(s);return}else{let s=JSON.stringify(e(o));if(s.length<=l){let e=this.doc.createElement(`div`);e.textContent=s,i(e,{opacity:`0.65`,whiteSpace:`pre-wrap`,wordBreak:`break-all`}),u.appendChild(e)}else{let e=a.path??r,c=this.detailOpen.get(n)?.has(e)??!1,l=this.doc.createElement(`div`);if(l.textContent=`${c?`▾`:`▸`} ${f(o)}`,i(l,{opacity:`0.75`,cursor:`pointer`,userSelect:`none`}),l.addEventListener(`click`,()=>{let t=this.detailOpen.get(n);t||(t=new Set,this.detailOpen.set(n,t)),c?t.delete(e):t.add(e),this.renderInspector()}),u.appendChild(l),t.appendChild(u),c){let e=this.doc.createElement(`div`);e.textContent=p(o,s),i(e,{opacity:`0.6`,whiteSpace:`pre-wrap`,wordBreak:`break-all`,marginLeft:`10px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`}),t.appendChild(e)}return}}t.appendChild(u)}trackEditing(e){e.addEventListener(`focus`,()=>{this.editing+=1}),e.addEventListener(`blur`,()=>{this.editing=Math.max(0,this.editing-1)})}pushLog(e){this.logRows.push(e),this.logRows.length>_&&this.logRows.splice(0,this.logRows.length-_),this.renderLogs()}setTimeScale(e){Number.isFinite(e)&&(this.engine.timeScale=Math.max(0,e),this.syncTime())}setPaused(e){e?(this.engine.timeScale>0&&(this.resumeScale=this.engine.timeScale),this.engine.timeScale=0):this.engine.timeScale=this.resumeScale>0?this.resumeScale:1,this.syncTime()}get paused(){return this.engine.timeScale===0}nextFrame(){this.paused||this.setPaused(!0),this.engine.step(),this.syncTime()}syncTime(){let e=this.timeEls;if(!e)return;let t=this.engine.timeScale,n=String(Math.round(t*1e3)/1e3);this.editing===0&&(e.slider.value=String(Math.min(t,h)),e.box.value=n),e.readout.textContent=`timeScale ${n}${this.paused?` · paused`:``}`,e.pause.textContent=this.paused?`▶ Resume`:`⏸ Pause`}renderTime(){let e=this.panels.get(`time`);if(!e)return;b(e.body),this.timeEls=null;let t=this.doc.createElement(`div`);i(t,{marginBottom:`6px`,opacity:`0.85`}),e.body.appendChild(t);let n=this.doc.createElement(`input`);n.type=`range`,n.min=`0`,n.max=String(h),n.step=`0.05`,n.value=String(Math.min(this.engine.timeScale,h)),i(n,{width:`100%`,marginBottom:`6px`}),this.trackEditing(n),n.addEventListener(`input`,()=>this.setTimeScale(Number(n.value))),e.body.appendChild(n);let r=this.doc.createElement(`div`);i(r,{display:`flex`,gap:`6px`,alignItems:`center`,marginBottom:`8px`});let a=this.doc.createElement(`input`);a.type=`number`,a.min=`0`,a.step=`0.05`,a.value=String(this.engine.timeScale),i(a,w(`72px`)),this.trackEditing(a),a.addEventListener(`change`,()=>{let e=Number(a.value);Number.isFinite(e)&&this.setTimeScale(e),this.syncTimeAfterEdit()}),r.appendChild(a);for(let e of[.25,.5,1,2]){let t=this.doc.createElement(`div`);t.textContent=`${e}×`,i(t,{cursor:`pointer`,opacity:`0.7`,padding:`2px 4px`}),t.addEventListener(`click`,()=>this.setTimeScale(e)),r.appendChild(t)}e.body.appendChild(r);let o=this.doc.createElement(`div`);i(o,{display:`flex`,gap:`8px`});let s=this.doc.createElement(`div`);i(s,C()),s.addEventListener(`click`,()=>this.setPaused(!this.paused)),o.appendChild(s);let c=this.doc.createElement(`div`);c.textContent=`⏭ Next frame`,c.title=`Pauses, then advances one fixed step`,i(c,C()),c.addEventListener(`click`,()=>this.nextFrame()),o.appendChild(c),e.body.appendChild(o),this.timeEls={slider:n,box:a,readout:t,pause:s},this.syncTime()}syncTimeAfterEdit(){let e=this.timeEls;if(!e)return;let t=this.engine.timeScale;e.slider.value=String(Math.min(t,h)),e.box.value=String(Math.round(t*1e3)/1e3)}renderLogs(){let e=this.panels.get(`logs`);if(!e)return;b(e.body);let t=this.doc.createElement(`div`);i(t,{display:`flex`,gap:`8px`,marginBottom:`4px`,flexWrap:`wrap`});for(let e of[`debug`,`info`,`warn`,`error`]){let n=this.doc.createElement(`div`);n.textContent=`${this.levelEnabled[e]?`✓`:`·`}${e}`,i(n,{cursor:`pointer`,opacity:this.levelEnabled[e]?`1`:`0.45`}),n.addEventListener(`click`,()=>this.setLevelEnabled(e,!this.levelEnabled[e])),t.appendChild(n)}let n=this.doc.createElement(`div`);n.textContent=`${this.consoleCapture?`✓`:`·`}console`,i(n,{cursor:`pointer`,marginLeft:`auto`}),n.addEventListener(`click`,()=>this.setConsoleCapture(!this.consoleCapture)),t.appendChild(n),e.body.appendChild(t);let r={debug:`rgba(255,255,255,0.5)`,info:`rgba(255,255,255,0.85)`,warn:`#ffc861`,error:`#ff6b6b`};for(let t of this.logRows){if(!this.levelEnabled[t.level])continue;let n=this.doc.createElement(`div`);n.textContent=`[${t.source===`console`?`console`:t.level}] ${t.text}`,i(n,{color:r[t.level],whiteSpace:`pre-wrap`}),e.body.appendChild(n)}}};function b(e){for(let t of[...e.children])t.remove()}function x(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function S(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=e.stack?.split(`
|
|
3
|
+
`)[1]?.trim();return`${e.name}: ${e.message}${t?` (${t})`:``}`}try{let t=JSON.stringify(e);return t===`{}`||t===void 0?String(e):t}catch{return String(e)}}function C(){return{background:`rgba(255,255,255,0.08)`,border:`1px solid rgba(255,255,255,0.2)`,borderRadius:`4px`,padding:`4px 8px`,cursor:`pointer`,userSelect:`none`}}function w(e){return{width:e,background:`rgba(255,255,255,0.08)`,border:`1px solid rgba(255,255,255,0.2)`,borderRadius:`4px`,color:`inherit`,font:`inherit`,padding:`2px 4px`}}export{g as attachDebugOverlay};
|