Skip to content

Instantly share code, notes, and snippets.

@banthar
Created June 14, 2010 18:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save banthar/438067 to your computer and use it in GitHub Desktop.
Save banthar/438067 to your computer and use it in GitHub Desktop.
hell tetris
// ==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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\
AAD5Q7t/AACAqklEQVR42uydCbxVY/fHdyOlF4kUIZooDZQXSYOpkGhChqKZQiVESF5DInP8jRmS\
qZIpitKguTRqUvgbEipzrxev/d/fp2fd/+7cc+7Z+9zOvfvevX6fz/rc4ez9nH32c5619lrPWr/l\
nH766e5uu+3m7r777uanioqKiopKNgV7U7ZsWbdJkyau48FVUVFRUVEpFNlzzz3NL2effbb72GOP\
uXfccYeKioqKikpWBDtz4YUX/r8R+sc//mF+efzxx12FQqFQKLKNN954I7cR+te//mVe/Pzzz1VU\
VFRUVLIi4H/+53/UCKmoqKioqBFSUVFRUVEjpEZIRUVFRUWNkIqKioqKGiEVFRUVFRU1QioqKioq\
aoRUVFRUVFTUCKmoqKioqBFSUVFRUVFRI6SioqKiokZIRUVFRUVFjZCKioqKSkj54osv3C+//NL9\
3//9XzVCKgUnfOH8Xz7k66+/djdt2uR+9dVXOf9DOMZ/nAjnc/z333/vfvvttznnyvH8zjHJpCC+\
8Kk+twjXJ9e8qxc095J7sm3bNnfLli3u1q1b3V9++cX9448/3P/+97+BGYf/85//mJ9//vmn+9df\
f5nf+ck4BYV///vf7s8//+z+9ttv5udPP/1kPgvXxnXxPz4fwneBz//ZZ59ldP82btxozpfPuqvA\
eFz3d999Z+aGOed3+VuE95bvqP97LCLH8Tnle88YfI/4XeaaeUe4d8wV90uEe8a943zu3a+//hr4\
c2zfvt3Mg3wn+P2HH34w4/z444/m/bkOfufzcg3yPlzL33//nXRc+T8/5fv56aefZjyPaoSKqEHw\
f/H5UvMF4svEF4jfv/nmGyN86WURyCLiHHmNLyLnhF3I8gUXxef/gqYai0Ul78ti+v33382xCIsk\
P+B8WbiyyBBR7EGUeapFJ+Nzzfm9zmTvyYJHGXzyySdmflnMS5cudadNm2ao7J9++mn3gQcecEeN\
GuU+8sgj7gsvvGAW58MPP2z+fv75591x48a506dPd8ePH+9OmTLFfeedd9yJEye6kydPdqdOnWqO\
4ZyRI0eaXi1PPPGEO2HCBPP/p556yn3ooYfcIUOGuL1793avvvpqd+DAge6gQYPcm266ycidd97p\
Pvjgg+59991nxrj55pvd66+/3h02bJgZV65hzpw57ooVK9zFixebn6tWrXKXLVvmfvDBB+Y6+J98\
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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("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
StringTools.htmlUnescape = function(s) {
return s.split("&gt;").join(">").split("&lt;").join("<").split("&amp;").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("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
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