diff --git a/dist/diagram.js b/dist/diagram.js index 032caf9b..57839065 100644 --- a/dist/diagram.js +++ b/dist/diagram.js @@ -1,4 +1,4 @@ -"use strict";(self.webpackChunkbilliards=self.webpackChunkbilliards||[]).push([[338],{"./src/container/container.ts":(e,t,n)=>{n.d(t,{m:()=>J});var r=n("./src/events/stationaryevent.ts"),i=n("./node_modules/three/build/three.module.js"),o=n("./src/utils/utils.ts"),s=n("./src/view/cameratop.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"camera",void 0),l(this,"mode",this.topView),l(this,"mainMode",this.aimView),l(this,"height",8*a.R),l(this,"elapsed",void 0),this.camera=new i.ubm(45,e,a.R,1e3*a.R)}return e=[{key:"update",value:function(e,t){this.elapsed=e,this.mode(t)}},{key:"topView",value:function(e){this.camera.fov=s.v.fov,this.camera.position.lerp(s.v.viewPoint(this.camera.aspect,this.camera.fov),.9),this.camera.up=o.up,this.camera.lookAt(o.v_)}},{key:"aimView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.08,n=this.height,r=this.camera.aspect<.8;if(this.camera.fov=r?60:40,n<10*a.R){var i=100*(10*a.R-n);this.camera.fov-=i*(r?3:1)}this.camera.position.lerp(e.pos.clone().addScaledVector((0,o.Dz)(e.angle),-(18*a.R)),t),this.camera.position.z=n,this.camera.up=o.up,this.camera.lookAt(e.pos.clone().addScaledVector(o.up,n/2))}},{key:"adjustHeight",value:function(e){e=this.height<10*a.R?e/8:e,this.height=i.cj9.clamp(this.height+e,6*a.R,120*a.R),this.height>110*a.R&&this.suggestMode(this.topView),this.height<105*a.R&&this.suggestMode(this.aimView)}},{key:"suggestMode",value:function(e){this.mainMode===this.aimView&&(this.mode=e)}},{key:"forceMode",value:function(e){this.mode=e,this.mainMode=e}},{key:"forceMove",value:function(e){this.mode===this.aimView&&this.aimView(e,1)}},{key:"toggleMode",value:function(){this.mode===this.topView?this.mode=this.aimView:this.mode=this.topView,this.mainMode=this.mode}}],function(e,t){for(var n=0;n0&&(null===(t=this.cuePowerElement)||void 0===t?void 0:t.value)&&(this.cuePowerElement.value=e)}}],function(e,t){for(var n=0;nthis.sentTime+this.period||e.type!==L.B.AIM){this.flush(),this.apply(e),this.sentTime=performance.now();return}this.pending=e}}],function(e,t){for(var n=0;n0&&"RERACK"===this.shots[e].type&&e--,e}},{key:"lastShot",value:function(){var e=this.last();return this.state(this.states[e],[this.shots[e]])}},{key:"currentBreak",value:function(){if(void 0!==this.breakStart)return this.state(this.states[this.breakStart],this.shots.slice(this.breakStart),this.breakStartTime,this.container.rules.previousBreak)}},{key:"state",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return{init:e,shots:t,start:n,now:Date.now(),score:r,wholeGame:i}}},{key:"updateBreak",value:function(e){var t=this.container.rules.isPartOfBreak(e),n=this.container.rules.isEndOfGame(e),r=U.P.potCount(e);if(t||this.breakLink(n),this.lastShotLink(t||n,r,U.P.pots(e)),n&&this.breakLink(n),!t){this.breakStart=void 0;return}void 0===this.breakStart&&(this.breakStart=this.last(),this.breakStartTime=Date.now())}},{key:"lastShotLink",value:function(e,t,n){var r="#000000";n.length>0&&n.forEach(function(e){r="#"+e.ballmesh.color.getHexString()});var i="⚈".repeat(t>1?t-1:0)+(e?"⚈":"⚆"),o=JSON.stringify(this.lastShot());this.generateLink(i,o,r)}},{key:"breakLink",value:function(e){var t=this.currentBreak();if(t&&(e||t.shots.pop(),1!==t.shots.length)){var n=0===this.container.rules.currentBreak?this.container.rules.previousBreak:this.container.rules.currentBreak;t.score=n;var r=JSON.stringify(t);console.log("raw:".concat(r));var i=D.A.crush(r);console.log("crushed:".concat(i)),console.log("encoded:".concat(encodeURIComponent(i))),console.log("decoded:".concat(decodeURIComponent(encodeURIComponent(i))));var o=D.A.uncrush(decodeURIComponent(encodeURIComponent(i)));console.log("uncompressed:".concat(o)),console.log(r==o),this.generateLink("break(".concat(n,")"),i,"black"),n>=4&&this.generateHiScoreLink(i)}}},{key:"wholeGameLink",value:function(){var e=this.wholeGame(),t="frame(".concat(this.shotCount(e.shots)," shots)"),n=JSON.stringify(e),r=D.A.crush(n);this.generateLink(t,r,"black")}},{key:"shotCount",value:function(e){return e.filter(function(e){return"RERACK"!==e.type}).length}},{key:"generateLink",value:function(e,t,n){var r="".concat(this.replayUrl).concat(encodeURIComponent(t));console.log("encoded:".concat(r));var i='').concat(e,"");this.container.eventQueue.push(new B.b(null,"".concat(i)))}},{key:"generateHiScoreLink",value:function(e){var t="".concat(this.hiScoreUrl,"?ruletype=").concat(this.container.rules.rulename,"&state=").concat(encodeURIComponent(e)),n='').concat("hi score 🏆","");this.container.eventQueue.push(new B.b(null,"".concat(n)))}}],function(e,t){for(var n=0;n').concat(e,"")));r.push(new B.b(null,s))})},this.redo.onclick=function(e){var r=new K.W(t.init,t.shots);r.retry=!0,n.interuptEventQueue(r)},this.replay.onclick=function(e){n.interuptEventQueue(t)}}}},{key:"interuptEventQueue",value:function(e){this.container.table.halt();var t=this.container.eventQueue;t.length=0,t.push(new r.T),t.push(e)}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0?this.element.innerHTML="Break
"+e:this.element.innerHTML="")}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0;){this.lastEventTime=this.last;var t=this.inputQueue.shift();t&&this.updateController(this.controller.handleInput(t))}if(this.table.allStationary()){var n=this.eventQueue.shift();n&&(this.lastEventTime=performance.now(),this.updateController(n.applyToController(this.controller)))}}},{key:"animate",value:function(e){var t=this;this.advance((e-this.last)/1e3),this.last=e,this.processEvents(),(e{n.d(t,{m:()=>c});var r=n("./src/controller/controller.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/controller/playshot.ts"),s=n("./src/controller/replay.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,i=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c);var t,n=(t=i.call(this,e)).container.table;return n.cue.aimMode(),n.cue.showHelper(!0),n.cueball=t.container.rules.cueball,n.cue.moveTo(n.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.aimView),n.cue.aimInputs.showOverlap(),t}return n=[{key:"handleInput",value:function(e){switch(e.key){case"Space":this.container.table.cue.adjustPower(e.t*this.scale*.7);break;case"SpaceUp":return this.playShot();default:if(!this.commonKeyHandler(e))return this}return this.container.sendEvent(this.container.table.cue.aim),this}},{key:"handleBreak",value:function(e){return new s.e(this.container,e.init,e.shots,e.retry)}},{key:"playShot",value:function(){var e=new r.Qe(this.container.table.serialise());return this.container.sendEvent(e),this.container.recorder.record(e),new o.H(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{Qe:()=>r.Q,pd:()=>i.p,xI:()=>o}),n("./src/events/beginevent.ts"),n("./src/events/aimevent.ts");var r=n("./src/events/hitevent.ts"),i=n("./src/events/input.ts");n("./src/events/abortevent.ts"),n("./src/events/stationaryevent.ts");var o=function(){var e;function t(e){var n,r;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r=void 0,(n="container")in this?Object.defineProperty(this,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[n]=r,this.container=e}return e=[{key:"handleInput",value:function(e){return this}},{key:"handleBegin",value:function(e){return this}},{key:"handleBreak",value:function(e){return this}},{key:"handleStartAim",value:function(e){return this}},{key:"handleAim",value:function(e){return this}},{key:"handleHit",value:function(e){return this}},{key:"handleAbort",value:function(e){return this}},{key:"handleWatch",value:function(e){return this}},{key:"handlePlaceBall",value:function(e){return this}},{key:"handleStationary",value:function(e){return this}},{key:"handleChat",value:function(e){return this}},{key:"handleRejoin",value:function(e){return this}},{key:"onFirst",value:function(){}}],function(e,t){for(var n=0;n{n.d(t,{y:()=>f});var r=n("./src/controller/controller.ts"),i=n("./src/controller/end.ts"),o=n("./src/utils/gltf.ts"),s=n("./src/model/outcome.ts"),a=n("./node_modules/three/build/three.module.js");function l(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}var f=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(f,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=c(f);return e=t?Reflect.construct(n,arguments,c(this).constructor):n.apply(this,arguments),e&&("object"===h(e)||"function"==typeof e)?e:l(this)});function f(){var e,t,n;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,f),e=r.apply(this,arguments),(n="scale")in(t=l(e))?Object.defineProperty(t,n,{value:.001,enumerable:!0,configurable:!0,writable:!0}):t[n]=.001,e}return n=[{key:"handleAbort",value:function(e){return new i.o(this.container)}},{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}},{key:"hit",value:function(){this.container.table.outcome=[s.P.hit(this.container.table.cueball,this.container.table.cue.aim.power)],this.container.table.hit(),this.container.view.camera.suggestMode(this.container.view.camera.aimView),this.container.table.cue.showHelper(!1)}},{key:"commonKeyHandler",value:function(e){var t=this.container.table.cue,n=e.t*this.scale;switch(e.key){case"ArrowLeft":return t.rotateAim(-n,this.container.table),!0;case"ArrowRight":return t.rotateAim(n,this.container.table),!0;case"ArrowDown":return t.adjustSpin(new a.Pq0(0,-n),this.container.table),!0;case"ArrowUp":return t.adjustSpin(new a.Pq0(0,n),this.container.table),!0;case"ShiftArrowLeft":return t.adjustSpin(new a.Pq0(n,0),this.container.table),!0;case"ShiftArrowRight":return t.adjustSpin(new a.Pq0(-n,0),this.container.table),!0;case"KeyPUp":return(0,o.KP)(this.container.view.scene),!0;case"KeyHUp":return t.toggleHelper(),!0;case"movementXUp":return t.rotateAim(2*n,this.container.table),!0;case"movementYUp":case"NumpadSubtract":return this.container.view.camera.adjustHeight(8*n),!0;case"NumpadAdd":return this.container.view.camera.adjustHeight(-(8*n)),!0;case"KeyOUp":return this.container.view.camera.toggleMode(),!0;case"KeyDUp":return this.togglePanel(),!0;case"KeyFUp":return this.toggleFullscreen(),!0;default:return!1}}},{key:"togglePanel",value:function(){this.container.sliders.toggleVisibility(),this.container.table.showSpin(!0),this.container.table.showTraces(!0),("undefined"==typeof process?"undefined":h(process))!=="object"&&console.log(this.container.table.serialise())}},{key:"toggleFullscreen",value:function(){document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{o:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(){return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),o.apply(this,arguments)}return n=[{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}}],function(e,t){for(var n=0;n{n.d(t,{x:()=>p});var r=n("./src/controller/controllerbase.ts"),i=n("./src/controller/controller.ts"),o=n("./src/controller/aim.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/model/physics/constants.ts"),l=n("./node_modules/three/build/three.module.js"),c=n("./src/view/cuemesh.ts");function u(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var p=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}(p,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=h(p);return e=t?Reflect.construct(n,arguments,h(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:u(this)});function p(e){var t,n,i,o;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,p),n=u(t=r.call(this,e)),i="placescale",o=.02*a.R,i in n?Object.defineProperty(n,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[i]=o,t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.table.cue.aim.power=0,t.container.view.camera.forceMode(t.container.view.camera.aimView),t}return n=[{key:"onFirst",value:function(){var e=this.container.table.cueball;this.container.rules.allowsPlaceBall()&&e.pos.copy(this.container.rules.placeBall()),e.setStationary(),e.updateMesh(0),this.container.table.cue.placeBallMode(),this.container.table.cue.showHelper(!1),this.container.table.cue.moveTo(this.container.table.cueball.pos),this.container.table.cue.aimInputs.setButtonText("Place\nBall"),this.container.rules.allowsPlaceBall()||this.container.inputQueue.push(new i.pd(1,"SpaceUp"))}},{key:"handleInput",value:function(e){var t=this.container.table.cueball.pos;switch(e.key){case"ArrowLeft":case"KeyI":this.moveTo(0,e.t*this.placescale);break;case"ArrowRight":case"KeyK":this.moveTo(0,-e.t*this.placescale);break;case"movementXUp":this.moveTo(0,-e.t*this.placescale*2);break;case"movementYUp":this.moveTo(-e.t*this.placescale*2,0);break;case"KeyJ":this.moveTo(-e.t*this.placescale,0);break;case"KeyL":this.moveTo(e.t*this.placescale,0);break;case"SpaceUp":return this.placed();default:this.commonKeyHandler(e)}return this.container.table.cue.moveTo(t),this.container.view.camera.forceMove(this.container.table.cue.aim),this.container.sendEvent(this.container.table.cue.aim),this}},{key:"moveTo",value:function(e,t){var n=new l.Pq0(e,t),r=this.container.table.cueball.pos.add(n);r.copy(this.container.rules.placeBall(r)),c.l.indicateValid(!this.container.table.overlapsAny(r))}},{key:"placed",value:function(){return this.container.table.overlapsAny(this.container.table.cueball.pos)?this:(this.container.table.cue.aimInputs.setButtonText("Hit"),this.container.sound.playNotify(),this.container.sendEvent(new s.W(this.container.table.shortSerialise())),new o.m(this.container))}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{H:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),(t=o.call(this,e)).hit(),t}return n=[{key:"handleStationary",value:function(e){var t=this.container.table,n=t.outcome,r=this.container.rules.update(n);return this.container.recorder.updateBreak(n),t.cue.aimAtNext(t.cueball,this.container.rules.nextCandidateBall()),r}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}}],function(e,t){for(var n=0;n{n.d(t,{e:()=>v});var r=n("./src/events/hitevent.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/events/aimevent.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/controller/aim.ts"),l=n("./src/events/eventtype.ts"),c=n("./src/events/rerackevent.ts");function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1500;if(!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),f(h(r=i.call(this,e)),"delay",void 0),f(h(r),"shots",void 0),f(h(r),"firstShot",void 0),f(h(r),"timer",void 0),f(h(r),"init",void 0),r.init=t,r.shots=m(n),r.firstShot=r.shots[0],r.delay=a,r.container.table.showTraces(!0),r.container.table.updateFromShortSerialised(r.init),o){var l=new s.W(t,n);l.retry=!0,r.container.eventQueue.push(l)}else r.container.view.camera.forceMode(r.container.view.camera.topView),r.playNextShot(1.5*r.delay);return r}return n=[{key:"playNextShot",value:function(e){var t=this,n=this.shots.shift();if((null==n?void 0:n.type)===l.B.RERACK){c.x.fromJson(n.ballinfo).applyToController(this),this.shots.length>0&&this.playNextShot(e);return}var i=o.w.fromJson(n);this.container.table.cueball=this.container.table.balls[i.i],console.log(this.container.table.cueball.pos.distanceTo(i.pos)),this.container.table.cueball.pos.copy(i.pos),this.container.table.cue.aim=i,this.container.table.cue.updateAimInput(),this.container.table.cue.t=1,clearTimeout(this.timer),this.timer=setTimeout(function(){t.container.eventQueue.push(new r.Q(t.container.table.cue.aim)),t.timer=void 0},e)}},{key:"handleHit",value:function(e){return this.hit(),this}},{key:"handleStationary",value:function(e){return this.shots.length>0&&void 0===this.timer&&this.playNextShot(this.delay),this}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}},{key:"handleBreak",value:function(e){return(this.container.table.updateFromShortSerialised(e.init),this.shots=m(e.shots),this.container.table.showSpin(!0),e.retry)?this.retry():(this.playNextShot(this.delay),this)}},{key:"retry",value:function(){clearTimeout(this.timer),this.timer=void 0,this.container.table.updateFromShortSerialised(this.init);var e=o.w.fromJson(this.firstShot);return this.container.table.cueball=this.container.table.balls[e.i],this.container.rules.cueball=this.container.table.cueball,this.container.table.cueball.pos.copy(e.pos),this.container.table.cue.aim=e,this.container.view.camera.forceMode(this.container.view.camera.aimView),new a.m(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{V:()=>O});var r=n("./src/events/watchevent.ts"),i=n("./src/utils/rack.ts"),o=n("./node_modules/three/build/three.module.js"),s=n("./src/controller/aim.ts"),a=n("./src/controller/placeball.ts"),l=n("./src/controller/watchaim.ts"),c=n("./src/events/chatevent.ts"),u=n("./src/events/placeballevent.ts"),h=n("./src/model/outcome.ts"),f=n("./src/model/table.ts"),p=n("./src/utils/utils.ts"),d=n("./src/controller/end.ts"),m=n("./src/model/physics/constants.ts"),v=n("./src/utils/respot.ts"),y=n("./src/view/tablegeometry.ts"),b=n("./src/events/startaimevent.ts");function g(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var w=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),g(this,"container",void 0),g(this,"cueball",void 0),g(this,"currentBreak",0),g(this,"previousBreak",0),g(this,"score",0),g(this,"rulename","nineball"),this.container=e}return e=[{key:"startTurn",value:function(){this.previousBreak=this.currentBreak,this.currentBreak=0}},{key:"nextCandidateBall",value:function(){return v.k.closest(this.container.table.cueball,this.container.table.balls)}},{key:"placeBall",value:function(e){if(e){var t=new o.Pq0(-y.P.X/2,y.P.tableY),n=new o.Pq0(-y.P.tableX,-y.P.tableY);return e.clamp(n,t)}return new o.Pq0(-(11*m.R)/.5,0,0)}},{key:"asset",value:function(){return"models/p8.min.gltf"}},{key:"tableGeometry",value:function(){y.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"rack",value:function(){return i.m.diamond()}},{key:"update",value:function(e){var t=this.container.table;if(h.P.isCueBallPotted(t.cueball,e))return(this.startTurn(),this.container.isSinglePlayer)?new a.x(this.container):(this.container.sendEvent(new u.z(p.v_,!0)),new l.r(this.container));if(h.P.isBallPottedNoFoul(t.cueball,e)){var n=h.P.potCount(e);return(this.currentBreak+=n,this.score+=n,this.container.sound.playSuccess(t.inPockets()),this.isEndOfGame(e))?(this.container.eventQueue.push(new c.b(null,"game over")),this.container.recorder.wholeGameLink(),new d.o(this.container)):(this.container.sendEvent(new r.Q(t.serialise())),new s.m(this.container))}return(this.container.sendEvent(new b.M),this.container.isSinglePlayer)?(this.container.sendEvent(new r.Q(t.serialise())),this.startTurn(),new s.m(this.container)):new l.r(this.container)}},{key:"isPartOfBreak",value:function(e){return h.P.isBallPottedNoFoul(this.container.table.cueball,e)}},{key:"isEndOfGame",value:function(e){var t=this.container.table.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===this.cueball}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"allowsPlaceBall",value:function(){return!0}}],function(e,t){for(var n=0;n{n.d(t,{c:()=>k});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/events/watchevent.ts"),o=n("./src/model/outcome.ts"),s=n("./src/utils/rack.ts"),a=n("./src/utils/respot.ts"),l=n("./src/controller/aim.ts"),c=n("./src/controller/watchaim.ts"),u=n("./src/events/chatevent.ts"),h=n("./src/controller/end.ts"),f=n("./src/model/table.ts"),p=n("./src/view/tablegeometry.ts"),d=n("./src/controller/placeball.ts"),m=n("./src/events/placeballevent.ts"),v=n("./src/utils/utils.ts"),y=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"shotInfo",value:function(e,n,r){var i=o.P.firstCollision(n);return{pots:o.P.potCount(n),firstCollision:i,legalFirstCollision:t.isLegalFirstCollision(e,r,i),whitePotted:o.P.isCueBallPotted(e.cueball,n)}}},{key:"isLegalFirstCollision",value:function(e,n,r){if(!r)return!1;var i=r.ballB.id;return n?i>=7:!(t.coloursOnTable(e).filter(function(e){return e.id0)}},{key:"respotAllPottedColours",value:function(e,t){return o.P.pots(t).filter(function(e){return e.id<7}).filter(function(e){return 0!==e.id}).map(function(t){return a.k.respot(t,e)})}},{key:"redsOnTable",value:function(e){return e.balls.slice(7).filter(function(e){return e.onTable()})}},{key:"coloursOnTable",value:function(e){return e.balls.slice(1,7).filter(function(e){return e.onTable()})}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0,this.switchPlayer()}return this.targetIsRed?this.targetRedRule(e,t):this.targetColourRule(e,t)}},{key:"targetRedRule",value:function(e,t){return(console.log("applying target red rule"),t.legalFirstCollision&&o.P.onlyRedsPotted(e))?(this.currentBreak+=t.pots,this.targetIsRed=!1,this.previousPotRed=!0,this.container.hud.updateBreak(this.currentBreak),this.continueBreak()):(this.foulPoints=this.foulCalculation(e,t),this.respot(e),t.whitePotted)?this.whiteInHand():this.switchPlayer()}},{key:"targetColourRule",value:function(e,t){if(console.log("applying target colour rule"),t.whitePotted)return this.respot(e),this.whiteInHand();if(t.pots>1)return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer();if(o.P.pots(e)[0].id>6)return this.foulPoints=this.foulCalculation(e,t),this.switchPlayer();this.targetIsRed=y.redsOnTable(this.container.table).length>0;var n=o.P.pots(e)[0].id;return n!==t.firstCollision.ballB.id?this.foul(e,t):this.previousPotRed?(this.respot(e),this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak()):y.coloursOnTable(this.container.table).filter(function(e){return e.id0?this.foul(e,t):(this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak())}},{key:"foul",value:function(e,t){return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer()}},{key:"foulCalculation",value:function(e,t){var n,r,i,s,a=o.P.pots(e).map(function(e){return e.id}).filter(function(e){return e<7}),l=null!==(s=null===(i=t.firstCollision)||void 0===i?void 0:null===(r=i.ballB)||void 0===r?void 0:r.id)&&void 0!==s?s:0;return l>6&&(l=0),(n=Math).max.apply(n,[3,l].concat(function(e){if(Array.isArray(e))return g(e)}(a)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return g(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,void 0)}}(a)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))+1}},{key:"tableGeometry",value:function(){p.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"isPartOfBreak",value:function(e){return this.currentBreak>0}},{key:"isEndOfGame",value:function(e){return o.P.isClearTable(this.container.table)&&this.currentBreak>0}},{key:"allowsPlaceBall",value:function(){return!0}},{key:"asset",value:function(){return t.tablemodel}},{key:"startTurn",value:function(){this.previousPotRed=!1,this.targetIsRed=y.redsOnTable(this.container.table).length>0,this.previousBreak=this.currentBreak,this.score+=this.currentBreak,this.currentBreak=0,this.container.hud.updateBreak(this.currentBreak)}},{key:"rack",value:function(){return s.m.snooker()}},{key:"nextCandidateBall",value:function(){var e=this.container.table,t=y.redsOnTable(e),n=y.coloursOnTable(e);return this.previousPotRed?a.k.closest(e.cueball,n):t.length>0?a.k.closest(e.cueball,t):n.length>0?n[0]:void 0}},{key:"placeBall",value:function(e){if(e){var t=new r.Pq0(s.m.baulk,0,0),n=s.m.sixth,i=e.distanceTo(t);if(e.x>=s.m.baulk&&(e.x=s.m.baulk),!(i>n))return e;var o=e.clone().sub(t).normalize();return t.add(o.multiplyScalar(n))}return new r.Pq0(s.m.baulk,-s.m.sixth/2.6,0)}},{key:"switchPlayer",value:function(){this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),console.log("end of break, switch player");var e=this.container.table;return(console.log(e.cue.aim),this.container.sendEvent(new b.M(this.foulPoints)),this.container.isSinglePlayer)?(this.container.sendEvent(new i.Q(e.serialise())),this.startTurn(),new l.m(this.container)):new c.r(this.container)}},{key:"continueBreak",value:function(){this.container.hud.updateBreak(this.currentBreak);var e=this.container.table;return(this.container.sound.playSuccess(e.inPockets()),o.P.isClearTable(e))?(this.container.eventQueue.push(new u.b(null,"game over")),this.container.recorder.wholeGameLink(),new h.o(this.container)):(this.container.sendEvent(new i.Q(e.serialise())),new l.m(this.container))}},{key:"whiteInHand",value:function(){return(this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),this.startTurn(),this.container.isSinglePlayer)?new d.x(this.container):(this.container.sendEvent(new m.z(v.v_,!0)),new c.r(this.container))}},{key:"update",value:function(e){return this.snookerrule(e)}},{key:"respot",value:function(e){var t=y.respotAllPottedColours(this.container.table,e);if(t.length>0){var n={balls:t.map(function(e){return e.serialise()}),rerack:!0},r=new i.Q(n);this.container.sendEvent(r),this.container.recorder.record(r)}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>s});var r=n("./src/controller/watchshot.ts");function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=i(a);return e=t?Reflect.construct(n,arguments,i(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(t=s.call(this,e)).container.table.cueball=t.container.rules.otherPlayersCueBall(),t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.topView),t}return n=[{key:"handleAim",value:function(e){return this.container.table.cue.aim=e,this.container.table.cueball.pos.copy(e.pos),this}},{key:"handleHit",value:function(e){return this.container.table.updateFromSerialised(e.tablejson),new r.O(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{O:()=>c});var r=n("./src/controller/aim.ts"),i=n("./src/controller/watchaim.ts"),o=n("./src/controller/controllerbase.ts"),s=n("./src/controller/placeball.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c),(t=o.call(this,e)).container.table.outcome=[],t.container.table.hit(),t}return n=[{key:"handleStartAim",value:function(e){return new r.m(this.container)}},{key:"handlePlaceBall",value:function(e){return new s.x(this.container)}},{key:"handleWatch",value:function(e){return"rerack"in e.json?(console.log("Respot"),this.container.table.updateFromSerialised(e.json),this):new i.r(this.container)}}],function(e,t){for(var n=0;n{var r,i,o,s,a,l,c,u,h,f=n("./src/model/physics/physics.ts"),p=n("./node_modules/three/build/three.module.js");function d(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var m=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),d(this,"canvas",void 0),d(this,"context",void 0),d(this,"endx",100),d(this,"endy",100),d(this,"scale",2e3),d(this,"r",20),e.firstElementChild.innerHTML=n,this.canvas=e.lastElementChild,this.context=this.canvas.getContext("2d")}return e=[{key:"drawBall",value:function(){this.context.beginPath(),this.context.strokeStyle="lightgray",this.context.fillStyle="beige",this.context.arc(this.endx,this.endy,this.r,0,2*Math.PI,!1),this.context.fill(),this.context.stroke()}},{key:"drawCushion",value:function(){var e=this.context.createLinearGradient(10,90,200,90);e.addColorStop(0,"lightgray"),e.addColorStop(.75,"white"),this.context.fillStyle=e,this.context.fillRect(this.endx+this.r,10,200,250)}},{key:"plot",value:function(e,t,n,r,i){this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.drawCushion(),this.drawBall();for(var o=e;o<=t;o+=n){var s=r(o),a=i(o),l=(0,f.yO)(s,a)?[]:[2,2];this.context.setLineDash(l);var c=(o+360)*101%360;this.context.strokeStyle="hsl(".concat(c,",50%,50%)"),this.drawArrow(this.endx-s.x*this.scale,this.endy-s.y*this.scale,this.endx,this.endy);var u=(0,f.QK)(0,s,a,f.QV);s.add(u.v),this.drawArrow(this.endx,this.endy,this.endx+s.x*this.scale,this.endy+s.y*this.scale)}}},{key:"drawArrow",value:function(e,t,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.9,o={dx:n-e,dy:r-t},s={x:o.dx*i+e,y:o.dy*i+t},a={dx:n-s.x,dy:r-s.y};this.context.beginPath(),this.context.moveTo(e,t),this.context.lineTo(s.x,s.y),this.context.moveTo(s.x+.5*a.dy,s.y-.5*a.dx),this.context.lineTo(s.x-.5*a.dy,s.y+.5*a.dx),this.context.lineTo(n,r),this.context.closePath(),this.context.stroke()}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n{n.d(t,{h:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.ABORT,e}return n=[{key:"applyToController",value:function(e){return e.handleAbort(this)}}],function(e,t){for(var n=0;n{n.d(t,{w:()=>f});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts"),s=n("./node_modules/three/build/three.module.js");function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e,t){for(var n=0;n{n.d(t,{u:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.BEGIN,e}return n=[{key:"applyToController",value:function(e){return e.handleBegin(this)}}],function(e,t){for(var n=0;n{n.d(t,{W:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{b:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{var r;n.d(t,{B:()=>r}),function(e){e.BEGIN="BEGIN",e.BREAK="BREAK",e.WATCHAIM="WATCHAIM",e.AIM="AIM",e.HIT="HIT",e.STATIONARY="STATIONARY",e.CHAT="CHAT",e.ABORT="ABORT",e.PLACEBALL="PLACEBALL",e.REJOIN="REJOIN",e.RERACK="RERACK",e.STARTAIM="STARTAIM"}(r||(r={}))},"./src/events/gameevent.ts":(e,t,n)=>{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{F:()=>i});var i=function e(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"type",void 0),r(this,"sequence",void 0)}},"./src/events/hitevent.ts":(e,t,n)=>{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{p:()=>i});var i=function e(t,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"t",void 0),r(this,"key",void 0),this.t=t,this.key=n}},"./src/events/keyboard.ts":(e,t,n)=>{n.d(t,{s:()=>a});var r=n("./src/events/input.ts"),i=n("./node_modules/interactjs/dist/interact.min.js"),o=n.n(i);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){var n=this;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),s(this,"pressed",{}),s(this,"released",{}),s(this,"keydown",function(e){null==n.pressed[e.code]&&(n.pressed[e.code]=performance.now()),e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"keyup",function(e){n.released[e.code]=performance.now()-n.pressed[e.code],delete n.pressed[e.code],e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"mousetouch",function(e){var t,r,i=n.released,o=e.client.yMath.abs(i.movementY)&&(i.movementY=0)}),this.addHandlers(e),/Android|iPhone/i.test(navigator.userAgent)||(e.contentEditable="true")}return e=[{key:"getEvents",value:function(){var e=this,t=Object.keys(this.pressed).filter(function(e){return!/Shift/.test(e)}).filter(function(e){return!/Control/.test(e)}),n=Object.keys(this.pressed).some(function(e){return/Shift/.test(e)}),i=Object.keys(this.pressed).some(function(e){return/Control/.test(e)}),o=[];return t.forEach(function(t){var s=performance.now()-e.pressed[t];o.push(new r.p(i?s/3:s,n?"Shift"+t:t)),"Space"!=t&&(e.pressed[t]=performance.now())}),Object.keys(this.released).forEach(function(t){return o.push(new r.p(e.released[t],t+"Up"))}),this.released={},o}},{key:"addHandlers",value:function(e){var t=this;e.addEventListener("keydown",this.keydown),e.addEventListener("keyup",this.keyup),e.focus(),o()(e).draggable({listeners:{move:function(e){t.mousetouch(e)}}}),o()(e).gesturable({onmove:function(e){e.dx/=3,t.mousetouch(e)}})}}],function(e,t){for(var n=0;n{n.d(t,{z:()=>h});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t){for(var n=0;n{n.d(t,{x:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{M:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),(t="foul")in(e=o(n=c.call(this)))?Object.defineProperty(e,t,{value:0,enumerable:!0,configurable:!0,writable:!0}):e[t]=0,n.type=i.B.STARTAIM,n.foul=r,n}return n=[{key:"applyToController",value:function(e){return e.handleStartAim(this)}}],r=[{key:"fromJson",value:function(e){return new u(e.foul)}}],n&&s(u.prototype,n),r&&s(u,r),u}(r.F)},"./src/events/stationaryevent.ts":(e,t,n)=>{n.d(t,{T:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.STATIONARY,e}return n=[{key:"applyToController",value:function(e){return e.handleStationary(this)}}],function(e,t){for(var n=0;n{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{c:()=>d,U:()=>r});var r,i=n("./src/utils/utils.ts"),o=n("./src/model/physics/physics.ts"),s=n("./node_modules/three/build/three.module.js"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"line",void 0),l(this,"geometry",void 0),l(this,"positions",void 0),l(this,"lastPos",new s.Pq0),l(this,"lastVel",new s.Pq0),this.geometry=new s.LoY,this.positions=new Float32Array(3*e),this.geometry.setAttribute("position",new s.THS(this.positions,3)),this.reset();var r=new s.mrM({color:n,opacity:.25,linewidth:3,transparent:!0});this.line=new s.N1A(this.geometry,r),this.line.visible=!1}return e=[{key:"reset",value:function(){this.geometry.setDrawRange(0,0),this.lastVel.setZ(1)}},{key:"forceTrace",value:function(e){this.lastVel.z=1,this.addTraceGiven(e,this.lastVel,1,.1,1)}},{key:"addTrace",value:function(e,t){if(0!==t.length()){var n=this.lastVel.angleTo(t),r=n>Math.PI/32?.01*a.R:a.R,i=this.lastPos.distanceTo(e);this.addTraceGiven(e,t,i,r,n)}}},{key:"addTraceGiven",value:function(e,t,n,r,i){var o=this.geometry.drawRange.count;0!==o&&n1&&i<1e-4&&o--,this.lastPos.copy(e),this.lastVel.copy(t),this.addPoint(e,o))}},{key:"addPoint",value:function(e,t){var n=3*t;n>this.positions.length||(this.positions[n++]=e.x,this.positions[n++]=e.y,this.positions[n]=e.z,this.geometry.setDrawRange(0,t+1),this.line.geometry.attributes.position.needsUpdate=!0)}}],function(e,t){for(var n=0;nMath.abs(this.rvel.z))&&(this.setStationary(),!0)}},{key:"setStationary",value:function(){this.vel.copy(i.v_),this.rvel.copy(i.v_),this.state="Stationary"}},{key:"isRolling",value:function(){return 0!==this.vel.lengthSq()&&0!==this.rvel.lengthSq()&&(0,o.Mq)(this.vel,this.rvel).length(){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{P:()=>o}),!function(e){e.Pot="Pot",e.Cushion="Cushion",e.Collision="Collision",e.Hit="Hit"}(i||(i={}));var i,o=function(){var e;function t(e,n,i,o){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r(this,"type",void 0),r(this,"timestamp",void 0),r(this,"ballA",null),r(this,"ballB",null),r(this,"incidentSpeed",void 0),this.type=e,this.ballA=n,this.ballB=i,this.incidentSpeed=o,this.timestamp=Date.now()}return e=[{key:"pot",value:function(e,n){return new t("Pot",e,e,n)}},{key:"cushion",value:function(e,n){return new t("Cushion",e,e,n)}},{key:"collision",value:function(e,n,r){return new t("Collision",e,n,r)}},{key:"hit",value:function(e,n){return new t("Hit",e,e,n)}},{key:"isCueBallPotted",value:function(e,t){return t.some(function(t){return"Pot"==t.type&&t.ballA===e})}},{key:"isBallPottedNoFoul",value:function(e,n){return n.some(function(e){return"Pot"==e.type&&null!==e.ballA})&&!t.isCueBallPotted(e,n)}},{key:"pots",value:function(e){return e.filter(function(e){return"Pot"==e.type}).map(function(e){return e.ballA})}},{key:"potCount",value:function(e){return this.pots(e).length}},{key:"onlyRedsPotted",value:function(e){return this.pots(e).every(function(e){return e.id>6})}},{key:"firstCollision",value:function(e){var t=e.filter(function(e){return"Collision"===e.type});return t.length>0?t[0]:void 0}},{key:"isClearTable",value:function(e){var t=e.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===e.cueball}},{key:"isThreeCushionPoint",value:function(e,n){n=t.cueBallFirst(e,n).filter(function(t){return t.ballA===e});var r=new Set,i=0,o=!0,s=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(o=(l=c.next()).done);o=!0){var u=l.value;if("Cushion"===u.type&&i++,"Collision"===u.type&&(r.add(u.ballB),2===r.size))return i>=3}}catch(e){s=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(s)throw a}}return!1}},{key:"cueBallFirst",value:function(e,t){return t.forEach(function(t){"Collision"===t.type&&t.ballB===e&&(t.ballB=t.ballA,t.ballA=e)}),t}}],function(e,t){for(var n=0;n{n.d(t,{I:()=>o,Mz:()=>r,Qg:()=>v,R:()=>f,Wv:()=>b,Ys:()=>g,cM:()=>w,e:()=>p,g:()=>s,gT:()=>c,gf:()=>l,jG:()=>m,kL:()=>u,kM:()=>k,m:()=>h,mu:()=>a,x3:()=>i,xO:()=>y});var r,i,o,s=9.8,a=.00985,l=.15,c=.8,u=.024,h=.23,f=.03275,p=.86;function d(){r=a*h*s*2/3*u,i=7/(5*Math.sqrt(2))*f*a*h*s,o=.4*h*f*f}function m(e){f=e,d()}function v(e){h=e,d()}function y(e){a=e,d()}function b(e){u=e,d()}function g(e){l=e}function w(e){p=e}function k(e){c=e}d()},"./src/model/physics/knuckle.ts":(e,t,n)=>{n.d(t,{O:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/view/pocketgeometry.ts");function o(e,t){for(var n=0;n{n.d(t,{$8:()=>P,Gp:()=>g,JD:()=>u,Mq:()=>a,QK:()=>f,QV:()=>R,Un:()=>b,c0:()=>y,lx:()=>h,p2:()=>c,s0:()=>v,t6:()=>S,yO:()=>w});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/utils/utils.ts"),o=n("./src/model/physics/constants.ts"),s=new r.Pq0;function a(e,t){return s.copy(e).addScaledVector((0,i.KM)(t),o.R)}var l={v:new r.Pq0,w:new r.Pq0};function c(e,t){var n=a(e,t).setZ(0);return l.v.copy((0,i.xb)(n).multiplyScalar(-o.gf*o.g)),l.w.copy((0,i.xb)((0,i.KM)(n)).multiplyScalar(2.5*o.gf*o.g/o.R)),l.w.setZ(-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(t.z)),l}function u(e){var t=new r.Pq0(e.x,e.y,0).length(),n=5/7*o.x3/(o.m*o.R)/t,i=5/7*o.x3/(o.m*o.R*o.R)/t;return l.v.set(-n*e.y,n*e.x,0),l.w.set(-i*e.x,-i*e.y,-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(e.z)),l}function h(e,t){var n=t.z;t.copy((0,i.KM)(e).multiplyScalar(1/o.R)),t.setZ(n)}function f(e,t,n,r){var o=r(t.clone().applyAxisAngle(i.up,e),n.clone().applyAxisAngle(i.up,e));return o.v.applyAxisAngle(i.up,-e),o.w.applyAxisAngle(i.up,-e),o}Object.freeze(l);var p=Math.asin(.1*o.R/o.R),d=Math.sin(p),m=Math.cos(p);function v(e,t){return new r.Pq0(e.x*d-e.z*m+o.R*t.y,-e.y-o.R*t.z*m+o.R*t.x*d)}function y(e){return e.x*m}function b(e){var t=3.5/o.m;return e.length()/t}function g(e){var t,n=1/o.m,i=.39+.257*(t=new r.Pq0(e/m,0,0)).x-.044*t.x*t.x;return o.gT*((1+i)*e)/n}function w(e,t){var n=g(y(e));return b(v(e,t))<=n}function k(e,t){return{c:y(e),s:v(e,t),A:3.5/o.m,B:1/o.m}}function T(e,t){var n=k(e,t),r=n.c,i=n.s,s=n.A,a=n.B,l=(1+o.e)*(r/a);return A(-i.x/s*d-l*m,i.y/s,i.x/s*m-l*d)}function x(e,t){var n=k(e,t),r=n.c,i=n.B,s=(1+o.e)*(r/i),a=.471-.241*Math.atan2(Math.abs(e.y),e.x),l=Math.atan2(e.y,e.x),c=Math.cos(l);return A(-a*s*c*m-s*m,a*s*Math.sin(l),a*s*c*m-s*d)}function R(e,t){return w(e,t)?T(e,t):x(e,t)}function P(e,t){var n=T(e,t),r=x(e,t),i=Math.sign(e.y)===Math.sign(t.z)?Math.cos(Math.atan2(e.y,e.x)):1;return{v:r.v.lerp(n.v,i),w:r.w.lerp(n.w,i)}}function A(e,t,n){return{v:new r.Pq0(e/o.m,t/o.m),w:new r.Pq0(-o.R/o.I*t*d,o.R/o.I*(e*d-n*m),o.R/o.I*t*m)}}function S(e,t){var n=Math.atan2(-e.x,e.y),r=2.5*t.length()*(e.length()*o.R)/(o.R*o.R),s=t.clone().normalize();return(0,i.KM)(s).applyAxisAngle(s,n).multiplyScalar(r)}},"./src/model/physics/pocket.ts":(e,t,n)=>{n.d(t,{Z:()=>l});var r=n("./src/model/ball.ts"),i=n("./src/model/physics/constants.ts"),o=n("./src/utils/utils.ts");function s(e,t){for(var n=0;nthis.radius-i.R){var s=this.pos.clone().sub(e.pos).normalize().setZ(0);n>-i.R/2&&e.vel.addScaledVector(s,7*i.R*t*i.g),0>e.vel.dot(s)&&(e.ballmesh.trace.forceTrace(e.pos),e.vel.x=s.x*e.vel.length()/2,e.vel.y=s.y*e.vel.length()/2)}var a=this.restingDepth(e);n{n.d(t,{X:()=>b});var r=n("./src/view/tablegeometry.ts"),i=n("./src/model/physics/physics.ts"),o=n("./src/view/pocketgeometry.ts"),s=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"bounceAny",value:function(e,n){var o=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i.$8,a=e.futurePosition(n);if(t.willBounceLong(a,o)){var l=a.y>r.P.tableY?-Math.PI/2:Math.PI/2;return t.bounceIn(l,e,s)}if(t.willBounceShort(a,o)){var c=a.x>r.P.tableX?0:Math.PI;return t.bounceIn(c,e,s)}}},{key:"willBounceShort",value:function(e,n){return n?t.willBounceShortSegment(o.f.pockets.pocketNW.knuckleSW.pos.y,o.f.pockets.pocketSW.knuckleNW.pos.y,e):t.willBounceShortSegment(r.P.Y,-r.P.Y,e)}},{key:"willBounceLong",value:function(e,n){return n?t.willBounceLongSegment(o.f.pockets.pocketNW.knuckleNE.pos.x,o.f.pockets.pocketN.knuckleNW.pos.x,e)||t.willBounceLongSegment(o.f.pockets.pocketN.knuckleNE.pos.x,o.f.pockets.pocketNE.knuckleNW.pos.x,e):t.willBounceLongSegment(-r.P.X,r.P.X,e)}},{key:"willBounceLongSegment",value:function(e,t,n){return n.x>e&&n.xr.P.tableY}},{key:"willBounceShortSegment",value:function(e,t,n){return n.y>t&&n.yr.P.tableX}},{key:"bounceIn",value:function(e,t,n){t.ballmesh.trace.forceTrace(t.futurePos);var r=(0,i.QK)(e,t.vel,t.rvel,n);return t.vel.add(r.v),t.rvel.add(r.w),r.v.length()}}],function(e,t){for(var n=0;n100)throw Error("Depth exceeded resolving collisions");this.balls.forEach(function(t){t.update(e)})}},{key:"prepareAdvanceAll",value:function(e){var t=this;return this.pairs.every(function(n){return t.prepareAdvancePair(n.a,n.b,e)})&&this.balls.every(function(n){return t.prepareAdvanceToCushions(n,e)})}},{key:"prepareAdvancePair",value:function(e,t,n){if(c.willCollide(e,t,n)){var r=c.collide(e,t);return this.outcome.push(d.P.collision(e,t,r)),!1}return!0}},{key:"prepareAdvanceToCushions",value:function(e,t){if(!e.onTable())return!0;var n=e.futurePosition(t);if(Math.abs(n.y)1&&void 0!==arguments[1]?arguments[1]:this.cueball;return this.balls.filter(function(e){return e!==t}).some(function(t){return t.pos.distanceTo(e)<2*l.R})}}],t=[{key:"fromSerialised",value:function(e){var t=new n(e.balls.map(function(e){return a.c.fromSerialised(e)}));return t.updateFromSerialised(e),t}}],e&&v(n.prototype,e),t&&v(n,t),n}()},"./src/utils/gltf.ts":(e,t,n)=>{let r,i,o,s;n.d(t,{KP:()=>e_,Ro:()=>eI});var a=n("./node_modules/three/build/three.module.js");function l(e,t=1/0,n=null){i||(i=new a.bdM(2,2,1,1)),o||(o=new a.BKk({uniforms:{blitTexture:new a.nc$(e)},vertexShader:` +"use strict";(self.webpackChunkbilliards=self.webpackChunkbilliards||[]).push([[338],{"./src/container/container.ts":(e,t,n)=>{n.d(t,{m:()=>J});var r=n("./src/events/stationaryevent.ts"),i=n("./node_modules/three/build/three.module.js"),s=n("./src/utils/utils.ts"),o=n("./src/view/cameratop.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"camera",void 0),l(this,"mode",this.topView),l(this,"mainMode",this.aimView),l(this,"height",8*a.R),l(this,"elapsed",void 0),this.camera=new i.ubm(45,e,a.R,1e3*a.R)}return e=[{key:"update",value:function(e,t){this.elapsed=e,this.mode(t)}},{key:"topView",value:function(e){this.camera.fov=o.v.fov,this.camera.position.lerp(o.v.viewPoint(this.camera.aspect,this.camera.fov),.9),this.camera.up=s.up,this.camera.lookAt(s.v_)}},{key:"aimView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.08,n=this.height,r=this.camera.aspect<.8;if(this.camera.fov=r?60:40,n<10*a.R){var i=100*(10*a.R-n);this.camera.fov-=i*(r?3:1)}this.camera.position.lerp(e.pos.clone().addScaledVector((0,s.Dz)(e.angle),-(18*a.R)),t),this.camera.position.z=n,this.camera.up=s.up,this.camera.lookAt(e.pos.clone().addScaledVector(s.up,n/2))}},{key:"adjustHeight",value:function(e){e=this.height<10*a.R?e/8:e,this.height=i.cj9.clamp(this.height+e,6*a.R,120*a.R),this.height>110*a.R&&this.suggestMode(this.topView),this.height<105*a.R&&this.suggestMode(this.aimView)}},{key:"suggestMode",value:function(e){this.mainMode===this.aimView&&(this.mode=e)}},{key:"forceMode",value:function(e){this.mode=e,this.mainMode=e}},{key:"forceMove",value:function(e){this.mode===this.aimView&&this.aimView(e,1)}},{key:"toggleMode",value:function(){this.mode===this.topView?this.mode=this.aimView:this.mode=this.topView,this.mainMode=this.mode}}],function(e,t){for(var n=0;n0&&(null===(t=this.cuePowerElement)||void 0===t?void 0:t.value)&&(this.cuePowerElement.value=e)}}],function(e,t){for(var n=0;nthis.sentTime+this.period||e.type!==L.B.AIM){this.flush(),this.apply(e),this.sentTime=performance.now();return}this.pending=e}}],function(e,t){for(var n=0;n0&&"RERACK"===this.shots[e].type&&e--,e}},{key:"lastShot",value:function(){var e=this.last();return this.state(this.states[e],[this.shots[e]])}},{key:"currentBreak",value:function(){if(void 0!==this.breakStart)return this.state(this.states[this.breakStart],this.shots.slice(this.breakStart),this.breakStartTime,this.container.rules.previousBreak)}},{key:"state",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return{init:e,shots:t,start:n,now:Date.now(),score:r,wholeGame:i}}},{key:"updateBreak",value:function(e){var t=this.container.rules.isPartOfBreak(e),n=this.container.rules.isEndOfGame(e),r=U.P.potCount(e);if(t||this.breakLink(n),this.lastShotLink(t||n,r,U.P.pots(e)),n&&this.breakLink(n),!t){this.breakStart=void 0;return}void 0===this.breakStart&&(this.breakStart=this.last(),this.breakStartTime=Date.now())}},{key:"lastShotLink",value:function(e,t,n){var r="#000000";n.length>0&&n.forEach(function(e){r="#"+e.ballmesh.color.getHexString()});var i="⚈".repeat(t>1?t-1:0)+(e?"⚈":"⚆"),s=JSON.stringify(this.lastShot());this.generateLink(i,s,r)}},{key:"breakLink",value:function(e){var t=this.currentBreak();if(t&&(e||t.shots.pop(),1!==t.shots.length)){var n=0===this.container.rules.currentBreak?this.container.rules.previousBreak:this.container.rules.currentBreak;t.score=n;var r=JSON.stringify(t),i=D.A.crush(r);this.generateLink("break(".concat(n,")"),i,"black"),n>=4&&this.generateHiScoreLink(i)}}},{key:"wholeGameLink",value:function(){var e=this.wholeGame(),t="frame(".concat(this.shotCount(e.shots)," shots)"),n=JSON.stringify(e),r=D.A.crush(n);this.generateLink(t,r,"black")}},{key:"shotCount",value:function(e){return e.filter(function(e){return"RERACK"!==e.type}).length}},{key:"generateLink",value:function(e,t,n){var r="".concat(this.replayUrl).concat(this.fullyEncodeURI(t)),i='').concat(e,"");this.container.eventQueue.push(new B.b(null,"".concat(i)))}},{key:"generateHiScoreLink",value:function(e){var t="".concat(this.hiScoreUrl,"?ruletype=").concat(this.container.rules.rulename,"&state=").concat(this.fullyEncodeURI(e)),n='').concat("hi score 🏆","");this.container.eventQueue.push(new B.b(null,"".concat(n)))}},{key:"fullyEncodeURI",value:function(e){return encodeURIComponent(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\!/g,"%21").replace(/\*/g,"%2A")}}],function(e,t){for(var n=0;n').concat(e,"")));r.push(new B.b(null,o))})},this.redo.onclick=function(e){var r=new K.W(t.init,t.shots);r.retry=!0,n.interuptEventQueue(r)},this.replay.onclick=function(e){n.interuptEventQueue(t)}}}},{key:"interuptEventQueue",value:function(e){this.container.table.halt();var t=this.container.eventQueue;t.length=0,t.push(new r.T),t.push(e)}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0?this.element.innerHTML="Break
"+e:this.element.innerHTML="")}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0;){this.lastEventTime=this.last;var t=this.inputQueue.shift();t&&this.updateController(this.controller.handleInput(t))}if(this.table.allStationary()){var n=this.eventQueue.shift();n&&(this.lastEventTime=performance.now(),this.updateController(n.applyToController(this.controller)))}}},{key:"animate",value:function(e){var t=this;this.advance((e-this.last)/1e3),this.last=e,this.processEvents(),(e{n.d(t,{m:()=>c});var r=n("./src/controller/controller.ts"),i=n("./src/controller/controllerbase.ts"),s=n("./src/controller/playshot.ts"),o=n("./src/controller/replay.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,i=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c);var t,n=(t=i.call(this,e)).container.table;return n.cue.aimMode(),n.cue.showHelper(!0),n.cueball=t.container.rules.cueball,n.cue.moveTo(n.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.aimView),n.cue.aimInputs.showOverlap(),t}return n=[{key:"handleInput",value:function(e){switch(e.key){case"Space":this.container.table.cue.adjustPower(e.t*this.scale*.7);break;case"SpaceUp":return this.playShot();default:if(!this.commonKeyHandler(e))return this}return this.container.sendEvent(this.container.table.cue.aim),this}},{key:"handleBreak",value:function(e){return new o.e(this.container,e.init,e.shots,e.retry)}},{key:"playShot",value:function(){var e=new r.Qe(this.container.table.serialise());return this.container.sendEvent(e),this.container.recorder.record(e),new s.H(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{Qe:()=>r.Q,pd:()=>i.p,xI:()=>s}),n("./src/events/beginevent.ts"),n("./src/events/aimevent.ts");var r=n("./src/events/hitevent.ts"),i=n("./src/events/input.ts");n("./src/events/abortevent.ts"),n("./src/events/stationaryevent.ts");var s=function(){var e;function t(e){var n,r;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r=void 0,(n="container")in this?Object.defineProperty(this,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[n]=r,this.container=e}return e=[{key:"handleInput",value:function(e){return this}},{key:"handleBegin",value:function(e){return this}},{key:"handleBreak",value:function(e){return this}},{key:"handleStartAim",value:function(e){return this}},{key:"handleAim",value:function(e){return this}},{key:"handleHit",value:function(e){return this}},{key:"handleAbort",value:function(e){return this}},{key:"handleWatch",value:function(e){return this}},{key:"handlePlaceBall",value:function(e){return this}},{key:"handleStationary",value:function(e){return this}},{key:"handleChat",value:function(e){return this}},{key:"handleRejoin",value:function(e){return this}},{key:"onFirst",value:function(){}}],function(e,t){for(var n=0;n{n.d(t,{y:()=>f});var r=n("./src/controller/controller.ts"),i=n("./src/controller/end.ts"),s=n("./src/utils/gltf.ts"),o=n("./src/model/outcome.ts"),a=n("./node_modules/three/build/three.module.js");function l(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}var f=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(f,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=c(f);return e=t?Reflect.construct(n,arguments,c(this).constructor):n.apply(this,arguments),e&&("object"===h(e)||"function"==typeof e)?e:l(this)});function f(){var e,t,n;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,f),e=r.apply(this,arguments),(n="scale")in(t=l(e))?Object.defineProperty(t,n,{value:.001,enumerable:!0,configurable:!0,writable:!0}):t[n]=.001,e}return n=[{key:"handleAbort",value:function(e){return new i.o(this.container)}},{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}},{key:"hit",value:function(){this.container.table.outcome=[o.P.hit(this.container.table.cueball,this.container.table.cue.aim.power)],this.container.table.hit(),this.container.view.camera.suggestMode(this.container.view.camera.aimView),this.container.table.cue.showHelper(!1)}},{key:"commonKeyHandler",value:function(e){var t=this.container.table.cue,n=e.t*this.scale;switch(e.key){case"ArrowLeft":return t.rotateAim(-n,this.container.table),!0;case"ArrowRight":return t.rotateAim(n,this.container.table),!0;case"ArrowDown":return t.adjustSpin(new a.Pq0(0,-n),this.container.table),!0;case"ArrowUp":return t.adjustSpin(new a.Pq0(0,n),this.container.table),!0;case"ShiftArrowLeft":return t.adjustSpin(new a.Pq0(n,0),this.container.table),!0;case"ShiftArrowRight":return t.adjustSpin(new a.Pq0(-n,0),this.container.table),!0;case"KeyPUp":return(0,s.KP)(this.container.view.scene),!0;case"KeyHUp":return t.toggleHelper(),!0;case"movementXUp":return t.rotateAim(2*n,this.container.table),!0;case"movementYUp":case"NumpadSubtract":return this.container.view.camera.adjustHeight(8*n),!0;case"NumpadAdd":return this.container.view.camera.adjustHeight(-(8*n)),!0;case"KeyOUp":return this.container.view.camera.toggleMode(),!0;case"KeyDUp":return this.togglePanel(),!0;case"KeyFUp":return this.toggleFullscreen(),!0;default:return!1}}},{key:"togglePanel",value:function(){this.container.sliders.toggleVisibility(),this.container.table.showSpin(!0),this.container.table.showTraces(!0),("undefined"==typeof process?"undefined":h(process))!=="object"&&console.log(this.container.table.serialise())}},{key:"toggleFullscreen",value:function(){document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{o:()=>s});var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(o,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(o);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function o(){return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,o),s.apply(this,arguments)}return n=[{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}}],function(e,t){for(var n=0;n{n.d(t,{x:()=>p});var r=n("./src/controller/controllerbase.ts"),i=n("./src/controller/controller.ts"),s=n("./src/controller/aim.ts"),o=n("./src/events/breakevent.ts"),a=n("./src/model/physics/constants.ts"),l=n("./node_modules/three/build/three.module.js"),c=n("./src/view/cuemesh.ts");function u(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var p=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}(p,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=h(p);return e=t?Reflect.construct(n,arguments,h(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:u(this)});function p(e){var t,n,i,s;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,p),n=u(t=r.call(this,e)),i="placescale",s=.02*a.R,i in n?Object.defineProperty(n,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):n[i]=s,t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.table.cue.aim.power=0,t.container.view.camera.forceMode(t.container.view.camera.aimView),t}return n=[{key:"onFirst",value:function(){var e=this.container.table.cueball;this.container.rules.allowsPlaceBall()&&e.pos.copy(this.container.rules.placeBall()),e.setStationary(),e.updateMesh(0),this.container.table.cue.placeBallMode(),this.container.table.cue.showHelper(!1),this.container.table.cue.moveTo(this.container.table.cueball.pos),this.container.table.cue.aimInputs.setButtonText("Place\nBall"),this.container.rules.allowsPlaceBall()||this.container.inputQueue.push(new i.pd(1,"SpaceUp"))}},{key:"handleInput",value:function(e){var t=this.container.table.cueball.pos;switch(e.key){case"ArrowLeft":case"KeyI":this.moveTo(0,e.t*this.placescale);break;case"ArrowRight":case"KeyK":this.moveTo(0,-e.t*this.placescale);break;case"movementXUp":this.moveTo(0,-e.t*this.placescale*2);break;case"movementYUp":this.moveTo(-e.t*this.placescale*2,0);break;case"KeyJ":this.moveTo(-e.t*this.placescale,0);break;case"KeyL":this.moveTo(e.t*this.placescale,0);break;case"SpaceUp":return this.placed();default:this.commonKeyHandler(e)}return this.container.table.cue.moveTo(t),this.container.view.camera.forceMove(this.container.table.cue.aim),this.container.sendEvent(this.container.table.cue.aim),this}},{key:"moveTo",value:function(e,t){var n=new l.Pq0(e,t),r=this.container.table.cueball.pos.add(n);r.copy(this.container.rules.placeBall(r)),c.l.indicateValid(!this.container.table.overlapsAny(r))}},{key:"placed",value:function(){return this.container.table.overlapsAny(this.container.table.cueball.pos)?this:(this.container.table.cue.aimInputs.setButtonText("Hit"),this.container.sound.playNotify(),this.container.sendEvent(new o.W(this.container.table.shortSerialise())),new s.m(this.container))}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{H:()=>s});var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(o,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(o);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function o(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,o),(t=s.call(this,e)).hit(),t}return n=[{key:"handleStationary",value:function(e){var t=this.container.table,n=t.outcome,r=this.container.rules.update(n);return this.container.recorder.updateBreak(n),t.cue.aimAtNext(t.cueball,this.container.rules.nextCandidateBall()),r}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}}],function(e,t){for(var n=0;n{n.d(t,{e:()=>v});var r=n("./src/events/hitevent.ts"),i=n("./src/controller/controllerbase.ts"),s=n("./src/events/aimevent.ts"),o=n("./src/events/breakevent.ts"),a=n("./src/controller/aim.ts"),l=n("./src/events/eventtype.ts"),c=n("./src/events/rerackevent.ts");function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1500;if(!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),f(h(r=i.call(this,e)),"delay",void 0),f(h(r),"shots",void 0),f(h(r),"firstShot",void 0),f(h(r),"timer",void 0),f(h(r),"init",void 0),r.init=t,r.shots=m(n),r.firstShot=r.shots[0],r.delay=a,r.container.table.showTraces(!0),r.container.table.updateFromShortSerialised(r.init),s){var l=new o.W(t,n);l.retry=!0,r.container.eventQueue.push(l)}else r.container.view.camera.forceMode(r.container.view.camera.topView),r.playNextShot(1.5*r.delay);return r}return n=[{key:"playNextShot",value:function(e){var t=this,n=this.shots.shift();if((null==n?void 0:n.type)===l.B.RERACK){c.x.fromJson(n.ballinfo).applyToController(this),this.shots.length>0&&this.playNextShot(e);return}var i=s.w.fromJson(n);this.container.table.cueball=this.container.table.balls[i.i],console.log(this.container.table.cueball.pos.distanceTo(i.pos)),this.container.table.cueball.pos.copy(i.pos),this.container.table.cue.aim=i,this.container.table.cue.updateAimInput(),this.container.table.cue.t=1,clearTimeout(this.timer),this.timer=setTimeout(function(){t.container.eventQueue.push(new r.Q(t.container.table.cue.aim)),t.timer=void 0},e)}},{key:"handleHit",value:function(e){return this.hit(),this}},{key:"handleStationary",value:function(e){return this.shots.length>0&&void 0===this.timer&&this.playNextShot(this.delay),this}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}},{key:"handleBreak",value:function(e){return(this.container.table.updateFromShortSerialised(e.init),this.shots=m(e.shots),this.container.table.showSpin(!0),e.retry)?this.retry():(this.playNextShot(this.delay),this)}},{key:"retry",value:function(){clearTimeout(this.timer),this.timer=void 0,this.container.table.updateFromShortSerialised(this.init);var e=s.w.fromJson(this.firstShot);return this.container.table.cueball=this.container.table.balls[e.i],this.container.rules.cueball=this.container.table.cueball,this.container.table.cueball.pos.copy(e.pos),this.container.table.cue.aim=e,this.container.view.camera.forceMode(this.container.view.camera.aimView),new a.m(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{V:()=>O});var r=n("./src/events/watchevent.ts"),i=n("./src/utils/rack.ts"),s=n("./node_modules/three/build/three.module.js"),o=n("./src/controller/aim.ts"),a=n("./src/controller/placeball.ts"),l=n("./src/controller/watchaim.ts"),c=n("./src/events/chatevent.ts"),u=n("./src/events/placeballevent.ts"),h=n("./src/model/outcome.ts"),f=n("./src/model/table.ts"),p=n("./src/utils/utils.ts"),d=n("./src/controller/end.ts"),m=n("./src/model/physics/constants.ts"),v=n("./src/utils/respot.ts"),y=n("./src/view/tablegeometry.ts"),b=n("./src/events/startaimevent.ts");function g(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var w=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),g(this,"container",void 0),g(this,"cueball",void 0),g(this,"currentBreak",0),g(this,"previousBreak",0),g(this,"score",0),g(this,"rulename","nineball"),this.container=e}return e=[{key:"startTurn",value:function(){this.previousBreak=this.currentBreak,this.currentBreak=0}},{key:"nextCandidateBall",value:function(){return v.k.closest(this.container.table.cueball,this.container.table.balls)}},{key:"placeBall",value:function(e){if(e){var t=new s.Pq0(-y.P.X/2,y.P.tableY),n=new s.Pq0(-y.P.tableX,-y.P.tableY);return e.clamp(n,t)}return new s.Pq0(-(11*m.R)/.5,0,0)}},{key:"asset",value:function(){return"models/p8.min.gltf"}},{key:"tableGeometry",value:function(){y.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"rack",value:function(){return i.m.diamond()}},{key:"update",value:function(e){var t=this.container.table;if(h.P.isCueBallPotted(t.cueball,e))return(this.startTurn(),this.container.isSinglePlayer)?new a.x(this.container):(this.container.sendEvent(new u.z(p.v_,!0)),new l.r(this.container));if(h.P.isBallPottedNoFoul(t.cueball,e)){var n=h.P.potCount(e);return(this.currentBreak+=n,this.score+=n,this.container.sound.playSuccess(t.inPockets()),this.isEndOfGame(e))?(this.container.eventQueue.push(new c.b(null,"game over")),this.container.recorder.wholeGameLink(),new d.o(this.container)):(this.container.sendEvent(new r.Q(t.serialise())),new o.m(this.container))}return(this.container.sendEvent(new b.M),this.container.isSinglePlayer)?(this.container.sendEvent(new r.Q(t.serialise())),this.startTurn(),new o.m(this.container)):new l.r(this.container)}},{key:"isPartOfBreak",value:function(e){return h.P.isBallPottedNoFoul(this.container.table.cueball,e)}},{key:"isEndOfGame",value:function(e){var t=this.container.table.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===this.cueball}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"allowsPlaceBall",value:function(){return!0}}],function(e,t){for(var n=0;n{n.d(t,{c:()=>k});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/events/watchevent.ts"),s=n("./src/model/outcome.ts"),o=n("./src/utils/rack.ts"),a=n("./src/utils/respot.ts"),l=n("./src/controller/aim.ts"),c=n("./src/controller/watchaim.ts"),u=n("./src/events/chatevent.ts"),h=n("./src/controller/end.ts"),f=n("./src/model/table.ts"),p=n("./src/view/tablegeometry.ts"),d=n("./src/controller/placeball.ts"),m=n("./src/events/placeballevent.ts"),v=n("./src/utils/utils.ts"),y=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"shotInfo",value:function(e,n,r){var i=s.P.firstCollision(n);return{pots:s.P.potCount(n),firstCollision:i,legalFirstCollision:t.isLegalFirstCollision(e,r,i),whitePotted:s.P.isCueBallPotted(e.cueball,n)}}},{key:"isLegalFirstCollision",value:function(e,n,r){if(!r)return!1;var i=r.ballB.id;return n?i>=7:!(t.coloursOnTable(e).filter(function(e){return e.id0)}},{key:"respotAllPottedColours",value:function(e,t){return s.P.pots(t).filter(function(e){return e.id<7}).filter(function(e){return 0!==e.id}).map(function(t){return a.k.respot(t,e)})}},{key:"redsOnTable",value:function(e){return e.balls.slice(7).filter(function(e){return e.onTable()})}},{key:"coloursOnTable",value:function(e){return e.balls.slice(1,7).filter(function(e){return e.onTable()})}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0,this.switchPlayer()}return this.targetIsRed?this.targetRedRule(e,t):this.targetColourRule(e,t)}},{key:"targetRedRule",value:function(e,t){return(console.log("applying target red rule"),t.legalFirstCollision&&s.P.onlyRedsPotted(e))?(this.currentBreak+=t.pots,this.targetIsRed=!1,this.previousPotRed=!0,this.container.hud.updateBreak(this.currentBreak),this.continueBreak()):(this.foulPoints=this.foulCalculation(e,t),this.respot(e),t.whitePotted)?this.whiteInHand():this.switchPlayer()}},{key:"targetColourRule",value:function(e,t){if(console.log("applying target colour rule"),t.whitePotted)return this.respot(e),this.whiteInHand();if(t.pots>1)return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer();if(s.P.pots(e)[0].id>6)return this.foulPoints=this.foulCalculation(e,t),this.switchPlayer();this.targetIsRed=y.redsOnTable(this.container.table).length>0;var n=s.P.pots(e)[0].id;return n!==t.firstCollision.ballB.id?this.foul(e,t):this.previousPotRed?(this.respot(e),this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak()):y.coloursOnTable(this.container.table).filter(function(e){return e.id0?this.foul(e,t):(this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak())}},{key:"foul",value:function(e,t){return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer()}},{key:"foulCalculation",value:function(e,t){var n,r,i,o,a=s.P.pots(e).map(function(e){return e.id}).filter(function(e){return e<7}),l=null!==(o=null===(i=t.firstCollision)||void 0===i?void 0:null===(r=i.ballB)||void 0===r?void 0:r.id)&&void 0!==o?o:0;return l>6&&(l=0),(n=Math).max.apply(n,[3,l].concat(function(e){if(Array.isArray(e))return g(e)}(a)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return g(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,void 0)}}(a)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))+1}},{key:"tableGeometry",value:function(){p.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"isPartOfBreak",value:function(e){return this.currentBreak>0}},{key:"isEndOfGame",value:function(e){return s.P.isClearTable(this.container.table)&&this.currentBreak>0}},{key:"allowsPlaceBall",value:function(){return!0}},{key:"asset",value:function(){return t.tablemodel}},{key:"startTurn",value:function(){this.previousPotRed=!1,this.targetIsRed=y.redsOnTable(this.container.table).length>0,this.previousBreak=this.currentBreak,this.score+=this.currentBreak,this.currentBreak=0,this.container.hud.updateBreak(this.currentBreak)}},{key:"rack",value:function(){return o.m.snooker()}},{key:"nextCandidateBall",value:function(){var e=this.container.table,t=y.redsOnTable(e),n=y.coloursOnTable(e);return this.previousPotRed?a.k.closest(e.cueball,n):t.length>0?a.k.closest(e.cueball,t):n.length>0?n[0]:void 0}},{key:"placeBall",value:function(e){if(e){var t=new r.Pq0(o.m.baulk,0,0),n=o.m.sixth,i=e.distanceTo(t);if(e.x>=o.m.baulk&&(e.x=o.m.baulk),!(i>n))return e;var s=e.clone().sub(t).normalize();return t.add(s.multiplyScalar(n))}return new r.Pq0(o.m.baulk,-o.m.sixth/2.6,0)}},{key:"switchPlayer",value:function(){this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),console.log("end of break, switch player");var e=this.container.table;return(console.log(e.cue.aim),this.container.sendEvent(new b.M(this.foulPoints)),this.container.isSinglePlayer)?(this.container.sendEvent(new i.Q(e.serialise())),this.startTurn(),new l.m(this.container)):new c.r(this.container)}},{key:"continueBreak",value:function(){this.container.hud.updateBreak(this.currentBreak);var e=this.container.table;return(this.container.sound.playSuccess(e.inPockets()),s.P.isClearTable(e))?(this.container.eventQueue.push(new u.b(null,"game over")),this.container.recorder.wholeGameLink(),new h.o(this.container)):(this.container.sendEvent(new i.Q(e.serialise())),new l.m(this.container))}},{key:"whiteInHand",value:function(){return(this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),this.startTurn(),this.container.isSinglePlayer)?new d.x(this.container):(this.container.sendEvent(new m.z(v.v_,!0)),new c.r(this.container))}},{key:"update",value:function(e){return this.snookerrule(e)}},{key:"respot",value:function(e){var t=y.respotAllPottedColours(this.container.table,e);if(t.length>0){var n={balls:t.map(function(e){return e.serialise()}),rerack:!0},r=new i.Q(n);this.container.sendEvent(r),this.container.recorder.record(r)}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>o});var r=n("./src/controller/watchshot.ts");function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=i(a);return e=t?Reflect.construct(n,arguments,i(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(t=o.call(this,e)).container.table.cueball=t.container.rules.otherPlayersCueBall(),t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.topView),t}return n=[{key:"handleAim",value:function(e){return this.container.table.cue.aim=e,this.container.table.cueball.pos.copy(e.pos),this}},{key:"handleHit",value:function(e){return this.container.table.updateFromSerialised(e.tablejson),new r.O(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{O:()=>c});var r=n("./src/controller/aim.ts"),i=n("./src/controller/watchaim.ts"),s=n("./src/controller/controllerbase.ts"),o=n("./src/controller/placeball.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c),(t=s.call(this,e)).container.table.outcome=[],t.container.table.hit(),t}return n=[{key:"handleStartAim",value:function(e){return new r.m(this.container)}},{key:"handlePlaceBall",value:function(e){return new o.x(this.container)}},{key:"handleWatch",value:function(e){return"rerack"in e.json?(console.log("Respot"),this.container.table.updateFromSerialised(e.json),this):new i.r(this.container)}}],function(e,t){for(var n=0;n{var r,i,s,o,a,l,c,u,h,f=n("./src/model/physics/physics.ts"),p=n("./node_modules/three/build/three.module.js");function d(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var m=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),d(this,"canvas",void 0),d(this,"context",void 0),d(this,"endx",100),d(this,"endy",100),d(this,"scale",2e3),d(this,"r",20),e.firstElementChild.innerHTML=n,this.canvas=e.lastElementChild,this.context=this.canvas.getContext("2d")}return e=[{key:"drawBall",value:function(){this.context.beginPath(),this.context.strokeStyle="lightgray",this.context.fillStyle="beige",this.context.arc(this.endx,this.endy,this.r,0,2*Math.PI,!1),this.context.fill(),this.context.stroke()}},{key:"drawCushion",value:function(){var e=this.context.createLinearGradient(10,90,200,90);e.addColorStop(0,"lightgray"),e.addColorStop(.75,"white"),this.context.fillStyle=e,this.context.fillRect(this.endx+this.r,10,200,250)}},{key:"plot",value:function(e,t,n,r,i){this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.drawCushion(),this.drawBall();for(var s=e;s<=t;s+=n){var o=r(s),a=i(s),l=(0,f.yO)(o,a)?[]:[2,2];this.context.setLineDash(l);var c=(s+360)*101%360;this.context.strokeStyle="hsl(".concat(c,",50%,50%)"),this.drawArrow(this.endx-o.x*this.scale,this.endy-o.y*this.scale,this.endx,this.endy);var u=(0,f.QK)(0,o,a,f.QV);o.add(u.v),this.drawArrow(this.endx,this.endy,this.endx+o.x*this.scale,this.endy+o.y*this.scale)}}},{key:"drawArrow",value:function(e,t,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.9,s={dx:n-e,dy:r-t},o={x:s.dx*i+e,y:s.dy*i+t},a={dx:n-o.x,dy:r-o.y};this.context.beginPath(),this.context.moveTo(e,t),this.context.lineTo(o.x,o.y),this.context.moveTo(o.x+.5*a.dy,o.y-.5*a.dx),this.context.lineTo(o.x-.5*a.dy,o.y+.5*a.dx),this.context.lineTo(n,r),this.context.closePath(),this.context.stroke()}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n{n.d(t,{h:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=s(a);return e=t?Reflect.construct(n,arguments,s(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.ABORT,e}return n=[{key:"applyToController",value:function(e){return e.handleAbort(this)}}],function(e,t){for(var n=0;n{n.d(t,{w:()=>f});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),s=n("./src/utils/utils.ts"),o=n("./node_modules/three/build/three.module.js");function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e,t){for(var n=0;n{n.d(t,{u:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=s(a);return e=t?Reflect.construct(n,arguments,s(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.BEGIN,e}return n=[{key:"applyToController",value:function(e){return e.handleBegin(this)}}],function(e,t){for(var n=0;n{n.d(t,{W:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n{n.d(t,{b:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n{var r;n.d(t,{B:()=>r}),function(e){e.BEGIN="BEGIN",e.BREAK="BREAK",e.WATCHAIM="WATCHAIM",e.AIM="AIM",e.HIT="HIT",e.STATIONARY="STATIONARY",e.CHAT="CHAT",e.ABORT="ABORT",e.PLACEBALL="PLACEBALL",e.REJOIN="REJOIN",e.RERACK="RERACK",e.STARTAIM="STARTAIM"}(r||(r={}))},"./src/events/gameevent.ts":(e,t,n)=>{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{F:()=>i});var i=function e(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"type",void 0),r(this,"sequence",void 0)}},"./src/events/hitevent.ts":(e,t,n)=>{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{p:()=>i});var i=function e(t,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"t",void 0),r(this,"key",void 0),this.t=t,this.key=n}},"./src/events/keyboard.ts":(e,t,n)=>{n.d(t,{s:()=>a});var r=n("./src/events/input.ts"),i=n("./node_modules/interactjs/dist/interact.min.js"),s=n.n(i);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){var n=this;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),o(this,"pressed",{}),o(this,"released",{}),o(this,"keydown",function(e){null==n.pressed[e.code]&&(n.pressed[e.code]=performance.now()),e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),o(this,"keyup",function(e){n.released[e.code]=performance.now()-n.pressed[e.code],delete n.pressed[e.code],e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),o(this,"mousetouch",function(e){var t,r,i=n.released,s=e.client.yMath.abs(i.movementY)&&(i.movementY=0)}),this.addHandlers(e),/Android|iPhone/i.test(navigator.userAgent)||(e.contentEditable="true")}return e=[{key:"getEvents",value:function(){var e=this,t=Object.keys(this.pressed).filter(function(e){return!/Shift/.test(e)}).filter(function(e){return!/Control/.test(e)}),n=Object.keys(this.pressed).some(function(e){return/Shift/.test(e)}),i=Object.keys(this.pressed).some(function(e){return/Control/.test(e)}),s=[];return t.forEach(function(t){var o=performance.now()-e.pressed[t];s.push(new r.p(i?o/3:o,n?"Shift"+t:t)),"Space"!=t&&(e.pressed[t]=performance.now())}),Object.keys(this.released).forEach(function(t){return s.push(new r.p(e.released[t],t+"Up"))}),this.released={},s}},{key:"addHandlers",value:function(e){var t=this;e.addEventListener("keydown",this.keydown),e.addEventListener("keyup",this.keyup),e.focus(),s()(e).draggable({listeners:{move:function(e){t.mousetouch(e)}}}),s()(e).gesturable({onmove:function(e){e.dx/=3,t.mousetouch(e)}})}}],function(e,t){for(var n=0;n{n.d(t,{z:()=>h});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),s=n("./src/utils/utils.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t){for(var n=0;n{n.d(t,{x:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n{n.d(t,{M:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),(t="foul")in(e=s(n=c.call(this)))?Object.defineProperty(e,t,{value:0,enumerable:!0,configurable:!0,writable:!0}):e[t]=0,n.type=i.B.STARTAIM,n.foul=r,n}return n=[{key:"applyToController",value:function(e){return e.handleStartAim(this)}}],r=[{key:"fromJson",value:function(e){return new u(e.foul)}}],n&&o(u.prototype,n),r&&o(u,r),u}(r.F)},"./src/events/stationaryevent.ts":(e,t,n)=>{n.d(t,{T:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=s(a);return e=t?Reflect.construct(n,arguments,s(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.STATIONARY,e}return n=[{key:"applyToController",value:function(e){return e.handleStationary(this)}}],function(e,t){for(var n=0;n{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){for(var n=0;n{n.d(t,{c:()=>d,U:()=>r});var r,i=n("./src/utils/utils.ts"),s=n("./src/model/physics/physics.ts"),o=n("./node_modules/three/build/three.module.js"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"line",void 0),l(this,"geometry",void 0),l(this,"positions",void 0),l(this,"lastPos",new o.Pq0),l(this,"lastVel",new o.Pq0),this.geometry=new o.LoY,this.positions=new Float32Array(3*e),this.geometry.setAttribute("position",new o.THS(this.positions,3)),this.reset();var r=new o.mrM({color:n,opacity:.25,linewidth:3,transparent:!0});this.line=new o.N1A(this.geometry,r),this.line.visible=!1}return e=[{key:"reset",value:function(){this.geometry.setDrawRange(0,0),this.lastVel.setZ(1)}},{key:"forceTrace",value:function(e){this.lastVel.z=1,this.addTraceGiven(e,this.lastVel,1,.1,1)}},{key:"addTrace",value:function(e,t){if(0!==t.length()){var n=this.lastVel.angleTo(t),r=n>Math.PI/32?.01*a.R:a.R,i=this.lastPos.distanceTo(e);this.addTraceGiven(e,t,i,r,n)}}},{key:"addTraceGiven",value:function(e,t,n,r,i){var s=this.geometry.drawRange.count;0!==s&&n1&&i<1e-4&&s--,this.lastPos.copy(e),this.lastVel.copy(t),this.addPoint(e,s))}},{key:"addPoint",value:function(e,t){var n=3*t;n>this.positions.length||(this.positions[n++]=e.x,this.positions[n++]=e.y,this.positions[n]=e.z,this.geometry.setDrawRange(0,t+1),this.line.geometry.attributes.position.needsUpdate=!0)}}],function(e,t){for(var n=0;nMath.abs(this.rvel.z))&&(this.setStationary(),!0)}},{key:"setStationary",value:function(){this.vel.copy(i.v_),this.rvel.copy(i.v_),this.state="Stationary"}},{key:"isRolling",value:function(){return 0!==this.vel.lengthSq()&&0!==this.rvel.lengthSq()&&(0,s.Mq)(this.vel,this.rvel).length(){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{P:()=>s}),!function(e){e.Pot="Pot",e.Cushion="Cushion",e.Collision="Collision",e.Hit="Hit"}(i||(i={}));var i,s=function(){var e;function t(e,n,i,s){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r(this,"type",void 0),r(this,"timestamp",void 0),r(this,"ballA",null),r(this,"ballB",null),r(this,"incidentSpeed",void 0),this.type=e,this.ballA=n,this.ballB=i,this.incidentSpeed=s,this.timestamp=Date.now()}return e=[{key:"pot",value:function(e,n){return new t("Pot",e,e,n)}},{key:"cushion",value:function(e,n){return new t("Cushion",e,e,n)}},{key:"collision",value:function(e,n,r){return new t("Collision",e,n,r)}},{key:"hit",value:function(e,n){return new t("Hit",e,e,n)}},{key:"isCueBallPotted",value:function(e,t){return t.some(function(t){return"Pot"==t.type&&t.ballA===e})}},{key:"isBallPottedNoFoul",value:function(e,n){return n.some(function(e){return"Pot"==e.type&&null!==e.ballA})&&!t.isCueBallPotted(e,n)}},{key:"pots",value:function(e){return e.filter(function(e){return"Pot"==e.type}).map(function(e){return e.ballA})}},{key:"potCount",value:function(e){return this.pots(e).length}},{key:"onlyRedsPotted",value:function(e){return this.pots(e).every(function(e){return e.id>6})}},{key:"firstCollision",value:function(e){var t=e.filter(function(e){return"Collision"===e.type});return t.length>0?t[0]:void 0}},{key:"isClearTable",value:function(e){var t=e.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===e.cueball}},{key:"isThreeCushionPoint",value:function(e,n){n=t.cueBallFirst(e,n).filter(function(t){return t.ballA===e});var r=new Set,i=0,s=!0,o=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(s=(l=c.next()).done);s=!0){var u=l.value;if("Cushion"===u.type&&i++,"Collision"===u.type&&(r.add(u.ballB),2===r.size))return i>=3}}catch(e){o=!0,a=e}finally{try{s||null==c.return||c.return()}finally{if(o)throw a}}return!1}},{key:"cueBallFirst",value:function(e,t){return t.forEach(function(t){"Collision"===t.type&&t.ballB===e&&(t.ballB=t.ballA,t.ballA=e)}),t}}],function(e,t){for(var n=0;n{n.d(t,{I:()=>s,Mz:()=>r,Qg:()=>v,R:()=>f,Wv:()=>b,Ys:()=>g,cM:()=>w,e:()=>p,g:()=>o,gT:()=>c,gf:()=>l,jG:()=>m,kL:()=>u,kM:()=>k,m:()=>h,mu:()=>a,x3:()=>i,xO:()=>y});var r,i,s,o=9.8,a=.00985,l=.15,c=.8,u=.024,h=.23,f=.03275,p=.86;function d(){r=a*h*o*2/3*u,i=7/(5*Math.sqrt(2))*f*a*h*o,s=.4*h*f*f}function m(e){f=e,d()}function v(e){h=e,d()}function y(e){a=e,d()}function b(e){u=e,d()}function g(e){l=e}function w(e){p=e}function k(e){c=e}d()},"./src/model/physics/knuckle.ts":(e,t,n)=>{n.d(t,{O:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/view/pocketgeometry.ts");function s(e,t){for(var n=0;n{n.d(t,{$8:()=>R,Gp:()=>g,JD:()=>u,Mq:()=>a,QK:()=>f,QV:()=>P,Un:()=>b,c0:()=>y,lx:()=>h,p2:()=>c,s0:()=>v,t6:()=>S,yO:()=>w});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/utils/utils.ts"),s=n("./src/model/physics/constants.ts"),o=new r.Pq0;function a(e,t){return o.copy(e).addScaledVector((0,i.KM)(t),s.R)}var l={v:new r.Pq0,w:new r.Pq0};function c(e,t){var n=a(e,t).setZ(0);return l.v.copy((0,i.xb)(n).multiplyScalar(-s.gf*s.g)),l.w.copy((0,i.xb)((0,i.KM)(n)).multiplyScalar(2.5*s.gf*s.g/s.R)),l.w.setZ(-2.5*(s.Mz/(s.m*s.R*s.R))*Math.sign(t.z)),l}function u(e){var t=new r.Pq0(e.x,e.y,0).length(),n=5/7*s.x3/(s.m*s.R)/t,i=5/7*s.x3/(s.m*s.R*s.R)/t;return l.v.set(-n*e.y,n*e.x,0),l.w.set(-i*e.x,-i*e.y,-2.5*(s.Mz/(s.m*s.R*s.R))*Math.sign(e.z)),l}function h(e,t){var n=t.z;t.copy((0,i.KM)(e).multiplyScalar(1/s.R)),t.setZ(n)}function f(e,t,n,r){var s=r(t.clone().applyAxisAngle(i.up,e),n.clone().applyAxisAngle(i.up,e));return s.v.applyAxisAngle(i.up,-e),s.w.applyAxisAngle(i.up,-e),s}Object.freeze(l);var p=Math.asin(.1*s.R/s.R),d=Math.sin(p),m=Math.cos(p);function v(e,t){return new r.Pq0(e.x*d-e.z*m+s.R*t.y,-e.y-s.R*t.z*m+s.R*t.x*d)}function y(e){return e.x*m}function b(e){var t=3.5/s.m;return e.length()/t}function g(e){var t,n=1/s.m,i=.39+.257*(t=new r.Pq0(e/m,0,0)).x-.044*t.x*t.x;return s.gT*((1+i)*e)/n}function w(e,t){var n=g(y(e));return b(v(e,t))<=n}function k(e,t){return{c:y(e),s:v(e,t),A:3.5/s.m,B:1/s.m}}function T(e,t){var n=k(e,t),r=n.c,i=n.s,o=n.A,a=n.B,l=(1+s.e)*(r/a);return A(-i.x/o*d-l*m,i.y/o,i.x/o*m-l*d)}function x(e,t){var n=k(e,t),r=n.c,i=n.B,o=(1+s.e)*(r/i),a=.471-.241*Math.atan2(Math.abs(e.y),e.x),l=Math.atan2(e.y,e.x),c=Math.cos(l);return A(-a*o*c*m-o*m,a*o*Math.sin(l),a*o*c*m-o*d)}function P(e,t){return w(e,t)?T(e,t):x(e,t)}function R(e,t){var n=T(e,t),r=x(e,t),i=Math.sign(e.y)===Math.sign(t.z)?Math.cos(Math.atan2(e.y,e.x)):1;return{v:r.v.lerp(n.v,i),w:r.w.lerp(n.w,i)}}function A(e,t,n){return{v:new r.Pq0(e/s.m,t/s.m),w:new r.Pq0(-s.R/s.I*t*d,s.R/s.I*(e*d-n*m),s.R/s.I*t*m)}}function S(e,t){var n=Math.atan2(-e.x,e.y),r=2.5*t.length()*(e.length()*s.R)/(s.R*s.R),o=t.clone().normalize();return(0,i.KM)(o).applyAxisAngle(o,n).multiplyScalar(r)}},"./src/model/physics/pocket.ts":(e,t,n)=>{n.d(t,{Z:()=>l});var r=n("./src/model/ball.ts"),i=n("./src/model/physics/constants.ts"),s=n("./src/utils/utils.ts");function o(e,t){for(var n=0;nthis.radius-i.R){var o=this.pos.clone().sub(e.pos).normalize().setZ(0);n>-i.R/2&&e.vel.addScaledVector(o,7*i.R*t*i.g),0>e.vel.dot(o)&&(e.ballmesh.trace.forceTrace(e.pos),e.vel.x=o.x*e.vel.length()/2,e.vel.y=o.y*e.vel.length()/2)}var a=this.restingDepth(e);n{n.d(t,{X:()=>b});var r=n("./src/view/tablegeometry.ts"),i=n("./src/model/physics/physics.ts"),s=n("./src/view/pocketgeometry.ts"),o=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"bounceAny",value:function(e,n){var s=!(arguments.length>2)||void 0===arguments[2]||arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i.$8,a=e.futurePosition(n);if(t.willBounceLong(a,s)){var l=a.y>r.P.tableY?-Math.PI/2:Math.PI/2;return t.bounceIn(l,e,o)}if(t.willBounceShort(a,s)){var c=a.x>r.P.tableX?0:Math.PI;return t.bounceIn(c,e,o)}}},{key:"willBounceShort",value:function(e,n){return n?t.willBounceShortSegment(s.f.pockets.pocketNW.knuckleSW.pos.y,s.f.pockets.pocketSW.knuckleNW.pos.y,e):t.willBounceShortSegment(r.P.Y,-r.P.Y,e)}},{key:"willBounceLong",value:function(e,n){return n?t.willBounceLongSegment(s.f.pockets.pocketNW.knuckleNE.pos.x,s.f.pockets.pocketN.knuckleNW.pos.x,e)||t.willBounceLongSegment(s.f.pockets.pocketN.knuckleNE.pos.x,s.f.pockets.pocketNE.knuckleNW.pos.x,e):t.willBounceLongSegment(-r.P.X,r.P.X,e)}},{key:"willBounceLongSegment",value:function(e,t,n){return n.x>e&&n.xr.P.tableY}},{key:"willBounceShortSegment",value:function(e,t,n){return n.y>t&&n.yr.P.tableX}},{key:"bounceIn",value:function(e,t,n){t.ballmesh.trace.forceTrace(t.futurePos);var r=(0,i.QK)(e,t.vel,t.rvel,n);return t.vel.add(r.v),t.rvel.add(r.w),r.v.length()}}],function(e,t){for(var n=0;n100)throw Error("Depth exceeded resolving collisions");this.balls.forEach(function(t){t.update(e)})}},{key:"prepareAdvanceAll",value:function(e){var t=this;return this.pairs.every(function(n){return t.prepareAdvancePair(n.a,n.b,e)})&&this.balls.every(function(n){return t.prepareAdvanceToCushions(n,e)})}},{key:"prepareAdvancePair",value:function(e,t,n){if(c.willCollide(e,t,n)){var r=c.collide(e,t);return this.outcome.push(d.P.collision(e,t,r)),!1}return!0}},{key:"prepareAdvanceToCushions",value:function(e,t){if(!e.onTable())return!0;var n=e.futurePosition(t);if(Math.abs(n.y)1&&void 0!==arguments[1]?arguments[1]:this.cueball;return this.balls.filter(function(e){return e!==t}).some(function(t){return t.pos.distanceTo(e)<2*l.R})}}],t=[{key:"fromSerialised",value:function(e){var t=new n(e.balls.map(function(e){return a.c.fromSerialised(e)}));return t.updateFromSerialised(e),t}}],e&&v(n.prototype,e),t&&v(n,t),n}()},"./src/utils/gltf.ts":(e,t,n)=>{let r,i,s,o;n.d(t,{KP:()=>e_,Ro:()=>eI});var a=n("./node_modules/three/build/three.module.js");function l(e,t=1/0,n=null){i||(i=new a.bdM(2,2,1,1)),s||(s=new a.BKk({uniforms:{blitTexture:new a.nc$(e)},vertexShader:` varying vec2 vUv; void main(){ vUv = uv; @@ -15,4 +15,4 @@ #else gl_FragColor = texture2D( blitTexture, vUv); #endif - }`})),o.uniforms.blitTexture.value=e,o.defines.IS_SRGB=e.colorSpace==a.er$,o.needsUpdate=!0,s||((s=new a.eaF(i,o)).frustumCulled=!1);let c=new a.ubm,u=new a.Z58;u.add(s),null===n&&(n=r=new a.JeP({antialias:!1}));let h=Math.min(e.image.width,t),f=Math.min(e.image.height,t);n.setSize(h,f),n.clear(),n.render(u,c);let p=document.createElement("canvas"),d=p.getContext("2d");p.width=h,p.height=f,d.drawImage(n.domElement,0,0,h,f);let m=new a.GOR(p);return m.minFilter=e.minFilter,m.magFilter=e.magFilter,m.wrapS=e.wrapS,m.wrapT=e.wrapT,m.name=e.name,r&&(r.forceContextLoss(),r.dispose(),r=null),m}let c={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class u{constructor(){this.pluginCallbacks=[],this.register(function(e){return new T(e)}),this.register(function(e){return new x(e)}),this.register(function(e){return new S(e)}),this.register(function(e){return new E(e)}),this.register(function(e){return new O(e)}),this.register(function(e){return new M(e)}),this.register(function(e){return new R(e)}),this.register(function(e){return new P(e)}),this.register(function(e){return new A(e)}),this.register(function(e){return new _(e)}),this.register(function(e){return new I(e)}),this.register(function(e){return new C(e)}),this.register(function(e){return new j(e)}),this.register(function(e){return new B(e)})}register(e){return -1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return -1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let i=new k,o=[];for(let e=0,t=this.pluginCallbacks.length;ee.toBlob(n,t)):("image/jpeg"===t?n=.92:"image/webp"===t&&(n=.8),e.convertToBlob({type:t,quality:n}))}class k{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter r"+a.sPf}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map}}setPlugins(e){this.plugins=e}async write(e,t,n={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),this.processInput(e),await Promise.all(this.pending);let r=this.buffers,i=this.json;n=this.options;let o=this.extensionsUsed,s=this.extensionsRequired,a=new Blob(r,{type:"application/octet-stream"}),l=Object.keys(o),c=Object.keys(s);if(l.length>0&&(i.extensionsUsed=l),c.length>0&&(i.extensionsRequired=c),i.buffers&&i.buffers.length>0&&(i.buffers[0].byteLength=a.size),!0===n.binary){let e=new FileReader;e.readAsArrayBuffer(a),e.onloadend=function(){var n;let r=b(e.result),o=new DataView(new ArrayBuffer(8));o.setUint32(0,r.byteLength,!0),o.setUint32(4,5130562,!0);let s=b((n=JSON.stringify(i),new TextEncoder().encode(n).buffer),32),a=new DataView(new ArrayBuffer(8));a.setUint32(0,s.byteLength,!0),a.setUint32(4,1313821514,!0);let l=new ArrayBuffer(12),c=new DataView(l);c.setUint32(0,1179937895,!0),c.setUint32(4,2,!0);let u=12+a.byteLength+s.byteLength+o.byteLength+r.byteLength;c.setUint32(8,u,!0);let h=new Blob([l,a,s,o,r],{type:"application/octet-stream"}),f=new FileReader;f.readAsArrayBuffer(h),f.onloadend=function(){t(f.result)}}}else if(i.buffers&&i.buffers.length>0){let e=new FileReader;e.readAsDataURL(a),e.onloadend=function(){let n=e.result;i.buffers[0].uri=n,t(i)}}else t(i)}serializeUserData(e,t){if(0===Object.keys(e.userData).length)return;let n=this.options,r=this.extensionsUsed;try{let i=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&i.gltfExtensions){for(let e in void 0===t.extensions&&(t.extensions={}),i.gltfExtensions)t.extensions[e]=i.gltfExtensions[e],r[e]=!0;delete i.gltfExtensions}Object.keys(i).length>0&&(t.extras=i)}catch(t){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+t.message)}}getUID(e,t=!1){if(!1===this.uids.has(e)){let t=new Map;t.set(!0,this.uid++),t.set(!1,this.uid++),this.uids.set(e,t)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;let t=new a.Pq0;for(let n=0,r=e.count;n5e-4)return!1;return!0}createNormalizedNormalAttribute(e){let t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);let n=e.clone(),r=new a.Pq0;for(let e=0,t=n.count;e4?r=e.array[i*e.itemSize+n]:(0===n?r=e.getX(i):1===n?r=e.getY(i):2===n?r=e.getZ(i):3===n&&(r=e.getW(i)),!0===e.normalized&&(r=a.cj9.normalize(r,e.array))),t===h.FLOAT?u.setFloat32(f,r,!0):t===h.INT?u.setInt32(f,r,!0):t===h.UNSIGNED_INT?u.setUint32(f,r,!0):t===h.SHORT?u.setInt16(f,r,!0):t===h.UNSIGNED_SHORT?u.setUint16(f,r,!0):t===h.BYTE?u.setInt8(f,r):t===h.UNSIGNED_BYTE&&u.setUint8(f,r),f+=o}f%l!=0&&(f+=l-f%l)}let p={buffer:this.processBuffer(u.buffer),byteOffset:this.byteOffset,byteLength:c};return void 0!==i&&(p.target=i),i===h.ARRAY_BUFFER&&(p.byteStride=l),this.byteOffset+=c,s.bufferViews.push(p),{id:s.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){let t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise(function(r){let i=new FileReader;i.readAsArrayBuffer(e),i.onloadend=function(){let e=b(i.result),o={buffer:t.processBuffer(e),byteOffset:t.byteOffset,byteLength:e.byteLength};t.byteOffset+=e.byteLength,r(n.bufferViews.push(o)-1)}})}processAccessor(e,t,n,r){let i,o;let s=this.json;if(e.array.constructor===Float32Array)i=h.FLOAT;else if(e.array.constructor===Int32Array)i=h.INT;else if(e.array.constructor===Uint32Array)i=h.UNSIGNED_INT;else if(e.array.constructor===Int16Array)i=h.SHORT;else if(e.array.constructor===Uint16Array)i=h.UNSIGNED_SHORT;else if(e.array.constructor===Int8Array)i=h.BYTE;else if(e.array.constructor===Uint8Array)i=h.UNSIGNED_BYTE;else throw Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+e.array.constructor.name);if(void 0===n&&(n=0),(void 0===r||r===1/0)&&(r=e.count),0===r)return null;let l=function(e,t,n){let r={min:Array(e.itemSize).fill(Number.POSITIVE_INFINITY),max:Array(e.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let i=t;i4?n=e.array[i*e.itemSize+t]:(0===t?n=e.getX(i):1===t?n=e.getY(i):2===t?n=e.getZ(i):3===t&&(n=e.getW(i)),!0===e.normalized&&(n=a.cj9.normalize(n,e.array))),r.min[t]=Math.min(r.min[t],n),r.max[t]=Math.max(r.max[t],n)}return r}(e,n,r);void 0!==t&&(o=e===t.index?h.ELEMENT_ARRAY_BUFFER:h.ARRAY_BUFFER);let c=this.processBufferView(e,i,n,r,o),u={bufferView:c.id,byteOffset:c.byteOffset,componentType:i,count:r,max:l.max,min:l.min,type:{1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"}[e.itemSize]};return!0===e.normalized&&(u.normalized=!0),s.accessors||(s.accessors=[]),s.accessors.push(u)-1}processImage(e,t,n,r="image/png"){if(null!==e){let i=this,o=i.cache,s=i.json,l=i.options,c=i.pending;o.images.has(e)||o.images.set(e,{});let u=o.images.get(e),h=r+":flipY/"+n.toString();if(void 0!==u[h])return u[h];s.images||(s.images=[]);let f={mimeType:r},p=g();p.width=Math.min(e.width,l.maxTextureSize),p.height=Math.min(e.height,l.maxTextureSize);let d=p.getContext("2d");if(!0===n&&(d.translate(0,p.height),d.scale(1,-1)),void 0!==e.data){t!==a.GWd&&console.error("GLTFExporter: Only RGBAFormat is supported.",t),(e.width>l.maxTextureSize||e.height>l.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);let n=new Uint8ClampedArray(e.height*e.width*4);for(let t=0;ti.processBufferViewImage(e)).then(e=>{f.bufferView=e})):void 0!==p.toDataURL?f.uri=p.toDataURL(r):c.push(w(p,r).then(e=>new FileReader().readAsDataURL(e)).then(e=>{f.uri=e}));let m=s.images.push(f)-1;return u[h]=m,m}throw Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(e){let t=this.json;t.samplers||(t.samplers=[]);let n={magFilter:p[e.magFilter],minFilter:p[e.minFilter],wrapS:p[e.wrapS],wrapT:p[e.wrapT]};return t.samplers.push(n)-1}processTexture(e){let t=this.options,n=this.cache,r=this.json;if(n.textures.has(e))return n.textures.get(e);r.textures||(r.textures=[]),e instanceof a.FvD&&(e=l(e,t.maxTextureSize));let i=e.userData.mimeType;"image/webp"===i&&(i="image/png");let o={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,i)};e.name&&(o.name=e.name),this._invokeAll(function(t){t.writeTexture&&t.writeTexture(e,o)});let s=r.textures.push(o)-1;return n.textures.set(e,s),s}processMaterial(e){let t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);let r={pbrMetallicRoughness:{}};!0!==e.isMeshStandardMaterial&&!0!==e.isMeshBasicMaterial&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");let i=e.color.toArray().concat([e.opacity]);if(v(i,[1,1,1,1])||(r.pbrMetallicRoughness.baseColorFactor=i),e.isMeshStandardMaterial?(r.pbrMetallicRoughness.metallicFactor=e.metalness,r.pbrMetallicRoughness.roughnessFactor=e.roughness):(r.pbrMetallicRoughness.metallicFactor=.5,r.pbrMetallicRoughness.roughnessFactor=.5),e.metalnessMap||e.roughnessMap){let t=this.buildMetalRoughTexture(e.metalnessMap,e.roughnessMap),n={index:this.processTexture(t),channel:t.channel};this.applyTextureTransform(n,t),r.pbrMetallicRoughness.metallicRoughnessTexture=n}if(e.map){let t={index:this.processTexture(e.map),texCoord:e.map.channel};this.applyTextureTransform(t,e.map),r.pbrMetallicRoughness.baseColorTexture=t}if(e.emissive){let t=e.emissive;if(Math.max(t.r,t.g,t.b)>0&&(r.emissiveFactor=e.emissive.toArray()),e.emissiveMap){let t={index:this.processTexture(e.emissiveMap),texCoord:e.emissiveMap.channel};this.applyTextureTransform(t,e.emissiveMap),r.emissiveTexture=t}}if(e.normalMap){let t={index:this.processTexture(e.normalMap),texCoord:e.normalMap.channel};e.normalScale&&1!==e.normalScale.x&&(t.scale=e.normalScale.x),this.applyTextureTransform(t,e.normalMap),r.normalTexture=t}if(e.aoMap){let t={index:this.processTexture(e.aoMap),texCoord:e.aoMap.channel};1!==e.aoMapIntensity&&(t.strength=e.aoMapIntensity),this.applyTextureTransform(t,e.aoMap),r.occlusionTexture=t}e.transparent?r.alphaMode="BLEND":e.alphaTest>0&&(r.alphaMode="MASK",r.alphaCutoff=e.alphaTest),e.side===a.$EB&&(r.doubleSided=!0),""!==e.name&&(r.name=e.name),this.serializeUserData(e,r),this._invokeAll(function(t){t.writeMaterial&&t.writeMaterial(e,r)});let o=n.materials.push(r)-1;return t.materials.set(e,o),o}processMesh(e){let t;let n=this.cache,r=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let t=0,n=e.material.length;t0){let t=[],r=[],i={};if(void 0!==e.morphTargetDictionary)for(let t in e.morphTargetDictionary)i[e.morphTargetDictionary[t]]=t;for(let o=0;o0&&(l.extras={},l.extras.targetNames=r)}let v=Array.isArray(e.material);if(v&&0===s.groups.length)return null;let y=!1;if(v&&null===s.index){let e=[];for(let t=0,n=s.attributes.position.count;t0&&(r.targets=f),null!==s.index){let t=this.getUID(s.index);(void 0!==g[e].start||void 0!==g[e].count)&&(t+=":"+g[e].start+":"+g[e].count),n.attributes.has(t)?r.indices=n.attributes.get(t):(r.indices=this.processAccessor(s.index,s,g[e].start,g[e].count),n.attributes.set(t,r.indices)),null===r.indices&&delete r.indices}let i=this.processMaterial(b[g[e].materialIndex]);null!==i&&(r.material=i),u.push(r)}!0===y&&s.setIndex(null),l.primitives=u,r.meshes||(r.meshes=[]),this._invokeAll(function(t){t.writeMesh&&t.writeMesh(e,l)});let w=r.meshes.push(l)-1;return n.meshes.set(o,w),w}detectMeshQuantization(e,t){let n;if(this.extensionsUsed[f])return;switch(t.array.constructor){case Int8Array:n="byte";break;case Uint8Array:n="unsigned byte";break;case Int16Array:n="short";break;case Uint16Array:n="unsigned short";break;default:return}t.normalized&&(n+=" normalized");let r=e.split("_",1)[0];c[r]&&c[r].includes(n)&&(this.extensionsUsed[f]=!0,this.extensionsRequired[f]=!0)}processCamera(e){let t=this.json;t.cameras||(t.cameras=[]);let n=e.isOrthographicCamera,r={type:n?"orthographic":"perspective"};return n?r.orthographic={xmag:2*e.right,ymag:2*e.top,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:r.perspective={aspectRatio:e.aspect,yfov:a.cj9.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},""!==e.name&&(r.name=e.type),t.cameras.push(r)-1}processAnimation(e,t){let n=this.json,r=this.nodeMap;n.animations||(n.animations=[]);let i=(e=u.Utils.mergeMorphTargetTracks(e.clone(),t)).tracks,o=[],s=[];for(let e=0;e0){let t=[];for(let r=0,i=e.children.length;r0&&(i.children=t)}this._invokeAll(function(t){t.writeNode&&t.writeNode(e,i)});let o=t.nodes.push(i)-1;return r.set(e,o),o}processScene(e){let t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);let r={};""!==e.name&&(r.name=e.name),t.scenes.push(r);let i=[];for(let t=0,r=e.children.length;t0&&(r.nodes=i),this.serializeUserData(e,r)}processObjects(e){let t=new a.Z58;t.name="AuxScene";for(let n=0;n0&&this.processObjects(n);for(let e=0;e0&&(o.range=e.distance)):e.isSpotLight&&(o.type="spot",e.distance>0&&(o.range=e.distance),o.spot={},o.spot.innerConeAngle=(1-e.penumbra)*e.angle,o.spot.outerConeAngle=e.angle),void 0!==e.decay&&2!==e.decay&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),e.target&&(e.target.parent!==e||0!==e.target.position.x||0!==e.target.position.y||-1!==e.target.position.z)&&console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),i[this.name]||(r.extensions=r.extensions||{},r.extensions[this.name]={lights:[]},i[this.name]=!0);let s=r.extensions[this.name].lights;s.push(o),t.extensions=t.extensions||{},t.extensions[this.name]={light:s.length-1}}}class x{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}writeMaterial(e,t){if(!e.isMeshBasicMaterial)return;let n=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},n[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class R{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.clearcoat)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.clearcoatFactor=e.clearcoat,e.clearcoatMap){let t={index:n.processTexture(e.clearcoatMap),texCoord:e.clearcoatMap.channel};n.applyTextureTransform(t,e.clearcoatMap),i.clearcoatTexture=t}if(i.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){let t={index:n.processTexture(e.clearcoatRoughnessMap),texCoord:e.clearcoatRoughnessMap.channel};n.applyTextureTransform(t,e.clearcoatRoughnessMap),i.clearcoatRoughnessTexture=t}if(e.clearcoatNormalMap){let t={index:n.processTexture(e.clearcoatNormalMap),texCoord:e.clearcoatNormalMap.channel};1!==e.clearcoatNormalScale.x&&(t.scale=e.clearcoatNormalScale.x),n.applyTextureTransform(t,e.clearcoatNormalMap),i.clearcoatNormalTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class P{constructor(e){this.writer=e,this.name="KHR_materials_dispersion"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.dispersion)return;let n=this.writer.extensionsUsed,r={};r.dispersion=e.dispersion,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class A{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.iridescence)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.iridescenceFactor=e.iridescence,e.iridescenceMap){let t={index:n.processTexture(e.iridescenceMap),texCoord:e.iridescenceMap.channel};n.applyTextureTransform(t,e.iridescenceMap),i.iridescenceTexture=t}if(i.iridescenceIor=e.iridescenceIOR,i.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],i.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){let t={index:n.processTexture(e.iridescenceThicknessMap),texCoord:e.iridescenceThicknessMap.channel};n.applyTextureTransform(t,e.iridescenceThicknessMap),i.iridescenceThicknessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class S{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.transmissionFactor=e.transmission,e.transmissionMap){let t={index:n.processTexture(e.transmissionMap),texCoord:e.transmissionMap.channel};n.applyTextureTransform(t,e.transmissionMap),i.transmissionTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class E{constructor(e){this.writer=e,this.name="KHR_materials_volume"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.thicknessFactor=e.thickness,e.thicknessMap){let t={index:n.processTexture(e.thicknessMap),texCoord:e.thicknessMap.channel};n.applyTextureTransform(t,e.thicknessMap),i.thicknessTexture=t}i.attenuationDistance=e.attenuationDistance,i.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class O{constructor(e){this.writer=e,this.name="KHR_materials_ior"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||1.5===e.ior)return;let n=this.writer.extensionsUsed,r={};r.ior=e.ior,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class M{constructor(e){this.writer=e,this.name="KHR_materials_specular"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||1===e.specularIntensity&&e.specularColor.equals(m)&&!e.specularIntensityMap&&!e.specularColorMap)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.specularIntensityMap){let t={index:n.processTexture(e.specularIntensityMap),texCoord:e.specularIntensityMap.channel};n.applyTextureTransform(t,e.specularIntensityMap),i.specularTexture=t}if(e.specularColorMap){let t={index:n.processTexture(e.specularColorMap),texCoord:e.specularColorMap.channel};n.applyTextureTransform(t,e.specularColorMap),i.specularColorTexture=t}i.specularFactor=e.specularIntensity,i.specularColorFactor=e.specularColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class _{constructor(e){this.writer=e,this.name="KHR_materials_sheen"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0==e.sheen)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.sheenRoughnessMap){let t={index:n.processTexture(e.sheenRoughnessMap),texCoord:e.sheenRoughnessMap.channel};n.applyTextureTransform(t,e.sheenRoughnessMap),i.sheenRoughnessTexture=t}if(e.sheenColorMap){let t={index:n.processTexture(e.sheenColorMap),texCoord:e.sheenColorMap.channel};n.applyTextureTransform(t,e.sheenColorMap),i.sheenColorTexture=t}i.sheenRoughnessFactor=e.sheenRoughness,i.sheenColorFactor=e.sheenColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class I{constructor(e){this.writer=e,this.name="KHR_materials_anisotropy"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0==e.anisotropy)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.anisotropyMap){let t={index:n.processTexture(e.anisotropyMap)};n.applyTextureTransform(t,e.anisotropyMap),i.anisotropyTexture=t}i.anisotropyStrength=e.anisotropy,i.anisotropyRotation=e.anisotropyRotation,t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class C{constructor(e){this.writer=e,this.name="KHR_materials_emissive_strength"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||1===e.emissiveIntensity)return;let n=this.writer.extensionsUsed,r={};r.emissiveStrength=e.emissiveIntensity,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class j{constructor(e){this.writer=e,this.name="EXT_materials_bump"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||1===e.bumpScale&&!e.bumpMap)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.bumpMap){let t={index:n.processTexture(e.bumpMap),texCoord:e.bumpMap.channel};n.applyTextureTransform(t,e.bumpMap),i.bumpTexture=t}i.bumpFactor=e.bumpScale,t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class B{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(!e.isInstancedMesh)return;let n=this.writer,r=new Float32Array(3*e.count),i=new Float32Array(4*e.count),o=new Float32Array(3*e.count),s=new a.kn4,l=new a.Pq0,c=new a.PTz,u=new a.Pq0;for(let t=0;tMath.abs(e.times[0]-t))return 0;i[0]=t,i.set(e.times,1),o.set(s.evaluate(t),0),o.set(e.values,r),n=0}else if(t>e.times[e.times.length-1]){if(.001>Math.abs(e.times[e.times.length-1]-t))return e.times.length-1;i[i.length-1]=t,i.set(e.times,0),o.set(e.values,0),o.set(s.evaluate(t),e.values.length),n=i.length-1}else for(let a=0;aMath.abs(e.times[a]-t))return a;if(e.times[a]t){i.set(e.times.slice(0,a+1),0),i[a+1]=t,i.set(e.times.slice(a+1),a+2),o.set(e.values.slice(0,(a+1)*r),0),o.set(s.evaluate(t),(a+1)*r),o.set(e.values.slice((a+1)*r),(a+2)*r),n=a+1;break}}return e.times=i,e.values=o,n},mergeMorphTargetTracks:function(e,t){let n=[],r={},i=e.tracks;for(let e=0;e=2.0 are supported."));return}let l=new eS(i,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});l.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e=0&&void 0===s[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}l.setExtensions(o),l.setPlugins(s),l.parse(n,r)}parseAsync(e,t){let n=this;return new Promise(function(r,i){n.parse(e,t,r,i)})}}function H(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}let F={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class U{constructor(e){this.parser=e,this.name=F.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){let e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n=0))return null;throw Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures")}return t.loadTextureImage(e,i.source,o)}}class ee{constructor(e){this.parser=e,this.name=F.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let o=i.extensions[t],s=r.images[o.source],a=n.textureLoader;if(s.uri){let e=n.options.manager.getHandler(s.uri);null!==e&&(a=e)}return this.detectSupport().then(function(i){if(i)return n.loadTextureImage(e,o.source,a);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){let t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}})),this.isSupported}}class et{constructor(e){this.parser=e,this.name=F.EXT_TEXTURE_AVIF,this.isSupported=null}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let o=i.extensions[t],s=r.images[o.source],a=n.textureLoader;if(s.uri){let e=n.options.manager.getHandler(s.uri);null!==e&&(a=e)}return this.detectSupport().then(function(i){if(i)return n.loadTextureImage(e,o.source,a);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return n.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){let t=new Image;t.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",t.onload=t.onerror=function(){e(1===t.height)}})),this.isSupported}}class en{constructor(e){this.name=F.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){let t=this.parser.json,n=t.bufferViews[e];if(!n.extensions||!n.extensions[this.name])return null;{let e=n.extensions[this.name],r=this.parser.getDependency("buffer",e.buffer),i=this.parser.options.meshoptDecoder;if(!i||!i.supported){if(!(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0))return null;throw Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files")}return r.then(function(t){let n=e.byteOffset||0,r=e.byteLength||0,o=e.count,s=e.byteStride,a=new Uint8Array(t,n,r);return i.decodeGltfBufferAsync?i.decodeGltfBufferAsync(o,s,a,e.mode,e.filter).then(function(e){return e.buffer}):i.ready.then(function(){let t=new ArrayBuffer(o*s);return i.decodeGltfBuffer(new Uint8Array(t),o,s,a,e.mode,e.filter),t})})}}}class er{constructor(e){this.name=F.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){let t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||void 0===n.mesh)return null;for(let e of t.meshes[n.mesh].primitives)if(e.mode!==ep.TRIANGLES&&e.mode!==ep.TRIANGLE_STRIP&&e.mode!==ep.TRIANGLE_FAN&&void 0!==e.mode)return null;let r=n.extensions[this.name].attributes,i=[],o={};for(let e in r)i.push(this.parser.getDependency("accessor",r[e]).then(t=>(o[e]=t,o[e])));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then(e=>{let t=e.pop(),n=t.isGroup?t.children:[t],r=e[0].count,i=[];for(let e of n){let t=new a.kn4,n=new a.Pq0,s=new a.PTz,l=new a.Pq0(1,1,1),c=new a.ZLX(e.geometry,e.material,r);for(let e=0;e-1)?navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1]:-1),"undefined"==typeof createImageBitmap||n||r&&i<98?this.textureLoader=new a.Tap(this.options.manager):this.textureLoader=new a.Kzg(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new a.Y9S(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),"use-credentials"===this.options.crossOrigin&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){let n=this,r=this.json,i=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(e){return e._markDefs&&e._markDefs()}),Promise.all(this._invokeAll(function(e){return e.beforeRoot&&e.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(t){let o={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};return eT(i,o,r),ex(o,r),Promise.all(n._invokeAll(function(e){return e.afterRoot&&e.afterRoot(o)})).then(function(){for(let e of o.scenes)e.updateMatrixWorld();e(o)})}).catch(t)}_markDefs(){let e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n{let n=this.associations.get(e);for(let[r,o]of(null!=n&&this.associations.set(t,n),e.children.entries()))i(o,t.children[r])};return i(n,r),r.name+="_instance_"+e.uses[t]++,r}_invokeOne(e){let t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&o.setY(t,f[e*l+1]),l>=3&&o.setZ(t,f[e*l+2]),l>=4&&o.setW(t,f[e*l+3]),l>=5)throw Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return o})}loadTexture(e){let t=this.json,n=this.options,r=t.textures[e].source,i=t.images[r],o=this.textureLoader;if(i.uri){let e=n.manager.getHandler(i.uri);null!==e&&(o=e)}return this.loadTextureImage(e,r,o)}loadTextureImage(e,t,n){let r=this,i=this.json,o=i.textures[e],s=i.images[t],l=(s.uri||s.bufferView)+":"+o.sampler;if(this.textureCache[l])return this.textureCache[l];let c=this.loadImageSource(t,n).then(function(t){t.flipY=!1,t.name=o.name||s.name||"",""===t.name&&"string"==typeof s.uri&&!1===s.uri.startsWith("data:image/")&&(t.name=s.uri);let n=(i.samplers||{})[o.sampler]||{};return t.magFilter=em[n.magFilter]||a.k6q,t.minFilter=em[n.minFilter]||a.$_I,t.wrapS=ev[n.wrapS]||a.GJx,t.wrapT=ev[n.wrapT]||a.GJx,r.associations.set(t,{textures:e}),t}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){let n=this.json,r=this.options;if(void 0!==this.sourceCache[e])return this.sourceCache[e].then(e=>e.clone());let i=n.images[e],o=self.URL||self.webkitURL,s=i.uri||"",l=!1;if(void 0!==i.bufferView)s=this.getDependency("bufferView",i.bufferView).then(function(e){l=!0;let t=new Blob([e],{type:i.mimeType});return s=o.createObjectURL(t)});else if(void 0===i.uri)throw Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");let c=Promise.resolve(s).then(function(e){return new Promise(function(n,i){let o=n;!0===t.isImageBitmapLoader&&(o=function(e){let t=new a.gPd(e);t.needsUpdate=!0,n(t)}),t.load(a.r6x.resolveURL(e,r.path),o,void 0,i)})}).then(function(e){var t;return!0===l&&o.revokeObjectURL(s),ex(e,i),e.userData.mimeType=i.mimeType||((t=i.uri).search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/)?"image/jpeg":t.search(/\.webp($|\?)/i)>0||0===t.search(/^data\:image\/webp/)?"image/webp":"image/png"),e}).catch(function(e){throw console.error("THREE.GLTFLoader: Couldn't load texture",s),e});return this.sourceCache[e]=c,c}assignTexture(e,t,n,r){let i=this;return this.getDependency("texture",n.index).then(function(o){if(!o)return null;if(void 0!==n.texCoord&&n.texCoord>0&&((o=o.clone()).channel=n.texCoord),i.extensions[F.KHR_TEXTURE_TRANSFORM]){let e=void 0!==n.extensions?n.extensions[F.KHR_TEXTURE_TRANSFORM]:void 0;if(e){let t=i.associations.get(o);o=i.extensions[F.KHR_TEXTURE_TRANSFORM].extendTexture(o,e),i.associations.set(o,t)}}return void 0!==r&&(o.colorSpace=r),e[t]=o,o})}assignFinalMaterial(e){let t=e.geometry,n=e.material,r=void 0===t.attributes.tangent,i=void 0!==t.attributes.color,o=void 0===t.attributes.normal;if(e.isPoints){let e="PointsMaterial:"+n.uuid,t=this.cache.get(e);t||(t=new a.BH$,a.imn.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){let e="LineBasicMaterial:"+n.uuid,t=this.cache.get(e);t||(t=new a.mrM,a.imn.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(r||i||o){let e="ClonedMaterial:"+n.uuid+":";r&&(e+="derivative-tangents:"),i&&(e+="vertex-colors:"),o&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=n.clone(),i&&(t.vertexColors=!0),o&&(t.flatShading=!0),r&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return a._4j}loadMaterial(e){let t;let n=this,r=this.json,i=this.extensions,o=r.materials[e],s={},l=o.extensions||{},c=[];if(l[F.KHR_MATERIALS_UNLIT]){let e=i[F.KHR_MATERIALS_UNLIT];t=e.getMaterialType(),c.push(e.extendParams(s,o,n))}else{let r=o.pbrMetallicRoughness||{};if(s.color=new a.Q1f(1,1,1),s.opacity=1,Array.isArray(r.baseColorFactor)){let e=r.baseColorFactor;s.color.setRGB(e[0],e[1],e[2],a.Zr2),s.opacity=e[3]}void 0!==r.baseColorTexture&&c.push(n.assignTexture(s,"map",r.baseColorTexture,a.er$)),s.metalness=void 0!==r.metallicFactor?r.metallicFactor:1,s.roughness=void 0!==r.roughnessFactor?r.roughnessFactor:1,void 0!==r.metallicRoughnessTexture&&(c.push(n.assignTexture(s,"metalnessMap",r.metallicRoughnessTexture)),c.push(n.assignTexture(s,"roughnessMap",r.metallicRoughnessTexture))),t=this._invokeOne(function(t){return t.getMaterialType&&t.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,s)})))}!0===o.doubleSided&&(s.side=a.$EB);let u=o.alphaMode||ek.OPAQUE;if(u===ek.BLEND?(s.transparent=!0,s.depthWrite=!1):(s.transparent=!1,u===ek.MASK&&(s.alphaTest=void 0!==o.alphaCutoff?o.alphaCutoff:.5)),void 0!==o.normalTexture&&t!==a.V9B&&(c.push(n.assignTexture(s,"normalMap",o.normalTexture)),s.normalScale=new a.I9Y(1,1),void 0!==o.normalTexture.scale)){let e=o.normalTexture.scale;s.normalScale.set(e,e)}if(void 0!==o.occlusionTexture&&t!==a.V9B&&(c.push(n.assignTexture(s,"aoMap",o.occlusionTexture)),void 0!==o.occlusionTexture.strength&&(s.aoMapIntensity=o.occlusionTexture.strength)),void 0!==o.emissiveFactor&&t!==a.V9B){let e=o.emissiveFactor;s.emissive=new a.Q1f().setRGB(e[0],e[1],e[2],a.Zr2)}return void 0!==o.emissiveTexture&&t!==a.V9B&&c.push(n.assignTexture(s,"emissiveMap",o.emissiveTexture,a.er$)),Promise.all(c).then(function(){let r=new t(s);return o.name&&(r.name=o.name),ex(r,o),n.associations.set(r,{materials:e}),o.extensions&&eT(i,r,o),r})}createUniqueName(e){let t=a.Nwf.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){let t=this,n=this.extensions,r=this.primitiveCache,i=[];for(let o=0,s=e.length;o0&&function(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let n=0,r=t.weights.length;n1?new a.YJl:1===t.length?t[0]:new a.B69)!==t[0])for(let e=0,n=t.length;e{let t=new Map;for(let[e,n]of r.associations)(e instanceof a.imn||e instanceof a.gPd)&&t.set(e,n);return e.traverse(e=>{let n=r.associations.get(e);null!=n&&t.set(e,n)}),t})(i),i})}_createAnimationTracks(e,t,n,r,i){let o;let s=[],l=e.name?e.name:e.uuid,c=[];switch(eg[i.path]===eg.weights?e.traverse(function(e){e.morphTargetInfluences&&c.push(e.name?e.name:e.uuid)}):c.push(l),eg[i.path]){case eg.weights:o=a.Hit;break;case eg.rotation:o=a.MBL;break;case eg.position:case eg.scale:o=a.RiT;break;default:o=1===n.itemSize?a.Hit:a.RiT}let u=void 0!==r.interpolation?ew[r.interpolation]:a.PJ3,h=this._getArrayFromAccessor(n);for(let e=0,n=c.length;e{n.d(t,{m:()=>c});var r=n("./src/model/ball.ts"),i=n("./src/view/tablegeometry.ts"),o=n("./node_modules/three/build/three.module.js"),s=n("./src/utils/utils.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"jitter",value:function(e){return(0,s.ld)(e.clone().add(new o.Pq0(t.noise*(Math.random()-.5),t.noise*(Math.random()-.5),0)))}},{key:"cueBall",value:function(e){return new r.c(t.jitter(e),16444375)}},{key:"diamond",value:function(){var e=new o.Pq0(i.P.tableX/2,0,0),n=[];return n.push(t.cueBall(t.spot)),n.push(new r.c(t.jitter(e),14736950)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),16751872)),e.sub(t.across),n.push(new r.c(t.jitter(e),5380369)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),5853696)),e.sub(t.across),n.push(new r.c(t.jitter(e),16711680)),e.addScaledVector(t.across,2),n.push(new r.c(t.jitter(e),328965)),e.add(t.diagonal).sub(t.across),n.push(new r.c(t.jitter(e),685250)),e.sub(t.across),n.push(new r.c(t.jitter(e),553728)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),4063388)),n}},{key:"triangle",value:function(){var e=t.trianglePositions(),n=t.cueBall(t.spot),i=e.map(function(e){return new r.c(t.jitter(e))});return i.unshift(n),i.slice(0,5)}},{key:"trianglePositions",value:function(){var e=[],t=new o.Pq0(i.P.X/2,0,0);return e.push((0,s.t6)(t)),t.add(this.diagonal),e.push((0,s.t6)(t)),t.sub(this.across),e.push((0,s.t6)(t)),t.add(this.diagonal),e.push((0,s.t6)(t)),t.sub(this.across),e.push((0,s.t6)(t)),t.addScaledVector(this.across,2),e.push((0,s.t6)(t)),t.add(this.diagonal),e.push((0,s.t6)(t)),t.sub(this.across),e.push((0,s.t6)(t)),t.sub(this.across),e.push((0,s.t6)(t)),t.sub(this.across),e.push((0,s.t6)(t)),t.add(this.diagonal).sub(this.across),e.push((0,s.t6)(t)),t.add(this.across),e.push((0,s.t6)(t)),t.add(this.across),e.push((0,s.t6)(t)),t.add(this.across),e.push((0,s.t6)(t)),t.add(this.across),e.push((0,s.t6)(t)),e}},{key:"rerack",value:function(e,n){var i=t.trianglePositions(),o=i.shift();n.balls.filter(function(e){return e!==n.cueball}).filter(function(t){return t!==e}).forEach(function(e){e.pos.copy(t.jitter(i.shift())),e.state=r.U.Stationary}),n.overlapsAny(e.pos,e)&&e.pos.copy(o),n.overlapsAny(n.cueball.pos)&&n.cueball.pos.copy(t.spot)}},{key:"three",value:function(){var e=[],n=i.P.X/2,s=i.P.Y/4;return e.push(t.cueBall(t.jitter(new o.Pq0(-n,-s,0)))),e.push(new r.c(t.jitter(new o.Pq0(-n,0,0)),14736950)),e.push(new r.c(t.jitter(new o.Pq0(n,0,0)),16711680)),e}},{key:"snooker",value:function(){var e=[],n=i.P.Y/4;e.push(t.cueBall(t.jitter(new o.Pq0(t.baulk,-(.5*n),0))));var s=t.snookerColourPositions();return e.push(new r.c(t.jitter(s[0]),15654454)),e.push(new r.c(t.jitter(s[1]),824932)),e.push(new r.c(t.jitter(s[2]),12415546)),e.push(new r.c(t.jitter(s[3]),558062)),e.push(new r.c(t.jitter(s[4]),16755404)),e.push(new r.c(t.jitter(s[5]),65793)),t.trianglePositions().slice(0,15).forEach(function(n){e.push(new r.c(t.jitter(n.add(t.down)),15597568))}),e}},{key:"snookerColourPositions",value:function(){var e=i.P.X/2,n=i.P.X-2*i.P.X/11,r=[];return r.push(new o.Pq0(t.baulk,-t.sixth,0)),r.push(new o.Pq0(t.baulk,t.sixth,0)),r.push(new o.Pq0(t.baulk,0,0)),r.push(new o.Pq0(0,0,0)),r.push(new o.Pq0(e,0,0)),r.push(new o.Pq0(n,0,0)),r}}],function(e,t){for(var n=0;n{n.d(t,{k:()=>a});var r=n("./src/model/ball.ts"),i=n("./src/view/tablegeometry.ts"),o=n("./src/model/physics/constants.ts"),s=n("./src/utils/rack.ts"),a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"respot",value:function(e,n){var i=s.m.snookerColourPositions();return i.push(i[e.id-1]),i.reverse(),i.some(function(t){return!n.overlapsAny(t,e)&&(e.pos.copy(t),e.state=r.U.Stationary,!0)})||t.respotBehind(i[0],e,n),e}},{key:"respotBehind",value:function(e,t,n){for(var s=e.clone();s.x-i.P.tableX&&n.overlapsAny(s,t);)s.x-=o.R/8;t.pos.copy(s),t.state=r.U.Stationary}},{key:"closest",value:function(e,t){var n=t.filter(function(e){return e.onTable()}).filter(function(t){return t!==e});if(0!==n.length){var r=function(t){return e.pos.distanceTo(t.pos)};return n.reduce(function(e,t){return r(e){n.d(t,{Dz:()=>p,KM:()=>l,ld:()=>m,rq:()=>f,t6:()=>s,up:()=>o,v_:()=>i,xb:()=>u});var r=n("./node_modules/three/build/three.module.js"),i=new r.Pq0(0,0,0),o=new r.Pq0(0,0,1);function s(e){return new r.Pq0(e.x,e.y,e.z)}var a=new r.Pq0;function l(e){return a.copy(o).cross(e)}var c=new r.Pq0;function u(e){return c.copy(e).normalize()}var h=new r.Pq0;function f(e,t){return 0>=h.copy(e).add(t).dot(e)}function p(e){return new r.Pq0(1,0,0).applyAxisAngle(o,e)}function d(e){return Math.sign(e)*Math.floor((Math.abs(e)+Number.EPSILON)*1e4)/1e4}function m(e){return e.x=d(e.x),e.y=d(e.y),e.z=d(e.z),e}},"./src/view/assets.ts":(e,t,n)=>{n.d(t,{s:()=>v});var r=n("./src/controller/rules/rulefactory.ts"),i=n("./src/utils/gltf.ts"),o=n("./node_modules/three/build/three.module.js");function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),s(this,"listener",void 0),s(this,"audioLoader",void 0),s(this,"ballcollision",void 0),s(this,"cue",void 0),s(this,"cushion",void 0),s(this,"pot",void 0),s(this,"success",void 0),s(this,"lastOutcomeTime",0),s(this,"loadAssets",void 0),this.loadAssets=e,e&&(this.listener=new o.Pf$,this.audioLoader=new o.Am1,this.ballcollision=new o.fP5(this.listener),this.load("sounds/ballcollision.ogg",this.ballcollision),this.cue=new o.fP5(this.listener),this.load("sounds/cue.ogg",this.cue),this.cushion=new o.fP5(this.listener),this.load("sounds/cushion.ogg",this.cushion),this.pot=new o.fP5(this.listener),this.load("sounds/pot.ogg",this.pot),this.success=new o.fP5(this.listener),this.load("sounds/success.ogg",this.success))}return e=[{key:"addCameraToListener",value:function(e){e.add(this.listener)}},{key:"load",value:function(e,t){this.audioLoader.load(e,function(e){t.setBuffer(e),t.setLoop(!1)},function(e){},function(e){})}},{key:"play",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(this.loadAssets){var r,i,s=o.UtX.getContext();if((null==s?void 0:s.state)==="suspended"){(null===(i=navigator)||void 0===i?void 0:null===(r=i.userActivation)||void 0===r?void 0:r.hasBeenActive)&&s.resume();return}e.setVolume(t),e.isPlaying&&e.stop(),e.play(o.cj9.randFloat(0,.01)),e.setDetune(n)}}},{key:"outcomeToSound",value:function(e){"Collision"===e.type&&this.play(this.ballcollision,e.incidentSpeed/80,5*e.incidentSpeed),"Pot"===e.type&&this.play(this.pot,e.incidentSpeed/10,-1e3+10*e.incidentSpeed),"Cushion"===e.type&&this.play(this.cushion,e.incidentSpeed/70),"Hit"===e.type&&this.play(this.cue,e.incidentSpeed/30)}},{key:"processOutcomes",value:function(e){var t=this;e.every(function(e){return!(e.timestamp>t.lastOutcomeTime)||(t.lastOutcomeTime=e.timestamp,t.outcomeToSound(e),!1)})}},{key:"playNotify",value:function(){this.play(this.pot,1)}},{key:"playSuccess",value:function(e){this.play(this.success,.1,100*e-2200)}}],function(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:this.cloth;this.cylinder(e.pos,e.radius,.75*u.R/.5,t,n).position.setZ(-(.25*u.R)/.5/2)}},{key:"cylinder",value:function(e,t,n,r,i){var s=new o.Ho_(t,t,n,16),a=new o.eaF(s,i);return a.position.copy(e),a.geometry.applyMatrix4(new o.kn4().identity().makeRotationAxis(new o.Pq0(1,0,0),Math.PI/2)),r.add(a),a}},{key:"addCushions",value:function(e,t){var n=10*u.R/.5;this.plane(new o.Pq0(0,0,-u.R-n/2),2*l.P.X,2*l.P.Y,n,e,this.cloth);var r=1*u.R/.5,i=.75*u.R/.5,s=-(.25*u.R)/.5/2,a=l.P.X,h=l.P.Y,f=Math.abs(c.f.pockets.pocketNW.knuckleNE.pos.x-c.f.pockets.pocketN.knuckleNW.pos.x),p=Math.abs(c.f.pockets.pocketNW.knuckleSW.pos.y-c.f.pockets.pocketSW.knuckleNW.pos.y);t||(f=2*l.P.Y,p=2*l.P.Y+4*u.R),this.plane(new o.Pq0(a+r/2,0,s),r,p,i,e),this.plane(new o.Pq0(-a-r/2,0,s),r,p,i,e),this.plane(new o.Pq0(-a/2,h+r/2,s),f,r,i,e),this.plane(new o.Pq0(-a/2,-h-r/2,s),f,r,i,e),this.plane(new o.Pq0(a/2,h+r/2,s),f,r,i,e),this.plane(new o.Pq0(a/2,-h-r/2,s),f,r,i,e)}},{key:"plane",value:function(e,t,n,r,i){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:this.cushion,a=new o.iNn(t,n,r),l=new o.eaF(a,s);l.receiveShadow=!0,l.position.copy(e),i.add(l)}}],function(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",t=new n(e);return t.creatLocal(),t}}],e&&d(n.prototype,e),t&&d(n,t),n}()},"./src/view/cameratop.ts":(e,t,n)=>{n.d(t,{v:()=>a});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/view/tablegeometry.ts"),o=n("./src/model/physics/constants.ts");function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"viewPoint",value:function(e,n){var s=t.zoomFactor/(2*Math.tan(n*Math.PI/360));if(e>this.portrait){var a=e>t.aspectLimit?2.75*i.P.tableY:2.4*i.P.tableX/e;return new r.Pq0(0,-.01*o.R,s*a)}var l=e>1/t.aspectLimit?4.9*i.P.tableY:1.35*i.P.tableX/e;return new r.Pq0(-.01*o.R,0,s*l)}}],function(e,t){for(var n=0;n{n.d(t,{s:()=>f});var r=n("./src/view/tablegeometry.ts"),i=n("./src/utils/utils.ts"),o=n("./src/events/aimevent.ts"),s=n("./src/model/ball.ts"),a=n("./src/model/physics/physics.ts"),l=n("./src/view/cuemesh.ts"),c=n("./node_modules/three/build/three.module.js"),u=n("./src/model/physics/constants.ts");function h(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),h(this,"mesh",void 0),h(this,"helperMesh",void 0),h(this,"placerMesh",void 0),h(this,"offCenterLimit",.3),h(this,"maxPower",150*u.R),h(this,"t",0),h(this,"aimInputs",void 0),h(this,"aim",new o.w),h(this,"length",1*r.P.tableX),this.mesh=l.l.createCue(.05*u.R/.5,.15*u.R/.5,this.length),this.helperMesh=l.l.createHelper(),this.placerMesh=l.l.createPlacer()}return e=[{key:"rotateAim",value:function(e,t){this.aim.angle=this.aim.angle+e,this.mesh.rotation.z=this.aim.angle,this.helperMesh.rotation.z=this.aim.angle,this.aimInputs.showOverlap(),this.avoidCueTouchingOtherBall(t)}},{key:"adjustPower",value:function(e){this.aim.power=Math.min(this.maxPower,this.aim.power+e),this.updateAimInput()}},{key:"setPower",value:function(e){this.aim.power=e*this.maxPower}},{key:"hit",value:function(e){var t=this.aim;this.t=0,e.state=s.U.Sliding,e.vel.copy((0,i.Dz)(t.angle).multiplyScalar(t.power)),e.rvel.copy((0,a.t6)(t.offset,e.vel))}},{key:"aimAtNext",value:function(e,t){if(t){var n=(0,i.xb)(t.pos.clone().sub(e.pos));this.aim.angle=Math.atan2(n.y,n.x)}}},{key:"adjustSpin",value:function(e,t){var n=this.aim.offset.clone().clone().add(e);this.setSpin(n,t)}},{key:"setSpin",value:function(e,t){e.length()>this.offCenterLimit&&e.normalize().multiplyScalar(this.offCenterLimit),this.aim.offset.copy(e),this.avoidCueTouchingOtherBall(t),this.updateAimInput()}},{key:"avoidCueTouchingOtherBall",value:function(e){for(var t=0;t++<20&&this.intersectsAnything(e);)this.aim.offset.y+=.1,this.aim.offset.length()>this.offCenterLimit&&this.aim.offset.normalize().multiplyScalar(this.offCenterLimit);t>1&&this.updateAimInput()}},{key:"updateAimInput",value:function(){var e,t,n;null===(e=this.aimInputs)||void 0===e||e.updateVisualState(this.aim.offset.x,this.aim.offset.y),null===(t=this.aimInputs)||void 0===t||t.updatePowerSlider(this.aim.power/this.maxPower),null===(n=this.aimInputs)||void 0===n||n.showOverlap()}},{key:"moveTo",value:function(e){this.aim.pos.copy(e),this.mesh.rotation.z=this.aim.angle,this.helperMesh.rotation.z=this.aim.angle;var t=this.spinOffset(),n=(Math.sin(this.t+Math.PI/2)-1)*2*u.R*(this.aim.power/this.maxPower),r=(0,i.Dz)(this.aim.angle).clone().multiplyScalar(n);this.mesh.position.copy(e.clone().add(t).add(r)),this.helperMesh.position.copy(e),this.placerMesh.position.copy(e),this.placerMesh.rotation.z=this.t}},{key:"update",value:function(e){this.t+=e,this.moveTo(this.aim.pos)}},{key:"placeBallMode",value:function(){this.mesh.visible=!1,this.placerMesh.visible=!0,this.aim.angle=0}},{key:"aimMode",value:function(){this.mesh.visible=!0,this.placerMesh.visible=!1}},{key:"spinOffset",value:function(){return(0,i.KM)((0,i.Dz)(this.aim.angle)).multiplyScalar(2*this.aim.offset.x*u.R).setZ(2*this.aim.offset.y*u.R)}},{key:"intersectsAnything",value:function(e){var t=this.spinOffset(),n=e.cueball.pos.clone().add(t),r=(0,i.xb)((0,i.Dz)(this.aim.angle+Math.PI).setZ(.1)),o=new c.tBo(n,r),s=e.balls.map(function(e){return e.ballmesh.mesh});return e.mesh&&s.push(e.mesh),o.intersectObjects(s,!0).length>0}},{key:"showHelper",value:function(e){this.helperMesh.visible=e}},{key:"toggleHelper",value:function(){this.showHelper(!this.helperMesh.visible)}}],function(e,t){for(var n=0;n{n.d(t,{l:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/utils/utils.ts"),o=n("./node_modules/three/build/three.module.js");function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"indicateValid",value:function(e){t.placermaterial.color.setHex(e?13434828:16711680)}},{key:"createHelper",value:function(){var e=new o.Ho_(r.R,r.R,30*r.R/.5,12,1,!0),t=new o.eaF(e,this.helpermaterial);return t.geometry.applyMatrix4(new o.kn4().identity().makeRotationAxis(i.up,-Math.PI/2)).applyMatrix4(new o.kn4().identity().makeTranslation(15*r.R/.5,0,-(.01*r.R)/.5)),t.visible=!1,t.renderOrder=-1,t.material.depthTest=!1,t}},{key:"createPlacer",value:function(){var e=new o.Ho_(.01*r.R/.5,r.R,r.R,4),n=new o.eaF(e,t.placermaterial);return n.geometry.applyMatrix4(new o.kn4().identity().makeRotationAxis(new o.Pq0(1,0,0),-Math.PI/2)).applyMatrix4(new o.kn4().identity().makeTranslation(0,0,.7*r.R/.5)),n.visible=!1,n}},{key:"createCue",value:function(e,n,s){var a=new o.Ho_(e,n,s,11),l=new o.eaF(a,t.material);return l.castShadow=!1,l.geometry.applyMatrix4(new o.kn4().identity().makeRotationAxis(new o.Pq0(1,0,0),-.17)).applyMatrix4(new o.kn4().identity().makeRotationAxis(i.up,-Math.PI/2)).applyMatrix4(new o.kn4().identity().makeTranslation(-s/2-r.R,0,s/2*.16918234906699603+.25*r.R)),l}}],function(e,t){for(var n=0;n{n.d(t,{f:()=>c});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/model/physics/knuckle.ts"),o=n("./src/model/physics/pocket.ts"),s=n("./src/view/tablegeometry.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"scaleToRadius",value:function(e){t.PX=s.P.tableX+1.6*e,t.PY=s.P.tableY+1.6*e,t.knuckleInset=1.6*e/.5,t.knuckleRadius=.31*e/.5,t.middleKnuckleInset=1.385*e/.5,t.middleKnuckleRadius=.2*e/.5,t.cornerRadius=1.1*e/.5,t.middleRadius=.9*e/.5,t.pocketLayout(e),t.enumerateCenters(),t.enumerateKnuckles()}},{key:"enumerateKnuckles",value:function(){t.knuckles=[t.pockets.pocketNW.knuckleNE,t.pockets.pocketNW.knuckleSW,t.pockets.pocketN.knuckleNW,t.pockets.pocketN.knuckleNE,t.pockets.pocketS.knuckleSW,t.pockets.pocketS.knuckleSE,t.pockets.pocketNE.knuckleNW,t.pockets.pocketNE.knuckleSE,t.pockets.pocketSE.knuckleNE,t.pockets.pocketSE.knuckleSW,t.pockets.pocketSW.knuckleSE,t.pockets.pocketSW.knuckleNW]}},{key:"enumerateCenters",value:function(){t.pocketCenters=[t.pockets.pocketNW.pocket,t.pockets.pocketSW.pocket,t.pockets.pocketN.pocket,t.pockets.pocketS.pocket,t.pockets.pocketNE.pocket,t.pockets.pocketSE.pocket]}},{key:"pocketLayout",value:function(e){t.pockets={pocketNW:{pocket:new o.Z(new r.Pq0(-t.PX,t.PY,0),t.cornerRadius),knuckleNE:new i.O(new r.Pq0(-s.P.X+t.knuckleInset,s.P.Y+t.knuckleRadius,0),t.knuckleRadius),knuckleSW:new i.O(new r.Pq0(-s.P.X-t.knuckleRadius,s.P.Y-t.knuckleInset,0),t.knuckleRadius)},pocketN:{pocket:new o.Z(new r.Pq0(0,t.PY+.7*e/.5,0),t.middleRadius),knuckleNE:new i.O(new r.Pq0(t.middleKnuckleInset,s.P.Y+t.middleKnuckleRadius,0),t.middleKnuckleRadius),knuckleNW:new i.O(new r.Pq0(-t.middleKnuckleInset,s.P.Y+t.middleKnuckleRadius,0),t.middleKnuckleRadius)},pocketS:{pocket:new o.Z(new r.Pq0(0,-t.PY-.7*e/.5,0),t.middleRadius),knuckleSE:new i.O(new r.Pq0(t.middleKnuckleInset,-s.P.Y-t.middleKnuckleRadius,0),t.middleKnuckleRadius),knuckleSW:new i.O(new r.Pq0(-t.middleKnuckleInset,-s.P.Y-t.middleKnuckleRadius,0),t.middleKnuckleRadius)},pocketNE:{pocket:new o.Z(new r.Pq0(t.PX,t.PY,0),t.cornerRadius),knuckleNW:new i.O(new r.Pq0(s.P.X-t.knuckleInset,s.P.Y+t.knuckleRadius,0),t.knuckleRadius),knuckleSE:new i.O(new r.Pq0(s.P.X+t.knuckleRadius,s.P.Y-t.knuckleInset,0),t.knuckleRadius)},pocketSE:{pocket:new o.Z(new r.Pq0(t.PX,-t.PY,0),t.cornerRadius),knuckleNE:new i.O(new r.Pq0(s.P.X+t.knuckleRadius,-s.P.Y+t.knuckleInset,0),t.knuckleRadius),knuckleSW:new i.O(new r.Pq0(s.P.X-t.knuckleInset,-s.P.Y-t.knuckleRadius,0),t.knuckleRadius)},pocketSW:{pocket:new o.Z(new r.Pq0(-t.PX,-t.PY,0),t.cornerRadius),knuckleSE:new i.O(new r.Pq0(-s.P.X+t.knuckleInset,-s.P.Y-t.knuckleRadius,0),t.knuckleRadius),knuckleNW:new i.O(new r.Pq0(-s.P.X-t.knuckleRadius,-s.P.Y+t.knuckleInset,0),t.knuckleRadius)}}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>o});var r=n("./src/model/physics/constants.ts");function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=function(){var e;function t(e){var n,o;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),i(this,"style",void 0),i(this,"notify",void 0),this.notify=null!=e?e:function(){},this.style=null!==(o=null===(n=document.getElementById("constants"))||void 0===n?void 0:n.style)&&void 0!==o?o:{},this.initialiseSlider("R",r.R,r.jG),this.initialiseSlider("m",r.m,r.Qg),this.initialiseSlider("e",r.e,r.cM),this.initialiseSlider("mu",r.mu,r.xO),this.initialiseSlider("muS",r.gf,r.Ys),this.initialiseSlider("muC",r.gT,r.kM),this.initialiseSlider("rho",r.kL,r.Wv)}return e=[{key:"toggleVisibility",value:function(){this.style.visibility="visible"===this.style.visibility?"hidden":"visible"}},{key:"getInputElement",value:function(e){var t;return null!==(t=document.getElementById(e))&&void 0!==t?t:{}}},{key:"initialiseSlider",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=this.getInputElement(e);o.step="0.001",o.min="0.01",o.max="".concat(i),o.value=t,this.showValue(e,t),o.oninput=function(t){var i=parseFloat(t.target.value);n(i),r.showValue(e,i),r.notify()}}},{key:"showValue",value:function(e,t){var n=document.querySelector("label[for=".concat(e,"]"));n&&(n.innerHTML="".concat(e,"=").concat(t))}}],function(e,t){for(var n=0;n{n.d(t,{P:()=>o});var r=n("./src/model/physics/constants.ts");function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"scaleToRadius",value:function(e){t.tableX=43*e,t.tableY=21*e,t.X=t.tableX+e,t.Y=t.tableY+e}}],function(e,t){for(var n=0;n{e(e.s="./src/diagrams.ts")}]); \ No newline at end of file + }`})),s.uniforms.blitTexture.value=e,s.defines.IS_SRGB=e.colorSpace==a.er$,s.needsUpdate=!0,o||((o=new a.eaF(i,s)).frustumCulled=!1);let c=new a.ubm,u=new a.Z58;u.add(o),null===n&&(n=r=new a.JeP({antialias:!1}));let h=Math.min(e.image.width,t),f=Math.min(e.image.height,t);n.setSize(h,f),n.clear(),n.render(u,c);let p=document.createElement("canvas"),d=p.getContext("2d");p.width=h,p.height=f,d.drawImage(n.domElement,0,0,h,f);let m=new a.GOR(p);return m.minFilter=e.minFilter,m.magFilter=e.magFilter,m.wrapS=e.wrapS,m.wrapT=e.wrapT,m.name=e.name,r&&(r.forceContextLoss(),r.dispose(),r=null),m}let c={POSITION:["byte","byte normalized","unsigned byte","unsigned byte normalized","short","short normalized","unsigned short","unsigned short normalized"],NORMAL:["byte normalized","short normalized"],TANGENT:["byte normalized","short normalized"],TEXCOORD:["byte","byte normalized","unsigned byte","short","short normalized","unsigned short"]};class u{constructor(){this.pluginCallbacks=[],this.register(function(e){return new T(e)}),this.register(function(e){return new x(e)}),this.register(function(e){return new S(e)}),this.register(function(e){return new E(e)}),this.register(function(e){return new O(e)}),this.register(function(e){return new M(e)}),this.register(function(e){return new P(e)}),this.register(function(e){return new R(e)}),this.register(function(e){return new A(e)}),this.register(function(e){return new _(e)}),this.register(function(e){return new I(e)}),this.register(function(e){return new C(e)}),this.register(function(e){return new j(e)}),this.register(function(e){return new B(e)})}register(e){return -1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return -1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let i=new k,s=[];for(let e=0,t=this.pluginCallbacks.length;ee.toBlob(n,t)):("image/jpeg"===t?n=.92:"image/webp"===t&&(n=.8),e.convertToBlob({type:t,quality:n}))}class k{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.extensionsRequired={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter r"+a.sPf}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map}}setPlugins(e){this.plugins=e}async write(e,t,n={}){this.options=Object.assign({binary:!1,trs:!1,onlyVisible:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),this.processInput(e),await Promise.all(this.pending);let r=this.buffers,i=this.json;n=this.options;let s=this.extensionsUsed,o=this.extensionsRequired,a=new Blob(r,{type:"application/octet-stream"}),l=Object.keys(s),c=Object.keys(o);if(l.length>0&&(i.extensionsUsed=l),c.length>0&&(i.extensionsRequired=c),i.buffers&&i.buffers.length>0&&(i.buffers[0].byteLength=a.size),!0===n.binary){let e=new FileReader;e.readAsArrayBuffer(a),e.onloadend=function(){var n;let r=b(e.result),s=new DataView(new ArrayBuffer(8));s.setUint32(0,r.byteLength,!0),s.setUint32(4,5130562,!0);let o=b((n=JSON.stringify(i),new TextEncoder().encode(n).buffer),32),a=new DataView(new ArrayBuffer(8));a.setUint32(0,o.byteLength,!0),a.setUint32(4,1313821514,!0);let l=new ArrayBuffer(12),c=new DataView(l);c.setUint32(0,1179937895,!0),c.setUint32(4,2,!0);let u=12+a.byteLength+o.byteLength+s.byteLength+r.byteLength;c.setUint32(8,u,!0);let h=new Blob([l,a,o,s,r],{type:"application/octet-stream"}),f=new FileReader;f.readAsArrayBuffer(h),f.onloadend=function(){t(f.result)}}}else if(i.buffers&&i.buffers.length>0){let e=new FileReader;e.readAsDataURL(a),e.onloadend=function(){let n=e.result;i.buffers[0].uri=n,t(i)}}else t(i)}serializeUserData(e,t){if(0===Object.keys(e.userData).length)return;let n=this.options,r=this.extensionsUsed;try{let i=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&i.gltfExtensions){for(let e in void 0===t.extensions&&(t.extensions={}),i.gltfExtensions)t.extensions[e]=i.gltfExtensions[e],r[e]=!0;delete i.gltfExtensions}Object.keys(i).length>0&&(t.extras=i)}catch(t){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+t.message)}}getUID(e,t=!1){if(!1===this.uids.has(e)){let t=new Map;t.set(!0,this.uid++),t.set(!1,this.uid++),this.uids.set(e,t)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;let t=new a.Pq0;for(let n=0,r=e.count;n5e-4)return!1;return!0}createNormalizedNormalAttribute(e){let t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);let n=e.clone(),r=new a.Pq0;for(let e=0,t=n.count;e4?r=e.array[i*e.itemSize+n]:(0===n?r=e.getX(i):1===n?r=e.getY(i):2===n?r=e.getZ(i):3===n&&(r=e.getW(i)),!0===e.normalized&&(r=a.cj9.normalize(r,e.array))),t===h.FLOAT?u.setFloat32(f,r,!0):t===h.INT?u.setInt32(f,r,!0):t===h.UNSIGNED_INT?u.setUint32(f,r,!0):t===h.SHORT?u.setInt16(f,r,!0):t===h.UNSIGNED_SHORT?u.setUint16(f,r,!0):t===h.BYTE?u.setInt8(f,r):t===h.UNSIGNED_BYTE&&u.setUint8(f,r),f+=s}f%l!=0&&(f+=l-f%l)}let p={buffer:this.processBuffer(u.buffer),byteOffset:this.byteOffset,byteLength:c};return void 0!==i&&(p.target=i),i===h.ARRAY_BUFFER&&(p.byteStride=l),this.byteOffset+=c,o.bufferViews.push(p),{id:o.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){let t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise(function(r){let i=new FileReader;i.readAsArrayBuffer(e),i.onloadend=function(){let e=b(i.result),s={buffer:t.processBuffer(e),byteOffset:t.byteOffset,byteLength:e.byteLength};t.byteOffset+=e.byteLength,r(n.bufferViews.push(s)-1)}})}processAccessor(e,t,n,r){let i,s;let o=this.json;if(e.array.constructor===Float32Array)i=h.FLOAT;else if(e.array.constructor===Int32Array)i=h.INT;else if(e.array.constructor===Uint32Array)i=h.UNSIGNED_INT;else if(e.array.constructor===Int16Array)i=h.SHORT;else if(e.array.constructor===Uint16Array)i=h.UNSIGNED_SHORT;else if(e.array.constructor===Int8Array)i=h.BYTE;else if(e.array.constructor===Uint8Array)i=h.UNSIGNED_BYTE;else throw Error("THREE.GLTFExporter: Unsupported bufferAttribute component type: "+e.array.constructor.name);if(void 0===n&&(n=0),(void 0===r||r===1/0)&&(r=e.count),0===r)return null;let l=function(e,t,n){let r={min:Array(e.itemSize).fill(Number.POSITIVE_INFINITY),max:Array(e.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let i=t;i4?n=e.array[i*e.itemSize+t]:(0===t?n=e.getX(i):1===t?n=e.getY(i):2===t?n=e.getZ(i):3===t&&(n=e.getW(i)),!0===e.normalized&&(n=a.cj9.normalize(n,e.array))),r.min[t]=Math.min(r.min[t],n),r.max[t]=Math.max(r.max[t],n)}return r}(e,n,r);void 0!==t&&(s=e===t.index?h.ELEMENT_ARRAY_BUFFER:h.ARRAY_BUFFER);let c=this.processBufferView(e,i,n,r,s),u={bufferView:c.id,byteOffset:c.byteOffset,componentType:i,count:r,max:l.max,min:l.min,type:{1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",9:"MAT3",16:"MAT4"}[e.itemSize]};return!0===e.normalized&&(u.normalized=!0),o.accessors||(o.accessors=[]),o.accessors.push(u)-1}processImage(e,t,n,r="image/png"){if(null!==e){let i=this,s=i.cache,o=i.json,l=i.options,c=i.pending;s.images.has(e)||s.images.set(e,{});let u=s.images.get(e),h=r+":flipY/"+n.toString();if(void 0!==u[h])return u[h];o.images||(o.images=[]);let f={mimeType:r},p=g();p.width=Math.min(e.width,l.maxTextureSize),p.height=Math.min(e.height,l.maxTextureSize);let d=p.getContext("2d");if(!0===n&&(d.translate(0,p.height),d.scale(1,-1)),void 0!==e.data){t!==a.GWd&&console.error("GLTFExporter: Only RGBAFormat is supported.",t),(e.width>l.maxTextureSize||e.height>l.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);let n=new Uint8ClampedArray(e.height*e.width*4);for(let t=0;ti.processBufferViewImage(e)).then(e=>{f.bufferView=e})):void 0!==p.toDataURL?f.uri=p.toDataURL(r):c.push(w(p,r).then(e=>new FileReader().readAsDataURL(e)).then(e=>{f.uri=e}));let m=o.images.push(f)-1;return u[h]=m,m}throw Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.")}processSampler(e){let t=this.json;t.samplers||(t.samplers=[]);let n={magFilter:p[e.magFilter],minFilter:p[e.minFilter],wrapS:p[e.wrapS],wrapT:p[e.wrapT]};return t.samplers.push(n)-1}processTexture(e){let t=this.options,n=this.cache,r=this.json;if(n.textures.has(e))return n.textures.get(e);r.textures||(r.textures=[]),e instanceof a.FvD&&(e=l(e,t.maxTextureSize));let i=e.userData.mimeType;"image/webp"===i&&(i="image/png");let s={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,i)};e.name&&(s.name=e.name),this._invokeAll(function(t){t.writeTexture&&t.writeTexture(e,s)});let o=r.textures.push(s)-1;return n.textures.set(e,o),o}processMaterial(e){let t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);let r={pbrMetallicRoughness:{}};!0!==e.isMeshStandardMaterial&&!0!==e.isMeshBasicMaterial&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");let i=e.color.toArray().concat([e.opacity]);if(v(i,[1,1,1,1])||(r.pbrMetallicRoughness.baseColorFactor=i),e.isMeshStandardMaterial?(r.pbrMetallicRoughness.metallicFactor=e.metalness,r.pbrMetallicRoughness.roughnessFactor=e.roughness):(r.pbrMetallicRoughness.metallicFactor=.5,r.pbrMetallicRoughness.roughnessFactor=.5),e.metalnessMap||e.roughnessMap){let t=this.buildMetalRoughTexture(e.metalnessMap,e.roughnessMap),n={index:this.processTexture(t),channel:t.channel};this.applyTextureTransform(n,t),r.pbrMetallicRoughness.metallicRoughnessTexture=n}if(e.map){let t={index:this.processTexture(e.map),texCoord:e.map.channel};this.applyTextureTransform(t,e.map),r.pbrMetallicRoughness.baseColorTexture=t}if(e.emissive){let t=e.emissive;if(Math.max(t.r,t.g,t.b)>0&&(r.emissiveFactor=e.emissive.toArray()),e.emissiveMap){let t={index:this.processTexture(e.emissiveMap),texCoord:e.emissiveMap.channel};this.applyTextureTransform(t,e.emissiveMap),r.emissiveTexture=t}}if(e.normalMap){let t={index:this.processTexture(e.normalMap),texCoord:e.normalMap.channel};e.normalScale&&1!==e.normalScale.x&&(t.scale=e.normalScale.x),this.applyTextureTransform(t,e.normalMap),r.normalTexture=t}if(e.aoMap){let t={index:this.processTexture(e.aoMap),texCoord:e.aoMap.channel};1!==e.aoMapIntensity&&(t.strength=e.aoMapIntensity),this.applyTextureTransform(t,e.aoMap),r.occlusionTexture=t}e.transparent?r.alphaMode="BLEND":e.alphaTest>0&&(r.alphaMode="MASK",r.alphaCutoff=e.alphaTest),e.side===a.$EB&&(r.doubleSided=!0),""!==e.name&&(r.name=e.name),this.serializeUserData(e,r),this._invokeAll(function(t){t.writeMaterial&&t.writeMaterial(e,r)});let s=n.materials.push(r)-1;return t.materials.set(e,s),s}processMesh(e){let t;let n=this.cache,r=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let t=0,n=e.material.length;t0){let t=[],r=[],i={};if(void 0!==e.morphTargetDictionary)for(let t in e.morphTargetDictionary)i[e.morphTargetDictionary[t]]=t;for(let s=0;s0&&(l.extras={},l.extras.targetNames=r)}let v=Array.isArray(e.material);if(v&&0===o.groups.length)return null;let y=!1;if(v&&null===o.index){let e=[];for(let t=0,n=o.attributes.position.count;t0&&(r.targets=f),null!==o.index){let t=this.getUID(o.index);(void 0!==g[e].start||void 0!==g[e].count)&&(t+=":"+g[e].start+":"+g[e].count),n.attributes.has(t)?r.indices=n.attributes.get(t):(r.indices=this.processAccessor(o.index,o,g[e].start,g[e].count),n.attributes.set(t,r.indices)),null===r.indices&&delete r.indices}let i=this.processMaterial(b[g[e].materialIndex]);null!==i&&(r.material=i),u.push(r)}!0===y&&o.setIndex(null),l.primitives=u,r.meshes||(r.meshes=[]),this._invokeAll(function(t){t.writeMesh&&t.writeMesh(e,l)});let w=r.meshes.push(l)-1;return n.meshes.set(s,w),w}detectMeshQuantization(e,t){let n;if(this.extensionsUsed[f])return;switch(t.array.constructor){case Int8Array:n="byte";break;case Uint8Array:n="unsigned byte";break;case Int16Array:n="short";break;case Uint16Array:n="unsigned short";break;default:return}t.normalized&&(n+=" normalized");let r=e.split("_",1)[0];c[r]&&c[r].includes(n)&&(this.extensionsUsed[f]=!0,this.extensionsRequired[f]=!0)}processCamera(e){let t=this.json;t.cameras||(t.cameras=[]);let n=e.isOrthographicCamera,r={type:n?"orthographic":"perspective"};return n?r.orthographic={xmag:2*e.right,ymag:2*e.top,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:r.perspective={aspectRatio:e.aspect,yfov:a.cj9.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},""!==e.name&&(r.name=e.type),t.cameras.push(r)-1}processAnimation(e,t){let n=this.json,r=this.nodeMap;n.animations||(n.animations=[]);let i=(e=u.Utils.mergeMorphTargetTracks(e.clone(),t)).tracks,s=[],o=[];for(let e=0;e0){let t=[];for(let r=0,i=e.children.length;r0&&(i.children=t)}this._invokeAll(function(t){t.writeNode&&t.writeNode(e,i)});let s=t.nodes.push(i)-1;return r.set(e,s),s}processScene(e){let t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);let r={};""!==e.name&&(r.name=e.name),t.scenes.push(r);let i=[];for(let t=0,r=e.children.length;t0&&(r.nodes=i),this.serializeUserData(e,r)}processObjects(e){let t=new a.Z58;t.name="AuxScene";for(let n=0;n0&&this.processObjects(n);for(let e=0;e0&&(s.range=e.distance)):e.isSpotLight&&(s.type="spot",e.distance>0&&(s.range=e.distance),s.spot={},s.spot.innerConeAngle=(1-e.penumbra)*e.angle,s.spot.outerConeAngle=e.angle),void 0!==e.decay&&2!==e.decay&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),e.target&&(e.target.parent!==e||0!==e.target.position.x||0!==e.target.position.y||-1!==e.target.position.z)&&console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),i[this.name]||(r.extensions=r.extensions||{},r.extensions[this.name]={lights:[]},i[this.name]=!0);let o=r.extensions[this.name].lights;o.push(s),t.extensions=t.extensions||{},t.extensions[this.name]={light:o.length-1}}}class x{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}writeMaterial(e,t){if(!e.isMeshBasicMaterial)return;let n=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},n[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class P{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.clearcoat)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.clearcoatFactor=e.clearcoat,e.clearcoatMap){let t={index:n.processTexture(e.clearcoatMap),texCoord:e.clearcoatMap.channel};n.applyTextureTransform(t,e.clearcoatMap),i.clearcoatTexture=t}if(i.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){let t={index:n.processTexture(e.clearcoatRoughnessMap),texCoord:e.clearcoatRoughnessMap.channel};n.applyTextureTransform(t,e.clearcoatRoughnessMap),i.clearcoatRoughnessTexture=t}if(e.clearcoatNormalMap){let t={index:n.processTexture(e.clearcoatNormalMap),texCoord:e.clearcoatNormalMap.channel};1!==e.clearcoatNormalScale.x&&(t.scale=e.clearcoatNormalScale.x),n.applyTextureTransform(t,e.clearcoatNormalMap),i.clearcoatNormalTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class R{constructor(e){this.writer=e,this.name="KHR_materials_dispersion"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.dispersion)return;let n=this.writer.extensionsUsed,r={};r.dispersion=e.dispersion,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class A{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.iridescence)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.iridescenceFactor=e.iridescence,e.iridescenceMap){let t={index:n.processTexture(e.iridescenceMap),texCoord:e.iridescenceMap.channel};n.applyTextureTransform(t,e.iridescenceMap),i.iridescenceTexture=t}if(i.iridescenceIor=e.iridescenceIOR,i.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],i.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){let t={index:n.processTexture(e.iridescenceThicknessMap),texCoord:e.iridescenceThicknessMap.channel};n.applyTextureTransform(t,e.iridescenceThicknessMap),i.iridescenceThicknessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class S{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.transmissionFactor=e.transmission,e.transmissionMap){let t={index:n.processTexture(e.transmissionMap),texCoord:e.transmissionMap.channel};n.applyTextureTransform(t,e.transmissionMap),i.transmissionTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class E{constructor(e){this.writer=e,this.name="KHR_materials_volume"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;let n=this.writer,r=n.extensionsUsed,i={};if(i.thicknessFactor=e.thickness,e.thicknessMap){let t={index:n.processTexture(e.thicknessMap),texCoord:e.thicknessMap.channel};n.applyTextureTransform(t,e.thicknessMap),i.thicknessTexture=t}i.attenuationDistance=e.attenuationDistance,i.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class O{constructor(e){this.writer=e,this.name="KHR_materials_ior"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||1.5===e.ior)return;let n=this.writer.extensionsUsed,r={};r.ior=e.ior,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class M{constructor(e){this.writer=e,this.name="KHR_materials_specular"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||1===e.specularIntensity&&e.specularColor.equals(m)&&!e.specularIntensityMap&&!e.specularColorMap)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.specularIntensityMap){let t={index:n.processTexture(e.specularIntensityMap),texCoord:e.specularIntensityMap.channel};n.applyTextureTransform(t,e.specularIntensityMap),i.specularTexture=t}if(e.specularColorMap){let t={index:n.processTexture(e.specularColorMap),texCoord:e.specularColorMap.channel};n.applyTextureTransform(t,e.specularColorMap),i.specularColorTexture=t}i.specularFactor=e.specularIntensity,i.specularColorFactor=e.specularColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class _{constructor(e){this.writer=e,this.name="KHR_materials_sheen"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0==e.sheen)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.sheenRoughnessMap){let t={index:n.processTexture(e.sheenRoughnessMap),texCoord:e.sheenRoughnessMap.channel};n.applyTextureTransform(t,e.sheenRoughnessMap),i.sheenRoughnessTexture=t}if(e.sheenColorMap){let t={index:n.processTexture(e.sheenColorMap),texCoord:e.sheenColorMap.channel};n.applyTextureTransform(t,e.sheenColorMap),i.sheenColorTexture=t}i.sheenRoughnessFactor=e.sheenRoughness,i.sheenColorFactor=e.sheenColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class I{constructor(e){this.writer=e,this.name="KHR_materials_anisotropy"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0==e.anisotropy)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.anisotropyMap){let t={index:n.processTexture(e.anisotropyMap)};n.applyTextureTransform(t,e.anisotropyMap),i.anisotropyTexture=t}i.anisotropyStrength=e.anisotropy,i.anisotropyRotation=e.anisotropyRotation,t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class C{constructor(e){this.writer=e,this.name="KHR_materials_emissive_strength"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||1===e.emissiveIntensity)return;let n=this.writer.extensionsUsed,r={};r.emissiveStrength=e.emissiveIntensity,t.extensions=t.extensions||{},t.extensions[this.name]=r,n[this.name]=!0}}class j{constructor(e){this.writer=e,this.name="EXT_materials_bump"}writeMaterial(e,t){if(!e.isMeshStandardMaterial||1===e.bumpScale&&!e.bumpMap)return;let n=this.writer,r=n.extensionsUsed,i={};if(e.bumpMap){let t={index:n.processTexture(e.bumpMap),texCoord:e.bumpMap.channel};n.applyTextureTransform(t,e.bumpMap),i.bumpTexture=t}i.bumpFactor=e.bumpScale,t.extensions=t.extensions||{},t.extensions[this.name]=i,r[this.name]=!0}}class B{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(!e.isInstancedMesh)return;let n=this.writer,r=new Float32Array(3*e.count),i=new Float32Array(4*e.count),s=new Float32Array(3*e.count),o=new a.kn4,l=new a.Pq0,c=new a.PTz,u=new a.Pq0;for(let t=0;tMath.abs(e.times[0]-t))return 0;i[0]=t,i.set(e.times,1),s.set(o.evaluate(t),0),s.set(e.values,r),n=0}else if(t>e.times[e.times.length-1]){if(.001>Math.abs(e.times[e.times.length-1]-t))return e.times.length-1;i[i.length-1]=t,i.set(e.times,0),s.set(e.values,0),s.set(o.evaluate(t),e.values.length),n=i.length-1}else for(let a=0;aMath.abs(e.times[a]-t))return a;if(e.times[a]t){i.set(e.times.slice(0,a+1),0),i[a+1]=t,i.set(e.times.slice(a+1),a+2),s.set(e.values.slice(0,(a+1)*r),0),s.set(o.evaluate(t),(a+1)*r),s.set(e.values.slice((a+1)*r),(a+2)*r),n=a+1;break}}return e.times=i,e.values=s,n},mergeMorphTargetTracks:function(e,t){let n=[],r={},i=e.tracks;for(let e=0;e=2.0 are supported."));return}let l=new eS(i,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});l.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e=0&&void 0===o[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}l.setExtensions(s),l.setPlugins(o),l.parse(n,r)}parseAsync(e,t){let n=this;return new Promise(function(r,i){n.parse(e,t,r,i)})}}function H(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}let F={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class U{constructor(e){this.parser=e,this.name=F.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){let e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n=0))return null;throw Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures")}return t.loadTextureImage(e,i.source,s)}}class ee{constructor(e){this.parser=e,this.name=F.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let s=i.extensions[t],o=r.images[s.source],a=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);null!==e&&(a=e)}return this.detectSupport().then(function(i){if(i)return n.loadTextureImage(e,s.source,a);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){let t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}})),this.isSupported}}class et{constructor(e){this.parser=e,this.name=F.EXT_TEXTURE_AVIF,this.isSupported=null}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let s=i.extensions[t],o=r.images[s.source],a=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);null!==e&&(a=e)}return this.detectSupport().then(function(i){if(i)return n.loadTextureImage(e,s.source,a);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return n.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){let t=new Image;t.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",t.onload=t.onerror=function(){e(1===t.height)}})),this.isSupported}}class en{constructor(e){this.name=F.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){let t=this.parser.json,n=t.bufferViews[e];if(!n.extensions||!n.extensions[this.name])return null;{let e=n.extensions[this.name],r=this.parser.getDependency("buffer",e.buffer),i=this.parser.options.meshoptDecoder;if(!i||!i.supported){if(!(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0))return null;throw Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files")}return r.then(function(t){let n=e.byteOffset||0,r=e.byteLength||0,s=e.count,o=e.byteStride,a=new Uint8Array(t,n,r);return i.decodeGltfBufferAsync?i.decodeGltfBufferAsync(s,o,a,e.mode,e.filter).then(function(e){return e.buffer}):i.ready.then(function(){let t=new ArrayBuffer(s*o);return i.decodeGltfBuffer(new Uint8Array(t),s,o,a,e.mode,e.filter),t})})}}}class er{constructor(e){this.name=F.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){let t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||void 0===n.mesh)return null;for(let e of t.meshes[n.mesh].primitives)if(e.mode!==ep.TRIANGLES&&e.mode!==ep.TRIANGLE_STRIP&&e.mode!==ep.TRIANGLE_FAN&&void 0!==e.mode)return null;let r=n.extensions[this.name].attributes,i=[],s={};for(let e in r)i.push(this.parser.getDependency("accessor",r[e]).then(t=>(s[e]=t,s[e])));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then(e=>{let t=e.pop(),n=t.isGroup?t.children:[t],r=e[0].count,i=[];for(let e of n){let t=new a.kn4,n=new a.Pq0,o=new a.PTz,l=new a.Pq0(1,1,1),c=new a.ZLX(e.geometry,e.material,r);for(let e=0;e-1)?navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1]:-1),"undefined"==typeof createImageBitmap||n||r&&i<98?this.textureLoader=new a.Tap(this.options.manager):this.textureLoader=new a.Kzg(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new a.Y9S(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),"use-credentials"===this.options.crossOrigin&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){let n=this,r=this.json,i=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(e){return e._markDefs&&e._markDefs()}),Promise.all(this._invokeAll(function(e){return e.beforeRoot&&e.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(t){let s={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};return eT(i,s,r),ex(s,r),Promise.all(n._invokeAll(function(e){return e.afterRoot&&e.afterRoot(s)})).then(function(){for(let e of s.scenes)e.updateMatrixWorld();e(s)})}).catch(t)}_markDefs(){let e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n{let n=this.associations.get(e);for(let[r,s]of(null!=n&&this.associations.set(t,n),e.children.entries()))i(s,t.children[r])};return i(n,r),r.name+="_instance_"+e.uses[t]++,r}_invokeOne(e){let t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&s.setY(t,f[e*l+1]),l>=3&&s.setZ(t,f[e*l+2]),l>=4&&s.setW(t,f[e*l+3]),l>=5)throw Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return s})}loadTexture(e){let t=this.json,n=this.options,r=t.textures[e].source,i=t.images[r],s=this.textureLoader;if(i.uri){let e=n.manager.getHandler(i.uri);null!==e&&(s=e)}return this.loadTextureImage(e,r,s)}loadTextureImage(e,t,n){let r=this,i=this.json,s=i.textures[e],o=i.images[t],l=(o.uri||o.bufferView)+":"+s.sampler;if(this.textureCache[l])return this.textureCache[l];let c=this.loadImageSource(t,n).then(function(t){t.flipY=!1,t.name=s.name||o.name||"",""===t.name&&"string"==typeof o.uri&&!1===o.uri.startsWith("data:image/")&&(t.name=o.uri);let n=(i.samplers||{})[s.sampler]||{};return t.magFilter=em[n.magFilter]||a.k6q,t.minFilter=em[n.minFilter]||a.$_I,t.wrapS=ev[n.wrapS]||a.GJx,t.wrapT=ev[n.wrapT]||a.GJx,r.associations.set(t,{textures:e}),t}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){let n=this.json,r=this.options;if(void 0!==this.sourceCache[e])return this.sourceCache[e].then(e=>e.clone());let i=n.images[e],s=self.URL||self.webkitURL,o=i.uri||"",l=!1;if(void 0!==i.bufferView)o=this.getDependency("bufferView",i.bufferView).then(function(e){l=!0;let t=new Blob([e],{type:i.mimeType});return o=s.createObjectURL(t)});else if(void 0===i.uri)throw Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");let c=Promise.resolve(o).then(function(e){return new Promise(function(n,i){let s=n;!0===t.isImageBitmapLoader&&(s=function(e){let t=new a.gPd(e);t.needsUpdate=!0,n(t)}),t.load(a.r6x.resolveURL(e,r.path),s,void 0,i)})}).then(function(e){var t;return!0===l&&s.revokeObjectURL(o),ex(e,i),e.userData.mimeType=i.mimeType||((t=i.uri).search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/)?"image/jpeg":t.search(/\.webp($|\?)/i)>0||0===t.search(/^data\:image\/webp/)?"image/webp":"image/png"),e}).catch(function(e){throw console.error("THREE.GLTFLoader: Couldn't load texture",o),e});return this.sourceCache[e]=c,c}assignTexture(e,t,n,r){let i=this;return this.getDependency("texture",n.index).then(function(s){if(!s)return null;if(void 0!==n.texCoord&&n.texCoord>0&&((s=s.clone()).channel=n.texCoord),i.extensions[F.KHR_TEXTURE_TRANSFORM]){let e=void 0!==n.extensions?n.extensions[F.KHR_TEXTURE_TRANSFORM]:void 0;if(e){let t=i.associations.get(s);s=i.extensions[F.KHR_TEXTURE_TRANSFORM].extendTexture(s,e),i.associations.set(s,t)}}return void 0!==r&&(s.colorSpace=r),e[t]=s,s})}assignFinalMaterial(e){let t=e.geometry,n=e.material,r=void 0===t.attributes.tangent,i=void 0!==t.attributes.color,s=void 0===t.attributes.normal;if(e.isPoints){let e="PointsMaterial:"+n.uuid,t=this.cache.get(e);t||(t=new a.BH$,a.imn.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){let e="LineBasicMaterial:"+n.uuid,t=this.cache.get(e);t||(t=new a.mrM,a.imn.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(r||i||s){let e="ClonedMaterial:"+n.uuid+":";r&&(e+="derivative-tangents:"),i&&(e+="vertex-colors:"),s&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=n.clone(),i&&(t.vertexColors=!0),s&&(t.flatShading=!0),r&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return a._4j}loadMaterial(e){let t;let n=this,r=this.json,i=this.extensions,s=r.materials[e],o={},l=s.extensions||{},c=[];if(l[F.KHR_MATERIALS_UNLIT]){let e=i[F.KHR_MATERIALS_UNLIT];t=e.getMaterialType(),c.push(e.extendParams(o,s,n))}else{let r=s.pbrMetallicRoughness||{};if(o.color=new a.Q1f(1,1,1),o.opacity=1,Array.isArray(r.baseColorFactor)){let e=r.baseColorFactor;o.color.setRGB(e[0],e[1],e[2],a.Zr2),o.opacity=e[3]}void 0!==r.baseColorTexture&&c.push(n.assignTexture(o,"map",r.baseColorTexture,a.er$)),o.metalness=void 0!==r.metallicFactor?r.metallicFactor:1,o.roughness=void 0!==r.roughnessFactor?r.roughnessFactor:1,void 0!==r.metallicRoughnessTexture&&(c.push(n.assignTexture(o,"metalnessMap",r.metallicRoughnessTexture)),c.push(n.assignTexture(o,"roughnessMap",r.metallicRoughnessTexture))),t=this._invokeOne(function(t){return t.getMaterialType&&t.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,o)})))}!0===s.doubleSided&&(o.side=a.$EB);let u=s.alphaMode||ek.OPAQUE;if(u===ek.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,u===ek.MASK&&(o.alphaTest=void 0!==s.alphaCutoff?s.alphaCutoff:.5)),void 0!==s.normalTexture&&t!==a.V9B&&(c.push(n.assignTexture(o,"normalMap",s.normalTexture)),o.normalScale=new a.I9Y(1,1),void 0!==s.normalTexture.scale)){let e=s.normalTexture.scale;o.normalScale.set(e,e)}if(void 0!==s.occlusionTexture&&t!==a.V9B&&(c.push(n.assignTexture(o,"aoMap",s.occlusionTexture)),void 0!==s.occlusionTexture.strength&&(o.aoMapIntensity=s.occlusionTexture.strength)),void 0!==s.emissiveFactor&&t!==a.V9B){let e=s.emissiveFactor;o.emissive=new a.Q1f().setRGB(e[0],e[1],e[2],a.Zr2)}return void 0!==s.emissiveTexture&&t!==a.V9B&&c.push(n.assignTexture(o,"emissiveMap",s.emissiveTexture,a.er$)),Promise.all(c).then(function(){let r=new t(o);return s.name&&(r.name=s.name),ex(r,s),n.associations.set(r,{materials:e}),s.extensions&&eT(i,r,s),r})}createUniqueName(e){let t=a.Nwf.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){let t=this,n=this.extensions,r=this.primitiveCache,i=[];for(let s=0,o=e.length;s0&&function(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let n=0,r=t.weights.length;n1?new a.YJl:1===t.length?t[0]:new a.B69)!==t[0])for(let e=0,n=t.length;e{let t=new Map;for(let[e,n]of r.associations)(e instanceof a.imn||e instanceof a.gPd)&&t.set(e,n);return e.traverse(e=>{let n=r.associations.get(e);null!=n&&t.set(e,n)}),t})(i),i})}_createAnimationTracks(e,t,n,r,i){let s;let o=[],l=e.name?e.name:e.uuid,c=[];switch(eg[i.path]===eg.weights?e.traverse(function(e){e.morphTargetInfluences&&c.push(e.name?e.name:e.uuid)}):c.push(l),eg[i.path]){case eg.weights:s=a.Hit;break;case eg.rotation:s=a.MBL;break;case eg.position:case eg.scale:s=a.RiT;break;default:s=1===n.itemSize?a.Hit:a.RiT}let u=void 0!==r.interpolation?ew[r.interpolation]:a.PJ3,h=this._getArrayFromAccessor(n);for(let e=0,n=c.length;e{n.d(t,{m:()=>c});var r=n("./src/model/ball.ts"),i=n("./src/view/tablegeometry.ts"),s=n("./node_modules/three/build/three.module.js"),o=n("./src/utils/utils.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"jitter",value:function(e){return(0,o.ld)(e.clone().add(new s.Pq0(t.noise*(Math.random()-.5),t.noise*(Math.random()-.5),0)))}},{key:"cueBall",value:function(e){return new r.c(t.jitter(e),16444375)}},{key:"diamond",value:function(){var e=new s.Pq0(i.P.tableX/2,0,0),n=[];return n.push(t.cueBall(t.spot)),n.push(new r.c(t.jitter(e),14736950)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),16751872)),e.sub(t.across),n.push(new r.c(t.jitter(e),5380369)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),5853696)),e.sub(t.across),n.push(new r.c(t.jitter(e),16711680)),e.addScaledVector(t.across,2),n.push(new r.c(t.jitter(e),328965)),e.add(t.diagonal).sub(t.across),n.push(new r.c(t.jitter(e),685250)),e.sub(t.across),n.push(new r.c(t.jitter(e),553728)),e.add(t.diagonal),n.push(new r.c(t.jitter(e),4063388)),n}},{key:"triangle",value:function(){var e=t.trianglePositions(),n=t.cueBall(t.spot),i=e.map(function(e){return new r.c(t.jitter(e))});return i.unshift(n),i.slice(0,5)}},{key:"trianglePositions",value:function(){var e=[],t=new s.Pq0(i.P.X/2,0,0);return e.push((0,o.t6)(t)),t.add(this.diagonal),e.push((0,o.t6)(t)),t.sub(this.across),e.push((0,o.t6)(t)),t.add(this.diagonal),e.push((0,o.t6)(t)),t.sub(this.across),e.push((0,o.t6)(t)),t.addScaledVector(this.across,2),e.push((0,o.t6)(t)),t.add(this.diagonal),e.push((0,o.t6)(t)),t.sub(this.across),e.push((0,o.t6)(t)),t.sub(this.across),e.push((0,o.t6)(t)),t.sub(this.across),e.push((0,o.t6)(t)),t.add(this.diagonal).sub(this.across),e.push((0,o.t6)(t)),t.add(this.across),e.push((0,o.t6)(t)),t.add(this.across),e.push((0,o.t6)(t)),t.add(this.across),e.push((0,o.t6)(t)),t.add(this.across),e.push((0,o.t6)(t)),e}},{key:"rerack",value:function(e,n){var i=t.trianglePositions(),s=i.shift();n.balls.filter(function(e){return e!==n.cueball}).filter(function(t){return t!==e}).forEach(function(e){e.pos.copy(t.jitter(i.shift())),e.state=r.U.Stationary}),n.overlapsAny(e.pos,e)&&e.pos.copy(s),n.overlapsAny(n.cueball.pos)&&n.cueball.pos.copy(t.spot)}},{key:"three",value:function(){var e=[],n=i.P.X/2,o=i.P.Y/4;return e.push(t.cueBall(t.jitter(new s.Pq0(-n,-o,0)))),e.push(new r.c(t.jitter(new s.Pq0(-n,0,0)),14736950)),e.push(new r.c(t.jitter(new s.Pq0(n,0,0)),16711680)),e}},{key:"snooker",value:function(){var e=[],n=i.P.Y/4;e.push(t.cueBall(t.jitter(new s.Pq0(t.baulk,-(.5*n),0))));var o=t.snookerColourPositions();return e.push(new r.c(t.jitter(o[0]),15654454)),e.push(new r.c(t.jitter(o[1]),824932)),e.push(new r.c(t.jitter(o[2]),12415546)),e.push(new r.c(t.jitter(o[3]),558062)),e.push(new r.c(t.jitter(o[4]),16755404)),e.push(new r.c(t.jitter(o[5]),65793)),t.trianglePositions().slice(0,15).forEach(function(n){e.push(new r.c(t.jitter(n.add(t.down)),15597568))}),e}},{key:"snookerColourPositions",value:function(){var e=i.P.X/2,n=i.P.X-2*i.P.X/11,r=[];return r.push(new s.Pq0(t.baulk,-t.sixth,0)),r.push(new s.Pq0(t.baulk,t.sixth,0)),r.push(new s.Pq0(t.baulk,0,0)),r.push(new s.Pq0(0,0,0)),r.push(new s.Pq0(e,0,0)),r.push(new s.Pq0(n,0,0)),r}}],function(e,t){for(var n=0;n{n.d(t,{k:()=>a});var r=n("./src/model/ball.ts"),i=n("./src/view/tablegeometry.ts"),s=n("./src/model/physics/constants.ts"),o=n("./src/utils/rack.ts"),a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"respot",value:function(e,n){var i=o.m.snookerColourPositions();return i.push(i[e.id-1]),i.reverse(),i.some(function(t){return!n.overlapsAny(t,e)&&(e.pos.copy(t),e.state=r.U.Stationary,!0)})||t.respotBehind(i[0],e,n),e}},{key:"respotBehind",value:function(e,t,n){for(var o=e.clone();o.x-i.P.tableX&&n.overlapsAny(o,t);)o.x-=s.R/8;t.pos.copy(o),t.state=r.U.Stationary}},{key:"closest",value:function(e,t){var n=t.filter(function(e){return e.onTable()}).filter(function(t){return t!==e});if(0!==n.length){var r=function(t){return e.pos.distanceTo(t.pos)};return n.reduce(function(e,t){return r(e){n.d(t,{Dz:()=>p,KM:()=>l,ld:()=>m,rq:()=>f,t6:()=>o,up:()=>s,v_:()=>i,xb:()=>u});var r=n("./node_modules/three/build/three.module.js"),i=new r.Pq0(0,0,0),s=new r.Pq0(0,0,1);function o(e){return new r.Pq0(e.x,e.y,e.z)}var a=new r.Pq0;function l(e){return a.copy(s).cross(e)}var c=new r.Pq0;function u(e){return c.copy(e).normalize()}var h=new r.Pq0;function f(e,t){return 0>=h.copy(e).add(t).dot(e)}function p(e){return new r.Pq0(1,0,0).applyAxisAngle(s,e)}function d(e){return Math.sign(e)*Math.floor((Math.abs(e)+Number.EPSILON)*1e4)/1e4}function m(e){return e.x=d(e.x),e.y=d(e.y),e.z=d(e.z),e}},"./src/view/assets.ts":(e,t,n)=>{n.d(t,{s:()=>v});var r=n("./src/controller/rules/rulefactory.ts"),i=n("./src/utils/gltf.ts"),s=n("./node_modules/three/build/three.module.js");function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),o(this,"listener",void 0),o(this,"audioLoader",void 0),o(this,"ballcollision",void 0),o(this,"cue",void 0),o(this,"cushion",void 0),o(this,"pot",void 0),o(this,"success",void 0),o(this,"lastOutcomeTime",0),o(this,"loadAssets",void 0),this.loadAssets=e,e&&(this.listener=new s.Pf$,this.audioLoader=new s.Am1,this.ballcollision=new s.fP5(this.listener),this.load("sounds/ballcollision.ogg",this.ballcollision),this.cue=new s.fP5(this.listener),this.load("sounds/cue.ogg",this.cue),this.cushion=new s.fP5(this.listener),this.load("sounds/cushion.ogg",this.cushion),this.pot=new s.fP5(this.listener),this.load("sounds/pot.ogg",this.pot),this.success=new s.fP5(this.listener),this.load("sounds/success.ogg",this.success))}return e=[{key:"addCameraToListener",value:function(e){e.add(this.listener)}},{key:"load",value:function(e,t){this.audioLoader.load(e,function(e){t.setBuffer(e),t.setLoop(!1)},function(e){},function(e){})}},{key:"play",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(this.loadAssets){var r,i,o=s.UtX.getContext();if((null==o?void 0:o.state)==="suspended"){(null===(i=navigator)||void 0===i?void 0:null===(r=i.userActivation)||void 0===r?void 0:r.hasBeenActive)&&o.resume();return}e.setVolume(t),e.isPlaying&&e.stop(),e.play(s.cj9.randFloat(0,.01)),e.setDetune(n)}}},{key:"outcomeToSound",value:function(e){"Collision"===e.type&&this.play(this.ballcollision,e.incidentSpeed/80,5*e.incidentSpeed),"Pot"===e.type&&this.play(this.pot,e.incidentSpeed/10,-1e3+10*e.incidentSpeed),"Cushion"===e.type&&this.play(this.cushion,e.incidentSpeed/70),"Hit"===e.type&&this.play(this.cue,e.incidentSpeed/30)}},{key:"processOutcomes",value:function(e){var t=this;e.every(function(e){return!(e.timestamp>t.lastOutcomeTime)||(t.lastOutcomeTime=e.timestamp,t.outcomeToSound(e),!1)})}},{key:"playNotify",value:function(){this.play(this.pot,1)}},{key:"playSuccess",value:function(e){this.play(this.success,.1,100*e-2200)}}],function(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:this.cloth;this.cylinder(e.pos,e.radius,.75*u.R/.5,t,n).position.setZ(-(.25*u.R)/.5/2)}},{key:"cylinder",value:function(e,t,n,r,i){var o=new s.Ho_(t,t,n,16),a=new s.eaF(o,i);return a.position.copy(e),a.geometry.applyMatrix4(new s.kn4().identity().makeRotationAxis(new s.Pq0(1,0,0),Math.PI/2)),r.add(a),a}},{key:"addCushions",value:function(e,t){var n=10*u.R/.5;this.plane(new s.Pq0(0,0,-u.R-n/2),2*l.P.X,2*l.P.Y,n,e,this.cloth);var r=1*u.R/.5,i=.75*u.R/.5,o=-(.25*u.R)/.5/2,a=l.P.X,h=l.P.Y,f=Math.abs(c.f.pockets.pocketNW.knuckleNE.pos.x-c.f.pockets.pocketN.knuckleNW.pos.x),p=Math.abs(c.f.pockets.pocketNW.knuckleSW.pos.y-c.f.pockets.pocketSW.knuckleNW.pos.y);t||(f=2*l.P.Y,p=2*l.P.Y+4*u.R),this.plane(new s.Pq0(a+r/2,0,o),r,p,i,e),this.plane(new s.Pq0(-a-r/2,0,o),r,p,i,e),this.plane(new s.Pq0(-a/2,h+r/2,o),f,r,i,e),this.plane(new s.Pq0(-a/2,-h-r/2,o),f,r,i,e),this.plane(new s.Pq0(a/2,h+r/2,o),f,r,i,e),this.plane(new s.Pq0(a/2,-h-r/2,o),f,r,i,e)}},{key:"plane",value:function(e,t,n,r,i){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:this.cushion,a=new s.iNn(t,n,r),l=new s.eaF(a,o);l.receiveShadow=!0,l.position.copy(e),i.add(l)}}],function(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",t=new n(e);return t.creatLocal(),t}}],e&&d(n.prototype,e),t&&d(n,t),n}()},"./src/view/cameratop.ts":(e,t,n)=>{n.d(t,{v:()=>a});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/view/tablegeometry.ts"),s=n("./src/model/physics/constants.ts");function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"viewPoint",value:function(e,n){var o=t.zoomFactor/(2*Math.tan(n*Math.PI/360));if(e>this.portrait){var a=e>t.aspectLimit?2.75*i.P.tableY:2.4*i.P.tableX/e;return new r.Pq0(0,-.01*s.R,o*a)}var l=e>1/t.aspectLimit?4.9*i.P.tableY:1.35*i.P.tableX/e;return new r.Pq0(-.01*s.R,0,o*l)}}],function(e,t){for(var n=0;n{n.d(t,{s:()=>f});var r=n("./src/view/tablegeometry.ts"),i=n("./src/utils/utils.ts"),s=n("./src/events/aimevent.ts"),o=n("./src/model/ball.ts"),a=n("./src/model/physics/physics.ts"),l=n("./src/view/cuemesh.ts"),c=n("./node_modules/three/build/three.module.js"),u=n("./src/model/physics/constants.ts");function h(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var f=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),h(this,"mesh",void 0),h(this,"helperMesh",void 0),h(this,"placerMesh",void 0),h(this,"offCenterLimit",.3),h(this,"maxPower",150*u.R),h(this,"t",0),h(this,"aimInputs",void 0),h(this,"aim",new s.w),h(this,"length",1*r.P.tableX),this.mesh=l.l.createCue(.05*u.R/.5,.15*u.R/.5,this.length),this.helperMesh=l.l.createHelper(),this.placerMesh=l.l.createPlacer()}return e=[{key:"rotateAim",value:function(e,t){this.aim.angle=this.aim.angle+e,this.mesh.rotation.z=this.aim.angle,this.helperMesh.rotation.z=this.aim.angle,this.aimInputs.showOverlap(),this.avoidCueTouchingOtherBall(t)}},{key:"adjustPower",value:function(e){this.aim.power=Math.min(this.maxPower,this.aim.power+e),this.updateAimInput()}},{key:"setPower",value:function(e){this.aim.power=e*this.maxPower}},{key:"hit",value:function(e){var t=this.aim;this.t=0,e.state=o.U.Sliding,e.vel.copy((0,i.Dz)(t.angle).multiplyScalar(t.power)),e.rvel.copy((0,a.t6)(t.offset,e.vel))}},{key:"aimAtNext",value:function(e,t){if(t){var n=(0,i.xb)(t.pos.clone().sub(e.pos));this.aim.angle=Math.atan2(n.y,n.x)}}},{key:"adjustSpin",value:function(e,t){var n=this.aim.offset.clone().clone().add(e);this.setSpin(n,t)}},{key:"setSpin",value:function(e,t){e.length()>this.offCenterLimit&&e.normalize().multiplyScalar(this.offCenterLimit),this.aim.offset.copy(e),this.avoidCueTouchingOtherBall(t),this.updateAimInput()}},{key:"avoidCueTouchingOtherBall",value:function(e){for(var t=0;t++<20&&this.intersectsAnything(e);)this.aim.offset.y+=.1,this.aim.offset.length()>this.offCenterLimit&&this.aim.offset.normalize().multiplyScalar(this.offCenterLimit);t>1&&this.updateAimInput()}},{key:"updateAimInput",value:function(){var e,t,n;null===(e=this.aimInputs)||void 0===e||e.updateVisualState(this.aim.offset.x,this.aim.offset.y),null===(t=this.aimInputs)||void 0===t||t.updatePowerSlider(this.aim.power/this.maxPower),null===(n=this.aimInputs)||void 0===n||n.showOverlap()}},{key:"moveTo",value:function(e){this.aim.pos.copy(e),this.mesh.rotation.z=this.aim.angle,this.helperMesh.rotation.z=this.aim.angle;var t=this.spinOffset(),n=(Math.sin(this.t+Math.PI/2)-1)*2*u.R*(this.aim.power/this.maxPower),r=(0,i.Dz)(this.aim.angle).clone().multiplyScalar(n);this.mesh.position.copy(e.clone().add(t).add(r)),this.helperMesh.position.copy(e),this.placerMesh.position.copy(e),this.placerMesh.rotation.z=this.t}},{key:"update",value:function(e){this.t+=e,this.moveTo(this.aim.pos)}},{key:"placeBallMode",value:function(){this.mesh.visible=!1,this.placerMesh.visible=!0,this.aim.angle=0}},{key:"aimMode",value:function(){this.mesh.visible=!0,this.placerMesh.visible=!1}},{key:"spinOffset",value:function(){return(0,i.KM)((0,i.Dz)(this.aim.angle)).multiplyScalar(2*this.aim.offset.x*u.R).setZ(2*this.aim.offset.y*u.R)}},{key:"intersectsAnything",value:function(e){var t=this.spinOffset(),n=e.cueball.pos.clone().add(t),r=(0,i.xb)((0,i.Dz)(this.aim.angle+Math.PI).setZ(.1)),s=new c.tBo(n,r),o=e.balls.map(function(e){return e.ballmesh.mesh});return e.mesh&&o.push(e.mesh),s.intersectObjects(o,!0).length>0}},{key:"showHelper",value:function(e){this.helperMesh.visible=e}},{key:"toggleHelper",value:function(){this.showHelper(!this.helperMesh.visible)}}],function(e,t){for(var n=0;n{n.d(t,{l:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/utils/utils.ts"),s=n("./node_modules/three/build/three.module.js");function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"indicateValid",value:function(e){t.placermaterial.color.setHex(e?13434828:16711680)}},{key:"createHelper",value:function(){var e=new s.Ho_(r.R,r.R,30*r.R/.5,12,1,!0),t=new s.eaF(e,this.helpermaterial);return t.geometry.applyMatrix4(new s.kn4().identity().makeRotationAxis(i.up,-Math.PI/2)).applyMatrix4(new s.kn4().identity().makeTranslation(15*r.R/.5,0,-(.01*r.R)/.5)),t.visible=!1,t.renderOrder=-1,t.material.depthTest=!1,t}},{key:"createPlacer",value:function(){var e=new s.Ho_(.01*r.R/.5,r.R,r.R,4),n=new s.eaF(e,t.placermaterial);return n.geometry.applyMatrix4(new s.kn4().identity().makeRotationAxis(new s.Pq0(1,0,0),-Math.PI/2)).applyMatrix4(new s.kn4().identity().makeTranslation(0,0,.7*r.R/.5)),n.visible=!1,n}},{key:"createCue",value:function(e,n,o){var a=new s.Ho_(e,n,o,11),l=new s.eaF(a,t.material);return l.castShadow=!1,l.geometry.applyMatrix4(new s.kn4().identity().makeRotationAxis(new s.Pq0(1,0,0),-.17)).applyMatrix4(new s.kn4().identity().makeRotationAxis(i.up,-Math.PI/2)).applyMatrix4(new s.kn4().identity().makeTranslation(-o/2-r.R,0,o/2*.16918234906699603+.25*r.R)),l}}],function(e,t){for(var n=0;n{n.d(t,{f:()=>c});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/model/physics/knuckle.ts"),s=n("./src/model/physics/pocket.ts"),o=n("./src/view/tablegeometry.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"scaleToRadius",value:function(e){t.PX=o.P.tableX+1.6*e,t.PY=o.P.tableY+1.6*e,t.knuckleInset=1.6*e/.5,t.knuckleRadius=.31*e/.5,t.middleKnuckleInset=1.385*e/.5,t.middleKnuckleRadius=.2*e/.5,t.cornerRadius=1.1*e/.5,t.middleRadius=.9*e/.5,t.pocketLayout(e),t.enumerateCenters(),t.enumerateKnuckles()}},{key:"enumerateKnuckles",value:function(){t.knuckles=[t.pockets.pocketNW.knuckleNE,t.pockets.pocketNW.knuckleSW,t.pockets.pocketN.knuckleNW,t.pockets.pocketN.knuckleNE,t.pockets.pocketS.knuckleSW,t.pockets.pocketS.knuckleSE,t.pockets.pocketNE.knuckleNW,t.pockets.pocketNE.knuckleSE,t.pockets.pocketSE.knuckleNE,t.pockets.pocketSE.knuckleSW,t.pockets.pocketSW.knuckleSE,t.pockets.pocketSW.knuckleNW]}},{key:"enumerateCenters",value:function(){t.pocketCenters=[t.pockets.pocketNW.pocket,t.pockets.pocketSW.pocket,t.pockets.pocketN.pocket,t.pockets.pocketS.pocket,t.pockets.pocketNE.pocket,t.pockets.pocketSE.pocket]}},{key:"pocketLayout",value:function(e){t.pockets={pocketNW:{pocket:new s.Z(new r.Pq0(-t.PX,t.PY,0),t.cornerRadius),knuckleNE:new i.O(new r.Pq0(-o.P.X+t.knuckleInset,o.P.Y+t.knuckleRadius,0),t.knuckleRadius),knuckleSW:new i.O(new r.Pq0(-o.P.X-t.knuckleRadius,o.P.Y-t.knuckleInset,0),t.knuckleRadius)},pocketN:{pocket:new s.Z(new r.Pq0(0,t.PY+.7*e/.5,0),t.middleRadius),knuckleNE:new i.O(new r.Pq0(t.middleKnuckleInset,o.P.Y+t.middleKnuckleRadius,0),t.middleKnuckleRadius),knuckleNW:new i.O(new r.Pq0(-t.middleKnuckleInset,o.P.Y+t.middleKnuckleRadius,0),t.middleKnuckleRadius)},pocketS:{pocket:new s.Z(new r.Pq0(0,-t.PY-.7*e/.5,0),t.middleRadius),knuckleSE:new i.O(new r.Pq0(t.middleKnuckleInset,-o.P.Y-t.middleKnuckleRadius,0),t.middleKnuckleRadius),knuckleSW:new i.O(new r.Pq0(-t.middleKnuckleInset,-o.P.Y-t.middleKnuckleRadius,0),t.middleKnuckleRadius)},pocketNE:{pocket:new s.Z(new r.Pq0(t.PX,t.PY,0),t.cornerRadius),knuckleNW:new i.O(new r.Pq0(o.P.X-t.knuckleInset,o.P.Y+t.knuckleRadius,0),t.knuckleRadius),knuckleSE:new i.O(new r.Pq0(o.P.X+t.knuckleRadius,o.P.Y-t.knuckleInset,0),t.knuckleRadius)},pocketSE:{pocket:new s.Z(new r.Pq0(t.PX,-t.PY,0),t.cornerRadius),knuckleNE:new i.O(new r.Pq0(o.P.X+t.knuckleRadius,-o.P.Y+t.knuckleInset,0),t.knuckleRadius),knuckleSW:new i.O(new r.Pq0(o.P.X-t.knuckleInset,-o.P.Y-t.knuckleRadius,0),t.knuckleRadius)},pocketSW:{pocket:new s.Z(new r.Pq0(-t.PX,-t.PY,0),t.cornerRadius),knuckleSE:new i.O(new r.Pq0(-o.P.X+t.knuckleInset,-o.P.Y-t.knuckleRadius,0),t.knuckleRadius),knuckleNW:new i.O(new r.Pq0(-o.P.X-t.knuckleRadius,-o.P.Y+t.knuckleInset,0),t.knuckleRadius)}}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>s});var r=n("./src/model/physics/constants.ts");function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var s=function(){var e;function t(e){var n,s;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),i(this,"style",void 0),i(this,"notify",void 0),this.notify=null!=e?e:function(){},this.style=null!==(s=null===(n=document.getElementById("constants"))||void 0===n?void 0:n.style)&&void 0!==s?s:{},this.initialiseSlider("R",r.R,r.jG),this.initialiseSlider("m",r.m,r.Qg),this.initialiseSlider("e",r.e,r.cM),this.initialiseSlider("mu",r.mu,r.xO),this.initialiseSlider("muS",r.gf,r.Ys),this.initialiseSlider("muC",r.gT,r.kM),this.initialiseSlider("rho",r.kL,r.Wv)}return e=[{key:"toggleVisibility",value:function(){this.style.visibility="visible"===this.style.visibility?"hidden":"visible"}},{key:"getInputElement",value:function(e){var t;return null!==(t=document.getElementById(e))&&void 0!==t?t:{}}},{key:"initialiseSlider",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,s=this.getInputElement(e);s.step="0.001",s.min="0.01",s.max="".concat(i),s.value=t,this.showValue(e,t),s.oninput=function(t){var i=parseFloat(t.target.value);n(i),r.showValue(e,i),r.notify()}}},{key:"showValue",value:function(e,t){var n=document.querySelector("label[for=".concat(e,"]"));n&&(n.innerHTML="".concat(e,"=").concat(t))}}],function(e,t){for(var n=0;n{n.d(t,{P:()=>s});var r=n("./src/model/physics/constants.ts");function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var s=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"scaleToRadius",value:function(e){t.tableX=43*e,t.tableY=21*e,t.X=t.tableX+e,t.Y=t.tableY+e}}],function(e,t){for(var n=0;n{e(e.s="./src/diagrams.ts")}]); \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index c6ba8fba..066b2f45 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,4 @@ -"use strict";(self.webpackChunkbilliards=self.webpackChunkbilliards||[]).push([[57],{"./src/container/container.ts":(e,t,n)=>{n.d(t,{m:()=>J});var r=n("./src/events/stationaryevent.ts"),i=n("./node_modules/three/build/three.module.js"),o=n("./src/utils/utils.ts"),s=n("./src/view/cameratop.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"camera",void 0),l(this,"mode",this.topView),l(this,"mainMode",this.aimView),l(this,"height",8*a.R),l(this,"elapsed",void 0),this.camera=new i.ubm(45,e,a.R,1e3*a.R)}return e=[{key:"update",value:function(e,t){this.elapsed=e,this.mode(t)}},{key:"topView",value:function(e){this.camera.fov=s.v.fov,this.camera.position.lerp(s.v.viewPoint(this.camera.aspect,this.camera.fov),.9),this.camera.up=o.up,this.camera.lookAt(o.v_)}},{key:"aimView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.08,n=this.height,r=this.camera.aspect<.8;if(this.camera.fov=r?60:40,n<10*a.R){var i=100*(10*a.R-n);this.camera.fov-=i*(r?3:1)}this.camera.position.lerp(e.pos.clone().addScaledVector((0,o.Dz)(e.angle),-(18*a.R)),t),this.camera.position.z=n,this.camera.up=o.up,this.camera.lookAt(e.pos.clone().addScaledVector(o.up,n/2))}},{key:"adjustHeight",value:function(e){e=this.height<10*a.R?e/8:e,this.height=i.cj9.clamp(this.height+e,6*a.R,120*a.R),this.height>110*a.R&&this.suggestMode(this.topView),this.height<105*a.R&&this.suggestMode(this.aimView)}},{key:"suggestMode",value:function(e){this.mainMode===this.aimView&&(this.mode=e)}},{key:"forceMode",value:function(e){this.mode=e,this.mainMode=e}},{key:"forceMove",value:function(e){this.mode===this.aimView&&this.aimView(e,1)}},{key:"toggleMode",value:function(){this.mode===this.topView?this.mode=this.aimView:this.mode=this.topView,this.mainMode=this.mode}}],function(e,t){for(var n=0;n0&&(null===(t=this.cuePowerElement)||void 0===t?void 0:t.value)&&(this.cuePowerElement.value=e)}}],function(e,t){for(var n=0;nthis.sentTime+this.period||e.type!==N.B.AIM){this.flush(),this.apply(e),this.sentTime=performance.now();return}this.pending=e}}],function(e,t){for(var n=0;n0&&"RERACK"===this.shots[e].type&&e--,e}},{key:"lastShot",value:function(){var e=this.last();return this.state(this.states[e],[this.shots[e]])}},{key:"currentBreak",value:function(){if(void 0!==this.breakStart)return this.state(this.states[this.breakStart],this.shots.slice(this.breakStart),this.breakStartTime,this.container.rules.previousBreak)}},{key:"state",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return{init:e,shots:t,start:n,now:Date.now(),score:r,wholeGame:i}}},{key:"updateBreak",value:function(e){var t=this.container.rules.isPartOfBreak(e),n=this.container.rules.isEndOfGame(e),r=U.P.potCount(e);if(t||this.breakLink(n),this.lastShotLink(t||n,r,U.P.pots(e)),n&&this.breakLink(n),!t){this.breakStart=void 0;return}void 0===this.breakStart&&(this.breakStart=this.last(),this.breakStartTime=Date.now())}},{key:"lastShotLink",value:function(e,t,n){var r="#000000";n.length>0&&n.forEach(function(e){r="#"+e.ballmesh.color.getHexString()});var i="⚈".repeat(t>1?t-1:0)+(e?"⚈":"⚆"),o=JSON.stringify(this.lastShot());this.generateLink(i,o,r)}},{key:"breakLink",value:function(e){var t=this.currentBreak();if(t&&(e||t.shots.pop(),1!==t.shots.length)){var n=0===this.container.rules.currentBreak?this.container.rules.previousBreak:this.container.rules.currentBreak;t.score=n;var r=JSON.stringify(t);console.log("raw:".concat(r));var i=D.A.crush(r);console.log("crushed:".concat(i)),console.log("encoded:".concat(encodeURIComponent(i))),console.log("decoded:".concat(decodeURIComponent(encodeURIComponent(i))));var o=D.A.uncrush(decodeURIComponent(encodeURIComponent(i)));console.log("uncompressed:".concat(o)),console.log(r==o),this.generateLink("break(".concat(n,")"),i,"black"),n>=4&&this.generateHiScoreLink(i)}}},{key:"wholeGameLink",value:function(){var e=this.wholeGame(),t="frame(".concat(this.shotCount(e.shots)," shots)"),n=JSON.stringify(e),r=D.A.crush(n);this.generateLink(t,r,"black")}},{key:"shotCount",value:function(e){return e.filter(function(e){return"RERACK"!==e.type}).length}},{key:"generateLink",value:function(e,t,n){var r="".concat(this.replayUrl).concat(encodeURIComponent(t));console.log("encoded:".concat(r));var i='').concat(e,"");this.container.eventQueue.push(new B.b(null,"".concat(i)))}},{key:"generateHiScoreLink",value:function(e){var t="".concat(this.hiScoreUrl,"?ruletype=").concat(this.container.rules.rulename,"&state=").concat(encodeURIComponent(e)),n='').concat("hi score 🏆","");this.container.eventQueue.push(new B.b(null,"".concat(n)))}}],function(e,t){for(var n=0;n').concat(e,"")));r.push(new B.b(null,s))})},this.redo.onclick=function(e){var r=new V.W(t.init,t.shots);r.retry=!0,n.interuptEventQueue(r)},this.replay.onclick=function(e){n.interuptEventQueue(t)}}}},{key:"interuptEventQueue",value:function(e){this.container.table.halt();var t=this.container.eventQueue;t.length=0,t.push(new r.T),t.push(e)}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0?this.element.innerHTML="Break
"+e:this.element.innerHTML="")}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0;){this.lastEventTime=this.last;var t=this.inputQueue.shift();t&&this.updateController(this.controller.handleInput(t))}if(this.table.allStationary()){var n=this.eventQueue.shift();n&&(this.lastEventTime=performance.now(),this.updateController(n.applyToController(this.controller)))}}},{key:"animate",value:function(e){var t=this;this.advance((e-this.last)/1e3),this.last=e,this.processEvents(),(e{n.d(t,{m:()=>c});var r=n("./src/controller/controller.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/controller/playshot.ts"),s=n("./src/controller/replay.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,i=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c);var t,n=(t=i.call(this,e)).container.table;return n.cue.aimMode(),n.cue.showHelper(!0),n.cueball=t.container.rules.cueball,n.cue.moveTo(n.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.aimView),n.cue.aimInputs.showOverlap(),t}return n=[{key:"handleInput",value:function(e){switch(e.key){case"Space":this.container.table.cue.adjustPower(e.t*this.scale*.7);break;case"SpaceUp":return this.playShot();default:if(!this.commonKeyHandler(e))return this}return this.container.sendEvent(this.container.table.cue.aim),this}},{key:"handleBreak",value:function(e){return new s.e(this.container,e.init,e.shots,e.retry)}},{key:"playShot",value:function(){var e=new r.Qe(this.container.table.serialise());return this.container.sendEvent(e),this.container.recorder.record(e),new o.H(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{Qe:()=>r.Q,pd:()=>i.p,xI:()=>o}),n("./src/events/beginevent.ts"),n("./src/events/aimevent.ts");var r=n("./src/events/hitevent.ts"),i=n("./src/events/input.ts");n("./src/events/abortevent.ts"),n("./src/events/stationaryevent.ts");var o=function(){var e;function t(e){var n,r;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r=void 0,(n="container")in this?Object.defineProperty(this,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[n]=r,this.container=e}return e=[{key:"handleInput",value:function(e){return this}},{key:"handleBegin",value:function(e){return this}},{key:"handleBreak",value:function(e){return this}},{key:"handleStartAim",value:function(e){return this}},{key:"handleAim",value:function(e){return this}},{key:"handleHit",value:function(e){return this}},{key:"handleAbort",value:function(e){return this}},{key:"handleWatch",value:function(e){return this}},{key:"handlePlaceBall",value:function(e){return this}},{key:"handleStationary",value:function(e){return this}},{key:"handleChat",value:function(e){return this}},{key:"handleRejoin",value:function(e){return this}},{key:"onFirst",value:function(){}}],function(e,t){for(var n=0;n{n.d(t,{y:()=>f});var r=n("./src/controller/controller.ts"),i=n("./src/controller/end.ts"),o=n("./src/utils/gltf.ts"),s=n("./src/model/outcome.ts"),a=n("./node_modules/three/build/three.module.js");function l(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}var f=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(f,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=c(f);return e=t?Reflect.construct(n,arguments,c(this).constructor):n.apply(this,arguments),e&&("object"===h(e)||"function"==typeof e)?e:l(this)});function f(){var e,t,n;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,f),e=r.apply(this,arguments),(n="scale")in(t=l(e))?Object.defineProperty(t,n,{value:.001,enumerable:!0,configurable:!0,writable:!0}):t[n]=.001,e}return n=[{key:"handleAbort",value:function(e){return new i.o(this.container)}},{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}},{key:"hit",value:function(){this.container.table.outcome=[s.P.hit(this.container.table.cueball,this.container.table.cue.aim.power)],this.container.table.hit(),this.container.view.camera.suggestMode(this.container.view.camera.aimView),this.container.table.cue.showHelper(!1)}},{key:"commonKeyHandler",value:function(e){var t=this.container.table.cue,n=e.t*this.scale;switch(e.key){case"ArrowLeft":return t.rotateAim(-n,this.container.table),!0;case"ArrowRight":return t.rotateAim(n,this.container.table),!0;case"ArrowDown":return t.adjustSpin(new a.Pq0(0,-n),this.container.table),!0;case"ArrowUp":return t.adjustSpin(new a.Pq0(0,n),this.container.table),!0;case"ShiftArrowLeft":return t.adjustSpin(new a.Pq0(n,0),this.container.table),!0;case"ShiftArrowRight":return t.adjustSpin(new a.Pq0(-n,0),this.container.table),!0;case"KeyPUp":return(0,o.KP)(this.container.view.scene),!0;case"KeyHUp":return t.toggleHelper(),!0;case"movementXUp":return t.rotateAim(2*n,this.container.table),!0;case"movementYUp":case"NumpadSubtract":return this.container.view.camera.adjustHeight(8*n),!0;case"NumpadAdd":return this.container.view.camera.adjustHeight(-(8*n)),!0;case"KeyOUp":return this.container.view.camera.toggleMode(),!0;case"KeyDUp":return this.togglePanel(),!0;case"KeyFUp":return this.toggleFullscreen(),!0;default:return!1}}},{key:"togglePanel",value:function(){this.container.sliders.toggleVisibility(),this.container.table.showSpin(!0),this.container.table.showTraces(!0),("undefined"==typeof process?"undefined":h(process))!=="object"&&console.log(this.container.table.serialise())}},{key:"toggleFullscreen",value:function(){document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{o:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(){return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),o.apply(this,arguments)}return n=[{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}}],function(e,t){for(var n=0;n{n.d(t,{x:()=>p});var r=n("./src/controller/controllerbase.ts"),i=n("./src/controller/controller.ts"),o=n("./src/controller/aim.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/model/physics/constants.ts"),l=n("./node_modules/three/build/three.module.js"),c=n("./src/view/cuemesh.ts");function u(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var p=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}(p,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=h(p);return e=t?Reflect.construct(n,arguments,h(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:u(this)});function p(e){var t,n,i,o;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,p),n=u(t=r.call(this,e)),i="placescale",o=.02*a.R,i in n?Object.defineProperty(n,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[i]=o,t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.table.cue.aim.power=0,t.container.view.camera.forceMode(t.container.view.camera.aimView),t}return n=[{key:"onFirst",value:function(){var e=this.container.table.cueball;this.container.rules.allowsPlaceBall()&&e.pos.copy(this.container.rules.placeBall()),e.setStationary(),e.updateMesh(0),this.container.table.cue.placeBallMode(),this.container.table.cue.showHelper(!1),this.container.table.cue.moveTo(this.container.table.cueball.pos),this.container.table.cue.aimInputs.setButtonText("Place\nBall"),this.container.rules.allowsPlaceBall()||this.container.inputQueue.push(new i.pd(1,"SpaceUp"))}},{key:"handleInput",value:function(e){var t=this.container.table.cueball.pos;switch(e.key){case"ArrowLeft":case"KeyI":this.moveTo(0,e.t*this.placescale);break;case"ArrowRight":case"KeyK":this.moveTo(0,-e.t*this.placescale);break;case"movementXUp":this.moveTo(0,-e.t*this.placescale*2);break;case"movementYUp":this.moveTo(-e.t*this.placescale*2,0);break;case"KeyJ":this.moveTo(-e.t*this.placescale,0);break;case"KeyL":this.moveTo(e.t*this.placescale,0);break;case"SpaceUp":return this.placed();default:this.commonKeyHandler(e)}return this.container.table.cue.moveTo(t),this.container.view.camera.forceMove(this.container.table.cue.aim),this.container.sendEvent(this.container.table.cue.aim),this}},{key:"moveTo",value:function(e,t){var n=new l.Pq0(e,t),r=this.container.table.cueball.pos.add(n);r.copy(this.container.rules.placeBall(r)),c.l.indicateValid(!this.container.table.overlapsAny(r))}},{key:"placed",value:function(){return this.container.table.overlapsAny(this.container.table.cueball.pos)?this:(this.container.table.cue.aimInputs.setButtonText("Hit"),this.container.sound.playNotify(),this.container.sendEvent(new s.W(this.container.table.shortSerialise())),new o.m(this.container))}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{H:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),(t=o.call(this,e)).hit(),t}return n=[{key:"handleStationary",value:function(e){var t=this.container.table,n=t.outcome,r=this.container.rules.update(n);return this.container.recorder.updateBreak(n),t.cue.aimAtNext(t.cueball,this.container.rules.nextCandidateBall()),r}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}}],function(e,t){for(var n=0;n{n.d(t,{e:()=>v});var r=n("./src/events/hitevent.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/events/aimevent.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/controller/aim.ts"),l=n("./src/events/eventtype.ts"),c=n("./src/events/rerackevent.ts");function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1500;if(!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),f(h(r=i.call(this,e)),"delay",void 0),f(h(r),"shots",void 0),f(h(r),"firstShot",void 0),f(h(r),"timer",void 0),f(h(r),"init",void 0),r.init=t,r.shots=m(n),r.firstShot=r.shots[0],r.delay=a,r.container.table.showTraces(!0),r.container.table.updateFromShortSerialised(r.init),o){var l=new s.W(t,n);l.retry=!0,r.container.eventQueue.push(l)}else r.container.view.camera.forceMode(r.container.view.camera.topView),r.playNextShot(1.5*r.delay);return r}return n=[{key:"playNextShot",value:function(e){var t=this,n=this.shots.shift();if((null==n?void 0:n.type)===l.B.RERACK){c.x.fromJson(n.ballinfo).applyToController(this),this.shots.length>0&&this.playNextShot(e);return}var i=o.w.fromJson(n);this.container.table.cueball=this.container.table.balls[i.i],console.log(this.container.table.cueball.pos.distanceTo(i.pos)),this.container.table.cueball.pos.copy(i.pos),this.container.table.cue.aim=i,this.container.table.cue.updateAimInput(),this.container.table.cue.t=1,clearTimeout(this.timer),this.timer=setTimeout(function(){t.container.eventQueue.push(new r.Q(t.container.table.cue.aim)),t.timer=void 0},e)}},{key:"handleHit",value:function(e){return this.hit(),this}},{key:"handleStationary",value:function(e){return this.shots.length>0&&void 0===this.timer&&this.playNextShot(this.delay),this}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}},{key:"handleBreak",value:function(e){return(this.container.table.updateFromShortSerialised(e.init),this.shots=m(e.shots),this.container.table.showSpin(!0),e.retry)?this.retry():(this.playNextShot(this.delay),this)}},{key:"retry",value:function(){clearTimeout(this.timer),this.timer=void 0,this.container.table.updateFromShortSerialised(this.init);var e=o.w.fromJson(this.firstShot);return this.container.table.cueball=this.container.table.balls[e.i],this.container.rules.cueball=this.container.table.cueball,this.container.table.cueball.pos.copy(e.pos),this.container.table.cue.aim=e,this.container.view.camera.forceMode(this.container.view.camera.aimView),new a.m(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{V:()=>O});var r=n("./src/events/watchevent.ts"),i=n("./src/utils/rack.ts"),o=n("./node_modules/three/build/three.module.js"),s=n("./src/controller/aim.ts"),a=n("./src/controller/placeball.ts"),l=n("./src/controller/watchaim.ts"),c=n("./src/events/chatevent.ts"),u=n("./src/events/placeballevent.ts"),h=n("./src/model/outcome.ts"),f=n("./src/model/table.ts"),p=n("./src/utils/utils.ts"),d=n("./src/controller/end.ts"),m=n("./src/model/physics/constants.ts"),v=n("./src/utils/respot.ts"),y=n("./src/view/tablegeometry.ts"),b=n("./src/events/startaimevent.ts");function g(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var w=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),g(this,"container",void 0),g(this,"cueball",void 0),g(this,"currentBreak",0),g(this,"previousBreak",0),g(this,"score",0),g(this,"rulename","nineball"),this.container=e}return e=[{key:"startTurn",value:function(){this.previousBreak=this.currentBreak,this.currentBreak=0}},{key:"nextCandidateBall",value:function(){return v.k.closest(this.container.table.cueball,this.container.table.balls)}},{key:"placeBall",value:function(e){if(e){var t=new o.Pq0(-y.P.X/2,y.P.tableY),n=new o.Pq0(-y.P.tableX,-y.P.tableY);return e.clamp(n,t)}return new o.Pq0(-(11*m.R)/.5,0,0)}},{key:"asset",value:function(){return"models/p8.min.gltf"}},{key:"tableGeometry",value:function(){y.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"rack",value:function(){return i.m.diamond()}},{key:"update",value:function(e){var t=this.container.table;if(h.P.isCueBallPotted(t.cueball,e))return(this.startTurn(),this.container.isSinglePlayer)?new a.x(this.container):(this.container.sendEvent(new u.z(p.v_,!0)),new l.r(this.container));if(h.P.isBallPottedNoFoul(t.cueball,e)){var n=h.P.potCount(e);return(this.currentBreak+=n,this.score+=n,this.container.sound.playSuccess(t.inPockets()),this.isEndOfGame(e))?(this.container.eventQueue.push(new c.b(null,"game over")),this.container.recorder.wholeGameLink(),new d.o(this.container)):(this.container.sendEvent(new r.Q(t.serialise())),new s.m(this.container))}return(this.container.sendEvent(new b.M),this.container.isSinglePlayer)?(this.container.sendEvent(new r.Q(t.serialise())),this.startTurn(),new s.m(this.container)):new l.r(this.container)}},{key:"isPartOfBreak",value:function(e){return h.P.isBallPottedNoFoul(this.container.table.cueball,e)}},{key:"isEndOfGame",value:function(e){var t=this.container.table.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===this.cueball}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"allowsPlaceBall",value:function(){return!0}}],function(e,t){for(var n=0;n{n.d(t,{c:()=>k});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/events/watchevent.ts"),o=n("./src/model/outcome.ts"),s=n("./src/utils/rack.ts"),a=n("./src/utils/respot.ts"),l=n("./src/controller/aim.ts"),c=n("./src/controller/watchaim.ts"),u=n("./src/events/chatevent.ts"),h=n("./src/controller/end.ts"),f=n("./src/model/table.ts"),p=n("./src/view/tablegeometry.ts"),d=n("./src/controller/placeball.ts"),m=n("./src/events/placeballevent.ts"),v=n("./src/utils/utils.ts"),y=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"shotInfo",value:function(e,n,r){var i=o.P.firstCollision(n);return{pots:o.P.potCount(n),firstCollision:i,legalFirstCollision:t.isLegalFirstCollision(e,r,i),whitePotted:o.P.isCueBallPotted(e.cueball,n)}}},{key:"isLegalFirstCollision",value:function(e,n,r){if(!r)return!1;var i=r.ballB.id;return n?i>=7:!(t.coloursOnTable(e).filter(function(e){return e.id0)}},{key:"respotAllPottedColours",value:function(e,t){return o.P.pots(t).filter(function(e){return e.id<7}).filter(function(e){return 0!==e.id}).map(function(t){return a.k.respot(t,e)})}},{key:"redsOnTable",value:function(e){return e.balls.slice(7).filter(function(e){return e.onTable()})}},{key:"coloursOnTable",value:function(e){return e.balls.slice(1,7).filter(function(e){return e.onTable()})}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0,this.switchPlayer()}return this.targetIsRed?this.targetRedRule(e,t):this.targetColourRule(e,t)}},{key:"targetRedRule",value:function(e,t){return(console.log("applying target red rule"),t.legalFirstCollision&&o.P.onlyRedsPotted(e))?(this.currentBreak+=t.pots,this.targetIsRed=!1,this.previousPotRed=!0,this.container.hud.updateBreak(this.currentBreak),this.continueBreak()):(this.foulPoints=this.foulCalculation(e,t),this.respot(e),t.whitePotted)?this.whiteInHand():this.switchPlayer()}},{key:"targetColourRule",value:function(e,t){if(console.log("applying target colour rule"),t.whitePotted)return this.respot(e),this.whiteInHand();if(t.pots>1)return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer();if(o.P.pots(e)[0].id>6)return this.foulPoints=this.foulCalculation(e,t),this.switchPlayer();this.targetIsRed=y.redsOnTable(this.container.table).length>0;var n=o.P.pots(e)[0].id;return n!==t.firstCollision.ballB.id?this.foul(e,t):this.previousPotRed?(this.respot(e),this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak()):y.coloursOnTable(this.container.table).filter(function(e){return e.id0?this.foul(e,t):(this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak())}},{key:"foul",value:function(e,t){return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer()}},{key:"foulCalculation",value:function(e,t){var n,r,i,s,a=o.P.pots(e).map(function(e){return e.id}).filter(function(e){return e<7}),l=null!==(s=null===(i=t.firstCollision)||void 0===i?void 0:null===(r=i.ballB)||void 0===r?void 0:r.id)&&void 0!==s?s:0;return l>6&&(l=0),(n=Math).max.apply(n,[3,l].concat(function(e){if(Array.isArray(e))return g(e)}(a)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return g(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,void 0)}}(a)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))+1}},{key:"tableGeometry",value:function(){p.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"isPartOfBreak",value:function(e){return this.currentBreak>0}},{key:"isEndOfGame",value:function(e){return o.P.isClearTable(this.container.table)&&this.currentBreak>0}},{key:"allowsPlaceBall",value:function(){return!0}},{key:"asset",value:function(){return t.tablemodel}},{key:"startTurn",value:function(){this.previousPotRed=!1,this.targetIsRed=y.redsOnTable(this.container.table).length>0,this.previousBreak=this.currentBreak,this.score+=this.currentBreak,this.currentBreak=0,this.container.hud.updateBreak(this.currentBreak)}},{key:"rack",value:function(){return s.m.snooker()}},{key:"nextCandidateBall",value:function(){var e=this.container.table,t=y.redsOnTable(e),n=y.coloursOnTable(e);return this.previousPotRed?a.k.closest(e.cueball,n):t.length>0?a.k.closest(e.cueball,t):n.length>0?n[0]:void 0}},{key:"placeBall",value:function(e){if(e){var t=new r.Pq0(s.m.baulk,0,0),n=s.m.sixth,i=e.distanceTo(t);if(e.x>=s.m.baulk&&(e.x=s.m.baulk),!(i>n))return e;var o=e.clone().sub(t).normalize();return t.add(o.multiplyScalar(n))}return new r.Pq0(s.m.baulk,-s.m.sixth/2.6,0)}},{key:"switchPlayer",value:function(){this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),console.log("end of break, switch player");var e=this.container.table;return(console.log(e.cue.aim),this.container.sendEvent(new b.M(this.foulPoints)),this.container.isSinglePlayer)?(this.container.sendEvent(new i.Q(e.serialise())),this.startTurn(),new l.m(this.container)):new c.r(this.container)}},{key:"continueBreak",value:function(){this.container.hud.updateBreak(this.currentBreak);var e=this.container.table;return(this.container.sound.playSuccess(e.inPockets()),o.P.isClearTable(e))?(this.container.eventQueue.push(new u.b(null,"game over")),this.container.recorder.wholeGameLink(),new h.o(this.container)):(this.container.sendEvent(new i.Q(e.serialise())),new l.m(this.container))}},{key:"whiteInHand",value:function(){return(this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),this.startTurn(),this.container.isSinglePlayer)?new d.x(this.container):(this.container.sendEvent(new m.z(v.v_,!0)),new c.r(this.container))}},{key:"update",value:function(e){return this.snookerrule(e)}},{key:"respot",value:function(e){var t=y.respotAllPottedColours(this.container.table,e);if(t.length>0){var n={balls:t.map(function(e){return e.serialise()}),rerack:!0},r=new i.Q(n);this.container.sendEvent(r),this.container.recorder.record(r)}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>s});var r=n("./src/controller/watchshot.ts");function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=i(a);return e=t?Reflect.construct(n,arguments,i(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(t=s.call(this,e)).container.table.cueball=t.container.rules.otherPlayersCueBall(),t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.topView),t}return n=[{key:"handleAim",value:function(e){return this.container.table.cue.aim=e,this.container.table.cueball.pos.copy(e.pos),this}},{key:"handleHit",value:function(e){return this.container.table.updateFromSerialised(e.tablejson),new r.O(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{O:()=>c});var r=n("./src/controller/aim.ts"),i=n("./src/controller/watchaim.ts"),o=n("./src/controller/controllerbase.ts"),s=n("./src/controller/placeball.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c),(t=o.call(this,e)).container.table.outcome=[],t.container.table.hit(),t}return n=[{key:"handleStartAim",value:function(e){return new r.m(this.container)}},{key:"handlePlaceBall",value:function(e){return new s.x(this.container)}},{key:"handleWatch",value:function(e){return"rerack"in e.json?(console.log("Respot"),this.container.table.updateFromSerialised(e.json),this):new i.r(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{h:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.ABORT,e}return n=[{key:"applyToController",value:function(e){return e.handleAbort(this)}}],function(e,t){for(var n=0;n{n.d(t,{w:()=>f});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts"),s=n("./node_modules/three/build/three.module.js");function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e,t){for(var n=0;n{n.d(t,{u:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.BEGIN,e}return n=[{key:"applyToController",value:function(e){return e.handleBegin(this)}}],function(e,t){for(var n=0;n{n.d(t,{W:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{b:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{var r;n.d(t,{B:()=>r}),function(e){e.BEGIN="BEGIN",e.BREAK="BREAK",e.WATCHAIM="WATCHAIM",e.AIM="AIM",e.HIT="HIT",e.STATIONARY="STATIONARY",e.CHAT="CHAT",e.ABORT="ABORT",e.PLACEBALL="PLACEBALL",e.REJOIN="REJOIN",e.RERACK="RERACK",e.STARTAIM="STARTAIM"}(r||(r={}))},"./src/events/gameevent.ts":(e,t,n)=>{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{F:()=>i});var i=function e(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"type",void 0),r(this,"sequence",void 0)}},"./src/events/hitevent.ts":(e,t,n)=>{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{p:()=>i});var i=function e(t,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"t",void 0),r(this,"key",void 0),this.t=t,this.key=n}},"./src/events/keyboard.ts":(e,t,n)=>{n.d(t,{s:()=>a});var r=n("./src/events/input.ts"),i=n("./node_modules/interactjs/dist/interact.min.js"),o=n.n(i);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){var n=this;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),s(this,"pressed",{}),s(this,"released",{}),s(this,"keydown",function(e){null==n.pressed[e.code]&&(n.pressed[e.code]=performance.now()),e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"keyup",function(e){n.released[e.code]=performance.now()-n.pressed[e.code],delete n.pressed[e.code],e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"mousetouch",function(e){var t,r,i=n.released,o=e.client.yMath.abs(i.movementY)&&(i.movementY=0)}),this.addHandlers(e),/Android|iPhone/i.test(navigator.userAgent)||(e.contentEditable="true")}return e=[{key:"getEvents",value:function(){var e=this,t=Object.keys(this.pressed).filter(function(e){return!/Shift/.test(e)}).filter(function(e){return!/Control/.test(e)}),n=Object.keys(this.pressed).some(function(e){return/Shift/.test(e)}),i=Object.keys(this.pressed).some(function(e){return/Control/.test(e)}),o=[];return t.forEach(function(t){var s=performance.now()-e.pressed[t];o.push(new r.p(i?s/3:s,n?"Shift"+t:t)),"Space"!=t&&(e.pressed[t]=performance.now())}),Object.keys(this.released).forEach(function(t){return o.push(new r.p(e.released[t],t+"Up"))}),this.released={},o}},{key:"addHandlers",value:function(e){var t=this;e.addEventListener("keydown",this.keydown),e.addEventListener("keyup",this.keyup),e.focus(),o()(e).draggable({listeners:{move:function(e){t.mousetouch(e)}}}),o()(e).gesturable({onmove:function(e){e.dx/=3,t.mousetouch(e)}})}}],function(e,t){for(var n=0;n{n.d(t,{z:()=>h});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t){for(var n=0;n{n.d(t,{x:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{M:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),(t="foul")in(e=o(n=c.call(this)))?Object.defineProperty(e,t,{value:0,enumerable:!0,configurable:!0,writable:!0}):e[t]=0,n.type=i.B.STARTAIM,n.foul=r,n}return n=[{key:"applyToController",value:function(e){return e.handleStartAim(this)}}],r=[{key:"fromJson",value:function(e){return new u(e.foul)}}],n&&s(u.prototype,n),r&&s(u,r),u}(r.F)},"./src/events/stationaryevent.ts":(e,t,n)=>{n.d(t,{T:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.STATIONARY,e}return n=[{key:"applyToController",value:function(e){return e.handleStationary(this)}}],function(e,t){for(var n=0;n{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{var r=n("./src/container/container.ts"),i=n("./src/events/keyboard.ts"),o=n("./src/events/eventtype.ts"),s=n("./src/events/aimevent.ts"),a=n("./src/events/watchevent.ts"),l=n("./src/events/hitevent.ts"),c=n("./src/events/abortevent.ts"),u=n("./src/events/breakevent.ts"),h=n("./src/events/beginevent.ts"),f=n("./src/events/chatevent.ts");function p(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),m(p(e=i.call(this)),"clientResendFrom",void 0),m(p(e),"serverResendFrom",void 0),e.type=o.B.REJOIN,e.clientResendFrom=t,e.serverResendFrom=n,e}return n=[{key:"applyToController",value:function(e){return e.handleRejoin(this)}}],r=[{key:"fromJson",value:function(e){return new s(e.clientResendFrom,e.serverResendFrom)}}],n&&d(s.prototype,n),r&&d(s,r),s}(n("./src/events/gameevent.ts").F),g=n("./src/events/placeballevent.ts"),w=n("./src/events/rerackevent.ts"),k=n("./src/events/startaimevent.ts"),T=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"serialise",value:function(e){return JSON.stringify(e)}},{key:"fromJson",value:function(e){switch(e.type){case o.B.BEGIN:return new h.u;case o.B.AIM:return s.w.fromJson(e);case o.B.BREAK:return u.W.fromJson(e);case o.B.WATCHAIM:return a.Q.fromJson(e.json);case o.B.HIT:return l.Q.fromJson(e);case o.B.CHAT:return f.b.fromJson(e);case o.B.REJOIN:return b.fromJson(e);case o.B.ABORT:return new c.h;case o.B.PLACEBALL:return g.z.fromJson(e);case o.B.RERACK:return w.x.fromJson(e);case o.B.STARTAIM:return k.M.fromJson(e);default:throw Error("Unknown GameEvent :"+e)}}},{key:"fromSerialised",value:function(e){var n=JSON.parse(e),r=t.fromJson(n);return"sequence"in n&&(r.sequence=n.sequence),r}}],function(e,t){for(var n=0;n upload high score \uD83C\uDFC6{n.d(t,{c:()=>d,U:()=>r});var r,i=n("./src/utils/utils.ts"),o=n("./src/model/physics/physics.ts"),s=n("./node_modules/three/build/three.module.js"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"line",void 0),l(this,"geometry",void 0),l(this,"positions",void 0),l(this,"lastPos",new s.Pq0),l(this,"lastVel",new s.Pq0),this.geometry=new s.LoY,this.positions=new Float32Array(3*e),this.geometry.setAttribute("position",new s.THS(this.positions,3)),this.reset();var r=new s.mrM({color:n,opacity:.25,linewidth:3,transparent:!0});this.line=new s.N1A(this.geometry,r),this.line.visible=!1}return e=[{key:"reset",value:function(){this.geometry.setDrawRange(0,0),this.lastVel.setZ(1)}},{key:"forceTrace",value:function(e){this.lastVel.z=1,this.addTraceGiven(e,this.lastVel,1,.1,1)}},{key:"addTrace",value:function(e,t){if(0!==t.length()){var n=this.lastVel.angleTo(t),r=n>Math.PI/32?.01*a.R:a.R,i=this.lastPos.distanceTo(e);this.addTraceGiven(e,t,i,r,n)}}},{key:"addTraceGiven",value:function(e,t,n,r,i){var o=this.geometry.drawRange.count;0!==o&&n1&&i<1e-4&&o--,this.lastPos.copy(e),this.lastVel.copy(t),this.addPoint(e,o))}},{key:"addPoint",value:function(e,t){var n=3*t;n>this.positions.length||(this.positions[n++]=e.x,this.positions[n++]=e.y,this.positions[n]=e.z,this.geometry.setDrawRange(0,t+1),this.line.geometry.attributes.position.needsUpdate=!0)}}],function(e,t){for(var n=0;nMath.abs(this.rvel.z))&&(this.setStationary(),!0)}},{key:"setStationary",value:function(){this.vel.copy(i.v_),this.rvel.copy(i.v_),this.state="Stationary"}},{key:"isRolling",value:function(){return 0!==this.vel.lengthSq()&&0!==this.rvel.lengthSq()&&(0,o.Mq)(this.vel,this.rvel).length(){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{P:()=>o}),!function(e){e.Pot="Pot",e.Cushion="Cushion",e.Collision="Collision",e.Hit="Hit"}(i||(i={}));var i,o=function(){var e;function t(e,n,i,o){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r(this,"type",void 0),r(this,"timestamp",void 0),r(this,"ballA",null),r(this,"ballB",null),r(this,"incidentSpeed",void 0),this.type=e,this.ballA=n,this.ballB=i,this.incidentSpeed=o,this.timestamp=Date.now()}return e=[{key:"pot",value:function(e,n){return new t("Pot",e,e,n)}},{key:"cushion",value:function(e,n){return new t("Cushion",e,e,n)}},{key:"collision",value:function(e,n,r){return new t("Collision",e,n,r)}},{key:"hit",value:function(e,n){return new t("Hit",e,e,n)}},{key:"isCueBallPotted",value:function(e,t){return t.some(function(t){return"Pot"==t.type&&t.ballA===e})}},{key:"isBallPottedNoFoul",value:function(e,n){return n.some(function(e){return"Pot"==e.type&&null!==e.ballA})&&!t.isCueBallPotted(e,n)}},{key:"pots",value:function(e){return e.filter(function(e){return"Pot"==e.type}).map(function(e){return e.ballA})}},{key:"potCount",value:function(e){return this.pots(e).length}},{key:"onlyRedsPotted",value:function(e){return this.pots(e).every(function(e){return e.id>6})}},{key:"firstCollision",value:function(e){var t=e.filter(function(e){return"Collision"===e.type});return t.length>0?t[0]:void 0}},{key:"isClearTable",value:function(e){var t=e.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===e.cueball}},{key:"isThreeCushionPoint",value:function(e,n){n=t.cueBallFirst(e,n).filter(function(t){return t.ballA===e});var r=new Set,i=0,o=!0,s=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(o=(l=c.next()).done);o=!0){var u=l.value;if("Cushion"===u.type&&i++,"Collision"===u.type&&(r.add(u.ballB),2===r.size))return i>=3}}catch(e){s=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(s)throw a}}return!1}},{key:"cueBallFirst",value:function(e,t){return t.forEach(function(t){"Collision"===t.type&&t.ballB===e&&(t.ballB=t.ballA,t.ballA=e)}),t}}],function(e,t){for(var n=0;n{n.d(t,{I:()=>o,Mz:()=>r,Qg:()=>v,R:()=>f,Wv:()=>b,Ys:()=>g,cM:()=>w,e:()=>p,g:()=>s,gT:()=>c,gf:()=>l,jG:()=>m,kL:()=>u,kM:()=>k,m:()=>h,mu:()=>a,x3:()=>i,xO:()=>y});var r,i,o,s=9.8,a=.00985,l=.15,c=.8,u=.024,h=.23,f=.03275,p=.86;function d(){r=a*h*s*2/3*u,i=7/(5*Math.sqrt(2))*f*a*h*s,o=.4*h*f*f}function m(e){f=e,d()}function v(e){h=e,d()}function y(e){a=e,d()}function b(e){u=e,d()}function g(e){l=e}function w(e){p=e}function k(e){c=e}d()},"./src/model/physics/knuckle.ts":(e,t,n)=>{n.d(t,{O:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/view/pocketgeometry.ts");function o(e,t){for(var n=0;n{n.d(t,{$8:()=>x,Gp:()=>g,JD:()=>u,Mq:()=>a,QK:()=>f,QV:()=>P,Un:()=>b,c0:()=>y,lx:()=>h,p2:()=>c,s0:()=>v,t6:()=>S,yO:()=>w});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/utils/utils.ts"),o=n("./src/model/physics/constants.ts"),s=new r.Pq0;function a(e,t){return s.copy(e).addScaledVector((0,i.KM)(t),o.R)}var l={v:new r.Pq0,w:new r.Pq0};function c(e,t){var n=a(e,t).setZ(0);return l.v.copy((0,i.xb)(n).multiplyScalar(-o.gf*o.g)),l.w.copy((0,i.xb)((0,i.KM)(n)).multiplyScalar(2.5*o.gf*o.g/o.R)),l.w.setZ(-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(t.z)),l}function u(e){var t=new r.Pq0(e.x,e.y,0).length(),n=5/7*o.x3/(o.m*o.R)/t,i=5/7*o.x3/(o.m*o.R*o.R)/t;return l.v.set(-n*e.y,n*e.x,0),l.w.set(-i*e.x,-i*e.y,-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(e.z)),l}function h(e,t){var n=t.z;t.copy((0,i.KM)(e).multiplyScalar(1/o.R)),t.setZ(n)}function f(e,t,n,r){var o=r(t.clone().applyAxisAngle(i.up,e),n.clone().applyAxisAngle(i.up,e));return o.v.applyAxisAngle(i.up,-e),o.w.applyAxisAngle(i.up,-e),o}Object.freeze(l);var p=Math.asin(.1*o.R/o.R),d=Math.sin(p),m=Math.cos(p);function v(e,t){return new r.Pq0(e.x*d-e.z*m+o.R*t.y,-e.y-o.R*t.z*m+o.R*t.x*d)}function y(e){return e.x*m}function b(e){var t=3.5/o.m;return e.length()/t}function g(e){var t,n=1/o.m,i=.39+.257*(t=new r.Pq0(e/m,0,0)).x-.044*t.x*t.x;return o.gT*((1+i)*e)/n}function w(e,t){var n=g(y(e));return b(v(e,t))<=n}function k(e,t){return{c:y(e),s:v(e,t),A:3.5/o.m,B:1/o.m}}function T(e,t){var n=k(e,t),r=n.c,i=n.s,s=n.A,a=n.B,l=(1+o.e)*(r/a);return A(-i.x/s*d-l*m,i.y/s,i.x/s*m-l*d)}function R(e,t){var n=k(e,t),r=n.c,i=n.B,s=(1+o.e)*(r/i),a=.471-.241*Math.atan2(Math.abs(e.y),e.x),l=Math.atan2(e.y,e.x),c=Math.cos(l);return A(-a*s*c*m-s*m,a*s*Math.sin(l),a*s*c*m-s*d)}function P(e,t){return w(e,t)?T(e,t):R(e,t)}function x(e,t){var n=T(e,t),r=R(e,t),i=Math.sign(e.y)===Math.sign(t.z)?Math.cos(Math.atan2(e.y,e.x)):1;return{v:r.v.lerp(n.v,i),w:r.w.lerp(n.w,i)}}function A(e,t,n){return{v:new r.Pq0(e/o.m,t/o.m),w:new r.Pq0(-o.R/o.I*t*d,o.R/o.I*(e*d-n*m),o.R/o.I*t*m)}}function S(e,t){var n=Math.atan2(-e.x,e.y),r=2.5*t.length()*(e.length()*o.R)/(o.R*o.R),s=t.clone().normalize();return(0,i.KM)(s).applyAxisAngle(s,n).multiplyScalar(r)}},"./src/model/physics/pocket.ts":(e,t,n)=>{n.d(t,{Z:()=>l});var r=n("./src/model/ball.ts"),i=n("./src/model/physics/constants.ts"),o=n("./src/utils/utils.ts");function s(e,t){for(var n=0;nthis.radius-i.R){var s=this.pos.clone().sub(e.pos).normalize().setZ(0);n>-i.R/2&&e.vel.addScaledVector(s,7*i.R*t*i.g),0>e.vel.dot(s)&&(e.ballmesh.trace.forceTrace(e.pos),e.vel.x=s.x*e.vel.length()/2,e.vel.y=s.y*e.vel.length()/2)}var a=this.restingDepth(e);n{n.d(t,{X:()=>b});var r=n("./src/view/tablegeometry.ts"),i=n("./src/model/physics/physics.ts"),o=n("./src/view/pocketgeometry.ts"),s=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"bounceAny",value:function(e,n){var o=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i.$8,a=e.futurePosition(n);if(t.willBounceLong(a,o)){var l=a.y>r.P.tableY?-Math.PI/2:Math.PI/2;return t.bounceIn(l,e,s)}if(t.willBounceShort(a,o)){var c=a.x>r.P.tableX?0:Math.PI;return t.bounceIn(c,e,s)}}},{key:"willBounceShort",value:function(e,n){return n?t.willBounceShortSegment(o.f.pockets.pocketNW.knuckleSW.pos.y,o.f.pockets.pocketSW.knuckleNW.pos.y,e):t.willBounceShortSegment(r.P.Y,-r.P.Y,e)}},{key:"willBounceLong",value:function(e,n){return n?t.willBounceLongSegment(o.f.pockets.pocketNW.knuckleNE.pos.x,o.f.pockets.pocketN.knuckleNW.pos.x,e)||t.willBounceLongSegment(o.f.pockets.pocketN.knuckleNE.pos.x,o.f.pockets.pocketNE.knuckleNW.pos.x,e):t.willBounceLongSegment(-r.P.X,r.P.X,e)}},{key:"willBounceLongSegment",value:function(e,t,n){return n.x>e&&n.xr.P.tableY}},{key:"willBounceShortSegment",value:function(e,t,n){return n.y>t&&n.yr.P.tableX}},{key:"bounceIn",value:function(e,t,n){t.ballmesh.trace.forceTrace(t.futurePos);var r=(0,i.QK)(e,t.vel,t.rvel,n);return t.vel.add(r.v),t.rvel.add(r.w),r.v.length()}}],function(e,t){for(var n=0;n100)throw Error("Depth exceeded resolving collisions");this.balls.forEach(function(t){t.update(e)})}},{key:"prepareAdvanceAll",value:function(e){var t=this;return this.pairs.every(function(n){return t.prepareAdvancePair(n.a,n.b,e)})&&this.balls.every(function(n){return t.prepareAdvanceToCushions(n,e)})}},{key:"prepareAdvancePair",value:function(e,t,n){if(c.willCollide(e,t,n)){var r=c.collide(e,t);return this.outcome.push(d.P.collision(e,t,r)),!1}return!0}},{key:"prepareAdvanceToCushions",value:function(e,t){if(!e.onTable())return!0;var n=e.futurePosition(t);if(Math.abs(n.y)1&&void 0!==arguments[1]?arguments[1]:this.cueball;return this.balls.filter(function(e){return e!==t}).some(function(t){return t.pos.distanceTo(e)<2*l.R})}}],t=[{key:"fromSerialised",value:function(e){var t=new n(e.balls.map(function(e){return a.c.fromSerialised(e)}));return t.updateFromSerialised(e),t}}],e&&v(n.prototype,e),t&&v(n,t),n}()},"./src/utils/gltf.ts":(e,t,n)=>{let r,i,o,s;n.d(t,{KP:()=>e_,Ro:()=>eI});var a=n("./node_modules/three/build/three.module.js");function l(e,t=1/0,n=null){i||(i=new a.bdM(2,2,1,1)),o||(o=new a.BKk({uniforms:{blitTexture:new a.nc$(e)},vertexShader:` +"use strict";(self.webpackChunkbilliards=self.webpackChunkbilliards||[]).push([[57],{"./src/container/container.ts":(e,t,n)=>{n.d(t,{m:()=>J});var r=n("./src/events/stationaryevent.ts"),i=n("./node_modules/three/build/three.module.js"),o=n("./src/utils/utils.ts"),s=n("./src/view/cameratop.ts"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"camera",void 0),l(this,"mode",this.topView),l(this,"mainMode",this.aimView),l(this,"height",8*a.R),l(this,"elapsed",void 0),this.camera=new i.ubm(45,e,a.R,1e3*a.R)}return e=[{key:"update",value:function(e,t){this.elapsed=e,this.mode(t)}},{key:"topView",value:function(e){this.camera.fov=s.v.fov,this.camera.position.lerp(s.v.viewPoint(this.camera.aspect,this.camera.fov),.9),this.camera.up=o.up,this.camera.lookAt(o.v_)}},{key:"aimView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.08,n=this.height,r=this.camera.aspect<.8;if(this.camera.fov=r?60:40,n<10*a.R){var i=100*(10*a.R-n);this.camera.fov-=i*(r?3:1)}this.camera.position.lerp(e.pos.clone().addScaledVector((0,o.Dz)(e.angle),-(18*a.R)),t),this.camera.position.z=n,this.camera.up=o.up,this.camera.lookAt(e.pos.clone().addScaledVector(o.up,n/2))}},{key:"adjustHeight",value:function(e){e=this.height<10*a.R?e/8:e,this.height=i.cj9.clamp(this.height+e,6*a.R,120*a.R),this.height>110*a.R&&this.suggestMode(this.topView),this.height<105*a.R&&this.suggestMode(this.aimView)}},{key:"suggestMode",value:function(e){this.mainMode===this.aimView&&(this.mode=e)}},{key:"forceMode",value:function(e){this.mode=e,this.mainMode=e}},{key:"forceMove",value:function(e){this.mode===this.aimView&&this.aimView(e,1)}},{key:"toggleMode",value:function(){this.mode===this.topView?this.mode=this.aimView:this.mode=this.topView,this.mainMode=this.mode}}],function(e,t){for(var n=0;n0&&(null===(t=this.cuePowerElement)||void 0===t?void 0:t.value)&&(this.cuePowerElement.value=e)}}],function(e,t){for(var n=0;nthis.sentTime+this.period||e.type!==N.B.AIM){this.flush(),this.apply(e),this.sentTime=performance.now();return}this.pending=e}}],function(e,t){for(var n=0;n0&&"RERACK"===this.shots[e].type&&e--,e}},{key:"lastShot",value:function(){var e=this.last();return this.state(this.states[e],[this.shots[e]])}},{key:"currentBreak",value:function(){if(void 0!==this.breakStart)return this.state(this.states[this.breakStart],this.shots.slice(this.breakStart),this.breakStartTime,this.container.rules.previousBreak)}},{key:"state",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return{init:e,shots:t,start:n,now:Date.now(),score:r,wholeGame:i}}},{key:"updateBreak",value:function(e){var t=this.container.rules.isPartOfBreak(e),n=this.container.rules.isEndOfGame(e),r=U.P.potCount(e);if(t||this.breakLink(n),this.lastShotLink(t||n,r,U.P.pots(e)),n&&this.breakLink(n),!t){this.breakStart=void 0;return}void 0===this.breakStart&&(this.breakStart=this.last(),this.breakStartTime=Date.now())}},{key:"lastShotLink",value:function(e,t,n){var r="#000000";n.length>0&&n.forEach(function(e){r="#"+e.ballmesh.color.getHexString()});var i="⚈".repeat(t>1?t-1:0)+(e?"⚈":"⚆"),o=JSON.stringify(this.lastShot());this.generateLink(i,o,r)}},{key:"breakLink",value:function(e){var t=this.currentBreak();if(t&&(e||t.shots.pop(),1!==t.shots.length)){var n=0===this.container.rules.currentBreak?this.container.rules.previousBreak:this.container.rules.currentBreak;t.score=n;var r=JSON.stringify(t),i=D.A.crush(r);this.generateLink("break(".concat(n,")"),i,"black"),n>=4&&this.generateHiScoreLink(i)}}},{key:"wholeGameLink",value:function(){var e=this.wholeGame(),t="frame(".concat(this.shotCount(e.shots)," shots)"),n=JSON.stringify(e),r=D.A.crush(n);this.generateLink(t,r,"black")}},{key:"shotCount",value:function(e){return e.filter(function(e){return"RERACK"!==e.type}).length}},{key:"generateLink",value:function(e,t,n){var r="".concat(this.replayUrl).concat(this.fullyEncodeURI(t)),i='').concat(e,"");this.container.eventQueue.push(new B.b(null,"".concat(i)))}},{key:"generateHiScoreLink",value:function(e){var t="".concat(this.hiScoreUrl,"?ruletype=").concat(this.container.rules.rulename,"&state=").concat(this.fullyEncodeURI(e)),n='').concat("hi score 🏆","");this.container.eventQueue.push(new B.b(null,"".concat(n)))}},{key:"fullyEncodeURI",value:function(e){return encodeURIComponent(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\!/g,"%21").replace(/\*/g,"%2A")}}],function(e,t){for(var n=0;n').concat(e,"")));r.push(new B.b(null,s))})},this.redo.onclick=function(e){var r=new V.W(t.init,t.shots);r.retry=!0,n.interuptEventQueue(r)},this.replay.onclick=function(e){n.interuptEventQueue(t)}}}},{key:"interuptEventQueue",value:function(e){this.container.table.halt();var t=this.container.eventQueue;t.length=0,t.push(new r.T),t.push(e)}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0?this.element.innerHTML="Break
"+e:this.element.innerHTML="")}},{key:"getElement",value:function(e){return document.getElementById(e)}}],function(e,t){for(var n=0;n0;){this.lastEventTime=this.last;var t=this.inputQueue.shift();t&&this.updateController(this.controller.handleInput(t))}if(this.table.allStationary()){var n=this.eventQueue.shift();n&&(this.lastEventTime=performance.now(),this.updateController(n.applyToController(this.controller)))}}},{key:"animate",value:function(e){var t=this;this.advance((e-this.last)/1e3),this.last=e,this.processEvents(),(e{n.d(t,{m:()=>c});var r=n("./src/controller/controller.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/controller/playshot.ts"),s=n("./src/controller/replay.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,i=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c);var t,n=(t=i.call(this,e)).container.table;return n.cue.aimMode(),n.cue.showHelper(!0),n.cueball=t.container.rules.cueball,n.cue.moveTo(n.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.aimView),n.cue.aimInputs.showOverlap(),t}return n=[{key:"handleInput",value:function(e){switch(e.key){case"Space":this.container.table.cue.adjustPower(e.t*this.scale*.7);break;case"SpaceUp":return this.playShot();default:if(!this.commonKeyHandler(e))return this}return this.container.sendEvent(this.container.table.cue.aim),this}},{key:"handleBreak",value:function(e){return new s.e(this.container,e.init,e.shots,e.retry)}},{key:"playShot",value:function(){var e=new r.Qe(this.container.table.serialise());return this.container.sendEvent(e),this.container.recorder.record(e),new o.H(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{Qe:()=>r.Q,pd:()=>i.p,xI:()=>o}),n("./src/events/beginevent.ts"),n("./src/events/aimevent.ts");var r=n("./src/events/hitevent.ts"),i=n("./src/events/input.ts");n("./src/events/abortevent.ts"),n("./src/events/stationaryevent.ts");var o=function(){var e;function t(e){var n,r;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r=void 0,(n="container")in this?Object.defineProperty(this,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[n]=r,this.container=e}return e=[{key:"handleInput",value:function(e){return this}},{key:"handleBegin",value:function(e){return this}},{key:"handleBreak",value:function(e){return this}},{key:"handleStartAim",value:function(e){return this}},{key:"handleAim",value:function(e){return this}},{key:"handleHit",value:function(e){return this}},{key:"handleAbort",value:function(e){return this}},{key:"handleWatch",value:function(e){return this}},{key:"handlePlaceBall",value:function(e){return this}},{key:"handleStationary",value:function(e){return this}},{key:"handleChat",value:function(e){return this}},{key:"handleRejoin",value:function(e){return this}},{key:"onFirst",value:function(){}}],function(e,t){for(var n=0;n{n.d(t,{y:()=>f});var r=n("./src/controller/controller.ts"),i=n("./src/controller/end.ts"),o=n("./src/utils/gltf.ts"),s=n("./src/model/outcome.ts"),a=n("./node_modules/three/build/three.module.js");function l(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}var f=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(f,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=c(f);return e=t?Reflect.construct(n,arguments,c(this).constructor):n.apply(this,arguments),e&&("object"===h(e)||"function"==typeof e)?e:l(this)});function f(){var e,t,n;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,f),e=r.apply(this,arguments),(n="scale")in(t=l(e))?Object.defineProperty(t,n,{value:.001,enumerable:!0,configurable:!0,writable:!0}):t[n]=.001,e}return n=[{key:"handleAbort",value:function(e){return new i.o(this.container)}},{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}},{key:"hit",value:function(){this.container.table.outcome=[s.P.hit(this.container.table.cueball,this.container.table.cue.aim.power)],this.container.table.hit(),this.container.view.camera.suggestMode(this.container.view.camera.aimView),this.container.table.cue.showHelper(!1)}},{key:"commonKeyHandler",value:function(e){var t=this.container.table.cue,n=e.t*this.scale;switch(e.key){case"ArrowLeft":return t.rotateAim(-n,this.container.table),!0;case"ArrowRight":return t.rotateAim(n,this.container.table),!0;case"ArrowDown":return t.adjustSpin(new a.Pq0(0,-n),this.container.table),!0;case"ArrowUp":return t.adjustSpin(new a.Pq0(0,n),this.container.table),!0;case"ShiftArrowLeft":return t.adjustSpin(new a.Pq0(n,0),this.container.table),!0;case"ShiftArrowRight":return t.adjustSpin(new a.Pq0(-n,0),this.container.table),!0;case"KeyPUp":return(0,o.KP)(this.container.view.scene),!0;case"KeyHUp":return t.toggleHelper(),!0;case"movementXUp":return t.rotateAim(2*n,this.container.table),!0;case"movementYUp":case"NumpadSubtract":return this.container.view.camera.adjustHeight(8*n),!0;case"NumpadAdd":return this.container.view.camera.adjustHeight(-(8*n)),!0;case"KeyOUp":return this.container.view.camera.toggleMode(),!0;case"KeyDUp":return this.togglePanel(),!0;case"KeyFUp":return this.toggleFullscreen(),!0;default:return!1}}},{key:"togglePanel",value:function(){this.container.sliders.toggleVisibility(),this.container.table.showSpin(!0),this.container.table.showTraces(!0),("undefined"==typeof process?"undefined":h(process))!=="object"&&console.log(this.container.table.serialise())}},{key:"toggleFullscreen",value:function(){document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{o:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(){return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),o.apply(this,arguments)}return n=[{key:"handleChat",value:function(e){var t=e.sender?"".concat(e.sender,":"):"",n="".concat(t," ").concat(e.message);return this.container.chat.showMessage(n),this}}],function(e,t){for(var n=0;n{n.d(t,{x:()=>p});var r=n("./src/controller/controllerbase.ts"),i=n("./src/controller/controller.ts"),o=n("./src/controller/aim.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/model/physics/constants.ts"),l=n("./node_modules/three/build/three.module.js"),c=n("./src/view/cuemesh.ts");function u(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var p=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}(p,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=h(p);return e=t?Reflect.construct(n,arguments,h(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:u(this)});function p(e){var t,n,i,o;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,p),n=u(t=r.call(this,e)),i="placescale",o=.02*a.R,i in n?Object.defineProperty(n,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[i]=o,t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.table.cue.aim.power=0,t.container.view.camera.forceMode(t.container.view.camera.aimView),t}return n=[{key:"onFirst",value:function(){var e=this.container.table.cueball;this.container.rules.allowsPlaceBall()&&e.pos.copy(this.container.rules.placeBall()),e.setStationary(),e.updateMesh(0),this.container.table.cue.placeBallMode(),this.container.table.cue.showHelper(!1),this.container.table.cue.moveTo(this.container.table.cueball.pos),this.container.table.cue.aimInputs.setButtonText("Place\nBall"),this.container.rules.allowsPlaceBall()||this.container.inputQueue.push(new i.pd(1,"SpaceUp"))}},{key:"handleInput",value:function(e){var t=this.container.table.cueball.pos;switch(e.key){case"ArrowLeft":case"KeyI":this.moveTo(0,e.t*this.placescale);break;case"ArrowRight":case"KeyK":this.moveTo(0,-e.t*this.placescale);break;case"movementXUp":this.moveTo(0,-e.t*this.placescale*2);break;case"movementYUp":this.moveTo(-e.t*this.placescale*2,0);break;case"KeyJ":this.moveTo(-e.t*this.placescale,0);break;case"KeyL":this.moveTo(e.t*this.placescale,0);break;case"SpaceUp":return this.placed();default:this.commonKeyHandler(e)}return this.container.table.cue.moveTo(t),this.container.view.camera.forceMove(this.container.table.cue.aim),this.container.sendEvent(this.container.table.cue.aim),this}},{key:"moveTo",value:function(e,t){var n=new l.Pq0(e,t),r=this.container.table.cueball.pos.add(n);r.copy(this.container.rules.placeBall(r)),c.l.indicateValid(!this.container.table.overlapsAny(r))}},{key:"placed",value:function(){return this.container.table.overlapsAny(this.container.table.cueball.pos)?this:(this.container.table.cue.aimInputs.setButtonText("Hit"),this.container.sound.playNotify(),this.container.sendEvent(new s.W(this.container.table.shortSerialise())),new o.m(this.container))}}],function(e,t){for(var n=0;n{function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function i(e,t){return(i=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{H:()=>o});var o=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&i(e,t)}(s,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=r(s);return e=t?Reflect.construct(n,arguments,r(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function s(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),(t=o.call(this,e)).hit(),t}return n=[{key:"handleStationary",value:function(e){var t=this.container.table,n=t.outcome,r=this.container.rules.update(n);return this.container.recorder.updateBreak(n),t.cue.aimAtNext(t.cueball,this.container.rules.nextCandidateBall()),r}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}}],function(e,t){for(var n=0;n{n.d(t,{e:()=>v});var r=n("./src/events/hitevent.ts"),i=n("./src/controller/controllerbase.ts"),o=n("./src/events/aimevent.ts"),s=n("./src/events/breakevent.ts"),a=n("./src/controller/aim.ts"),l=n("./src/events/eventtype.ts"),c=n("./src/events/rerackevent.ts");function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1500;if(!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),f(h(r=i.call(this,e)),"delay",void 0),f(h(r),"shots",void 0),f(h(r),"firstShot",void 0),f(h(r),"timer",void 0),f(h(r),"init",void 0),r.init=t,r.shots=m(n),r.firstShot=r.shots[0],r.delay=a,r.container.table.showTraces(!0),r.container.table.updateFromShortSerialised(r.init),o){var l=new s.W(t,n);l.retry=!0,r.container.eventQueue.push(l)}else r.container.view.camera.forceMode(r.container.view.camera.topView),r.playNextShot(1.5*r.delay);return r}return n=[{key:"playNextShot",value:function(e){var t=this,n=this.shots.shift();if((null==n?void 0:n.type)===l.B.RERACK){c.x.fromJson(n.ballinfo).applyToController(this),this.shots.length>0&&this.playNextShot(e);return}var i=o.w.fromJson(n);this.container.table.cueball=this.container.table.balls[i.i],console.log(this.container.table.cueball.pos.distanceTo(i.pos)),this.container.table.cueball.pos.copy(i.pos),this.container.table.cue.aim=i,this.container.table.cue.updateAimInput(),this.container.table.cue.t=1,clearTimeout(this.timer),this.timer=setTimeout(function(){t.container.eventQueue.push(new r.Q(t.container.table.cue.aim)),t.timer=void 0},e)}},{key:"handleHit",value:function(e){return this.hit(),this}},{key:"handleStationary",value:function(e){return this.shots.length>0&&void 0===this.timer&&this.playNextShot(this.delay),this}},{key:"handleInput",value:function(e){return this.commonKeyHandler(e),this}},{key:"handleBreak",value:function(e){return(this.container.table.updateFromShortSerialised(e.init),this.shots=m(e.shots),this.container.table.showSpin(!0),e.retry)?this.retry():(this.playNextShot(this.delay),this)}},{key:"retry",value:function(){clearTimeout(this.timer),this.timer=void 0,this.container.table.updateFromShortSerialised(this.init);var e=o.w.fromJson(this.firstShot);return this.container.table.cueball=this.container.table.balls[e.i],this.container.rules.cueball=this.container.table.cueball,this.container.table.cueball.pos.copy(e.pos),this.container.table.cue.aim=e,this.container.view.camera.forceMode(this.container.view.camera.aimView),new a.m(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{V:()=>O});var r=n("./src/events/watchevent.ts"),i=n("./src/utils/rack.ts"),o=n("./node_modules/three/build/three.module.js"),s=n("./src/controller/aim.ts"),a=n("./src/controller/placeball.ts"),l=n("./src/controller/watchaim.ts"),c=n("./src/events/chatevent.ts"),u=n("./src/events/placeballevent.ts"),h=n("./src/model/outcome.ts"),f=n("./src/model/table.ts"),p=n("./src/utils/utils.ts"),d=n("./src/controller/end.ts"),m=n("./src/model/physics/constants.ts"),v=n("./src/utils/respot.ts"),y=n("./src/view/tablegeometry.ts"),b=n("./src/events/startaimevent.ts");function g(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var w=function(){var e;function t(e){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),g(this,"container",void 0),g(this,"cueball",void 0),g(this,"currentBreak",0),g(this,"previousBreak",0),g(this,"score",0),g(this,"rulename","nineball"),this.container=e}return e=[{key:"startTurn",value:function(){this.previousBreak=this.currentBreak,this.currentBreak=0}},{key:"nextCandidateBall",value:function(){return v.k.closest(this.container.table.cueball,this.container.table.balls)}},{key:"placeBall",value:function(e){if(e){var t=new o.Pq0(-y.P.X/2,y.P.tableY),n=new o.Pq0(-y.P.tableX,-y.P.tableY);return e.clamp(n,t)}return new o.Pq0(-(11*m.R)/.5,0,0)}},{key:"asset",value:function(){return"models/p8.min.gltf"}},{key:"tableGeometry",value:function(){y.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"rack",value:function(){return i.m.diamond()}},{key:"update",value:function(e){var t=this.container.table;if(h.P.isCueBallPotted(t.cueball,e))return(this.startTurn(),this.container.isSinglePlayer)?new a.x(this.container):(this.container.sendEvent(new u.z(p.v_,!0)),new l.r(this.container));if(h.P.isBallPottedNoFoul(t.cueball,e)){var n=h.P.potCount(e);return(this.currentBreak+=n,this.score+=n,this.container.sound.playSuccess(t.inPockets()),this.isEndOfGame(e))?(this.container.eventQueue.push(new c.b(null,"game over")),this.container.recorder.wholeGameLink(),new d.o(this.container)):(this.container.sendEvent(new r.Q(t.serialise())),new s.m(this.container))}return(this.container.sendEvent(new b.M),this.container.isSinglePlayer)?(this.container.sendEvent(new r.Q(t.serialise())),this.startTurn(),new s.m(this.container)):new l.r(this.container)}},{key:"isPartOfBreak",value:function(e){return h.P.isBallPottedNoFoul(this.container.table.cueball,e)}},{key:"isEndOfGame",value:function(e){var t=this.container.table.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===this.cueball}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"allowsPlaceBall",value:function(){return!0}}],function(e,t){for(var n=0;n{n.d(t,{c:()=>k});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/events/watchevent.ts"),o=n("./src/model/outcome.ts"),s=n("./src/utils/rack.ts"),a=n("./src/utils/respot.ts"),l=n("./src/controller/aim.ts"),c=n("./src/controller/watchaim.ts"),u=n("./src/events/chatevent.ts"),h=n("./src/controller/end.ts"),f=n("./src/model/table.ts"),p=n("./src/view/tablegeometry.ts"),d=n("./src/controller/placeball.ts"),m=n("./src/events/placeballevent.ts"),v=n("./src/utils/utils.ts"),y=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"shotInfo",value:function(e,n,r){var i=o.P.firstCollision(n);return{pots:o.P.potCount(n),firstCollision:i,legalFirstCollision:t.isLegalFirstCollision(e,r,i),whitePotted:o.P.isCueBallPotted(e.cueball,n)}}},{key:"isLegalFirstCollision",value:function(e,n,r){if(!r)return!1;var i=r.ballB.id;return n?i>=7:!(t.coloursOnTable(e).filter(function(e){return e.id0)}},{key:"respotAllPottedColours",value:function(e,t){return o.P.pots(t).filter(function(e){return e.id<7}).filter(function(e){return 0!==e.id}).map(function(t){return a.k.respot(t,e)})}},{key:"redsOnTable",value:function(e){return e.balls.slice(7).filter(function(e){return e.onTable()})}},{key:"coloursOnTable",value:function(e){return e.balls.slice(1,7).filter(function(e){return e.onTable()})}}],function(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0,this.switchPlayer()}return this.targetIsRed?this.targetRedRule(e,t):this.targetColourRule(e,t)}},{key:"targetRedRule",value:function(e,t){return(console.log("applying target red rule"),t.legalFirstCollision&&o.P.onlyRedsPotted(e))?(this.currentBreak+=t.pots,this.targetIsRed=!1,this.previousPotRed=!0,this.container.hud.updateBreak(this.currentBreak),this.continueBreak()):(this.foulPoints=this.foulCalculation(e,t),this.respot(e),t.whitePotted)?this.whiteInHand():this.switchPlayer()}},{key:"targetColourRule",value:function(e,t){if(console.log("applying target colour rule"),t.whitePotted)return this.respot(e),this.whiteInHand();if(t.pots>1)return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer();if(o.P.pots(e)[0].id>6)return this.foulPoints=this.foulCalculation(e,t),this.switchPlayer();this.targetIsRed=y.redsOnTable(this.container.table).length>0;var n=o.P.pots(e)[0].id;return n!==t.firstCollision.ballB.id?this.foul(e,t):this.previousPotRed?(this.respot(e),this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak()):y.coloursOnTable(this.container.table).filter(function(e){return e.id0?this.foul(e,t):(this.currentBreak+=n+1,this.previousPotRed=!1,this.continueBreak())}},{key:"foul",value:function(e,t){return this.foulPoints=this.foulCalculation(e,t),this.respot(e),this.switchPlayer()}},{key:"foulCalculation",value:function(e,t){var n,r,i,s,a=o.P.pots(e).map(function(e){return e.id}).filter(function(e){return e<7}),l=null!==(s=null===(i=t.firstCollision)||void 0===i?void 0:null===(r=i.ballB)||void 0===r?void 0:r.id)&&void 0!==s?s:0;return l>6&&(l=0),(n=Math).max.apply(n,[3,l].concat(function(e){if(Array.isArray(e))return g(e)}(a)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return g(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,void 0)}}(a)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))+1}},{key:"tableGeometry",value:function(){p.P.hasPockets=!0}},{key:"table",value:function(){var e=new f.X(this.rack());return this.cueball=e.cueball,e}},{key:"otherPlayersCueBall",value:function(){return this.cueball}},{key:"secondToPlay",value:function(){}},{key:"isPartOfBreak",value:function(e){return this.currentBreak>0}},{key:"isEndOfGame",value:function(e){return o.P.isClearTable(this.container.table)&&this.currentBreak>0}},{key:"allowsPlaceBall",value:function(){return!0}},{key:"asset",value:function(){return t.tablemodel}},{key:"startTurn",value:function(){this.previousPotRed=!1,this.targetIsRed=y.redsOnTable(this.container.table).length>0,this.previousBreak=this.currentBreak,this.score+=this.currentBreak,this.currentBreak=0,this.container.hud.updateBreak(this.currentBreak)}},{key:"rack",value:function(){return s.m.snooker()}},{key:"nextCandidateBall",value:function(){var e=this.container.table,t=y.redsOnTable(e),n=y.coloursOnTable(e);return this.previousPotRed?a.k.closest(e.cueball,n):t.length>0?a.k.closest(e.cueball,t):n.length>0?n[0]:void 0}},{key:"placeBall",value:function(e){if(e){var t=new r.Pq0(s.m.baulk,0,0),n=s.m.sixth,i=e.distanceTo(t);if(e.x>=s.m.baulk&&(e.x=s.m.baulk),!(i>n))return e;var o=e.clone().sub(t).normalize();return t.add(o.multiplyScalar(n))}return new r.Pq0(s.m.baulk,-s.m.sixth/2.6,0)}},{key:"switchPlayer",value:function(){this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),console.log("end of break, switch player");var e=this.container.table;return(console.log(e.cue.aim),this.container.sendEvent(new b.M(this.foulPoints)),this.container.isSinglePlayer)?(this.container.sendEvent(new i.Q(e.serialise())),this.startTurn(),new l.m(this.container)):new c.r(this.container)}},{key:"continueBreak",value:function(){this.container.hud.updateBreak(this.currentBreak);var e=this.container.table;return(this.container.sound.playSuccess(e.inPockets()),o.P.isClearTable(e))?(this.container.eventQueue.push(new u.b(null,"game over")),this.container.recorder.wholeGameLink(),new h.o(this.container)):(this.container.sendEvent(new i.Q(e.serialise())),new l.m(this.container))}},{key:"whiteInHand",value:function(){return(this.foulPoints>0&&console.log("foul, ".concat(this.foulPoints," to opponent")),this.startTurn(),this.container.isSinglePlayer)?new d.x(this.container):(this.container.sendEvent(new m.z(v.v_,!0)),new c.r(this.container))}},{key:"update",value:function(e){return this.snookerrule(e)}},{key:"respot",value:function(e){var t=y.respotAllPottedColours(this.container.table,e);if(t.length>0){var n={balls:t.map(function(e){return e.serialise()}),rerack:!0},r=new i.Q(n);this.container.sendEvent(r),this.container.recorder.record(r)}}}],function(e,t){for(var n=0;n{n.d(t,{r:()=>s});var r=n("./src/controller/watchshot.ts");function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}(a,e);var t,n,s=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=i(a);return e=t?Reflect.construct(n,arguments,i(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(t=s.call(this,e)).container.table.cueball=t.container.rules.otherPlayersCueBall(),t.container.table.cue.moveTo(t.container.table.cueball.pos),t.container.view.camera.suggestMode(t.container.view.camera.topView),t}return n=[{key:"handleAim",value:function(e){return this.container.table.cue.aim=e,this.container.table.cueball.pos.copy(e.pos),this}},{key:"handleHit",value:function(e){return this.container.table.updateFromSerialised(e.tablejson),new r.O(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{O:()=>c});var r=n("./src/controller/aim.ts"),i=n("./src/controller/watchaim.ts"),o=n("./src/controller/controllerbase.ts"),s=n("./src/controller/placeball.ts");function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function l(e,t){return(l=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&l(e,t)}(c,e);var t,n,o=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=a(c);return e=t?Reflect.construct(n,arguments,a(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function c(e){var t;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,c),(t=o.call(this,e)).container.table.outcome=[],t.container.table.hit(),t}return n=[{key:"handleStartAim",value:function(e){return new r.m(this.container)}},{key:"handlePlaceBall",value:function(e){return new s.x(this.container)}},{key:"handleWatch",value:function(e){return"rerack"in e.json?(console.log("Respot"),this.container.table.updateFromSerialised(e.json),this):new i.r(this.container)}}],function(e,t){for(var n=0;n{n.d(t,{h:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.ABORT,e}return n=[{key:"applyToController",value:function(e){return e.handleAbort(this)}}],function(e,t){for(var n=0;n{n.d(t,{w:()=>f});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts"),s=n("./node_modules/three/build/three.module.js");function a(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e,t){for(var n=0;n{n.d(t,{u:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.BEGIN,e}return n=[{key:"applyToController",value:function(e){return e.handleBegin(this)}}],function(e,t){for(var n=0;n{n.d(t,{W:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{b:()=>u});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{var r;n.d(t,{B:()=>r}),function(e){e.BEGIN="BEGIN",e.BREAK="BREAK",e.WATCHAIM="WATCHAIM",e.AIM="AIM",e.HIT="HIT",e.STATIONARY="STATIONARY",e.CHAT="CHAT",e.ABORT="ABORT",e.PLACEBALL="PLACEBALL",e.REJOIN="REJOIN",e.RERACK="RERACK",e.STARTAIM="STARTAIM"}(r||(r={}))},"./src/events/gameevent.ts":(e,t,n)=>{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{F:()=>i});var i=function e(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"type",void 0),r(this,"sequence",void 0)}},"./src/events/hitevent.ts":(e,t,n)=>{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{p:()=>i});var i=function e(t,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,e),r(this,"t",void 0),r(this,"key",void 0),this.t=t,this.key=n}},"./src/events/keyboard.ts":(e,t,n)=>{n.d(t,{s:()=>a});var r=n("./src/events/input.ts"),i=n("./node_modules/interactjs/dist/interact.min.js"),o=n.n(i);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=function(){var e;function t(e){var n=this;!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),s(this,"pressed",{}),s(this,"released",{}),s(this,"keydown",function(e){null==n.pressed[e.code]&&(n.pressed[e.code]=performance.now()),e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"keyup",function(e){n.released[e.code]=performance.now()-n.pressed[e.code],delete n.pressed[e.code],e.stopImmediatePropagation(),"F12"!==e.key&&e.preventDefault()}),s(this,"mousetouch",function(e){var t,r,i=n.released,o=e.client.yMath.abs(i.movementY)&&(i.movementY=0)}),this.addHandlers(e),/Android|iPhone/i.test(navigator.userAgent)||(e.contentEditable="true")}return e=[{key:"getEvents",value:function(){var e=this,t=Object.keys(this.pressed).filter(function(e){return!/Shift/.test(e)}).filter(function(e){return!/Control/.test(e)}),n=Object.keys(this.pressed).some(function(e){return/Shift/.test(e)}),i=Object.keys(this.pressed).some(function(e){return/Control/.test(e)}),o=[];return t.forEach(function(t){var s=performance.now()-e.pressed[t];o.push(new r.p(i?s/3:s,n?"Shift"+t:t)),"Space"!=t&&(e.pressed[t]=performance.now())}),Object.keys(this.released).forEach(function(t){return o.push(new r.p(e.released[t],t+"Up"))}),this.released={},o}},{key:"addHandlers",value:function(e){var t=this;e.addEventListener("keydown",this.keydown),e.addEventListener("keyup",this.keyup),e.focus(),o()(e).draggable({listeners:{move:function(e){t.mousetouch(e)}}}),o()(e).gesturable({onmove:function(e){e.dx/=3,t.mousetouch(e)}})}}],function(e,t){for(var n=0;n{n.d(t,{z:()=>h});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts"),o=n("./src/utils/utils.ts");function s(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t){for(var n=0;n{n.d(t,{x:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{n.d(t,{M:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,u),(t="foul")in(e=o(n=c.call(this)))?Object.defineProperty(e,t,{value:0,enumerable:!0,configurable:!0,writable:!0}):e[t]=0,n.type=i.B.STARTAIM,n.foul=r,n}return n=[{key:"applyToController",value:function(e){return e.handleStartAim(this)}}],r=[{key:"fromJson",value:function(e){return new u(e.foul)}}],n&&s(u.prototype,n),r&&s(u,r),u}(r.F)},"./src/events/stationaryevent.ts":(e,t,n)=>{n.d(t,{T:()=>a});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(a,e);var t,n,r=(t=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,n=o(a);return e=t?Reflect.construct(n,arguments,o(this).constructor):n.apply(this,arguments),e&&("object"==(e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)||"function"==typeof e)?e:function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this)});function a(){var e;return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,a),(e=r.call(this)).type=i.B.STATIONARY,e}return n=[{key:"applyToController",value:function(e){return e.handleStationary(this)}}],function(e,t){for(var n=0;n{n.d(t,{Q:()=>c});var r=n("./src/events/gameevent.ts"),i=n("./src/events/eventtype.ts");function o(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function s(e,t){for(var n=0;n{var r=n("./src/container/container.ts"),i=n("./src/events/keyboard.ts"),o=n("./src/events/eventtype.ts"),s=n("./src/events/aimevent.ts"),a=n("./src/events/watchevent.ts"),l=n("./src/events/hitevent.ts"),c=n("./src/events/abortevent.ts"),u=n("./src/events/breakevent.ts"),h=n("./src/events/beginevent.ts"),f=n("./src/events/chatevent.ts");function p(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,s),m(p(e=i.call(this)),"clientResendFrom",void 0),m(p(e),"serverResendFrom",void 0),e.type=o.B.REJOIN,e.clientResendFrom=t,e.serverResendFrom=n,e}return n=[{key:"applyToController",value:function(e){return e.handleRejoin(this)}}],r=[{key:"fromJson",value:function(e){return new s(e.clientResendFrom,e.serverResendFrom)}}],n&&d(s.prototype,n),r&&d(s,r),s}(n("./src/events/gameevent.ts").F),g=n("./src/events/placeballevent.ts"),w=n("./src/events/rerackevent.ts"),k=n("./src/events/startaimevent.ts"),T=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"serialise",value:function(e){return JSON.stringify(e)}},{key:"fromJson",value:function(e){switch(e.type){case o.B.BEGIN:return new h.u;case o.B.AIM:return s.w.fromJson(e);case o.B.BREAK:return u.W.fromJson(e);case o.B.WATCHAIM:return a.Q.fromJson(e.json);case o.B.HIT:return l.Q.fromJson(e);case o.B.CHAT:return f.b.fromJson(e);case o.B.REJOIN:return b.fromJson(e);case o.B.ABORT:return new c.h;case o.B.PLACEBALL:return g.z.fromJson(e);case o.B.RERACK:return w.x.fromJson(e);case o.B.STARTAIM:return k.M.fromJson(e);default:throw Error("Unknown GameEvent :"+e)}}},{key:"fromSerialised",value:function(e){var n=JSON.parse(e),r=t.fromJson(n);return"sequence"in n&&(r.sequence=n.sequence),r}}],function(e,t){for(var n=0;n upload high score \uD83C\uDFC6{n.d(t,{c:()=>d,U:()=>r});var r,i=n("./src/utils/utils.ts"),o=n("./src/model/physics/physics.ts"),s=n("./node_modules/three/build/three.module.js"),a=n("./src/model/physics/constants.ts");function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){var e;function t(e,n){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),l(this,"line",void 0),l(this,"geometry",void 0),l(this,"positions",void 0),l(this,"lastPos",new s.Pq0),l(this,"lastVel",new s.Pq0),this.geometry=new s.LoY,this.positions=new Float32Array(3*e),this.geometry.setAttribute("position",new s.THS(this.positions,3)),this.reset();var r=new s.mrM({color:n,opacity:.25,linewidth:3,transparent:!0});this.line=new s.N1A(this.geometry,r),this.line.visible=!1}return e=[{key:"reset",value:function(){this.geometry.setDrawRange(0,0),this.lastVel.setZ(1)}},{key:"forceTrace",value:function(e){this.lastVel.z=1,this.addTraceGiven(e,this.lastVel,1,.1,1)}},{key:"addTrace",value:function(e,t){if(0!==t.length()){var n=this.lastVel.angleTo(t),r=n>Math.PI/32?.01*a.R:a.R,i=this.lastPos.distanceTo(e);this.addTraceGiven(e,t,i,r,n)}}},{key:"addTraceGiven",value:function(e,t,n,r,i){var o=this.geometry.drawRange.count;0!==o&&n1&&i<1e-4&&o--,this.lastPos.copy(e),this.lastVel.copy(t),this.addPoint(e,o))}},{key:"addPoint",value:function(e,t){var n=3*t;n>this.positions.length||(this.positions[n++]=e.x,this.positions[n++]=e.y,this.positions[n]=e.z,this.geometry.setDrawRange(0,t+1),this.line.geometry.attributes.position.needsUpdate=!0)}}],function(e,t){for(var n=0;nMath.abs(this.rvel.z))&&(this.setStationary(),!0)}},{key:"setStationary",value:function(){this.vel.copy(i.v_),this.rvel.copy(i.v_),this.state="Stationary"}},{key:"isRolling",value:function(){return 0!==this.vel.lengthSq()&&0!==this.rvel.lengthSq()&&(0,o.Mq)(this.vel,this.rvel).length(){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{P:()=>o}),!function(e){e.Pot="Pot",e.Cushion="Cushion",e.Collision="Collision",e.Hit="Hit"}(i||(i={}));var i,o=function(){var e;function t(e,n,i,o){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t),r(this,"type",void 0),r(this,"timestamp",void 0),r(this,"ballA",null),r(this,"ballB",null),r(this,"incidentSpeed",void 0),this.type=e,this.ballA=n,this.ballB=i,this.incidentSpeed=o,this.timestamp=Date.now()}return e=[{key:"pot",value:function(e,n){return new t("Pot",e,e,n)}},{key:"cushion",value:function(e,n){return new t("Cushion",e,e,n)}},{key:"collision",value:function(e,n,r){return new t("Collision",e,n,r)}},{key:"hit",value:function(e,n){return new t("Hit",e,e,n)}},{key:"isCueBallPotted",value:function(e,t){return t.some(function(t){return"Pot"==t.type&&t.ballA===e})}},{key:"isBallPottedNoFoul",value:function(e,n){return n.some(function(e){return"Pot"==e.type&&null!==e.ballA})&&!t.isCueBallPotted(e,n)}},{key:"pots",value:function(e){return e.filter(function(e){return"Pot"==e.type}).map(function(e){return e.ballA})}},{key:"potCount",value:function(e){return this.pots(e).length}},{key:"onlyRedsPotted",value:function(e){return this.pots(e).every(function(e){return e.id>6})}},{key:"firstCollision",value:function(e){var t=e.filter(function(e){return"Collision"===e.type});return t.length>0?t[0]:void 0}},{key:"isClearTable",value:function(e){var t=e.balls.filter(function(e){return e.onTable()});return 1===t.length&&t[0]===e.cueball}},{key:"isThreeCushionPoint",value:function(e,n){n=t.cueBallFirst(e,n).filter(function(t){return t.ballA===e});var r=new Set,i=0,o=!0,s=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(o=(l=c.next()).done);o=!0){var u=l.value;if("Cushion"===u.type&&i++,"Collision"===u.type&&(r.add(u.ballB),2===r.size))return i>=3}}catch(e){s=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(s)throw a}}return!1}},{key:"cueBallFirst",value:function(e,t){return t.forEach(function(t){"Collision"===t.type&&t.ballB===e&&(t.ballB=t.ballA,t.ballA=e)}),t}}],function(e,t){for(var n=0;n{n.d(t,{I:()=>o,Mz:()=>r,Qg:()=>v,R:()=>f,Wv:()=>b,Ys:()=>g,cM:()=>w,e:()=>p,g:()=>s,gT:()=>c,gf:()=>l,jG:()=>m,kL:()=>u,kM:()=>k,m:()=>h,mu:()=>a,x3:()=>i,xO:()=>y});var r,i,o,s=9.8,a=.00985,l=.15,c=.8,u=.024,h=.23,f=.03275,p=.86;function d(){r=a*h*s*2/3*u,i=7/(5*Math.sqrt(2))*f*a*h*s,o=.4*h*f*f}function m(e){f=e,d()}function v(e){h=e,d()}function y(e){a=e,d()}function b(e){u=e,d()}function g(e){l=e}function w(e){p=e}function k(e){c=e}d()},"./src/model/physics/knuckle.ts":(e,t,n)=>{n.d(t,{O:()=>a});var r=n("./src/model/physics/constants.ts"),i=n("./src/view/pocketgeometry.ts");function o(e,t){for(var n=0;n{n.d(t,{$8:()=>x,Gp:()=>g,JD:()=>u,Mq:()=>a,QK:()=>f,QV:()=>P,Un:()=>b,c0:()=>y,lx:()=>h,p2:()=>c,s0:()=>v,t6:()=>S,yO:()=>w});var r=n("./node_modules/three/build/three.module.js"),i=n("./src/utils/utils.ts"),o=n("./src/model/physics/constants.ts"),s=new r.Pq0;function a(e,t){return s.copy(e).addScaledVector((0,i.KM)(t),o.R)}var l={v:new r.Pq0,w:new r.Pq0};function c(e,t){var n=a(e,t).setZ(0);return l.v.copy((0,i.xb)(n).multiplyScalar(-o.gf*o.g)),l.w.copy((0,i.xb)((0,i.KM)(n)).multiplyScalar(2.5*o.gf*o.g/o.R)),l.w.setZ(-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(t.z)),l}function u(e){var t=new r.Pq0(e.x,e.y,0).length(),n=5/7*o.x3/(o.m*o.R)/t,i=5/7*o.x3/(o.m*o.R*o.R)/t;return l.v.set(-n*e.y,n*e.x,0),l.w.set(-i*e.x,-i*e.y,-2.5*(o.Mz/(o.m*o.R*o.R))*Math.sign(e.z)),l}function h(e,t){var n=t.z;t.copy((0,i.KM)(e).multiplyScalar(1/o.R)),t.setZ(n)}function f(e,t,n,r){var o=r(t.clone().applyAxisAngle(i.up,e),n.clone().applyAxisAngle(i.up,e));return o.v.applyAxisAngle(i.up,-e),o.w.applyAxisAngle(i.up,-e),o}Object.freeze(l);var p=Math.asin(.1*o.R/o.R),d=Math.sin(p),m=Math.cos(p);function v(e,t){return new r.Pq0(e.x*d-e.z*m+o.R*t.y,-e.y-o.R*t.z*m+o.R*t.x*d)}function y(e){return e.x*m}function b(e){var t=3.5/o.m;return e.length()/t}function g(e){var t,n=1/o.m,i=.39+.257*(t=new r.Pq0(e/m,0,0)).x-.044*t.x*t.x;return o.gT*((1+i)*e)/n}function w(e,t){var n=g(y(e));return b(v(e,t))<=n}function k(e,t){return{c:y(e),s:v(e,t),A:3.5/o.m,B:1/o.m}}function T(e,t){var n=k(e,t),r=n.c,i=n.s,s=n.A,a=n.B,l=(1+o.e)*(r/a);return A(-i.x/s*d-l*m,i.y/s,i.x/s*m-l*d)}function R(e,t){var n=k(e,t),r=n.c,i=n.B,s=(1+o.e)*(r/i),a=.471-.241*Math.atan2(Math.abs(e.y),e.x),l=Math.atan2(e.y,e.x),c=Math.cos(l);return A(-a*s*c*m-s*m,a*s*Math.sin(l),a*s*c*m-s*d)}function P(e,t){return w(e,t)?T(e,t):R(e,t)}function x(e,t){var n=T(e,t),r=R(e,t),i=Math.sign(e.y)===Math.sign(t.z)?Math.cos(Math.atan2(e.y,e.x)):1;return{v:r.v.lerp(n.v,i),w:r.w.lerp(n.w,i)}}function A(e,t,n){return{v:new r.Pq0(e/o.m,t/o.m),w:new r.Pq0(-o.R/o.I*t*d,o.R/o.I*(e*d-n*m),o.R/o.I*t*m)}}function S(e,t){var n=Math.atan2(-e.x,e.y),r=2.5*t.length()*(e.length()*o.R)/(o.R*o.R),s=t.clone().normalize();return(0,i.KM)(s).applyAxisAngle(s,n).multiplyScalar(r)}},"./src/model/physics/pocket.ts":(e,t,n)=>{n.d(t,{Z:()=>l});var r=n("./src/model/ball.ts"),i=n("./src/model/physics/constants.ts"),o=n("./src/utils/utils.ts");function s(e,t){for(var n=0;nthis.radius-i.R){var s=this.pos.clone().sub(e.pos).normalize().setZ(0);n>-i.R/2&&e.vel.addScaledVector(s,7*i.R*t*i.g),0>e.vel.dot(s)&&(e.ballmesh.trace.forceTrace(e.pos),e.vel.x=s.x*e.vel.length()/2,e.vel.y=s.y*e.vel.length()/2)}var a=this.restingDepth(e);n{n.d(t,{X:()=>b});var r=n("./src/view/tablegeometry.ts"),i=n("./src/model/physics/physics.ts"),o=n("./src/view/pocketgeometry.ts"),s=function(){var e;function t(){!function(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}(this,t)}return e=[{key:"bounceAny",value:function(e,n){var o=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i.$8,a=e.futurePosition(n);if(t.willBounceLong(a,o)){var l=a.y>r.P.tableY?-Math.PI/2:Math.PI/2;return t.bounceIn(l,e,s)}if(t.willBounceShort(a,o)){var c=a.x>r.P.tableX?0:Math.PI;return t.bounceIn(c,e,s)}}},{key:"willBounceShort",value:function(e,n){return n?t.willBounceShortSegment(o.f.pockets.pocketNW.knuckleSW.pos.y,o.f.pockets.pocketSW.knuckleNW.pos.y,e):t.willBounceShortSegment(r.P.Y,-r.P.Y,e)}},{key:"willBounceLong",value:function(e,n){return n?t.willBounceLongSegment(o.f.pockets.pocketNW.knuckleNE.pos.x,o.f.pockets.pocketN.knuckleNW.pos.x,e)||t.willBounceLongSegment(o.f.pockets.pocketN.knuckleNE.pos.x,o.f.pockets.pocketNE.knuckleNW.pos.x,e):t.willBounceLongSegment(-r.P.X,r.P.X,e)}},{key:"willBounceLongSegment",value:function(e,t,n){return n.x>e&&n.xr.P.tableY}},{key:"willBounceShortSegment",value:function(e,t,n){return n.y>t&&n.yr.P.tableX}},{key:"bounceIn",value:function(e,t,n){t.ballmesh.trace.forceTrace(t.futurePos);var r=(0,i.QK)(e,t.vel,t.rvel,n);return t.vel.add(r.v),t.rvel.add(r.w),r.v.length()}}],function(e,t){for(var n=0;n100)throw Error("Depth exceeded resolving collisions");this.balls.forEach(function(t){t.update(e)})}},{key:"prepareAdvanceAll",value:function(e){var t=this;return this.pairs.every(function(n){return t.prepareAdvancePair(n.a,n.b,e)})&&this.balls.every(function(n){return t.prepareAdvanceToCushions(n,e)})}},{key:"prepareAdvancePair",value:function(e,t,n){if(c.willCollide(e,t,n)){var r=c.collide(e,t);return this.outcome.push(d.P.collision(e,t,r)),!1}return!0}},{key:"prepareAdvanceToCushions",value:function(e,t){if(!e.onTable())return!0;var n=e.futurePosition(t);if(Math.abs(n.y)1&&void 0!==arguments[1]?arguments[1]:this.cueball;return this.balls.filter(function(e){return e!==t}).some(function(t){return t.pos.distanceTo(e)<2*l.R})}}],t=[{key:"fromSerialised",value:function(e){var t=new n(e.balls.map(function(e){return a.c.fromSerialised(e)}));return t.updateFromSerialised(e),t}}],e&&v(n.prototype,e),t&&v(n,t),n}()},"./src/utils/gltf.ts":(e,t,n)=>{let r,i,o,s;n.d(t,{KP:()=>e_,Ro:()=>eI});var a=n("./node_modules/three/build/three.module.js");function l(e,t=1/0,n=null){i||(i=new a.bdM(2,2,1,1)),o||(o=new a.BKk({uniforms:{blitTexture:new a.nc$(e)},vertexShader:` varying vec2 vUv; void main(){ vUv = uv; diff --git a/package.json b/package.json index d5ffc344..0b3c3a66 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@testing-library/dom": "10.1.0", "@types/chai": "4.3.16", "@types/jest": "^29.5.12", - "@types/node": "20.14.2", + "@types/node": "20.14.5", "@types/three": "0.165.0", "chai": "4.x", "ini": "4.1.3", diff --git a/src/events/recorder.ts b/src/events/recorder.ts index 7a59cc9a..5663cb97 100644 --- a/src/events/recorder.ts +++ b/src/events/recorder.ts @@ -143,15 +143,7 @@ export class Recorder { currentBreak.score = breakScore const text = `break(${breakScore})` const serialisedShot = JSON.stringify(currentBreak) - console.log(`raw:${serialisedShot}`) const compressed = JSONCrush.crush(serialisedShot) - console.log(`crushed:${compressed}`) - console.log(`encoded:${encodeURIComponent(compressed)}`) - console.log(`decoded:${decodeURIComponent(encodeURIComponent(compressed))}`) - - const uncompressed = JSONCrush.uncrush(decodeURIComponent(encodeURIComponent(compressed))) - console.log(`uncompressed:${uncompressed}`) - console.log(serialisedShot == uncompressed) this.generateLink(text, compressed, "black") if (breakScore >= 4) { this.generateHiScoreLink(compressed) @@ -171,8 +163,7 @@ export class Recorder { } private generateLink(text, state, colour) { - const shotUri = `${this.replayUrl}${encodeURIComponent(state)}` - console.log(`encoded:${shotUri}`) + const shotUri = `${this.replayUrl}${this.fullyEncodeURI(state)}` const shotLink = `${text}` this.container.eventQueue.push(new ChatEvent(null, `${shotLink}`)) } @@ -181,8 +172,16 @@ export class Recorder { const text = "hi score 🏆" const shotUri = `${this.hiScoreUrl}?ruletype=${ this.container.rules.rulename - }&state=${encodeURIComponent(state)}` + }&state=${this.fullyEncodeURI(state)}` const shotLink = `${text}` this.container.eventQueue.push(new ChatEvent(null, `${shotLink}`)) } + + private fullyEncodeURI(uri) { + return encodeURIComponent(uri) + .replace(/\(/g,'%28') + .replace(/\)/g,'%29') + .replace(/\!/g,'%21') + .replace(/\*/g,'%2A') + } } diff --git a/yarn.lock b/yarn.lock index 64e447c4..ed71486f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -957,10 +957,10 @@ dependencies: undici-types "~5.26.4" -"@types/node@20.14.2": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== +"@types/node@20.14.5": + version "20.14.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.5.tgz#fe35e3022ebe58b8f201580eb24e1fcfc0f2487d" + integrity sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA== dependencies: undici-types "~5.26.4"