@combos-fun/plugin-development-tool 0.0.19 → 0.0.20

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.
@@ -16,6 +16,7 @@
16
16
  "CombosDevelopmentToolTarget",
17
17
  "COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED",
18
18
  "COMBOS_DEVELOPMENT_TOOL_REFRESH",
19
- "COMBOS_DEVELOPMENT_TOOL_SET"
19
+ "COMBOS_DEVELOPMENT_TOOL_SET",
20
+ "COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS"
20
21
  ]
21
22
  }
@@ -8,7 +8,9 @@ var pluginRendererEvent = require('@combos-fun/plugin-renderer-event');
8
8
 
9
9
  /** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */
10
10
  const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set';
11
- /** Re-scan the scene tree (only when `CombosDevelopmentToolSystem` uses `scope: 'scene'`). */
11
+ /** iframe parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */
12
+ const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS = 'combos-development-tool:set-success';
13
+ /** Re-scan the scene tree while the development tool is enabled. */
12
14
  const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh';
13
15
  /** Emitted to `window.parent` when an object is selected while the tool is on. */
14
16
  const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED = 'combos-development-tool:gameobject-selected';
@@ -18,8 +20,9 @@ const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = 'combos-development-tool:apply-pr
18
20
  const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready';
19
21
 
20
22
  /**
21
- * Optional marker when using `CombosDevelopmentToolSystem` with `scope: 'tagged'`, or to attach
22
- * extra `payload` on specific objects while using `scope: 'scene'` (serialization reads it if present).
23
+ * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,
24
+ * only nodes carrying this component receive a pick `Event`; all other game `Event` components
25
+ * are removed and cached until disable.
23
26
  */
24
27
  class CombosDevelopmentToolTarget extends engine.Component {
25
28
  constructor() {
@@ -272,31 +275,32 @@ function applyPropertyWithHooks(go, componentName, path, value) {
272
275
 
273
276
  const OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';
274
277
  /**
275
- * **Defaults:** `scope: 'scene'`, **off** at start (no tap hijack until enabled).
276
- * While enabled, game `Event` `tap` listeners are removed and restored on disable.
278
+ * **Off** at start. While enabled:
279
+ * - strips `Event` from every scene `GameObject` (cached for restore on disable);
280
+ * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.
281
+ *
277
282
  * Turn on/off via:
278
283
  * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`
279
284
  * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)
280
285
  * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`
281
286
  *
282
- * With `scope: 'scene'`, while enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`, or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.
287
+ * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,
288
+ * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.
283
289
  */
284
290
  let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends engine.System {
285
291
  constructor() {
286
292
  super(...arguments);
287
293
  this.postMessageOrigin = '*';
288
- this.scope = 'scene';
289
294
  this.enabled = false;
290
295
  this.outlineGo = null;
291
296
  this.selected = null;
292
297
  this.tapHandlers = new Map();
293
298
  this.tapOwners = new Map();
294
- /** Game `tap` listeners removed while enabled; restored on disable. */
295
- this.savedTapListeners = new Map();
296
- /** We added `Event` for hit-testing; remove on teardown when disabling / releaseTap. */
297
- this.injectedEvents = new Set();
298
- this.needsSceneRescan = false;
299
- this.needsTaggedRescan = false;
299
+ /** Game `Event` components removed while enabled; restored on disable. */
300
+ this.cachedGameEvents = new Map();
301
+ /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */
302
+ this.pickEvents = new Set();
303
+ this.needsRescan = false;
300
304
  this.onWindowSet = (e) => {
301
305
  const d = e.detail;
302
306
  if (d && typeof d.enabled === 'boolean') {
@@ -332,7 +336,6 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
332
336
  static { this.systemName = 'CombosDevelopmentToolSystem'; }
333
337
  init(params) {
334
338
  this.postMessageOrigin = params?.postMessageOrigin ?? '*';
335
- this.scope = params?.scope ?? 'scene';
336
339
  if (typeof window !== 'undefined') {
337
340
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);
338
341
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);
@@ -340,11 +343,8 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
340
343
  }
341
344
  this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);
342
345
  this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);
343
- if (this.enabled && this.scope === 'scene') {
344
- this.needsSceneRescan = true;
345
- }
346
- else if (this.enabled && this.scope === 'tagged') {
347
- this.needsTaggedRescan = true;
346
+ if (this.enabled) {
347
+ this.needsRescan = true;
348
348
  }
349
349
  }
350
350
  onDestroy() {
@@ -355,7 +355,8 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
355
355
  }
356
356
  this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);
357
357
  this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);
358
- this.detachAllTaps();
358
+ this.detachAllPicks();
359
+ this.restoreCachedGameEvents();
359
360
  this.clearSelection();
360
361
  }
361
362
  /** Programmatic toggle (same effect as events). */
@@ -365,30 +366,26 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
365
366
  this.enabled = on;
366
367
  if (!on) {
367
368
  this.clearSelection();
368
- this.detachAllTaps();
369
- }
370
- else if (this.scope === 'scene') {
371
- this.needsSceneRescan = true;
369
+ this.detachAllPicks();
370
+ this.restoreCachedGameEvents();
371
+ this.postSetSuccess(false);
372
372
  }
373
373
  else {
374
- this.needsTaggedRescan = true;
374
+ this.needsRescan = true;
375
375
  }
376
376
  }
