/* Pocket Engine1.0 · adapted from BINX Forge Coin Dash1.0 · MIT. */ const directions={ArrowUp:'up',ArrowDown:'down',ArrowLeft:'left',ArrowRight:'right',w:'up',s:'down',a:'left',d:'right'}; export function createInput(doc,win,canvas,pause) { const keys=new Set(),pointers=new Map(),listeners=[]; function listen(target,name,handler){target.addEventListener(name,handler);listeners.push(()=>target.removeEventListener(name,handler));} const inside=element=>element===canvas||element?.matches?.('[data-direction]'); const direction=key=>directions[key.length===1?key.toLowerCase():key]; function clear(){keys.clear();pointers.clear();} function leave(){clear();pause();} listen(doc,'keydown',event=>{const d=direction(event.key);if(!d||!inside(doc.activeElement))return;event.preventDefault();keys.add(d);}); listen(doc,'keyup',event=>{const d=direction(event.key);if(d)keys.delete(d);}); for(const button of doc.querySelectorAll('[data-direction]')){ listen(button,'pointerdown',event=>{if(event.pointerType==='mouse'&&event.button!==0)return;button.setPointerCapture(event.pointerId);pointers.set(event.pointerId,button.dataset.direction);}); for(const name of ['pointerup','pointercancel','lostpointercapture'])listen(button,name,event=>pointers.delete(event.pointerId)); } listen(doc,'focusout',event=>{if(inside(event.target))keys.clear();}); listen(win,'blur',leave);listen(doc,'visibilitychange',()=>{if(doc.hidden)leave();}); return Object.freeze({read:()=>Object.fromEntries([...keys,...pointers.values()].map(d=>[d,true])),clear,destroy(){clear();for(const remove of listeners)remove();}}); }