handler-playable-sdk 0.3.1 → 0.3.2
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/ConfigOverride-6YH2ILBJ.mjs +1 -0
- package/dist/chunk-BDZGKN5O.mjs +1 -0
- package/dist/chunk-GYW3GFXA.mjs +830 -0
- package/dist/chunk-HN7I4BLB.mjs +1 -0
- package/dist/config-QLS2MDB6.mjs +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.mts +388 -2
- package/dist/index.d.ts +388 -2
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/loader-object-centric-C1QteFfG.d.mts +81 -0
- package/dist/loader-object-centric-C1QteFfG.d.ts +81 -0
- package/dist/pixi/index.css +1 -0
- package/dist/pixi/index.d.mts +388 -97
- package/dist/pixi/index.d.ts +388 -97
- package/dist/pixi/index.js +8 -8
- package/dist/pixi/index.mjs +1 -11
- package/dist/three/index.css +1 -0
- package/dist/three/index.js +55 -55
- package/dist/three/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/chunk-U4PCKCX6.mjs +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a,b,c,d,e}from"./chunk-HN7I4BLB.mjs";export{a as applyConfigOverride,b as applyConfigOverrides,c as clearConfigOverrides,e as configOverrideManager,d as getConfigOverrides};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as V,d as X}from"./chunk-HN7I4BLB.mjs";var K=null,r="dev";if(typeof window!="undefined"){let n=window.__BUILD_SETTINGS__;if(n!=null&&n.buildMode)K=n,r=n.buildMode,console.log("[CONFIG] Loaded inline build settings:",n,"buildMode:",r);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);K=t,r=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",r)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",r)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",r);var E=new Map,Q=r==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload");function se(n,e){try{if(n.startsWith("data:")){let t=n.indexOf(",");if(t===-1)return null;let o=n.slice(0,t),s=n.slice(t+1),i=o.includes("base64")?typeof atob=="function"?atob(s):s:decodeURIComponent(s);return JSON.parse(i)}return JSON.parse(n)}catch(t){return console.warn(`[CONFIG] Failed to parse inline config for "${e}":`,t),null}}function ie(n){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=n.replace(/^\.\/+/,""),o=t.split("/").pop()||t,s=[t,o,t.replace(/\.json$/,""),o.replace(/\.json$/,"")];for(let i of s){let a=e[i];if(a){let f=se(a,i);if(f!==null)return f}}return null}async function x(n){if(E.has(n)&&!Q)return console.log(`[CONFIG] Using cached config for: "${n}"`),E.get(n);if(console.log(`[CONFIG] loadConfigFile called with: "${n}", MODE: ${r.toUpperCase()}, CACHE: ${Q?"DISABLED":"ENABLED"}`),r==="publish"){let o=ie(n);if(o)return console.log(`[CONFIG] \u2713 Loaded ${n} via INLINE_ASSETS`),o}r==="publish"?console.log(`[CONFIG] PUBLISH MODE: Only trying flattened paths for "${n}"`):r==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${n}"`);let e;r==="publish"?e=[`./${n.split("/").pop()||n}`]:r==="brand"?e=[`./${n.split("/").pop()||n}`,`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`],console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{for(let o of e)try{let s=await fetch(o,{cache:"force-cache"});if(!s.ok)continue;let i=await s.json();return console.log(`[CONFIG] \u2713 Loaded ${n} via ${o}`,i),i}catch(s){console.warn(`[CONFIG] \u2717 Failed to load ${o} (mode: ${r==="publish"?"publish":"dev"}):`,s)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${n}; using defaults`),{}})();return E.set(n,t),t}async function Z(){console.log("[CONFIG] Loading component schemas...");let n=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of n)try{let o=r==="publish"||r==="brand"?t.split("/").pop()||t:`configs/${t}`,s=await x(o);s.component&&(e.set(s.component,s),console.log(`[CONFIG] \u2713 Schema loaded: ${s.component} ${r==="publish"||r==="brand"?"(flattened)":"(nested)"}`))}catch(o){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,o)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function I(n){console.log(`[CONFIG] Loading object config: ${n}`);let e=r==="publish"||r==="brand"?`${n}.json`:`configs/objects/${n}.json`;return await x(e)}async function ee(n){let e=new Map;if(n.objects&&Array.isArray(n.objects)){for(let t of n.objects)if(t.enabled&&t.object_config)try{let o=await I(t.object_config);e.set(t.instance_id,{...o,instance_id:t.instance_id,object_config:t.object_config})}catch(o){console.warn(`Failed to load object ${t.object_config}:`,o)}}return e}async function ne(){console.log("[CONFIG] Loading engine configs...");let[n,e,t]=await Promise.all([x(r==="publish"||r==="brand"?"engine.runtime.json":"configs/engine/engine.runtime.json"),x(r==="publish"||r==="brand"?"engine.assets.json":"configs/engine/engine.assets.json"),x(r==="publish"||r==="brand"?"engine.splash.json":"configs/engine/engine.splash.json")]);return console.log("[CONFIG] Engine configs loaded:",{runtime:Object.keys(n).length>0?Object.keys(n):"empty",assets:Object.keys(e).length>0?Object.keys(e):"empty",splash:Object.keys(t).length>0?Object.keys(t):"empty"}),{runtime:n,assets:e,splash:t}}async function ae(){return await x(r==="publish"||r==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function te(n="scene.main"){console.log(`[CONFIG] Loading scene config: ${n}`);let e=r==="publish"||r==="brand"?`${n}.json`:`configs/scenes/${n}.json`;return await x(e)}function F(n,e){let t=[];if(!n.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let o=e.get("identity");if(o)for(let s of o.required||[])n.identity[s]||t.push(`Missing required identity field: ${s}`);for(let[s,i]of Object.entries(n)){if(s==="identity")continue;let a=e.get(s);if(a&&i&&typeof i=="object"){let f=i;for(let g of a.required||[])f[g]===void 0&&t.push(`Missing required field in ${s}: ${g}`);if(a.constraints&&typeof a.constraints=="object")for(let[g,u]of Object.entries(a.constraints)){let y=f[g];if(y!==void 0&&u&&typeof u=="object"){let b=u;typeof y=="number"&&(b.min!==void 0&&y<b.min&&t.push(`${s}.${g} value ${y} is below minimum ${b.min}`),b.max!==void 0&&y>b.max&&t.push(`${s}.${g} value ${y} is above maximum ${b.max}`))}}}}return{valid:t.length===0,errors:t}}function N(n,e){let t={...n};for(let[o,s]of e.entries())s.defaults&&Object.keys(s.defaults).length>0&&(t[o]||(t[o]={}),t[o]={...s.defaults,...t[o]});return t}function j(n,e,t,o){return typeof n!="number"||!Number.isFinite(n)?e:Math.min(Math.max(n,t),o)}function Y(n,e){if(Array.isArray(n))return{x:j(n[0],e.x,-2e3,2e3),y:j(n[1],e.y,-2e3,2e3)};if(!n||typeof n!="object")return e;let{x:t,y:o}=n;return{x:j(t,e.x,-2e3,2e3),y:j(o,e.y,-2e3,2e3)}}function re(n,e){if(Array.isArray(n))return{x:j(n[0],e.x,0,1),y:j(n[1],e.y,0,1)};if(!n||typeof n!="object")return e;let{x:t,y:o}=n;return{x:j(t,e.x,0,1),y:j(o,e.y,0,1)}}function ce(n){if(Array.isArray(n))return{x:j(n[0],.5,-10,10),y:j(n[1],.5,-10,10)};if(n&&typeof n=="object"){let{x:e,y:t}=n;return{x:j(e,.5,-10,10),y:j(t,.5,-10,10)}}return typeof n=="string"?n:null}async function S(n="scene.main",e){var g,u,y,b,_,O,d,c;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await Z(),o=X();o.length>0&&console.log(`[CONFIG] Applying ${o.length} active overrides`);let s=await te(n);console.log(`[CONFIG] Scene config loaded: ${((g=s.objects)==null?void 0:g.length)||0} objects`);let i=await ne();console.log("[CONFIG] Loading object configs...");let a=await ee(s);console.log(`[CONFIG] Loaded ${a.size} object configs:`,Array.from(a.keys()));for(let[m,C]of a.entries()){let p=N(C,t),h=F(p,t);h.valid||console.warn(`Object ${m} validation errors:`,h.errors),(u=p.transform)!=null&&u.position&&(p.transform.position=Y(p.transform.position,{x:0,y:0})),(y=p.transform)!=null&&y.offset&&(p.transform.offset=Y(p.transform.offset,{x:0,y:0})),((b=p.transform)==null?void 0:b.anchor)!==void 0&&(p.transform.anchor=ce(p.transform.anchor)),((_=p.transform)==null?void 0:_.position_ratio)!==void 0&&p.transform.position_ratio!==null&&(p.transform.position_ratio=re(p.transform.position_ratio,{x:.5,y:.5})),a.set(m,p)}if(e){if(e.objects)for(let[m,C]of e.objects.entries())a.set(m,C);e.engine&&(i.runtime={...i.runtime,...e.engine.runtime},i.assets={...i.assets,...e.engine.assets},i.splash={...(O=i.splash)!=null?O:{},...(d=e.engine.splash)!=null?d:{}})}let f={objects:a,engine:i,scene:s,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=f),o.length>0&&V(o,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(a.keys()),engine:{runtime:Object.keys(i.runtime),assets:Object.keys(i.assets),splash:Object.keys((c=i.splash)!=null?c:{})},scene:s.scene_id||"unknown"}),f}function le(n){var t,o,s,i,a,f,g,u,y,b,_,O,d,c,m,C,p,h,$,G,k,H,L,P,R,z,D,T,W,B,q,U,J;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[oe,l]of n.objects.entries()){let w=((t=l.identity)==null?void 0:t.id)||oe;w.includes("character")&&(e.gameplay.character_pos=((o=l.transform)==null?void 0:o.position)||{x:0,y:0},e.gameplay.character_scale=((s=l.transform)==null?void 0:s.scale)||1,e.gameplay.character_anim_speed=((a=(i=l.gameplay)==null?void 0:i.tuning)==null?void 0:a.anim_speed)||.003,e.gameplay.character_relief_scale=((g=(f=l.gameplay)==null?void 0:f.tuning)==null?void 0:g.relief_scale)||1.22,e.gameplay.character_relief_speed=((y=(u=l.gameplay)==null?void 0:u.tuning)==null?void 0:y.relief_speed)||.22),(w.includes("gun")||w.includes("flame"))&&(e.gameplay.gun=l.gun||{},e.gameplay.gunmuzzle=((b=l.effects)==null?void 0:b.gunmuzzle)||{},e.gameplay.muzzle_levels=((_=l.effects)==null?void 0:_.muzzle_levels)||{},e.gameplay.flame=((O=l.effects)==null?void 0:O.flame)||{}),w.includes("diamond")&&(e.gameplay.diamond=l),w.includes("ice")&&(e.gameplay.melt=l.melt||{},e.gameplay.melt_anchor=((d=l.transform)==null?void 0:d.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((c=l.transform)==null?void 0:c.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=l.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((C=l.effects)==null?void 0:C.physics_chunks)||{},e.gameplay.melting_particles=((p=l.effects)==null?void 0:p.melting_particles)||{},e.gameplay.hard_ice=l.hard_ice||{}),w.includes("water")&&(e.gameplay.water_drops=l),w.includes("crack")&&(e.gameplay.crack=l),w.includes("hand")&&(e.gameplay.hand=((h=l.gameplay)==null?void 0:h.tuning)||{},e.gameplay.brush_start_pos=(($=l.transform)==null?void 0:$.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((G=l.transform)==null?void 0:G.scale)||1.5),w.includes("hazard")&&(e.gameplay.hazard=((k=l.gameplay)==null?void 0:k.tuning)||{},e.gameplay.danger_pos=((H=l.transform)==null?void 0:H.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((P=(L=l.gameplay)==null?void 0:L.tuning)==null?void 0:P.danger_pulse)||{},e.gameplay.hazard_height=((z=(R=l.gameplay)==null?void 0:R.tuning)==null?void 0:z.hazard_height)||140)}return e.gameplay.timeline=((D=n.engine.runtime)==null?void 0:D.timeline)||{},e.gameplay.drag_surface=((T=n.engine.runtime)==null?void 0:T.drag_surface)||{},e.gameplay.background=((W=n.engine.runtime)==null?void 0:W.background)||{},e.gameplay.ui_styles=((B=n.engine.runtime)==null?void 0:B.ui_styles)||{},e.gameplay.label_pulse=((q=n.engine.runtime)==null?void 0:q.label_pulse)||{},e.ui=((U=n.engine.runtime)==null?void 0:U.ui)||{},e.theme=((J=n.engine.runtime)==null?void 0:J.theme)||{},e.assets=n.engine.assets||{},e}var A=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},v=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let o=`${e}?t=${Date.now()}&r=${Math.random()}`,s=await fetch(o,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(s.ok){let i=await s.text(),a=this.hashString(i),f=this.fileHashes.get(e);if(f&&f!==a&&console.log(`[HOT-RELOAD] File changed: ${e}`),f&&f!==a){console.log(`[HOT-RELOAD] File changed: ${e}`);let g=this.determineEventType(e);t(g),this.fileHashes.set(e,a)}else f||this.fileHashes.set(e,a)}}catch(o){console.warn(`Failed to check ${e}:`,o)}}determineEventType(e){var t,o;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(o=e.split("/").pop())==null?void 0:o.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=(t<<5)-t+s,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}};function fe(n,e){let t=[];function o(s,i,a=""){if(s!==i){if(typeof s!=typeof i){t.push(`${a}: type changed`);return}if(typeof s=="object"&&s!==null&&i!==null){let f=new Set([...Object.keys(s),...Object.keys(i)]);for(let g of f){let u=a?`${a}.${g}`:g;g in s?g in i?o(s[g],i[g],u):t.push(`${u}: removed`):t.push(`${u}: added`)}}else t.push(`${a}: changed`)}}return o(n,e),t}function ge(n,e,t,o){let s={...t};for(let[i,a]of o.entries())s[i]&&a.defaults&&(s[i]={...a.defaults,...s[i]});return s}var M={};function de(n){if(typeof window=="undefined")return;let e=typeof M!="undefined"&&!!M.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let s=null,i=!1,a=null;if(t){a=new v;let d=window.__configWatcher;d!=null&&d.stop&&d.stop(),window.__configWatcher=a}let f=new Set,g=d=>{var C,p;if(!a)return;let c=new Set;c.add("configs/engine/engine.runtime.json"),c.add("configs/engine/engine.assets.json"),c.add("configs/engine/engine.splash.json"),c.add("configs/scenes/scene.main.json");let m=(p=(C=d.scene)==null?void 0:C.objects)!=null?p:[];for(let h of m)h!=null&&h.object_config&&c.add(`configs/objects/${h.object_config}.json`);for(let h of f)c.has(h)||a.unwatch(h);for(let h of c)f.has(h)||a.watch(h,$=>O($));f=c},u=new Set,y=!1,b=async d=>{let c=await I(d),m=N(c,n.activeConfig.schemas),C=F(m,n.activeConfig.schemas);C.valid||console.warn(`[HOT-RELOAD] ${d} validation errors:`,C.errors),await n.liveEditBridge.applyObjectConfig(d,m)};async function _(d){if(!i){i=!0;try{if(y||u.size===0){n.audioSystem.destroy();let c=await S("scene.main");n.setActiveConfig(c),n.gameObjectManager.updateConfig(c),n.CustomAssets.updateConfig(c),await n.CustomAssets.ready();let m=n.createAudioSystem(c);n.setAudioSystem(m),window.__audioSystem=m,await m.start(),n.liveEditBridge.rebuildIndexes(),g(c),console.log(`[GAME] Hot-reload complete (${d})`)}else{let c=Array.from(u);u.clear();for(let m of c)await b(m);console.log(`[GAME] Hot-reload updated objects: ${c.join(", ")}`)}}catch(c){console.warn("[GAME] Hot-reload failed:",c)}finally{i=!1,y=!1,u.clear()}}}function O(d){d.type==="object"&&d.objectId?u.add(d.objectId):y=!0,s&&window.clearTimeout(s),s=window.setTimeout(()=>{_(d.type)},120)}e&&M.hot.on("config-change",()=>{O({type:"hmr"})}),t&&(g(n.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${f.size} files)`))}export{Z as a,I as b,ee as c,ne as d,ae as e,te as f,F as g,N as h,S as i,le as j,A as k,v as l,fe as m,ge as n,de as o};
|