377
377
  get isEnabled() {
378
378
  return this.enabled;
379
379
  }
380
380
  update(e) {
381
- if (this.enabled && this.needsSceneRescan && this.scope === 'scene') {
382
- this.needsSceneRescan = false;
383
- this.attachSceneTree();
384
- }
385
- if (this.enabled && this.needsTaggedRescan && this.scope === 'tagged') {
386
- this.needsTaggedRescan = false;
387
- this.attachTaggedObjects();
381
+ if (this.enabled && this.needsRescan) {
382
+ this.needsRescan = false;
383
+ this.attachEditMode();
384
+ this.postSetSuccess(true);
388
385
  }
389
386
  for (const go of [...this.tapOwners.values()]) {
390
387
  if (go.destroyed) {
391
- this.releaseTap(go);
388
+ this.releasePick(go);
392
389
  }
393
390
  }
394
391
  if (!this.enabled || !this.selected || !this.outlineGo)
@@ -405,59 +402,45 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
405
402
  g.stroke({ width: 4, color: 0x55ffaa, alpha: pulse });
406
403
  }
407
404
  componentChanged(changed) {
408
- if (this.scope === 'scene')
405
+ if (!this.enabled)
409
406
  return;
410
407
  const { type, gameObject, componentName } = changed;
411
408
  if (!gameObject || componentName !== 'CombosDevelopmentToolTarget')
412
409
  return;
413
410
  if (type === engine.OBSERVER_TYPE.ADD) {
414
- this.ensureTap(gameObject);
411
+ this.stripGameEvent(gameObject);
412
+ this.ensurePick(gameObject);
415
413
  }
416
414
  else if (type === engine.OBSERVER_TYPE.REMOVE) {
417
- this.releaseTap(gameObject);
415
+ this.releasePick(gameObject);
418
416
  if (this.selected === gameObject) {
419
417
  this.clearSelection();
420
418
  }
421
419
  }
422
420
  }
423
- /** Re-bind scene taps when `scope === 'scene'` (e.g. after dynamic spawn). */
421
+ /** Re-bind pick targets after dynamic scene changes while enabled. */
424
422
  requestSceneRescan() {
425
423
  if (!this.enabled)
426
424
  return;
427
- if (this.scope === 'scene') {
428
- this.needsSceneRescan = true;
429
- }
430
- else {
431
- this.needsTaggedRescan = true;
432
- }
425
+ this.needsRescan = true;
433
426
  }
434
- attachTaggedObjects() {
427
+ attachEditMode() {
428
+ this.detachAllPicks();
435
429
  const list = [];
436
430
  for (const tr of this.game.scene.transform.children) {
437
431
  this.collectGameObjects(tr.gameObject, list);
438
432
  }
439
433
  for (const go of list) {
440
- if (go.name === OUTLINE_GO_NAME)
441
- continue;
442
- if (go === this.outlineGo)
443
- continue;
444
- if (!go.getComponent(CombosDevelopmentToolTarget))
434
+ if (this.isIgnoredPickGo(go))
445
435
  continue;
446
- this.ensureTap(go);
447
- }
448
- }
449
- attachSceneTree() {
450
- this.detachAllTaps(false);
451
- const list = [];
452
- for (const tr of this.game.scene.transform.children) {
453
- this.collectGameObjects(tr.gameObject, list);
436
+ this.stripGameEvent(go);
454
437
  }
455
438
  for (const go of list) {
456
- if (go.name === OUTLINE_GO_NAME)
439
+ if (this.isIgnoredPickGo(go))
457
440
  continue;
458
- if (go === this.outlineGo)
441
+ if (!go.getComponent(CombosDevelopmentToolTarget))
459
442
  continue;
460
- this.ensureTap(go);
443
+ this.ensurePick(go);
461
444
  }
462
445
  }
463
446
  collectGameObjects(go, out) {
@@ -466,30 +449,58 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
466
449
  this.collectGameObjects(tr.gameObject, out);
467
450
  }
468
451
  }
469
- detachAllTaps(restore = true) {
470
- for (const go of [...this.tapOwners.values()]) {
471
- this.releaseTap(go, restore);
452
+ isIgnoredPickGo(go) {
453
+ return go.name === OUTLINE_GO_NAME || go === this.outlineGo;
454
+ }
455
+ stripGameEvent(go) {
456
+ if (this.cachedGameEvents.has(go.id))
457
+ return;
458
+ const ev = go.getComponent(pluginRendererEvent.Event);
459
+ if (!ev)
460
+ return;
461
+ try {
462
+ const removed = go.removeComponent(pluginRendererEvent.Event);
463
+ this.cachedGameEvents.set(go.id, removed);
464
+ }
465
+ catch {
466
+ /* ignore */
472
467
  }
473
468
  }
474
- ensureTap(go) {
475
- let ev = go.getComponent(pluginRendererEvent.Event);
476
- if (!ev) {
477
- ev = go.addComponent(this.createInjectedEvent(go));
478
- this.injectedEvents.add(go.id);
469
+ restoreCachedGameEvents() {
470
+ for (const [id, event] of [...this.cachedGameEvents.entries()]) {
471
+ const go = this.findGameObjectById(id);
472
+ if (!go || go.destroyed || go.getComponent(pluginRendererEvent.Event)) {
473
+ this.cachedGameEvents.delete(id);
474
+ continue;
475
+ }
476
+ try {
477
+ go.addComponent(event);
478
+ }
479
+ catch {
480
+ /* ignore */
481
+ }
482
+ this.cachedGameEvents.delete(id);
483
+ }
484
+ }
485
+ detachAllPicks() {
486
+ for (const go of [...this.tapOwners.values()]) {
487
+ this.releasePick(go);
479
488
  }
489
+ }
490
+ ensurePick(go) {
480
491
  if (this.tapHandlers.has(go.id))
481
492
  return;
482
- if (!this.savedTapListeners.has(go.id)) {
483
- const existing = ev.listeners('tap');
484
- this.savedTapListeners.set(go.id, [...existing]);
493
+ let ev = go.getComponent(pluginRendererEvent.Event);
494
+ if (!ev) {
495
+ ev = go.addComponent(this.createPickEvent(go));
496
+ this.pickEvents.add(go.id);
485
497
  }
486
- ev.removeAllListeners('tap');
487
498
  const handler = payload => this.onSelect(go, payload);
488
499
  this.tapHandlers.set(go.id, handler);
489
500
  this.tapOwners.set(go.id, go);
490
501
  ev.on('tap', handler);
491
502
  }
492
- createInjectedEvent(go) {
503
+ createPickEvent(go) {
493
504
  const bounds = this.resolvePickBounds(go);
494
505
  if (bounds.width > 0 && bounds.height > 0) {
495
506
  return new pluginRendererEvent.Event({
@@ -504,12 +515,9 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
504
515
  },
505
516
  });
506
517
  }
507
- // Let Pixi use natural rendered bounds instead of forcing a 1×1 hit area.
508
518
  return new pluginRendererEvent.Event();
509
519
  }
510
520
  resolvePickBounds(go) {
511
- // Graphics draws in arbitrary local coordinates (often centered at 0,0).
512
- // transform.size is a layout box from (0,0) and must not override Pixi bounds.
513
521
  if (this.shouldPreferRenderedBounds(go)) {
514
522
  const fromGraphics = this.resolveContainerLocalBounds(go);
515
523
  if (fromGraphics) {
@@ -560,7 +568,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
560
568
  return null;
561
569
  }
562
570
  }
563
- releaseTap(go, restore = true) {
571
+ releasePick(go) {
564
572
  const handler = this.tapHandlers.get(go.id);
565
573
  if (!handler)
566
574
  return;
@@ -568,24 +576,25 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
568
576
  ev?.off('tap', handler);
569
577
  this.tapHandlers.delete(go.id);
570
578
  this.tapOwners.delete(go.id);
571
- if (restore) {
572
- const saved = this.savedTapListeners.get(go.id);
573
- if (saved && saved.length > 0 && ev) {
574
- for (const fn of saved) {
575
- ev.on('tap', fn);
576
- }
579
+ if (this.pickEvents.has(go.id)) {
580
+ try {
581
+ go.removeComponent(pluginRendererEvent.Event);
577
582
  }
578
- this.savedTapListeners.delete(go.id);
579
- if (this.injectedEvents.has(go.id)) {
580
- try {
581
- go.removeComponent(pluginRendererEvent.Event);
582
- }
583
- catch {
584
- /* ignore */
585
- }
586
- this.injectedEvents.delete(go.id);
583
+ catch {
584
+ /* ignore */
587
585
  }
586
+ this.pickEvents.delete(go.id);
587
+ }
588
+ }
589
+ postSetSuccess(enabled) {
590
+ const payload = {
591
+ type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,
592
+ enabled,
593
+ };
594
+ if (typeof window !== 'undefined' && window.parent && window.parent !== window) {
595
+ window.parent.postMessage(payload, this.postMessageOrigin);
588
596
  }
597
+ this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });
589
598
  }
590
599
  ensureOutline() {
591
600
  if (this.outlineGo)
@@ -716,7 +725,7 @@ var CombosDevelopmentToolSystem = CombosDevelopmentToolSystem$1;
716
725
  /** Auto-generated by scripts/build-package.mjs — do not edit. */
717
726
  Object.assign(CombosDevelopmentToolSystem, {
718
727
  packageName: "@combos-fun/plugin-development-tool",
719
- packageVersion: "0.0.19",
728
+ packageVersion: "0.0.20",
720
729
  });
721
730
 
722
731
  exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY;
@@ -724,6 +733,7 @@ exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED = COMBOS_DEVELOPMENT_TOOL_GA
724
733
  exports.COMBOS_DEVELOPMENT_TOOL_READY = COMBOS_DEVELOPMENT_TOOL_READY;
725
734
  exports.COMBOS_DEVELOPMENT_TOOL_REFRESH = COMBOS_DEVELOPMENT_TOOL_REFRESH;
726
735
  exports.COMBOS_DEVELOPMENT_TOOL_SET = COMBOS_DEVELOPMENT_TOOL_SET;
736
+ exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS = COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS;
727
737
  exports.CombosDevelopmentToolSystem = CombosDevelopmentToolSystem;
728
738
  exports.CombosDevelopmentToolTarget = CombosDevelopmentToolTarget;
729
739
  exports.applyPropertyValue = applyPropertyValue;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** Re-scan the scene tree (only when `CombosDevelopmentToolSystem` uses `scope: 'scene'`). */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Optional marker when using `CombosDevelopmentToolSystem` with `scope: 'tagged'`, or to attach\n * extra `payload` on specific objects while using `scope: 'scene'` (serialization reads it if present).\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport type CombosDevelopmentToolSelectScope = 'tagged' | 'scene';\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * - `tagged`: only `GameObject`s with {@link CombosDevelopmentToolTarget} participate (optional `payload`).\n * - `scene`: all objects under `game.scene` (except the outline helper) get tap → outline + postMessage; no marker component required (default).\n */\n scope?: CombosDevelopmentToolSelectScope;\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Defaults:** `scope: 'scene'`, **off** at start (no tap hijack until enabled).\n * While enabled, game `Event` `tap` listeners are removed and restored on disable.\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * With `scope: 'scene'`, while enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`, or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private scope: CombosDevelopmentToolSelectScope = 'scene';\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `tap` listeners removed while enabled; restored on disable. */\n private readonly savedTapListeners = new Map<number, TapListener[]>();\n /** We added `Event` for hit-testing; remove on teardown when disabling / releaseTap. */\n private readonly injectedEvents = new Set<number>();\n private needsSceneRescan = false;\n private needsTaggedRescan = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.scope = params?.scope ?? 'scene';\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled && this.scope === 'scene') {\n this.needsSceneRescan = true;\n } else if (this.enabled && this.scope === 'tagged') {\n this.needsTaggedRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllTaps();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllTaps();\n } else if (this.scope === 'scene') {\n this.needsSceneRescan = true;\n } else {\n this.needsTaggedRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsSceneRescan && this.scope === 'scene') {\n this.needsSceneRescan = false;\n this.attachSceneTree();\n }\n\n if (this.enabled && this.needsTaggedRescan && this.scope === 'tagged') {\n this.needsTaggedRescan = false;\n this.attachTaggedObjects();\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releaseTap(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n const g = gfxComp.graphics;\n g.clear();\n const t = typeof performance !== 'undefined' ? performance.now() : e.time;\n const pulse = 0.35 + 0.65 * (0.5 + 0.5 * Math.sin(t * 0.012));\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: pulse });\n }\n\n componentChanged(changed: ComponentChanged) {\n if (this.scope === 'scene') return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.ensureTap(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releaseTap(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind scene taps when `scope === 'scene'` (e.g. after dynamic spawn). */\n requestSceneRescan() {\n if (!this.enabled) return;\n if (this.scope === 'scene') {\n this.needsSceneRescan = true;\n } else {\n this.needsTaggedRescan = true;\n }\n }\n\n private attachTaggedObjects() {\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n for (const go of list) {\n if (go.name === OUTLINE_GO_NAME) continue;\n if (go === this.outlineGo) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensureTap(go);\n }\n }\n\n private attachSceneTree() {\n this.detachAllTaps(false);\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n for (const go of list) {\n if (go.name === OUTLINE_GO_NAME) continue;\n if (go === this.outlineGo) continue;\n this.ensureTap(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private detachAllTaps(restore = true) {\n for (const go of [...this.tapOwners.values()]) {\n this.releaseTap(go, restore);\n }\n }\n\n private ensureTap(go: GameObject) {\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createInjectedEvent(go));\n this.injectedEvents.add(go.id);\n }\n\n if (this.tapHandlers.has(go.id)) return;\n\n if (!this.savedTapListeners.has(go.id)) {\n const existing = ev.listeners('tap') as TapListener[];\n this.savedTapListeners.set(go.id, [...existing]);\n }\n\n ev.removeAllListeners('tap');\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createInjectedEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n // Let Pixi use natural rendered bounds instead of forcing a 1×1 hit area.\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n // Graphics draws in arbitrary local coordinates (often centered at 0,0).\n // transform.size is a layout box from (0,0) and must not override Pixi bounds.\n if (this.shouldPreferRenderedBounds(go)) {\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releaseTap(go: GameObject, restore = true) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (restore) {\n const saved = this.savedTapListeners.get(go.id);\n if (saved && saved.length > 0 && ev) {\n for (const fn of saved) {\n ev.on('tap', fn);\n }\n }\n this.savedTapListeners.delete(go.id);\n\n if (this.injectedEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.injectedEvents.delete(go.id);\n }\n }\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.19\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","Graphics","OBSERVER_TYPE","Event","HIT_AREA_TYPE","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - strips `Event` from every scene `GameObject` (cached for restore on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` components removed while enabled; restored on disable. */\n private readonly cachedGameEvents = new Map<number, Event>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreCachedGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreCachedGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n const g = gfxComp.graphics;\n g.clear();\n const t = typeof performance !== 'undefined' ? performance.now() : e.time;\n const pulse = 0.35 + 0.65 * (0.5 + 0.5 * Math.sin(t * 0.012));\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: pulse });\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.cachedGameEvents.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n try {\n const removed = go.removeComponent(Event) as Event;\n this.cachedGameEvents.set(go.id, removed);\n } catch {\n /* ignore */\n }\n }\n\n private restoreCachedGameEvents() {\n for (const [id, event] of [...this.cachedGameEvents.entries()]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed || go.getComponent(Event)) {\n this.cachedGameEvents.delete(id);\n continue;\n }\n\n try {\n go.addComponent(event);\n } catch {\n /* ignore */\n }\n this.cachedGameEvents.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.20\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","Graphics","OBSERVER_TYPE","Event","HIT_AREA_TYPE","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}