Created
June 14, 2010 18:30
-
-
Save banthar/438067 to your computer and use it in GitHub Desktop.
hell tetris
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name XKCD Hell playable game | |
| // @namespace http://example.com/ | |
| // @description Turns XKCD comic #724 into playable game | |
| // @include http://xkcd.com/724/ | |
| // @version 1.0 | |
| // ==/UserScript== | |
| /* | |
| * Physaxe (http://code.google.com/p/physaxe/) copyright notice: | |
| * | |
| * Copyright (c) 2008, Nicolas Cannasse | |
| * All rights reserved. | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * - Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY | |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR | |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | |
| * DAMAGE. | |
| */ | |
| /* | |
| * HaXe (http://haxe.org/) copyright notice: | |
| * | |
| * Copyright (c) 2005, The haXe Project Contributors | |
| * All rights reserved. | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * - Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY | |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR | |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | |
| * DAMAGE. | |
| */ | |
| /* | |
| This script contains bits from Plotex (http://code.google.com/p/plotex/) Licensed under New BSD License. | |
| */ | |
| var images=document.images; | |
| for(var i in images) | |
| { | |
| if(images[i].src == "http://imgs.xkcd.com/comics/hell.png") | |
| { | |
| var image=images[i]; | |
| var parent=image.parentNode; | |
| var canvas=document.createElement("CANVAS"); | |
| canvas.width=417; | |
| canvas.height=476; | |
| canvas.id="hellCanvas"; | |
| canvas.title="Use WSAD"; | |
| image.parentNode.replaceChild(canvas,image); | |
| } | |
| } | |
| hellBackground=document.createElement("IMG"); | |
| hellBackground.src="data:image/gif;base64,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\ | |
| P+B8WbiyyBBR7EGUeapFJ+Nzzfm9zmTvyYJHGXzyySdmflnMS5cudadNm2ao7J9++mn3gQcecEeN\ | |
| GuU+8sgj7gsvvGAW58MPP2z+fv75591x48a506dPd8ePH+9OmTLFfeedd9yJEye6kydPdqdOnWqO\ | |
| 4ZyRI0eaXi1PPPGEO2HCBPP/p556yn3ooYfcIUOGuL1793avvvpqd+DAge6gQYPcm266ycidd97p\ | |
| Pvjgg+59991nxrj55pvd66+/3h02bJgZV65hzpw57ooVK9zFixebn6tWrXKXLVvmfvDBB+Y6+J98\ | |
| Rr4LzD3zw2fPxIij7Pm8tJjhfvD5X3nlFfN5+N8zzzzj3nbbbe4NN9zg3nXXXeaar7zySvfaa681\ | |
| vyM33nijO3jwYPeaa65x77//fnOdH3/8sfmeimHYvHmzEb6zfPf5v/87xefgbzEaiBzL+mTd8TkZ\ | |
| k3XD7/IAhwJHuHfMOfdr+fLl5jvAtXDvGGPlypXuRx995L766qtG+KzMI9+PJ5980nxHED4335XZ\ | |
| s2e7S5YscSdNmmTu0cKFC93169ebOVizZo3RA1wHv/N5MepcJ69/+OGH5rxnn33WvNfo0aPd22+/\ | |
| 3b344ovdM844w+3Tp49537feesvMO9/jImOEuFBuPF9AebL0PxEX1lNvFIwKXwCeSFCifKGDKk6+\ | |
| 1HyB1q5da75AfKEZB2HhcJ8RfmdRyJMeio97z5f+7bffNl82vsx8iVE4LM4rrrjCPfPMM90TTjjB\ | |
| bdCggdu0aVP32GOPdStWrGjk0EMPdc866yy3S5cubseOHd0jjzzSrV27tnvaaae5rVu3dk899VS3\ | |
| efPmbsOGDd099tjDfIdKlizp7rXXXu5+++3nHnTQQe4hhxxipFGjRu7xxx9v3uvEE090jz76aCNt\ | |
| 2rQxX/7u3bu7/fv3N9eFErz11lvN9aJMWayycLkH69atM4uL7xvfK5QxCubuu+82X2yUN4sIZcXf\ | |
| L7/8sllQr7/+ummmhdK97LLL3G7durnnnXeee9RRR7lVqlRx69WrZ/6Hgr7gggvMZ+baaL7Vo0cP\ | |
| 83+UPOdzfSjpc8891xyLYkfRXXLJJeZ/jFmtWjVzL0qXLh3Lbpl8d3hQ4Ak9rBIDY8aMydq1MS/M\ | |
| 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\ | |
| 439tAu3bSuoxCQAAAABJRU5ErkJggg=="; | |
| $estr = function() { return js.Boot.__string_rec(this,''); } | |
| StringTools = function() { } | |
| StringTools.__name__ = ["StringTools"]; | |
| StringTools.urlEncode = function(s) { | |
| return encodeURIComponent(s); | |
| } | |
| StringTools.urlDecode = function(s) { | |
| return decodeURIComponent(s.split("+").join(" ")); | |
| } | |
| StringTools.htmlEscape = function(s) { | |
| return s.split("&").join("&").split("<").join("<").split(">").join(">"); | |
| } | |
| StringTools.htmlUnescape = function(s) { | |
| return s.split(">").join(">").split("<").join("<").split("&").join("&"); | |
| } | |
| StringTools.startsWith = function(s,start) { | |
| return (s.length >= start.length && s.substr(0,start.length) == start); | |
| } | |
| StringTools.endsWith = function(s,end) { | |
| var elen = end.length; | |
| var slen = s.length; | |
| return (slen >= elen && s.substr(slen - elen,elen) == end); | |
| } | |
| StringTools.isSpace = function(s,pos) { | |
| var c = s.charCodeAt(pos); | |
| return (c >= 9 && c <= 13) || c == 32; | |
| } | |
| StringTools.ltrim = function(s) { | |
| var l = s.length; | |
| var r = 0; | |
| while(r < l && StringTools.isSpace(s,r)) { | |
| r++; | |
| } | |
| if(r > 0) return s.substr(r,l - r); | |
| else return s; | |
| } | |
| StringTools.rtrim = function(s) { | |
| var l = s.length; | |
| var r = 0; | |
| while(r < l && StringTools.isSpace(s,(l - r) - 1)) { | |
| r++; | |
| } | |
| if(r > 0) { | |
| return s.substr(0,l - r); | |
| } | |
| else { | |
| return s; | |
| } | |
| } | |
| StringTools.trim = function(s) { | |
| return StringTools.ltrim(StringTools.rtrim(s)); | |
| } | |
| StringTools.rpad = function(s,c,l) { | |
| var sl = s.length; | |
| var cl = c.length; | |
| while(sl < l) { | |
| if(l - sl < cl) { | |
| s += c.substr(0,l - sl); | |
| sl = l; | |
| } | |
| else { | |
| s += c; | |
| sl += cl; | |
| } | |
| } | |
| return s; | |
| } | |
| StringTools.lpad = function(s,c,l) { | |
| var ns = ""; | |
| var sl = s.length; | |
| if(sl >= l) return s; | |
| var cl = c.length; | |
| while(sl < l) { | |
| if(l - sl < cl) { | |
| ns += c.substr(0,l - sl); | |
| sl = l; | |
| } | |
| else { | |
| ns += c; | |
| sl += cl; | |
| } | |
| } | |
| return ns + s; | |
| } | |
| StringTools.replace = function(s,sub,by) { | |
| return s.split(sub).join(by); | |
| } | |
| StringTools.hex = function(n,digits) { | |
| var neg = false; | |
| if(n < 0) { | |
| neg = true; | |
| n = -n; | |
| } | |
| var s = n.toString(16); | |
| s = s.toUpperCase(); | |
| if(digits != null) while(s.length < digits) s = "0" + s; | |
| if(neg) s = "-" + s; | |
| return s; | |
| } | |
| StringTools.prototype.__class__ = StringTools; | |
| if(typeof phx=='undefined') phx = {} | |
| phx.Allocator = function(p) { if( p === $_ ) return; { | |
| null; | |
| }} | |
| phx.Allocator.__name__ = ["phx","Allocator"]; | |
| phx.Allocator.prototype.allocArbiter = function() { | |
| return new phx.Arbiter(this); | |
| } | |
| phx.Allocator.prototype.allocContact = function() { | |
| var c = this.contactPool; | |
| if(c == null) return new phx.Contact(); | |
| else { | |
| this.contactPool = c.next; | |
| return c; | |
| } | |
| } | |
| phx.Allocator.prototype.allocIsland = function(w) { | |
| var i = this.islandPool; | |
| if(i == null) return new phx.Island(w); | |
| else { | |
| this.islandPool = i.allocNext; | |
| return i; | |
| } | |
| } | |
| phx.Allocator.prototype.contactPool = null; | |
| phx.Allocator.prototype.freeAllContacts = function(c) { | |
| while(c != null) { | |
| var next = c.next; | |
| c.next = this.contactPool; | |
| this.contactPool = c; | |
| c = next; | |
| } | |
| } | |
| phx.Allocator.prototype.freeArbiter = function(a) { | |
| null; | |
| } | |
| phx.Allocator.prototype.freeContact = function(c) { | |
| c.next = this.contactPool; | |
| this.contactPool = c; | |
| } | |
| phx.Allocator.prototype.freeIsland = function(i) { | |
| i.bodies.head = null; | |
| i.arbiters.head = null; | |
| i.joints.head = null; | |
| i.sleeping = false; | |
| i.allocNext = this.islandPool; | |
| this.islandPool = i; | |
| } | |
| phx.Allocator.prototype.islandPool = null; | |
| phx.Allocator.prototype.__class__ = phx.Allocator; | |
| phx.Shape = function(type,material) { if( type === $_ ) return; { | |
| this.id = phx.Shape.ID++; | |
| this.groups = 1; | |
| this.type = type; | |
| this.material = ((material == null)?phx.Const.DEFAULT_MATERIAL:material); | |
| this.area = 0; | |
| this.aabb = new phx.col.AABB(0,0,0,0); | |
| }} | |
| phx.Shape.__name__ = ["phx","Shape"]; | |
| phx.Shape.makeBox = function(width,height,px,py,mat) { | |
| if(px == null) px = -width / 2; | |
| if(py == null) py = -height / 2; | |
| return new phx.Polygon([new phx.Vector(0,0),new phx.Vector(0,height),new phx.Vector(width,height),new phx.Vector(width,0)],new phx.Vector(px,py),mat); | |
| } | |
| phx.Shape.prototype.aabb = null; | |
| phx.Shape.prototype.area = null; | |
| phx.Shape.prototype.body = null; | |
| phx.Shape.prototype.calculateInertia = function() { | |
| return 1.; | |
| } | |
| phx.Shape.prototype.circle = null; | |
| phx.Shape.prototype.groups = null; | |
| phx.Shape.prototype.id = null; | |
| phx.Shape.prototype.material = null; | |
| phx.Shape.prototype.offset = null; | |
| phx.Shape.prototype.polygon = null; | |
| phx.Shape.prototype.segment = null; | |
| phx.Shape.prototype.toString = function() { | |
| return "Shape#" + this.id; | |
| } | |
| phx.Shape.prototype.type = null; | |
| phx.Shape.prototype.update = function() { | |
| null; | |
| } | |
| phx.Shape.prototype.__class__ = phx.Shape; | |
| phx.Circle = function(radius,offset,material) { if( radius === $_ ) return; { | |
| phx.Shape.apply(this,[0,material]); | |
| this.circle = this; | |
| this.offset = new phx.Vector(offset.x,offset.y); | |
| this.c = new phx.Vector(offset.x,offset.y); | |
| this.r = radius; | |
| this.area = Math.PI * (this.r * this.r); | |
| this.tC = this.c.clone(); | |
| }} | |
| phx.Circle.__name__ = ["phx","Circle"]; | |
| phx.Circle.__super__ = phx.Shape; | |
| for(var k in phx.Shape.prototype ) phx.Circle.prototype[k] = phx.Shape.prototype[k]; | |
| phx.Circle.prototype.c = null; | |
| phx.Circle.prototype.calculateInertia = function() { | |
| return 0.5 * (this.r * this.r) + this.offset.dot(this.offset); | |
| } | |
| phx.Circle.prototype.r = null; | |
| phx.Circle.prototype.tC = null; | |
| phx.Circle.prototype.update = function() { | |
| this.tC.x = this.body.x + phx.Const.XROT(this.c,this.body); | |
| this.tC.y = this.body.y + phx.Const.YROT(this.c,this.body); | |
| this.aabb.l = this.tC.x - this.r; | |
| this.aabb.r = this.tC.x + this.r; | |
| this.aabb.t = this.tC.y - this.r; | |
| this.aabb.b = this.tC.y + this.r; | |
| } | |
| phx.Circle.prototype.__class__ = phx.Circle; | |
| Block = function(x,y,a,squares,color) { if( x === $_ ) return; { | |
| var center = new phx.Vector(0.0,0.0); | |
| { | |
| var _g = 0; | |
| while(_g < squares.length) { | |
| var s = squares[_g]; | |
| ++_g; | |
| center = new phx.Vector(center.x + s.x,center.y + s.y); | |
| } | |
| } | |
| center = center.mult(1.0 / squares.length); | |
| this.squares = []; | |
| { | |
| var _g = 0; | |
| while(_g < squares.length) { | |
| var s = squares[_g]; | |
| ++_g; | |
| this.squares.push(new phx.Vector(s.x - center.x,s.y - center.y)); | |
| } | |
| } | |
| squares = this.squares; | |
| this.color = color; | |
| this.speed = new phx.Vector(0.0,0.0); | |
| this.setSpeed(0.0,0.0); | |
| this.body = new phx.Body((x + center.x * Math.cos(a)) + center.y * Math.sin(a),(y + center.x * Math.sin(a)) + center.y * Math.cos(a)); | |
| this.body.a = a; | |
| { | |
| var _g = 0; | |
| while(_g < squares.length) { | |
| var t = squares[_g]; | |
| ++_g; | |
| this.body.addShape(phx.Shape.makeBox(28,28,(t.x - 13) - 1,(t.y - 13) - 1,new phx.Material(0.0,1.0,10.0))); | |
| } | |
| } | |
| this.updatePosition(); | |
| }} | |
| Block.__name__ = ["Block"]; | |
| Block.randomBlock = function(x,y) { | |
| var types = [[new phx.Vector(0,0),new phx.Vector(1,0),new phx.Vector(0,1),new phx.Vector(1,1)],[new phx.Vector(0,0),new phx.Vector(0,1),new phx.Vector(0,2),new phx.Vector(0,3)],[new phx.Vector(0,0),new phx.Vector(0,1),new phx.Vector(0,2),new phx.Vector(1,2)],[new phx.Vector(1,0),new phx.Vector(1,1),new phx.Vector(1,2),new phx.Vector(0,2)],[new phx.Vector(0,0),new phx.Vector(0,1),new phx.Vector(1,1),new phx.Vector(1,2)],[new phx.Vector(1,0),new phx.Vector(1,1),new phx.Vector(0,1),new phx.Vector(0,2)],[new phx.Vector(1,0),new phx.Vector(1,1),new phx.Vector(0,1),new phx.Vector(1,2)]]; | |
| var colors = [2040967,9276813,3903266,11677345,8881183,2066305,9708066]; | |
| var type = Std["int"]((types.length) * Math.random()); | |
| var squares = []; | |
| { | |
| var _g = 0, _g1 = types[type]; | |
| while(_g < _g1.length) { | |
| var s = _g1[_g]; | |
| ++_g; | |
| squares.push(new phx.Vector(s.x * 26.0,s.y * 26.0)); | |
| } | |
| } | |
| return new Block(x,y,0,squares,colors[type]); | |
| } | |
| Block.prototype.body = null; | |
| Block.prototype.color = null; | |
| Block.prototype.draw = function(graphics) { | |
| graphics.save(); | |
| graphics.translate(this.x,this.y); | |
| graphics.rotate(this.body.a); | |
| graphics.fillStyle = "#000000"; | |
| { | |
| var _g = 0, _g1 = this.squares; | |
| while(_g < _g1.length) { | |
| var t = _g1[_g]; | |
| ++_g; | |
| graphics.fillRect((t.x - 13) - 2,(t.y - 13) - 2,30,30); | |
| } | |
| } | |
| graphics.fillStyle = "#" + StringTools.hex(this.color,6); | |
| { | |
| var _g = 0, _g1 = this.squares; | |
| while(_g < _g1.length) { | |
| var t = _g1[_g]; | |
| ++_g; | |
| graphics.fillRect((t.x - 13) - 0.5,(t.y - 13) - 0.5,27,27); | |
| } | |
| } | |
| graphics.restore(); | |
| } | |
| Block.prototype.removeSquare = function(square) { | |
| { | |
| var _g1 = 0, _g = this.squares.length; | |
| while(_g1 < _g) { | |
| var i = _g1++; | |
| if(this.squares[i] == square) { | |
| this.squares[i] = null; | |
| return; | |
| } | |
| } | |
| } | |
| throw "no such square"; | |
| } | |
| Block.prototype.rotate = function(radians) { | |
| this.body.a += radians; | |
| if(this.body.island != null) this.body.island.sleeping = false; | |
| this.updatePosition(); | |
| } | |
| Block.prototype.setSpeed = function(x,y) { | |
| var s = 100.0; | |
| if(x != null) { | |
| this.speed.x = x * s; | |
| } | |
| if(y != null) { | |
| this.speed.y = (y * 2.0 + 0.5) * s; | |
| } | |
| } | |
| Block.prototype.speed = null; | |
| Block.prototype.squares = null; | |
| Block.prototype.tick = function() { | |
| if(this.body.island == null || !this.body.island.sleeping) { | |
| this.updatePosition(); | |
| } | |
| } | |
| Block.prototype.updatePosition = function() { | |
| this.x = this.body.x; | |
| this.y = this.body.y; | |
| } | |
| Block.prototype.updateStructure = function() { | |
| var new_blocks = []; | |
| var new_squares = null; | |
| this.squares.push(null); | |
| { | |
| var _g = 0, _g1 = this.squares; | |
| while(_g < _g1.length) { | |
| var s = _g1[_g]; | |
| ++_g; | |
| if(s == null) { | |
| if(new_squares != null) { | |
| var block = new Block(this.body.x,this.body.y,this.body.a,new_squares,this.color); | |
| new_blocks.push(block); | |
| new_squares = null; | |
| } | |
| } | |
| else { | |
| if(new_squares == null) new_squares = []; | |
| new_squares.push(s); | |
| } | |
| } | |
| } | |
| return new_blocks; | |
| } | |
| Block.prototype.x = null; | |
| Block.prototype.y = null; | |
| Block.prototype.__class__ = Block; | |
| phx.Body = function(x,y,props) { if( x === $_ ) return; { | |
| this.id = phx.Body.ID++; | |
| this.properties = (props == null?phx.Const.DEFAULT_PROPERTIES:props); | |
| this.x = x; | |
| this.y = y; | |
| this.v = new phx.Vector(0,0); | |
| this.f = new phx.Vector(0,0); | |
| this.v_bias = new phx.Vector(0,0); | |
| this.a = this.w = this.t = this.w_bias = 0; | |
| this.rcos = 1; | |
| this.rsin = 0; | |
| this.shapes = new haxe.FastList(); | |
| this.arbiters = new haxe.FastList(); | |
| }} | |
| phx.Body.__name__ = ["phx","Body"]; | |
| phx.Body.prototype.a = null; | |
| phx.Body.prototype.addShape = function(s) { | |
| this.shapes.add(s); | |
| s.body = this; | |
| } | |
| phx.Body.prototype.arbiters = null; | |
| phx.Body.prototype.f = null; | |
| phx.Body.prototype.id = null; | |
| phx.Body.prototype.inertia = null; | |
| phx.Body.prototype.invInertia = null; | |
| phx.Body.prototype.invMass = null; | |
| phx.Body.prototype.isStatic = null; | |
| phx.Body.prototype.island = null; | |
| phx.Body.prototype.mass = null; | |
| phx.Body.prototype.motion = null; | |
| phx.Body.prototype.onDestroy = function() { | |
| null; | |
| } | |
| phx.Body.prototype.preventRotation = function() { | |
| this.inertia = Math.POSITIVE_INFINITY; | |
| this.invInertia = 0; | |
| } | |
| phx.Body.prototype.properties = null; | |
| phx.Body.prototype.rcos = null; | |
| phx.Body.prototype.removeShape = function(s) { | |
| this.shapes.remove(s); | |
| s.body = null; | |
| } | |
| phx.Body.prototype.rsin = null; | |
| phx.Body.prototype.set = function(pos,a,v,w) { | |
| if(pos != null) { | |
| this.x = pos.x; | |
| this.y = pos.y; | |
| } | |
| if(a != null) this.setAngle(a); | |
| if(v != null) { | |
| this.v.x = v.x; | |
| this.v.y = v.y; | |
| } | |
| if(w != null) this.w = w; | |
| } | |
| phx.Body.prototype.setAngle = function(a) { | |
| this.a = a; | |
| this.rcos = Math.cos(a); | |
| this.rsin = Math.sin(a); | |
| } | |
| phx.Body.prototype.setPos = function(x,y,a) { | |
| this.x = x; | |
| this.y = y; | |
| if(a != null) this.setAngle(a); | |
| } | |
| phx.Body.prototype.setSpeed = function(vx,vy,w) { | |
| this.v.x = vx; | |
| this.v.y = vy; | |
| if(w != null) this.w = w; | |
| } | |
| phx.Body.prototype.shapes = null; | |
| phx.Body.prototype.t = null; | |
| phx.Body.prototype.toString = function() { | |
| return "Body#" + this.id; | |
| } | |
| phx.Body.prototype.updatePhysics = function() { | |
| var m = 0.; | |
| var i = 0.; | |
| { var $it0 = this.shapes.iterator(); | |
| while( $it0.hasNext() ) { var s = $it0.next(); | |
| { | |
| var sm = s.area * s.material.density; | |
| m += sm; | |
| i += s.calculateInertia() * sm; | |
| } | |
| }} | |
| if(m > 0) { | |
| this.mass = m; | |
| this.invMass = 1 / m; | |
| } | |
| else { | |
| this.mass = Math.POSITIVE_INFINITY; | |
| this.invMass = 0; | |
| this.isStatic = true; | |
| } | |
| if(i > 0) { | |
| this.inertia = i; | |
| this.invInertia = 1 / i; | |
| } | |
| else { | |
| this.inertia = Math.POSITIVE_INFINITY; | |
| this.invInertia = 0; | |
| } | |
| } | |
| phx.Body.prototype.userData = null; | |
| phx.Body.prototype.v = null; | |
| phx.Body.prototype.v_bias = null; | |
| phx.Body.prototype.w = null; | |
| phx.Body.prototype.w_bias = null; | |
| phx.Body.prototype.x = null; | |
| phx.Body.prototype.y = null; | |
| phx.Body.prototype.__class__ = phx.Body; | |
| if(!phx.col) phx.col = {} | |
| phx.col.BroadCallback = function() { } | |
| phx.col.BroadCallback.__name__ = ["phx","col","BroadCallback"]; | |
| phx.col.BroadCallback.prototype.onCollide = null; | |
| phx.col.BroadCallback.prototype.__class__ = phx.col.BroadCallback; | |
| phx.col.BroadPhase = function() { } | |
| phx.col.BroadPhase.__name__ = ["phx","col","BroadPhase"]; | |
| phx.col.BroadPhase.prototype.addShape = null; | |
| phx.col.BroadPhase.prototype.collide = null; | |
| phx.col.BroadPhase.prototype.commit = null; | |
| phx.col.BroadPhase.prototype.init = null; | |
| phx.col.BroadPhase.prototype.pick = null; | |
| phx.col.BroadPhase.prototype.removeShape = null; | |
| phx.col.BroadPhase.prototype.syncShape = null; | |
| phx.col.BroadPhase.prototype.validate = null; | |
| phx.col.BroadPhase.prototype.__class__ = phx.col.BroadPhase; | |
| phx.Vector = function(px,py) { if( px === $_ ) return; { | |
| this.x = px; | |
| this.y = py; | |
| }} | |
| phx.Vector.__name__ = ["phx","Vector"]; | |
| phx.Vector.normal = function(x,y) { | |
| var d = Math.sqrt(x * x + y * y); | |
| var k = (d < 1e-99?0:1 / d); | |
| return new phx.Vector(-y * k,x * k); | |
| } | |
| phx.Vector.prototype.clone = function() { | |
| return new phx.Vector(this.x,this.y); | |
| } | |
| phx.Vector.prototype.cross = function(v) { | |
| return this.x * v.y - this.y * v.x; | |
| } | |
| phx.Vector.prototype.dot = function(v) { | |
| return this.x * v.x + this.y * v.y; | |
| } | |
| phx.Vector.prototype.length = function() { | |
| return Math.sqrt(this.x * this.x + this.y * this.y); | |
| } | |
| phx.Vector.prototype.minus = function(v) { | |
| return new phx.Vector(this.x - v.x,this.y - v.y); | |
| } | |
| phx.Vector.prototype.mult = function(s) { | |
| return new phx.Vector(this.x * s,this.y * s); | |
| } | |
| phx.Vector.prototype.next = null; | |
| phx.Vector.prototype.plus = function(v) { | |
| return new phx.Vector(this.x + v.x,this.y + v.y); | |
| } | |
| phx.Vector.prototype.set = function(px,py) { | |
| this.x = px; | |
| this.y = py; | |
| } | |
| phx.Vector.prototype.toString = function() { | |
| return ((("(" + (Math.round(this.x * 100) / 100)) + ",") + (Math.round(this.y * 100) / 100)) + ")"; | |
| } | |
| phx.Vector.prototype.x = null; | |
| phx.Vector.prototype.y = null; | |
| phx.Vector.prototype.__class__ = phx.Vector; | |
| StringBuf = function(p) { if( p === $_ ) return; { | |
| this.b = new Array(); | |
| }} | |
| StringBuf.__name__ = ["StringBuf"]; | |
| StringBuf.prototype.add = function(x) { | |
| this.b[this.b.length] = x; | |
| } | |
| StringBuf.prototype.addChar = function(c) { | |
| this.b[this.b.length] = String.fromCharCode(c); | |
| } | |
| StringBuf.prototype.addSub = function(s,pos,len) { | |
| this.b[this.b.length] = s.substr(pos,len); | |
| } | |
| StringBuf.prototype.b = null; | |
| StringBuf.prototype.toString = function() { | |
| return this.b.join(""); | |
| } | |
| StringBuf.prototype.__class__ = StringBuf; | |
| Board = function(p) { if( p === $_ ) return; { | |
| this.background = hellBackground; | |
| this.blocks_dropped = 0; | |
| this.lines_cleared = 0; | |
| this.level = 1; | |
| this.time_to_next_block = 0.0; | |
| this.w = 260; | |
| this.h = 410; | |
| this.blocks = []; | |
| this.world = new phx.World(new phx.col.AABB(-100,-100,this.w + 10,this.h + 10),new phx.col.SortedList()); | |
| this.world.gravity = new phx.Vector(0,100.0); | |
| this.world.addStaticShape(phx.Shape.makeBox(this.w,10,0,this.h)); | |
| this.borders = [phx.Shape.makeBox(10,this.h + 100,-10,-100),phx.Shape.makeBox(10,this.h + 100,this.w,-100)]; | |
| this.world.addStaticShape(this.borders[0]); | |
| this.world.addStaticShape(this.borders[1]); | |
| var c = 50; | |
| { | |
| var _g = 0; | |
| while(_g < c) { | |
| var x = _g++; | |
| var t = (((x - 1.0 / c) + 0.6) / c) * 2.0 - 1.0; | |
| var y = ((1.0 - Math.sqrt(1 - t * t)) * this.w) / 2.0; | |
| this.world.addStaticShape(phx.Shape.makeBox(this.w / c,y,(x / c) * this.w - (this.w / c) / 2.0,this.h - y,new phx.Material(0.0,1.0,0.0))); | |
| } | |
| } | |
| this.newBlock(); | |
| }} | |
| Board.__name__ = ["Board"]; | |
| Board.prototype.addBlock = function(block) { | |
| this.world.addBody(block.body); | |
| this.blocks.push(block); | |
| } | |
| Board.prototype.background = null; | |
| Board.prototype.blocks = null; | |
| Board.prototype.blocks_dropped = null; | |
| Board.prototype.borders = null; | |
| Board.prototype.checkAndClear = function() { | |
| var boxes = []; | |
| { | |
| var _g = 0, _g1 = this.blocks; | |
| while(_g < _g1.length) { | |
| var block = _g1[_g]; | |
| ++_g; | |
| var body = block.body; | |
| var a = (body.a * 2.0) / Math.PI; | |
| if(Math.abs(a - Math.round(a)) < 0.1) { | |
| { | |
| var _g2 = 0, _g3 = block.squares; | |
| while(_g2 < _g3.length) { | |
| var s = _g3[_g2]; | |
| ++_g2; | |
| var y = s.y * body.rsin + body.y; | |
| boxes.push(new Box(block,s)); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| boxes.sort($closure(Box,"compareY")); | |
| { | |
| var _g1 = 8, _g = boxes.length; | |
| while(_g1 < _g) { | |
| var i = _g1++; | |
| if(boxes[i].y - boxes[i - 8].y < 15) { | |
| { | |
| var _g3 = i - 8, _g2 = (i + 1); | |
| while(_g3 < _g2) { | |
| var j = _g3++; | |
| boxes[j].block.removeSquare(boxes[j].square); | |
| } | |
| } | |
| { | |
| var _g3 = i - 8, _g2 = (i + 1); | |
| while(_g3 < _g2) { | |
| var j = _g3++; | |
| } | |
| } | |
| this.lines_cleared++; | |
| return true; | |
| } | |
| } | |
| } | |
| return false; | |
| } | |
| Board.prototype.current_block = null; | |
| Board.prototype.draw = function(graphics) { | |
| graphics.clearRect(0,0,417,476); | |
| graphics.save(); | |
| graphics.translate(19,18); | |
| { | |
| var _g = 0, _g1 = this.blocks; | |
| while(_g < _g1.length) { | |
| var block = _g1[_g]; | |
| ++_g; | |
| block.draw(graphics); | |
| } | |
| } | |
| graphics.translate(325,87); | |
| graphics.scale(0.75,0.75); | |
| this.next_block.x = 0; | |
| this.next_block.y = 0; | |
| this.next_block.draw(graphics); | |
| graphics.restore(); | |
| graphics.drawImage(this.background,0,0); | |
| } | |
| Board.prototype.h = null; | |
| Board.prototype.level = null; | |
| Board.prototype.lines_cleared = null; | |
| Board.prototype.newBlock = function() { | |
| if(this.next_block == null) this.next_block = Block.randomBlock(this.w / 2.0,-65.); | |
| if(this.current_block != null) throw "Illegal state"; | |
| this.current_block = this.next_block; | |
| this.addBlock(this.current_block); | |
| this.next_block = Block.randomBlock(this.w / 2.0,-65.); | |
| } | |
| Board.prototype.next_block = null; | |
| Board.prototype.onKeyDown = function(e) { | |
| if(this.current_block == null) return; | |
| switch(e.keyCode) { | |
| case 37:case 65:{ | |
| this.current_block.setSpeed(-1.,null); | |
| }break; | |
| case 38:case 87:{ | |
| this.current_block.rotate(Math.PI / 2.0); | |
| }break; | |
| case 39:case 68:{ | |
| this.current_block.setSpeed(1.0,null); | |
| }break; | |
| case 40:case 83:{ | |
| this.current_block.setSpeed(null,1.0); | |
| }break; | |
| default:{ | |
| null; | |
| }break; | |
| } | |
| } | |
| Board.prototype.onKeyUp = function(e) { | |
| if(this.current_block == null) return; | |
| switch(e.keyCode) { | |
| case 37:case 65:{ | |
| this.current_block.setSpeed(0.0,null); | |
| }break; | |
| case 39:case 68:{ | |
| this.current_block.setSpeed(0.0,null); | |
| }break; | |
| case 40:case 83:{ | |
| this.current_block.setSpeed(null,0.0); | |
| }break; | |
| default:{ | |
| null; | |
| }break; | |
| } | |
| } | |
| Board.prototype.removeBlock = function(block) { | |
| this.world.removeBody(block.body); | |
| this.blocks.remove(block); | |
| } | |
| Board.prototype.tick = function() { | |
| this.world.step(1.0 / 30.0,10); | |
| if(this.time_to_next_block > 0) { | |
| this.time_to_next_block -= 1.0 / 30.0; | |
| if(this.time_to_next_block < 0) { | |
| if(this.current_block == null) { | |
| this.newBlock(); | |
| } | |
| else { | |
| this.blocks_dropped++; | |
| this.current_block = null; | |
| this.time_to_next_block = 1.0; | |
| } | |
| } | |
| } | |
| { | |
| var _g = 0, _g1 = this.blocks; | |
| while(_g < _g1.length) { | |
| var block = _g1[_g]; | |
| ++_g; | |
| block.tick(); | |
| } | |
| } | |
| if(this.current_block == null) { | |
| while(this.checkAndClear()) null; | |
| } | |
| if(this.current_block != null) { | |
| this.current_block.body.v.set(this.current_block.speed.x,this.current_block.speed.y); | |
| } | |
| if(this.current_block != null && !(this.current_block.body.arbiters.head == null)) { | |
| var go = false; | |
| { var $it1 = this.current_block.body.arbiters.iterator(); | |
| while( $it1.hasNext() ) { var arbiter = $it1.next(); | |
| { | |
| var shape = (arbiter.s1.body == this.current_block.body?arbiter.s2:arbiter.s1); | |
| if(shape != this.borders[0] && shape != this.borders[1]) go = true; | |
| } | |
| }} | |
| if(go && this.time_to_next_block <= 0.0) { | |
| if(this.current_block.y > 0.0) { | |
| this.time_to_next_block = 0.5; | |
| } | |
| else { | |
| this.current_block = null; | |
| } | |
| } | |
| } | |
| } | |
| Board.prototype.time_to_next_block = null; | |
| Board.prototype.w = null; | |
| Board.prototype.world = null; | |
| Board.prototype.__class__ = Board; | |
| phx.Arbiter = function(alloc) { if( alloc === $_ ) return; { | |
| this.allocator = alloc; | |
| }} | |
| phx.Arbiter.__name__ = ["phx","Arbiter"]; | |
| phx.Arbiter.prototype.allocator = null; | |
| phx.Arbiter.prototype.applyImpulse = function() { | |
| var b1 = this.s1.body; | |
| var b2 = this.s2.body; | |
| var c = this.contacts; | |
| while(c != null) { | |
| var vbn = ((c.r2nx * b2.w_bias + b2.v_bias.x) - (c.r1nx * b1.w_bias + b1.v_bias.x)) * c.nx + ((c.r2ny * b2.w_bias + b2.v_bias.y) - (c.r1ny * b1.w_bias + b1.v_bias.y)) * c.ny; | |
| var jbn = (c.bias - vbn) * c.nMass; | |
| var jbnOld = c.jBias; | |
| c.jBias = jbnOld + jbn; | |
| if(c.jBias < 0) c.jBias = 0; | |
| jbn = c.jBias - jbnOld; | |
| var cjTx = c.nx * jbn; | |
| var cjTy = c.ny * jbn; | |
| b1.v_bias.x -= cjTx * b1.invMass; | |
| b1.v_bias.y -= cjTy * b1.invMass; | |
| b1.w_bias -= b1.invInertia * (c.r1x * cjTy - c.r1y * cjTx); | |
| b2.v_bias.x += cjTx * b2.invMass; | |
| b2.v_bias.y += cjTy * b2.invMass; | |
| b2.w_bias += b2.invInertia * (c.r2x * cjTy - c.r2y * cjTx); | |
| var vrx = (c.r2nx * b2.w + b2.v.x) - (c.r1nx * b1.w + b1.v.x); | |
| var vry = (c.r2ny * b2.w + b2.v.y) - (c.r1ny * b1.w + b1.v.y); | |
| var jn = (c.bounce + (vrx * c.nx + vry * c.ny)) * c.nMass; | |
| var jnOld = c.jnAcc; | |
| c.jnAcc = jnOld - jn; | |
| if(c.jnAcc < 0) c.jnAcc = 0; | |
| jn = c.jnAcc - jnOld; | |
| var vrt = c.nx * vry - c.ny * vrx; | |
| var jtMax = this.friction * c.jnAcc; | |
| var jt = vrt * c.tMass; | |
| var jtOld = c.jtAcc; | |
| c.jtAcc = jtOld - jt; | |
| if(c.jtAcc < -jtMax) c.jtAcc = -jtMax; | |
| else if(c.jtAcc > jtMax) c.jtAcc = jtMax; | |
| jt = c.jtAcc - jtOld; | |
| var cjTx1 = c.nx * jn - c.ny * jt; | |
| var cjTy1 = c.ny * jn + c.nx * jt; | |
| { | |
| b1.v.x -= cjTx1 * b1.invMass; | |
| b1.v.y -= cjTy1 * b1.invMass; | |
| b1.w -= b1.invInertia * (c.r1x * cjTy1 - c.r1y * cjTx1); | |
| b2.v.x += cjTx1 * b2.invMass; | |
| b2.v.y += cjTy1 * b2.invMass; | |
| b2.w += b2.invInertia * (c.r2x * cjTy1 - c.r2y * cjTx1); | |
| } | |
| c = c.next; | |
| } | |
| } | |
| phx.Arbiter.prototype.assign = function(s1,s2) { | |
| this.s1 = s1; | |
| this.s2 = s2; | |
| var m1 = s1.material; | |
| var m2 = s2.material; | |
| var p1 = s1.body.properties; | |
| var p2 = s2.body.properties; | |
| this.restitution = (m1.restitution > m2.restitution?m1.restitution:m2.restitution); | |
| this.friction = Math.sqrt(m1.friction * m2.friction); | |
| this.bias = ((p1.biasCoef > p2.biasCoef)?p1.biasCoef:p2.biasCoef); | |
| this.maxDist = ((p1.maxDist > p2.maxDist)?p2.maxDist:p1.maxDist); | |
| } | |
| phx.Arbiter.prototype.bias = null; | |
| phx.Arbiter.prototype.bodyImpulse = function(c,b1,b2,cjTx,cjTy) { | |
| b1.v.x -= cjTx * b1.invMass; | |
| b1.v.y -= cjTy * b1.invMass; | |
| b1.w -= b1.invInertia * (c.r1x * cjTy - c.r1y * cjTx); | |
| b2.v.x += cjTx * b2.invMass; | |
| b2.v.y += cjTy * b2.invMass; | |
| b2.w += b2.invInertia * (c.r2x * cjTy - c.r2y * cjTx); | |
| } | |
| phx.Arbiter.prototype.contacts = null; | |
| phx.Arbiter.prototype.friction = null; | |
| phx.Arbiter.prototype.injectContact = function(p,n,nCoef,dist,hash) { | |
| var c = this.contacts; | |
| while(c != null) { | |
| if(hash == c.hash) break; | |
| c = c.next; | |
| } | |
| if(c == null) { | |
| c = this.allocator.allocContact(); | |
| c.hash = hash; | |
| c.jnAcc = c.jtAcc = 0; | |
| c.next = this.contacts; | |
| this.contacts = c; | |
| } | |
| c.px = p.x; | |
| c.py = p.y; | |
| c.nx = n.x * nCoef; | |
| c.ny = n.y * nCoef; | |
| c.dist = dist; | |
| c.updated = true; | |
| } | |
| phx.Arbiter.prototype.island = null; | |
| phx.Arbiter.prototype.maxDist = null; | |
| phx.Arbiter.prototype.preStep = function(dt) { | |
| var b1 = this.s1.body; | |
| var b2 = this.s2.body; | |
| var mass_sum = b1.invMass + b2.invMass; | |
| var c = this.contacts; | |
| var prev = null; | |
| while(c != null) { | |
| if(!c.updated) { | |
| var old = c; | |
| c = c.next; | |
| this.allocator.freeContact(old); | |
| if(prev == null) this.contacts = c; | |
| else prev.next = c; | |
| continue; | |
| } | |
| c.updated = false; | |
| c.r1x = c.px - b1.x; | |
| c.r1y = c.py - b1.y; | |
| c.r2x = c.px - b2.x; | |
| c.r2y = c.py - b2.y; | |
| c.r1nx = -c.r1y; | |
| c.r1ny = c.r1x; | |
| c.r2nx = -c.r2y; | |
| c.r2ny = c.r2x; | |
| var r1cn = c.r1x * c.ny - c.r1y * c.nx; | |
| var r2cn = c.r2x * c.ny - c.r2y * c.nx; | |
| var kn = (mass_sum + ((b1.invInertia * r1cn) * r1cn)) + ((b2.invInertia * r2cn) * r2cn); | |
| c.nMass = 1.0 / kn; | |
| var tx = -c.ny; | |
| var ty = c.nx; | |
| var r1ct = c.r1x * ty - c.r1y * tx; | |
| var r2ct = c.r2x * ty - c.r2y * tx; | |
| var kt = (mass_sum + (b1.invInertia * r1ct) * r1ct) + (b2.invInertia * r2ct) * r2ct; | |
| c.tMass = 1.0 / kt; | |
| c.bias = -this.bias * (c.dist + this.maxDist); | |
| c.jBias = 0; | |
| var vrx = (c.r2nx * b2.w + b2.v.x) - (c.r1nx * b1.w + b1.v.x); | |
| var vry = (c.r2ny * b2.w + b2.v.y) - (c.r1ny * b1.w + b1.v.y); | |
| c.bounce = ((c.nx * vrx + c.ny * vry) * this.restitution) * dt; | |
| var cjTx = (c.nx * c.jnAcc) + (tx * c.jtAcc); | |
| var cjTy = (c.ny * c.jnAcc) + (ty * c.jtAcc); | |
| { | |
| b1.v.x -= cjTx * b1.invMass; | |
| b1.v.y -= cjTy * b1.invMass; | |
| b1.w -= b1.invInertia * (c.r1x * cjTy - c.r1y * cjTx); | |
| b2.v.x += cjTx * b2.invMass; | |
| b2.v.y += cjTy * b2.invMass; | |
| b2.w += b2.invInertia * (c.r2x * cjTy - c.r2y * cjTx); | |
| } | |
| prev = c; | |
| c = c.next; | |
| } | |
| } | |
| phx.Arbiter.prototype.restitution = null; | |
| phx.Arbiter.prototype.s1 = null; | |
| phx.Arbiter.prototype.s2 = null; | |
| phx.Arbiter.prototype.sleeping = null; | |
| phx.Arbiter.prototype.stamp = null; | |
| phx.Arbiter.prototype.__class__ = phx.Arbiter; | |
| Box = function(block,square) { if( block === $_ ) return; { | |
| this.block = block; | |
| this.square = square; | |
| this.y = (square.x * block.body.rsin + square.y * block.body.rcos) + block.body.y; | |
| }} | |
| Box.__name__ = ["Box"]; | |
| Box.compareY = function(a,b) { | |
| if(a.y == b.y) return 0; | |
| else if(a.y > b.y) return 1; | |
| else return -1; | |
| } | |
| Box.prototype.block = null; | |
| Box.prototype.square = null; | |
| Box.prototype.toString = function() { | |
| return this.y + ""; | |
| } | |
| Box.prototype.y = null; | |
| Box.prototype.__class__ = Box; | |
| phx.col.AABB = function(left,top,right,bottom) { if( left === $_ ) return; { | |
| this.l = left; | |
| this.t = top; | |
| this.r = right; | |
| this.b = bottom; | |
| }} | |
| phx.col.AABB.__name__ = ["phx","col","AABB"]; | |
| phx.col.AABB.prototype.b = null; | |
| phx.col.AABB.prototype.bounds = null; | |
| phx.col.AABB.prototype.center = function() { | |
| return new phx.Vector((this.l + this.r) / 2.0,(this.t + this.b) / 2.0); | |
| } | |
| phx.col.AABB.prototype.contains = function(aabb) { | |
| return (aabb.l >= this.l && aabb.r <= this.r && aabb.t >= this.t && aabb.b <= this.b); | |
| } | |
| phx.col.AABB.prototype.containsPoint = function(v) { | |
| return !(v.y < this.t || v.y > this.b || v.x < this.l || v.x > this.r); | |
| } | |
| phx.col.AABB.prototype.height = function() { | |
| return Math.abs(this.t - this.b); | |
| } | |
| phx.col.AABB.prototype.intersects = function(aabb) { | |
| return !(aabb.l > this.r || aabb.r < this.l || aabb.t > this.b || aabb.b < this.t); | |
| } | |
| phx.col.AABB.prototype.intersects2 = function(aabb) { | |
| return (this.l <= aabb.r && aabb.l <= this.r && this.t <= aabb.b && aabb.t <= this.b); | |
| } | |
| phx.col.AABB.prototype.l = null; | |
| phx.col.AABB.prototype.next = null; | |
| phx.col.AABB.prototype.prev = null; | |
| phx.col.AABB.prototype.r = null; | |
| phx.col.AABB.prototype.shape = null; | |
| phx.col.AABB.prototype.t = null; | |
| phx.col.AABB.prototype.toString = function() { | |
| return ((((((("[l=" + this.l) + " b=") + this.b) + " r=") + this.r) + " t=") + this.t) + "]"; | |
| } | |
| phx.col.AABB.prototype.width = function() { | |
| return Math.abs(this.l - this.r); | |
| } | |
| phx.col.AABB.prototype.__class__ = phx.col.AABB; | |
| if(!phx.joint) phx.joint = {} | |
| phx.joint.Joint = function(b1,b2,anchr1,anchr2) { if( b1 === $_ ) return; { | |
| this.b1 = b1; | |
| this.b2 = b2; | |
| this.anchr1 = anchr1; | |
| this.anchr2 = anchr2; | |
| }} | |
| phx.joint.Joint.__name__ = ["phx","joint","Joint"]; | |
| phx.joint.Joint.prototype.anchr1 = null; | |
| phx.joint.Joint.prototype.anchr2 = null; | |
| phx.joint.Joint.prototype.applyImpuse = function() { | |
| null; | |
| } | |
| phx.joint.Joint.prototype.b1 = null; | |
| phx.joint.Joint.prototype.b2 = null; | |
| phx.joint.Joint.prototype.island = null; | |
| phx.joint.Joint.prototype.preStep = function(invDt) { | |
| null; | |
| } | |
| phx.joint.Joint.prototype.__class__ = phx.joint.Joint; | |
| phx.Material = function(restitution,friction,density) { if( restitution === $_ ) return; { | |
| this.restitution = restitution; | |
| this.friction = friction; | |
| this.density = density; | |
| }} | |
| phx.Material.__name__ = ["phx","Material"]; | |
| phx.Material.prototype.density = null; | |
| phx.Material.prototype.friction = null; | |
| phx.Material.prototype.restitution = null; | |
| phx.Material.prototype.__class__ = phx.Material; | |
| phx.Properties = function(linearFriction,angularFriction,biasCoef,maxMotion,maxDist) { if( linearFriction === $_ ) return; { | |
| this.id = phx.Properties.PID++; | |
| this.count = 0; | |
| this.linearFriction = linearFriction; | |
| this.angularFriction = angularFriction; | |
| this.biasCoef = biasCoef; | |
| this.maxMotion = maxMotion; | |
| this.maxDist = maxDist; | |
| }} | |
| phx.Properties.__name__ = ["phx","Properties"]; | |
| phx.Properties.prototype.afdt = null; | |
| phx.Properties.prototype.angularFriction = null; | |
| phx.Properties.prototype.biasCoef = null; | |
| phx.Properties.prototype.count = null; | |
| phx.Properties.prototype.id = null; | |
| phx.Properties.prototype.lfdt = null; | |
| phx.Properties.prototype.linearFriction = null; | |
| phx.Properties.prototype.maxDist = null; | |
| phx.Properties.prototype.maxMotion = null; | |
| phx.Properties.prototype.__class__ = phx.Properties; | |
| phx.Const = function() { } | |
| phx.Const.__name__ = ["phx","Const"]; | |
| phx.Const.XROT = function(v,b) { | |
| return v.x * b.rcos - v.y * b.rsin; | |
| } | |
| phx.Const.YROT = function(v,b) { | |
| return v.x * b.rsin + v.y * b.rcos; | |
| } | |
| phx.Const.prototype.__class__ = phx.Const; | |
| IntIter = function(min,max) { if( min === $_ ) return; { | |
| this.min = min; | |
| this.max = max; | |
| }} | |
| IntIter.__name__ = ["IntIter"]; | |
| IntIter.prototype.hasNext = function() { | |
| return this.min < this.max; | |
| } | |
| IntIter.prototype.max = null; | |
| IntIter.prototype.min = null; | |
| IntIter.prototype.next = function() { | |
| return this.min++; | |
| } | |
| IntIter.prototype.__class__ = IntIter; | |
| if(typeof haxe=='undefined') haxe = {} | |
| haxe.Timer = function(time_ms) { if( time_ms === $_ ) return; { | |
| this.id = haxe.Timer.arr.length; | |
| haxe.Timer.arr[this.id] = this; | |
| this.timerId = window.setInterval(("haxe.Timer.arr[" + this.id) + "].run();",time_ms); | |
| }} | |
| haxe.Timer.__name__ = ["haxe","Timer"]; | |
| haxe.Timer.delay = function(f,time_ms) { | |
| var t = new haxe.Timer(time_ms); | |
| t.run = function() { | |
| t.stop(); | |
| f(); | |
| } | |
| return t; | |
| } | |
| haxe.Timer.stamp = function() { | |
| return Date.now().getTime() / 1000; | |
| } | |
| haxe.Timer.prototype.id = null; | |
| haxe.Timer.prototype.run = function() { | |
| null; | |
| } | |
| haxe.Timer.prototype.stop = function() { | |
| if(this.id == null) return; | |
| window.clearInterval(this.timerId); | |
| haxe.Timer.arr[this.id] = null; | |
| if(this.id > 100 && this.id == haxe.Timer.arr.length - 1) { | |
| var p = this.id - 1; | |
| while(p >= 0 && haxe.Timer.arr[p] == null) p--; | |
| haxe.Timer.arr = haxe.Timer.arr.slice(0,p + 1); | |
| } | |
| this.id = null; | |
| } | |
| haxe.Timer.prototype.timerId = null; | |
| haxe.Timer.prototype.__class__ = haxe.Timer; | |
| phx.Segment = function(a,b,r,material) { if( a === $_ ) return; { | |
| phx.Shape.apply(this,[1,material]); | |
| this.segment = this; | |
| this.offset = new phx.Vector(0,0); | |
| this.a = new phx.Vector(a.x,a.y); | |
| this.b = new phx.Vector(b.x,b.y); | |
| this.r = r; | |
| var delta = new phx.Vector(b.x - a.x,b.y - a.y); | |
| this.n = phx.Vector.normal(delta.x,delta.y); | |
| this.area = r * Math.sqrt(delta.x * delta.x + delta.y * delta.y); | |
| this.tA = new phx.Vector(0,0); | |
| this.tB = new phx.Vector(0,0); | |
| this.tN = new phx.Vector(0,0); | |
| this.tNneg = new phx.Vector(0,0); | |
| }} | |
| phx.Segment.__name__ = ["phx","Segment"]; | |
| phx.Segment.__super__ = phx.Shape; | |
| for(var k in phx.Shape.prototype ) phx.Segment.prototype[k] = phx.Shape.prototype[k]; | |
| phx.Segment.prototype.a = null; | |
| phx.Segment.prototype.b = null; | |
| phx.Segment.prototype.calculateInertia = function() { | |
| return 1.; | |
| } | |
| phx.Segment.prototype.n = null; | |
| phx.Segment.prototype.r = null; | |
| phx.Segment.prototype.tA = null; | |
| phx.Segment.prototype.tB = null; | |
| phx.Segment.prototype.tN = null; | |
| phx.Segment.prototype.tNneg = null; | |
| phx.Segment.prototype.update = function() { | |
| this.tA.x = this.body.x + phx.Const.XROT(this.a,this.body); | |
| this.tA.y = this.body.y + phx.Const.YROT(this.a,this.body); | |
| this.tB.x = this.body.x + phx.Const.XROT(this.b,this.body); | |
| this.tB.y = this.body.y + phx.Const.YROT(this.b,this.body); | |
| this.tN.x = phx.Const.XROT(this.n,this.body); | |
| this.tN.y = phx.Const.YROT(this.n,this.body); | |
| this.tNneg.x = -this.tN.x; | |
| this.tNneg.y = -this.tN.y; | |
| if(this.tA.x < this.tB.x) { | |
| this.aabb.l = this.tA.x - this.r; | |
| this.aabb.r = this.tB.x + this.r; | |
| } | |
| else { | |
| this.aabb.l = this.tB.x - this.r; | |
| this.aabb.r = this.tA.x + this.r; | |
| } | |
| if(this.tA.y < this.tB.y) { | |
| this.aabb.t = this.tA.y - this.r; | |
| this.aabb.b = this.tB.y + this.r; | |
| } | |
| else { | |
| this.aabb.t = this.tB.y - this.r; | |
| this.aabb.b = this.tA.y + this.r; | |
| } | |
| } | |
| phx.Segment.prototype.__class__ = phx.Segment; | |
| Std = function() { } | |
| Std.__name__ = ["Std"]; | |
| Std["is"] = function(v,t) { | |
| return js.Boot.__instanceof(v,t); | |
| } | |
| Std.string = function(s) { | |
| return js.Boot.__string_rec(s,""); | |
| } | |
| Std["int"] = function(x) { | |
| if(x < 0) return Math.ceil(x); | |
| return Math.floor(x); | |
| } | |
| Std.parseInt = function(x) { | |
| var v = parseInt(x); | |
| if(Math.isNaN(v)) return null; | |
| return v; | |
| } | |
| Std.parseFloat = function(x) { | |
| return parseFloat(x); | |
| } | |
| Std.random = function(x) { | |
| return Math.floor(Math.random() * x); | |
| } | |
| Std.prototype.__class__ = Std; | |
| phx.Polygon = function(vl,offset,material) { if( vl === $_ ) return; { | |
| phx.Shape.apply(this,[2,material]); | |
| this.polygon = this; | |
| this.offset = offset; | |
| this.initVertexes(vl); | |
| }} | |
| phx.Polygon.__name__ = ["phx","Polygon"]; | |
| phx.Polygon.__super__ = phx.Shape; | |
| for(var k in phx.Shape.prototype ) phx.Polygon.prototype[k] = phx.Shape.prototype[k]; | |
| phx.Polygon.prototype.axes = null; | |
| phx.Polygon.prototype.calculateInertia = function() { | |
| var tVertsTemp = new Array(); | |
| var v = this.verts; | |
| while(v != null) { | |
| tVertsTemp.push(new phx.Vector(v.x + this.offset.x,v.y + this.offset.y)); | |
| v = v.next; | |
| } | |
| var sum1 = 0.; | |
| var sum2 = 0.; | |
| { | |
| var _g1 = 0, _g = this.vcount; | |
| while(_g1 < _g) { | |
| var i = _g1++; | |
| var v0 = tVertsTemp[i]; | |
| var v1 = tVertsTemp[(i + 1) % this.vcount]; | |
| var a = v1.x * v0.y - v1.y * v0.x; | |
| var b = ((v0.x * v0.x + v0.y * v0.y) + (v0.x * v1.x + v0.y * v1.y)) + (v1.x * v1.x + v1.y * v1.y); | |
| sum1 += a * b; | |
| sum2 += a; | |
| } | |
| } | |
| return sum1 / (6 * sum2); | |
| } | |
| phx.Polygon.prototype.initVertexes = function(vl) { | |
| var l_verts = null, l_tVerts = null, l_axes = null, l_tAxes = null; | |
| var count = vl.length; | |
| this.vcount = count; | |
| this.area = 0; | |
| var off = (this.offset != null); | |
| { | |
| var _g = 0; | |
| while(_g < count) { | |
| var i = _g++; | |
| var v0 = vl[i]; | |
| var v1 = vl[(i + 1) % count]; | |
| var v2 = vl[(i + 2) % count]; | |
| this.area += v1.x * (v0.y - v2.y); | |
| var v = (off?v0.plus(this.offset):v0); | |
| var n = phx.Vector.normal(v1.x - v0.x,v1.y - v0.y); | |
| var a = new phx.Axis(n,n.x * v.x + n.y * v.y); | |
| var vt = new phx.Vector(v.x,v.y); | |
| var at = new phx.Axis(a.n.clone(),a.d); | |
| if(i == 0) { | |
| this.verts = v; | |
| this.tVerts = vt; | |
| this.axes = a; | |
| this.tAxes = at; | |
| } | |
| else { | |
| l_verts.next = v; | |
| l_tVerts.next = vt; | |
| l_axes.next = a; | |
| l_tAxes.next = at; | |
| } | |
| l_verts = v; | |
| l_tVerts = vt; | |
| l_axes = a; | |
| l_tAxes = at; | |
| } | |
| } | |
| this.area *= 0.5; | |
| } | |
| phx.Polygon.prototype.tAxes = null; | |
| phx.Polygon.prototype.tVerts = null; | |
| phx.Polygon.prototype.update = function() { | |
| var v = this.verts; | |
| var tv = this.tVerts; | |
| var body = this.body; | |
| var aabb = this.aabb; | |
| aabb.l = aabb.t = 1e99; | |
| aabb.r = aabb.b = -1e+99; | |
| while(v != null) { | |
| tv.x = body.x + (v.x * body.rcos - v.y * body.rsin); | |
| tv.y = body.y + (v.x * body.rsin + v.y * body.rcos); | |
| if(tv.x < aabb.l) aabb.l = tv.x; | |
| if(tv.x > aabb.r) aabb.r = tv.x; | |
| if(tv.y < aabb.t) aabb.t = tv.y; | |
| if(tv.y > aabb.b) aabb.b = tv.y; | |
| v = v.next; | |
| tv = tv.next; | |
| } | |
| var a = this.axes; | |
| var ta = this.tAxes; | |
| while(a != null) { | |
| var n = a.n; | |
| ta.n.x = n.x * body.rcos - n.y * body.rsin; | |
| ta.n.y = n.x * body.rsin + n.y * body.rcos; | |
| ta.d = (body.x * ta.n.x + body.y * ta.n.y) + a.d; | |
| a = a.next; | |
| ta = ta.next; | |
| } | |
| } | |
| phx.Polygon.prototype.vcount = null; | |
| phx.Polygon.prototype.verts = null; | |
| phx.Polygon.prototype.__class__ = phx.Polygon; | |
| phx.Timer = function(p) { if( p === $_ ) return; { | |
| this.total = 0.; | |
| this.datas = new Hash(); | |
| this.times = new Array(); | |
| this.curs = new Array(); | |
| }} | |
| phx.Timer.__name__ = ["phx","Timer"]; | |
| phx.Timer.prototype.curs = null; | |
| phx.Timer.prototype.datas = null; | |
| phx.Timer.prototype.format = function(name) { | |
| var data = this.datas.get(name); | |
| if(data == null) return name + " ????"; | |
| return ((((name + " : ") + Std["int"](data.avg * 1000)) + " (") + (Std["int"]((data.total * 1000) / this.total) / 10)) + "%)"; | |
| } | |
| phx.Timer.prototype.getTotal = function(name) { | |
| var data = this.datas.get(name); | |
| if(data == null) return 0.; | |
| return data.total; | |
| } | |
| phx.Timer.prototype.start = function(phase) { | |
| this.times.push(haxe.Timer.stamp()); | |
| this.curs.push(phase); | |
| } | |
| phx.Timer.prototype.stop = function() { | |
| var dt = (haxe.Timer.stamp() - this.times.pop()) * 1000; | |
| var name = this.curs.pop(); | |
| var data = this.datas.get(name); | |
| if(data == null) { | |
| data = { total : 0., avg : 0.} | |
| this.datas.set(name,data); | |
| } | |
| data.total += dt; | |
| data.avg = data.avg * 0.99 + 0.01 * dt; | |
| if(this.curs.length == 0) this.total += dt; | |
| } | |
| phx.Timer.prototype.times = null; | |
| phx.Timer.prototype.total = null; | |
| phx.Timer.prototype.__class__ = phx.Timer; | |
| phx.Axis = function(n,d) { if( n === $_ ) return; { | |
| this.n = n; | |
| this.d = d; | |
| }} | |
| phx.Axis.__name__ = ["phx","Axis"]; | |
| phx.Axis.prototype.clone = function() { | |
| return new phx.Axis(this.n.clone(),this.d); | |
| } | |
| phx.Axis.prototype.d = null; | |
| phx.Axis.prototype.n = null; | |
| phx.Axis.prototype.next = null; | |
| phx.Axis.prototype.toString = function() { | |
| return ((((("[Axis= " + this.n.x) + ",") + this.n.y) + " d=") + this.d) + "]"; | |
| } | |
| phx.Axis.prototype.__class__ = phx.Axis; | |
| if(typeof js=='undefined') js = {} | |
| js.Lib = function() { } | |
| js.Lib.__name__ = ["js","Lib"]; | |
| js.Lib.isIE = null; | |
| js.Lib.isOpera = null; | |
| js.Lib.document = null; | |
| js.Lib.window = null; | |
| js.Lib.alert = function(v) { | |
| alert(js.Boot.__string_rec(v,"")); | |
| } | |
| js.Lib.eval = function(code) { | |
| return eval(code); | |
| } | |
| js.Lib.setErrorHandler = function(f) { | |
| js.Lib.onerror = f; | |
| } | |
| js.Lib.prototype.__class__ = js.Lib; | |
| phx.col.SortedList = function(p) { if( p === $_ ) return; { | |
| null; | |
| }} | |
| phx.col.SortedList.__name__ = ["phx","col","SortedList"]; | |
| phx.col.SortedList.prototype.addShape = function(s) { | |
| var b = s.aabb; | |
| b.shape = s; | |
| this.addSort(b); | |
| } | |
| phx.col.SortedList.prototype.addSort = function(b) { | |
| var cur = this.boxes; | |
| var prev = null; | |
| while(cur != null && cur.t < b.t) { | |
| prev = cur; | |
| cur = cur.next; | |
| } | |
| b.prev = prev; | |
| b.next = cur; | |
| if(prev == null) this.boxes = b; | |
| else prev.next = b; | |
| if(cur != null) cur.prev = b; | |
| } | |
| phx.col.SortedList.prototype.boxes = null; | |
| phx.col.SortedList.prototype.callb = null; | |
| phx.col.SortedList.prototype.collide = function() { | |
| var b1 = this.boxes; | |
| while(b1 != null) { | |
| var b2 = b1.next; | |
| var bottom = b1.b; | |
| while(b2 != null) { | |
| if(b2.t > bottom) break; | |
| if(b1.l <= b2.r && b2.l <= b1.r && b1.t <= b2.b && b2.t <= b1.b) this.callb.onCollide(b1.shape,b2.shape); | |
| b2 = b2.next; | |
| } | |
| b1 = b1.next; | |
| } | |
| } | |
| phx.col.SortedList.prototype.commit = function() { | |
| null; | |
| } | |
| phx.col.SortedList.prototype.init = function(bounds,callb,staticBody) { | |
| this.callb = callb; | |
| this.boxes = null; | |
| } | |
| phx.col.SortedList.prototype.pick = function(box) { | |
| var shapes = new haxe.FastList(); | |
| var b = this.boxes; | |
| while(b != null) { | |
| if(b.t <= box.b) break; | |
| b = b.next; | |
| } | |
| while(b != null) { | |
| if(!(box.l > b.r || box.r < b.l || box.t > b.b || box.b < b.t)) shapes.head = new haxe.FastCell(b.shape,shapes.head); | |
| b = b.next; | |
| } | |
| return shapes; | |
| } | |
| phx.col.SortedList.prototype.removeShape = function(s) { | |
| var b = s.aabb; | |
| var next = b.next; | |
| var prev = b.prev; | |
| if(prev == null) this.boxes = next; | |
| else prev.next = next; | |
| if(next != null) next.prev = prev; | |
| } | |
| phx.col.SortedList.prototype.syncShape = function(s) { | |
| var b = s.aabb; | |
| var prev = b.prev; | |
| var next = b.next; | |
| if(prev != null && prev.t > b.t) { | |
| prev.next = next; | |
| if(next != null) next.prev = prev; | |
| this.addSort(b); | |
| } | |
| else if(next != null && next.t < b.t) { | |
| if(prev == null) this.boxes = next; | |
| else prev.next = next; | |
| next.prev = prev; | |
| this.addSort(b); | |
| } | |
| } | |
| phx.col.SortedList.prototype.validate = function() { | |
| var cur = this.boxes; | |
| while(cur != null) { | |
| var next = cur.next; | |
| if(next != null && next.t < cur.t) return false; | |
| cur = next; | |
| } | |
| return true; | |
| } | |
| phx.col.SortedList.prototype.__class__ = phx.col.SortedList; | |
| phx.col.SortedList.__interfaces__ = [phx.col.BroadPhase]; | |
| js.Boot = function() { } | |
| js.Boot.__name__ = ["js","Boot"]; | |
| js.Boot.__unhtml = function(s) { | |
| return s.split("&").join("&").split("<").join("<").split(">").join(">"); | |
| } | |
| js.Boot.__trace = function(v,i) { | |
| var msg = (i != null?((i.fileName + ":") + i.lineNumber) + ": ":""); | |
| msg += js.Boot.__unhtml(js.Boot.__string_rec(v,"")) + "<br/>"; | |
| var d = document.getElementById("haxe:trace"); | |
| if(d == null) alert("No haxe:trace element defined\n" + msg); | |
| else d.innerHTML += msg; | |
| } | |
| js.Boot.__clear_trace = function() { | |
| var d = document.getElementById("haxe:trace"); | |
| if(d != null) d.innerHTML = ""; | |
| else null; | |
| } | |
| js.Boot.__closure = function(o,f) { | |
| var m = o[f]; | |
| if(m == null) return null; | |
| var f1 = function() { | |
| return m.apply(o,arguments); | |
| } | |
| f1.scope = o; | |
| f1.method = m; | |
| return f1; | |
| } | |
| js.Boot.__string_rec = function(o,s) { | |
| if(o == null) return "null"; | |
| if(s.length >= 5) return "<...>"; | |
| var t = typeof(o); | |
| if(t == "function" && (o.__name__ != null || o.__ename__ != null)) t = "object"; | |
| switch(t) { | |
| case "object":{ | |
| if(o instanceof Array) { | |
| if(o.__enum__ != null) { | |
| if(o.length == 2) return o[0]; | |
| var str = o[0] + "("; | |
| s += "\t"; | |
| { | |
| var _g1 = 2, _g = o.length; | |
| while(_g1 < _g) { | |
| var i = _g1++; | |
| if(i != 2) str += "," + js.Boot.__string_rec(o[i],s); | |
| else str += js.Boot.__string_rec(o[i],s); | |
| } | |
| } | |
| return str + ")"; | |
| } | |
| var l = o.length; | |
| var i; | |
| var str = "["; | |
| s += "\t"; | |
| { | |
| var _g = 0; | |
| while(_g < l) { | |
| var i1 = _g++; | |
| str += ((i1 > 0?",":"")) + js.Boot.__string_rec(o[i1],s); | |
| } | |
| } | |
| str += "]"; | |
| return str; | |
| } | |
| var tostr; | |
| try { | |
| tostr = o.toString; | |
| } | |
| catch( $e2 ) { | |
| { | |
| var e = $e2; | |
| { | |
| return "???"; | |
| } | |
| } | |
| } | |
| if(tostr != null && tostr != Object.toString) { | |
| var s2 = o.toString(); | |
| if(s2 != "[object Object]") return s2; | |
| } | |
| var k = null; | |
| var str = "{\n"; | |
| s += "\t"; | |
| var hasp = (o.hasOwnProperty != null); | |
| for( var k in o ) { ; | |
| if(hasp && !o.hasOwnProperty(k)) continue; | |
| if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__") continue; | |
| if(str.length != 2) str += ", \n"; | |
| str += ((s + k) + " : ") + js.Boot.__string_rec(o[k],s); | |
| } | |
| s = s.substring(1); | |
| str += ("\n" + s) + "}"; | |
| return str; | |
| }break; | |
| case "function":{ | |
| return "<function>"; | |
| }break; | |
| case "string":{ | |
| return o; | |
| }break; | |
| default:{ | |
| return String(o); | |
| }break; | |
| } | |
| } | |
| js.Boot.__interfLoop = function(cc,cl) { | |
| if(cc == null) return false; | |
| if(cc == cl) return true; | |
| var intf = cc.__interfaces__; | |
| if(intf != null) { | |
| var _g1 = 0, _g = intf.length; | |
| while(_g1 < _g) { | |
| var i = _g1++; | |
| var i1 = intf[i]; | |
| if(i1 == cl || js.Boot.__interfLoop(i1,cl)) return true; | |
| } | |
| } | |
| return js.Boot.__interfLoop(cc.__super__,cl); | |
| } | |
| js.Boot.__instanceof = function(o,cl) { | |
| try { | |
| if(o instanceof cl) { | |
| if(cl == Array) return (o.__enum__ == null); | |
| return true; | |
| } | |
| if(js.Boot.__interfLoop(o.__class__,cl)) return true; | |
| } | |
| catch( $e3 ) { | |
| { | |
| var e = $e3; | |
| { | |
| if(cl == null) return false; | |
| } | |
| } | |
| } | |
| switch(cl) { | |
| case Int:{ | |
| return Math.ceil(o%2147483648.0) === o; | |
| }break; | |
| case Float:{ | |
| return typeof(o) == "number"; | |
| }break; | |
| case Bool:{ | |
| return o === true || o === false; | |
| }break; | |
| case String:{ | |
| return typeof(o) == "string"; | |
| }break; | |
| case Dynamic:{ | |
| return true; | |
| }break; | |
| default:{ | |
| if(o == null) return false; | |
| return o.__enum__ == cl || (cl == Class && o.__name__ != null) || (cl == Enum && o.__ename__ != null); | |
| }break; | |
| } | |
| } | |
| js.Boot.__init = function() { | |
| js.Lib.isIE = (typeof document!='undefined' && document.all != null && typeof window!='undefined' && window.opera == null); | |
| js.Lib.isOpera = (typeof window!='undefined' && window.opera != null); | |
| Array.prototype.copy = Array.prototype.slice; | |
| Array.prototype.insert = function(i,x) { | |
| this.splice(i,0,x); | |
| } | |
| Array.prototype.remove = (Array.prototype.indexOf?function(obj) { | |
| var idx = this.indexOf(obj); | |
| if(idx == -1) return false; | |
| this.splice(idx,1); | |
| return true; | |
| }:function(obj) { | |
| var i = 0; | |
| var l = this.length; | |
| while(i < l) { | |
| if(this[i] == obj) { | |
| this.splice(i,1); | |
| return true; | |
| } | |
| i++; | |
| } | |
| return false; | |
| }); | |
| Array.prototype.iterator = function() { | |
| return { cur : 0, arr : this, hasNext : function() { | |
| return this.cur < this.arr.length; | |
| }, next : function() { | |
| return this.arr[this.cur++]; | |
| }} | |
| } | |
| var cca = String.prototype.charCodeAt; | |
| String.prototype.cca = cca; | |
| String.prototype.charCodeAt = function(i) { | |
| var x = cca.call(this,i); | |
| if(isNaN(x)) return null; | |
| return x; | |
| } | |
| var oldsub = String.prototype.substr; | |
| String.prototype.substr = function(pos,len) { | |
| if(pos != null && pos != 0 && len != null && len < 0) return ""; | |
| if(len == null) len = this.length; | |
| if(pos < 0) { | |
| pos = this.length + pos; | |
| if(pos < 0) pos = 0; | |
| } | |
| else if(len < 0) { | |
| len = (this.length + len) - pos; | |
| } | |
| return oldsub.apply(this,[pos,len]); | |
| } | |
| $closure = js.Boot.__closure; | |
| } | |
| js.Boot.prototype.__class__ = js.Boot; | |
| phx.Contact = function(p) { if( p === $_ ) return; { | |
| null; | |
| }} | |
| phx.Contact.__name__ = ["phx","Contact"]; | |
| phx.Contact.prototype.bias = null; | |
| phx.Contact.prototype.bounce = null; | |
| phx.Contact.prototype.dist = null; | |
| phx.Contact.prototype.hash = null; | |
| phx.Contact.prototype.jBias = null; | |
| phx.Contact.prototype.jnAcc = null; | |
| phx.Contact.prototype.jtAcc = null; | |
| phx.Contact.prototype.nMass = null; | |
| phx.Contact.prototype.next = null; | |
| phx.Contact.prototype.nx = null; | |
| phx.Contact.prototype.ny = null; | |
| phx.Contact.prototype.px = null; | |
| phx.Contact.prototype.py = null; | |
| phx.Contact.prototype.r1nx = null; | |
| phx.Contact.prototype.r1ny = null; | |
| phx.Contact.prototype.r1x = null; | |
| phx.Contact.prototype.r1y = null; | |
| phx.Contact.prototype.r2nx = null; | |
| phx.Contact.prototype.r2ny = null; | |
| phx.Contact.prototype.r2x = null; | |
| phx.Contact.prototype.r2y = null; | |
| phx.Contact.prototype.tMass = null; | |
| phx.Contact.prototype.updated = null; | |
| phx.Contact.prototype.__class__ = phx.Contact; | |
| IntHash = function(p) { if( p === $_ ) return; { | |
| this.h = {} | |
| if(this.h.__proto__ != null) { | |
| this.h.__proto__ = null; | |
| delete(this.h.__proto__); | |
| } | |
| else null; | |
| }} | |
| IntHash.__name__ = ["IntHash"]; | |
| IntHash.prototype.exists = function(key) { | |
| return this.h[key] != null; | |
| } | |
| IntHash.prototype.get = function(key) { | |
| return this.h[key]; | |
| } | |
| IntHash.prototype.h = null; | |
| IntHash.prototype.iterator = function() { | |
| return { ref : this.h, it : this.keys(), hasNext : function() { | |
| return this.it.hasNext(); | |
| }, next : function() { | |
| var i = this.it.next(); | |
| return this.ref[i]; | |
| }} | |
| } | |
| IntHash.prototype.keys = function() { | |
| var a = new Array(); | |
| for( x in this.h ) | |
| a.push(x); | |
| ; | |
| return a.iterator(); | |
| } | |
| IntHash.prototype.remove = function(key) { | |
| if(this.h[key] == null) return false; | |
| delete(this.h[key]); | |
| return true; | |
| } | |
| IntHash.prototype.set = function(key,value) { | |
| this.h[key] = value; | |
| } | |
| IntHash.prototype.toString = function() { | |
| var s = new StringBuf(); | |
| s.b[s.b.length] = "{"; | |
| var it = this.keys(); | |
| { var $it4 = it; | |
| while( $it4.hasNext() ) { var i = $it4.next(); | |
| { | |
| s.b[s.b.length] = i; | |
| s.b[s.b.length] = " => "; | |
| s.b[s.b.length] = Std.string(this.get(i)); | |
| if(it.hasNext()) s.b[s.b.length] = ", "; | |
| } | |
| }} | |
| s.b[s.b.length] = "}"; | |
| return s.b.join(""); | |
| } | |
| IntHash.prototype.__class__ = IntHash; | |
| haxe.FastCell = function(elt,next) { if( elt === $_ ) return; { | |
| this.elt = elt; | |
| this.next = next; | |
| }} | |
| haxe.FastCell.__name__ = ["haxe","FastCell"]; | |
| haxe.FastCell.prototype.elt = null; | |
| haxe.FastCell.prototype.next = null; | |
| haxe.FastCell.prototype.__class__ = haxe.FastCell; | |
| haxe.FastList = function(p) { if( p === $_ ) return; { | |
| null; | |
| }} | |
| haxe.FastList.__name__ = ["haxe","FastList"]; | |
| haxe.FastList.prototype.add = function(item) { | |
| this.head = new haxe.FastCell(item,this.head); | |
| } | |
| haxe.FastList.prototype.first = function() { | |
| return (this.head == null?null:this.head.elt); | |
| } | |
| haxe.FastList.prototype.head = null; | |
| haxe.FastList.prototype.isEmpty = function() { | |
| return (this.head == null); | |
| } | |
| haxe.FastList.prototype.iterator = function() { | |
| var l = this.head; | |
| return { hasNext : function() { | |
| return l != null; | |
| }, next : function() { | |
| var k = l; | |
| l = k.next; | |
| return k.elt; | |
| }} | |
| } | |
| haxe.FastList.prototype.pop = function() { | |
| var k = this.head; | |
| if(k == null) return null; | |
| else { | |
| this.head = k.next; | |
| return k.elt; | |
| } | |
| } | |
| haxe.FastList.prototype.remove = function(v) { | |
| var prev = null; | |
| var l = this.head; | |
| while(l != null) { | |
| if(l.elt == v) { | |
| if(prev == null) this.head = l.next; | |
| else prev.next = l.next; | |
| break; | |
| } | |
| prev = l; | |
| l = l.next; | |
| } | |
| return (l != null); | |
| } | |
| haxe.FastList.prototype.toString = function() { | |
| var a = new Array(); | |
| var l = this.head; | |
| while(l != null) { | |
| a.push(l.elt); | |
| l = l.next; | |
| } | |
| return ("{" + a.join(",")) + "}"; | |
| } | |
| haxe.FastList.prototype.__class__ = haxe.FastList; | |
| phx.Collision = function(p) { if( p === $_ ) return; { | |
| null; | |
| }} | |
| phx.Collision.__name__ = ["phx","Collision"]; | |
| phx.Collision.prototype.circle2circle = function(circle1,circle2,arb) { | |
| return this.circle2circleQuery(arb,circle1.tC,circle2.tC,circle1.r,circle2.r); | |
| } | |
| phx.Collision.prototype.circle2circleQuery = function(arb,p1,p2,r1,r2) { | |
| var minDist = r1 + r2; | |
| var x = p2.x - p1.x; | |
| var y = p2.y - p1.y; | |
| var distSqr = x * x + y * y; | |
| if(distSqr >= minDist * minDist) return false; | |
| var dist = Math.sqrt(distSqr); | |
| var invDist = ((dist < 1e-99)?0:1 / dist); | |
| var df = 0.5 + (r1 - 0.5 * minDist) * invDist; | |
| arb.injectContact(new phx.Vector(p1.x + x * df,p1.y + y * df),new phx.Vector(x * invDist,y * invDist),1.0,dist - minDist,0); | |
| return true; | |
| } | |
| phx.Collision.prototype.circle2poly = function(circle,poly,arb) { | |
| var a0 = null, v0 = null; | |
| var a = poly.tAxes; | |
| var v = poly.tVerts; | |
| var min = -1e+99; | |
| while(a != null) { | |
| var dist = (a.n.dot(circle.tC) - a.d) - circle.r; | |
| if(dist > 0) return false; | |
| if(dist > min) { | |
| min = dist; | |
| a0 = a; | |
| v0 = v; | |
| } | |
| a = a.next; | |
| v = v.next; | |
| } | |
| var n = a0.n; | |
| var v1 = ((v0.next == null)?poly.tVerts:v0.next); | |
| var dt = n.cross(circle.tC); | |
| if(dt < n.x * v1.y - n.y * v1.x) return this.circle2circleQuery(arb,circle.tC,v1,circle.r,0); | |
| if(dt >= n.x * v0.y - n.y * v0.x) return this.circle2circleQuery(arb,circle.tC,v0,circle.r,0); | |
| var nx = n.x * (circle.r + min * 0.5); | |
| var ny = n.y * (circle.r + min * 0.5); | |
| arb.injectContact(new phx.Vector(circle.tC.x - nx,circle.tC.y - ny),n,-1.,min,0); | |
| return true; | |
| } | |
| phx.Collision.prototype.circle2segment = function(circle,seg,arb) { | |
| var dn = seg.tN.dot(circle.tC) - seg.tA.dot(seg.tN); | |
| var dist = (((dn < 0?-dn:dn)) - circle.r) - seg.r; | |
| if(dist > 0) return false; | |
| var dt = -seg.tN.cross(circle.tC); | |
| var dtMin = -seg.tN.cross(seg.tA); | |
| var dtMax = -seg.tN.cross(seg.tB); | |
| if(dt < dtMin) { | |
| if(dt < dtMin - circle.r) return false; | |
| return this.circle2circleQuery(arb,circle.tC,seg.tA,circle.r,seg.r); | |
| } | |
| else { | |
| if(dt < dtMax) { | |
| var n = ((dn < 0)?seg.tN:seg.tN.mult(-1)); | |
| var hdist = circle.r + dist * 0.5; | |
| arb.injectContact(new phx.Vector(circle.tC.x + n.x * hdist,circle.tC.y + n.y * hdist),n,1.0,dist,0); | |
| return true; | |
| } | |
| if(dt < dtMax + circle.r) return this.circle2circleQuery(arb,circle.tC,seg.tB,circle.r,seg.r); | |
| } | |
| return false; | |
| } | |
| phx.Collision.prototype.findPolyPointsBehindSegment = function(seg,poly,pDist,coef,arb) { | |
| var dta = seg.tN.cross(seg.tA); | |
| var dtb = seg.tN.cross(seg.tB); | |
| var n = new phx.Vector(seg.tN.x * coef,seg.tN.y * coef); | |
| var k = seg.tN.dot(seg.tA) * coef; | |
| var v = poly.tVerts; | |
| var i = 2; | |
| while(v != null) { | |
| if(v.x * n.x + v.y * n.y < k + seg.r) { | |
| var dt = seg.tN.cross(v); | |
| if(dta >= dt && dt >= dtb) arb.injectContact(v,n,1.0,pDist,i); | |
| } | |
| i++; | |
| v = v.next; | |
| } | |
| } | |
| phx.Collision.prototype.findVerts = function(arb,poly1,poly2,n,nCoef,dist) { | |
| var id = ((poly1.id > poly2.id)?0:65000); | |
| var c = 0; | |
| var v = poly1.tVerts; | |
| while(v != null) { | |
| if(this.polyContainsPoint(poly2,v)) { | |
| arb.injectContact(v,n.n,nCoef,dist,id); | |
| if(++c > 1) return; | |
| } | |
| id++; | |
| v = v.next; | |
| } | |
| id = ((poly1.id > poly2.id)?65000:0); | |
| v = poly2.tVerts; | |
| while(v != null) { | |
| if(this.polyContainsPoint(poly1,v)) { | |
| arb.injectContact(v,n.n,nCoef,dist,id); | |
| if(++c > 1) return; | |
| } | |
| id++; | |
| v = v.next; | |
| } | |
| } | |
| phx.Collision.prototype.poly2poly = function(shape1,shape2,arb) { | |
| var max1 = -1e+99; | |
| var axis1 = null; | |
| var a = shape1.tAxes; | |
| while(a != null) { | |
| var min = this.polyAxisProject(shape2,a.n,a.d); | |
| if(min > 0) return false; | |
| if(min > max1) { | |
| max1 = min; | |
| axis1 = a; | |
| } | |
| a = a.next; | |
| } | |
| var max2 = -1e+99; | |
| var axis2 = null; | |
| a = shape2.tAxes; | |
| while(a != null) { | |
| var min = this.polyAxisProject(shape1,a.n,a.d); | |
| if(min > 0) return false; | |
| if(min > max2) { | |
| max2 = min; | |
| axis2 = a; | |
| } | |
| a = a.next; | |
| } | |
| if(max1 > max2) this.findVerts(arb,shape1,shape2,axis1,1,max1); | |
| else this.findVerts(arb,shape1,shape2,axis2,-1,max2); | |
| return true; | |
| } | |
| phx.Collision.prototype.polyAxisProject = function(s,n,d) { | |
| var v = s.tVerts; | |
| var min = 1e99; | |
| while(v != null) { | |
| var k = n.x * v.x + n.y * v.y; | |
| if(k < min) min = k; | |
| v = v.next; | |
| } | |
| return min - d; | |
| } | |
| phx.Collision.prototype.polyContainsPoint = function(s,p) { | |
| var a = s.tAxes; | |
| while(a != null) { | |
| if(a.n.dot(p) > a.d) return false; | |
| a = a.next; | |
| } | |
| return true; | |
| } | |
| phx.Collision.prototype.segAxisProject = function(seg,n,d) { | |
| var vA = n.dot(seg.tA) - seg.r; | |
| var vB = n.dot(seg.tB) - seg.r; | |
| return (vA < vB?vA - d:vB - d); | |
| } | |
| phx.Collision.prototype.segment2poly = function(seg,poly,arb) { | |
| var segD = seg.tN.dot(seg.tA); | |
| var minNorm = this.polyAxisProject(poly,seg.tN,segD) - seg.r; | |
| var minNeg = this.polyAxisProject(poly,seg.tNneg,-segD) - seg.r; | |
| if(minNeg > 0 || minNorm > 0) return false; | |
| var a = poly.tAxes; | |
| var polyMin = -1e+99; | |
| var axis = null; | |
| while(a != null) { | |
| var dist = this.segAxisProject(seg,a.n,a.d); | |
| if(dist > 0) return false; | |
| if(dist > polyMin) { | |
| polyMin = dist; | |
| axis = a; | |
| } | |
| a = a.next; | |
| } | |
| var n = axis.n; | |
| var va = new phx.Vector(seg.tA.x - n.x * seg.r,seg.tA.y - n.y * seg.r); | |
| var vb = new phx.Vector(seg.tB.x - n.x * seg.r,seg.tB.y - n.y * seg.r); | |
| if(this.polyContainsPoint(poly,va)) arb.injectContact(va,n,-1.,polyMin,0); | |
| if(this.polyContainsPoint(poly,vb)) arb.injectContact(vb,n,-1.,polyMin,1); | |
| if(minNorm >= polyMin || minNeg >= polyMin) { | |
| if(minNorm > minNeg) this.findPolyPointsBehindSegment(seg,poly,minNorm,1.0,arb); | |
| else this.findPolyPointsBehindSegment(seg,poly,minNeg,-1.,arb); | |
| } | |
| return true; | |
| } | |
| phx.Collision.prototype.testPoint = function(s,p) { | |
| return (function($this) { | |
| var $r; | |
| switch(s.type) { | |
| case 2:{ | |
| $r = $this.polyContainsPoint(s.polygon,p); | |
| }break; | |
| case 0:{ | |
| $r = (function($this) { | |
| var $r; | |
| var c = s.circle; | |
| var dx = c.tC.x - p.x; | |
| var dy = c.tC.y - p.y; | |
| $r = (dx * dx + dy * dy) <= (c.r * c.r); | |
| return $r; | |
| }($this)); | |
| }break; | |
| default:{ | |
| $r = false; | |
| }break; | |
| } | |
| return $r; | |
| }(this)); | |
| } | |
| phx.Collision.prototype.testShapes = function(s1,s2,a) { | |
| return (s1.type == 2 && s2.type == 2?this.poly2poly(s1.polygon,s2.polygon,a):(s1.type == 0?(s2.type == 2?this.circle2poly(s1.circle,s2.polygon,a):(s2.type == 0?this.circle2circle(s1.circle,s2.circle,a):this.circle2segment(s1.circle,s2.segment,a))):(s1.type == 1 && s2.type == 2?this.segment2poly(s1.segment,s2.polygon,a):false))); | |
| } | |
| phx.Collision.prototype.__class__ = phx.Collision; | |
| phx.col.IAABB = function(left,top,right,bottom) { if( left === $_ ) return; { | |
| this.l = left; | |
| this.t = top; | |
| this.r = right; | |
| this.b = bottom; | |
| }} | |
| phx.col.IAABB.__name__ = ["phx","col","IAABB"]; | |
| phx.col.IAABB.prototype.b = null; | |
| phx.col.IAABB.prototype.l = null; | |
| phx.col.IAABB.prototype.r = null; | |
| phx.col.IAABB.prototype.t = null; | |
| phx.col.IAABB.prototype.toString = function() { | |
| return ((((((("[l=" + this.l) + " b=") + this.b) + " r=") + this.r) + " t=") + this.t) + "]"; | |
| } | |
| phx.col.IAABB.prototype.__class__ = phx.col.IAABB; | |
| phx.World = function(worldBoundary,broadphase) { if( worldBoundary === $_ ) return; { | |
| this.bodies = new haxe.FastList(); | |
| this.joints = new haxe.FastList(); | |
| this.arbiters = new haxe.FastList(); | |
| this.properties = new IntHash(); | |
| this.gravity = new phx.Vector(0,0); | |
| this.stamp = 0; | |
| this.debug = false; | |
| this.useIslands = true; | |
| this.sleepEpsilon = 0.002; | |
| this.boundsCheck = 120; | |
| this.allocator = new phx.Allocator(); | |
| this.collision = new phx.Collision(); | |
| this.staticBody = new phx.Body(0,0); | |
| this.staticBody.island = new phx.Island(this); | |
| this.staticBody.updatePhysics(); | |
| this.box = worldBoundary; | |
| this.broadphase = broadphase; | |
| broadphase.init(this.box,this,this.staticBody); | |
| this.timer = new phx.Timer(); | |
| this.islands = new haxe.FastList(); | |
| this.waitingBodies = new haxe.FastList(); | |
| }} | |
| phx.World.__name__ = ["phx","World"]; | |
| phx.World.prototype.activate = function(b) { | |
| var i = b.island; | |
| b.motion = this.sleepEpsilon * 2; | |
| if(i != null && i.sleeping) { | |
| i.sleeping = false; | |
| { var $it5 = i.arbiters.iterator(); | |
| while( $it5.hasNext() ) { var a = $it5.next(); | |
| a.sleeping = false; | |
| }} | |
| } | |
| } | |
| phx.World.prototype.activeCollisions = null; | |
| phx.World.prototype.addBody = function(b) { | |
| this.bodies.add(b); | |
| this.waitingBodies.add(b); | |
| b.properties.count++; | |
| b.motion = this.sleepEpsilon * 2; | |
| this.properties.set(b.properties.id,b.properties); | |
| if(b.isStatic) { | |
| b.mass = Math.POSITIVE_INFINITY; | |
| b.invMass = 0; | |
| b.inertia = Math.POSITIVE_INFINITY; | |
| b.invInertia = 0; | |
| { var $it6 = b.shapes.iterator(); | |
| while( $it6.hasNext() ) { var s = $it6.next(); | |
| s.update(); | |
| }} | |
| } | |
| else b.updatePhysics(); | |
| { var $it7 = b.shapes.iterator(); | |
| while( $it7.hasNext() ) { var s = $it7.next(); | |
| this.broadphase.addShape(s); | |
| }} | |
| } | |
| phx.World.prototype.addJoint = function(j) { | |
| this.joints.add(j); | |
| } | |
| phx.World.prototype.addStaticShape = function(s) { | |
| this.staticBody.addShape(s); | |
| s.update(); | |
| this.broadphase.addShape(s); | |
| return s; | |
| } | |
| phx.World.prototype.allocator = null; | |
| phx.World.prototype.arbiters = null; | |
| phx.World.prototype.bodies = null; | |
| phx.World.prototype.boundsCheck = null; | |
| phx.World.prototype.box = null; | |
| phx.World.prototype.broadphase = null; | |
| phx.World.prototype.buildIslands = function() { | |
| var stack = new haxe.FastList(); | |
| { var $it8 = this.waitingBodies.iterator(); | |
| while( $it8.hasNext() ) { var b = $it8.next(); | |
| { | |
| if(b.island != null || b.isStatic) continue; | |
| var i = this.allocator.allocIsland(this); | |
| this.islands.add(i); | |
| stack.head = new haxe.FastCell(b,stack.head); | |
| b.island = i; | |
| while(true) { | |
| var b1 = stack.pop(); | |
| if(b1 == null) break; | |
| i.bodies.add(b1); | |
| { var $it9 = b1.arbiters.iterator(); | |
| while( $it9.hasNext() ) { var a = $it9.next(); | |
| { | |
| if(a.island != null) continue; | |
| i.arbiters.add(a); | |
| a.island = i; | |
| var b11 = a.s1.body; | |
| if(b11.island == null && !b11.isStatic) { | |
| b11.island = i; | |
| stack.head = new haxe.FastCell(b11,stack.head); | |
| } | |
| var b2 = a.s2.body; | |
| if(b2.island == null && !b2.isStatic) { | |
| b2.island = i; | |
| stack.head = new haxe.FastCell(b2,stack.head); | |
| } | |
| } | |
| }} | |
| } | |
| } | |
| }} | |
| this.waitingBodies = new haxe.FastList(); | |
| } | |
| phx.World.prototype.checkBody = function(b,i) { | |
| if(b.island != i) throw "ASSERT"; | |
| { var $it10 = b.arbiters.iterator(); | |
| while( $it10.hasNext() ) { var a = $it10.next(); | |
| { | |
| if(a.island != i) throw "ASSERT"; | |
| if(a.s1.body.island != i && !a.s1.body.isStatic) throw "ASSERT"; | |
| if(a.s2.body.island != i && !a.s2.body.isStatic) throw "ASSERT"; | |
| } | |
| }} | |
| } | |
| phx.World.prototype.checkDatas = function() { | |
| { var $it11 = this.waitingBodies.iterator(); | |
| while( $it11.hasNext() ) { var b = $it11.next(); | |
| this.checkBody(b,null); | |
| }} | |
| { var $it12 = this.islands.iterator(); | |
| while( $it12.hasNext() ) { var i = $it12.next(); | |
| { var $it13 = i.bodies.iterator(); | |
| while( $it13.hasNext() ) { var b = $it13.next(); | |
| this.checkBody(b,i); | |
| }} | |
| }} | |
| } | |
| phx.World.prototype.collision = null; | |
| phx.World.prototype.debug = null; | |
| phx.World.prototype.destroyIsland = function(i) { | |
| if(i == null || !this.useIslands) return; | |
| if(!this.islands.remove(i)) return; | |
| { var $it14 = i.bodies.iterator(); | |
| while( $it14.hasNext() ) { var b = $it14.next(); | |
| { | |
| b.island = null; | |
| this.waitingBodies.add(b); | |
| } | |
| }} | |
| { var $it15 = i.arbiters.iterator(); | |
| while( $it15.hasNext() ) { var a = $it15.next(); | |
| { | |
| a.sleeping = false; | |
| a.island = null; | |
| } | |
| }} | |
| { var $it16 = i.joints.iterator(); | |
| while( $it16.hasNext() ) { var j = $it16.next(); | |
| j.island = null; | |
| }} | |
| this.allocator.freeIsland(i); | |
| } | |
| phx.World.prototype.gravity = null; | |
| phx.World.prototype.islands = null; | |
| phx.World.prototype.joints = null; | |
| phx.World.prototype.onCollide = function(s1,s2) { | |
| var b1 = s1.body; | |
| var b2 = s2.body; | |
| this.testedCollisions++; | |
| if(b1 == b2 || (s1.groups & s2.groups) == 0) return false; | |
| if(s1.type > s2.type) { | |
| var tmp = s1; | |
| s1 = s2; | |
| s2 = tmp; | |
| } | |
| var pairFound = true; | |
| var a = null; | |
| { var $it17 = b1.arbiters.iterator(); | |
| while( $it17.hasNext() ) { var arb = $it17.next(); | |
| if((arb.s1 == s1 && arb.s2 == s2) || (arb.s1 == s2 && arb.s2 == s1)) { | |
| a = arb; | |
| break; | |
| } | |
| }} | |
| if(a == null) { | |
| a = new phx.Arbiter(this.allocator); | |
| a.assign(s1,s2); | |
| pairFound = false; | |
| } | |
| else if(a.sleeping) { | |
| a.stamp = this.stamp; | |
| return true; | |
| } | |
| else if(a.stamp == this.stamp) return true; | |
| a.sleeping = false; | |
| this.activeCollisions++; | |
| var col = this.collision.testShapes(s1,s2,a); | |
| if(col) { | |
| a.stamp = this.stamp; | |
| if(pairFound) { | |
| a.s1 = s1; | |
| a.s2 = s2; | |
| } | |
| else { | |
| this.arbiters.add(a); | |
| var i1 = b1.island; | |
| if(i1 != b2.island) { | |
| this.destroyIsland(i1); | |
| this.destroyIsland(b2.island); | |
| } | |
| else if(i1 != null) { | |
| i1.arbiters.add(a); | |
| a.island = i1; | |
| } | |
| s2.body.arbiters.add(a); | |
| s1.body.arbiters.add(a); | |
| } | |
| } | |
| else if(!pairFound) null; | |
| return col; | |
| } | |
| phx.World.prototype.properties = null; | |
| phx.World.prototype.removeBody = function(b) { | |
| if(!this.bodies.remove(b)) return false; | |
| b.properties.count--; | |
| if(b.properties.count == 0) this.properties.remove(b.properties.id); | |
| { var $it18 = b.shapes.iterator(); | |
| while( $it18.hasNext() ) { var s = $it18.next(); | |
| this.broadphase.removeShape(s); | |
| }} | |
| this.destroyIsland(b.island); | |
| this.waitingBodies.remove(b); | |
| { var $it19 = b.arbiters.iterator(); | |
| while( $it19.hasNext() ) { var a = $it19.next(); | |
| { | |
| var b1 = a.s1.body; | |
| ((b1 == b?a.s2.body:b1)).arbiters.remove(a); | |
| } | |
| }} | |
| return true; | |
| } | |
| phx.World.prototype.removeJoint = function(j) { | |
| this.joints.remove(j); | |
| this.destroyIsland(j.b1.island); | |
| this.destroyIsland(j.b2.island); | |
| } | |
| phx.World.prototype.removeStaticShape = function(s) { | |
| this.staticBody.removeShape(s); | |
| this.broadphase.removeShape(s); | |
| { var $it20 = this.staticBody.arbiters.iterator(); | |
| while( $it20.hasNext() ) { var a = $it20.next(); | |
| { | |
| if(a.s1 == s || a.s2 == s) { | |
| var body = ((a.s1.body == this.staticBody?a.s2.body:a.s1.body)); | |
| body.arbiters.remove(a); | |
| if(body.island != null) body.island.arbiters.remove(a); | |
| this.staticBody.arbiters.remove(a); | |
| this.arbiters.remove(a); | |
| } | |
| } | |
| }} | |
| } | |
| phx.World.prototype.setBroadPhase = function(bf) { | |
| bf.init(this.box,this,this.staticBody); | |
| { var $it21 = this.bodies.iterator(); | |
| while( $it21.hasNext() ) { var b = $it21.next(); | |
| { | |
| { var $it22 = b.shapes.iterator(); | |
| while( $it22.hasNext() ) { var s = $it22.next(); | |
| { | |
| this.broadphase.removeShape(s); | |
| bf.addShape(s); | |
| } | |
| }} | |
| } | |
| }} | |
| { var $it23 = this.staticBody.shapes.iterator(); | |
| while( $it23.hasNext() ) { var s = $it23.next(); | |
| { | |
| this.broadphase.removeShape(s); | |
| bf.addShape(s); | |
| } | |
| }} | |
| this.broadphase = bf; | |
| } | |
| phx.World.prototype.sleepEpsilon = null; | |
| phx.World.prototype.stamp = null; | |
| phx.World.prototype.staticBody = null; | |
| phx.World.prototype.step = function(dt,iterations) { | |
| if(dt < 1e-99) dt = 0; | |
| this.timer.start("all"); | |
| var invDt = (dt == 0?0:1 / dt); | |
| { var $it24 = this.properties.iterator(); | |
| while( $it24.hasNext() ) { var p = $it24.next(); | |
| { | |
| p.lfdt = Math.pow(p.linearFriction,dt); | |
| p.afdt = Math.pow(p.angularFriction,dt); | |
| } | |
| }} | |
| this.timer.start("island"); | |
| if(this.useIslands) this.buildIslands(); | |
| else { | |
| var i = this.allocator.allocIsland(this); | |
| i.bodies = this.bodies; | |
| i.arbiters = this.arbiters; | |
| i.joints = this.joints; | |
| this.sleepEpsilon = 0; | |
| this.islands = new haxe.FastList(); | |
| this.islands.add(i); | |
| } | |
| if(this.debug) this.checkDatas(); | |
| this.timer.stop(); | |
| this.timer.start("solve"); | |
| { var $it25 = this.islands.iterator(); | |
| while( $it25.hasNext() ) { var i = $it25.next(); | |
| if(!i.sleeping) i.solve(dt,invDt,iterations); | |
| }} | |
| this.timer.stop(); | |
| { var $it26 = this.arbiters.iterator(); | |
| while( $it26.hasNext() ) { var a = $it26.next(); | |
| if(this.stamp - a.stamp > 3) { | |
| this.allocator.freeAllContacts(a.contacts); | |
| var b1 = a.s1.body; | |
| var b2 = a.s2.body; | |
| b1.arbiters.remove(a); | |
| b2.arbiters.remove(a); | |
| this.arbiters.remove(a); | |
| null; | |
| this.destroyIsland(b1.island); | |
| this.destroyIsland(b2.island); | |
| } | |
| }} | |
| this.timer.start("col"); | |
| this.broadphase.commit(); | |
| this.testedCollisions = 0; | |
| this.activeCollisions = 0; | |
| if(this.debug && !this.broadphase.validate()) throw "INVALID BF DATAS"; | |
| this.broadphase.collide(); | |
| this.timer.stop(); | |
| this.stamp++; | |
| if(this.boundsCheck > 0 && this.stamp % this.boundsCheck == 0) { | |
| var tmp = new haxe.FastList(); | |
| { var $it27 = this.bodies.iterator(); | |
| while( $it27.hasNext() ) { var b = $it27.next(); | |
| tmp.head = new haxe.FastCell(b,tmp.head); | |
| }} | |
| { var $it28 = this.broadphase.pick(this.box).iterator(); | |
| while( $it28.hasNext() ) { var s = $it28.next(); | |
| tmp.remove(s.body); | |
| }} | |
| { var $it29 = tmp.iterator(); | |
| while( $it29.hasNext() ) { var b = $it29.next(); | |
| if(this.removeBody(b)) b.onDestroy(); | |
| }} | |
| } | |
| this.timer.stop(); | |
| } | |
| phx.World.prototype.sync = function(b) { | |
| { var $it30 = b.shapes.iterator(); | |
| while( $it30.hasNext() ) { var s = $it30.next(); | |
| { | |
| s.update(); | |
| this.broadphase.syncShape(s); | |
| } | |
| }} | |
| } | |
| phx.World.prototype.testedCollisions = null; | |
| phx.World.prototype.timer = null; | |
| phx.World.prototype.useIslands = null; | |
| phx.World.prototype.waitingBodies = null; | |
| phx.World.prototype.__class__ = phx.World; | |
| phx.World.__interfaces__ = [phx.col.BroadCallback]; | |
| Hash = function(p) { if( p === $_ ) return; { | |
| this.h = {} | |
| if(this.h.__proto__ != null) { | |
| this.h.__proto__ = null; | |
| delete(this.h.__proto__); | |
| } | |
| else null; | |
| }} | |
| Hash.__name__ = ["Hash"]; | |
| Hash.prototype.exists = function(key) { | |
| try { | |
| key = "$" + key; | |
| return this.hasOwnProperty.call(this.h,key); | |
| } | |
| catch( $e31 ) { | |
| { | |
| var e = $e31; | |
| { | |
| for(var i in this.h) | |
| if( i == key ) return true; | |
| ; | |
| return false; | |
| } | |
| } | |
| } | |
| } | |
| Hash.prototype.get = function(key) { | |
| return this.h["$" + key]; | |
| } | |
| Hash.prototype.h = null; | |
| Hash.prototype.iterator = function() { | |
| return { ref : this.h, it : this.keys(), hasNext : function() { | |
| return this.it.hasNext(); | |
| }, next : function() { | |
| var i = this.it.next(); | |
| return this.ref["$" + i]; | |
| }} | |
| } | |
| Hash.prototype.keys = function() { | |
| var a = new Array(); | |
| for(var i in this.h) | |
| a.push(i.substr(1)); | |
| ; | |
| return a.iterator(); | |
| } | |
| Hash.prototype.remove = function(key) { | |
| if(!this.exists(key)) return false; | |
| delete(this.h["$" + key]); | |
| return true; | |
| } | |
| Hash.prototype.set = function(key,value) { | |
| this.h["$" + key] = value; | |
| } | |
| Hash.prototype.toString = function() { | |
| var s = new StringBuf(); | |
| s.b[s.b.length] = "{"; | |
| var it = this.keys(); | |
| { var $it32 = it; | |
| while( $it32.hasNext() ) { var i = $it32.next(); | |
| { | |
| s.b[s.b.length] = i; | |
| s.b[s.b.length] = " => "; | |
| s.b[s.b.length] = Std.string(this.get(i)); | |
| if(it.hasNext()) s.b[s.b.length] = ", "; | |
| } | |
| }} | |
| s.b[s.b.length] = "}"; | |
| return s.b.join(""); | |
| } | |
| Hash.prototype.__class__ = Hash; | |
| phx.Island = function(w) { if( w === $_ ) return; { | |
| this.id = phx.Island.ID++; | |
| this.world = w; | |
| this.sleeping = false; | |
| this.bodies = new haxe.FastList(); | |
| this.joints = new haxe.FastList(); | |
| this.arbiters = new haxe.FastList(); | |
| }} | |
| phx.Island.__name__ = ["phx","Island"]; | |
| phx.Island.prototype.allocNext = null; | |
| phx.Island.prototype.arbiters = null; | |
| phx.Island.prototype.bodies = null; | |
| phx.Island.prototype.energy = null; | |
| phx.Island.prototype.id = null; | |
| phx.Island.prototype.joints = null; | |
| phx.Island.prototype.sleeping = null; | |
| phx.Island.prototype.solve = function(dt,invDt,iterations) { | |
| var g = this.world.gravity; | |
| { var $it33 = this.bodies.iterator(); | |
| while( $it33.hasNext() ) { var b = $it33.next(); | |
| { | |
| var v = b.v; | |
| var p = b.properties; | |
| v.x = v.x * p.lfdt + (g.x + b.f.x * b.invMass) * dt; | |
| v.y = v.y * p.lfdt + (g.y + b.f.y * b.invMass) * dt; | |
| b.w = b.w * p.afdt + (b.t * b.invInertia) * dt; | |
| } | |
| }} | |
| { var $it34 = this.arbiters.iterator(); | |
| while( $it34.hasNext() ) { var a = $it34.next(); | |
| a.preStep(dt); | |
| }} | |
| { var $it35 = this.joints.iterator(); | |
| while( $it35.hasNext() ) { var joint = $it35.next(); | |
| joint.preStep(invDt); | |
| }} | |
| { | |
| var _g = 0; | |
| while(_g < iterations) { | |
| var i = _g++; | |
| { var $it36 = this.arbiters.iterator(); | |
| while( $it36.hasNext() ) { var a = $it36.next(); | |
| a.applyImpulse(); | |
| }} | |
| { var $it37 = this.joints.iterator(); | |
| while( $it37.hasNext() ) { var j = $it37.next(); | |
| j.applyImpuse(); | |
| }} | |
| } | |
| } | |
| var bf = this.world.broadphase; | |
| var e = 0.; | |
| var n = 0; | |
| var M = Math; | |
| { var $it38 = this.bodies.iterator(); | |
| while( $it38.hasNext() ) { var b = $it38.next(); | |
| { | |
| var motion = (b.v.x * b.v.x + b.v.y * b.v.y) + (b.w * b.w) * 30.0; | |
| if(motion > b.properties.maxMotion) { | |
| var k = Math.sqrt(b.properties.maxMotion / motion); | |
| b.v.x *= k; | |
| b.v.y *= k; | |
| b.w *= k; | |
| motion *= k * k; | |
| } | |
| b.x += b.v.x * dt + b.v_bias.x; | |
| b.y += b.v.y * dt + b.v_bias.y; | |
| b.a += b.w * dt + b.w_bias; | |
| b.rcos = M.cos(b.a); | |
| b.rsin = M.sin(b.a); | |
| b.motion = b.motion * 0.95 + (1 - 0.95) * motion; | |
| b.f.x = b.f.y = b.t = 0; | |
| b.v_bias.x = b.v_bias.y = b.w_bias = 0; | |
| e += b.motion; | |
| n++; | |
| { var $it39 = b.shapes.iterator(); | |
| while( $it39.hasNext() ) { var s = $it39.next(); | |
| { | |
| s.update(); | |
| bf.syncShape(s); | |
| } | |
| }} | |
| } | |
| }} | |
| this.energy = e / M.sqrt(n); | |
| if(this.energy < this.world.sleepEpsilon) { | |
| { var $it40 = this.bodies.iterator(); | |
| while( $it40.hasNext() ) { var b = $it40.next(); | |
| { | |
| b.v.x = 0; | |
| b.v.y = 0; | |
| b.w = 0; | |
| } | |
| }} | |
| { var $it41 = this.arbiters.iterator(); | |
| while( $it41.hasNext() ) { var a = $it41.next(); | |
| a.sleeping = true; | |
| }} | |
| this.sleeping = true; | |
| } | |
| } | |
| phx.Island.prototype.world = null; | |
| phx.Island.prototype.__class__ = phx.Island; | |
| Main = function() { } | |
| Main.__name__ = ["Main"]; | |
| Main.board = null; | |
| Main.canvas = null; | |
| Main.getCanvas = function(canvasId) { | |
| var element = js.Lib.document.getElementById(canvasId); | |
| if(element != null && js.Lib.isIE) { | |
| try { | |
| element = js.Lib.window.G_vmlCanvasManager.initElement(element); | |
| } | |
| catch( $e42 ) { | |
| { | |
| var e = $e42; | |
| { | |
| js.Lib.alert("G_vmlCanvasManager.initElement error - excanvas might not be initialized"); | |
| } | |
| } | |
| } | |
| } | |
| return element; | |
| } | |
| Main.tick = function() { | |
| Main.board.tick(); | |
| var ctx = Main.canvas.getContext("2d"); | |
| Main.board.draw(ctx); | |
| } | |
| Main.main = function() { | |
| Main.canvas = Main.getCanvas("hellCanvas"); | |
| Main.board = new Board(); | |
| js.Lib.document.onkeydown = $closure(Main.board,"onKeyDown"); | |
| js.Lib.document.onkeyup = $closure(Main.board,"onKeyUp"); | |
| var timer = new haxe.Timer(Math.round(1000 / 30)); | |
| timer.run = $closure(Main,"tick"); | |
| } | |
| Main.prototype.__class__ = Main; | |
| $Main = function() { } | |
| $Main.__name__ = ["@Main"]; | |
| $Main.prototype.__class__ = $Main; | |
| $_ = {} | |
| js.Boot.__res = {} | |
| js.Boot.__init(); | |
| { | |
| Date.now = function() { | |
| return new Date(); | |
| } | |
| Date.fromTime = function(t) { | |
| var d = new Date(); | |
| d["setTime"](t); | |
| return d; | |
| } | |
| Date.fromString = function(s) { | |
| switch(s.length) { | |
| case 8:{ | |
| var k = s.split(":"); | |
| var d = new Date(); | |
| d["setTime"](0); | |
| d["setUTCHours"](k[0]); | |
| d["setUTCMinutes"](k[1]); | |
| d["setUTCSeconds"](k[2]); | |
| return d; | |
| }break; | |
| case 10:{ | |
| var k = s.split("-"); | |
| return new Date(k[0],k[1] - 1,k[2],0,0,0); | |
| }break; | |
| case 19:{ | |
| var k = s.split(" "); | |
| var y = k[0].split("-"); | |
| var t = k[1].split(":"); | |
| return new Date(y[0],y[1] - 1,y[2],t[0],t[1],t[2]); | |
| }break; | |
| default:{ | |
| throw "Invalid date format : " + s; | |
| }break; | |
| } | |
| } | |
| Date.prototype["toString"] = function() { | |
| var date = this; | |
| var m = date.getMonth() + 1; | |
| var d = date.getDate(); | |
| var h = date.getHours(); | |
| var mi = date.getMinutes(); | |
| var s = date.getSeconds(); | |
| return (((((((((date.getFullYear() + "-") + ((m < 10?"0" + m:"" + m))) + "-") + ((d < 10?"0" + d:"" + d))) + " ") + ((h < 10?"0" + h:"" + h))) + ":") + ((mi < 10?"0" + mi:"" + mi))) + ":") + ((s < 10?"0" + s:"" + s)); | |
| } | |
| Date.prototype.__class__ = Date; | |
| Date.__name__ = ["Date"]; | |
| } | |
| { | |
| String.prototype.__class__ = String; | |
| String.__name__ = ["String"]; | |
| Array.prototype.__class__ = Array; | |
| Array.__name__ = ["Array"]; | |
| Int = { __name__ : ["Int"]} | |
| Dynamic = { __name__ : ["Dynamic"]} | |
| Float = Number; | |
| Float.__name__ = ["Float"]; | |
| Bool = { __ename__ : ["Bool"]} | |
| Class = { __name__ : ["Class"]} | |
| Enum = { } | |
| Void = { __ename__ : ["Void"]} | |
| } | |
| { | |
| Math.NaN = Number["NaN"]; | |
| Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"]; | |
| Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"]; | |
| Math.isFinite = function(i) { | |
| return isFinite(i); | |
| } | |
| Math.isNaN = function(i) { | |
| return isNaN(i); | |
| } | |
| Math.__name__ = ["Math"]; | |
| } | |
| { | |
| js.Lib.document = document; | |
| js.Lib.window = window; | |
| onerror = function(msg,url,line) { | |
| var f = js.Lib.onerror; | |
| if( f == null ) | |
| return false; | |
| return f(msg,[url+":"+line]); | |
| } | |
| } | |
| phx.Shape.ID = 0; | |
| phx.Shape.CIRCLE = 0; | |
| phx.Shape.SEGMENT = 1; | |
| phx.Shape.POLYGON = 2; | |
| phx.Body.ID = 0; | |
| phx.Properties.PID = 0; | |
| phx.Const.FMAX = 1e99; | |
| phx.Const.EPSILON = 1e-99; | |
| phx.Const.WORLD_BOUNDS_FREQ = 120; | |
| phx.Const.DEFAULT_MATERIAL = new phx.Material(0.001,0.81,1); | |
| phx.Const.DEFAULT_PROPERTIES = new phx.Properties(0.999,0.999,0.1,1e99,0.5); | |
| phx.Const.SLEEP_BIAS = 0.95; | |
| phx.Const.DEFAULT_SLEEP_EPSILON = 0.002; | |
| phx.Const.WAKEUP_FACTOR = 2; | |
| phx.Const.ANGULAR_TO_LINEAR = 30.0; | |
| haxe.Timer.arr = new Array(); | |
| js.Lib.onerror = null; | |
| phx.Island.ID = 0; | |
| $Main.init = Main.main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment