From 325dbfb79cbffceb9f21bb8879c3874556550679 Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 1 Jan 2023 20:18:35 +0800 Subject: [PATCH] A temp broken commit except for OfflineMap - drafted basic cancellable skills. --- frontend/assets/plugin_scripts/jsexport.js | 6201 ++++++++++++++++- .../resources/animation/MonkGirl/Atk1.anim | 10 +- .../resources/animation/MonkGirl/Atk2.anim | 79 + .../animation/MonkGirl/Atk2.anim.meta | 5 + .../resources/animation/MonkGirl/Atk3.anim | 85 + .../animation/MonkGirl/Atk3.anim.meta | 5 + .../animation/MonkGirl/MonkGirl.plist | 551 +- .../animation/MonkGirl/MonkGirl.plist.meta | 852 ++- .../resources/animation/MonkGirl/MonkGirl.png | Bin 76232 -> 95461 bytes frontend/assets/resources/map/dungeon/map.tmx | 4 +- .../prefabs/ControlledCharacter.prefab | 8 +- frontend/assets/scripts/AttackingCharacter.js | 2 + frontend/assets/scripts/Map.js | 15 +- frontend/assets/scripts/OfflineMap.js | 23 +- jsexport/battle/battle.go | 134 +- jsexport/battle/characterConfig.go | 90 +- jsexport/battle/room_downsync_frame.go | 9 +- jsexport/main.go | 8 +- 18 files changed, 7682 insertions(+), 399 deletions(-) create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk2.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk3.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index a973b99..601ee24 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,15 +2,6200 @@ (function() { var $goVersion = "go1.18.6"; -Error.stackTraceLimit=1/0;var $global,$module,$NaN=NaN;if("undefined"!=typeof window?$global=window:"undefined"!=typeof self?$global=self:"undefined"!=typeof global?($global=global).require=require:$global=this,void 0===$global||void 0===$global.Array)throw new Error("no global object found");if("undefined"!=typeof module&&($module=module),!$global.fs&&$global.require)try{var fs=$global.require("fs");"object"==typeof fs&&null!==fs&&0!==Object.keys(fs).length&&($global.fs=fs)}catch(e){}if(!$global.fs){var outputBuf="",decoder=new TextDecoder("utf-8");$global.fs={constants:{O_WRONLY:-1,O_RDWR:-1,O_CREAT:-1,O_TRUNC:-1,O_APPEND:-1,O_EXCL:-1},writeSync:function(e,n){var r=(outputBuf+=decoder.decode(n)).lastIndexOf("\n");return-1!=r&&(console.log(outputBuf.substr(0,r)),outputBuf=outputBuf.substr(r+1)),n.length},write:function(e,n,r,t,i,a){0===r&&t===n.length&&null===i?a(null,this.writeSync(e,n)):a(enosys())}}}var $throwRuntimeError,$linknames={},$packages={},$idCounter=0,$keys=function(e){return e?Object.keys(e):[]},$flushConsole=function(){},$throwNilPointerError=function(){$throwRuntimeError("invalid memory address or nil pointer dereference")},$call=function(e,n,r){return e.apply(n,r)},$makeFunc=function(e){return function(){return $externalize(e(this,new($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments,[]))),$emptyInterface)}},$unused=function(e){},$print=console.log;if(void 0!==$global.process&&$global.require)try{var util=$global.require("util");$print=function(){$global.process.stderr.write(util.format.apply(this,arguments))}}catch(e){}var $println=console.log,$initAllLinknames=function(){for(var e=$keys($packages),n=0;ne.$capacity||t>e.$capacity)&&$throwRuntimeError("slice bounds out of range"),e===e.constructor.nil)return e;var i=new e.constructor(e.$array);return i.$offset=e.$offset+n,i.$length=r-n,i.$capacity=t-n,i},$substring=function(e,n,r){return(n<0||re.length)&&$throwRuntimeError("slice bounds out of range"),e.substring(n,r)},$sliceToNativeArray=function(e){return e.$array.constructor!==Array?e.$array.subarray(e.$offset,e.$offset+e.$length):e.$array.slice(e.$offset,e.$offset+e.$length)},$sliceToGoArray=function(e,n){var r=n.elem;return void 0!==r&&e.$length1114111||55296<=e&&e<=57343)&&(e=65533),e<=127?String.fromCharCode(e):e<=2047?String.fromCharCode(192|e>>6,128|63&e):e<=65535?String.fromCharCode(224|e>>12,128|e>>6&63,128|63&e):String.fromCharCode(240|e>>18,128|e>>12&63,128|e>>6&63,128|63&e)},$stringToBytes=function(e){for(var n=new Uint8Array(e.length),r=0;rt){for(var o=i-1;o>=0;o--)a.copy(e[r+o],n[t+o]);return}for(o=0;ot)for(o=i-1;o>=0;o--)e[r+o]=n[t+o];else for(o=0;oc)if(a=0,c=Math.max(o,e.$capacity<1024?2*e.$capacity:Math.floor(5*e.$capacity/4)),e.$array.constructor===Array){(i=e.$array.slice(e.$offset,e.$offset+e.$length)).length=c;for(var $=e.constructor.elem.zero,u=e.$length;u>>16&65535)*t+r*(n>>>16&65535)<<16>>>0)>>0},$floatKey=function(e){return e!=e?"NaN$"+ ++$idCounter:String(e)},$flatten64=function(e){return 4294967296*e.$high+e.$low},$shiftLeft64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high<>>32-n,e.$low<>>0):n<64?new e.constructor(e.$low<>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(e.$high>>31,e.$high>>n-32>>>0):e.$high<0?new e.constructor(-1,4294967295):new e.constructor(0,0)},$shiftRightUint64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high>>>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(0,e.$high>>>n-32):new e.constructor(0,0)},$mul64=function(e,n){var r=e.$high>>>16,t=65535&e.$high,i=e.$low>>>16,a=65535&e.$low,o=n.$high>>>16,c=65535&n.$high,$=n.$low>>>16,u=65535&n.$low,l=0,s=0,f=0,d=0;f+=(d+=a*u)>>>16,s+=(f+=i*u)>>>16,f&=65535,s+=(f+=a*$)>>>16,l+=(s+=t*u)>>>16,s&=65535,l+=(s+=i*$)>>>16,s&=65535,l+=(s+=a*c)>>>16,l+=r*u+t*$+i*c+a*o;var p=((l&=65535)<<16|(s&=65535))>>>0,h=((f&=65535)<<16|(d&=65535))>>>0;return new e.constructor(p,h)},$div64=function(e,n,r){0===n.$high&&0===n.$low&&$throwRuntimeError("integer divide by zero");var t=1,i=1,a=e.$high,o=e.$low;a<0&&(t=-1,i=-1,a=-a,0!==o&&(a--,o=4294967296-o));var c=n.$high,$=n.$low;n.$high<0&&(t*=-1,c=-c,0!==$&&(c--,$=4294967296-$));for(var u=0,l=0,s=0;c<2147483648&&(a>c||a===c&&o>$);)c=(c<<1|$>>>31)>>>0,$=$<<1>>>0,s++;for(var f=0;f<=s;f++)u=u<<1|l>>>31,l=l<<1>>>0,(a>c||a===c&&o>=$)&&(a-=c,(o-=$)<0&&(a--,o+=4294967296),4294967296===++l&&(u++,l=0)),$=($>>>1|c<<31)>>>0,c>>>=1;return r?new e.constructor(a*i,o*i):new e.constructor(u*t,l*t)},$divComplex=function(e,n){var r=e.$real===1/0||e.$real===-1/0||e.$imag===1/0||e.$imag===-1/0,t=n.$real===1/0||n.$real===-1/0||n.$imag===1/0||n.$imag===-1/0,i=!r&&(e.$real!=e.$real||e.$imag!=e.$imag),a=!t&&(n.$real!=n.$real||n.$imag!=n.$imag);if(i||a)return new e.constructor(NaN,NaN);if(r&&!t)return new e.constructor(1/0,1/0);if(!r&&t)return new e.constructor(0,0);if(0===n.$real&&0===n.$imag)return 0===e.$real&&0===e.$imag?new e.constructor(NaN,NaN):new e.constructor(1/0,1/0);if(Math.abs(n.$real)<=Math.abs(n.$imag)){var o=n.$real/n.$imag,c=n.$real*o+n.$imag;return new e.constructor((e.$real*o+e.$imag)/c,(e.$imag*o-e.$real)/c)}o=n.$imag/n.$real,c=n.$imag*o+n.$real;return new e.constructor((e.$imag*o+e.$real)/c,(e.$imag-e.$real*o)/c)},$kindBool=1,$kindInt=2,$kindInt8=3,$kindInt16=4,$kindInt32=5,$kindInt64=6,$kindUint=7,$kindUint8=8,$kindUint16=9,$kindUint32=10,$kindUint64=11,$kindUintptr=12,$kindFloat32=13,$kindFloat64=14,$kindComplex64=15,$kindComplex128=16,$kindArray=17,$kindChan=18,$kindFunc=19,$kindInterface=20,$kindMap=21,$kindPtr=22,$kindSlice=23,$kindString=24,$kindStruct=25,$kindUnsafePointer=26,$methodSynthesizers=[],$addMethodSynthesizer=function(e){null!==$methodSynthesizers?$methodSynthesizers.push(e):e()},$synthesizeMethods=function(){$methodSynthesizers.forEach(function(e){e()}),$methodSynthesizers=null},$ifaceKeyFor=function(e){if(e===$ifaceNil)return"nil";var n=e.constructor;return n.string+"$"+n.keyFor(e.$val)},$identity=function(e){return e},$typeIDCounter=0,$idKey=function(e){return void 0===e.$id&&($idCounter++,e.$id=$idCounter),String(e.$id)},$arrayPtrCtor=function(){return function(e){this.$get=function(){return e},this.$set=function(e){typ.copy(this,e)},this.$val=e}},$newType=function(e,n,r,t,i,a,o){var c;switch(n){case $kindBool:case $kindInt:case $kindInt8:case $kindInt16:case $kindInt32:case $kindUint:case $kindUint8:case $kindUint16:case $kindUint32:case $kindUintptr:case $kindUnsafePointer:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$identity;break;case $kindString:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return"$"+e};break;case $kindFloat32:case $kindFloat64:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return $floatKey(e)};break;case $kindInt64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindUint64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindComplex64:(c=function(e,n){this.$real=$fround(e),this.$imag=$fround(n),this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindComplex128:(c=function(e,n){this.$real=e,this.$imag=n,this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindArray:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,"",!1,$arrayPtrCtor()),c.init=function(e,n){c.elem=e,c.len=n,c.comparable=e.comparable,c.keyFor=function(n){return Array.prototype.join.call($mapArray(n,function(n){return String(e.keyFor(n)).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}),"$")},c.copy=function(n,r){$copyArray(n,r,0,0,r.length,e)},c.ptr.init(c),Object.defineProperty(c.ptr.nil,"nilCheck",{get:$throwNilPointerError})};break;case $kindChan:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$idKey,c.init=function(e,n,r){c.elem=e,c.sendOnly=n,c.recvOnly=r};break;case $kindFunc:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n,r){c.params=e,c.results=n,c.variadic=r,c.comparable=!1};break;case $kindInterface:(c={implementedBy:{},missingMethodFor:{}}).keyFor=$ifaceKeyFor,c.init=function(e){c.methods=e,e.forEach(function(e){$ifaceNil[e.prop]=$throwNilPointerError})};break;case $kindMap:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n){c.key=e,c.elem=n,c.comparable=!1};break;case $kindPtr:(c=o||function(e,n,r){this.$get=e,this.$set=n,this.$target=r,this.$val=this}).keyFor=$idKey,c.init=function(e){c.elem=e,c.wrapped=e.kind===$kindArray,c.nil=new c($throwNilPointerError,$throwNilPointerError)};break;case $kindSlice:(c=function(e){e.constructor!==c.nativeArray&&(e=new c.nativeArray(e)),this.$array=e,this.$offset=0,this.$length=e.length,this.$capacity=e.length,this.$val=this}).init=function(e){c.elem=e,c.comparable=!1,c.nativeArray=$nativeArray(e.kind),c.nil=new c([])};break;case $kindStruct:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,i,a,o),c.ptr.elem=c,c.ptr.prototype.$get=function(){return this},c.ptr.prototype.$set=function(e){c.copy(this,e)},c.init=function(e,n){c.pkgPath=e,c.fields=n,n.forEach(function(e){e.typ.comparable||(c.comparable=!1)}),c.keyFor=function(e){var r=e.$val;return $mapArray(n,function(e){return String(e.typ.keyFor(r[e.prop])).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}).join("$")},c.copy=function(e,r){for(var t=0;t0;){var a=[],o=[];t.forEach(function(e){if(!i[e.typ.string])switch(i[e.typ.string]=!0,e.typ.named&&(o=o.concat(e.typ.methods),e.indirect&&(o=o.concat($ptrType(e.typ).methods))),e.typ.kind){case $kindStruct:e.typ.fields.forEach(function(n){if(n.embedded){var r=n.typ,t=r.kind===$kindPtr;a.push({typ:t?r.elem:r,indirect:e.indirect||t})}});break;case $kindInterface:o=o.concat(e.typ.methods)}}),o.forEach(function(e){void 0===n[e.name]&&(n[e.name]=e)}),t=a}return e.methodSetCache=[],Object.keys(n).sort().forEach(function(r){e.methodSetCache.push(n[r])}),e.methodSetCache},$Bool=$newType(1,$kindBool,"bool",!0,"",!1,null),$Int=$newType(4,$kindInt,"int",!0,"",!1,null),$Int8=$newType(1,$kindInt8,"int8",!0,"",!1,null),$Int16=$newType(2,$kindInt16,"int16",!0,"",!1,null),$Int32=$newType(4,$kindInt32,"int32",!0,"",!1,null),$Int64=$newType(8,$kindInt64,"int64",!0,"",!1,null),$Uint=$newType(4,$kindUint,"uint",!0,"",!1,null),$Uint8=$newType(1,$kindUint8,"uint8",!0,"",!1,null),$Uint16=$newType(2,$kindUint16,"uint16",!0,"",!1,null),$Uint32=$newType(4,$kindUint32,"uint32",!0,"",!1,null),$Uint64=$newType(8,$kindUint64,"uint64",!0,"",!1,null),$Uintptr=$newType(4,$kindUintptr,"uintptr",!0,"",!1,null),$Float32=$newType(4,$kindFloat32,"float32",!0,"",!1,null),$Float64=$newType(8,$kindFloat64,"float64",!0,"",!1,null),$Complex64=$newType(8,$kindComplex64,"complex64",!0,"",!1,null),$Complex128=$newType(16,$kindComplex128,"complex128",!0,"",!1,null),$String=$newType(8,$kindString,"string",!0,"",!1,null),$UnsafePointer=$newType(4,$kindUnsafePointer,"unsafe.Pointer",!0,"unsafe",!1,null),$nativeArray=function(e){switch(e){case $kindInt:return Int32Array;case $kindInt8:return Int8Array;case $kindInt16:return Int16Array;case $kindInt32:return Int32Array;case $kindUint:return Uint32Array;case $kindUint8:return Uint8Array;case $kindUint16:return Uint16Array;case $kindUint32:case $kindUintptr:return Uint32Array;case $kindFloat32:return Float32Array;case $kindFloat64:return Float64Array;default:return Array}},$toNativeArray=function(e,n){var r=$nativeArray(e);return r===Array?n:new r(n)},$arrayTypes={},$arrayType=function(e,n){var r=e.id+"$"+n,t=$arrayTypes[r];return void 0===t&&(t=$newType(12,$kindArray,"["+n+"]"+e.string,!1,"",!1,null),$arrayTypes[r]=t,t.init(e,n)),t},$chanType=function(e,n,r){var t=(r?"<-":"")+"chan"+(n?"<- ":" ");n||r||"<"!=e.string[0]?t+=e.string:t+="("+e.string+")";var i=n?"SendChan":r?"RecvChan":"Chan",a=e[i];return void 0===a&&(a=$newType(4,$kindChan,t,!1,"",!1,null),e[i]=a,a.init(e,n,r)),a},$Chan=function(e,n){(n<0||n>2147483647)&&$throwRuntimeError("makechan: size out of range"),this.$elem=e,this.$capacity=n,this.$buffer=[],this.$sendQueue=[],this.$recvQueue=[],this.$closed=!1},$chanNil=new $Chan(null,0);$chanNil.$sendQueue=$chanNil.$recvQueue={length:0,push:function(){},shift:function(){},indexOf:function(){return-1}};var $funcTypes={},$funcType=function(e,n,r){var t=$mapArray(e,function(e){return e.id}).join(",")+"$"+$mapArray(n,function(e){return e.id}).join(",")+"$"+r,i=$funcTypes[t];if(void 0===i){var a=$mapArray(e,function(e){return e.string});r&&(a[a.length-1]="..."+a[a.length-1].substr(2));var o="func("+a.join(", ")+")";1===n.length?o+=" "+n[0].string:n.length>1&&(o+=" ("+$mapArray(n,function(e){return e.string}).join(", ")+")"),i=$newType(4,$kindFunc,o,!1,"",!1,null),$funcTypes[t]=i,i.init(e,n,r)}return i},$interfaceTypes={},$interfaceType=function(e){var n=$mapArray(e,function(e){return e.pkg+","+e.name+","+e.typ.id}).join("$"),r=$interfaceTypes[n];if(void 0===r){var t="interface {}";0!==e.length&&(t="interface { "+$mapArray(e,function(e){return(""!==e.pkg?e.pkg+".":"")+e.name+e.typ.string.substr(4)}).join("; ")+" }"),r=$newType(8,$kindInterface,t,!1,"",!1,null),$interfaceTypes[n]=r,r.init(e)}return r},$emptyInterface=$interfaceType([]),$ifaceNil={},$error=$newType(8,$kindInterface,"error",!0,"",!1,null);$error.init([{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],!1)}]);var $panicValue,$jsObjectPtr,$jsErrorPtr,$mapTypes={},$mapType=function(e,n){var r=e.id+"$"+n.id,t=$mapTypes[r];return void 0===t&&(t=$newType(4,$kindMap,"map["+e.string+"]"+n.string,!1,"",!1,null),$mapTypes[r]=t,t.init(e,n)),t},$makeMap=function(e,n){for(var r={},t=0;t2147483647)&&$throwRuntimeError("makeslice: len out of range"),(r<0||r2147483647)&&$throwRuntimeError("makeslice: cap out of range");var t=new e.nativeArray(r);if(e.nativeArray===Array)for(var i=0;i4||t<0)break}}finally{0==$scheduled.length&&clearTimeout(e)}},$schedule=function(e){e.asleep&&(e.asleep=!1,$awakeGoroutines++),$scheduled.push(e),$curGoroutine===$noGoroutine&&$runScheduled()},$setTimeout=function(e,n){return $awakeGoroutines++,setTimeout(function(){$awakeGoroutines--,e()},n)},$block=function(){$curGoroutine===$noGoroutine&&$throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"),$curGoroutine.asleep=!0},$restore=function(e,n){return void 0!==e&&void 0!==e.$blk?e:n},$send=function(e,n){e.$closed&&$throwRuntimeError("send on closed channel");var r=e.$recvQueue.shift();if(void 0===r){if(!(e.$buffer.length65535){var l=Math.floor((u-65536)/1024)+55296,s=(u-65536)%1024+56320;$+=String.fromCharCode(l,s)}else $+=String.fromCharCode(u)}return $;case $kindStruct:var f=$packages.time;if(void 0!==f&&e.constructor===f.Time.ptr){var d=$div64(e.UnixNano(),new $Int64(0,1e6));return new Date($flatten64(d))}var p={},h=function(e,n){if(n===$jsObjectPtr)return e;switch(n.kind){case $kindPtr:return e===n.nil?p:h(e.$get(),n.elem);case $kindStruct:var r=n.fields[0];return h(e[r.prop],r.typ);case $kindInterface:return h(e.$val,e.constructor);default:return p}},k=h(e,n);if(k!==p)return k;if(void 0!==r)return r(e);k={};for(a=0;a>24;case $kindInt16:return parseInt(e)<<16>>16;case $kindInt32:return parseInt(e)>>0;case $kindUint:return parseInt(e);case $kindUint8:return parseInt(e)<<24>>>24;case $kindUint16:return parseInt(e)<<16>>>16;case $kindUint32:case $kindUintptr:return parseInt(e)>>>0;case $kindInt64:case $kindUint64:return new n(0,e);case $kindFloat32:case $kindFloat64:return parseFloat(e);case $kindArray:return e.length!==n.len&&$throwRuntimeError("got array with wrong size from JavaScript native"),$mapArray(e,function(e){return $internalize(e,n.elem,i)});case $kindFunc:return function(){for(var t=[],a=0;a=128)return!1;return!0}; +Error.stackTraceLimit = Infinity; -$packages["github.com/gopherjs/gopherjs/js"]=(function(){var $pkg={},$init,A,B,J,K,M,O,P,Q,R,S,T,G,H,L;A=$pkg.Object=$newType(0,$kindStruct,"js.Object",true,"github.com/gopherjs/gopherjs/js",true,function(object_){this.$val=this;if(arguments.length===0){this.object=null;return;}this.object=object_;});B=$pkg.Error=$newType(0,$kindStruct,"js.Error",true,"github.com/gopherjs/gopherjs/js",true,function(Object_){this.$val=this;if(arguments.length===0){this.Object=null;return;}this.Object=Object_;});J=$pkg.M=$newType(4,$kindMap,"js.M",true,"github.com/gopherjs/gopherjs/js",true,null);K=$pkg.S=$newType(12,$kindSlice,"js.S",true,"github.com/gopherjs/gopherjs/js",true,null);M=$sliceType($emptyInterface);O=$ptrType(A);P=$sliceType(O);Q=$funcType([P],[O],true);R=$funcType([],[O],false);S=$funcType([O],[],false);T=$ptrType(B);A.ptr.prototype.Get=function(a){var a,b;b=this;return b.object[$externalize(a,$String)];};A.prototype.Get=function(a){return this.$val.Get(a);};A.ptr.prototype.Set=function(a,b){var a,b,c;c=this;c.object[$externalize(a,$String)]=$externalize(b,$emptyInterface);};A.prototype.Set=function(a,b){return this.$val.Set(a,b);};A.ptr.prototype.Delete=function(a){var a,b;b=this;delete b.object[$externalize(a,$String)];};A.prototype.Delete=function(a){return this.$val.Delete(a);};A.ptr.prototype.Length=function(){var a;a=this;return $parseInt(a.object.length);};A.prototype.Length=function(){return this.$val.Length();};A.ptr.prototype.Index=function(a){var a,b;b=this;return b.object[a];};A.prototype.Index=function(a){return this.$val.Index(a);};A.ptr.prototype.SetIndex=function(a,b){var a,b,c;c=this;c.object[a]=$externalize(b,$emptyInterface);};A.prototype.SetIndex=function(a,b){return this.$val.SetIndex(a,b);};A.ptr.prototype.Call=function(a,b){var a,b,c,d;c=this;return(d=c.object,d[$externalize(a,$String)].apply(d,$externalize(b,M)));};A.prototype.Call=function(a,b){return this.$val.Call(a,b);};A.ptr.prototype.Invoke=function(a){var a,b;b=this;return b.object.apply(undefined,$externalize(a,M));};A.prototype.Invoke=function(a){return this.$val.Invoke(a);};A.ptr.prototype.New=function(a){var a,b;b=this;return new($global.Function.prototype.bind.apply(b.object,[undefined].concat($externalize(a,M))));};A.prototype.New=function(a){return this.$val.New(a);};A.ptr.prototype.Bool=function(){var a;a=this;return!!(a.object);};A.prototype.Bool=function(){return this.$val.Bool();};A.ptr.prototype.String=function(){var a;a=this;return $internalize(a.object,$String);};A.prototype.String=function(){return this.$val.String();};A.ptr.prototype.Int=function(){var a;a=this;return $parseInt(a.object)>>0;};A.prototype.Int=function(){return this.$val.Int();};A.ptr.prototype.Int64=function(){var a;a=this;return $internalize(a.object,$Int64);};A.prototype.Int64=function(){return this.$val.Int64();};A.ptr.prototype.Uint64=function(){var a;a=this;return $internalize(a.object,$Uint64);};A.prototype.Uint64=function(){return this.$val.Uint64();};A.ptr.prototype.Float=function(){var a;a=this;return $parseFloat(a.object);};A.prototype.Float=function(){return this.$val.Float();};A.ptr.prototype.Interface=function(){var a;a=this;return $internalize(a.object,$emptyInterface);};A.prototype.Interface=function(){return this.$val.Interface();};A.ptr.prototype.Unsafe=function(){var a;a=this;return a.object;};A.prototype.Unsafe=function(){return this.$val.Unsafe();};B.ptr.prototype.Error=function(){var a;a=this;return"JavaScript error: "+$internalize(a.Object.message,$String);};B.prototype.Error=function(){return this.$val.Error();};B.ptr.prototype.Stack=function(){var a;a=this;return $internalize(a.Object.stack,$String);};B.prototype.Stack=function(){return this.$val.Stack();};G=function(a){var a,b,c,d,e,f;b=a;c=new($global.Object)();c.__internal_object__=b;d=b.constructor.methods;e=0;while(true){if(!(e<$parseInt(d.length))){break;}f=[f];f[0]=d[e];if(!($internalize(f[0].pkg,$String)==="")){e=e+(1)>>0;continue;}c[$externalize($internalize(f[0].name,$String),$String)]=$externalize((function(f){return function(g){var g;return $externalizeFunction(b[$externalize($internalize(f[0].prop,$String),$String)],f[0].typ,$externalize(true,$Bool)).apply(b,$externalize(g,P));};})(f),Q);e=e+(1)>>0;}return c;};$pkg.MakeWrapper=G;H=function(a){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=[b];c=[c];b[0]=a;d=b[0].constructor;c[0]=new($global.Object)();e=(function(b,c){return function(e,f){var e,f;$global.Object.defineProperty(c[0],$externalize(e,$String),$externalize(f,J));};})(b,c);$r=e("__internal_object__",$makeMap($String.keyFor,[{k:"value",v:new $jsObjectPtr(b[0])}]));$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}f=$internalize(d.string,$String);g=$internalize(d.pkg,$String);h="";if(f.charCodeAt(0)===42){h="*";}i=0;while(true){if(!(i>0));break;}i=i+(1)>>0;}j=g+"."+h+f;$r=e("$type",$makeMap($String.keyFor,[{k:"value",v:new $String(j)}]));$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}k=null;l=new($global.Array)();m=d.methods;if(!(m===undefined)){l=l.concat(m);}n=d.elem;if(!(n===undefined)){k=n.fields;l=l.concat(n.methods);}else{k=d.fields;}o=0;case 3:if(!(o<$parseInt(l.length))){$s=4;continue;}p=[p];p[0]=l[o];if(!($internalize(p[0].pkg,$String)==="")){o=o+(1)>>0;$s=3;continue;}$r=e($internalize(p[0].prop,$String),$makeMap($String.keyFor,[{k:"value",v:new Q((function(b,c,p){return function(q){var q;return $externalizeFunction(b[0][$externalize($internalize(p[0].prop,$String),$String)],p[0].typ,$externalize(true,$Bool),H).apply(b[0],$externalize(q,P));};})(b,c,p))}]));$s=5;case 5:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}o=o+(1)>>0;$s=3;continue;case 4:if(!(k===undefined)){$s=6;continue;}$s=7;continue;case 6:q=0;case 8:if(!(q<$parseInt(k.length))){$s=9;continue;}r=[r];r[0]=k[q];if(!!!(r[0].exported)){q=q+(1)>>0;$s=8;continue;}$r=e($internalize(r[0].prop,$String),$makeMap($String.keyFor,[{k:"get",v:new R((function(b,c,r){return function(){var s;s=$copyIfRequired(b[0].$val[$externalize($internalize(r[0].prop,$String),$String)],r[0].typ);return $externalize(s,r[0].typ,H);};})(b,c,r))},{k:"set",v:new S((function(b,c,r){return function(s){var s,t;t=$internalize(s,r[0].typ,H);b[0].$val[$externalize($internalize(r[0].prop,$String),$String)]=t;};})(b,c,r))}]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}q=q+(1)>>0;$s=8;continue;case 9:case 7:$s=-1;return c[0];}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s};return $f;};$pkg.MakeFullWrapper=H;L=function(){var a;a=new B.ptr(null);$unused(a);};O.methods=[{prop:"Get",name:"Get",pkg:"",typ:$funcType([$String],[O],false)},{prop:"Set",name:"Set",pkg:"",typ:$funcType([$String,$emptyInterface],[],false)},{prop:"Delete",name:"Delete",pkg:"",typ:$funcType([$String],[],false)},{prop:"Length",name:"Length",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Index",name:"Index",pkg:"",typ:$funcType([$Int],[O],false)},{prop:"SetIndex",name:"SetIndex",pkg:"",typ:$funcType([$Int,$emptyInterface],[],false)},{prop:"Call",name:"Call",pkg:"",typ:$funcType([$String,M],[O],true)},{prop:"Invoke",name:"Invoke",pkg:"",typ:$funcType([M],[O],true)},{prop:"New",name:"New",pkg:"",typ:$funcType([M],[O],true)},{prop:"Bool",name:"Bool",pkg:"",typ:$funcType([],[$Bool],false)},{prop:"String",name:"String",pkg:"",typ:$funcType([],[$String],false)},{prop:"Int",name:"Int",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Int64",name:"Int64",pkg:"",typ:$funcType([],[$Int64],false)},{prop:"Uint64",name:"Uint64",pkg:"",typ:$funcType([],[$Uint64],false)},{prop:"Float",name:"Float",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Interface",name:"Interface",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"Unsafe",name:"Unsafe",pkg:"",typ:$funcType([],[$Uintptr],false)}];T.methods=[{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)},{prop:"Stack",name:"Stack",pkg:"",typ:$funcType([],[$String],false)}];A.init("github.com/gopherjs/gopherjs/js",[{prop:"object",name:"object",embedded:false,exported:false,typ:O,tag:""}]);B.init("",[{prop:"Object",name:"Object",embedded:true,exported:true,typ:O,tag:""}]);J.init($String,$emptyInterface);K.init($emptyInterface);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:L();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$packages["github.com/gopherjs/gopherjs/js"];C=$pkg._type=$newType(0,$kindStruct,"runtime._type",true,"runtime",false,function(str_){this.$val=this;if(arguments.length===0){this.str="";return;}this.str=str_;});D=$pkg.TypeAssertionError=$newType(0,$kindStruct,"runtime.TypeAssertionError",true,"runtime",true,function(_interface_,concrete_,asserted_,missingMethod_){this.$val=this;if(arguments.length===0){this._interface=AZ.nil;this.concrete=AZ.nil;this.asserted=AZ.nil;this.missingMethod="";return;}this._interface=_interface_;this.concrete=concrete_;this.asserted=asserted_;this.missingMethod=missingMethod_;});AT=$pkg.errorString=$newType(8,$kindString,"runtime.errorString",true,"runtime",false,null);AZ=$ptrType(C);BD=$ptrType(D);C.ptr.prototype.string=function(){var a;a=this;return a.str;};C.prototype.string=function(){return this.$val.string();};C.ptr.prototype.pkgpath=function(){var a;a=this;return"";};C.prototype.pkgpath=function(){return this.$val.pkgpath();};D.ptr.prototype.RuntimeError=function(){};D.prototype.RuntimeError=function(){return this.$val.RuntimeError();};D.ptr.prototype.Error=function(){var a,b,c,d,e;a=this;b="interface";if(!(a._interface===AZ.nil)){b=a._interface.string();}c=a.asserted.string();if(a.concrete===AZ.nil){return"interface conversion: "+b+" is nil, not "+c;}d=a.concrete.string();if(a.missingMethod===""){e="interface conversion: "+b+" is "+d+", not "+c;if(d===c){if(!(a.concrete.pkgpath()===a.asserted.pkgpath())){e=e+(" (types from different packages)");}else{e=e+(" (types from different scopes)");}}return e;}return"interface conversion: "+d+" is not "+c+": missing method "+a.missingMethod;};D.prototype.Error=function(){return this.$val.Error();};E=function(){var a,b;a=$packages[$externalize("github.com/gopherjs/gopherjs/js",$String)];$jsObjectPtr=a.Object.ptr;$jsErrorPtr=a.Error.ptr;$throwRuntimeError=AU;AM=$internalize($goVersion,$String);b=$ifaceNil;b=new D.ptr(AZ.nil,AZ.nil,AZ.nil,"");$unused(b);};AT.prototype.RuntimeError=function(){var a;a=this.$val;};$ptrType(AT).prototype.RuntimeError=function(){return new AT(this.$get()).RuntimeError();};AT.prototype.Error=function(){var a;a=this.$val;return"runtime error: "+(a);};$ptrType(AT).prototype.Error=function(){return new AT(this.$get()).Error();};AU=function(a){var a;$panic(new AT((a)));};AZ.methods=[{prop:"string",name:"string",pkg:"runtime",typ:$funcType([],[$String],false)},{prop:"pkgpath",name:"pkgpath",pkg:"runtime",typ:$funcType([],[$String],false)}];BD.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];AT.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];C.init("runtime",[{prop:"str",name:"str",embedded:false,exported:false,typ:$String,tag:""}]);D.init("runtime",[{prop:"_interface",name:"_interface",embedded:false,exported:false,typ:AZ,tag:""},{prop:"concrete",name:"concrete",embedded:false,exported:false,typ:AZ,tag:""},{prop:"asserted",name:"asserted",embedded:false,exported:false,typ:AZ,tag:""},{prop:"missingMethod",name:"missingMethod",embedded:false,exported:false,typ:$String,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}AM="";E();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["math/bits"]=(function(){var $pkg={},$init;$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["math"]=(function(){var $pkg={},$init,B,A,IT,IU,IV,IW,FL,FM,FN,FO,FP,HH,EX,EY,FK,GA,GH,GK,GL,GM,GS,GT,GW,GX,GZ,HA,HD,HI,HL,HM;B=$packages["github.com/gopherjs/gopherjs/js"];A=$packages["math/bits"];IT=$arrayType($Uint32,2);IU=$arrayType($Float32,2);IV=$arrayType($Float64,1);IW=$structType("math",[{prop:"uint32array",name:"uint32array",embedded:false,exported:false,typ:IT,tag:""},{prop:"float32array",name:"float32array",embedded:false,exported:false,typ:IU,tag:""},{prop:"float64array",name:"float64array",embedded:false,exported:false,typ:IV,tag:""}]);EX=function(av,aw){var av,aw;if(GL(av,1)||GL(aw,1)){return GK(1);}else if(GM(av)||GM(aw)){return GW();}else if((av===0)&&(av===aw)){if(GZ(av)){return aw;}return av;}if(av>aw){return av;}return aw;};EY=function(av,aw){var av,aw;if(GL(av,-1)||GL(aw,-1)){return GK(-1);}else if(GM(av)||GM(aw)){return GW();}else if((av===0)&&(av===aw)){if(GZ(av)){return av;}return aw;}if(av>>0)));};$pkg.Abs=FK;GA=function(av){var av;return $parseFloat(FL.cos(av));};$pkg.Cos=GA;GH=function(av){var av;return $parseFloat(FL.floor(av));};$pkg.Floor=GH;GK=function(av){var av;if(av>=0){return FN;}else{return FO;}};$pkg.Inf=GK;GL=function(av,aw){var av,aw;if(av===FN){return aw>=0;}if(av===FO){return aw<=0;}return false;};$pkg.IsInf=GL;GM=function(av){var av,aw;aw=false;aw=!((av===av));return aw;};$pkg.IsNaN=GM;GS=function(av,aw){var av,aw;return EX(av,aw);};$pkg.Max=GS;GT=function(av,aw){var av,aw;return EY(av,aw);};$pkg.Min=GT;GW=function(){return FP;};$pkg.NaN=GW;GX=function(av,aw){var av,aw;if((av===1)||((av===-1)&&((aw===FN)||(aw===FO)))){return 1;}return $parseFloat(FL.pow(av,aw));};$pkg.Pow=GX;GZ=function(av){var av;return av<0||(1/av===FO);};$pkg.Signbit=GZ;HA=function(av){var av;return $parseFloat(FL.sin(av));};$pkg.Sin=HA;HD=function(av){var av;return $parseFloat(FL.sqrt(av));};$pkg.Sqrt=HD;HI=function(){var av;av=new($global.ArrayBuffer)(8);HH.uint32array=new($global.Uint32Array)(av);HH.float32array=new($global.Float32Array)(av);HH.float64array=new($global.Float64Array)(av);};HL=function(av){var av,aw,ax;HH.float64array[0]=av;return(aw=$shiftLeft64((new $Uint64(0,HH.uint32array[1])),32),ax=(new $Uint64(0,HH.uint32array[0])),new $Uint64(aw.$high+ax.$high,aw.$low+ax.$low));};$pkg.Float64bits=HL;HM=function(av){var av;HH.uint32array[0]=((av.$low>>>0));HH.uint32array[1]=(($shiftRightUint64(av,32).$low>>>0));return HH.float64array[0];};$pkg.Float64frombits=HM;$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=B.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=A.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}HH=new IW.ptr(IT.zero(),IU.zero(),IV.zero());FL=$global.Math;FM=0;FN=1/FM;FO=-1/FM;FP=$parseFloat($NaN);HI();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["resolv"]=(function(){var $pkg={},$init,A,B,C,N,P,Q,S,U,X,Z,AA,AE,AG,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,K,O,R,T,V,W,Y,AB,AC,AD,AF,AH;A=$packages["math"];B=$pkg.Vector=$newType(12,$kindSlice,"resolv.Vector",true,"resolv",true,null);C=$pkg.Axis=$newType(4,$kindInt,"resolv.Axis",true,"resolv",true,null);N=$pkg.Space=$newType(0,$kindStruct,"resolv.Space",true,"resolv",true,function(Cells_,CellWidth_,CellHeight_){this.$val=this;if(arguments.length===0){this.Cells=AL.nil;this.CellWidth=0;this.CellHeight=0;return;}this.Cells=Cells_;this.CellWidth=CellWidth_;this.CellHeight=CellHeight_;});P=$pkg.Shape=$newType(8,$kindInterface,"resolv.Shape",true,"resolv",true,null);Q=$pkg.Line=$newType(0,$kindStruct,"resolv.Line",true,"resolv",true,function(Start_,End_){this.$val=this;if(arguments.length===0){this.Start=B.nil;this.End=B.nil;return;}this.Start=Start_;this.End=End_;});S=$pkg.ConvexPolygon=$newType(0,$kindStruct,"resolv.ConvexPolygon",true,"resolv",true,function(Points_,X_,Y_,Closed_){this.$val=this;if(arguments.length===0){this.Points=AP.nil;this.X=0;this.Y=0;this.Closed=false;return;}this.Points=Points_;this.X=X_;this.Y=Y_;this.Closed=Closed_;});U=$pkg.ContactSet=$newType(0,$kindStruct,"resolv.ContactSet",true,"resolv",true,function(Points_,MTV_,Center_){this.$val=this;if(arguments.length===0){this.Points=AP.nil;this.MTV=B.nil;this.Center=B.nil;return;}this.Points=Points_;this.MTV=MTV_;this.Center=Center_;});X=$pkg.Circle=$newType(0,$kindStruct,"resolv.Circle",true,"resolv",true,function(X_,Y_,Radius_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;this.Radius=0;return;}this.X=X_;this.Y=Y_;this.Radius=Radius_;});Z=$pkg.Projection=$newType(0,$kindStruct,"resolv.Projection",true,"resolv",true,function(Min_,Max_){this.$val=this;if(arguments.length===0){this.Min=0;this.Max=0;return;}this.Min=Min_;this.Max=Max_;});AA=$pkg.Object=$newType(0,$kindStruct,"resolv.Object",true,"resolv",true,function(Shape_,Space_,X_,Y_,W_,H_,TouchingCells_,Data_,ignoreList_,tags_){this.$val=this;if(arguments.length===0){this.Shape=$ifaceNil;this.Space=AM.nil;this.X=0;this.Y=0;this.W=0;this.H=0;this.TouchingCells=AK.nil;this.Data=$ifaceNil;this.ignoreList=false;this.tags=AV.nil;return;}this.Shape=Shape_;this.Space=Space_;this.X=X_;this.Y=Y_;this.W=W_;this.H=H_;this.TouchingCells=TouchingCells_;this.Data=Data_;this.ignoreList=ignoreList_;this.tags=tags_;});AE=$pkg.Collision=$newType(0,$kindStruct,"resolv.Collision",true,"resolv",true,function(checkingObject_,dx_,dy_,Objects_,Cells_){this.$val=this;if(arguments.length===0){this.checkingObject=AN.nil;this.dx=0;this.dy=0;this.Objects=AO.nil;this.Cells=AK.nil;return;}this.checkingObject=checkingObject_;this.dx=dx_;this.dy=dy_;this.Objects=Objects_;this.Cells=Cells_;});AG=$pkg.Cell=$newType(0,$kindStruct,"resolv.Cell",true,"resolv",true,function(X_,Y_,Objects_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;this.Objects=AO.nil;return;}this.X=X_;this.Y=Y_;this.Objects=Objects_;});AI=$sliceType($Float64);AJ=$ptrType(AG);AK=$sliceType(AJ);AL=$sliceType(AK);AM=$ptrType(N);AN=$ptrType(AA);AO=$sliceType(AN);AP=$sliceType(B);AQ=$ptrType(Q);AR=$sliceType(AQ);AS=$ptrType(X);AT=$ptrType(S);AU=$ptrType(U);AV=$sliceType($String);AW=$ptrType(AE);AX=$sliceType(C);AY=$mapType(AN,$Bool);B.prototype.Clone=function(){var a,b;a=this;b=$makeSlice(B,a.$length);$copySlice(b,a);return b;};$ptrType(B).prototype.Clone=function(){return this.$get().Clone();};B.prototype.Add=function(a){var a,b,c,d,e,f;b=this;c=b.$length;d=a;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]).$length>c){AC($convertSliceType(b,AI),1,$convertSliceType(b,AI),$convertSliceType($subslice(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),0,c),AI));}else{AC($convertSliceType(b,AI),1,$convertSliceType(b,AI),$convertSliceType(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),AI));}e++;}return b;};$ptrType(B).prototype.Add=function(a){return this.$get().Add(a);};B.prototype.Sub=function(a){var a,b,c,d,e,f;b=this;c=b.$length;d=a;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]).$length>c){AC($convertSliceType(b,AI),-1,$convertSliceType($subslice(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),0,c),AI),$convertSliceType(b,AI));}else{AC($convertSliceType(b,AI),-1,$convertSliceType(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),AI),$convertSliceType(b,AI));}e++;}return b;};$ptrType(B).prototype.Sub=function(a){return this.$get().Sub(a);};B.prototype.Scale=function(a){var a,b;b=this;AD($convertSliceType(b,AI),a,$convertSliceType(b,AI));return b;};$ptrType(B).prototype.Scale=function(a){return this.$get().Scale(a);};B.prototype.Equal=function(a){var a,b,c,d,e;b=this;if(!((b.$length===a.$length))){return false;}c=b;d=0;while(true){if(!(d=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+e])-((e<0||e>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e]))>1e-08){return false;}d++;}return true;};$ptrType(B).prototype.Equal=function(a){return this.$get().Equal(a);};B.prototype.Magnitude=function(){var a;a=this;return A.Sqrt(a.Magnitude2());};$ptrType(B).prototype.Magnitude=function(){return this.$get().Magnitude();};B.prototype.Magnitude2=function(){var a,b,c,d,e;a=this;b=0;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=b+(e*e);d++;}return b;};$ptrType(B).prototype.Magnitude2=function(){return this.$get().Magnitude2();};B.prototype.Unit=function(){var a,b,c,d,e;a=this;b=a.Magnitude();if(b<1e-08){return a;}c=a;d=0;while(true){if(!(d=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e]=((e<0||e>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e])/b);d++;}return a;};$ptrType(B).prototype.Unit=function(){return this.$get().Unit();};K=function(a,b){var a,b,c,d,e,f,g,h,i,j,k;c=0;d=a.$length;e=b.$length;f=c;g=d;h=e;if(g>h){b=$appendSlice(b,$convertSliceType($makeSlice(B,(g-h>>0)),AI));}if(g>0)),AI));}i=a;j=0;while(true){if(!(j=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+k])*((k<0||k>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+k]));j++;}return f;};$pkg.Dot=K;B.prototype.Dot=function(a){var a,b;b=this;return K(b,a);};$ptrType(B).prototype.Dot=function(a){return this.$get().Dot(a);};B.prototype.Cross=function(a){var a,b;b=this;if(!((b.$length===3))||!((a.$length===3))){return B.nil;}return new B([(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2])-(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]),(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])-(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2]),(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2])-(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])]);};$ptrType(B).prototype.Cross=function(a){return this.$get().Cross(a);};B.prototype.Rotate=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;c=this;d=2;e=c.$length;f=d;g=e;if(g===0){return c;}if(b.$length>0){f=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]);}if((g===1)&&!((f===2))){c=$append(c,0,0);}if((g<2&&(f===2))||((g===2)&&!((f===2)))){c=$append(c,0);}h=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]);i=(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);j=h;k=i;l=A.Cos(a);m=A.Sin(a);n=l;o=m;p=f;if(p===(0)){q=(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]);(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=k*n-q*o);(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]=k*o+q*n);}else if(p===(1)){r=(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]);(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=j*n+r*o);(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]=-j*o+r*n);}else if(p===(2)){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=j*n-k*o);(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=j*o+k*n);}if(g>3){return $subslice(c,0,3);}return c;};$ptrType(B).prototype.Rotate=function(a,b){return this.$get().Rotate(a,b);};B.prototype.X=function(){var a;a=this;if(a.$length<1){return 0;}return(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]);};$ptrType(B).prototype.X=function(){return this.$get().X();};B.prototype.Y=function(){var a;a=this;if(a.$length<2){return 0;}return(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]);};$ptrType(B).prototype.Y=function(){return this.$get().Y();};B.prototype.Z=function(){var a;a=this;if(a.$length<3){return 0;}return(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2]);};$ptrType(B).prototype.Z=function(){return this.$get().Z();};O=function(a,b,c,d){var a,b,c,d,e,f,g;e=new N.ptr(AL.nil,c,d);e.Resize((f=a/c,(f===f&&f!==1/0&&f!==-1/0)?f>>0:$throwRuntimeError("integer divide by zero")),(g=b/d,(g===g&&g!==1/0&&g!==-1/0)?g>>0:$throwRuntimeError("integer divide by zero")));return e;};$pkg.NewSpace=O;N.ptr.prototype.Add=function(a){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=this;if(b===AM.nil){$panic(new $String("ERROR: space is nil"));}c=a;d=0;case 1:if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);e.Space=b;$r=e.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}d++;$s=1;continue;case 2:$s=-1;return;}return;}var $f={$blk:N.ptr.prototype.Add,$c:true,$r,a,b,c,d,e,$s};return $f;};N.prototype.Add=function(a){return this.$val.Add(a);};N.ptr.prototype.Remove=function(a){var a,b,c,d,e,f,g,h;b=this;if(b===AM.nil){$panic(new $String("ERROR: space is nil"));}c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=e.TouchingCells;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);h.unregister(e);g++;}e.TouchingCells=new AK([]);e.Space=AM.nil;d++;}};N.prototype.Remove=function(a){return this.$val.Remove(a);};N.ptr.prototype.Objects=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;a=this;b=$makeMap(AN.keyFor,[]);c=new AO([]);d=a.Cells;e=0;while(true){if(!(e=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+f]));i=0;while(true){if(!(i=m.$length)?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+f])),((j<0||j>=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+j])).Objects;n=0;while(true){if(!(n=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+n]);p=(q=b[AN.keyFor(o)],q!==undefined?[q.v,true]:[false,false]);r=p[1];if(!r){c=$append(c,o);s=o;(b||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(s)]={k:s,v:true};}n++;}i++;}e++;}return c;};N.prototype.Objects=function(){return this.$val.Objects();};N.ptr.prototype.Resize=function(a,b){var a,b,c,d,e,f,g;c=this;c.Cells=new AL([]);d=0;while(true){if(!(d=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+d]=$append((f=c.Cells,((d<0||d>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+d])),AH(e,d))));e=e+(1)>>0;}d=d+(1)>>0;}};N.prototype.Resize=function(a,b){return this.$val.Resize(a,b);};N.ptr.prototype.Cell=function(a,b){var a,b,c,d,e,f;c=this;if(b>=0&&b=0&&a<(d=c.Cells,((b<0||b>=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+b])).$length){return(e=(f=c.Cells,((b<0||b>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+b])),((a<0||a>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+a]));}return AJ.nil;};N.prototype.Cell=function(a,b){return this.$val.Cell(a,b);};N.ptr.prototype.CheckCells=function(a,b,c,d,e){var a,b,c,d,e,f,g,h,i,j,k,l,m;f=this;g=a;while(true){if(!(g<(a+c>>0))){break;}h=b;while(true){if(!(h<(b+d>>0))){break;}i=f.Cell(g,h);if(!(i===AJ.nil)){if(e.$length>0){if(i.ContainsTags(e)){j=i.Objects;k=0;while(true){if(!(k=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+k]);if(l.HasTags(e)){return l;}k++;}}}else if(i.Occupied()){return(m=i.Objects,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0]));}}h=h+(1)>>0;}g=g+(1)>>0;}return AN.nil;};N.prototype.CheckCells=function(a,b,c,d,e){return this.$val.CheckCells(a,b,c,d,e);};N.ptr.prototype.CheckCellsWorld=function(a,b,c,d,e){var a,b,c,d,e,f,g,h,i,j,k,l;f=this;g=f.WorldToSpace(a,b);h=g[0];i=g[1];j=f.WorldToSpace(c,d);k=j[0];l=j[1];return f.CheckCells(h,i,k,l,e);};N.prototype.CheckCellsWorld=function(a,b,c,d,e){return this.$val.CheckCellsWorld(a,b,c,d,e);};N.ptr.prototype.UnregisterAllObjects=function(){var a,b,c,d,e,f,g;a=this;b=0;while(true){if(!(b=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+b])).$length)){break;}g=(e=(f=a.Cells,((b<0||b>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+b])),((c<0||c>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+c]));a.Remove(g.Objects);c=c+(1)>>0;}b=b+(1)>>0;}};N.prototype.UnregisterAllObjects=function(){return this.$val.UnregisterAllObjects();};N.ptr.prototype.WorldToSpace=function(a,b){var a,b,c,d,e;c=this;d=((A.Floor(a/(c.CellWidth))>>0));e=((A.Floor(b/(c.CellHeight))>>0));return[d,e];};N.prototype.WorldToSpace=function(a,b){return this.$val.WorldToSpace(a,b);};N.ptr.prototype.SpaceToWorld=function(a,b){var a,b,c,d,e;c=this;d=(($imul(a,c.CellWidth)));e=(($imul(b,c.CellHeight)));return[d,e];};N.prototype.SpaceToWorld=function(a,b){return this.$val.SpaceToWorld(a,b);};N.ptr.prototype.Height=function(){var a;a=this;return a.Cells.$length;};N.prototype.Height=function(){return this.$val.Height();};N.ptr.prototype.Width=function(){var a,b;a=this;if(a.Cells.$length>0){return(b=a.Cells,(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])).$length;}return 0;};N.prototype.Width=function(){return this.$val.Width();};N.ptr.prototype.CellsInLine=function(a,b,c,d){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;e=this;f=new AK([]);g=e.Cell(a,b);h=e.Cell(c,d);if(!(g===AJ.nil)&&!(h===AJ.nil)){i=new B([((c-a>>0)),((d-b>>0))]).Unit();(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0]=(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])*(((j=e.CellWidth/2,(j===j&&j!==1/0&&j!==-1/0)?j>>0:$throwRuntimeError("integer divide by zero")))));(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1]=(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1])*(((k=e.CellHeight/2,(k===k&&k!==1/0&&k!==-1/0)?k>>0:$throwRuntimeError("integer divide by zero")))));l=e.SpaceToWorld(a,b);m=l[0];n=l[1];q=new B([m+((o=e.CellWidth/2,(o===o&&o!==1/0&&o!==-1/0)?o>>0:$throwRuntimeError("integer divide by zero"))),n+((p=e.CellHeight/2,(p===p&&p!==1/0&&p!==-1/0)?p>>0:$throwRuntimeError("integer divide by zero")))]);r=false;while(true){if(!(!(g===AJ.nil))){break;}if(g===h){f=$append(f,g);break;}f=$append(f,g);if(r){(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]=(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1])+((1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1])));}else{(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0]=(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0])+((0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])));}s=e.WorldToSpace((0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0]),(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]));t=s[0];u=s[1];v=e.Cell(t,u);if(!(v===g)){g=v;}r=!r;}}return f;};N.prototype.CellsInLine=function(a,b,c,d){return this.$val.CellsInLine(a,b,c,d);};R=function(a,b,c,d){var a,b,c,d;return new Q.ptr(new B([a,b]),new B([c,d]));};$pkg.NewLine=R;Q.ptr.prototype.Project=function(a){var a,b;b=this;return b.Vector().Scale(a.Dot(b.Start.Sub(new AP([b.End]))));};Q.prototype.Project=function(a){return this.$val.Project(a);};Q.ptr.prototype.Normal=function(){var a,b;a=this;b=a.Vector();return new B([(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1]),-(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])]).Unit();};Q.prototype.Normal=function(){return this.$val.Normal();};Q.ptr.prototype.Vector=function(){var a;a=this;return a.End.Clone().Sub(new AP([a.Start])).Unit();};Q.prototype.Vector=function(){return this.$val.Vector();};Q.ptr.prototype.IntersectionPointsLine=function(a){var a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;b=this;k=((c=b.End,(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]))-(d=b.Start,(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0])))*((e=a.End,(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))-(f=a.Start,(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1])))-((g=a.End,(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]))-(h=a.Start,(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])))*((i=b.End,(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1]))-(j=b.Start,(1>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+1])));if(!((k===0))){t=((((l=b.Start,(1>=l.$length?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+1]))-(m=a.Start,(1>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+1])))*((n=a.End,(0>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+0]))-(o=a.Start,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0]))))-(((p=b.Start,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]))-(q=a.Start,(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0])))*((r=a.End,(1>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+1]))-(s=a.Start,(1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1]))))+1)/k;ac=((((u=b.Start,(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]))-(v=a.Start,(1>=v.$length?($throwRuntimeError("index out of range"),undefined):v.$array[v.$offset+1])))*((w=b.End,(0>=w.$length?($throwRuntimeError("index out of range"),undefined):w.$array[w.$offset+0]))-(x=b.Start,(0>=x.$length?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+0]))))-(((y=b.Start,(0>=y.$length?($throwRuntimeError("index out of range"),undefined):y.$array[y.$offset+0]))-(z=a.Start,(0>=z.$length?($throwRuntimeError("index out of range"),undefined):z.$array[z.$offset+0])))*((aa=b.End,(1>=aa.$length?($throwRuntimeError("index out of range"),undefined):aa.$array[aa.$offset+1]))-(ab=b.Start,(1>=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+1]))))+1)/k;if((0=ad.$length?($throwRuntimeError("index out of range"),undefined):ad.$array[ad.$offset+0]))-(ae=b.Start,(0>=ae.$length?($throwRuntimeError("index out of range"),undefined):ae.$array[ae.$offset+0]));ai=(ag=b.End,(1>=ag.$length?($throwRuntimeError("index out of range"),undefined):ag.$array[ag.$offset+1]))-(ah=b.Start,(1>=ah.$length?($throwRuntimeError("index out of range"),undefined):ah.$array[ah.$offset+1]));return new B([(aj=b.Start,(0>=aj.$length?($throwRuntimeError("index out of range"),undefined):aj.$array[aj.$offset+0]))+(t*af),(ak=b.Start,(1>=ak.$length?($throwRuntimeError("index out of range"),undefined):ak.$array[ak.$offset+1]))+(t*ai)]);}}return B.nil;};Q.prototype.IntersectionPointsLine=function(a){return this.$val.IntersectionPointsLine(a);};Q.ptr.prototype.IntersectionPointsCircle=function(a){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;b=this;c=new AP([]);d=new B([a.X,a.Y]);e=b.Start.Sub(new AP([d]));f=b.End.Sub(new AP([d]));g=f.Sub(new AP([e]));h=(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])+(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1]);i=2*(((0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])*(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]))+((1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])*(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])));j=((0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])*(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]))+((1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])*(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))-(a.Radius*a.Radius);k=i*i-(4*h*j);if(k<0){}else if(k===0){l=-i/(2*h);if(l>=0&&l<=1){c=$append(c,new B([(m=b.Start,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0]))+l*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(n=b.Start,(1>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+1]))+l*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}}else{o=(-i+A.Sqrt(k))/(2*h);if(o>=0&&o<=1){c=$append(c,new B([(p=b.Start,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]))+o*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(q=b.Start,(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]))+o*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}o=(-i-A.Sqrt(k))/(2*h);if(o>=0&&o<=1){c=$append(c,new B([(r=b.Start,(0>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+0]))+o*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(s=b.Start,(1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1]))+o*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}}return c;};Q.prototype.IntersectionPointsCircle=function(a){return this.$val.IntersectionPointsCircle(a);};T=function(a){var a,b;b=new S.ptr(new AP([]),0,0,true);b.AddPoints(a);return b;};$pkg.NewConvexPolygon=T;S.ptr.prototype.Clone=function(){var a,b,c,d,e,f;a=this;b=new AP([]);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,e.Clone());d++;}f=T(AI.nil);f.X=a.X;f.Y=a.Y;f.AddPointsVec(b);f.Closed=a.Closed;return f;};S.prototype.Clone=function(){return this.$val.Clone();};S.ptr.prototype.AddPointsVec=function(a){var a,b;b=this;b.Points=$appendSlice(b.Points,a);};S.prototype.AddPointsVec=function(a){return this.$val.AddPointsVec(a);};S.ptr.prototype.AddPoints=function(a){var a,b,c,d;b=this;c=0;while(true){if(!(c=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+c]),(d=c+1>>0,((d<0||d>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+d]))]));c=c+(2)>>0;}};S.prototype.AddPoints=function(a){return this.$val.AddPoints(a);};S.ptr.prototype.Lines=function(){var a,b,c,d,e,f,g,h,i,j;a=this;b=new AR([]);c=a.Transformed();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]);g=e;h=f;if(d<(c.$length-1>>0)){h=(i=d+1>>0,((i<0||i>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+i]));}else if(!a.Closed){break;}j=R((0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1]),(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]),(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));b=$append(b,j);d=d+(1)>>0;}return b;};S.prototype.Lines=function(){return this.$val.Lines();};S.ptr.prototype.Transformed=function(){var a,b,c,d,e;a=this;b=new AP([]);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,new B([(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])+a.X,(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])+a.Y]));d++;}return b;};S.prototype.Transformed=function(){return this.$val.Transformed();};S.ptr.prototype.Bounds=function(){var a,b,c,d,e,f,g,h;a=this;b=a.Transformed();e=new B([(c=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]),(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])),(d=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]),(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]))]);f=e.Clone();g=0;while(true){if(!(g=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+g]);if((0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])<(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])){(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]=(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]));}else if((0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])>(0>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+0])){(0>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+0]=(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]));}if((1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])<(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])){(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]=(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));}else if((1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])>(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1])){(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1]=(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));}g=g+(1)>>0;}return[e,f];};S.prototype.Bounds=function(){return this.$val.Bounds();};S.ptr.prototype.Position=function(){var a;a=this;return[a.X,a.Y];};S.prototype.Position=function(){return this.$val.Position();};S.ptr.prototype.SetPosition=function(a,b){var a,b,c;c=this;c.X=a;c.Y=b;};S.prototype.SetPosition=function(a,b){return this.$val.SetPosition(a,b);};S.ptr.prototype.SetPositionVec=function(a){var a,b;b=this;b.X=a.X();b.Y=a.Y();};S.prototype.SetPositionVec=function(a){return this.$val.SetPositionVec(a);};S.ptr.prototype.Move=function(a,b){var a,b,c;c=this;c.X=c.X+(a);c.Y=c.Y+(b);};S.prototype.Move=function(a,b){return this.$val.Move(a,b);};S.ptr.prototype.MoveVec=function(a){var a,b;b=this;b.X=b.X+(a.X());b.Y=b.Y+(a.Y());};S.prototype.MoveVec=function(a){return this.$val.MoveVec(a);};S.ptr.prototype.Center=function(){var a,b,c,d,e;a=this;b=new B([0,0]);c=a.Transformed();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b.Add(new AP([e]));d++;}(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])/((a.Transformed().$length)));(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1]=(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])/((a.Transformed().$length)));return b;};S.prototype.Center=function(){return this.$val.Center();};S.ptr.prototype.Project=function(a){var a,b,c,d,e,f,g,h,i,j,k;b=this;a=a.Unit();c=b.Transformed();f=a.Dot(new B([(d=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]),(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0])),(e=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]),(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))]));g=f;h=1;while(true){if(!(h=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+h]),(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])),(j=((h<0||h>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+h]),(1>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+1]))]));if(kg){g=k;}h=h+(1)>>0;}return new Z.ptr(f,g);};S.prototype.Project=function(a){return this.$val.Project(a);};S.ptr.prototype.SATAxes=function(){var a,b,c,d,e;a=this;b=new AP([]);c=a.Lines();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,e.Normal());d++;}return b;};S.prototype.SATAxes=function(){return this.$val.SATAxes();};S.ptr.prototype.PointInside=function(a){var a,b,c,d,e,f,g;b=this;c=R((0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]),(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]),(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])+9.99999999999e+11,(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]));d=0;e=b.Lines();f=0;while(true){if(!(f=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+f]);if(!(g.IntersectionPointsLine(c)===B.nil)){d=d+(1)>>0;}f++;}return d===1;};S.prototype.PointInside=function(a){return this.$val.PointInside(a);};V=function(){return new U.ptr(new AP([]),new B([0,0]),new B([0,0]));};$pkg.NewContactSet=V;U.ptr.prototype.LeftmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])<(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])){b=e;}d++;}return b;};U.prototype.LeftmostPoint=function(){return this.$val.LeftmostPoint();};U.ptr.prototype.RightmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])>(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])){b=e;}d++;}return b;};U.prototype.RightmostPoint=function(){return this.$val.RightmostPoint();};U.ptr.prototype.TopmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])<(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])){b=e;}d++;}return b;};U.prototype.TopmostPoint=function(){return this.$val.TopmostPoint();};U.ptr.prototype.BottommostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])>(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])){b=e;}d++;}return b;};U.prototype.BottommostPoint=function(){return this.$val.BottommostPoint();};S.ptr.prototype.Intersection=function(a,b,c){var a,aa,ab,ac,ad,ae,af,ag,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;d=this;e=V();f=d.X;g=d.Y;d.X=d.X+(a);d.Y=d.Y+(b);h=$assertType(c,AS,true);i=h[0];j=h[1];if(j){k=d.Lines();l=0;while(true){if(!(l=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+l]);e.Points=$appendSlice(e.Points,m.IntersectionPointsCircle(i));l++;}}else{n=$assertType(c,AT,true);o=n[0];p=n[1];if(p){q=d.Lines();r=0;while(true){if(!(r=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+r]);t=o.Lines();u=0;while(true){if(!(u=t.$length)?($throwRuntimeError("index out of range"),undefined):t.$array[t.$offset+u]);w=s.IntersectionPointsLine(v);if(!(w===B.nil)){e.Points=$append(e.Points,w);}u++;}r++;}}}if(e.Points.$length>0){x=e.Points;y=0;while(true){if(!(y=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+y]);e.Center=e.Center.Add(new AP([z]));y++;}(ab=e.Center,(0>=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+0]=(aa=e.Center,(0>=aa.$length?($throwRuntimeError("index out of range"),undefined):aa.$array[aa.$offset+0]))/((e.Points.$length))));(ad=e.Center,(1>=ad.$length?($throwRuntimeError("index out of range"),undefined):ad.$array[ad.$offset+1]=(ac=e.Center,(1>=ac.$length?($throwRuntimeError("index out of range"),undefined):ac.$array[ac.$offset+1]))/((e.Points.$length))));ae=d.calculateMTV(e,c);if(!(ae===B.nil)){e.MTV=ae;}}else{e=AU.nil;}if(!(e===AU.nil)&&(!((a===0))||!((b===0)))){af=new B([a,b]).Magnitude();ag=e.MTV.Magnitude();e.MTV=e.MTV.Unit().Scale(ag-af);}d.X=f;d.Y=g;return e;};S.prototype.Intersection=function(a,b,c){return this.$val.Intersection(a,b,c);};S.ptr.prototype.calculateMTV=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;c=this;d=new B([0,0]);e=new B([1.7976931348623157e+308,0]);f=b;if($assertType(f,AT,true)[1]){g=f.$val;h=c.SATAxes();i=0;while(true){if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);if(!$clone(c.Project(j),Z).Overlapping($clone(g.Project(j),Z))){return B.nil;}k=$clone(c.Project(j),Z).Overlap($clone(g.Project(j),Z));if(e.Magnitude()>k){e=j.Scale(k);}i++;}l=g.SATAxes();m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);if(!$clone(c.Project(n),Z).Overlapping($clone(g.Project(n),Z))){return B.nil;}o=$clone(c.Project(n),Z).Overlap($clone(g.Project(n),Z));if(e.Magnitude()>o){e=n.Scale(o);}m++;}}(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]=(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]));(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]=(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]));return d;};S.prototype.calculateMTV=function(a,b){return this.$val.calculateMTV(a,b);};S.ptr.prototype.ContainedBy=function(a){var a,b,c,d,e,f,g,h,i,j;b=this;c=a;if($assertType(c,AT,true)[1]){d=c.$val;e=b.SATAxes();f=0;while(true){if(!(f=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+f]);if(!$clone(b.Project(g),Z).IsInside($clone(d.Project(g),Z))){return false;}f++;}h=d.SATAxes();i=0;while(true){if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);if(!$clone(b.Project(j),Z).IsInside($clone(d.Project(j),Z))){return false;}i++;}}return true;};S.prototype.ContainedBy=function(a){return this.$val.ContainedBy(a);};S.ptr.prototype.FlipH=function(){var a,b,c,d;a=this;b=a.Points;c=0;while(true){if(!(c=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]);(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]=-(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]));c++;}a.ReverseVertexOrder();};S.prototype.FlipH=function(){return this.$val.FlipH();};S.ptr.prototype.FlipV=function(){var a,b,c,d;a=this;b=a.Points;c=0;while(true){if(!(c=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]);(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]=-(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]));c++;}a.ReverseVertexOrder();};S.prototype.FlipV=function(){return this.$val.FlipV();};S.ptr.prototype.ReverseVertexOrder=function(){var a,b,c,d,e;a=this;c=new AP([(b=a.Points,(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]))]);d=a.Points.$length-1>>0;while(true){if(!(d>=1)){break;}c=$append(c,(e=a.Points,((d<0||d>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+d])));d=d-(1)>>0;}a.Points=c;};S.prototype.ReverseVertexOrder=function(){return this.$val.ReverseVertexOrder();};W=function(a,b,c,d){var a,b,c,d;return T(new AI([a,b,a+c,b,a+c,b+d,a,b+d]));};$pkg.NewRectangle=W;Y=function(a,b,c){var a,b,c,d;d=new X.ptr(a,b,c);return d;};$pkg.NewCircle=Y;X.ptr.prototype.Clone=function(){var a;a=this;return Y(a.X,a.Y,a.Radius);};X.prototype.Clone=function(){return this.$val.Clone();};X.ptr.prototype.Bounds=function(){var a;a=this;return[new B([a.X-a.Radius,a.Y-a.Radius]),new B([a.X+a.Radius,a.Y+a.Radius])];};X.prototype.Bounds=function(){return this.$val.Bounds();};X.ptr.prototype.Intersection=function(a,b,c){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;d=this;e=AU.nil;f=d.X;g=d.Y;d.X=d.X+(a);d.Y=d.Y+(b);h=c;if($assertType(h,AT,true)[1]){i=h.$val;e=i.Intersection(-a,-b,d);if(!(e===AU.nil)){e.MTV=e.MTV.Scale(-1);}}else if($assertType(h,AS,true)[1]){j=h.$val;e=V();e.Points=d.IntersectionPointsCircle(j);if(e.Points.$length===0){return AU.nil;}e.MTV=new B([d.X-j.X,d.Y-j.Y]);k=e.MTV.Magnitude();e.MTV=e.MTV.Unit().Scale(d.Radius+j.Radius-k);l=e.Points;m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);e.Center=e.Center.Add(new AP([n]));m++;}(p=e.Center,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]=(o=e.Center,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0]))/((e.Points.$length))));(r=e.Center,(1>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+1]=(q=e.Center,(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]))/((e.Points.$length))));}d.X=f;d.Y=g;return e;};X.prototype.Intersection=function(a,b,c){return this.$val.Intersection(a,b,c);};X.ptr.prototype.Move=function(a,b){var a,b,c;c=this;c.X=c.X+(a);c.Y=c.Y+(b);};X.prototype.Move=function(a,b){return this.$val.Move(a,b);};X.ptr.prototype.MoveVec=function(a){var a,b;b=this;b.X=b.X+(a.X());b.Y=b.Y+(a.Y());};X.prototype.MoveVec=function(a){return this.$val.MoveVec(a);};X.ptr.prototype.SetPosition=function(a,b){var a,b,c;c=this;c.X=a;c.Y=b;};X.prototype.SetPosition=function(a,b){return this.$val.SetPosition(a,b);};X.ptr.prototype.SetPositionVec=function(a){var a,b;b=this;b.X=a.X();b.Y=a.Y();};X.prototype.SetPositionVec=function(a){return this.$val.SetPositionVec(a);};X.ptr.prototype.Position=function(){var a;a=this;return[a.X,a.Y];};X.prototype.Position=function(){return this.$val.Position();};X.ptr.prototype.PointInside=function(a){var a,b;b=this;return a.Sub(new AP([new B([b.X,b.Y])])).Magnitude()<=b.Radius;};X.prototype.PointInside=function(a){return this.$val.PointInside(a);};X.ptr.prototype.IntersectionPointsCircle=function(a){var a,b,c,d,e,f,g;b=this;c=A.Sqrt(A.Pow(a.X-b.X,2)+A.Pow(a.Y-b.Y,2));if(c>b.Radius+a.Radius||c0;};Z.prototype.Overlapping=function(a){return this.$val.Overlapping(a);};Z.ptr.prototype.Overlap=function(a){var a,b;b=this;return A.Min(b.Max,a.Max)-A.Max(b.Min,a.Min);};Z.prototype.Overlap=function(a){return this.$val.Overlap(a);};Z.ptr.prototype.IsInside=function(a){var a,b;b=this;return b.Min>=a.Min&&b.Max<=a.Max;};Z.prototype.IsInside=function(a){return this.$val.IsInside(a);};AB=function(a,b,c,d,e){var a,b,c,d,e,f;f=new AA.ptr($ifaceNil,AM.nil,a,b,c,d,AK.nil,$ifaceNil,$makeMap(AN.keyFor,[]),new AV([]));if(e.$length>0){f.AddTags(e);}return f;};$pkg.NewObject=AB;AA.ptr.prototype.Clone=function(){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{});$s=$s||0;s:while(true){switch($s){case 0:a=this;b=AB(a.X,a.Y,a.W,a.H,a.Tags());b.Data=a.Data;if(!($interfaceIsEqual(a.Shape,$ifaceNil))){$s=1;continue;}$s=2;continue;case 1:c=a.Shape.Clone();$s=3;case 3:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}$r=b.SetShape(c);$s=4;case 4:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:d=a.ignoreList;e=0;f=$keys(d);while(true){if(!(e>0;}h=h+(1)>>0;}}if(!($interfaceIsEqual(a.Shape,$ifaceNil))){$s=1;continue;}$s=2;continue;case 1:$r=a.Shape.SetPosition(a.X,a.Y);$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:$s=-1;return;}return;}var $f={$blk:AA.ptr.prototype.Update,$c:true,$r,a,b,c,d,e,f,g,h,i,j,$s};return $f;};AA.prototype.Update=function(){return this.$val.Update();};AA.ptr.prototype.AddTags=function(a){var a,b;b=this;b.tags=$appendSlice(b.tags,a);};AA.prototype.AddTags=function(a){return this.$val.AddTags(a);};AA.ptr.prototype.RemoveTags=function(a){var a,b,c,d,e,f,g,h,i;b=this;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=b.tags;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(i===e){b.tags=$appendSlice($subslice(b.tags,0,h),$subslice(b.tags,(h+1>>0)));break;}g++;}d++;}};AA.prototype.RemoveTags=function(a){return this.$val.RemoveTags(a);};AA.ptr.prototype.HasTags=function(a){var a,b,c,d,e,f,g,h;b=this;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=b.tags;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(h===e){return true;}g++;}d++;}return false;};AA.prototype.HasTags=function(a){return this.$val.HasTags(a);};AA.ptr.prototype.Tags=function(){var a;a=this;return $appendSlice(new AV([]),a.tags);};AA.prototype.Tags=function(){return this.$val.Tags();};AA.ptr.prototype.SetShape=function(a){var{a,b,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=this;if(!($interfaceIsEqual(b.Shape,a))){$s=1;continue;}$s=2;continue;case 1:b.Shape=a;$r=b.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:$s=-1;return;}return;}var $f={$blk:AA.ptr.prototype.SetShape,$c:true,$r,a,b,$s};return $f;};AA.prototype.SetShape=function(a){return this.$val.SetShape(a);};AA.ptr.prototype.BoundsToSpace=function(a,b){var a,b,c,d,e,f,g,h,i;c=this;d=c.Space.WorldToSpace(c.X+a,c.Y+b);e=d[0];f=d[1];g=c.Space.WorldToSpace(c.X+c.W+a-1,c.Y+c.H+b-1);h=g[0];i=g[1];return[e,f,h,i];};AA.prototype.BoundsToSpace=function(a,b){return this.$val.BoundsToSpace(a,b);};AA.ptr.prototype.SharesCells=function(a){var a,b,c,d,e;b=this;c=b.TouchingCells;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.Contains(a)){return true;}d++;}return false;};AA.prototype.SharesCells=function(a){return this.$val.SharesCells(a);};AA.ptr.prototype.SharesCellsTags=function(a){var a,b,c,d,e;b=this;c=b.TouchingCells;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.ContainsTags(a)){return true;}d++;}return false;};AA.prototype.SharesCellsTags=function(a){return this.$val.SharesCellsTags(a);};AA.ptr.prototype.Center=function(){var a;a=this;return[a.X+(a.W/2),a.Y+(a.H/2)];};AA.prototype.Center=function(){return this.$val.Center();};AA.ptr.prototype.SetCenter=function(a,b){var a,b,c;c=this;c.X=a-(c.W/2);c.Y=b-(c.H/2);};AA.prototype.SetCenter=function(a,b){return this.$val.SetCenter(a,b);};AA.ptr.prototype.CellPosition=function(){var a,b;a=this;b=a.Center();return a.Space.WorldToSpace(b[0],b[1]);};AA.prototype.CellPosition=function(){return this.$val.CellPosition();};AA.ptr.prototype.SetRight=function(a){var a,b;b=this;b.X=a-b.W;};AA.prototype.SetRight=function(a){return this.$val.SetRight(a);};AA.ptr.prototype.SetBottom=function(a){var a,b;b=this;b.Y=a-b.H;};AA.prototype.SetBottom=function(a){return this.$val.SetBottom(a);};AA.ptr.prototype.Bottom=function(){var a;a=this;return a.Y+a.H;};AA.prototype.Bottom=function(){return this.$val.Bottom();};AA.ptr.prototype.Right=function(){var a;a=this;return a.X+a.W;};AA.prototype.Right=function(){return this.$val.Right();};AA.ptr.prototype.SetBounds=function(a,b){var a,b,c;c=this;c.X=(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]);c.Y=(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]);c.W=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])-c.X;c.H=(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])-c.Y;};AA.prototype.SetBounds=function(a,b){return this.$val.SetBounds(a,b);};AA.ptr.prototype.Check=function(a,b,c){var a,aa,ab,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;d=this;if(d.Space===AM.nil){return AW.nil;}e=AF();e.checkingObject=d;if(a<0){a=A.Min(a,-1);}else if(a>0){a=A.Max(a,1);}if(b<0){b=A.Min(b,-1);}else if(b>0){b=A.Max(b,1);}e.dx=a;e.dy=b;f=d.BoundsToSpace(a,b);g=f[0];h=f[1];i=f[2];j=f[3];k=$makeMap(AN.keyFor,[]);l=$makeMap(AJ.keyFor,[]);m=h;while(true){if(!(m<=j)){break;}n=g;while(true){if(!(n<=i)){break;}o=d.Space.Cell(n,m);if(!(o===AJ.nil)){p=o.Objects;q=0;while(true){if(!(q=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);t=(s=d.ignoreList[AN.keyFor(r)],s!==undefined?s.v:false);if(r===d||t){q++;continue;}u=(v=k[AN.keyFor(r)],v!==undefined?[v.v,true]:[false,false]);w=u[1];if(((c.$length===0)||r.HasTags(c))&&!w){e.Objects=$append(e.Objects,r);x=r;(k||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(x)]={k:x,v:true};y=(z=l[AJ.keyFor(o)],z!==undefined?[z.v,true]:[false,false]);aa=y[1];if(!aa){e.Cells=$append(e.Cells,o);ab=o;(l||$throwRuntimeError("assignment to entry in nil map"))[AJ.keyFor(ab)]={k:ab,v:true};}q++;continue;}q++;}}n=n+(1)>>0;}m=m+(1)>>0;}if(e.Objects.$length===0){return AW.nil;}return e;};AA.prototype.Check=function(a,b,c){return this.$val.Check(a,b,c);};AA.ptr.prototype.Overlaps=function(a){var a,b;b=this;return a.X<=b.X+b.W&&a.X+a.W>=b.X&&a.Y<=b.Y+b.H&&a.Y+a.H>=b.Y;};AA.prototype.Overlaps=function(a){return this.$val.Overlaps(a);};AA.ptr.prototype.AddToIgnoreList=function(a){var a,b,c;b=this;c=a;(b.ignoreList||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(c)]={k:c,v:true};};AA.prototype.AddToIgnoreList=function(a){return this.$val.AddToIgnoreList(a);};AA.ptr.prototype.RemoveFromIgnoreList=function(a){var a,b;b=this;delete b.ignoreList[AN.keyFor(a)];};AA.prototype.RemoveFromIgnoreList=function(a){return this.$val.RemoveFromIgnoreList(a);};AC=function(a,b,c,d){var a,b,c,d,e,f,g,h,i;e=d.$length;f=c;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(h===e){return;}((h<0||h>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+h]=b*i+((h<0||h>=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+h]));g++;}};AD=function(a,b,c){var a,b,c,d,e,f;d=c;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]=((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f])*(b));e++;}};AF=function(){return new AE.ptr(AN.nil,0,0,new AO([]),AK.nil);};$pkg.NewCollision=AF;AE.ptr.prototype.HasTags=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e===b.checkingObject){d++;continue;}if(e.HasTags(a)){return true;}d++;}return false;};AE.prototype.HasTags=function(a){return this.$val.HasTags(a);};AE.ptr.prototype.ObjectsByTags=function(a){var a,b,c,d,e,f;b=this;c=new AO([]);d=b.Objects;e=0;while(true){if(!(e=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+e]);if(f===b.checkingObject){e++;continue;}if(f.HasTags(a)){c=$append(c,f);}e++;}return c;};AE.prototype.ObjectsByTags=function(a){return this.$val.ObjectsByTags(a);};AE.ptr.prototype.ContactWithObject=function(a){var a,b,c;b=this;c=new B([0,0]);if(b.dx<0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=a.X+a.W-b.checkingObject.X);}else if(b.dx>0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=a.X-b.checkingObject.W-b.checkingObject.X);}if(b.dy<0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=a.Y+a.H-b.checkingObject.Y);}else if(b.dy>0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=a.Y-b.checkingObject.H-b.checkingObject.Y);}return c;};AE.prototype.ContactWithObject=function(a){return this.$val.ContactWithObject(a);};AE.ptr.prototype.ContactWithCell=function(a){var a,b,c,d,e;b=this;c=new B([0,0]);d=(($imul(a.X,b.checkingObject.Space.CellWidth)));e=(($imul(a.Y,b.checkingObject.Space.CellHeight)));if(b.dx<0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=d+(b.checkingObject.Space.CellWidth)-b.checkingObject.X);}else if(b.dx>0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=d-b.checkingObject.W-b.checkingObject.X);}if(b.dy<0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=e+(b.checkingObject.Space.CellHeight)-b.checkingObject.Y);}else if(b.dy>0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=e-b.checkingObject.H-b.checkingObject.Y);}return c;};AE.prototype.ContactWithCell=function(a){return this.$val.ContactWithCell(a);};AE.ptr.prototype.SlideAgainstCell=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;c=this;d=c.checkingObject.Space;f=(e=c.Cells,(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]));g=d.SpaceToWorld(f.X,f.Y);h=g[0];i=g[1];j=(d.CellWidth)/2;k=(d.CellHeight)/2;h=h+(j);i=i+(k);l=c.checkingObject.Center();m=l[0];n=l[1];o=m-h;p=n-i;q=d.Cell(f.X-1>>0,f.Y);r=d.Cell(f.X+1>>0,f.Y);s=d.Cell(f.X,f.Y-1>>0);t=d.Cell(f.X,f.Y+1>>0);u=new B([0,0]);if(!((c.dy===0))){if(o>0&&(r===AJ.nil||!r.ContainsTags(b))){(0>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+0]=h+j-c.checkingObject.X);}else if(o<0&&(q===AJ.nil||!q.ContainsTags(b))){(0>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+0]=h-j-(c.checkingObject.X+c.checkingObject.W));}else{return B.nil;}}if(!((c.dx===0))){if(p>0&&(t===AJ.nil||!t.ContainsTags(b))){(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]=i+k-c.checkingObject.Y);}else if(p<0&&(s===AJ.nil||!s.ContainsTags(b))){(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]=i-k-(c.checkingObject.Y+c.checkingObject.H));}else{return B.nil;}}return u;};AE.prototype.SlideAgainstCell=function(a,b){return this.$val.SlideAgainstCell(a,b);};AH=function(a,b){var a,b;return new AG.ptr(a,b,new AO([]));};AG.ptr.prototype.register=function(a){var a,b;b=this;if(!b.Contains(a)){b.Objects=$append(b.Objects,a);}};AG.prototype.register=function(a){return this.$val.register(a);};AG.ptr.prototype.unregister=function(a){var a,b,c,d,e,f,g,h,i;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(f===a){(i=b.Objects,((e<0||e>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+e]=(g=b.Objects,h=b.Objects.$length-1>>0,((h<0||h>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+h]))));b.Objects=$subslice(b.Objects,0,(b.Objects.$length-1>>0));break;}d++;}};AG.prototype.unregister=function(a){return this.$val.unregister(a);};AG.ptr.prototype.Contains=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e===a){return true;}d++;}return false;};AG.prototype.Contains=function(a){return this.$val.Contains(a);};AG.ptr.prototype.ContainsTags=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.HasTags(a)){return true;}d++;}return false;};AG.prototype.ContainsTags=function(a){return this.$val.ContainsTags(a);};AG.ptr.prototype.Occupied=function(){var a;a=this;return a.Objects.$length>0;};AG.prototype.Occupied=function(){return this.$val.Occupied();};B.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[B],false)},{prop:"Add",name:"Add",pkg:"",typ:$funcType([AP],[B],true)},{prop:"Sub",name:"Sub",pkg:"",typ:$funcType([AP],[B],true)},{prop:"Scale",name:"Scale",pkg:"",typ:$funcType([$Float64],[B],false)},{prop:"Equal",name:"Equal",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"Magnitude",name:"Magnitude",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Magnitude2",name:"Magnitude2",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Unit",name:"Unit",pkg:"",typ:$funcType([],[B],false)},{prop:"Dot",name:"Dot",pkg:"",typ:$funcType([B],[$Float64],false)},{prop:"Cross",name:"Cross",pkg:"",typ:$funcType([B],[B],false)},{prop:"Rotate",name:"Rotate",pkg:"",typ:$funcType([$Float64,AX],[B],true)},{prop:"X",name:"X",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Y",name:"Y",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Z",name:"Z",pkg:"",typ:$funcType([],[$Float64],false)}];AM.methods=[{prop:"Add",name:"Add",pkg:"",typ:$funcType([AO],[],true)},{prop:"Remove",name:"Remove",pkg:"",typ:$funcType([AO],[],true)},{prop:"Objects",name:"Objects",pkg:"",typ:$funcType([],[AO],false)},{prop:"Resize",name:"Resize",pkg:"",typ:$funcType([$Int,$Int],[],false)},{prop:"Cell",name:"Cell",pkg:"",typ:$funcType([$Int,$Int],[AJ],false)},{prop:"CheckCells",name:"CheckCells",pkg:"",typ:$funcType([$Int,$Int,$Int,$Int,AV],[AN],true)},{prop:"CheckCellsWorld",name:"CheckCellsWorld",pkg:"",typ:$funcType([$Float64,$Float64,$Float64,$Float64,AV],[AN],true)},{prop:"UnregisterAllObjects",name:"UnregisterAllObjects",pkg:"",typ:$funcType([],[],false)},{prop:"WorldToSpace",name:"WorldToSpace",pkg:"",typ:$funcType([$Float64,$Float64],[$Int,$Int],false)},{prop:"SpaceToWorld",name:"SpaceToWorld",pkg:"",typ:$funcType([$Int,$Int],[$Float64,$Float64],false)},{prop:"Height",name:"Height",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Width",name:"Width",pkg:"",typ:$funcType([],[$Int],false)},{prop:"CellsInLine",name:"CellsInLine",pkg:"",typ:$funcType([$Int,$Int,$Int,$Int],[AK],false)}];AQ.methods=[{prop:"Project",name:"Project",pkg:"",typ:$funcType([B],[B],false)},{prop:"Normal",name:"Normal",pkg:"",typ:$funcType([],[B],false)},{prop:"Vector",name:"Vector",pkg:"",typ:$funcType([],[B],false)},{prop:"IntersectionPointsLine",name:"IntersectionPointsLine",pkg:"",typ:$funcType([AQ],[B],false)},{prop:"IntersectionPointsCircle",name:"IntersectionPointsCircle",pkg:"",typ:$funcType([AS],[AP],false)}];AT.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"AddPointsVec",name:"AddPointsVec",pkg:"",typ:$funcType([AP],[],true)},{prop:"AddPoints",name:"AddPoints",pkg:"",typ:$funcType([AI],[],true)},{prop:"Lines",name:"Lines",pkg:"",typ:$funcType([],[AR],false)},{prop:"Transformed",name:"Transformed",pkg:"",typ:$funcType([],[AP],false)},{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"SetPositionVec",name:"SetPositionVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Move",name:"Move",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"MoveVec",name:"MoveVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Center",name:"Center",pkg:"",typ:$funcType([],[B],false)},{prop:"Project",name:"Project",pkg:"",typ:$funcType([B],[Z],false)},{prop:"SATAxes",name:"SATAxes",pkg:"",typ:$funcType([],[AP],false)},{prop:"PointInside",name:"PointInside",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"calculateMTV",name:"calculateMTV",pkg:"resolv",typ:$funcType([AU,P],[B],false)},{prop:"ContainedBy",name:"ContainedBy",pkg:"",typ:$funcType([P],[$Bool],false)},{prop:"FlipH",name:"FlipH",pkg:"",typ:$funcType([],[],false)},{prop:"FlipV",name:"FlipV",pkg:"",typ:$funcType([],[],false)},{prop:"ReverseVertexOrder",name:"ReverseVertexOrder",pkg:"",typ:$funcType([],[],false)}];AU.methods=[{prop:"LeftmostPoint",name:"LeftmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"RightmostPoint",name:"RightmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"TopmostPoint",name:"TopmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"BottommostPoint",name:"BottommostPoint",pkg:"",typ:$funcType([],[B],false)}];AS.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"Move",name:"Move",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"MoveVec",name:"MoveVec",pkg:"",typ:$funcType([B],[],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"SetPositionVec",name:"SetPositionVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"PointInside",name:"PointInside",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"IntersectionPointsCircle",name:"IntersectionPointsCircle",pkg:"",typ:$funcType([AS],[AP],false)}];Z.methods=[{prop:"Overlapping",name:"Overlapping",pkg:"",typ:$funcType([Z],[$Bool],false)},{prop:"Overlap",name:"Overlap",pkg:"",typ:$funcType([Z],[$Float64],false)},{prop:"IsInside",name:"IsInside",pkg:"",typ:$funcType([Z],[$Bool],false)}];AN.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[AN],false)},{prop:"Update",name:"Update",pkg:"",typ:$funcType([],[],false)},{prop:"AddTags",name:"AddTags",pkg:"",typ:$funcType([AV],[],true)},{prop:"RemoveTags",name:"RemoveTags",pkg:"",typ:$funcType([AV],[],true)},{prop:"HasTags",name:"HasTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Tags",name:"Tags",pkg:"",typ:$funcType([],[AV],false)},{prop:"SetShape",name:"SetShape",pkg:"",typ:$funcType([P],[],false)},{prop:"BoundsToSpace",name:"BoundsToSpace",pkg:"",typ:$funcType([$Float64,$Float64],[$Int,$Int,$Int,$Int],false)},{prop:"SharesCells",name:"SharesCells",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"SharesCellsTags",name:"SharesCellsTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Center",name:"Center",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetCenter",name:"SetCenter",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"CellPosition",name:"CellPosition",pkg:"",typ:$funcType([],[$Int,$Int],false)},{prop:"SetRight",name:"SetRight",pkg:"",typ:$funcType([$Float64],[],false)},{prop:"SetBottom",name:"SetBottom",pkg:"",typ:$funcType([$Float64],[],false)},{prop:"Bottom",name:"Bottom",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Right",name:"Right",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"SetBounds",name:"SetBounds",pkg:"",typ:$funcType([B,B],[],false)},{prop:"Check",name:"Check",pkg:"",typ:$funcType([$Float64,$Float64,AV],[AW],true)},{prop:"Overlaps",name:"Overlaps",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"AddToIgnoreList",name:"AddToIgnoreList",pkg:"",typ:$funcType([AN],[],false)},{prop:"RemoveFromIgnoreList",name:"RemoveFromIgnoreList",pkg:"",typ:$funcType([AN],[],false)}];AW.methods=[{prop:"HasTags",name:"HasTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"ObjectsByTags",name:"ObjectsByTags",pkg:"",typ:$funcType([AV],[AO],true)},{prop:"ContactWithObject",name:"ContactWithObject",pkg:"",typ:$funcType([AN],[B],false)},{prop:"ContactWithCell",name:"ContactWithCell",pkg:"",typ:$funcType([AJ],[B],false)},{prop:"SlideAgainstCell",name:"SlideAgainstCell",pkg:"",typ:$funcType([AJ,AV],[B],true)}];AJ.methods=[{prop:"register",name:"register",pkg:"resolv",typ:$funcType([AN],[],false)},{prop:"unregister",name:"unregister",pkg:"resolv",typ:$funcType([AN],[],false)},{prop:"Contains",name:"Contains",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"ContainsTags",name:"ContainsTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Occupied",name:"Occupied",pkg:"",typ:$funcType([],[$Bool],false)}];B.init($Float64);N.init("",[{prop:"Cells",name:"Cells",embedded:false,exported:true,typ:AL,tag:""},{prop:"CellWidth",name:"CellWidth",embedded:false,exported:true,typ:$Int,tag:""},{prop:"CellHeight",name:"CellHeight",embedded:false,exported:true,typ:$Int,tag:""}]);P.init([{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)}]);Q.init("",[{prop:"Start",name:"Start",embedded:false,exported:true,typ:B,tag:""},{prop:"End",name:"End",embedded:false,exported:true,typ:B,tag:""}]);S.init("",[{prop:"Points",name:"Points",embedded:false,exported:true,typ:AP,tag:""},{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Closed",name:"Closed",embedded:false,exported:true,typ:$Bool,tag:""}]);U.init("",[{prop:"Points",name:"Points",embedded:false,exported:true,typ:AP,tag:""},{prop:"MTV",name:"MTV",embedded:false,exported:true,typ:B,tag:""},{prop:"Center",name:"Center",embedded:false,exported:true,typ:B,tag:""}]);X.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Radius",name:"Radius",embedded:false,exported:true,typ:$Float64,tag:""}]);Z.init("",[{prop:"Min",name:"Min",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Max",name:"Max",embedded:false,exported:true,typ:$Float64,tag:""}]);AA.init("resolv",[{prop:"Shape",name:"Shape",embedded:false,exported:true,typ:P,tag:""},{prop:"Space",name:"Space",embedded:false,exported:true,typ:AM,tag:""},{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"W",name:"W",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"H",name:"H",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"TouchingCells",name:"TouchingCells",embedded:false,exported:true,typ:AK,tag:""},{prop:"Data",name:"Data",embedded:false,exported:true,typ:$emptyInterface,tag:""},{prop:"ignoreList",name:"ignoreList",embedded:false,exported:false,typ:AY,tag:""},{prop:"tags",name:"tags",embedded:false,exported:false,typ:AV,tag:""}]);AE.init("resolv",[{prop:"checkingObject",name:"checkingObject",embedded:false,exported:false,typ:AN,tag:""},{prop:"dx",name:"dx",embedded:false,exported:false,typ:$Float64,tag:""},{prop:"dy",name:"dy",embedded:false,exported:false,typ:$Float64,tag:""},{prop:"Objects",name:"Objects",embedded:false,exported:true,typ:AO,tag:""},{prop:"Cells",name:"Cells",embedded:false,exported:true,typ:AK,tag:""}]);AG.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Int,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Int,tag:""},{prop:"Objects",name:"Objects",embedded:false,exported:true,typ:AO,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["jsexport/battle"]=(function(){var $pkg={},$init,A,B,C,D,E,F,H,I,J,K,L,M,N,O,Q,V,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,R,S,P,T,U,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL;A=$packages["math"];B=$packages["resolv"];C=$pkg.Vec2D=$newType(0,$kindStruct,"battle.Vec2D",true,"jsexport/battle",true,function(X_,Y_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;return;}this.X=X_;this.Y=Y_;});D=$pkg.Polygon2D=$newType(0,$kindStruct,"battle.Polygon2D",true,"jsexport/battle",true,function(Anchor_,Points_){this.$val=this;if(arguments.length===0){this.Anchor=BJ.nil;this.Points=BK.nil;return;}this.Anchor=Anchor_;this.Points=Points_;});E=$pkg.PlayerDownsync=$newType(0,$kindStruct,"battle.PlayerDownsync",true,"jsexport/battle",true,function(Id_,VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,BattleState_,JoinIndex_,ColliderRadius_,Removed_,Score_,LastMoveGmtMillis_,FramesToRecover_,FramesInChState_,Hp_,MaxHp_,CharacterState_,InAir_){this.$val=this;if(arguments.length===0){this.Id=0;this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.BattleState=0;this.JoinIndex=0;this.ColliderRadius=0;this.Removed=false;this.Score=0;this.LastMoveGmtMillis=0;this.FramesToRecover=0;this.FramesInChState=0;this.Hp=0;this.MaxHp=0;this.CharacterState=0;this.InAir=false;return;}this.Id=Id_;this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.BattleState=BattleState_;this.JoinIndex=JoinIndex_;this.ColliderRadius=ColliderRadius_;this.Removed=Removed_;this.Score=Score_;this.LastMoveGmtMillis=LastMoveGmtMillis_;this.FramesToRecover=FramesToRecover_;this.FramesInChState=FramesInChState_;this.Hp=Hp_;this.MaxHp=MaxHp_;this.CharacterState=CharacterState_;this.InAir=InAir_;});F=$pkg.InputFrameDecoded=$newType(0,$kindStruct,"battle.InputFrameDecoded",true,"jsexport/battle",true,function(Dx_,Dy_,BtnALevel_,BtnBLevel_){this.$val=this;if(arguments.length===0){this.Dx=0;this.Dy=0;this.BtnALevel=0;this.BtnBLevel=0;return;}this.Dx=Dx_;this.Dy=Dy_;this.BtnALevel=BtnALevel_;this.BtnBLevel=BtnBLevel_;});H=$pkg.Barrier=$newType(0,$kindStruct,"battle.Barrier",true,"jsexport/battle",true,function(Boundary_){this.$val=this;if(arguments.length===0){this.Boundary=BL.nil;return;}this.Boundary=Boundary_;});I=$pkg.Bullet=$newType(0,$kindStruct,"battle.Bullet",true,"jsexport/battle",true,function(OriginatedRenderFrameId_,OffenderJoinIndex_,StartupFrames_,CancellableStFrame_,CancellableEdFrame_,ActiveFrames_,HitStunFrames_,BlockStunFrames_,PushbackX_,PushbackY_,Damage_,SelfLockVelX_,SelfLockVelY_,HitboxOffsetX_,HitboxOffsetY_,HitboxSizeX_,HitboxSizeY_,BlowUp_){this.$val=this;if(arguments.length===0){this.OriginatedRenderFrameId=0;this.OffenderJoinIndex=0;this.StartupFrames=0;this.CancellableStFrame=0;this.CancellableEdFrame=0;this.ActiveFrames=0;this.HitStunFrames=0;this.BlockStunFrames=0;this.PushbackX=0;this.PushbackY=0;this.Damage=0;this.SelfLockVelX=0;this.SelfLockVelY=0;this.HitboxOffsetX=0;this.HitboxOffsetY=0;this.HitboxSizeX=0;this.HitboxSizeY=0;this.BlowUp=false;return;}this.OriginatedRenderFrameId=OriginatedRenderFrameId_;this.OffenderJoinIndex=OffenderJoinIndex_;this.StartupFrames=StartupFrames_;this.CancellableStFrame=CancellableStFrame_;this.CancellableEdFrame=CancellableEdFrame_;this.ActiveFrames=ActiveFrames_;this.HitStunFrames=HitStunFrames_;this.BlockStunFrames=BlockStunFrames_;this.PushbackX=PushbackX_;this.PushbackY=PushbackY_;this.Damage=Damage_;this.SelfLockVelX=SelfLockVelX_;this.SelfLockVelY=SelfLockVelY_;this.HitboxOffsetX=HitboxOffsetX_;this.HitboxOffsetY=HitboxOffsetY_;this.HitboxSizeX=HitboxSizeX_;this.HitboxSizeY=HitboxSizeY_;this.BlowUp=BlowUp_;});J=$pkg.MeleeBullet=$newType(0,$kindStruct,"battle.MeleeBullet",true,"jsexport/battle",true,function(Bullet_){this.$val=this;if(arguments.length===0){this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,false);return;}this.Bullet=Bullet_;});K=$pkg.FireballBullet=$newType(0,$kindStruct,"battle.FireballBullet",true,"jsexport/battle",true,function(VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,Bullet_){this.$val=this;if(arguments.length===0){this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,false);return;}this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.Bullet=Bullet_;});L=$pkg.Skill=$newType(0,$kindStruct,"battle.Skill",true,"jsexport/battle",true,function(BattleLocalId_,RecoveryFrames_,RecoveryFramesOnBlock_,RecoveryFramesOnHit_,ReleaseTriggerType_,Hits_){this.$val=this;if(arguments.length===0){this.BattleLocalId=0;this.RecoveryFrames=0;this.RecoveryFramesOnBlock=0;this.RecoveryFramesOnHit=0;this.ReleaseTriggerType=0;this.Hits=AM.nil;return;}this.BattleLocalId=BattleLocalId_;this.RecoveryFrames=RecoveryFrames_;this.RecoveryFramesOnBlock=RecoveryFramesOnBlock_;this.RecoveryFramesOnHit=RecoveryFramesOnHit_;this.ReleaseTriggerType=ReleaseTriggerType_;this.Hits=Hits_;});M=$pkg.RoomDownsyncFrame=$newType(0,$kindStruct,"battle.RoomDownsyncFrame",true,"jsexport/battle",true,function(Id_,PlayersArr_,CountdownNanos_,MeleeBullets_,FireballBullets_,BackendUnconfirmedMask_,ShouldForceResync_,PlayerOpPatternToSkillId_){this.$val=this;if(arguments.length===0){this.Id=0;this.PlayersArr=AZ.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=BA.nil;this.FireballBullets=BH.nil;this.BackendUnconfirmedMask=new $Uint64(0,0);this.ShouldForceResync=false;this.PlayerOpPatternToSkillId=false;return;}this.Id=Id_;this.PlayersArr=PlayersArr_;this.CountdownNanos=CountdownNanos_;this.MeleeBullets=MeleeBullets_;this.FireballBullets=FireballBullets_;this.BackendUnconfirmedMask=BackendUnconfirmedMask_;this.ShouldForceResync=ShouldForceResync_;this.PlayerOpPatternToSkillId=PlayerOpPatternToSkillId_;});N=$pkg.InputFrameDownsync=$newType(0,$kindStruct,"battle.InputFrameDownsync",true,"jsexport/battle",true,function(InputFrameId_,InputList_,ConfirmedList_){this.$val=this;if(arguments.length===0){this.InputFrameId=0;this.InputList=AY.nil;this.ConfirmedList=new $Uint64(0,0);return;}this.InputFrameId=InputFrameId_;this.InputList=InputList_;this.ConfirmedList=ConfirmedList_;});O=$pkg.RingBuffer=$newType(0,$kindStruct,"battle.RingBuffer",true,"jsexport/battle",true,function(Ed_,St_,EdFrameId_,StFrameId_,N_,Cnt_,Eles_){this.$val=this;if(arguments.length===0){this.Ed=0;this.St=0;this.EdFrameId=0;this.StFrameId=0;this.N=0;this.Cnt=0;this.Eles=AM.nil;return;}this.Ed=Ed_;this.St=St_;this.EdFrameId=EdFrameId_;this.StFrameId=StFrameId_;this.N=N_;this.Cnt=Cnt_;this.Eles=Eles_;});Q=$pkg.CharacterConfig=$newType(0,$kindStruct,"battle.CharacterConfig",true,"jsexport/battle",true,function(SpeciesId_,SpeciesName_,InAirIdleFrameIdxTurningPoint_,InAirIdleFrameIdxTurnedCycle_,LayDownFrames_,LayDownFramesToRecover_,GetUpFrames_,GetUpFramesToRecover_,JumpingInitVelY_,PatternIdToSkillId_){this.$val=this;if(arguments.length===0){this.SpeciesId=0;this.SpeciesName="";this.InAirIdleFrameIdxTurningPoint=0;this.InAirIdleFrameIdxTurnedCycle=0;this.LayDownFrames=0;this.LayDownFramesToRecover=0;this.GetUpFrames=0;this.GetUpFramesToRecover=0;this.JumpingInitVelY=0;this.PatternIdToSkillId=false;return;}this.SpeciesId=SpeciesId_;this.SpeciesName=SpeciesName_;this.InAirIdleFrameIdxTurningPoint=InAirIdleFrameIdxTurningPoint_;this.InAirIdleFrameIdxTurnedCycle=InAirIdleFrameIdxTurnedCycle_;this.LayDownFrames=LayDownFrames_;this.LayDownFramesToRecover=LayDownFramesToRecover_;this.GetUpFrames=GetUpFrames_;this.GetUpFramesToRecover=GetUpFramesToRecover_;this.JumpingInitVelY=JumpingInitVelY_;this.PatternIdToSkillId=PatternIdToSkillId_;});V=$pkg.SatResult=$newType(0,$kindStruct,"battle.SatResult",true,"jsexport/battle",true,function(Overlap_,OverlapX_,OverlapY_,AContainedInB_,BContainedInA_,Axis_){this.$val=this;if(arguments.length===0){this.Overlap=0;this.OverlapX=0;this.OverlapY=0;this.AContainedInB=false;this.BContainedInA=false;this.Axis=B.Vector.nil;return;}this.Overlap=Overlap_;this.OverlapX=OverlapX_;this.OverlapY=OverlapY_;this.AContainedInB=AContainedInB_;this.BContainedInA=BContainedInA_;this.Axis=Axis_;});AM=$sliceType($emptyInterface);AN=$sliceType($Int32);AO=$sliceType(AN);AP=$ptrType(V);AQ=$sliceType(C);AR=$sliceType($String);AS=$ptrType(B.Collision);AT=$ptrType(AQ);AU=$ptrType(E);AV=$ptrType(J);AW=$ptrType(B.ConvexPolygon);AX=$ptrType(N);AY=$sliceType($Uint64);AZ=$sliceType(AU);BA=$sliceType(AV);BB=$sliceType(AT);BC=$sliceType($Bool);BD=$ptrType(L);BE=$ptrType(B.Object);BF=$sliceType(BE);BG=$ptrType(K);BH=$sliceType(BG);BI=$sliceType($Float64);BJ=$ptrType(C);BK=$sliceType(BJ);BL=$ptrType(D);BM=$mapType($Int,$Int);BN=$ptrType(O);P=function(a){var a;return new O.ptr(0,0,0,0,a,0,$makeSlice(AM,a));};$pkg.NewRingBuffer=P;O.ptr.prototype.Put=function(a){var a,b,c,d;b=this;while(true){if(!(0=b.N)){break;}b.Pop();}(c=b.Eles,d=b.Ed,((d<0||d>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]=a));b.EdFrameId=b.EdFrameId+(1)>>0;b.Cnt=b.Cnt+(1)>>0;b.Ed=b.Ed+(1)>>0;if(b.Ed>=b.N){b.Ed=b.Ed-(b.N)>>0;}};O.prototype.Put=function(a){return this.$val.Put(a);};O.ptr.prototype.Pop=function(){var a,b,c,d;a=this;if(0===a.Cnt){return $ifaceNil;}d=(b=a.Eles,c=a.St,((c<0||c>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]));a.StFrameId=a.StFrameId+(1)>>0;a.Cnt=a.Cnt-(1)>>0;a.St=a.St+(1)>>0;if(a.St>=a.N){a.St=a.St-(a.N)>>0;}return d;};O.prototype.Pop=function(){return this.$val.Pop();};O.ptr.prototype.GetArrIdxByOffset=function(a){var a,b,c;b=this;if((0===b.Cnt)||0>a){return-1;}c=b.St+a>>0;if(b.St=b.N){c=c-(b.N)>>0;}if(c>=b.St||c=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+c]));};O.prototype.GetByOffset=function(a){return this.$val.GetByOffset(a);};O.ptr.prototype.GetByFrameId=function(a){var a,b;b=this;if(a>=b.EdFrameId||a>0);};O.prototype.GetByFrameId=function(a){return this.$val.GetByFrameId(a);};O.ptr.prototype.SetByFrameId=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;c=this;d=c.StFrameId;e=c.EdFrameId;f=d;g=e;if(bb){h=c.GetArrIdxByOffset(b-c.StFrameId>>0);if(!((-1===h))){(i=c.Eles,((h<0||h>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+h]=a));return[0,f,g];}}j=0;if(g>0))>>$min(c,31))>>0);};$pkg.ConvertToInputFrameId=T;U=function(a){var a,b,c,d,e,f,g,h;b=new $Uint64(a.$high&0,(a.$low&15)>>>0);d=(((c=$shiftRightUint64(a,4),new $Uint64(c.$high&0,(c.$low&1)>>>0)).$low>>0));f=(((e=$shiftRightUint64(a,5),new $Uint64(e.$high&0,(e.$low&1)>>>0)).$low>>0));return new F.ptr((g=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])),(h=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])),d,f);};W=function(a,b,c,d){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred,$r,$c}=$restore(this,{a,b,c,d});$s=$s||0;var $err=null;try{s:while(true){switch($s){case 0:$deferred=[];$curGoroutine.deferStack.push($deferred);c=[c];e=[e];f=[f];g=c[0].Position();e[0]=g[0];f[0]=g[1];$deferred.push([(function(c,e,f){return function(){c[0].SetPosition(e[0],f[0]);};})(c,e,f),[]]);c[0].SetPosition(e[0]+a,f[0]+b);h=new V.ptr(0,0,0,true,true,new B.Vector([0,0]));i=X(c[0],d,h);if(i){$s=1;continue;}$s=2;continue;case 1:j=h.Overlap*h.OverlapX;k=h.Overlap*h.OverlapY;l=j;m=k;n=[true,l,m,h];$s=4;case 4:return n;case 2:o=[false,0,0,h];$s=5;case 5:return o;case 3:$s=-1;return[false,0,0,AP.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,AP.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:W,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=W;X=function(a,b,c){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;d=a.Points.$length;e=b.Points.$length;f=d;g=e;if((1===f)&&(1===g)){if(!(AP.nil===c)){c.Overlap=0;}return((h=(i=a.Points,(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])),(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]))===(j=(k=b.Points,(0>=k.$length?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+0])),(0>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+0])))&&((l=(m=a.Points,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0])),(1>=l.$length?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+1]))===(n=(o=b.Points,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])),(1>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+1])));}if(1=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(Y(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(Y(a,b,u.Unit(),c)){return false;}t++;}}return true;};Y=function(a,b,c,d){var a,aa,ab,ac,ad,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;e=1.7e+308;f=-1.7e+308;g=1.7e+308;h=-1.7e+308;i=e;j=f;k=g;l=h;m=a.Points;n=0;while(true){if(!(n=m.$length)?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+n]);p=((0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])+a.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+1])+a.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(i>p){i=p;}if(j=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+r]);t=((0>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+0])+b.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1])+b.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(k>t){k=t;}if(ll||jl){u=i-l;d.AContainedInB=false;}else{x=j-k;y=l-i;if(x=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+0])))&&(0===(ac=d.Axis,(1>=ac.$length?($throwRuntimeError("index out of range"),undefined):ac.$array[ac.$offset+1]))))||z>aa){ad=1;if(u<0){ad=-1;}d.Overlap=aa;d.OverlapX=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])*ad;d.OverlapY=(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1])*ad;}d.Axis=c;}return false;};Z=function(a,b){var a,b,c,d;c=((A.Floor(a*100)>>0));d=((A.Floor(b*100)>>0));return[c,d];};$pkg.WorldToVirtualGridPos=Z;AA=function(a,b){var a,b,c,d;c=(a)*0.01;d=(b)*0.01;return[c,d];};$pkg.VirtualGridToWorldPos=AA;AB=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a-c-g+i,b-d-f+j];};$pkg.WorldToPolygonColliderBLPos=AB;AC=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a+c+g-i,b+d+f-j];};$pkg.PolygonColliderBLToWorldPos=AC;AD=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j,k,l,m;k=AC(a,b,c,d,e,f,g,h,i,j);l=k[0];m=k[1];return Z(l,m);};$pkg.PolygonColliderBLToVirtualGridPos=AD;AE=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j,k,l,m;k=AA(a,b);l=k[0];m=k[1];return AB(l,m,c,d,e,f,g,h,i,j);};$pkg.VirtualGridToPolygonColliderBLPos=AE;AF=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=[f];f[0]=$makeSlice(AQ,0,10);g=b.Check(0,0,new AR([]));if(AS.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new AT(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}h=g.Objects;i=0;case 1:if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);k=false;l=j.Data;if($assertType(l,AU,true)[1]){}else if($assertType(l,AV,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,AW);o=W(0,0,c,m);$s=3;case 3:if($c){$c=false;o=o.$blk();}if(o&&o.$blk!==undefined){break s;}n=o;p=n[0];q=n[1];r=n[2];s=n[3];if(!p){i++;$s=1;continue;}t=(s.Overlap-d)*s.OverlapX;u=(s.Overlap-d)*s.OverlapY;q=t;r=u;f[0]=$append(f[0],new C.ptr(s.OverlapX,s.OverlapY));e.X=e.X+(q);e.Y=e.Y+(r);i++;$s=1;continue;case 2:$s=-1;return(f.$ptr||(f.$ptr=new AT(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}return;}var $f={$blk:AF,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s};return $f;};AG=function(a,b,c,d,e,f){var a,aa,ab,ac,ad,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;g=T(c.Id,e,f);h=T(c.Id-1>>0,e,f);if(0>=g){return[-2,false,0,0];}i=$assertType(d.GetByFrameId(g),AX).InputList;j=AY.nil;if(0>0,((m<0||m>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+m])));o=n.Dx;p=n.Dy;q=o;r=p;s=0;t=0;u=s;v=t;if(!(AY.nil===j)){x=U((w=l-1>>0,((w<0||w>=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+w])));u=x.BtnALevel;v=x.BtnBLevel;}if(n.BtnBLevel>v){y=(z=S[$Int32.keyFor(a.CharacterState)],z!==undefined?[z.v,true]:[false,false]);aa=y[1];if(!aa){k=true;}}ab=-1;if(n.BtnALevel>u){if(a.InAir){ab=1;}else{ab=0;}ac=0;ad=0;q=ac;r=ad;}return[ab,k,q,r];};AH=function(a,b,c,d,e,f,g){var{a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g});$s=$s||0;s:while(true){switch($s){case 0:h=b.PlayersArr.$length;i=$makeSlice(AZ,h);j=b.PlayersArr;k=0;while(true){if(!(k=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+k]);((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]=new E.ptr(m.Id,m.VirtualGridX,m.VirtualGridY,m.DirX,m.DirY,m.VelX,m.VelY,m.Speed,m.BattleState,m.JoinIndex,0,m.Removed,m.Score,0,m.FramesToRecover-1>>0,m.FramesInChState+1>>0,m.Hp,m.MaxHp,m.CharacterState,true));if(((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesToRecover<0){((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesToRecover=0;}k++;}n=$makeSlice(BA,0,b.MeleeBullets.$length);o=$makeSlice(AQ,h);p=$makeSlice(BB,h);q=$makeSlice(BC,h);r=b.PlayersArr;s=0;while(true){if(!(s=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+s]);((u<0||u>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+u]=false);w=((u<0||u>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+u]);x=((u<0||u>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+u]);y=AG(v,x,b,a,8,2);z=y[0];aa=y[1];ab=y[2];ac=y[3];if(-2===z){s++;continue;}if(aa){x.VelY=(w.JumpingInitVelY);((u<0||u>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+u]=true);}ad=v.JoinIndex;if(!((-1===z))){ae=(af=w.PatternIdToSkillId[$Int.keyFor(z)],af!==undefined?[af.v,true]:[0,false]);ag=ae[0];ah=ae[1];if(ah){aj=(ai=R[$Int.keyFor(ag)],ai!==undefined?ai.v:BD.nil);ak=(al=aj.Hits,(0>=al.$length?($throwRuntimeError("index out of range"),undefined):al.$array[al.$offset+0]));if($assertType(ak,AV,true)[1]){am=ak.$val;t[0]=$clone(am,J);t[0].Bullet.OriginatedRenderFrameId=b.Id;t[0].Bullet.OffenderJoinIndex=ad;n=$append(n,t[0]);x.FramesToRecover=aj.RecoveryFrames;}x.CharacterState=2;if(false===v.InAir){x.VelX=0;}}s++;continue;}if(!((0===ab))||!((0===ac))){an=ab;ao=ac;x.DirX=an;x.DirY=ao;x.VelX=$imul(ab,v.Speed);x.CharacterState=1;}else{x.CharacterState=0;x.VelX=0;}s++;}ap=b.PlayersArr;aq=0;case 1:if(!(aq=ap.$length)?($throwRuntimeError("index out of range"),undefined):ap.$array[ap.$offset+aq]);at=as.JoinIndex;au=0;av=0;(aw=at-1>>0,((aw<0||aw>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+aw])).X=au;(ax=at-1>>0,((ax<0||ax>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ax])).Y=av;ay=131072+at>>0;ba=(az=d[$Int32.keyFor(ay)],az!==undefined?az.v:BE.nil);bb=((ar<0||ar>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ar]);bc=((ar<0||ar>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ar]);bd=as.VirtualGridX+as.VelX>>0;be=as.VirtualGridY+as.VelY>>0;bf=bd;bg=be;if(((ar<0||ar>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+ar])){bg=bg+(bc.JumpingInitVelY)>>0;}bh=AE(bf,bg,ba.W*0.5,ba.H*0.5,0,0,0,0,e,f);ba.X=bh[0];ba.Y=bh[1];$r=ba.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if(as.InAir){bb.VelX=bb.VelX+(0)>>0;bb.VelY=bb.VelY+(-50)>>0;}aq++;$s=1;continue;case 2:bi=$makeSlice(BF,0,b.MeleeBullets.$length);bj=b.MeleeBullets;bk=0;case 4:if(!(bk=bj.$length)?($throwRuntimeError("index out of range"),undefined):bj.$array[bj.$offset+bk]);if(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)<=b.Id)&&(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)+bl.Bullet.ActiveFrames>>0)>b.Id)){$s=6;continue;}$s=7;continue;case 6:bo=(bm=b.PlayersArr,bn=bl.Bullet.OffenderJoinIndex-1>>0,((bn<0||bn>=bm.$length)?($throwRuntimeError("index out of range"),undefined):bm.$array[bm.$offset+bn]));bp=1;if(0>bo.DirX){bp=-bp;}bq=AA(bo.VirtualGridX+($imul(bp,bl.Bullet.HitboxOffsetX))>>0,bo.VirtualGridY);br=bq[0];bs=bq[1];bt=AA(bl.Bullet.HitboxSizeX,bl.Bullet.HitboxSizeY);bu=bt[0];bv=bt[1];bw=AI(br,bs,bu,bv,0.1,0.1,0.1,0.1,e,f,bl,"MeleeBullet");$s=9;case 9:if($c){$c=false;bw=bw.$blk();}if(bw&&bw.$blk!==undefined){break s;}bx=bw;$r=c.Add(new BF([bx]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}bi=$append(bi,bx);$s=8;continue;case 7:n=$append(n,bl);case 8:bk++;$s=4;continue;case 5:by=b.PlayersArr;bz=0;case 11:if(!(bz=by.$length)?($throwRuntimeError("index out of range"),undefined):by.$array[by.$offset+bz]);cc=cb.JoinIndex;cd=131072+cc>>0;cf=(ce=d[$Int32.keyFor(cd)],ce!==undefined?ce.v:BE.nil);cg=$assertType(cf.Shape,AW);ci=AF(cc,cf,cg,0.1,(ch=cc-1>>0,((ch<0||ch>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ch])));$s=13;case 13:if($c){$c=false;ci=ci.$blk();}if(ci&&ci.$blk!==undefined){break s;}(cj=cc-1>>0,((cj<0||cj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+cj]=ci));ck=((ca<0||ca>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ca]);cl=((ca<0||ca>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ca]);cm=false;cn=cf.Check(0,0,new AR([]));if(!(AS.nil===cn)){$s=14;continue;}$s=15;continue;case 14:co=cn.Objects;cp=0;case 16:if(!(cp=co.$length)?($throwRuntimeError("index out of range"),undefined):co.$array[co.$offset+cp]);cr=false;cs=false;ct=false;cu=cr;cv=cs;cw=ct;cx=cq.Data;if($assertType(cx,AU,true)[1]){cv=true;}else if($assertType(cx,AV,true)[1]){cw=true;}else{cu=true;}if(cw){cp++;$s=16;continue;}cy=$assertType(cq.Shape,AW);da=W(0,0,cg,cy);$s=18;case 18:if($c){$c=false;da=da.$blk();}if(da&&da.$blk!==undefined){break s;}cz=da;db=cz[0];dc=cz[1];dd=cz[2];de=cz[3];if(!db){cp++;$s=16;continue;}df=de.OverlapX*0+de.OverlapY*-1;if(cv){dg=(de.Overlap-0.2)*de.OverlapX;dh=(de.Overlap-0.2)*de.OverlapY;dc=dg;dd=dh;}di=(dj=cc-1>>0,((dj<0||dj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+dj])).$get();dk=0;while(true){if(!(dk=di.$length)?($throwRuntimeError("index out of range"),undefined):di.$array[di.$offset+dk]),C);dm=dc*dl.X+dd*dl.Y;if(cu||(cv&&0>dm)){dc=dc-(dm*dl.X);dd=dd-(dm*dl.Y);}dk++;}dn=cc-1>>0;((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X=((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X+(dc);dp=cc-1>>0;((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y=((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y+(dd);if(0.5=cb.VelY){ck.VelX=0;ck.VelY=0;if(8===ck.CharacterState){ck.CharacterState=9;ck.FramesToRecover=cl.LayDownFramesToRecover;}else{ck.CharacterState=0;ck.FramesToRecover=0;}}else{if(9===ck.CharacterState){if(0===ck.FramesToRecover){ck.CharacterState=10;ck.FramesToRecover=cl.GetUpFramesToRecover;}}else if(10===ck.CharacterState){if(ck.FramesInChState===cl.GetUpFrames){ck.CharacterState=0;}}}}bz++;$s=11;continue;case 12:dq=bi;dr=0;case 19:if(!(dr=dq.$length)?($throwRuntimeError("index out of range"),undefined):dq.$array[dq.$offset+dr]);dt=ds.Check(0,0,new AR([]));ds.Space.Remove(new BF([ds]));du=ds.Data;if($assertType(du,AV,true)[1]){$s=21;continue;}$s=22;continue;case 21:dv=du.$val;if(AS.nil===dt){n=$append(n,dv);dr++;$s=19;continue;}dw=$assertType(ds.Shape,AW);dz=(dx=b.PlayersArr,dy=dv.Bullet.OffenderJoinIndex-1>>0,((dy<0||dy>=dx.$length)?($throwRuntimeError("index out of range"),undefined):dx.$array[dx.$offset+dy]));ea=dt.Objects;eb=0;case 23:if(!(eb=ea.$length)?($throwRuntimeError("index out of range"),undefined):ea.$array[ea.$offset+eb]);ed=$assertType(ec.Shape,AW);ee=ec.Data;if($assertType(ee,AU,true)[1]){$s=25;continue;}$s=26;continue;case 25:ef=ee.$val;if(dv.Bullet.OffenderJoinIndex===ef.JoinIndex){eb++;$s=23;continue;}ei=W(0,0,dw,ed);$s=28;case 28:if($c){$c=false;ei=ei.$blk();}if(ei&&ei.$blk!==undefined){break s;}eh=ei;ej=eh[0];if(!ej){eb++;$s=23;continue;}ek=ef.JoinIndex;el=1;if(0>dz.DirX){el=-el;}em=AA($imul(-el,dv.Bullet.PushbackX),dv.Bullet.PushbackY);en=em[0];eo=em[1];ep=(eq=ek-1>>0,((eq<0||eq>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+eq])).$get();er=0;while(true){if(!(er=ep.$length)?($throwRuntimeError("index out of range"),undefined):ep.$array[ep.$offset+er]),C);et=en*es.X+eo*es.Y;if(0>et){en=en-(et*es.X);eo=eo-(et*es.Y);}er++;}eu=ek-1>>0;((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X=((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X+(en);ev=ek-1>>0;((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y=((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y+(eo);ex=(ew=ef.JoinIndex-1>>0,((ew<0||ew>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ew]));if(dv.Bullet.BlowUp){ex.CharacterState=8;}else{ex.CharacterState=3;}ez=(ey=ef.JoinIndex-1>>0,((ey<0||ey>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ey])).FramesToRecover;if(dv.Bullet.HitStunFrames>ez){ex.FramesToRecover=dv.Bullet.HitStunFrames;}$s=27;continue;case 26:eg=ee;case 27:eb++;$s=23;continue;case 24:case 22:dr++;$s=19;continue;case 20:fa=b.PlayersArr;fb=0;while(true){if(!(fb=fa.$length)?($throwRuntimeError("index out of range"),undefined):fa.$array[fa.$offset+fb]);fe=fd.JoinIndex;ff=131072+fe>>0;fh=(fg=d[$Int32.keyFor(ff)],fg!==undefined?fg.v:BE.nil);fi=((fc<0||fc>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+fc]);fj=AD(fh.X-(fk=fe-1>>0,((fk<0||fk>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fk])).X,fh.Y-(fl=fe-1>>0,((fl<0||fl>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fl])).Y,fh.W*0.5,fh.H*0.5,0,0,0,0,e,f);fi.VirtualGridX=fj[0];fi.VirtualGridY=fj[1];if(fi.InAir){fm=fi.CharacterState;fn=fm;if((fn===(0))||(fn===(1))){if(((fc<0||fc>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+fc])||(5===fd.CharacterState)){fi.CharacterState=5;}else{fi.CharacterState=4;}}else if(fn===(2)){fi.CharacterState=6;}else if(fn===(3)){fi.CharacterState=7;}}if(!((fi.CharacterState===fd.CharacterState))){fi.FramesInChState=0;}fb++;}$s=-1;return new M.ptr(b.Id+1>>0,i,new $Int64(0,0),n,BH.nil,new $Uint64(0,0),false,false);}return;}var $f={$blk:AH,$c:true,$r,a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame=AH;AI=function(a,b,c,d,e,f,g,h,i,j,k,l){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l});$s=$s||0;s:while(true){switch($s){case 0:m=AB(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AJ(n,o,g+c+h,f+d+e,k,l);$s=1;case 1:if($c){$c=false;p=p.$blk();}if(p&&p.$blk!==undefined){break s;}q=p;$s=2;case 2:return q;}return;}var $f={$blk:AI,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s};return $f;};$pkg.GenerateRectCollider=AI;AJ=function(a,b,c,d,e,f){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e,f});$s=$s||0;s:while(true){switch($s){case 0:g=B.NewObject(a,b,c,d,new AR([f]));h=B.NewRectangle(0,0,c,d);$r=g.SetShape(h);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}g.Data=e;$s=-1;return g;}return;}var $f={$blk:AJ,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AK=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=AL(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BI.nil);l=f.Points;m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);p=f.Points;q=0;while(true){if(!(q=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(n===r){q++;continue;}if(A.Abs(s.X-o.X)>i){i=A.Abs(s.X-o.X);}if(A.Abs(s.Y-o.Y)>j){j=A.Abs(s.Y-o.Y);}q++;}m++;}t=0;while(true){if(!(t=u.$length)?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+t]));k.AddPoints(new BI([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new AR([e]));$r=w.SetShape(k);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}w.Data=d;$s=-1;return w;}return;}var $f={$blk:AK,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s};return $f;};$pkg.GenerateConvexPolygonCollider=AK;AL=function(a){var a,b,c,d,e,f,g,h,i,j,k;b=new C.ptr(1.7e+308,1.7e+308);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.X=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+h]);(k=f.Points,((i<0||i>=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+i]=new C.ptr(j.X-b.X,j.Y-b.Y)));h++;}return f;};$pkg.AlignPolygon2DToBoundingBox=AL;BN.methods=[{prop:"Put",name:"Put",pkg:"",typ:$funcType([$emptyInterface],[],false)},{prop:"Pop",name:"Pop",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"GetArrIdxByOffset",name:"GetArrIdxByOffset",pkg:"",typ:$funcType([$Int32],[$Int32],false)},{prop:"GetByOffset",name:"GetByOffset",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"GetByFrameId",name:"GetByFrameId",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"SetByFrameId",name:"SetByFrameId",pkg:"",typ:$funcType([$emptyInterface,$Int32],[$Int32,$Int32,$Int32],false)}];C.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""}]);D.init("",[{prop:"Anchor",name:"Anchor",embedded:false,exported:true,typ:BJ,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BK,tag:""}]);E.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BattleState",name:"BattleState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JoinIndex",name:"JoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ColliderRadius",name:"ColliderRadius",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Removed",name:"Removed",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"Score",name:"Score",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"LastMoveGmtMillis",name:"LastMoveGmtMillis",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesToRecover",name:"FramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesInChState",name:"FramesInChState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Hp",name:"Hp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"MaxHp",name:"MaxHp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CharacterState",name:"CharacterState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InAir",name:"InAir",embedded:false,exported:true,typ:$Bool,tag:""}]);F.init("",[{prop:"Dx",name:"Dx",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Dy",name:"Dy",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnALevel",name:"BtnALevel",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnBLevel",name:"BtnBLevel",embedded:false,exported:true,typ:$Int32,tag:""}]);H.init("",[{prop:"Boundary",name:"Boundary",embedded:false,exported:true,typ:BL,tag:""}]);I.init("",[{prop:"OriginatedRenderFrameId",name:"OriginatedRenderFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"OffenderJoinIndex",name:"OffenderJoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"StartupFrames",name:"StartupFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CancellableStFrame",name:"CancellableStFrame",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CancellableEdFrame",name:"CancellableEdFrame",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ActiveFrames",name:"ActiveFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitStunFrames",name:"HitStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BlockStunFrames",name:"BlockStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackX",name:"PushbackX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackY",name:"PushbackY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Damage",name:"Damage",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"SelfLockVelX",name:"SelfLockVelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"SelfLockVelY",name:"SelfLockVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxOffsetX",name:"HitboxOffsetX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxOffsetY",name:"HitboxOffsetY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxSizeX",name:"HitboxSizeX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxSizeY",name:"HitboxSizeY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BlowUp",name:"BlowUp",embedded:false,exported:true,typ:$Bool,tag:""}]);J.init("",[{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);K.init("",[{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);L.init("",[{prop:"BattleLocalId",name:"BattleLocalId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFrames",name:"RecoveryFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnBlock",name:"RecoveryFramesOnBlock",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnHit",name:"RecoveryFramesOnHit",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ReleaseTriggerType",name:"ReleaseTriggerType",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Hits",name:"Hits",embedded:false,exported:true,typ:AM,tag:""}]);M.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:AZ,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:BA,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BH,tag:""},{prop:"BackendUnconfirmedMask",name:"BackendUnconfirmedMask",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"ShouldForceResync",name:"ShouldForceResync",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"PlayerOpPatternToSkillId",name:"PlayerOpPatternToSkillId",embedded:false,exported:true,typ:BM,tag:""}]);N.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:AY,tag:""},{prop:"ConfirmedList",name:"ConfirmedList",embedded:false,exported:true,typ:$Uint64,tag:""}]);O.init("",[{prop:"Ed",name:"Ed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"St",name:"St",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"EdFrameId",name:"EdFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"StFrameId",name:"StFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"N",name:"N",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Cnt",name:"Cnt",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Eles",name:"Eles",embedded:false,exported:true,typ:AM,tag:""}]);Q.init("",[{prop:"SpeciesId",name:"SpeciesId",embedded:false,exported:true,typ:$Int,tag:""},{prop:"SpeciesName",name:"SpeciesName",embedded:false,exported:true,typ:$String,tag:""},{prop:"InAirIdleFrameIdxTurningPoint",name:"InAirIdleFrameIdxTurningPoint",embedded:false,exported:true,typ:$Int,tag:""},{prop:"InAirIdleFrameIdxTurnedCycle",name:"InAirIdleFrameIdxTurnedCycle",embedded:false,exported:true,typ:$Int,tag:""},{prop:"LayDownFrames",name:"LayDownFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"LayDownFramesToRecover",name:"LayDownFramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"GetUpFrames",name:"GetUpFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"GetUpFramesToRecover",name:"GetUpFramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JumpingInitVelY",name:"JumpingInitVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PatternIdToSkillId",name:"PatternIdToSkillId",embedded:false,exported:true,typ:BM,tag:""}]);V.init("",[{prop:"Overlap",name:"Overlap",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"OverlapX",name:"OverlapX",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"OverlapY",name:"OverlapY",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"AContainedInB",name:"AContainedInB",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"BContainedInA",name:"BContainedInA",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"Axis",name:"Axis",embedded:false,exported:true,typ:B.Vector,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$pkg.Characters=$makeMap($Int.keyFor,[{k:0,v:new Q.ptr(0,"MonkGirl",11,1,16,16,33,30,800,$makeMap($Int.keyFor,[{k:0,v:1},{k:1,v:2}]))}]);R=$makeMap($Int.keyFor,[{k:1,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,5,0,0,10,18,9,800,0,5,0,0,1200,0,2400,3200,false))]))},{k:2,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,3,0,0,20,18,9,600,0,5,0,0,1200,0,3200,2400,false))]))}]);$pkg.DIRECTION_DECODER=new AO([new AN([0,0]),new AN([0,2]),new AN([0,-2]),new AN([2,0]),new AN([-2,0]),new AN([1,1]),new AN([-1,-1]),new AN([1,-1]),new AN([-1,1])]);S=$makeMap($Int32.keyFor,[{k:4,v:true},{k:5,v:true},{k:6,v:true},{k:7,v:true},{k:8,v:true}]);}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["jsexport"]=(function(){var $pkg={},$init,A,B,C,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,BB,BC,BD,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;A=$packages["github.com/gopherjs/gopherjs/js"];B=$packages["jsexport/battle"];C=$packages["resolv"];S=$sliceType($Uint64);T=$ptrType(B.Vec2D);U=$sliceType(T);V=$ptrType(B.Polygon2D);W=$ptrType(B.PlayerDownsync);X=$sliceType(W);Y=$ptrType(B.MeleeBullet);Z=$sliceType(Y);AA=$ptrType(B.FireballBullet);AB=$sliceType(AA);AC=$ptrType(A.Object);AD=$sliceType(AC);AE=$ptrType(B.CharacterConfig);AF=$funcType([$Float64,$Float64],[AC],false);AG=$funcType([T,U],[AC],false);AH=$funcType([V],[AC],false);AI=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool,$Float64],[AC],false);AJ=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool],[AC],false);AK=$funcType([$Int32,X,Z],[AC],false);AL=$funcType([$Int,$Int,$Int,$Int],[AC],false);AM=$funcType([$Int32,S,$Uint64],[AC],false);AN=$funcType([$Int32],[AC],false);AO=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$emptyInterface,$String],[AC],false);AP=$funcType([V,$Float64,$Float64,$emptyInterface,$String],[AC],false);AQ=$ptrType(C.Space);AR=$funcType([AQ],[AD],false);AS=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64],[$Float64,$Float64],false);AT=$funcType([$Float64,$Float64],[$Int32,$Int32],false);AU=$funcType([$Int32,$Int32],[$Float64,$Float64],false);AV=$sliceType($Int);AW=$funcType([AV],[AD],false);AX=$ptrType(B.RingBuffer);AY=$ptrType(B.RoomDownsyncFrame);AZ=$ptrType(C.Object);BA=$mapType($Int32,AZ);BB=$sliceType(AE);BC=$funcType([AX,AY,AQ,BA,$Float64,$Float64,BB],[AC],false);BD=$mapType($String,$emptyInterface);D=function(a,b,c){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a,b,c});$s=$s||0;s:while(true){switch($s){case 0:d=A.MakeFullWrapper(new B.InputFrameDownsync.ptr(a,b,c));$s=1;case 1:if($c){$c=false;d=d.$blk();}if(d&&d.$blk!==undefined){break s;}e=d;$s=2;case 2:return e;}return;}var $f={$blk:D,$c:true,$r,a,b,c,d,e,$s};return $f;};$pkg.NewInputFrameDownsync=D;E=function(a){var{a,b,c,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=A.MakeFullWrapper(B.NewRingBuffer(a));$s=1;case 1:if($c){$c=false;b=b.$blk();}if(b&&b.$blk!==undefined){break s;}c=b;$s=2;case 2:return c;}return;}var $f={$blk:E,$c:true,$r,a,b,c,$s};return $f;};$pkg.NewRingBufferJs=E;F=function(a,b,c,d){var a,b,c,d;return A.MakeWrapper(C.NewSpace(a,b,c,d));};$pkg.NewCollisionSpaceJs=F;G=function(a,b){var{a,b,c,d,$s,$r,$c}=$restore(this,{a,b});$s=$s||0;s:while(true){switch($s){case 0:c=A.MakeFullWrapper(new B.Vec2D.ptr(a,b));$s=1;case 1:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}d=c;$s=2;case 2:return d;}return;}var $f={$blk:G,$c:true,$r,a,b,c,d,$s};return $f;};$pkg.NewVec2DJs=G;H=function(a,b){var{a,b,c,d,$s,$r,$c}=$restore(this,{a,b});$s=$s||0;s:while(true){switch($s){case 0:c=A.MakeFullWrapper(new B.Polygon2D.ptr(a,b));$s=1;case 1:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}d=c;$s=2;case 2:return d;}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,$s};return $f;};$pkg.NewPolygon2DJs=H;I=function(a){var a;return A.MakeWrapper(new B.Barrier.ptr(a));};$pkg.NewBarrierJs=I;J=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;return A.MakeWrapper(new B.PlayerDownsync.ptr(a,b,c,d,e,f,g,j,k,m,q,false,0,0,h,i,n,o,l,p));};$pkg.NewPlayerDownsyncJs=J;K=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return A.MakeWrapper(new B.MeleeBullet.ptr(new B.Bullet.ptr(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)));};$pkg.NewMeleeBulletJs=K;L=function(a,b,c){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a,b,c});$s=$s||0;s:while(true){switch($s){case 0:d=A.MakeFullWrapper(new B.RoomDownsyncFrame.ptr(a,b,new $Int64(0,0),c,AB.nil,new $Uint64(0,0),false,false));$s=1;case 1:if($c){$c=false;d=d.$blk();}if(d&&d.$blk!==undefined){break s;}e=d;$s=2;case 2:return e;}return;}var $f={$blk:L,$c:true,$r,a,b,c,d,e,$s};return $f;};$pkg.NewRoomDownsyncFrameJs=L;M=function(a){var{a,b,c,d,e,f,g,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=a.Objects();c=$makeSlice(AD,0,b.$length);d=b;e=0;case 1:if(!(e=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+e]);g=A.MakeFullWrapper(f);$s=3;case 3:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}c=$append(c,g);e++;$s=1;continue;case 2:$s=-1;return c;}return;}var $f={$blk:M,$c:true,$r,a,b,c,d,e,f,g,$s};return $f;};$pkg.GetCollisionSpaceObjsJs=M;N=function(a,b,c,d,e,f,g,h){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h});$s=$s||0;s:while(true){switch($s){case 0:i=0.1;j=0.1;k=0.1;l=0.1;m=i;n=j;o=k;p=l;q=B.GenerateRectCollider(a,b,c,d,m,n,o,p,e,f,g,h);$s=1;case 1:if($c){$c=false;q=q.$blk();}if(q&&q.$blk!==undefined){break s;}r=A.MakeFullWrapper(q);$s=2;case 2:if($c){$c=false;r=r.$blk();}if(r&&r.$blk!==undefined){break s;}s=r;$s=3;case 3:return s;}return;}var $f={$blk:N,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s};return $f;};$pkg.GenerateRectColliderJs=N;O=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=B.GenerateConvexPolygonCollider(a,b,c,d,e);$s=1;case 1:if($c){$c=false;f=f.$blk();}if(f&&f.$blk!==undefined){break s;}g=A.MakeFullWrapper(f);$s=2;case 2:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}h=g;$s=3;case 3:return h;}return;}var $f={$blk:O,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GenerateConvexPolygonColliderJs=O;P=function(a){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=$makeSlice(AD,a.$length,a.$length);c=a;d=0;case 1:if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);h=A.MakeFullWrapper((g=B.Characters[$Int.keyFor(f)],g!==undefined?g.v:AE.nil));$s=3;case 3:if($c){$c=false;h=h.$blk();}if(h&&h.$blk!==undefined){break s;}((e<0||e>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+e]=h);d++;$s=1;continue;case 2:$s=-1;return b;}return;}var $f={$blk:P,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GetCharacterConfigsOrderedByJoinIndex=P;Q=function(a,b,c,d,e,f,g){var{a,b,c,d,e,f,g,h,i,j,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g});$s=$s||0;s:while(true){switch($s){case 0:h=B.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(a,b,c,d,e,f,g);$s=1;case 1:if($c){$c=false;h=h.$blk();}if(h&&h.$blk!==undefined){break s;}i=A.MakeFullWrapper(h);$s=2;case 2:if($c){$c=false;i=i.$blk();}if(i&&i.$blk!==undefined){break s;}j=i;$s=3;case 3:return j;}return;}var $f={$blk:Q,$c:true,$r,a,b,c,d,e,f,g,h,i,j,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs=Q;R=function(){$global.gopkgs=$externalize($makeMap($String.keyFor,[{k:"NewVec2DJs",v:new AF(G)},{k:"NewPolygon2DJs",v:new AG(H)},{k:"NewBarrierJs",v:new AH(I)},{k:"NewPlayerDownsyncJs",v:new AI(J)},{k:"NewMeleeBulletJs",v:new AJ(K)},{k:"NewRoomDownsyncFrameJs",v:new AK(L)},{k:"NewCollisionSpaceJs",v:new AL(F)},{k:"NewInputFrameDownsync",v:new AM(D)},{k:"NewRingBufferJs",v:new AN(E)},{k:"GenerateRectColliderJs",v:new AO(N)},{k:"GenerateConvexPolygonColliderJs",v:new AP(O)},{k:"GetCollisionSpaceObjsJs",v:new AR(M)},{k:"WorldToPolygonColliderBLPos",v:new AS(B.WorldToPolygonColliderBLPos)},{k:"PolygonColliderBLToWorldPos",v:new AS(B.PolygonColliderBLToWorldPos)},{k:"WorldToVirtualGridPos",v:new AT(B.WorldToVirtualGridPos)},{k:"VirtualGridToWorldPos",v:new AU(B.VirtualGridToWorldPos)},{k:"GetCharacterConfigsOrderedByJoinIndex",v:new AW(P)},{k:"ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs",v:new BC(Q)}]),BD);};$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=C.$init();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if($pkg===$mainPkg){R();$mainFinished=true;}}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +var $NaN = NaN; +var $global, $module; +if (typeof window !== "undefined") { /* web page */ + $global = window; +} else if (typeof self !== "undefined") { /* web worker */ + $global = self; +} else if (typeof global !== "undefined") { /* Node.js */ + $global = global; + $global.require = require; +} else { /* others (e.g. Nashorn) */ + $global = this; +} + +if ($global === undefined || $global.Array === undefined) { + throw new Error("no global object found"); +} +if (typeof module !== "undefined") { + $module = module; +} + +if (!$global.fs && $global.require) { + try { + var fs = $global.require('fs'); + if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { + $global.fs = fs; + } + } catch(e) { /* Ignore if the module couldn't be loaded. */ } +} + +if (!$global.fs) { + var outputBuf = ""; + var decoder = new TextDecoder("utf-8"); + $global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync: function writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + var nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write: function write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + var n = this.writeSync(fd, buf); + callback(null, n); + } + }; +} + +var $linknames = {} // Collection of functions referenced by a go:linkname directive. +var $packages = {}, $idCounter = 0; +var $keys = function(m) { return m ? Object.keys(m) : []; }; +var $flushConsole = function() {}; +var $throwRuntimeError; /* set by package "runtime" */ +var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); }; +var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); }; +var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; }; +var $unused = function(v) {}; +var $print = console.log; +// Under Node we can emulate print() more closely by avoiding a newline. +if (($global.process !== undefined) && $global.require) { + try { + var util = $global.require('util'); + $print = function() { $global.process.stderr.write(util.format.apply(this, arguments)); }; + } catch (e) { + // Failed to require util module, keep using console.log(). + } +} +var $println = console.log + +var $initAllLinknames = function() { + var names = $keys($packages); + for (var i = 0; i < names.length; i++) { + var f = $packages[names[i]]["$initLinknames"]; + if (typeof f == 'function') { + f(); + } + } +} + +var $mapArray = function(array, f) { + var newArray = new array.constructor(array.length); + for (var i = 0; i < array.length; i++) { + newArray[i] = f(array[i]); + } + return newArray; +}; + +// Returns a method bound to the receiver instance, safe to invoke as a +// standalone function. Bound function is cached for later reuse. +var $methodVal = function(recv, name) { + var vals = recv.$methodVals || {}; + recv.$methodVals = vals; /* noop for primitives */ + var f = vals[name]; + if (f !== undefined) { + return f; + } + var method = recv[name]; + f = method.bind(recv); + vals[name] = f; + return f; +}; + +var $methodExpr = function(typ, name) { + var method = typ.prototype[name]; + if (method.$expr === undefined) { + method.$expr = function() { + $stackDepthOffset--; + try { + if (typ.wrapped) { + arguments[0] = new typ(arguments[0]); + } + return Function.call.apply(method, arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return method.$expr; +}; + +var $ifaceMethodExprs = {}; +var $ifaceMethodExpr = function(name) { + var expr = $ifaceMethodExprs["$" + name]; + if (expr === undefined) { + expr = $ifaceMethodExprs["$" + name] = function() { + $stackDepthOffset--; + try { + return Function.call.apply(arguments[0][name], arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return expr; +}; + +var $subslice = function(slice, low, high, max) { + if (high === undefined) { + high = slice.$length; + } + if (max === undefined) { + max = slice.$capacity; + } + if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) { + $throwRuntimeError("slice bounds out of range"); + } + if (slice === slice.constructor.nil) { + return slice; + } + var s = new slice.constructor(slice.$array); + s.$offset = slice.$offset + low; + s.$length = high - low; + s.$capacity = max - low; + return s; +}; + +var $substring = function(str, low, high) { + if (low < 0 || high < low || high > str.length) { + $throwRuntimeError("slice bounds out of range"); + } + return str.substring(low, high); +}; + +// Convert Go slice to an equivalent JS array type. +var $sliceToNativeArray = function(slice) { + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length); + } + return slice.$array.slice(slice.$offset, slice.$offset + slice.$length); +}; + +// Convert Go slice to a pointer to an underlying Go array. +// +// Note that an array pointer can be represented by an "unwrapped" native array +// type, and it will be wrapped back into its Go type when necessary. +var $sliceToGoArray = function(slice, arrayPtrType) { + var arrayType = arrayPtrType.elem; + if (arrayType !== undefined && slice.$length < arrayType.len) { + $throwRuntimeError("cannot convert slice with length " + slice.$length + " to pointer to array with length " + arrayType.len); + } + if (slice == slice.constructor.nil) { + return arrayPtrType.nil; // Nil slice converts to nil array pointer. + } + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + arrayType.len); + } + if (slice.$offset == 0 && slice.$length == slice.$capacity && slice.$length == arrayType.len) { + return slice.$array; + } + if (arrayType.len == 0) { + return new arrayType([]); + } + + // Array.slice (unlike TypedArray.subarray) returns a copy of an array range, + // which is not sharing memory with the original one, which violates the spec + // for slice to array conversion. This is incompatible with the Go spec, in + // particular that the assignments to the array elements would be visible in + // the slice. Prefer to fail explicitly instead of creating subtle bugs. + $throwRuntimeError("gopherjs: non-numeric slice to underlying array conversion is not supported for subslices"); +}; + +// Convert between compatible slice types (e.g. native and names). +var $convertSliceType = function(slice, desiredType) { + if (slice == slice.constructor.nil) { + return desiredType.nil; // Preserve nil value. + } + + return $subslice(new desiredType(slice.$array), slice.$offset, slice.$offset + slice.$length); +} + +var $decodeRune = function(str, pos) { + var c0 = str.charCodeAt(pos); + + if (c0 < 0x80) { + return [c0, 1]; + } + + if (c0 !== c0 || c0 < 0xC0) { + return [0xFFFD, 1]; + } + + var c1 = str.charCodeAt(pos + 1); + if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) { + return [0xFFFD, 1]; + } + + if (c0 < 0xE0) { + var r = (c0 & 0x1F) << 6 | (c1 & 0x3F); + if (r <= 0x7F) { + return [0xFFFD, 1]; + } + return [r, 2]; + } + + var c2 = str.charCodeAt(pos + 2); + if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF0) { + var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F); + if (r <= 0x7FF) { + return [0xFFFD, 1]; + } + if (0xD800 <= r && r <= 0xDFFF) { + return [0xFFFD, 1]; + } + return [r, 3]; + } + + var c3 = str.charCodeAt(pos + 3); + if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF8) { + var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F); + if (r <= 0xFFFF || 0x10FFFF < r) { + return [0xFFFD, 1]; + } + return [r, 4]; + } + + return [0xFFFD, 1]; +}; + +var $encodeRune = function(r) { + if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) { + r = 0xFFFD; + } + if (r <= 0x7F) { + return String.fromCharCode(r); + } + if (r <= 0x7FF) { + return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F)); + } + if (r <= 0xFFFF) { + return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); + } + return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); +}; + +var $stringToBytes = function(str) { + var array = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + array[i] = str.charCodeAt(i); + } + return array; +}; + +var $bytesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i += 10000) { + str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000))); + } + return str; +}; + +var $stringToRunes = function(str) { + var array = new Int32Array(str.length); + var rune, j = 0; + for (var i = 0; i < str.length; i += rune[1], j++) { + rune = $decodeRune(str, i); + array[j] = rune[0]; + } + return array.subarray(0, j); +}; + +var $runesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i++) { + str += $encodeRune(slice.$array[slice.$offset + i]); + } + return str; +}; + +var $copyString = function(dst, src) { + var n = Math.min(src.length, dst.$length); + for (var i = 0; i < n; i++) { + dst.$array[dst.$offset + i] = src.charCodeAt(i); + } + return n; +}; + +var $copySlice = function(dst, src) { + var n = Math.min(src.$length, dst.$length); + $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem); + return n; +}; + +var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) { + if (n === 0 || (dst === src && dstOffset === srcOffset)) { + return; + } + + if (src.subarray) { + dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset); + return; + } + + switch (elem.kind) { + case $kindArray: + case $kindStruct: + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + for (var i = 0; i < n; i++) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + dst[dstOffset + i] = src[srcOffset + i]; + } + return; + } + for (var i = 0; i < n; i++) { + dst[dstOffset + i] = src[srcOffset + i]; + } +}; + +var $clone = function(src, type) { + var clone = type.zero(); + type.copy(clone, src); + return clone; +}; + +var $pointerOfStructConversion = function(obj, type) { + if(obj.$proxies === undefined) { + obj.$proxies = {}; + obj.$proxies[obj.constructor.string] = obj; + } + var proxy = obj.$proxies[type.string]; + if (proxy === undefined) { + var properties = {}; + for (var i = 0; i < type.elem.fields.length; i++) { + (function(fieldProp) { + properties[fieldProp] = { + get: function() { return obj[fieldProp]; }, + set: function(value) { obj[fieldProp] = value; } + }; + })(type.elem.fields[i].prop); + } + proxy = Object.create(type.prototype, properties); + proxy.$val = proxy; + obj.$proxies[type.string] = proxy; + proxy.$proxies = obj.$proxies; + } + return proxy; +}; + +var $append = function(slice) { + return $internalAppend(slice, arguments, 1, arguments.length - 1); +}; + +var $appendSlice = function(slice, toAppend) { + if (toAppend.constructor === String) { + var bytes = $stringToBytes(toAppend); + return $internalAppend(slice, bytes, 0, bytes.length); + } + return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length); +}; + +var $internalAppend = function(slice, array, offset, length) { + if (length === 0) { + return slice; + } + + var newArray = slice.$array; + var newOffset = slice.$offset; + var newLength = slice.$length + length; + var newCapacity = slice.$capacity; + + if (newLength > newCapacity) { + newOffset = 0; + newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4)); + + if (slice.$array.constructor === Array) { + newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length); + newArray.length = newCapacity; + var zero = slice.constructor.elem.zero; + for (var i = slice.$length; i < newCapacity; i++) { + newArray[i] = zero(); + } + } else { + newArray = new slice.$array.constructor(newCapacity); + newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length)); + } + } + + $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem); + + var newSlice = new slice.constructor(newArray); + newSlice.$offset = newOffset; + newSlice.$length = newLength; + newSlice.$capacity = newCapacity; + return newSlice; +}; + +var $equal = function(a, b, type) { + if (type === $jsObjectPtr) { + return a === b; + } + switch (type.kind) { + case $kindComplex64: + case $kindComplex128: + return a.$real === b.$real && a.$imag === b.$imag; + case $kindInt64: + case $kindUint64: + return a.$high === b.$high && a.$low === b.$low; + case $kindArray: + if (a.length !== b.length) { + return false; + } + for (var i = 0; i < a.length; i++) { + if (!$equal(a[i], b[i], type.elem)) { + return false; + } + } + return true; + case $kindStruct: + for (var i = 0; i < type.fields.length; i++) { + var f = type.fields[i]; + if (!$equal(a[f.prop], b[f.prop], f.typ)) { + return false; + } + } + return true; + case $kindInterface: + return $interfaceIsEqual(a, b); + default: + return a === b; + } +}; + +var $interfaceIsEqual = function(a, b) { + if (a === $ifaceNil || b === $ifaceNil) { + return a === b; + } + if (a.constructor !== b.constructor) { + return false; + } + if (a.constructor === $jsObjectPtr) { + return a.object === b.object; + } + if (!a.constructor.comparable) { + $throwRuntimeError("comparing uncomparable type " + a.constructor.string); + } + return $equal(a.$val, b.$val, a.constructor); +}; + +var $min = Math.min; +var $mod = function(x, y) { return x % y; }; +var $parseInt = parseInt; +var $parseFloat = function(f) { + if (f !== undefined && f !== null && f.constructor === Number) { + return f; + } + return parseFloat(f); +}; + +var $froundBuf = new Float32Array(1); +var $fround = Math.fround || function(f) { + $froundBuf[0] = f; + return $froundBuf[0]; +}; + +var $imul = Math.imul || function(a, b) { + var ah = (a >>> 16) & 0xffff; + var al = a & 0xffff; + var bh = (b >>> 16) & 0xffff; + var bl = b & 0xffff; + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); +}; + +var $floatKey = function(f) { + if (f !== f) { + $idCounter++; + return "NaN$" + $idCounter; + } + return String(f); +}; + +var $flatten64 = function(x) { + return x.$high * 4294967296 + x.$low; +}; + +var $shiftLeft64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$low << (y - 32), 0); + } + return new x.constructor(0, 0); +}; + +var $shiftRightInt64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); + } + if (x.$high < 0) { + return new x.constructor(-1, 4294967295); + } + return new x.constructor(0, 0); +}; + +var $shiftRightUint64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(0, x.$high >>> (y - 32)); + } + return new x.constructor(0, 0); +}; + +var $mul64 = function(x, y) { + var x48 = x.$high >>> 16; + var x32 = x.$high & 0xFFFF; + var x16 = x.$low >>> 16; + var x00 = x.$low & 0xFFFF; + + var y48 = y.$high >>> 16; + var y32 = y.$high & 0xFFFF; + var y16 = y.$low >>> 16; + var y00 = y.$low & 0xFFFF; + + var z48 = 0, z32 = 0, z16 = 0, z00 = 0; + z00 += x00 * y00; + z16 += z00 >>> 16; + z00 &= 0xFFFF; + z16 += x16 * y00; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z16 += x00 * y16; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z32 += x32 * y00; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x16 * y16; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x00 * y32; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; + z48 &= 0xFFFF; + + var hi = ((z48 << 16) | z32) >>> 0; + var lo = ((z16 << 16) | z00) >>> 0; + + var r = new x.constructor(hi, lo); + return r; +}; + +var $div64 = function(x, y, returnRemainder) { + if (y.$high === 0 && y.$low === 0) { + $throwRuntimeError("integer divide by zero"); + } + + var s = 1; + var rs = 1; + + var xHigh = x.$high; + var xLow = x.$low; + if (xHigh < 0) { + s = -1; + rs = -1; + xHigh = -xHigh; + if (xLow !== 0) { + xHigh--; + xLow = 4294967296 - xLow; + } + } + + var yHigh = y.$high; + var yLow = y.$low; + if (y.$high < 0) { + s *= -1; + yHigh = -yHigh; + if (yLow !== 0) { + yHigh--; + yLow = 4294967296 - yLow; + } + } + + var high = 0, low = 0, n = 0; + while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { + yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; + yLow = (yLow << 1) >>> 0; + n++; + } + for (var i = 0; i <= n; i++) { + high = high << 1 | low >>> 31; + low = (low << 1) >>> 0; + if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { + xHigh = xHigh - yHigh; + xLow = xLow - yLow; + if (xLow < 0) { + xHigh--; + xLow += 4294967296; + } + low++; + if (low === 4294967296) { + high++; + low = 0; + } + } + yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; + yHigh = yHigh >>> 1; + } + + if (returnRemainder) { + return new x.constructor(xHigh * rs, xLow * rs); + } + return new x.constructor(high * s, low * s); +}; + +var $divComplex = function(n, d) { + var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; + var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; + var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); + var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); + if(nnan || dnan) { + return new n.constructor(NaN, NaN); + } + if (ninf && !dinf) { + return new n.constructor(Infinity, Infinity); + } + if (!ninf && dinf) { + return new n.constructor(0, 0); + } + if (d.$real === 0 && d.$imag === 0) { + if (n.$real === 0 && n.$imag === 0) { + return new n.constructor(NaN, NaN); + } + return new n.constructor(Infinity, Infinity); + } + var a = Math.abs(d.$real); + var b = Math.abs(d.$imag); + if (a <= b) { + var ratio = d.$real / d.$imag; + var denom = d.$real * ratio + d.$imag; + return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); + } + var ratio = d.$imag / d.$real; + var denom = d.$imag * ratio + d.$real; + return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); +}; + +var $kindBool = 1; +var $kindInt = 2; +var $kindInt8 = 3; +var $kindInt16 = 4; +var $kindInt32 = 5; +var $kindInt64 = 6; +var $kindUint = 7; +var $kindUint8 = 8; +var $kindUint16 = 9; +var $kindUint32 = 10; +var $kindUint64 = 11; +var $kindUintptr = 12; +var $kindFloat32 = 13; +var $kindFloat64 = 14; +var $kindComplex64 = 15; +var $kindComplex128 = 16; +var $kindArray = 17; +var $kindChan = 18; +var $kindFunc = 19; +var $kindInterface = 20; +var $kindMap = 21; +var $kindPtr = 22; +var $kindSlice = 23; +var $kindString = 24; +var $kindStruct = 25; +var $kindUnsafePointer = 26; + +var $methodSynthesizers = []; +var $addMethodSynthesizer = function(f) { + if ($methodSynthesizers === null) { + f(); + return; + } + $methodSynthesizers.push(f); +}; +var $synthesizeMethods = function() { + $methodSynthesizers.forEach(function(f) { f(); }); + $methodSynthesizers = null; +}; + +var $ifaceKeyFor = function(x) { + if (x === $ifaceNil) { + return 'nil'; + } + var c = x.constructor; + return c.string + '$' + c.keyFor(x.$val); +}; + +var $identity = function(x) { return x; }; + +var $typeIDCounter = 0; + +var $idKey = function(x) { + if (x.$id === undefined) { + $idCounter++; + x.$id = $idCounter; + } + return String(x.$id); +}; + +// Creates constructor functions for array pointer types. Returns a new function +// instace each time to make sure each type is independent of the other. +var $arrayPtrCtor = function() { + return function(array) { + this.$get = function() { return array; }; + this.$set = function(v) { typ.copy(this, v); }; + this.$val = array; + } +} + +var $newType = function(size, kind, string, named, pkg, exported, constructor) { + var typ; + switch(kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $identity; + break; + + case $kindString: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return "$" + x; }; + break; + + case $kindFloat32: + case $kindFloat64: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return $floatKey(x); }; + break; + + case $kindInt64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindUint64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >>> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindComplex64: + typ = function(real, imag) { + this.$real = $fround(real); + this.$imag = $fround(imag); + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindComplex128: + typ = function(real, imag) { + this.$real = real; + this.$imag = imag; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindArray: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, "", false, $arrayPtrCtor()); + typ.init = function(elem, len) { + typ.elem = elem; + typ.len = len; + typ.comparable = elem.comparable; + typ.keyFor = function(x) { + return Array.prototype.join.call($mapArray(x, function(e) { + return String(elem.keyFor(e)).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }), "$"); + }; + typ.copy = function(dst, src) { + $copyArray(dst, src, 0, 0, src.length, elem); + }; + typ.ptr.init(typ); + Object.defineProperty(typ.ptr.nil, "nilCheck", { get: $throwNilPointerError }); + }; + break; + + case $kindChan: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $idKey; + typ.init = function(elem, sendOnly, recvOnly) { + typ.elem = elem; + typ.sendOnly = sendOnly; + typ.recvOnly = recvOnly; + }; + break; + + case $kindFunc: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(params, results, variadic) { + typ.params = params; + typ.results = results; + typ.variadic = variadic; + typ.comparable = false; + }; + break; + + case $kindInterface: + typ = { implementedBy: {}, missingMethodFor: {} }; + typ.keyFor = $ifaceKeyFor; + typ.init = function(methods) { + typ.methods = methods; + methods.forEach(function(m) { + $ifaceNil[m.prop] = $throwNilPointerError; + }); + }; + break; + + case $kindMap: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(key, elem) { + typ.key = key; + typ.elem = elem; + typ.comparable = false; + }; + break; + + case $kindPtr: + typ = constructor || function(getter, setter, target) { + this.$get = getter; + this.$set = setter; + this.$target = target; + this.$val = this; + }; + typ.keyFor = $idKey; + typ.init = function(elem) { + typ.elem = elem; + typ.wrapped = (elem.kind === $kindArray); + typ.nil = new typ($throwNilPointerError, $throwNilPointerError); + }; + break; + + case $kindSlice: + typ = function(array) { + if (array.constructor !== typ.nativeArray) { + array = new typ.nativeArray(array); + } + this.$array = array; + this.$offset = 0; + this.$length = array.length; + this.$capacity = array.length; + this.$val = this; + }; + typ.init = function(elem) { + typ.elem = elem; + typ.comparable = false; + typ.nativeArray = $nativeArray(elem.kind); + typ.nil = new typ([]); + }; + break; + + case $kindStruct: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, pkg, exported, constructor); + typ.ptr.elem = typ; + typ.ptr.prototype.$get = function() { return this; }; + typ.ptr.prototype.$set = function(v) { typ.copy(this, v); }; + typ.init = function(pkgPath, fields) { + typ.pkgPath = pkgPath; + typ.fields = fields; + fields.forEach(function(f) { + if (!f.typ.comparable) { + typ.comparable = false; + } + }); + typ.keyFor = function(x) { + var val = x.$val; + return $mapArray(fields, function(f) { + return String(f.typ.keyFor(val[f.prop])).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }).join("$"); + }; + typ.copy = function(dst, src) { + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + switch (f.typ.kind) { + case $kindArray: + case $kindStruct: + f.typ.copy(dst[f.prop], src[f.prop]); + continue; + default: + dst[f.prop] = src[f.prop]; + continue; + } + } + }; + /* nil value */ + var properties = {}; + fields.forEach(function(f) { + properties[f.prop] = { get: $throwNilPointerError, set: $throwNilPointerError }; + }); + typ.ptr.nil = Object.create(constructor.prototype, properties); + typ.ptr.nil.$val = typ.ptr.nil; + /* methods for embedded fields */ + $addMethodSynthesizer(function() { + var synthesizeMethod = function(target, m, f) { + if (target.prototype[m.prop] !== undefined) { return; } + target.prototype[m.prop] = function() { + var v = this.$val[f.prop]; + if (f.typ === $jsObjectPtr) { + v = new $jsObjectPtr(v); + } + if (v.$val === undefined) { + v = new f.typ(v); + } + return v[m.prop].apply(v, arguments); + }; + }; + fields.forEach(function(f) { + if (f.embedded) { + $methodSet(f.typ).forEach(function(m) { + synthesizeMethod(typ, m, f); + synthesizeMethod(typ.ptr, m, f); + }); + $methodSet($ptrType(f.typ)).forEach(function(m) { + synthesizeMethod(typ.ptr, m, f); + }); + } + }); + }); + }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + switch (kind) { + case $kindBool: + case $kindMap: + typ.zero = function() { return false; }; + break; + + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8 : + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + case $kindFloat32: + case $kindFloat64: + typ.zero = function() { return 0; }; + break; + + case $kindString: + typ.zero = function() { return ""; }; + break; + + case $kindInt64: + case $kindUint64: + case $kindComplex64: + case $kindComplex128: + var zero = new typ(0, 0); + typ.zero = function() { return zero; }; + break; + + case $kindPtr: + case $kindSlice: + typ.zero = function() { return typ.nil; }; + break; + + case $kindChan: + typ.zero = function() { return $chanNil; }; + break; + + case $kindFunc: + typ.zero = function() { return $throwNilPointerError; }; + break; + + case $kindInterface: + typ.zero = function() { return $ifaceNil; }; + break; + + case $kindArray: + typ.zero = function() { + var arrayClass = $nativeArray(typ.elem.kind); + if (arrayClass !== Array) { + return new arrayClass(typ.len); + } + var array = new Array(typ.len); + for (var i = 0; i < typ.len; i++) { + array[i] = typ.elem.zero(); + } + return array; + }; + break; + + case $kindStruct: + typ.zero = function() { return new typ.ptr(); }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + typ.id = $typeIDCounter; + $typeIDCounter++; + typ.size = size; + typ.kind = kind; + typ.string = string; + typ.named = named; + typ.pkg = pkg; + typ.exported = exported; + typ.methods = []; + typ.methodSetCache = null; + typ.comparable = true; + return typ; +}; + +var $methodSet = function(typ) { + if (typ.methodSetCache !== null) { + return typ.methodSetCache; + } + var base = {}; + + var isPtr = (typ.kind === $kindPtr); + if (isPtr && typ.elem.kind === $kindInterface) { + typ.methodSetCache = []; + return []; + } + + var current = [{typ: isPtr ? typ.elem : typ, indirect: isPtr}]; + + var seen = {}; + + while (current.length > 0) { + var next = []; + var mset = []; + + current.forEach(function(e) { + if (seen[e.typ.string]) { + return; + } + seen[e.typ.string] = true; + + if (e.typ.named) { + mset = mset.concat(e.typ.methods); + if (e.indirect) { + mset = mset.concat($ptrType(e.typ).methods); + } + } + + switch (e.typ.kind) { + case $kindStruct: + e.typ.fields.forEach(function(f) { + if (f.embedded) { + var fTyp = f.typ; + var fIsPtr = (fTyp.kind === $kindPtr); + next.push({typ: fIsPtr ? fTyp.elem : fTyp, indirect: e.indirect || fIsPtr}); + } + }); + break; + + case $kindInterface: + mset = mset.concat(e.typ.methods); + break; + } + }); + + mset.forEach(function(m) { + if (base[m.name] === undefined) { + base[m.name] = m; + } + }); + + current = next; + } + + typ.methodSetCache = []; + Object.keys(base).sort().forEach(function(name) { + typ.methodSetCache.push(base[name]); + }); + return typ.methodSetCache; +}; + +var $Bool = $newType( 1, $kindBool, "bool", true, "", false, null); +var $Int = $newType( 4, $kindInt, "int", true, "", false, null); +var $Int8 = $newType( 1, $kindInt8, "int8", true, "", false, null); +var $Int16 = $newType( 2, $kindInt16, "int16", true, "", false, null); +var $Int32 = $newType( 4, $kindInt32, "int32", true, "", false, null); +var $Int64 = $newType( 8, $kindInt64, "int64", true, "", false, null); +var $Uint = $newType( 4, $kindUint, "uint", true, "", false, null); +var $Uint8 = $newType( 1, $kindUint8, "uint8", true, "", false, null); +var $Uint16 = $newType( 2, $kindUint16, "uint16", true, "", false, null); +var $Uint32 = $newType( 4, $kindUint32, "uint32", true, "", false, null); +var $Uint64 = $newType( 8, $kindUint64, "uint64", true, "", false, null); +var $Uintptr = $newType( 4, $kindUintptr, "uintptr", true, "", false, null); +var $Float32 = $newType( 4, $kindFloat32, "float32", true, "", false, null); +var $Float64 = $newType( 8, $kindFloat64, "float64", true, "", false, null); +var $Complex64 = $newType( 8, $kindComplex64, "complex64", true, "", false, null); +var $Complex128 = $newType(16, $kindComplex128, "complex128", true, "", false, null); +var $String = $newType( 8, $kindString, "string", true, "", false, null); +var $UnsafePointer = $newType( 4, $kindUnsafePointer, "unsafe.Pointer", true, "unsafe", false, null); + +var $nativeArray = function(elemKind) { + switch (elemKind) { + case $kindInt: + return Int32Array; + case $kindInt8: + return Int8Array; + case $kindInt16: + return Int16Array; + case $kindInt32: + return Int32Array; + case $kindUint: + return Uint32Array; + case $kindUint8: + return Uint8Array; + case $kindUint16: + return Uint16Array; + case $kindUint32: + return Uint32Array; + case $kindUintptr: + return Uint32Array; + case $kindFloat32: + return Float32Array; + case $kindFloat64: + return Float64Array; + default: + return Array; + } +}; +var $toNativeArray = function(elemKind, array) { + var nativeArray = $nativeArray(elemKind); + if (nativeArray === Array) { + return array; + } + return new nativeArray(array); +}; +var $arrayTypes = {}; +var $arrayType = function(elem, len) { + var typeKey = elem.id + "$" + len; + var typ = $arrayTypes[typeKey]; + if (typ === undefined) { + typ = $newType(12, $kindArray, "[" + len + "]" + elem.string, false, "", false, null); + $arrayTypes[typeKey] = typ; + typ.init(elem, len); + } + return typ; +}; + +var $chanType = function(elem, sendOnly, recvOnly) { + var string = (recvOnly ? "<-" : "") + "chan" + (sendOnly ? "<- " : " "); + if (!sendOnly && !recvOnly && (elem.string[0] == "<")) { + string += "(" + elem.string + ")"; + } else { + string += elem.string; + } + var field = sendOnly ? "SendChan" : (recvOnly ? "RecvChan" : "Chan"); + var typ = elem[field]; + if (typ === undefined) { + typ = $newType(4, $kindChan, string, false, "", false, null); + elem[field] = typ; + typ.init(elem, sendOnly, recvOnly); + } + return typ; +}; +var $Chan = function(elem, capacity) { + if (capacity < 0 || capacity > 2147483647) { + $throwRuntimeError("makechan: size out of range"); + } + this.$elem = elem; + this.$capacity = capacity; + this.$buffer = []; + this.$sendQueue = []; + this.$recvQueue = []; + this.$closed = false; +}; +var $chanNil = new $Chan(null, 0); +$chanNil.$sendQueue = $chanNil.$recvQueue = { length: 0, push: function() {}, shift: function() { return undefined; }, indexOf: function() { return -1; } }; + +var $funcTypes = {}; +var $funcType = function(params, results, variadic) { + var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic; + var typ = $funcTypes[typeKey]; + if (typ === undefined) { + var paramTypes = $mapArray(params, function(p) { return p.string; }); + if (variadic) { + paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2); + } + var string = "func(" + paramTypes.join(", ") + ")"; + if (results.length === 1) { + string += " " + results[0].string; + } else if (results.length > 1) { + string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")"; + } + typ = $newType(4, $kindFunc, string, false, "", false, null); + $funcTypes[typeKey] = typ; + typ.init(params, results, variadic); + } + return typ; +}; + +var $interfaceTypes = {}; +var $interfaceType = function(methods) { + var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$"); + var typ = $interfaceTypes[typeKey]; + if (typ === undefined) { + var string = "interface {}"; + if (methods.length !== 0) { + string = "interface { " + $mapArray(methods, function(m) { + return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4); + }).join("; ") + " }"; + } + typ = $newType(8, $kindInterface, string, false, "", false, null); + $interfaceTypes[typeKey] = typ; + typ.init(methods); + } + return typ; +}; +var $emptyInterface = $interfaceType([]); +var $ifaceNil = {}; +var $error = $newType(8, $kindInterface, "error", true, "", false, null); +$error.init([{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]); + +var $mapTypes = {}; +var $mapType = function(key, elem) { + var typeKey = key.id + "$" + elem.id; + var typ = $mapTypes[typeKey]; + if (typ === undefined) { + typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem.string, false, "", false, null); + $mapTypes[typeKey] = typ; + typ.init(key, elem); + } + return typ; +}; +var $makeMap = function(keyForFunc, entries) { + var m = {}; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + m[keyForFunc(e.k)] = e; + } + return m; +}; + +var $ptrType = function(elem) { + var typ = elem.ptr; + if (typ === undefined) { + typ = $newType(4, $kindPtr, "*" + elem.string, false, "", elem.exported, null); + elem.ptr = typ; + typ.init(elem); + } + return typ; +}; + +var $newDataPointer = function(data, constructor) { + if (constructor.elem.kind === $kindStruct) { + return data; + } + return new constructor(function() { return data; }, function(v) { data = v; }); +}; + +var $indexPtr = function(array, index, constructor) { + if (array.buffer) { + // Pointers to the same underlying ArrayBuffer share cache. + var cache = array.buffer.$ptr = array.buffer.$ptr || {}; + // Pointers of different primitive types are non-comparable and stored in different caches. + var typeCache = cache[array.name] = cache[array.name] || {}; + var cacheIdx = array.BYTES_PER_ELEMENT * index + array.byteOffset; + return typeCache[cacheIdx] || (typeCache[cacheIdx] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } else { + array.$ptr = array.$ptr || {}; + return array.$ptr[index] || (array.$ptr[index] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } +}; + +var $sliceType = function(elem) { + var typ = elem.slice; + if (typ === undefined) { + typ = $newType(12, $kindSlice, "[]" + elem.string, false, "", false, null); + elem.slice = typ; + typ.init(elem); + } + return typ; +}; +var $makeSlice = function(typ, length, capacity) { + capacity = capacity || length; + if (length < 0 || length > 2147483647) { + $throwRuntimeError("makeslice: len out of range"); + } + if (capacity < 0 || capacity < length || capacity > 2147483647) { + $throwRuntimeError("makeslice: cap out of range"); + } + var array = new typ.nativeArray(capacity); + if (typ.nativeArray === Array) { + for (var i = 0; i < capacity; i++) { + array[i] = typ.elem.zero(); + } + } + var slice = new typ(array); + slice.$length = length; + return slice; +}; + +var $structTypes = {}; +var $structType = function(pkgPath, fields) { + var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$"); + var typ = $structTypes[typeKey]; + if (typ === undefined) { + var string = "struct { " + $mapArray(fields, function(f) { + var str = f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : ""); + if (f.embedded) { + return str; + } + return f.name + " " + str; + }).join("; ") + " }"; + if (fields.length === 0) { + string = "struct {}"; + } + typ = $newType(0, $kindStruct, string, false, "", false, function() { + this.$val = this; + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + if (f.name == '_') { + continue; + } + var arg = arguments[i]; + this[f.prop] = arg !== undefined ? arg : f.typ.zero(); + } + }); + $structTypes[typeKey] = typ; + typ.init(pkgPath, fields); + } + return typ; +}; + +var $assertType = function(value, type, returnTuple) { + var isInterface = (type.kind === $kindInterface), ok, missingMethod = ""; + if (value === $ifaceNil) { + ok = false; + } else if (!isInterface) { + ok = value.constructor === type; + } else { + var valueTypeString = value.constructor.string; + ok = type.implementedBy[valueTypeString]; + if (ok === undefined) { + ok = true; + var valueMethodSet = $methodSet(value.constructor); + var interfaceMethods = type.methods; + for (var i = 0; i < interfaceMethods.length; i++) { + var tm = interfaceMethods[i]; + var found = false; + for (var j = 0; j < valueMethodSet.length; j++) { + var vm = valueMethodSet[j]; + if (vm.name === tm.name && vm.pkg === tm.pkg && vm.typ === tm.typ) { + found = true; + break; + } + } + if (!found) { + ok = false; + type.missingMethodFor[valueTypeString] = tm.name; + break; + } + } + type.implementedBy[valueTypeString] = ok; + } + if (!ok) { + missingMethod = type.missingMethodFor[valueTypeString]; + } + } + + if (!ok) { + if (returnTuple) { + return [type.zero(), false]; + } + $panic(new $packages["runtime"].TypeAssertionError.ptr( + $packages["runtime"]._type.ptr.nil, + (value === $ifaceNil ? $packages["runtime"]._type.ptr.nil : new $packages["runtime"]._type.ptr(value.constructor.string)), + new $packages["runtime"]._type.ptr(type.string), + missingMethod)); + } + + if (!isInterface) { + value = value.$val; + } + if (type === $jsObjectPtr) { + value = value.object; + } + return returnTuple ? [value, true] : value; +}; + +var $stackDepthOffset = 0; +var $getStackDepth = function() { + var err = new Error(); + if (err.stack === undefined) { + return undefined; + } + return $stackDepthOffset + err.stack.split("\n").length; +}; + +var $panicStackDepth = null, $panicValue; +var $callDeferred = function(deferred, jsErr, fromPanic) { + if (!fromPanic && deferred !== null && $curGoroutine.deferStack.indexOf(deferred) == -1) { + throw jsErr; + } + if (jsErr !== null) { + var newErr = null; + try { + $panic(new $jsErrorPtr(jsErr)); + } catch (err) { + newErr = err; + } + $callDeferred(deferred, newErr); + return; + } + if ($curGoroutine.asleep) { + return; + } + + $stackDepthOffset--; + var outerPanicStackDepth = $panicStackDepth; + var outerPanicValue = $panicValue; + + var localPanicValue = $curGoroutine.panicStack.pop(); + if (localPanicValue !== undefined) { + $panicStackDepth = $getStackDepth(); + $panicValue = localPanicValue; + } + + try { + while (true) { + if (deferred === null) { + deferred = $curGoroutine.deferStack[$curGoroutine.deferStack.length - 1]; + if (deferred === undefined) { + /* The panic reached the top of the stack. Clear it and throw it as a JavaScript error. */ + $panicStackDepth = null; + if (localPanicValue.Object instanceof Error) { + throw localPanicValue.Object; + } + var msg; + if (localPanicValue.constructor === $String) { + msg = localPanicValue.$val; + } else if (localPanicValue.Error !== undefined) { + msg = localPanicValue.Error(); + } else if (localPanicValue.String !== undefined) { + msg = localPanicValue.String(); + } else { + msg = localPanicValue; + } + throw new Error(msg); + } + } + var call = deferred.pop(); + if (call === undefined) { + $curGoroutine.deferStack.pop(); + if (localPanicValue !== undefined) { + deferred = null; + continue; + } + return; + } + var r = call[0].apply(call[2], call[1]); + if (r && r.$blk !== undefined) { + deferred.push([r.$blk, [], r]); + if (fromPanic) { + throw null; + } + return; + } + + if (localPanicValue !== undefined && $panicStackDepth === null) { + /* error was recovered */ + if (fromPanic) { + throw null; + } + return; + } + } + } catch(e) { + // Deferred function threw a JavaScript exception or tries to unwind stack + // to the point where a panic was handled. + if (fromPanic) { + // Re-throw the exception to reach deferral execution call at the end + // of the function. + throw e; + } + // We are at the end of the function, handle the error or re-throw to + // continue unwinding if necessary, or simply stop unwinding if we got far + // enough. + $callDeferred(deferred, e, fromPanic); + } finally { + if (localPanicValue !== undefined) { + if ($panicStackDepth !== null) { + $curGoroutine.panicStack.push(localPanicValue); + } + $panicStackDepth = outerPanicStackDepth; + $panicValue = outerPanicValue; + } + $stackDepthOffset++; + } +}; + +var $panic = function(value) { + $curGoroutine.panicStack.push(value); + $callDeferred(null, null, true); +}; +var $recover = function() { + if ($panicStackDepth === null || ($panicStackDepth !== undefined && $panicStackDepth !== $getStackDepth() - 2)) { + return $ifaceNil; + } + $panicStackDepth = null; + return $panicValue; +}; +var $throw = function(err) { throw err; }; + +var $noGoroutine = { asleep: false, exit: false, deferStack: [], panicStack: [] }; +var $curGoroutine = $noGoroutine, $totalGoroutines = 0, $awakeGoroutines = 0, $checkForDeadlock = true, $exportedFunctions = 0; +var $mainFinished = false; +var $go = function(fun, args) { + $totalGoroutines++; + $awakeGoroutines++; + var $goroutine = function() { + try { + $curGoroutine = $goroutine; + var r = fun.apply(undefined, args); + if (r && r.$blk !== undefined) { + fun = function() { return r.$blk(); }; + args = []; + return; + } + $goroutine.exit = true; + } catch (err) { + if (!$goroutine.exit) { + throw err; + } + } finally { + $curGoroutine = $noGoroutine; + if ($goroutine.exit) { /* also set by runtime.Goexit() */ + $totalGoroutines--; + $goroutine.asleep = true; + } + if ($goroutine.asleep) { + $awakeGoroutines--; + if (!$mainFinished && $awakeGoroutines === 0 && $checkForDeadlock && $exportedFunctions === 0) { + console.error("fatal error: all goroutines are asleep - deadlock!"); + if ($global.process !== undefined) { + $global.process.exit(2); + } + } + } + } + }; + $goroutine.asleep = false; + $goroutine.exit = false; + $goroutine.deferStack = []; + $goroutine.panicStack = []; + $schedule($goroutine); +}; + +var $scheduled = []; +var $runScheduled = function() { + // For nested setTimeout calls browsers enforce 4ms minimum delay. We minimize + // the effect of this penalty by queueing the timer preemptively before we run + // the goroutines, and later cancelling it if it turns out unneeded. See: + // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#nested_timeouts + var nextRun = setTimeout($runScheduled); + try { + var start = Date.now(); + var r; + while ((r = $scheduled.shift()) !== undefined) { + r(); + // We need to interrupt this loop in order to allow the event loop to + // process timers, IO, etc. However, invoking scheduling through + // setTimeout is ~1000 times more expensive, so we amortize this cost by + // looping until the 4ms minimal delay has elapsed (assuming there are + // scheduled goroutines to run), and then yield to the event loop. + var elapsed = Date.now() - start; + if (elapsed > 4 || elapsed < 0) { break; } + } + } finally { + if ($scheduled.length == 0) { + // Cancel scheduling pass if there's nothing to run. + clearTimeout(nextRun); + } + } +}; + +var $schedule = function(goroutine) { + if (goroutine.asleep) { + goroutine.asleep = false; + $awakeGoroutines++; + } + $scheduled.push(goroutine); + if ($curGoroutine === $noGoroutine) { + $runScheduled(); + } +}; + +var $setTimeout = function(f, t) { + $awakeGoroutines++; + return setTimeout(function() { + $awakeGoroutines--; + f(); + }, t); +}; + +var $block = function() { + if ($curGoroutine === $noGoroutine) { + $throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"); + } + $curGoroutine.asleep = true; +}; + +var $restore = function(context, params) { + if (context !== undefined && context.$blk !== undefined) { + return context; + } + return params; +} + +var $send = function(chan, value) { + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv !== undefined) { + queuedRecv([value, true]); + return; + } + if (chan.$buffer.length < chan.$capacity) { + chan.$buffer.push(value); + return; + } + + var thisGoroutine = $curGoroutine; + var closedDuringSend; + chan.$sendQueue.push(function(closed) { + closedDuringSend = closed; + $schedule(thisGoroutine); + return value; + }); + $block(); + return { + $blk: function() { + if (closedDuringSend) { + $throwRuntimeError("send on closed channel"); + } + } + }; +}; +var $recv = function(chan) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend !== undefined) { + chan.$buffer.push(queuedSend(false)); + } + var bufferedValue = chan.$buffer.shift(); + if (bufferedValue !== undefined) { + return [bufferedValue, true]; + } + if (chan.$closed) { + return [chan.$elem.zero(), false]; + } + + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.value; } }; + var queueEntry = function(v) { + f.value = v; + $schedule(thisGoroutine); + }; + chan.$recvQueue.push(queueEntry); + $block(); + return f; +}; +var $close = function(chan) { + if (chan.$closed) { + $throwRuntimeError("close of closed channel"); + } + chan.$closed = true; + while (true) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend === undefined) { + break; + } + queuedSend(true); /* will panic */ + } + while (true) { + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv === undefined) { + break; + } + queuedRecv([chan.$elem.zero(), false]); + } +}; +var $select = function(comms) { + var ready = []; + var selection = -1; + for (var i = 0; i < comms.length; i++) { + var comm = comms[i]; + var chan = comm[0]; + switch (comm.length) { + case 0: /* default */ + selection = i; + break; + case 1: /* recv */ + if (chan.$sendQueue.length !== 0 || chan.$buffer.length !== 0 || chan.$closed) { + ready.push(i); + } + break; + case 2: /* send */ + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + if (chan.$recvQueue.length !== 0 || chan.$buffer.length < chan.$capacity) { + ready.push(i); + } + break; + } + } + + if (ready.length !== 0) { + selection = ready[Math.floor(Math.random() * ready.length)]; + } + if (selection !== -1) { + var comm = comms[selection]; + switch (comm.length) { + case 0: /* default */ + return [selection]; + case 1: /* recv */ + return [selection, $recv(comm[0])]; + case 2: /* send */ + $send(comm[0], comm[1]); + return [selection]; + } + } + + var entries = []; + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.selection; } }; + var removeFromQueues = function() { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + var queue = entry[0]; + var index = queue.indexOf(entry[1]); + if (index !== -1) { + queue.splice(index, 1); + } + } + }; + for (var i = 0; i < comms.length; i++) { + (function(i) { + var comm = comms[i]; + switch (comm.length) { + case 1: /* recv */ + var queueEntry = function(value) { + f.selection = [i, value]; + removeFromQueues(); + $schedule(thisGoroutine); + }; + entries.push([comm[0].$recvQueue, queueEntry]); + comm[0].$recvQueue.push(queueEntry); + break; + case 2: /* send */ + var queueEntry = function() { + if (comm[0].$closed) { + $throwRuntimeError("send on closed channel"); + } + f.selection = [i]; + removeFromQueues(); + $schedule(thisGoroutine); + return comm[1]; + }; + entries.push([comm[0].$sendQueue, queueEntry]); + comm[0].$sendQueue.push(queueEntry); + break; + } + })(i); + } + $block(); + return f; +}; + +var $jsObjectPtr, $jsErrorPtr; + +var $needsExternalization = function(t) { + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return false; + default: + return t !== $jsObjectPtr; + } +}; + +var $externalize = function(v, t, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return v; + case $kindInt64: + case $kindUint64: + return $flatten64(v); + case $kindArray: + if ($needsExternalization(t.elem)) { + return $mapArray(v, function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return v; + case $kindFunc: + return $externalizeFunction(v, t, false, makeWrapper); + case $kindInterface: + if (v === $ifaceNil) { + return null; + } + if (v.constructor === $jsObjectPtr) { + return v.$val.object; + } + return $externalize(v.$val, v.constructor, makeWrapper); + case $kindMap: + var m = {}; + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var entry = v[keys[i]]; + m[$externalize(entry.k, t.key, makeWrapper)] = $externalize(entry.v, t.elem, makeWrapper); + } + return m; + case $kindPtr: + if (v === t.nil) { + return null; + } + return $externalize(v.$get(), t.elem, makeWrapper); + case $kindSlice: + if ($needsExternalization(t.elem)) { + return $mapArray($sliceToNativeArray(v), function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return $sliceToNativeArray(v); + case $kindString: + if ($isASCII(v)) { + return v; + } + var s = "", r; + for (var i = 0; i < v.length; i += r[1]) { + r = $decodeRune(v, i); + var c = r[0]; + if (c > 0xFFFF) { + var h = Math.floor((c - 0x10000) / 0x400) + 0xD800; + var l = (c - 0x10000) % 0x400 + 0xDC00; + s += String.fromCharCode(h, l); + continue; + } + s += String.fromCharCode(c); + } + return s; + case $kindStruct: + var timePkg = $packages["time"]; + if (timePkg !== undefined && v.constructor === timePkg.Time.ptr) { + var milli = $div64(v.UnixNano(), new $Int64(0, 1000000)); + return new Date($flatten64(milli)); + } + + var noJsObject = {}; + var searchJsObject = function(v, t) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindPtr: + if (v === t.nil) { + return noJsObject; + } + return searchJsObject(v.$get(), t.elem); + case $kindStruct: + var f = t.fields[0]; + return searchJsObject(v[f.prop], f.typ); + case $kindInterface: + return searchJsObject(v.$val, v.constructor); + default: + return noJsObject; + } + }; + var o = searchJsObject(v, t); + if (o !== noJsObject) { + return o; + } + + if (makeWrapper !== undefined) { + return makeWrapper(v); + } + + o = {}; + for (var i = 0; i < t.fields.length; i++) { + var f = t.fields[i]; + if (!f.exported) { + continue; + } + o[f.name] = $externalize(v[f.prop], f.typ, makeWrapper); + } + return o; + } + $throwRuntimeError("cannot externalize " + t.string); +}; + +var $externalizeFunction = function(v, t, passThis, makeWrapper) { + if (v === $throwNilPointerError) { + return null; + } + if (v.$externalizeWrapper === undefined) { + $checkForDeadlock = false; + v.$externalizeWrapper = function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = []; + for (var j = i; j < arguments.length; j++) { + varargs.push($internalize(arguments[j], vt, makeWrapper)); + } + args.push(new (t.params[i])(varargs)); + break; + } + args.push($internalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(passThis ? this : undefined, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $externalize($copyIfRequired(result, t.results[0]), t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $externalize($copyIfRequired(result[i], t.results[i]), t.results[i], makeWrapper); + } + return result; + } + }; + } + return v.$externalizeWrapper; +}; + +var $internalize = function(v, t, recv, seen, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + if (v && v.__internal_object__ !== undefined) { + return $assertType(v.__internal_object__, t, false); + } + var timePkg = $packages["time"]; + if (timePkg !== undefined && t === timePkg.Time) { + if (!(v !== null && v !== undefined && v.constructor === Date)) { + $throwRuntimeError("cannot internalize time.Time from " + typeof v + ", must be Date"); + } + return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); + } + + // Cache for values we've already internalized in order to deal with circular + // references. + if (seen === undefined) { seen = new Map(); } + if (!seen.has(t)) { seen.set(t, new Map()); } + if (seen.get(t).has(v)) { return seen.get(t).get(v); } + + switch (t.kind) { + case $kindBool: + return !!v; + case $kindInt: + return parseInt(v); + case $kindInt8: + return parseInt(v) << 24 >> 24; + case $kindInt16: + return parseInt(v) << 16 >> 16; + case $kindInt32: + return parseInt(v) >> 0; + case $kindUint: + return parseInt(v); + case $kindUint8: + return parseInt(v) << 24 >>> 24; + case $kindUint16: + return parseInt(v) << 16 >>> 16; + case $kindUint32: + case $kindUintptr: + return parseInt(v) >>> 0; + case $kindInt64: + case $kindUint64: + return new t(0, v); + case $kindFloat32: + case $kindFloat64: + return parseFloat(v); + case $kindArray: + if (v.length !== t.len) { + $throwRuntimeError("got array with wrong size from JavaScript native"); + } + return $mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); }); + case $kindFunc: + return function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = arguments[i]; + for (var j = 0; j < varargs.$length; j++) { + args.push($externalize(varargs.$array[varargs.$offset + j], vt, makeWrapper)); + } + break; + } + args.push($externalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(recv, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $internalize(result, t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $internalize(result[i], t.results[i], makeWrapper); + } + return result; + } + }; + case $kindInterface: + if (t.methods.length !== 0) { + $throwRuntimeError("cannot internalize " + t.string); + } + if (v === null) { + return $ifaceNil; + } + if (v === undefined) { + return new $jsObjectPtr(undefined); + } + switch (v.constructor) { + case Int8Array: + return new ($sliceType($Int8))(v); + case Int16Array: + return new ($sliceType($Int16))(v); + case Int32Array: + return new ($sliceType($Int))(v); + case Uint8Array: + return new ($sliceType($Uint8))(v); + case Uint16Array: + return new ($sliceType($Uint16))(v); + case Uint32Array: + return new ($sliceType($Uint))(v); + case Float32Array: + return new ($sliceType($Float32))(v); + case Float64Array: + return new ($sliceType($Float64))(v); + case Array: + return $internalize(v, $sliceType($emptyInterface), makeWrapper); + case Boolean: + return new $Bool(!!v); + case Date: + if (timePkg === undefined) { + /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ + return new $jsObjectPtr(v); + } + return new timePkg.Time($internalize(v, timePkg.Time, makeWrapper)); + case (function () { }).constructor: // is usually Function, but in Chrome extensions it is something else + var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); + return new funcType($internalize(v, funcType, makeWrapper)); + case Number: + return new $Float64(parseFloat(v)); + case String: + return new $String($internalize(v, $String, makeWrapper)); + default: + if ($global.Node && v instanceof $global.Node) { + return new $jsObjectPtr(v); + } + var mapType = $mapType($String, $emptyInterface); + return new mapType($internalize(v, mapType, recv, seen, makeWrapper)); + } + case $kindMap: + var m = {}; + seen.get(t).set(v, m); + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var k = $internalize(keys[i], t.key, recv, seen, makeWrapper); + m[t.key.keyFor(k)] = { k: k, v: $internalize(v[keys[i]], t.elem, recv, seen, makeWrapper) }; + } + return m; + case $kindPtr: + if (t.elem.kind === $kindStruct) { + return $internalize(v, t.elem, makeWrapper); + } + case $kindSlice: + return new t($mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); })); + case $kindString: + v = String(v); + if ($isASCII(v)) { + return v; + } + var s = ""; + var i = 0; + while (i < v.length) { + var h = v.charCodeAt(i); + if (0xD800 <= h && h <= 0xDBFF) { + var l = v.charCodeAt(i + 1); + var c = (h - 0xD800) * 0x400 + l - 0xDC00 + 0x10000; + s += $encodeRune(c); + i += 2; + continue; + } + s += $encodeRune(h); + i++; + } + return s; + case $kindStruct: + var noJsObject = {}; + var searchJsObject = function(t) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + switch (t.kind) { + case $kindPtr: + return searchJsObject(t.elem); + case $kindStruct: + var f = t.fields[0]; + var o = searchJsObject(f.typ); + if (o !== noJsObject) { + var n = new t.ptr(); + n[f.prop] = o; + return n; + } + return noJsObject; + default: + return noJsObject; + } + }; + var o = searchJsObject(t); + if (o !== noJsObject) { + return o; + } + } + $throwRuntimeError("cannot internalize " + t.string); +}; + +var $copyIfRequired = function(v, typ) { + // interface values + if (v && v.constructor && v.constructor.copy) { + return new v.constructor($clone(v.$val, v.constructor)) + } + // array and struct values + if (typ.copy) { + var clone = typ.zero(); + typ.copy(clone, v); + return clone; + } + return v; +} + +/* $isASCII reports whether string s contains only ASCII characters. */ +var $isASCII = function(s) { + for (var i = 0; i < s.length; i++) { + if (s.charCodeAt(i) >= 128) { + return false; + } + } + return true; +}; + +$packages["github.com/gopherjs/gopherjs/js"] = (function() { + var $pkg = {}, $init, Object, Error, M, sliceType, ptrType, sliceType$2, funcType, funcType$1, funcType$2, ptrType$1, MakeWrapper, MakeFullWrapper, init; + Object = $pkg.Object = $newType(0, $kindStruct, "js.Object", true, "github.com/gopherjs/gopherjs/js", true, function(object_) { + this.$val = this; + if (arguments.length === 0) { + this.object = null; + return; + } + this.object = object_; + }); + Error = $pkg.Error = $newType(0, $kindStruct, "js.Error", true, "github.com/gopherjs/gopherjs/js", true, function(Object_) { + this.$val = this; + if (arguments.length === 0) { + this.Object = null; + return; + } + this.Object = Object_; + }); + M = $pkg.M = $newType(4, $kindMap, "js.M", true, "github.com/gopherjs/gopherjs/js", true, null); + sliceType = $sliceType($emptyInterface); + ptrType = $ptrType(Object); + sliceType$2 = $sliceType(ptrType); + funcType = $funcType([sliceType$2], [ptrType], true); + funcType$1 = $funcType([], [ptrType], false); + funcType$2 = $funcType([ptrType], [], false); + ptrType$1 = $ptrType(Error); + Object.ptr.prototype.Get = function(key) { + var key, o; + o = this; + return o.object[$externalize(key, $String)]; + }; + Object.prototype.Get = function(key) { return this.$val.Get(key); }; + Object.ptr.prototype.Set = function(key, value) { + var key, o, value; + o = this; + o.object[$externalize(key, $String)] = $externalize(value, $emptyInterface); + }; + Object.prototype.Set = function(key, value) { return this.$val.Set(key, value); }; + Object.ptr.prototype.Delete = function(key) { + var key, o; + o = this; + delete o.object[$externalize(key, $String)]; + }; + Object.prototype.Delete = function(key) { return this.$val.Delete(key); }; + Object.ptr.prototype.Length = function() { + var o; + o = this; + return $parseInt(o.object.length); + }; + Object.prototype.Length = function() { return this.$val.Length(); }; + Object.ptr.prototype.Index = function(i) { + var i, o; + o = this; + return o.object[i]; + }; + Object.prototype.Index = function(i) { return this.$val.Index(i); }; + Object.ptr.prototype.SetIndex = function(i, value) { + var i, o, value; + o = this; + o.object[i] = $externalize(value, $emptyInterface); + }; + Object.prototype.SetIndex = function(i, value) { return this.$val.SetIndex(i, value); }; + Object.ptr.prototype.Call = function(name, args) { + var args, name, o, obj; + o = this; + return (obj = o.object, obj[$externalize(name, $String)].apply(obj, $externalize(args, sliceType))); + }; + Object.prototype.Call = function(name, args) { return this.$val.Call(name, args); }; + Object.ptr.prototype.Invoke = function(args) { + var args, o; + o = this; + return o.object.apply(undefined, $externalize(args, sliceType)); + }; + Object.prototype.Invoke = function(args) { return this.$val.Invoke(args); }; + Object.ptr.prototype.New = function(args) { + var args, o; + o = this; + return new ($global.Function.prototype.bind.apply(o.object, [undefined].concat($externalize(args, sliceType)))); + }; + Object.prototype.New = function(args) { return this.$val.New(args); }; + Object.ptr.prototype.Bool = function() { + var o; + o = this; + return !!(o.object); + }; + Object.prototype.Bool = function() { return this.$val.Bool(); }; + Object.ptr.prototype.String = function() { + var o; + o = this; + return $internalize(o.object, $String); + }; + Object.prototype.String = function() { return this.$val.String(); }; + Object.ptr.prototype.Int = function() { + var o; + o = this; + return $parseInt(o.object) >> 0; + }; + Object.prototype.Int = function() { return this.$val.Int(); }; + Object.ptr.prototype.Int64 = function() { + var o; + o = this; + return $internalize(o.object, $Int64); + }; + Object.prototype.Int64 = function() { return this.$val.Int64(); }; + Object.ptr.prototype.Uint64 = function() { + var o; + o = this; + return $internalize(o.object, $Uint64); + }; + Object.prototype.Uint64 = function() { return this.$val.Uint64(); }; + Object.ptr.prototype.Float = function() { + var o; + o = this; + return $parseFloat(o.object); + }; + Object.prototype.Float = function() { return this.$val.Float(); }; + Object.ptr.prototype.Interface = function() { + var o; + o = this; + return $internalize(o.object, $emptyInterface); + }; + Object.prototype.Interface = function() { return this.$val.Interface(); }; + Object.ptr.prototype.Unsafe = function() { + var o; + o = this; + return o.object; + }; + Object.prototype.Unsafe = function() { return this.$val.Unsafe(); }; + Error.ptr.prototype.Error = function() { + var err; + err = this; + return "JavaScript error: " + $internalize(err.Object.message, $String); + }; + Error.prototype.Error = function() { return this.$val.Error(); }; + Error.ptr.prototype.Stack = function() { + var err; + err = this; + return $internalize(err.Object.stack, $String); + }; + Error.prototype.Stack = function() { return this.$val.Stack(); }; + MakeWrapper = function(i) { + var i, i$1, m, methods, o, v; + v = i; + o = new ($global.Object)(); + o.__internal_object__ = v; + methods = v.constructor.methods; + i$1 = 0; + while (true) { + if (!(i$1 < $parseInt(methods.length))) { break; } + m = [m]; + m[0] = methods[i$1]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$1 = i$1 + (1) >> 0; + continue; + } + o[$externalize($internalize(m[0].name, $String), $String)] = $externalize((function(m) { return function(args) { + var args; + return $externalizeFunction(v[$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool)).apply(v, $externalize(args, sliceType$2)); + }; })(m), funcType); + i$1 = i$1 + (1) >> 0; + } + return o; + }; + $pkg.MakeWrapper = MakeWrapper; + MakeFullWrapper = function(i) { + var {constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s, $r, $c} = $restore(this, {i}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + internalObj = [internalObj]; + wrapperObj = [wrapperObj]; + internalObj[0] = i; + constructor = internalObj[0].constructor; + wrapperObj[0] = new ($global.Object)(); + defineProperty = (function(internalObj, wrapperObj) { return function(key, descriptor) { + var descriptor, key; + $global.Object.defineProperty(wrapperObj[0], $externalize(key, $String), $externalize(descriptor, M)); + }; })(internalObj, wrapperObj); + $r = defineProperty("__internal_object__", $makeMap($String.keyFor, [{ k: "value", v: new $jsObjectPtr(internalObj[0]) }])); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + typ = $internalize(constructor.string, $String); + pkg = $internalize(constructor.pkg, $String); + ptr = ""; + if (typ.charCodeAt(0) === 42) { + ptr = "*"; + } + i$1 = 0; + while (true) { + if (!(i$1 < typ.length)) { break; } + if (typ.charCodeAt(i$1) === 46) { + typ = $substring(typ, (i$1 + 1 >> 0)); + break; + } + i$1 = i$1 + (1) >> 0; + } + pkgTyp = pkg + "." + ptr + typ; + $r = defineProperty("$type", $makeMap($String.keyFor, [{ k: "value", v: new $String(pkgTyp) }])); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + fields = null; + methods = new ($global.Array)(); + ms = constructor.methods; + if (!(ms === undefined)) { + methods = methods.concat(ms); + } + e = constructor.elem; + if (!(e === undefined)) { + fields = e.fields; + methods = methods.concat(e.methods); + } else { + fields = constructor.fields; + } + i$2 = 0; + /* while (true) { */ case 3: + /* if (!(i$2 < $parseInt(methods.length))) { break; } */ if(!(i$2 < $parseInt(methods.length))) { $s = 4; continue; } + m = [m]; + m[0] = methods[i$2]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$2 = i$2 + (1) >> 0; + /* continue; */ $s = 3; continue; + } + $r = defineProperty($internalize(m[0].prop, $String), $makeMap($String.keyFor, [{ k: "value", v: new funcType((function(internalObj, m, wrapperObj) { return function(args) { + var args; + return $externalizeFunction(internalObj[0][$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool), MakeFullWrapper).apply(internalObj[0], $externalize(args, sliceType$2)); + }; })(internalObj, m, wrapperObj)) }])); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$2 = i$2 + (1) >> 0; + $s = 3; continue; + case 4: + /* */ if (!(fields === undefined)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (!(fields === undefined)) { */ case 6: + i$3 = 0; + /* while (true) { */ case 8: + /* if (!(i$3 < $parseInt(fields.length))) { break; } */ if(!(i$3 < $parseInt(fields.length))) { $s = 9; continue; } + f = [f]; + f[0] = fields[i$3]; + if (!!!(f[0].exported)) { + i$3 = i$3 + (1) >> 0; + /* continue; */ $s = 8; continue; + } + $r = defineProperty($internalize(f[0].prop, $String), $makeMap($String.keyFor, [{ k: "get", v: new funcType$1((function(f, internalObj, wrapperObj) { return function() { + var vc; + vc = $copyIfRequired(internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)], f[0].typ); + return $externalize(vc, f[0].typ, MakeFullWrapper); + }; })(f, internalObj, wrapperObj)) }, { k: "set", v: new funcType$2((function(f, internalObj, wrapperObj) { return function(jv) { + var gv, jv; + gv = $internalize(jv, f[0].typ, MakeFullWrapper); + internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)] = gv; + }; })(f, internalObj, wrapperObj)) }])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$3 = i$3 + (1) >> 0; + $s = 8; continue; + case 9: + /* } */ case 7: + $s = -1; return wrapperObj[0]; + /* */ } return; } var $f = {$blk: MakeFullWrapper, $c: true, $r, constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s};return $f; + }; + $pkg.MakeFullWrapper = MakeFullWrapper; + init = function() { + var e; + e = new Error.ptr(null); + $unused(e); + }; + ptrType.methods = [{prop: "Get", name: "Get", pkg: "", typ: $funcType([$String], [ptrType], false)}, {prop: "Set", name: "Set", pkg: "", typ: $funcType([$String, $emptyInterface], [], false)}, {prop: "Delete", name: "Delete", pkg: "", typ: $funcType([$String], [], false)}, {prop: "Length", name: "Length", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Index", name: "Index", pkg: "", typ: $funcType([$Int], [ptrType], false)}, {prop: "SetIndex", name: "SetIndex", pkg: "", typ: $funcType([$Int, $emptyInterface], [], false)}, {prop: "Call", name: "Call", pkg: "", typ: $funcType([$String, sliceType], [ptrType], true)}, {prop: "Invoke", name: "Invoke", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "New", name: "New", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "Bool", name: "Bool", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Int", name: "Int", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Int64", name: "Int64", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Uint64", name: "Uint64", pkg: "", typ: $funcType([], [$Uint64], false)}, {prop: "Float", name: "Float", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Interface", name: "Interface", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "Unsafe", name: "Unsafe", pkg: "", typ: $funcType([], [$Uintptr], false)}]; + ptrType$1.methods = [{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Stack", name: "Stack", pkg: "", typ: $funcType([], [$String], false)}]; + Object.init("github.com/gopherjs/gopherjs/js", [{prop: "object", name: "object", embedded: false, exported: false, typ: ptrType, tag: ""}]); + Error.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType, tag: ""}]); + M.init($String, $emptyInterface); + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["runtime"] = (function() { + var $pkg = {}, $init, js, _type, TypeAssertionError, errorString, ptrType$1, ptrType$2, buildVersion, init, throw$1; + js = $packages["github.com/gopherjs/gopherjs/js"]; + _type = $pkg._type = $newType(0, $kindStruct, "runtime._type", true, "runtime", false, function(str_) { + this.$val = this; + if (arguments.length === 0) { + this.str = ""; + return; + } + this.str = str_; + }); + TypeAssertionError = $pkg.TypeAssertionError = $newType(0, $kindStruct, "runtime.TypeAssertionError", true, "runtime", true, function(_interface_, concrete_, asserted_, missingMethod_) { + this.$val = this; + if (arguments.length === 0) { + this._interface = ptrType$1.nil; + this.concrete = ptrType$1.nil; + this.asserted = ptrType$1.nil; + this.missingMethod = ""; + return; + } + this._interface = _interface_; + this.concrete = concrete_; + this.asserted = asserted_; + this.missingMethod = missingMethod_; + }); + errorString = $pkg.errorString = $newType(8, $kindString, "runtime.errorString", true, "runtime", false, null); + ptrType$1 = $ptrType(_type); + ptrType$2 = $ptrType(TypeAssertionError); + _type.ptr.prototype.string = function() { + var t; + t = this; + return t.str; + }; + _type.prototype.string = function() { return this.$val.string(); }; + _type.ptr.prototype.pkgpath = function() { + var t; + t = this; + return ""; + }; + _type.prototype.pkgpath = function() { return this.$val.pkgpath(); }; + TypeAssertionError.ptr.prototype.RuntimeError = function() { + }; + TypeAssertionError.prototype.RuntimeError = function() { return this.$val.RuntimeError(); }; + TypeAssertionError.ptr.prototype.Error = function() { + var as, cs, e, inter, msg; + e = this; + inter = "interface"; + if (!(e._interface === ptrType$1.nil)) { + inter = e._interface.string(); + } + as = e.asserted.string(); + if (e.concrete === ptrType$1.nil) { + return "interface conversion: " + inter + " is nil, not " + as; + } + cs = e.concrete.string(); + if (e.missingMethod === "") { + msg = "interface conversion: " + inter + " is " + cs + ", not " + as; + if (cs === as) { + if (!(e.concrete.pkgpath() === e.asserted.pkgpath())) { + msg = msg + (" (types from different packages)"); + } else { + msg = msg + (" (types from different scopes)"); + } + } + return msg; + } + return "interface conversion: " + cs + " is not " + as + ": missing method " + e.missingMethod; + }; + TypeAssertionError.prototype.Error = function() { return this.$val.Error(); }; + init = function() { + var e, jsPkg; + jsPkg = $packages[$externalize("github.com/gopherjs/gopherjs/js", $String)]; + $jsObjectPtr = jsPkg.Object.ptr; + $jsErrorPtr = jsPkg.Error.ptr; + $throwRuntimeError = throw$1; + buildVersion = $internalize($goVersion, $String); + e = $ifaceNil; + e = new TypeAssertionError.ptr(ptrType$1.nil, ptrType$1.nil, ptrType$1.nil, ""); + $unused(e); + }; + errorString.prototype.RuntimeError = function() { + var e; + e = this.$val; + }; + $ptrType(errorString).prototype.RuntimeError = function() { return new errorString(this.$get()).RuntimeError(); }; + errorString.prototype.Error = function() { + var e; + e = this.$val; + return "runtime error: " + (e); + }; + $ptrType(errorString).prototype.Error = function() { return new errorString(this.$get()).Error(); }; + throw$1 = function(s) { + var s; + $panic(new errorString((s))); + }; + ptrType$1.methods = [{prop: "string", name: "string", pkg: "runtime", typ: $funcType([], [$String], false)}, {prop: "pkgpath", name: "pkgpath", pkg: "runtime", typ: $funcType([], [$String], false)}]; + ptrType$2.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + errorString.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + _type.init("runtime", [{prop: "str", name: "str", embedded: false, exported: false, typ: $String, tag: ""}]); + TypeAssertionError.init("runtime", [{prop: "_interface", name: "_interface", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "concrete", name: "concrete", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "asserted", name: "asserted", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "missingMethod", name: "missingMethod", embedded: false, exported: false, typ: $String, tag: ""}]); + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + $r = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buildVersion = ""; + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["math/bits"] = (function() { + var $pkg = {}, $init; + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["math"] = (function() { + var $pkg = {}, $init, js, bits, arrayType, arrayType$1, arrayType$2, structType, math, _zero, posInf, negInf, nan, buf, max, min, Abs, Cos, Floor, Inf, IsInf, IsNaN, Max, Min, NaN, Pow, Signbit, Sin, Sqrt, init, Float64bits, Float64frombits; + js = $packages["github.com/gopherjs/gopherjs/js"]; + bits = $packages["math/bits"]; + arrayType = $arrayType($Uint32, 2); + arrayType$1 = $arrayType($Float32, 2); + arrayType$2 = $arrayType($Float64, 1); + structType = $structType("math", [{prop: "uint32array", name: "uint32array", embedded: false, exported: false, typ: arrayType, tag: ""}, {prop: "float32array", name: "float32array", embedded: false, exported: false, typ: arrayType$1, tag: ""}, {prop: "float64array", name: "float64array", embedded: false, exported: false, typ: arrayType$2, tag: ""}]); + max = function(x, y) { + var x, y; + if (IsInf(x, 1) || IsInf(y, 1)) { + return Inf(1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return y; + } + return x; + } + if (x > y) { + return x; + } + return y; + }; + min = function(x, y) { + var x, y; + if (IsInf(x, -1) || IsInf(y, -1)) { + return Inf(-1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return x; + } + return y; + } + if (x < y) { + return x; + } + return y; + }; + Abs = function(x) { + var x, x$1; + return Float64frombits((x$1 = Float64bits(x), new $Uint64(x$1.$high & ~2147483648, (x$1.$low & ~0) >>> 0))); + }; + $pkg.Abs = Abs; + Cos = function(x) { + var x; + return $parseFloat(math.cos(x)); + }; + $pkg.Cos = Cos; + Floor = function(x) { + var x; + return $parseFloat(math.floor(x)); + }; + $pkg.Floor = Floor; + Inf = function(sign) { + var sign; + if (sign >= 0) { + return posInf; + } else { + return negInf; + } + }; + $pkg.Inf = Inf; + IsInf = function(f, sign) { + var f, sign; + if (f === posInf) { + return sign >= 0; + } + if (f === negInf) { + return sign <= 0; + } + return false; + }; + $pkg.IsInf = IsInf; + IsNaN = function(f) { + var f, is; + is = false; + is = !((f === f)); + return is; + }; + $pkg.IsNaN = IsNaN; + Max = function(x, y) { + var x, y; + return max(x, y); + }; + $pkg.Max = Max; + Min = function(x, y) { + var x, y; + return min(x, y); + }; + $pkg.Min = Min; + NaN = function() { + return nan; + }; + $pkg.NaN = NaN; + Pow = function(x, y) { + var x, y; + if ((x === 1) || ((x === -1) && ((y === posInf) || (y === negInf)))) { + return 1; + } + return $parseFloat(math.pow(x, y)); + }; + $pkg.Pow = Pow; + Signbit = function(x) { + var x; + return x < 0 || (1 / x === negInf); + }; + $pkg.Signbit = Signbit; + Sin = function(x) { + var x; + return $parseFloat(math.sin(x)); + }; + $pkg.Sin = Sin; + Sqrt = function(x) { + var x; + return $parseFloat(math.sqrt(x)); + }; + $pkg.Sqrt = Sqrt; + init = function() { + var ab; + ab = new ($global.ArrayBuffer)(8); + buf.uint32array = new ($global.Uint32Array)(ab); + buf.float32array = new ($global.Float32Array)(ab); + buf.float64array = new ($global.Float64Array)(ab); + }; + Float64bits = function(f) { + var f, x, x$1; + buf.float64array[0] = f; + return (x = $shiftLeft64((new $Uint64(0, buf.uint32array[1])), 32), x$1 = (new $Uint64(0, buf.uint32array[0])), new $Uint64(x.$high + x$1.$high, x.$low + x$1.$low)); + }; + $pkg.Float64bits = Float64bits; + Float64frombits = function(b) { + var b; + buf.uint32array[0] = ((b.$low >>> 0)); + buf.uint32array[1] = (($shiftRightUint64(b, 32).$low >>> 0)); + return buf.float64array[0]; + }; + $pkg.Float64frombits = Float64frombits; + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + $r = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = bits.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buf = new structType.ptr(arrayType.zero(), arrayType$1.zero(), arrayType$2.zero()); + math = $global.Math; + _zero = 0; + posInf = 1 / _zero; + negInf = -1 / _zero; + nan = $parseFloat($NaN); + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["resolv"] = (function() { + var $pkg = {}, $init, math, Vector, Axis, Space, Shape, Line, ConvexPolygon, ContactSet, Circle, Projection, Object, Collision, Cell, sliceType, ptrType, sliceType$1, sliceType$2, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, sliceType$5, ptrType$4, ptrType$5, ptrType$6, sliceType$6, ptrType$7, sliceType$7, mapType, Dot, NewSpace, NewLine, NewConvexPolygon, NewContactSet, NewRectangle, NewCircle, NewObject, axpyUnitaryTo, scalUnitaryTo, NewCollision, newCell; + math = $packages["math"]; + Vector = $pkg.Vector = $newType(12, $kindSlice, "resolv.Vector", true, "resolv", true, null); + Axis = $pkg.Axis = $newType(4, $kindInt, "resolv.Axis", true, "resolv", true, null); + Space = $pkg.Space = $newType(0, $kindStruct, "resolv.Space", true, "resolv", true, function(Cells_, CellWidth_, CellHeight_) { + this.$val = this; + if (arguments.length === 0) { + this.Cells = sliceType$2.nil; + this.CellWidth = 0; + this.CellHeight = 0; + return; + } + this.Cells = Cells_; + this.CellWidth = CellWidth_; + this.CellHeight = CellHeight_; + }); + Shape = $pkg.Shape = $newType(8, $kindInterface, "resolv.Shape", true, "resolv", true, null); + Line = $pkg.Line = $newType(0, $kindStruct, "resolv.Line", true, "resolv", true, function(Start_, End_) { + this.$val = this; + if (arguments.length === 0) { + this.Start = Vector.nil; + this.End = Vector.nil; + return; + } + this.Start = Start_; + this.End = End_; + }); + ConvexPolygon = $pkg.ConvexPolygon = $newType(0, $kindStruct, "resolv.ConvexPolygon", true, "resolv", true, function(Points_, X_, Y_, Closed_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.X = 0; + this.Y = 0; + this.Closed = false; + return; + } + this.Points = Points_; + this.X = X_; + this.Y = Y_; + this.Closed = Closed_; + }); + ContactSet = $pkg.ContactSet = $newType(0, $kindStruct, "resolv.ContactSet", true, "resolv", true, function(Points_, MTV_, Center_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.MTV = Vector.nil; + this.Center = Vector.nil; + return; + } + this.Points = Points_; + this.MTV = MTV_; + this.Center = Center_; + }); + Circle = $pkg.Circle = $newType(0, $kindStruct, "resolv.Circle", true, "resolv", true, function(X_, Y_, Radius_) { + this.$val = this; + if (arguments.length === 0) { + this.X = 0; + this.Y = 0; + this.Radius = 0; + return; + } + this.X = X_; + this.Y = Y_; + this.Radius = Radius_; + }); + Projection = $pkg.Projection = $newType(0, $kindStruct, "resolv.Projection", true, "resolv", true, function(Min_, Max_) { + this.$val = this; + if (arguments.length === 0) { + this.Min = 0; + this.Max = 0; + return; + } + this.Min = Min_; + this.Max = Max_; + }); + Object = $pkg.Object = $newType(0, $kindStruct, "resolv.Object", true, "resolv", true, function(Shape_, Space_, X_, Y_, W_, H_, TouchingCells_, Data_, ignoreList_, tags_) { + this.$val = this; + if (arguments.length === 0) { + this.Shape = $ifaceNil; + this.Space = ptrType$1.nil; + this.X = 0; + this.Y = 0; + this.W = 0; + this.H = 0; + this.TouchingCells = sliceType$1.nil; + this.Data = $ifaceNil; + this.ignoreList = false; + this.tags = sliceType$6.nil; + return; + } + this.Shape = Shape_; + this.Space = Space_; + this.X = X_; + this.Y = Y_; + this.W = W_; + this.H = H_; + this.TouchingCells = TouchingCells_; + this.Data = Data_; + this.ignoreList = ignoreList_; + this.tags = tags_; + }); + Collision = $pkg.Collision = $newType(0, $kindStruct, "resolv.Collision", true, "resolv", true, function(checkingObject_, dx_, dy_, Objects_, Cells_) { + this.$val = this; + if (arguments.length === 0) { + this.checkingObject = ptrType$2.nil; + this.dx = 0; + this.dy = 0; + this.Objects = sliceType$3.nil; + this.Cells = sliceType$1.nil; + return; + } + this.checkingObject = checkingObject_; + this.dx = dx_; + this.dy = dy_; + this.Objects = Objects_; + this.Cells = Cells_; + }); + Cell = $pkg.Cell = $newType(0, $kindStruct, "resolv.Cell", true, "resolv", true, function(X_, Y_, Objects_) { + this.$val = this; + if (arguments.length === 0) { + this.X = 0; + this.Y = 0; + this.Objects = sliceType$3.nil; + return; + } + this.X = X_; + this.Y = Y_; + this.Objects = Objects_; + }); + sliceType = $sliceType($Float64); + ptrType = $ptrType(Cell); + sliceType$1 = $sliceType(ptrType); + sliceType$2 = $sliceType(sliceType$1); + ptrType$1 = $ptrType(Space); + ptrType$2 = $ptrType(Object); + sliceType$3 = $sliceType(ptrType$2); + sliceType$4 = $sliceType(Vector); + ptrType$3 = $ptrType(Line); + sliceType$5 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(Circle); + ptrType$5 = $ptrType(ConvexPolygon); + ptrType$6 = $ptrType(ContactSet); + sliceType$6 = $sliceType($String); + ptrType$7 = $ptrType(Collision); + sliceType$7 = $sliceType(Axis); + mapType = $mapType(ptrType$2, $Bool); + Vector.prototype.Clone = function() { + var clone, v; + v = this; + clone = $makeSlice(Vector, v.$length); + $copySlice(clone, v); + return clone; + }; + $ptrType(Vector).prototype.Clone = function() { return this.$get().Clone(); }; + Vector.prototype.Add = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Add = function(vs) { return this.$get().Add(vs); }; + Vector.prototype.Sub = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType), $convertSliceType(v, sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType), $convertSliceType(v, sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Sub = function(vs) { return this.$get().Sub(vs); }; + Vector.prototype.Scale = function(size) { + var size, v; + v = this; + scalUnitaryTo($convertSliceType(v, sliceType), size, $convertSliceType(v, sliceType)); + return v; + }; + $ptrType(Vector).prototype.Scale = function(size) { return this.$get().Scale(size); }; + Vector.prototype.Equal = function(v2) { + var _i, _ref, i, v, v2; + v = this; + if (!((v.$length === v2.$length))) { + return false; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (math.Abs(((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) - ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])) > 1e-08) { + return false; + } + _i++; + } + return true; + }; + $ptrType(Vector).prototype.Equal = function(v2) { return this.$get().Equal(v2); }; + Vector.prototype.Magnitude = function() { + var v; + v = this; + return math.Sqrt(v.Magnitude2()); + }; + $ptrType(Vector).prototype.Magnitude = function() { return this.$get().Magnitude(); }; + Vector.prototype.Magnitude2 = function() { + var _i, _ref, result, scalar, v; + v = this; + result = 0; + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + scalar = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + result = result + (scalar * scalar); + _i++; + } + return result; + }; + $ptrType(Vector).prototype.Magnitude2 = function() { return this.$get().Magnitude2(); }; + Vector.prototype.Unit = function() { + var _i, _ref, i, l, v; + v = this; + l = v.Magnitude(); + if (l < 1e-08) { + return v; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i] = ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) / l); + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Unit = function() { return this.$get().Unit(); }; + Dot = function(v1, v2) { + var _i, _ref, _tmp, _tmp$1, _tmp$2, dim1, dim2, i, result, v1, v2; + _tmp = 0; + _tmp$1 = v1.$length; + _tmp$2 = v2.$length; + result = _tmp; + dim1 = _tmp$1; + dim2 = _tmp$2; + if (dim1 > dim2) { + v2 = $appendSlice(v2, $convertSliceType($makeSlice(Vector, (dim1 - dim2 >> 0)), sliceType)); + } + if (dim1 < dim2) { + v1 = $appendSlice(v1, $convertSliceType($makeSlice(Vector, (dim2 - dim1 >> 0)), sliceType)); + } + _ref = v1; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + result = result + (((i < 0 || i >= v1.$length) ? ($throwRuntimeError("index out of range"), undefined) : v1.$array[v1.$offset + i]) * ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])); + _i++; + } + return result; + }; + $pkg.Dot = Dot; + Vector.prototype.Dot = function(v2) { + var v, v2; + v = this; + return Dot(v, v2); + }; + $ptrType(Vector).prototype.Dot = function(v2) { return this.$get().Dot(v2); }; + Vector.prototype.Cross = function(v2) { + var v, v2; + v = this; + if (!((v.$length === 3)) || !((v2.$length === 3))) { + return Vector.nil; + } + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (1 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 1]), (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0]) - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]), (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0])]); + }; + $ptrType(Vector).prototype.Cross = function(v2) { return this.$get().Cross(v2); }; + Vector.prototype.Rotate = function(angle, as) { + var _1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, angle, as, axis, cos, dim, sin, v, x, y, z, z$1; + v = this; + _tmp = 2; + _tmp$1 = v.$length; + axis = _tmp; + dim = _tmp$1; + if (dim === 0) { + return v; + } + if (as.$length > 0) { + axis = (0 >= as.$length ? ($throwRuntimeError("index out of range"), undefined) : as.$array[as.$offset + 0]); + } + if ((dim === 1) && !((axis === 2))) { + v = $append(v, 0, 0); + } + if ((dim < 2 && (axis === 2)) || ((dim === 2) && !((axis === 2)))) { + v = $append(v, 0); + } + _tmp$2 = (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + _tmp$3 = (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + x = _tmp$2; + y = _tmp$3; + _tmp$4 = math.Cos(angle); + _tmp$5 = math.Sin(angle); + cos = _tmp$4; + sin = _tmp$5; + _1 = axis; + if (_1 === (0)) { + z = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = y * cos - z * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = y * sin + z * cos); + } else if (_1 === (1)) { + z$1 = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos + z$1 * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = -x * sin + z$1 * cos); + } else if (_1 === (2)) { + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos - y * sin); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = x * sin + y * cos); + } + if (dim > 3) { + return $subslice(v, 0, 3); + } + return v; + }; + $ptrType(Vector).prototype.Rotate = function(angle, as) { return this.$get().Rotate(angle, as); }; + Vector.prototype.X = function() { + var v; + v = this; + if (v.$length < 1) { + return 0; + } + return (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + }; + $ptrType(Vector).prototype.X = function() { return this.$get().X(); }; + Vector.prototype.Y = function() { + var v; + v = this; + if (v.$length < 2) { + return 0; + } + return (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + }; + $ptrType(Vector).prototype.Y = function() { return this.$get().Y(); }; + Vector.prototype.Z = function() { + var v; + v = this; + if (v.$length < 3) { + return 0; + } + return (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + }; + $ptrType(Vector).prototype.Z = function() { return this.$get().Z(); }; + NewSpace = function(spaceWidth, spaceHeight, cellWidth, cellHeight) { + var _q, _q$1, cellHeight, cellWidth, sp, spaceHeight, spaceWidth; + sp = new Space.ptr(sliceType$2.nil, cellWidth, cellHeight); + sp.Resize((_q = spaceWidth / cellWidth, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero")), (_q$1 = spaceHeight / cellHeight, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))); + return sp; + }; + $pkg.NewSpace = NewSpace; + Space.ptr.prototype.Add = function(objects) { + var {_i, _ref, obj, objects, sp, $s, $r, $c} = $restore(this, {objects}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + obj.Space = sp; + $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _i++; + $s = 1; continue; + case 2: + $s = -1; return; + /* */ } return; } var $f = {$blk: Space.ptr.prototype.Add, $c: true, $r, _i, _ref, obj, objects, sp, $s};return $f; + }; + Space.prototype.Add = function(objects) { return this.$val.Add(objects); }; + Space.ptr.prototype.Remove = function(objects) { + var _i, _i$1, _ref, _ref$1, cell, obj, objects, sp; + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.TouchingCells; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cell = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + cell.unregister(obj); + _i$1++; + } + obj.TouchingCells = new sliceType$1([]); + obj.Space = ptrType$1.nil; + _i++; + } + }; + Space.prototype.Remove = function(objects) { return this.$val.Remove(objects); }; + Space.ptr.prototype.Objects = function() { + var _entry, _i, _i$1, _i$2, _key, _ref, _ref$1, _ref$2, _tuple, added, cx, cy, o, objects, objectsAdded, sp, x, x$1, x$2; + sp = this; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + objects = new sliceType$3([]); + _ref = sp.Cells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cy = _i; + _ref$1 = (x = sp.Cells, ((cy < 0 || cy >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + cy])); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cx = _i$1; + _ref$2 = (x$1 = (x$2 = sp.Cells, ((cy < 0 || cy >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + cy])), ((cx < 0 || cx >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + cx])).Objects; + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + o = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + _tuple = (_entry = objectsAdded[ptrType$2.keyFor(o)], _entry !== undefined ? [_entry.v, true] : [false, false]); + added = _tuple[1]; + if (!added) { + objects = $append(objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + } + _i$2++; + } + _i$1++; + } + _i++; + } + return objects; + }; + Space.prototype.Objects = function() { return this.$val.Objects(); }; + Space.ptr.prototype.Resize = function(width, height) { + var height, sp, width, x, x$1, x$2, y; + sp = this; + sp.Cells = new sliceType$2([]); + y = 0; + while (true) { + if (!(y < height)) { break; } + sp.Cells = $append(sp.Cells, new sliceType$1([])); + x = 0; + while (true) { + if (!(x < width)) { break; } + (x$2 = sp.Cells, ((y < 0 || y >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + y] = $append((x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])), newCell(x, y)))); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.Resize = function(width, height) { return this.$val.Resize(width, height); }; + Space.ptr.prototype.Cell = function(x, y) { + var sp, x, x$1, x$2, x$3, y; + sp = this; + if (y >= 0 && y < sp.Cells.$length && x >= 0 && x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length) { + return (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + } + return ptrType.nil; + }; + Space.prototype.Cell = function(x, y) { return this.$val.Cell(x, y); }; + Space.ptr.prototype.CheckCells = function(x, y, w, h, tags) { + var _i, _ref, cell, h, ix, iy, obj, sp, tags, w, x, x$1, y; + sp = this; + ix = x; + while (true) { + if (!(ix < (x + w >> 0))) { break; } + iy = y; + while (true) { + if (!(iy < (y + h >> 0))) { break; } + cell = sp.Cell(ix, iy); + if (!(cell === ptrType.nil)) { + if (tags.$length > 0) { + if (cell.ContainsTags(tags)) { + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (obj.HasTags(tags)) { + return obj; + } + _i++; + } + } + } else if (cell.Occupied()) { + return (x$1 = cell.Objects, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])); + } + } + iy = iy + (1) >> 0; + } + ix = ix + (1) >> 0; + } + return ptrType$2.nil; + }; + Space.prototype.CheckCells = function(x, y, w, h, tags) { return this.$val.CheckCells(x, y, w, h, tags); }; + Space.ptr.prototype.CheckCellsWorld = function(x, y, w, h, tags) { + var _tuple, _tuple$1, ch, cw, h, sp, sx, sy, tags, w, x, y; + sp = this; + _tuple = sp.WorldToSpace(x, y); + sx = _tuple[0]; + sy = _tuple[1]; + _tuple$1 = sp.WorldToSpace(w, h); + cw = _tuple$1[0]; + ch = _tuple$1[1]; + return sp.CheckCells(sx, sy, cw, ch, tags); + }; + Space.prototype.CheckCellsWorld = function(x, y, w, h, tags) { return this.$val.CheckCellsWorld(x, y, w, h, tags); }; + Space.ptr.prototype.UnregisterAllObjects = function() { + var cell, sp, x, x$1, x$2, x$3, y; + sp = this; + y = 0; + while (true) { + if (!(y < sp.Cells.$length)) { break; } + x = 0; + while (true) { + if (!(x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length)) { break; } + cell = (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + sp.Remove(cell.Objects); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.UnregisterAllObjects = function() { return this.$val.UnregisterAllObjects(); }; + Space.ptr.prototype.WorldToSpace = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = ((math.Floor(x / (sp.CellWidth)) >> 0)); + fy = ((math.Floor(y / (sp.CellHeight)) >> 0)); + return [fx, fy]; + }; + Space.prototype.WorldToSpace = function(x, y) { return this.$val.WorldToSpace(x, y); }; + Space.ptr.prototype.SpaceToWorld = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = (($imul(x, sp.CellWidth))); + fy = (($imul(y, sp.CellHeight))); + return [fx, fy]; + }; + Space.prototype.SpaceToWorld = function(x, y) { return this.$val.SpaceToWorld(x, y); }; + Space.ptr.prototype.Height = function() { + var sp; + sp = this; + return sp.Cells.$length; + }; + Space.prototype.Height = function() { return this.$val.Height(); }; + Space.ptr.prototype.Width = function() { + var sp, x; + sp = this; + if (sp.Cells.$length > 0) { + return (x = sp.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])).$length; + } + return 0; + }; + Space.prototype.Width = function() { return this.$val.Width(); }; + Space.ptr.prototype.CellsInLine = function(startX, startY, endX, endY) { + var _q, _q$1, _q$2, _q$3, _tuple, _tuple$1, alternate, c, cell, cells, cx, cy, dv, endCell, endX, endY, p, pX, pY, sp, startX, startY; + sp = this; + cells = new sliceType$1([]); + cell = sp.Cell(startX, startY); + endCell = sp.Cell(endX, endY); + if (!(cell === ptrType.nil) && !(endCell === ptrType.nil)) { + dv = new Vector([((endX - startX >> 0)), ((endY - startY >> 0))]).Unit(); + (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0] = (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]) * (((_q = sp.CellWidth / 2, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero"))))); + (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1] = (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]) * (((_q$1 = sp.CellHeight / 2, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))))); + _tuple = sp.SpaceToWorld(startX, startY); + pX = _tuple[0]; + pY = _tuple[1]; + p = new Vector([pX + ((_q$2 = sp.CellWidth / 2, (_q$2 === _q$2 && _q$2 !== 1/0 && _q$2 !== -1/0) ? _q$2 >> 0 : $throwRuntimeError("integer divide by zero"))), pY + ((_q$3 = sp.CellHeight / 2, (_q$3 === _q$3 && _q$3 !== 1/0 && _q$3 !== -1/0) ? _q$3 >> 0 : $throwRuntimeError("integer divide by zero")))]); + alternate = false; + while (true) { + if (!(!(cell === ptrType.nil))) { break; } + if (cell === endCell) { + cells = $append(cells, cell); + break; + } + cells = $append(cells, cell); + if (alternate) { + (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1] = (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + ((1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]))); + } else { + (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0] = (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + ((0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]))); + } + _tuple$1 = sp.WorldToSpace((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]), (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1])); + cx = _tuple$1[0]; + cy = _tuple$1[1]; + c = sp.Cell(cx, cy); + if (!(c === cell)) { + cell = c; + } + alternate = !alternate; + } + } + return cells; + }; + Space.prototype.CellsInLine = function(startX, startY, endX, endY) { return this.$val.CellsInLine(startX, startY, endX, endY); }; + NewLine = function(x, y, x2, y2) { + var x, x2, y, y2; + return new Line.ptr(new Vector([x, y]), new Vector([x2, y2])); + }; + $pkg.NewLine = NewLine; + Line.ptr.prototype.Project = function(axis) { + var axis, line; + line = this; + return line.Vector().Scale(axis.Dot(line.Start.Sub(new sliceType$4([line.End])))); + }; + Line.prototype.Project = function(axis) { return this.$val.Project(axis); }; + Line.ptr.prototype.Normal = function() { + var line, v; + line = this; + v = line.Vector(); + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]), -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])]).Unit(); + }; + Line.prototype.Normal = function() { return this.$val.Normal(); }; + Line.ptr.prototype.Vector = function() { + var line; + line = this; + return line.End.Clone().Sub(new sliceType$4([line.Start])).Unit(); + }; + Line.prototype.Vector = function() { return this.$val.Vector(); }; + Line.ptr.prototype.IntersectionPointsLine = function(other) { + var det, dx, dy, gamma, lambda, line, other, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$20, x$21, x$22, x$23, x$24, x$25, x$26, x$27, x$28, x$29, x$3, x$4, x$5, x$6, x$7, x$8, x$9; + line = this; + det = ((x = line.End, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) - (x$1 = line.Start, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0]))) * ((x$2 = other.End, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) - (x$3 = other.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))) - ((x$4 = other.End, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) - (x$5 = other.Start, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0]))) * ((x$6 = line.End, (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1])) - (x$7 = line.Start, (1 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 1]))); + if (!((det === 0))) { + lambda = ((((x$8 = line.Start, (1 >= x$8.$length ? ($throwRuntimeError("index out of range"), undefined) : x$8.$array[x$8.$offset + 1])) - (x$9 = other.Start, (1 >= x$9.$length ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + 1]))) * ((x$10 = other.End, (0 >= x$10.$length ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + 0])) - (x$11 = other.Start, (0 >= x$11.$length ? ($throwRuntimeError("index out of range"), undefined) : x$11.$array[x$11.$offset + 0])))) - (((x$12 = line.Start, (0 >= x$12.$length ? ($throwRuntimeError("index out of range"), undefined) : x$12.$array[x$12.$offset + 0])) - (x$13 = other.Start, (0 >= x$13.$length ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + 0]))) * ((x$14 = other.End, (1 >= x$14.$length ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + 1])) - (x$15 = other.Start, (1 >= x$15.$length ? ($throwRuntimeError("index out of range"), undefined) : x$15.$array[x$15.$offset + 1])))) + 1) / det; + gamma = ((((x$16 = line.Start, (1 >= x$16.$length ? ($throwRuntimeError("index out of range"), undefined) : x$16.$array[x$16.$offset + 1])) - (x$17 = other.Start, (1 >= x$17.$length ? ($throwRuntimeError("index out of range"), undefined) : x$17.$array[x$17.$offset + 1]))) * ((x$18 = line.End, (0 >= x$18.$length ? ($throwRuntimeError("index out of range"), undefined) : x$18.$array[x$18.$offset + 0])) - (x$19 = line.Start, (0 >= x$19.$length ? ($throwRuntimeError("index out of range"), undefined) : x$19.$array[x$19.$offset + 0])))) - (((x$20 = line.Start, (0 >= x$20.$length ? ($throwRuntimeError("index out of range"), undefined) : x$20.$array[x$20.$offset + 0])) - (x$21 = other.Start, (0 >= x$21.$length ? ($throwRuntimeError("index out of range"), undefined) : x$21.$array[x$21.$offset + 0]))) * ((x$22 = line.End, (1 >= x$22.$length ? ($throwRuntimeError("index out of range"), undefined) : x$22.$array[x$22.$offset + 1])) - (x$23 = line.Start, (1 >= x$23.$length ? ($throwRuntimeError("index out of range"), undefined) : x$23.$array[x$23.$offset + 1])))) + 1) / det; + if ((0 < lambda && lambda < 1) && (0 < gamma && gamma < 1)) { + dx = (x$24 = line.End, (0 >= x$24.$length ? ($throwRuntimeError("index out of range"), undefined) : x$24.$array[x$24.$offset + 0])) - (x$25 = line.Start, (0 >= x$25.$length ? ($throwRuntimeError("index out of range"), undefined) : x$25.$array[x$25.$offset + 0])); + dy = (x$26 = line.End, (1 >= x$26.$length ? ($throwRuntimeError("index out of range"), undefined) : x$26.$array[x$26.$offset + 1])) - (x$27 = line.Start, (1 >= x$27.$length ? ($throwRuntimeError("index out of range"), undefined) : x$27.$array[x$27.$offset + 1])); + return new Vector([(x$28 = line.Start, (0 >= x$28.$length ? ($throwRuntimeError("index out of range"), undefined) : x$28.$array[x$28.$offset + 0])) + (lambda * dx), (x$29 = line.Start, (1 >= x$29.$length ? ($throwRuntimeError("index out of range"), undefined) : x$29.$array[x$29.$offset + 1])) + (lambda * dy)]); + } + } + return Vector.nil; + }; + Line.prototype.IntersectionPointsLine = function(other) { return this.$val.IntersectionPointsLine(other); }; + Line.ptr.prototype.IntersectionPointsCircle = function(circle) { + var a, b, c, circle, cp, det, diff, lEnd, lStart, line, points, t, t$1, x, x$1, x$2, x$3, x$4, x$5; + line = this; + points = new sliceType$4([]); + cp = new Vector([circle.X, circle.Y]); + lStart = line.Start.Sub(new sliceType$4([cp])); + lEnd = line.End.Sub(new sliceType$4([cp])); + diff = lEnd.Sub(new sliceType$4([lStart])); + a = (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) + (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]); + b = 2 * (((0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]))); + c = ((0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1])) - (circle.Radius * circle.Radius); + det = b * b - (4 * a * c); + if (det < 0) { + } else if (det === 0) { + t = -b / (2 * a); + if (t >= 0 && t <= 1) { + points = $append(points, new Vector([(x = line.Start, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) + t * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$1 = line.Start, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])) + t * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } else { + t$1 = (-b + math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$2 = line.Start, (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$3 = line.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + t$1 = (-b - math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$4 = line.Start, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$5 = line.Start, (1 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } + return points; + }; + Line.prototype.IntersectionPointsCircle = function(circle) { return this.$val.IntersectionPointsCircle(circle); }; + NewConvexPolygon = function(points) { + var cp, points; + cp = new ConvexPolygon.ptr(new sliceType$4([]), 0, 0, true); + cp.AddPoints(points); + return cp; + }; + $pkg.NewConvexPolygon = NewConvexPolygon; + ConvexPolygon.ptr.prototype.Clone = function() { + var _i, _ref, cp, newPoly, point, points; + cp = this; + points = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + points = $append(points, point.Clone()); + _i++; + } + newPoly = NewConvexPolygon(sliceType.nil); + newPoly.X = cp.X; + newPoly.Y = cp.Y; + newPoly.AddPointsVec(points); + newPoly.Closed = cp.Closed; + return newPoly; + }; + ConvexPolygon.prototype.Clone = function() { return this.$val.Clone(); }; + ConvexPolygon.ptr.prototype.AddPointsVec = function(points) { + var cp, points; + cp = this; + cp.Points = $appendSlice(cp.Points, points); + }; + ConvexPolygon.prototype.AddPointsVec = function(points) { return this.$val.AddPointsVec(points); }; + ConvexPolygon.ptr.prototype.AddPoints = function(vertexPositions) { + var cp, v, vertexPositions, x; + cp = this; + v = 0; + while (true) { + if (!(v < vertexPositions.$length)) { break; } + cp.Points = $append(cp.Points, new Vector([((v < 0 || v >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + v]), (x = v + 1 >> 0, ((x < 0 || x >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + x]))])); + v = v + (2) >> 0; + } + }; + ConvexPolygon.prototype.AddPoints = function(vertexPositions) { return this.$val.AddPoints(vertexPositions); }; + ConvexPolygon.ptr.prototype.Lines = function() { + var _tmp, _tmp$1, cp, end, i, line, lines, start, vertices, x; + cp = this; + lines = new sliceType$5([]); + vertices = cp.Transformed(); + i = 0; + while (true) { + if (!(i < vertices.$length)) { break; } + _tmp = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]); + _tmp$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]); + start = _tmp; + end = _tmp$1; + if (i < (vertices.$length - 1 >> 0)) { + end = (x = i + 1 >> 0, ((x < 0 || x >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + x])); + } else if (!cp.Closed) { + break; + } + line = NewLine((0 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 0]), (1 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 1]), (0 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 0]), (1 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 1])); + lines = $append(lines, line); + i = i + (1) >> 0; + } + return lines; + }; + ConvexPolygon.prototype.Lines = function() { return this.$val.Lines(); }; + ConvexPolygon.ptr.prototype.Transformed = function() { + var _i, _ref, cp, point, transformed; + cp = this; + transformed = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + transformed = $append(transformed, new Vector([(0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + cp.X, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) + cp.Y])); + _i++; + } + return transformed; + }; + ConvexPolygon.prototype.Transformed = function() { return this.$val.Transformed(); }; + ConvexPolygon.ptr.prototype.Bounds = function() { + var bottomRight, cp, i, point, topLeft, transformed, x, x$1; + cp = this; + transformed = cp.Transformed(); + topLeft = new Vector([(x = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))]); + bottomRight = topLeft.Clone(); + i = 0; + while (true) { + if (!(i < transformed.$length)) { break; } + point = ((i < 0 || i >= transformed.$length) ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + i]); + if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0])) { + (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } else if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0])) { + (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } + if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1])) { + (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } else if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1])) { + (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } + i = i + (1) >> 0; + } + return [topLeft, bottomRight]; + }; + ConvexPolygon.prototype.Bounds = function() { return this.$val.Bounds(); }; + ConvexPolygon.ptr.prototype.Position = function() { + var cp; + cp = this; + return [cp.X, cp.Y]; + }; + ConvexPolygon.prototype.Position = function() { return this.$val.Position(); }; + ConvexPolygon.ptr.prototype.SetPosition = function(x, y) { + var cp, x, y; + cp = this; + cp.X = x; + cp.Y = y; + }; + ConvexPolygon.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + ConvexPolygon.ptr.prototype.SetPositionVec = function(vec) { + var cp, vec; + cp = this; + cp.X = vec.X(); + cp.Y = vec.Y(); + }; + ConvexPolygon.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + ConvexPolygon.ptr.prototype.Move = function(x, y) { + var cp, x, y; + cp = this; + cp.X = cp.X + (x); + cp.Y = cp.Y + (y); + }; + ConvexPolygon.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + ConvexPolygon.ptr.prototype.MoveVec = function(vec) { + var cp, vec; + cp = this; + cp.X = cp.X + (vec.X()); + cp.Y = cp.Y + (vec.Y()); + }; + ConvexPolygon.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + ConvexPolygon.ptr.prototype.Center = function() { + var _i, _ref, cp, pos, v; + cp = this; + pos = new Vector([0, 0]); + _ref = cp.Transformed(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + pos.Add(new sliceType$4([v])); + _i++; + } + (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0] = (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0]) / ((cp.Transformed().$length))); + (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1] = (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1]) / ((cp.Transformed().$length))); + return pos; + }; + ConvexPolygon.prototype.Center = function() { return this.$val.Center(); }; + ConvexPolygon.ptr.prototype.Project = function(axis) { + var axis, cp, i, max, min, p, vertices, x, x$1, x$2, x$3; + cp = this; + axis = axis.Unit(); + vertices = cp.Transformed(); + min = axis.Dot(new Vector([(x = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))])); + max = min; + i = 1; + while (true) { + if (!(i < vertices.$length)) { break; } + p = axis.Dot(new Vector([(x$2 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))])); + if (p < min) { + min = p; + } else if (p > max) { + max = p; + } + i = i + (1) >> 0; + } + return new Projection.ptr(min, max); + }; + ConvexPolygon.prototype.Project = function(axis) { return this.$val.Project(axis); }; + ConvexPolygon.ptr.prototype.SATAxes = function() { + var _i, _ref, axes, cp, line; + cp = this; + axes = new sliceType$4([]); + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + axes = $append(axes, line.Normal()); + _i++; + } + return axes; + }; + ConvexPolygon.prototype.SATAxes = function() { return this.$val.SATAxes(); }; + ConvexPolygon.ptr.prototype.PointInside = function(point) { + var _i, _ref, contactCount, line, point, pointLine, polygon; + polygon = this; + pointLine = NewLine((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]), (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]), (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + 9.99999999999e+11, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + contactCount = 0; + _ref = polygon.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (!(line.IntersectionPointsLine(pointLine) === Vector.nil)) { + contactCount = contactCount + (1) >> 0; + } + _i++; + } + return contactCount === 1; + }; + ConvexPolygon.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + NewContactSet = function() { + return new ContactSet.ptr(new sliceType$4([]), new Vector([0, 0]), new Vector([0, 0])); + }; + $pkg.NewContactSet = NewContactSet; + ContactSet.ptr.prototype.LeftmostPoint = function() { + var _i, _ref, cs, left, point; + cs = this; + left = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (left === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= left.$length ? ($throwRuntimeError("index out of range"), undefined) : left.$array[left.$offset + 0])) { + left = point; + } + _i++; + } + return left; + }; + ContactSet.prototype.LeftmostPoint = function() { return this.$val.LeftmostPoint(); }; + ContactSet.ptr.prototype.RightmostPoint = function() { + var _i, _ref, cs, point, right; + cs = this; + right = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (right === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= right.$length ? ($throwRuntimeError("index out of range"), undefined) : right.$array[right.$offset + 0])) { + right = point; + } + _i++; + } + return right; + }; + ContactSet.prototype.RightmostPoint = function() { return this.$val.RightmostPoint(); }; + ContactSet.ptr.prototype.TopmostPoint = function() { + var _i, _ref, cs, point, top; + cs = this; + top = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (top === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= top.$length ? ($throwRuntimeError("index out of range"), undefined) : top.$array[top.$offset + 1])) { + top = point; + } + _i++; + } + return top; + }; + ContactSet.prototype.TopmostPoint = function() { return this.$val.TopmostPoint(); }; + ContactSet.ptr.prototype.BottommostPoint = function() { + var _i, _ref, bottom, cs, point; + cs = this; + bottom = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (bottom === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottom.$length ? ($throwRuntimeError("index out of range"), undefined) : bottom.$array[bottom.$offset + 1])) { + bottom = point; + } + _i++; + } + return bottom; + }; + ContactSet.prototype.BottommostPoint = function() { return this.$val.BottommostPoint(); }; + ConvexPolygon.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _i$1, _i$2, _i$3, _ref, _ref$1, _ref$2, _ref$3, _tuple, _tuple$1, circle, contactSet, cp, deltaMagnitude, dx, dy, isCircle, isPoly, line, line$1, mtv, ogMagnitude, ogX, ogY, other, otherLine, point, point$1, poly, x, x$1, x$2, x$3; + cp = this; + contactSet = NewContactSet(); + ogX = cp.X; + ogY = cp.Y; + cp.X = cp.X + (dx); + cp.Y = cp.Y + (dy); + _tuple = $assertType(other, ptrType$4, true); + circle = _tuple[0]; + isCircle = _tuple[1]; + if (isCircle) { + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + contactSet.Points = $appendSlice(contactSet.Points, line.IntersectionPointsCircle(circle)); + _i++; + } + } else { + _tuple$1 = $assertType(other, ptrType$5, true); + poly = _tuple$1[0]; + isPoly = _tuple$1[1]; + if (isPoly) { + _ref$1 = cp.Lines(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + line$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + _ref$2 = poly.Lines(); + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + otherLine = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + point = line$1.IntersectionPointsLine(otherLine); + if (!(point === Vector.nil)) { + contactSet.Points = $append(contactSet.Points, point); + } + _i$2++; + } + _i$1++; + } + } + } + if (contactSet.Points.$length > 0) { + _ref$3 = contactSet.Points; + _i$3 = 0; + while (true) { + if (!(_i$3 < _ref$3.$length)) { break; } + point$1 = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point$1])); + _i$3++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + mtv = cp.calculateMTV(contactSet, other); + if (!(mtv === Vector.nil)) { + contactSet.MTV = mtv; + } + } else { + contactSet = ptrType$6.nil; + } + if (!(contactSet === ptrType$6.nil) && (!((dx === 0)) || !((dy === 0)))) { + deltaMagnitude = new Vector([dx, dy]).Magnitude(); + ogMagnitude = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(ogMagnitude - deltaMagnitude); + } + cp.X = ogX; + cp.Y = ogY; + return contactSet; + }; + ConvexPolygon.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + ConvexPolygon.ptr.prototype.calculateMTV = function(contactSet, otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, contactSet, cp, delta, other, otherShape, overlap, overlap$1, smallest; + cp = this; + delta = new Vector([0, 0]); + smallest = new Vector([1.7976931348623157e+308, 0]); + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).Overlapping($clone(other.Project(axis), Projection))) { + return Vector.nil; + } + overlap = $clone(cp.Project(axis), Projection).Overlap($clone(other.Project(axis), Projection)); + if (smallest.Magnitude() > overlap) { + smallest = axis.Scale(overlap); + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).Overlapping($clone(other.Project(axis$1), Projection))) { + return Vector.nil; + } + overlap$1 = $clone(cp.Project(axis$1), Projection).Overlap($clone(other.Project(axis$1), Projection)); + if (smallest.Magnitude() > overlap$1) { + smallest = axis$1.Scale(overlap$1); + } + _i$1++; + } + } + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = (0 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 0])); + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = (1 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 1])); + return delta; + }; + ConvexPolygon.prototype.calculateMTV = function(contactSet, otherShape) { return this.$val.calculateMTV(contactSet, otherShape); }; + ConvexPolygon.ptr.prototype.ContainedBy = function(otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, cp, other, otherShape; + cp = this; + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).IsInside($clone(other.Project(axis), Projection))) { + return false; + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).IsInside($clone(other.Project(axis$1), Projection))) { + return false; + } + _i$1++; + } + } + return true; + }; + ConvexPolygon.prototype.ContainedBy = function(otherShape) { return this.$val.ContainedBy(otherShape); }; + ConvexPolygon.ptr.prototype.FlipH = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipH = function() { return this.$val.FlipH(); }; + ConvexPolygon.ptr.prototype.FlipV = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = -(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipV = function() { return this.$val.FlipV(); }; + ConvexPolygon.ptr.prototype.ReverseVertexOrder = function() { + var cp, i, verts, x, x$1; + cp = this; + verts = new sliceType$4([(x = cp.Points, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))]); + i = cp.Points.$length - 1 >> 0; + while (true) { + if (!(i >= 1)) { break; } + verts = $append(verts, (x$1 = cp.Points, ((i < 0 || i >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + i]))); + i = i - (1) >> 0; + } + cp.Points = verts; + }; + ConvexPolygon.prototype.ReverseVertexOrder = function() { return this.$val.ReverseVertexOrder(); }; + NewRectangle = function(x, y, w, h) { + var h, w, x, y; + return NewConvexPolygon(new sliceType([x, y, x + w, y, x + w, y + h, x, y + h])); + }; + $pkg.NewRectangle = NewRectangle; + NewCircle = function(x, y, radius) { + var circle, radius, x, y; + circle = new Circle.ptr(x, y, radius); + return circle; + }; + $pkg.NewCircle = NewCircle; + Circle.ptr.prototype.Clone = function() { + var circle; + circle = this; + return NewCircle(circle.X, circle.Y, circle.Radius); + }; + Circle.prototype.Clone = function() { return this.$val.Clone(); }; + Circle.ptr.prototype.Bounds = function() { + var circle; + circle = this; + return [new Vector([circle.X - circle.Radius, circle.Y - circle.Radius]), new Vector([circle.X + circle.Radius, circle.Y + circle.Radius])]; + }; + Circle.prototype.Bounds = function() { return this.$val.Bounds(); }; + Circle.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _ref, _ref$1, circle, contactSet, dist, dx, dy, other, ox, oy, point, shape, shape$1, x, x$1, x$2, x$3; + circle = this; + contactSet = ptrType$6.nil; + ox = circle.X; + oy = circle.Y; + circle.X = circle.X + (dx); + circle.Y = circle.Y + (dy); + _ref = other; + if ($assertType(_ref, ptrType$5, true)[1]) { + shape = _ref.$val; + contactSet = shape.Intersection(-dx, -dy, circle); + if (!(contactSet === ptrType$6.nil)) { + contactSet.MTV = contactSet.MTV.Scale(-1); + } + } else if ($assertType(_ref, ptrType$4, true)[1]) { + shape$1 = _ref.$val; + contactSet = NewContactSet(); + contactSet.Points = circle.IntersectionPointsCircle(shape$1); + if (contactSet.Points.$length === 0) { + return ptrType$6.nil; + } + contactSet.MTV = new Vector([circle.X - shape$1.X, circle.Y - shape$1.Y]); + dist = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(circle.Radius + shape$1.Radius - dist); + _ref$1 = contactSet.Points; + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + point = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point])); + _i++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + } + circle.X = ox; + circle.Y = oy; + return contactSet; + }; + Circle.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + Circle.ptr.prototype.Move = function(x, y) { + var circle, x, y; + circle = this; + circle.X = circle.X + (x); + circle.Y = circle.Y + (y); + }; + Circle.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + Circle.ptr.prototype.MoveVec = function(vec) { + var circle, vec; + circle = this; + circle.X = circle.X + (vec.X()); + circle.Y = circle.Y + (vec.Y()); + }; + Circle.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + Circle.ptr.prototype.SetPosition = function(x, y) { + var circle, x, y; + circle = this; + circle.X = x; + circle.Y = y; + }; + Circle.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + Circle.ptr.prototype.SetPositionVec = function(vec) { + var circle, vec; + circle = this; + circle.X = vec.X(); + circle.Y = vec.Y(); + }; + Circle.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + Circle.ptr.prototype.Position = function() { + var circle; + circle = this; + return [circle.X, circle.Y]; + }; + Circle.prototype.Position = function() { return this.$val.Position(); }; + Circle.ptr.prototype.PointInside = function(point) { + var circle, point; + circle = this; + return point.Sub(new sliceType$4([new Vector([circle.X, circle.Y])])).Magnitude() <= circle.Radius; + }; + Circle.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + Circle.ptr.prototype.IntersectionPointsCircle = function(other) { + var a, circle, d, h, other, x2, y2; + circle = this; + d = math.Sqrt(math.Pow(other.X - circle.X, 2) + math.Pow(other.Y - circle.Y, 2)); + if (d > circle.Radius + other.Radius || d < math.Abs(circle.Radius - other.Radius) || (d === 0) && (circle.Radius === other.Radius)) { + return sliceType$4.nil; + } + a = (math.Pow(circle.Radius, 2) - math.Pow(other.Radius, 2) + math.Pow(d, 2)) / (2 * d); + h = math.Sqrt(math.Pow(circle.Radius, 2) - math.Pow(a, 2)); + x2 = circle.X + a * (other.X - circle.X) / d; + y2 = circle.Y + a * (other.Y - circle.Y) / d; + return new sliceType$4([new Vector([x2 + h * (other.Y - circle.Y) / d, y2 - h * (other.X - circle.X) / d]), new Vector([x2 - h * (other.Y - circle.Y) / d, y2 + h * (other.X - circle.X) / d])]); + }; + Circle.prototype.IntersectionPointsCircle = function(other) { return this.$val.IntersectionPointsCircle(other); }; + Projection.ptr.prototype.Overlapping = function(other) { + var other, projection; + projection = this; + return $clone(projection, Projection).Overlap($clone(other, Projection)) > 0; + }; + Projection.prototype.Overlapping = function(other) { return this.$val.Overlapping(other); }; + Projection.ptr.prototype.Overlap = function(other) { + var other, projection; + projection = this; + return math.Min(projection.Max, other.Max) - math.Max(projection.Min, other.Min); + }; + Projection.prototype.Overlap = function(other) { return this.$val.Overlap(other); }; + Projection.ptr.prototype.IsInside = function(other) { + var other, projection; + projection = this; + return projection.Min >= other.Min && projection.Max <= other.Max; + }; + Projection.prototype.IsInside = function(other) { return this.$val.IsInside(other); }; + NewObject = function(x, y, w, h, tags) { + var h, o, tags, w, x, y; + o = new Object.ptr($ifaceNil, ptrType$1.nil, x, y, w, h, sliceType$1.nil, $ifaceNil, $makeMap(ptrType$2.keyFor, []), new sliceType$6([])); + if (tags.$length > 0) { + o.AddTags(tags); + } + return o; + }; + $pkg.NewObject = NewObject; + Object.ptr.prototype.Clone = function() { + var {_entry, _i, _keys, _r, _ref, k, newObj, obj, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + newObj = NewObject(obj.X, obj.Y, obj.W, obj.H, obj.Tags()); + newObj.Data = obj.Data; + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + _r = obj.Shape.Clone(); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $r = newObj.SetShape(_r); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* } */ case 2: + _ref = obj.ignoreList; + _i = 0; + _keys = $keys(_ref); + while (true) { + if (!(_i < _keys.length)) { break; } + _entry = _ref[_keys[_i]]; + if (_entry === undefined) { + _i++; + continue; + } + k = _entry.k; + newObj.AddToIgnoreList(k); + _i++; + } + $s = -1; return newObj; + /* */ } return; } var $f = {$blk: Object.ptr.prototype.Clone, $c: true, $r, _entry, _i, _keys, _r, _ref, k, newObj, obj, $s};return $f; + }; + Object.prototype.Clone = function() { return this.$val.Clone(); }; + Object.ptr.prototype.Update = function() { + var {_tuple, c, cx, cy, ex, ey, obj, space, x, y, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + if (!(obj.Space === ptrType$1.nil)) { + space = obj.Space; + obj.Space.Remove(new sliceType$3([obj])); + obj.Space = space; + _tuple = obj.BoundsToSpace(0, 0); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + c.register(obj); + obj.TouchingCells = $append(obj.TouchingCells, c); + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + } + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + $r = obj.Shape.SetPosition(obj.X, obj.Y); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* } */ case 2: + $s = -1; return; + /* */ } return; } var $f = {$blk: Object.ptr.prototype.Update, $c: true, $r, _tuple, c, cx, cy, ex, ey, obj, space, x, y, $s};return $f; + }; + Object.prototype.Update = function() { return this.$val.Update(); }; + Object.ptr.prototype.AddTags = function(tags) { + var obj, tags; + obj = this; + obj.tags = $appendSlice(obj.tags, tags); + }; + Object.prototype.AddTags = function(tags) { return this.$val.AddTags(tags); }; + Object.ptr.prototype.RemoveTags = function(tags) { + var _i, _i$1, _ref, _ref$1, i, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + obj.tags = $appendSlice($subslice(obj.tags, 0, i), $subslice(obj.tags, (i + 1 >> 0))); + break; + } + _i$1++; + } + _i++; + } + }; + Object.prototype.RemoveTags = function(tags) { return this.$val.RemoveTags(tags); }; + Object.ptr.prototype.HasTags = function(tags) { + var _i, _i$1, _ref, _ref$1, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + return true; + } + _i$1++; + } + _i++; + } + return false; + }; + Object.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Object.ptr.prototype.Tags = function() { + var obj; + obj = this; + return $appendSlice(new sliceType$6([]), obj.tags); + }; + Object.prototype.Tags = function() { return this.$val.Tags(); }; + Object.ptr.prototype.SetShape = function(shape) { + var {obj, shape, $s, $r, $c} = $restore(this, {shape}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + /* */ if (!($interfaceIsEqual(obj.Shape, shape))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, shape))) { */ case 1: + obj.Shape = shape; + $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* } */ case 2: + $s = -1; return; + /* */ } return; } var $f = {$blk: Object.ptr.prototype.SetShape, $c: true, $r, obj, shape, $s};return $f; + }; + Object.prototype.SetShape = function(shape) { return this.$val.SetShape(shape); }; + Object.ptr.prototype.BoundsToSpace = function(dx, dy) { + var _tuple, _tuple$1, cx, cy, dx, dy, ex, ey, obj; + obj = this; + _tuple = obj.Space.WorldToSpace(obj.X + dx, obj.Y + dy); + cx = _tuple[0]; + cy = _tuple[1]; + _tuple$1 = obj.Space.WorldToSpace(obj.X + obj.W + dx - 1, obj.Y + obj.H + dy - 1); + ex = _tuple$1[0]; + ey = _tuple$1[1]; + return [cx, cy, ex, ey]; + }; + Object.prototype.BoundsToSpace = function(dx, dy) { return this.$val.BoundsToSpace(dx, dy); }; + Object.ptr.prototype.SharesCells = function(other) { + var _i, _ref, cell, obj, other; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.Contains(other)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCells = function(other) { return this.$val.SharesCells(other); }; + Object.ptr.prototype.SharesCellsTags = function(tags) { + var _i, _ref, cell, obj, tags; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.ContainsTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCellsTags = function(tags) { return this.$val.SharesCellsTags(tags); }; + Object.ptr.prototype.Center = function() { + var obj; + obj = this; + return [obj.X + (obj.W / 2), obj.Y + (obj.H / 2)]; + }; + Object.prototype.Center = function() { return this.$val.Center(); }; + Object.ptr.prototype.SetCenter = function(x, y) { + var obj, x, y; + obj = this; + obj.X = x - (obj.W / 2); + obj.Y = y - (obj.H / 2); + }; + Object.prototype.SetCenter = function(x, y) { return this.$val.SetCenter(x, y); }; + Object.ptr.prototype.CellPosition = function() { + var _tuple, obj; + obj = this; + _tuple = obj.Center(); + return obj.Space.WorldToSpace(_tuple[0], _tuple[1]); + }; + Object.prototype.CellPosition = function() { return this.$val.CellPosition(); }; + Object.ptr.prototype.SetRight = function(x) { + var obj, x; + obj = this; + obj.X = x - obj.W; + }; + Object.prototype.SetRight = function(x) { return this.$val.SetRight(x); }; + Object.ptr.prototype.SetBottom = function(y) { + var obj, y; + obj = this; + obj.Y = y - obj.H; + }; + Object.prototype.SetBottom = function(y) { return this.$val.SetBottom(y); }; + Object.ptr.prototype.Bottom = function() { + var obj; + obj = this; + return obj.Y + obj.H; + }; + Object.prototype.Bottom = function() { return this.$val.Bottom(); }; + Object.ptr.prototype.Right = function() { + var obj; + obj = this; + return obj.X + obj.W; + }; + Object.prototype.Right = function() { return this.$val.Right(); }; + Object.ptr.prototype.SetBounds = function(topLeft, bottomRight) { + var bottomRight, obj, topLeft; + obj = this; + obj.X = (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0]); + obj.Y = (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1]); + obj.W = (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0]) - obj.X; + obj.H = (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1]) - obj.Y; + }; + Object.prototype.SetBounds = function(topLeft, bottomRight) { return this.$val.SetBounds(topLeft, bottomRight); }; + Object.ptr.prototype.Check = function(dx, dy, tags) { + var _entry, _entry$1, _entry$2, _i, _key, _key$1, _ref, _tuple, _tuple$1, _tuple$2, added, added$1, c, cc, cellsAdded, cx, cy, dx, dy, ex, ey, ignored, o, obj, objectsAdded, tags, x, y; + obj = this; + if (obj.Space === ptrType$1.nil) { + return ptrType$7.nil; + } + cc = NewCollision(); + cc.checkingObject = obj; + if (dx < 0) { + dx = math.Min(dx, -1); + } else if (dx > 0) { + dx = math.Max(dx, 1); + } + if (dy < 0) { + dy = math.Min(dy, -1); + } else if (dy > 0) { + dy = math.Max(dy, 1); + } + cc.dx = dx; + cc.dy = dy; + _tuple = obj.BoundsToSpace(dx, dy); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + cellsAdded = $makeMap(ptrType.keyFor, []); + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + _ref = c.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ignored = (_entry = obj.ignoreList[ptrType$2.keyFor(o)], _entry !== undefined ? _entry.v : false); + if (o === obj || ignored) { + _i++; + continue; + } + _tuple$1 = (_entry$1 = objectsAdded[ptrType$2.keyFor(o)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + added = _tuple$1[1]; + if (((tags.$length === 0) || o.HasTags(tags)) && !added) { + cc.Objects = $append(cc.Objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + _tuple$2 = (_entry$2 = cellsAdded[ptrType.keyFor(c)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + added$1 = _tuple$2[1]; + if (!added$1) { + cc.Cells = $append(cc.Cells, c); + _key$1 = c; (cellsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType.keyFor(_key$1)] = { k: _key$1, v: true }; + } + _i++; + continue; + } + _i++; + } + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + if (cc.Objects.$length === 0) { + return ptrType$7.nil; + } + return cc; + }; + Object.prototype.Check = function(dx, dy, tags) { return this.$val.Check(dx, dy, tags); }; + Object.ptr.prototype.Overlaps = function(other) { + var obj, other; + obj = this; + return other.X <= obj.X + obj.W && other.X + other.W >= obj.X && other.Y <= obj.Y + obj.H && other.Y + other.H >= obj.Y; + }; + Object.prototype.Overlaps = function(other) { return this.$val.Overlaps(other); }; + Object.ptr.prototype.AddToIgnoreList = function(ignoreObj) { + var _key, ignoreObj, obj; + obj = this; + _key = ignoreObj; (obj.ignoreList || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + }; + Object.prototype.AddToIgnoreList = function(ignoreObj) { return this.$val.AddToIgnoreList(ignoreObj); }; + Object.ptr.prototype.RemoveFromIgnoreList = function(ignoreObj) { + var ignoreObj, obj; + obj = this; + delete obj.ignoreList[ptrType$2.keyFor(ignoreObj)]; + }; + Object.prototype.RemoveFromIgnoreList = function(ignoreObj) { return this.$val.RemoveFromIgnoreList(ignoreObj); }; + axpyUnitaryTo = function(dst, alpha, x, y) { + var _i, _ref, alpha, dim, dst, i, v, x, y; + dim = y.$length; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (i === dim) { + return; + } + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = alpha * v + ((i < 0 || i >= y.$length) ? ($throwRuntimeError("index out of range"), undefined) : y.$array[y.$offset + i])); + _i++; + } + }; + scalUnitaryTo = function(dst, alpha, x) { + var _i, _ref, alpha, dst, i, x; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i]) * (alpha)); + _i++; + } + }; + NewCollision = function() { + return new Collision.ptr(ptrType$2.nil, 0, 0, new sliceType$3([]), sliceType$1.nil); + }; + $pkg.NewCollision = NewCollision; + Collision.ptr.prototype.HasTags = function(tags) { + var _i, _ref, cc, o, tags; + cc = this; + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Collision.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Collision.ptr.prototype.ObjectsByTags = function(tags) { + var _i, _ref, cc, o, objects, tags; + cc = this; + objects = new sliceType$3([]); + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + objects = $append(objects, o); + } + _i++; + } + return objects; + }; + Collision.prototype.ObjectsByTags = function(tags) { return this.$val.ObjectsByTags(tags); }; + Collision.ptr.prototype.ContactWithObject = function(object) { + var cc, delta, object; + cc = this; + delta = new Vector([0, 0]); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X + object.W - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y + object.H - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithObject = function(object) { return this.$val.ContactWithObject(object); }; + Collision.ptr.prototype.ContactWithCell = function(cell) { + var cc, cell, cx, cy, delta; + cc = this; + delta = new Vector([0, 0]); + cx = (($imul(cell.X, cc.checkingObject.Space.CellWidth))); + cy = (($imul(cell.Y, cc.checkingObject.Space.CellHeight))); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx + (cc.checkingObject.Space.CellWidth) - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy + (cc.checkingObject.Space.CellHeight) - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithCell = function(cell) { return this.$val.ContactWithCell(cell); }; + Collision.ptr.prototype.SlideAgainstCell = function(cell, avoidTags) { + var _tuple, _tuple$1, avoidTags, cc, ccX, ccY, cell, collidingCell, diffX, diffY, down, hX, hY, left, oX, oY, right, slide, sp, up, x; + cc = this; + sp = cc.checkingObject.Space; + collidingCell = (x = cc.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])); + _tuple = sp.SpaceToWorld(collidingCell.X, collidingCell.Y); + ccX = _tuple[0]; + ccY = _tuple[1]; + hX = (sp.CellWidth) / 2; + hY = (sp.CellHeight) / 2; + ccX = ccX + (hX); + ccY = ccY + (hY); + _tuple$1 = cc.checkingObject.Center(); + oX = _tuple$1[0]; + oY = _tuple$1[1]; + diffX = oX - ccX; + diffY = oY - ccY; + left = sp.Cell(collidingCell.X - 1 >> 0, collidingCell.Y); + right = sp.Cell(collidingCell.X + 1 >> 0, collidingCell.Y); + up = sp.Cell(collidingCell.X, collidingCell.Y - 1 >> 0); + down = sp.Cell(collidingCell.X, collidingCell.Y + 1 >> 0); + slide = new Vector([0, 0]); + if (!((cc.dy === 0))) { + if (diffX > 0 && (right === ptrType.nil || !right.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX + hX - cc.checkingObject.X); + } else if (diffX < 0 && (left === ptrType.nil || !left.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX - hX - (cc.checkingObject.X + cc.checkingObject.W)); + } else { + return Vector.nil; + } + } + if (!((cc.dx === 0))) { + if (diffY > 0 && (down === ptrType.nil || !down.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY + hY - cc.checkingObject.Y); + } else if (diffY < 0 && (up === ptrType.nil || !up.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY - hY - (cc.checkingObject.Y + cc.checkingObject.H)); + } else { + return Vector.nil; + } + } + return slide; + }; + Collision.prototype.SlideAgainstCell = function(cell, avoidTags) { return this.$val.SlideAgainstCell(cell, avoidTags); }; + newCell = function(x, y) { + var x, y; + return new Cell.ptr(x, y, new sliceType$3([])); + }; + Cell.ptr.prototype.register = function(obj) { + var cell, obj; + cell = this; + if (!cell.Contains(obj)) { + cell.Objects = $append(cell.Objects, obj); + } + }; + Cell.prototype.register = function(obj) { return this.$val.register(obj); }; + Cell.ptr.prototype.unregister = function(obj) { + var _i, _ref, cell, i, o, obj, x, x$1, x$2; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + (x$2 = cell.Objects, ((i < 0 || i >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + i] = (x = cell.Objects, x$1 = cell.Objects.$length - 1 >> 0, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])))); + cell.Objects = $subslice(cell.Objects, 0, (cell.Objects.$length - 1 >> 0)); + break; + } + _i++; + } + }; + Cell.prototype.unregister = function(obj) { return this.$val.unregister(obj); }; + Cell.ptr.prototype.Contains = function(obj) { + var _i, _ref, cell, o, obj; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.Contains = function(obj) { return this.$val.Contains(obj); }; + Cell.ptr.prototype.ContainsTags = function(tags) { + var _i, _ref, cell, o, tags; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.ContainsTags = function(tags) { return this.$val.ContainsTags(tags); }; + Cell.ptr.prototype.Occupied = function() { + var cell; + cell = this; + return cell.Objects.$length > 0; + }; + Cell.prototype.Occupied = function() { return this.$val.Occupied(); }; + Vector.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Sub", name: "Sub", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Scale", name: "Scale", pkg: "", typ: $funcType([$Float64], [Vector], false)}, {prop: "Equal", name: "Equal", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Magnitude", name: "Magnitude", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Magnitude2", name: "Magnitude2", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Unit", name: "Unit", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Dot", name: "Dot", pkg: "", typ: $funcType([Vector], [$Float64], false)}, {prop: "Cross", name: "Cross", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Rotate", name: "Rotate", pkg: "", typ: $funcType([$Float64, sliceType$7], [Vector], true)}, {prop: "X", name: "X", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Y", name: "Y", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Z", name: "Z", pkg: "", typ: $funcType([], [$Float64], false)}]; + ptrType$1.methods = [{prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Remove", name: "Remove", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Objects", name: "Objects", pkg: "", typ: $funcType([], [sliceType$3], false)}, {prop: "Resize", name: "Resize", pkg: "", typ: $funcType([$Int, $Int], [], false)}, {prop: "Cell", name: "Cell", pkg: "", typ: $funcType([$Int, $Int], [ptrType], false)}, {prop: "CheckCells", name: "CheckCells", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int, sliceType$6], [ptrType$2], true)}, {prop: "CheckCellsWorld", name: "CheckCellsWorld", pkg: "", typ: $funcType([$Float64, $Float64, $Float64, $Float64, sliceType$6], [ptrType$2], true)}, {prop: "UnregisterAllObjects", name: "UnregisterAllObjects", pkg: "", typ: $funcType([], [], false)}, {prop: "WorldToSpace", name: "WorldToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int], false)}, {prop: "SpaceToWorld", name: "SpaceToWorld", pkg: "", typ: $funcType([$Int, $Int], [$Float64, $Float64], false)}, {prop: "Height", name: "Height", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Width", name: "Width", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "CellsInLine", name: "CellsInLine", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int], [sliceType$1], false)}]; + ptrType$3.methods = [{prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Normal", name: "Normal", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Vector", name: "Vector", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "IntersectionPointsLine", name: "IntersectionPointsLine", pkg: "", typ: $funcType([ptrType$3], [Vector], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + ptrType$5.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "AddPointsVec", name: "AddPointsVec", pkg: "", typ: $funcType([sliceType$4], [], true)}, {prop: "AddPoints", name: "AddPoints", pkg: "", typ: $funcType([sliceType], [], true)}, {prop: "Lines", name: "Lines", pkg: "", typ: $funcType([], [sliceType$5], false)}, {prop: "Transformed", name: "Transformed", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Projection], false)}, {prop: "SATAxes", name: "SATAxes", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "calculateMTV", name: "calculateMTV", pkg: "resolv", typ: $funcType([ptrType$6, Shape], [Vector], false)}, {prop: "ContainedBy", name: "ContainedBy", pkg: "", typ: $funcType([Shape], [$Bool], false)}, {prop: "FlipH", name: "FlipH", pkg: "", typ: $funcType([], [], false)}, {prop: "FlipV", name: "FlipV", pkg: "", typ: $funcType([], [], false)}, {prop: "ReverseVertexOrder", name: "ReverseVertexOrder", pkg: "", typ: $funcType([], [], false)}]; + ptrType$6.methods = [{prop: "LeftmostPoint", name: "LeftmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "RightmostPoint", name: "RightmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "TopmostPoint", name: "TopmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "BottommostPoint", name: "BottommostPoint", pkg: "", typ: $funcType([], [Vector], false)}]; + ptrType$4.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + Projection.methods = [{prop: "Overlapping", name: "Overlapping", pkg: "", typ: $funcType([Projection], [$Bool], false)}, {prop: "Overlap", name: "Overlap", pkg: "", typ: $funcType([Projection], [$Float64], false)}, {prop: "IsInside", name: "IsInside", pkg: "", typ: $funcType([Projection], [$Bool], false)}]; + ptrType$2.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [ptrType$2], false)}, {prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}, {prop: "AddTags", name: "AddTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "RemoveTags", name: "RemoveTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Tags", name: "Tags", pkg: "", typ: $funcType([], [sliceType$6], false)}, {prop: "SetShape", name: "SetShape", pkg: "", typ: $funcType([Shape], [], false)}, {prop: "BoundsToSpace", name: "BoundsToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int, $Int, $Int], false)}, {prop: "SharesCells", name: "SharesCells", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "SharesCellsTags", name: "SharesCellsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetCenter", name: "SetCenter", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "CellPosition", name: "CellPosition", pkg: "", typ: $funcType([], [$Int, $Int], false)}, {prop: "SetRight", name: "SetRight", pkg: "", typ: $funcType([$Float64], [], false)}, {prop: "SetBottom", name: "SetBottom", pkg: "", typ: $funcType([$Float64], [], false)}, {prop: "Bottom", name: "Bottom", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Right", name: "Right", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "SetBounds", name: "SetBounds", pkg: "", typ: $funcType([Vector, Vector], [], false)}, {prop: "Check", name: "Check", pkg: "", typ: $funcType([$Float64, $Float64, sliceType$6], [ptrType$7], true)}, {prop: "Overlaps", name: "Overlaps", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "AddToIgnoreList", name: "AddToIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}, {prop: "RemoveFromIgnoreList", name: "RemoveFromIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}]; + ptrType$7.methods = [{prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "ObjectsByTags", name: "ObjectsByTags", pkg: "", typ: $funcType([sliceType$6], [sliceType$3], true)}, {prop: "ContactWithObject", name: "ContactWithObject", pkg: "", typ: $funcType([ptrType$2], [Vector], false)}, {prop: "ContactWithCell", name: "ContactWithCell", pkg: "", typ: $funcType([ptrType], [Vector], false)}, {prop: "SlideAgainstCell", name: "SlideAgainstCell", pkg: "", typ: $funcType([ptrType, sliceType$6], [Vector], true)}]; + ptrType.methods = [{prop: "register", name: "register", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "unregister", name: "unregister", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "Contains", name: "Contains", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "ContainsTags", name: "ContainsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Occupied", name: "Occupied", pkg: "", typ: $funcType([], [$Bool], false)}]; + Vector.init($Float64); + Space.init("", [{prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$2, tag: ""}, {prop: "CellWidth", name: "CellWidth", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "CellHeight", name: "CellHeight", embedded: false, exported: true, typ: $Int, tag: ""}]); + Shape.init([{prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}]); + Line.init("", [{prop: "Start", name: "Start", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "End", name: "End", embedded: false, exported: true, typ: Vector, tag: ""}]); + ConvexPolygon.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Closed", name: "Closed", embedded: false, exported: true, typ: $Bool, tag: ""}]); + ContactSet.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "MTV", name: "MTV", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "Center", name: "Center", embedded: false, exported: true, typ: Vector, tag: ""}]); + Circle.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Radius", name: "Radius", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Projection.init("", [{prop: "Min", name: "Min", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Max", name: "Max", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Object.init("resolv", [{prop: "Shape", name: "Shape", embedded: false, exported: true, typ: Shape, tag: ""}, {prop: "Space", name: "Space", embedded: false, exported: true, typ: ptrType$1, tag: ""}, {prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "W", name: "W", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "H", name: "H", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "TouchingCells", name: "TouchingCells", embedded: false, exported: true, typ: sliceType$1, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: $emptyInterface, tag: ""}, {prop: "ignoreList", name: "ignoreList", embedded: false, exported: false, typ: mapType, tag: ""}, {prop: "tags", name: "tags", embedded: false, exported: false, typ: sliceType$6, tag: ""}]); + Collision.init("resolv", [{prop: "checkingObject", name: "checkingObject", embedded: false, exported: false, typ: ptrType$2, tag: ""}, {prop: "dx", name: "dx", embedded: false, exported: false, typ: $Float64, tag: ""}, {prop: "dy", name: "dy", embedded: false, exported: false, typ: $Float64, tag: ""}, {prop: "Objects", name: "Objects", embedded: false, exported: true, typ: sliceType$3, tag: ""}, {prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$1, tag: ""}]); + Cell.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "Objects", name: "Objects", embedded: false, exported: true, typ: sliceType$3, tag: ""}]); + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + $r = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["jsexport/battle"] = (function() { + var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, sliceType$3, sliceType$4, ptrType$1, ptrType$2, ptrType$3, ptrType$4, ptrType$5, ptrType$6, sliceType$5, ptrType$7, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + math = $packages["math"]; + resolv = $packages["resolv"]; + Vec2D = $pkg.Vec2D = $newType(0, $kindStruct, "battle.Vec2D", true, "jsexport/battle", true, function(X_, Y_) { + this.$val = this; + if (arguments.length === 0) { + this.X = 0; + this.Y = 0; + return; + } + this.X = X_; + this.Y = Y_; + }); + Polygon2D = $pkg.Polygon2D = $newType(0, $kindStruct, "battle.Polygon2D", true, "jsexport/battle", true, function(Anchor_, Points_) { + this.$val = this; + if (arguments.length === 0) { + this.Anchor = ptrType$10.nil; + this.Points = sliceType$13.nil; + return; + } + this.Anchor = Anchor_; + this.Points = Points_; + }); + PlayerDownsync = $pkg.PlayerDownsync = $newType(0, $kindStruct, "battle.PlayerDownsync", true, "jsexport/battle", true, function(Id_, VirtualGridX_, VirtualGridY_, DirX_, DirY_, VelX_, VelY_, Speed_, BattleState_, JoinIndex_, ColliderRadius_, Removed_, Score_, LastMoveGmtMillis_, FramesToRecover_, FramesInChState_, Hp_, MaxHp_, CharacterState_, InAir_, ActiveSkillId_, ActiveSkillHit_) { + this.$val = this; + if (arguments.length === 0) { + this.Id = 0; + this.VirtualGridX = 0; + this.VirtualGridY = 0; + this.DirX = 0; + this.DirY = 0; + this.VelX = 0; + this.VelY = 0; + this.Speed = 0; + this.BattleState = 0; + this.JoinIndex = 0; + this.ColliderRadius = 0; + this.Removed = false; + this.Score = 0; + this.LastMoveGmtMillis = 0; + this.FramesToRecover = 0; + this.FramesInChState = 0; + this.Hp = 0; + this.MaxHp = 0; + this.CharacterState = 0; + this.InAir = false; + this.ActiveSkillId = 0; + this.ActiveSkillHit = 0; + return; + } + this.Id = Id_; + this.VirtualGridX = VirtualGridX_; + this.VirtualGridY = VirtualGridY_; + this.DirX = DirX_; + this.DirY = DirY_; + this.VelX = VelX_; + this.VelY = VelY_; + this.Speed = Speed_; + this.BattleState = BattleState_; + this.JoinIndex = JoinIndex_; + this.ColliderRadius = ColliderRadius_; + this.Removed = Removed_; + this.Score = Score_; + this.LastMoveGmtMillis = LastMoveGmtMillis_; + this.FramesToRecover = FramesToRecover_; + this.FramesInChState = FramesInChState_; + this.Hp = Hp_; + this.MaxHp = MaxHp_; + this.CharacterState = CharacterState_; + this.InAir = InAir_; + this.ActiveSkillId = ActiveSkillId_; + this.ActiveSkillHit = ActiveSkillHit_; + }); + InputFrameDecoded = $pkg.InputFrameDecoded = $newType(0, $kindStruct, "battle.InputFrameDecoded", true, "jsexport/battle", true, function(Dx_, Dy_, BtnALevel_, BtnBLevel_) { + this.$val = this; + if (arguments.length === 0) { + this.Dx = 0; + this.Dy = 0; + this.BtnALevel = 0; + this.BtnBLevel = 0; + return; + } + this.Dx = Dx_; + this.Dy = Dy_; + this.BtnALevel = BtnALevel_; + this.BtnBLevel = BtnBLevel_; + }); + Barrier = $pkg.Barrier = $newType(0, $kindStruct, "battle.Barrier", true, "jsexport/battle", true, function(Boundary_) { + this.$val = this; + if (arguments.length === 0) { + this.Boundary = ptrType$11.nil; + return; + } + this.Boundary = Boundary_; + }); + Bullet = $pkg.Bullet = $newType(0, $kindStruct, "battle.Bullet", true, "jsexport/battle", true, function(OriginatedRenderFrameId_, OffenderJoinIndex_, StartupFrames_, CancellableStFrame_, CancellableEdFrame_, ActiveFrames_, HitStunFrames_, BlockStunFrames_, PushbackVelX_, PushbackVelY_, Damage_, SelfLockVelX_, SelfLockVelY_, HitboxOffsetX_, HitboxOffsetY_, HitboxSizeX_, HitboxSizeY_, BlowUp_) { + this.$val = this; + if (arguments.length === 0) { + this.OriginatedRenderFrameId = 0; + this.OffenderJoinIndex = 0; + this.StartupFrames = 0; + this.CancellableStFrame = 0; + this.CancellableEdFrame = 0; + this.ActiveFrames = 0; + this.HitStunFrames = 0; + this.BlockStunFrames = 0; + this.PushbackVelX = 0; + this.PushbackVelY = 0; + this.Damage = 0; + this.SelfLockVelX = 0; + this.SelfLockVelY = 0; + this.HitboxOffsetX = 0; + this.HitboxOffsetY = 0; + this.HitboxSizeX = 0; + this.HitboxSizeY = 0; + this.BlowUp = false; + return; + } + this.OriginatedRenderFrameId = OriginatedRenderFrameId_; + this.OffenderJoinIndex = OffenderJoinIndex_; + this.StartupFrames = StartupFrames_; + this.CancellableStFrame = CancellableStFrame_; + this.CancellableEdFrame = CancellableEdFrame_; + this.ActiveFrames = ActiveFrames_; + this.HitStunFrames = HitStunFrames_; + this.BlockStunFrames = BlockStunFrames_; + this.PushbackVelX = PushbackVelX_; + this.PushbackVelY = PushbackVelY_; + this.Damage = Damage_; + this.SelfLockVelX = SelfLockVelX_; + this.SelfLockVelY = SelfLockVelY_; + this.HitboxOffsetX = HitboxOffsetX_; + this.HitboxOffsetY = HitboxOffsetY_; + this.HitboxSizeX = HitboxSizeX_; + this.HitboxSizeY = HitboxSizeY_; + this.BlowUp = BlowUp_; + }); + MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { + this.$val = this; + if (arguments.length === 0) { + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + return; + } + this.Bullet = Bullet_; + }); + FireballBullet = $pkg.FireballBullet = $newType(0, $kindStruct, "battle.FireballBullet", true, "jsexport/battle", true, function(VirtualGridX_, VirtualGridY_, DirX_, DirY_, VelX_, VelY_, Speed_, Bullet_) { + this.$val = this; + if (arguments.length === 0) { + this.VirtualGridX = 0; + this.VirtualGridY = 0; + this.DirX = 0; + this.DirY = 0; + this.VelX = 0; + this.VelY = 0; + this.Speed = 0; + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + return; + } + this.VirtualGridX = VirtualGridX_; + this.VirtualGridY = VirtualGridY_; + this.DirX = DirX_; + this.DirY = DirY_; + this.VelX = VelX_; + this.VelY = VelY_; + this.Speed = Speed_; + this.Bullet = Bullet_; + }); + Skill = $pkg.Skill = $newType(0, $kindStruct, "battle.Skill", true, "jsexport/battle", true, function(BattleLocalId_, RecoveryFrames_, RecoveryFramesOnBlock_, RecoveryFramesOnHit_, ReleaseTriggerType_, Hits_) { + this.$val = this; + if (arguments.length === 0) { + this.BattleLocalId = 0; + this.RecoveryFrames = 0; + this.RecoveryFramesOnBlock = 0; + this.RecoveryFramesOnHit = 0; + this.ReleaseTriggerType = 0; + this.Hits = sliceType.nil; + return; + } + this.BattleLocalId = BattleLocalId_; + this.RecoveryFrames = RecoveryFrames_; + this.RecoveryFramesOnBlock = RecoveryFramesOnBlock_; + this.RecoveryFramesOnHit = RecoveryFramesOnHit_; + this.ReleaseTriggerType = ReleaseTriggerType_; + this.Hits = Hits_; + }); + RoomDownsyncFrame = $pkg.RoomDownsyncFrame = $newType(0, $kindStruct, "battle.RoomDownsyncFrame", true, "jsexport/battle", true, function(Id_, PlayersArr_, CountdownNanos_, MeleeBullets_, FireballBullets_, BackendUnconfirmedMask_, ShouldForceResync_, PlayerOpPatternToSkillId_) { + this.$val = this; + if (arguments.length === 0) { + this.Id = 0; + this.PlayersArr = sliceType$6.nil; + this.CountdownNanos = new $Int64(0, 0); + this.MeleeBullets = sliceType$7.nil; + this.FireballBullets = sliceType$11.nil; + this.BackendUnconfirmedMask = new $Uint64(0, 0); + this.ShouldForceResync = false; + this.PlayerOpPatternToSkillId = false; + return; + } + this.Id = Id_; + this.PlayersArr = PlayersArr_; + this.CountdownNanos = CountdownNanos_; + this.MeleeBullets = MeleeBullets_; + this.FireballBullets = FireballBullets_; + this.BackendUnconfirmedMask = BackendUnconfirmedMask_; + this.ShouldForceResync = ShouldForceResync_; + this.PlayerOpPatternToSkillId = PlayerOpPatternToSkillId_; + }); + InputFrameDownsync = $pkg.InputFrameDownsync = $newType(0, $kindStruct, "battle.InputFrameDownsync", true, "jsexport/battle", true, function(InputFrameId_, InputList_, ConfirmedList_) { + this.$val = this; + if (arguments.length === 0) { + this.InputFrameId = 0; + this.InputList = sliceType$5.nil; + this.ConfirmedList = new $Uint64(0, 0); + return; + } + this.InputFrameId = InputFrameId_; + this.InputList = InputList_; + this.ConfirmedList = ConfirmedList_; + }); + RingBuffer = $pkg.RingBuffer = $newType(0, $kindStruct, "battle.RingBuffer", true, "jsexport/battle", true, function(Ed_, St_, EdFrameId_, StFrameId_, N_, Cnt_, Eles_) { + this.$val = this; + if (arguments.length === 0) { + this.Ed = 0; + this.St = 0; + this.EdFrameId = 0; + this.StFrameId = 0; + this.N = 0; + this.Cnt = 0; + this.Eles = sliceType.nil; + return; + } + this.Ed = Ed_; + this.St = St_; + this.EdFrameId = EdFrameId_; + this.StFrameId = StFrameId_; + this.N = N_; + this.Cnt = Cnt_; + this.Eles = Eles_; + }); + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, PatternIdToSkillId_) { + this.$val = this; + if (arguments.length === 0) { + this.SpeciesId = 0; + this.SpeciesName = ""; + this.InAirIdleFrameIdxTurningPoint = 0; + this.InAirIdleFrameIdxTurnedCycle = 0; + this.LayDownFrames = 0; + this.LayDownFramesToRecover = 0; + this.GetUpFrames = 0; + this.GetUpFramesToRecover = 0; + this.JumpingInitVelY = 0; + this.PatternIdToSkillId = false; + return; + } + this.SpeciesId = SpeciesId_; + this.SpeciesName = SpeciesName_; + this.InAirIdleFrameIdxTurningPoint = InAirIdleFrameIdxTurningPoint_; + this.InAirIdleFrameIdxTurnedCycle = InAirIdleFrameIdxTurnedCycle_; + this.LayDownFrames = LayDownFrames_; + this.LayDownFramesToRecover = LayDownFramesToRecover_; + this.GetUpFrames = GetUpFrames_; + this.GetUpFramesToRecover = GetUpFramesToRecover_; + this.JumpingInitVelY = JumpingInitVelY_; + this.PatternIdToSkillId = PatternIdToSkillId_; + }); + SatResult = $pkg.SatResult = $newType(0, $kindStruct, "battle.SatResult", true, "jsexport/battle", true, function(Overlap_, OverlapX_, OverlapY_, AContainedInB_, BContainedInA_, Axis_) { + this.$val = this; + if (arguments.length === 0) { + this.Overlap = 0; + this.OverlapX = 0; + this.OverlapY = 0; + this.AContainedInB = false; + this.BContainedInA = false; + this.Axis = resolv.Vector.nil; + return; + } + this.Overlap = Overlap_; + this.OverlapX = OverlapX_; + this.OverlapY = OverlapY_; + this.AContainedInB = AContainedInB_; + this.BContainedInA = BContainedInA_; + this.Axis = Axis_; + }); + sliceType = $sliceType($emptyInterface); + sliceType$1 = $sliceType($Int32); + sliceType$2 = $sliceType(sliceType$1); + ptrType = $ptrType(SatResult); + sliceType$3 = $sliceType(Vec2D); + sliceType$4 = $sliceType($String); + ptrType$1 = $ptrType(resolv.Collision); + ptrType$2 = $ptrType(sliceType$3); + ptrType$3 = $ptrType(PlayerDownsync); + ptrType$4 = $ptrType(MeleeBullet); + ptrType$5 = $ptrType(resolv.ConvexPolygon); + ptrType$6 = $ptrType(InputFrameDownsync); + sliceType$5 = $sliceType($Uint64); + ptrType$7 = $ptrType(Skill); + sliceType$6 = $sliceType(ptrType$3); + sliceType$7 = $sliceType(ptrType$4); + sliceType$8 = $sliceType(ptrType$2); + sliceType$9 = $sliceType($Bool); + ptrType$8 = $ptrType(resolv.Object); + sliceType$10 = $sliceType(ptrType$8); + ptrType$9 = $ptrType(FireballBullet); + sliceType$11 = $sliceType(ptrType$9); + sliceType$12 = $sliceType($Float64); + ptrType$10 = $ptrType(Vec2D); + sliceType$13 = $sliceType(ptrType$10); + ptrType$11 = $ptrType(Polygon2D); + mapType = $mapType($Int, $Int); + ptrType$12 = $ptrType(RingBuffer); + NewRingBuffer = function(n) { + var n; + return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType, n)); + }; + $pkg.NewRingBuffer = NewRingBuffer; + RingBuffer.ptr.prototype.Put = function(pItem) { + var pItem, rb, x, x$1; + rb = this; + while (true) { + if (!(0 < rb.Cnt && rb.Cnt >= rb.N)) { break; } + rb.Pop(); + } + (x = rb.Eles, x$1 = rb.Ed, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1] = pItem)); + rb.EdFrameId = rb.EdFrameId + (1) >> 0; + rb.Cnt = rb.Cnt + (1) >> 0; + rb.Ed = rb.Ed + (1) >> 0; + if (rb.Ed >= rb.N) { + rb.Ed = rb.Ed - (rb.N) >> 0; + } + }; + RingBuffer.prototype.Put = function(pItem) { return this.$val.Put(pItem); }; + RingBuffer.ptr.prototype.Pop = function() { + var pItem, rb, x, x$1; + rb = this; + if (0 === rb.Cnt) { + return $ifaceNil; + } + pItem = (x = rb.Eles, x$1 = rb.St, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + rb.StFrameId = rb.StFrameId + (1) >> 0; + rb.Cnt = rb.Cnt - (1) >> 0; + rb.St = rb.St + (1) >> 0; + if (rb.St >= rb.N) { + rb.St = rb.St - (rb.N) >> 0; + } + return pItem; + }; + RingBuffer.prototype.Pop = function() { return this.$val.Pop(); }; + RingBuffer.ptr.prototype.GetArrIdxByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb; + rb = this; + if ((0 === rb.Cnt) || 0 > offsetFromSt) { + return -1; + } + arrIdx = rb.St + offsetFromSt >> 0; + if (rb.St < rb.Ed) { + if (rb.St <= arrIdx && arrIdx < rb.Ed) { + return arrIdx; + } + } else { + if (arrIdx >= rb.N) { + arrIdx = arrIdx - (rb.N) >> 0; + } + if (arrIdx >= rb.St || arrIdx < rb.Ed) { + return arrIdx; + } + } + return -1; + }; + RingBuffer.prototype.GetArrIdxByOffset = function(offsetFromSt) { return this.$val.GetArrIdxByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb, x; + rb = this; + arrIdx = rb.GetArrIdxByOffset(offsetFromSt); + if (-1 === arrIdx) { + return $ifaceNil; + } + return (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx])); + }; + RingBuffer.prototype.GetByOffset = function(offsetFromSt) { return this.$val.GetByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByFrameId = function(frameId) { + var frameId, rb; + rb = this; + if (frameId >= rb.EdFrameId || frameId < rb.StFrameId) { + return $ifaceNil; + } + return rb.GetByOffset(frameId - rb.StFrameId >> 0); + }; + RingBuffer.prototype.GetByFrameId = function(frameId) { return this.$val.GetByFrameId(frameId); }; + RingBuffer.ptr.prototype.SetByFrameId = function(pItem, frameId) { + var _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, arrIdx, frameId, oldEdFrameId, oldStFrameId, pItem, rb, ret, x; + rb = this; + _tmp = rb.StFrameId; + _tmp$1 = rb.EdFrameId; + oldStFrameId = _tmp; + oldEdFrameId = _tmp$1; + if (frameId < oldStFrameId) { + return [2, oldStFrameId, oldEdFrameId]; + } + if (oldEdFrameId > frameId) { + arrIdx = rb.GetArrIdxByOffset(frameId - rb.StFrameId >> 0); + if (!((-1 === arrIdx))) { + (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx] = pItem)); + return [0, oldStFrameId, oldEdFrameId]; + } + } + ret = 0; + if (oldEdFrameId < frameId) { + _tmp$2 = 0; + _tmp$3 = 0; + rb.St = _tmp$2; + rb.Ed = _tmp$3; + _tmp$4 = frameId; + _tmp$5 = frameId; + rb.StFrameId = _tmp$4; + rb.EdFrameId = _tmp$5; + rb.Cnt = 0; + ret = 1; + } + rb.Put(pItem); + return [ret, oldStFrameId, oldEdFrameId]; + }; + RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; + ConvertToInputFrameId = function(renderFrameId, inputDelayFrames, inputScaleFrames) { + var inputDelayFrames, inputScaleFrames, renderFrameId; + if (renderFrameId < inputDelayFrames) { + return 0; + } + return ((((renderFrameId - inputDelayFrames >> 0)) >> $min(inputScaleFrames, 31)) >> 0); + }; + $pkg.ConvertToInputFrameId = ConvertToInputFrameId; + decodeInput = function(encodedInput) { + var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; + encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); + btnALevel = (((x = $shiftRightUint64(encodedInput, 4), new $Uint64(x.$high & 0, (x.$low & 1) >>> 0)).$low >> 0)); + btnBLevel = (((x$1 = $shiftRightUint64(encodedInput, 5), new $Uint64(x$1.$high & 0, (x$1.$low & 1) >>> 0)).$low >> 0)); + return new InputFrameDecoded.ptr((x$2 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])), btnALevel, btnBLevel); + }; + CalcPushbacks = function(oldDx, oldDy, playerShape, barrierShape) { + var {$24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred, $r, $c} = $restore(this, {oldDx, oldDy, playerShape, barrierShape}); + /* */ $s = $s || 0; var $err = null; try { s: while (true) { switch ($s) { case 0: $deferred = []; $curGoroutine.deferStack.push($deferred); + origX = [origX]; + origY = [origY]; + playerShape = [playerShape]; + _tuple = playerShape[0].Position(); + origX[0] = _tuple[0]; + origY[0] = _tuple[1]; + $deferred.push([(function(origX, origY, playerShape) { return function() { + playerShape[0].SetPosition(origX[0], origY[0]); + }; })(origX, origY, playerShape), []]); + playerShape[0].SetPosition(origX[0] + oldDx, origY[0] + oldDy); + overlapResult = new SatResult.ptr(0, 0, 0, true, true, new resolv.Vector([0, 0])); + overlapped = isPolygonPairOverlapped(playerShape[0], barrierShape, overlapResult); + /* */ if (overlapped) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (overlapped) { */ case 1: + _tmp = overlapResult.Overlap * overlapResult.OverlapX; + _tmp$1 = overlapResult.Overlap * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + $24r = [true, pushbackX, pushbackY, overlapResult]; + $s = 4; case 4: return $24r; + /* } else { */ case 2: + $24r$1 = [false, 0, 0, overlapResult]; + $s = 5; case 5: return $24r$1; + /* } */ case 3: + $s = -1; return [false, 0, 0, ptrType.nil]; + /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } + }; + $pkg.CalcPushbacks = CalcPushbacks; + isPolygonPairOverlapped = function(a, b, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, a, aCnt, axis, axis$1, b, bCnt, result, x, x$1, x$2, x$3, x$4, x$5, x$6, x$7; + _tmp = a.Points.$length; + _tmp$1 = b.Points.$length; + aCnt = _tmp; + bCnt = _tmp$1; + if ((1 === aCnt) && (1 === bCnt)) { + if (!(ptrType.nil === result)) { + result.Overlap = 0; + } + return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); + } + if (1 < aCnt) { + _ref = a.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + axis = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (isPolygonPairSeparatedByDir(a, b, axis.Unit(), result)) { + return false; + } + _i++; + } + } + if (1 < bCnt) { + _ref$1 = b.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (isPolygonPairSeparatedByDir(a, b, axis$1.Unit(), result)) { + return false; + } + _i$1++; + } + } + return true; + }; + isPolygonPairSeparatedByDir = function(a, b, e, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, _tmp$2, _tmp$3, a, aEnd, aStart, absoluteOverlap, b, bEnd, bStart, currentOverlap, dot, dot$1, e, option1, option1$1, option2, option2$1, overlap, p, p$1, result, sign, x, x$1; + _tmp = 1.7e+308; + _tmp$1 = -1.7e+308; + _tmp$2 = 1.7e+308; + _tmp$3 = -1.7e+308; + aStart = _tmp; + aEnd = _tmp$1; + bStart = _tmp$2; + bEnd = _tmp$3; + _ref = a.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + dot = ((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + a.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + a.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (aStart > dot) { + aStart = dot; + } + if (aEnd < dot) { + aEnd = dot; + } + _i++; + } + _ref$1 = b.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + dot$1 = ((0 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 0]) + b.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 1]) + b.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (bStart > dot$1) { + bStart = dot$1; + } + if (bEnd < dot$1) { + bEnd = dot$1; + } + _i$1++; + } + if (aStart > bEnd || aEnd < bStart) { + return true; + } + if (!(ptrType.nil === result)) { + overlap = 0; + if (aStart < bStart) { + result.AContainedInB = false; + if (aEnd < bEnd) { + overlap = aEnd - bStart; + result.BContainedInA = false; + } else { + option1 = aEnd - bStart; + option2 = bEnd - aStart; + if (option1 < option2) { + overlap = option1; + } else { + overlap = -option2; + } + } + } else { + result.BContainedInA = false; + if (aEnd > bEnd) { + overlap = aStart - bEnd; + result.AContainedInB = false; + } else { + option1$1 = aEnd - bStart; + option2$1 = bEnd - aStart; + if (option1$1 < option2$1) { + overlap = option1$1; + } else { + overlap = -option2$1; + } + } + } + currentOverlap = result.Overlap; + absoluteOverlap = overlap; + if (overlap < 0) { + absoluteOverlap = -overlap; + } + if (((0 === (x = result.Axis, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))) && (0 === (x$1 = result.Axis, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])))) || currentOverlap > absoluteOverlap) { + sign = 1; + if (overlap < 0) { + sign = -1; + } + result.Overlap = absoluteOverlap; + result.OverlapX = (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) * sign; + result.OverlapY = (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]) * sign; + } + result.Axis = e; + } + return false; + }; + WorldToVirtualGridPos = function(wx, wy) { + var virtualGridX, virtualGridY, wx, wy; + virtualGridX = ((math.Floor(wx * 100) >> 0)); + virtualGridY = ((math.Floor(wy * 100) >> 0)); + return [virtualGridX, virtualGridY]; + }; + $pkg.WorldToVirtualGridPos = WorldToVirtualGridPos; + VirtualGridToWorldPos = function(vx, vy) { + var vx, vy, wx, wy; + wx = (vx) * 0.01; + wy = (vy) * 0.01; + return [wx, wy]; + }; + $pkg.VirtualGridToWorldPos = VirtualGridToWorldPos; + WorldToPolygonColliderBLPos = function(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; + return [wx - halfBoundingW - leftPadding + collisionSpaceOffsetX, wy - halfBoundingH - bottomPadding + collisionSpaceOffsetY]; + }; + $pkg.WorldToPolygonColliderBLPos = WorldToPolygonColliderBLPos; + PolygonColliderBLToWorldPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding; + return [cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY]; + }; + $pkg.PolygonColliderBLToWorldPos = PolygonColliderBLToWorldPos; + PolygonColliderBLToVirtualGridPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; + _tuple = PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToVirtualGridPos(wx, wy); + }; + $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; + VirtualGridToPolygonColliderBLPos = function(vx, vy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, vx, vy, wx, wy; + _tuple = VirtualGridToWorldPos(vx, vy); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + }; + $pkg.VirtualGridToPolygonColliderBLPos = VirtualGridToPolygonColliderBLPos; + calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { + var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = [ret]; + ret[0] = $makeSlice(sliceType$3, 0, 10); + collision = playerCollider.Check(0, 0, new sliceType$4([])); + if (ptrType$1.nil === collision) { + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + } + _ref = collision.Objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + isBarrier = false; + _ref$1 = obj.Data; + if ($assertType(_ref$1, ptrType$3, true)[1]) { + } else if ($assertType(_ref$1, ptrType$4, true)[1]) { + } else { + isBarrier = true; + } + if (!isBarrier) { + _i++; + /* continue; */ $s = 1; continue; + } + barrierShape = $assertType(obj.Shape, ptrType$5); + _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _tuple = _r; + overlapped = _tuple[0]; + pushbackX = _tuple[1]; + pushbackY = _tuple[2]; + overlapResult = _tuple[3]; + if (!overlapped) { + _i++; + /* continue; */ $s = 1; continue; + } + _tmp = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapX; + _tmp$1 = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + ret[0] = $append(ret[0], new Vec2D.ptr(overlapResult.OverlapX, overlapResult.OverlapY)); + pEffPushback.X = pEffPushback.X + (pushbackX); + pEffPushback.Y = pEffPushback.Y + (pushbackY); + _i++; + $s = 1; continue; + case 2: + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; + }; + deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { + var _entry, _entry$1, _entry$2, _ref, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, skillConfig, thatPlayerInNextFrame, v, x, x$1, x$2, x$3; + delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); + delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); + if (0 >= delayedInputFrameId) { + return [-2, false, 0, 0]; + } + _tuple = (_entry = noOpSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry !== undefined ? [_entry.v, true] : [false, false]); + existent = _tuple[1]; + if (existent) { + return [-2, false, 0, 0]; + } + delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$6).InputList; + delayedInputListForPrevRdf = sliceType$5.nil; + if (0 < delayedInputFrameIdForPrevRdf) { + delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$6).InputList; + } + jumpedOrNot = false; + joinIndex = currPlayerDownsync.JoinIndex; + decodedInput = decodeInput((x = joinIndex - 1 >> 0, ((x < 0 || x >= delayedInputList.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputList.$array[delayedInputList.$offset + x]))); + _tmp = 0; + _tmp$1 = 0; + effDx = _tmp; + effDy = _tmp$1; + _tmp$2 = 0; + _tmp$3 = 0; + prevBtnALevel = _tmp$2; + prevBtnBLevel = _tmp$3; + if (!(sliceType$5.nil === delayedInputListForPrevRdf)) { + prevDecodedInput = decodeInput((x$1 = joinIndex - 1 >> 0, ((x$1 < 0 || x$1 >= delayedInputListForPrevRdf.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputListForPrevRdf.$array[delayedInputListForPrevRdf.$offset + x$1]))); + prevBtnALevel = prevDecodedInput.BtnALevel; + prevBtnBLevel = prevDecodedInput.BtnBLevel; + } + if (0 === currPlayerDownsync.FramesToRecover) { + _tmp$4 = decodedInput.Dx; + _tmp$5 = decodedInput.Dy; + effDx = _tmp$4; + effDy = _tmp$5; + if (decodedInput.BtnBLevel > prevBtnBLevel) { + _tuple$1 = (_entry$1 = inAirSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + existent$1 = _tuple$1[1]; + if (!existent$1) { + jumpedOrNot = true; + } + } + } + patternId = -1; + if (decodedInput.BtnALevel > prevBtnALevel) { + if (currPlayerDownsync.InAir) { + patternId = 255; + } else { + patternId = 1; + } + } + if (!((-1 === patternId)) && 0 < currPlayerDownsync.FramesToRecover) { + patternId = -1; + skillConfig = (_entry$2 = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry$2 !== undefined ? _entry$2.v : ptrType$7.nil); + _ref = (x$2 = skillConfig.Hits, x$3 = currPlayerDownsync.ActiveSkillHit, ((x$3 < 0 || x$3 >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x$3])); + if ($assertType(_ref, ptrType$4, true)[1]) { + v = _ref.$val; + if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { + patternId = (((currPlayerDownsync.ActiveSkillId + 1 >> 0) >> 0)); + } + } + } + return [patternId, jumpedOrNot, effDx, effDy]; + }; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { + var {_1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + roomCapacity = currRenderFrame.PlayersArr.$length; + nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); + _ref = currRenderFrame.PlayersArr; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, 0, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit)); + if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; + } + _i++; + } + nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); + effPushbacks = $makeSlice(sliceType$3, roomCapacity); + hardPushbackNorms = $makeSlice(sliceType$8, roomCapacity); + jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); + _ref$1 = currRenderFrame.PlayersArr; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + newBullet = [newBullet]; + i$1 = _i$1; + currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); + chConfig = ((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]); + thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); + _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, 8, 2); + patternId = _tuple[0]; + jumpedOrNot = _tuple[1]; + effDx = _tuple[2]; + effDy = _tuple[3]; + if (jumpedOrNot) { + thatPlayerInNextFrame.VelY = (chConfig.JumpingInitVelY); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); + } + joinIndex = currPlayerDownsync$1.JoinIndex; + if (!((-1 === patternId))) { + _tuple$1 = (_entry = chConfig.PatternIdToSkillId[$Int.keyFor(patternId)], _entry !== undefined ? [_entry.v, true] : [0, false]); + skillId = _tuple$1[0]; + existent = _tuple$1[1]; + if (existent) { + skillConfig = (_entry$1 = skills[$Int.keyFor(skillId)], _entry$1 !== undefined ? _entry$1.v : ptrType$7.nil); + thatPlayerInNextFrame.ActiveSkillId = ((skillId >> 0)); + thatPlayerInNextFrame.ActiveSkillHit = 0; + _ref$2 = (x = skillConfig.Hits, x$1 = thatPlayerInNextFrame.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + if ($assertType(_ref$2, ptrType$4, true)[1]) { + v = _ref$2.$val; + newBullet[0] = $clone(v, MeleeBullet); + newBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; + newBullet[0].Bullet.OffenderJoinIndex = joinIndex; + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); + thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; + } + _1 = skillId; + if (_1 === (1)) { + thatPlayerInNextFrame.CharacterState = 2; + } else if (_1 === (2)) { + thatPlayerInNextFrame.CharacterState = 11; + } else if (_1 === (3)) { + thatPlayerInNextFrame.CharacterState = 12; + } + if (false === currPlayerDownsync$1.InAir) { + thatPlayerInNextFrame.VelX = 0; + } + _i$1++; + continue; + } + } + if (0 === currPlayerDownsync$1.FramesToRecover) { + if (!((0 === effDx)) || !((0 === effDy))) { + _tmp = effDx; + _tmp$1 = effDy; + thatPlayerInNextFrame.DirX = _tmp; + thatPlayerInNextFrame.DirY = _tmp$1; + thatPlayerInNextFrame.VelX = $imul(effDx, currPlayerDownsync$1.Speed); + thatPlayerInNextFrame.CharacterState = 1; + } else { + thatPlayerInNextFrame.CharacterState = 0; + thatPlayerInNextFrame.VelX = 0; + } + } + _i$1++; + } + _ref$3 = currRenderFrame.PlayersArr; + _i$2 = 0; + /* while (true) { */ case 1: + /* if (!(_i$2 < _ref$3.$length)) { break; } */ if(!(_i$2 < _ref$3.$length)) { $s = 2; continue; } + i$2 = _i$2; + currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$2]); + joinIndex$1 = currPlayerDownsync$2.JoinIndex; + _tmp$2 = 0; + _tmp$3 = 0; + (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; + (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; + collisionPlayerIndex = 131072 + joinIndex$1 >> 0; + playerCollider = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$2 !== undefined ? _entry$2.v : ptrType$8.nil); + thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); + chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); + _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; + _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; + newVx = _tmp$4; + newVy = _tmp$5; + if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { + newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; + } + _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + playerCollider.X = _tuple$2[0]; + playerCollider.Y = _tuple$2[1]; + $r = playerCollider.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if (currPlayerDownsync$2.InAir) { + thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; + thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; + } + _i$2++; + $s = 1; continue; + case 2: + bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); + _ref$4 = currRenderFrame.MeleeBullets; + _i$3 = 0; + /* while (true) { */ case 4: + /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 5; continue; } + meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$3]); + /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 6: + offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); + xfac = 1; + if (0 > offender.DirX) { + xfac = -xfac; + } + _tuple$3 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); + bulletWx = _tuple$3[0]; + bulletWy = _tuple$3[1]; + _tuple$4 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); + hitboxSizeWx = _tuple$4[0]; + hitboxSizeWy = _tuple$4[1]; + _r = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 9; case 9: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + newBulletCollider = _r; + $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + bulletColliders = $append(bulletColliders, newBulletCollider); + $s = 8; continue; + /* } else { */ case 7: + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); + /* } */ case 8: + _i$3++; + $s = 4; continue; + case 5: + _ref$5 = currRenderFrame.PlayersArr; + _i$4 = 0; + /* while (true) { */ case 11: + /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 12; continue; } + i$3 = _i$4; + currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$4]); + joinIndex$2 = currPlayerDownsync$3.JoinIndex; + collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; + playerCollider$1 = (_entry$3 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$3 !== undefined ? _entry$3.v : ptrType$8.nil); + playerShape = $assertType(playerCollider$1.Shape, ptrType$5); + _r$1 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 13; case 13: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$1)); + thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); + chConfig$2 = ((i$3 < 0 || i$3 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$3]); + landedOnGravityPushback = false; + collision = playerCollider$1.Check(0, 0, new sliceType$4([])); + /* */ if (!(ptrType$1.nil === collision)) { $s = 14; continue; } + /* */ $s = 15; continue; + /* if (!(ptrType$1.nil === collision)) { */ case 14: + _ref$6 = collision.Objects; + _i$5 = 0; + /* while (true) { */ case 16: + /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 17; continue; } + obj = ((_i$5 < 0 || _i$5 >= _ref$6.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$6.$array[_ref$6.$offset + _i$5]); + _tmp$6 = false; + _tmp$7 = false; + _tmp$8 = false; + isBarrier = _tmp$6; + isAnotherPlayer = _tmp$7; + isBullet = _tmp$8; + _ref$7 = obj.Data; + if ($assertType(_ref$7, ptrType$3, true)[1]) { + isAnotherPlayer = true; + } else if ($assertType(_ref$7, ptrType$4, true)[1]) { + isBullet = true; + } else { + isBarrier = true; + } + if (isBullet) { + _i$5++; + /* continue; */ $s = 16; continue; + } + bShape = $assertType(obj.Shape, ptrType$5); + _r$2 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 18; case 18: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + _tuple$5 = _r$2; + overlapped = _tuple$5[0]; + pushbackX = _tuple$5[1]; + pushbackY = _tuple$5[2]; + overlapResult = _tuple$5[3]; + if (!overlapped) { + _i$5++; + /* continue; */ $s = 16; continue; + } + normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; + if (isAnotherPlayer) { + _tmp$9 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; + _tmp$10 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; + pushbackX = _tmp$9; + pushbackY = _tmp$10; + } + _ref$8 = (x$8 = joinIndex$2 - 1 >> 0, ((x$8 < 0 || x$8 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$8])).$get(); + _i$6 = 0; + while (true) { + if (!(_i$6 < _ref$8.$length)) { break; } + hardPushbackNorm = $clone(((_i$6 < 0 || _i$6 >= _ref$8.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$8.$array[_ref$8.$offset + _i$6]), Vec2D); + projectedMagnitude = pushbackX * hardPushbackNorm.X + pushbackY * hardPushbackNorm.Y; + if (isBarrier || (isAnotherPlayer && 0 > projectedMagnitude)) { + pushbackX = pushbackX - (projectedMagnitude * hardPushbackNorm.X); + pushbackY = pushbackY - (projectedMagnitude * hardPushbackNorm.Y); + } + _i$6++; + } + _index = joinIndex$2 - 1 >> 0; + ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X = ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X + (pushbackX); + _index$1 = joinIndex$2 - 1 >> 0; + ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y = ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y + (pushbackY); + if (0.5 < normAlignmentWithGravity) { + landedOnGravityPushback = true; + } + _i$5++; + $s = 16; continue; + case 17: + /* } */ case 15: + if (landedOnGravityPushback) { + thatPlayerInNextFrame$2.InAir = false; + if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { + thatPlayerInNextFrame$2.VelX = 0; + thatPlayerInNextFrame$2.VelY = 0; + if (8 === thatPlayerInNextFrame$2.CharacterState) { + thatPlayerInNextFrame$2.CharacterState = 9; + thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; + } else { + thatPlayerInNextFrame$2.CharacterState = 0; + thatPlayerInNextFrame$2.FramesToRecover = 0; + } + } else { + if (9 === thatPlayerInNextFrame$2.CharacterState) { + if (0 === thatPlayerInNextFrame$2.FramesToRecover) { + thatPlayerInNextFrame$2.CharacterState = 10; + thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.GetUpFramesToRecover; + } + } else if (10 === thatPlayerInNextFrame$2.CharacterState) { + if (thatPlayerInNextFrame$2.FramesInChState === chConfig$2.GetUpFrames) { + thatPlayerInNextFrame$2.CharacterState = 0; + } + } + } + } + _i$4++; + $s = 11; continue; + case 12: + _ref$9 = bulletColliders; + _i$7 = 0; + /* while (true) { */ case 19: + /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 20; continue; } + bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$7]); + collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); + bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); + _ref$10 = bulletCollider.Data; + /* */ if ($assertType(_ref$10, ptrType$4, true)[1]) { $s = 21; continue; } + /* */ $s = 22; continue; + /* if ($assertType(_ref$10, ptrType$4, true)[1]) { */ case 21: + v$1 = _ref$10.$val; + if (ptrType$1.nil === collision$1) { + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$1); + _i$7++; + /* continue; */ $s = 19; continue; + } + bulletShape = $assertType(bulletCollider.Shape, ptrType$5); + offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); + _ref$11 = collision$1.Objects; + _i$8 = 0; + /* while (true) { */ case 23: + /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 24; continue; } + obj$1 = ((_i$8 < 0 || _i$8 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$8]); + defenderShape = $assertType(obj$1.Shape, ptrType$5); + _ref$12 = obj$1.Data; + /* */ if ($assertType(_ref$12, ptrType$3, true)[1]) { $s = 25; continue; } + /* */ $s = 26; continue; + /* if ($assertType(_ref$12, ptrType$3, true)[1]) { */ case 25: + t = _ref$12.$val; + if (v$1.Bullet.OffenderJoinIndex === t.JoinIndex) { + _i$8++; + /* continue; */ $s = 23; continue; + } + _tuple$6 = (_entry$4 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); + existent$1 = _tuple$6[1]; + if (existent$1) { + _i$8++; + /* continue; */ $s = 23; continue; + } + _r$3 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 28; case 28: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + _tuple$7 = _r$3; + overlapped$1 = _tuple$7[0]; + if (!overlapped$1) { + _i$8++; + /* continue; */ $s = 23; continue; + } + xfac$1 = 1; + if (0 > offender$1.DirX) { + xfac$1 = -xfac$1; + } + _tmp$11 = $imul(xfac$1, v$1.Bullet.PushbackVelX); + _tmp$12 = v$1.Bullet.PushbackVelY; + pushbackVelX = _tmp$11; + pushbackVelY = _tmp$12; + atkedPlayerInNextFrame = (x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$11])); + atkedPlayerInNextFrame.VelX = pushbackVelX; + atkedPlayerInNextFrame.VelY = pushbackVelY; + if (v$1.Bullet.BlowUp) { + atkedPlayerInNextFrame.CharacterState = 8; + } else { + atkedPlayerInNextFrame.CharacterState = 3; + } + oldFramesToRecover = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])).FramesToRecover; + if (v$1.Bullet.HitStunFrames > oldFramesToRecover) { + atkedPlayerInNextFrame.FramesToRecover = v$1.Bullet.HitStunFrames; + } + $s = 27; continue; + /* } else { */ case 26: + t$1 = _ref$12; + /* } */ case 27: + _i$8++; + $s = 23; continue; + case 24: + /* } */ case 22: + _i$7++; + $s = 19; continue; + case 20: + _ref$13 = currRenderFrame.PlayersArr; + _i$9 = 0; + while (true) { + if (!(_i$9 < _ref$13.$length)) { break; } + i$4 = _i$9; + currPlayerDownsync$4 = ((_i$9 < 0 || _i$9 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$9]); + joinIndex$3 = currPlayerDownsync$4.JoinIndex; + collisionPlayerIndex$2 = 131072 + joinIndex$3 >> 0; + playerCollider$2 = (_entry$5 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$5 !== undefined ? _entry$5.v : ptrType$8.nil); + thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); + _tuple$8 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + thatPlayerInNextFrame$3.VirtualGridX = _tuple$8[0]; + thatPlayerInNextFrame$3.VirtualGridY = _tuple$8[1]; + if (thatPlayerInNextFrame$3.InAir) { + oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; + _2 = oldNextCharacterState; + if ((_2 === (0)) || (_2 === (1))) { + if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { + thatPlayerInNextFrame$3.CharacterState = 5; + } else { + thatPlayerInNextFrame$3.CharacterState = 4; + } + } else if (_2 === (2)) { + thatPlayerInNextFrame$3.CharacterState = 6; + } else if (_2 === (3)) { + thatPlayerInNextFrame$3.CharacterState = 7; + } + } + if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { + thatPlayerInNextFrame$3.FramesInChState = 0; + } + _tuple$9 = (_entry$6 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$6 !== undefined ? [_entry$6.v, true] : [false, false]); + existent$2 = _tuple$9[1]; + if (existent$2) { + thatPlayerInNextFrame$3.ActiveSkillId = -1; + thatPlayerInNextFrame$3.ActiveSkillHit = -1; + } + _i$9++; + } + $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; + GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _tuple = WorldToPolygonColliderBLPos(wx, wy, w * 0.5, h * 0.5, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY); + blX = _tuple[0]; + blY = _tuple[1]; + _r = generateRectColliderInCollisionSpace(blX, blY, leftPadding + w + rightPadding, bottomPadding + h + topPadding, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectCollider, $c: true, $r, $24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectCollider = GenerateRectCollider; + generateRectColliderInCollisionSpace = function(blX, blY, w, h, data, tag) { + var {blX, blY, collider, data, h, shape, tag, w, $s, $r, $c} = $restore(this, {blX, blY, w, h, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + collider = resolv.NewObject(blX, blY, w, h, new sliceType$4([tag])); + shape = resolv.NewRectangle(0, 0, w, h); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: generateRectColliderInCollisionSpace, $c: true, $r, blX, blY, collider, data, h, shape, tag, w, $s};return $f; + }; + GenerateConvexPolygonCollider = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {_i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + aligned = AlignPolygon2DToBoundingBox(unalignedSrc); + _tmp = 0; + _tmp$1 = 0; + w = _tmp; + h = _tmp$1; + shape = resolv.NewConvexPolygon(sliceType$12.nil); + _ref = aligned.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + pi = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = aligned.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + j = _i$1; + pj = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (i === j) { + _i$1++; + continue; + } + if (math.Abs(pj.X - pi.X) > w) { + w = math.Abs(pj.X - pi.X); + } + if (math.Abs(pj.Y - pi.Y) > h) { + h = math.Abs(pj.Y - pi.Y); + } + _i$1++; + } + _i++; + } + i$1 = 0; + while (true) { + if (!(i$1 < aligned.Points.$length)) { break; } + p = (x = aligned.Points, ((i$1 < 0 || i$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i$1])); + shape.AddPoints(new sliceType$12([p.X, p.Y])); + i$1 = i$1 + (1) >> 0; + } + collider = resolv.NewObject(aligned.Anchor.X + spaceOffsetX, aligned.Anchor.Y + spaceOffsetY, w, h, new sliceType$4([tag])); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonCollider, $c: true, $r, _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s};return $f; + }; + $pkg.GenerateConvexPolygonCollider = GenerateConvexPolygonCollider; + AlignPolygon2DToBoundingBox = function(input) { + var _i, _i$1, _ref, _ref$1, boundingBoxBL, i, input, output, p, p$1, x; + boundingBoxBL = new Vec2D.ptr(1.7e+308, 1.7e+308); + _ref = input.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (p.X < boundingBoxBL.X) { + boundingBoxBL.X = p.X; + } + if (p.Y < boundingBoxBL.Y) { + boundingBoxBL.Y = p.Y; + } + _i++; + } + output = new Polygon2D.ptr(new Vec2D.ptr(input.Anchor.X + boundingBoxBL.X, input.Anchor.Y + boundingBoxBL.Y), $makeSlice(sliceType$13, input.Points.$length)); + _ref$1 = input.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + (x = output.Points, ((i < 0 || i >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i] = new Vec2D.ptr(p$1.X - boundingBoxBL.X, p$1.Y - boundingBoxBL.Y))); + _i$1++; + } + return output; + }; + $pkg.AlignPolygon2DToBoundingBox = AlignPolygon2DToBoundingBox; + ptrType$12.methods = [{prop: "Put", name: "Put", pkg: "", typ: $funcType([$emptyInterface], [], false)}, {prop: "Pop", name: "Pop", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "GetArrIdxByOffset", name: "GetArrIdxByOffset", pkg: "", typ: $funcType([$Int32], [$Int32], false)}, {prop: "GetByOffset", name: "GetByOffset", pkg: "", typ: $funcType([$Int32], [$emptyInterface], false)}, {prop: "GetByFrameId", name: "GetByFrameId", pkg: "", typ: $funcType([$Int32], [$emptyInterface], false)}, {prop: "SetByFrameId", name: "SetByFrameId", pkg: "", typ: $funcType([$emptyInterface, $Int32], [$Int32, $Int32, $Int32], false)}]; + Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$10, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); + PlayerDownsync.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VirtualGridX", name: "VirtualGridX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VirtualGridY", name: "VirtualGridY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "DirX", name: "DirX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "DirY", name: "DirY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VelX", name: "VelX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VelY", name: "VelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "BattleState", name: "BattleState", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JoinIndex", name: "JoinIndex", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ColliderRadius", name: "ColliderRadius", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Removed", name: "Removed", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Score", name: "Score", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LastMoveGmtMillis", name: "LastMoveGmtMillis", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "FramesToRecover", name: "FramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "FramesInChState", name: "FramesInChState", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Hp", name: "Hp", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "MaxHp", name: "MaxHp", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "CharacterState", name: "CharacterState", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InAir", name: "InAir", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "ActiveSkillId", name: "ActiveSkillId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ActiveSkillHit", name: "ActiveSkillHit", embedded: false, exported: true, typ: $Int32, tag: ""}]); + InputFrameDecoded.init("", [{prop: "Dx", name: "Dx", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Dy", name: "Dy", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "BtnALevel", name: "BtnALevel", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "BtnBLevel", name: "BtnBLevel", embedded: false, exported: true, typ: $Int32, tag: ""}]); + Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$11, tag: ""}]); + Bullet.init("", [{prop: "OriginatedRenderFrameId", name: "OriginatedRenderFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "OffenderJoinIndex", name: "OffenderJoinIndex", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StartupFrames", name: "StartupFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "CancellableStFrame", name: "CancellableStFrame", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "CancellableEdFrame", name: "CancellableEdFrame", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ActiveFrames", name: "ActiveFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "HitStunFrames", name: "HitStunFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "BlockStunFrames", name: "BlockStunFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PushbackVelX", name: "PushbackVelX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PushbackVelY", name: "PushbackVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Damage", name: "Damage", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SelfLockVelX", name: "SelfLockVelX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SelfLockVelY", name: "SelfLockVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "HitboxOffsetX", name: "HitboxOffsetX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "HitboxOffsetY", name: "HitboxOffsetY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "HitboxSizeX", name: "HitboxSizeX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "HitboxSizeY", name: "HitboxSizeY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "BlowUp", name: "BlowUp", embedded: false, exported: true, typ: $Bool, tag: ""}]); + MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); + FireballBullet.init("", [{prop: "VirtualGridX", name: "VirtualGridX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VirtualGridY", name: "VirtualGridY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "DirX", name: "DirX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "DirY", name: "DirY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VelX", name: "VelX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "VelY", name: "VelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); + Skill.init("", [{prop: "BattleLocalId", name: "BattleLocalId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "RecoveryFrames", name: "RecoveryFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "RecoveryFramesOnBlock", name: "RecoveryFramesOnBlock", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "RecoveryFramesOnHit", name: "RecoveryFramesOnHit", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ReleaseTriggerType", name: "ReleaseTriggerType", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Hits", name: "Hits", embedded: false, exported: true, typ: sliceType, tag: ""}]); + RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, tag: ""}, {prop: "BackendUnconfirmedMask", name: "BackendUnconfirmedMask", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "ShouldForceResync", name: "ShouldForceResync", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "PlayerOpPatternToSkillId", name: "PlayerOpPatternToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); + InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); + RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PatternIdToSkillId", name: "PatternIdToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); + SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + $r = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, $makeMap($Int.keyFor, [{ k: 1, v: 1 }, { k: 2, v: 2 }, { k: 3, v: 3 }, { k: 255, v: 255 }])) }]); + skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 20, 20, 20, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 5, 8, 20, 10, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 18, 36, 20, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 1, 0, 0, 30, 999999999, 9, 100, 400, 10, 0, 0, 2400, 0, 3200, 3200, true))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false))])) }]); + $pkg.DIRECTION_DECODER = new sliceType$2([new sliceType$1([0, 0]), new sliceType$1([0, 2]), new sliceType$1([0, -2]), new sliceType$1([2, 0]), new sliceType$1([-2, 0]), new sliceType$1([1, 1]), new sliceType$1([-1, -1]), new sliceType$1([1, -1]), new sliceType$1([-1, 1])]); + inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); + noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); + invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); + nonAttackingSet = $makeMap($Int32.keyFor, []); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["jsexport"] = (function() { + var $pkg = {}, $init, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, funcType$12, funcType$13, funcType$14, sliceType$6, funcType$15, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$16, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; + js = $packages["github.com/gopherjs/gopherjs/js"]; + battle = $packages["jsexport/battle"]; + resolv = $packages["resolv"]; + sliceType = $sliceType($Uint64); + ptrType = $ptrType(battle.Vec2D); + sliceType$1 = $sliceType(ptrType); + ptrType$1 = $ptrType(battle.Polygon2D); + ptrType$2 = $ptrType(battle.PlayerDownsync); + sliceType$2 = $sliceType(ptrType$2); + ptrType$3 = $ptrType(battle.MeleeBullet); + sliceType$3 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(battle.FireballBullet); + sliceType$4 = $sliceType(ptrType$4); + ptrType$5 = $ptrType(js.Object); + sliceType$5 = $sliceType(ptrType$5); + ptrType$6 = $ptrType(battle.CharacterConfig); + funcType = $funcType([$Float64, $Float64], [ptrType$5], false); + funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); + funcType$2 = $funcType([ptrType$1], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); + funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); + funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); + funcType$8 = $funcType([$Int32], [ptrType$5], false); + funcType$9 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + funcType$10 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + ptrType$7 = $ptrType(resolv.Space); + funcType$11 = $funcType([ptrType$7], [sliceType$5], false); + funcType$12 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); + funcType$13 = $funcType([$Float64, $Float64], [$Int32, $Int32], false); + funcType$14 = $funcType([$Int32, $Int32], [$Float64, $Float64], false); + sliceType$6 = $sliceType($Int); + funcType$15 = $funcType([sliceType$6], [sliceType$5], false); + ptrType$8 = $ptrType(battle.RingBuffer); + ptrType$9 = $ptrType(battle.RoomDownsyncFrame); + ptrType$10 = $ptrType(resolv.Object); + mapType = $mapType($Int32, ptrType$10); + sliceType$7 = $sliceType(ptrType$6); + funcType$16 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); + mapType$1 = $mapType($String, $emptyInterface); + NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { + var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.InputFrameDownsync.ptr(inputFrameId, inputList, confirmedList)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewInputFrameDownsync, $c: true, $r, $24r, _r, confirmedList, inputFrameId, inputList, $s};return $f; + }; + $pkg.NewInputFrameDownsync = NewInputFrameDownsync; + NewRingBufferJs = function(n) { + var {$24r, _r, n, $s, $r, $c} = $restore(this, {n}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(battle.NewRingBuffer(n)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRingBufferJs, $c: true, $r, $24r, _r, n, $s};return $f; + }; + $pkg.NewRingBufferJs = NewRingBufferJs; + NewCollisionSpaceJs = function(spaceW, spaceH, minStepW, minStepH) { + var minStepH, minStepW, spaceH, spaceW; + return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)); + }; + $pkg.NewCollisionSpaceJs = NewCollisionSpaceJs; + NewVec2DJs = function(x, y) { + var {$24r, _r, x, y, $s, $r, $c} = $restore(this, {x, y}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Vec2D.ptr(x, y)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewVec2DJs, $c: true, $r, $24r, _r, x, y, $s};return $f; + }; + $pkg.NewVec2DJs = NewVec2DJs; + NewPolygon2DJs = function(anchor, points) { + var {$24r, _r, anchor, points, $s, $r, $c} = $restore(this, {anchor, points}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Polygon2D.ptr(anchor, points)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewPolygon2DJs, $c: true, $r, $24r, _r, anchor, points, $s};return $f; + }; + $pkg.NewPolygon2DJs = NewPolygon2DJs; + NewBarrierJs = function(boundary) { + var boundary; + return js.MakeWrapper(new battle.Barrier.ptr(boundary)); + }; + $pkg.NewBarrierJs = NewBarrierJs; + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { + var battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, 0, 0)); + }; + $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; + NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { + var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; + return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp))); + }; + $pkg.NewMeleeBulletJs = NewMeleeBulletJs; + NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { + var {$24r, _r, id, meleeBullets, playersArr, $s, $r, $c} = $restore(this, {id, playersArr, meleeBullets}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.RoomDownsyncFrame.ptr(id, playersArr, new $Int64(0, 0), meleeBullets, sliceType$4.nil, new $Uint64(0, 0), false, false)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRoomDownsyncFrameJs, $c: true, $r, $24r, _r, id, meleeBullets, playersArr, $s};return $f; + }; + $pkg.NewRoomDownsyncFrameJs = NewRoomDownsyncFrameJs; + GetCollisionSpaceObjsJs = function(space) { + var {_i, _r, _ref, obj, objs, ret, space, $s, $r, $c} = $restore(this, {space}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + objs = space.Objects(); + ret = $makeSlice(sliceType$5, 0, objs.$length); + _ref = objs; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper(obj); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ret = $append(ret, _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCollisionSpaceObjsJs, $c: true, $r, _i, _r, _ref, obj, objs, ret, space, $s};return $f; + }; + $pkg.GetCollisionSpaceObjsJs = GetCollisionSpaceObjsJs; + GenerateRectColliderJs = function(wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _tmp = 0.1; + _tmp$1 = 0.1; + _tmp$2 = 0.1; + _tmp$3 = 0.1; + topPadding = _tmp; + bottomPadding = _tmp$1; + leftPadding = _tmp$2; + rightPadding = _tmp$3; + _r = battle.GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectColliderJs, $c: true, $r, $24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectColliderJs = GenerateRectColliderJs; + GenerateConvexPolygonColliderJs = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonColliderJs, $c: true, $r, $24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s};return $f; + }; + $pkg.GenerateConvexPolygonColliderJs = GenerateConvexPolygonColliderJs; + GetCharacterConfigsOrderedByJoinIndex = function(speciesIdList) { + var {_entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s, $r, $c} = $restore(this, {speciesIdList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = $makeSlice(sliceType$5, speciesIdList.$length, speciesIdList.$length); + _ref = speciesIdList; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + i = _i; + speciesId = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper((_entry = battle.Characters[$Int.keyFor(speciesId)], _entry !== undefined ? _entry.v : ptrType$6.nil)); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ((i < 0 || i >= ret.$length) ? ($throwRuntimeError("index out of range"), undefined) : ret.$array[ret.$offset + i] = _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCharacterConfigsOrderedByJoinIndex, $c: true, $r, _entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s};return $f; + }; + $pkg.GetCharacterConfigsOrderedByJoinIndex = GetCharacterConfigsOrderedByJoinIndex; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { + var {$24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, $c: true, $r, $24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; + main = function() { + $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$12(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$12(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$13(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$14(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$15(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$16(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }]), mapType$1); + }; + $init = function() { + $pkg.$init = function() {}; + /* */ var $f, $c = false, $s = 0, $r; if (this !== undefined && this.$blk !== undefined) { $f = this; $c = true; $s = $f.$s; $r = $f.$r; } s: while (true) { switch ($s) { case 0: + $r = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = battle.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if ($pkg === $mainPkg) { + main(); + $mainFinished = true; + } + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); $synthesizeMethods(); $initAllLinknames(); var $mainPkg = $packages["jsexport"]; diff --git a/frontend/assets/resources/animation/MonkGirl/Atk1.anim b/frontend/assets/resources/animation/MonkGirl/Atk1.anim index 06ab839..0a2dc11 100644 --- a/frontend/assets/resources/animation/MonkGirl/Atk1.anim +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim @@ -3,7 +3,7 @@ "_name": "Atk1", "_objFlags": 0, "_native": "", - "_duration": 0.36666666666666664, + "_duration": 0.2833333333333333, "sample": 60, "speed": 1, "wrapMode": 1, @@ -18,25 +18,25 @@ } }, { - "frame": 0.03333333333333333, + "frame": 0.05, "value": { "__uuid__": "12b90556-58b9-4311-b5d9-820fb76d659b" } }, { - "frame": 0.11666666666666667, + "frame": 0.1, "value": { "__uuid__": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb" } }, { - "frame": 0.31666666666666665, + "frame": 0.25, "value": { "__uuid__": "7e619896-100d-4903-b256-e30ddb5ad397" } }, { - "frame": 0.35, + "frame": 0.26666666666666666, "value": { "__uuid__": "4a35e0f5-95c4-445b-8f9b-6514a060a72d" } diff --git a/frontend/assets/resources/animation/MonkGirl/Atk2.anim b/frontend/assets/resources/animation/MonkGirl/Atk2.anim new file mode 100644 index 0000000..1805881 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk2.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk2", + "_objFlags": 0, + "_native": "", + "_duration": 0.6, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "0e3b6c28-f265-457d-b000-aeea66d05428" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "1d9c010b-3209-4672-9f78-96527d62f4e0" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "1fd3ca4d-ec4d-4858-a3d2-fe274e22d4be" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "b0aaf216-b8d7-4247-be61-df9f3146ce46" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "f12c5713-540f-4874-a6b0-0162f0ffb544" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "b9a4cd85-53d1-4280-bc9e-35a8dd482fa4" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "74e9fcd1-11dc-478e-b90a-d4c5cf551aad" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "e6c3bdcd-9ba8-4c5b-910d-2d93d9068abd" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "c359790f-bbd1-4869-a37b-7f1c0bd91578" + } + }, + { + "frame": 0.5833333333333334, + "value": { + "__uuid__": "1b9074dd-d0b0-4129-8d72-8f356bf7f68c" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta new file mode 100644 index 0000000..33bac8f --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "e6e1d62a-de7d-4fe7-858c-2d2725b7c2e8", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk3.anim b/frontend/assets/resources/animation/MonkGirl/Atk3.anim new file mode 100644 index 0000000..ebf6cfd --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim @@ -0,0 +1,85 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 1, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "5a5208a0-1c29-446f-8375-739aef09fe65" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "414628f0-13ec-4f01-83a0-b94f6a13fff1" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "c494965a-e7e6-4c99-ac61-60642e6247dc" + } + }, + { + "frame": 0.5666666666666667, + "value": { + "__uuid__": "04cafb17-39ab-4f2b-9830-3eaf42cab254" + } + }, + { + "frame": 0.7166666666666667, + "value": { + "__uuid__": "fd9c7d8a-1038-4cab-a0e6-699e404701db" + } + }, + { + "frame": 0.8333333333333334, + "value": { + "__uuid__": "2447c6b3-292b-43b4-84e5-acc35df0c1f5" + } + }, + { + "frame": 0.9333333333333333, + "value": { + "__uuid__": "00275818-b9b6-41ab-a792-f21ff10747fa" + } + }, + { + "frame": 0.9833333333333333, + "value": { + "__uuid__": "11a06f33-cdfa-46cf-aae4-41e72a6711c2" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta new file mode 100644 index 0000000..83d784c --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "e8247e2a-1b5b-4618-86f8-224b25246b55", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist index 771e272..cec6563 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {62,92} textureRect - {{777,282},{62,92}} + {{551,127},{62,92}} textureRotated @@ -30,7 +30,7 @@ spriteSourceSize {77,99} textureRect - {{409,214},{77,99}} + {{93,594},{77,99}} textureRotated @@ -45,7 +45,7 @@ spriteSourceSize {112,99} textureRect - {{184,114},{112,99}} + {{0,359},{112,99}} textureRotated @@ -60,7 +60,7 @@ spriteSourceSize {96,100} textureRect - {{388,327},{96,100}} + {{240,88},{96,100}} textureRotated @@ -75,7 +75,322 @@ spriteSourceSize {62,92} textureRect - {{777,282},{62,92}} + {{551,127},{62,92}} + textureRotated + + + Atk2_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{170,675},{58,97}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,90} + spriteSourceSize + {60,90} + textureRect + {{743,537},{60,90}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,96} + spriteSourceSize + {84,96} + textureRect + {{920,215},{84,96}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {55,100} + spriteSourceSize + {55,100} + textureRect + {{302,365},{55,100}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,100} + spriteSourceSize + {63,100} + textureRect + {{312,562},{63,100}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {66,101} + spriteSourceSize + {66,101} + textureRect + {{915,299},{66,101}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,95} + spriteSourceSize + {80,95} + textureRect + {{548,461},{80,95}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {116,109} + spriteSourceSize + {116,109} + textureRect + {{0,0},{116,109}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,96} + spriteSourceSize + {102,96} + textureRect + {{144,93},{102,96}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,102} + spriteSourceSize + {75,102} + textureRect + {{170,573},{75,102}} + textureRotated + + + Atk3_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {51,131} + spriteSourceSize + {51,131} + textureRect + {{93,109},{51,131}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {53,103} + spriteSourceSize + {53,103} + textureRect + {{162,470},{53,103}} + textureRotated + + + Atk3_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,100} + spriteSourceSize + {74,100} + textureRect + {{357,365},{74,100}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,109} + spriteSourceSize + {70,109} + textureRect + {{442,127},{70,109}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {131,93} + spriteSourceSize + {131,93} + textureRect + {{0,109},{131,93}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {89,119} + spriteSourceSize + {89,119} + textureRect + {{0,240},{89,119}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,119} + spriteSourceSize + {88,119} + textureRect + {{236,0},{88,119}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {57,120} + spriteSourceSize + {57,120} + textureRect + {{959,0},{57,120}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,122} + spriteSourceSize + {59,122} + textureRect + {{243,350},{59,122}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,111} + spriteSourceSize + {80,111} + textureRect + {{163,350},{80,111}} + textureRotated + + + Atk3_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,110} + spriteSourceSize + {82,110} + textureRect + {{153,240},{82,110}} textureRotated @@ -90,7 +405,7 @@ spriteSourceSize {62,97} textureRect - {{419,106},{62,97}} + {{305,465},{62,97}} textureRotated @@ -105,7 +420,7 @@ spriteSourceSize {73,95} textureRect - {{727,478},{73,95}} + {{943,120},{73,95}} textureRotated @@ -120,9 +435,9 @@ spriteSourceSize {90,89} textureRect - {{800,472},{90,89}} + {{706,356},{90,89}} textureRotated - + BlownUp1_0.png @@ -135,9 +450,9 @@ spriteSourceSize {95,80} textureRect - {{555,193},{95,80}} + {{564,653},{95,80}} textureRotated - + BlownUp1_1.png @@ -150,7 +465,7 @@ spriteSourceSize {80,95} textureRect - {{554,290},{80,95}} + {{578,556},{80,95}} textureRotated @@ -165,7 +480,7 @@ spriteSourceSize {83,92} textureRect - {{748,378},{83,92}} + {{623,349},{83,92}} textureRotated @@ -180,9 +495,9 @@ spriteSourceSize {92,83} textureRect - {{900,58},{92,83}} + {{706,445},{92,83}} textureRotated - + GetUp1_0.png @@ -195,9 +510,9 @@ spriteSourceSize {112,45} textureRect - {{259,0},{112,45}} + {{144,195},{112,45}} textureRotated - + GetUp1_1.png @@ -210,9 +525,9 @@ spriteSourceSize {88,69} textureRect - {{919,318},{88,69}} + {{355,284},{88,69}} textureRotated - + GetUp1_2.png @@ -225,7 +540,7 @@ spriteSourceSize {91,90} textureRect - {{832,188},{91,90}} + {{215,472},{91,90}} textureRotated @@ -240,9 +555,9 @@ spriteSourceSize {120,93} textureRect - {{62,248},{120,93}} + {{116,0},{120,93}} textureRotated - + GetUp1_4.png @@ -255,7 +570,7 @@ spriteSourceSize {100,112} textureRect - {{155,233},{100,112}} + {{0,471},{100,112}} textureRotated @@ -270,7 +585,7 @@ spriteSourceSize {106,93} textureRect - {{316,221},{106,93}} + {{0,583},{106,93}} textureRotated @@ -285,9 +600,9 @@ spriteSourceSize {106,79} textureRect - {{340,108},{106,79}} + {{336,112},{106,79}} textureRotated - + GetUp1_7.png @@ -300,9 +615,9 @@ spriteSourceSize {73,87} textureRect - {{922,231},{73,87}} + {{289,191},{73,87}} textureRotated - + GetUp1_8.png @@ -315,7 +630,7 @@ spriteSourceSize {67,90} textureRect - {{889,472},{67,90}} + {{736,627},{67,90}} textureRotated @@ -330,9 +645,9 @@ spriteSourceSize {58,97} textureRect - {{433,0},{58,97}} + {{170,675},{58,97}} textureRotated - + Idle1_0.png @@ -345,7 +660,7 @@ spriteSourceSize {58,95} textureRect - {{685,95},{58,95}} + {{565,365},{58,95}} textureRotated @@ -360,7 +675,7 @@ spriteSourceSize {58,97} textureRect - {{481,97},{58,97}} + {{367,465},{58,97}} textureRotated @@ -375,9 +690,9 @@ spriteSourceSize {60,94} textureRect - {{772,188},{60,94}} + {{613,204},{60,94}} textureRotated - + Idle1_2.png @@ -390,7 +705,7 @@ spriteSourceSize {58,97} textureRect - {{491,0},{58,97}} + {{375,562},{58,97}} textureRotated @@ -405,7 +720,7 @@ spriteSourceSize {58,97} textureRect - {{399,427},{58,97}} + {{425,465},{58,97}} textureRotated @@ -420,9 +735,9 @@ spriteSourceSize {60,95} textureRect - {{635,191},{60,95}} + {{802,318},{60,95}} textureRotated - + Idle1_5.png @@ -435,7 +750,7 @@ spriteSourceSize {60,94} textureRect - {{818,94},{60,94}} + {{877,533},{60,94}} textureRotated @@ -450,7 +765,7 @@ spriteSourceSize {59,93} textureRect - {{609,480},{59,93}} + {{376,191},{59,93}} textureRotated @@ -465,9 +780,9 @@ spriteSourceSize {58,93} textureRect - {{900,0},{58,93}} + {{502,266},{58,93}} textureRotated - + Idle1_8.png @@ -480,7 +795,7 @@ spriteSourceSize {59,93} textureRect - {{668,480},{59,93}} + {{443,266},{59,93}} textureRotated @@ -495,7 +810,7 @@ spriteSourceSize {60,94} textureRect - {{840,0},{60,94}} + {{877,627},{60,94}} textureRotated @@ -510,7 +825,7 @@ spriteSourceSize {77,68} textureRect - {{532,505},{77,68}} + {{937,652},{77,68}} textureRotated @@ -525,9 +840,9 @@ spriteSourceSize {118,76} textureRect - {{64,0},{118,76}} + {{355,0},{118,76}} textureRotated - + InAirAtk1_10.png @@ -540,9 +855,9 @@ spriteSourceSize {104,65} textureRect - {{267,442},{104,65}} + {{707,213},{104,65}} textureRotated - + InAirAtk1_11.png @@ -555,9 +870,9 @@ spriteSourceSize {80,66} textureRect - {{839,279},{80,66}} + {{289,264},{80,66}} textureRotated - + InAirAtk1_12.png @@ -570,7 +885,7 @@ spriteSourceSize {102,67} textureRect - {{332,431},{102,67}} + {{245,563},{102,67}} textureRotated @@ -585,7 +900,7 @@ spriteSourceSize {79,66} textureRect - {{839,345},{79,66}} + {{937,365},{79,66}} textureRotated @@ -600,9 +915,9 @@ spriteSourceSize {124,64} textureRect - {{0,0},{124,64}} + {{711,0},{124,64}} textureRotated - + InAirAtk1_4.png @@ -615,9 +930,9 @@ spriteSourceSize {104,64} textureRect - {{324,327},{104,64}} + {{811,254},{104,64}} textureRotated - + InAirAtk1_5.png @@ -630,7 +945,7 @@ spriteSourceSize {79,61} textureRect - {{831,411},{79,61}} + {{937,497},{79,61}} textureRotated @@ -645,9 +960,9 @@ spriteSourceSize {124,64} textureRect - {{0,124},{124,64}} + {{835,0},{124,64}} textureRotated - + InAirAtk1_7.png @@ -660,9 +975,9 @@ spriteSourceSize {106,67} textureRect - {{366,0},{106,67}} + {{814,187},{106,67}} textureRotated - + InAirAtk1_8.png @@ -675,7 +990,7 @@ spriteSourceSize {79,66} textureRect - {{918,406},{79,66}} + {{937,431},{79,66}} textureRotated @@ -690,7 +1005,7 @@ spriteSourceSize {118,64} textureRect - {{64,118},{118,64}} + {{89,240},{118,64}} textureRotated @@ -705,9 +1020,9 @@ spriteSourceSize {71,119} textureRect - {{66,368},{71,119}} + {{473,0},{71,119}} textureRotated - + InAirIdle1_1.png @@ -720,9 +1035,9 @@ spriteSourceSize {71,119} textureRect - {{137,368},{71,119}} + {{592,0},{71,119}} textureRotated - + InAirIdle1_10.png @@ -735,9 +1050,9 @@ spriteSourceSize {55,114} textureRect - {{140,0},{55,114}} + {{593,71},{55,114}} textureRotated - + InAirIdle1_11.png @@ -750,7 +1065,7 @@ spriteSourceSize {62,124} textureRect - {{0,248},{62,124}} + {{100,470},{62,124}} textureRotated @@ -765,7 +1080,7 @@ spriteSourceSize {74,90} textureRect - {{922,141},{74,90}} + {{803,628},{74,90}} textureRotated @@ -780,7 +1095,7 @@ spriteSourceSize {110,54} textureRect - {{208,345},{110,54}} + {{235,240},{110,54}} textureRotated @@ -795,9 +1110,9 @@ spriteSourceSize {85,88} textureRect - {{95,487},{85,88}} + {{658,537},{85,88}} textureRotated - + InAirIdle1_5.png @@ -810,7 +1125,7 @@ spriteSourceSize {64,112} textureRect - {{195,0},{64,112}} + {{99,358},{64,112}} textureRotated @@ -825,9 +1140,9 @@ spriteSourceSize {62,107} textureRect - {{262,335},{62,107}} + {{707,151},{62,107}} textureRotated - + InAirIdle1_7.png @@ -840,7 +1155,7 @@ spriteSourceSize {85,84} textureRect - {{183,487},{85,84}} + {{623,264},{85,84}} textureRotated @@ -855,9 +1170,9 @@ spriteSourceSize {109,61} textureRect - {{255,226},{109,61}} + {{834,64},{109,61}} textureRotated - + InAirIdle1_9.png @@ -870,7 +1185,7 @@ spriteSourceSize {78,95} textureRect - {{0,495},{78,95}} + {{707,278},{78,95}} textureRotated @@ -885,9 +1200,9 @@ spriteSourceSize {115,56} textureRect - {{128,118},{115,56}} + {{478,71},{115,56}} textureRotated - + LayDown1_1.png @@ -900,9 +1215,9 @@ spriteSourceSize {109,57} textureRect - {{283,112},{109,57}} + {{707,94},{109,57}} textureRotated - + LayDown1_2.png @@ -915,9 +1230,9 @@ spriteSourceSize {108,62} textureRect - {{304,0},{108,62}} + {{816,125},{108,62}} textureRotated - + LayDown1_3.png @@ -930,9 +1245,9 @@ spriteSourceSize {123,36} textureRect - {{0,372},{123,36}} + {{355,76},{123,36}} textureRotated - + LayDown1_4.png @@ -945,9 +1260,9 @@ spriteSourceSize {123,30} textureRect - {{36,372},{123,30}} + {{711,64},{123,30}} textureRotated - + Walking_0.png @@ -960,7 +1275,7 @@ spriteSourceSize {78,95} textureRect - {{607,96},{78,95}} + {{628,441},{78,95}} textureRotated @@ -975,7 +1290,7 @@ spriteSourceSize {75,96} textureRect - {{457,427},{75,96}} + {{433,562},{75,96}} textureRotated @@ -990,7 +1305,7 @@ spriteSourceSize {65,96} textureRect - {{549,0},{65,96}} + {{431,365},{65,96}} textureRotated @@ -1005,7 +1320,7 @@ spriteSourceSize {65,96} textureRect - {{532,409},{65,96}} + {{483,461},{65,96}} textureRotated @@ -1020,9 +1335,9 @@ spriteSourceSize {74,95} textureRect - {{634,288},{74,95}} + {{375,659},{74,95}} textureRotated - + Walking_13.png @@ -1035,9 +1350,9 @@ spriteSourceSize {75,94} textureRect - {{743,94},{75,94}} + {{470,658},{75,94}} textureRotated - + Walking_14.png @@ -1050,7 +1365,7 @@ spriteSourceSize {70,94} textureRect - {{770,0},{70,94}} + {{937,558},{70,94}} textureRotated @@ -1065,9 +1380,9 @@ spriteSourceSize {78,94} textureRect - {{692,0},{78,94}} + {{613,126},{78,94}} textureRotated - + Walking_2.png @@ -1080,7 +1395,7 @@ spriteSourceSize {69,96} textureRect - {{486,194},{69,96}} + {{496,365},{69,96}} textureRotated @@ -1095,7 +1410,7 @@ spriteSourceSize {70,96} textureRect - {{484,313},{70,96}} + {{508,557},{70,96}} textureRotated @@ -1110,9 +1425,9 @@ spriteSourceSize {78,95} textureRect - {{614,0},{78,95}} + {{796,378},{78,95}} textureRotated - + Walking_5.png @@ -1125,9 +1440,9 @@ spriteSourceSize {77,95} textureRect - {{597,385},{77,95}} + {{789,456},{77,95}} textureRotated - + Walking_6.png @@ -1140,9 +1455,9 @@ spriteSourceSize {69,94} textureRect - {{708,284},{69,94}} + {{435,197},{69,94}} textureRotated - + Walking_7.png @@ -1155,7 +1470,7 @@ spriteSourceSize {77,94} textureRect - {{695,190},{77,94}} + {{659,625},{77,94}} textureRotated @@ -1170,7 +1485,7 @@ spriteSourceSize {74,95} textureRect - {{674,383},{74,95}} + {{803,533},{74,95}} textureRotated @@ -1185,9 +1500,9 @@ spriteSourceSize {68,96} textureRect - {{539,97},{68,96}} + {{267,665},{68,96}} textureRotated - + metadata @@ -1201,9 +1516,9 @@ realTextureFileName MonkGirl.png size - {997,573} + {1016,733} smartupdate - $TexturePacker:SmartUpdate:6bd11d0c92774f15794781ac24a65022:8606ee60ad6f31ae3d83c8f9fd35f0b6:7b088363a1f16e4f4ff313aecc52227b$ + $TexturePacker:SmartUpdate:278efbee9ca246d0ea7209b427040c71:0ee1cca010fb9c74ab24ae28995c20de:7b088363a1f16e4f4ff313aecc52227b$ textureFileName MonkGirl.png diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta index 1ee2958..2b6411b 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "size": { - "width": 997, - "height": 573 + "width": 1016, + "height": 733 }, "type": "Texture Packer", "subMetas": { @@ -17,8 +17,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 777, - "trimY": 282, + "trimX": 551, + "trimY": 127, "width": 62, "height": 92, "rawWidth": 62, @@ -39,8 +39,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 409, - "trimY": 214, + "trimX": 93, + "trimY": 594, "width": 77, "height": 99, "rawWidth": 77, @@ -61,8 +61,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 184, - "trimY": 114, + "trimX": 0, + "trimY": 359, "width": 112, "height": 99, "rawWidth": 112, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 388, - "trimY": 327, + "trimX": 240, + "trimY": 88, "width": 96, "height": 100, "rawWidth": 96, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 777, - "trimY": 282, + "trimX": 551, + "trimY": 127, "width": 62, "height": 92, "rawWidth": 62, @@ -118,6 +118,468 @@ "spriteType": "normal", "subMetas": {} }, + "Atk2_0.png": { + "ver": "1.0.4", + "uuid": "1d9c010b-3209-4672-9f78-96527d62f4e0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 170, + "trimY": 675, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_1.png": { + "ver": "1.0.4", + "uuid": "1fd3ca4d-ec4d-4858-a3d2-fe274e22d4be", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 743, + "trimY": 537, + "width": 60, + "height": 90, + "rawWidth": 60, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_2.png": { + "ver": "1.0.4", + "uuid": "b0aaf216-b8d7-4247-be61-df9f3146ce46", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 920, + "trimY": 215, + "width": 84, + "height": 96, + "rawWidth": 84, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_3.png": { + "ver": "1.0.4", + "uuid": "f12c5713-540f-4874-a6b0-0162f0ffb544", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 302, + "trimY": 365, + "width": 55, + "height": 100, + "rawWidth": 55, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_4.png": { + "ver": "1.0.4", + "uuid": "b9a4cd85-53d1-4280-bc9e-35a8dd482fa4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 312, + "trimY": 562, + "width": 63, + "height": 100, + "rawWidth": 63, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_5.png": { + "ver": "1.0.4", + "uuid": "74e9fcd1-11dc-478e-b90a-d4c5cf551aad", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 915, + "trimY": 299, + "width": 66, + "height": 101, + "rawWidth": 66, + "rawHeight": 101, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_6.png": { + "ver": "1.0.4", + "uuid": "0e3b6c28-f265-457d-b000-aeea66d05428", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 548, + "trimY": 461, + "width": 80, + "height": 95, + "rawWidth": 80, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_7.png": { + "ver": "1.0.4", + "uuid": "e6c3bdcd-9ba8-4c5b-910d-2d93d9068abd", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 116, + "height": 109, + "rawWidth": 116, + "rawHeight": 109, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_8.png": { + "ver": "1.0.4", + "uuid": "c359790f-bbd1-4869-a37b-7f1c0bd91578", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 144, + "trimY": 93, + "width": 102, + "height": 96, + "rawWidth": 102, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_9.png": { + "ver": "1.0.4", + "uuid": "1b9074dd-d0b0-4129-8d72-8f356bf7f68c", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 170, + "trimY": 573, + "width": 75, + "height": 102, + "rawWidth": 75, + "rawHeight": 102, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_0.png": { + "ver": "1.0.4", + "uuid": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 93, + "trimY": 109, + "width": 51, + "height": 131, + "rawWidth": 51, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_1.png": { + "ver": "1.0.4", + "uuid": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 162, + "trimY": 470, + "width": 53, + "height": 103, + "rawWidth": 53, + "rawHeight": 103, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_10.png": { + "ver": "1.0.4", + "uuid": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 357, + "trimY": 365, + "width": 74, + "height": 100, + "rawWidth": 74, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_2.png": { + "ver": "1.0.4", + "uuid": "5a5208a0-1c29-446f-8375-739aef09fe65", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 442, + "trimY": 127, + "width": 70, + "height": 109, + "rawWidth": 70, + "rawHeight": 109, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_3.png": { + "ver": "1.0.4", + "uuid": "414628f0-13ec-4f01-83a0-b94f6a13fff1", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 109, + "width": 131, + "height": 93, + "rawWidth": 131, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_4.png": { + "ver": "1.0.4", + "uuid": "c494965a-e7e6-4c99-ac61-60642e6247dc", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 240, + "width": 89, + "height": 119, + "rawWidth": 89, + "rawHeight": 119, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_5.png": { + "ver": "1.0.4", + "uuid": "04cafb17-39ab-4f2b-9830-3eaf42cab254", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 236, + "trimY": 0, + "width": 88, + "height": 119, + "rawWidth": 88, + "rawHeight": 119, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_6.png": { + "ver": "1.0.4", + "uuid": "fd9c7d8a-1038-4cab-a0e6-699e404701db", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 959, + "trimY": 0, + "width": 57, + "height": 120, + "rawWidth": 57, + "rawHeight": 120, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_7.png": { + "ver": "1.0.4", + "uuid": "2447c6b3-292b-43b4-84e5-acc35df0c1f5", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 243, + "trimY": 350, + "width": 59, + "height": 122, + "rawWidth": 59, + "rawHeight": 122, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_8.png": { + "ver": "1.0.4", + "uuid": "00275818-b9b6-41ab-a792-f21ff10747fa", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 163, + "trimY": 350, + "width": 80, + "height": 111, + "rawWidth": 80, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_9.png": { + "ver": "1.0.4", + "uuid": "11a06f33-cdfa-46cf-aae4-41e72a6711c2", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 153, + "trimY": 240, + "width": 82, + "height": 110, + "rawWidth": 82, + "rawHeight": 110, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, "Atked1_0.png": { "ver": "1.0.4", "uuid": "df446561-abb9-4d91-aa79-636bdf3d9335", @@ -127,8 +589,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 419, - "trimY": 106, + "trimX": 305, + "trimY": 465, "width": 62, "height": 97, "rawWidth": 62, @@ -149,8 +611,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 727, - "trimY": 478, + "trimX": 943, + "trimY": 120, "width": 73, "height": 95, "rawWidth": 73, @@ -168,11 +630,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 800, - "trimY": 472, + "trimX": 706, + "trimY": 356, "width": 90, "height": 89, "rawWidth": 90, @@ -190,11 +652,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 555, - "trimY": 193, + "trimX": 564, + "trimY": 653, "width": 95, "height": 80, "rawWidth": 95, @@ -215,8 +677,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 554, - "trimY": 290, + "trimX": 578, + "trimY": 556, "width": 80, "height": 95, "rawWidth": 80, @@ -237,8 +699,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 748, - "trimY": 378, + "trimX": 623, + "trimY": 349, "width": 83, "height": 92, "rawWidth": 83, @@ -256,11 +718,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 900, - "trimY": 58, + "trimX": 706, + "trimY": 445, "width": 92, "height": 83, "rawWidth": 92, @@ -278,11 +740,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 259, - "trimY": 0, + "trimX": 144, + "trimY": 195, "width": 112, "height": 45, "rawWidth": 112, @@ -300,11 +762,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 919, - "trimY": 318, + "trimX": 355, + "trimY": 284, "width": 88, "height": 69, "rawWidth": 88, @@ -325,8 +787,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 832, - "trimY": 188, + "trimX": 215, + "trimY": 472, "width": 91, "height": 90, "rawWidth": 91, @@ -344,11 +806,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 62, - "trimY": 248, + "trimX": 116, + "trimY": 0, "width": 120, "height": 93, "rawWidth": 120, @@ -369,8 +831,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 155, - "trimY": 233, + "trimX": 0, + "trimY": 471, "width": 100, "height": 112, "rawWidth": 100, @@ -391,8 +853,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 221, + "trimX": 0, + "trimY": 583, "width": 106, "height": 93, "rawWidth": 106, @@ -410,11 +872,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 340, - "trimY": 108, + "trimX": 336, + "trimY": 112, "width": 106, "height": 79, "rawWidth": 106, @@ -432,11 +894,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 922, - "trimY": 231, + "trimX": 289, + "trimY": 191, "width": 73, "height": 87, "rawWidth": 73, @@ -457,8 +919,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 889, - "trimY": 472, + "trimX": 736, + "trimY": 627, "width": 67, "height": 90, "rawWidth": 67, @@ -476,11 +938,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 433, - "trimY": 0, + "trimX": 170, + "trimY": 675, "width": 58, "height": 97, "rawWidth": 58, @@ -501,8 +963,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 685, - "trimY": 95, + "trimX": 565, + "trimY": 365, "width": 58, "height": 95, "rawWidth": 58, @@ -523,8 +985,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 481, - "trimY": 97, + "trimX": 367, + "trimY": 465, "width": 58, "height": 97, "rawWidth": 58, @@ -542,11 +1004,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 772, - "trimY": 188, + "trimX": 613, + "trimY": 204, "width": 60, "height": 94, "rawWidth": 60, @@ -567,8 +1029,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 491, - "trimY": 0, + "trimX": 375, + "trimY": 562, "width": 58, "height": 97, "rawWidth": 58, @@ -589,8 +1051,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 399, - "trimY": 427, + "trimX": 425, + "trimY": 465, "width": 58, "height": 97, "rawWidth": 58, @@ -608,11 +1070,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 635, - "trimY": 191, + "trimX": 802, + "trimY": 318, "width": 60, "height": 95, "rawWidth": 60, @@ -633,8 +1095,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 818, - "trimY": 94, + "trimX": 877, + "trimY": 533, "width": 60, "height": 94, "rawWidth": 60, @@ -655,8 +1117,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 609, - "trimY": 480, + "trimX": 376, + "trimY": 191, "width": 59, "height": 93, "rawWidth": 59, @@ -674,11 +1136,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 900, - "trimY": 0, + "trimX": 502, + "trimY": 266, "width": 58, "height": 93, "rawWidth": 58, @@ -699,8 +1161,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 668, - "trimY": 480, + "trimX": 443, + "trimY": 266, "width": 59, "height": 93, "rawWidth": 59, @@ -721,8 +1183,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 840, - "trimY": 0, + "trimX": 877, + "trimY": 627, "width": 60, "height": 94, "rawWidth": 60, @@ -743,8 +1205,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 532, - "trimY": 505, + "trimX": 937, + "trimY": 652, "width": 77, "height": 68, "rawWidth": 77, @@ -762,10 +1224,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 64, + "trimX": 355, "trimY": 0, "width": 118, "height": 76, @@ -784,11 +1246,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 267, - "trimY": 442, + "trimX": 707, + "trimY": 213, "width": 104, "height": 65, "rawWidth": 104, @@ -806,11 +1268,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 839, - "trimY": 279, + "trimX": 289, + "trimY": 264, "width": 80, "height": 66, "rawWidth": 80, @@ -831,8 +1293,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 332, - "trimY": 431, + "trimX": 245, + "trimY": 563, "width": 102, "height": 67, "rawWidth": 102, @@ -853,8 +1315,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 839, - "trimY": 345, + "trimX": 937, + "trimY": 365, "width": 79, "height": 66, "rawWidth": 79, @@ -872,10 +1334,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, + "trimX": 711, "trimY": 0, "width": 124, "height": 64, @@ -894,11 +1356,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 324, - "trimY": 327, + "trimX": 811, + "trimY": 254, "width": 104, "height": 64, "rawWidth": 104, @@ -919,8 +1381,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 831, - "trimY": 411, + "trimX": 937, + "trimY": 497, "width": 79, "height": 61, "rawWidth": 79, @@ -938,11 +1400,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 124, + "trimX": 835, + "trimY": 0, "width": 124, "height": 64, "rawWidth": 124, @@ -960,11 +1422,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 366, - "trimY": 0, + "trimX": 814, + "trimY": 187, "width": 106, "height": 67, "rawWidth": 106, @@ -985,8 +1447,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 918, - "trimY": 406, + "trimX": 937, + "trimY": 431, "width": 79, "height": 66, "rawWidth": 79, @@ -1007,8 +1469,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 64, - "trimY": 118, + "trimX": 89, + "trimY": 240, "width": 118, "height": 64, "rawWidth": 118, @@ -1026,11 +1488,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 66, - "trimY": 368, + "trimX": 473, + "trimY": 0, "width": 71, "height": 119, "rawWidth": 71, @@ -1048,11 +1510,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 137, - "trimY": 368, + "trimX": 592, + "trimY": 0, "width": 71, "height": 119, "rawWidth": 71, @@ -1070,11 +1532,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 140, - "trimY": 0, + "trimX": 593, + "trimY": 71, "width": 55, "height": 114, "rawWidth": 55, @@ -1095,8 +1557,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 248, + "trimX": 100, + "trimY": 470, "width": 62, "height": 124, "rawWidth": 62, @@ -1117,8 +1579,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 922, - "trimY": 141, + "trimX": 803, + "trimY": 628, "width": 74, "height": 90, "rawWidth": 74, @@ -1139,8 +1601,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 345, + "trimX": 235, + "trimY": 240, "width": 110, "height": 54, "rawWidth": 110, @@ -1158,11 +1620,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 95, - "trimY": 487, + "trimX": 658, + "trimY": 537, "width": 85, "height": 88, "rawWidth": 85, @@ -1183,8 +1645,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 195, - "trimY": 0, + "trimX": 99, + "trimY": 358, "width": 64, "height": 112, "rawWidth": 64, @@ -1202,11 +1664,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 262, - "trimY": 335, + "trimX": 707, + "trimY": 151, "width": 62, "height": 107, "rawWidth": 62, @@ -1227,8 +1689,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 183, - "trimY": 487, + "trimX": 623, + "trimY": 264, "width": 85, "height": 84, "rawWidth": 85, @@ -1246,11 +1708,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 255, - "trimY": 226, + "trimX": 834, + "trimY": 64, "width": 109, "height": 61, "rawWidth": 109, @@ -1271,8 +1733,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 495, + "trimX": 707, + "trimY": 278, "width": 78, "height": 95, "rawWidth": 78, @@ -1290,11 +1752,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 118, + "trimX": 478, + "trimY": 71, "width": 115, "height": 56, "rawWidth": 115, @@ -1312,11 +1774,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 283, - "trimY": 112, + "trimX": 707, + "trimY": 94, "width": 109, "height": 57, "rawWidth": 109, @@ -1334,11 +1796,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 304, - "trimY": 0, + "trimX": 816, + "trimY": 125, "width": 108, "height": 62, "rawWidth": 108, @@ -1356,11 +1818,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 372, + "trimX": 355, + "trimY": 76, "width": 123, "height": 36, "rawWidth": 123, @@ -1378,11 +1840,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 36, - "trimY": 372, + "trimX": 711, + "trimY": 64, "width": 123, "height": 30, "rawWidth": 123, @@ -1403,8 +1865,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 607, - "trimY": 96, + "trimX": 628, + "trimY": 441, "width": 78, "height": 95, "rawWidth": 78, @@ -1425,8 +1887,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 457, - "trimY": 427, + "trimX": 433, + "trimY": 562, "width": 75, "height": 96, "rawWidth": 75, @@ -1447,8 +1909,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 549, - "trimY": 0, + "trimX": 431, + "trimY": 365, "width": 65, "height": 96, "rawWidth": 65, @@ -1469,8 +1931,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 532, - "trimY": 409, + "trimX": 483, + "trimY": 461, "width": 65, "height": 96, "rawWidth": 65, @@ -1488,11 +1950,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 634, - "trimY": 288, + "trimX": 375, + "trimY": 659, "width": 74, "height": 95, "rawWidth": 74, @@ -1510,11 +1972,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 743, - "trimY": 94, + "trimX": 470, + "trimY": 658, "width": 75, "height": 94, "rawWidth": 75, @@ -1535,8 +1997,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 770, - "trimY": 0, + "trimX": 937, + "trimY": 558, "width": 70, "height": 94, "rawWidth": 70, @@ -1554,11 +2016,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 692, - "trimY": 0, + "trimX": 613, + "trimY": 126, "width": 78, "height": 94, "rawWidth": 78, @@ -1579,8 +2041,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 486, - "trimY": 194, + "trimX": 496, + "trimY": 365, "width": 69, "height": 96, "rawWidth": 69, @@ -1601,8 +2063,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 484, - "trimY": 313, + "trimX": 508, + "trimY": 557, "width": 70, "height": 96, "rawWidth": 70, @@ -1620,11 +2082,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 614, - "trimY": 0, + "trimX": 796, + "trimY": 378, "width": 78, "height": 95, "rawWidth": 78, @@ -1642,11 +2104,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 597, - "trimY": 385, + "trimX": 789, + "trimY": 456, "width": 77, "height": 95, "rawWidth": 77, @@ -1664,11 +2126,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 708, - "trimY": 284, + "trimX": 435, + "trimY": 197, "width": 69, "height": 94, "rawWidth": 69, @@ -1689,8 +2151,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 695, - "trimY": 190, + "trimX": 659, + "trimY": 625, "width": 77, "height": 94, "rawWidth": 77, @@ -1711,8 +2173,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 674, - "trimY": 383, + "trimX": 803, + "trimY": 533, "width": 74, "height": 95, "rawWidth": 74, @@ -1730,11 +2192,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 539, - "trimY": 97, + "trimX": 267, + "trimY": 665, "width": 68, "height": 96, "rawWidth": 68, diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png index 4a3db48cd0f0e6ac106a2832b73a180e8cf6dcea..dc9467c9b141b704893c6ba82cce0081d96f6449 100644 GIT binary patch literal 95461 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 literal 76232 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 M07*qoM6N<$f_Ba+f&c&j diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index b7e54a3..6e24f2a 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -9,10 +9,10 @@ - + - + diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 861ecbe..1e75df0 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -933,7 +933,7 @@ "__id__": 11 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 23 @@ -1034,6 +1034,12 @@ }, { "__uuid__": "7cb4d395-c68f-4643-9e2e-8cb8e200d3a5" + }, + { + "__uuid__": "e6e1d62a-de7d-4fe7-858c-2d2725b7c2e8" + }, + { + "__uuid__": "e8247e2a-1b5b-4618-86f8-224b25246b55" } ], "playOnLoad": false, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 4d432e6..672b997 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -12,6 +12,8 @@ window.ATK_CHARACTER_STATE = { BlownUp1: [8, "BlownUp1"], LayDown1: [9, "LayDown1"], GetUp1: [10, "GetUp1"], + Atk2: [11, "Atk2"], + Atk3: [12, "Atk3"], }; window.ATK_CHARACTER_STATE_ARR = []; diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 61c3de1..9a5dc06 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -586,13 +586,13 @@ cc.Class({ const jsPlayersArr = new Array().fill(null); for (let k in pbRdf.playersArr) { const pbPlayer = pbRdf.playersArr[k]; - const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.inAir, pbPlayer.colliderRadius); + const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = []; for (let k in pbRdf.meleeBullets) { const pbBullet = pbRdf.meleeBullets[k]; - const jsBullet = gopkgs.NewMeleeBulletJs(pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackX, pbBullet.pushbackY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + const jsBullet = gopkgs.NewMeleeBulletJs(pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); jsMeleeBulletsArr.push(jsBullet); } @@ -832,12 +832,17 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu const chConfig = self.chConfigsOrderedByJoinIndex[joinIndex - 1]; playerScriptIns.setSpecies(chConfig.SpeciesName); + if (1 == joinIndex) { + newPlayerNode.color = cc.Color.RED; + } else { + newPlayerNode.color = cc.Color.BLUE; + } + const [wx, wy] = gopkgs.VirtualGridToWorldPos(vx, vy); newPlayerNode.setPosition(wx, wy); playerScriptIns.mapNode = self.node; const colliderRadius = playerDownsyncInfo.ColliderRadius; - const halfColliderWidth = colliderRadius, - halfColliderHeight = colliderRadius + colliderRadius; // avoid multiplying + const [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos(colliderRadius, colliderRadius + colliderRadius); // avoid multiplying const colliderWidth = halfColliderWidth + halfColliderWidth, colliderHeight = halfColliderHeight + halfColliderHeight; // avoid multiplying @@ -846,7 +851,7 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; self.gopkgsCollisionSysMap[collisionPlayerIndex] = newPlayerCollider; - console.log(`Created new player collider: joinIndex=${joinIndex}, colliderRadius=${playerDownsyncInfo.ColliderRadius}`); + console.log(`Created new player collider: joinIndex=${joinIndex}`); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index e8892eb..166ffde 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -123,7 +123,9 @@ cc.Class({ } const p1Vpos = gopkgs.WorldToVirtualGridPos(boundaryObjs.playerStartingPositions[0].x, boundaryObjs.playerStartingPositions[0].y); + const p2Vpos = gopkgs.WorldToVirtualGridPos(boundaryObjs.playerStartingPositions[1].x, boundaryObjs.playerStartingPositions[1].y); const speedV = gopkgs.WorldToVirtualGridPos(1.0, 0); + const colliderRadiusV = gopkgs.WorldToVirtualGridPos(12.0, 0); const startRdf = window.pb.protos.RoomDownsyncFrame.create({ id: window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START, @@ -134,17 +136,32 @@ cc.Class({ virtualGridX: p1Vpos[0], virtualGridY: p1Vpos[1], speed: speedV[0], - colliderRadius: 12, + colliderRadius: colliderRadiusV[0], characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, - dirX: 0, + dirX: +2, + dirY: 0, + velX: 0, + velY: 0, + inAir: true, + }), + window.pb.protos.PlayerDownsync.create({ + id: 11, + joinIndex: 2, + virtualGridX: p2Vpos[0], + virtualGridY: p2Vpos[1], + speed: speedV[0], + colliderRadius: colliderRadiusV[0], + characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], + framesToRecover: 0, + dirX: -2, dirY: 0, velX: 0, velY: 0, inAir: true, }), ], - speciesIdList: [0], + speciesIdList: [0, 0], }); self.selfPlayerInfo = { diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index d93b8ca..e59d3e9 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -7,6 +7,7 @@ import ( const ( MAX_FLOAT64 = 1.7e+308 + MAX_INT32 = int32(999999999) COLLISION_PLAYER_INDEX_PREFIX = (1 << 17) COLLISION_BARRIER_INDEX_PREFIX = (1 << 16) COLLISION_BULLET_INDEX_PREFIX = (1 << 15) @@ -26,6 +27,9 @@ const ( SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) + + NO_SKILL = int32(-1) + NO_SKILL_HIT = int32(-1) ) // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. @@ -53,6 +57,9 @@ const ( ATK_CHARACTER_STATE_BLOWN_UP1 = int32(8) ATK_CHARACTER_STATE_LAY_DOWN1 = int32(9) ATK_CHARACTER_STATE_GET_UP1 = int32(10) + + ATK_CHARACTER_STATE_ATK2 = int32(11) + ATK_CHARACTER_STATE_ATK3 = int32(12) ) var inAirSet = map[int32]bool{ @@ -63,6 +70,22 @@ var inAirSet = map[int32]bool{ ATK_CHARACTER_STATE_BLOWN_UP1: true, } +var noOpSet = map[int32]bool{ + ATK_CHARACTER_STATE_ATKED1: true, + ATK_CHARACTER_STATE_INAIR_ATKED1: true, + ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_LAY_DOWN1: true, + // During the invinsible frames of GET_UP1, the player is allowed to take any action +} + +var invinsibleSet = map[int32]bool{ + ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_LAY_DOWN1: true, + ATK_CHARACTER_STATE_GET_UP1: true, +} + +var nonAttackingSet = map[int32]bool{} + func ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32, inputScaleFrames uint32) int32 { if renderFrameId < inputDelayFrames { return 0 @@ -329,6 +352,10 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 } + if _, existent := noOpSet[currPlayerDownsync.CharacterState]; existent { + return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 + } + delayedInputList := inputsBuffer.GetByFrameId(delayedInputFrameId).(*InputFrameDownsync).InputList var delayedInputListForPrevRdf []uint64 = nil if 0 < delayedInputFrameIdForPrevRdf { @@ -337,11 +364,8 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, jumpedOrNot := false joinIndex := currPlayerDownsync.JoinIndex - if 0 < currPlayerDownsync.FramesToRecover { - return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 - } decodedInput := decodeInput(delayedInputList[joinIndex-1]) - effDx, effDy := decodedInput.Dx, decodedInput.Dy + effDx, effDy := int32(0), int32(0) prevBtnALevel, prevBtnBLevel := int32(0), int32(0) if nil != delayedInputListForPrevRdf { prevDecodedInput := decodeInput(delayedInputListForPrevRdf[joinIndex-1]) @@ -349,20 +373,40 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, prevBtnBLevel = prevDecodedInput.BtnBLevel } - if decodedInput.BtnBLevel > prevBtnBLevel { - if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { - jumpedOrNot = true + if 0 == currPlayerDownsync.FramesToRecover { + // Jumping and moving are only allowed here + effDx, effDy = decodedInput.Dx, decodedInput.Dy + if decodedInput.BtnBLevel > prevBtnBLevel { + if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { + jumpedOrNot = true + } } } + /* + As long as the current "CharacterState" is not in "noOpSet", we have 2 cases where attacking is allowed: + 1. it happens when the player is IDLE or Walking, i.e. "0 == currPlayerDownsync.FramesToRecover", which is just the normal case + 2. it happens when the player is having non-empty "ActiveSkillId" which might be cancellable + */ patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { if currPlayerDownsync.InAir { - patternId = 1 + patternId = 255 } else { - patternId = 0 + patternId = 1 + } + } + + if PATTERN_ID_NO_OP != patternId && 0 < currPlayerDownsync.FramesToRecover { + // [WARN] Handle skill cancellation + patternId = PATTERN_ID_NO_OP // First, reset the patternId to no-op as it should be by default not cancelling anything + skillConfig := skills[int(currPlayerDownsync.ActiveSkillId)] + switch v := skillConfig.Hits[currPlayerDownsync.ActiveSkillHit].(type) { + case *MeleeBullet: + if v.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.CancellableEdFrame { + patternId = int(currPlayerDownsync.ActiveSkillId + 1) // if "currPlayerDownsync.InAir", it won't map to a valid skill in the next step and thus act as PATTERN_ID_NO_OP + } } - effDx, effDy = 0, 0 // Most patterns/skills should not allow simultaneous movement } return patternId, jumpedOrNot, effDx, effDy @@ -394,6 +438,8 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer MaxHp: currPlayerDownsync.MaxHp, FramesToRecover: currPlayerDownsync.FramesToRecover - 1, FramesInChState: currPlayerDownsync.FramesInChState + 1, + ActiveSkillId: currPlayerDownsync.ActiveSkillId, + ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 @@ -411,9 +457,6 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer chConfig := chConfigsOrderedByJoinIndex[i] thatPlayerInNextFrame := nextRenderFramePlayers[i] patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, INPUT_DELAY_FRAMES, INPUT_SCALE_FRAMES) - if PATTERN_ID_UNABLE_TO_OP == patternId { - continue - } if jumpedOrNot { thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) @@ -423,8 +466,13 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if PATTERN_ID_NO_OP != patternId { if skillId, existent := chConfig.PatternIdToSkillId[patternId]; existent { skillConfig := skills[skillId] + thatPlayerInNextFrame.ActiveSkillId = int32(skillId) + thatPlayerInNextFrame.ActiveSkillHit = 0 + + // TODO: Respect non-zero "selfLockVel" + // Hardcoded to use only the first hit for now - switch v := skillConfig.Hits[0].(type) { + switch v := skillConfig.Hits[thatPlayerInNextFrame.ActiveSkillHit].(type) { case *MeleeBullet: var newBullet MeleeBullet = *v // Copied primitive fields into an onstack variable newBullet.OriginatedRenderFrameId = currRenderFrame.Id @@ -432,21 +480,32 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, &newBullet) thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames } - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + + // TODO: How to differentiate skill cancellable among different characters, e.g. some characters might be allowed to have 4-cancellation-combo or more? + switch skillId { + case 1: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + case 2: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK2 + case 3: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK3 + } if false == currPlayerDownsync.InAir { thatPlayerInNextFrame.VelX = 0 } + continue // Don't allow movement if skill is used } - continue } - if 0 != effDx || 0 != effDy { - thatPlayerInNextFrame.DirX, thatPlayerInNextFrame.DirY = effDx, effDy - thatPlayerInNextFrame.VelX = effDx * currPlayerDownsync.Speed - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING - } else { - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 - thatPlayerInNextFrame.VelX = 0 + if 0 == currPlayerDownsync.FramesToRecover { + if 0 != effDx || 0 != effDy { + thatPlayerInNextFrame.DirX, thatPlayerInNextFrame.DirY = effDx, effDy + thatPlayerInNextFrame.VelX = effDx * currPlayerDownsync.Speed + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.VelX = 0 + } } } @@ -597,29 +656,21 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if v.OffenderJoinIndex == t.JoinIndex { continue } + if _, existent := invinsibleSet[t.CharacterState]; existent { + continue + } overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) if !overlapped { continue } - joinIndex := t.JoinIndex xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" if 0 > offender.DirX { xfac = -xfac } - pushbackX, pushbackY := VirtualGridToWorldPos(-xfac*v.PushbackX, v.PushbackY) - - for _, hardPushbackNorm := range *hardPushbackNorms[joinIndex-1] { - projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y - if 0 > projectedMagnitude { - //fmt.Printf("defenderPlayerId=%d, joinIndex=%d reducing bullet pushback={%.3f, %.3f} by {%.3f, %.3f} where hardPushbackNorm={%.3f, %.3f}, projectedMagnitude=%.3f at renderFrame.id=%d", t.Id, joinIndex, pushbackX, pushbackY, projectedMagnitude*hardPushbackNorm.X, projectedMagnitude*hardPushbackNorm.Y, hardPushbackNorm.X, hardPushbackNorm.Y, projectedMagnitude, currRenderFrame.Id) - pushbackX -= projectedMagnitude * hardPushbackNorm.X - pushbackY -= projectedMagnitude * hardPushbackNorm.Y - } - } - - effPushbacks[joinIndex-1].X += pushbackX - effPushbacks[joinIndex-1].Y += pushbackY + pushbackVelX, pushbackVelY := xfac*v.PushbackVelX, v.PushbackVelY atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] + atkedPlayerInNextFrame.VelX = pushbackVelX + atkedPlayerInNextFrame.VelY = pushbackVelY if v.BlowUp { atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_BLOWN_UP1 } else { @@ -656,13 +707,22 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } case ATK_CHARACTER_STATE_ATK1: thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1 + // No inAir transition for ATK2/ATK3 for now case ATK_CHARACTER_STATE_ATKED1: thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1 } } + + // Reset "FramesInChState" if "CharacterState" is changed if thatPlayerInNextFrame.CharacterState != currPlayerDownsync.CharacterState { thatPlayerInNextFrame.FramesInChState = 0 } + + // Remove any active skill if not attacking + if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { + thatPlayerInNextFrame.ActiveSkillId = NO_SKILL + thatPlayerInNextFrame.ActiveSkillHit = NO_SKILL_HIT + } } return &RoomDownsyncFrame{ diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index b90ca92..4c30c39 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -35,37 +35,91 @@ var Characters = map[int]*CharacterConfig{ JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), PatternIdToSkillId: map[int]int{ - 0: 1, // Atk1 - 1: 2, // InAirAtk1 + 1: 1, // Atk1 + 2: 2, // Atk2 + 3: 3, // Atk3 + 255: 255, // InAirAtk1 }, }, } var skills = map[int]*Skill{ 1: &Skill{ - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), + RecoveryFrames: int32(20), + RecoveryFramesOnBlock: int32(20), + RecoveryFramesOnHit: int32(20), ReleaseTriggerType: int32(1), Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ - StartupFrames: int32(5), - ActiveFrames: int32(10), - HitStunFrames: int32(18), - BlockStunFrames: int32(9), - Damage: int32(5), - PushbackX: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackY: int32(0), - HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), - HitboxOffsetY: int32(0), - HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), - HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + StartupFrames: int32(5), + ActiveFrames: int32(10), + HitStunFrames: int32(13), + BlockStunFrames: int32(9), + Damage: int32(5), + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(8), + CancellableEdFrame: int32(20), + // TODO: Use non-zero "selfLockVel" }, }, }, }, 2: &Skill{ + RecoveryFrames: int32(36), + RecoveryFramesOnBlock: int32(36), + RecoveryFramesOnHit: int32(36), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(20), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(18) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(18), + CancellableEdFrame: int32(36), + }, + }, + }, + }, + 3: &Skill{ + RecoveryFrames: int32(60), + RecoveryFramesOnBlock: int32(60), + RecoveryFramesOnHit: int32(60), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(1), + ActiveFrames: int32(30), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + PushbackVelX: int32(float64(1) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(4) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + BlowUp: true, + }, + }, + }, + }, + 255: &Skill{ RecoveryFrames: int32(34), RecoveryFramesOnBlock: int32(34), RecoveryFramesOnHit: int32(34), @@ -78,8 +132,8 @@ var skills = map[int]*Skill{ HitStunFrames: int32(18), BlockStunFrames: int32(9), Damage: int32(5), - PushbackX: int32(float64(6) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackY: int32(0), + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxOffsetY: int32(0), HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 76e2057..f411c0e 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -23,7 +23,7 @@ type PlayerDownsync struct { Speed int32 BattleState int32 JoinIndex int32 - ColliderRadius float64 + ColliderRadius int32 Removed bool Score int32 LastMoveGmtMillis int32 @@ -33,6 +33,9 @@ type PlayerDownsync struct { MaxHp int32 CharacterState int32 InAir bool + + ActiveSkillId int32 + ActiveSkillHit int32 } type InputFrameDecoded struct { @@ -63,8 +66,8 @@ type Bullet struct { // for defender HitStunFrames int32 BlockStunFrames int32 - PushbackX int32 - PushbackY int32 + PushbackVelX int32 + PushbackVelY int32 Damage int32 SelfLockVelX int32 diff --git a/jsexport/main.go b/jsexport/main.go index cc9d9da..3cc8ceb 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp int32, inAir bool, colliderRadius float64) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { return js.MakeWrapper(&PlayerDownsync{ Id: id, VirtualGridX: virtualGridX, @@ -64,7 +64,7 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, }) } -func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackX, pushbackY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *js.Object { +func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *js.Object { return js.MakeWrapper(&MeleeBullet{ Bullet: Bullet{ OriginatedRenderFrameId: originatedRenderFrameId, @@ -77,8 +77,8 @@ func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, HitStunFrames: hitStunFrames, BlockStunFrames: blockStunFrames, - PushbackX: pushbackX, - PushbackY: pushbackY, + PushbackVelX: pushbackVelX, + PushbackVelY: pushbackVelY, Damage: damage, SelfLockVelX: selfLockVelX,