Section 1
//b2CircleDef (Box2D.Collision.Shapes.b2CircleDef)
package Box2D.Collision.Shapes {
import Box2D.Common.Math.*;
public class b2CircleDef extends b2ShapeDef {
public var radius:Number;
public var localPosition:b2Vec2;
public function b2CircleDef(){
localPosition = new b2Vec2(0, 0);
super();
type = b2Shape.e_circleShape;
radius = 1;
}
}
}//package Box2D.Collision.Shapes
Section 2
//b2CircleShape (Box2D.Collision.Shapes.b2CircleShape)
package Box2D.Collision.Shapes {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2CircleShape extends b2Shape {
public var m_localPosition:b2Vec2;
public var m_radius:Number;
public function b2CircleShape(def:b2ShapeDef){
m_localPosition = new b2Vec2();
super(def);
var circleDef:b2CircleDef = (def as b2CircleDef);
m_type = e_circleShape;
m_localPosition.SetV(circleDef.localPosition);
m_radius = circleDef.radius;
}
override public function TestSegment(transform:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{
var sY:Number;
var tMat:b2Mat22 = transform.R;
var positionX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y)));
var positionY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y)));
var sX:Number = (segment.p1.x - positionX);
sY = (segment.p1.y - positionY);
var b:Number = (((sX * sX) + (sY * sY)) - (m_radius * m_radius));
if (b < 0){
lambda[0] = 0;
return (e_startsInsideCollide);
};
var rX:Number = (segment.p2.x - segment.p1.x);
var rY:Number = (segment.p2.y - segment.p1.y);
var c:Number = ((sX * rX) + (sY * rY));
var rr:Number = ((rX * rX) + (rY * rY));
var sigma:Number = ((c * c) - (rr * b));
if ((((sigma < 0)) || ((rr < Number.MIN_VALUE)))){
return (e_missCollide);
};
var a:Number = -((c + Math.sqrt(sigma)));
if ((((0 <= a)) && ((a <= (maxLambda * rr))))){
a = (a / rr);
lambda[0] = a;
normal.x = (sX + (a * rX));
normal.y = (sY + (a * rY));
normal.Normalize();
return (e_hitCollide);
};
return (e_missCollide);
}
public function GetLocalPosition():b2Vec2{
return (m_localPosition);
}
public function GetRadius():Number{
return (m_radius);
}
override public function ComputeSweptAABB(aabb:b2AABB, transform1:b2XForm, transform2:b2XForm):void{
var tMat:b2Mat22;
tMat = transform1.R;
var p1X:Number = (transform1.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y)));
var p1Y:Number = (transform1.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y)));
tMat = transform2.R;
var p2X:Number = (transform2.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y)));
var p2Y:Number = (transform2.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y)));
aabb.lowerBound.Set((((p1X < p2X)) ? p1X : p2X - m_radius), (((p1Y < p2Y)) ? p1Y : p2Y - m_radius));
aabb.upperBound.Set((((p1X > p2X)) ? p1X : p2X + m_radius), (((p1Y > p2Y)) ? p1Y : p2Y + m_radius));
}
override public function ComputeMass(massData:b2MassData):void{
massData.mass = (((m_density * b2Settings.b2_pi) * m_radius) * m_radius);
massData.center.SetV(m_localPosition);
massData.I = (massData.mass * (((0.5 * m_radius) * m_radius) + ((m_localPosition.x * m_localPosition.x) + (m_localPosition.y * m_localPosition.y))));
}
override public function UpdateSweepRadius(center:b2Vec2):void{
var dX:Number = (m_localPosition.x - center.x);
var dY:Number = (m_localPosition.y - center.y);
dX = Math.sqrt(((dX * dX) + (dY * dY)));
m_sweepRadius = ((dX + m_radius) - b2Settings.b2_toiSlop);
}
override public function ComputeAABB(aabb:b2AABB, transform:b2XForm):void{
var tMat:b2Mat22 = transform.R;
var pX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y)));
var pY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y)));
aabb.lowerBound.Set((pX - m_radius), (pY - m_radius));
aabb.upperBound.Set((pX + m_radius), (pY + m_radius));
}
override public function TestPoint(transform:b2XForm, p:b2Vec2):Boolean{
var tMat:b2Mat22 = transform.R;
var dX:Number = (transform.position.x + ((tMat.col1.x * m_localPosition.x) + (tMat.col2.x * m_localPosition.y)));
var dY:Number = (transform.position.y + ((tMat.col1.y * m_localPosition.x) + (tMat.col2.y * m_localPosition.y)));
dX = (p.x - dX);
dY = (p.y - dY);
return ((((dX * dX) + (dY * dY)) <= (m_radius * m_radius)));
}
}
}//package Box2D.Collision.Shapes
Section 3
//b2FilterData (Box2D.Collision.Shapes.b2FilterData)
package Box2D.Collision.Shapes {
public class b2FilterData {
public var maskBits:uint;// = 0xFFFF
public var groupIndex:int;// = 0
public var categoryBits:uint;// = 1
public function b2FilterData(){
super();
}
public function Copy():b2FilterData{
var copy:b2FilterData = new b2FilterData();
copy.categoryBits = categoryBits;
copy.maskBits = maskBits;
copy.groupIndex = groupIndex;
return (copy);
}
}
}//package Box2D.Collision.Shapes
Section 4
//b2MassData (Box2D.Collision.Shapes.b2MassData)
package Box2D.Collision.Shapes {
import Box2D.Common.Math.*;
public class b2MassData {
public var mass:Number;// = 0
public var center:b2Vec2;
public var I:Number;// = 0
public function b2MassData(){
center = new b2Vec2(0, 0);
super();
}
}
}//package Box2D.Collision.Shapes
Section 5
//b2PolygonDef (Box2D.Collision.Shapes.b2PolygonDef)
package Box2D.Collision.Shapes {
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2PolygonDef extends b2ShapeDef {
public var vertices:Array;
public var vertexCount:int;
private static var s_mat:b2Mat22 = new b2Mat22();
public function b2PolygonDef(){
vertices = new Array(b2Settings.b2_maxPolygonVertices);
super();
type = b2Shape.e_polygonShape;
vertexCount = 0;
var i:int;
while (i < b2Settings.b2_maxPolygonVertices) {
vertices[i] = new b2Vec2();
i++;
};
}
public function SetAsOrientedBox(hx:Number, hy:Number, center:b2Vec2=null, angle:Number=0):void{
var xfPosition:b2Vec2;
var xfR:b2Mat22;
var i:int;
vertexCount = 4;
vertices[0].Set(-(hx), -(hy));
vertices[1].Set(hx, -(hy));
vertices[2].Set(hx, hy);
vertices[3].Set(-(hx), hy);
if (center){
xfPosition = center;
xfR = s_mat;
xfR.Set(angle);
i = 0;
while (i < vertexCount) {
center = vertices[i];
hx = (xfPosition.x + ((xfR.col1.x * center.x) + (xfR.col2.x * center.y)));
center.y = (xfPosition.y + ((xfR.col1.y * center.x) + (xfR.col2.y * center.y)));
center.x = hx;
i++;
};
};
}
public function SetAsBox(hx:Number, hy:Number):void{
vertexCount = 4;
vertices[0].Set(-(hx), -(hy));
vertices[1].Set(hx, -(hy));
vertices[2].Set(hx, hy);
vertices[3].Set(-(hx), hy);
}
}
}//package Box2D.Collision.Shapes
Section 6
//b2PolygonShape (Box2D.Collision.Shapes.b2PolygonShape)
package Box2D.Collision.Shapes {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2PolygonShape extends b2Shape {
public var m_coreVertices:Array;
public var m_vertices:Array;
private var s_supportVec:b2Vec2;
public var m_centroid:b2Vec2;
public var m_normals:Array;
public var m_obb:b2OBB;
public var m_vertexCount:int;
private static var s_computeMat:b2Mat22 = new b2Mat22();
private static var s_sweptAABB1:b2AABB = new b2AABB();
private static var s_sweptAABB2:b2AABB = new b2AABB();
public function b2PolygonShape(def:b2ShapeDef){
var i:int;
var edgeX:Number;
var edgeY:Number;
var len:Number;
var n1X:Number;
var n1Y:Number;
var n2X:Number;
var n2Y:Number;
var vX:Number;
var vY:Number;
var dX:Number;
var dY:Number;
var det:Number;
s_supportVec = new b2Vec2();
m_obb = new b2OBB();
m_vertices = new Array(b2Settings.b2_maxPolygonVertices);
m_normals = new Array(b2Settings.b2_maxPolygonVertices);
m_coreVertices = new Array(b2Settings.b2_maxPolygonVertices);
super(def);
m_type = e_polygonShape;
var poly:b2PolygonDef = (def as b2PolygonDef);
m_vertexCount = poly.vertexCount;
var i1:int = i;
var i2:int = i;
i = 0;
while (i < m_vertexCount) {
m_vertices[i] = poly.vertices[i].Copy();
i++;
};
i = 0;
while (i < m_vertexCount) {
i1 = i;
i2 = (((i + 1) < m_vertexCount)) ? (i + 1) : 0;
edgeX = (m_vertices[i2].x - m_vertices[i1].x);
edgeY = (m_vertices[i2].y - m_vertices[i1].y);
len = Math.sqrt(((edgeX * edgeX) + (edgeY * edgeY)));
m_normals[i] = new b2Vec2((edgeY / len), (-(edgeX) / len));
i++;
};
m_centroid = ComputeCentroid(poly.vertices, poly.vertexCount);
ComputeOBB(m_obb, m_vertices, m_vertexCount);
i = 0;
while (i < m_vertexCount) {
i1 = (((i - 1) >= 0)) ? (i - 1) : (m_vertexCount - 1);
i2 = i;
n1X = m_normals[i1].x;
n1Y = m_normals[i1].y;
n2X = m_normals[i2].x;
n2Y = m_normals[i2].y;
vX = (m_vertices[i].x - m_centroid.x);
vY = (m_vertices[i].y - m_centroid.y);
dX = (((n1X * vX) + (n1Y * vY)) - b2Settings.b2_toiSlop);
dY = (((n2X * vX) + (n2Y * vY)) - b2Settings.b2_toiSlop);
det = (1 / ((n1X * n2Y) - (n1Y * n2X)));
m_coreVertices[i] = new b2Vec2(((det * ((n2Y * dX) - (n1Y * dY))) + m_centroid.x), ((det * ((n1X * dY) - (n2X * dX))) + m_centroid.y));
i++;
};
}
override public function ComputeSweptAABB(aabb:b2AABB, transform1:b2XForm, transform2:b2XForm):void{
var aabb1:b2AABB = s_sweptAABB1;
var aabb2:b2AABB = s_sweptAABB2;
ComputeAABB(aabb1, transform1);
ComputeAABB(aabb2, transform2);
aabb.lowerBound.Set(((aabb1.lowerBound.x < aabb2.lowerBound.x)) ? aabb1.lowerBound.x : aabb2.lowerBound.x, ((aabb1.lowerBound.y < aabb2.lowerBound.y)) ? aabb1.lowerBound.y : aabb2.lowerBound.y);
aabb.upperBound.Set(((aabb1.upperBound.x > aabb2.upperBound.x)) ? aabb1.upperBound.x : aabb2.upperBound.x, ((aabb1.upperBound.y > aabb2.upperBound.y)) ? aabb1.upperBound.y : aabb2.upperBound.y);
}
public function GetVertices():Array{
return (m_vertices);
}
public function GetCoreVertices():Array{
return (m_coreVertices);
}
public function GetCentroid():b2Vec2{
return (m_centroid);
}
public function GetOBB():b2OBB{
return (m_obb);
}
public function GetFirstVertex(xf:b2XForm):b2Vec2{
return (b2Math.b2MulX(xf, m_coreVertices[0]));
}
public function Centroid(xf:b2XForm):b2Vec2{
return (b2Math.b2MulX(xf, m_centroid));
}
override public function TestSegment(xf:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{
var tX:Number;
var tY:Number;
var tMat:b2Mat22;
var tVec:b2Vec2;
var numerator:Number;
var denominator:Number;
var lower:Number = 0;
var upper:Number = maxLambda;
tX = (segment.p1.x - xf.position.x);
tY = (segment.p1.y - xf.position.y);
tMat = xf.R;
var p1X:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y));
var p1Y:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y));
tX = (segment.p2.x - xf.position.x);
tY = (segment.p2.y - xf.position.y);
tMat = xf.R;
var p2X:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y));
var p2Y:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y));
var dX:Number = (p2X - p1X);
var dY:Number = (p2Y - p1Y);
var index = -1;
var i:int;
while (i < m_vertexCount) {
tVec = m_vertices[i];
tX = (tVec.x - p1X);
tY = (tVec.y - p1Y);
tVec = m_normals[i];
numerator = ((tVec.x * tX) + (tVec.y * tY));
denominator = ((tVec.x * dX) + (tVec.y * dY));
if ((((denominator < 0)) && ((numerator < (lower * denominator))))){
lower = (numerator / denominator);
index = i;
} else {
if ((((denominator > 0)) && ((numerator < (upper * denominator))))){
upper = (numerator / denominator);
};
};
if (upper < lower){
return (e_missCollide);
};
i++;
};
if (index >= 0){
lambda[0] = lower;
tMat = xf.R;
tVec = m_normals[index];
normal.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
normal.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
return (e_hitCollide);
};
lambda[0] = 0;
return (e_startsInsideCollide);
}
override public function ComputeMass(massData:b2MassData):void{
var p2:b2Vec2;
var p3:b2Vec2;
var e1X:Number;
var e1Y:Number;
var e2X:Number;
var e2Y:Number;
var D:Number;
var triangleArea:Number;
var px:Number;
var py:Number;
var ex1:Number;
var ey1:Number;
var ex2:Number;
var ey2:Number;
var intx2:Number;
var inty2:Number;
var centerX:Number = 0;
var centerY:Number = 0;
var area:Number = 0;
var I:Number = 0;
var p1X:Number = 0;
var p1Y:Number = 0;
var k_inv3:Number = (1 / 3);
var i:int;
while (i < m_vertexCount) {
p2 = m_vertices[i];
p3 = (((i + 1) < m_vertexCount)) ? m_vertices[int((i + 1))] : m_vertices[0];
e1X = (p2.x - p1X);
e1Y = (p2.y - p1Y);
e2X = (p3.x - p1X);
e2Y = (p3.y - p1Y);
D = ((e1X * e2Y) - (e1Y * e2X));
triangleArea = (0.5 * D);
area = (area + triangleArea);
centerX = (centerX + ((triangleArea * k_inv3) * ((p1X + p2.x) + p3.x)));
centerY = (centerY + ((triangleArea * k_inv3) * ((p1Y + p2.y) + p3.y)));
px = p1X;
py = p1Y;
ex1 = e1X;
ey1 = e1Y;
ex2 = e2X;
ey2 = e2Y;
intx2 = ((k_inv3 * ((0.25 * (((ex1 * ex1) + (ex2 * ex1)) + (ex2 * ex2))) + ((px * ex1) + (px * ex2)))) + ((0.5 * px) * px));
inty2 = ((k_inv3 * ((0.25 * (((ey1 * ey1) + (ey2 * ey1)) + (ey2 * ey2))) + ((py * ey1) + (py * ey2)))) + ((0.5 * py) * py));
I = (I + (D * (intx2 + inty2)));
i++;
};
massData.mass = (m_density * area);
centerX = (centerX * (1 / area));
centerY = (centerY * (1 / area));
massData.center.Set(centerX, centerY);
massData.I = (m_density * I);
}
public function GetNormals():Array{
return (m_normals);
}
public function Support(xf:b2XForm, dX:Number, dY:Number):b2Vec2{
var tVec:b2Vec2;
var tMat:b2Mat22;
var value:Number;
tMat = xf.R;
var dLocalX:Number = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
var dLocalY:Number = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
var bestIndex:int;
tVec = m_coreVertices[0];
var bestValue:Number = ((tVec.x * dLocalX) + (tVec.y * dLocalY));
var i = 1;
while (i < m_vertexCount) {
tVec = m_coreVertices[i];
value = ((tVec.x * dLocalX) + (tVec.y * dLocalY));
if (value > bestValue){
bestIndex = i;
bestValue = value;
};
i++;
};
tMat = xf.R;
tVec = m_coreVertices[bestIndex];
s_supportVec.x = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
s_supportVec.y = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
return (s_supportVec);
}
public function GetVertexCount():int{
return (m_vertexCount);
}
override public function ComputeAABB(aabb:b2AABB, xf:b2XForm):void{
var tMat:b2Mat22;
var tVec:b2Vec2;
var R:b2Mat22 = s_computeMat;
tMat = xf.R;
tVec = m_obb.R.col1;
R.col1.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
R.col1.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tVec = m_obb.R.col2;
R.col2.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
R.col2.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
R.Abs();
var absR:b2Mat22 = R;
tVec = m_obb.extents;
var hX:Number = ((absR.col1.x * tVec.x) + (absR.col2.x * tVec.y));
var hY:Number = ((absR.col1.y * tVec.x) + (absR.col2.y * tVec.y));
tMat = xf.R;
tVec = m_obb.center;
var positionX:Number = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var positionY:Number = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
aabb.lowerBound.Set((positionX - hX), (positionY - hY));
aabb.upperBound.Set((positionX + hX), (positionY + hY));
}
override public function UpdateSweepRadius(center:b2Vec2):void{
var tVec:b2Vec2;
var dX:Number;
var dY:Number;
m_sweepRadius = 0;
var i:int;
while (i < m_vertexCount) {
tVec = m_coreVertices[i];
dX = (tVec.x - center.x);
dY = (tVec.y - center.y);
dX = Math.sqrt(((dX * dX) + (dY * dY)));
if (dX > m_sweepRadius){
m_sweepRadius = dX;
};
i++;
};
}
override public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{
var tVec:b2Vec2;
var dot:Number;
var tMat:b2Mat22 = xf.R;
var tX:Number = (p.x - xf.position.x);
var tY:Number = (p.y - xf.position.y);
var pLocalX:Number = ((tX * tMat.col1.x) + (tY * tMat.col1.y));
var pLocalY:Number = ((tX * tMat.col2.x) + (tY * tMat.col2.y));
var i:int;
while (i < m_vertexCount) {
tVec = m_vertices[i];
tX = (pLocalX - tVec.x);
tY = (pLocalY - tVec.y);
tVec = m_normals[i];
dot = ((tVec.x * tX) + (tVec.y * tY));
if (dot > 0){
return (false);
};
i++;
};
return (true);
}
public static function ComputeCentroid(vs:Array, count:int):b2Vec2{
var c:b2Vec2;
var inv3:Number;
var p2:b2Vec2;
var p3:b2Vec2;
var e1X:Number;
var e1Y:Number;
var e2X:Number;
var e2Y:Number;
var D:Number;
var triangleArea:Number;
c = new b2Vec2();
var area:Number = 0;
var p1X:Number = 0;
var p1Y:Number = 0;
inv3 = (1 / 3);
var i:int;
while (i < count) {
p2 = vs[i];
p3 = (((i + 1) < count)) ? vs[int((i + 1))] : vs[0];
e1X = (p2.x - p1X);
e1Y = (p2.y - p1Y);
e2X = (p3.x - p1X);
e2Y = (p3.y - p1Y);
D = ((e1X * e2Y) - (e1Y * e2X));
triangleArea = (0.5 * D);
area = (area + triangleArea);
c.x = (c.x + ((triangleArea * inv3) * ((p1X + p2.x) + p3.x)));
c.y = (c.y + ((triangleArea * inv3) * ((p1Y + p2.y) + p3.y)));
i++;
};
c.x = (c.x * (1 / area));
c.y = (c.y * (1 / area));
return (c);
}
public static function ComputeOBB(obb:b2OBB, vs:Array, count:int):void{
var i:int;
var root:b2Vec2;
var uxX:Number;
var uxY:Number;
var length:Number;
var uyX:Number;
var uyY:Number;
var lowerX:Number;
var lowerY:Number;
var upperX:Number;
var upperY:Number;
var j:int;
var area:Number;
var dX:Number;
var dY:Number;
var rX:Number;
var rY:Number;
var centerX:Number;
var centerY:Number;
var tMat:b2Mat22;
var p:Array = new Array((b2Settings.b2_maxPolygonVertices + 1));
i = 0;
while (i < count) {
p[i] = vs[i];
i++;
};
p[count] = p[0];
var minArea:Number = Number.MAX_VALUE;
i = 1;
while (i <= count) {
root = p[int((i - 1))];
uxX = (p[i].x - root.x);
uxY = (p[i].y - root.y);
length = Math.sqrt(((uxX * uxX) + (uxY * uxY)));
uxX = (uxX / length);
uxY = (uxY / length);
uyX = -(uxY);
uyY = uxX;
lowerX = Number.MAX_VALUE;
lowerY = Number.MAX_VALUE;
upperX = -(Number.MAX_VALUE);
upperY = -(Number.MAX_VALUE);
j = 0;
while (j < count) {
dX = (p[j].x - root.x);
dY = (p[j].y - root.y);
rX = ((uxX * dX) + (uxY * dY));
rY = ((uyX * dX) + (uyY * dY));
if (rX < lowerX){
lowerX = rX;
};
if (rY < lowerY){
lowerY = rY;
};
if (rX > upperX){
upperX = rX;
};
if (rY > upperY){
upperY = rY;
};
j++;
};
area = ((upperX - lowerX) * (upperY - lowerY));
if (area < (0.95 * minArea)){
minArea = area;
obb.R.col1.x = uxX;
obb.R.col1.y = uxY;
obb.R.col2.x = uyX;
obb.R.col2.y = uyY;
centerX = (0.5 * (lowerX + upperX));
centerY = (0.5 * (lowerY + upperY));
tMat = obb.R;
obb.center.x = (root.x + ((tMat.col1.x * centerX) + (tMat.col2.x * centerY)));
obb.center.y = (root.y + ((tMat.col1.y * centerX) + (tMat.col2.y * centerY)));
obb.extents.x = (0.5 * (upperX - lowerX));
obb.extents.y = (0.5 * (upperY - lowerY));
};
i++;
};
}
}
}//package Box2D.Collision.Shapes
Section 7
//b2Shape (Box2D.Collision.Shapes.b2Shape)
package Box2D.Collision.Shapes {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
public class b2Shape {
public var m_next:b2Shape;
public var m_type:int;
public var m_sweepRadius:Number;
public var m_density:Number;
public var m_filter:b2FilterData;
public var m_friction:Number;
public var m_isSensor:Boolean;
public var m_restitution:Number;
public var m_userData;
public var m_proxyId:uint;
public var m_body:b2Body;
public static const e_polygonShape:int = 1;
public static const e_hitCollide:int = 1;
public static const e_missCollide:int = 0;
public static const e_unknownShape:int = -1;
public static const e_circleShape:int = 0;
public static const e_shapeTypeCount:int = 2;
public static const e_startsInsideCollide:int = -1;
private static var s_resetAABB:b2AABB = new b2AABB();
private static var s_syncAABB:b2AABB = new b2AABB();
private static var s_proxyAABB:b2AABB = new b2AABB();
public function b2Shape(def:b2ShapeDef){
super();
m_userData = def.userData;
m_friction = def.friction;
m_restitution = def.restitution;
m_density = def.density;
m_body = null;
m_sweepRadius = 0;
m_next = null;
m_proxyId = b2Pair.b2_nullProxy;
m_filter = def.filter.Copy();
m_isSensor = def.isSensor;
}
public function SetUserData(data):void{
m_userData = data;
}
public function GetSweepRadius():Number{
return (m_sweepRadius);
}
public function GetNext():b2Shape{
return (m_next);
}
public function ComputeSweptAABB(aabb:b2AABB, xf1:b2XForm, xf2:b2XForm):void{
}
public function GetType():int{
return (m_type);
}
public function GetRestitution():Number{
return (m_restitution);
}
public function GetFriction():Number{
return (m_friction);
}
public function GetFilterData():b2FilterData{
return (m_filter.Copy());
}
public function TestSegment(xf:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):int{
return (e_missCollide);
}
public function RefilterProxy(broadPhase:b2BroadPhase, transform:b2XForm):void{
if (m_proxyId == b2Pair.b2_nullProxy){
return;
};
broadPhase.DestroyProxy(m_proxyId);
var aabb:b2AABB = s_resetAABB;
ComputeAABB(aabb, transform);
var inRange:Boolean = broadPhase.InRange(aabb);
if (inRange){
m_proxyId = broadPhase.CreateProxy(aabb, this);
} else {
m_proxyId = b2Pair.b2_nullProxy;
};
}
public function SetFilterData(filter:b2FilterData):void{
m_filter = filter.Copy();
}
public function GetUserData(){
return (m_userData);
}
public function Synchronize(broadPhase:b2BroadPhase, transform1:b2XForm, transform2:b2XForm):Boolean{
if (m_proxyId == b2Pair.b2_nullProxy){
return (false);
};
var aabb:b2AABB = s_syncAABB;
ComputeSweptAABB(aabb, transform1, transform2);
if (broadPhase.InRange(aabb)){
broadPhase.MoveProxy(m_proxyId, aabb);
return (true);
};
return (false);
}
public function ComputeMass(massData:b2MassData):void{
}
public function IsSensor():Boolean{
return (m_isSensor);
}
public function DestroyProxy(broadPhase:b2BroadPhase):void{
if (m_proxyId != b2Pair.b2_nullProxy){
broadPhase.DestroyProxy(m_proxyId);
m_proxyId = b2Pair.b2_nullProxy;
};
}
public function UpdateSweepRadius(center:b2Vec2):void{
}
public function ComputeAABB(aabb:b2AABB, xf:b2XForm):void{
}
public function GetBody():b2Body{
return (m_body);
}
public function CreateProxy(broadPhase:b2BroadPhase, transform:b2XForm):void{
var aabb:b2AABB = s_proxyAABB;
ComputeAABB(aabb, transform);
var inRange:Boolean = broadPhase.InRange(aabb);
if (inRange){
m_proxyId = broadPhase.CreateProxy(aabb, this);
} else {
m_proxyId = b2Pair.b2_nullProxy;
};
}
public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{
return (false);
}
public static function Destroy(shape:b2Shape, allocator):void{
}
public static function Create(def:b2ShapeDef, allocator):b2Shape{
switch (def.type){
case e_circleShape:
return (new b2CircleShape(def));
case e_polygonShape:
return (new b2PolygonShape(def));
default:
return (null);
};
}
}
}//package Box2D.Collision.Shapes
Section 8
//b2ShapeDef (Box2D.Collision.Shapes.b2ShapeDef)
package Box2D.Collision.Shapes {
public class b2ShapeDef {
public var friction:Number;// = 0.2
public var isSensor:Boolean;// = false
public var density:Number;// = 0
public var restitution:Number;// = 0
public var userData;// = null
public var filter:b2FilterData;
public var type:int;
public function b2ShapeDef(){
type = b2Shape.e_unknownShape;
filter = new b2FilterData();
super();
}
}
}//package Box2D.Collision.Shapes
Section 9
//b2AABB (Box2D.Collision.b2AABB)
package Box2D.Collision {
import Box2D.Common.Math.*;
public class b2AABB {
public var upperBound:b2Vec2;
public var lowerBound:b2Vec2;
public function b2AABB(){
lowerBound = new b2Vec2();
upperBound = new b2Vec2();
super();
}
public function IsValid():Boolean{
var dX:Number = (upperBound.x - lowerBound.x);
var dY:Number = (upperBound.y - lowerBound.y);
var valid:Boolean = (((dX >= 0)) && ((dY >= 0)));
valid = ((((valid) && (lowerBound.IsValid()))) && (upperBound.IsValid()));
return (valid);
}
}
}//package Box2D.Collision
Section 10
//b2Bound (Box2D.Collision.b2Bound)
package Box2D.Collision {
public class b2Bound {
public var value:uint;
public var proxyId:uint;
public var stabbingCount:uint;
public function b2Bound(){
super();
}
public function Swap(b:b2Bound):void{
var tempValue:uint = value;
var tempProxyId:uint = proxyId;
var tempStabbingCount:uint = stabbingCount;
value = b.value;
proxyId = b.proxyId;
stabbingCount = b.stabbingCount;
b.value = tempValue;
b.proxyId = tempProxyId;
b.stabbingCount = tempStabbingCount;
}
public function IsLower():Boolean{
return (((value & 1) == 0));
}
public function IsUpper():Boolean{
return (((value & 1) == 1));
}
}
}//package Box2D.Collision
Section 11
//b2BoundValues (Box2D.Collision.b2BoundValues)
package Box2D.Collision {
public class b2BoundValues {
public var lowerValues:Array;
public var upperValues:Array;
public function b2BoundValues(){
lowerValues = [0, 0];
upperValues = [0, 0];
super();
}
}
}//package Box2D.Collision
Section 12
//b2BroadPhase (Box2D.Collision.b2BroadPhase)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2BroadPhase {
public var m_bounds:Array;
public var m_worldAABB:b2AABB;
public var m_querySortKeys:Array;
public var m_freeProxy:uint;
public var m_quantizationFactor:b2Vec2;
public var m_proxyCount:int;
public var m_proxyPool:Array;
public var m_queryResultCount:int;
public var m_pairManager:b2PairManager;
public var m_timeStamp:uint;
public var m_queryResults:Array;
public static const b2_nullEdge:uint = 0xFFFF;
public static const b2_invalid:uint = 0xFFFF;
public static var s_validate:Boolean = false;
public function b2BroadPhase(worldAABB:b2AABB, callback:b2PairCallback){
var i:int;
var tProxy:b2Proxy;
var j:int;
m_pairManager = new b2PairManager();
m_proxyPool = new Array(b2Settings.b2_maxPairs);
m_bounds = new Array((2 * b2Settings.b2_maxProxies));
m_querySortKeys = new Array(b2Settings.b2_maxProxies);
m_queryResults = new Array(b2Settings.b2_maxProxies);
m_quantizationFactor = new b2Vec2();
super();
m_pairManager.Initialize(this, callback);
m_worldAABB = worldAABB;
m_proxyCount = 0;
i = 0;
while (i < b2Settings.b2_maxProxies) {
m_queryResults[i] = 0;
m_querySortKeys[i] = 0;
i++;
};
m_bounds = new Array(2);
i = 0;
while (i < 2) {
m_bounds[i] = new Array((2 * b2Settings.b2_maxProxies));
j = 0;
while (j < (2 * b2Settings.b2_maxProxies)) {
m_bounds[i][j] = new b2Bound();
j++;
};
i++;
};
var dX:Number = (worldAABB.upperBound.x - worldAABB.lowerBound.x);
var dY:Number = (worldAABB.upperBound.y - worldAABB.lowerBound.y);
m_quantizationFactor.x = (b2Settings.USHRT_MAX / dX);
m_quantizationFactor.y = (b2Settings.USHRT_MAX / dY);
i = 0;
while (i < (b2Settings.b2_maxProxies - 1)) {
tProxy = new b2Proxy();
m_proxyPool[i] = tProxy;
tProxy.SetNext((i + 1));
tProxy.timeStamp = 0;
tProxy.overlapCount = b2_invalid;
tProxy.userData = null;
i++;
};
tProxy = new b2Proxy();
m_proxyPool[int((b2Settings.b2_maxProxies - 1))] = tProxy;
tProxy.SetNext(b2Pair.b2_nullProxy);
tProxy.timeStamp = 0;
tProxy.overlapCount = b2_invalid;
tProxy.userData = null;
m_freeProxy = 0;
m_timeStamp = 1;
m_queryResultCount = 0;
}
public function QueryAABB(aabb:b2AABB, userData, maxCount:int):int{
var lowerIndex:uint;
var upperIndex:uint;
var proxy:b2Proxy;
var lowerValues:Array = new Array();
var upperValues:Array = new Array();
ComputeBounds(lowerValues, upperValues, aabb);
var lowerIndexOut:Array = [lowerIndex];
var upperIndexOut:Array = [upperIndex];
Query(lowerIndexOut, upperIndexOut, lowerValues[0], upperValues[0], m_bounds[0], (2 * m_proxyCount), 0);
Query(lowerIndexOut, upperIndexOut, lowerValues[1], upperValues[1], m_bounds[1], (2 * m_proxyCount), 1);
var count:int;
var i:int;
while ((((i < m_queryResultCount)) && ((count < maxCount)))) {
proxy = m_proxyPool[m_queryResults[i]];
userData[i] = proxy.userData;
i++;
count++;
};
m_queryResultCount = 0;
IncrementTimeStamp();
return (count);
}
public function Commit():void{
m_pairManager.Commit();
}
public function GetProxy(proxyId:int):b2Proxy{
var proxy:b2Proxy = m_proxyPool[proxyId];
if ((((proxyId == b2Pair.b2_nullProxy)) || ((proxy.IsValid() == false)))){
return (null);
};
return (proxy);
}
private function IncrementTimeStamp():void{
var i:uint;
if (m_timeStamp == b2Settings.USHRT_MAX){
i = 0;
while (i < b2Settings.b2_maxProxies) {
(m_proxyPool[i] as b2Proxy).timeStamp = 0;
i++;
};
m_timeStamp = 1;
} else {
m_timeStamp++;
};
}
private function Query(lowerQueryOut:Array, upperQueryOut:Array, lowerValue:uint, upperValue:uint, bounds:Array, boundCount:uint, axis:int):void{
var bound:b2Bound;
var i:int;
var s:int;
var proxy:b2Proxy;
var lowerQuery:uint = BinarySearch(bounds, boundCount, lowerValue);
var upperQuery:uint = BinarySearch(bounds, boundCount, upperValue);
var j:uint = lowerQuery;
while (j < upperQuery) {
bound = bounds[j];
if (bound.IsLower()){
IncrementOverlapCount(bound.proxyId);
};
j++;
};
if (lowerQuery > 0){
i = (lowerQuery - 1);
bound = bounds[i];
s = bound.stabbingCount;
while (s) {
bound = bounds[i];
if (bound.IsLower()){
proxy = m_proxyPool[bound.proxyId];
if (lowerQuery <= proxy.upperBounds[axis]){
IncrementOverlapCount(bound.proxyId);
s--;
};
};
i--;
};
};
lowerQueryOut[0] = lowerQuery;
upperQueryOut[0] = upperQuery;
}
private function AddProxyResult(proxyId:uint, proxy:b2Proxy, maxCount:Number, sortKey:Function):void{
var tempKey2:Number;
var tempId2:uint;
var key:Number = sortKey(proxy.userData);
if (key < 0){
return;
};
var i:Number = 0;
while ((((i < m_queryResultCount)) && ((m_querySortKeys[i] < key)))) {
i++;
};
var tempKey:Number = key;
var tempId:uint = proxyId;
m_queryResultCount = (m_queryResultCount + 1);
if (m_queryResultCount > maxCount){
m_queryResultCount = maxCount;
};
while (i < m_queryResultCount) {
tempKey2 = m_querySortKeys[i];
tempId2 = m_queryResults[i];
m_querySortKeys[i] = tempKey;
m_queryResults[i] = tempId;
tempKey = tempKey2;
tempId = tempId2;
i++;
};
}
private function TestOverlapValidate(p1:b2Proxy, p2:b2Proxy):Boolean{
var bounds:Array;
var bound1:b2Bound;
var bound2:b2Bound;
var axis:int;
while (axis < 2) {
bounds = m_bounds[axis];
bound1 = bounds[p1.lowerBounds[axis]];
bound2 = bounds[p2.upperBounds[axis]];
if (bound1.value > bound2.value){
return (false);
};
bound1 = bounds[p1.upperBounds[axis]];
bound2 = bounds[p2.lowerBounds[axis]];
if (bound1.value < bound2.value){
return (false);
};
axis++;
};
return (true);
}
private function ComputeBounds(lowerValues:Array, upperValues:Array, aabb:b2AABB):void{
var minVertexX:Number = aabb.lowerBound.x;
var minVertexY:Number = aabb.lowerBound.y;
minVertexX = b2Math.b2Min(minVertexX, m_worldAABB.upperBound.x);
minVertexY = b2Math.b2Min(minVertexY, m_worldAABB.upperBound.y);
minVertexX = b2Math.b2Max(minVertexX, m_worldAABB.lowerBound.x);
minVertexY = b2Math.b2Max(minVertexY, m_worldAABB.lowerBound.y);
var maxVertexX:Number = aabb.upperBound.x;
var maxVertexY:Number = aabb.upperBound.y;
maxVertexX = b2Math.b2Min(maxVertexX, m_worldAABB.upperBound.x);
maxVertexY = b2Math.b2Min(maxVertexY, m_worldAABB.upperBound.y);
maxVertexX = b2Math.b2Max(maxVertexX, m_worldAABB.lowerBound.x);
maxVertexY = b2Math.b2Max(maxVertexY, m_worldAABB.lowerBound.y);
lowerValues[0] = (uint((m_quantizationFactor.x * (minVertexX - m_worldAABB.lowerBound.x))) & (b2Settings.USHRT_MAX - 1));
upperValues[0] = ((uint((m_quantizationFactor.x * (maxVertexX - m_worldAABB.lowerBound.x))) & 0xFFFF) | 1);
lowerValues[1] = (uint((m_quantizationFactor.y * (minVertexY - m_worldAABB.lowerBound.y))) & (b2Settings.USHRT_MAX - 1));
upperValues[1] = ((uint((m_quantizationFactor.y * (maxVertexY - m_worldAABB.lowerBound.y))) & 0xFFFF) | 1);
}
public function CreateProxy(aabb:b2AABB, userData):uint{
var index:uint;
var proxy:b2Proxy;
var bounds:Array;
var lowerIndex:uint;
var upperIndex:uint;
var lowerIndexOut:Array;
var upperIndexOut:Array;
var tArr:Array;
var j:int;
var tEnd:int;
var tBound1:b2Bound;
var tBound2:b2Bound;
var tBoundAS3:b2Bound;
var tIndex:int;
var proxy2:b2Proxy;
var proxyId:uint = m_freeProxy;
proxy = m_proxyPool[proxyId];
m_freeProxy = proxy.GetNext();
proxy.overlapCount = 0;
proxy.userData = userData;
var boundCount:uint = (2 * m_proxyCount);
var lowerValues:Array = new Array();
var upperValues:Array = new Array();
ComputeBounds(lowerValues, upperValues, aabb);
var axis:int;
while (axis < 2) {
bounds = m_bounds[axis];
lowerIndexOut = [lowerIndex];
upperIndexOut = [upperIndex];
Query(lowerIndexOut, upperIndexOut, lowerValues[axis], upperValues[axis], bounds, boundCount, axis);
lowerIndex = lowerIndexOut[0];
upperIndex = upperIndexOut[0];
tArr = new Array();
tEnd = (boundCount - upperIndex);
j = 0;
while (j < tEnd) {
tArr[j] = new b2Bound();
tBound1 = tArr[j];
tBound2 = bounds[int((upperIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tEnd = tArr.length;
tIndex = (upperIndex + 2);
j = 0;
while (j < tEnd) {
tBound2 = tArr[j];
tBound1 = bounds[int((tIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tArr = new Array();
tEnd = (upperIndex - lowerIndex);
j = 0;
while (j < tEnd) {
tArr[j] = new b2Bound();
tBound1 = tArr[j];
tBound2 = bounds[int((lowerIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tEnd = tArr.length;
tIndex = (lowerIndex + 1);
j = 0;
while (j < tEnd) {
tBound2 = tArr[j];
tBound1 = bounds[int((tIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
upperIndex++;
tBound1 = bounds[lowerIndex];
tBound2 = bounds[upperIndex];
tBound1.value = lowerValues[axis];
tBound1.proxyId = proxyId;
tBound2.value = upperValues[axis];
tBound2.proxyId = proxyId;
tBoundAS3 = bounds[int((lowerIndex - 1))];
tBound1.stabbingCount = ((lowerIndex == 0)) ? 0 : tBoundAS3.stabbingCount;
tBoundAS3 = bounds[int((upperIndex - 1))];
tBound2.stabbingCount = tBoundAS3.stabbingCount;
index = lowerIndex;
while (index < upperIndex) {
tBoundAS3 = bounds[index];
tBoundAS3.stabbingCount++;
index++;
};
index = lowerIndex;
while (index < (boundCount + 2)) {
tBound1 = bounds[index];
proxy2 = m_proxyPool[tBound1.proxyId];
if (tBound1.IsLower()){
proxy2.lowerBounds[axis] = index;
} else {
proxy2.upperBounds[axis] = index;
};
index++;
};
axis++;
};
m_proxyCount++;
var i:int;
while (i < m_queryResultCount) {
m_pairManager.AddBufferedPair(proxyId, m_queryResults[i]);
i++;
};
m_pairManager.Commit();
m_queryResultCount = 0;
IncrementTimeStamp();
return (proxyId);
}
public function DestroyProxy(proxyId:uint):void{
var tBound1:b2Bound;
var tBound2:b2Bound;
var bounds:Array;
var lowerIndex:uint;
var upperIndex:uint;
var lowerValue:uint;
var upperValue:uint;
var tArr:Array;
var j:int;
var tEnd:int;
var tIndex:int;
var index:uint;
var index2:int;
var proxy2:b2Proxy;
var proxy:b2Proxy = m_proxyPool[proxyId];
var boundCount:int = (2 * m_proxyCount);
var axis:int;
while (axis < 2) {
bounds = m_bounds[axis];
lowerIndex = proxy.lowerBounds[axis];
upperIndex = proxy.upperBounds[axis];
tBound1 = bounds[lowerIndex];
lowerValue = tBound1.value;
tBound2 = bounds[upperIndex];
upperValue = tBound2.value;
tArr = new Array();
tEnd = ((upperIndex - lowerIndex) - 1);
j = 0;
while (j < tEnd) {
tArr[j] = new b2Bound();
tBound1 = tArr[j];
tBound2 = bounds[int(((lowerIndex + 1) + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tEnd = tArr.length;
tIndex = lowerIndex;
j = 0;
while (j < tEnd) {
tBound2 = tArr[j];
tBound1 = bounds[int((tIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tArr = new Array();
tEnd = ((boundCount - upperIndex) - 1);
j = 0;
while (j < tEnd) {
tArr[j] = new b2Bound();
tBound1 = tArr[j];
tBound2 = bounds[int(((upperIndex + 1) + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tEnd = tArr.length;
tIndex = (upperIndex - 1);
j = 0;
while (j < tEnd) {
tBound2 = tArr[j];
tBound1 = bounds[int((tIndex + j))];
tBound1.value = tBound2.value;
tBound1.proxyId = tBound2.proxyId;
tBound1.stabbingCount = tBound2.stabbingCount;
j++;
};
tEnd = (boundCount - 2);
index = lowerIndex;
while (index < tEnd) {
tBound1 = bounds[index];
proxy2 = m_proxyPool[tBound1.proxyId];
if (tBound1.IsLower()){
proxy2.lowerBounds[axis] = index;
} else {
proxy2.upperBounds[axis] = index;
};
index++;
};
tEnd = (upperIndex - 1);
index2 = lowerIndex;
while (index2 < tEnd) {
tBound1 = bounds[index2];
tBound1.stabbingCount--;
index2++;
};
Query([0], [0], lowerValue, upperValue, bounds, (boundCount - 2), axis);
axis++;
};
var i:int;
while (i < m_queryResultCount) {
m_pairManager.RemoveBufferedPair(proxyId, m_queryResults[i]);
i++;
};
m_pairManager.Commit();
m_queryResultCount = 0;
IncrementTimeStamp();
proxy.userData = null;
proxy.overlapCount = b2_invalid;
proxy.lowerBounds[0] = b2_invalid;
proxy.lowerBounds[1] = b2_invalid;
proxy.upperBounds[0] = b2_invalid;
proxy.upperBounds[1] = b2_invalid;
proxy.SetNext(m_freeProxy);
m_freeProxy = proxyId;
m_proxyCount--;
}
public function TestOverlap(b:b2BoundValues, p:b2Proxy):Boolean{
var bounds:Array;
var bound:b2Bound;
var axis:int;
while (axis < 2) {
bounds = m_bounds[axis];
bound = bounds[p.upperBounds[axis]];
if (b.lowerValues[axis] > bound.value){
return (false);
};
bound = bounds[p.lowerBounds[axis]];
if (b.upperValues[axis] < bound.value){
return (false);
};
axis++;
};
return (true);
}
public function Validate():void{
var pair:b2Pair;
var proxy1:b2Proxy;
var proxy2:b2Proxy;
var overlap:Boolean;
var bounds:b2Bound;
var boundCount:uint;
var stabbingCount:uint;
var i:uint;
var bound:b2Bound;
var axis:int;
while (axis < 2) {
bounds = m_bounds[axis];
boundCount = (2 * m_proxyCount);
stabbingCount = 0;
i = 0;
while (i < boundCount) {
bound = bounds[i];
if (bound.IsLower() == true){
stabbingCount++;
} else {
stabbingCount--;
};
i++;
};
axis++;
};
}
private function IncrementOverlapCount(proxyId:uint):void{
var proxy:b2Proxy = m_proxyPool[proxyId];
if (proxy.timeStamp < m_timeStamp){
proxy.timeStamp = m_timeStamp;
proxy.overlapCount = 1;
} else {
proxy.overlapCount = 2;
m_queryResults[m_queryResultCount] = proxyId;
m_queryResultCount++;
};
}
public function InRange(aabb:b2AABB):Boolean{
var dX:Number;
var dY:Number;
var d2X:Number;
var d2Y:Number;
dX = aabb.lowerBound.x;
dY = aabb.lowerBound.y;
dX = (dX - m_worldAABB.upperBound.x);
dY = (dY - m_worldAABB.upperBound.y);
d2X = m_worldAABB.lowerBound.x;
d2Y = m_worldAABB.lowerBound.y;
d2X = (d2X - aabb.upperBound.x);
d2Y = (d2Y - aabb.upperBound.y);
dX = b2Math.b2Max(dX, d2X);
dY = b2Math.b2Max(dY, d2Y);
return ((b2Math.b2Max(dX, dY) < 0));
}
public function QuerySegment(segment:b2Segment, userData, maxCount:int, sortKey:Function):int{
var xIndex:int;
var yIndex:int;
var proxyId:uint;
var proxy:b2Proxy;
var lowerIndex:uint;
var upperIndex:uint;
var xProgress:Number;
var yProgress:Number;
var i:Number;
var A:Number;
var B:Number;
var tempValue:uint;
var maxLamda:Number = 1;
var dx:Number = ((segment.p2.x - segment.p1.x) * m_quantizationFactor.x);
var dy:Number = ((segment.p2.y - segment.p1.y) * m_quantizationFactor.y);
var sx:int = ((dx < -(Number.MIN_VALUE))) ? -1 : ((dx > Number.MIN_VALUE)) ? 1 : 0;
var sy:int = ((dy < -(Number.MIN_VALUE))) ? -1 : ((dy > Number.MIN_VALUE)) ? 1 : 0;
var p1x:Number = (m_quantizationFactor.x * (segment.p1.x - m_worldAABB.lowerBound.x));
var p1y:Number = (m_quantizationFactor.y * (segment.p1.y - m_worldAABB.lowerBound.y));
var startValues:Array = new Array();
var startValues2:Array = new Array();
startValues[0] = (uint(p1x) & (b2Settings.USHRT_MAX - 1));
startValues[1] = (uint(p1y) & (b2Settings.USHRT_MAX - 1));
startValues2[0] = (startValues[0] + 1);
startValues2[1] = (startValues[1] + 1);
var startIndices:Array = new Array();
var lowerIndexOut:Array = [lowerIndex];
var upperIndexOut:Array = [upperIndex];
Query(lowerIndexOut, upperIndexOut, startValues[0], startValues2[0], m_bounds[0], (2 * m_proxyCount), 0);
if (sx >= 0){
xIndex = (upperIndexOut[0] - 1);
} else {
xIndex = lowerIndexOut[0];
};
Query(lowerIndexOut, upperIndexOut, startValues[1], startValues2[1], m_bounds[1], (2 * m_proxyCount), 1);
if (sy >= 0){
yIndex = (upperIndexOut[0] - 1);
} else {
yIndex = lowerIndexOut[0];
};
if (sortKey != null){
i = 0;
while (i < m_queryResultCount) {
m_querySortKeys[i] = sortKey(m_proxyPool[m_queryResults[i]].userData);
i++;
};
i = 0;
while (i < (m_queryResultCount - 1)) {
A = m_querySortKeys[i];
B = m_querySortKeys[(i + 1)];
if (((A)<0) ? (B >= 0) : (((A > B)) && ((B >= 0)))){
m_querySortKeys[(i + 1)] = A;
m_querySortKeys[i] = B;
tempValue = m_queryResults[(i + 1)];
m_queryResults[(i + 1)] = m_queryResults[i];
m_queryResults[i] = tempValue;
i--;
if (i == -1){
i = 1;
};
} else {
i++;
};
};
while ((((m_queryResultCount > 0)) && ((m_querySortKeys[(m_queryResultCount - 1)] < 0)))) {
m_queryResultCount--;
};
};
var b:Boolean;
if ((((xIndex < 0)) || ((xIndex >= (m_proxyCount * 2))))){
b = false;
};
if ((((yIndex < 0)) || ((yIndex >= (m_proxyCount * 2))))){
b = false;
};
if (b){
if (sx != 0){
if (sx > 0){
xIndex++;
if (xIndex == (m_proxyCount * 2)){
b = false;
};
} else {
xIndex--;
if (xIndex < 0){
b = false;
};
};
xProgress = ((m_bounds[0][xIndex].value - p1x) / dx);
};
if (sy != 0){
if (sy > 0){
yIndex++;
if (yIndex == (m_proxyCount * 2)){
b = false;
};
} else {
yIndex--;
if (yIndex < 0){
b = false;
};
};
yProgress = ((m_bounds[1][yIndex].value - p1y) / dy);
};
};
while (b) {
if ((((sy == 0)) || (((!((sx == 0))) && ((xProgress < yProgress)))))){
if (xProgress > maxLamda){
break;
};
if (((sx > 0)) ? m_bounds[0][xIndex].IsLower() : m_bounds[0][xIndex].IsUpper()){
proxyId = m_bounds[0][xIndex].proxyId;
proxy = m_proxyPool[proxyId];
if (sy >= 0){
if ((((proxy.lowerBounds[1] <= (yIndex - 1))) && ((proxy.upperBounds[1] >= yIndex)))){
if (sortKey != null){
AddProxyResult(proxyId, proxy, maxCount, sortKey);
} else {
m_queryResults[m_queryResultCount] = proxyId;
m_queryResultCount++;
};
};
} else {
if ((((proxy.lowerBounds[1] <= yIndex)) && ((proxy.upperBounds[1] >= (yIndex + 1))))){
if (sortKey != null){
AddProxyResult(proxyId, proxy, maxCount, sortKey);
} else {
m_queryResults[m_queryResultCount] = proxyId;
m_queryResultCount++;
};
};
};
};
if (((((((!((sortKey == null))) && ((m_queryResultCount == maxCount)))) && ((m_queryResultCount > 0)))) && ((xProgress > m_querySortKeys[(m_queryResultCount - 1)])))){
break;
};
if (sx > 0){
xIndex++;
if (xIndex == (m_proxyCount * 2)){
break;
};
} else {
xIndex--;
if (xIndex < 0){
break;
};
};
xProgress = ((m_bounds[0][xIndex].value - p1x) / dx);
} else {
if (yProgress > maxLamda){
break;
};
if (((sy > 0)) ? m_bounds[1][yIndex].IsLower() : m_bounds[1][yIndex].IsUpper()){
proxyId = m_bounds[1][yIndex].proxyId;
proxy = m_proxyPool[proxyId];
if (sx >= 0){
if ((((proxy.lowerBounds[0] <= (xIndex - 1))) && ((proxy.upperBounds[0] >= xIndex)))){
if (sortKey != null){
AddProxyResult(proxyId, proxy, maxCount, sortKey);
} else {
m_queryResults[m_queryResultCount] = proxyId;
m_queryResultCount++;
};
};
} else {
if ((((proxy.lowerBounds[0] <= xIndex)) && ((proxy.upperBounds[0] >= (xIndex + 1))))){
if (sortKey != null){
AddProxyResult(proxyId, proxy, maxCount, sortKey);
} else {
m_queryResults[m_queryResultCount] = proxyId;
m_queryResultCount++;
};
};
};
};
if (((((((!((sortKey == null))) && ((m_queryResultCount == maxCount)))) && ((m_queryResultCount > 0)))) && ((yProgress > m_querySortKeys[(m_queryResultCount - 1)])))){
break;
};
if (sy > 0){
yIndex++;
if (yIndex == (m_proxyCount * 2)){
break;
};
} else {
yIndex--;
if (yIndex < 0){
break;
};
};
yProgress = ((m_bounds[1][yIndex].value - p1y) / dy);
};
};
var count:int;
i = 0;
while ((((i < m_queryResultCount)) && ((count < maxCount)))) {
proxy = m_proxyPool[m_queryResults[i]];
userData[i] = proxy.userData;
i++;
count++;
};
m_queryResultCount = 0;
IncrementTimeStamp();
return (count);
}
public function MoveProxy(proxyId:uint, aabb:b2AABB):void{
var as3arr:Array;
var as3int:int;
var axis:uint;
var index:uint;
var bound:b2Bound;
var prevBound:b2Bound;
var nextBound:b2Bound;
var nextProxyId:uint;
var nextProxy:b2Proxy;
var bounds:Array;
var lowerIndex:uint;
var upperIndex:uint;
var lowerValue:uint;
var upperValue:uint;
var deltaLower:int;
var deltaUpper:int;
var prevProxyId:uint;
var prevProxy:b2Proxy;
if ((((proxyId == b2Pair.b2_nullProxy)) || ((b2Settings.b2_maxProxies <= proxyId)))){
return;
};
if (aabb.IsValid() == false){
return;
};
var boundCount:uint = (2 * m_proxyCount);
var proxy:b2Proxy = m_proxyPool[proxyId];
var newValues:b2BoundValues = new b2BoundValues();
ComputeBounds(newValues.lowerValues, newValues.upperValues, aabb);
var oldValues:b2BoundValues = new b2BoundValues();
axis = 0;
while (axis < 2) {
bound = m_bounds[axis][proxy.lowerBounds[axis]];
oldValues.lowerValues[axis] = bound.value;
bound = m_bounds[axis][proxy.upperBounds[axis]];
oldValues.upperValues[axis] = bound.value;
axis++;
};
axis = 0;
while (axis < 2) {
bounds = m_bounds[axis];
lowerIndex = proxy.lowerBounds[axis];
upperIndex = proxy.upperBounds[axis];
lowerValue = newValues.lowerValues[axis];
upperValue = newValues.upperValues[axis];
bound = bounds[lowerIndex];
deltaLower = (lowerValue - bound.value);
bound.value = lowerValue;
bound = bounds[upperIndex];
deltaUpper = (upperValue - bound.value);
bound.value = upperValue;
if (deltaLower < 0){
index = lowerIndex;
while ((((index > 0)) && ((lowerValue < (bounds[int((index - 1))] as b2Bound).value)))) {
bound = bounds[index];
prevBound = bounds[int((index - 1))];
prevProxyId = prevBound.proxyId;
prevProxy = m_proxyPool[prevBound.proxyId];
prevBound.stabbingCount++;
if (prevBound.IsUpper() == true){
if (TestOverlap(newValues, prevProxy)){
m_pairManager.AddBufferedPair(proxyId, prevProxyId);
};
as3arr = prevProxy.upperBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.stabbingCount++;
} else {
as3arr = prevProxy.lowerBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.stabbingCount--;
};
as3arr = proxy.lowerBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.Swap(prevBound);
index--;
};
};
if (deltaUpper > 0){
index = upperIndex;
while ((((index < (boundCount - 1))) && (((bounds[int((index + 1))] as b2Bound).value <= upperValue)))) {
bound = bounds[index];
nextBound = bounds[int((index + 1))];
nextProxyId = nextBound.proxyId;
nextProxy = m_proxyPool[nextProxyId];
nextBound.stabbingCount++;
if (nextBound.IsLower() == true){
if (TestOverlap(newValues, nextProxy)){
m_pairManager.AddBufferedPair(proxyId, nextProxyId);
};
as3arr = nextProxy.lowerBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.stabbingCount++;
} else {
as3arr = nextProxy.upperBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.stabbingCount--;
};
as3arr = proxy.upperBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.Swap(nextBound);
index++;
};
};
if (deltaLower > 0){
index = lowerIndex;
while ((((index < (boundCount - 1))) && (((bounds[int((index + 1))] as b2Bound).value <= lowerValue)))) {
bound = bounds[index];
nextBound = bounds[int((index + 1))];
nextProxyId = nextBound.proxyId;
nextProxy = m_proxyPool[nextProxyId];
nextBound.stabbingCount--;
if (nextBound.IsUpper()){
if (TestOverlap(oldValues, nextProxy)){
m_pairManager.RemoveBufferedPair(proxyId, nextProxyId);
};
as3arr = nextProxy.upperBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.stabbingCount--;
} else {
as3arr = nextProxy.lowerBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.stabbingCount++;
};
as3arr = proxy.lowerBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.Swap(nextBound);
index++;
};
};
if (deltaUpper < 0){
index = upperIndex;
while ((((index > 0)) && ((upperValue < (bounds[int((index - 1))] as b2Bound).value)))) {
bound = bounds[index];
prevBound = bounds[int((index - 1))];
prevProxyId = prevBound.proxyId;
prevProxy = m_proxyPool[prevProxyId];
prevBound.stabbingCount--;
if (prevBound.IsLower() == true){
if (TestOverlap(oldValues, prevProxy)){
m_pairManager.RemoveBufferedPair(proxyId, prevProxyId);
};
as3arr = prevProxy.lowerBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.stabbingCount--;
} else {
as3arr = prevProxy.upperBounds;
as3int = as3arr[axis];
as3int++;
as3arr[axis] = as3int;
bound.stabbingCount++;
};
as3arr = proxy.upperBounds;
as3int = as3arr[axis];
as3int--;
as3arr[axis] = as3int;
bound.Swap(prevBound);
index--;
};
};
axis++;
};
}
public static function BinarySearch(bounds:Array, count:int, value:uint):uint{
var mid:int;
var bound:b2Bound;
var low:int;
var high:int = (count - 1);
while (low <= high) {
mid = ((low + high) / 2);
bound = bounds[mid];
if (bound.value > value){
high = (mid - 1);
} else {
if (bound.value < value){
low = (mid + 1);
} else {
return (uint(mid));
};
};
};
return (uint(low));
}
}
}//package Box2D.Collision
Section 13
//b2BufferedPair (Box2D.Collision.b2BufferedPair)
package Box2D.Collision {
public class b2BufferedPair {
public var proxyId1:uint;
public var proxyId2:uint;
public function b2BufferedPair(){
super();
}
}
}//package Box2D.Collision
Section 14
//b2Collision (Box2D.Collision.b2Collision)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.*;
public class b2Collision {
public static const b2_nullFeature:uint = 0xFF;
private static var b2CollidePolyTempVec:b2Vec2 = new b2Vec2();
public function b2Collision(){
super();
}
public static function EdgeSeparation(poly1:b2PolygonShape, xf1:b2XForm, edge1:int, poly2:b2PolygonShape, xf2:b2XForm):Number{
var tMat:b2Mat22;
var tVec:b2Vec2;
var dot:Number;
var count1:int = poly1.m_vertexCount;
var vertices1:Array = poly1.m_vertices;
var normals1:Array = poly1.m_normals;
var count2:int = poly2.m_vertexCount;
var vertices2:Array = poly2.m_vertices;
tMat = xf1.R;
tVec = normals1[edge1];
var normal1WorldX:Number = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
var normal1WorldY:Number = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tMat = xf2.R;
var normal1X:Number = ((tMat.col1.x * normal1WorldX) + (tMat.col1.y * normal1WorldY));
var normal1Y:Number = ((tMat.col2.x * normal1WorldX) + (tMat.col2.y * normal1WorldY));
var index:int;
var minDot:Number = Number.MAX_VALUE;
var i:int;
while (i < count2) {
tVec = vertices2[i];
dot = ((tVec.x * normal1X) + (tVec.y * normal1Y));
if (dot < minDot){
minDot = dot;
index = i;
};
i++;
};
tVec = vertices1[edge1];
tMat = xf1.R;
var v1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var v1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tVec = vertices2[index];
tMat = xf2.R;
var v2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var v2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
v2X = (v2X - v1X);
v2Y = (v2Y - v1Y);
var separation:Number = ((v2X * normal1WorldX) + (v2Y * normal1WorldY));
return (separation);
}
public static function b2TestOverlap(a:b2AABB, b:b2AABB):Boolean{
var t1:b2Vec2 = b.lowerBound;
var t2:b2Vec2 = a.upperBound;
var d1X:Number = (t1.x - t2.x);
var d1Y:Number = (t1.y - t2.y);
t1 = a.lowerBound;
t2 = b.upperBound;
var d2X:Number = (t1.x - t2.x);
var d2Y:Number = (t1.y - t2.y);
if ((((d1X > 0)) || ((d1Y > 0)))){
return (false);
};
if ((((d2X > 0)) || ((d2Y > 0)))){
return (false);
};
return (true);
}
public static function FindIncidentEdge(c:Array, poly1:b2PolygonShape, xf1:b2XForm, edge1:int, poly2:b2PolygonShape, xf2:b2XForm):void{
var tMat:b2Mat22;
var tVec:b2Vec2;
var tClip:ClipVertex;
var dot:Number;
var count1:int = poly1.m_vertexCount;
var normals1:Array = poly1.m_normals;
var count2:int = poly2.m_vertexCount;
var vertices2:Array = poly2.m_vertices;
var normals2:Array = poly2.m_normals;
tMat = xf1.R;
tVec = normals1[edge1];
var normal1X:Number = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
var normal1Y:Number = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tMat = xf2.R;
var tX:Number = ((tMat.col1.x * normal1X) + (tMat.col1.y * normal1Y));
normal1Y = ((tMat.col2.x * normal1X) + (tMat.col2.y * normal1Y));
normal1X = tX;
var index:int;
var minDot:Number = Number.MAX_VALUE;
var i:int;
while (i < count2) {
tVec = normals2[i];
dot = ((normal1X * tVec.x) + (normal1Y * tVec.y));
if (dot < minDot){
minDot = dot;
index = i;
};
i++;
};
var i1:int = index;
var i2:int = (((i1 + 1) < count2)) ? (i1 + 1) : 0;
tClip = c[0];
tVec = vertices2[i1];
tMat = xf2.R;
tClip.v.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
tClip.v.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tClip.id.features.referenceEdge = edge1;
tClip.id.features.incidentEdge = i1;
tClip.id.features.incidentVertex = 0;
tClip = c[1];
tVec = vertices2[i2];
tMat = xf2.R;
tClip.v.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
tClip.v.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tClip.id.features.referenceEdge = edge1;
tClip.id.features.incidentEdge = i2;
tClip.id.features.incidentVertex = 1;
}
public static function b2CollidePolygons(manifold:b2Manifold, polyA:b2PolygonShape, xfA:b2XForm, polyB:b2PolygonShape, xfB:b2XForm):void{
var cv:ClipVertex;
var poly1:b2PolygonShape;
var poly2:b2PolygonShape;
var edge1:int;
var flip:uint;
var np:int;
var v12:b2Vec2;
var separation:Number;
var cp:b2ManifoldPoint;
manifold.pointCount = 0;
var edgeA:int;
var edgeAO:Array = [edgeA];
var separationA:Number = FindMaxSeparation(edgeAO, polyA, xfA, polyB, xfB);
edgeA = edgeAO[0];
if (separationA > 0){
return;
};
var edgeB:int;
var edgeBO:Array = [edgeB];
var separationB:Number = FindMaxSeparation(edgeBO, polyB, xfB, polyA, xfA);
edgeB = edgeBO[0];
if (separationB > 0){
return;
};
var xf1:b2XForm = new b2XForm();
var xf2:b2XForm = new b2XForm();
var k_relativeTol:Number = 0.98;
var k_absoluteTol:Number = 0.001;
if (separationB > ((k_relativeTol * separationA) + k_absoluteTol)){
poly1 = polyB;
poly2 = polyA;
xf1.Set(xfB);
xf2.Set(xfA);
edge1 = edgeB;
flip = 1;
} else {
poly1 = polyA;
poly2 = polyB;
xf1.Set(xfA);
xf2.Set(xfB);
edge1 = edgeA;
flip = 0;
};
var incidentEdge:Array = [new ClipVertex(), new ClipVertex()];
FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
var count1:int = poly1.m_vertexCount;
var vertices1:Array = poly1.m_vertices;
var tVec:b2Vec2 = vertices1[edge1];
var v11:b2Vec2 = tVec.Copy();
if ((edge1 + 1) < count1){
tVec = vertices1[int((edge1 + 1))];
v12 = tVec.Copy();
} else {
tVec = vertices1[0];
v12 = tVec.Copy();
};
var dv:b2Vec2 = b2Math.SubtractVV(v12, v11);
var sideNormal:b2Vec2 = b2Math.b2MulMV(xf1.R, b2Math.SubtractVV(v12, v11));
sideNormal.Normalize();
var frontNormal:b2Vec2 = b2Math.b2CrossVF(sideNormal, 1);
v11 = b2Math.b2MulX(xf1, v11);
v12 = b2Math.b2MulX(xf1, v12);
var frontOffset:Number = b2Math.b2Dot(frontNormal, v11);
var sideOffset1:Number = -(b2Math.b2Dot(sideNormal, v11));
var sideOffset2:Number = b2Math.b2Dot(sideNormal, v12);
var clipPoints1:Array = [new ClipVertex(), new ClipVertex()];
var clipPoints2:Array = [new ClipVertex(), new ClipVertex()];
np = ClipSegmentToLine(clipPoints1, incidentEdge, sideNormal.Negative(), sideOffset1);
if (np < 2){
return;
};
np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2);
if (np < 2){
return;
};
manifold.normal = (flip) ? frontNormal.Negative() : frontNormal.Copy();
var pointCount:int;
var i:int;
while (i < b2Settings.b2_maxManifoldPoints) {
cv = clipPoints2[i];
separation = (b2Math.b2Dot(frontNormal, cv.v) - frontOffset);
if (separation <= 0){
cp = manifold.points[pointCount];
cp.separation = separation;
cp.localPoint1 = b2Math.b2MulXT(xfA, cv.v);
cp.localPoint2 = b2Math.b2MulXT(xfB, cv.v);
cp.id.key = cv.id._key;
cp.id.features.flip = flip;
pointCount++;
};
i++;
};
manifold.pointCount = pointCount;
}
public static function FindMaxSeparation(edgeIndex:Array, poly1:b2PolygonShape, xf1:b2XForm, poly2:b2PolygonShape, xf2:b2XForm):Number{
var tVec:b2Vec2;
var tMat:b2Mat22;
var bestEdge:int;
var bestSeparation:Number;
var increment:int;
var dot:Number;
var count1:int = poly1.m_vertexCount;
var normals1:Array = poly1.m_normals;
tMat = xf2.R;
tVec = poly2.m_centroid;
var dX:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var dY:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tMat = xf1.R;
tVec = poly1.m_centroid;
dX = (dX - (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))));
dY = (dY - (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))));
var dLocal1X:Number = ((dX * xf1.R.col1.x) + (dY * xf1.R.col1.y));
var dLocal1Y:Number = ((dX * xf1.R.col2.x) + (dY * xf1.R.col2.y));
var edge:int;
var maxDot:Number = -(Number.MAX_VALUE);
var i:int;
while (i < count1) {
tVec = normals1[i];
dot = ((tVec.x * dLocal1X) + (tVec.y * dLocal1Y));
if (dot > maxDot){
maxDot = dot;
edge = i;
};
i++;
};
var s:Number = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
if (s > 0){
return (s);
};
var prevEdge:int = (((edge - 1) >= 0)) ? (edge - 1) : (count1 - 1);
var sPrev:Number = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2);
if (sPrev > 0){
return (sPrev);
};
var nextEdge:int = (((edge + 1) < count1)) ? (edge + 1) : 0;
var sNext:Number = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2);
if (sNext > 0){
return (sNext);
};
if ((((sPrev > s)) && ((sPrev > sNext)))){
increment = -1;
bestEdge = prevEdge;
bestSeparation = sPrev;
} else {
if (sNext > s){
increment = 1;
bestEdge = nextEdge;
bestSeparation = sNext;
} else {
edgeIndex[0] = edge;
return (s);
};
};
while (true) {
if (increment == -1){
edge = (((bestEdge - 1) >= 0)) ? (bestEdge - 1) : (count1 - 1);
} else {
edge = (((bestEdge + 1) < count1)) ? (bestEdge + 1) : 0;
};
s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
if (s > 0){
return (s);
};
if (s > bestSeparation){
bestEdge = edge;
bestSeparation = s;
} else {
break;
};
};
edgeIndex[0] = bestEdge;
return (bestSeparation);
}
public static function ClipSegmentToLine(vOut:Array, vIn:Array, normal:b2Vec2, offset:Number):int{
var cv:ClipVertex;
var numOut:int;
var vIn0:b2Vec2;
var vIn1:b2Vec2;
var distance0:Number;
var interp:Number;
var tVec:b2Vec2;
var cv2:ClipVertex;
numOut = 0;
cv = vIn[0];
vIn0 = cv.v;
cv = vIn[1];
vIn1 = cv.v;
distance0 = (b2Math.b2Dot(normal, vIn0) - offset);
var distance1:Number = (b2Math.b2Dot(normal, vIn1) - offset);
if (distance0 <= 0){
var _temp1 = numOut;
numOut = (numOut + 1);
var _local14 = _temp1;
vOut[_local14] = vIn[0];
};
if (distance1 <= 0){
var _temp2 = numOut;
numOut = (numOut + 1);
_local14 = _temp2;
vOut[_local14] = vIn[1];
};
if ((distance0 * distance1) < 0){
interp = (distance0 / (distance0 - distance1));
cv = vOut[numOut];
tVec = cv.v;
tVec.x = (vIn0.x + (interp * (vIn1.x - vIn0.x)));
tVec.y = (vIn0.y + (interp * (vIn1.y - vIn0.y)));
cv = vOut[numOut];
if (distance0 > 0){
cv2 = vIn[0];
cv.id = cv2.id;
} else {
cv2 = vIn[1];
cv.id = cv2.id;
};
numOut++;
};
return (numOut);
}
public static function b2CollideCircles(manifold:b2Manifold, circle1:b2CircleShape, xf1:b2XForm, circle2:b2CircleShape, xf2:b2XForm):void{
var tMat:b2Mat22;
var tVec:b2Vec2;
var separation:Number;
var dist:Number;
var a:Number;
manifold.pointCount = 0;
tMat = xf1.R;
tVec = circle1.m_localPosition;
var p1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var p1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tMat = xf2.R;
tVec = circle2.m_localPosition;
var p2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var p2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
var dX:Number = (p2X - p1X);
var dY:Number = (p2Y - p1Y);
var distSqr:Number = ((dX * dX) + (dY * dY));
var r1:Number = circle1.m_radius;
var r2:Number = circle2.m_radius;
var radiusSum:Number = (r1 + r2);
if (distSqr > (radiusSum * radiusSum)){
return;
};
if (distSqr < Number.MIN_VALUE){
separation = -(radiusSum);
manifold.normal.Set(0, 1);
} else {
dist = Math.sqrt(distSqr);
separation = (dist - radiusSum);
a = (1 / dist);
manifold.normal.x = (a * dX);
manifold.normal.y = (a * dY);
};
manifold.pointCount = 1;
var tPoint:b2ManifoldPoint = manifold.points[0];
tPoint.id.key = 0;
tPoint.separation = separation;
p1X = (p1X + (r1 * manifold.normal.x));
p1Y = (p1Y + (r1 * manifold.normal.y));
p2X = (p2X - (r2 * manifold.normal.x));
p2Y = (p2Y - (r2 * manifold.normal.y));
var pX:Number = (0.5 * (p1X + p2X));
var pY:Number = (0.5 * (p1Y + p2Y));
var tX:Number = (pX - xf1.position.x);
var tY:Number = (pY - xf1.position.y);
tPoint.localPoint1.x = ((tX * xf1.R.col1.x) + (tY * xf1.R.col1.y));
tPoint.localPoint1.y = ((tX * xf1.R.col2.x) + (tY * xf1.R.col2.y));
tX = (pX - xf2.position.x);
tY = (pY - xf2.position.y);
tPoint.localPoint2.x = ((tX * xf2.R.col1.x) + (tY * xf2.R.col1.y));
tPoint.localPoint2.y = ((tX * xf2.R.col2.x) + (tY * xf2.R.col2.y));
}
public static function b2CollidePolygonAndCircle(manifold:b2Manifold, polygon:b2PolygonShape, xf1:b2XForm, circle:b2CircleShape, xf2:b2XForm):void{
var tPoint:b2ManifoldPoint;
var dX:Number;
var dY:Number;
var positionX:Number;
var positionY:Number;
var tVec:b2Vec2;
var tMat:b2Mat22;
var dist:Number;
var pX:Number;
var pY:Number;
var s:Number;
manifold.pointCount = 0;
tMat = xf2.R;
tVec = circle.m_localPosition;
var cX:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var cY:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
dX = (cX - xf1.position.x);
dY = (cY - xf1.position.y);
tMat = xf1.R;
var cLocalX:Number = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
var cLocalY:Number = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
var normalIndex:int;
var separation:Number = -(Number.MAX_VALUE);
var radius:Number = circle.m_radius;
var vertexCount:int = polygon.m_vertexCount;
var vertices:Array = polygon.m_vertices;
var normals:Array = polygon.m_normals;
var i:int;
while (i < vertexCount) {
tVec = vertices[i];
dX = (cLocalX - tVec.x);
dY = (cLocalY - tVec.y);
tVec = normals[i];
s = ((tVec.x * dX) + (tVec.y * dY));
if (s > radius){
return;
};
if (s > separation){
separation = s;
normalIndex = i;
};
i++;
};
if (separation < Number.MIN_VALUE){
manifold.pointCount = 1;
tVec = normals[normalIndex];
tMat = xf1.R;
manifold.normal.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
manifold.normal.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tPoint = manifold.points[0];
tPoint.id.features.incidentEdge = normalIndex;
tPoint.id.features.incidentVertex = b2_nullFeature;
tPoint.id.features.referenceEdge = 0;
tPoint.id.features.flip = 0;
positionX = (cX - (radius * manifold.normal.x));
positionY = (cY - (radius * manifold.normal.y));
dX = (positionX - xf1.position.x);
dY = (positionY - xf1.position.y);
tMat = xf1.R;
tPoint.localPoint1.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
tPoint.localPoint1.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
dX = (positionX - xf2.position.x);
dY = (positionY - xf2.position.y);
tMat = xf2.R;
tPoint.localPoint2.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
tPoint.localPoint2.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
tPoint.separation = (separation - radius);
return;
};
var vertIndex1:int = normalIndex;
var vertIndex2:int = (((vertIndex1 + 1) < vertexCount)) ? (vertIndex1 + 1) : 0;
tVec = vertices[vertIndex1];
var tVec2:b2Vec2 = vertices[vertIndex2];
var eX:Number = (tVec2.x - tVec.x);
var eY:Number = (tVec2.y - tVec.y);
var length:Number = Math.sqrt(((eX * eX) + (eY * eY)));
eX = (eX / length);
eY = (eY / length);
dX = (cLocalX - tVec.x);
dY = (cLocalY - tVec.y);
var u:Number = ((dX * eX) + (dY * eY));
tPoint = manifold.points[0];
if (u <= 0){
pX = tVec.x;
pY = tVec.y;
tPoint.id.features.incidentEdge = b2_nullFeature;
tPoint.id.features.incidentVertex = vertIndex1;
} else {
if (u >= length){
pX = tVec2.x;
pY = tVec2.y;
tPoint.id.features.incidentEdge = b2_nullFeature;
tPoint.id.features.incidentVertex = vertIndex2;
} else {
pX = ((eX * u) + tVec.x);
pY = ((eY * u) + tVec.y);
tPoint.id.features.incidentEdge = normalIndex;
tPoint.id.features.incidentVertex = 0;
};
};
dX = (cLocalX - pX);
dY = (cLocalY - pY);
dist = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / dist);
dY = (dY / dist);
if (dist > radius){
return;
};
manifold.pointCount = 1;
tMat = xf1.R;
manifold.normal.x = ((tMat.col1.x * dX) + (tMat.col2.x * dY));
manifold.normal.y = ((tMat.col1.y * dX) + (tMat.col2.y * dY));
positionX = (cX - (radius * manifold.normal.x));
positionY = (cY - (radius * manifold.normal.y));
dX = (positionX - xf1.position.x);
dY = (positionY - xf1.position.y);
tMat = xf1.R;
tPoint.localPoint1.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
tPoint.localPoint1.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
dX = (positionX - xf2.position.x);
dY = (positionY - xf2.position.y);
tMat = xf2.R;
tPoint.localPoint2.x = ((dX * tMat.col1.x) + (dY * tMat.col1.y));
tPoint.localPoint2.y = ((dX * tMat.col2.x) + (dY * tMat.col2.y));
tPoint.separation = (dist - radius);
tPoint.id.features.referenceEdge = 0;
tPoint.id.features.flip = 0;
}
}
}//package Box2D.Collision
Section 15
//b2ContactID (Box2D.Collision.b2ContactID)
package Box2D.Collision {
public class b2ContactID {
public var _key:uint;
public var features:Features;
public function b2ContactID(){
features = new Features();
super();
features._m_id = this;
}
public function Set(id:b2ContactID):void{
key = id._key;
}
public function Copy():b2ContactID{
var id:b2ContactID = new b2ContactID();
id.key = key;
return (id);
}
public function set key(value:uint):void{
_key = value;
features._referenceEdge = (_key & 0xFF);
features._incidentEdge = (((_key & 0xFF00) >> 8) & 0xFF);
features._incidentVertex = (((_key & 0xFF0000) >> 16) & 0xFF);
features._flip = (((_key & 4278190080) >> 24) & 0xFF);
}
public function get key():uint{
return (_key);
}
}
}//package Box2D.Collision
Section 16
//b2ContactPoint (Box2D.Collision.b2ContactPoint)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
public class b2ContactPoint {
public var friction:Number;
public var separation:Number;
public var normal:b2Vec2;
public var position:b2Vec2;
public var restitution:Number;
public var shape1:b2Shape;
public var shape2:b2Shape;
public var id:b2ContactID;
public var velocity:b2Vec2;
public function b2ContactPoint(){
position = new b2Vec2();
velocity = new b2Vec2();
normal = new b2Vec2();
id = new b2ContactID();
super();
}
}
}//package Box2D.Collision
Section 17
//b2Distance (Box2D.Collision.b2Distance)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.*;
public class b2Distance {
private static var s_p2s:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()];
private static var s_p1s:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()];
private static var s_points:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2()];
private static var gPoint:b2Point = new b2Point();
public static var g_GJK_Iterations:int = 0;
public function b2Distance(){
super();
}
public static function InPoints(w:b2Vec2, points:Array, pointCount:int):Boolean{
var points_i:b2Vec2;
var dX:Number;
var dY:Number;
var mX:Number;
var mY:Number;
var k_tolerance:Number = (100 * Number.MIN_VALUE);
var i:int;
while (i < pointCount) {
points_i = points[i];
dX = Math.abs((w.x - points_i.x));
dY = Math.abs((w.y - points_i.y));
mX = Math.max(Math.abs(w.x), Math.abs(points_i.x));
mY = Math.max(Math.abs(w.y), Math.abs(points_i.y));
if ((((dX < (k_tolerance * (mX + 1)))) && ((dY < (k_tolerance * (mY + 1)))))){
return (true);
};
i++;
};
return (false);
}
public static function DistanceGeneric(x1:b2Vec2, x2:b2Vec2, shape1, xf1:b2XForm, shape2, xf2:b2XForm):Number{
var tVec:b2Vec2;
var vX:Number;
var vY:Number;
var w1:b2Vec2;
var w2:b2Vec2;
var wX:Number;
var wY:Number;
var vw:Number;
var maxSqr:Number;
var i:int;
var p1s:Array = s_p1s;
var p2s:Array = s_p2s;
var points:Array = s_points;
var pointCount:int;
x1.SetV(shape1.GetFirstVertex(xf1));
x2.SetV(shape2.GetFirstVertex(xf2));
var vSqr:Number = 0;
var maxIterations = 20;
var iter:int;
while (iter < maxIterations) {
vX = (x2.x - x1.x);
vY = (x2.y - x1.y);
w1 = shape1.Support(xf1, vX, vY);
w2 = shape2.Support(xf2, -(vX), -(vY));
vSqr = ((vX * vX) + (vY * vY));
wX = (w2.x - w1.x);
wY = (w2.y - w1.y);
vw = ((vX * wX) + (vY * wY));
if ((vSqr - ((vX * wX) + (vY * wY))) <= (0.01 * vSqr)){
if (pointCount == 0){
x1.SetV(w1);
x2.SetV(w2);
};
g_GJK_Iterations = iter;
return (Math.sqrt(vSqr));
};
switch (pointCount){
case 0:
tVec = p1s[0];
tVec.SetV(w1);
tVec = p2s[0];
tVec.SetV(w2);
tVec = points[0];
tVec.x = wX;
tVec.y = wY;
x1.SetV(p1s[0]);
x2.SetV(p2s[0]);
pointCount++;
break;
case 1:
tVec = p1s[1];
tVec.SetV(w1);
tVec = p2s[1];
tVec.SetV(w2);
tVec = points[1];
tVec.x = wX;
tVec.y = wY;
pointCount = ProcessTwo(x1, x2, p1s, p2s, points);
break;
case 2:
tVec = p1s[2];
tVec.SetV(w1);
tVec = p2s[2];
tVec.SetV(w2);
tVec = points[2];
tVec.x = wX;
tVec.y = wY;
pointCount = ProcessThree(x1, x2, p1s, p2s, points);
break;
};
if (pointCount == 3){
g_GJK_Iterations = iter;
return (0);
};
maxSqr = -(Number.MAX_VALUE);
i = 0;
while (i < pointCount) {
tVec = points[i];
maxSqr = b2Math.b2Max(maxSqr, ((tVec.x * tVec.x) + (tVec.y * tVec.y)));
i++;
};
if ((((pointCount == 3)) || ((vSqr <= ((100 * Number.MIN_VALUE) * maxSqr))))){
g_GJK_Iterations = iter;
vX = (x2.x - x1.x);
vY = (x2.y - x1.y);
vSqr = ((vX * vX) + (vY * vY));
return (Math.sqrt(vSqr));
};
iter++;
};
g_GJK_Iterations = maxIterations;
return (Math.sqrt(vSqr));
}
public static function DistanceCC(x1:b2Vec2, x2:b2Vec2, circle1:b2CircleShape, xf1:b2XForm, circle2:b2CircleShape, xf2:b2XForm):Number{
var tMat:b2Mat22;
var tVec:b2Vec2;
var dLen:Number;
var distance:Number;
tMat = xf1.R;
tVec = circle1.m_localPosition;
var p1X:Number = (xf1.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var p1Y:Number = (xf1.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
tMat = xf2.R;
tVec = circle2.m_localPosition;
var p2X:Number = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
var p2Y:Number = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
var dX:Number = (p2X - p1X);
var dY:Number = (p2Y - p1Y);
var dSqr:Number = ((dX * dX) + (dY * dY));
var r1:Number = (circle1.m_radius - b2Settings.b2_toiSlop);
var r2:Number = (circle2.m_radius - b2Settings.b2_toiSlop);
var r:Number = (r1 + r2);
if (dSqr > (r * r)){
dLen = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / dLen);
dY = (dY / dLen);
distance = (dLen - r);
x1.x = (p1X + (r1 * dX));
x1.y = (p1Y + (r1 * dY));
x2.x = (p2X - (r2 * dX));
x2.y = (p2Y - (r2 * dY));
return (distance);
};
if (dSqr > (Number.MIN_VALUE * Number.MIN_VALUE)){
dLen = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / dLen);
dY = (dY / dLen);
x1.x = (p1X + (r1 * dX));
x1.y = (p1Y + (r1 * dY));
x2.x = x1.x;
x2.y = x1.y;
return (0);
};
x1.x = p1X;
x1.y = p1Y;
x2.x = x1.x;
x2.y = x1.y;
return (0);
}
public static function ProcessThree(x1:b2Vec2, x2:b2Vec2, p1s:Array, p2s:Array, points:Array):int{
var points_0:b2Vec2;
var points_1:b2Vec2;
var points_2:b2Vec2;
var p1s_0:b2Vec2;
var p1s_1:b2Vec2;
var p1s_2:b2Vec2;
var p2s_0:b2Vec2;
var p2s_1:b2Vec2;
var lambda:Number;
points_0 = points[0];
points_1 = points[1];
points_2 = points[2];
p1s_0 = p1s[0];
p1s_1 = p1s[1];
p1s_2 = p1s[2];
p2s_0 = p2s[0];
p2s_1 = p2s[1];
var p2s_2:b2Vec2 = p2s[2];
var aX:Number = points_0.x;
var aY:Number = points_0.y;
var bX:Number = points_1.x;
var bY:Number = points_1.y;
var cX:Number = points_2.x;
var cY:Number = points_2.y;
var abX:Number = (bX - aX);
var abY:Number = (bY - aY);
var acX:Number = (cX - aX);
var acY:Number = (cY - aY);
var bcX:Number = (cX - bX);
var bcY:Number = (cY - bY);
var sn:Number = -(((aX * abX) + (aY * abY)));
var sd:Number = ((bX * abX) + (bY * abY));
var tn:Number = -(((aX * acX) + (aY * acY)));
var td:Number = ((cX * acX) + (cY * acY));
var un:Number = -(((bX * bcX) + (bY * bcY)));
var ud:Number = ((cX * bcX) + (cY * bcY));
if ((((td <= 0)) && ((ud <= 0)))){
x1.SetV(p1s_2);
x2.SetV(p2s_2);
p1s_0.SetV(p1s_2);
p2s_0.SetV(p2s_2);
points_0.SetV(points_2);
return (1);
};
var n:Number = ((abX * acY) - (abY * acX));
var vc:Number = (n * ((aX * bY) - (aY * bX)));
var va:Number = (n * ((bX * cY) - (bY * cX)));
if ((((((((va <= 0)) && ((un >= 0)))) && ((ud >= 0)))) && (((un + ud) > 0)))){
lambda = (un / (un + ud));
x1.x = (p1s_1.x + (lambda * (p1s_2.x - p1s_1.x)));
x1.y = (p1s_1.y + (lambda * (p1s_2.y - p1s_1.y)));
x2.x = (p2s_1.x + (lambda * (p2s_2.x - p2s_1.x)));
x2.y = (p2s_1.y + (lambda * (p2s_2.y - p2s_1.y)));
p1s_0.SetV(p1s_2);
p2s_0.SetV(p2s_2);
points_0.SetV(points_2);
return (2);
};
var vb:Number = (n * ((cX * aY) - (cY * aX)));
if ((((((((vb <= 0)) && ((tn >= 0)))) && ((td >= 0)))) && (((tn + td) > 0)))){
lambda = (tn / (tn + td));
x1.x = (p1s_0.x + (lambda * (p1s_2.x - p1s_0.x)));
x1.y = (p1s_0.y + (lambda * (p1s_2.y - p1s_0.y)));
x2.x = (p2s_0.x + (lambda * (p2s_2.x - p2s_0.x)));
x2.y = (p2s_0.y + (lambda * (p2s_2.y - p2s_0.y)));
p1s_1.SetV(p1s_2);
p2s_1.SetV(p2s_2);
points_1.SetV(points_2);
return (2);
};
var denom:Number = ((va + vb) + vc);
denom = (1 / denom);
var u:Number = (va * denom);
var v:Number = (vb * denom);
var w:Number = ((1 - u) - v);
x1.x = (((u * p1s_0.x) + (v * p1s_1.x)) + (w * p1s_2.x));
x1.y = (((u * p1s_0.y) + (v * p1s_1.y)) + (w * p1s_2.y));
x2.x = (((u * p2s_0.x) + (v * p2s_1.x)) + (w * p2s_2.x));
x2.y = (((u * p2s_0.y) + (v * p2s_1.y)) + (w * p2s_2.y));
return (3);
}
public static function DistancePC(x1:b2Vec2, x2:b2Vec2, polygon:b2PolygonShape, xf1:b2XForm, circle:b2CircleShape, xf2:b2XForm):Number{
var tMat:b2Mat22;
var tVec:b2Vec2;
var dX:Number;
var dY:Number;
var dLen:Number;
var point:b2Point = gPoint;
tVec = circle.m_localPosition;
tMat = xf2.R;
point.p.x = (xf2.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
point.p.y = (xf2.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
var distance:Number = DistanceGeneric(x1, x2, polygon, xf1, point, b2Math.b2XForm_identity);
var r:Number = (circle.m_radius - b2Settings.b2_toiSlop);
if (distance > r){
distance = (distance - r);
dX = (x2.x - x1.x);
dY = (x2.y - x1.y);
dLen = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / dLen);
dY = (dY / dLen);
x2.x = (x2.x - (r * dX));
x2.y = (x2.y - (r * dY));
} else {
distance = 0;
x2.x = x1.x;
x2.y = x1.y;
};
return (distance);
}
public static function Distance(x1:b2Vec2, x2:b2Vec2, shape1:b2Shape, xf1:b2XForm, shape2:b2Shape, xf2:b2XForm):Number{
var type1:int = shape1.m_type;
var type2:int = shape2.m_type;
if ((((type1 == b2Shape.e_circleShape)) && ((type2 == b2Shape.e_circleShape)))){
return (DistanceCC(x1, x2, (shape1 as b2CircleShape), xf1, (shape2 as b2CircleShape), xf2));
};
if ((((type1 == b2Shape.e_polygonShape)) && ((type2 == b2Shape.e_circleShape)))){
return (DistancePC(x1, x2, (shape1 as b2PolygonShape), xf1, (shape2 as b2CircleShape), xf2));
};
if ((((type1 == b2Shape.e_circleShape)) && ((type2 == b2Shape.e_polygonShape)))){
return (DistancePC(x2, x1, (shape2 as b2PolygonShape), xf2, (shape1 as b2CircleShape), xf1));
};
if ((((type1 == b2Shape.e_polygonShape)) && ((type2 == b2Shape.e_polygonShape)))){
return (DistanceGeneric(x1, x2, (shape1 as b2PolygonShape), xf1, (shape2 as b2PolygonShape), xf2));
};
return (0);
}
public static function ProcessTwo(x1:b2Vec2, x2:b2Vec2, p1s:Array, p2s:Array, points:Array):int{
var p1s_1:b2Vec2;
var p2s_0:b2Vec2;
var p2s_1:b2Vec2;
var lambda:Number;
var points_0:b2Vec2 = points[0];
var points_1:b2Vec2 = points[1];
var p1s_0:b2Vec2 = p1s[0];
p1s_1 = p1s[1];
p2s_0 = p2s[0];
p2s_1 = p2s[1];
var rX:Number = -(points_1.x);
var rY:Number = -(points_1.y);
var dX:Number = (points_0.x - points_1.x);
var dY:Number = (points_0.y - points_1.y);
var length:Number = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / length);
dY = (dY / length);
lambda = ((rX * dX) + (rY * dY));
if ((((lambda <= 0)) || ((length < Number.MIN_VALUE)))){
x1.SetV(p1s_1);
x2.SetV(p2s_1);
p1s_0.SetV(p1s_1);
p2s_0.SetV(p2s_1);
points_0.SetV(points_1);
return (1);
};
lambda = (lambda / length);
x1.x = (p1s_1.x + (lambda * (p1s_0.x - p1s_1.x)));
x1.y = (p1s_1.y + (lambda * (p1s_0.y - p1s_1.y)));
x2.x = (p2s_1.x + (lambda * (p2s_0.x - p2s_1.x)));
x2.y = (p2s_1.y + (lambda * (p2s_0.y - p2s_1.y)));
return (2);
}
}
}//package Box2D.Collision
Section 18
//b2Manifold (Box2D.Collision.b2Manifold)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2Manifold {
public var pointCount:int;// = 0
public var normal:b2Vec2;
public var points:Array;
public function b2Manifold(){
super();
points = new Array(b2Settings.b2_maxManifoldPoints);
var i:int;
while (i < b2Settings.b2_maxManifoldPoints) {
points[i] = new b2ManifoldPoint();
i++;
};
normal = new b2Vec2();
}
public function Set(m:b2Manifold):void{
pointCount = m.pointCount;
var i:int;
while (i < b2Settings.b2_maxManifoldPoints) {
(points[i] as b2ManifoldPoint).Set(m.points[i]);
i++;
};
normal.SetV(m.normal);
}
public function Reset():void{
var i:int;
while (i < b2Settings.b2_maxManifoldPoints) {
(points[i] as b2ManifoldPoint).Reset();
i++;
};
normal.SetZero();
pointCount = 0;
}
}
}//package Box2D.Collision
Section 19
//b2ManifoldPoint (Box2D.Collision.b2ManifoldPoint)
package Box2D.Collision {
import Box2D.Common.Math.*;
public class b2ManifoldPoint {
public var separation:Number;
public var localPoint2:b2Vec2;
public var normalImpulse:Number;
public var tangentImpulse:Number;
public var localPoint1:b2Vec2;
public var id:b2ContactID;
public function b2ManifoldPoint(){
localPoint1 = new b2Vec2();
localPoint2 = new b2Vec2();
id = new b2ContactID();
super();
}
public function Set(m:b2ManifoldPoint):void{
localPoint1.SetV(m.localPoint1);
localPoint2.SetV(m.localPoint2);
separation = m.separation;
normalImpulse = m.normalImpulse;
tangentImpulse = m.tangentImpulse;
id.key = m.id.key;
}
public function Reset():void{
localPoint1.SetZero();
localPoint2.SetZero();
separation = 0;
normalImpulse = 0;
tangentImpulse = 0;
id.key = 0;
}
}
}//package Box2D.Collision
Section 20
//b2OBB (Box2D.Collision.b2OBB)
package Box2D.Collision {
import Box2D.Common.Math.*;
public class b2OBB {
public var R:b2Mat22;
public var center:b2Vec2;
public var extents:b2Vec2;
public function b2OBB(){
R = new b2Mat22();
center = new b2Vec2();
extents = new b2Vec2();
super();
}
}
}//package Box2D.Collision
Section 21
//b2Pair (Box2D.Collision.b2Pair)
package Box2D.Collision {
import Box2D.Common.*;
public class b2Pair {
public var proxyId1:uint;
public var userData;// = null
public var proxyId2:uint;
public var status:uint;
public var next:uint;
public static var e_pairFinal:uint = 4;
public static var b2_tableMask:int = (b2_tableCapacity - 1);
public static var e_pairRemoved:uint = 2;
public static var b2_nullPair:uint = b2Settings.USHRT_MAX;
public static var e_pairBuffered:uint = 1;
public static var b2_nullProxy:uint = b2Settings.USHRT_MAX;
public static var b2_tableCapacity:int = b2Settings.b2_maxPairs;
public function b2Pair(){
super();
}
public function SetBuffered():void{
status = (status | e_pairBuffered);
}
public function IsBuffered():Boolean{
return (((status & e_pairBuffered) == e_pairBuffered));
}
public function IsFinal():Boolean{
return (((status & e_pairFinal) == e_pairFinal));
}
public function ClearRemoved():void{
status = (status & ~(e_pairRemoved));
}
public function SetFinal():void{
status = (status | e_pairFinal);
}
public function IsRemoved():Boolean{
return (((status & e_pairRemoved) == e_pairRemoved));
}
public function ClearBuffered():void{
status = (status & ~(e_pairBuffered));
}
public function SetRemoved():void{
status = (status | e_pairRemoved);
}
}
}//package Box2D.Collision
Section 22
//b2PairCallback (Box2D.Collision.b2PairCallback)
package Box2D.Collision {
public class b2PairCallback {
public function b2PairCallback(){
super();
}
public function PairRemoved(proxyUserData1, proxyUserData2, pairUserData):void{
}
public function PairAdded(proxyUserData1, proxyUserData2){
return (null);
}
}
}//package Box2D.Collision
Section 23
//b2PairManager (Box2D.Collision.b2PairManager)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2PairManager {
public var m_pairCount:int;
public var m_pairBuffer:Array;
public var m_hashTable:Array;
public var m_callback:b2PairCallback;
public var m_pairs:Array;
public var m_pairBufferCount:int;
public var m_broadPhase:b2BroadPhase;
public var m_freePair:uint;
public function b2PairManager(){
var i:uint;
super();
m_hashTable = new Array(b2Pair.b2_tableCapacity);
i = 0;
while (i < b2Pair.b2_tableCapacity) {
m_hashTable[i] = b2Pair.b2_nullPair;
i++;
};
m_pairs = new Array(b2Settings.b2_maxPairs);
i = 0;
while (i < b2Settings.b2_maxPairs) {
m_pairs[i] = new b2Pair();
i++;
};
m_pairBuffer = new Array(b2Settings.b2_maxPairs);
i = 0;
while (i < b2Settings.b2_maxPairs) {
m_pairBuffer[i] = new b2BufferedPair();
i++;
};
i = 0;
while (i < b2Settings.b2_maxPairs) {
m_pairs[i].proxyId1 = b2Pair.b2_nullProxy;
m_pairs[i].proxyId2 = b2Pair.b2_nullProxy;
m_pairs[i].userData = null;
m_pairs[i].status = 0;
m_pairs[i].next = (i + 1);
i++;
};
m_pairs[int((b2Settings.b2_maxPairs - 1))].next = b2Pair.b2_nullPair;
m_pairCount = 0;
m_pairBufferCount = 0;
}
private function FindHash(proxyId1:uint, proxyId2:uint, hash:uint):b2Pair{
var pair:b2Pair;
var index:uint = m_hashTable[hash];
pair = m_pairs[index];
while (((!((index == b2Pair.b2_nullPair))) && ((Equals(pair, proxyId1, proxyId2) == false)))) {
index = pair.next;
pair = m_pairs[index];
};
if (index == b2Pair.b2_nullPair){
return (null);
};
return (pair);
}
private function Find(proxyId1:uint, proxyId2:uint):b2Pair{
var temp:uint;
if (proxyId1 > proxyId2){
temp = proxyId1;
proxyId1 = proxyId2;
proxyId2 = temp;
};
var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask);
return (FindHash(proxyId1, proxyId2, hash));
}
private function ValidateBuffer():void{
}
public function Commit():void{
var bufferedPair:b2BufferedPair;
var i:int;
var pair:b2Pair;
var proxy1:b2Proxy;
var proxy2:b2Proxy;
var removeCount:int;
var proxies:Array = m_broadPhase.m_proxyPool;
i = 0;
while (i < m_pairBufferCount) {
bufferedPair = m_pairBuffer[i];
pair = Find(bufferedPair.proxyId1, bufferedPair.proxyId2);
pair.ClearBuffered();
proxy1 = proxies[pair.proxyId1];
proxy2 = proxies[pair.proxyId2];
if (pair.IsRemoved()){
if (pair.IsFinal() == true){
m_callback.PairRemoved(proxy1.userData, proxy2.userData, pair.userData);
};
bufferedPair = m_pairBuffer[removeCount];
bufferedPair.proxyId1 = pair.proxyId1;
bufferedPair.proxyId2 = pair.proxyId2;
removeCount++;
} else {
if (pair.IsFinal() == false){
pair.userData = m_callback.PairAdded(proxy1.userData, proxy2.userData);
pair.SetFinal();
};
};
i++;
};
i = 0;
while (i < removeCount) {
bufferedPair = m_pairBuffer[i];
RemovePair(bufferedPair.proxyId1, bufferedPair.proxyId2);
i++;
};
m_pairBufferCount = 0;
if (b2BroadPhase.s_validate){
ValidateTable();
};
}
public function RemoveBufferedPair(proxyId1:int, proxyId2:int):void{
var bufferedPair:b2BufferedPair;
var pair:b2Pair = Find(proxyId1, proxyId2);
if (pair == null){
return;
};
if (pair.IsBuffered() == false){
pair.SetBuffered();
bufferedPair = m_pairBuffer[m_pairBufferCount];
bufferedPair.proxyId1 = pair.proxyId1;
bufferedPair.proxyId2 = pair.proxyId2;
m_pairBufferCount++;
};
pair.SetRemoved();
if (b2BroadPhase.s_validate){
ValidateBuffer();
};
}
private function RemovePair(proxyId1:uint, proxyId2:uint){
var pair:b2Pair;
var temp:uint;
var index:uint;
var userData:*;
if (proxyId1 > proxyId2){
temp = proxyId1;
proxyId1 = proxyId2;
proxyId2 = temp;
};
var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask);
var node:uint = m_hashTable[hash];
var pNode:b2Pair;
while (node != b2Pair.b2_nullPair) {
if (Equals(m_pairs[node], proxyId1, proxyId2)){
index = node;
pair = m_pairs[node];
if (pNode){
pNode.next = pair.next;
} else {
m_hashTable[hash] = pair.next;
};
pair = m_pairs[index];
userData = pair.userData;
pair.next = m_freePair;
pair.proxyId1 = b2Pair.b2_nullProxy;
pair.proxyId2 = b2Pair.b2_nullProxy;
pair.userData = null;
pair.status = 0;
m_freePair = index;
m_pairCount--;
return (userData);
} else {
pNode = m_pairs[node];
node = pNode.next;
};
};
return (null);
}
public function Initialize(broadPhase:b2BroadPhase, callback:b2PairCallback):void{
m_broadPhase = broadPhase;
m_callback = callback;
}
public function AddBufferedPair(proxyId1:int, proxyId2:int):void{
var bufferedPair:b2BufferedPair;
var pair:b2Pair = AddPair(proxyId1, proxyId2);
if (pair.IsBuffered() == false){
pair.SetBuffered();
bufferedPair = m_pairBuffer[m_pairBufferCount];
bufferedPair.proxyId1 = pair.proxyId1;
bufferedPair.proxyId2 = pair.proxyId2;
m_pairBufferCount++;
};
pair.ClearRemoved();
if (b2BroadPhase.s_validate){
ValidateBuffer();
};
}
private function AddPair(proxyId1:uint, proxyId2:uint):b2Pair{
var temp:uint;
if (proxyId1 > proxyId2){
temp = proxyId1;
proxyId1 = proxyId2;
proxyId2 = temp;
};
var hash:uint = (Hash(proxyId1, proxyId2) & b2Pair.b2_tableMask);
var pair = FindHash(proxyId1, proxyId2, hash);
if (pair != null){
return (pair);
};
var pIndex:uint = m_freePair;
pair = m_pairs[pIndex];
m_freePair = pair.next;
pair.proxyId1 = proxyId1;
pair.proxyId2 = proxyId2;
pair.status = 0;
pair.userData = null;
pair.next = m_hashTable[hash];
m_hashTable[hash] = pIndex;
m_pairCount++;
return (pair);
}
private function ValidateTable():void{
}
public static function EqualsPair(pair1:b2BufferedPair, pair2:b2BufferedPair):Boolean{
return ((((pair1.proxyId1 == pair2.proxyId1)) && ((pair1.proxyId2 == pair2.proxyId2))));
}
public static function Hash(proxyId1:uint, proxyId2:uint):uint{
var key:uint = (((proxyId2 << 16) & 4294901760) | proxyId1);
key = (~(key) + ((key << 15) & 4294934528));
key = (key ^ ((key >> 12) & 1048575));
key = (key + ((key << 2) & 4294967292));
key = (key ^ ((key >> 4) & 268435455));
key = (key * 2057);
key = (key ^ ((key >> 16) & 0xFFFF));
return (key);
}
public static function Equals(pair:b2Pair, proxyId1:uint, proxyId2:uint):Boolean{
return ((((pair.proxyId1 == proxyId1)) && ((pair.proxyId2 == proxyId2))));
}
}
}//package Box2D.Collision
Section 24
//b2Point (Box2D.Collision.b2Point)
package Box2D.Collision {
import Box2D.Common.Math.*;
public class b2Point {
public var p:b2Vec2;
public function b2Point(){
p = new b2Vec2();
super();
}
public function GetFirstVertex(xf:b2XForm):b2Vec2{
return (p);
}
public function Support(xf:b2XForm, vX:Number, vY:Number):b2Vec2{
return (p);
}
}
}//package Box2D.Collision
Section 25
//b2Proxy (Box2D.Collision.b2Proxy)
package Box2D.Collision {
public class b2Proxy {
public var overlapCount:uint;
public var userData;// = null
public var lowerBounds:Array;
public var upperBounds:Array;
public var timeStamp:uint;
public function b2Proxy(){
lowerBounds = [uint(0), uint(0)];
upperBounds = [uint(0), uint(0)];
super();
}
public function GetNext():uint{
return (lowerBounds[0]);
}
public function IsValid():Boolean{
return (!((overlapCount == b2BroadPhase.b2_invalid)));
}
public function SetNext(next:uint):void{
lowerBounds[0] = (next & 0xFFFF);
}
}
}//package Box2D.Collision
Section 26
//b2Segment (Box2D.Collision.b2Segment)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2Segment {
public var p1:b2Vec2;
public var p2:b2Vec2;
public function b2Segment(){
p1 = new b2Vec2();
p2 = new b2Vec2();
super();
}
public function TestSegment(lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):Boolean{
var bX:Number;
var bY:Number;
var a:Number;
var mu2:Number;
var nLen:Number;
var s:b2Vec2 = segment.p1;
var rX:Number = (segment.p2.x - s.x);
var rY:Number = (segment.p2.y - s.y);
var dX:Number = (p2.x - p1.x);
var dY:Number = (p2.y - p1.y);
var nX:Number = dY;
var nY:Number = -(dX);
var k_slop:Number = (100 * Number.MIN_VALUE);
var denom:Number = -(((rX * nX) + (rY * nY)));
if (denom > k_slop){
bX = (s.x - p1.x);
bY = (s.y - p1.y);
a = ((bX * nX) + (bY * nY));
if ((((0 <= a)) && ((a <= (maxLambda * denom))))){
mu2 = ((-(rY) * bY) + (rY * bX));
if (((((-(k_slop) * denom) <= mu2)) && ((mu2 <= (denom * (1 + k_slop)))))){
a = (a / denom);
nLen = Math.sqrt(((nX * nX) + (nY * nY)));
nX = (nX / nLen);
nY = (nY / nLen);
lambda[0] = a;
normal.Set(nX, nY);
return (true);
};
};
};
return (false);
}
public function Extend(aabb:b2AABB):void{
ExtendForward(aabb);
ExtendBackward(aabb);
}
public function ExtendForward(aabb:b2AABB):void{
var aabb = aabb;
var dX:Number = (p2.x - p1.x);
var dY:Number = (p2.y - p1.y);
var greaterthan0:* = function (t){
return ((t > 0));
};
var lambda:Number = Math.min(((dX > 0)) ? ((aabb.upperBound.x - p1.x) / dX) : ((dX < 0)) ? ((aabb.lowerBound.x - p1.x) / dX) : Number.POSITIVE_INFINITY, ((dY > 0)) ? ((aabb.upperBound.y - p1.y) / dY) : ((dY < 0)) ? ((aabb.lowerBound.y - p1.y) / dY) : Number.POSITIVE_INFINITY);
p2.x = (p1.x + (dX * lambda));
p2.y = (p1.y + (dY * lambda));
}
public function ExtendBackward(aabb:b2AABB):void{
var dY:Number;
var lambda:Number;
var aabb = aabb;
var dX:Number = (-(p2.x) + p1.x);
dY = (-(p2.y) + p1.y);
var greaterthan0:* = function (t){
return ((t > 0));
};
lambda = Math.min(((dX > 0)) ? ((aabb.upperBound.x - p2.x) / dX) : ((dX < 0)) ? ((aabb.lowerBound.x - p2.x) / dX) : Number.POSITIVE_INFINITY, ((dY > 0)) ? ((aabb.upperBound.y - p2.y) / dY) : ((dY < 0)) ? ((aabb.lowerBound.y - p2.y) / dY) : Number.POSITIVE_INFINITY);
p1.x = (p2.x + (dX * lambda));
p1.y = (p2.y + (dY * lambda));
}
}
}//package Box2D.Collision
Section 27
//b2TimeOfImpact (Box2D.Collision.b2TimeOfImpact)
package Box2D.Collision {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.*;
public class b2TimeOfImpact {
public static var s_xf1:b2XForm = new b2XForm();
public static var s_xf2:b2XForm = new b2XForm();
public static var s_p1:b2Vec2 = new b2Vec2();
public static var s_p2:b2Vec2 = new b2Vec2();
public function b2TimeOfImpact(){
super();
}
public static function TimeOfImpact(shape1:b2Shape, sweep1:b2Sweep, shape2:b2Shape, sweep2:b2Sweep):Number{
var math1:Number;
var math2:Number;
var t:Number;
var xf1:b2XForm;
var xf2:b2XForm;
var nLen:Number;
var approachVelocityBound:Number;
var dAlpha:Number;
var newAlpha:Number;
var r1:Number = shape1.m_sweepRadius;
var r2:Number = shape2.m_sweepRadius;
var t0:Number = sweep1.t0;
var v1X:Number = (sweep1.c.x - sweep1.c0.x);
var v1Y:Number = (sweep1.c.y - sweep1.c0.y);
var v2X:Number = (sweep2.c.x - sweep2.c0.x);
var v2Y:Number = (sweep2.c.y - sweep2.c0.y);
var omega1:Number = (sweep1.a - sweep1.a0);
var omega2:Number = (sweep2.a - sweep2.a0);
var alpha:Number = 0;
var p1:b2Vec2 = s_p1;
var p2:b2Vec2 = s_p2;
var k_maxIterations = 20;
var iter:int;
var normalX:Number = 0;
var normalY:Number = 0;
var distance:Number = 0;
var targetDistance:Number = 0;
while (true) {
t = (((1 - alpha) * t0) + alpha);
xf1 = s_xf1;
xf2 = s_xf2;
sweep1.GetXForm(xf1, t);
sweep2.GetXForm(xf2, t);
distance = b2Distance.Distance(p1, p2, shape1, xf1, shape2, xf2);
if (iter == 0){
if (distance > (2 * b2Settings.b2_toiSlop)){
targetDistance = (1.5 * b2Settings.b2_toiSlop);
} else {
math1 = (0.05 * b2Settings.b2_toiSlop);
math2 = (distance - (0.5 * b2Settings.b2_toiSlop));
targetDistance = ((math1 > math2)) ? math1 : math2;
};
};
if (((((distance - targetDistance) < (0.05 * b2Settings.b2_toiSlop))) || ((iter == k_maxIterations)))){
break;
};
normalX = (p2.x - p1.x);
normalY = (p2.y - p1.y);
nLen = Math.sqrt(((normalX * normalX) + (normalY * normalY)));
normalX = (normalX / nLen);
normalY = (normalY / nLen);
approachVelocityBound = ((((normalX * (v1X - v2X)) + (normalY * (v1Y - v2Y))) + (((omega1 < 0)) ? -(omega1) : omega1 * r1)) + (((omega2 < 0)) ? -(omega2) : omega2 * r2));
if (approachVelocityBound == 0){
alpha = 1;
break;
};
dAlpha = ((distance - targetDistance) / approachVelocityBound);
newAlpha = (alpha + dAlpha);
if ((((newAlpha < 0)) || ((1 < newAlpha)))){
alpha = 1;
break;
};
if (newAlpha < ((1 + (100 * Number.MIN_VALUE)) * alpha)){
break;
};
alpha = newAlpha;
iter++;
};
return (alpha);
}
}
}//package Box2D.Collision
Section 28
//ClipVertex (Box2D.Collision.ClipVertex)
package Box2D.Collision {
import Box2D.Common.Math.*;
public class ClipVertex {
public var id:b2ContactID;
public var v:b2Vec2;
public function ClipVertex(){
v = new b2Vec2();
id = new b2ContactID();
super();
}
}
}//package Box2D.Collision
Section 29
//Features (Box2D.Collision.Features)
package Box2D.Collision {
public class Features {
public var _referenceEdge:int;
public var _incidentEdge:int;
public var _flip:int;
public var _incidentVertex:int;
public var _m_id:b2ContactID;
public function Features(){
super();
}
public function get referenceEdge():int{
return (_referenceEdge);
}
public function set incidentVertex(value:int):void{
_incidentVertex = value;
_m_id._key = ((_m_id._key & 4278255615) | ((_incidentVertex << 16) & 0xFF0000));
}
public function get flip():int{
return (_flip);
}
public function get incidentEdge():int{
return (_incidentEdge);
}
public function set referenceEdge(value:int):void{
_referenceEdge = value;
_m_id._key = ((_m_id._key & 4294967040) | (_referenceEdge & 0xFF));
}
public function get incidentVertex():int{
return (_incidentVertex);
}
public function set flip(value:int):void{
_flip = value;
_m_id._key = ((_m_id._key & 0xFFFFFF) | ((_flip << 24) & 4278190080));
}
public function set incidentEdge(value:int):void{
_incidentEdge = value;
_m_id._key = ((_m_id._key & 4294902015) | ((_incidentEdge << 8) & 0xFF00));
}
}
}//package Box2D.Collision
Section 30
//b2Mat22 (Box2D.Common.Math.b2Mat22)
package Box2D.Common.Math {
public class b2Mat22 {
public var col1:b2Vec2;
public var col2:b2Vec2;
public function b2Mat22(angle:Number=0, c1:b2Vec2=null, c2:b2Vec2=null){
var c:Number;
var s:Number;
col1 = new b2Vec2();
col2 = new b2Vec2();
super();
if (((!((c1 == null))) && (!((c2 == null))))){
col1.SetV(c1);
col2.SetV(c2);
} else {
c = Math.cos(angle);
s = Math.sin(angle);
col1.x = c;
col2.x = -(s);
col1.y = s;
col2.y = c;
};
}
public function SetIdentity():void{
col1.x = 1;
col2.x = 0;
col1.y = 0;
col2.y = 1;
}
public function SetVV(c1:b2Vec2, c2:b2Vec2):void{
col1.SetV(c1);
col2.SetV(c2);
}
public function Set(angle:Number):void{
var c:Number;
c = Math.cos(angle);
var s:Number = Math.sin(angle);
col1.x = c;
col2.x = -(s);
col1.y = s;
col2.y = c;
}
public function SetZero():void{
col1.x = 0;
col2.x = 0;
col1.y = 0;
col2.y = 0;
}
public function SetM(m:b2Mat22):void{
col1.SetV(m.col1);
col2.SetV(m.col2);
}
public function AddM(m:b2Mat22):void{
col1.x = (col1.x + m.col1.x);
col1.y = (col1.y + m.col1.y);
col2.x = (col2.x + m.col2.x);
col2.y = (col2.y + m.col2.y);
}
public function Abs():void{
col1.Abs();
col2.Abs();
}
public function Copy():b2Mat22{
return (new b2Mat22(0, col1, col2));
}
public function Invert(out:b2Mat22):b2Mat22{
var a:Number;
var c:Number;
var det:Number;
a = col1.x;
var b:Number = col2.x;
c = col1.y;
var d:Number = col2.y;
det = ((a * d) - (b * c));
det = (1 / det);
out.col1.x = (det * d);
out.col2.x = (-(det) * b);
out.col1.y = (-(det) * c);
out.col2.y = (det * a);
return (out);
}
public function GetAngle():Number{
return (Math.atan2(col1.y, col1.x));
}
public function Solve(out:b2Vec2, bX:Number, bY:Number):b2Vec2{
var a11:Number = col1.x;
var a12:Number = col2.x;
var a21:Number = col1.y;
var a22:Number = col2.y;
var det:Number = ((a11 * a22) - (a12 * a21));
det = (1 / det);
out.x = (det * ((a22 * bX) - (a12 * bY)));
out.y = (det * ((a11 * bY) - (a21 * bX)));
return (out);
}
}
}//package Box2D.Common.Math
Section 31
//b2Math (Box2D.Common.Math.b2Math)
package Box2D.Common.Math {
public class b2Math {
public static const b2Mat22_identity:b2Mat22 = new b2Mat22(0, new b2Vec2(1, 0), new b2Vec2(0, 1));
public static const b2XForm_identity:b2XForm = new b2XForm(b2Vec2_zero, b2Mat22_identity);
public static const b2Vec2_zero:b2Vec2 = new b2Vec2(0, 0);
public function b2Math(){
super();
}
public static function b2CrossVF(a:b2Vec2, s:Number):b2Vec2{
var v:b2Vec2 = new b2Vec2((s * a.y), (-(s) * a.x));
return (v);
}
public static function AddVV(a:b2Vec2, b:b2Vec2):b2Vec2{
var v:b2Vec2 = new b2Vec2((a.x + b.x), (a.y + b.y));
return (v);
}
public static function b2IsValid(x:Number):Boolean{
return (isFinite(x));
}
public static function b2MinV(a:b2Vec2, b:b2Vec2):b2Vec2{
var c:b2Vec2 = new b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y));
return (c);
}
public static function b2MulX(T:b2XForm, v:b2Vec2):b2Vec2{
var a:b2Vec2;
a = b2MulMV(T.R, v);
a.x = (a.x + T.position.x);
a.y = (a.y + T.position.y);
return (a);
}
public static function b2DistanceSquared(a:b2Vec2, b:b2Vec2):Number{
var cX:Number = (a.x - b.x);
var cY:Number = (a.y - b.y);
return (((cX * cX) + (cY * cY)));
}
public static function b2Swap(a:Array, b:Array):void{
var tmp:* = a[0];
a[0] = b[0];
b[0] = tmp;
}
public static function b2AbsM(A:b2Mat22):b2Mat22{
var B:b2Mat22 = new b2Mat22(0, b2AbsV(A.col1), b2AbsV(A.col2));
return (B);
}
public static function SubtractVV(a:b2Vec2, b:b2Vec2):b2Vec2{
var v:b2Vec2 = new b2Vec2((a.x - b.x), (a.y - b.y));
return (v);
}
public static function b2MulXT(T:b2XForm, v:b2Vec2):b2Vec2{
var a:b2Vec2;
var tX:Number;
a = SubtractVV(v, T.position);
tX = ((a.x * T.R.col1.x) + (a.y * T.R.col1.y));
a.y = ((a.x * T.R.col2.x) + (a.y * T.R.col2.y));
a.x = tX;
return (a);
}
public static function b2Abs(a:Number):Number{
return (((a > 0)) ? a : -(a));
}
public static function b2Clamp(a:Number, low:Number, high:Number):Number{
return (b2Max(low, b2Min(a, high)));
}
public static function b2AbsV(a:b2Vec2):b2Vec2{
var b:b2Vec2 = new b2Vec2(b2Abs(a.x), b2Abs(a.y));
return (b);
}
public static function MulFV(s:Number, a:b2Vec2):b2Vec2{
var v:b2Vec2 = new b2Vec2((s * a.x), (s * a.y));
return (v);
}
public static function b2CrossVV(a:b2Vec2, b:b2Vec2):Number{
return (((a.x * b.y) - (a.y * b.x)));
}
public static function b2Dot(a:b2Vec2, b:b2Vec2):Number{
return (((a.x * b.x) + (a.y * b.y)));
}
public static function b2CrossFV(s:Number, a:b2Vec2):b2Vec2{
var v:b2Vec2 = new b2Vec2((-(s) * a.y), (s * a.x));
return (v);
}
public static function AddMM(A:b2Mat22, B:b2Mat22):b2Mat22{
var C:b2Mat22 = new b2Mat22(0, AddVV(A.col1, B.col1), AddVV(A.col2, B.col2));
return (C);
}
public static function b2Distance(a:b2Vec2, b:b2Vec2):Number{
var cX:Number = (a.x - b.x);
var cY:Number = (a.y - b.y);
return (Math.sqrt(((cX * cX) + (cY * cY))));
}
public static function b2MulTMM(A:b2Mat22, B:b2Mat22):b2Mat22{
var c1:b2Vec2 = new b2Vec2(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1));
var c2:b2Vec2 = new b2Vec2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2));
var C:b2Mat22 = new b2Mat22(0, c1, c2);
return (C);
}
public static function b2MaxV(a:b2Vec2, b:b2Vec2):b2Vec2{
var c:b2Vec2 = new b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y));
return (c);
}
public static function b2IsPowerOfTwo(x:uint):Boolean{
var result:Boolean = (((x > 0)) && (((x & (x - 1)) == 0)));
return (result);
}
public static function b2ClampV(a:b2Vec2, low:b2Vec2, high:b2Vec2):b2Vec2{
return (b2MaxV(low, b2MinV(a, high)));
}
public static function b2RandomRange(lo:Number, hi:Number):Number{
var r:Number = Math.random();
r = (((hi - lo) * r) + lo);
return (r);
}
public static function b2MulTMV(A:b2Mat22, v:b2Vec2):b2Vec2{
var u:b2Vec2 = new b2Vec2(b2Dot(v, A.col1), b2Dot(v, A.col2));
return (u);
}
public static function b2Min(a:Number, b:Number):Number{
return (((a < b)) ? a : b);
}
public static function b2Random():Number{
return (((Math.random() * 2) - 1));
}
public static function b2MulMM(A:b2Mat22, B:b2Mat22):b2Mat22{
var C:b2Mat22 = new b2Mat22(0, b2MulMV(A, B.col1), b2MulMV(A, B.col2));
return (C);
}
public static function b2NextPowerOfTwo(x:uint):uint{
x = (x | ((x >> 1) & 2147483647));
x = (x | ((x >> 2) & 1073741823));
x = (x | ((x >> 4) & 268435455));
x = (x | ((x >> 8) & 0xFFFFFF));
x = (x | ((x >> 16) & 0xFFFF));
return ((x + 1));
}
public static function b2Max(a:Number, b:Number):Number{
return (((a > b)) ? a : b);
}
public static function b2MulMV(A:b2Mat22, v:b2Vec2):b2Vec2{
var u:b2Vec2 = new b2Vec2(((A.col1.x * v.x) + (A.col2.x * v.y)), ((A.col1.y * v.x) + (A.col2.y * v.y)));
return (u);
}
}
}//package Box2D.Common.Math
Section 32
//b2Sweep (Box2D.Common.Math.b2Sweep)
package Box2D.Common.Math {
public class b2Sweep {
public var localCenter:b2Vec2;
public var a:Number;
public var c:b2Vec2;
public var a0:Number;
public var c0:b2Vec2;
public var t0:Number;
public function b2Sweep(){
localCenter = new b2Vec2();
c0 = new b2Vec2();
c = new b2Vec2();
super();
}
public function Advance(t:Number):void{
var alpha:Number;
if ((((t0 < t)) && (((1 - t0) > Number.MIN_VALUE)))){
alpha = ((t - t0) / (1 - t0));
c0.x = (((1 - alpha) * c0.x) + (alpha * c.x));
c0.y = (((1 - alpha) * c0.y) + (alpha * c.y));
a0 = (((1 - alpha) * a0) + (alpha * a));
t0 = t;
};
}
public function GetXForm(xf:b2XForm, t:Number):void{
var alpha:Number;
var angle:Number;
if ((1 - t0) > Number.MIN_VALUE){
alpha = ((t - t0) / (1 - t0));
xf.position.x = (((1 - alpha) * c0.x) + (alpha * c.x));
xf.position.y = (((1 - alpha) * c0.y) + (alpha * c.y));
angle = (((1 - alpha) * a0) + (alpha * a));
xf.R.Set(angle);
} else {
xf.position.SetV(c);
xf.R.Set(a);
};
var tMat:b2Mat22 = xf.R;
xf.position.x = (xf.position.x - ((tMat.col1.x * localCenter.x) + (tMat.col2.x * localCenter.y)));
xf.position.y = (xf.position.y - ((tMat.col1.y * localCenter.x) + (tMat.col2.y * localCenter.y)));
}
}
}//package Box2D.Common.Math
Section 33
//b2Vec2 (Box2D.Common.Math.b2Vec2)
package Box2D.Common.Math {
public class b2Vec2 {
public var y:Number;
public var x:Number;
public function b2Vec2(x_:Number=0, y_:Number=0):void{
super();
x = x_;
y = y_;
}
public function Add(v:b2Vec2):void{
x = (x + v.x);
y = (y + v.y);
}
public function Set(x_:Number=0, y_:Number=0):void{
x = x_;
y = y_;
}
public function Multiply(a:Number):void{
x = (x * a);
y = (y * a);
}
public function Length():Number{
return (Math.sqrt(((x * x) + (y * y))));
}
public function LengthSquared():Number{
return (((x * x) + (y * y)));
}
public function MulM(A:b2Mat22):void{
var tX:Number = x;
x = ((A.col1.x * tX) + (A.col2.x * y));
y = ((A.col1.y * tX) + (A.col2.y * y));
}
public function SetZero():void{
x = 0;
y = 0;
}
public function MinV(b:b2Vec2):void{
x = ((x < b.x)) ? x : b.x;
y = ((y < b.y)) ? y : b.y;
}
public function Normalize():Number{
var length:Number = Math.sqrt(((x * x) + (y * y)));
if (length < Number.MIN_VALUE){
return (0);
};
var invLength:Number = (1 / length);
x = (x * invLength);
y = (y * invLength);
return (length);
}
public function CrossVF(s:Number):void{
var tX:Number = x;
x = (s * y);
y = (-(s) * tX);
}
public function MaxV(b:b2Vec2):void{
x = ((x > b.x)) ? x : b.x;
y = ((y > b.y)) ? y : b.y;
}
public function SetV(v:b2Vec2):void{
x = v.x;
y = v.y;
}
public function Negative():b2Vec2{
return (new b2Vec2(-(x), -(y)));
}
public function CrossFV(s:Number):void{
var tX:Number = x;
x = (-(s) * y);
y = (s * tX);
}
public function Abs():void{
if (x < 0){
x = -(x);
};
if (y < 0){
y = -(y);
};
}
public function Subtract(v:b2Vec2):void{
x = (x - v.x);
y = (y - v.y);
}
public function Copy():b2Vec2{
return (new b2Vec2(x, y));
}
public function MulTM(A:b2Mat22):void{
var tX:Number = b2Math.b2Dot(this, A.col1);
y = b2Math.b2Dot(this, A.col2);
x = tX;
}
public function IsValid():Boolean{
return (((b2Math.b2IsValid(x)) && (b2Math.b2IsValid(y))));
}
public static function Make(x_:Number, y_:Number):b2Vec2{
return (new b2Vec2(x_, y_));
}
}
}//package Box2D.Common.Math
Section 34
//b2XForm (Box2D.Common.Math.b2XForm)
package Box2D.Common.Math {
public class b2XForm {
public var position:b2Vec2;
public var R:b2Mat22;
public function b2XForm(pos:b2Vec2=null, r:b2Mat22=null):void{
position = new b2Vec2();
R = new b2Mat22();
super();
if (pos){
position.SetV(pos);
R.SetM(r);
};
}
public function Initialize(pos:b2Vec2, r:b2Mat22):void{
position.SetV(pos);
R.SetM(r);
}
public function Set(x:b2XForm):void{
position.SetV(x.position);
R.SetM(x.R);
}
public function SetIdentity():void{
position.SetZero();
R.SetIdentity();
}
}
}//package Box2D.Common.Math
Section 35
//b2Color (Box2D.Common.b2Color)
package Box2D.Common {
import Box2D.Common.Math.*;
public class b2Color {
private var _r:uint;// = 0
private var _g:uint;// = 0
private var _b:uint;// = 0
public function b2Color(rr:Number, gg:Number, bb:Number){
super();
_r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1)));
_g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1)));
_b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1)));
}
public function Set(rr:Number, gg:Number, bb:Number):void{
_r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1)));
_g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1)));
_b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1)));
}
public function set b(bb:Number):void{
_b = uint((0xFF * b2Math.b2Clamp(bb, 0, 1)));
}
public function get color():uint{
return (((_r | (_g << 8)) | (_b << 16)));
}
public function set r(rr:Number):void{
_r = uint((0xFF * b2Math.b2Clamp(rr, 0, 1)));
}
public function set g(gg:Number):void{
_g = uint((0xFF * b2Math.b2Clamp(gg, 0, 1)));
}
}
}//package Box2D.Common
Section 36
//b2Settings (Box2D.Common.b2Settings)
package Box2D.Common {
import Box2D.Common.Math.*;
public class b2Settings {
public static const b2_angularSleepTolerance:Number = 0.0111111111111111;
public static const b2_linearSleepTolerance:Number = 0.01;
public static const b2_angularSlop:Number = 0.0349065850398866;
public static const b2_linearSlop:Number = 0.005;
public static const b2_pi:Number = 3.14159265358979;
public static const b2_maxProxies:int = 0x0400;
public static const b2_maxAngularVelocitySquared:Number = 62500;
public static const b2_maxPolygonVertices:int = 16;
public static const b2_velocityThreshold:Number = 1;
public static const b2_contactBaumgarte:Number = 0.2;
public static const b2_maxPairs:int = 8192;
public static const b2_maxTOIContactsPerIsland:int = 32;
public static const b2_timeToSleep:Number = 0.5;
public static const b2_maxManifoldPoints:int = 2;
public static const b2_maxAngularVelocity:Number = 250;
public static const b2_maxAngularCorrection:Number = 0.139626340159546;
public static const USHRT_MAX:int = 0xFFFF;
public static const b2_maxLinearVelocity:Number = 200;
public static const b2_maxLinearCorrection:Number = 0.2;
public static const b2_toiSlop:Number = 0.04;
public static const b2_maxLinearVelocitySquared:Number = 40000;
public function b2Settings(){
super();
}
public static function b2Assert(a:Boolean):void{
var nullVec:b2Vec2;
if (!a){
nullVec.x++;
};
}
}
}//package Box2D.Common
Section 37
//b2CircleContact (Box2D.Dynamics.Contacts.b2CircleContact)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2CircleContact extends b2Contact {
private var m_manifolds:Array;
public var m_manifold:b2Manifold;
private var m0:b2Manifold;
private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
public function b2CircleContact(shape1:b2Shape, shape2:b2Shape){
m_manifolds = [new b2Manifold()];
m0 = new b2Manifold();
super(shape1, shape2);
m_manifold = m_manifolds[0];
m_manifold.pointCount = 0;
var point:b2ManifoldPoint = m_manifold.points[0];
point.normalImpulse = 0;
point.tangentImpulse = 0;
}
override public function Evaluate(listener:b2ContactListener):void{
var v1:b2Vec2;
var v2:b2Vec2;
var mp0:b2ManifoldPoint;
var mp:b2ManifoldPoint;
var b1:b2Body = m_shape1.m_body;
var b2:b2Body = m_shape2.m_body;
m0.Set(m_manifold);
b2Collision.b2CollideCircles(m_manifold, (m_shape1 as b2CircleShape), b1.m_xf, (m_shape2 as b2CircleShape), b2.m_xf);
var cp:b2ContactPoint = s_evalCP;
cp.shape1 = m_shape1;
cp.shape2 = m_shape2;
cp.friction = m_friction;
cp.restitution = m_restitution;
if (m_manifold.pointCount > 0){
m_manifoldCount = 1;
mp = m_manifold.points[0];
if (m0.pointCount == 0){
mp.normalImpulse = 0;
mp.tangentImpulse = 0;
if (listener){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = mp.id._key;
listener.Add(cp);
};
} else {
mp0 = m0.points[0];
mp.normalImpulse = mp0.normalImpulse;
mp.tangentImpulse = mp0.tangentImpulse;
if (listener){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = mp.id._key;
listener.Persist(cp);
};
};
} else {
m_manifoldCount = 0;
if ((((m0.pointCount > 0)) && (listener))){
mp0 = m0.points[0];
cp.position = b1.GetWorldPoint(mp0.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m0.normal);
cp.separation = mp0.separation;
cp.id.key = mp0.id._key;
listener.Remove(cp);
};
};
}
override public function GetManifolds():Array{
return (m_manifolds);
}
public static function Destroy(contact:b2Contact, allocator):void{
}
public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{
return (new b2CircleContact(shape1, shape2));
}
}
}//package Box2D.Dynamics.Contacts
Section 38
//b2Contact (Box2D.Dynamics.Contacts.b2Contact)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2Contact {
public var m_shape1:b2Shape;
public var m_shape2:b2Shape;
public var m_prev:b2Contact;
public var m_toi:Number;
public var m_next:b2Contact;
public var m_friction:Number;
public var m_manifoldCount:int;
public var m_node1:b2ContactEdge;
public var m_node2:b2ContactEdge;
public var m_restitution:Number;
public var m_flags:uint;
public static var e_toiFlag:uint = 8;
public static var e_nonSolidFlag:uint = 1;
public static var e_slowFlag:uint = 2;
public static var e_islandFlag:uint = 4;
public static var s_registers:Array;
public static var s_initialized:Boolean = false;
public function b2Contact(s1:b2Shape=null, s2:b2Shape=null){
m_node1 = new b2ContactEdge();
m_node2 = new b2ContactEdge();
super();
m_flags = 0;
if (((!(s1)) || (!(s2)))){
m_shape1 = null;
m_shape2 = null;
return;
};
if (((s1.IsSensor()) || (s2.IsSensor()))){
m_flags = (m_flags | e_nonSolidFlag);
};
m_shape1 = s1;
m_shape2 = s2;
m_manifoldCount = 0;
m_friction = Math.sqrt((m_shape1.m_friction * m_shape2.m_friction));
m_restitution = b2Math.b2Max(m_shape1.m_restitution, m_shape2.m_restitution);
m_prev = null;
m_next = null;
m_node1.contact = null;
m_node1.prev = null;
m_node1.next = null;
m_node1.other = null;
m_node2.contact = null;
m_node2.prev = null;
m_node2.next = null;
m_node2.other = null;
}
public function IsSolid():Boolean{
return (((m_flags & e_nonSolidFlag) == 0));
}
public function GetShape1():b2Shape{
return (m_shape1);
}
public function GetShape2():b2Shape{
return (m_shape2);
}
public function GetNext():b2Contact{
return (m_next);
}
public function GetManifoldCount():int{
return (m_manifoldCount);
}
public function GetManifolds():Array{
return (null);
}
public function Update(listener:b2ContactListener):void{
var oldCount:int = m_manifoldCount;
Evaluate(listener);
var newCount:int = m_manifoldCount;
var body1:b2Body = m_shape1.m_body;
var body2:b2Body = m_shape2.m_body;
if ((((newCount == 0)) && ((oldCount > 0)))){
body1.WakeUp();
body2.WakeUp();
};
if (((((((body1.IsStatic()) || (body1.IsBullet()))) || (body2.IsStatic()))) || (body2.IsBullet()))){
m_flags = (m_flags & ~(e_slowFlag));
} else {
m_flags = (m_flags | e_slowFlag);
};
}
public function Evaluate(listener:b2ContactListener):void{
}
public static function InitializeRegisters():void{
var j:int;
s_registers = new Array(b2Shape.e_shapeTypeCount);
var i:int;
while (i < b2Shape.e_shapeTypeCount) {
s_registers[i] = new Array(b2Shape.e_shapeTypeCount);
j = 0;
while (j < b2Shape.e_shapeTypeCount) {
s_registers[i][j] = new b2ContactRegister();
j++;
};
i++;
};
AddType(b2CircleContact.Create, b2CircleContact.Destroy, b2Shape.e_circleShape, b2Shape.e_circleShape);
AddType(b2PolyAndCircleContact.Create, b2PolyAndCircleContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_circleShape);
AddType(b2PolygonContact.Create, b2PolygonContact.Destroy, b2Shape.e_polygonShape, b2Shape.e_polygonShape);
}
public static function Destroy(contact:b2Contact, allocator):void{
if (contact.m_manifoldCount > 0){
contact.m_shape1.m_body.WakeUp();
contact.m_shape2.m_body.WakeUp();
};
var type1:int = contact.m_shape1.m_type;
var type2:int = contact.m_shape2.m_type;
var reg:b2ContactRegister = s_registers[type1][type2];
var destroyFcn:Function = reg.destroyFcn;
destroyFcn(contact, allocator);
}
public static function AddType(createFcn:Function, destroyFcn:Function, type1:int, type2:int):void{
s_registers[type1][type2].createFcn = createFcn;
s_registers[type1][type2].destroyFcn = destroyFcn;
s_registers[type1][type2].primary = true;
if (type1 != type2){
s_registers[type2][type1].createFcn = createFcn;
s_registers[type2][type1].destroyFcn = destroyFcn;
s_registers[type2][type1].primary = false;
};
}
public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{
var c:b2Contact;
var i:int;
var m:b2Manifold;
if (s_initialized == false){
InitializeRegisters();
s_initialized = true;
};
var type1:int = shape1.m_type;
var type2:int = shape2.m_type;
var reg:b2ContactRegister = s_registers[type1][type2];
var createFcn:Function = reg.createFcn;
if (createFcn != null){
if (reg.primary){
return (createFcn(shape1, shape2, allocator));
};
c = createFcn(shape2, shape1, allocator);
i = 0;
while (i < c.m_manifoldCount) {
m = c.GetManifolds()[i];
m.normal = m.normal.Negative();
i++;
};
return (c);
//unresolved jump
};
return (null);
}
}
}//package Box2D.Dynamics.Contacts
Section 39
//b2ContactConstraint (Box2D.Dynamics.Contacts.b2ContactConstraint)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2ContactConstraint {
public var points:Array;
public var normal:b2Vec2;
public var restitution:Number;
public var body1:b2Body;
public var manifold:b2Manifold;
public var body2:b2Body;
public var friction:Number;
public var pointCount:int;
public function b2ContactConstraint(){
normal = new b2Vec2();
super();
points = new Array(b2Settings.b2_maxManifoldPoints);
var i:int;
while (i < b2Settings.b2_maxManifoldPoints) {
points[i] = new b2ContactConstraintPoint();
i++;
};
}
}
}//package Box2D.Dynamics.Contacts
Section 40
//b2ContactConstraintPoint (Box2D.Dynamics.Contacts.b2ContactConstraintPoint)
package Box2D.Dynamics.Contacts {
import Box2D.Common.Math.*;
public class b2ContactConstraintPoint {
public var r2:b2Vec2;
public var separation:Number;
public var positionImpulse:Number;
public var normalImpulse:Number;
public var tangentMass:Number;
public var equalizedMass:Number;
public var tangentImpulse:Number;
public var localAnchor1:b2Vec2;
public var localAnchor2:b2Vec2;
public var normalMass:Number;
public var velocityBias:Number;
public var r1:b2Vec2;
public function b2ContactConstraintPoint(){
localAnchor1 = new b2Vec2();
localAnchor2 = new b2Vec2();
r1 = new b2Vec2();
r2 = new b2Vec2();
super();
}
}
}//package Box2D.Dynamics.Contacts
Section 41
//b2ContactEdge (Box2D.Dynamics.Contacts.b2ContactEdge)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
public class b2ContactEdge {
public var other:b2Body;
public var prev:b2ContactEdge;
public var contact:b2Contact;
public var next:b2ContactEdge;
public function b2ContactEdge(){
super();
}
}
}//package Box2D.Dynamics.Contacts
Section 42
//b2ContactRegister (Box2D.Dynamics.Contacts.b2ContactRegister)
package Box2D.Dynamics.Contacts {
public class b2ContactRegister {
public var primary:Boolean;
public var createFcn:Function;
public var destroyFcn:Function;
public function b2ContactRegister(){
super();
}
}
}//package Box2D.Dynamics.Contacts
Section 43
//b2ContactResult (Box2D.Dynamics.Contacts.b2ContactResult)
package Box2D.Dynamics.Contacts {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
public class b2ContactResult {
public var position:b2Vec2;
public var shape1:b2Shape;
public var shape2:b2Shape;
public var normalImpulse:Number;
public var normal:b2Vec2;
public var tangentImpulse:Number;
public var id:b2ContactID;
public function b2ContactResult(){
position = new b2Vec2();
normal = new b2Vec2();
id = new b2ContactID();
super();
}
}
}//package Box2D.Dynamics.Contacts
Section 44
//b2ContactSolver (Box2D.Dynamics.Contacts.b2ContactSolver)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2ContactSolver {
public var m_constraintCount:int;
public var m_constraints:Array;
public var m_allocator;
public var m_step:b2TimeStep;
public function b2ContactSolver(step:b2TimeStep, contacts:Array, contactCount:int, allocator){
var contact:b2Contact;
var i:int;
var tVec:b2Vec2;
var tMat:b2Mat22;
var b1:b2Body;
var b2:b2Body;
var manifoldCount:int;
var manifolds:Array;
var friction:Number;
var restitution:Number;
var v1X:Number;
var v1Y:Number;
var v2X:Number;
var v2Y:Number;
var w1:Number;
var w2:Number;
var j:int;
var manifold:b2Manifold;
var normalX:Number;
var normalY:Number;
var c:b2ContactConstraint;
var k:uint;
var cp:b2ManifoldPoint;
var ccp:b2ContactConstraintPoint;
var tX:Number;
var tY:Number;
var r1X:Number;
var r1Y:Number;
var r2X:Number;
var r2Y:Number;
var r1Sqr:Number;
var r2Sqr:Number;
var rn1:Number;
var rn2:Number;
var kNormal:Number;
var kEqualized:Number;
var tangentX:Number;
var tangentY:Number;
var rt1:Number;
var rt2:Number;
var kTangent:Number;
var vRel:Number;
m_step = new b2TimeStep();
m_constraints = new Array();
super();
m_step.dt = step.dt;
m_step.inv_dt = step.inv_dt;
m_step.maxIterations = step.maxIterations;
m_allocator = allocator;
m_constraintCount = 0;
i = 0;
while (i < contactCount) {
contact = contacts[i];
m_constraintCount = (m_constraintCount + contact.m_manifoldCount);
i++;
};
i = 0;
while (i < m_constraintCount) {
m_constraints[i] = new b2ContactConstraint();
i++;
};
var count:int;
i = 0;
while (i < contactCount) {
contact = contacts[i];
b1 = contact.m_shape1.m_body;
b2 = contact.m_shape2.m_body;
manifoldCount = contact.m_manifoldCount;
manifolds = contact.GetManifolds();
friction = contact.m_friction;
restitution = contact.m_restitution;
v1X = b1.m_linearVelocity.x;
v1Y = b1.m_linearVelocity.y;
v2X = b2.m_linearVelocity.x;
v2Y = b2.m_linearVelocity.y;
w1 = b1.m_angularVelocity;
w2 = b2.m_angularVelocity;
j = 0;
while (j < manifoldCount) {
manifold = manifolds[j];
normalX = manifold.normal.x;
normalY = manifold.normal.y;
c = m_constraints[count];
c.body1 = b1;
c.body2 = b2;
c.manifold = manifold;
c.normal.x = normalX;
c.normal.y = normalY;
c.pointCount = manifold.pointCount;
c.friction = friction;
c.restitution = restitution;
k = 0;
while (k < c.pointCount) {
cp = manifold.points[k];
ccp = c.points[k];
ccp.normalImpulse = cp.normalImpulse;
ccp.tangentImpulse = cp.tangentImpulse;
ccp.separation = cp.separation;
ccp.positionImpulse = 0;
ccp.localAnchor1.SetV(cp.localPoint1);
ccp.localAnchor2.SetV(cp.localPoint2);
tMat = b1.m_xf.R;
r1X = (cp.localPoint1.x - b1.m_sweep.localCenter.x);
r1Y = (cp.localPoint1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
ccp.r1.Set(r1X, r1Y);
tMat = b2.m_xf.R;
r2X = (cp.localPoint2.x - b2.m_sweep.localCenter.x);
r2Y = (cp.localPoint2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
ccp.r2.Set(r2X, r2Y);
r1Sqr = ((r1X * r1X) + (r1Y * r1Y));
r2Sqr = ((r2X * r2X) + (r2Y * r2Y));
rn1 = ((r1X * normalX) + (r1Y * normalY));
rn2 = ((r2X * normalX) + (r2Y * normalY));
kNormal = (b1.m_invMass + b2.m_invMass);
kNormal = (kNormal + ((b1.m_invI * (r1Sqr - (rn1 * rn1))) + (b2.m_invI * (r2Sqr - (rn2 * rn2)))));
ccp.normalMass = (1 / kNormal);
kEqualized = ((b1.m_mass * b1.m_invMass) + (b2.m_mass * b2.m_invMass));
kEqualized = (kEqualized + (((b1.m_mass * b1.m_invI) * (r1Sqr - (rn1 * rn1))) + ((b2.m_mass * b2.m_invI) * (r2Sqr - (rn2 * rn2)))));
ccp.equalizedMass = (1 / kEqualized);
tangentX = normalY;
tangentY = -(normalX);
rt1 = ((r1X * tangentX) + (r1Y * tangentY));
rt2 = ((r2X * tangentX) + (r2Y * tangentY));
kTangent = (b1.m_invMass + b2.m_invMass);
kTangent = (kTangent + ((b1.m_invI * (r1Sqr - (rt1 * rt1))) + (b2.m_invI * (r2Sqr - (rt2 * rt2)))));
ccp.tangentMass = (1 / kTangent);
ccp.velocityBias = 0;
if (ccp.separation > 0){
ccp.velocityBias = (-60 * ccp.separation);
};
tX = (((v2X + (-(w2) * r2Y)) - v1X) - (-(w1) * r1Y));
tY = (((v2Y + (w2 * r2X)) - v1Y) - (w1 * r1X));
vRel = ((c.normal.x * tX) + (c.normal.y * tY));
if (vRel < -(b2Settings.b2_velocityThreshold)){
ccp.velocityBias = (ccp.velocityBias + (-(c.restitution) * vRel));
};
k++;
};
count++;
j++;
};
i++;
};
}
public function InitVelocityConstraints(step:b2TimeStep):void{
var tVec:b2Vec2;
var tVec2:b2Vec2;
var tMat:b2Mat22;
var c:b2ContactConstraint;
var b1:b2Body;
var b2:b2Body;
var invMass1:Number;
var invI1:Number;
var invMass2:Number;
var invI2:Number;
var normalX:Number;
var normalY:Number;
var tangentX:Number;
var tangentY:Number;
var tX:Number;
var j:int;
var tCount:int;
var ccp:b2ContactConstraintPoint;
var PX:Number;
var PY:Number;
var ccp2:b2ContactConstraintPoint;
var i:int;
while (i < m_constraintCount) {
c = m_constraints[i];
b1 = c.body1;
b2 = c.body2;
invMass1 = b1.m_invMass;
invI1 = b1.m_invI;
invMass2 = b2.m_invMass;
invI2 = b2.m_invI;
normalX = c.normal.x;
normalY = c.normal.y;
tangentX = normalY;
tangentY = -(normalX);
if (step.warmStarting){
tCount = c.pointCount;
j = 0;
while (j < tCount) {
ccp = c.points[j];
ccp.normalImpulse = (ccp.normalImpulse * step.dtRatio);
ccp.tangentImpulse = (ccp.tangentImpulse * step.dtRatio);
PX = ((ccp.normalImpulse * normalX) + (ccp.tangentImpulse * tangentX));
PY = ((ccp.normalImpulse * normalY) + (ccp.tangentImpulse * tangentY));
b1.m_angularVelocity = (b1.m_angularVelocity - (invI1 * ((ccp.r1.x * PY) - (ccp.r1.y * PX))));
b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (invMass1 * PX));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (invMass1 * PY));
b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * ((ccp.r2.x * PY) - (ccp.r2.y * PX))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (invMass2 * PX));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (invMass2 * PY));
j++;
};
} else {
tCount = c.pointCount;
j = 0;
while (j < tCount) {
ccp2 = c.points[j];
ccp2.normalImpulse = 0;
ccp2.tangentImpulse = 0;
j++;
};
};
i++;
};
}
public function SolvePositionConstraints(baumgarte:Number):Boolean{
var tMat:b2Mat22;
var tVec:b2Vec2;
var c:b2ContactConstraint;
var b1:b2Body;
var b2:b2Body;
var b1_sweep_c:b2Vec2;
var b1_sweep_a:Number;
var b2_sweep_c:b2Vec2;
var b2_sweep_a:Number;
var invMass1:Number;
var invI1:Number;
var invMass2:Number;
var invI2:Number;
var normalX:Number;
var normalY:Number;
var tCount:int;
var j:int;
var ccp:b2ContactConstraintPoint;
var r1X:Number;
var r1Y:Number;
var r2X:Number;
var r2Y:Number;
var tX:Number;
var p1X:Number;
var p1Y:Number;
var p2X:Number;
var p2Y:Number;
var dpX:Number;
var dpY:Number;
var separation:Number;
var C:Number;
var dImpulse:Number;
var impulse0:Number;
var impulseX:Number;
var impulseY:Number;
var minSeparation:Number = 0;
var i:int;
while (i < m_constraintCount) {
c = m_constraints[i];
b1 = c.body1;
b2 = c.body2;
b1_sweep_c = b1.m_sweep.c;
b1_sweep_a = b1.m_sweep.a;
b2_sweep_c = b2.m_sweep.c;
b2_sweep_a = b2.m_sweep.a;
invMass1 = (b1.m_mass * b1.m_invMass);
invI1 = (b1.m_mass * b1.m_invI);
invMass2 = (b2.m_mass * b2.m_invMass);
invI2 = (b2.m_mass * b2.m_invI);
normalX = c.normal.x;
normalY = c.normal.y;
tCount = c.pointCount;
j = 0;
while (j < tCount) {
ccp = c.points[j];
tMat = b1.m_xf.R;
tVec = b1.m_sweep.localCenter;
r1X = (ccp.localAnchor1.x - tVec.x);
r1Y = (ccp.localAnchor1.y - tVec.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
tVec = b2.m_sweep.localCenter;
r2X = (ccp.localAnchor2.x - tVec.x);
r2Y = (ccp.localAnchor2.y - tVec.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
p1X = (b1_sweep_c.x + r1X);
p1Y = (b1_sweep_c.y + r1Y);
p2X = (b2_sweep_c.x + r2X);
p2Y = (b2_sweep_c.y + r2Y);
dpX = (p2X - p1X);
dpY = (p2Y - p1Y);
separation = (((dpX * normalX) + (dpY * normalY)) + ccp.separation);
minSeparation = b2Math.b2Min(minSeparation, separation);
C = (baumgarte * b2Math.b2Clamp((separation + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0));
dImpulse = (-(ccp.equalizedMass) * C);
impulse0 = ccp.positionImpulse;
ccp.positionImpulse = b2Math.b2Max((impulse0 + dImpulse), 0);
dImpulse = (ccp.positionImpulse - impulse0);
impulseX = (dImpulse * normalX);
impulseY = (dImpulse * normalY);
b1_sweep_c.x = (b1_sweep_c.x - (invMass1 * impulseX));
b1_sweep_c.y = (b1_sweep_c.y - (invMass1 * impulseY));
b1_sweep_a = (b1_sweep_a - (invI1 * ((r1X * impulseY) - (r1Y * impulseX))));
b1.m_sweep.a = b1_sweep_a;
b1.SynchronizeTransform();
b2_sweep_c.x = (b2_sweep_c.x + (invMass2 * impulseX));
b2_sweep_c.y = (b2_sweep_c.y + (invMass2 * impulseY));
b2_sweep_a = (b2_sweep_a + (invI2 * ((r2X * impulseY) - (r2Y * impulseX))));
b2.m_sweep.a = b2_sweep_a;
b2.SynchronizeTransform();
j++;
};
i++;
};
return ((minSeparation >= (-1.5 * b2Settings.b2_linearSlop)));
}
public function SolveVelocityConstraints():void{
var j:int;
var ccp:b2ContactConstraintPoint;
var r1X:Number;
var r1Y:Number;
var r2X:Number;
var r2Y:Number;
var dvX:Number;
var dvY:Number;
var vn:Number;
var vt:Number;
var lambda_n:Number;
var lambda_t:Number;
var newImpulse_n:Number;
var newImpulse_t:Number;
var PX:Number;
var PY:Number;
var tMat:b2Mat22;
var tVec:b2Vec2;
var c:b2ContactConstraint;
var b1:b2Body;
var b2:b2Body;
var w1:Number;
var w2:Number;
var v1:b2Vec2;
var v2:b2Vec2;
var invMass1:Number;
var invI1:Number;
var invMass2:Number;
var invI2:Number;
var normalX:Number;
var normalY:Number;
var tangentX:Number;
var tangentY:Number;
var friction:Number;
var tX:Number;
var tCount:int;
var maxFriction:Number;
var i:int;
while (i < m_constraintCount) {
c = m_constraints[i];
b1 = c.body1;
b2 = c.body2;
w1 = b1.m_angularVelocity;
w2 = b2.m_angularVelocity;
v1 = b1.m_linearVelocity;
v2 = b2.m_linearVelocity;
invMass1 = b1.m_invMass;
invI1 = b1.m_invI;
invMass2 = b2.m_invMass;
invI2 = b2.m_invI;
normalX = c.normal.x;
normalY = c.normal.y;
tangentX = normalY;
tangentY = -(normalX);
friction = c.friction;
tCount = c.pointCount;
j = 0;
while (j < tCount) {
ccp = c.points[j];
dvX = (((v2.x + (-(w2) * ccp.r2.y)) - v1.x) - (-(w1) * ccp.r1.y));
dvY = (((v2.y + (w2 * ccp.r2.x)) - v1.y) - (w1 * ccp.r1.x));
vn = ((dvX * normalX) + (dvY * normalY));
lambda_n = (-(ccp.normalMass) * (vn - ccp.velocityBias));
vt = ((dvX * tangentX) + (dvY * tangentY));
lambda_t = (ccp.tangentMass * -(vt));
newImpulse_n = b2Math.b2Max((ccp.normalImpulse + lambda_n), 0);
lambda_n = (newImpulse_n - ccp.normalImpulse);
maxFriction = (friction * ccp.normalImpulse);
newImpulse_t = b2Math.b2Clamp((ccp.tangentImpulse + lambda_t), -(maxFriction), maxFriction);
lambda_t = (newImpulse_t - ccp.tangentImpulse);
PX = ((lambda_n * normalX) + (lambda_t * tangentX));
PY = ((lambda_n * normalY) + (lambda_t * tangentY));
v1.x = (v1.x - (invMass1 * PX));
v1.y = (v1.y - (invMass1 * PY));
w1 = (w1 - (invI1 * ((ccp.r1.x * PY) - (ccp.r1.y * PX))));
v2.x = (v2.x + (invMass2 * PX));
v2.y = (v2.y + (invMass2 * PY));
w2 = (w2 + (invI2 * ((ccp.r2.x * PY) - (ccp.r2.y * PX))));
ccp.normalImpulse = newImpulse_n;
ccp.tangentImpulse = newImpulse_t;
j++;
};
b1.m_angularVelocity = w1;
b2.m_angularVelocity = w2;
i++;
};
}
public function FinalizeVelocityConstraints():void{
var c:b2ContactConstraint;
var m:b2Manifold;
var j:int;
var point1:b2ManifoldPoint;
var point2:b2ContactConstraintPoint;
var i:int;
while (i < m_constraintCount) {
c = m_constraints[i];
m = c.manifold;
j = 0;
while (j < c.pointCount) {
point1 = m.points[j];
point2 = c.points[j];
point1.normalImpulse = point2.normalImpulse;
point1.tangentImpulse = point2.tangentImpulse;
j++;
};
i++;
};
}
}
}//package Box2D.Dynamics.Contacts
Section 45
//b2NullContact (Box2D.Dynamics.Contacts.b2NullContact)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
public class b2NullContact extends b2Contact {
public function b2NullContact(){
super();
}
override public function Evaluate(l:b2ContactListener):void{
}
override public function GetManifolds():Array{
return (null);
}
}
}//package Box2D.Dynamics.Contacts
Section 46
//b2PolyAndCircleContact (Box2D.Dynamics.Contacts.b2PolyAndCircleContact)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2PolyAndCircleContact extends b2Contact {
private var m_manifolds:Array;
public var m_manifold:b2Manifold;
private var m0:b2Manifold;
private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
public function b2PolyAndCircleContact(shape1:b2Shape, shape2:b2Shape){
m_manifolds = [new b2Manifold()];
m0 = new b2Manifold();
super(shape1, shape2);
m_manifold = m_manifolds[0];
b2Settings.b2Assert((m_shape1.m_type == b2Shape.e_polygonShape));
b2Settings.b2Assert((m_shape2.m_type == b2Shape.e_circleShape));
m_manifold.pointCount = 0;
var point:b2ManifoldPoint = m_manifold.points[0];
point.normalImpulse = 0;
point.tangentImpulse = 0;
}
override public function Evaluate(listener:b2ContactListener):void{
var i:int;
var v1:b2Vec2;
var v2:b2Vec2;
var mp0:b2ManifoldPoint;
var mp:b2ManifoldPoint;
var found:Boolean;
var idKey:uint;
var j:int;
var b1:b2Body = m_shape1.m_body;
var b2:b2Body = m_shape2.m_body;
m0.Set(m_manifold);
b2Collision.b2CollidePolygonAndCircle(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2CircleShape), b2.m_xf);
var persisted:Array = [false, false];
var cp:b2ContactPoint = s_evalCP;
cp.shape1 = m_shape1;
cp.shape2 = m_shape2;
cp.friction = m_friction;
cp.restitution = m_restitution;
if (m_manifold.pointCount > 0){
i = 0;
while (i < m_manifold.pointCount) {
mp = m_manifold.points[i];
mp.normalImpulse = 0;
mp.tangentImpulse = 0;
found = false;
idKey = mp.id._key;
j = 0;
while (j < m0.pointCount) {
if (persisted[j] == true){
} else {
mp0 = m0.points[j];
if (mp0.id._key == idKey){
persisted[j] = true;
mp.normalImpulse = mp0.normalImpulse;
mp.tangentImpulse = mp0.tangentImpulse;
found = true;
if (listener != null){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = idKey;
listener.Persist(cp);
};
break;
};
};
j++;
};
if ((((found == false)) && (!((listener == null))))){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = idKey;
listener.Add(cp);
};
i++;
};
m_manifoldCount = 1;
} else {
m_manifoldCount = 0;
};
if (listener == null){
return;
};
i = 0;
while (i < m0.pointCount) {
if (persisted[i]){
} else {
mp0 = m0.points[i];
cp.position = b1.GetWorldPoint(mp0.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m0.normal);
cp.separation = mp0.separation;
cp.id.key = mp0.id._key;
listener.Remove(cp);
};
i++;
};
}
override public function GetManifolds():Array{
return (m_manifolds);
}
public static function Destroy(contact:b2Contact, allocator):void{
}
public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{
return (new b2PolyAndCircleContact(shape1, shape2));
}
}
}//package Box2D.Dynamics.Contacts
Section 47
//b2PolygonContact (Box2D.Dynamics.Contacts.b2PolygonContact)
package Box2D.Dynamics.Contacts {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
public class b2PolygonContact extends b2Contact {
private var m_manifolds:Array;
private var m0:b2Manifold;
public var m_manifold:b2Manifold;
private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
public function b2PolygonContact(shape1:b2Shape, shape2:b2Shape):void{
m0 = new b2Manifold();
m_manifolds = [new b2Manifold()];
super(shape1, shape2);
m_manifold = m_manifolds[0];
m_manifold.pointCount = 0;
}
override public function Evaluate(listener:b2ContactListener):void{
var v1:b2Vec2;
var v2:b2Vec2;
var mp0:b2ManifoldPoint;
var cp:b2ContactPoint;
var i:int;
var mp:b2ManifoldPoint;
var found:Boolean;
var idKey:uint;
var j:int;
var b1:b2Body = m_shape1.m_body;
var b2:b2Body = m_shape2.m_body;
m0.Set(m_manifold);
b2Collision.b2CollidePolygons(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2PolygonShape), b2.m_xf);
var persisted:Array = [false, false];
cp = s_evalCP;
cp.shape1 = m_shape1;
cp.shape2 = m_shape2;
cp.friction = m_friction;
cp.restitution = m_restitution;
if (m_manifold.pointCount > 0){
i = 0;
while (i < m_manifold.pointCount) {
mp = m_manifold.points[i];
mp.normalImpulse = 0;
mp.tangentImpulse = 0;
found = false;
idKey = mp.id._key;
j = 0;
while (j < m0.pointCount) {
if (persisted[j] == true){
} else {
mp0 = m0.points[j];
if (mp0.id._key == idKey){
persisted[j] = true;
mp.normalImpulse = mp0.normalImpulse;
mp.tangentImpulse = mp0.tangentImpulse;
found = true;
if (listener != null){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = idKey;
listener.Persist(cp);
};
break;
};
};
j++;
};
if ((((found == false)) && (!((listener == null))))){
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m_manifold.normal);
cp.separation = mp.separation;
cp.id.key = idKey;
listener.Add(cp);
};
i++;
};
m_manifoldCount = 1;
} else {
m_manifoldCount = 0;
};
if (listener == null){
return;
};
i = 0;
while (i < m0.pointCount) {
if (persisted[i]){
} else {
mp0 = m0.points[i];
cp.position = b1.GetWorldPoint(mp0.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp0.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp0.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.normal.SetV(m0.normal);
cp.separation = mp0.separation;
cp.id.key = mp0.id._key;
listener.Remove(cp);
};
i++;
};
}
override public function GetManifolds():Array{
return (m_manifolds);
}
public static function Destroy(contact:b2Contact, allocator):void{
}
public static function Create(shape1:b2Shape, shape2:b2Shape, allocator):b2Contact{
return (new b2PolygonContact(shape1, shape2));
}
}
}//package Box2D.Dynamics.Contacts
Section 48
//b2DistanceJoint (Box2D.Dynamics.Joints.b2DistanceJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2DistanceJoint extends b2Joint {
public var m_localAnchor1:b2Vec2;
public var m_localAnchor2:b2Vec2;
public var m_bias:Number;
public var m_gamma:Number;
public var m_u:b2Vec2;
public var m_mass:Number;
public var m_impulse:Number;
public var m_dampingRatio:Number;
public var m_frequencyHz:Number;
public var m_length:Number;
public function b2DistanceJoint(def:b2DistanceJointDef){
var tMat:b2Mat22;
var tX:Number;
var tY:Number;
m_localAnchor1 = new b2Vec2();
m_localAnchor2 = new b2Vec2();
m_u = new b2Vec2();
super(def);
m_localAnchor1.SetV(def.localAnchor1);
m_localAnchor2.SetV(def.localAnchor2);
m_length = def.length;
m_frequencyHz = def.frequencyHz;
m_dampingRatio = def.dampingRatio;
m_impulse = 0;
m_gamma = 0;
m_bias = 0;
m_inv_dt = 0;
}
override public function GetAnchor1():b2Vec2{
return (m_body1.GetWorldPoint(m_localAnchor1));
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor2));
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var tX:Number;
var b1:b2Body;
var b2:b2Body;
var r1X:Number;
var r2X:Number;
var C:Number;
var omega:Number;
var d:Number;
var k:Number;
var PX:Number;
var PY:Number;
m_inv_dt = step.inv_dt;
b1 = m_body1;
b2 = m_body2;
tMat = b1.m_xf.R;
r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
m_u.x = (((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x) - r1X);
m_u.y = (((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y) - r1Y);
var length:Number = Math.sqrt(((m_u.x * m_u.x) + (m_u.y * m_u.y)));
if (length > b2Settings.b2_linearSlop){
m_u.Multiply((1 / length));
} else {
m_u.SetZero();
};
var cr1u:Number = ((r1X * m_u.y) - (r1Y * m_u.x));
var cr2u:Number = ((r2X * m_u.y) - (r2Y * m_u.x));
var invMass:Number = (((b1.m_invMass + ((b1.m_invI * cr1u) * cr1u)) + b2.m_invMass) + ((b2.m_invI * cr2u) * cr2u));
m_mass = (1 / invMass);
if (m_frequencyHz > 0){
C = (length - m_length);
omega = ((2 * Math.PI) * m_frequencyHz);
d = (((2 * m_mass) * m_dampingRatio) * omega);
k = ((m_mass * omega) * omega);
m_gamma = (1 / (step.dt * (d + (step.dt * k))));
m_bias = (((C * step.dt) * k) * m_gamma);
m_mass = (1 / (invMass + m_gamma));
};
if (step.warmStarting){
m_impulse = (m_impulse * step.dtRatio);
PX = (m_impulse * m_u.x);
PY = (m_impulse * m_u.y);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY));
b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX))));
} else {
m_impulse = 0;
};
}
override public function GetReactionTorque():Number{
return (0);
}
override public function GetReactionForce():b2Vec2{
var F:b2Vec2 = new b2Vec2();
F.SetV(m_u);
F.Multiply((m_inv_dt * m_impulse));
return (F);
}
override public function SolvePositionConstraints():Boolean{
var tMat:b2Mat22;
if (m_frequencyHz > 0){
return (true);
};
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var dX:Number = (((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x) - r1X);
var dY:Number = (((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y) - r1Y);
var length:Number = Math.sqrt(((dX * dX) + (dY * dY)));
dX = (dX / length);
dY = (dY / length);
var C:Number = (length - m_length);
C = b2Math.b2Clamp(C, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
var impulse:Number = (-(m_mass) * C);
m_u.Set(dX, dY);
var PX:Number = (impulse * m_u.x);
var PY:Number = (impulse * m_u.y);
b1.m_sweep.c.x = (b1.m_sweep.c.x - (b1.m_invMass * PX));
b1.m_sweep.c.y = (b1.m_sweep.c.y - (b1.m_invMass * PY));
b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * ((r1X * PY) - (r1Y * PX))));
b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * PX));
b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * PY));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * PY) - (r2Y * PX))));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
return ((b2Math.b2Abs(C) < b2Settings.b2_linearSlop));
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var v1X:Number = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y));
var v1Y:Number = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X));
var v2X:Number = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y));
var v2Y:Number = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X));
var Cdot:Number = ((m_u.x * (v2X - v1X)) + (m_u.y * (v2Y - v1Y)));
var impulse:Number = (-(m_mass) * ((Cdot + m_bias) + (m_gamma * m_impulse)));
m_impulse = (m_impulse + impulse);
var PX:Number = (impulse * m_u.x);
var PY:Number = (impulse * m_u.y);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY));
b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX))));
}
}
}//package Box2D.Dynamics.Joints
Section 49
//b2DistanceJointDef (Box2D.Dynamics.Joints.b2DistanceJointDef)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
public class b2DistanceJointDef extends b2JointDef {
public var localAnchor1:b2Vec2;
public var length:Number;
public var dampingRatio:Number;
public var localAnchor2:b2Vec2;
public var frequencyHz:Number;
public function b2DistanceJointDef(){
localAnchor1 = new b2Vec2();
localAnchor2 = new b2Vec2();
super();
type = b2Joint.e_distanceJoint;
length = 1;
frequencyHz = 0;
dampingRatio = 0;
}
public function Initialize(b1:b2Body, b2:b2Body, anchor1:b2Vec2, anchor2:b2Vec2):void{
body1 = b1;
body2 = b2;
localAnchor1.SetV(body1.GetLocalPoint(anchor1));
localAnchor2.SetV(body2.GetLocalPoint(anchor2));
var dX:Number = (anchor2.x - anchor1.x);
var dY:Number = (anchor2.y - anchor1.y);
length = Math.sqrt(((dX * dX) + (dY * dY)));
frequencyHz = 0;
dampingRatio = 0;
}
}
}//package Box2D.Dynamics.Joints
Section 50
//b2GearJoint (Box2D.Dynamics.Joints.b2GearJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2GearJoint extends b2Joint {
public var m_ground2:b2Body;
public var m_groundAnchor1:b2Vec2;
public var m_groundAnchor2:b2Vec2;
public var m_localAnchor1:b2Vec2;
public var m_localAnchor2:b2Vec2;
public var m_ratio:Number;
public var m_revolute2:b2RevoluteJoint;
public var m_force:Number;
public var m_mass:Number;
public var m_prismatic2:b2PrismaticJoint;
public var m_ground1:b2Body;
public var m_revolute1:b2RevoluteJoint;
public var m_prismatic1:b2PrismaticJoint;
public var m_constant:Number;
public var m_J:b2Jacobian;
public function b2GearJoint(def:b2GearJointDef){
var coordinate1:Number;
var coordinate2:Number;
m_groundAnchor1 = new b2Vec2();
m_groundAnchor2 = new b2Vec2();
m_localAnchor1 = new b2Vec2();
m_localAnchor2 = new b2Vec2();
m_J = new b2Jacobian();
super(def);
var type1:int = def.joint1.m_type;
var type2:int = def.joint2.m_type;
m_revolute1 = null;
m_prismatic1 = null;
m_revolute2 = null;
m_prismatic2 = null;
m_ground1 = def.joint1.m_body1;
m_body1 = def.joint1.m_body2;
if (type1 == b2Joint.e_revoluteJoint){
m_revolute1 = (def.joint1 as b2RevoluteJoint);
m_groundAnchor1.SetV(m_revolute1.m_localAnchor1);
m_localAnchor1.SetV(m_revolute1.m_localAnchor2);
coordinate1 = m_revolute1.GetJointAngle();
} else {
m_prismatic1 = (def.joint1 as b2PrismaticJoint);
m_groundAnchor1.SetV(m_prismatic1.m_localAnchor1);
m_localAnchor1.SetV(m_prismatic1.m_localAnchor2);
coordinate1 = m_prismatic1.GetJointTranslation();
};
m_ground2 = def.joint2.m_body1;
m_body2 = def.joint2.m_body2;
if (type2 == b2Joint.e_revoluteJoint){
m_revolute2 = (def.joint2 as b2RevoluteJoint);
m_groundAnchor2.SetV(m_revolute2.m_localAnchor1);
m_localAnchor2.SetV(m_revolute2.m_localAnchor2);
coordinate2 = m_revolute2.GetJointAngle();
} else {
m_prismatic2 = (def.joint2 as b2PrismaticJoint);
m_groundAnchor2.SetV(m_prismatic2.m_localAnchor1);
m_localAnchor2.SetV(m_prismatic2.m_localAnchor2);
coordinate2 = m_prismatic2.GetJointTranslation();
};
m_ratio = def.ratio;
m_constant = (coordinate1 + (m_ratio * coordinate2));
m_force = 0;
}
override public function GetAnchor1():b2Vec2{
return (m_body1.GetWorldPoint(m_localAnchor1));
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor2));
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var ugX:Number;
var ugY:Number;
var rX:Number;
var rY:Number;
var tMat:b2Mat22;
var tVec:b2Vec2;
var crug:Number;
var tX:Number;
var P:Number;
var g1:b2Body = m_ground1;
var g2:b2Body = m_ground2;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var K:Number = 0;
m_J.SetZero();
if (m_revolute1){
m_J.angular1 = -1;
K = (K + b1.m_invI);
} else {
tMat = g1.m_xf.R;
tVec = m_prismatic1.m_localXAxis1;
ugX = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
ugY = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tMat = b1.m_xf.R;
rX = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
rY = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY));
rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY));
rX = tX;
crug = ((rX * ugY) - (rY * ugX));
m_J.linear1.Set(-(ugX), -(ugY));
m_J.angular1 = -(crug);
K = (K + (b1.m_invMass + ((b1.m_invI * crug) * crug)));
};
if (m_revolute2){
m_J.angular2 = -(m_ratio);
K = (K + ((m_ratio * m_ratio) * b2.m_invI));
} else {
tMat = g2.m_xf.R;
tVec = m_prismatic2.m_localXAxis1;
ugX = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
ugY = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
tMat = b2.m_xf.R;
rX = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
rY = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY));
rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY));
rX = tX;
crug = ((rX * ugY) - (rY * ugX));
m_J.linear2.Set((-(m_ratio) * ugX), (-(m_ratio) * ugY));
m_J.angular2 = (-(m_ratio) * crug);
K = (K + ((m_ratio * m_ratio) * (b2.m_invMass + ((b2.m_invI * crug) * crug))));
};
m_mass = (1 / K);
if (step.warmStarting){
P = (step.dt * m_force);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((b1.m_invMass * P) * m_J.linear1.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((b1.m_invMass * P) * m_J.linear1.y));
b1.m_angularVelocity = (b1.m_angularVelocity + ((b1.m_invI * P) * m_J.angular1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((b2.m_invMass * P) * m_J.linear2.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((b2.m_invMass * P) * m_J.linear2.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * P) * m_J.angular2));
} else {
m_force = 0;
};
}
override public function GetReactionTorque():Number{
var tMat:b2Mat22 = m_body2.m_xf.R;
var rX:Number = (m_localAnchor1.x - m_body2.m_sweep.localCenter.x);
var rY:Number = (m_localAnchor1.y - m_body2.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * rX) + (tMat.col2.x * rY));
rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY));
rX = tX;
tX = ((m_force * m_J.angular2) - ((rX * (m_force * m_J.linear2.y)) - (rY * (m_force * m_J.linear2.x))));
return (tX);
}
override public function GetReactionForce():b2Vec2{
var F:b2Vec2 = new b2Vec2((m_force * m_J.linear2.x), (m_force * m_J.linear2.y));
return (F);
}
override public function SolvePositionConstraints():Boolean{
var coordinate1:Number;
var coordinate2:Number;
var linearError:Number = 0;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
if (m_revolute1){
coordinate1 = m_revolute1.GetJointAngle();
} else {
coordinate1 = m_prismatic1.GetJointTranslation();
};
if (m_revolute2){
coordinate2 = m_revolute2.GetJointAngle();
} else {
coordinate2 = m_prismatic2.GetJointTranslation();
};
var C:Number = (m_constant - (coordinate1 + (m_ratio * coordinate2)));
var impulse:Number = (-(m_mass) * C);
b1.m_sweep.c.x = (b1.m_sweep.c.x + ((b1.m_invMass * impulse) * m_J.linear1.x));
b1.m_sweep.c.y = (b1.m_sweep.c.y + ((b1.m_invMass * impulse) * m_J.linear1.y));
b1.m_sweep.a = (b1.m_sweep.a + ((b1.m_invI * impulse) * m_J.angular1));
b2.m_sweep.c.x = (b2.m_sweep.c.x + ((b2.m_invMass * impulse) * m_J.linear2.x));
b2.m_sweep.c.y = (b2.m_sweep.c.y + ((b2.m_invMass * impulse) * m_J.linear2.y));
b2.m_sweep.a = (b2.m_sweep.a + ((b2.m_invI * impulse) * m_J.angular2));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
return ((linearError < b2Settings.b2_linearSlop));
}
public function GetRatio():Number{
return (m_ratio);
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var Cdot:Number = m_J.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity);
var force:Number = ((-(step.inv_dt) * m_mass) * Cdot);
m_force = (m_force + force);
var P:Number = (step.dt * force);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((b1.m_invMass * P) * m_J.linear1.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((b1.m_invMass * P) * m_J.linear1.y));
b1.m_angularVelocity = (b1.m_angularVelocity + ((b1.m_invI * P) * m_J.angular1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((b2.m_invMass * P) * m_J.linear2.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((b2.m_invMass * P) * m_J.linear2.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * P) * m_J.angular2));
}
}
}//package Box2D.Dynamics.Joints
Section 51
//b2GearJointDef (Box2D.Dynamics.Joints.b2GearJointDef)
package Box2D.Dynamics.Joints {
public class b2GearJointDef extends b2JointDef {
public var joint1:b2Joint;
public var joint2:b2Joint;
public var ratio:Number;
public function b2GearJointDef(){
super();
type = b2Joint.e_gearJoint;
joint1 = null;
joint2 = null;
ratio = 1;
}
}
}//package Box2D.Dynamics.Joints
Section 52
//b2Jacobian (Box2D.Dynamics.Joints.b2Jacobian)
package Box2D.Dynamics.Joints {
import Box2D.Common.Math.*;
public class b2Jacobian {
public var linear1:b2Vec2;
public var linear2:b2Vec2;
public var angular1:Number;
public var angular2:Number;
public function b2Jacobian(){
linear1 = new b2Vec2();
linear2 = new b2Vec2();
super();
}
public function Set(x1:b2Vec2, a1:Number, x2:b2Vec2, a2:Number):void{
linear1.SetV(x1);
angular1 = a1;
linear2.SetV(x2);
angular2 = a2;
}
public function SetZero():void{
linear1.SetZero();
angular1 = 0;
linear2.SetZero();
angular2 = 0;
}
public function Compute(x1:b2Vec2, a1:Number, x2:b2Vec2, a2:Number):Number{
return ((((((linear1.x * x1.x) + (linear1.y * x1.y)) + (angular1 * a1)) + ((linear2.x * x2.x) + (linear2.y * x2.y))) + (angular2 * a2)));
}
}
}//package Box2D.Dynamics.Joints
Section 53
//b2Joint (Box2D.Dynamics.Joints.b2Joint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
public class b2Joint {
public var m_islandFlag:Boolean;
public var m_body1:b2Body;
public var m_prev:b2Joint;
public var m_next:b2Joint;
public var m_type:int;
public var m_collideConnected:Boolean;
public var m_node1:b2JointEdge;
public var m_node2:b2JointEdge;
public var m_inv_dt:Number;
public var m_userData;
public var m_body2:b2Body;
public static const e_unknownJoint:int = 0;
public static const e_inactiveLimit:int = 0;
public static const e_atUpperLimit:int = 2;
public static const e_atLowerLimit:int = 1;
public static const e_gearJoint:int = 6;
public static const e_revoluteJoint:int = 1;
public static const e_equalLimits:int = 3;
public static const e_distanceJoint:int = 3;
public static const e_pulleyJoint:int = 4;
public static const e_prismaticJoint:int = 2;
public static const e_mouseJoint:int = 5;
public function b2Joint(def:b2JointDef){
m_node1 = new b2JointEdge();
m_node2 = new b2JointEdge();
super();
m_type = def.type;
m_prev = null;
m_next = null;
m_body1 = def.body1;
m_body2 = def.body2;
m_collideConnected = def.collideConnected;
m_islandFlag = false;
m_userData = def.userData;
}
public function GetBody2():b2Body{
return (m_body2);
}
public function GetAnchor1():b2Vec2{
return (null);
}
public function GetAnchor2():b2Vec2{
return (null);
}
public function GetNext():b2Joint{
return (m_next);
}
public function GetType():int{
return (m_type);
}
public function InitVelocityConstraints(step:b2TimeStep):void{
}
public function GetReactionTorque():Number{
return (0);
}
public function GetUserData(){
return (m_userData);
}
public function GetReactionForce():b2Vec2{
return (null);
}
public function SolvePositionConstraints():Boolean{
return (false);
}
public function SetUserData(data):void{
m_userData = data;
}
public function GetBody1():b2Body{
return (m_body1);
}
public function SolveVelocityConstraints(step:b2TimeStep):void{
}
public function InitPositionConstraints():void{
}
public static function Destroy(joint:b2Joint, allocator):void{
}
public static function Create(def:b2JointDef, allocator):b2Joint{
var joint:b2Joint;
switch (def.type){
case e_distanceJoint:
joint = new b2DistanceJoint((def as b2DistanceJointDef));
break;
case e_mouseJoint:
joint = new b2MouseJoint((def as b2MouseJointDef));
break;
case e_prismaticJoint:
joint = new b2PrismaticJoint((def as b2PrismaticJointDef));
break;
case e_revoluteJoint:
joint = new b2RevoluteJoint((def as b2RevoluteJointDef));
break;
case e_pulleyJoint:
joint = new b2PulleyJoint((def as b2PulleyJointDef));
break;
case e_gearJoint:
joint = new b2GearJoint((def as b2GearJointDef));
break;
default:
break;
};
return (joint);
}
}
}//package Box2D.Dynamics.Joints
Section 54
//b2JointDef (Box2D.Dynamics.Joints.b2JointDef)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
public class b2JointDef {
public var body2:b2Body;
public var type:int;
public var userData;
public var collideConnected:Boolean;
public var body1:b2Body;
public function b2JointDef(){
super();
type = b2Joint.e_unknownJoint;
userData = null;
body1 = null;
body2 = null;
collideConnected = false;
}
}
}//package Box2D.Dynamics.Joints
Section 55
//b2JointEdge (Box2D.Dynamics.Joints.b2JointEdge)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
public class b2JointEdge {
public var other:b2Body;
public var next:b2JointEdge;
public var prev:b2JointEdge;
public var joint:b2Joint;
public function b2JointEdge(){
super();
}
}
}//package Box2D.Dynamics.Joints
Section 56
//b2MouseJoint (Box2D.Dynamics.Joints.b2MouseJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2MouseJoint extends b2Joint {
private var K1:b2Mat22;
private var K:b2Mat22;
public var m_beta:Number;
public var m_mass:b2Mat22;
private var K2:b2Mat22;
public var m_target:b2Vec2;
public var m_gamma:Number;
public var m_impulse:b2Vec2;
public var m_C:b2Vec2;
public var m_localAnchor:b2Vec2;
public var m_maxForce:Number;
public function b2MouseJoint(def:b2MouseJointDef){
var tY:Number;
K = new b2Mat22();
K1 = new b2Mat22();
K2 = new b2Mat22();
m_localAnchor = new b2Vec2();
m_target = new b2Vec2();
m_impulse = new b2Vec2();
m_mass = new b2Mat22();
m_C = new b2Vec2();
super(def);
m_target.SetV(def.target);
var tX:Number = (m_target.x - m_body2.m_xf.position.x);
tY = (m_target.y - m_body2.m_xf.position.y);
var tMat:b2Mat22 = m_body2.m_xf.R;
m_localAnchor.x = ((tX * tMat.col1.x) + (tY * tMat.col1.y));
m_localAnchor.y = ((tX * tMat.col2.x) + (tY * tMat.col2.y));
m_maxForce = def.maxForce;
m_impulse.SetZero();
var mass:Number = m_body2.m_mass;
var omega:Number = ((2 * b2Settings.b2_pi) * def.frequencyHz);
var d:Number = (((2 * mass) * def.dampingRatio) * omega);
var k:Number = ((def.timeStep * mass) * (omega * omega));
m_gamma = (1 / (d + k));
m_beta = (k / (d + k));
}
public function SetTarget(target:b2Vec2):void{
if (m_body2.IsSleeping()){
m_body2.WakeUp();
};
m_target = target;
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor));
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var b:b2Body;
var tMat:b2Mat22;
var rX:Number;
var rY:Number;
var invMass:Number;
var invI:Number;
b = m_body2;
tMat = b.m_xf.R;
rX = (m_localAnchor.x - b.m_sweep.localCenter.x);
rY = (m_localAnchor.y - b.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * rX) + (tMat.col2.x * rY));
rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY));
rX = tX;
invMass = b.m_invMass;
invI = b.m_invI;
K1.col1.x = invMass;
K1.col2.x = 0;
K1.col1.y = 0;
K1.col2.y = invMass;
K2.col1.x = ((invI * rY) * rY);
K2.col2.x = ((-(invI) * rX) * rY);
K2.col1.y = ((-(invI) * rX) * rY);
K2.col2.y = ((invI * rX) * rX);
K.SetM(K1);
K.AddM(K2);
K.col1.x = (K.col1.x + m_gamma);
K.col2.y = (K.col2.y + m_gamma);
K.Invert(m_mass);
m_C.x = ((b.m_sweep.c.x + rX) - m_target.x);
m_C.y = ((b.m_sweep.c.y + rY) - m_target.y);
b.m_angularVelocity = (b.m_angularVelocity * 0.98);
var PX:Number = (step.dt * m_impulse.x);
var PY:Number = (step.dt * m_impulse.y);
b.m_linearVelocity.x = (b.m_linearVelocity.x + (invMass * PX));
b.m_linearVelocity.y = (b.m_linearVelocity.y + (invMass * PY));
b.m_angularVelocity = (b.m_angularVelocity + (invI * ((rX * PY) - (rY * PX))));
}
override public function GetAnchor1():b2Vec2{
return (m_target);
}
override public function GetReactionTorque():Number{
return (0);
}
override public function GetReactionForce():b2Vec2{
return (m_impulse);
}
override public function SolvePositionConstraints():Boolean{
return (true);
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var tX:Number;
var tY:Number;
var b:b2Body = m_body2;
tMat = b.m_xf.R;
var rX:Number = (m_localAnchor.x - b.m_sweep.localCenter.x);
var rY:Number = (m_localAnchor.y - b.m_sweep.localCenter.y);
tX = ((tMat.col1.x * rX) + (tMat.col2.x * rY));
rY = ((tMat.col1.y * rX) + (tMat.col2.y * rY));
rX = tX;
var CdotX:Number = (b.m_linearVelocity.x + (-(b.m_angularVelocity) * rY));
var CdotY:Number = (b.m_linearVelocity.y + (b.m_angularVelocity * rX));
tMat = m_mass;
tX = ((CdotX + ((m_beta * step.inv_dt) * m_C.x)) + ((m_gamma * step.dt) * m_impulse.x));
tY = ((CdotY + ((m_beta * step.inv_dt) * m_C.y)) + ((m_gamma * step.dt) * m_impulse.y));
var forceX:Number = (-(step.inv_dt) * ((tMat.col1.x * tX) + (tMat.col2.x * tY)));
var forceY:Number = (-(step.inv_dt) * ((tMat.col1.y * tX) + (tMat.col2.y * tY)));
var oldForceX:Number = m_impulse.x;
var oldForceY:Number = m_impulse.y;
m_impulse.x = (m_impulse.x + forceX);
m_impulse.y = (m_impulse.y + forceY);
var forceMagnitude:Number = m_impulse.Length();
if (forceMagnitude > m_maxForce){
m_impulse.Multiply((m_maxForce / forceMagnitude));
};
forceX = (m_impulse.x - oldForceX);
forceY = (m_impulse.y - oldForceY);
var PX:Number = (step.dt * forceX);
var PY:Number = (step.dt * forceY);
b.m_linearVelocity.x = (b.m_linearVelocity.x + (b.m_invMass * PX));
b.m_linearVelocity.y = (b.m_linearVelocity.y + (b.m_invMass * PY));
b.m_angularVelocity = (b.m_angularVelocity + (b.m_invI * ((rX * PY) - (rY * PX))));
}
}
}//package Box2D.Dynamics.Joints
Section 57
//b2MouseJointDef (Box2D.Dynamics.Joints.b2MouseJointDef)
package Box2D.Dynamics.Joints {
import Box2D.Common.Math.*;
public class b2MouseJointDef extends b2JointDef {
public var timeStep:Number;
public var target:b2Vec2;
public var maxForce:Number;
public var dampingRatio:Number;
public var frequencyHz:Number;
public function b2MouseJointDef(){
target = new b2Vec2();
super();
type = b2Joint.e_mouseJoint;
maxForce = 0;
frequencyHz = 5;
dampingRatio = 0.7;
timeStep = (1 / 60);
}
}
}//package Box2D.Dynamics.Joints
Section 58
//b2PrismaticJoint (Box2D.Dynamics.Joints.b2PrismaticJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2PrismaticJoint extends b2Joint {
public var m_limitForce:Number;
public var m_lowerTranslation:Number;
public var m_localXAxis1:b2Vec2;
public var m_refAngle:Number;
public var m_torque:Number;
public var m_motorForce:Number;
public var m_enableLimit:Boolean;
public var m_angularMass:Number;
public var m_maxMotorForce:Number;
public var m_localYAxis1:b2Vec2;
public var m_force:Number;
public var m_motorMass:Number;
public var m_upperTranslation:Number;
public var m_localAnchor1:b2Vec2;
public var m_localAnchor2:b2Vec2;
public var m_limitState:int;
public var m_linearMass:Number;
public var m_motorJacobian:b2Jacobian;
public var m_limitPositionImpulse:Number;
public var m_motorSpeed:Number;
public var m_enableMotor:Boolean;
public var m_linearJacobian:b2Jacobian;
public function b2PrismaticJoint(def:b2PrismaticJointDef){
var tMat:b2Mat22;
var tX:Number;
var tY:Number;
m_localAnchor1 = new b2Vec2();
m_localAnchor2 = new b2Vec2();
m_localXAxis1 = new b2Vec2();
m_localYAxis1 = new b2Vec2();
m_linearJacobian = new b2Jacobian();
m_motorJacobian = new b2Jacobian();
super(def);
m_localAnchor1.SetV(def.localAnchor1);
m_localAnchor2.SetV(def.localAnchor2);
m_localXAxis1.SetV(def.localAxis1);
m_localYAxis1.x = -(m_localXAxis1.y);
m_localYAxis1.y = m_localXAxis1.x;
m_refAngle = def.referenceAngle;
m_linearJacobian.SetZero();
m_linearMass = 0;
m_force = 0;
m_angularMass = 0;
m_torque = 0;
m_motorJacobian.SetZero();
m_motorMass = 0;
m_motorForce = 0;
m_limitForce = 0;
m_limitPositionImpulse = 0;
m_lowerTranslation = def.lowerTranslation;
m_upperTranslation = def.upperTranslation;
m_maxMotorForce = def.maxMotorForce;
m_motorSpeed = def.motorSpeed;
m_enableLimit = def.enableLimit;
m_enableMotor = def.enableMotor;
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var oldLimitForce:Number;
var motorCdot:Number;
var motorForce:Number;
var oldMotorForce:Number;
var limitCdot:Number;
var limitForce:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var invMass1:Number = b1.m_invMass;
var invMass2:Number = b2.m_invMass;
var invI1:Number = b1.m_invI;
var invI2:Number = b2.m_invI;
var linearCdot:Number = m_linearJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity);
var force:Number = ((-(step.inv_dt) * m_linearMass) * linearCdot);
m_force = (m_force + force);
var P:Number = (step.dt * force);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_linearJacobian.linear1.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_linearJacobian.linear1.y));
b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_linearJacobian.angular1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_linearJacobian.linear2.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_linearJacobian.linear2.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_linearJacobian.angular2));
var angularCdot:Number = (b2.m_angularVelocity - b1.m_angularVelocity);
var torque:Number = ((-(step.inv_dt) * m_angularMass) * angularCdot);
m_torque = (m_torque + torque);
var L:Number = (step.dt * torque);
b1.m_angularVelocity = (b1.m_angularVelocity - (invI1 * L));
b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * L));
if (((m_enableMotor) && (!((m_limitState == e_equalLimits))))){
motorCdot = (m_motorJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity) - m_motorSpeed);
motorForce = ((-(step.inv_dt) * m_motorMass) * motorCdot);
oldMotorForce = m_motorForce;
m_motorForce = b2Math.b2Clamp((m_motorForce + motorForce), -(m_maxMotorForce), m_maxMotorForce);
motorForce = (m_motorForce - oldMotorForce);
P = (step.dt * motorForce);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_motorJacobian.linear1.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_motorJacobian.linear1.y));
b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_motorJacobian.angular1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_motorJacobian.linear2.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_motorJacobian.linear2.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_motorJacobian.angular2));
};
if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){
limitCdot = m_motorJacobian.Compute(b1.m_linearVelocity, b1.m_angularVelocity, b2.m_linearVelocity, b2.m_angularVelocity);
limitForce = ((-(step.inv_dt) * m_motorMass) * limitCdot);
if (m_limitState == e_equalLimits){
m_limitForce = (m_limitForce + limitForce);
} else {
if (m_limitState == e_atLowerLimit){
oldLimitForce = m_limitForce;
m_limitForce = b2Math.b2Max((m_limitForce + limitForce), 0);
limitForce = (m_limitForce - oldLimitForce);
} else {
if (m_limitState == e_atUpperLimit){
oldLimitForce = m_limitForce;
m_limitForce = b2Math.b2Min((m_limitForce + limitForce), 0);
limitForce = (m_limitForce - oldLimitForce);
};
};
};
P = (step.dt * limitForce);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + ((invMass1 * P) * m_motorJacobian.linear1.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + ((invMass1 * P) * m_motorJacobian.linear1.y));
b1.m_angularVelocity = (b1.m_angularVelocity + ((invI1 * P) * m_motorJacobian.angular1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((invMass2 * P) * m_motorJacobian.linear2.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((invMass2 * P) * m_motorJacobian.linear2.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((invI2 * P) * m_motorJacobian.angular2));
};
}
override public function GetAnchor1():b2Vec2{
return (m_body1.GetWorldPoint(m_localAnchor1));
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor2));
}
public function GetUpperLimit():Number{
return (m_upperTranslation);
}
public function GetLowerLimit():Number{
return (m_lowerTranslation);
}
public function EnableMotor(flag:Boolean):void{
m_enableMotor = flag;
}
public function GetJointTranslation():Number{
var tMat:b2Mat22;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var p1:b2Vec2 = b1.GetWorldPoint(m_localAnchor1);
var p2:b2Vec2 = b2.GetWorldPoint(m_localAnchor2);
var dX:Number = (p2.x - p1.x);
var dY:Number = (p2.y - p1.y);
var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1);
var translation:Number = ((axis.x * dX) + (axis.y * dY));
return (translation);
}
public function GetMotorSpeed():Number{
return (m_motorSpeed);
}
override public function GetReactionForce():b2Vec2{
var tMat:b2Mat22 = m_body1.m_xf.R;
var ax1X:Number = (m_limitForce * ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y)));
var ax1Y:Number = (m_limitForce * ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y)));
var ay1X:Number = (m_force * ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y)));
var ay1Y:Number = (m_force * ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y)));
return (new b2Vec2(((m_limitForce * ax1X) + (m_force * ay1X)), ((m_limitForce * ax1Y) + (m_force * ay1Y))));
}
override public function SolvePositionConstraints():Boolean{
var limitC:Number;
var oldLimitImpulse:Number;
var tMat:b2Mat22;
var tX:Number;
var ax1X:Number;
var ax1Y:Number;
var translation:Number;
var limitImpulse:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var invMass1:Number = b1.m_invMass;
var invMass2:Number = b2.m_invMass;
var invI1:Number = b1.m_invI;
var invI2:Number = b2.m_invI;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var p1X:Number = (b1.m_sweep.c.x + r1X);
var p1Y:Number = (b1.m_sweep.c.y + r1Y);
var p2X:Number = (b2.m_sweep.c.x + r2X);
var p2Y:Number = (b2.m_sweep.c.y + r2Y);
var dX:Number = (p2X - p1X);
var dY:Number = (p2Y - p1Y);
tMat = b1.m_xf.R;
var ay1X:Number = ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y));
var ay1Y:Number = ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y));
var linearC:Number = ((ay1X * dX) + (ay1Y * dY));
linearC = b2Math.b2Clamp(linearC, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
var linearImpulse:Number = (-(m_linearMass) * linearC);
b1.m_sweep.c.x = (b1.m_sweep.c.x + ((invMass1 * linearImpulse) * m_linearJacobian.linear1.x));
b1.m_sweep.c.y = (b1.m_sweep.c.y + ((invMass1 * linearImpulse) * m_linearJacobian.linear1.y));
b1.m_sweep.a = (b1.m_sweep.a + ((invI1 * linearImpulse) * m_linearJacobian.angular1));
b2.m_sweep.c.x = (b2.m_sweep.c.x + ((invMass2 * linearImpulse) * m_linearJacobian.linear2.x));
b2.m_sweep.c.y = (b2.m_sweep.c.y + ((invMass2 * linearImpulse) * m_linearJacobian.linear2.y));
b2.m_sweep.a = (b2.m_sweep.a + ((invI2 * linearImpulse) * m_linearJacobian.angular2));
var positionError:Number = b2Math.b2Abs(linearC);
var angularC:Number = ((b2.m_sweep.a - b1.m_sweep.a) - m_refAngle);
angularC = b2Math.b2Clamp(angularC, -(b2Settings.b2_maxAngularCorrection), b2Settings.b2_maxAngularCorrection);
var angularImpulse:Number = (-(m_angularMass) * angularC);
b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * angularImpulse));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * angularImpulse));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
var angularError:Number = b2Math.b2Abs(angularC);
if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){
tMat = b1.m_xf.R;
r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
p1X = (b1.m_sweep.c.x + r1X);
p1Y = (b1.m_sweep.c.y + r1Y);
p2X = (b2.m_sweep.c.x + r2X);
p2Y = (b2.m_sweep.c.y + r2Y);
dX = (p2X - p1X);
dY = (p2Y - p1Y);
tMat = b1.m_xf.R;
ax1X = ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y));
ax1Y = ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y));
translation = ((ax1X * dX) + (ax1Y * dY));
limitImpulse = 0;
if (m_limitState == e_equalLimits){
limitC = b2Math.b2Clamp(translation, -(b2Settings.b2_maxLinearCorrection), b2Settings.b2_maxLinearCorrection);
limitImpulse = (-(m_motorMass) * limitC);
positionError = b2Math.b2Max(positionError, b2Math.b2Abs(angularC));
} else {
if (m_limitState == e_atLowerLimit){
limitC = (translation - m_lowerTranslation);
positionError = b2Math.b2Max(positionError, -(limitC));
limitC = b2Math.b2Clamp((limitC + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0);
limitImpulse = (-(m_motorMass) * limitC);
oldLimitImpulse = m_limitPositionImpulse;
m_limitPositionImpulse = b2Math.b2Max((m_limitPositionImpulse + limitImpulse), 0);
limitImpulse = (m_limitPositionImpulse - oldLimitImpulse);
} else {
if (m_limitState == e_atUpperLimit){
limitC = (translation - m_upperTranslation);
positionError = b2Math.b2Max(positionError, limitC);
limitC = b2Math.b2Clamp((limitC - b2Settings.b2_linearSlop), 0, b2Settings.b2_maxLinearCorrection);
limitImpulse = (-(m_motorMass) * limitC);
oldLimitImpulse = m_limitPositionImpulse;
m_limitPositionImpulse = b2Math.b2Min((m_limitPositionImpulse + limitImpulse), 0);
limitImpulse = (m_limitPositionImpulse - oldLimitImpulse);
};
};
};
b1.m_sweep.c.x = (b1.m_sweep.c.x + ((invMass1 * limitImpulse) * m_motorJacobian.linear1.x));
b1.m_sweep.c.y = (b1.m_sweep.c.y + ((invMass1 * limitImpulse) * m_motorJacobian.linear1.y));
b1.m_sweep.a = (b1.m_sweep.a + ((invI1 * limitImpulse) * m_motorJacobian.angular1));
b2.m_sweep.c.x = (b2.m_sweep.c.x + ((invMass2 * limitImpulse) * m_motorJacobian.linear2.x));
b2.m_sweep.c.y = (b2.m_sweep.c.y + ((invMass2 * limitImpulse) * m_motorJacobian.linear2.y));
b2.m_sweep.a = (b2.m_sweep.a + ((invI2 * limitImpulse) * m_motorJacobian.angular2));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
};
return ((((positionError <= b2Settings.b2_linearSlop)) && ((angularError <= b2Settings.b2_angularSlop))));
}
public function SetMotorSpeed(speed:Number):void{
m_motorSpeed = speed;
}
public function GetJointSpeed():Number{
var tMat:b2Mat22;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var p1X:Number = (b1.m_sweep.c.x + r1X);
var p1Y:Number = (b1.m_sweep.c.y + r1Y);
var p2X:Number = (b2.m_sweep.c.x + r2X);
var p2Y:Number = (b2.m_sweep.c.y + r2Y);
var dX:Number = (p2X - p1X);
var dY:Number = (p2Y - p1Y);
var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1);
var v1:b2Vec2 = b1.m_linearVelocity;
var v2:b2Vec2 = b2.m_linearVelocity;
var w1:Number = b1.m_angularVelocity;
var w2:Number = b2.m_angularVelocity;
var speed:Number = (((dX * (-(w1) * axis.y)) + (dY * (w1 * axis.x))) + ((axis.x * (((v2.x + (-(w2) * r2Y)) - v1.x) - (-(w1) * r1Y))) + (axis.y * (((v2.y + (w2 * r2X)) - v1.y) - (w1 * r1X)))));
return (speed);
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var tX:Number;
var ax1X:Number;
var ax1Y:Number;
var dX:Number;
var dY:Number;
var jointTranslation:Number;
var P1X:Number;
var P1Y:Number;
var P2X:Number;
var P2Y:Number;
var L1:Number;
var L2:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var invMass1:Number = b1.m_invMass;
var invMass2:Number = b2.m_invMass;
var invI1:Number = b1.m_invI;
var invI2:Number = b2.m_invI;
tMat = b1.m_xf.R;
var ay1X:Number = ((tMat.col1.x * m_localYAxis1.x) + (tMat.col2.x * m_localYAxis1.y));
var ay1Y:Number = ((tMat.col1.y * m_localYAxis1.x) + (tMat.col2.y * m_localYAxis1.y));
var eX:Number = ((b2.m_sweep.c.x + r2X) - b1.m_sweep.c.x);
var eY:Number = ((b2.m_sweep.c.y + r2Y) - b1.m_sweep.c.y);
m_linearJacobian.linear1.x = -(ay1X);
m_linearJacobian.linear1.y = -(ay1Y);
m_linearJacobian.linear2.x = ay1X;
m_linearJacobian.linear2.y = ay1Y;
m_linearJacobian.angular1 = -(((eX * ay1Y) - (eY * ay1X)));
m_linearJacobian.angular2 = ((r2X * ay1Y) - (r2Y * ay1X));
m_linearMass = (((invMass1 + ((invI1 * m_linearJacobian.angular1) * m_linearJacobian.angular1)) + invMass2) + ((invI2 * m_linearJacobian.angular2) * m_linearJacobian.angular2));
m_linearMass = (1 / m_linearMass);
m_angularMass = (invI1 + invI2);
if (m_angularMass > Number.MIN_VALUE){
m_angularMass = (1 / m_angularMass);
};
if (((m_enableLimit) || (m_enableMotor))){
tMat = b1.m_xf.R;
ax1X = ((tMat.col1.x * m_localXAxis1.x) + (tMat.col2.x * m_localXAxis1.y));
ax1Y = ((tMat.col1.y * m_localXAxis1.x) + (tMat.col2.y * m_localXAxis1.y));
m_motorJacobian.linear1.x = -(ax1X);
m_motorJacobian.linear1.y = -(ax1Y);
m_motorJacobian.linear2.x = ax1X;
m_motorJacobian.linear2.y = ax1Y;
m_motorJacobian.angular1 = -(((eX * ax1Y) - (eY * ax1X)));
m_motorJacobian.angular2 = ((r2X * ax1Y) - (r2Y * ax1X));
m_motorMass = (((invMass1 + ((invI1 * m_motorJacobian.angular1) * m_motorJacobian.angular1)) + invMass2) + ((invI2 * m_motorJacobian.angular2) * m_motorJacobian.angular2));
m_motorMass = (1 / m_motorMass);
if (m_enableLimit){
dX = (eX - r1X);
dY = (eY - r1Y);
jointTranslation = ((ax1X * dX) + (ax1Y * dY));
if (b2Math.b2Abs((m_upperTranslation - m_lowerTranslation)) < (2 * b2Settings.b2_linearSlop)){
m_limitState = e_equalLimits;
} else {
if (jointTranslation <= m_lowerTranslation){
if (m_limitState != e_atLowerLimit){
m_limitForce = 0;
};
m_limitState = e_atLowerLimit;
} else {
if (jointTranslation >= m_upperTranslation){
if (m_limitState != e_atUpperLimit){
m_limitForce = 0;
};
m_limitState = e_atUpperLimit;
} else {
m_limitState = e_inactiveLimit;
m_limitForce = 0;
};
};
};
};
};
if (m_enableMotor == false){
m_motorForce = 0;
};
if (m_enableLimit == false){
m_limitForce = 0;
};
if (step.warmStarting){
P1X = (step.dt * ((m_force * m_linearJacobian.linear1.x) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear1.x)));
P1Y = (step.dt * ((m_force * m_linearJacobian.linear1.y) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear1.y)));
P2X = (step.dt * ((m_force * m_linearJacobian.linear2.x) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear2.x)));
P2Y = (step.dt * ((m_force * m_linearJacobian.linear2.y) + ((m_motorForce + m_limitForce) * m_motorJacobian.linear2.y)));
L1 = (step.dt * (((m_force * m_linearJacobian.angular1) - m_torque) + ((m_motorForce + m_limitForce) * m_motorJacobian.angular1)));
L2 = (step.dt * (((m_force * m_linearJacobian.angular2) + m_torque) + ((m_motorForce + m_limitForce) * m_motorJacobian.angular2)));
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (invMass1 * P1X));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (invMass1 * P1Y));
b1.m_angularVelocity = (b1.m_angularVelocity + (invI1 * L1));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (invMass2 * P2X));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (invMass2 * P2Y));
b2.m_angularVelocity = (b2.m_angularVelocity + (invI2 * L2));
} else {
m_force = 0;
m_torque = 0;
m_limitForce = 0;
m_motorForce = 0;
};
m_limitPositionImpulse = 0;
}
public function GetMotorForce():Number{
return (m_motorForce);
}
public function EnableLimit(flag:Boolean):void{
m_enableLimit = flag;
}
public function SetMaxMotorForce(force:Number):void{
m_maxMotorForce = force;
}
override public function GetReactionTorque():Number{
return (m_torque);
}
public function IsLimitEnabled():Boolean{
return (m_enableLimit);
}
public function IsMotorEnabled():Boolean{
return (m_enableMotor);
}
public function SetLimits(lower:Number, upper:Number):void{
m_lowerTranslation = lower;
m_upperTranslation = upper;
}
}
}//package Box2D.Dynamics.Joints
Section 59
//b2PrismaticJointDef (Box2D.Dynamics.Joints.b2PrismaticJointDef)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
public class b2PrismaticJointDef extends b2JointDef {
public var motorSpeed:Number;
public var localAxis1:b2Vec2;
public var referenceAngle:Number;
public var upperTranslation:Number;
public var localAnchor1:b2Vec2;
public var localAnchor2:b2Vec2;
public var enableLimit:Boolean;
public var enableMotor:Boolean;
public var maxMotorForce:Number;
public var lowerTranslation:Number;
public function b2PrismaticJointDef(){
localAnchor1 = new b2Vec2();
localAnchor2 = new b2Vec2();
localAxis1 = new b2Vec2();
super();
type = b2Joint.e_prismaticJoint;
localAxis1.Set(1, 0);
referenceAngle = 0;
enableLimit = false;
lowerTranslation = 0;
upperTranslation = 0;
enableMotor = false;
maxMotorForce = 0;
motorSpeed = 0;
}
public function Initialize(b1:b2Body, b2:b2Body, anchor:b2Vec2, axis:b2Vec2):void{
body1 = b1;
body2 = b2;
localAnchor1 = body1.GetLocalPoint(anchor);
localAnchor2 = body2.GetLocalPoint(anchor);
localAxis1 = body1.GetLocalVector(axis);
referenceAngle = (body2.GetAngle() - body1.GetAngle());
}
}
}//package Box2D.Dynamics.Joints
Section 60
//b2PulleyJoint (Box2D.Dynamics.Joints.b2PulleyJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2PulleyJoint extends b2Joint {
public var m_limitState1:int;
public var m_limitState2:int;
public var m_ground:b2Body;
public var m_maxLength2:Number;
public var m_maxLength1:Number;
public var m_limitPositionImpulse1:Number;
public var m_limitPositionImpulse2:Number;
public var m_force:Number;
public var m_constant:Number;
public var m_positionImpulse:Number;
public var m_state:int;
public var m_ratio:Number;
public var m_groundAnchor1:b2Vec2;
public var m_groundAnchor2:b2Vec2;
public var m_localAnchor1:b2Vec2;
public var m_localAnchor2:b2Vec2;
public var m_limitMass1:Number;
public var m_limitMass2:Number;
public var m_pulleyMass:Number;
public var m_u1:b2Vec2;
public var m_limitForce1:Number;
public var m_limitForce2:Number;
public var m_u2:b2Vec2;
public static const b2_minPulleyLength:Number = 2;
public function b2PulleyJoint(def:b2PulleyJointDef){
var tMat:b2Mat22;
var tX:Number;
var tY:Number;
m_groundAnchor1 = new b2Vec2();
m_groundAnchor2 = new b2Vec2();
m_localAnchor1 = new b2Vec2();
m_localAnchor2 = new b2Vec2();
m_u1 = new b2Vec2();
m_u2 = new b2Vec2();
super(def);
m_ground = m_body1.m_world.m_groundBody;
m_groundAnchor1.x = (def.groundAnchor1.x - m_ground.m_xf.position.x);
m_groundAnchor1.y = (def.groundAnchor1.y - m_ground.m_xf.position.y);
m_groundAnchor2.x = (def.groundAnchor2.x - m_ground.m_xf.position.x);
m_groundAnchor2.y = (def.groundAnchor2.y - m_ground.m_xf.position.y);
m_localAnchor1.SetV(def.localAnchor1);
m_localAnchor2.SetV(def.localAnchor2);
m_ratio = def.ratio;
m_constant = (def.length1 + (m_ratio * def.length2));
m_maxLength1 = b2Math.b2Min(def.maxLength1, (m_constant - (m_ratio * b2_minPulleyLength)));
m_maxLength2 = b2Math.b2Min(def.maxLength2, ((m_constant - b2_minPulleyLength) / m_ratio));
m_force = 0;
m_limitForce1 = 0;
m_limitForce2 = 0;
}
public function GetGroundAnchor2():b2Vec2{
var a:b2Vec2 = m_ground.m_xf.position.Copy();
a.Add(m_groundAnchor2);
return (a);
}
override public function GetAnchor1():b2Vec2{
return (m_body1.GetWorldPoint(m_localAnchor1));
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor2));
}
override public function GetReactionForce():b2Vec2{
var F:b2Vec2 = m_u2.Copy();
F.Multiply(m_force);
return (F);
}
override public function SolvePositionConstraints():Boolean{
var tMat:b2Mat22;
var r1X:Number;
var r1Y:Number;
var r2X:Number;
var r2Y:Number;
var p1X:Number;
var p1Y:Number;
var p2X:Number;
var p2Y:Number;
var length1:Number;
var length2:Number;
var C:Number;
var impulse:Number;
var oldImpulse:Number;
var oldLimitPositionImpulse:Number;
var tX:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var s1X:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x);
var s1Y:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y);
var s2X:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x);
var s2Y:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y);
var linearError:Number = 0;
if (m_state == e_atUpperLimit){
tMat = b1.m_xf.R;
r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
p1X = (b1.m_sweep.c.x + r1X);
p1Y = (b1.m_sweep.c.y + r1Y);
p2X = (b2.m_sweep.c.x + r2X);
p2Y = (b2.m_sweep.c.y + r2Y);
m_u1.Set((p1X - s1X), (p1Y - s1Y));
m_u2.Set((p2X - s2X), (p2Y - s2Y));
length1 = m_u1.Length();
length2 = m_u2.Length();
if (length1 > b2Settings.b2_linearSlop){
m_u1.Multiply((1 / length1));
} else {
m_u1.SetZero();
};
if (length2 > b2Settings.b2_linearSlop){
m_u2.Multiply((1 / length2));
} else {
m_u2.SetZero();
};
C = ((m_constant - length1) - (m_ratio * length2));
linearError = b2Math.b2Max(linearError, -(C));
C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0);
impulse = (-(m_pulleyMass) * C);
oldImpulse = m_positionImpulse;
m_positionImpulse = b2Math.b2Max(0, (m_positionImpulse + impulse));
impulse = (m_positionImpulse - oldImpulse);
p1X = (-(impulse) * m_u1.x);
p1Y = (-(impulse) * m_u1.y);
p2X = ((-(m_ratio) * impulse) * m_u2.x);
p2Y = ((-(m_ratio) * impulse) * m_u2.y);
b1.m_sweep.c.x = (b1.m_sweep.c.x + (b1.m_invMass * p1X));
b1.m_sweep.c.y = (b1.m_sweep.c.y + (b1.m_invMass * p1Y));
b1.m_sweep.a = (b1.m_sweep.a + (b1.m_invI * ((r1X * p1Y) - (r1Y * p1X))));
b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * p2X));
b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * p2Y));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * p2Y) - (r2Y * p2X))));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
};
if (m_limitState1 == e_atUpperLimit){
tMat = b1.m_xf.R;
r1X = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
p1X = (b1.m_sweep.c.x + r1X);
p1Y = (b1.m_sweep.c.y + r1Y);
m_u1.Set((p1X - s1X), (p1Y - s1Y));
length1 = m_u1.Length();
if (length1 > b2Settings.b2_linearSlop){
m_u1.x = (m_u1.x * (1 / length1));
m_u1.y = (m_u1.y * (1 / length1));
} else {
m_u1.SetZero();
};
C = (m_maxLength1 - length1);
linearError = b2Math.b2Max(linearError, -(C));
C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0);
impulse = (-(m_limitMass1) * C);
oldLimitPositionImpulse = m_limitPositionImpulse1;
m_limitPositionImpulse1 = b2Math.b2Max(0, (m_limitPositionImpulse1 + impulse));
impulse = (m_limitPositionImpulse1 - oldLimitPositionImpulse);
p1X = (-(impulse) * m_u1.x);
p1Y = (-(impulse) * m_u1.y);
b1.m_sweep.c.x = (b1.m_sweep.c.x + (b1.m_invMass * p1X));
b1.m_sweep.c.y = (b1.m_sweep.c.y + (b1.m_invMass * p1Y));
b1.m_sweep.a = (b1.m_sweep.a + (b1.m_invI * ((r1X * p1Y) - (r1Y * p1X))));
b1.SynchronizeTransform();
};
if (m_limitState2 == e_atUpperLimit){
tMat = b2.m_xf.R;
r2X = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
r2Y = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
p2X = (b2.m_sweep.c.x + r2X);
p2Y = (b2.m_sweep.c.y + r2Y);
m_u2.Set((p2X - s2X), (p2Y - s2Y));
length2 = m_u2.Length();
if (length2 > b2Settings.b2_linearSlop){
m_u2.x = (m_u2.x * (1 / length2));
m_u2.y = (m_u2.y * (1 / length2));
} else {
m_u2.SetZero();
};
C = (m_maxLength2 - length2);
linearError = b2Math.b2Max(linearError, -(C));
C = b2Math.b2Clamp((C + b2Settings.b2_linearSlop), -(b2Settings.b2_maxLinearCorrection), 0);
impulse = (-(m_limitMass2) * C);
oldLimitPositionImpulse = m_limitPositionImpulse2;
m_limitPositionImpulse2 = b2Math.b2Max(0, (m_limitPositionImpulse2 + impulse));
impulse = (m_limitPositionImpulse2 - oldLimitPositionImpulse);
p2X = (-(impulse) * m_u2.x);
p2Y = (-(impulse) * m_u2.y);
b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * p2X));
b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * p2Y));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * p2Y) - (r2Y * p2X))));
b2.SynchronizeTransform();
};
return ((linearError < b2Settings.b2_linearSlop));
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var P1X:Number;
var P1Y:Number;
var P2X:Number;
var P2Y:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var p1X:Number = (b1.m_sweep.c.x + r1X);
var p1Y:Number = (b1.m_sweep.c.y + r1Y);
var p2X:Number = (b2.m_sweep.c.x + r2X);
var p2Y:Number = (b2.m_sweep.c.y + r2Y);
var s1X:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x);
var s1Y:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y);
var s2X:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x);
var s2Y:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y);
m_u1.Set((p1X - s1X), (p1Y - s1Y));
m_u2.Set((p2X - s2X), (p2Y - s2Y));
var length1:Number = m_u1.Length();
var length2:Number = m_u2.Length();
if (length1 > b2Settings.b2_linearSlop){
m_u1.Multiply((1 / length1));
} else {
m_u1.SetZero();
};
if (length2 > b2Settings.b2_linearSlop){
m_u2.Multiply((1 / length2));
} else {
m_u2.SetZero();
};
var C:Number = ((m_constant - length1) - (m_ratio * length2));
if (C > 0){
m_state = e_inactiveLimit;
m_force = 0;
} else {
m_state = e_atUpperLimit;
m_positionImpulse = 0;
};
if (length1 < m_maxLength1){
m_limitState1 = e_inactiveLimit;
m_limitForce1 = 0;
} else {
m_limitState1 = e_atUpperLimit;
m_limitPositionImpulse1 = 0;
};
if (length2 < m_maxLength2){
m_limitState2 = e_inactiveLimit;
m_limitForce2 = 0;
} else {
m_limitState2 = e_atUpperLimit;
m_limitPositionImpulse2 = 0;
};
var cr1u1:Number = ((r1X * m_u1.y) - (r1Y * m_u1.x));
var cr2u2:Number = ((r2X * m_u2.y) - (r2Y * m_u2.x));
m_limitMass1 = (b1.m_invMass + ((b1.m_invI * cr1u1) * cr1u1));
m_limitMass2 = (b2.m_invMass + ((b2.m_invI * cr2u2) * cr2u2));
m_pulleyMass = (m_limitMass1 + ((m_ratio * m_ratio) * m_limitMass2));
m_limitMass1 = (1 / m_limitMass1);
m_limitMass2 = (1 / m_limitMass2);
m_pulleyMass = (1 / m_pulleyMass);
if (step.warmStarting){
P1X = ((step.dt * (-(m_force) - m_limitForce1)) * m_u1.x);
P1Y = ((step.dt * (-(m_force) - m_limitForce1)) * m_u1.y);
P2X = ((step.dt * ((-(m_ratio) * m_force) - m_limitForce2)) * m_u2.x);
P2Y = ((step.dt * ((-(m_ratio) * m_force) - m_limitForce2)) * m_u2.y);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y));
b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X))));
} else {
m_force = 0;
m_limitForce1 = 0;
m_limitForce2 = 0;
};
}
override public function GetReactionTorque():Number{
return (0);
}
public function GetRatio():Number{
return (m_ratio);
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var v1X:Number;
var v1Y:Number;
var v2X:Number;
var v2Y:Number;
var P1X:Number;
var P1Y:Number;
var P2X:Number;
var P2Y:Number;
var Cdot:Number;
var force:Number;
var oldForce:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
if (m_state == e_atUpperLimit){
v1X = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y));
v1Y = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X));
v2X = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y));
v2Y = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X));
Cdot = (-(((m_u1.x * v1X) + (m_u1.y * v1Y))) - (m_ratio * ((m_u2.x * v2X) + (m_u2.y * v2Y))));
force = ((-(step.inv_dt) * m_pulleyMass) * Cdot);
oldForce = m_force;
m_force = b2Math.b2Max(0, (m_force + force));
force = (m_force - oldForce);
P1X = ((-(step.dt) * force) * m_u1.x);
P1Y = ((-(step.dt) * force) * m_u1.y);
P2X = (((-(step.dt) * m_ratio) * force) * m_u2.x);
P2Y = (((-(step.dt) * m_ratio) * force) * m_u2.y);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y));
b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X))));
};
if (m_limitState1 == e_atUpperLimit){
v1X = (b1.m_linearVelocity.x + (-(b1.m_angularVelocity) * r1Y));
v1Y = (b1.m_linearVelocity.y + (b1.m_angularVelocity * r1X));
Cdot = -(((m_u1.x * v1X) + (m_u1.y * v1Y)));
force = ((-(step.inv_dt) * m_limitMass1) * Cdot);
oldForce = m_limitForce1;
m_limitForce1 = b2Math.b2Max(0, (m_limitForce1 + force));
force = (m_limitForce1 - oldForce);
P1X = ((-(step.dt) * force) * m_u1.x);
P1Y = ((-(step.dt) * force) * m_u1.y);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x + (b1.m_invMass * P1X));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y + (b1.m_invMass * P1Y));
b1.m_angularVelocity = (b1.m_angularVelocity + (b1.m_invI * ((r1X * P1Y) - (r1Y * P1X))));
};
if (m_limitState2 == e_atUpperLimit){
v2X = (b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y));
v2Y = (b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X));
Cdot = -(((m_u2.x * v2X) + (m_u2.y * v2Y)));
force = ((-(step.inv_dt) * m_limitMass2) * Cdot);
oldForce = m_limitForce2;
m_limitForce2 = b2Math.b2Max(0, (m_limitForce2 + force));
force = (m_limitForce2 - oldForce);
P2X = ((-(step.dt) * force) * m_u2.x);
P2Y = ((-(step.dt) * force) * m_u2.y);
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * P2X));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * P2Y));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * P2Y) - (r2Y * P2X))));
};
}
public function GetLength1():Number{
var p:b2Vec2 = m_body1.GetWorldPoint(m_localAnchor1);
var sX:Number = (m_ground.m_xf.position.x + m_groundAnchor1.x);
var sY:Number = (m_ground.m_xf.position.y + m_groundAnchor1.y);
var dX:Number = (p.x - sX);
var dY:Number = (p.y - sY);
return (Math.sqrt(((dX * dX) + (dY * dY))));
}
public function GetLength2():Number{
var p:b2Vec2 = m_body2.GetWorldPoint(m_localAnchor2);
var sX:Number = (m_ground.m_xf.position.x + m_groundAnchor2.x);
var sY:Number = (m_ground.m_xf.position.y + m_groundAnchor2.y);
var dX:Number = (p.x - sX);
var dY:Number = (p.y - sY);
return (Math.sqrt(((dX * dX) + (dY * dY))));
}
public function GetGroundAnchor1():b2Vec2{
var a:b2Vec2 = m_ground.m_xf.position.Copy();
a.Add(m_groundAnchor1);
return (a);
}
}
}//package Box2D.Dynamics.Joints
Section 61
//b2PulleyJointDef (Box2D.Dynamics.Joints.b2PulleyJointDef)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
public class b2PulleyJointDef extends b2JointDef {
public var maxLength1:Number;
public var maxLength2:Number;
public var length1:Number;
public var localAnchor1:b2Vec2;
public var localAnchor2:b2Vec2;
public var groundAnchor1:b2Vec2;
public var groundAnchor2:b2Vec2;
public var ratio:Number;
public var length2:Number;
public function b2PulleyJointDef(){
groundAnchor1 = new b2Vec2();
groundAnchor2 = new b2Vec2();
localAnchor1 = new b2Vec2();
localAnchor2 = new b2Vec2();
super();
type = b2Joint.e_pulleyJoint;
groundAnchor1.Set(-1, 1);
groundAnchor2.Set(1, 1);
localAnchor1.Set(-1, 0);
localAnchor2.Set(1, 0);
length1 = 0;
maxLength1 = 0;
length2 = 0;
maxLength2 = 0;
ratio = 1;
collideConnected = true;
}
public function Initialize(b1:b2Body, b2:b2Body, ga1:b2Vec2, ga2:b2Vec2, anchor1:b2Vec2, anchor2:b2Vec2, r:Number):void{
body1 = b1;
body2 = b2;
groundAnchor1.SetV(ga1);
groundAnchor2.SetV(ga2);
localAnchor1 = body1.GetLocalPoint(anchor1);
localAnchor2 = body2.GetLocalPoint(anchor2);
var d1X:Number = (anchor1.x - ga1.x);
var d1Y:Number = (anchor1.y - ga1.y);
length1 = Math.sqrt(((d1X * d1X) + (d1Y * d1Y)));
var d2X:Number = (anchor2.x - ga2.x);
var d2Y:Number = (anchor2.y - ga2.y);
length2 = Math.sqrt(((d2X * d2X) + (d2Y * d2Y)));
ratio = r;
var C:Number = (length1 + (ratio * length2));
maxLength1 = (C - (ratio * b2PulleyJoint.b2_minPulleyLength));
maxLength2 = ((C - b2PulleyJoint.b2_minPulleyLength) / ratio);
}
}
}//package Box2D.Dynamics.Joints
Section 62
//b2RevoluteJoint (Box2D.Dynamics.Joints.b2RevoluteJoint)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
public class b2RevoluteJoint extends b2Joint {
public var m_limitForce:Number;
public var m_pivotMass:b2Mat22;
public var m_motorForce:Number;
public var m_enableLimit:Boolean;
public var m_limitState:int;
public var m_motorMass:Number;
public var m_localAnchor1:b2Vec2;
public var m_localAnchor2:b2Vec2;
private var K1:b2Mat22;
private var K2:b2Mat22;
private var K3:b2Mat22;
private var K:b2Mat22;
public var m_pivotForce:b2Vec2;
public var m_enableMotor:Boolean;
public var m_referenceAngle:Number;
public var m_limitPositionImpulse:Number;
public var m_motorSpeed:Number;
public var m_upperAngle:Number;
public var m_lowerAngle:Number;
public var m_maxMotorTorque:Number;
public static var tImpulse:b2Vec2 = new b2Vec2();
public function b2RevoluteJoint(def:b2RevoluteJointDef){
K = new b2Mat22();
K1 = new b2Mat22();
K2 = new b2Mat22();
K3 = new b2Mat22();
m_localAnchor1 = new b2Vec2();
m_localAnchor2 = new b2Vec2();
m_pivotForce = new b2Vec2();
m_pivotMass = new b2Mat22();
super(def);
m_localAnchor1.SetV(def.localAnchor1);
m_localAnchor2.SetV(def.localAnchor2);
m_referenceAngle = def.referenceAngle;
m_pivotForce.Set(0, 0);
m_motorForce = 0;
m_limitForce = 0;
m_limitPositionImpulse = 0;
m_lowerAngle = def.lowerAngle;
m_upperAngle = def.upperAngle;
m_maxMotorTorque = def.maxMotorTorque;
m_motorSpeed = def.motorSpeed;
m_enableLimit = def.enableLimit;
m_enableMotor = def.enableMotor;
}
override public function SolveVelocityConstraints(step:b2TimeStep):void{
var tMat:b2Mat22;
var tX:Number;
var oldLimitForce:Number;
var PY:Number;
var motorCdot:Number;
var motorForce:Number;
var oldMotorForce:Number;
var limitCdot:Number;
var limitForce:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var pivotCdotX:Number = (((b2.m_linearVelocity.x + (-(b2.m_angularVelocity) * r2Y)) - b1.m_linearVelocity.x) - (-(b1.m_angularVelocity) * r1Y));
var pivotCdotY:Number = (((b2.m_linearVelocity.y + (b2.m_angularVelocity * r2X)) - b1.m_linearVelocity.y) - (b1.m_angularVelocity * r1X));
var pivotForceX:Number = (-(step.inv_dt) * ((m_pivotMass.col1.x * pivotCdotX) + (m_pivotMass.col2.x * pivotCdotY)));
var pivotForceY:Number = (-(step.inv_dt) * ((m_pivotMass.col1.y * pivotCdotX) + (m_pivotMass.col2.y * pivotCdotY)));
m_pivotForce.x = (m_pivotForce.x + pivotForceX);
m_pivotForce.y = (m_pivotForce.y + pivotForceY);
var PX:Number = (step.dt * pivotForceX);
PY = (step.dt * pivotForceY);
b1.m_linearVelocity.x = (b1.m_linearVelocity.x - (b1.m_invMass * PX));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y - (b1.m_invMass * PY));
b1.m_angularVelocity = (b1.m_angularVelocity - (b1.m_invI * ((r1X * PY) - (r1Y * PX))));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + (b2.m_invMass * PX));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + (b2.m_invMass * PY));
b2.m_angularVelocity = (b2.m_angularVelocity + (b2.m_invI * ((r2X * PY) - (r2Y * PX))));
if (((m_enableMotor) && (!((m_limitState == e_equalLimits))))){
motorCdot = ((b2.m_angularVelocity - b1.m_angularVelocity) - m_motorSpeed);
motorForce = ((-(step.inv_dt) * m_motorMass) * motorCdot);
oldMotorForce = m_motorForce;
m_motorForce = b2Math.b2Clamp((m_motorForce + motorForce), -(m_maxMotorTorque), m_maxMotorTorque);
motorForce = (m_motorForce - oldMotorForce);
b1.m_angularVelocity = (b1.m_angularVelocity - ((b1.m_invI * step.dt) * motorForce));
b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * step.dt) * motorForce));
};
if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){
limitCdot = (b2.m_angularVelocity - b1.m_angularVelocity);
limitForce = ((-(step.inv_dt) * m_motorMass) * limitCdot);
if (m_limitState == e_equalLimits){
m_limitForce = (m_limitForce + limitForce);
} else {
if (m_limitState == e_atLowerLimit){
oldLimitForce = m_limitForce;
m_limitForce = b2Math.b2Max((m_limitForce + limitForce), 0);
limitForce = (m_limitForce - oldLimitForce);
} else {
if (m_limitState == e_atUpperLimit){
oldLimitForce = m_limitForce;
m_limitForce = b2Math.b2Min((m_limitForce + limitForce), 0);
limitForce = (m_limitForce - oldLimitForce);
};
};
};
b1.m_angularVelocity = (b1.m_angularVelocity - ((b1.m_invI * step.dt) * limitForce));
b2.m_angularVelocity = (b2.m_angularVelocity + ((b2.m_invI * step.dt) * limitForce));
};
}
override public function GetAnchor1():b2Vec2{
return (m_body1.GetWorldPoint(m_localAnchor1));
}
override public function GetAnchor2():b2Vec2{
return (m_body2.GetWorldPoint(m_localAnchor2));
}
public function GetUpperLimit():Number{
return (m_upperAngle);
}
public function GetLowerLimit():Number{
return (m_lowerAngle);
}
public function EnableMotor(flag:Boolean):void{
m_enableMotor = flag;
}
public function GetMotorSpeed():Number{
return (m_motorSpeed);
}
override public function GetReactionForce():b2Vec2{
return (m_pivotForce);
}
override public function SolvePositionConstraints():Boolean{
var oldLimitImpulse:Number;
var limitC:Number;
var tMat:b2Mat22;
var angle:Number;
var limitImpulse:Number;
var b1:b2Body = m_body1;
var b2:b2Body = m_body2;
var positionError:Number = 0;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
var r1Y:Number = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
var tX:Number = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var p1X:Number = (b1.m_sweep.c.x + r1X);
var p1Y:Number = (b1.m_sweep.c.y + r1Y);
var p2X:Number = (b2.m_sweep.c.x + r2X);
var p2Y:Number = (b2.m_sweep.c.y + r2Y);
var ptpCX:Number = (p2X - p1X);
var ptpCY:Number = (p2Y - p1Y);
positionError = Math.sqrt(((ptpCX * ptpCX) + (ptpCY * ptpCY)));
var invMass1:Number = b1.m_invMass;
var invMass2:Number = b2.m_invMass;
var invI1:Number = b1.m_invI;
var invI2:Number = b2.m_invI;
K1.col1.x = (invMass1 + invMass2);
K1.col2.x = 0;
K1.col1.y = 0;
K1.col2.y = (invMass1 + invMass2);
K2.col1.x = ((invI1 * r1Y) * r1Y);
K2.col2.x = ((-(invI1) * r1X) * r1Y);
K2.col1.y = ((-(invI1) * r1X) * r1Y);
K2.col2.y = ((invI1 * r1X) * r1X);
K3.col1.x = ((invI2 * r2Y) * r2Y);
K3.col2.x = ((-(invI2) * r2X) * r2Y);
K3.col1.y = ((-(invI2) * r2X) * r2Y);
K3.col2.y = ((invI2 * r2X) * r2X);
K.SetM(K1);
K.AddM(K2);
K.AddM(K3);
K.Solve(tImpulse, -(ptpCX), -(ptpCY));
var impulseX:Number = tImpulse.x;
var impulseY:Number = tImpulse.y;
b1.m_sweep.c.x = (b1.m_sweep.c.x - (b1.m_invMass * impulseX));
b1.m_sweep.c.y = (b1.m_sweep.c.y - (b1.m_invMass * impulseY));
b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * ((r1X * impulseY) - (r1Y * impulseX))));
b2.m_sweep.c.x = (b2.m_sweep.c.x + (b2.m_invMass * impulseX));
b2.m_sweep.c.y = (b2.m_sweep.c.y + (b2.m_invMass * impulseY));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * ((r2X * impulseY) - (r2Y * impulseX))));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
var angularError:Number = 0;
if (((m_enableLimit) && (!((m_limitState == e_inactiveLimit))))){
angle = ((b2.m_sweep.a - b1.m_sweep.a) - m_referenceAngle);
limitImpulse = 0;
if (m_limitState == e_equalLimits){
limitC = b2Math.b2Clamp(angle, -(b2Settings.b2_maxAngularCorrection), b2Settings.b2_maxAngularCorrection);
limitImpulse = (-(m_motorMass) * limitC);
angularError = b2Math.b2Abs(limitC);
} else {
if (m_limitState == e_atLowerLimit){
limitC = (angle - m_lowerAngle);
angularError = b2Math.b2Max(0, -(limitC));
limitC = b2Math.b2Clamp((limitC + b2Settings.b2_angularSlop), -(b2Settings.b2_maxAngularCorrection), 0);
limitImpulse = (-(m_motorMass) * limitC);
oldLimitImpulse = m_limitPositionImpulse;
m_limitPositionImpulse = b2Math.b2Max((m_limitPositionImpulse + limitImpulse), 0);
limitImpulse = (m_limitPositionImpulse - oldLimitImpulse);
} else {
if (m_limitState == e_atUpperLimit){
limitC = (angle - m_upperAngle);
angularError = b2Math.b2Max(0, limitC);
limitC = b2Math.b2Clamp((limitC - b2Settings.b2_angularSlop), 0, b2Settings.b2_maxAngularCorrection);
limitImpulse = (-(m_motorMass) * limitC);
oldLimitImpulse = m_limitPositionImpulse;
m_limitPositionImpulse = b2Math.b2Min((m_limitPositionImpulse + limitImpulse), 0);
limitImpulse = (m_limitPositionImpulse - oldLimitImpulse);
};
};
};
b1.m_sweep.a = (b1.m_sweep.a - (b1.m_invI * limitImpulse));
b2.m_sweep.a = (b2.m_sweep.a + (b2.m_invI * limitImpulse));
b1.SynchronizeTransform();
b2.SynchronizeTransform();
};
return ((((positionError <= b2Settings.b2_linearSlop)) && ((angularError <= b2Settings.b2_angularSlop))));
}
public function SetMotorSpeed(speed:Number):void{
m_motorSpeed = speed;
}
public function GetJointSpeed():Number{
return ((m_body2.m_angularVelocity - m_body1.m_angularVelocity));
}
public function SetMaxMotorTorque(torque:Number):void{
m_maxMotorTorque = torque;
}
public function GetJointAngle():Number{
return (((m_body2.m_sweep.a - m_body1.m_sweep.a) - m_referenceAngle));
}
public function GetMotorTorque():Number{
return (m_motorForce);
}
override public function InitVelocityConstraints(step:b2TimeStep):void{
var b1:b2Body;
var b2:b2Body;
var tMat:b2Mat22;
var tX:Number;
var r1Y:Number;
var jointAngle:Number;
b1 = m_body1;
b2 = m_body2;
tMat = b1.m_xf.R;
var r1X:Number = (m_localAnchor1.x - b1.m_sweep.localCenter.x);
r1Y = (m_localAnchor1.y - b1.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r1X) + (tMat.col2.x * r1Y));
r1Y = ((tMat.col1.y * r1X) + (tMat.col2.y * r1Y));
r1X = tX;
tMat = b2.m_xf.R;
var r2X:Number = (m_localAnchor2.x - b2.m_sweep.localCenter.x);
var r2Y:Number = (m_localAnchor2.y - b2.m_sweep.localCenter.y);
tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y));
r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y));
r2X = tX;
var invMass1:Number = b1.m_invMass;
var invMass2:Number = b2.m_invMass;
var invI1:Number = b1.m_invI;
var invI2:Number = b2.m_invI;
K1.col1.x = (invMass1 + invMass2);
K1.col2.x = 0;
K1.col1.y = 0;
K1.col2.y = (invMass1 + invMass2);
K2.col1.x = ((invI1 * r1Y) * r1Y);
K2.col2.x = ((-(invI1) * r1X) * r1Y);
K2.col1.y = ((-(invI1) * r1X) * r1Y);
K2.col2.y = ((invI1 * r1X) * r1X);
K3.col1.x = ((invI2 * r2Y) * r2Y);
K3.col2.x = ((-(invI2) * r2X) * r2Y);
K3.col1.y = ((-(invI2) * r2X) * r2Y);
K3.col2.y = ((invI2 * r2X) * r2X);
K.SetM(K1);
K.AddM(K2);
K.AddM(K3);
K.Invert(m_pivotMass);
m_motorMass = (1 / (invI1 + invI2));
if (m_enableMotor == false){
m_motorForce = 0;
};
if (m_enableLimit){
jointAngle = ((b2.m_sweep.a - b1.m_sweep.a) - m_referenceAngle);
if (b2Math.b2Abs((m_upperAngle - m_lowerAngle)) < (2 * b2Settings.b2_angularSlop)){
m_limitState = e_equalLimits;
} else {
if (jointAngle <= m_lowerAngle){
if (m_limitState != e_atLowerLimit){
m_limitForce = 0;
};
m_limitState = e_atLowerLimit;
} else {
if (jointAngle >= m_upperAngle){
if (m_limitState != e_atUpperLimit){
m_limitForce = 0;
};
m_limitState = e_atUpperLimit;
} else {
m_limitState = e_inactiveLimit;
m_limitForce = 0;
};
};
};
} else {
m_limitForce = 0;
};
if (step.warmStarting){
b1.m_linearVelocity.x = (b1.m_linearVelocity.x - ((step.dt * invMass1) * m_pivotForce.x));
b1.m_linearVelocity.y = (b1.m_linearVelocity.y - ((step.dt * invMass1) * m_pivotForce.y));
b1.m_angularVelocity = (b1.m_angularVelocity - ((step.dt * invI1) * ((((r1X * m_pivotForce.y) - (r1Y * m_pivotForce.x)) + m_motorForce) + m_limitForce)));
b2.m_linearVelocity.x = (b2.m_linearVelocity.x + ((step.dt * invMass2) * m_pivotForce.x));
b2.m_linearVelocity.y = (b2.m_linearVelocity.y + ((step.dt * invMass2) * m_pivotForce.y));
b2.m_angularVelocity = (b2.m_angularVelocity + ((step.dt * invI2) * ((((r2X * m_pivotForce.y) - (r2Y * m_pivotForce.x)) + m_motorForce) + m_limitForce)));
} else {
m_pivotForce.SetZero();
m_motorForce = 0;
m_limitForce = 0;
};
m_limitPositionImpulse = 0;
}
public function EnableLimit(flag:Boolean):void{
m_enableLimit = flag;
}
override public function GetReactionTorque():Number{
return (m_limitForce);
}
public function IsLimitEnabled():Boolean{
return (m_enableLimit);
}
public function IsMotorEnabled():Boolean{
return (m_enableMotor);
}
public function SetLimits(lower:Number, upper:Number):void{
m_lowerAngle = lower;
m_upperAngle = upper;
}
}
}//package Box2D.Dynamics.Joints
Section 63
//b2RevoluteJointDef (Box2D.Dynamics.Joints.b2RevoluteJointDef)
package Box2D.Dynamics.Joints {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
public class b2RevoluteJointDef extends b2JointDef {
public var upperAngle:Number;
public var enableMotor:Boolean;
public var referenceAngle:Number;
public var motorSpeed:Number;
public var localAnchor1:b2Vec2;
public var localAnchor2:b2Vec2;
public var enableLimit:Boolean;
public var lowerAngle:Number;
public var maxMotorTorque:Number;
public function b2RevoluteJointDef(){
localAnchor1 = new b2Vec2();
localAnchor2 = new b2Vec2();
super();
type = b2Joint.e_revoluteJoint;
localAnchor1.Set(0, 0);
localAnchor2.Set(0, 0);
referenceAngle = 0;
lowerAngle = 0;
upperAngle = 0;
maxMotorTorque = 0;
motorSpeed = 0;
enableLimit = false;
enableMotor = false;
}
public function Initialize(b1:b2Body, b2:b2Body, anchor:b2Vec2):void{
body1 = b1;
body2 = b2;
localAnchor1 = body1.GetLocalPoint(anchor);
localAnchor2 = body2.GetLocalPoint(anchor);
referenceAngle = (body2.GetAngle() - body1.GetAngle());
}
}
}//package Box2D.Dynamics.Joints
Section 64
//b2Body (Box2D.Dynamics.b2Body)
package Box2D.Dynamics {
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Contacts.*;
public class b2Body {
public var m_next:b2Body;
public var m_xf:b2XForm;
public var m_contactList:b2ContactEdge;
public var m_angularVelocity:Number;
public var m_shapeList:b2Shape;
public var m_force:b2Vec2;
public var m_mass:Number;
public var m_sweep:b2Sweep;
public var m_torque:Number;
public var m_userData;
public var m_flags:uint;
public var m_world:b2World;
public var m_prev:b2Body;
public var m_invMass:Number;
public var m_type:int;
public var m_linearDamping:Number;
public var m_shapeCount:int;
public var m_angularDamping:Number;
public var m_invI:Number;
public var m_linearVelocity:b2Vec2;
public var m_sleepTime:Number;
public var m_jointList:b2JointEdge;
public var m_I:Number;
public static var e_fixedRotationFlag:uint = 64;
public static var e_frozenFlag:uint = 2;
public static var e_maxTypes:uint = 3;
public static var e_sleepFlag:uint = 8;
private static var s_massData:b2MassData = new b2MassData();
public static var e_bulletFlag:uint = 32;
public static var e_staticType:uint = 1;
public static var e_islandFlag:uint = 4;
public static var e_allowSleepFlag:uint = 16;
private static var s_xf1:b2XForm = new b2XForm();
public static var e_dynamicType:uint = 2;
public function b2Body(bd:b2BodyDef, world:b2World){
m_xf = new b2XForm();
m_sweep = new b2Sweep();
m_linearVelocity = new b2Vec2();
m_force = new b2Vec2();
super();
m_flags = 0;
if (bd.isBullet){
m_flags = (m_flags | e_bulletFlag);
};
if (bd.fixedRotation){
m_flags = (m_flags | e_fixedRotationFlag);
};
if (bd.allowSleep){
m_flags = (m_flags | e_allowSleepFlag);
};
if (bd.isSleeping){
m_flags = (m_flags | e_sleepFlag);
};
m_world = world;
m_xf.position.SetV(bd.position);
m_xf.R.Set(bd.angle);
m_sweep.localCenter.SetV(bd.massData.center);
m_sweep.t0 = 1;
m_sweep.a0 = (m_sweep.a = bd.angle);
var tMat:b2Mat22 = m_xf.R;
var tVec:b2Vec2 = m_sweep.localCenter;
m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
m_sweep.c.x = (m_sweep.c.x + m_xf.position.x);
m_sweep.c.y = (m_sweep.c.y + m_xf.position.y);
m_sweep.c0.SetV(m_sweep.c);
m_jointList = null;
m_contactList = null;
m_prev = null;
m_next = null;
m_linearDamping = bd.linearDamping;
m_angularDamping = bd.angularDamping;
m_force.Set(0, 0);
m_torque = 0;
m_linearVelocity.SetZero();
m_angularVelocity = 0;
m_sleepTime = 0;
m_invMass = 0;
m_I = 0;
m_invI = 0;
m_mass = bd.massData.mass;
if (m_mass > 0){
m_invMass = (1 / m_mass);
};
if ((m_flags & b2Body.e_fixedRotationFlag) == 0){
m_I = bd.massData.I;
};
if (m_I > 0){
m_invI = (1 / m_I);
};
if ((((m_invMass == 0)) && ((m_invI == 0)))){
m_type = e_staticType;
} else {
m_type = e_dynamicType;
};
m_userData = bd.userData;
m_shapeList = null;
m_shapeCount = 0;
}
public function GetLinearVelocityFromWorldPoint(worldPoint:b2Vec2):b2Vec2{
return (new b2Vec2((m_linearVelocity.x + (m_angularVelocity * (worldPoint.y - m_sweep.c.y))), (m_linearVelocity.x - (m_angularVelocity * (worldPoint.x - m_sweep.c.x)))));
}
public function SetLinearVelocity(v:b2Vec2):void{
m_linearVelocity.SetV(v);
}
public function WakeUp():void{
m_flags = (m_flags & ~(e_sleepFlag));
m_sleepTime = 0;
}
public function GetLocalCenter():b2Vec2{
return (m_sweep.localCenter);
}
public function ApplyTorque(torque:Number):void{
if (IsSleeping()){
WakeUp();
};
m_torque = (m_torque + torque);
}
public function IsFrozen():Boolean{
return (((m_flags & e_frozenFlag) == e_frozenFlag));
}
public function IsDynamic():Boolean{
return ((m_type == e_dynamicType));
}
public function GetLinearVelocity():b2Vec2{
return (m_linearVelocity);
}
public function SynchronizeTransform():void{
m_xf.R.Set(m_sweep.a);
var tMat:b2Mat22 = m_xf.R;
var tVec:b2Vec2 = m_sweep.localCenter;
m_xf.position.x = (m_sweep.c.x - ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
m_xf.position.y = (m_sweep.c.y - ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
}
public function GetInertia():Number{
return (m_I);
}
public function IsSleeping():Boolean{
return (((m_flags & e_sleepFlag) == e_sleepFlag));
}
public function SetMassFromShapes():void{
var s:b2Shape;
if (m_world.m_lock == true){
return;
};
m_mass = 0;
m_invMass = 0;
m_I = 0;
m_invI = 0;
var centerX:Number = 0;
var centerY:Number = 0;
var massData:b2MassData = s_massData;
s = m_shapeList;
while (s) {
s.ComputeMass(massData);
m_mass = (m_mass + massData.mass);
centerX = (centerX + (massData.mass * massData.center.x));
centerY = (centerY + (massData.mass * massData.center.y));
m_I = (m_I + massData.I);
s = s.m_next;
};
if (m_mass > 0){
m_invMass = (1 / m_mass);
centerX = (centerX * m_invMass);
centerY = (centerY * m_invMass);
};
if ((((m_I > 0)) && (((m_flags & e_fixedRotationFlag) == 0)))){
m_I = (m_I - (m_mass * ((centerX * centerX) + (centerY * centerY))));
m_invI = (1 / m_I);
} else {
m_I = 0;
m_invI = 0;
};
m_sweep.localCenter.Set(centerX, centerY);
var tMat:b2Mat22 = m_xf.R;
var tVec:b2Vec2 = m_sweep.localCenter;
m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
m_sweep.c.x = (m_sweep.c.x + m_xf.position.x);
m_sweep.c.y = (m_sweep.c.y + m_xf.position.y);
m_sweep.c0.SetV(m_sweep.c);
s = m_shapeList;
while (s) {
s.UpdateSweepRadius(m_sweep.localCenter);
s = s.m_next;
};
var oldType:int = m_type;
if ((((m_invMass == 0)) && ((m_invI == 0)))){
m_type = e_staticType;
} else {
m_type = e_dynamicType;
};
if (oldType != m_type){
s = m_shapeList;
while (s) {
s.RefilterProxy(m_world.m_broadPhase, m_xf);
s = s.m_next;
};
};
}
public function PutToSleep():void{
m_flags = (m_flags | e_sleepFlag);
m_sleepTime = 0;
m_linearVelocity.SetZero();
m_angularVelocity = 0;
m_force.SetZero();
m_torque = 0;
}
public function GetJointList():b2JointEdge{
return (m_jointList);
}
public function SetXForm(position:b2Vec2, angle:Number):Boolean{
var s:b2Shape;
var inRange:Boolean;
if (m_world.m_lock == true){
return (true);
};
if (IsFrozen()){
return (false);
};
m_xf.R.Set(angle);
m_xf.position.SetV(position);
var tMat:b2Mat22 = m_xf.R;
var tVec:b2Vec2 = m_sweep.localCenter;
m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
m_sweep.c.x = (m_sweep.c.x + m_xf.position.x);
m_sweep.c.y = (m_sweep.c.y + m_xf.position.y);
m_sweep.c0.SetV(m_sweep.c);
m_sweep.a0 = (m_sweep.a = angle);
var freeze:Boolean;
s = m_shapeList;
while (s) {
inRange = s.Synchronize(m_world.m_broadPhase, m_xf, m_xf);
if (inRange == false){
freeze = true;
break;
};
s = s.m_next;
};
if (freeze == true){
m_flags = (m_flags | e_frozenFlag);
m_linearVelocity.SetZero();
m_angularVelocity = 0;
s = m_shapeList;
while (s) {
s.DestroyProxy(m_world.m_broadPhase);
s = s.m_next;
};
return (false);
};
m_world.m_broadPhase.Commit();
return (true);
}
public function GetLocalPoint(worldPoint:b2Vec2):b2Vec2{
return (b2Math.b2MulXT(m_xf, worldPoint));
}
public function ApplyForce(force:b2Vec2, point:b2Vec2):void{
if (IsSleeping()){
WakeUp();
};
m_force.x = (m_force.x + force.x);
m_force.y = (m_force.y + force.y);
m_torque = (m_torque + (((point.x - m_sweep.c.x) * force.y) - ((point.y - m_sweep.c.y) * force.x)));
}
public function SynchronizeShapes():Boolean{
var s:b2Shape;
var xf1:b2XForm = s_xf1;
xf1.R.Set(m_sweep.a0);
var tMat:b2Mat22 = xf1.R;
var tVec:b2Vec2 = m_sweep.localCenter;
xf1.position.x = (m_sweep.c0.x - ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
xf1.position.y = (m_sweep.c0.y - ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
var inRange:Boolean;
s = m_shapeList;
while (s) {
inRange = s.Synchronize(m_world.m_broadPhase, xf1, m_xf);
if (inRange == false){
break;
};
s = s.m_next;
};
if (inRange == false){
m_flags = (m_flags | e_frozenFlag);
m_linearVelocity.SetZero();
m_angularVelocity = 0;
s = m_shapeList;
while (s) {
s.DestroyProxy(m_world.m_broadPhase);
s = s.m_next;
};
return (false);
};
return (true);
}
public function GetAngle():Number{
return (m_sweep.a);
}
public function GetXForm():b2XForm{
return (m_xf);
}
public function GetLinearVelocityFromLocalPoint(localPoint:b2Vec2):b2Vec2{
var A:b2Mat22 = m_xf.R;
var worldPoint:b2Vec2 = new b2Vec2(((A.col1.x * localPoint.x) + (A.col2.x * localPoint.y)), ((A.col1.y * localPoint.x) + (A.col2.y * localPoint.y)));
worldPoint.x = (worldPoint.x + m_xf.position.x);
worldPoint.y = (worldPoint.y + m_xf.position.y);
return (new b2Vec2((m_linearVelocity.x + (m_angularVelocity * (worldPoint.y - m_sweep.c.y))), (m_linearVelocity.x - (m_angularVelocity * (worldPoint.x - m_sweep.c.x)))));
}
public function GetNext():b2Body{
return (m_next);
}
public function GetMass():Number{
return (m_mass);
}
public function ApplyImpulse(impulse:b2Vec2, point:b2Vec2):void{
if (IsSleeping()){
WakeUp();
};
m_linearVelocity.x = (m_linearVelocity.x + (m_invMass * impulse.x));
m_linearVelocity.y = (m_linearVelocity.y + (m_invMass * impulse.y));
m_angularVelocity = (m_angularVelocity + (m_invI * (((point.x - m_sweep.c.x) * impulse.y) - ((point.y - m_sweep.c.y) * impulse.x))));
}
public function GetAngularVelocity():Number{
return (m_angularVelocity);
}
public function SetAngularVelocity(omega:Number):void{
m_angularVelocity = omega;
}
public function SetMass(massData:b2MassData):void{
var s:b2Shape;
if (m_world.m_lock == true){
return;
};
m_invMass = 0;
m_I = 0;
m_invI = 0;
m_mass = massData.mass;
if (m_mass > 0){
m_invMass = (1 / m_mass);
};
if ((m_flags & b2Body.e_fixedRotationFlag) == 0){
m_I = massData.I;
};
if (m_I > 0){
m_invI = (1 / m_I);
};
m_sweep.localCenter.SetV(massData.center);
var tMat:b2Mat22 = m_xf.R;
var tVec:b2Vec2 = m_sweep.localCenter;
m_sweep.c.x = ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y));
m_sweep.c.y = ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y));
m_sweep.c.x = (m_sweep.c.x + m_xf.position.x);
m_sweep.c.y = (m_sweep.c.y + m_xf.position.y);
m_sweep.c0.SetV(m_sweep.c);
s = m_shapeList;
while (s) {
s.UpdateSweepRadius(m_sweep.localCenter);
s = s.m_next;
};
var oldType:int = m_type;
if ((((m_invMass == 0)) && ((m_invI == 0)))){
m_type = e_staticType;
} else {
m_type = e_dynamicType;
};
if (oldType != m_type){
s = m_shapeList;
while (s) {
s.RefilterProxy(m_world.m_broadPhase, m_xf);
s = s.m_next;
};
};
}
public function IsStatic():Boolean{
return ((m_type == e_staticType));
}
public function GetWorldVector(localVector:b2Vec2):b2Vec2{
return (b2Math.b2MulMV(m_xf.R, localVector));
}
public function GetShapeList():b2Shape{
return (m_shapeList);
}
public function Advance(t:Number):void{
m_sweep.Advance(t);
m_sweep.c.SetV(m_sweep.c0);
m_sweep.a = m_sweep.a0;
SynchronizeTransform();
}
public function SetBullet(flag:Boolean):void{
if (flag){
m_flags = (m_flags | e_bulletFlag);
} else {
m_flags = (m_flags & ~(e_bulletFlag));
};
}
public function CreateShape(def:b2ShapeDef):b2Shape{
if (m_world.m_lock == true){
return (null);
};
var s:b2Shape = b2Shape.Create(def, m_world.m_blockAllocator);
s.m_next = m_shapeList;
m_shapeList = s;
m_shapeCount++;
s.m_body = this;
s.CreateProxy(m_world.m_broadPhase, m_xf);
s.UpdateSweepRadius(m_sweep.localCenter);
return (s);
}
public function IsConnected(other:b2Body):Boolean{
var jn:b2JointEdge = m_jointList;
while (jn) {
if (jn.other == other){
return ((jn.joint.m_collideConnected == false));
};
jn = jn.next;
};
return (false);
}
public function DestroyShape(s:b2Shape):void{
if (m_world.m_lock == true){
return;
};
s.DestroyProxy(m_world.m_broadPhase);
var node:b2Shape = m_shapeList;
var ppS:b2Shape;
var found:Boolean;
while (node != null) {
if (node == s){
if (ppS){
ppS.m_next = s.m_next;
} else {
m_shapeList = s.m_next;
};
found = true;
break;
};
ppS = node;
node = node.m_next;
};
s.m_body = null;
s.m_next = null;
m_shapeCount--;
b2Shape.Destroy(s, m_world.m_blockAllocator);
}
public function GetUserData(){
return (m_userData);
}
public function IsBullet():Boolean{
return (((m_flags & e_bulletFlag) == e_bulletFlag));
}
public function GetWorldCenter():b2Vec2{
return (m_sweep.c);
}
public function AllowSleeping(flag:Boolean):void{
if (flag){
m_flags = (m_flags | e_allowSleepFlag);
} else {
m_flags = (m_flags & ~(e_allowSleepFlag));
WakeUp();
};
}
public function SetUserData(data):void{
m_userData = data;
}
public function GetLocalVector(worldVector:b2Vec2):b2Vec2{
return (b2Math.b2MulTMV(m_xf.R, worldVector));
}
public function GetWorldPoint(localPoint:b2Vec2):b2Vec2{
var A:b2Mat22 = m_xf.R;
var u:b2Vec2 = new b2Vec2(((A.col1.x * localPoint.x) + (A.col2.x * localPoint.y)), ((A.col1.y * localPoint.x) + (A.col2.y * localPoint.y)));
u.x = (u.x + m_xf.position.x);
u.y = (u.y + m_xf.position.y);
return (u);
}
public function GetWorld():b2World{
return (m_world);
}
public function GetPosition():b2Vec2{
return (m_xf.position);
}
}
}//package Box2D.Dynamics
Section 65
//b2BodyDef (Box2D.Dynamics.b2BodyDef)
package Box2D.Dynamics {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
public class b2BodyDef {
public var angularDamping:Number;
public var angle:Number;
public var isSleeping:Boolean;
public var position:b2Vec2;
public var isBullet:Boolean;
public var allowSleep:Boolean;
public var userData;
public var fixedRotation:Boolean;
public var linearDamping:Number;
public var massData:b2MassData;
public function b2BodyDef(){
massData = new b2MassData();
position = new b2Vec2();
super();
massData.center.SetZero();
massData.mass = 0;
massData.I = 0;
userData = null;
position.Set(0, 0);
angle = 0;
linearDamping = 0;
angularDamping = 0;
allowSleep = true;
isSleeping = false;
fixedRotation = false;
isBullet = false;
}
}
}//package Box2D.Dynamics
Section 66
//b2BoundaryListener (Box2D.Dynamics.b2BoundaryListener)
package Box2D.Dynamics {
public class b2BoundaryListener {
public function b2BoundaryListener(){
super();
}
public function Violation(body:b2Body):void{
}
}
}//package Box2D.Dynamics
Section 67
//b2ContactFilter (Box2D.Dynamics.b2ContactFilter)
package Box2D.Dynamics {
import Box2D.Collision.Shapes.*;
public class b2ContactFilter {
public static var b2_defaultFilter:b2ContactFilter = new (b2ContactFilter);
;
public function b2ContactFilter(){
super();
}
public function ShouldCollide(shape1:b2Shape, shape2:b2Shape):Boolean{
var filter1:b2FilterData = shape1.GetFilterData();
var filter2:b2FilterData = shape2.GetFilterData();
if ((((filter1.groupIndex == filter2.groupIndex)) && (!((filter1.groupIndex == 0))))){
return ((filter1.groupIndex > 0));
};
var collide:Boolean = ((!(((filter1.maskBits & filter2.categoryBits) == 0))) && (!(((filter1.categoryBits & filter2.maskBits) == 0))));
return (collide);
}
public function RayCollide(userData, shape:b2Shape):Boolean{
if (!userData){
return (true);
};
return (ShouldCollide((userData as b2Shape), shape));
}
}
}//package Box2D.Dynamics
Section 68
//b2ContactListener (Box2D.Dynamics.b2ContactListener)
package Box2D.Dynamics {
import Box2D.Collision.*;
import Box2D.Dynamics.Contacts.*;
public class b2ContactListener {
public function b2ContactListener(){
super();
}
public function Add(point:b2ContactPoint):void{
}
public function Remove(point:b2ContactPoint):void{
}
public function Persist(point:b2ContactPoint):void{
}
public function Result(point:b2ContactResult):void{
}
}
}//package Box2D.Dynamics
Section 69
//b2ContactManager (Box2D.Dynamics.b2ContactManager)
package Box2D.Dynamics {
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
public class b2ContactManager extends b2PairCallback {
public var m_world:b2World;
public var m_destroyImmediate:Boolean;
public var m_nullContact:b2NullContact;
private static const s_evalCP:b2ContactPoint = new b2ContactPoint();
public function b2ContactManager(){
m_nullContact = new b2NullContact();
super();
m_world = null;
m_destroyImmediate = false;
}
override public function PairRemoved(proxyUserData1, proxyUserData2, pairUserData):void{
if (pairUserData == null){
return;
};
var c:b2Contact = (pairUserData as b2Contact);
if (c == m_nullContact){
return;
};
Destroy(c);
}
public function Destroy(c:b2Contact):void{
var b1:b2Body;
var b2:b2Body;
var manifolds:Array;
var cp:b2ContactPoint;
var i:int;
var manifold:b2Manifold;
var j:int;
var mp:b2ManifoldPoint;
var v1:b2Vec2;
var v2:b2Vec2;
var shape1:b2Shape = c.m_shape1;
var shape2:b2Shape = c.m_shape2;
var manifoldCount:int = c.m_manifoldCount;
if ((((manifoldCount > 0)) && (m_world.m_contactListener))){
b1 = shape1.m_body;
b2 = shape2.m_body;
manifolds = c.GetManifolds();
cp = s_evalCP;
cp.shape1 = c.m_shape1;
cp.shape2 = c.m_shape1;
cp.friction = c.m_friction;
cp.restitution = c.m_restitution;
i = 0;
while (i < manifoldCount) {
manifold = manifolds[i];
cp.normal.SetV(manifold.normal);
j = 0;
while (j < manifold.pointCount) {
mp = manifold.points[j];
cp.position = b1.GetWorldPoint(mp.localPoint1);
v1 = b1.GetLinearVelocityFromLocalPoint(mp.localPoint1);
v2 = b2.GetLinearVelocityFromLocalPoint(mp.localPoint2);
cp.velocity.Set((v2.x - v1.x), (v2.y - v1.y));
cp.separation = mp.separation;
cp.id.key = mp.id._key;
m_world.m_contactListener.Remove(cp);
j++;
};
i++;
};
};
if (c.m_prev){
c.m_prev.m_next = c.m_next;
};
if (c.m_next){
c.m_next.m_prev = c.m_prev;
};
if (c == m_world.m_contactList){
m_world.m_contactList = c.m_next;
};
var body1:b2Body = shape1.m_body;
var body2:b2Body = shape2.m_body;
if (c.m_node1.prev){
c.m_node1.prev.next = c.m_node1.next;
};
if (c.m_node1.next){
c.m_node1.next.prev = c.m_node1.prev;
};
if (c.m_node1 == body1.m_contactList){
body1.m_contactList = c.m_node1.next;
};
if (c.m_node2.prev){
c.m_node2.prev.next = c.m_node2.next;
};
if (c.m_node2.next){
c.m_node2.next.prev = c.m_node2.prev;
};
if (c.m_node2 == body2.m_contactList){
body2.m_contactList = c.m_node2.next;
};
b2Contact.Destroy(c, m_world.m_blockAllocator);
m_world.m_contactCount--;
}
override public function PairAdded(proxyUserData1, proxyUserData2){
var body1:b2Body;
var shape1:b2Shape = (proxyUserData1 as b2Shape);
var shape2:b2Shape = (proxyUserData2 as b2Shape);
body1 = shape1.m_body;
var body2:b2Body = shape2.m_body;
if (((body1.IsStatic()) && (body2.IsStatic()))){
return (m_nullContact);
};
if (shape1.m_body == shape2.m_body){
return (m_nullContact);
};
if (body2.IsConnected(body1)){
return (m_nullContact);
};
if (((!((m_world.m_contactFilter == null))) && ((m_world.m_contactFilter.ShouldCollide(shape1, shape2) == false)))){
return (m_nullContact);
};
var c:b2Contact = b2Contact.Create(shape1, shape2, m_world.m_blockAllocator);
if (c == null){
return (m_nullContact);
};
shape1 = c.m_shape1;
shape2 = c.m_shape2;
body1 = shape1.m_body;
body2 = shape2.m_body;
c.m_prev = null;
c.m_next = m_world.m_contactList;
if (m_world.m_contactList != null){
m_world.m_contactList.m_prev = c;
};
m_world.m_contactList = c;
c.m_node1.contact = c;
c.m_node1.other = body2;
c.m_node1.prev = null;
c.m_node1.next = body1.m_contactList;
if (body1.m_contactList != null){
body1.m_contactList.prev = c.m_node1;
};
body1.m_contactList = c.m_node1;
c.m_node2.contact = c;
c.m_node2.other = body1;
c.m_node2.prev = null;
c.m_node2.next = body2.m_contactList;
if (body2.m_contactList != null){
body2.m_contactList.prev = c.m_node2;
};
body2.m_contactList = c.m_node2;
m_world.m_contactCount++;
return (c);
}
public function Collide():void{
var body1:b2Body;
var body2:b2Body;
var c:b2Contact = m_world.m_contactList;
while (c) {
body1 = c.m_shape1.m_body;
body2 = c.m_shape2.m_body;
if (((body1.IsSleeping()) && (body2.IsSleeping()))){
} else {
c.Update(m_world.m_contactListener);
};
c = c.m_next;
};
}
}
}//package Box2D.Dynamics
Section 70
//b2DebugDraw (Box2D.Dynamics.b2DebugDraw)
package Box2D.Dynamics {
import flash.display.*;
import Box2D.Common.Math.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
public class b2DebugDraw {
public var m_xformScale:Number;// = 1
public var m_fillAlpha:Number;// = 1
public var m_alpha:Number;// = 1
public var m_drawFlags:uint;
public var m_lineThickness:Number;// = 1
public var m_drawScale:Number;// = 1
public var m_sprite:Sprite;
public static var e_coreShapeBit:uint = 4;
public static var e_shapeBit:uint = 1;
public static var e_centerOfMassBit:uint = 64;
public static var e_aabbBit:uint = 8;
public static var e_obbBit:uint = 16;
public static var e_pairBit:uint = 32;
public static var e_jointBit:uint = 2;
public function b2DebugDraw(){
super();
m_drawFlags = 0;
}
public function ClearFlags(flags:uint):void{
m_drawFlags = (m_drawFlags & ~(flags));
}
public function SetFlags(flags:uint):void{
m_drawFlags = flags;
}
public function AppendFlags(flags:uint):void{
m_drawFlags = (m_drawFlags | flags);
}
public function DrawSegment(p1:b2Vec2, p2:b2Vec2, color:b2Color):void{
m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha);
m_sprite.graphics.moveTo((p1.x * m_drawScale), (p1.y * m_drawScale));
m_sprite.graphics.lineTo((p2.x * m_drawScale), (p2.y * m_drawScale));
}
public function DrawSolidPolygon(vertices:Array, vertexCount:int, color:b2Color):void{
m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha);
m_sprite.graphics.moveTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale));
m_sprite.graphics.beginFill(color.color, m_fillAlpha);
var i = 1;
while (i < vertexCount) {
m_sprite.graphics.lineTo((vertices[i].x * m_drawScale), (vertices[i].y * m_drawScale));
i++;
};
m_sprite.graphics.lineTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale));
m_sprite.graphics.endFill();
}
public function DrawCircle(center:b2Vec2, radius:Number, color:b2Color):void{
m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha);
m_sprite.graphics.drawCircle((center.x * m_drawScale), (center.y * m_drawScale), (radius * m_drawScale));
}
public function DrawPolygon(vertices:Array, vertexCount:int, color:b2Color):void{
m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha);
m_sprite.graphics.moveTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale));
var i = 1;
while (i < vertexCount) {
m_sprite.graphics.lineTo((vertices[i].x * m_drawScale), (vertices[i].y * m_drawScale));
i++;
};
m_sprite.graphics.lineTo((vertices[0].x * m_drawScale), (vertices[0].y * m_drawScale));
}
public function DrawSolidCircle(center:b2Vec2, radius:Number, axis:b2Vec2, color:b2Color):void{
m_sprite.graphics.lineStyle(m_lineThickness, color.color, m_alpha);
m_sprite.graphics.moveTo(0, 0);
m_sprite.graphics.beginFill(color.color, m_fillAlpha);
m_sprite.graphics.drawCircle((center.x * m_drawScale), (center.y * m_drawScale), (radius * m_drawScale));
m_sprite.graphics.endFill();
m_sprite.graphics.moveTo((center.x * m_drawScale), (center.y * m_drawScale));
m_sprite.graphics.lineTo(((center.x + (axis.x * radius)) * m_drawScale), ((center.y + (axis.y * radius)) * m_drawScale));
}
public function GetFlags():uint{
return (m_drawFlags);
}
public function DrawXForm(xf:b2XForm):void{
m_sprite.graphics.lineStyle(m_lineThickness, 0xFF0000, m_alpha);
m_sprite.graphics.moveTo((xf.position.x * m_drawScale), (xf.position.y * m_drawScale));
m_sprite.graphics.lineTo(((xf.position.x + (m_xformScale * xf.R.col1.x)) * m_drawScale), ((xf.position.y + (m_xformScale * xf.R.col1.y)) * m_drawScale));
m_sprite.graphics.lineStyle(m_lineThickness, 0xFF00, m_alpha);
m_sprite.graphics.moveTo((xf.position.x * m_drawScale), (xf.position.y * m_drawScale));
m_sprite.graphics.lineTo(((xf.position.x + (m_xformScale * xf.R.col2.x)) * m_drawScale), ((xf.position.y + (m_xformScale * xf.R.col2.y)) * m_drawScale));
}
}
}//package Box2D.Dynamics
Section 71
//b2DestructionListener (Box2D.Dynamics.b2DestructionListener)
package Box2D.Dynamics {
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
public class b2DestructionListener {
public function b2DestructionListener(){
super();
}
public function SayGoodbyeShape(shape:b2Shape):void{
}
public function SayGoodbyeJoint(joint:b2Joint):void{
}
}
}//package Box2D.Dynamics
Section 72
//b2Island (Box2D.Dynamics.b2Island)
package Box2D.Dynamics {
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
public class b2Island {
public var m_listener:b2ContactListener;
public var m_positionIterationCount:int;
public var m_bodyCapacity:int;
public var m_bodies:Array;
public var m_joints:Array;
public var m_jointCapacity:int;
public var m_contactCount:int;
public var m_contacts:Array;
public var m_contactCapacity:int;
public var m_jointCount:int;
public var m_allocator;
public var m_bodyCount:int;
private static var s_reportCR:b2ContactResult = new b2ContactResult();
public function b2Island(bodyCapacity:int, contactCapacity:int, jointCapacity:int, allocator, listener:b2ContactListener){
var i:int;
super();
m_bodyCapacity = bodyCapacity;
m_contactCapacity = contactCapacity;
m_jointCapacity = jointCapacity;
m_bodyCount = 0;
m_contactCount = 0;
m_jointCount = 0;
m_allocator = allocator;
m_listener = listener;
m_bodies = new Array(bodyCapacity);
i = 0;
while (i < bodyCapacity) {
m_bodies[i] = null;
i++;
};
m_contacts = new Array(contactCapacity);
i = 0;
while (i < contactCapacity) {
m_contacts[i] = null;
i++;
};
m_joints = new Array(jointCapacity);
i = 0;
while (i < jointCapacity) {
m_joints[i] = null;
i++;
};
m_positionIterationCount = 0;
}
public function AddBody(body:b2Body):void{
var _local2 = m_bodyCount++;
m_bodies[_local2] = body;
}
public function AddJoint(joint:b2Joint):void{
var _local2 = m_jointCount++;
m_joints[_local2] = joint;
}
public function Report(constraints:Array):void{
var tMat:b2Mat22;
var tVec:b2Vec2;
var c:b2Contact;
var cc:b2ContactConstraint;
var cr:b2ContactResult;
var b1:b2Body;
var manifoldCount:int;
var manifolds:Array;
var j:int;
var manifold:b2Manifold;
var k:int;
var point:b2ManifoldPoint;
var ccp:b2ContactConstraintPoint;
if (m_listener == null){
return;
};
var i:int;
while (i < m_contactCount) {
c = m_contacts[i];
cc = constraints[i];
cr = s_reportCR;
cr.shape1 = c.m_shape1;
cr.shape2 = c.m_shape2;
b1 = cr.shape1.m_body;
manifoldCount = c.m_manifoldCount;
manifolds = c.GetManifolds();
j = 0;
while (j < manifoldCount) {
manifold = manifolds[j];
cr.normal.SetV(manifold.normal);
k = 0;
while (k < manifold.pointCount) {
point = manifold.points[k];
ccp = cc.points[k];
cr.position = b1.GetWorldPoint(point.localPoint1);
cr.normalImpulse = ccp.normalImpulse;
cr.tangentImpulse = ccp.tangentImpulse;
cr.id.key = point.id.key;
m_listener.Result(cr);
k++;
};
j++;
};
i++;
};
}
public function AddContact(contact:b2Contact):void{
var _local2 = m_contactCount++;
m_contacts[_local2] = contact;
}
public function Solve(step:b2TimeStep, gravity:b2Vec2, correctPositions:Boolean, allowSleep:Boolean):void{
var i:int;
var b:b2Body;
var joint:b2Joint;
var j:int;
var contactsOkay:Boolean;
var jointsOkay:Boolean;
var jointOkay:Boolean;
var minSleepTime:Number;
var linTolSqr:Number;
var angTolSqr:Number;
i = 0;
while (i < m_bodyCount) {
b = m_bodies[i];
if (b.IsStatic()){
} else {
b.m_linearVelocity.x = (b.m_linearVelocity.x + (step.dt * (gravity.x + (b.m_invMass * b.m_force.x))));
b.m_linearVelocity.y = (b.m_linearVelocity.y + (step.dt * (gravity.y + (b.m_invMass * b.m_force.y))));
b.m_angularVelocity = (b.m_angularVelocity + ((step.dt * b.m_invI) * b.m_torque));
b.m_force.SetZero();
b.m_torque = 0;
b.m_linearVelocity.Multiply(b2Math.b2Clamp((1 - (step.dt * b.m_linearDamping)), 0, 1));
b.m_angularVelocity = (b.m_angularVelocity * b2Math.b2Clamp((1 - (step.dt * b.m_angularDamping)), 0, 1));
if (b.m_linearVelocity.LengthSquared() > b2Settings.b2_maxLinearVelocitySquared){
b.m_linearVelocity.Normalize();
b.m_linearVelocity.x = (b.m_linearVelocity.x * b2Settings.b2_maxLinearVelocity);
b.m_linearVelocity.y = (b.m_linearVelocity.y * b2Settings.b2_maxLinearVelocity);
};
if ((b.m_angularVelocity * b.m_angularVelocity) > b2Settings.b2_maxAngularVelocitySquared){
if (b.m_angularVelocity < 0){
b.m_angularVelocity = -(b2Settings.b2_maxAngularVelocity);
} else {
b.m_angularVelocity = b2Settings.b2_maxAngularVelocity;
};
};
};
i++;
};
var contactSolver:b2ContactSolver = new b2ContactSolver(step, m_contacts, m_contactCount, m_allocator);
contactSolver.InitVelocityConstraints(step);
i = 0;
while (i < m_jointCount) {
joint = m_joints[i];
joint.InitVelocityConstraints(step);
i++;
};
i = 0;
while (i < step.maxIterations) {
contactSolver.SolveVelocityConstraints();
j = 0;
while (j < m_jointCount) {
joint = m_joints[j];
joint.SolveVelocityConstraints(step);
j++;
};
i++;
};
contactSolver.FinalizeVelocityConstraints();
i = 0;
while (i < m_bodyCount) {
b = m_bodies[i];
if (b.IsStatic()){
} else {
b.m_sweep.c0.SetV(b.m_sweep.c);
b.m_sweep.a0 = b.m_sweep.a;
b.m_sweep.c.x = (b.m_sweep.c.x + (step.dt * b.m_linearVelocity.x));
b.m_sweep.c.y = (b.m_sweep.c.y + (step.dt * b.m_linearVelocity.y));
b.m_sweep.a = (b.m_sweep.a + (step.dt * b.m_angularVelocity));
b.SynchronizeTransform();
};
i++;
};
if (correctPositions){
i = 0;
while (i < m_jointCount) {
joint = m_joints[i];
joint.InitPositionConstraints();
i++;
};
m_positionIterationCount = 0;
while (m_positionIterationCount < step.maxIterations) {
contactsOkay = contactSolver.SolvePositionConstraints(b2Settings.b2_contactBaumgarte);
jointsOkay = true;
i = 0;
while (i < m_jointCount) {
joint = m_joints[i];
jointOkay = joint.SolvePositionConstraints();
jointsOkay = ((jointsOkay) && (jointOkay));
i++;
};
if (((contactsOkay) && (jointsOkay))){
break;
};
m_positionIterationCount++;
};
};
Report(contactSolver.m_constraints);
if (allowSleep){
minSleepTime = Number.MAX_VALUE;
linTolSqr = (b2Settings.b2_linearSleepTolerance * b2Settings.b2_linearSleepTolerance);
angTolSqr = (b2Settings.b2_angularSleepTolerance * b2Settings.b2_angularSleepTolerance);
i = 0;
while (i < m_bodyCount) {
b = m_bodies[i];
if (b.m_invMass == 0){
} else {
if ((b.m_flags & b2Body.e_allowSleepFlag) == 0){
b.m_sleepTime = 0;
minSleepTime = 0;
};
if (((((((b.m_flags & b2Body.e_allowSleepFlag) == 0)) || (((b.m_angularVelocity * b.m_angularVelocity) > angTolSqr)))) || ((b2Math.b2Dot(b.m_linearVelocity, b.m_linearVelocity) > linTolSqr)))){
b.m_sleepTime = 0;
minSleepTime = 0;
} else {
b.m_sleepTime = (b.m_sleepTime + step.dt);
minSleepTime = b2Math.b2Min(minSleepTime, b.m_sleepTime);
};
};
i++;
};
if (minSleepTime >= b2Settings.b2_timeToSleep){
i = 0;
while (i < m_bodyCount) {
b = m_bodies[i];
b.m_flags = (b.m_flags | b2Body.e_sleepFlag);
b.m_linearVelocity.SetZero();
b.m_angularVelocity = 0;
i++;
};
};
};
}
public function Clear():void{
m_bodyCount = 0;
m_contactCount = 0;
m_jointCount = 0;
}
public function SolveTOI(subStep:b2TimeStep):void{
var i:int;
var b:b2Body;
var contactsOkay:Boolean;
var contactSolver:b2ContactSolver = new b2ContactSolver(subStep, m_contacts, m_contactCount, m_allocator);
i = 0;
while (i < subStep.maxIterations) {
contactSolver.SolveVelocityConstraints();
i++;
};
i = 0;
while (i < m_bodyCount) {
b = m_bodies[i];
if (b.IsStatic()){
} else {
b.m_sweep.c0.SetV(b.m_sweep.c);
b.m_sweep.a0 = b.m_sweep.a;
b.m_sweep.c.x = (b.m_sweep.c.x + (subStep.dt * b.m_linearVelocity.x));
b.m_sweep.c.y = (b.m_sweep.c.y + (subStep.dt * b.m_linearVelocity.y));
b.m_sweep.a = (b.m_sweep.a + (subStep.dt * b.m_angularVelocity));
b.SynchronizeTransform();
};
i++;
};
var k_toiBaumgarte:Number = 0.75;
i = 0;
while (i < subStep.maxIterations) {
contactsOkay = contactSolver.SolvePositionConstraints(k_toiBaumgarte);
if (contactsOkay){
break;
};
i++;
};
Report(contactSolver.m_constraints);
}
}
}//package Box2D.Dynamics
Section 73
//b2TimeStep (Box2D.Dynamics.b2TimeStep)
package Box2D.Dynamics {
public class b2TimeStep {
public var warmStarting:Boolean;
public var positionCorrection:Boolean;
public var dt:Number;
public var maxIterations:int;
public var dtRatio:Number;
public var inv_dt:Number;
public function b2TimeStep(){
super();
}
}
}//package Box2D.Dynamics
Section 74
//b2World (Box2D.Dynamics.b2World)
package Box2D.Dynamics {
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
public class b2World {
public var m_inv_dt0:Number;
public var m_boundaryListener:b2BoundaryListener;
public var m_contactList:b2Contact;
public var m_blockAllocator;
public var m_contactListener:b2ContactListener;
public var m_raycastSegment:b2Segment;
public var m_broadPhase:b2BroadPhase;
public var m_destructionListener:b2DestructionListener;
public var m_jointCount:int;
public var m_lock:Boolean;
public var m_bodyCount:int;
public var m_raycastUserData;
public var m_allowSleep:Boolean;
public var m_positionIterationCount:int;
public var m_groundBody:b2Body;
public var m_contactCount:int;
public var m_raycastNormal:b2Vec2;
public var m_contactFilter:b2ContactFilter;
public var m_bodyList:b2Body;
public var m_debugDraw:b2DebugDraw;
public var m_stackAllocator;
public var m_jointList:b2Joint;
public var m_gravity:b2Vec2;
public var m_contactManager:b2ContactManager;
private static var s_jointColor:b2Color = new b2Color(0.5, 0.8, 0.8);
public static var m_continuousPhysics:Boolean;
public static var m_warmStarting:Boolean;
private static var s_coreColor:b2Color = new b2Color(0.9, 0.6, 0.6);
public static var m_positionCorrection:Boolean;
private static var s_xf:b2XForm = new b2XForm();
public function b2World(worldAABB:b2AABB, gravity:b2Vec2, doSleep:Boolean){
m_raycastNormal = new b2Vec2();
m_contactManager = new b2ContactManager();
super();
m_destructionListener = null;
m_boundaryListener = null;
m_contactFilter = b2ContactFilter.b2_defaultFilter;
m_contactListener = null;
m_debugDraw = null;
m_bodyList = null;
m_contactList = null;
m_jointList = null;
m_bodyCount = 0;
m_contactCount = 0;
m_jointCount = 0;
m_positionCorrection = true;
m_warmStarting = true;
m_continuousPhysics = true;
m_allowSleep = doSleep;
m_gravity = gravity;
m_lock = false;
m_inv_dt0 = 0;
m_contactManager.m_world = this;
m_broadPhase = new b2BroadPhase(worldAABB, m_contactManager);
var bd:b2BodyDef = new b2BodyDef();
m_groundBody = CreateBody(bd);
}
public function DrawJoint(joint:b2Joint):void{
var pulley:b2PulleyJoint;
var s1:b2Vec2;
var s2:b2Vec2;
var b1:b2Body = joint.m_body1;
var b2:b2Body = joint.m_body2;
var xf1:b2XForm = b1.m_xf;
var xf2:b2XForm = b2.m_xf;
var x1:b2Vec2 = xf1.position;
var x2:b2Vec2 = xf2.position;
var p1:b2Vec2 = joint.GetAnchor1();
var p2:b2Vec2 = joint.GetAnchor2();
var color:b2Color = s_jointColor;
switch (joint.m_type){
case b2Joint.e_distanceJoint:
m_debugDraw.DrawSegment(p1, p2, color);
break;
case b2Joint.e_pulleyJoint:
pulley = (joint as b2PulleyJoint);
s1 = pulley.GetGroundAnchor1();
s2 = pulley.GetGroundAnchor2();
m_debugDraw.DrawSegment(s1, p1, color);
m_debugDraw.DrawSegment(s2, p2, color);
m_debugDraw.DrawSegment(s1, s2, color);
break;
case b2Joint.e_mouseJoint:
m_debugDraw.DrawSegment(p1, p2, color);
break;
default:
if (b1 != m_groundBody){
m_debugDraw.DrawSegment(x1, p1, color);
};
m_debugDraw.DrawSegment(p1, p2, color);
if (b2 != m_groundBody){
m_debugDraw.DrawSegment(x2, p2, color);
};
};
}
public function Refilter(shape:b2Shape):void{
shape.RefilterProxy(m_broadPhase, shape.m_body.m_xf);
}
public function SetDebugDraw(debugDraw:b2DebugDraw):void{
m_debugDraw = debugDraw;
}
public function SetContinuousPhysics(flag:Boolean):void{
m_continuousPhysics = flag;
}
public function GetProxyCount():int{
return (m_broadPhase.m_proxyCount);
}
public function DrawDebugData():void{
var i:int;
var b:b2Body;
var s:b2Shape;
var j:b2Joint;
var bp:b2BroadPhase;
var xf:b2XForm;
var core:Boolean;
var index:uint;
var pair:b2Pair;
var p1:b2Proxy;
var p2:b2Proxy;
var worldLower:b2Vec2;
var worldUpper:b2Vec2;
var p:b2Proxy;
var poly:b2PolygonShape;
var obb:b2OBB;
var h:b2Vec2;
var tMat:b2Mat22;
var tVec:b2Vec2;
var tX:Number;
if (m_debugDraw == null){
return;
};
m_debugDraw.m_sprite.graphics.clear();
var flags:uint = m_debugDraw.GetFlags();
var invQ:b2Vec2 = new b2Vec2();
var x1:b2Vec2 = new b2Vec2();
var x2:b2Vec2 = new b2Vec2();
var color:b2Color = new b2Color(0, 0, 0);
var b1:b2AABB = new b2AABB();
var b2:b2AABB = new b2AABB();
var vs:Array = [new b2Vec2(), new b2Vec2(), new b2Vec2(), new b2Vec2()];
if ((flags & b2DebugDraw.e_shapeBit)){
core = ((flags & b2DebugDraw.e_coreShapeBit) == b2DebugDraw.e_coreShapeBit);
b = m_bodyList;
while (b) {
xf = b.m_xf;
s = b.GetShapeList();
while (s) {
if (b.IsStatic()){
DrawShape(s, xf, new b2Color(0.5, 0.9, 0.5), core);
} else {
if (b.IsSleeping()){
DrawShape(s, xf, new b2Color(0.5, 0.5, 0.9), core);
} else {
DrawShape(s, xf, new b2Color(0.9, 0.9, 0.9), core);
};
};
s = s.m_next;
};
b = b.m_next;
};
};
if ((flags & b2DebugDraw.e_jointBit)){
j = m_jointList;
while (j) {
DrawJoint(j);
j = j.m_next;
};
};
if ((flags & b2DebugDraw.e_pairBit)){
bp = m_broadPhase;
invQ.Set((1 / bp.m_quantizationFactor.x), (1 / bp.m_quantizationFactor.y));
color.Set(0.9, 0.9, 0.3);
i = 0;
while (i < b2Pair.b2_tableCapacity) {
index = bp.m_pairManager.m_hashTable[i];
while (index != b2Pair.b2_nullPair) {
pair = bp.m_pairManager.m_pairs[index];
p1 = bp.m_proxyPool[pair.proxyId1];
p2 = bp.m_proxyPool[pair.proxyId2];
b1.lowerBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p1.lowerBounds[0]].value));
b1.lowerBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p1.lowerBounds[1]].value));
b1.upperBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p1.upperBounds[0]].value));
b1.upperBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p1.upperBounds[1]].value));
b2.lowerBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p2.lowerBounds[0]].value));
b2.lowerBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p2.lowerBounds[1]].value));
b2.upperBound.x = (bp.m_worldAABB.lowerBound.x + (invQ.x * bp.m_bounds[0][p2.upperBounds[0]].value));
b2.upperBound.y = (bp.m_worldAABB.lowerBound.y + (invQ.y * bp.m_bounds[1][p2.upperBounds[1]].value));
x1.x = (0.5 * (b1.lowerBound.x + b1.upperBound.x));
x1.y = (0.5 * (b1.lowerBound.y + b1.upperBound.y));
x2.x = (0.5 * (b2.lowerBound.x + b2.upperBound.x));
x2.y = (0.5 * (b2.lowerBound.y + b2.upperBound.y));
m_debugDraw.DrawSegment(x1, x2, color);
index = pair.next;
};
i++;
};
};
if ((flags & b2DebugDraw.e_aabbBit)){
bp = m_broadPhase;
worldLower = bp.m_worldAABB.lowerBound;
worldUpper = bp.m_worldAABB.upperBound;
invQ.Set((1 / bp.m_quantizationFactor.x), (1 / bp.m_quantizationFactor.y));
color.Set(0.9, 0.3, 0.9);
i = 0;
while (i < b2Settings.b2_maxProxies) {
p = bp.m_proxyPool[i];
if (p.IsValid() == false){
} else {
b1.lowerBound.x = (worldLower.x + (invQ.x * bp.m_bounds[0][p.lowerBounds[0]].value));
b1.lowerBound.y = (worldLower.y + (invQ.y * bp.m_bounds[1][p.lowerBounds[1]].value));
b1.upperBound.x = (worldLower.x + (invQ.x * bp.m_bounds[0][p.upperBounds[0]].value));
b1.upperBound.y = (worldLower.y + (invQ.y * bp.m_bounds[1][p.upperBounds[1]].value));
vs[0].Set(b1.lowerBound.x, b1.lowerBound.y);
vs[1].Set(b1.upperBound.x, b1.lowerBound.y);
vs[2].Set(b1.upperBound.x, b1.upperBound.y);
vs[3].Set(b1.lowerBound.x, b1.upperBound.y);
m_debugDraw.DrawPolygon(vs, 4, color);
};
i++;
};
vs[0].Set(worldLower.x, worldLower.y);
vs[1].Set(worldUpper.x, worldLower.y);
vs[2].Set(worldUpper.x, worldUpper.y);
vs[3].Set(worldLower.x, worldUpper.y);
m_debugDraw.DrawPolygon(vs, 4, new b2Color(0.3, 0.9, 0.9));
};
if ((flags & b2DebugDraw.e_obbBit)){
color.Set(0.5, 0.3, 0.5);
b = m_bodyList;
while (b) {
xf = b.m_xf;
s = b.GetShapeList();
while (s) {
if (s.m_type != b2Shape.e_polygonShape){
} else {
poly = (s as b2PolygonShape);
obb = poly.GetOBB();
h = obb.extents;
vs[0].Set(-(h.x), -(h.y));
vs[1].Set(h.x, -(h.y));
vs[2].Set(h.x, h.y);
vs[3].Set(-(h.x), h.y);
i = 0;
while (i < 4) {
tMat = obb.R;
tVec = vs[i];
tX = (obb.center.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
vs[i].y = (obb.center.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
vs[i].x = tX;
tMat = xf.R;
tX = (xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y)));
vs[i].y = (xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y)));
vs[i].x = tX;
i++;
};
m_debugDraw.DrawPolygon(vs, 4, color);
};
s = s.m_next;
};
b = b.m_next;
};
};
if ((flags & b2DebugDraw.e_centerOfMassBit)){
b = m_bodyList;
while (b) {
xf = s_xf;
xf.R = b.m_xf.R;
xf.position = b.GetWorldCenter();
m_debugDraw.DrawXForm(xf);
b = b.m_next;
};
};
}
public function DestroyBody(b:b2Body):void{
var jn0:b2JointEdge;
var s0:b2Shape;
if (m_lock == true){
return;
};
var jn:b2JointEdge = b.m_jointList;
while (jn) {
jn0 = jn;
jn = jn.next;
if (m_destructionListener){
m_destructionListener.SayGoodbyeJoint(jn0.joint);
};
DestroyJoint(jn0.joint);
};
var s:b2Shape = b.m_shapeList;
while (s) {
s0 = s;
s = s.m_next;
if (m_destructionListener){
m_destructionListener.SayGoodbyeShape(s0);
};
s0.DestroyProxy(m_broadPhase);
b2Shape.Destroy(s0, m_blockAllocator);
};
if (b.m_prev){
b.m_prev.m_next = b.m_next;
};
if (b.m_next){
b.m_next.m_prev = b.m_prev;
};
if (b == m_bodyList){
m_bodyList = b.m_next;
};
m_bodyCount--;
}
public function DrawShape(shape:b2Shape, xf:b2XForm, color:b2Color, core:Boolean):void{
var circle:b2CircleShape;
var center:b2Vec2;
var radius:Number;
var axis:b2Vec2;
var i:int;
var poly:b2PolygonShape;
var vertexCount:int;
var localVertices:Array;
var vertices:Array;
var localCoreVertices:Array;
var coreColor:b2Color = s_coreColor;
switch (shape.m_type){
case b2Shape.e_circleShape:
circle = (shape as b2CircleShape);
center = b2Math.b2MulX(xf, circle.m_localPosition);
radius = circle.m_radius;
axis = xf.R.col1;
m_debugDraw.DrawSolidCircle(center, radius, axis, color);
if (core){
m_debugDraw.DrawCircle(center, (radius - b2Settings.b2_toiSlop), coreColor);
};
break;
case b2Shape.e_polygonShape:
poly = (shape as b2PolygonShape);
vertexCount = poly.GetVertexCount();
localVertices = poly.GetVertices();
vertices = new Array(b2Settings.b2_maxPolygonVertices);
i = 0;
while (i < vertexCount) {
vertices[i] = b2Math.b2MulX(xf, localVertices[i]);
i++;
};
m_debugDraw.DrawSolidPolygon(vertices, vertexCount, color);
if (core){
localCoreVertices = poly.GetCoreVertices();
i = 0;
while (i < vertexCount) {
vertices[i] = b2Math.b2MulX(xf, localCoreVertices[i]);
i++;
};
m_debugDraw.DrawPolygon(vertices, vertexCount, coreColor);
};
break;
};
}
public function GetGroundBody():b2Body{
return (m_groundBody);
}
public function SetContactFilter(filter:b2ContactFilter):void{
m_contactFilter = filter;
}
public function Solve(step:b2TimeStep):void{
var b:b2Body;
var stackCount:int;
var i:int;
var other:b2Body;
var cn:b2ContactEdge;
var jn:b2JointEdge;
var inRange:Boolean;
m_positionIterationCount = 0;
var island:b2Island = new b2Island(m_bodyCount, m_contactCount, m_jointCount, m_stackAllocator, m_contactListener);
b = m_bodyList;
while (b) {
b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag));
b = b.m_next;
};
var c:b2Contact = m_contactList;
while (c) {
c.m_flags = (c.m_flags & ~(b2Contact.e_islandFlag));
c = c.m_next;
};
var j:b2Joint = m_jointList;
while (j) {
j.m_islandFlag = false;
j = j.m_next;
};
var stackSize:int = m_bodyCount;
var stack:Array = new Array(stackSize);
var seed:b2Body = m_bodyList;
while (seed) {
if ((seed.m_flags & ((b2Body.e_islandFlag | b2Body.e_sleepFlag) | b2Body.e_frozenFlag))){
} else {
if (seed.IsStatic()){
} else {
island.Clear();
stackCount = 0;
var _temp1 = stackCount;
stackCount = (stackCount + 1);
var _local15 = _temp1;
stack[_local15] = seed;
seed.m_flags = (seed.m_flags | b2Body.e_islandFlag);
while (stackCount > 0) {
--stackCount;
b = stack[stackCount];
island.AddBody(b);
b.m_flags = (b.m_flags & ~(b2Body.e_sleepFlag));
if (b.IsStatic()){
} else {
cn = b.m_contactList;
while (cn) {
if ((cn.contact.m_flags & (b2Contact.e_islandFlag | b2Contact.e_nonSolidFlag))){
} else {
if (cn.contact.m_manifoldCount == 0){
} else {
island.AddContact(cn.contact);
cn.contact.m_flags = (cn.contact.m_flags | b2Contact.e_islandFlag);
other = cn.other;
if ((other.m_flags & b2Body.e_islandFlag)){
} else {
var _temp2 = stackCount;
stackCount = (stackCount + 1);
var _local16 = _temp2;
stack[_local16] = other;
other.m_flags = (other.m_flags | b2Body.e_islandFlag);
};
};
};
cn = cn.next;
};
jn = b.m_jointList;
while (jn) {
if (jn.joint.m_islandFlag == true){
} else {
island.AddJoint(jn.joint);
jn.joint.m_islandFlag = true;
other = jn.other;
if ((other.m_flags & b2Body.e_islandFlag)){
} else {
var _temp3 = stackCount;
stackCount = (stackCount + 1);
_local16 = _temp3;
stack[_local16] = other;
other.m_flags = (other.m_flags | b2Body.e_islandFlag);
};
};
jn = jn.next;
};
};
};
island.Solve(step, m_gravity, m_positionCorrection, m_allowSleep);
if (island.m_positionIterationCount > m_positionIterationCount){
m_positionIterationCount = island.m_positionIterationCount;
};
i = 0;
while (i < island.m_bodyCount) {
b = island.m_bodies[i];
if (b.IsStatic()){
b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag));
};
i++;
};
};
};
seed = seed.m_next;
};
b = m_bodyList;
while (b) {
if ((b.m_flags & (b2Body.e_sleepFlag | b2Body.e_frozenFlag))){
} else {
if (b.IsStatic()){
} else {
inRange = b.SynchronizeShapes();
if ((((inRange == false)) && (!((m_boundaryListener == null))))){
m_boundaryListener.Violation(b);
};
};
};
b = b.m_next;
};
m_broadPhase.Commit();
}
public function Query(aabb:b2AABB, shapes:Array, maxCount:int):int{
var results:Array = new Array(maxCount);
var count:int = m_broadPhase.QueryAABB(aabb, results, maxCount);
var i:int;
while (i < count) {
shapes[i] = results[i];
i++;
};
return (count);
}
public function GetContactCount():int{
return (m_contactCount);
}
public function SolveTOI(step:b2TimeStep):void{
var b:b2Body;
var s1:b2Shape;
var s2:b2Shape;
var b1:b2Body;
var b2:b2Body;
var cn:b2ContactEdge;
var c:b2Contact;
var minContact:b2Contact;
var minTOI:Number;
var seed:b2Body;
var stackCount:int;
var subStep:b2TimeStep;
var i:int;
var toi:Number;
var t0:Number;
var other:b2Body;
var inRange:Boolean;
var island:b2Island = new b2Island(m_bodyCount, b2Settings.b2_maxTOIContactsPerIsland, 0, m_stackAllocator, m_contactListener);
var stackSize:int = m_bodyCount;
var stack:Array = new Array(stackSize);
b = m_bodyList;
while (b) {
b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag));
b.m_sweep.t0 = 0;
b = b.m_next;
};
c = m_contactList;
while (c) {
c.m_flags = (c.m_flags & ~((b2Contact.e_toiFlag | b2Contact.e_islandFlag)));
c = c.m_next;
};
while (true) {
minContact = null;
minTOI = 1;
c = m_contactList;
for (;c;(c = c.m_next)) {
if ((c.m_flags & (b2Contact.e_slowFlag | b2Contact.e_nonSolidFlag))){
} else {
toi = 1;
if ((c.m_flags & b2Contact.e_toiFlag)){
toi = c.m_toi;
} else {
s1 = c.m_shape1;
s2 = c.m_shape2;
b1 = s1.m_body;
b2 = s2.m_body;
if (((((b1.IsStatic()) || (b1.IsSleeping()))) && (((b2.IsStatic()) || (b2.IsSleeping()))))){
continue;
};
t0 = b1.m_sweep.t0;
if (b1.m_sweep.t0 < b2.m_sweep.t0){
t0 = b2.m_sweep.t0;
b1.m_sweep.Advance(t0);
} else {
if (b2.m_sweep.t0 < b1.m_sweep.t0){
t0 = b1.m_sweep.t0;
b2.m_sweep.Advance(t0);
};
};
toi = b2TimeOfImpact.TimeOfImpact(c.m_shape1, b1.m_sweep, c.m_shape2, b2.m_sweep);
if ((((toi > 0)) && ((toi < 1)))){
toi = (((1 - toi) * t0) + toi);
if (toi > 1){
toi = 1;
};
};
c.m_toi = toi;
c.m_flags = (c.m_flags | b2Contact.e_toiFlag);
};
if ((((Number.MIN_VALUE < toi)) && ((toi < minTOI)))){
minContact = c;
minTOI = toi;
};
};
};
if ((((minContact == null)) || (((1 - (100 * Number.MIN_VALUE)) < minTOI)))){
break;
};
s1 = minContact.m_shape1;
s2 = minContact.m_shape2;
b1 = s1.m_body;
b2 = s2.m_body;
b1.Advance(minTOI);
b2.Advance(minTOI);
minContact.Update(m_contactListener);
minContact.m_flags = (minContact.m_flags & ~(b2Contact.e_toiFlag));
if (minContact.m_manifoldCount == 0){
} else {
seed = b1;
if (seed.IsStatic()){
seed = b2;
};
island.Clear();
stackCount = 0;
var _temp1 = stackCount;
stackCount = (stackCount + 1);
var _local22 = _temp1;
stack[_local22] = seed;
seed.m_flags = (seed.m_flags | b2Body.e_islandFlag);
while (stackCount > 0) {
--stackCount;
b = stack[stackCount];
island.AddBody(b);
b.m_flags = (b.m_flags & ~(b2Body.e_sleepFlag));
if (b.IsStatic()){
} else {
cn = b.m_contactList;
while (cn) {
if (island.m_contactCount == island.m_contactCapacity){
} else {
if ((cn.contact.m_flags & ((b2Contact.e_islandFlag | b2Contact.e_slowFlag) | b2Contact.e_nonSolidFlag))){
} else {
if (cn.contact.m_manifoldCount == 0){
} else {
island.AddContact(cn.contact);
cn.contact.m_flags = (cn.contact.m_flags | b2Contact.e_islandFlag);
other = cn.other;
if ((other.m_flags & b2Body.e_islandFlag)){
} else {
if (other.IsStatic() == false){
other.Advance(minTOI);
other.WakeUp();
};
var _temp2 = stackCount;
stackCount = (stackCount + 1);
var _local23 = _temp2;
stack[_local23] = other;
other.m_flags = (other.m_flags | b2Body.e_islandFlag);
};
};
};
};
cn = cn.next;
};
};
};
subStep = new b2TimeStep();
subStep.dt = ((1 - minTOI) * step.dt);
subStep.inv_dt = (1 / subStep.dt);
subStep.maxIterations = step.maxIterations;
island.SolveTOI(subStep);
i = 0;
while (i < island.m_bodyCount) {
b = island.m_bodies[i];
b.m_flags = (b.m_flags & ~(b2Body.e_islandFlag));
if ((b.m_flags & (b2Body.e_sleepFlag | b2Body.e_frozenFlag))){
} else {
if (b.IsStatic()){
} else {
inRange = b.SynchronizeShapes();
if ((((inRange == false)) && (!((m_boundaryListener == null))))){
m_boundaryListener.Violation(b);
};
cn = b.m_contactList;
while (cn) {
cn.contact.m_flags = (cn.contact.m_flags & ~(b2Contact.e_toiFlag));
cn = cn.next;
};
};
};
i++;
};
i = 0;
while (i < island.m_contactCount) {
c = island.m_contacts[i];
c.m_flags = (c.m_flags & ~((b2Contact.e_toiFlag | b2Contact.e_islandFlag)));
i++;
};
m_broadPhase.Commit();
};
};
}
public function GetJointList():b2Joint{
return (m_jointList);
}
public function Validate():void{
m_broadPhase.Validate();
}
public function SetGravity(gravity:b2Vec2):void{
m_gravity = gravity;
}
public function GetPairCount():int{
return (m_broadPhase.m_pairManager.m_pairCount);
}
public function GetBodyList():b2Body{
return (m_bodyList);
}
public function SetWarmStarting(flag:Boolean):void{
m_warmStarting = flag;
}
public function SetPositionCorrection(flag:Boolean):void{
m_positionCorrection = flag;
}
public function CreateJoint(def:b2JointDef):b2Joint{
var b:b2Body;
var s:b2Shape;
var j:b2Joint = b2Joint.Create(def, m_blockAllocator);
j.m_prev = null;
j.m_next = m_jointList;
if (m_jointList){
m_jointList.m_prev = j;
};
m_jointList = j;
m_jointCount++;
j.m_node1.joint = j;
j.m_node1.other = j.m_body2;
j.m_node1.prev = null;
j.m_node1.next = j.m_body1.m_jointList;
if (j.m_body1.m_jointList){
j.m_body1.m_jointList.prev = j.m_node1;
};
j.m_body1.m_jointList = j.m_node1;
j.m_node2.joint = j;
j.m_node2.other = j.m_body1;
j.m_node2.prev = null;
j.m_node2.next = j.m_body2.m_jointList;
if (j.m_body2.m_jointList){
j.m_body2.m_jointList.prev = j.m_node2;
};
j.m_body2.m_jointList = j.m_node2;
if (def.collideConnected == false){
b = ((def.body1.m_shapeCount < def.body2.m_shapeCount)) ? def.body1 : def.body2;
s = b.m_shapeList;
while (s) {
s.RefilterProxy(m_broadPhase, b.m_xf);
s = s.m_next;
};
};
return (j);
}
public function DestroyJoint(j:b2Joint):void{
var b:b2Body;
var s:b2Shape;
var collideConnected:Boolean = j.m_collideConnected;
if (j.m_prev){
j.m_prev.m_next = j.m_next;
};
if (j.m_next){
j.m_next.m_prev = j.m_prev;
};
if (j == m_jointList){
m_jointList = j.m_next;
};
var body1:b2Body = j.m_body1;
var body2:b2Body = j.m_body2;
body1.WakeUp();
body2.WakeUp();
if (j.m_node1.prev){
j.m_node1.prev.next = j.m_node1.next;
};
if (j.m_node1.next){
j.m_node1.next.prev = j.m_node1.prev;
};
if (j.m_node1 == body1.m_jointList){
body1.m_jointList = j.m_node1.next;
};
j.m_node1.prev = null;
j.m_node1.next = null;
if (j.m_node2.prev){
j.m_node2.prev.next = j.m_node2.next;
};
if (j.m_node2.next){
j.m_node2.next.prev = j.m_node2.prev;
};
if (j.m_node2 == body2.m_jointList){
body2.m_jointList = j.m_node2.next;
};
j.m_node2.prev = null;
j.m_node2.next = null;
b2Joint.Destroy(j, m_blockAllocator);
m_jointCount--;
if (collideConnected == false){
b = ((body1.m_shapeCount < body2.m_shapeCount)) ? body1 : body2;
s = b.m_shapeList;
while (s) {
s.RefilterProxy(m_broadPhase, b.m_xf);
s = s.m_next;
};
};
}
public function SetContactListener(listener:b2ContactListener):void{
m_contactListener = listener;
}
public function Raycast(segment:b2Segment, shapes:Array, maxCount:int, userData):int{
var results:Array = new Array(maxCount);
m_raycastSegment = segment;
m_raycastUserData = userData;
var count:int = m_broadPhase.QuerySegment(segment, results, maxCount, RaycastSortKey);
var i:int;
while (i < count) {
shapes[i] = results[i];
i++;
};
return (count);
}
public function RaycastOne(segment:b2Segment, lambda:Array, normal:b2Vec2, userData):b2Shape{
var shapes:Array = new Array(1);
var count:Number = Raycast(segment, shapes, 1, userData);
if (count == 0){
return (null);
};
if (count > 1){
trace(count);
};
var shape:b2Shape = shapes[0];
var xf:b2XForm = shape.GetBody().GetXForm();
shape.TestSegment(xf, lambda, normal, segment, 1);
return (shape);
}
public function CreateBody(def:b2BodyDef):b2Body{
if (m_lock == true){
return (null);
};
var b:b2Body = new b2Body(def, this);
b.m_prev = null;
b.m_next = m_bodyList;
if (m_bodyList){
m_bodyList.m_prev = b;
};
m_bodyList = b;
m_bodyCount++;
return (b);
}
public function RaycastSortKey(shape:b2Shape){
if (((m_contactFilter) && (!(m_contactFilter.RayCollide(m_raycastUserData, shape))))){
return (-1);
};
var body:b2Body = shape.GetBody();
var xf:b2XForm = body.GetXForm();
var lambda:Array = [0];
if (!shape.TestSegment(xf, lambda, m_raycastNormal, m_raycastSegment, 1)){
return (-1);
};
return (lambda[0]);
}
public function SetBoundaryListener(listener:b2BoundaryListener):void{
m_boundaryListener = listener;
}
public function SetDestructionListener(listener:b2DestructionListener):void{
m_destructionListener = listener;
}
public function Step(dt:Number, iterations:int):void{
m_lock = true;
var step:b2TimeStep = new b2TimeStep();
step.dt = dt;
step.maxIterations = iterations;
if (dt > 0){
step.inv_dt = (1 / dt);
} else {
step.inv_dt = 0;
};
step.dtRatio = (m_inv_dt0 * dt);
step.positionCorrection = m_positionCorrection;
step.warmStarting = m_warmStarting;
m_contactManager.Collide();
if (step.dt > 0){
Solve(step);
};
if (((m_continuousPhysics) && ((step.dt > 0)))){
SolveTOI(step);
};
DrawDebugData();
m_inv_dt0 = step.inv_dt;
m_lock = false;
}
public function GetBodyCount():int{
return (m_bodyCount);
}
public function GetJointCount():int{
return (m_jointCount);
}
}
}//package Box2D.Dynamics
Section 75
//intro_comicBook_1 (comicbook_fla.intro_comicBook_1)
package comicbook_fla {
import flash.display.*;
public dynamic class intro_comicBook_1 extends MovieClip {
public function intro_comicBook_1(){
addFrameScript(633, frame634);
}
function frame634(){
stop();
}
}
}//package comicbook_fla
Section 76
//AdLoader (CPMStar.AdLoader)
package CPMStar {
import flash.events.*;
import flash.display.*;
import flash.net.*;
import flash.system.*;
public class AdLoader extends Sprite {
private var cpmstarLoader:Loader;
private var contentspotid:String;
public function AdLoader(contentspotid:String){
super();
this.contentspotid = contentspotid;
addEventListener(Event.ADDED, addedHandler);
}
private function dispatchHandler(event:Event):void{
dispatchEvent(event);
}
private function addedHandler(event:Event):void{
removeEventListener(Event.ADDED, addedHandler);
Security.allowDomain("server.cpmstar.com");
var cpmstarViewSWFUrl:String = "http://server.cpmstar.com/adviewas3.swf";
var container:DisplayObjectContainer = parent;
cpmstarLoader = new Loader();
cpmstarLoader.contentLoaderInfo.addEventListener(Event.INIT, dispatchHandler);
cpmstarLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, dispatchHandler);
cpmstarLoader.load(new URLRequest(((cpmstarViewSWFUrl + "?contentspotid=") + contentspotid)));
addChild(cpmstarLoader);
}
}
}//package CPMStar
Section 77
//panel4_15 (endmovie_fla.panel4_15)
package endmovie_fla {
import flash.display.*;
public dynamic class panel4_15 extends MovieClip {
public function panel4_15(){
addFrameScript(39, frame40);
}
function frame40(){
stop();
}
}
}//package endmovie_fla
Section 78
//bubble_logo3_32 (Lic_All_fla.bubble_logo3_32)
package Lic_All_fla {
import flash.display.*;
public dynamic class bubble_logo3_32 extends MovieClip {
public function bubble_logo3_32(){
addFrameScript(0, frame1, 9, frame10);
}
function frame10(){
stop();
}
function frame1(){
stop();
}
}
}//package Lic_All_fla
Section 79
//MB_Explode_5 (Lic_All_fla.MB_Explode_5)
package Lic_All_fla {
import flash.display.*;
public dynamic class MB_Explode_5 extends MovieClip {
public function MB_Explode_5(){
addFrameScript(0, frame1, 18, frame19);
}
function frame1(){
}
function frame19(){
stop();
}
}
}//package Lic_All_fla
Section 80
//MB_eyes_MB_4 (Lic_All_fla.MB_eyes_MB_4)
package Lic_All_fla {
import flash.display.*;
public dynamic class MB_eyes_MB_4 extends MovieClip {
public function MB_eyes_MB_4(){
addFrameScript(31, frame32);
}
function frame32(){
gotoAndPlay(1);
}
}
}//package Lic_All_fla
Section 81
//MB_mouse_3 (Lic_All_fla.MB_mouse_3)
package Lic_All_fla {
import flash.display.*;
public dynamic class MB_mouse_3 extends MovieClip {
public function MB_mouse_3(){
addFrameScript(6, frame7);
}
function frame7(){
gotoAndPlay(1);
}
}
}//package Lic_All_fla
Section 82
//MB_mouse_6 (Lic_All_fla.MB_mouse_6)
package Lic_All_fla {
import flash.display.*;
public dynamic class MB_mouse_6 extends MovieClip {
public function MB_mouse_6(){
addFrameScript(35, frame36);
}
function frame36(){
gotoAndPlay(1);
}
}
}//package Lic_All_fla
Section 83
//FontAsset (mx.core.FontAsset)
package mx.core {
import flash.text.*;
public class FontAsset extends Font implements IFlexAsset {
mx_internal static const VERSION:String = "3.4.0.9271";
public function FontAsset(){
super();
}
}
}//package mx.core
Section 84
//IFlexAsset (mx.core.IFlexAsset)
package mx.core {
public interface IFlexAsset {
}
}//package mx.core
Section 85
//mx_internal (mx.core.mx_internal)
package mx.core {
public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal";
}//package mx.core
Section 86
//FlashConnect (org.flashdevelop.utils.FlashConnect)
package org.flashdevelop.utils {
import flash.events.*;
import flash.xml.*;
import flash.net.*;
import flash.utils.*;
public class FlashConnect {
public static var onReturnData:Function;
public static var port:Number = 1978;
private static var interval:Number;
private static var messages:Array;
public static var onConnection:Function;
public static var host:String = "localhost";
public static var status:Number = 0;
private static var socket:XMLSocket;
public static var limit:Number = 1000;
private static var counter:Number;
public function FlashConnect(){
super();
}
private static function onIOError(event:IOErrorEvent):void{
FlashConnect.status = -1;
if (FlashConnect.onConnection != null){
FlashConnect.onConnection();
};
}
public static function atrace(... _args):void{
var result:String = _args.join(",");
var message:XMLNode = createMsgNode(result, TraceLevel.DEBUG);
FlashConnect.send(message);
}
private static function createMsgNode(message:String, level:Number):XMLNode{
if (isNaN(level)){
level = TraceLevel.DEBUG;
};
var msgNode:XMLNode = new XMLNode(1, null);
var txtNode:XMLNode = new XMLNode(3, encodeURI(message));
msgNode.attributes.state = level.toString();
msgNode.attributes.cmd = "trace";
msgNode.nodeName = "message";
msgNode.appendChild(txtNode);
return (msgNode);
}
public static function send(message:XMLNode):void{
if (messages == null){
initialize();
};
messages.push(message);
}
private static function onSecurityError(event:SecurityErrorEvent):void{
FlashConnect.status = -1;
if (FlashConnect.onConnection != null){
FlashConnect.onConnection();
};
}
private static function onConnect(event:Event):void{
FlashConnect.status = 1;
if (FlashConnect.onConnection != null){
FlashConnect.onConnection();
};
}
public static function trace(value:Object, level:Number=1):void{
var msgNode:XMLNode = createMsgNode(value.toString(), level);
FlashConnect.send(msgNode);
}
private static function initialize():void{
counter = 0;
messages = new Array();
socket = new XMLSocket();
socket.addEventListener(DataEvent.DATA, onData);
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
interval = setInterval(sendStack, 50);
socket.connect(host, port);
}
private static function sendStack():void{
var message:XMLDocument;
var rootNode:XMLNode;
var msg:String;
var errorNode:XMLNode;
var msgNode:XMLNode;
if ((((messages.length > 0)) && ((status == 1)))){
message = new XMLDocument();
rootNode = message.createElement("flashconnect");
while (messages.length != 0) {
counter++;
if (counter > limit){
clearInterval(interval);
msg = new String("FlashConnect aborted. You have reached the limit of maximum messages.");
errorNode = createMsgNode(msg, TraceLevel.ERROR);
rootNode.appendChild(errorNode);
break;
} else {
msgNode = XMLNode(messages.shift());
rootNode.appendChild(msgNode);
};
};
message.appendChild(rootNode);
socket.send(message);
};
}
private static function onData(event:DataEvent):void{
FlashConnect.status = 1;
if (FlashConnect.onReturnData != null){
FlashConnect.onReturnData(event.data);
};
}
public static function mtrace(value:Object, method:String, path:String, line:Number):void{
var fixed:String = path.split("/").join("\\");
var formatted:String = ((((fixed + ":") + line) + ":") + value);
FlashConnect.trace(formatted, TraceLevel.DEBUG);
}
}
}//package org.flashdevelop.utils
Section 87
//TraceLevel (org.flashdevelop.utils.TraceLevel)
package org.flashdevelop.utils {
public class TraceLevel {
public static const DEBUG:Number = 1;
public static const FATAL:Number = 4;
public static const WARNING:Number = 2;
public static const INFO:Number = 0;
public static const ERROR:Number = 3;
public function TraceLevel(){
super();
}
}
}//package org.flashdevelop.utils
Section 88
//wav (sfx_explosion0.wav)
package sfx_explosion0 {
import flash.media.*;
public dynamic class wav extends Sound {
}
}//package sfx_explosion0
Section 89
//bubble_logo3_44 (TitlePage_fla.bubble_logo3_44)
package TitlePage_fla {
import flash.display.*;
public dynamic class bubble_logo3_44 extends MovieClip {
public function bubble_logo3_44(){
addFrameScript(0, frame1, 9, frame10);
}
function frame10(){
stop();
}
function frame1(){
stop();
}
}
}//package TitlePage_fla
Section 90
//Achievement (Achievement)
package {
public class Achievement {
var specificLevel:int;
var testFunction:String;
var name:String;
var testFunctionParams:String;
var completeFunction:String;
var completeFunctionParams:String;
var complete:Boolean;
var description:String;
public function Achievement(){
super();
name = "undefined";
description = "undefined";
complete = false;
testFunction = null;
completeFunction = null;
completeFunctionParams = null;
testFunctionParams = null;
specificLevel = -1;
}
}
}//package
Section 91
//Achievements (Achievements)
package {
public class Achievements {
public var list:Array;
public function Achievements(){
super();
list = new Array();
}
public function Add(_specificLevel:int, _name:String, _desc:String, _func1:String, _func1Params:String, _func2:String, _func2Params:String){
var a:Achievement;
a = new Achievement();
a.specificLevel = _specificLevel;
a.name = _name;
a.description = _desc;
a.testFunction = _func1;
a.testFunctionParams = _func1Params;
a.completeFunction = _func2;
a.completeFunctionParams = _func2Params;
list.push(a);
}
public function TestAll(){
var ach:Achievement;
var result:Boolean;
for each (ach in list) {
if (ach.complete == false){
result = this[ach.testFunction](ach.testFunctionParams);
if (result){
var _local5 = this;
_local5[ach.completeFunction](ach.completeFunctionParams);
ach.complete = true;
};
};
};
}
}
}//package
Section 92
//AGingameButton2 (AGingameButton2)
package {
import flash.display.*;
public dynamic class AGingameButton2 extends SimpleButton {
}
}//package
Section 93
//Antibody (Antibody)
package {
import flash.display.*;
public dynamic class Antibody extends MovieClip {
}
}//package
Section 94
//betweenStages (betweenStages)
package {
import flash.display.*;
public dynamic class betweenStages extends MovieClip {
}
}//package
Section 95
//Collision (Collision)
package {
import flash.display.*;
public class Collision {
static var BulletList:Array = new Array();
static var EnemyList:Array = new Array();
static var EnemyBulletList:Array = new Array();
static var PickupList:Array = new Array();
public function Collision(){
super();
}
public static function TestPixelCircle(x:Number, y:Number, rad:Number, _numP:int=50):Boolean{
var i:int;
var xp:Number;
var yp:Number;
var numP:int = _numP;
var dx:Number = ((Math.PI * 2) / numP);
var ang:Number = 0;
i = 0;
while (i < numP) {
xp = (x + (Math.cos(ang) * rad));
yp = (y + (Math.sin(ang) * rad));
ang = (ang + dx);
if (CanPlacePixel(xp, yp) == false){
return (false);
};
i++;
};
return (true);
}
static function GameObjectInPolyBoundingBox(go:GameObj, poly:Poly):Boolean{
var rad:Number = (go.radius + 50);
var x:Number = go.xpos;
var y:Number = go.ypos;
if (poly.boundingRectangle == null){
return (false);
};
if (x < (poly.boundingRectangle.left - rad)){
return (false);
};
if (x > (poly.boundingRectangle.right + rad)){
return (false);
};
if (y < (poly.boundingRectangle.top - rad)){
return (false);
};
if (y > (poly.boundingRectangle.bottom + rad)){
return (false);
};
return (true);
}
static function DotProduct(x0:Number, y0:Number, x1:Number, y1:Number):Number{
var dot:Number = ((x0 * x1) + (y0 * y1));
return (dot);
}
public static function PointInConvexPoly(x:Number, y:Number, poly:Array):Boolean{
var i:int;
var line:Line;
var dot:Number;
var count:int = poly.length;
i = 0;
while (i < count) {
line = poly[i];
dot = DotProduct((line.x0 - x), (line.y0 - y), line.nx, line.ny);
if (dot < 0){
return (false);
};
i++;
};
return (true);
}
public static function PlayerEnemyBulletCollision(){
var goBullet:GameObj;
var d2:Number;
var goPlayer:GameObj = Game.goPlayer;
if (goPlayer.flashTimer > 0){
return;
};
for each (goBullet in GameObjects.objs) {
if (((((goBullet.active) && (goBullet.colFlag_isEnemyBullet))) && ((goBullet.killed == false)))){
d2 = (20 * 20);
if (Utils.Dist2BetweenPoints(goPlayer.xpos, goPlayer.ypos, goBullet.xpos, goBullet.ypos) < d2){
if (goBullet.hitFunction != null){
goBullet.hitFunction();
};
goPlayer.PlayerHitByBullet(goBullet);
};
};
};
}
public static function PlayerEnemyCollision(){
var goEnemy:GameObj;
var d:Number;
var d2:Number;
var goPlayer:GameObj = Game.goPlayer;
if (goPlayer.flashTimer > 0){
return;
};
for each (goEnemy in GameObjects.objs) {
if (((((((goEnemy.active) && (goEnemy.colFlag_isEnemy))) && ((goEnemy.killed == false)))) && ((goEnemy.appearing == false)))){
d = (20 + goEnemy.radius);
d2 = (d * d);
if (Utils.Dist2BetweenPoints(goPlayer.xpos, goPlayer.ypos, goEnemy.xpos, goEnemy.ypos) < d2){
if (goEnemy.hitFunction != null){
goEnemy.hitFunction(null);
};
goPlayer.PlayerHitByBullet(goEnemy);
};
};
};
}
public static function BulletEnemyCollision(){
var goBullet:GameObj;
var goEnemy:GameObj;
var d:Number;
var d2:Number;
for each (goBullet in BulletList) {
if (goBullet.killed == false){
for each (goEnemy in EnemyList) {
if (goEnemy.killed == false){
d = (goEnemy.radius + goBullet.radius);
d2 = (d * d);
if (Utils.Dist2BetweenPoints(goBullet.xpos, goBullet.ypos, goEnemy.xpos, goEnemy.ypos) < d2){
if (goEnemy.hitFunction != null){
goEnemy.hitFunction(goBullet);
};
if (goBullet.hitFunction != null){
goBullet.hitFunction();
};
};
};
};
};
};
}
public static function MakeLists(){
var go:GameObj;
EnemyList.splice(0, EnemyList.length);
EnemyBulletList.splice(0, EnemyBulletList.length);
BulletList.splice(0, BulletList.length);
PickupList.splice(0, PickupList.length);
for each (go in GameObjects.objs) {
if (((((((go.active) && (go.colFlag_isEnemy))) && ((go.killed == false)))) && ((go.appearing == false)))){
EnemyList.push(go);
};
if (((((go.active) && (go.colFlag_isEnemyBullet))) && ((go.killed == false)))){
EnemyBulletList.push(go);
};
if (((((go.active) && (go.colFlag_isBullet))) && ((go.killed == false)))){
BulletList.push(go);
};
if (((((go.active) && (go.colFlag_canBePickedUp))) && ((go.killed == false)))){
PickupList.push(go);
};
};
}
public static function CanPlacePixel(x:Number, y:Number):Boolean{
var f = 1;
var gfxid:int = GraphicObjects.GetIndexByName("BackgroundScroll1");
var bd:BitmapData = GraphicObjects.GetBitmapData(gfxid, f);
var xoff:int = GraphicObjects.GetOffsetX(gfxid, f);
var yoff:int = GraphicObjects.GetOffsetY(gfxid, f);
x = (x - xoff);
y = (y - yoff);
var c:uint = bd.getPixel(x, y);
if (c != 0){
return (false);
};
return (true);
}
public static function SingleBulletEnemyCollision(goBullet:GameObj){
var goEnemy:GameObj;
var d:Number;
var d2:Number;
for each (goEnemy in GameObjects.objs) {
if (((((goEnemy.active) && (goEnemy.colFlag_isEnemy))) && ((goEnemy.killed == false)))){
d = (goEnemy.radius + goBullet.radius);
d2 = (d * d);
if (Utils.Dist2BetweenPoints(goBullet.xpos, goBullet.ypos, goEnemy.xpos, goEnemy.ypos) < d2){
if (goEnemy.hitFunction != null){
goEnemy.hitFunction(goBullet);
};
};
};
};
}
public static function PlayerPickupCollision(){
var goPickup:GameObj;
var d2:Number;
var goPlayer:GameObj = Game.goPlayer;
for each (goPickup in GameObjects.objs) {
if (((((goPickup.active) && (goPickup.colFlag_canBePickedUp))) && ((goPickup.killed == false)))){
d2 = (15 * 15);
if (Utils.Dist2BetweenPoints(goPlayer.xpos, goPlayer.ypos, goPickup.xpos, goPickup.ypos) < d2){
if (goPickup.hitFunction != null){
goPickup.hitFunction();
};
};
};
};
}
public static function Update(){
if (Game.levelState == Game.levelState_Failed){
return;
};
MakeLists();
BulletEnemyCollision();
PlayerPickupCollision();
if (Game.levelState == Game.levelState_Play){
PlayerEnemyBulletCollision();
PlayerEnemyCollision();
};
}
public static function EnemyPointInPolyCollision(poly:Poly, bulletGO:GameObj){
var goEnemy:GameObj;
for each (goEnemy in GameObjects.objs) {
if (((goEnemy.active) && (goEnemy.colFlag_isEnemy))){
if (PointInConvexPoly(goEnemy.xpos, goEnemy.ypos, poly.lineList)){
if (goEnemy.hitFunction != null){
goEnemy.hitFunction(bulletGO);
};
};
};
};
}
}
}//package
Section 96
//ComicBookIntro (ComicBookIntro)
package {
import flash.display.*;
public dynamic class ComicBookIntro extends MovieClip {
}
}//package
Section 97
//ContactListener (ContactListener)
package {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Collision.*;
public class ContactListener extends b2ContactListener {
public function ContactListener(){
super();
}
override public function Add(point:b2ContactPoint):void{
var go:GameObj;
var p0:PhysObj_Instance;
var b0:b2Body = point.shape1.GetBody();
var bud0:PhysObj_BodyUserData = b0.GetUserData();
var b1:b2Body = point.shape2.GetBody();
var bud1:PhysObj_BodyUserData = b1.GetUserData();
var force:b2Vec2 = new b2Vec2(0, 0);
Game.numCollisionTests++;
}
}
}//package
Section 98
//CPMStarLoaderScreen (CPMStarLoaderScreen)
package {
import flash.display.*;
public dynamic class CPMStarLoaderScreen extends MovieClip {
public var loader:MovieClip;
public var buttonSkipCPMStarAd:SimpleButton;
public var adBox:MovieClip;
}
}//package
Section 99
//daveSmartAnim (daveSmartAnim)
package {
import flash.display.*;
public dynamic class daveSmartAnim extends MovieClip {
}
}//package
Section 100
//Debug (Debug)
package {
public class Debug {
public static var debugMode:int = 0;
public function Debug(){
super();
}
public static function RenderCollision(){
var i:int;
var col:uint;
var line:Line;
var line0:Line;
var path:Poly;
return;
}
public static function Toggle(mask:int):Boolean{
var notmask:int;
if ((debugMode & mask) == 0){
debugMode = (debugMode | mask);
} else {
notmask = (mask ^ 4294967295);
debugMode = (debugMode & notmask);
};
return (true);
}
public static function RenderPlayerInfo(){
var s:String;
}
public static function IsSet(mask:int):Boolean{
if ((debugMode & mask) == 0){
return (false);
};
return (true);
}
}
}//package
Section 101
//Defs (Defs)
package {
import flash.geom.*;
public class Defs {
public static const zpos_PICKUP = 1100;
public static const zpos_ENEMY = 1000;
public static const displayarea_w = 640;
public static const zpos_OVERLAY = 500;
public static const zpos_PLAYER = 1000;
public static const fps:Number = 33;
public static const zpos_FAR = 10000;
public static const zpos_BACKGROUND = 10000;
public static const displayarea_h = 480;
public static const platformW2 = 15;
public static var screenRect:Rectangle = new Rectangle(0, 0, displayarea_w, displayarea_h);
public static var pointZero:Point = new Point(0, 0);
public function Defs(){
super();
}
}
}//package
Section 102
//DisplayObj (DisplayObj)
package {
import flash.events.*;
import flash.text.*;
import flash.display.*;
import flash.geom.*;
public class DisplayObj {
var frames:Array;
var flags:int;
public var frame:int;
public function DisplayObj(mc:MovieClip, scale:Number, _flags:int):void{
super();
flags = _flags;
frame = 0;
if (mc != null){
CreateBitmapsFromMovieClip(mc, flags);
};
}
public function SetFrame(f:int){
frame = f;
if (frame < 0){
frame = 0;
};
if (frame >= frames.length){
frame = (frames.length - 1);
};
}
public function GetMaxFrames():int{
return (frames.length);
}
public function CreateBitmapsFromMovieClip(mc:MovieClip, flags:int):void{
var i:int;
var j:int;
var x0:int;
var y0:int;
var mat:Matrix;
var rect:Rectangle;
var B:Bitmap;
var BD:BitmapData;
var B1:Bitmap;
var BD1:BitmapData;
var dof:*;
frames = new Array();
mc.gotoAndStop(1);
var numRotFrames = 32;
i = 0;
while (i < mc.totalFrames) {
dof = new DisplayObjFrame();
dof.mat = new Matrix();
dof.colTrans = new ColorTransform();
rect = mc.getBounds(null);
rect.x = Math.floor(rect.x);
rect.y = Math.floor(rect.y);
rect.width = Math.ceil(rect.width);
rect.height = Math.ceil(rect.height);
y0 = Math.floor(y0);
mat = new Matrix();
x0 = rect.left;
y0 = rect.top;
mat.translate(-(x0), -(y0));
dof.xoffset = Number(x0);
dof.yoffset = Number(y0);
if (((!((mc.width == 0))) && (!((mc.height == 0))))){
BD = new BitmapData(rect.width, rect.height, true, 0);
BD.draw(mc, mat);
dof.bitmapData = BD;
} else {
trace("ERROR: Null bitmap found");
dof.bitmapData = null;
};
frames.push(dof);
mc.nextFrame();
i++;
};
}
function CreateAsciiStringTable():Array{
var tab:Array = new Array();
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push("");
tab.push(" ");
tab.push("!");
tab.push("'");
tab.push("#");
tab.push("$");
tab.push("%");
tab.push("&");
tab.push("'");
tab.push("(");
tab.push(")");
tab.push("*");
tab.push("+");
tab.push(",");
tab.push("-");
tab.push(".");
tab.push("/");
tab.push("0");
tab.push("1");
tab.push("2");
tab.push("3");
tab.push("4");
tab.push("5");
tab.push("6");
tab.push("7");
tab.push("8");
tab.push("9");
tab.push(":");
tab.push(";");
tab.push("<");
tab.push("=");
tab.push(">");
tab.push("?");
tab.push("@");
tab.push("A");
tab.push("B");
tab.push("C");
tab.push("D");
tab.push("E");
tab.push("F");
tab.push("G");
tab.push("H");
tab.push("I");
tab.push("J");
tab.push("K");
tab.push("L");
tab.push("M");
tab.push("N");
tab.push("O");
tab.push("P");
tab.push("Q");
tab.push("R");
tab.push("S");
tab.push("T");
tab.push("U");
tab.push("V");
tab.push("W");
tab.push("X");
tab.push("Y");
tab.push("Z");
tab.push("[");
tab.push("\\");
tab.push("]");
tab.push("^");
tab.push("_");
tab.push("'");
tab.push("a");
tab.push("b");
tab.push("c");
tab.push("d");
tab.push("e");
tab.push("f");
tab.push("g");
tab.push("h");
tab.push("i");
tab.push("j");
tab.push("k");
tab.push("l");
tab.push("m");
tab.push("n");
tab.push("o");
tab.push("p");
tab.push("q");
tab.push("r");
tab.push("s");
tab.push("t");
tab.push("u");
tab.push("v");
tab.push("w");
tab.push("x");
tab.push("y");
tab.push("z");
tab.push("{");
tab.push("|");
tab.push("}");
tab.push("~");
return (tab);
}
public function CreateFont(tf:TextFormat):void{
var i:int;
var j:int;
var x0:int;
var y0:int;
var mat:Matrix;
var rect:Rectangle;
var B:Bitmap;
var BD:BitmapData;
var t:TextField;
var dof:*;
frames = new Array();
var asciiStrings:Array = CreateAsciiStringTable();
i = 0;
while (i < asciiStrings.length) {
t = new TextField();
t.textColor = 4294967295;
t.selectable = false;
t.embedFonts = true;
t.autoSize = TextFieldAutoSize.LEFT;
t.x = 0;
t.y = 0;
t.text = asciiStrings[i];
t.setTextFormat(tf);
dof = new DisplayObjFrame();
dof.mat = new Matrix();
dof.colTrans = new ColorTransform();
rect = t.getBounds(null);
mat = new Matrix();
mat.translate(-(rect.x), -(rect.y));
dof.xoffset = 0;
dof.yoffset = 0;
BD = new BitmapData(rect.width, rect.height, true, 0);
BD.draw(t, mat, null, null, null, true);
dof.bitmapData = BD;
frames.push(dof);
i++;
};
}
}
}//package
Section 103
//DisplayObjFrame (DisplayObjFrame)
package {
import flash.display.*;
import flash.geom.*;
public class DisplayObjFrame {
public var mat:Matrix;
public var colTrans:ColorTransform;
public var xoffset:Number;
public var yoffset:Number;
public var point:Point;
public var bitmapData:BitmapData;
public var sourceRect:Rectangle;
public function DisplayObjFrame(){
super();
}
public function RenderAt(screenBD:BitmapData, xpos:Number, ypos:Number):void{
sourceRect = new Rectangle(0, 0, bitmapData.width, bitmapData.height);
point = new Point((xpos + xoffset), (ypos + yoffset));
screenBD.copyPixels(bitmapData, sourceRect, point, null, null, true);
}
public function RenderAtRotScaled(screenBD:BitmapData, xpos:Number, ypos:Number, scale:Number=1, rot:Number=0, ct:ColorTransform=null, _doSmooth:Boolean=false):void{
mat.identity();
if (rot != 0){
mat.translate(xoffset, yoffset);
mat.rotate(rot);
mat.translate(-(xoffset), -(yoffset));
};
mat.scale(scale, scale);
mat.translate((xpos + (xoffset * scale)), (ypos + (yoffset * scale)));
if (bitmapData != null){
screenBD.draw(bitmapData, mat, ct, null, null, _doSmooth);
};
}
public function RenderAtAdditive(screenBD:BitmapData, xpos:Number, ypos:Number):void{
mat.identity();
mat.translate((xpos + xoffset), (ypos + yoffset));
screenBD.draw(bitmapData, mat, null, BlendMode.ADD);
}
}
}//package
Section 104
//Enemy01 (Enemy01)
package {
import flash.display.*;
public dynamic class Enemy01 extends MovieClip {
}
}//package
Section 105
//Enemy01_Boss (Enemy01_Boss)
package {
import flash.display.*;
public dynamic class Enemy01_Boss extends MovieClip {
}
}//package
Section 106
//Enemy01_Med (Enemy01_Med)
package {
import flash.display.*;
public dynamic class Enemy01_Med extends MovieClip {
}
}//package
Section 107
//Enemy01a (Enemy01a)
package {
import flash.display.*;
public dynamic class Enemy01a extends MovieClip {
}
}//package
Section 108
//Enemy02 (Enemy02)
package {
import flash.display.*;
public dynamic class Enemy02 extends MovieClip {
}
}//package
Section 109
//Enemy02_Boss (Enemy02_Boss)
package {
import flash.display.*;
public dynamic class Enemy02_Boss extends MovieClip {
}
}//package
Section 110
//Enemy02_Med (Enemy02_Med)
package {
import flash.display.*;
public dynamic class Enemy02_Med extends MovieClip {
}
}//package
Section 111
//Enemy02a (Enemy02a)
package {
import flash.display.*;
public dynamic class Enemy02a extends MovieClip {
}
}//package
Section 112
//Enemy03 (Enemy03)
package {
import flash.display.*;
public dynamic class Enemy03 extends MovieClip {
}
}//package
Section 113
//Enemy03_Boss (Enemy03_Boss)
package {
import flash.display.*;
public dynamic class Enemy03_Boss extends MovieClip {
}
}//package
Section 114
//Enemy03_Med (Enemy03_Med)
package {
import flash.display.*;
public dynamic class Enemy03_Med extends MovieClip {
}
}//package
Section 115
//Enemy03a (Enemy03a)
package {
import flash.display.*;
public dynamic class Enemy03a extends MovieClip {
}
}//package
Section 116
//Enemy04 (Enemy04)
package {
import flash.display.*;
public dynamic class Enemy04 extends MovieClip {
}
}//package
Section 117
//Enemy04_Boss (Enemy04_Boss)
package {
import flash.display.*;
public dynamic class Enemy04_Boss extends MovieClip {
}
}//package
Section 118
//Enemy04_Med (Enemy04_Med)
package {
import flash.display.*;
public dynamic class Enemy04_Med extends MovieClip {
}
}//package
Section 119
//Enemy04a (Enemy04a)
package {
import flash.display.*;
public dynamic class Enemy04a extends MovieClip {
}
}//package
Section 120
//Enemy05 (Enemy05)
package {
import flash.display.*;
public dynamic class Enemy05 extends MovieClip {
}
}//package
Section 121
//Enemy05_Boss (Enemy05_Boss)
package {
import flash.display.*;
public dynamic class Enemy05_Boss extends MovieClip {
}
}//package
Section 122
//Enemy05_Med (Enemy05_Med)
package {
import flash.display.*;
public dynamic class Enemy05_Med extends MovieClip {
}
}//package
Section 123
//Enemy05a (Enemy05a)
package {
import flash.display.*;
public dynamic class Enemy05a extends MovieClip {
}
}//package
Section 124
//Enemy06 (Enemy06)
package {
import flash.display.*;
public dynamic class Enemy06 extends MovieClip {
}
}//package
Section 125
//Enemy06_Boss (Enemy06_Boss)
package {
import flash.display.*;
public dynamic class Enemy06_Boss extends MovieClip {
}
}//package
Section 126
//Enemy06_Med (Enemy06_Med)
package {
import flash.display.*;
public dynamic class Enemy06_Med extends MovieClip {
}
}//package
Section 127
//Enemy06a (Enemy06a)
package {
import flash.display.*;
public dynamic class Enemy06a extends MovieClip {
}
}//package
Section 128
//Enemy07 (Enemy07)
package {
import flash.display.*;
public dynamic class Enemy07 extends MovieClip {
}
}//package
Section 129
//Enemy07_Boss (Enemy07_Boss)
package {
import flash.display.*;
public dynamic class Enemy07_Boss extends MovieClip {
}
}//package
Section 130
//Enemy07_Med (Enemy07_Med)
package {
import flash.display.*;
public dynamic class Enemy07_Med extends MovieClip {
}
}//package
Section 131
//Enemy07a (Enemy07a)
package {
import flash.display.*;
public dynamic class Enemy07a extends MovieClip {
}
}//package
Section 132
//Enemy08 (Enemy08)
package {
import flash.display.*;
public dynamic class Enemy08 extends MovieClip {
}
}//package
Section 133
//Enemy08_Boss (Enemy08_Boss)
package {
import flash.display.*;
public dynamic class Enemy08_Boss extends MovieClip {
}
}//package
Section 134
//Enemy08_Med (Enemy08_Med)
package {
import flash.display.*;
public dynamic class Enemy08_Med extends MovieClip {
}
}//package
Section 135
//Enemy08a (Enemy08a)
package {
import flash.display.*;
public dynamic class Enemy08a extends MovieClip {
}
}//package
Section 136
//EnemyRick (EnemyRick)
package {
import flash.display.*;
public dynamic class EnemyRick extends MovieClip {
}
}//package
Section 137
//EnemyWeapon01 (EnemyWeapon01)
package {
import flash.display.*;
public dynamic class EnemyWeapon01 extends MovieClip {
}
}//package
Section 138
//explosion_1 (explosion_1)
package {
import flash.display.*;
public dynamic class explosion_1 extends MovieClip {
}
}//package
Section 139
//explosion_1_large (explosion_1_large)
package {
import flash.display.*;
public dynamic class explosion_1_large extends MovieClip {
}
}//package
Section 140
//explosion_2 (explosion_2)
package {
import flash.display.*;
public dynamic class explosion_2 extends MovieClip {
}
}//package
Section 141
//explosion_2_large (explosion_2_large)
package {
import flash.display.*;
public dynamic class explosion_2_large extends MovieClip {
}
}//package
Section 142
//explosion_3 (explosion_3)
package {
import flash.display.*;
public dynamic class explosion_3 extends MovieClip {
}
}//package
Section 143
//explosion_3_large (explosion_3_large)
package {
import flash.display.*;
public dynamic class explosion_3_large extends MovieClip {
}
}//package
Section 144
//ExternalData (ExternalData)
package {
import flash.events.*;
import flash.net.*;
import flash.system.*;
public class ExternalData {
static var xmlLoader:URLLoader;
public static var constants:Object;
static var loader:URLLoader;
public static var xml:XML;
static var xxx:XML = <data>
<weapons>
<weapon name="A">
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="5" dir="0"/>
</weapon>
<weapon name="B">
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="7" dir="-5"/>
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="7" dir="5"/>
</weapon>
<weapon name="C">
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="7" dir="-10"/>
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="7" dir="10"/>
<item initfunc="InitBullet_Move" mc="Weapon03" hp="1" speed="10" freq="5"/>
</weapon>
<weapon name="D">
<item initfunc="InitBullet_Move" mc="Weapon04" hp="1" speed="10" freq="6" dir="13"/>
<item initfunc="InitBullet_Move" mc="Weapon04" hp="1" speed="10" freq="6" dir="-13"/>
<item initfunc="InitBullet_Move" mc="Weapon04" hp="1" speed="10" freq="5"/>
</weapon>
<weapon name="E">
<item initfunc="InitBullet_Move" mc="Weapon02" hp="1" speed="10" freq="5" dir="-20"/>
<item initfunc="InitBullet_Move" mc="Weapon02" hp="1" speed="10" freq="5" dir="20"/>
<item initfunc="InitBullet_Move" mc="Weapon02" hp="1" speed="12" freq="2"/>
</weapon>
<weapon name="F">
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="12" freq="3" dir="-10"/>
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="12" freq="3" dir="10"/>
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="11" freq="5" dir="-30"/>
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="11" freq="5" dir="30"/>
</weapon>
<weapon name="G">
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="12" freq="5" dir="-10"/>
<item initfunc="InitBullet_Move" mc="Weapon05" hp="1" speed="12" freq="5" dir="10"/>
<item initfunc="InitBullet_Move" mc="Weapon06" hp="1" speed="12" freq="5" dir="-30"/>
<item initfunc="InitBullet_Move" mc="Weapon06" hp="1" speed="12" freq="5" dir="30"/>
<item initfunc="InitBullet_Move" mc="Weapon06" hp="1" speed="12" freq="2" dir="0"/>
</weapon>
<weapon name="H">
<item initfunc="InitBullet_Move" mc="Weapon07" hp="1" speed="13" freq="3" dir="-10"/>
<item initfunc="InitBullet_Move" mc="Weapon07" hp="1" speed="13" freq="3" dir="10"/>
<item initfunc="InitBullet_Move" mc="Weapon06" hp="1" speed="13" freq="5" dir="-30"/>
<item initfunc="InitBullet_Move" mc="Weapon06" hp="1" speed="13" freq="5" dir="30"/>
<item initfunc="InitBullet_Move" mc="Weapon07" hp="1" speed="15" freq="2" dir="0"/>
</weapon>
<weapon name="SmartBomb">
<item initfunc="InitBullet_Move" mc="Weapon01" health="1" hp="1" speed="10" freq="5" dir="0"/>
</weapon>
</weapons>
<!--
<shot delaytime="2,4" numshots="1" shotfrequency="0.1" numbullets="1" spread="0" fixedangle="-1" speed="10" />
-->
<gruntdefs>
<!--
InitGrunt_Square_Burst
InitGrunt_MoveTo_Burst
InitGrunt_Path
InitGrunt_TurnTo
InitGrunt_Bounce
InitGrunt_Acc
InitGrunt_CurveBounce
InitGrunt_CurveTurnTo
-->
<grunt name="A2" hp="20" speed="0.5" mc="Enemy01_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="B2" hp="20" speed="0.5" mc="Enemy02_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="C2" hp="20" speed="0.5" mc="Enemy03_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="D2" hp="20" speed="0.5" mc="Enemy04_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="E2" hp="20" speed="0.5" mc="Enemy05_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="F2" hp="20" speed="0.5" mc="Enemy06_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="G2" hp="20" speed="0.5" mc="Enemy07_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="H2" hp="20" speed="0.5" mc="Enemy08_Med" cash="100">
<control func="InitGrunt_TurnTo" turnspeed="0.1"/>
<shot initialdelay="0" delaytime="3,4" numshots="1" shotfrequency="1" numbullets="1" spread="0" fixedangle="-1" speed="5"/>
</grunt>
<grunt name="A0" hp="1" speed="1" mc="Enemy01" cash="50">
<control func="InitGrunt_TurnTo" turnspeed="0.01"/>
</grunt>
<grunt name="A1" hp="5" speed="1.5" mc="Enemy01a" cash="50">
<control func="InitGrunt_TurnTo" turnspeed="0.02"/>
</grunt>
<grunt name="BossA" hp="200" speed="1" mc="Enemy01_Boss" cash="500">
<control func="InitGrunt_TurnTo" turnspeed="0.03" isboss="true"/>
<shot delaytime="2,3" numshots="5" shotfrequency="0.1" numbullets="3" spread="20" fixedangle="-1" speed="7"/>
</grunt>
<grunt name="B0" hp="1" speed="2" mc="Enemy02" cash="50">
<control func="InitGrunt_Acc" turnspeed="0.15"/>
</grunt>
<grunt name="B1" hp="5" speed="3" mc="Enemy02a" cash="50">
<control func="InitGrunt_Acc" turnspeed="0.15"/>
</grunt>
<grunt name="BossB" hp="300" speed="1" mc="Enemy02_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="1,1" numshots="5" shotfrequency="0.2" numbullets="4" spread="360" fixedangle="0" speed="10"/>
<shot initialdelay="1" delaytime="1,1" numshots="5" shotfrequency="0.2" numbullets="4" spread="360" fixedangle="45" speed="10"/>
</grunt>
<grunt name="C0" hp="2" speed="5" mc="Enemy03" cash="50">
<control func="InitGrunt_Bounce"/>
</grunt>
<grunt name="C1" hp="6" speed="7" mc="Enemy03a" cash="50">
<control func="InitGrunt_Bounce"/>
</grunt>
<grunt name="BossC" hp="300" speed="1" mc="Enemy03_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="3,3" numshots="1" shotfrequency="0" numbullets="3" spread="120" fixedangle="-1" speed="8"/>
<shot initialdelay="1" delaytime="3,3" numshots="1" shotfrequency="0" numbullets="3" spread="30" fixedangle="-1" speed="8"/>
</grunt>
<grunt name="D0" hp="2" speed="5" mc="Enemy04" cash="50">
<control func="InitGrunt_MoveTo_Burst" bursttime="0.8"/>
</grunt>
<grunt name="D1" hp="6" speed="7" mc="Enemy04a" cash="50">
<control func="InitGrunt_MoveTo_Burst" bursttime="0.8"/>
</grunt>
<grunt name="BossD" hp="400" speed="1" mc="Enemy04_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.005" isboss="true"/>
<shot initialdelay="0" delaytime="3,3" numshots="1" shotfrequency="0" numbullets="16" spread="360" fixedangle="0" speed="10"/>
</grunt>
<grunt name="E0" hp="3" speed="5" mc="Enemy05" cash="50">
<control func="InitGrunt_Square_Burst" bursttime="0.3"/>
</grunt>
<grunt name="E1" hp="7" speed="5" mc="Enemy05a" cash="50">
<control func="InitGrunt_Square_Burst" bursttime="0.6"/>
</grunt>
<grunt name="BossE" hp="600" speed="1" mc="Enemy05_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="0" speed="12"/>
<shot initialdelay="0" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="180" speed="12"/>
<shot initialdelay="1" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="90" speed="12"/>
<shot initialdelay="1" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="270" speed="12"/>
<shot initialdelay="2" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="45" speed="12"/>
<shot initialdelay="2" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="225" speed="12"/>
<shot initialdelay="3" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="135" speed="12"/>
<shot initialdelay="3" delaytime="4,4" numshots="5" shotfrequency="0.1" numbullets="2" spread="40" fixedangle="315" speed="12"/>
</grunt>
<grunt name="F0" hp="3" speed="6" mc="Enemy06" cash="50">
<control func="InitGrunt_CurveBounce" turnspeed="0.025"/>
</grunt>
<grunt name="F1" hp="7" speed="7" mc="Enemy06a" cash="50">
<control func="InitGrunt_CurveBounce" turnspeed="0.025"/>
</grunt>
<grunt name="BossF" hp="800" speed="1" mc="Enemy06_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="2,2" numshots="20" shotfrequency="0.1" numbullets="8" spread="30" fixedangle="-1" speed="10"/>
</grunt>
<grunt name="G0" hp="4" speed="5" mc="Enemy07" cash="50">
<control func="InitGrunt_CurveTurnTo" turnspeed="0.15"/>
</grunt>
<grunt name="G1" hp="8" speed="6" mc="Enemy07a" cash="50">
<control func="InitGrunt_CurveTurnTo" turnspeed="0.15"/>
</grunt>
<grunt name="BossG" hp="900" speed="1" mc="Enemy07_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="1,1" numshots="10" shotfrequency="0.03" numbullets="5" spread="10" fixedangle="-1" speed="10"/>
</grunt>
<grunt name="H0" hp="4" speed="10" mc="Enemy08" cash="50">
<control func="InitGrunt_Random" turnspeed="1"/>
</grunt>
<grunt name="H1" hp="8" speed="10" mc="Enemy08a" cash="50">
<control func="InitGrunt_Random" turnspeed="1"/>
</grunt>
<grunt name="BossH" hp="4000" speed="0.5" mc="Enemy08_Boss" cash="500">
<control func="InitGrunt_Path" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="1,1" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="0" speed="10"/>
<shot initialdelay="0" delaytime="1,1" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="90" speed="10"/>
<shot initialdelay="0" delaytime="1,1" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="180" speed="10"/>
<shot initialdelay="0" delaytime="1,1" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="270" speed="10"/>
</grunt>
<grunt name="BossRick" hp="4000" speed="0.4" mc="rick" cash="500">
<control func="InitGrunt_RickBoss" turnspeed="0.01" isboss="true"/>
<shot initialdelay="0" delaytime="2,2" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="0" speed="10"/>
<shot initialdelay="0" delaytime="2,2" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="90" speed="10"/>
<shot initialdelay="0" delaytime="2,2" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="180" speed="10"/>
<shot initialdelay="0" delaytime="2,2" numshots="5" shotfrequency="0.1" numbullets="4" spread="30" fixedangle="270" speed="10"/>
</grunt>
<grunt name="EnemyRick" hp="8" speed="10" mc="EnemyRick" cash="50">
<control func="InitGrunt_Random" turnspeed="1"/>
</grunt>
</gruntdefs>
<level name="Level a0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="30"/>
<wave enemy="A0" frequency="3,3" amount="2,3"/>
</level>
<level name="Level a1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="50"/>
<wave enemy="B0" frequency="3,3" amount="4,5"/>
</level>
<level name="Level a2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossA" frequency="1,1" once="true"/>
<wave enemy="A0" frequency="4,4" amount="2,3"/>
</level>
<level name="Level b0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="D0" frequency="3,3" amount="5,5"/>
</level>
<level name="Level b1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="C0" frequency="3,3" amount="5,5"/>
</level>
<level name="Level b2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossB" frequency="1,1" once="true"/>
<wave enemy="B0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="102,98, 270,65, 448,84, 533,200, 549,341, 461,429, 272,446, 138,417, 68,301, 57,173"/>
</line>
</level>
<level name="Level c0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="E0" frequency="3,3" amount="5,5"/>
</level>
<level name="Level c1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="F0" frequency="3,3" amount="5,5"/>
</level>
<level name="Level c2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossC" frequency="1,1" once="true"/>
<wave enemy="C0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="53,51, 592,169, 61,289, 587,442, 50,451, 562,292, 62,166, 591,32"/>
</line>
</level>
<level name="Level d0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="G0" frequency="2,3" amount="5,5"/>
</level>
<level name="Level d1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="H0" frequency="2,3" amount="5,5"/>
</level>
<level name="Level d2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossD" frequency="1,1" once="true"/>
<wave enemy="D0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="284,220, 336,195, 399,273, 322,331, 201,234, 317,119, 474,243, 340,409, 101,269, 289,34"/>
<points a="585,198, 366,464, 72,371, 210,65, 515,206, 358,426, 142,313, 270,150, 418,233, 317,376"/>
<points a="223,296"/>
</line>
</level>
<level name="Level e0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="A1" frequency="2,2" amount="5,5"/>
<wave enemy="B1" frequency="2,2" amount="5,5"/>
<wave enemy="H2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level e1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="B1" frequency="2,2" amount="5,5"/>
<wave enemy="D1" frequency="2,2" amount="5,5"/>
<wave enemy="G2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level e2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossE" frequency="1,1" once="true"/>
<wave enemy="E0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="105,132, 83,105, 142,84, 181,149, 99,389, 143,397, 144,360, 63,327, 63,433, 520,333"/>
<points a="565,390, 495,414, 468,320, 515,95, 490,65, 461,96, 528,166, 563,66, 461,26, 153,130"/>
</line>
</level>
<level name="Level f0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="C1" frequency="2,2" amount="5,5"/>
<wave enemy="E1" frequency="2,2" amount="5,5"/>
<wave enemy="F2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level f1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="D1" frequency="2,2" amount="5,5"/>
<wave enemy="F1" frequency="2,2" amount="5,5"/>
<wave enemy="E2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level f2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossF" frequency="1,1" once="true"/>
<wave enemy="F0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="263,453, 319,217, 406,446, 373,241, 538,425, 376,193, 571,248, 361,172, 577,142, 350,154"/>
<points a="537,35, 329,156, 356,10, 304,177, 152,20, 287,187, 12,110, 252,219, 25,267, 258,237"/>
<points a="116,409, 290,219"/>
</line>
</level>
<level name="Level g0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="E1" frequency="2,2" amount="5,5"/>
<wave enemy="G1" frequency="2,2" amount="5,5"/>
<wave enemy="D2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level g1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="C1" frequency="2,2" amount="5,5"/>
<wave enemy="H1" frequency="2,2" amount="5,5"/>
<wave enemy="C2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level g2 boss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossG" frequency="1,1" once="true"/>
<wave enemy="G0" frequency="3,3" amount="2,3"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="47,33, 586,443, 352,25, 346,461, 497,44, 81,419, 598,130, 58,228, 577,298"/>
</line>
</level>
<level name="Level h0" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="A1" frequency="2,2" amount="5,5"/>
<wave enemy="D1" frequency="2,2" amount="5,5"/>
<wave enemy="G1" frequency="2,2" amount="5,5"/>
<wave enemy="B2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level h1" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info endLevelFunction="EndLevel_KilledEnemies" enemies="100"/>
<wave enemy="H1" frequency="2,2" amount="5,5"/>
<wave enemy="B1" frequency="2,2" amount="5,5"/>
<wave enemy="F1" frequency="2,2" amount="5,5"/>
<wave enemy="A2" frequency="1,1" amount="1,1"/>
</level>
<level name="Level h2 rickboss" category="0" fillframe="1" surfaceframe="5" surfacethickness="10" type="none" opponents="" win="1" exclusivechar="1">
<info antibodies="0" endLevelFunction="EndLevel_Boss"/>
<wave enemy="BossRick" frequency="1,1" once="true"/>
<wave enemy="EnemyRick" frequency="3,3" amount="5,5"/>
<line type="0" name="line01" fill="0" fillscale="1">
<points a="419,16, 426,455, 405,11, 21,193, 627,191, 20,215, 205,466, 203,8, 217,464, 628,318"/>
<points a="12,332, 627,308, 595,29, 98,428, 578,25, 617,458, 30,24, 585,455, 54,455, 544,25"/>
<points a="50,426, 32,46, 602,430"/>
</line>
</level>
</data>
;
public static var gameconstants:Object;
static var cb:Function;
public function ExternalData(){
super();
}
public static function GetConstants(){
var num:int;
var vx:XML;
var i:int;
constants = new Object();
num = xml.constants.constant.length();
i = 0;
while (i < num) {
vx = xml.constants.constant[i];
constants[vx.@name] = vx.@value;
i++;
};
gameconstants = new Object();
num = xml.gameconstants.constant.length();
i = 0;
while (i < num) {
vx = xml.gameconstants.constant[i];
gameconstants[vx.@name] = vx.@value;
i++;
};
}
public static function Load(_cb:Function){
cb = _cb;
XmlLoadedInternal();
}
public static function poo(e:Event){
trace(loader.data.status);
}
public static function OutputString(s:String){
System.setClipboard(s);
}
static function XmlLoadedInternal(){
var i:int;
XML.ignoreWhitespace = true;
xml = new XML(xxx);
GetConstants();
cb();
}
public static function xmlLoaded(e:Event){
var i:int;
XML.ignoreWhitespace = true;
xml = new XML(e.target.data);
GetConstants();
cb();
}
}
}//package
Section 145
//Game (Game)
package {
import flash.events.*;
import flash.display.*;
import flash.geom.*;
import flash.utils.*;
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
import flash.ui.*;
import flash.system.*;
public class Game {
static const colCategory_Pellet:int = 4;
static const levelState_Editor = 3;
static const levelState_EndScreen = 6;
static const levelState_Play = 1;
static const mode_PLACEMENT:int = 1;
static const levelState_Null = 2;
static const colCategory_Ball:int = 2;
static const levelState_Failed = 7;
static const levelState_LevelStart = 0;
static const mode_CURSOR:int = 0;
static const colCategory_Background:int = 1;
static const levelState_PreLevelScreen = 8;
static const levelState_EndSection = 5;
static const mode_SELECTED:int = 2;
static const levelState_Complete = 4;
static var soundSpectrum:ByteArray;
public static var scrollCX:Number;
public static var scrollCY:Number;
static var scrollToScale:Number = 1;
static var isBossLevel:Boolean = false;
static var currentWave:int = 0;
static var backgroundBitmaps:Array;
static var panelRect:Rectangle = new Rectangle(200, 10, 200, 10);
static var levelFinishedState:int;
static var groundBody:b2Body;
static var lastGeneratedGameObj:GameObj;
static var levelTimer:int;
static var numPickupsNeeded:int = 0;
static var numBombs:int;
static var bgFrame:int;
static var smartBombDestroyFrameMin:int;
static var bossKilled:Boolean;
public static var gravity;
static var health:int;
static var numEnemiesKilled:int;
static var genGruntTimer:int;
static var currentStartPointIndex:int;
static var levelStateTimerMax:int;
public static var currentWorldID:int = 0;
static var specRanges:Array;
static var buttonMute:MovieClip;
static var scrollAcc:Number;
static var scrollScale:Number = 1;
public static var maxFallSpeed;
static var physObjs:PhysObjs;
static var shakeCamX:Number = 0;
static var numLevels:int;
public static var scrollXa:Number;
static var shakeCamY:Number = 0;
static var currentScore:int;
static var waves:Array;
public static var scrollToCX:Number;
public static var scrollToCY:Number;
static var bossGenerated:Boolean = false;
static var maxGruntsActive:int = 100;
static var circular:Boolean = true;
static var LevelUpdateCallback:Function;
public static var scrollYa:Number;
static var genGruntTimerMax:int;
static var currentMode:int;
static var scrollToDX:Number = 0;
static var numBikes:int;
static var numGeneratorsActive:int = 0;
static var scrollToDY:Number = 0;
static var physGravity:Number = (300 * w2p);
static var mouseJoint:b2MouseJoint = null;
static var smartBombBullet:GameObj;
static var pauseGameplayInput:Boolean;
static var smartBombActive:Boolean;
static var scrollMaxVel:Number;
static var raceTimer:int;
static var currentWeapon:int;
static var polygonList:Array;
static var physStep:Number = 0.0166666666666667;
static var smartBombTimerMax:int;
static var sitelocked:Boolean = false;
static var p2w:Number = 20;
static var endMovieUnlocked:Boolean;
public static var scrollH:Number;
static var numLives:int;
public static var achievements:Achievements;
static var panel_towers:Array;
public static var scrollX:Number;
static var usedebug:Boolean = false;
static var soundon:Boolean = false;
public static var scrollW:Number;
static var cash:int;
static var w2p:Number = (1 / p2w);
public static var scrollY:Number;
static var shakeCamDX:Number = 0;
static var numPickupsCollected:int = 0;
static var panelRect1:Rectangle = new Rectangle(200, 3, 200, 5);
static var smartBombDestroyFrameMax:int;
static var numLevelEnemiesKilled:int;
static var shakeCamDY:Number = 0;
static var globalSpeedModifier:Number = 0.0005;
static var gruntDefs:Array;
static var levelState:int;
static var levelScore:int;
static var numPickupsActive:int = 0;
public static var numCollisionTests:int;
static var levels:Array;
static var physObjInstances:PhysObj_Instances;
static var level_instances:Array;
static var previousStaticPoints:Array;
static var circleOffset:Number = 0;
static var currentLevel:int;
static var shakeCamToX:Number = 0;
static var numEnemiesNeeded:int = 0;
static var scrollVel:Number;
static var shakeCamToY:Number = 0;
public static var world:b2World;
static var levelStateCount:int;
static var goList:Array;
static var zsortoffset:Number = 0;
static var panelOverlay:MovieClip;
static var currentTowerIndex:int = 0;
static var soundLevel:Number = 0;
static var towerDefs:Array;
static var main:Main;
static var difficulty:int;
static var multiplier:int;
static var cursorY:Number = 0;
static var generatorGenTimer:int = 0;
static var cursorX:Number = 0;
static var physNumIterations:int = 20;
static var numGruntsActive:int;
static var weapons:Array;
static var levelStateTimer:int;
static var currentGameMusic:int;
static var scrollMaxY;
static var shakeCamTimer:int = 50;
static var oldRanges:Array;
static var startPoints:Array;
static var scrollMaxX;
static var goPlayer:GameObj;
static var pause:Boolean;
static var shakeCamTimerMax:int = 50;
static var smartBombTimer:int;
static var smartBombClip:MovieClip;
static var currentOldRange:int;
public function Game(){
super();
}
static function PanelOverlay_UpdateBossHealth(amt:Number, max:Number){
var nf:int = panelOverlay.bossHealth.totalFrames;
var f:int = Utils.ScaleTo(1, nf, 0, max, amt);
panelOverlay.bossHealth.gotoAndStop(f);
}
public static function GetWeaponTypeIndexByName(name:String):int{
var w:WeaponType;
var i:int;
for each (w in weapons) {
if (w.name == name){
return (i);
};
i++;
};
return (0);
}
static function RenderFloor():void{
var i:int;
var p0:Point;
var p1:Point;
var line:PhysLine;
var bd:BitmapData;
var bd1:BitmapData;
var col:uint;
var g:Graphics = main.fillScreenMC.graphics;
g.clear();
var l:Level = GetCurrentLevel();
var m:Matrix = new Matrix();
for each (line in l.lines) {
if (line.type == 0){
m.identity();
m.scale(line.fillScaleX, line.fillScaleY);
bd = GraphicObjects.GetBitmapData(1, line.fill);
g.beginBitmapFill(bd, m);
p1 = line.points[0].clone();
g.moveTo(p1.x, p1.y);
i = 1;
while (i < line.points.length) {
p0 = line.points[i].clone();
g.lineTo(p0.x, p0.y);
i++;
};
g.lineTo(p1.x, p1.y);
g.endFill();
};
};
for each (line in l.lines) {
if (line.type == 0){
bd1 = GraphicObjects.GetBitmapData(1, line.fill);
col = bd1.getPixel(8, 8);
g.lineStyle(3, col, 1);
p1 = line.points[0].clone();
g.moveTo(p1.x, p1.y);
i = 1;
while (i < line.points.length) {
p0 = line.points[i].clone();
g.lineTo(p0.x, p0.y);
i++;
};
g.lineTo(p1.x, p1.y);
};
};
}
static function PanelOverlay_UpdateCash(){
panelOverlay.cash.cash.text = cash;
}
static function RenderPanelA(){
var x:Number;
var y:Number;
var s:String;
var w:Number;
var go:GameObj;
var rect:Rectangle;
var l:Level = GetCurrentLevel();
var bd:BitmapData = main.screenBD;
x = 10;
y = (Defs.displayarea_h - 25);
var memused:int = (System.totalMemory / 0x0400);
y = 20;
x = 10;
s = ("" + currentScore);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font2, x, y, s, null);
if (l.endLevelTestFunctionName == "EndLevel_KilledEnemies"){
y = (Defs.displayarea_h - 30);
x = (Defs.displayarea_w - 5);
s = ((("Kills " + numLevelEnemiesKilled) + " / ") + numEnemiesNeeded);
w = GraphicObjects.GetStringWidth(bd, GraphicObjects.gfx_font2, x, y, s, null);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font2, (x - w), y, s, null);
};
if (l.endLevelTestFunctionName == "EndLevel_Boss"){
go = GetBoss();
if (go != null){
rect = new Rectangle(300, 5, 300, 30);
bd.fillRect(rect, 4286578688);
rect.width = Utils.ScaleTo(0, 300, 0, go.maxHealth, go.health);
bd.fillRect(rect, 4294901760);
};
};
x = 40;
y = (Defs.displayarea_h - 40);
var f:int = health;
var gid:int = GraphicObjects.GetIndexByName("PlayerHealth");
GraphicObjects.RenderAt(gid, f, bd, x, y);
}
public static function LoadLevels(){
var i:int;
levels = new Array();
var x:XML = ExternalData.xml;
var num:* = x.level.length();
while (i < num) {
LoadLevel(i);
i++;
};
i = 0;
while (i < levels.length) {
GetLevel(i).available = false;
GetLevel(i).complete = false;
i++;
};
GetLevel(0).available = true;
}
static function CanPlaceTower(go:GameObj):Boolean{
var tgo:GameObj;
var d2:Number;
if (Collision.TestPixelCircle(go.xpos, go.ypos, go.footprintRadius) == false){
return (false);
};
for each (tgo in GameObjects.objs) {
if (((tgo.active) && (tgo.colFlag_isTower))){
d2 = (tgo.footprintRadius + go.footprintRadius);
d2 = (d2 * d2);
if (Utils.Dist2BetweenPoints(tgo.xpos, tgo.ypos, go.xpos, go.ypos) <= d2){
return (false);
};
};
};
return (true);
}
static function GetInitialStartPoint():Point{
var p:Point;
var pp:Point;
var x:Number = 999999;
for each (p in startPoints) {
if (p.x < x){
x = p.x;
pp = p;
};
};
return (pp);
}
public static function LoadLevel(l:int){
var xx:XML;
var a:Array;
var i:int;
var j:int;
var wd:WaveDef;
var linex:XML;
var linetype:int;
var linename:String;
var fill:int;
var line:PhysLine;
var pointsx:XML;
var pointsstr:String;
var pts:Array;
var p1:Point;
var lo:XML;
var type:String;
var px:Number;
var py:Number;
var rot:Number;
var params:String;
var inst:PhysObj_Instance;
var x:XML = ExternalData.xml;
x = x.level[l];
var level:Level = new Level();
level.name = XmlHelper.GetAttrString(x.@name, "undefined");
level.category = XmlHelper.GetAttrInt(x.@category, 0);
level.fillFrame = XmlHelper.GetAttrInt(x.@fillframe, 1);
level.surfaceFrame = XmlHelper.GetAttrInt(x.@surfaceframe, 2);
level.surfaceThickness = XmlHelper.GetAttrInt(x.@surfacethickness, 10);
level.eventType = XmlHelper.GetAttrString(x.@type, "race");
level.eventOpponentsString = XmlHelper.GetAttrString(x.@opponents, "1");
level.exclusiveChar = XmlHelper.GetAttrInt(x.@exclusivechar, -1);
level.eventWinParam = XmlHelper.GetAttrNumber(x.@win, 1);
level.goldTime = (XmlHelper.GetAttrNumber(x.times.@gold, 10) * Defs.fps);
level.silverTime = (XmlHelper.GetAttrNumber(x.times.@silver, 20) * Defs.fps);
level.numEnemiesNeeded = XmlHelper.GetAttrInt(x.info.@enemies, 0);
level.numAntibodiesNeeded = XmlHelper.GetAttrInt(x.info.@antibodies, 0);
level.endLevelTestFunctionName = XmlHelper.GetAttrString(x.info.@endLevelFunction, "");
var numwaves:int = x.wave.length();
i = 0;
while (i < numwaves) {
xx = x.wave[i];
wd = new WaveDef();
wd.once = XmlHelper.GetAttrBoolean(xx.@once, false);
wd.enemy = XmlHelper.GetAttrString(xx.@enemy, "");
a = Utils.PointArrayFromString(XmlHelper.GetAttrString(xx.@frequency, "0,0"));
wd.frequencyMin = a[0].x;
wd.frequencyMax = a[0].y;
a = Utils.PointArrayFromString(XmlHelper.GetAttrString(xx.@amount, "0,0"));
wd.amountMin = a[0].x;
wd.amountMax = a[0].y;
trace(((((((((("wave " + wd.enemy) + " ") + wd.frequencyMin) + " ") + wd.frequencyMax) + " ") + wd.amountMin) + " ") + wd.amountMax));
level.waves.push(wd);
i++;
};
i = 0;
while (i < x.helpscreen.length()) {
xx = x.helpscreen[i];
level.helpscreenFrames.push(XmlHelper.GetAttrInt(xx.@frame, 0));
i++;
};
level.Calculate();
level.lines = new Array();
i = 0;
while (i < x.line.length()) {
linex = x.line[i];
linetype = XmlHelper.GetAttrInt(linex.@type, 0);
linename = XmlHelper.GetAttrString(linex.@name, "");
fill = XmlHelper.GetAttrInt(linex.@fill, 1);
line = new PhysLine();
line.type = linetype;
line.name = linename;
line.fill = fill;
line.fillScaleX = XmlHelper.GetAttrNumber(linex.@fillscale, 1);
line.fillScaleY = XmlHelper.GetAttrNumber(linex.@fillscale, 1);
j = 0;
while (j < linex.points.length()) {
pointsx = linex.points[j];
pointsstr = XmlHelper.GetAttrString(pointsx.@a, "");
pts = Utils.PointArrayFromString(pointsstr);
for each (p1 in pts) {
line.points.push(p1);
};
j++;
};
level.lines.push(line);
i++;
};
i = 0;
while (i < x.obj.length()) {
lo = x.obj[i];
type = lo.@type;
px = Number(lo.@x);
py = Number(lo.@y);
rot = Number(lo.@rot);
params = XmlHelper.GetAttrString(lo.@params, "");
inst = CreatePhysObjInstanceAt(type, px, py, rot, "", params);
level.instances.push(inst);
i++;
};
levels.push(level);
}
static function InitPhysicsGO(x:Number, y:Number, graphic:PhysObj_Graphic, _gid:int=0, _frame:int=0, _zpos:Number=1000):int{
var go:GameObj;
_zpos = (_zpos + graphic.zoffset);
if (graphic == null){
go = GameObjects.AddObj((x * p2w), (y * p2w), (_zpos + zsortoffset));
go.InitPhysicsObject(_gid, _frame, 0, 0, "", false);
} else {
if (graphic.goInitFuntion == ""){
go = GameObjects.AddObj((x * p2w), (y * p2w), (_zpos + zsortoffset));
go.InitPhysicsObject(_gid, _frame, graphic.offset.x, graphic.offset.y, graphic.goInitFuntionVarString, graphic.hasShadow);
} else {
go = GameObjects.AddObj((x * p2w), (y * p2w), (_zpos + zsortoffset));
go.InitPhysicsObject(_gid, _frame, graphic.offset.x, graphic.offset.y, graphic.goInitFuntionVarString, graphic.hasShadow);
var _local8 = go;
_local8[graphic.goInitFuntion]();
};
};
lastGeneratedGameObj = go;
return (GameObjects.lastGenIndex);
}
static function InitBox2D():void{
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-250000, -250000);
worldAABB.upperBound.Set(250000, 250000);
var grav:b2Vec2 = new b2Vec2(0, physGravity);
var doSleep:Boolean;
world = new b2World(worldAABB, grav, doSleep);
groundBody = world.GetGroundBody();
groundBody.SetUserData(-1);
var cl:ContactListener = new ContactListener();
world.SetContactListener(cl);
}
static function GetLevel(_lev:int):Level{
if (_lev >= levels.length){
return (null);
};
return (levels[_lev]);
}
static function UpdateLevel(){
var go:GameObj;
var num:int;
var wd:WaveDef;
var l:Level = GetCurrentLevel();
generatorGenTimer--;
if (generatorGenTimer <= 0){
generatorGenTimer = 0;
if (numGeneratorsActive < 10){
num = l.waves.length;
if (isBossLevel){
if (bossGenerated == false){
wd = l.waves[0];
bossGenerated = true;
} else {
if (num > 1){
wd = l.waves[Utils.RandBetweenInt(1, (num - 1))];
} else {
generatorGenTimer = 999999999;
};
};
} else {
wd = l.waves[Utils.RandBetweenInt(0, (num - 1))];
};
generatorGenTimer = (Utils.RandBetweenFloat(wd.frequencyMin, wd.frequencyMax) * Defs.fps);
go = GameObjects.AddObj(0, 0, 0);
go.InitGenerator(wd);
};
};
}
public static function UpdateGameplay():void{
var numUpdates = 1;
if (pause){
return;
};
if (levelState == levelState_Null){
return;
};
if (levelState == levelState_EndScreen){
return;
};
if (levelState == levelState_PreLevelScreen){
return;
};
if (levelState == levelState_Editor){
PhysEditor.UpdateEditor();
return;
};
if (PauseMenu.IsPaused()){
return;
};
if (LevelUpdateCallback != null){
LevelUpdateCallback();
};
if (KeyReader.Pressed(KeyReader.KEY_P)){
if (PauseMenu.IsPaused() == false){
PauseMenu.Pause();
};
};
if (usedebug){
if (KeyReader.Pressed(KeyReader.KEY_SPACE)){
InitLevelState(levelState_Editor);
};
if (KeyReader.Pressed(KeyReader.KEY_1)){
currentWeapon++;
if (currentWeapon >= 8){
currentWeapon = 0;
};
};
if (KeyReader.Pressed(KeyReader.KEY_2)){
Debug.Toggle(2);
};
if (KeyReader.Pressed(KeyReader.KEY_3)){
Debug.debugMode = (Debug.debugMode ^ 1);
};
if (KeyReader.Pressed(KeyReader.KEY_6)){
RealtimeReload();
};
if (KeyReader.Pressed(KeyReader.KEY_7)){
Reload(InitLevel);
};
if (KeyReader.Pressed(KeyReader.KEY_8)){
currentLevel--;
if (currentLevel < 0){
currentLevel = (levels.length - 1);
};
StartLevelPlay();
};
if (KeyReader.Pressed(KeyReader.KEY_9)){
currentLevel++;
if (currentLevel >= levels.length){
currentLevel = 0;
};
StartLevelPlay();
};
};
if (levelState == levelState_EndSection){
levelStateTimer--;
if (levelStateTimer <= 0){
InitLevelState(levelState_Complete);
};
};
if (levelState == levelState_Complete){
levelStateTimer--;
if (levelStateTimer <= 0){
DoEndLevelStuff();
SaveData.Save();
levelState = levelState_Null;
TitleScreenState.InitLevelSelect();
};
};
if (levelState == levelState_Failed){
levelStateTimer--;
if (levelStateTimer <= 0){
levelState = levelState_Null;
TitleScreenState.InitGameOver();
return;
};
};
var u:int;
while (u < numUpdates) {
numCollisionTests = 0;
if ((((((((((levelState == levelState_Play)) || ((levelState == levelState_LevelStart)))) || ((levelState == levelState_Failed)))) || ((levelState == levelState_EndSection)))) || ((levelState == levelState_Failed)))){
GameObjects.Update();
Particles.Update(1);
Collision.Update();
GameObjects.KillObjects();
soundSpectrum = MusicPlayer.GetSpectrum();
UpdateSpectrum();
};
u++;
};
if (levelState == levelState_Play){
levelTimer++;
UpdateLevel();
if (health <= 0){
InitLevelState(levelState_Failed);
};
if (EndLevelFunction()){
InitLevelState(levelState_EndSection);
};
};
}
static function NextLevel():void{
currentLevel++;
if (currentLevel >= levels.length){
currentLevel = 0;
};
StartLevelPlay();
}
public static function InitLevel(){
InitLevel1();
}
static function PanelOverlay_UpdateHealth(){
panelOverlay.health.gotoAndStop((health + 1));
}
static function AddPhysObjAt(objName:String, _x:Number, _y:Number, _rotDeg:Number, instanceName:String="", initParams:String=""):PhysObj_Instance{
var jointxoff:Number;
var jointyoff:Number;
var bd:b2BodyDef;
var b:b2Body;
var pd:b2PolygonDef;
var cd:b2CircleDef;
var i:int;
var jnt:b2Joint;
var body:PhysObj_Body;
var joint:PhysObj_Joint;
var bodyxoff:Number;
var bodyyoff:Number;
var p:Point;
var bud:PhysObj_BodyUserData;
var shape:PhysObj_Shape;
var graphic:PhysObj_Graphic;
var fd:b2FilterData;
var pt:Point;
var x:Number;
var y:Number;
var newpt:Point;
var j0index:int;
var j1index:int;
var jb0:b2Body;
var jb1:b2Body;
var rjd:b2RevoluteJointDef;
var pjd:b2PrismaticJointDef;
var aa:Number;
var axis:b2Vec2;
var djd:b2DistanceJointDef;
var jointxoff1:Number;
var jointyoff1:Number;
var mjd:b2MouseJointDef;
var physobj:PhysObj = physObjs.FindByName(objName);
var instance:PhysObj_Instance = new PhysObj_Instance();
instance.typeName = objName;
instance.x = _x;
instance.y = _y;
instance.rot = _rotDeg;
instance.bodies = new Array();
instance.instanceName = instanceName;
instance.initParams = initParams;
instance.hitballsound = physobj.hitballsound;
physObjInstances.list.push(instance);
instance.Init();
var rot:Number = Utils.DegToRad(_rotDeg);
_x = (_x * w2p);
_y = (_y * w2p);
var m:Matrix = new Matrix();
m.rotate(rot);
for each (body in physobj.bodies) {
bd = new b2BodyDef();
bodyxoff = (body.pos.x * w2p);
bodyyoff = (body.pos.y * w2p);
p = new Point(bodyxoff, bodyyoff);
p = m.transformPoint(p);
bodyxoff = p.x;
bodyyoff = p.y;
bd.position.Set((_x + bodyxoff), (_y + bodyyoff));
bd.angularDamping = body.angularDamping;
bd.linearDamping = body.linearDamping;
bd.angle = rot;
b = world.CreateBody(bd);
bud = new PhysObj_BodyUserData();
bud.type = objName;
bud.bodyName = body.name;
bud.instance = instance;
b.SetUserData(bud);
if (body.graphics.length != 0){
graphic = body.graphics[0];
bud.gameObjectID = InitPhysicsGO(_x, _y, graphic, graphic.graphicID, graphic.frame, 1000);
};
for each (shape in body.shapes) {
fd = new b2FilterData();
fd.categoryBits = shape.collisionCategory;
fd.maskBits = shape.collisionMask;
if (shape.type == PhysObj_Shape.Type_Poly){
pd = new b2PolygonDef();
pd.vertexCount = shape.poly_points.length;
pd.filter = fd;
pd.isSensor = body.sensor;
i = 0;
while (i < shape.poly_points.length) {
pt = shape.poly_points[i].clone();
x = (pt.x * w2p);
y = (pt.y * w2p);
if (body.fixed){
newpt = AlignWithPreviousVerts(x, y, _x, _y, rot);
if (newpt != null){
x = (x + newpt.x);
y = (y + newpt.y);
};
};
pd.vertices[i].Set(x, y);
i++;
};
pd.friction = shape.friction;
pd.restitution = shape.restitution;
pd.density = shape.density;
b.CreateShape(pd);
} else {
if (shape.type == PhysObj_Shape.Type_Circle){
cd = new b2CircleDef();
cd.radius = (shape.circle_radius * w2p);
cd.filter = fd;
cd.isSensor = body.sensor;
cd.localPosition.x = shape.circle_pos.x;
cd.localPosition.y = shape.circle_pos.y;
cd.friction = shape.friction;
cd.restitution = shape.restitution;
cd.density = shape.density;
b.CreateShape(cd);
};
};
};
if (body.fixed){
b.PutToSleep();
b.SetMass(new b2MassData());
} else {
b.SetMassFromShapes();
b.SetBullet(true);
};
instance.bodies.push(b);
};
for each (joint in physobj.joints) {
j0index = physobj.BodyIndexFromName(joint.obj0Name);
j1index = physobj.BodyIndexFromName(joint.obj1Name);
jb0 = instance.bodies[j0index];
jb1 = instance.bodies[j1index];
if (joint.type == PhysObj_Joint.Type_Rev){
rjd = new b2RevoluteJointDef();
jointxoff = (joint.rev_pos.x * w2p);
jointyoff = (joint.rev_pos.y * w2p);
p = new Point(jointxoff, jointyoff);
p = m.transformPoint(p);
jointxoff = p.x;
jointyoff = p.y;
rjd.Initialize(jb0, jb1, new b2Vec2((_x + jointxoff), (_y + jointyoff)));
rjd.enableLimit = joint.rev_enableLimit;
rjd.lowerAngle = joint.rev_lowerAngle;
rjd.upperAngle = joint.rev_upperAngle;
rjd.enableMotor = joint.rev_enableMotor;
rjd.motorSpeed = joint.rev_motorSpeed;
rjd.maxMotorTorque = joint.rev_maxMotorTorque;
rjd.collideConnected = false;
jnt = world.CreateJoint(rjd);
};
if (joint.type == PhysObj_Joint.Type_Prismatic){
pjd = new b2PrismaticJointDef();
jointxoff = (joint.prism_pos.x * w2p);
jointyoff = (joint.prism_pos.y * w2p);
p = new Point(jointxoff, jointyoff);
p = m.transformPoint(p);
jointxoff = p.x;
jointyoff = p.y;
aa = Utils.DegToRad(joint.prism_axisangle);
aa = (aa + rot);
axis = new b2Vec2(Math.cos(aa), Math.sin(aa));
pjd.Initialize(jb0, jb1, new b2Vec2((_x + jointxoff), (_y + jointyoff)), axis);
pjd.enableLimit = joint.prism_enableLimit;
pjd.lowerTranslation = (joint.prism_lowerTranslation * w2p);
pjd.upperTranslation = (joint.prism_upperTranslation * w2p);
pjd.enableMotor = joint.prism_enableMotor;
pjd.motorSpeed = joint.prism_motorSpeed;
pjd.maxMotorForce = joint.prism_maxMotorForce;
pjd.collideConnected = false;
jnt = world.CreateJoint(pjd);
};
if (joint.type == PhysObj_Joint.Type_Distance){
djd = new b2DistanceJointDef();
jointxoff = (joint.dist_pos0.x * w2p);
jointyoff = (joint.dist_pos0.y * w2p);
jointxoff1 = (joint.dist_pos1.x * w2p);
jointyoff1 = (joint.dist_pos1.y * w2p);
p = new Point(jointxoff, jointyoff);
p = m.transformPoint(p);
jointxoff = p.x;
jointyoff = p.y;
p = new Point(jointxoff1, jointyoff1);
p = m.transformPoint(p);
jointxoff1 = p.x;
jointyoff1 = p.y;
djd.Initialize(jb0, jb1, new b2Vec2((_x + jointxoff), (_y + jointyoff)), new b2Vec2((_x + jointxoff1), (_y + jointyoff1)));
djd.length = (djd.length + (joint.dist_distance * w2p));
djd.dampingRatio = 0.1;
djd.collideConnected = false;
jnt = world.CreateJoint(djd);
};
if (joint.type == PhysObj_Joint.Type_Mouse){
mjd = new b2MouseJointDef();
mjd.target.Set(jb0.GetPosition().x, jb0.GetPosition().y);
mjd.body1 = world.GetGroundBody();
mjd.body2 = jb0;
mjd.maxForce = (30000 * jb0.GetMass());
mjd.dampingRatio = 0.7;
mjd.frequencyHz = 10;
mjd.timeStep = (1 / 60);
jnt = world.CreateJoint(mjd);
mouseJoint = (jnt as b2MouseJoint);
};
instance.joints.push(jnt);
};
return (instance);
}
static function RenderRangeCircle1(r:SpecRange){
var x0:Number;
var y0:Number;
var x1:Number;
var y1:Number;
var current:Number;
var rad1:Number;
var rv:Number;
var pos:int;
var col:uint;
var colorBD:BitmapData = GraphicObjects.GetBitmapData(GraphicObjects.GetIndexByName("SpectrumGradient"), 0);
var colorBDwidth:int = colorBD.width;
var g:Graphics = main.fillScreenMC.graphics;
var bd:BitmapData = main.screenBD;
var fullang:Number = (Math.PI * 2);
var dr:Number = (fullang / r.amt);
var xmul:Number = (640 / 480);
var rad:Number = 230;
var cx:Number = 320;
var cy:Number = 240;
var d:Number = 0;
d = circleOffset;
var i:int;
while (i < r.max) {
current = r.values[i];
x0 = (cx + ((Math.cos(d) * rad) * xmul));
y0 = (cy + (Math.sin(d) * rad));
rad1 = (rad - (current * 60));
x1 = (cx + ((Math.cos(d) * rad1) * xmul));
y1 = (cy + (Math.sin(d) * rad1));
rv = (0.5 + (current / 2));
pos = Utils.ScaleTo(0, (colorBDwidth - 1), 0, 1, current);
col = colorBD.getPixel32(pos, 0);
RenderLine(g, x0, y0, x1, y1, col, 5, 1);
d = (d + dr);
i = (i + 1);
};
}
static function InitButtons(){
var buttonLogo:SimpleButton;
var buttonRestart:SimpleButton;
}
static function InitWave(index:int){
var wave:GruntWave = GetWave(currentWave);
wave.Activate();
}
public static function InitBullet(goFirer:GameObj, wi:WeaponTypeItem, ang:Number){
var bulletGO:GameObj = GameObjects.AddObj(goFirer.xpos, goFirer.ypos, 0);
bulletGO.weaponTypeItem = wi;
bulletGO.health = wi.health;
var _local5 = bulletGO;
_local5[wi.initFunctionName](wi, goFirer, ang);
bulletGO.graphicID = GraphicObjects.GetIndexByName(wi.mcName);
}
static function GetLastStartPoint(xpos:Number):Point{
var p:Point;
var pp:Point = startPoints[0];
var x:Number = -1000;
for each (p in startPoints) {
if (p.x < xpos){
if (p.x > x){
x = p.x;
pp = p;
};
};
};
return (pp);
}
static function RenderRectangle(g:Graphics, r:Rectangle, col:uint, thickness:Number=1, alpha:Number=1){
RenderLine(g, r.left, r.top, r.right, r.top, col, thickness, alpha);
RenderLine(g, r.left, r.bottom, r.right, r.bottom, col, thickness, alpha);
RenderLine(g, r.left, r.top, r.left, r.bottom, col, thickness, alpha);
RenderLine(g, r.right, r.top, r.right, r.bottom, col, thickness, alpha);
}
static function CreatePhysObjInstanceAt(objName:String, _x:Number, _y:Number, _rotDeg:Number, instanceName:String="", params:String=""):PhysObj_Instance{
var instance:PhysObj_Instance = new PhysObj_Instance();
instance.typeName = objName;
instance.x = _x;
instance.y = _y;
instance.rot = _rotDeg;
instance.bodies = new Array();
instance.instanceName = instanceName;
instance.initParams = params;
return (instance);
}
public static function GetGruntDefByName(name:String):GruntDef{
var gd:GruntDef;
for each (gd in gruntDefs) {
if (gd.name == name){
return (gd);
};
};
return (null);
}
static function GeneratePickup(x:Number, y:Number){
var go:GameObj;
go = GameObjects.AddObj(x, y, 0);
go.InitPickup();
}
public static function InitLevel1(){
InitLevel2();
}
public static function InitLevel2(){
var go:GameObj;
KeyReader.InitOnce(main.stage);
Particles.Reset();
ObjectDefs.Init();
GameObjects.ClearAll();
scrollX = 0;
scrollY = 0;
LevelUpdateCallback = null;
scrollW = 10000;
scrollH = 1000;
scrollMaxX = (scrollW - Defs.displayarea_w);
scrollMaxY = (scrollH - Defs.displayarea_h);
gravity = 0.2;
maxFallSpeed = 6;
polygonList = new Array();
startPoints = new Array();
levelTimer = 0;
scrollAcc = 0.01;
scrollVel = 0;
scrollMaxVel = 2;
pause = false;
StartLevelPlay();
}
static function UpdateMouseControl(){
var oldX:Number = cursorX;
var oldY:Number = cursorY;
cursorX = (cursorX + ((MouseControl.x - cursorX) * 0.4));
cursorY = (cursorY + ((MouseControl.y - cursorY) * 0.4));
}
static function EndLevelFunction():Boolean{
var l:Level = GetCurrentLevel();
if (l.endLevelTestFunctionName == ""){
return (false);
};
return (main[l.endLevelTestFunctionName]());
}
public static function AddScore(sc:int):void{
PanelOverlay_UpdateScore();
currentScore = (currentScore + sc);
}
static function ExamineBox2D():void{
var i:int;
var b:b2Body;
var _local3:b2Vec2;
return;
}
static function SetGameObjsAfterReload(){
var go:GameObj;
for each (go in GameObjects.objs) {
if (((go.active) && (!((go.reloadFunction == null))))){
go.reloadFunction();
};
};
}
static function RealtimeReloadDone(){
LoadLevels();
LoadWeapons();
LoadGruntDefs();
LoadTowerDefs();
SetGameObjsAfterReload();
}
static function NextWave(){
currentWave++;
if (currentWave >= waves.length){
currentWave = (waves.length - 1);
};
InitWave(currentWave);
}
static function RenderCursor(){
}
public static function StartLevelPlay():void{
var go:GameObj;
var wi:WeaponTypeItem;
KeyReader.InitOnce(main.stage);
main.InitStageForGame();
var l:Level = GetCurrentLevel();
startPoints = new Array();
Particles.Reset();
previousStaticPoints = new Array();
mouseJoint = null;
GameObjects.ClearAll();
goPlayer = GameObjects.AddObj(400, 400, 1000);
goPlayer.InitPlayer();
InitLevelState(levelState_LevelStart);
var x:Number = 100;
var y:Number = 100;
if (startPoints.length != 0){
x = GetInitialStartPoint().x;
y = GetInitialStartPoint().y;
};
pause = false;
pauseGameplayInput = false;
levelTimer = 0;
scrollCX = 0;
scrollCY = 0;
scrollToCX = 0;
scrollToCY = 0;
levelScore = 0;
currentWave = 0;
InitSpectrum();
numPickupsCollected = 0;
numPickupsNeeded = l.numAntibodiesNeeded;
numEnemiesNeeded = l.numEnemiesNeeded;
smartBombActive = false;
main.addChild(smartBombClip);
smartBombClip.visible = false;
var smartBombWeaponIndex:int = GetWeaponTypeIndexByName("SmartBomb");
var wt:WeaponType = weapons[smartBombWeaponIndex];
for each (wi in wt.items) {
smartBombBullet = new GameObj(0);
smartBombBullet.Init(0);
smartBombBullet.weaponTypeItem = wi;
smartBombBullet.health = wi.health;
var _local10 = smartBombBullet;
_local10[wi.initFunctionName](wi, null, 0);
};
generatorGenTimer = 0;
bossKilled = false;
numLevelEnemiesKilled = 0;
isBossLevel = false;
bossGenerated = false;
if (l.endLevelTestFunctionName == "EndLevel_Boss"){
isBossLevel = true;
};
panelOverlay.gotoAndStop(1);
main.addChild(panelOverlay);
PanelOverlay_UpdateScore();
PanelOverlay_UpdateHealth();
PanelOverlay_UpdateCash();
PanelOverlay_UpdateKills();
panelOverlay.kills.visible = true;
panelOverlay.bossHealth.visible = false;
if (GetCurrentLevel().endLevelTestFunctionName == "EndLevel_Boss"){
panelOverlay.kills.visible = false;
panelOverlay.bossHealth.visible = true;
};
numGruntsActive = 0;
InitLevelState(levelState_PreLevelScreen);
InitBackgroundBitmaps();
}
static function InitMessage(_message:String, x:Number=320, y:Number=100){
var go:GameObj;
go = GameObjects.AddObj(0, 0, 100);
go.InitTextMessage(_message, x, y);
}
public static function InitLevelState(s:int){
levelState = s;
levelStateTimer = 0;
if (levelState == levelState_PreLevelScreen){
TitleScreenState.InitPreLevelStoryScreen();
};
if (levelState == levelState_LevelStart){
levelState = levelState_Play;
};
if (levelState == levelState_Failed){
levelStateTimer = (Defs.fps * 3);
};
if (levelState == levelState_EndSection){
levelStateTimer = (levelStateTimerMax = (Defs.fps * 5));
goPlayer.flashTimer = 10000;
};
if (levelState == levelState_Complete){
levelStateTimer = (levelStateTimerMax = (Defs.fps * 4));
TitleScreenState.InitLevelCompleteAnim();
smartBombTimer = 0;
smartBombActive = false;
smartBombClip.visible = false;
};
if (levelState == levelState_EndScreen){
};
if (levelState == levelState_Play){
raceTimer = 0;
};
if (levelState == levelState_Editor){
PhysEditor.InitEditor();
PhysEditor.currentLevel = currentLevel;
};
}
static function LevelFailed(){
InitLevelState(levelState_Null);
TitleScreenState.InitLevelFailScreen();
}
public static function LoadWeapon(l:int){
var xi:XML;
var wi:WeaponTypeItem;
var x:XML = ExternalData.xml;
x = x.weapons.weapon[l];
var w:WeaponType = new WeaponType();
w.name = XmlHelper.GetAttrString(x.@name, "undefined");
var num:* = x.item.length();
var i:int;
while (i < num) {
xi = x.item[i];
wi = new WeaponTypeItem();
wi.initFunctionName = XmlHelper.GetAttrString(xi.@initfunc, "");
wi.mcName = XmlHelper.GetAttrString(xi.@mc, "");
wi.hp = XmlHelper.GetAttrNumber(xi.@hp, 1);
wi.dir = Utils.DegToRad(XmlHelper.GetAttrNumber(xi.@dir, 0));
wi.speed = XmlHelper.GetAttrNumber(xi.@speed, 1);
wi.absoluteDir = XmlHelper.GetAttrBoolean(xi.@absdir, false);
wi.health = XmlHelper.GetAttrNumber(xi.@health, 1);
wi.oneShotWidth = XmlHelper.GetAttrNumber(xi.@width, 10);
wi.oneShotLength = XmlHelper.GetAttrNumber(xi.@length, 10);
wi.frequency = XmlHelper.GetAttrNumber(xi.@freq, 5);
w.items.push(wi);
i++;
};
weapons.push(w);
}
public static function InitBackgroundBitmaps():void{
var i:int;
var bd:BitmapData;
var so:Number;
backgroundBitmaps = new Array();
var gfxID:int = GraphicObjects.GetIndexByName("levelBackgrounds");
var lf:int = (currentLevel / 3);
if (lf > 7){
lf = 7;
};
var w = 640;
var h = 480;
i = 0;
while (i < 10) {
bd = new BitmapData(w, h, true, 0);
so = Utils.ScaleTo(0, 0.2, 0, 9, i);
so = (1 + so);
GraphicObjects.RenderAtRotScaled(gfxID, lf, bd, 320, 240, so);
backgroundBitmaps.push(bd);
i++;
};
}
public static function Continue():void{
health = 5;
StartLevelPlay();
}
public static function InitLevelPlayFromEditorObjects(){
var inst:PhysObj_Instance;
zsortoffset = 0;
level_instances = GetCurrentLevelInstances();
for each (inst in level_instances) {
AddPhysObjAt(inst.typeName, inst.x, inst.y, inst.rot, inst.instanceName, inst.initParams);
zsortoffset = (zsortoffset + 0.01);
};
}
static function RenderLine(g:Graphics, x0:Number, y0:Number, x1:Number, y1:Number, col:uint, thickness:Number=1, alpha:Number=1){
g.lineStyle(thickness, col, alpha);
g.moveTo(x0, y0);
g.lineTo(x1, y1);
}
static function RestartLevel():void{
StartLevelPlay();
}
static function RenderRangeCircle(r:SpecRange){
var x0:Number;
var y0:Number;
var x1:Number;
var y1:Number;
var oldr:Array;
var oldr1:Array;
var i:int;
var j:int;
var k:int;
var alpha:Number;
var d:Number;
var current:Number;
var rad1:Number;
var rv:Number;
var pos:int;
var col:uint;
var colorBD:BitmapData = GraphicObjects.GetBitmapData(GraphicObjects.GetIndexByName("SpectrumGradient"), 0);
var colorBDwidth:int = colorBD.width;
var g:Graphics = main.fillScreenMC.graphics;
var bd:BitmapData = main.screenBD;
var fullang:Number = (Math.PI * 2);
var dr:Number = (fullang / (r.amt - 1));
var xmul:Number = (640 / 480);
var rad:Number = 240;
var cx:Number = 320;
var cy:Number = 240;
var w = 2;
while (w >= 0) {
j = w;
if (j >= 4){
j = (j - 4);
};
k = (j + 1);
if (k >= 4){
k = (k - 4);
};
oldr = oldRanges[j];
oldr1 = oldRanges[k];
i = 0;
while (i <= r.max) {
oldr1[i] = oldr[i];
i = (i + 1);
};
w--;
};
oldr = oldRanges[0];
i = 0;
while (i <= r.max) {
oldr[i] = r.values[i];
i = (i + 1);
};
var cols:Array = new Array();
cols.push(0xFF0000);
cols.push(0xFFFF00);
cols.push(0xFF00);
cols.push(0xFF);
w = 2;
while (w >= 0) {
oldr = oldRanges[w];
alpha = (0.6 - (Number(w) * 0.1));
d = 0;
d = circleOffset;
g.lineStyle((1 + w), cols[w], alpha);
i = 0;
while (i <= r.max) {
j = (i % r.max);
current = oldr[j];
rad1 = (rad - (current * 60));
x1 = (cx + ((Math.cos(d) * rad1) * xmul));
y1 = (cy + (Math.sin(d) * rad1));
rv = (0.5 + (current / 2));
pos = Utils.ScaleTo(0, (colorBDwidth - 1), 0, 1, current);
col = colorBD.getPixel32(pos, 0);
if (i == 0){
g.moveTo(x1, y1);
} else {
g.lineTo(x1, y1);
};
d = (d + dr);
i = (i + 1);
};
w--;
};
}
public static function LoadGruntDef(l:int){
var a:Array;
var i:int;
var sdx:XML;
var sd:ShotDef;
var x:XML = ExternalData.xml;
x = x.gruntdefs.grunt[l];
var g:GruntDef = new GruntDef();
g.name = XmlHelper.GetAttrString(x.@name, "");
g.movieClipName = XmlHelper.GetAttrString(x.@mc, "");
g.hp = XmlHelper.GetAttrNumber(x.@hp, 1);
g.speed = XmlHelper.GetAttrNumber(x.@speed, 1);
g.cash = XmlHelper.GetAttrNumber(x.@cash, 1);
g.initFuncName = XmlHelper.GetAttrString(x.control.@func, "");
g.turnSpeed = XmlHelper.GetAttrNumber(x.control.@turnspeed, 0.1);
g.burstTime = XmlHelper.GetAttrNumber(x.control.@bursttime, 1);
g.isboss = XmlHelper.GetAttrBoolean(x.control.@isboss, false);
var numShotDefs:int = x.shot.length();
i = 0;
while (i < numShotDefs) {
sdx = x.shot[i];
sd = new ShotDef();
a = Utils.PointArrayFromString(XmlHelper.GetAttrString(sdx.@delaytime, "0,0"));
sd.timeMin = (a[0].x * Defs.fps);
sd.timeMax = (a[0].y * Defs.fps);
sd.numShots = XmlHelper.GetAttrNumber(sdx.@numshots, 1);
sd.shotFrequency = (XmlHelper.GetAttrNumber(sdx.@shotfrequency, 10) * Defs.fps);
sd.numBullets = XmlHelper.GetAttrNumber(sdx.@numbullets, 1);
sd.spread = Utils.DegToRad(XmlHelper.GetAttrNumber(sdx.@spread, 1));
sd.fixedangle = Utils.DegToRad(XmlHelper.GetAttrNumber(sdx.@fixedangle, -1));
sd.speed = XmlHelper.GetAttrNumber(sdx.@speed, 5);
sd.initialDelay = (XmlHelper.GetAttrNumber(sdx.@initialdelay, 0) * Defs.fps);
g.shotDefs.push(sd);
i++;
};
gruntDefs.push(g);
}
static function GetTowerUnderCursor():GameObj{
var go:GameObj;
var d2:Number;
var x:Number = MouseControl.x;
var y:Number = MouseControl.y;
for each (go in GameObjects.objs) {
if (((go.active) && (go.colFlag_isTower))){
d2 = (30 * 30);
if (Utils.Dist2BetweenPoints(x, y, go.xpos, go.ypos) < d2){
return (go);
};
};
};
return (null);
}
static function UpdateGOsFromPhysics():void{
var go:GameObj;
var b:b2Body;
var bud:PhysObj_BodyUserData;
var index:int;
var pos:b2Vec2;
var d:Number;
var m:Number = p2w;
b = world.GetBodyList();
while (b) {
bud = (b.GetUserData() as PhysObj_BodyUserData);
if (bud != null){
index = bud.gameObjectID;
if (index != -1){
pos = b.GetPosition();
d = b.GetAngle();
go = GameObjects.objs[index];
go.xpos = ((pos.x * m) + go.physObjOffsetX);
go.ypos = ((pos.y * m) + go.physObjOffsetY);
go.dir = d;
};
};
b = b.GetNext();
};
}
public static function GetWeapon(index:int):WeaponType{
if (index < 0){
return (null);
};
if (index >= weapons.length){
return (null);
};
return (weapons[index]);
}
static function UpdateShakeCam(speed:Number):void{
var dist:Number;
shakeCamTimer--;
if (shakeCamTimer <= 0){
shakeCamTimer = Utils.RandBetweenInt(5, 20);
shakeCamTimerMax = shakeCamTimer;
dist = Utils.ScaleTo(2, 20, 0, 30, speed);
shakeCamToX = Utils.RandBetweenFloat(-(dist), dist);
shakeCamToY = Utils.RandBetweenFloat(-(dist), dist);
shakeCamDX = ((shakeCamToX - shakeCamX) / shakeCamTimer);
shakeCamDY = ((shakeCamToY - shakeCamY) / shakeCamTimer);
};
shakeCamX = (shakeCamX + shakeCamDX);
shakeCamY = (shakeCamY + shakeCamDY);
}
static function InitPanelOverlay(){
panelOverlay = new hud();
panelOverlay.cacheAsBitmap = true;
TitleScreenState.AddButton(panelOverlay.controls.ButtonPause, PanelOverlay_ButtonPausePressed);
panelOverlay.cacheAsBitmap = true;
}
public static function LoadGruntDefs(){
gruntDefs = new Array();
var x:XML = ExternalData.xml;
var num:* = x.gruntdefs.grunt.length();
var i:int;
while (i < num) {
LoadGruntDef(i);
i++;
};
}
static function InitFloor(){
var bd:b2BodyDef;
var b:b2Body;
var pd:b2PolygonDef;
var p:Point;
var p0:Point;
var p1:Point;
var p2:Point;
var p3:Point;
var i:int;
var line:PhysLine;
var points:Array;
var linetype:int;
var j:int;
var ang:Number;
var dist:Number;
var dx:Number;
var dy:Number;
var ud:PhysObj_BodyUserData = new PhysObj_BodyUserData();
var height:Number = 50;
var l:Level = GetCurrentLevel();
var fd:b2FilterData = new b2FilterData();
fd.categoryBits = 1;
fd.maskBits = 15;
var fd1:b2FilterData = new b2FilterData();
fd1.categoryBits = 2;
fd1.maskBits = 2;
for each (line in l.lines) {
points = line.points;
linetype = line.type;
if (linetype <= 0){
if (points.length >= 2){
i = 0;
while (i < points.length) {
p0 = points[i].clone();
j = (i + 1);
j = (j % points.length);
p1 = points[j].clone();
p2 = p1.clone();
p3 = p0.clone();
ang = Math.atan2((p1.y - p0.y), (p1.x - p0.x));
ang = (ang + (Math.PI / 2));
dist = 5;
dx = (Math.cos(ang) * dist);
dy = (Math.sin(ang) * dist);
p2.x = (p2.x + dx);
p2.y = (p2.y + dy);
p3.x = (p3.x + dx);
p3.y = (p3.y + dy);
bd = new b2BodyDef();
bd.position.Set(0, 0);
b = world.CreateBody(bd);
if (b != null){
pd = new b2PolygonDef();
pd.filter = fd;
if (linetype == 1){
pd.filter = fd1;
};
pd.vertexCount = 4;
pd.vertices[0].Set((p0.x * w2p), (p0.y * w2p));
pd.vertices[1].Set((p1.x * w2p), (p1.y * w2p));
pd.vertices[2].Set((p2.x * w2p), (p2.y * w2p));
pd.vertices[3].Set((p3.x * w2p), (p3.y * w2p));
pd.friction = 1;
if (linetype == 1){
pd.friction = 0;
};
pd.restitution = 0.2;
pd.density = 1;
b.CreateShape(pd);
b.SetUserData(ud);
};
i++;
};
};
};
};
}
static function RealtimeReload(){
ExternalData.Load(RealtimeReloadDone);
}
static function InitPhysicsFloorGO(_id:int, _x:Number, _y:Number, _rot:Number):int{
var go:GameObj;
go = GameObjects.AddObj(_x, _y, 1000);
go.InitPhysicsFloorObject(_id, _rot);
return (GameObjects.lastGenIndex);
}
static function DeSelectAllTowers(){
var go:GameObj;
for each (go in GameObjects.objs) {
if (((go.active) && (go.colFlag_isTower))){
go.SetSelected(false);
};
};
}
static function UpdateScroll(){
scrollCX = (scrollCX + ((scrollToCX - scrollCX) * 0.1));
scrollCY = (scrollCY + ((scrollToCY - scrollCY) * 0.1));
scrollScale = (scrollScale + ((scrollToScale - scrollScale) * 0.1));
var w:Number = (Defs.displayarea_w / 2);
var h:Number = (Defs.displayarea_h / 2);
var w1:Number = ((w * 1) / scrollScale);
var h1:Number = ((h * 1) / scrollScale);
var x:Number = (scrollCX - w1);
var y:Number = (scrollCY - h1);
scrollX = x;
scrollY = y;
var ww:Number = (2000 - (Defs.displayarea_w * (1 / scrollScale)));
var hh:Number = (1200 - (Defs.displayarea_h * (1 / scrollScale)));
if (scrollX <= 0){
scrollX = 0;
};
if (scrollY <= 0){
scrollY = 0;
};
if (scrollX >= ww){
scrollX = ww;
};
if (scrollY >= hh){
scrollY = hh;
};
}
static function GetGruntInRange(x:Number, y:Number, rad:Number):GameObj{
var go:GameObj;
rad = (rad * rad);
for each (go in GameObjects.objs) {
if (((go.active) && (go.colFlag_isEnemy))){
if (Utils.Dist2BetweenPoints(x, y, go.xpos, go.ypos) < rad){
return (go);
};
};
};
return (null);
}
public static function LoadWave(l:int){
var xi:XML;
var wg:GruntWaveGroup;
var x:XML = ExternalData.xml;
x = x.waves.wave[l];
var w:GruntWave = new GruntWave();
var num:* = x.group.length();
var i:int;
while (i < num) {
xi = x.group[i];
wg = new GruntWaveGroup();
wg.startDelay = (XmlHelper.GetAttrNumber(xi.@delay, 1) * Defs.fps);
wg.genGap = (XmlHelper.GetAttrNumber(xi.@gap, 1) * Defs.fps);
wg.gruntName = XmlHelper.GetAttrString(xi.@grunt, "");
wg.genCount = XmlHelper.GetAttrNumber(xi.@count, 1);
wg.genCount = XmlHelper.GetAttrNumber(xi.@count, 1);
wg.generateFunction = InitGruntCallback;
w.waveGroups.push(wg);
i++;
};
waves.push(w);
}
static function DoEndLevelStuff(){
var l:Level = GetCurrentLevel();
l.complete = true;
l.lastTime = levelTimer;
l.score = levelScore;
if (l.score >= l.bestScore){
l.bestScore = l.score;
};
l = GetLevel((currentLevel + 1));
if (l != null){
l.available = true;
};
var completeCount:int;
for each (l in levels) {
if (l.complete){
completeCount++;
};
};
if (completeCount >= levels.length){
endMovieUnlocked = true;
};
}
static function PanelOverlay_ButtonPausePressed(e:MouseEvent){
if (PauseMenu.IsPaused() == false){
PauseMenu.Pause();
};
}
public static function Init(_main:Main, doLoad:Boolean=true){
main = _main;
currentScore = 0;
multiplier = 1;
numLevels = 8;
currentLevel = 0;
LoadLevels();
LoadWaves();
LoadWeapons();
LoadGruntDefs();
LoadTowerDefs();
if (doLoad){
endMovieUnlocked = false;
SaveData.Load();
};
smartBombClip = new daveSmartAnim();
currentWeapon = 0;
numBombs = 1;
difficulty = 1;
InitPanelOverlay();
}
static function PanelOverlay_UpdateScore(){
panelOverlay.score.score.text = currentScore;
}
public static function InitGame(){
Debug.debugMode = 0;
numLives = 3;
Shop.InitOnce();
polygonList = new Array();
startPoints = new Array();
currentStartPointIndex = 0;
pause = true;
cash = 0;
currentGameMusic = 1;
numEnemiesKilled = 0;
Player.InitOnce();
health = 5;
currentScore = 0;
}
public static function LoadWaves(){
waves = new Array();
var x:XML = ExternalData.xml;
var num:* = x.waves.wave.length();
var i:int;
while (i < num) {
LoadWave(i);
i++;
};
}
static function RenderBox2D():void{
var i:int;
var b:b2Body;
var s:b2Shape;
var bPos:b2Vec2;
var bAng:Number;
var type:*;
var polygonShape:b2PolygonShape;
var verts:Array;
var numVerts:int;
var j:int;
var v0:b2Vec2;
var v1:b2Vec2;
var mat:Matrix;
var p0:Point;
var p1:Point;
var circleShape:b2CircleShape;
var r:Number;
if (Debug.IsSet(1) == false){
return;
};
var sx:Number = scrollX;
var sy:Number = scrollY;
var m:Number = p2w;
b = world.GetBodyList();
while (b) {
bPos = b.GetPosition();
bAng = b.GetAngle();
s = b.GetShapeList();
while (s) {
type = s.GetType();
if (type == b2Shape.e_polygonShape){
polygonShape = b2PolygonShape(s);
verts = polygonShape.GetVertices();
numVerts = polygonShape.GetVertexCount();
i = 0;
while (i < numVerts) {
j = (i + 1);
if (j >= numVerts){
j = 0;
};
v0 = verts[i].Copy();
v1 = verts[j].Copy();
mat = new Matrix();
mat.rotate(bAng);
p0 = new Point(v0.x, v0.y);
p1 = new Point(v1.x, v1.y);
p0 = mat.transformPoint(p0);
p1 = mat.transformPoint(p1);
v0.x = p0.x;
v0.y = p0.y;
v1.x = p1.x;
v1.y = p1.y;
v0.Add(bPos);
v1.Add(bPos);
Utils.RenderDotLine(main.scrollScreenBD, ((v0.x * m) - sx), ((v0.y * m) - sy), ((v1.x * m) - sx), ((v1.y * m) - sy), 50, 4294967295);
i++;
};
};
if (type == b2Shape.e_circleShape){
circleShape = b2CircleShape(s);
r = (circleShape.GetRadius() * m);
Utils.RenderCircle(main.scrollScreenBD, ((bPos.x * m) - sx), ((bPos.y * m) - sy), r, 4294967295);
};
s = s.GetNext();
};
b = b.GetNext();
};
}
static function InitSpectrum(){
var r:Array;
specRanges = new Array();
specRanges.push(new SpecRange(0, 64, 0.5, 4));
oldRanges = new Array();
oldRanges.push(new Array(128));
oldRanges.push(new Array(128));
oldRanges.push(new Array(128));
oldRanges.push(new Array(128));
currentOldRange = 0;
}
static function GetWave(index:int):GruntWave{
return (waves[index]);
}
public static function LoadTowerDefs(){
towerDefs = new Array();
var x:XML = ExternalData.xml;
var num:* = x.towers.tower.length();
var i:int;
while (i < num) {
LoadTowerDef(i);
i++;
};
}
static function InitGruntCallback(gruntType:String){
var go:GameObj;
var gd:GruntDef = GetGruntDefByName(gruntType);
if (gd != null){
go = GameObjects.AddObj(0, 0, 0);
go.InitGrunt(gd);
};
}
public static function LoadTowerDef(l:int){
var i:int;
var xi:XML;
var tdw:TowerDefWeapon;
var tdr:TowerDefRadius;
var radius:int;
var x:XML = ExternalData.xml;
x = x.towers.tower[l];
var td:TowerDef = new TowerDef();
td.name = XmlHelper.GetAttrString(x.@name, "");
td.price = XmlHelper.GetAttrNumber(x.@price, 1);
td.weapons = new Array();
var num:int = x.weapon.length();
i = 0;
while (i < num) {
xi = x.weapon[i];
tdw = new TowerDefWeapon();
tdw.name = XmlHelper.GetAttrString(xi.@name, "");
tdw.price = XmlHelper.GetAttrNumber(xi.@price, 1);
td.weapons.push(tdw);
i++;
};
num = x.radius.length();
i = 0;
while (i < num) {
tdr = new TowerDefRadius();
xi = x.radius[i];
radius = int(XmlHelper.GetAttrNumber(xi.@val, 1));
tdr.radius = radius;
tdr.price = XmlHelper.GetAttrNumber(xi.@price, 1);
td.radii.push(tdr);
i++;
};
towerDefs.push(td);
}
static function AlignWithPreviousVerts(x:Number, y:Number, x1:Number, y1:Number, rot:Number):Point{
var p:Point;
var dx:Number;
var dy:Number;
var m:Matrix = new Matrix();
m.rotate(rot);
var p1:Point = new Point(x, y);
p1 = m.transformPoint(p1);
p1.x = (p1.x + x1);
p1.y = (p1.y + y1);
var d:Number = (2 * w2p);
for each (p in previousStaticPoints) {
if (Math.abs((p.x - p1.x)) < d){
if (Math.abs((p.y - p1.y)) < d){
dx = (p.x - p1.x);
dy = (p.y - p1.y);
return (new Point(dx, dy));
};
};
};
previousStaticPoints.push(p1.clone());
return (null);
}
public static function AddCash(c:int):void{
PanelOverlay_UpdateCash();
cash = (cash + c);
}
static function PanelOverlay_UpdateKills(){
var s:int = (numEnemiesNeeded - numLevelEnemiesKilled);
if (s < 0){
s = 0;
};
panelOverlay.kills.num.text = s.toString();
}
static function GenerateGrunt(x:Number, y:Number, gd:GruntDef){
var go:GameObj;
if (gd != null){
go = GameObjects.AddObj(x, y, 0);
go.InitGrunt(gd);
};
}
static function GetCurrentLevelInstances():Array{
return (levels[currentLevel].instances);
}
static function MutePressed(e:MouseEvent){
SoundPlayer.ToggleMute();
MusicPlayer.ToggleMute();
if (SoundPlayer.doSFX){
buttonMute.gotoAndStop(1);
} else {
buttonMute.gotoAndStop(2);
};
}
public static function PreLevelScreenDone():void{
SoundPlayer.Play("sfx_readytoplay", 2);
MusicPlayer.StartStream((currentGameMusic + 1));
currentGameMusic++;
if (currentGameMusic >= 6){
currentGameMusic = 0;
};
InitLevelState(levelState_Play);
Mouse.hide();
}
static function Render(){
var gfxid:int;
var numf:int;
var px:Number;
var x:int;
var y:int;
var g:Graphics;
var amt:int;
if (pause){
return;
};
if (levelState == levelState_EndScreen){
return;
};
if (levelState == levelState_Null){
return;
};
if (levelState == levelState_PreLevelScreen){
return;
};
if (levelState == levelState_Editor){
g = main.fillScreenMC.graphics;
g.clear();
PhysEditor.RenderEditor();
return;
};
var bd:BitmapData = main.screenBD;
var level:Level = GetCurrentLevel();
g = main.fillScreenMC.graphics;
g.clear();
var so:int = Utils.ScaleToLimit(0, 9, 0, 0.6, soundLevel);
var backBD:BitmapData = backgroundBitmaps[int(so)];
bd.copyPixels(backBD, Defs.screenRect, Defs.pointZero);
RenderGOs_A(bd);
RenderSpectrum();
bd.draw(main.fillScreenMC);
RenderGOs_B(bd);
Particles.Render(bd);
if (levelState == levelState_Complete){
amt = Utils.ScaleTo(0, 0xFF, levelStateTimerMax, 0, levelStateTimer);
bd.colorTransform(Defs.screenRect, new ColorTransform(1, 1, 1, 1, -(amt), -(amt), -(amt), 0));
};
RenderPanel();
}
static function RenderGOs_B(bd:BitmapData){
var go:GameObj;
for each (go in goList) {
if (go.zpos < 1000){
go.Render(bd);
};
};
}
static function RenderSpectrum(){
var r:SpecRange;
for each (r in specRanges) {
RenderRangeCircle(r);
};
}
static function Reload(_func:Function){
ExternalData.Load(_func);
}
static function RestartLevelButtonPressed(e:MouseEvent){
RestartLevel();
}
public static function GetBoss():GameObj{
var go:GameObj;
for each (go in GameObjects.objs) {
if (go.active){
if (go.gruntDef != null){
if (go.gruntDef.isboss){
return (go);
};
};
};
};
return (null);
}
static function RenderGOs_A(bd:BitmapData){
var go:GameObj;
goList = new Array();
for each (go in GameObjects.objs) {
if (((go.active) && (go.visible))){
goList.push(go);
};
};
goList.sortOn("zpos", (Array.NUMERIC | Array.DESCENDING));
for each (go in goList) {
if (go.zpos >= 1000){
go.Render(bd);
};
};
}
public static function GetTowerDefByName(name:String):TowerDef{
var td:TowerDef;
for each (td in towerDefs) {
if (td.name == name){
return (td);
};
};
return (null);
}
static function RenderPanel(){
var x:Number;
var y:Number;
var s:String;
var w:Number;
var go:GameObj;
var l:Level = GetCurrentLevel();
var bd:BitmapData = main.screenBD;
x = 10;
y = (Defs.displayarea_h - 25);
var memused:int = (System.totalMemory / 0x0400);
if ((((levelState == levelState_Play)) && ((levelTimer < 100)))){
if (l.endLevelTestFunctionName == "EndLevel_Antibodies"){
s = (("Collect " + numPickupsNeeded) + " Antibodies");
};
if (l.endLevelTestFunctionName == "EndLevel_KilledEnemies"){
s = (("Destroy " + numEnemiesNeeded) + " Enemies");
};
if (l.endLevelTestFunctionName == "EndLevel_Boss"){
s = "Destroy The Boss";
};
y = 100;
x = (Defs.displayarea_w / 2);
w = GraphicObjects.GetStringWidth(bd, GraphicObjects.gfx_font2, x, y, s, null);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font2, (x - (w / 2)), y, s, null);
};
if (levelState == levelState_EndSection){
s = (("Level ends in " + Utils.CounterToSecondsString(levelStateTimer)) + " seconds");
y = 100;
x = (Defs.displayarea_w / 2);
w = GraphicObjects.GetStringWidth(bd, GraphicObjects.gfx_font2, x, y, s, null);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font2, (x - (w / 2)), y, s, null);
};
if (l.endLevelTestFunctionName == "EndLevel_Boss"){
go = GetBoss();
if (go != null){
PanelOverlay_UpdateBossHealth(go.health, go.maxHealth);
} else {
PanelOverlay_UpdateBossHealth(0, 100);
};
};
}
public static function LoadWeapons(){
weapons = new Array();
var x:XML = ExternalData.xml;
var num:* = x.weapons.weapon.length();
var i:int;
while (i < num) {
LoadWeapon(i);
i++;
};
weapons[0].available = true;
}
static function UpdateSpectrum(){
var r:SpecRange;
var amt:int;
var i:int;
var total:Number;
var n:Number;
circleOffset = (circleOffset + ((Math.PI * 2) / 400));
for each (r in specRanges) {
soundSpectrum.position = (r.min * 8);
amt = r.amt;
total = 0;
i = 0;
while (i < amt) {
n = soundSpectrum.readFloat();
r.values[i] = n;
total = (total + n);
if (n > r.threshold){
r.counters[i] = (r.counters[i] + 0.1);
if (r.counters[i] > 10){
r.counters[i] = 0;
};
};
i++;
};
total = (total / amt);
r.average = total;
};
soundLevel = specRanges[0].average;
}
static function AreAllLevelsComplete():Boolean{
var l:Level;
for each (l in levels) {
if (l.complete == false){
return (false);
};
};
return (true);
}
public static function RemoveObj_Standard(pi:PhysObj_Instance){
physObjInstances.Remove(pi);
}
static function GetCurrentLevel():Level{
return (levels[currentLevel]);
}
}
}//package
Section 146
//GameCompleteMovie (GameCompleteMovie)
package {
import flash.display.*;
public dynamic class GameCompleteMovie extends MovieClip {
}
}//package
Section 147
//GameObj (GameObj)
package {
import flash.events.*;
import flash.display.*;
import flash.geom.*;
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
import flash.filters.*;
import org.flashdevelop.utils.*;
public class GameObj {
var weaponIndex:int;
var generateTimeMax:int;
public var xvel:Number;
var path:Poly;
public var todir:Number;
var switchName1:String;
var bd:BitmapData;
var objectDef:ObjectDef;
public var speed:Number;
public var colFlag_isVortex:Boolean;
public var startx:Number;
public var ypos2:Number;
public var startz:Number;
public var colFlag_playercanbekilled:Boolean;
public var ypos1:Number;
public var starty:Number;
public var colFlag_isEnemy:Boolean;
public var frame1:Number;
public var movementVec:Vec;
var blinkMax:int;
var ct:ColorTransform;
public var visible:Boolean;
var footprintRadius:Number;
var shotTimer:int;
public var killed:Boolean;
var acc:Number;
public var yvel:Number;
public var colFlag_isHose:Boolean;
public var colFlag_isPhysObj:Boolean;
public var hitFunction:Function;
public var dir:Number;
public var reloadFunction:Function;
public var radius:Number;
var generateCount:int;
public var controlMode:int;
var renderHealthBarTimer:int;
public var colFlag_isBullet:Boolean;
var lineSpeed:Number;
var uniqueID:int;
var EnemyHitByBulletFunctionCallback:Function;
var maxRotVel:Number;
public var index:int;
public var xpos1:Number;
public var xpos2:Number;
public var colFlag_isPlatform:Boolean;
public var colFlag_isBall:Boolean;
var maxHealth:Number;
public var zvel:Number;
var xflip:Boolean;
var animType:int;
var idleMax:int;
public var colFlag_killPlayer:Boolean;
var EnemyUpdateFunctionCallback:Function;
var shotTimerMax:int;
var lineLoop:Boolean;
var shotControllers:Array;
var currentPoly:Poly;
public var xacc:Number;
public var count:int;
var speedy:Boolean;// = true
public var colFlag_jumpon:Boolean;
public var colFlag_isEnemyBullet:Boolean;
var flashTimer:int;
var maxSpeed:Number;
var generatePickupCountMax:int;
var scale:Number;
var lineIndex:int;
var blinkMin:int;
var alpha:Number;
public var yacc:Number;
public var frame:Number;
public var controlIndex:int;
public var subtype:int;
public var oldxpos:Number;
public var timer1:Number;
var generatorPoints:Array;
public var toPosX:Number;
public var toPosY:Number;
var playerFireAng:Number;
var dist:Number;
public var driveVec:Vec;
var gruntDef:GruntDef;
public var main:Main;
var generatePickupTimeMax:int;
var inFrontZone:Poly;
public var colFlag_isShop:Boolean;
var currentMaxSpeed:Number;
var idleMin:int;
public var physObjOffsetX:Number;
public var physObjOffsetY:Number;
public var oldypos:Number;
public var graphicID:int;
var textMessage:String;
var collisionPoly:Poly;
var appearing:Boolean;
var targetGO:GameObj;
var minFrame:int;
var rotVel:Number;
public var yoffset:Number;
public var colFlag_canBeShot:Boolean;
var waveDef:WaveDef;
var health:Number;
public var colFlag_isPowerup:Boolean;
var maxFrame:int;
var generateCountMax:int;
public var physObjInitVarString:String;
public var colFlag_isPlayer:Boolean;
public var name:String;
public var graphicID1:int;
public var graphicID2:int;
var dblclickCount:int;// = 0
var selected:Boolean;
var playerWeaponList:Array;
public var colFlag_isCheckpoint:Boolean;
public var origspeed:Number;
public var colFlag_canBePickedUp:Boolean;
var lineResetAtEnd:Boolean;
var fireTimer:int;
var initParams:String;
public var xpos:Number;
public var renderShadowFlag:Boolean;
var renderSmooth:Boolean;
public var frameVel:Number;
public var loseTargetFunction:Function;
public var xoffset:Number;
public var active:Boolean;
public var type:int;
public var ypos:Number;
public var frameVel1:Number;
public var timer:Number;
var generatePickupCount:int;
var aimPosX:Number;
var animMode:int;
var speedyAng:Number;// = 1
var aimPosY:Number;
var lineLinearPos:Number;
var weaponType:int;
public var hitTimer:Number;
var flashFlag:Boolean;
public var renderFunction:Function;
var normalLineSpeed:Number;
public var zpos:Number;
var weaponTypeItem:WeaponTypeItem;
public var colFlag_isBouncyPad:Boolean;
var animTimer:int;
var lineMode:int;
public var updateFunction:Function;
var beenHit:Boolean;
public var additive:Boolean;
public var colFlag_isTower:Boolean;
public var timerMax:Number;
var switchName:String;
var parentObj:GameObj;
var flashTimerMax:int;
var isPhysObj:Boolean;
public function GameObj(_index:int){
ct = new ColorTransform();
super();
index = _index;
xpos = 0;
ypos = 0;
zpos = 1;
starty = 0;
startx = 0;
active = false;
killed = false;
zpos = 0;
graphicID = 0;
frame = 0;
frameVel = 0;
controlIndex = 0;
timer = 0;
timer1 = 0;
radius = 14;
minFrame = 0;
maxFrame = 0;
movementVec = new Vec();
}
function RenderGrunt():void{
var sc:Number = scale;
if (scale == 1){
scale = Utils.ScaleToLimit(0.5, 1.3, 0, 0.6, Game.soundLevel);
};
if (beenHit){
beenHit = false;
ct.redOffset = 0xFF;
ct.greenOffset = -255;
ct.blueOffset = -255;
RenderWithColorTransform();
} else {
RenderNormally();
};
scale = sc;
if (gruntDef.isboss == false){
RenderHealthBar(0, -30);
};
}
function InitPlayer():void{
zpos = -100;
playerWeaponList = new Array("A", "B", "C", "D", "E", "F", "G", "H");
weaponIndex = 0;
colFlag_isPlayer = true;
updateFunction = UpdatePlayer;
renderFunction = RenderPlayer;
graphicID = GraphicObjects.GetIndexByName("PlayerShip");
graphicID1 = GraphicObjects.GetIndexByName("PlayerShipGun");
graphicID2 = GraphicObjects.GetIndexByName("PlayerShipGun1");
frame = 0;
xpos = 320;
ypos = 240;
dblclickCount = 0;
aimPosX = (xpos + 10);
aimPosY = (ypos + 10);
timer = 0;
weaponType = Game.GetWeaponTypeIndexByName(playerWeaponList[Game.currentWeapon]);
speedy = false;
speedyAng = 0;
shotTimer = (shotTimerMax = 20);
maxHealth = 5;
flashTimer = (flashTimerMax = 0);
}
function InitGrunt_TurnTo():void{
updateFunction = UpdateGrunt_TurnTo;
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
}
function UpdateExplosion():void{
if (PlayAnimation()){
killed = true;
};
}
function RenderPlayer():void{
var wi:WeaponTypeItem;
var gid:int;
if ((((flashTimer > 0)) && (((flashTimer & 1) == 0)))){
return;
};
var rot:Number = Math.atan2((aimPosY - ypos), (aimPosX - xpos));
var w:WeaponType = Game.weapons[weaponType];
var i:int;
for each (wi in w.items) {
gid = graphicID2;
if ((w.items.length % 2) == 1){
if (i == (w.items.length - 1)){
gid = graphicID1;
};
};
RenderGraphicNormally(gid, 0, xpos, ypos, 1, (rot + wi.dir));
i++;
};
if (speedy){
RenderSpeedyBlur(speedyAng, 1);
} else {
RenderNormally();
};
}
function InitGrunt_Path():void{
updateFunction = UpdateGrunt_Path;
var time:Number = (10 * (1 / gruntDef.speed));
initParams = (("line=line01, time=" + time.toString()) + ",start=0,loop=true,resetatend=false,spline=true");
InitPath();
}
function UpdateBullet_Vortex():void{
CycleAnimation();
if (controlMode == 0){
xpos = (xpos + xvel);
ypos = (ypos + yvel);
timer--;
if (timer < 0){
killed = true;
};
} else {
if (controlMode == 1){
xpos = (xpos + xvel);
ypos = (ypos + yvel);
xvel = (xvel * 0.95);
yvel = (yvel * 0.95);
timer--;
if (timer < 0){
killed = true;
};
};
};
}
function LoseTarget_OneShot():void{
killed = true;
}
function GetLineIndexByName(name:String):int{
var line:PhysLine;
var l:Level = Game.GetCurrentLevel();
var index:int;
for each (line in l.lines) {
if (line.name == name){
return (index);
};
index++;
};
return (-1);
}
function UpdateBullet_Move():void{
xpos = (xpos + xvel);
ypos = (ypos + yvel);
timer--;
if (timer < 0){
killed = true;
};
if ((((((((xpos < 0)) || ((ypos < 0)))) || ((xpos > Defs.displayarea_w)))) || ((ypos > Defs.displayarea_h)))){
killed = true;
};
}
function InitGrunt_Acc():void{
reloadFunction = ReloadGrunt_Acc;
updateFunction = UpdateGrunt_Acc;
movementVec.Set(Utils.RandCircle(), 1);
acc = (gruntDef.turnSpeed + Utils.RandBetweenFloat(0, (gruntDef.turnSpeed * 0.3)));
speed = (gruntDef.speed + Utils.RandBetweenFloat(0, (gruntDef.speed * 0.3)));
}
function RenderNormally(){
var xp:Number = (xpos + xpos1);
var yp:Number = (ypos + ypos1);
if (((!((scale == 1))) || (!((dir == 0))))){
GraphicObjects.RenderAtRotScaled(graphicID, frame, bd, xp, yp, scale, dir, null, renderSmooth);
} else {
GraphicObjects.RenderAt(graphicID, frame, bd, xp, yp);
};
}
function UpdateX():void{
}
function InitGrunt_Square_Burst():void{
updateFunction = UpdateGrunt_Square_Burst;
movementVec.Set(GetRandSquareAngleBiasedTowardsPlayer(), gruntDef.speed);
timer = (gruntDef.burstTime * Defs.fps);
}
function InitGrunt_CurveTurnTo():void{
updateFunction = UpdateGrunt_CurveTurnTo;
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
timer = 0;
controlMode = 0;
}
function HitGrunt(goBullet:GameObj):void{
var go:GameObj;
var i:int;
var p:Particle;
if (goBullet == null){
return;
};
beenHit = true;
renderHealthBarTimer = Defs.fps;
if (Game.difficulty == 0){
health = (health - (goBullet.weaponTypeItem.hp * 2));
};
if (Game.difficulty == 1){
health = (health - goBullet.weaponTypeItem.hp);
};
if (Game.difficulty == 2){
health = (health - (goBullet.weaponTypeItem.hp * 0.5));
};
if (Game.difficulty == 3){
health = (health - (goBullet.weaponTypeItem.hp * 0.25));
};
if (health <= 0){
Game.numGruntsActive--;
Game.AddScore(gruntDef.cash);
Game.PanelOverlay_UpdateKills();
if (gruntDef.isboss){
Game.bossKilled = true;
i = 0;
while (i < 20) {
Game.GeneratePickup(xpos, ypos);
i++;
};
};
if (gruntDef.isboss){
go = GameObjects.AddObj(xpos, ypos, -10);
go.InitExplosion(Utils.RandBetweenInt(0, 2), true);
SoundPlayer.Play("sfx_splatboss");
} else {
go = GameObjects.AddObj(xpos, ypos, -10);
go.InitExplosion(Utils.RandBetweenInt(0, 2));
SoundPlayer.PlayRandomBetween("sfx_splat0", "sfx_splat5");
};
killed = true;
Game.numEnemiesKilled++;
Game.numLevelEnemiesKilled++;
i = 0;
while (i < 5) {
p = Particles.Add(xpos, ypos);
p.InitStar();
i++;
};
};
}
function UpdateLine(_spd:Number):Point{
lineLinearPos = (lineLinearPos + _spd);
if (lineLinearPos > 1){
if (lineLoop == true){
lineLinearPos = (lineLinearPos - 1);
} else {
lineLinearPos = 1;
};
};
if (lineLinearPos < 0){
if (lineLoop == true){
lineLinearPos = (lineLinearPos + 1);
} else {
lineLinearPos = 0;
};
};
var line:PhysLine = Game.GetCurrentLevel().lines[lineIndex];
if (line == null){
return (new Point(0, 0));
};
var p:Point = line.GetInterpolatedPoint(lineLinearPos, lineLoop, lineMode);
return (p);
}
public function InitMessage(_type:int):void{
updateFunction = UpdateMessage;
timer = (Defs.fps * 0.8);
frame = _type;
graphicID = GraphicObjects.GetIndexByName("StartRaceText");
}
function UpdateGrunt_Path():void{
UpdateGrunt_All();
var p:Point = UpdatePath();
xpos = p.x;
ypos = p.y;
}
function UpdateGrunt_CurveBounce():void{
UpdateGrunt_All();
xvel = movementVec.GetXComponent();
yvel = movementVec.GetYComponent();
xpos = (xpos + xvel);
ypos = (ypos + yvel);
movementVec.AddRot(rotVel);
if (DoBounce()){
rotVel = Utils.RandPositiveNegative(maxRotVel);
};
}
function InitSmartBomb(){
Game.smartBombActive = true;
Game.smartBombTimer = 0;
Game.smartBombTimerMax = 50;
Game.smartBombClip.visible = true;
Game.smartBombClip.gotoAndPlay(1);
Game.smartBombDestroyFrameMin = 30;
Game.smartBombDestroyFrameMax = 50;
}
function IsInWorld(radius:Number):Boolean{
if (xpos < (0 - radius)){
return (false);
};
if (ypos < (0 - radius)){
return (false);
};
if (xpos > (Defs.displayarea_w + radius)){
return (false);
};
if (ypos > (Defs.displayarea_h + radius)){
return (false);
};
return (true);
}
function UpdatePickup(){
CycleAnimation();
var px:Number = Game.goPlayer.xpos;
var py:Number = Game.goPlayer.ypos;
scale = (scale + 0.1);
if (scale >= 1){
scale = 1;
};
xvel = movementVec.GetXComponent();
yvel = movementVec.GetYComponent();
xpos = (xpos + xvel);
ypos = (ypos + yvel);
timer1++;
movementVec.speed = (speed + (Math.cos((timer1 * 0.2)) * 0.8));
speedy = false;
var d2:Number = Utils.Dist2BetweenPoints(xpos, ypos, px, py);
if (d2 < (50 * 50)){
xpos = (xpos + ((px - xpos) * 0.4));
ypos = (ypos + ((py - ypos) * 0.4));
speedy = true;
speedyAng = Math.atan2((py - ypos), (px - xpos));
};
var min:Number = 0;
var maxx:Number = Defs.displayarea_w;
var maxy:Number = Defs.displayarea_h;
if (xpos < min){
xpos = min;
movementVec.ReflectAng((-(Math.PI) / 2));
};
if (xpos > maxx){
xpos = maxx;
movementVec.ReflectAng((Math.PI / 2));
};
if (ypos < min){
ypos = min;
movementVec.ReflectAng(0);
};
if (ypos > maxy){
ypos = maxy;
movementVec.ReflectAng(Math.PI);
};
timer--;
if (timer <= 0){
killed = true;
};
}
function UpdateGrunt():void{
}
function InitEnemyPickup(){
frame = 0;
graphicID = GraphicObjects.GetIndexByName("EnemyPickup");
updateFunction = UpdateEnemyPickup;
movementVec.speed = 10;
timer = 50;
}
function InitGrunt(gd:GruntDef):void{
reloadFunction = ReloadGrunt;
gruntDef = gd;
colFlag_isEnemy = true;
updateFunction = UpdateGrunt;
renderFunction = RenderGrunt;
hitFunction = HitGrunt;
graphicID = GraphicObjects.GetIndexByName(gruntDef.movieClipName);
name = gruntDef.name;
speed = gruntDef.speed;
frame = 0;
UpdateGrunt();
maxHealth = (health = gruntDef.hp);
movementVec.Set(0, 0);
radius = 15;
if (gruntDef.name.match("Med")){
radius = 30;
};
if (gruntDef.name.match("Boss")){
radius = 60;
};
movementVec.speed = Utils.RandBetweenFloat(1, 3);
InitGrunt_All();
beenHit = false;
speedy = false;
if (gd.initFuncName != ""){
var _local2 = this;
_local2[gd.initFuncName]();
};
renderSmooth = true;
Game.numGruntsActive++;
}
public function Update():void{
oldxpos = xpos;
oldypos = ypos;
if (renderHealthBarTimer > 0){
renderHealthBarTimer--;
};
if (updateFunction != null){
updateFunction();
};
}
function UpdateGrunt_Acc():void{
UpdateGrunt_All();
toPosX = Game.goPlayer.xpos;
toPosY = Game.goPlayer.ypos;
var v:Vec = new Vec();
v.Set(Math.atan2((toPosY - ypos), (toPosX - xpos)), acc);
movementVec.Add(v);
if (movementVec.speed > speed){
movementVec.speed = speed;
};
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
}
function SetSelected(_selected:Boolean){
selected = _selected;
}
function UpdatePath():Point{
var pos:Point = UpdateLine(lineSpeed);
if (lineLoop == false){
if (lineLinearPos >= 1){
lineLinearPos = 1;
if (lineResetAtEnd){
lineLinearPos = 0;
} else {
lineSpeed = 0;
};
};
};
return (pos);
}
function UpdateGrunt_Bounce():void{
UpdateGrunt_All();
xvel = movementVec.GetXComponent();
yvel = movementVec.GetYComponent();
xpos = (xpos + xvel);
ypos = (ypos + yvel);
DoBounce();
speedy = false;
speedyAng = Math.atan2(yvel, xvel);
}
public function InitPhysicsObject(_gid:int, _frame:int, _offsetX:Number=0, _offsetY:Number=0, _initvarstring:String="", _hasShadow:Boolean=false){
colFlag_isPhysObj = true;
physObjOffsetX = _offsetX;
physObjOffsetY = _offsetY;
isPhysObj = true;
graphicID = _gid;
frame = _frame;
updateFunction = UpdatePhysicsObject;
renderShadowFlag = _hasShadow;
physObjInitVarString = _initvarstring;
}
function InitX():void{
updateFunction = UpdateX;
renderFunction = RenderX;
}
function InitGrunt_Random():void{
updateFunction = UpdateGrunt_Random;
toPosX = Utils.RandBetweenFloat(50, (Defs.displayarea_w - 50));
toPosY = Utils.RandBetweenFloat(50, (Defs.displayarea_h - 50));
timer = 0;
controlMode = 0;
movementVec.Set(0, 0);
driveVec = new Vec();
}
public function Init(_type:int):void{
var i0:int;
var f0:Number = 0;
type = _type;
controlMode = i0;
xvel = f0;
yvel = f0;
frame = f0;
frameVel = f0;
timer = f0;
hitTimer = f0;
flashTimer = i0;
flashFlag = false;
dir = 0;
todir = 0;
health = 1;
zvel = 0;
name = "";
scale = 1;
objectDef = null;
xflip = false;
updateFunction = null;
renderFunction = null;
hitFunction = null;
loseTargetFunction = null;
reloadFunction = null;
targetGO = null;
visible = true;
renderShadowFlag = false;
ClearColFlags();
isPhysObj = false;
additive = false;
alpha = 1;
xpos1 = 0;
ypos1 = 0;
renderSmooth = false;
initParams = "";
renderHealthBarTimer = 0;
killed = false;
selected = false;
gruntDef = null;
}
function UpdateSmartBomb(){
var i:int;
var num:int;
var radius:Number;
var cx:Number;
var cy:Number;
var max:Number;
var dr:Number;
var rot:Number;
if (Game.smartBombActive == false){
return;
};
Game.smartBombTimer++;
if (Game.smartBombTimer == 10){
SoundPlayer.Play("sfx_bostin");
};
if (Game.smartBombTimer >= Game.smartBombTimerMax){
Game.smartBombTimer = 0;
Game.smartBombActive = false;
Game.smartBombClip.visible = false;
};
if ((((Game.smartBombTimer >= Game.smartBombDestroyFrameMin)) && ((Game.smartBombTimer <= Game.smartBombDestroyFrameMax)))){
i = (Game.smartBombTimer - Game.smartBombDestroyFrameMin);
num = (Game.smartBombDestroyFrameMax - Game.smartBombDestroyFrameMin);
radius = Utils.ScaleTo(0, (Defs.displayarea_w / 2), 0, num, i);
cx = (Defs.displayarea_w / 2);
cy = (Defs.displayarea_h / 2);
max = (Math.PI * 2);
dr = (max / 64);
rot = 0;
rot = 0;
while (rot < max) {
Game.smartBombBullet.xpos = (cx + (Math.cos(rot) * radius));
Game.smartBombBullet.ypos = (cy + (Math.sin(rot) * radius));
Collision.SingleBulletEnemyCollision(Game.smartBombBullet);
rot = (rot + dr);
};
};
}
function UpdatePlayer():void{
var wi:WeaponTypeItem;
if (flashTimer > 0){
flashTimer--;
};
if (Game.levelState == Game.levelState_Failed){
return;
};
weaponIndex = int((Game.currentLevel / 3));
weaponType = Game.GetWeaponTypeIndexByName(playerWeaponList[Game.currentWeapon]);
if (Game.numBombs > 0){
if (((KeyReader.Pressed(KeyReader.KEY_SPACE)) || (KeyReader.Pressed(KeyReader.KEY_X)))){
if (Game.smartBombActive == false){
FlashConnect.trace("BOMB");
InitSmartBomb();
Game.numBombs--;
};
};
};
UpdateSmartBomb();
var w:WeaponType = Game.weapons[weaponType];
var ox:Number = xpos;
var oy:Number = ypos;
toPosX = MouseControl.x;
toPosY = MouseControl.y;
var edge:Number = 15;
if (toPosX < edge){
toPosX = edge;
};
if (toPosY < edge){
toPosY = edge;
};
if (toPosX > (Defs.displayarea_w - edge)){
toPosX = (Defs.displayarea_w - edge);
};
if (toPosY > (Defs.displayarea_h - edge)){
toPosY = (Defs.displayarea_h - edge);
};
var dir:Number = Math.atan2((toPosY - ypos), (toPosX - xpos));
var dist:Number = Utils.DistBetweenPoints(xpos, ypos, toPosX, toPosY);
dist = Utils.LimitNumber(0, 30, dist);
if (dist > 10){
dist = (dist * 0.9);
};
var dx:Number = Math.cos(dir);
var dy:Number = Math.sin(dir);
xpos = (xpos + (dx * dist));
ypos = (ypos + (dy * dist));
speedy = false;
var d:Number = Utils.DistBetweenPoints(xpos, ypos, ox, oy);
if (d > 3){
speedy = true;
speedyAng = Math.atan2((ypos - oy), (xpos - ox));
};
var maxd:Number = 40;
if (MouseControl.buttonPressed){
aimPosX = (xpos + (Math.cos(playerFireAng) * maxd));
aimPosY = (ypos + (Math.sin(playerFireAng) * maxd));
} else {
playerFireAng = Math.atan2((aimPosY - ypos), (aimPosX - xpos));
};
if (Utils.DistBetweenPoints(xpos, ypos, aimPosX, aimPosY) > maxd){
aimPosX = (xpos + (Math.cos(playerFireAng) * maxd));
aimPosY = (ypos + (Math.sin(playerFireAng) * maxd));
};
var shotFired:Boolean;
for each (wi in w.items) {
wi.shotTimer--;
if (wi.shotTimer <= 0){
wi.shotTimer = wi.frequency;
Game.InitBullet(this, wi, playerFireAng);
shotFired = true;
};
};
}
function UpdateBullet_Homer():void{
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
todir = Math.atan2((targetGO.ypos - ypos), (targetGO.xpos - xpos));
RotateToRequiredRot(todir, 0.1);
dir = movementVec.rot;
timer--;
if (timer < 0){
killed = true;
};
}
function RenderX():void{
}
public function CycleAnimation():void{
var fv:Number = frameVel;
var maxframe:int = GraphicObjects.GetNumFrames(graphicID);
frame = (frame + fv);
if (frame >= maxframe){
frame = (frame - maxframe);
};
if (frame < 0){
frame = (frame + maxframe);
};
}
function GetRandSquareAngleBiasedTowardsPlayer():Number{
var p:Number = (Math.PI * 0.5);
var p0:Number = 0;
var p1:Number = p;
var p2:Number = (p * 2);
var p3:Number = (p * 3);
var list:Array = new Array();
if (xpos > 150){
list.push(p2);
};
if (xpos < (Defs.displayarea_w - 150)){
list.push(p0);
};
if (ypos > 150){
list.push(p3);
};
if (ypos < (Defs.displayarea_h - 150)){
list.push(p1);
};
if (xpos < Game.goPlayer.xpos){
list.push(p0);
} else {
list.push(p2);
};
if (ypos < Game.goPlayer.ypos){
list.push(p1);
} else {
list.push(p3);
};
var i:int = Utils.RandBetweenInt(0, (list.length - 1));
return (list[i]);
}
function UpdateTextMessage(){
ypos = (ypos + 0.1);
timer--;
if (timer <= 0){
killed = true;
};
}
function InitBullet_OneShot(wi:WeaponTypeItem, goStart:GameObj, _ang:Number):void{
weaponTypeItem = wi;
colFlag_isBullet = true;
updateFunction = UpdateBullet_OneShot;
frame = 0;
dir = _ang;
frame = 0;
frameVel = 1;
radius = 10;
}
function UpdateBullet_OneShot():void{
xpos = Game.goPlayer.xpos;
ypos = Game.goPlayer.ypos;
dir = Game.goPlayer.playerFireAng;
MakeCollisionPoly(dir);
Collision.EnemyPointInPolyCollision(collisionPoly, this);
if (PlayAnimation()){
killed = true;
};
if ((((((((xpos < 0)) || ((ypos < 0)))) || ((xpos > Defs.displayarea_w)))) || ((ypos > Defs.displayarea_h)))){
killed = true;
};
}
function InitPath(){
Utils.GetParams(initParams);
lineIndex = GetLineIndexByName(Utils.GetParam("line", "line01"));
var timeSeconds:Number = Utils.GetParamNumber("time", 40);
lineLinearPos = Utils.GetParamNumber("start", 0);
var line:PhysLine = Game.GetCurrentLevel().lines[lineIndex];
lineSpeed = (1 / (timeSeconds * Defs.fps));
normalLineSpeed = lineSpeed;
lineLoop = Utils.GetParamBool("loop", false);
lineResetAtEnd = Utils.GetParamBool("resetatend", false);
lineMode = 0;
if (Utils.GetParamBool("spline", false) == true){
lineMode = 1;
};
}
function UpdateGrunt_RickBoss():void{
UpdateGrunt_All();
var p:Point = UpdatePath();
xpos = p.x;
ypos = p.y;
frame = 1;
if (Game.goPlayer.xpos < xpos){
frame = 0;
};
}
function InitGrunt_RickBoss():void{
updateFunction = UpdateGrunt_RickBoss;
var time:Number = (10 * (1 / gruntDef.speed));
initParams = (("line=line01, time=" + time.toString()) + ",start=0,loop=true,resetatend=false,spline=true");
InitPath();
frame = 0;
}
function SetAnim(id:int){
var maxf:int = (GraphicObjects.GetNumFrames(graphicID) - 1);
if (frame >= maxf){
frame = 0;
};
if (id == 0){
minFrame = idleMin;
maxFrame = idleMax;
};
if (id == 1){
minFrame = blinkMin;
maxFrame = blinkMax;
};
frame = minFrame;
}
function InitGrunt_All(){
var sd:ShotDef;
var sc:ShotController;
scale = 0.1;
fireTimer = 0;
shotControllers = new Array();
for each (sd in gruntDef.shotDefs) {
sc = new ShotController(sd);
shotControllers.push(sc);
};
frame = 0;
if (graphicID == GraphicObjects.GetIndexByName("Enemy01")){
frame = 0;
frameVel = 1;
idleMin = (1 - 1);
idleMax = (33 - 1);
blinkMin = (34 - 1);
blinkMax = (43 - 1);
animMode = 0;
SetAnim(animMode);
animTimer = Utils.RandBetweenInt(50, 150);
animType = 1;
};
if (graphicID == GraphicObjects.GetIndexByName("Enemy02")){
frame = 0;
frameVel = 1;
idleMin = (1 - 1);
idleMax = (32 - 1);
blinkMin = (33 - 1);
blinkMax = (37 - 1);
animMode = 0;
SetAnim(animMode);
animTimer = Utils.RandBetweenInt(50, 150);
animType = 1;
} else {
frame = 0;
frameVel = 1;
animType = 0;
};
appearing = true;
}
function RenderHitAnim(){
var dobj:DisplayObjFrame;
var xp:Number = (xpos + xpos1);
var yp:Number = (ypos + ypos1);
var newbd:BitmapData = Game.main.renderHitBD;
newbd.fillRect(new Rectangle(0, 0, 140, 140), 0);
dobj = GraphicObjects.graphicobjs[graphicID].frames[int(frame)];
dobj.mat.identity();
dobj.mat.translate(70, 70);
newbd.draw(dobj.bitmapData, dobj.mat, null, BlendMode.INVERT);
var gid:int = GraphicObjects.GetIndexByName("HitAnim");
dobj = GraphicObjects.graphicobjs[gid].frames[0];
dobj.mat.identity();
dobj.mat.translate((xp + dobj.xoffset), (yp + dobj.yoffset));
dobj.bitmapData.copyChannel(newbd, new Rectangle(0, 0, dobj.bitmapData.width, dobj.bitmapData.height), new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
bd.draw(dobj.bitmapData, dobj.mat, null);
}
public function Render(_bd:BitmapData):void{
bd = _bd;
if (visible == false){
return;
};
if (renderFunction != null){
renderFunction();
} else {
RenderNormally();
};
if ((Debug.debugMode & 1) != 0){
Utils.RenderCircle(bd, xpos, ypos, radius, 4294967295);
};
}
function RenderGenerator():void{
var gp:GeneratorPoint;
var x:Number;
var y:Number;
var f:Number;
var num:int = generatorPoints.length;
if (controlMode == 0){
num = Utils.ScaleTo(3, generatorPoints.length, 0, timerMax, timer);
};
if (controlMode == 4){
num = Utils.ScaleTo(3, generatorPoints.length, timerMax, 0, timer);
};
var g:Graphics = Game.main.fillScreenMC.graphics;
g.lineStyle(null);
g.beginFill(4290772992, 1);
gp = generatorPoints[0];
g.moveTo(gp.x, gp.y);
var dx:Number = (toPosX - xpos);
var dy:Number = (toPosY - ypos);
var ang:Number = Math.atan2(dy, dx);
ang = (ang + (Math.PI * 0.5));
dx = Math.cos(ang);
dy = Math.sin(ang);
var d:Number = 10;
var i = 1;
while (i < num) {
f = Utils.ScaleTo(0, Math.PI, 0, num, i);
f = Math.sin(f);
gp = generatorPoints[i];
x = gp.x;
y = gp.y;
x = (x - ((dx * d) * f));
y = (y - ((dy * d) * f));
g.lineTo(x, y);
i++;
};
i = (num - 1);
while (i > 0) {
f = Utils.ScaleTo(0, Math.PI, 0, num, i);
f = Math.sin(f);
gp = generatorPoints[i];
x = gp.x;
y = gp.y;
x = (x + ((dx * d) * f));
y = (y + ((dy * d) * f));
g.lineTo(x, y);
i--;
};
g.endFill();
}
function InitBullet_Move(wi:WeaponTypeItem, goStart:GameObj, _ang:Number):void{
colFlag_isBullet = true;
updateFunction = UpdateBullet_Move;
hitFunction = HitBullet;
frame = 0;
dir = _ang;
dir = (dir + wi.dir);
if (wi.absoluteDir){
dir = wi.dir;
};
var spd:Number = wi.speed;
xvel = (Math.cos(dir) * spd);
yvel = (Math.sin(dir) * spd);
timer = (Defs.fps * 3);
radius = 10;
health = wi.health;
NormalizeDir();
frame = Utils.ScaleTo(0, 48, 0, (Math.PI * 2), dir);
dir = 0;
}
function UpdateGrunt_MoveTo_Burst():void{
UpdateGrunt_All();
toPosX = Game.goPlayer.xpos;
toPosY = Game.goPlayer.ypos;
if (controlMode == 0){
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
timer--;
if (timer <= 0){
controlMode = 1;
timer = (Utils.RandBetweenFloat((gruntDef.burstTime / 2), gruntDef.burstTime) * Defs.fps);
};
} else {
if (controlMode == 1){
timer--;
if (timer <= 0){
controlMode = 0;
timer = (Utils.RandBetweenFloat((gruntDef.burstTime / 2), gruntDef.burstTime) * Defs.fps);
movementVec.Set(GetAngleToPlayer(30), gruntDef.speed);
};
};
};
}
function InitPlayerExplosion(_die:Boolean=false):void{
updateFunction = UpdateExplosion;
graphicID = GraphicObjects.GetIndexByName("PlayerHitExplosion");
frameVel = 1;
if (_die){
graphicID = GraphicObjects.GetIndexByName("PlayerDieExplosion");
};
}
function ReloadGrunt_Bounce():void{
ReloadGrunt();
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
xvel = movementVec.GetXComponent();
yvel = movementVec.GetYComponent();
}
function ReloadGrunt_CurveBounce():void{
ReloadGrunt();
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
xvel = movementVec.GetXComponent();
yvel = movementVec.GetYComponent();
maxRotVel = gruntDef.turnSpeed;
}
function ReloadGrunt():void{
gruntDef = Game.GetGruntDefByName(gruntDef.name);
}
function HitBullet_Vortex():void{
if (controlMode == 0){
timer = (Defs.fps * 2);
controlMode = 1;
radius = 30;
};
}
function RotToFrame(r:Number, reverse:Boolean=false){
r = Utils.NormalizeRot(r);
var nf:int = GraphicObjects.GetNumFrames(graphicID);
if (reverse){
frame = Utils.ScaleTo((nf - 1), 0, 0, (Math.PI * 2), r);
} else {
frame = Utils.ScaleTo(0, (nf - 1), 0, (Math.PI * 2), r);
};
}
public function UpdatePhysicsObject(){
}
function UpdateEnemyBullet(){
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
if ((((((((xpos < 0)) || ((ypos < 0)))) || ((xpos > Defs.displayarea_w)))) || ((ypos > Defs.displayarea_h)))){
killed = true;
};
}
function RenderWithColorTransform(){
var xp:Number = (xpos + xpos1);
var yp:Number = (ypos + ypos1);
GraphicObjects.RenderAtRotScaled(graphicID, frame, bd, xp, yp, scale, dir, ct, renderSmooth);
}
function UpdateGrunt_All(){
var go:GameObj;
var sc:ShotController;
var numShots:int;
var spread:Number;
var spreadDX:Number;
var offset:Number;
var i:int;
if (animType == 1){
if (animMode == 0){
CycleAnimationEx();
animTimer--;
if (animTimer <= 0){
animMode = 1;
SetAnim(animMode);
};
} else {
if (CycleAnimationEx()){
animMode = 0;
SetAnim(animMode);
animTimer = Utils.RandBetweenInt(50, 150);
};
};
} else {
CycleAnimation();
};
if (appearing){
scale = (scale + 0.1);
if (scale >= 1){
scale = 1;
appearing = false;
};
};
for each (sc in shotControllers) {
if (sc.Update()){
numShots = sc.shotDef.numBullets;
if (numShots == 1){
go = GameObjects.AddObj(xpos, ypos, 0);
go.InitEnemyBullet(sc.shotDef.fixedangle, 0, sc.shotDef.speed);
} else {
spread = sc.shotDef.spread;
spreadDX = (spread / (numShots / 1));
offset = -((spread * 0.5));
i = 0;
while (i < numShots) {
go = GameObjects.AddObj(xpos, ypos, 0);
go.InitEnemyBullet(sc.shotDef.fixedangle, offset, sc.shotDef.speed);
offset = (offset + spreadDX);
i++;
};
};
};
};
}
public function GetVelFromDir(vel:Number){
xvel = (Math.cos(dir) * vel);
yvel = (Math.sin(dir) * vel);
}
function UpdateGrunt_CurveTurnTo():void{
var todir:Number;
UpdateGrunt_All();
if (controlMode == 0){
toPosX = Game.goPlayer.xpos;
toPosY = Game.goPlayer.ypos;
todir = Math.atan2((toPosY - ypos), (toPosX - xpos));
todir = (todir + Utils.RandBetweenFloat(-0.5, 0.5));
movementVec.Set(todir, gruntDef.speed);
timer = Utils.RandBetweenInt(10, 30);
maxRotVel = Utils.RandBetweenFloat(0.03, 0.06);
rotVel = Utils.RandPositiveNegative(maxRotVel);
controlMode = 1;
};
if (controlMode == 1){
movementVec.AddRot(rotVel);
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
timer--;
if (timer <= 0){
controlMode = 0;
};
};
}
function ReloadGrunt_Acc():void{
ReloadGrunt();
acc = (gruntDef.turnSpeed + Utils.RandBetweenFloat(0, (gruntDef.turnSpeed * 0.3)));
speed = (gruntDef.speed + Utils.RandBetweenFloat(0, (gruntDef.speed * 0.3)));
}
function ClearColFlags(){
colFlag_jumpon = false;
colFlag_killPlayer = false;
colFlag_playercanbekilled = false;
colFlag_canBePickedUp = false;
colFlag_canBeShot = false;
colFlag_isBullet = false;
colFlag_isPlatform = false;
colFlag_isPowerup = false;
colFlag_isBouncyPad = false;
colFlag_isCheckpoint = false;
colFlag_isShop = false;
colFlag_isEnemyBullet = false;
colFlag_isEnemy = false;
colFlag_isBall = false;
colFlag_isHose = false;
colFlag_isPlayer = false;
colFlag_isPhysObj = false;
colFlag_isVortex = false;
colFlag_isTower = false;
}
function RenderGraphicAdditive(_gid:int, _frame:int, _xpos:Number, _ypos:Number){
var xp:Number = _xpos;
var yp:Number = _ypos;
GraphicObjects.RenderAtAdditive(_gid, _frame, bd, xp, yp);
}
function GetRandSquareAngle():Number{
var i:int = Utils.RandBetweenInt(0, 3);
var p:Number = (Math.PI * 0.5);
if (i == 0){
return (0);
};
if (i == 1){
return (p);
};
if (i == 2){
return ((p * 2));
};
if (i == 3){
return ((p * 3));
};
return (0);
}
function InitBullet_SmartBomb(wi:WeaponTypeItem, goStart:GameObj, _ang:Number):void{
updateFunction = null;
renderFunction = null;
health = wi.health;
radius = 30;
}
public function GetOffsetObjectRectangle():Rectangle{
var r:Rectangle = objectDef.colRects[0].clone();
r.x = (r.x + xpos);
r.y = (r.y + ypos);
return (r);
}
function InitGrunt_MoveTo_Burst():void{
updateFunction = UpdateGrunt_MoveTo_Burst;
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
controlMode = 0;
timer = (gruntDef.burstTime * Defs.fps);
}
function HitBullet():void{
health--;
if (health <= 0){
killed = true;
};
}
function NormalizeDir():void{
while (dir < 0) {
dir = (dir + (Math.PI * 2));
};
while (dir > (Math.PI * 2)) {
dir = (dir - (Math.PI * 2));
};
}
function Generator_GenerateEnemy():void{
var d:Number = Utils.RandBetweenFloat(0, 1);
var dx:Number = (toPosX - xpos);
var dy:Number = (toPosY - ypos);
var x:Number = (xpos + (dx * d));
var y:Number = (ypos + (dy * d));
Game.GenerateGrunt(x, y, gruntDef);
}
function UpdateGrunt_TurnTo():void{
UpdateGrunt_All();
toPosX = Game.goPlayer.xpos;
toPosY = Game.goPlayer.ypos;
var todir:Number = Math.atan2((toPosY - ypos), (toPosX - xpos));
RotateToRequiredRot(todir, gruntDef.turnSpeed);
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
}
public function RenderShadow():void{
}
function RenderTextMessage(){
var w:Number = GraphicObjects.GetStringWidth(bd, GraphicObjects.gfx_font2, xpos, ypos, textMessage, null);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font2, (xpos - (w / 2)), ypos, textMessage, null);
}
function RotateToRequiredRot(requiredRot:Number, rv:Number):Boolean{
if (movementVec.NearRot(requiredRot, rv)){
movementVec.rot = requiredRot;
return (true);
};
var r1a:Number = (requiredRot + (Math.PI / 2));
var d1:Number = Utils.DotProduct(Math.cos(movementVec.rot), Math.sin(movementVec.rot), Math.cos(r1a), Math.sin(r1a));
if (d1 < 0){
movementVec.AddRot(rv);
} else {
movementVec.AddRot(-(rv));
};
return (false);
}
public function PlayAnimation():Boolean{
var maxframe:int = (GraphicObjects.GetNumFrames(graphicID) - 1);
frame = (frame + frameVel);
if (frame >= maxframe){
frame = maxframe;
return (true);
};
if (frame <= 0){
frame = 0;
return (true);
};
return (false);
}
public function GetDirBetween(x0, y0, x1, y1):Number{
var d:* = Math.atan2((y1 - y0), (x1 - x0));
return (d);
}
function MakeCollisionPoly(_rot:Number){
var p:Point;
var polyPoints:Array = new Array();
var m:Matrix = new Matrix();
m.rotate((_rot + (Math.PI / 2)));
m.translate(xpos, ypos);
var poly:Array = new Array();
poly.push(new Point(-(weaponTypeItem.oneShotWidth), 0));
poly.push(new Point(-(weaponTypeItem.oneShotWidth), -(weaponTypeItem.oneShotLength)));
poly.push(new Point(weaponTypeItem.oneShotWidth, -(weaponTypeItem.oneShotLength)));
poly.push(new Point(weaponTypeItem.oneShotWidth, 0));
for each (p in poly) {
polyPoints.push(m.transformPoint(p));
};
collisionPoly = Poly.PolyFromPointList(polyPoints);
}
public function CycleAnimationEx():Boolean{
var looped:Boolean;
frame = (frame + frameVel);
var numFrames:* = (maxFrame - minFrame);
if (frame > maxFrame){
frame = (frame - numFrames);
looped = true;
};
if (frame < minFrame){
frame = (frame + numFrames);
looped = true;
};
return (looped);
}
public function InitTextMessage(_message:String, _x:Number, _y:Number):void{
textMessage = _message;
updateFunction = UpdateTextMessage;
renderFunction = RenderTextMessage;
timer = 50;
xpos = _x;
ypos = _y;
}
function UpdateMessage(){
xpos = (320 + Game.scrollX);
ypos = (100 + Game.scrollY);
timer--;
if (timer <= 0){
killed = true;
};
}
public function GetObjectRectangle():Rectangle{
return (objectDef.colRects[0]);
}
function InitGrunt_Bounce():void{
updateFunction = UpdateGrunt_Bounce;
reloadFunction = ReloadGrunt_Bounce;
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
}
function RenderSpeedyBlur(ang:Number, quality:int=1):void{
var bbd:BitmapData = Game.main.hitTestBD;
var w = 60;
var w2:int = (w / 2);
var r:Rectangle = new Rectangle(0, 0, w, w);
bbd.fillRect(r, 0);
GraphicObjects.RenderAtRotScaled(graphicID, frame, bbd, w2, w2, 1, -(ang), null, false);
bbd.applyFilter(bbd, r, new Point(0, 0), new BlurFilter(8, 1, quality));
var scale:Number = 1.2;
var mat:Matrix = new Matrix();
mat.identity();
mat.translate(-(w2), -(w2));
mat.scale(scale, 1);
mat.rotate(ang);
mat.translate(xpos, ypos);
bd.draw(bbd, mat, null, null, null, false);
}
function LoseTarget_Homer():void{
killed = true;
}
public function InitPhysicsFloorObject(_id:int, _rot:Number){
frame = _id;
dir = _rot;
}
function RenderHealthBar(xoff:Number, yoff:Number){
if (renderHealthBarTimer == 0){
return;
};
var rect:Rectangle = new Rectangle(-5, 0, 10, 3);
rect.x = (rect.x + (xpos + xoff));
rect.y = (rect.y + (ypos + yoff));
bd.fillRect(rect, 4286578688);
rect.width = Utils.ScaleTo(0, 10, 0, maxHealth, health);
bd.fillRect(rect, 4294901760);
}
function DoBounce():Boolean{
var min:Number = 0;
var maxx:Number = Defs.displayarea_w;
var maxy:Number = Defs.displayarea_h;
if (xpos < min){
xpos = min;
movementVec.ReflectAng((-(Math.PI) / 2));
return (true);
};
if (xpos > maxx){
xpos = maxx;
movementVec.ReflectAng((Math.PI / 2));
return (true);
};
if (ypos < min){
ypos = min;
movementVec.ReflectAng(0);
return (true);
};
if (ypos > maxy){
ypos = maxy;
movementVec.ReflectAng(Math.PI);
return (true);
};
return (false);
}
function InitBullet_Homer(wi:WeaponTypeItem, goStart:GameObj, goEnd:GameObj):void{
colFlag_isBullet = true;
updateFunction = UpdateBullet_Homer;
hitFunction = HitBullet;
loseTargetFunction = LoseTarget_Homer;
frame = 0;
dir = Math.atan2((goEnd.ypos - goStart.ypos), (goEnd.xpos - goStart.xpos));
movementVec.Set(dir, wi.speed);
timer = 30;
radius = 10;
targetGO = goEnd;
}
function PlayerHitByBullet(goBullet:GameObj):void{
var go:GameObj;
if (flashTimer > 0){
return;
};
Game.health--;
if (Game.health < 0){
Game.health = 0;
go = GameObjects.AddObj(xpos, ypos, -100);
go.InitPlayerExplosion(true);
speedy = false;
} else {
go = GameObjects.AddObj(xpos, ypos, -100);
go.InitPlayerExplosion(false);
};
flashTimer = (flashTimerMax = (Defs.fps * 2));
Game.PanelOverlay_UpdateHealth();
}
function RenderGraphicNormally(_gid:int, _frame:int, _xpos:Number, _ypos:Number, _scale:Number=1, _dir:Number=0, _useScroll:Boolean=true){
var xp:Number = _xpos;
var yp:Number = _ypos;
if (((!((_scale == 1))) || (!((_dir == 0))))){
GraphicObjects.RenderAtRotScaled(_gid, _frame, bd, xp, yp, _scale, _dir, null, renderSmooth);
} else {
GraphicObjects.RenderAt(_gid, _frame, bd, xp, yp);
};
}
function InitGrunt_CurveBounce():void{
updateFunction = UpdateGrunt_CurveBounce;
reloadFunction = ReloadGrunt_CurveBounce;
movementVec.Set(Utils.RandCircle(), gruntDef.speed);
maxRotVel = gruntDef.turnSpeed;
rotVel = Utils.RandPositiveNegative(maxRotVel);
}
function InitEnemyBullet(_fixedAngle:Number=-1, _rotOffset:Number=0, _speed:Number=1){
updateFunction = UpdateEnemyBullet;
colFlag_isEnemyBullet = true;
var px:Number = Game.goPlayer.xpos;
var py:Number = Game.goPlayer.ypos;
if (_fixedAngle < 0){
movementVec.SetAngFromCoordinates(xpos, ypos, px, py);
} else {
movementVec.rot = _fixedAngle;
};
movementVec.rot = (movementVec.rot + _rotOffset);
movementVec.speed = _speed;
graphicID = GraphicObjects.GetIndexByName("EnemyWeapon01");
frame = 0;
timer = 50;
}
function InitBullet_Vortex(wi:WeaponTypeItem, goStart:GameObj, goEnd:GameObj):void{
colFlag_isBullet = true;
colFlag_isVortex = true;
updateFunction = UpdateBullet_Vortex;
hitFunction = HitBullet_Vortex;
frame = 0;
var d:Number = Math.atan2((goEnd.ypos - goStart.ypos), (goEnd.xpos - goStart.xpos));
d = (d + wi.dir);
if (wi.absoluteDir){
d = wi.dir;
};
var spd:Number = wi.speed;
xvel = (Math.cos(d) * spd);
yvel = (Math.sin(d) * spd);
timer = (Defs.fps * 3);
radius = 10;
health = wi.health;
frameVel = 1;
}
function UpdateGrunt_Random():void{
UpdateGrunt_All();
driveVec.SetAngFromCoordinates(xpos, ypos, toPosX, toPosY);
driveVec.speed = gruntDef.turnSpeed;
movementVec.Add(driveVec);
if (movementVec.speed > gruntDef.speed){
movementVec.speed = gruntDef.speed;
};
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
if (Utils.DistBetweenPoints(xpos, ypos, toPosX, toPosY) < 20){
toPosX = Utils.RandBetweenFloat(50, (Defs.displayarea_w - 50));
toPosY = Utils.RandBetweenFloat(50, (Defs.displayarea_h - 50));
};
}
public function PlayAnimationEx():Boolean{
var looped:Boolean;
frame = (frame + frameVel);
var numFrames:* = (maxFrame - minFrame);
if (frame > maxFrame){
if (frame > maxFrame){
frame = maxFrame;
looped = true;
};
};
if (frame < minFrame){
frame = minFrame;
looped = true;
};
return (looped);
}
function Anim_FromVel():void{
var maxFrames:int = GraphicObjects.GetNumFrames(graphicID);
var dx:Number = xvel;
var dy:Number = yvel;
var ang:* = Math.atan2(dy, dx);
frame = ((maxFrames / (Math.PI * 2)) * -(ang));
if (frame < 0){
frame = (frame + maxFrames);
};
if (frame > maxFrames){
frame = (frame - maxFrames);
};
frame = (frame + (maxFrames / 2));
if (frame > maxFrames){
frame = (frame - maxFrames);
};
}
function UpdateEnemyPickup(){
var gop:GameObj = Game.goPlayer;
movementVec.SetAngFromCoordinates(xpos, ypos, gop.xpos, gop.ypos);
movementVec.speed = (movementVec.speed + 0.5);
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
if (Utils.Dist2BetweenPoints(xpos, ypos, gop.xpos, gop.ypos) < (40 * 40)){
killed = true;
};
timer--;
if (timer <= 0){
killed = true;
};
}
function Generator_GeneratePickup():void{
var d:Number = Utils.RandBetweenFloat(0, 1);
var dx:Number = (toPosX - xpos);
var dy:Number = (toPosY - ypos);
var x:Number = (xpos + (dx * d));
var y:Number = (ypos + (dy * d));
Game.GeneratePickup(x, y);
}
function InitGenerator(wd:WaveDef):void{
var dx:Number;
var dy:Number;
var i:int;
var xx:Number;
var yy:Number;
var gp:GeneratorPoint;
gruntDef = Game.GetGruntDefByName(wd.enemy);
zpos = 1000;
updateFunction = UpdateGenerator;
renderFunction = RenderGenerator;
var cx:Number = Utils.RandBetweenFloat(150, (Defs.displayarea_w - 150));
var cy:Number = Utils.RandBetweenFloat(150, (Defs.displayarea_h - 150));
var dir:Number = Utils.RandCircle();
var len:Number = Utils.RandBetweenFloat(100, 150);
dx = (Math.cos(dir) * len);
dy = (Math.sin(dir) * len);
xpos = (cx - dx);
ypos = (cy - dy);
toPosX = (cx + dx);
toPosY = (cy + dy);
timer = 0;
timerMax = 10;
controlMode = 0;
generateCount = 0;
generateCountMax = Utils.RandBetweenInt(wd.amountMin, wd.amountMax);
generateTimeMax = 5;
generatePickupCount = 0;
generatePickupCountMax = generateCountMax;
if (Game.currentLevel < 3){
generatePickupCountMax = (generatePickupCountMax + 3);
};
generatePickupTimeMax = 5;
scale = 1;
generatorPoints = new Array();
var num = 40;
dx = ((toPosX - xpos) / num);
dy = ((toPosY - ypos) / num);
var x:Number = xpos;
var y:Number = ypos;
i = 0;
while (i < num) {
xx = (x + Utils.RandBetweenFloat(-10, 10));
yy = (y + Utils.RandBetweenFloat(-10, 10));
gp = new GeneratorPoint(xx, yy);
x = (x + dx);
y = (y + dy);
generatorPoints.push(gp);
i++;
};
SoundPlayer.Play("sfx_tear");
}
function GetAngleToPlayer(randOffset:Number=0):Number{
var dx:Number = (Game.goPlayer.xpos - xpos);
var dy:Number = (Game.goPlayer.ypos - ypos);
var ang:Number = Math.atan2(dy, dx);
randOffset = Utils.DegToRad(randOffset);
ang = (ang + Utils.RandBetweenFloat(-(randOffset), randOffset));
return (ang);
}
function UnregisterTargetLocks(){
var go:GameObj;
for each (go in GameObjects.objs) {
if (go.active){
if (go.loseTargetFunction != null){
if (go.targetGO.index == index){
go.loseTargetFunction();
};
};
};
};
}
public function PlayAnimation1():Boolean{
var maxframe:int = (GraphicObjects.GetNumFrames(graphicID1) - 1);
frame1 = (frame1 + frameVel1);
if (frame1 >= maxframe){
frame1 = maxframe;
return (true);
};
return (false);
}
function InitExplosion(_type:int, _large:Boolean=false):void{
updateFunction = UpdateExplosion;
frame = 0;
if (_type == 0){
graphicID = GraphicObjects.GetIndexByName("explosion_1");
};
if (_type == 1){
graphicID = GraphicObjects.GetIndexByName("explosion_2");
};
if (_type == 2){
graphicID = GraphicObjects.GetIndexByName("explosion_3");
};
frameVel = 1;
if (_large){
frameVel = 0.5;
if (_type == 0){
graphicID = GraphicObjects.GetIndexByName("explosion_1_large");
};
if (_type == 1){
graphicID = GraphicObjects.GetIndexByName("explosion_2_large");
};
if (_type == 2){
graphicID = GraphicObjects.GetIndexByName("explosion_3_large");
};
};
}
function HitPickup(){
var stage:int = (Game.currentLevel / 3);
Game.AddCash((10 * (stage + 1)));
killed = true;
Game.numPickupsActive--;
SoundPlayer.Play("sfx_pickup");
if (Game.numPickupsCollected == 0){
SoundPlayer.Play("sfx_pickups", 3);
};
Game.numPickupsCollected++;
}
function RenderPickup(){
if ((((timer < Defs.fps)) && (((timer & 1) == 0)))){
return;
};
if (speedy){
RenderSpeedyBlur(speedyAng, 1);
} else {
RenderNormally();
};
}
function InitPickup():void{
frame = 0;
graphicID = GraphicObjects.GetIndexByName("Antibody");
updateFunction = UpdatePickup;
renderFunction = RenderPickup;
hitFunction = HitPickup;
colFlag_canBePickedUp = true;
speed = Utils.RandBetweenFloat(1.5, 3);
movementVec.Set(Utils.RandCircle(), speed);
Game.numPickupsActive++;
scale = 0.1;
timer = (Defs.fps * 5);
frame = Utils.RandBetweenInt(0, (GraphicObjects.GetNumFrames(graphicID) - 1));
frameVel = 1;
speedy = false;
timer1 = Utils.RandBetweenInt(0, 1000);
}
function UpdateGenerator():void{
if (controlMode == 0){
timer++;
if (timer > timerMax){
timer = 30;
controlMode = 1;
};
} else {
if (controlMode == 1){
timer--;
if (timer <= 0){
controlMode = 2;
timer = 0;
};
} else {
if (controlMode == 2){
timer--;
if (timer <= 0){
if (Game.numGruntsActive < Game.maxGruntsActive){
Generator_GenerateEnemy();
};
timer = generateTimeMax;
generateCount++;
if (generateCount >= generateCountMax){
controlMode = 3;
timer = 0;
};
};
} else {
if (controlMode == 3){
timer--;
if (timer <= 0){
if (Game.numGruntsActive < Game.maxGruntsActive){
Generator_GeneratePickup();
};
timer = generatePickupTimeMax;
generatePickupCount++;
if (generatePickupCount >= generatePickupCountMax){
controlMode = 4;
timer = 0;
SoundPlayer.Play("sfx_tear");
};
};
} else {
if (controlMode == 4){
timer++;
if (timer >= timerMax){
killed = true;
};
};
};
};
};
};
}
function UpdateGrunt_Square_Burst():void{
UpdateGrunt_All();
toPosX = Game.goPlayer.xpos;
toPosY = Game.goPlayer.ypos;
if (controlMode == 0){
xpos = (xpos + movementVec.GetXComponent());
ypos = (ypos + movementVec.GetYComponent());
timer--;
if (timer <= 0){
timer = (Utils.RandBetweenFloat((gruntDef.burstTime / 2), gruntDef.burstTime) * Defs.fps);
movementVec.Set(GetRandSquareAngleBiasedTowardsPlayer(), gruntDef.speed);
};
};
}
}
}//package
Section 148
//GameObjects (GameObjects)
package {
import flash.events.*;
import flash.display.*;
class GameObjects {
public static var numobjs;
static var m:Main;
public static var zorder:Array;
public static var objs:Array;
public static var lastGenIndex:int;
function GameObjects(){
super();
}
public function GameObjGroup(){
}
public static function Update():void{
var i:int;
i = 0;
while (i < objs.length) {
if (objs[i].active == true){
objs[i].Update();
};
i++;
};
}
public static function Render(bd:BitmapData):void{
var go:GameObj;
var list:Array = new Array();
for each (go in objs) {
if (((go.active) && (go.visible))){
list.push(go);
};
};
list.sortOn("zpos", (Array.NUMERIC | Array.DESCENDING));
for each (go in list) {
go.Render(bd);
};
}
public static function KillObjects():void{
var i:int;
i = 0;
while (i < objs.length) {
if ((((objs[i].active == true)) && (objs[i].killed))){
objs[i].active = false;
};
i++;
};
}
public static function InitOnce(_main:Main, _numObjs:int){
var i:*;
numobjs = _numObjs;
m = _main;
objs = new Array();
zorder = new Array(numobjs);
i = 0;
while (i < numobjs) {
objs.push(new GameObj(i));
i++;
};
}
public static function ClearAll(){
var i:int;
i = 0;
while (i < numobjs) {
objs[i].active = false;
i++;
};
}
public static function CountActive():int{
var i:int;
var count:int;
i = 0;
while (i < objs.length) {
if (objs[i].active == true){
count++;
};
i++;
};
return (count);
}
public static function AddObj(_xpos:Number, _ypos:Number, _zpos:Number):GameObj{
var i:int;
var go:GameObj;
i = 0;
while (i < numobjs) {
if (objs[i].active == false){
go = objs[i];
go.active = true;
go.zpos = _zpos;
go.xpos = _xpos;
go.ypos = _ypos;
go.startx = _xpos;
go.starty = _ypos;
go.startz = _zpos;
go.Init(0);
lastGenIndex = i;
return (objs[i]);
};
i++;
};
trace("ERROR! NO FREE OBJECTS");
lastGenIndex = -1;
return (null);
}
public static function ForEachActive(cb:Function):void{
var go:GameObj;
var list:Array = new Array();
for each (go in objs) {
if (go.active){
cb(go);
};
};
}
public static function GetGOByIndex(_index:int):GameObj{
return (objs[_index]);
}
}
}//package
Section 149
//gameOverScreen (gameOverScreen)
package {
import flash.display.*;
public dynamic class gameOverScreen extends MovieClip {
public var buttonQuit:SimpleButton;
public var buttonContinue:SimpleButton;
}
}//package
Section 150
//GeneratorPoint (GeneratorPoint)
package {
public class GeneratorPoint {
var timer:int;
var x:Number;
var y:Number;
public function GeneratorPoint(_x:Number, _y:Number){
super();
x = _x;
y = _y;
timer = 0;
}
}
}//package
Section 151
//GraphicObjects (GraphicObjects)
package {
import flash.text.*;
import flash.display.*;
import flash.geom.*;
import flash.utils.*;
public class GraphicObjects {
static var main:Main;
static var graphicobjs:Array;
static var nameList:Array;
public static var gfx_fontblack:int;
static var nextID:int;
static var idList:Array;
public static var stringCharBitmapData:BitmapData;
public static var gfx_font2black:int;
public static var stringCharY:Number;
public static var stringCharX:Number;
public static var gfx_font1:int;
public static var gfx_font2:int;
public function GraphicObjects(){
super();
}
public static function Add(mcName:String, flags:int):int{
var _id:* = nextID;
nextID++;
var classRef:Class = (getDefinitionByName(mcName) as Class);
var mc:MovieClip = (new (classRef) as MovieClip);
Add1(_id, new DisplayObj(mc, 1, flags), mcName);
mc = null;
return (_id);
}
public static function GetPixelAt(gindex:int, _frame:int, _x:int, _y:int):uint{
var bd:BitmapData = graphicobjs[gindex].frames[_frame].bitmapData;
var pix:uint = bd.getPixel32(_x, _y);
return (pix);
}
public static function GetHeight(gindex:int, _frame:int):int{
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
return (dof.bitmapData.height);
}
public static function RenderAtRotScaled(gindex:int, _frame:int, screenBD:BitmapData, xpos:Number, ypos:Number, renderScale:Number=1, rot:Number=0, ct:ColorTransform=null, _doSmooth:Boolean=false){
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
dof.RenderAtRotScaled(screenBD, xpos, ypos, renderScale, rot, ct, _doSmooth);
}
public static function Add1(_id:int, dispobj:DisplayObj, name:String=""):void{
nameList.push(name);
graphicobjs.push(dispobj);
}
public static function InitOnce(_main:Main):void{
main = _main;
graphicobjs = new Array();
nameList = new Array();
nextID = 0;
AddGraphics();
}
public static function GetOffsetX(gindex:int, _frame:int):int{
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
return (dof.xoffset);
}
public static function GetOffsetY(gindex:int, _frame:int):int{
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
return (dof.yoffset);
}
public static function RenderAt(gindex:int, _frame:int, screenBD:BitmapData, xpos:Number, ypos:Number){
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
dof.RenderAt(screenBD, xpos, ypos);
}
public static function GetIndexByName(_name:String):int{
var s:String;
var i:int;
for each (s in nameList) {
if (s == _name){
return (i);
};
i++;
};
trace(("cant find graphic obj by name: " + _name));
return (0);
}
public static function RenderNumberAt(screenBD:BitmapData, fontGfxID:int, x:Number, y:Number, num:int){
var i:int;
var a:int;
var d:int;
var b:BitmapData;
var digits:Array = new Array();
var n:int = num;
i = 0;
while (i < 11) {
a = (n % 10);
digits.push(a);
n = (n / 10);
i++;
};
var doit:Boolean;
i = (digits.length - 1);
while (i--) {
d = digits[i];
if ((((doit == false)) && (!((d == 0))))){
doit = true;
};
if (doit){
RenderAt(fontGfxID, (d + 48), screenBD, x, y);
b = GetBitmapData(fontGfxID, (d + 48));
x = (x + b.width);
};
(i >= 0);
};
return (x);
}
public static function GetStringWidth(screenBD:BitmapData, fontGfxID:int, x:Number, y:Number, str:String, nextCharCallback:Object=null, xoff:int=0):int{
var i:int;
var a:int;
stringCharX = x;
stringCharY = y;
var width:int;
i = 0;
while (i < str.length) {
a = int(str.charCodeAt(i));
if (a < 0){
a = 0;
};
if (a > 127){
a = 127;
};
stringCharBitmapData = GetBitmapData(fontGfxID, a);
if (nextCharCallback != null){
} else {
width = (width + (stringCharBitmapData.width - 3));
width = (width + xoff);
};
i++;
};
return (width);
}
public static function GetBitmapData(gindex:int, _frame:int):BitmapData{
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
return (dof.bitmapData);
}
static function AddGraphics():void{
gfx_font1 = AddFont(main.tf_scorespr);
gfx_fontblack = AddFont(main.tf_scoresprblack);
gfx_font2 = AddFont(main.tf_scorespr1);
gfx_font2black = AddFont(main.tf_scorespr2);
Add("levelBackgrounds", 0);
Add("explosion_1", 0);
Add("explosion_2", 0);
Add("explosion_3", 0);
Add("explosion_1_large", 0);
Add("explosion_2_large", 0);
Add("explosion_3_large", 0);
Add("PlayerHitExplosion", 0);
Add("PlayerDieExplosion", 0);
Add("Enemy01", 0);
Add("Enemy01a", 0);
Add("Enemy01_Med", 0);
Add("Enemy01_Boss", 0);
Add("Enemy02", 0);
Add("Enemy02a", 0);
Add("Enemy02_Med", 0);
Add("Enemy02_Boss", 0);
Add("Enemy03", 0);
Add("Enemy03a", 0);
Add("Enemy03_Med", 0);
Add("Enemy03_Boss", 0);
Add("Enemy04", 0);
Add("Enemy04a", 0);
Add("Enemy04_Med", 0);
Add("Enemy04_Boss", 0);
Add("Enemy05", 0);
Add("Enemy05a", 0);
Add("Enemy05_Med", 0);
Add("Enemy05_Boss", 0);
Add("Enemy06", 0);
Add("Enemy06a", 0);
Add("Enemy06_Med", 0);
Add("Enemy06_Boss", 0);
Add("Enemy07", 0);
Add("Enemy07a", 0);
Add("Enemy07_Med", 0);
Add("Enemy07_Boss", 0);
Add("Enemy08", 0);
Add("Enemy08a", 0);
Add("Enemy08_Med", 0);
Add("Enemy08_Boss", 0);
Add("EnemyRick", 0);
Add("Antibody", 0);
Add("Weapon01", 0);
Add("Weapon02", 0);
Add("Weapon03", 0);
Add("Weapon04", 0);
Add("Weapon05", 0);
Add("Weapon06", 0);
Add("Weapon07", 0);
Add("EnemyWeapon01", 0);
Add("PlayerShip", 0);
Add("PlayerShipGun", 0);
Add("PlayerShipGun1", 0);
Add("Stars", 0);
Add("rick", 0);
}
public static function AddFont(tf:TextFormat):int{
var _id:* = nextID;
nextID++;
var dispobj:DisplayObj = new DisplayObj(null, 0, 0);
dispobj.CreateFont(tf);
nameList.push(tf.font);
graphicobjs.push(dispobj);
return (_id);
}
public static function RenderStringAt(screenBD:BitmapData, fontGfxID:int, x:Number, y:Number, str:String, nextCharCallback:Object=null, xoff:int=0){
var i:int;
var a:int;
stringCharX = x;
stringCharY = y;
i = 0;
while (i < str.length) {
a = int(str.charCodeAt(i));
if (a < 0){
a = 0;
};
if (a > 127){
a = 127;
};
RenderAt((fontGfxID + 1), a, screenBD, (stringCharX + 1), (stringCharY + 1));
RenderAt(fontGfxID, a, screenBD, stringCharX, stringCharY);
stringCharBitmapData = GetBitmapData(fontGfxID, a);
if (nextCharCallback != null){
nextCharCallback();
} else {
stringCharX = (stringCharX + (stringCharBitmapData.width - 3));
stringCharX = (stringCharX + xoff);
};
i++;
};
}
public static function RenderAtAdditive(gindex:int, _frame:int, screenBD:BitmapData, xpos:Number, ypos:Number){
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
dof.RenderAtAdditive(screenBD, xpos, ypos);
}
public static function GetNumFrames(gindex:int):int{
return (graphicobjs[gindex].frames.length);
}
public static function GetWidth(gindex:int, _frame:int):int{
var dof:DisplayObjFrame = graphicobjs[gindex].frames[_frame];
return (dof.bitmapData.width);
}
}
}//package
Section 152
//GruntDef (GruntDef)
package {
public class GruntDef {
var speed:Number;
var hp:int;
var turnSpeed:Number;
var name:String;
var burstTime:Number;
var shotDefs:Array;
var movieClipName:String;
var cash:int;
var isboss:Boolean;
var initFuncName:String;
public function GruntDef(){
super();
hp = 1;
name = "";
movieClipName = "";
speed = 1;
cash = 0;
initFuncName = "";
turnSpeed = 0;
burstTime = 0;
isboss = false;
shotDefs = new Array();
}
}
}//package
Section 153
//GruntWave (GruntWave)
package {
public class GruntWave {
var waveGroups:Array;
public function GruntWave(){
super();
waveGroups = new Array();
}
public function Activate(){
var wg:GruntWaveGroup;
for each (wg in waveGroups) {
wg.active = true;
wg.Reset();
};
}
public function Update(){
var wg:GruntWaveGroup;
for each (wg in waveGroups) {
wg.Update();
};
}
}
}//package
Section 154
//GruntWaveGroup (GruntWaveGroup)
package {
public class GruntWaveGroup {
var startDelay:int;
var mode:int;
var timer:int;
var active:Boolean;
var genGap:int;
var generateFunction:Function;
var gruntName:String;
var counter:int;
var genCount:int;
public function GruntWaveGroup(){
super();
startDelay = 0;
gruntName = "";
genGap = 0;
genCount = 0;
active = false;
generateFunction = null;
}
public function Generate(){
generateFunction(gruntName);
}
public function Update(){
if (active == false){
return;
};
if (mode == 0){
timer--;
if (timer <= 0){
mode = 1;
timer = 0;
counter = 0;
};
} else {
if (mode == 1){
timer--;
if (timer <= 0){
timer = genGap;
Generate();
counter++;
if (counter >= genCount){
active = false;
};
};
};
};
}
public function Reset(){
active = true;
timer = startDelay;
mode = 0;
}
}
}//package
Section 155
//hud (hud)
package {
import flash.display.*;
public dynamic class hud extends MovieClip {
public var bossHealth:MovieClip;
public var cash:MovieClip;
public var kills:MovieClip;
public var controls:MovieClip;
public var score:MovieClip;
public var health:MovieClip;
}
}//package
Section 156
//Ingame1 (Ingame1)
package {
import flash.media.*;
public dynamic class Ingame1 extends Sound {
}
}//package
Section 157
//Ingame2 (Ingame2)
package {
import flash.media.*;
public dynamic class Ingame2 extends Sound {
}
}//package
Section 158
//Ingame3 (Ingame3)
package {
import flash.media.*;
public dynamic class Ingame3 extends Sound {
}
}//package
Section 159
//Ingame4 (Ingame4)
package {
import flash.media.*;
public dynamic class Ingame4 extends Sound {
}
}//package
Section 160
//Ingame5 (Ingame5)
package {
import flash.media.*;
public dynamic class Ingame5 extends Sound {
}
}//package
Section 161
//Ingame6 (Ingame6)
package {
import flash.media.*;
public dynamic class Ingame6 extends Sound {
}
}//package
Section 162
//Intro_ArmorGames (Intro_ArmorGames)
package {
import flash.display.*;
public dynamic class Intro_ArmorGames extends MovieClip {
public function Intro_ArmorGames(){
addFrameScript(216, frame217);
}
function frame217(){
stop();
}
}
}//package
Section 163
//Intro_MouseBreaker (Intro_MouseBreaker)
package {
import flash.display.*;
public dynamic class Intro_MouseBreaker extends MovieClip {
public var exp:MovieClip;
public function Intro_MouseBreaker(){
addFrameScript(0, frame1, 105, frame106);
}
function frame106(){
MovieClip(parent).play();
stop();
}
function frame1(){
}
}
}//package
Section 164
//KeyReader (KeyReader)
package {
import flash.events.*;
import flash.display.*;
public class KeyReader {
static const KEY_LEFT = 37;
static const KEY_HASH = 222;
static const KEY_LEFTSQUAREBRACKET = 219;
static const KEY_0 = 58;
static const KEY_1 = 49;
static const KEY_2 = 50;
static const KEY_3 = 51;
static const KEY_4 = 52;
static const KEY_5 = 53;
static const KEY_7 = 55;
static const KEY_8 = 56;
static const KEY_9 = 57;
static const KEY_6 = 54;
static const KEY_A = 65;
static const KEY_B = 66;
static const KEY_C = 67;
static const KEY_E = 69;
static const KEY_F = 70;
static const KEY_G = 71;
static const KEY_H = 72;
static const KEY_I = 73;
static const KEY_J = 74;
static const KEY_D = 68;
static const KEY_L = 76;
static const KEY_M = 77;
static const KEY_N = 78;
static const KEY_O = 79;
static const KEY_P = 80;
static const KEY_Q = 81;
static const KEY_R = 82;
static const KEY_S = 83;
static const KEY_T = 84;
static const KEY_U = 85;
static const KEY_V = 86;
static const KEY_W = 87;
static const KEY_X = 88;
static const KEY_Y = 89;
static const KEY_K = 75;
static const KEY_RIGHTSQUAREBRACKET = 221;
static const KEY_Z = 90;
static const KEY_SHIFT = 16;
static const KEY_CONTROL = 17;
static const KEY_SEMICOLON = 186;
static const KEY_NUM_0 = 96;
static const KEY_NUM_2 = 98;
static const KEY_UP = 38;
static const KEY_NUM_6 = 102;
static const KEY_NUM_1 = 97;
static const KEY_NUM_3 = 99;
static const KEY_DOWN = 40;
static const KEY_NUM_5 = 101;
static const KEY_NUM_7 = 103;
static const KEY_NUM_9 = 105;
static const KEY_NUM_4 = 100;
static const KEY_NUM_8 = 104;
static const KEY_TOPLEFT = 223;
static const KEY_BACKSLASH = 220;
static const KEY_FORWARDSLASH = 191;
static const KEY_SPACE = 32;
static const KEY_RIGHT = 39;
static var keysPressed:Array;
static var keysDown:Array;
public function KeyReader(){
super();
}
public static function Pressed(keyID:int):Boolean{
return (keysPressed[keyID]);
}
static function keyUpListener(event:KeyboardEvent):void{
var code:int = event.keyCode;
keysDown[code] = 0;
}
static function keyDownListener(event:KeyboardEvent):void{
var code:int = event.keyCode;
var _local3 = keysDown;
var _local4 = code;
var _local5 = (_local3[_local4] + 1);
_local3[_local4] = _local5;
}
public static function UpdateOncePerFrame():void{
var i:int;
i = 0;
while (i < 0x0100) {
if (keysDown[i] == 1){
keysPressed[i] = true;
var _local2 = keysDown;
var _local3 = i;
var _local4 = (_local2[_local3] + 1);
_local2[_local3] = _local4;
} else {
keysPressed[i] = false;
};
i++;
};
}
public static function Down(keyID:int):Boolean{
return (!((keysDown[keyID] == 0)));
}
public static function InitOnce(stage:Stage){
var i:int;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
stage.focus = stage;
keysDown = new Array(0x0100);
keysPressed = new Array(0x0100);
i = 0;
while (i < 0x0100) {
keysDown[i] = int(0);
keysPressed[i] = Boolean(false);
i++;
};
}
}
}//package
Section 165
//Level (Level)
package {
public class Level {
var lastTimeTotal:int;
var lastTime:int;
var name:String;
var category:int;
var exclusiveChar:int;
var bestScore:int;
var score:int;
var bestTimeTotal:int;
var waves:Array;
var fillFrame:int;
var numAntibodiesNeeded:int;
var numEnemiesNeeded:int;
var complete:Boolean;
var endLevelTestFunctionName:String;
var surfaceFrame:uint;
var surfaceThickness:int;
var available:Boolean;
var eventWinParam:Number;
var goldTime:int;
var bestTime:int;
var eventOpponentsString:String;
var helpscreenFrames:Array;
var eventType:String;
var silverTime:int;
var instances:Array;
var lines:Array;
public function Level(){
super();
name = "";
instances = new Array();
helpscreenFrames = new Array();
lines = new Array();
category = 0;
fillFrame = 1;
surfaceFrame = 5;
surfaceThickness = 10;
available = false;
complete = false;
eventType = "none";
eventOpponentsString = "";
eventWinParam = 1;
exclusiveChar = 1;
lastTime = 9999999;
lastTimeTotal = 9999999;
bestTime = 9999999;
bestTimeTotal = 9999999;
goldTime = (10 * Defs.fps);
silverTime = (20 * Defs.fps);
score = 0;
bestScore = 0;
waves = new Array();
numAntibodiesNeeded = 0;
numEnemiesNeeded = 0;
endLevelTestFunctionName = "";
}
public function Calculate(){
}
}
}//package
Section 166
//levelBackgrounds (levelBackgrounds)
package {
import flash.display.*;
public dynamic class levelBackgrounds extends MovieClip {
}
}//package
Section 167
//levelSelect (levelSelect)
package {
import flash.display.*;
public dynamic class levelSelect extends MovieClip {
public var level1:selectButton;
public var level2:selectButton;
public var level3:selectButton;
public var level4:selectButton;
public var level5:selectButton;
public var level6:selectButton;
public var level7:selectButton;
public var level8:selectButton;
}
}//package
Section 168
//Lic (Lic)
package {
import flash.events.*;
import flash.display.*;
import org.flashdevelop.utils.*;
import CPMStar.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
public class Lic {
public static const LICENSOR_GAMENINJA = 17;
public static const LICENSOR_ANDKON = 5;
public static const LICENSOR_LONGANIMALS = 21;
public static const LICENSOR_ROBOTJAM = 23;
public static const LICENSOR_ADDICTINGGAMES = 19;
public static const LICENSOR_KING = 10;
public static const LICENSOR_MOUSEBREAKER = 16;
public static const ADTYPE_NONE = 0;
public static const LICENSOR_DEVELOPMENT = 0;
public static const ADTYPE_CPMSTAR = 3;
public static const LICENSOR_NOBRANDING = 12;
public static const LICENSOR_SIKIDS = 14;
public static const LICENSOR_BIGFISH = 6;
public static const ADTYPE_MOCHI_VC = 2;
public static const LICENSOR_KONGREGATE = 1;
public static const LICENSOR_MAXGAMES = 20;
public static const LICENSOR_MINDJOLT = 4;
public static const LICENSOR_ARMORGAMES = 8;
public static const LICENSOR_MINIJUEGOS = 15;
public static const LICENSOR_LONGANIMALS_SITELOCKED = 22;
public static const ADTYPE_MOCHI = 1;
public static const LICENSOR_SHOCKWAVE = 11;
public static const LICENSOR_KIBA = 13;
public static const ADTYPE_NEWGROUNDS = 4;
public static const LICENSOR_NEWGROUNDS = 26;
public static const LICENSOR_MINICLIP = 2;
public static const LICENSOR_BUBBLEBOX = 7;
public static const LICENSOR_GAMEZHERO = 9;
public static const LICENSOR_FOG = 25;
public static const LICENSOR_SPIL = 18;
public static const LICENSOR_FGL = 24;
static var agi;
static var devKey:String = "57e6ffa35f343197fbd276da0a94ccbb";
static var cpmStarLoadTimer:int;
static var stg:MovieClip;
static var ad:DisplayObject = null;
static var MochiBotID_Primary:String = "1be24b74";
static var cpmStarTimer:Timer;
static var CPMStarContentSpotIDs:Array = new Array();
static var urlLoader:Loader;
static var intro:MovieClip;
static var cx:int;
static var cy:int;
static var cpmStarLoaderCounter:int;
static var highscore_callback:Function;
static var licensor:int = 8;
static var MindJoltAPI:Object;
static var CPMStarFixedTime:int = 8;
static var gameKey:String = "zomgies";
static var referral:String = "bostinvoyage";
static var localTest:Boolean = false;
static var oldFrameRate:int = 0;
static var domain:String;
static var showIntroCallback:Function;
static var skus:Array;
static var showAdFinishedCallback:Function;
static var authorLinks:Array = new Array();
public function Lic(){
super();
}
public static function LoadMindjoltAPI(){
var gameParams:Object = LoaderInfo(stg.loaderInfo).parameters;
Security.allowDomain("static.mindjolt.com", "devstatic.mindjolt.com");
urlLoader = new Loader();
urlLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, MJloadFinished);
var url:String = ((gameParams.mjPath) || ("http://static.mindjolt.com/api/as3/scoreapi_as3_local.swf"));
urlLoader.load(new URLRequest(url));
stg.stage.addChild(urlLoader);
}
static function SitelockScreen_Clicked(e:MouseEvent){
Link_LongAnimals(null);
}
public static function Link_RobotJam(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest(("http://www.robotjamgames.com?referral=" + referral)), "_blank");
}
static function InitHighScores_ArmorGames():void{
var agi_url:String = "http://agi.armorgames.com/assets/agi/AGI.swf";
Security.allowDomain(agi_url);
Security.allowInsecureDomain(agi_url);
var urlRequest:URLRequest = new URLRequest(agi_url);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, InitHighScores_ArmorGames_LoadComplete);
loader.load(urlRequest);
}
public static function IsAtKongregate():Boolean{
if (domain == "kongregate.com"){
return (true);
};
return (false);
}
public static function InitFromFlex(_stg:MovieClip):void{
oldFrameRate = 0;
stg = _stg;
domain = GetDomain();
SkuModify();
trace(("Domain: " + domain));
InitSkus();
intro = null;
cx = (Defs.displayarea_w / 2);
cy = (Defs.displayarea_h / 2);
}
static function SkuModify():void{
if (localTest == true){
return;
};
if ((((licensor == LICENSOR_NEWGROUNDS)) && (((!((domain == "newgrounds.com"))) && (!((domain == "ungrounded.net"))))))){
licensor = LICENSOR_ARMORGAMES;
};
if ((((licensor == LICENSOR_ADDICTINGGAMES)) && (!((domain == "addictinggames.com"))))){
licensor = LICENSOR_ARMORGAMES;
};
if ((((licensor == LICENSOR_ROBOTJAM)) && (!((domain == "robotjamgames.com"))))){
licensor = LICENSOR_ARMORGAMES;
};
}
public static function IsAtMindjolt():Boolean{
if (domain == "mindjolt.com"){
return (true);
};
return (false);
}
static function AuthorLinkPressed(e:MouseEvent):void{
if (authorLinks.length == 0){
return;
};
var r:int = Utils.RandBetweenInt(0, (authorLinks.length - 1));
r = Utils.LimitNumber(0, (authorLinks.length - 1), r);
var _local3 = authorLinks;
_local3[r](e);
}
public static function GetSku(skuID:int):LicSku{
var sku:LicSku;
for each (sku in skus) {
if (sku.id == skuID){
return (sku);
};
};
trace(("GetSku invalid SKU: " + skuID));
return (null);
}
public static function ShowAd(_showAdFinishedCallback:Function){
showAdFinishedCallback = _showAdFinishedCallback;
var adtype:int = GetSku(licensor).adtype;
if (adtype == ADTYPE_NONE){
ShowNoAd();
} else {
if (adtype == ADTYPE_MOCHI_VC){
ShowNoAd();
} else {
if (adtype == ADTYPE_MOCHI){
ShowMochiAd();
return (true);
};
if (adtype == ADTYPE_CPMSTAR){
if (FilterAdForSites() == false){
ShowCPMStarAd();
} else {
ShowNoAd();
};
} else {
if (adtype == ADTYPE_NEWGROUNDS){
showAdFinishedCallback();
} else {
FlashConnect.trace("Lic.ShowAd undefined ad", TraceLevel.ERROR);
};
};
};
};
}
static function ShowSitelockedScreen(){
intro.x = cx;
intro.y = cy;
stg.addChild(intro);
intro.addEventListener(MouseEvent.CLICK, SitelockScreen_Clicked);
}
public static function Link_LongAnimals(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest(("http://www.longanimalsgames.com?referral=" + referral)), "_blank");
}
public static function ShowIntro_MiniJuegos():void{
AddIntro("Intro_MiniJuegos");
}
static function InitHighScores_ArmorGames_LoadComplete(e:Event):void{
agi = e.currentTarget.content;
stg.addChild(agi);
agi.init(devKey, gameKey);
}
static function CPMStarLoadingEventCallback(event:Event){
var bytestotal:* = stg.stage.loaderInfo.bytesTotal;
var bytesloaded:* = stg.stage.loaderInfo.bytesLoaded;
var val:Number = ((1 / bytestotal) * bytesloaded);
RenderLoaderBar(val);
if (bytesloaded >= bytestotal){
stg.removeEventListener(Event.ENTER_FRAME, CPMStarLoadingEventCallback);
cpmStarLoaderCounter++;
CPMStarCompleteCallback();
};
}
public static function Link_ArmorGames(event:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.armorgames.com"), "_blank");
}
static function SubmitHighscore_ArmorGames_CloseHandler():void{
stg.removeChild(agi);
if (highscore_callback != null){
highscore_callback();
};
}
public static function ShowCPMStarAd(){
var id:String;
var r:int;
intro = new preloaderMC();
intro.x = 0;
intro.y = 0;
stg.addChild(intro);
intro.buttonSkipCPMStarAd.visible = false;
intro.buttonSkipCPMStarAd.addEventListener(MouseEvent.CLICK, buttonSkipCPMStarAdPressed);
var num:int = CPMStarContentSpotIDs.length;
if (num == 1){
id = CPMStarContentSpotIDs[0];
};
if (num == 2){
r = Utils.RandBetweenInt(0, 1000);
if (r < 500){
id = CPMStarContentSpotIDs[0];
} else {
id = CPMStarContentSpotIDs[1];
};
};
trace(("CPMStar ID " + id));
ad = new AdLoader(id);
intro.adBox.addChild(ad);
cpmStarLoadTimer = 0;
cpmStarLoaderCounter = 0;
stg.addEventListener(Event.ENTER_FRAME, CPMStarLoadingEventCallback);
cpmStarTimer = new Timer(1000);
cpmStarTimer.addEventListener(TimerEvent.TIMER, CPMStarTimerCallback);
cpmStarTimer.start();
}
public static function ShowIntro_Newgrounds():void{
trace(" ShowIntro_Newgrounds ");
AddIntro("Intro_Newgrounds");
}
public static function Link_AddictingGames(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.addictinggames.com"), "_blank");
}
public static function Link_Andkon(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.andkon.com/arcade/"), "_blank");
}
public static function SubmitScore_LongAnimals(s:int, name:String){
var s = s;
var name = name;
var key:int = s;
key = (key + 84563);
key = (key * 7);
key = (key - 276483);
trace(((("submit score " + s) + " key=") + key));
var path = "http://www.longanimalsgames.com/ViewHighScore.php";
var vars:URLVariables = new URLVariables();
vars.game = referral;
vars.submit = 1;
vars.score = s;
vars.key = key;
vars.name = name;
var request:URLRequest = new URLRequest(path);
request.method = URLRequestMethod.POST;
request.data = vars;
trace("Stats sent to server");
trace(request);
sendToURL(request);
//unresolved jump
var _slot1 = e;
trace(_slot1.message);
}
public static function Link_Kongregate(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.kongregate.com/games/LongAnimals/cyclomaniacs?gamereferral=cyclomaniacs"), "_blank");
}
public static function ViewScore_LongAnimals(){
navigateToURL(new URLRequest(("http://www.longanimalsgames.com/ViewHighScore.php?game=" + referral)), "_blank");
}
public static function Twitter_ArmorGames(event:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest(" http://twitter.com/armorgames"), "_blank");
}
public static function InitSkus():void{
var sku:LicSku;
skus = new Array();
sku = new LicSku(LICENSOR_DEVELOPMENT, "Development");
skus.push(sku);
sku = new LicSku(LICENSOR_KONGREGATE, "Kongregate");
sku.introFunction = ShowIntro_Kongregate;
sku.mainLogoName = "kongregate";
sku.linkFunction = Link_Kongregate;
skus.push(sku);
sku = new LicSku(LICENSOR_MINICLIP, "Miniclip");
sku.AddSiteLock("miniclip.com");
skus.push(sku);
sku = new LicSku(LICENSOR_MINDJOLT, "Mindjolt");
skus.push(sku);
sku = new LicSku(LICENSOR_ANDKON, "Andkon");
sku.AddSiteLock("andkon.com");
sku.introFunction = ShowIntro_Andkon;
sku.mainLogoName = "andkon";
sku.linkFunction = Link_Andkon;
skus.push(sku);
sku = new LicSku(LICENSOR_BIGFISH, "BigFish");
sku.AddSiteLock("bigfishgames.de");
sku.AddSiteLock("bigfishgames.fr");
sku.AddSiteLock("bigfishgames.es");
sku.AddSiteLock("bigfishgames.mx");
sku.AddSiteLock("bigfishgames.jp");
skus.push(sku);
sku = new LicSku(LICENSOR_BUBBLEBOX, "BubbleBox");
sku.AddSiteLock("bubblebox.com");
sku.introFunction = ShowIntro_BubbleBox;
sku.mainLogoName = "bubbleBox";
sku.linkFunction = Link_BubbleBox;
skus.push(sku);
sku = new LicSku(LICENSOR_ARMORGAMES, "Armor Games");
sku.introFunction = ShowIntro_ArmorGames;
sku.adtype = ADTYPE_CPMSTAR;
sku.mainLogoName = "armorGames";
sku.linkFunction = Link_ArmorGames;
sku.twitterFunction = Twitter_ArmorGames;
sku.allowAuthorLink = true;
skus.push(sku);
sku = new LicSku(LICENSOR_GAMEZHERO, "GamezHero");
sku.AddSiteLock("gamezhero.com");
skus.push(sku);
sku = new LicSku(LICENSOR_KING, "King");
sku.AddSiteLock("king.com");
sku.AddSiteLock("midasplayer.com");
skus.push(sku);
sku = new LicSku(LICENSOR_SHOCKWAVE, "Shockwave");
sku.AddSiteLock("shockwave.com");
skus.push(sku);
sku = new LicSku(LICENSOR_NOBRANDING, "No branding");
skus.push(sku);
sku = new LicSku(LICENSOR_KIBA, "Kiba");
skus.push(sku);
sku = new LicSku(LICENSOR_SIKIDS, "SI Kids");
sku.AddSiteLock("timeforkids.com");
sku.AddSiteLock("sikids.com");
sku.mainLogoName = "siKids";
sku.linkFunction = Link_SIKids;
skus.push(sku);
sku = new LicSku(LICENSOR_MINIJUEGOS, "MiniJuegos");
sku.AddSiteLock("minijuegos.com");
sku.AddSiteLock("minijuegosgratis.com");
sku.AddSiteLock("72.36.157.12", true);
sku.AddSiteLock("72.36.157.13", true);
sku.AddSiteLock("72.36.157.16", true);
sku.AddSiteLock("72.36.157.14", true);
sku.AddSiteLock("72.36.157.26", true);
sku.AddSiteLock("72.36.157.50", true);
sku.AddSiteLock("72.36.157.11", true);
sku.AddSiteLock("72.36.157.10", true);
sku.AddSiteLock("72.36.157.9", true);
sku.AddSiteLock("72.36.157.8", true);
sku.introFunction = ShowIntro_MiniJuegos;
sku.mainLogoName = "miniJuegos";
sku.linkFunction = Link_MiniJuegos;
skus.push(sku);
sku = new LicSku(LICENSOR_MOUSEBREAKER, "MouseBreaker");
sku.AddSiteLock("mousebreaker.com");
sku.introFunction = ShowIntro_MouseBreaker;
skus.push(sku);
sku = new LicSku(LICENSOR_GAMENINJA, "GameNinja");
sku.AddSiteLock("gameninja.com");
skus.push(sku);
sku = new LicSku(LICENSOR_SPIL, "Spil");
skus.push(sku);
sku = new LicSku(LICENSOR_ADDICTINGGAMES, "Addicting Games");
sku.introFunction = ShowIntro_AddictingGames;
sku.mainLogoName = "addictingGames";
sku.linkFunction = Link_AddictingGames;
sku.AddSiteLock("addictinggames.com");
skus.push(sku);
sku = new LicSku(LICENSOR_MAXGAMES, "MaxGames");
sku.AddSiteLock("maxgames.com");
sku.introFunction = ShowIntro_MaxGames;
sku.mainLogoName = "maxGames";
sku.linkFunction = Link_MaxGames;
skus.push(sku);
sku = new LicSku(LICENSOR_LONGANIMALS, "LongAnimals");
sku.introFunction = ShowIntro_LongAnimals;
sku.adtype = ADTYPE_CPMSTAR;
sku.mainLogoName = "longAnimals";
sku.linkFunction = Link_LongAnimals;
skus.push(sku);
sku = new LicSku(LICENSOR_LONGANIMALS_SITELOCKED, "LongAnimalsSitelocked");
sku.AddSiteLock("longanimalsgames.com");
sku.AddSiteLock("longanimals.com");
sku.introFunction = ShowIntro_LongAnimals;
sku.mainLogoName = "longAnimals";
sku.linkFunction = Link_LongAnimals;
skus.push(sku);
sku = new LicSku(LICENSOR_ROBOTJAM, "RobotJam");
sku.AddSiteLock("robotjam.com");
sku.AddSiteLock("robotjamgames.com");
sku.introFunction = ShowIntro_RobotJam;
sku.scaleIntroToStage = true;
sku.mainLogoName = "robotJam";
sku.linkFunction = Link_RobotJam;
sku.adtype = ADTYPE_CPMSTAR;
skus.push(sku);
sku = new LicSku(LICENSOR_FGL, "FlashGameLicense");
sku.AddSiteLock("flashgamelicense.com");
skus.push(sku);
sku = new LicSku(LICENSOR_FOG, "Free Online Games (FOG)");
sku.introFunction = ShowIntro_FOG;
skus.push(sku);
}
static function IsOnCorrectSite():Boolean{
var s:String;
if (localTest == true){
return (true);
};
var sku:LicSku = GetSku(licensor);
if (sku.sitelocks.length == 0){
return (true);
};
for each (s in sku.sitelocks) {
if (s == domain){
return (true);
};
};
return (false);
}
public static function ShowIntro_RobotJam():void{
AddIntro("Intro_RobotJam");
}
public static function ShowIntro(_showIntroCallback:Function):void{
showIntroCallback = _showIntroCallback;
if (IsOnCorrectSite() == false){
ShowSitelockedScreen();
return;
};
if (GetSku(licensor).introFunction != null){
GetSku(licensor).introFunction();
} else {
showIntroCallback();
};
}
public static function Link_MaxGames(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.maxgames.com"), "_blank");
}
static function TwitterButton(mc:SimpleButton):void{
if (mc == null){
return;
};
var sku:LicSku = GetSku(licensor);
if (sku.twitterFunction == null){
mc.visible = false;
return;
};
mc.addEventListener(MouseEvent.CLICK, sku.twitterFunction, false, 0, true);
}
public static function ShowIntro_AddictingGames():void{
AddIntro("Intro_AddictingGames");
}
public static function ShowIntro_Andkon():void{
AddIntro("Intro_Andkon");
}
static function AddIntro(mcName:String){
var sku:LicSku = GetSku(licensor);
var classRef:Class = (getDefinitionByName(mcName) as Class);
var mc:MovieClip = (new (classRef) as MovieClip);
intro = mc;
stg.addChild(intro);
intro.x = cx;
intro.y = cy;
intro.addEventListener(Event.ENTER_FRAME, AddIntro_EnterFrame, false, 0, true);
if (sku.linkFunction != null){
intro.addEventListener(MouseEvent.CLICK, sku.linkFunction, false, 0, true);
};
if (sku.scaleIntroToStage){
if (Defs.displayarea_w < 640){
intro.scaleX = (intro.scaleY = (640 / intro.width));
};
};
intro.gotoAndPlay(1);
}
public static function Link_MiniJuegos(e:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.minijuegos.com"), "_blank");
}
static function MainLogoButton(mc:MovieClip):void{
var logo:SimpleButton;
if (mc == null){
return;
};
var sku:LicSku = GetSku(licensor);
var num:int = mc.numChildren;
var i:int;
while (i < num) {
logo = (mc.getChildAt(i) as SimpleButton);
if (logo != null){
logo.visible = false;
} else {
FlashConnect.trace("Lic: MainLogo Error. Null child found. (not a button?)");
};
i++;
};
if (sku.mainLogoName != ""){
logo = (mc.getChildByName(sku.mainLogoName) as SimpleButton);
if (logo != null){
logo.visible = true;
if (sku.linkFunction != null){
logo.addEventListener(MouseEvent.CLICK, sku.linkFunction, false, 0, true);
} else {
logo.useHandCursor = false;
};
} else {
FlashConnect.trace(("Lic: MainLogo Error. Can't find logo: " + sku.mainLogoName));
};
};
}
static function buttonSkipCPMStarAdPressed(e:MouseEvent){
FlashConnect.trace("buttonSkipCPMStarAdPressed");
intro.buttonSkipCPMStarAd.removeEventListener(MouseEvent.CLICK, buttonSkipCPMStarAdPressed);
if (ad != null){
intro.adBox.removeChild(ad);
};
stg.removeChild(intro);
intro = null;
if (showAdFinishedCallback != null){
FlashConnect.trace("calling showAdFinishedCallback");
showAdFinishedCallback();
};
}
public static function ShowNoAd(){
intro = new preloaderMC();
intro.x = 0;
intro.y = 0;
stg.addChild(intro);
intro.buttonSkipCPMStarAd.visible = false;
intro.buttonSkipCPMStarAd.addEventListener(MouseEvent.CLICK, buttonSkipCPMStarAdPressed);
cpmStarLoadTimer = 0;
cpmStarLoaderCounter = 1;
stg.addEventListener(Event.ENTER_FRAME, CPMStarLoadingEventCallback);
}
public static function InitFromTimeLine(_stg:MovieClip):void{
oldFrameRate = 0;
stg = _stg;
domain = GetDomain();
SkuModify();
trace(("Domain: " + domain));
InitSkus();
if (GetSku(licensor).initFunction != null){
GetSku(licensor).initFunction();
};
InitHighscores();
intro = null;
cx = (Defs.displayarea_w / 2);
cy = (Defs.displayarea_h / 2);
stg.stop();
}
public static function SubmitScore_MindJolt(s:int):void{
MindJoltAPI.service.submitScore(s);
}
static function ViewScore_ArmorGames(_cb:Function=null){
highscore_callback = _cb;
stg.addChild(agi);
agi.initAGUI({onClose:SubmitHighscore_ArmorGames_CloseHandler});
agi.showScoreboardList();
}
public static function ShowIntro_BubbleBox():void{
AddIntro("Intro_BubbleBox");
}
public static function GetDomain():String{
var url:String = stg.loaderInfo.url;
var urlStart:Number = (url.indexOf("://") + 3);
var urlEnd:Number = url.indexOf("/", urlStart);
var domain:String = url.substring(urlStart, urlEnd);
var LastDot:Number = (domain.lastIndexOf(".") - 1);
var domEnd:Number = (domain.lastIndexOf(".", LastDot) + 1);
domain = domain.substring(domEnd, domain.length);
return (domain);
}
public static function InitHighscores(){
if (Lic.IsAtMindjolt()){
LoadMindjoltAPI();
};
if (licensor == LICENSOR_ARMORGAMES){
InitHighScores_ArmorGames();
};
}
public static function ShowMochiAd(){
MochiAd.showPreGameAd({clip:stg, id:"f26b6fbcebd54ddc", res:"640x480", ad_finished:MochiAdFinished});
}
public static function Link_BubbleBox(event:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.bubblebox.com"), "_blank");
}
public static function ShowIntro_FOG():void{
AddIntro("Intro_FOG");
}
static function CPMStarCompleteCallback(){
if (cpmStarLoaderCounter >= 2){
intro.loaderBar.visible = false;
intro.buttonSkipCPMStarAd.visible = true;
};
}
static function MoreGamesButton(mc:SimpleButton):void{
if (mc == null){
return;
};
var sku:LicSku = GetSku(licensor);
if (sku.linkFunction == null){
mc.visible = false;
return;
};
mc.addEventListener(MouseEvent.CLICK, sku.linkFunction, false, 0, true);
}
public static function Link_SIKids(event:MouseEvent, buttonString:String="intro"){
navigateToURL(new URLRequest("http://www.sikids.com"), "_blank");
}
static function SubmitHighscore_ArmorGames(score:int, _cb:Function=null){
highscore_callback = _cb;
stg.addChild(agi);
agi.initAGUI({onClose:SubmitHighscore_ArmorGames_CloseHandler});
agi.showScoreboardSubmit(score);
}
public static function ShowIntro_MouseBreaker():void{
AddIntro("Intro_MouseBreaker");
}
static function AuthorButton(mc:SimpleButton):void{
if (mc == null){
return;
};
var sku:LicSku = GetSku(licensor);
if (sku.allowAuthorLink == false){
mc.visible = false;
return;
};
mc.addEventListener(MouseEvent.CLICK, AuthorLinkPressed, false, 0, true);
}
private static function MJloadFinished(e:Event){
MindJoltAPI = e.currentTarget.content;
MindJoltAPI.service.connect();
stg.stage.removeChild(urlLoader);
trace("Minjolt Initialised successfully");
}
public static function ShowIntro_LongAnimals():void{
AddIntro("Intro_LongAnimals");
}
public static function FilterAdForSites():Boolean{
if (domain == "kongregate.com"){
return (true);
};
if (domain == "agame.com"){
return (true);
};
if (domain == "armorgames.com"){
return (true);
};
return (false);
}
public static function ShowIntro_ArmorGames():void{
AddIntro("Intro_ArmorGames");
}
static function CPMStarTimerCallback(e:TimerEvent){
cpmStarLoadTimer++;
if (cpmStarLoadTimer >= CPMStarFixedTime){
cpmStarLoaderCounter++;
trace("timer complete");
cpmStarTimer.stop();
CPMStarCompleteCallback();
} else {
cpmStarTimer.start();
};
}
public static function TimeLineComplete():void{
trace("Timeline complete");
if (intro != null){
stg.removeChild(intro);
intro = null;
trace("Timeline complete 1");
};
}
static function Mochibot():void{
}
static function AddIntro_EnterFrame(e:Event){
var sku:LicSku;
if (intro.totalFrames == intro.currentFrame){
sku = GetSku(licensor);
if (sku.linkFunction != null){
intro.removeEventListener(MouseEvent.CLICK, sku.linkFunction);
};
intro.removeEventListener(Event.ENTER_FRAME, AddIntro_EnterFrame);
stg.removeChild(intro);
intro = null;
if (showIntroCallback != null){
showIntroCallback();
};
};
}
public static function ShowIntro_Kongregate():void{
AddIntro("Intro_Kongregate");
}
public static function ShowIntro_MaxGames():void{
AddIntro("Intro_MaxGames");
}
static function RenderLoaderBar(val:Number){
intro.loaderBar.scaleX = val;
}
public static function MochiAdFinished(){
}
public static function GetLicensor():int{
return (licensor);
}
authorLinks.push(Link_LongAnimals);
authorLinks.push(Link_RobotJam);
CPMStarContentSpotIDs.push(String("1558Q6AE2F6BC"));
CPMStarContentSpotIDs.push(String("1560Q216C2889"));
}
}//package
Section 169
//LicSku (LicSku)
package {
public class LicSku {
var sitelocks:Array;
var twitterFunction:Function;
var introFunction:Function;
var name:String;
var mainLogoName:String;
var scaleIntroToStage:Boolean;
var linkFunction:Function;
var allowAuthorLink:Boolean;
var initFunction:Function;
var id:int;
var adtype:int;
public function LicSku(_id:int, _name:String){
super();
id = _id;
name = _name;
introFunction = null;
sitelocks = new Array();
adtype = 0;
mainLogoName = "";
linkFunction = null;
twitterFunction = null;
scaleIntroToStage = false;
allowAuthorLink = true;
initFunction = null;
}
public function AddSiteLock(s:String, fullDomain:Boolean=false){
sitelocks.push(s);
}
}
}//package
Section 170
//Line (Line)
package {
import flash.geom.*;
public class Line {
public var udx:Number;
public var udy:Number;
public var ny:Number;
public var dir:Number;
public var nx:Number;
public var dy:Number;
public var y0:Number;
public var y1:Number;
public var dx:Number;
public var normalDir:Number;
public var length:Number;
public var boundingRect:Rectangle;
public var x0:Number;
public var x1:Number;
public function Line(_x0:Number, _y0:Number, _x1:Number, _y1:Number){
super();
x0 = _x0;
y0 = _y0;
x1 = _x1;
y1 = _y1;
CalcNormal();
CalcBoundingRect();
}
function CalcNormal():void{
dir = Math.atan2((y1 - y0), (x1 - x0));
normalDir = (dir - (Math.PI * 0.5));
nx = Math.cos(normalDir);
ny = Math.sin(normalDir);
dx = (x1 - x0);
dy = (y1 - y0);
length = Math.sqrt(((dx * dx) + (dy * dy)));
udx = Math.cos(dir);
udy = Math.sin(dir);
}
function CalcBoundingRect():void{
var a:Number;
var b:Number;
var c:Number;
var d:Number;
a = x0;
b = x1;
if (a > b){
a = x1;
b = x0;
};
c = y0;
d = y1;
if (c > d){
c = y1;
d = y0;
};
boundingRect = new Rectangle(a, c, ((b - a) + 1), ((d - c) + 1));
}
}
}//package
Section 171
//Main (Main)
package {
import flash.events.*;
import flash.text.*;
import flash.display.*;
import flash.utils.*;
import org.flashdevelop.utils.*;
import flash.ui.*;
public class Main extends MovieClip {
var levelTimerMax:Number;
public var tf_scorespr:TextFormat;
var cheatMode:Boolean;
public var scrollScreenBD:BitmapData;
public var renderHitBD:BitmapData;
var levelTimer:Number;
public var tf_scorespr2:TextFormat;
public var fillScreenMC:MovieClip;
public var layerScreenBD:BitmapData;
public var tf_scorespr1:TextFormat;
public var screenBD:BitmapData;
public var mochiScores;
var ftime:Number;
public var fillScreenMC1:MovieClip;
var gameState:int;// = 0
public var layerScreenB:Bitmap;
public var hitTestBD:BitmapData;
public var scrollScreenB:Bitmap;
var scrollY:Number;// = 0
public var backgroundMC:MovieClip;
public var screenB:Bitmap;
public var steamLayerBD:BitmapData;
var currentTime:Number;// = 0
var secondCounter:Number;// = 0
public var fps:Number;
public var tf_scoresprblack:TextFormat;
private var Font20:Class;
var framecounter:int;// = 0
static const gameState_HIGHSCORES = 5;
static const gameState_TITLE = 0;
static const gameState_LEVEL_PLAY = 2;
public static var theStage:Stage;
static var theRoot:MovieClip;
public function Main(){
Font20 = Main_Font20;
super();
if (stage){
init(null);
} else {
addEventListener(Event.ADDED_TO_STAGE, init);
};
}
function calcFrameTime(){
var oldTime:Number = currentTime;
currentTime = getTimer();
if (currentTime < oldTime){
oldTime = (currentTime - 100);
};
if (currentTime > (oldTime + (100 * 10))){
oldTime = (100 * 10);
};
ftime = ((1 / (1000 / Defs.fps)) * (currentTime - oldTime));
framecounter++;
secondCounter = (secondCounter + (currentTime - oldTime));
if (secondCounter > 1000){
fps = ((Number(framecounter) / secondCounter) * 1000);
framecounter = 0;
secondCounter = 0;
};
ftime = 1;
}
function run(e:Event):void{
KeyReader.UpdateOncePerFrame();
SoundPlayer.UpdateOncePerFrame();
MusicPlayer.UpdateOncePerFrame();
calcFrameTime();
switch (gameState){
case gameState_TITLE:
TitleScreenState.Update(this);
break;
case gameState_HIGHSCORES:
break;
case gameState_LEVEL_PLAY:
RunLevel();
break;
};
}
private function CreateTextField(tf:TextFormat, x:Number, y:Number, txt:String):TextField{
var result:TextField = new TextField();
result.selectable = false;
result.embedFonts = true;
result.autoSize = TextFieldAutoSize.CENTER;
result.x = x;
result.y = y;
result.text = txt;
result.setTextFormat(tf);
addChild(result);
return (result);
}
function EndLevel_KilledEnemies():Boolean{
if (Game.numLevelEnemiesKilled >= Game.numEnemiesNeeded){
return (true);
};
return (false);
}
function init(e:Event){
removeEventListener(Event.ADDED_TO_STAGE, init);
theRoot = this;
theStage = this.root.stage;
FlashConnect.trace("Main start");
SetEverythingUpOnce();
}
function InitStageNoBackground(){
var i:int;
i = (this.numChildren - 1);
while (i >= 0) {
removeChildAt(i);
i--;
};
}
function addedToStage(e:Event){
SetEverythingUpOnce2();
}
function SetGameState(gs:int):void{
gameState = gs;
switch (gameState){
case gameState_TITLE:
Mouse.show();
TitleScreenState.Init(this);
break;
case gameState_HIGHSCORES:
break;
case gameState_LEVEL_PLAY:
InitLevel();
break;
};
}
function InitDrawScreen():void{
screenBD = new BitmapData(Defs.displayarea_w, Defs.displayarea_h, true, 0);
screenB = new Bitmap(screenBD);
scrollScreenBD = new BitmapData(2000, 1200, true, 0);
scrollScreenB = new Bitmap(scrollScreenBD);
layerScreenBD = new BitmapData(Defs.displayarea_w, Defs.displayarea_w, true, 0);
layerScreenB = new Bitmap(layerScreenBD);
renderHitBD = new BitmapData(140, 140, true, 0);
hitTestBD = new BitmapData(100, 100, true, 0);
fillScreenMC = new MovieClip();
fillScreenMC.x = 0;
fillScreenMC.y = 0;
fillScreenMC1 = new MovieClip();
fillScreenMC1.x = 0;
fillScreenMC1.y = 0;
}
function SetEverythingUpOnce3(){
InitStage();
Game.Init(this);
SetGameState(gameState_TITLE);
}
function RunTitle(){
}
function SetEverythingUpOnce():void{
if (stage == null){
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
} else {
SetEverythingUpOnce2();
};
}
function InitFonts():void{
var font:Font = new Font20();
tf_scorespr = new TextFormat();
tf_scorespr1 = new TextFormat();
tf_scorespr2 = new TextFormat();
tf_scoresprblack = new TextFormat();
tf_scorespr.font = font.fontName;
tf_scorespr.size = 12;
tf_scorespr.color = 4294967295;
tf_scorespr1.font = font.fontName;
tf_scorespr1.size = 25;
tf_scorespr1.color = 4294967295;
tf_scorespr2.font = font.fontName;
tf_scorespr2.size = 25;
tf_scorespr2.color = 0;
tf_scoresprblack.font = font.fontName;
tf_scoresprblack.size = 12;
tf_scoresprblack.color = 0;
}
function InitStage(){
var i:int;
i = (this.numChildren - 1);
while (i >= 0) {
removeChildAt(i);
i--;
};
addChild(screenB);
screenB.x = 0;
screenB.y = 0;
}
function AddMovieClip(x:Number, y:Number, mc:MovieClip):MovieClip{
mc.x = x;
mc.y = y;
addChild(mc);
return (mc);
}
function EndLevel_Antibodies():Boolean{
if (Game.numPickupsCollected >= Game.numPickupsNeeded){
return (true);
};
return (false);
}
function SetEverythingUpOnce2():void{
MusicPlayer.InitOnce(this);
SetEverythingUpOnce2a();
}
function EndLevel_Boss():Boolean{
if (Game.bossKilled == true){
return (true);
};
return (false);
}
function Render(){
this.x = 0;
this.y = 0;
Game.Render();
}
function InitLevel(){
InitStageForGame();
Particles.Reset();
MouseControl.Reset();
Particles.Reset();
GameObjects.ClearAll();
Game.InitLevel();
}
function InitStageForGame(){
var i:int;
i = (this.numChildren - 1);
while (i >= 0) {
removeChildAt(i);
i--;
};
addChild(screenB);
screenB.x = 0;
screenB.y = 0;
}
function RunLevel(){
if (PauseMenu.IsPaused() == false){
Game.UpdateGameplay();
};
Render();
}
function SetEverythingUpOnce2a():void{
KeyReader.InitOnce(theStage);
MouseControl.InitOnce(theStage);
SoundPlayer.InitOnce(this);
PauseMenu.InitOnce(this);
Particles.InitOnce(this, 200);
GameObjects.InitOnce(this, 500);
InitDrawScreen();
InitFonts();
GraphicObjects.InitOnce(this);
Stats.InitOnce();
addEventListener(Event.ENTER_FRAME, run);
Game.achievements = new Achievements();
ExternalData.Load(SetEverythingUpOnce3);
}
public function InitComicBookFrameFunc(){
FlashConnect.trace("PASdn");
trace("PASdn");
}
}
}//package
Section 172
//Main_Font20 (Main_Font20)
package {
import mx.core.*;
public class Main_Font20 extends FontAsset {
}
}//package
Section 173
//MainLogo (MainLogo)
package {
import flash.display.*;
public dynamic class MainLogo extends MovieClip {
public var armorGames:SimpleButton;
public var siKids:SimpleButton;
public var miniJuegos:SimpleButton;
public var kongregate:SimpleButton;
public var robotJam:SimpleButton;
public var andkon:SimpleButton;
public var longAnimals:SimpleButton;
public var maxGames:SimpleButton;
public var bubbleBox:SimpleButton;
}
}//package
Section 174
//MochiAd (MochiAd)
package {
import flash.events.*;
import flash.display.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
public class MochiAd {
public function MochiAd(){
super();
}
public static function getVersion():String{
return ("2.3");
}
public static function showTimedAd(options:Object):void{
trace("[MochiAd] DEPRECATED: showTimedAd was renamed to showInterLevelAd in 2.0");
MochiAd.showInterLevelAd(options);
}
public static function _allowDomains(server:String):String{
var hostname:String = server.split("/")[2].split(":")[0];
Security.allowDomain("*");
Security.allowDomain(hostname);
Security.allowInsecureDomain("*");
Security.allowInsecureDomain(hostname);
return (hostname);
}
public static function load(options:Object):MovieClip{
var clip:Object;
var mc:MovieClip;
var k:String;
var server:String;
var hostname:String;
var lc:LocalConnection;
var name:String;
var loader:Loader;
var f:Function;
var g:Function;
var req:URLRequest;
var v:Object;
var options = options;
var DEFAULTS:Object = {server:"http://x.mochiads.com/srv/1/", method:"load", depth:10333, id:"_UNKNOWN_"};
options = MochiAd._parseOptions(options, DEFAULTS);
options.swfv = 9;
options.mav = MochiAd.getVersion();
clip = options.clip;
if (!MochiAd._isNetworkAvailable()){
return (null);
};
if (clip._mochiad_loaded){
return (null);
};
//unresolved jump
var _slot1 = e;
throw (new Error("MochiAd requires a clip that is an instance of a dynamic class. If your class extends Sprite or MovieClip, you must make it dynamic."));
var depth:Number = options.depth;
delete options.depth;
mc = createEmptyMovieClip(clip, "_mochiad", depth);
var wh:Array = MochiAd._getRes(options, clip);
options.res = ((wh[0] + "x") + wh[1]);
options.server = (options.server + options.id);
delete options.id;
clip._mochiad_loaded = true;
if (clip.loaderInfo.loaderURL.indexOf("http") == 0){
options.as3_swf = clip.loaderInfo.loaderURL;
};
var lv:URLVariables = new URLVariables();
for (k in options) {
v = options[k];
if (!(v is Function)){
lv[k] = v;
};
};
server = lv.server;
delete lv.server;
hostname = _allowDomains(server);
lc = new LocalConnection();
lc.client = mc;
name = ["", Math.floor(new Date().getTime()), Math.floor((Math.random() * 999999))].join("_");
lc.allowDomain("*", "localhost");
lc.allowInsecureDomain("*", "localhost");
lc.connect(name);
mc.lc = lc;
lv.lc = name;
lv.st = getTimer();
loader = new Loader();
f = function (ev:Object):void{
ev.target.removeEventListener(ev.type, arguments.callee);
mc._mochiad_ctr_failed = true;
};
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, f);
g = function (ev:Object):void{
ev.target.removeEventListener(ev.type, arguments.callee);
MochiAd.unload(clip);
};
loader.contentLoaderInfo.addEventListener(Event.UNLOAD, g);
req = new URLRequest((server + ".swf"));
req.contentType = "application/x-www-form-urlencoded";
req.method = URLRequestMethod.POST;
req.data = lv;
loader.load(req);
mc.addChild(loader);
mc._mochiad_ctr = loader;
return (mc);
}
public static function sendHighScore(options:Object, callbackObj:Object, callbackMethod:Object=null):Boolean{
var lc:MovieClip = MochiAd._loadCommunicator({clip:options.clip, id:options.id});
if (!lc){
return (false);
};
lc.doSend(["sendHighScore", options], callbackObj, callbackMethod);
return (true);
}
public static function _parseOptions(options:Object, defaults:Object):Object{
var k:String;
var pairs:Array;
var i:Number;
var kv:Array;
var optcopy:Object = {};
for (k in defaults) {
optcopy[k] = defaults[k];
};
if (options){
for (k in options) {
optcopy[k] = options[k];
};
};
if (optcopy.clip == undefined){
throw (new Error("MochiAd is missing the 'clip' parameter. This should be a MovieClip, Sprite or an instance of a class that extends MovieClip or Sprite."));
};
options = optcopy.clip.loaderInfo.parameters.mochiad_options;
if (options){
pairs = options.split("&");
i = 0;
while (i < pairs.length) {
kv = pairs[i].split("=");
optcopy[unescape(kv[0])] = unescape(kv[1]);
i++;
};
};
if (optcopy.id == "test"){
trace("[MochiAd] WARNING: Using the MochiAds test identifier, make sure to use the code from your dashboard, not this example!");
};
return (optcopy);
}
public static function _isNetworkAvailable():Boolean{
return (!((Security.sandboxType == "localWithFile")));
}
public static function _cleanup(mc:Object):void{
var k:String;
var lc:LocalConnection;
var f:Function;
var mc = mc;
if (("lc" in mc)){
lc = mc.lc;
f = function ():void{
lc.client = null;
lc.close();
//unresolved jump
var _slot1 = e;
};
setTimeout(f, 0);
};
var idx:Number = DisplayObjectContainer(mc).numChildren;
while (idx > 0) {
idx = (idx - 1);
DisplayObjectContainer(mc).removeChildAt(idx);
};
for (k in mc) {
delete mc[k];
};
}
public static function unload(clip:Object):Boolean{
if (((clip.clip) && (clip.clip._mochiad))){
clip = clip.clip;
};
if (!clip._mochiad){
return (false);
};
if (clip._mochiad.onUnload){
clip._mochiad.onUnload();
};
delete clip._mochiad_loaded;
delete clip._mochiad;
return (true);
}
public static function showInterLevelAd(options:Object):void{
var clip:Object;
var mc:MovieClip;
var chk:MovieClip;
var options = options;
var DEFAULTS:Object = {ad_timeout:2000, fadeout_time:250, regpt:"o", method:"showTimedAd", ad_started:function ():void{
if ((this.clip is MovieClip)){
this.clip.stop();
} else {
throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_finished:function ():void{
if ((this.clip is MovieClip)){
this.clip.play();
} else {
throw (new Error("MochiAd.showInterLevelAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_loaded:function (width:Number, height:Number):void{
}, ad_failed:function ():void{
trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
}};
options = MochiAd._parseOptions(options, DEFAULTS);
clip = options.clip;
var ad_msec:Number = 11000;
var ad_timeout:Number = options.ad_timeout;
delete options.ad_timeout;
var fadeout_time:Number = options.fadeout_time;
delete options.fadeout_time;
if (!MochiAd.load(options)){
options.ad_failed();
options.ad_finished();
return;
};
options.ad_started();
mc = clip._mochiad;
mc["onUnload"] = function ():void{
MochiAd._cleanup(mc);
options.ad_finished();
};
var wh:Array = MochiAd._getRes(options, clip);
var w:Number = wh[0];
var h:Number = wh[1];
mc.x = (w * 0.5);
mc.y = (h * 0.5);
chk = createEmptyMovieClip(mc, "_mochiad_wait", 3);
chk.ad_msec = ad_msec;
chk.ad_timeout = ad_timeout;
chk.started = getTimer();
chk.showing = false;
chk.fadeout_time = fadeout_time;
chk.fadeFunction = function ():void{
if (!this.parent){
delete this.onEnterFrame;
delete this.fadeFunction;
return;
};
var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time)));
if (p > 0){
this.parent.alpha = (p * 0.01);
} else {
MochiAd.unload(clip);
delete this["onEnterFrame"];
};
};
mc.unloadAd = function ():void{
MochiAd.unload(clip);
};
mc.adLoaded = options.ad_loaded;
mc.adjustProgress = function (msec:Number):void{
var _chk:Object = mc._mochiad_wait;
_chk.server_control = true;
_chk.showing = true;
_chk.started = getTimer();
_chk.ad_msec = (msec - 250);
};
chk["onEnterFrame"] = function ():void{
var total:Number;
if (!this.parent){
delete this.onEnterFrame;
delete this.fadeFunction;
return;
};
var ad_clip:Object = this.parent._mochiad_ctr;
var elapsed:Number = (getTimer() - this.started);
var finished:Boolean;
if (!chk.showing){
total = ad_clip.loaderInfo.bytesTotal;
if ((((total > 0)) || (("number" == "undefined")))){
chk.showing = true;
chk.started = getTimer();
} else {
if (elapsed > chk.ad_timeout){
options.ad_failed();
finished = true;
};
};
};
if (this.parent._mochiad_ctr_failed){
options.ad_failed();
finished = true;
};
if (elapsed > chk.ad_msec){
finished = true;
};
if (finished){
if (this.server_control){
delete this.onEnterFrame;
} else {
this.fadeout_start = getTimer();
this.onEnterFrame = this.fadeFunction;
};
};
};
doOnEnterFrame(chk);
}
public static function _getRes(options:Object, clip:Object):Array{
var xy:Array;
var b:Object = clip.getBounds(clip.root);
var w:Number = 0;
var h:Number = 0;
if (typeof(options.res) != "undefined"){
xy = options.res.split("x");
w = parseFloat(xy[0]);
h = parseFloat(xy[1]);
} else {
w = (b.xMax - b.xMin);
h = (b.yMax - b.yMin);
};
if ((((w == 0)) || ((h == 0)))){
w = clip.stage.stageWidth;
h = clip.stage.stageHeight;
};
return ([w, h]);
}
public static function createEmptyMovieClip(parent:Object, name:String, depth:Number):MovieClip{
var mc:MovieClip = new MovieClip();
if (((false) && (depth))){
parent.addChildAt(mc, depth);
} else {
parent.addChild(mc);
};
parent[name] = mc;
mc["_name"] = name;
return (mc);
}
public static function _loadCommunicator(options:Object):MovieClip{
var mc:MovieClip;
var k:String;
var lc:LocalConnection;
var name:String;
var req:URLRequest;
var loader:Loader;
var options = options;
var DEFAULTS:Object = {com_server:"http://x.mochiads.com/com/1/", method:"loadCommunicator", depth:10337, id:"_UNKNOWN_"};
options = MochiAd._parseOptions(options, DEFAULTS);
options.swfv = 9;
options.mav = MochiAd.getVersion();
var clip:Object = options.clip;
var clipname:String = ("_mochiad_com_" + options.id);
if (!MochiAd._isNetworkAvailable()){
return (null);
};
if (clip[clipname]){
return (clip[clipname]);
};
var server:String = (options.com_server + options.id);
MochiAd._allowDomains(server);
delete options.id;
delete options.com_server;
var depth:Number = options.depth;
delete options.depth;
mc = createEmptyMovieClip(clip, clipname, depth);
var lv:URLVariables = new URLVariables();
for (k in options) {
lv[k] = options[k];
};
lc = new LocalConnection();
lc.client = mc;
name = ["", Math.floor(new Date().getTime()), Math.floor((Math.random() * 999999))].join("_");
lc.allowDomain("*", "localhost");
lc.allowInsecureDomain("*", "localhost");
lc.connect(name);
mc.name = name;
mc.lc = lc;
lv.lc = name;
mc._id = 0;
mc._queue = [];
mc.rpcResult = function (cb:Object):void{
cb = parseInt(cb.toString());
var cblst:Array = mc._callbacks[cb];
if (typeof(cblst) == "undefined"){
return;
};
delete mc._callbacks[cb];
var args:Array = [];
var i:Number = 2;
while (i < cblst.length) {
args.push(cblst[i]);
i++;
};
i = 1;
while (i < arguments.length) {
args.push(arguments[i]);
i++;
};
var method:Object = cblst[1];
var obj:Object = cblst[0];
if (((obj) && ((typeof(method) == "string")))){
method = obj[method];
};
if (typeof(method) == "function"){
method.apply(obj, args);
};
};
mc._didConnect = function (endpoint:String):void{
var item:Array;
mc._endpoint = endpoint;
var q:Array = mc._queue;
delete mc._queue;
var ds:Function = mc.doSend;
var i:Number = 0;
while (i < q.length) {
item = q[i];
ds.apply(this, item);
i++;
};
};
mc.doSend = function (args:Array, cbobj:Object, cbfn:Object):void{
var qargs:Array;
var i:Number;
if (mc._endpoint == null){
qargs = [];
i = 0;
while (i < arguments.length) {
qargs.push(arguments[i]);
i++;
};
mc._queue.push(qargs);
return;
};
mc._id = (mc._id + 1);
var id:Number = mc._id;
mc._callbacks[id] = [cbobj, ((cbfn) || (cbobj))];
var slc:LocalConnection = new LocalConnection();
slc.send(mc._endpoint, "rpc", id, args);
};
mc._callbacks = {};
mc._callbacks[0] = [mc, "_didConnect"];
lv.st = getTimer();
req = new URLRequest((server + ".swf"));
req.contentType = "application/x-www-form-urlencoded";
req.method = URLRequestMethod.POST;
req.data = lv;
loader = new Loader();
loader.load(req);
mc.addChild(loader);
mc._mochiad_com = loader;
return (mc);
}
public static function showPreGameAd(options:Object):void{
var clip:Object;
var mc:MovieClip;
var chk:MovieClip;
var complete:Boolean;
var unloaded:Boolean;
var r:MovieClip;
var options = options;
var DEFAULTS:Object = {ad_timeout:3000, fadeout_time:250, regpt:"o", method:"showPreloaderAd", color:0xFF8A00, background:16777161, outline:13994812, ad_started:function ():void{
if ((this.clip is MovieClip)){
this.clip.stop();
} else {
throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_finished:function ():void{
if ((this.clip is MovieClip)){
this.clip.play();
} else {
throw (new Error("MochiAd.showPreGameAd requires a clip that is a MovieClip or is an instance of a class that extends MovieClip. If your clip is a Sprite, then you must provide custom ad_started and ad_finished handlers."));
};
}, ad_loaded:function (width:Number, height:Number):void{
}, ad_failed:function ():void{
trace("[MochiAd] Couldn't load an ad, make sure your game's local security sandbox is configured for Access Network Only and that you are not using ad blocking software");
}};
options = MochiAd._parseOptions(options, DEFAULTS);
if ("5cc6f7dfb67f2f08341c831480f7c2a7".length == 0){
options.ad_started();
options.ad_finished();
return;
};
clip = options.clip;
var ad_msec:Number = 11000;
var ad_timeout:Number = options.ad_timeout;
delete options.ad_timeout;
var fadeout_time:Number = options.fadeout_time;
delete options.fadeout_time;
if (!MochiAd.load(options)){
options.ad_failed();
options.ad_finished();
return;
};
options.ad_started();
mc = clip._mochiad;
mc["onUnload"] = function ():void{
MochiAd._cleanup(mc);
var fn:Function = function ():void{
options.ad_finished();
};
setTimeout(fn, 100);
};
var wh:Array = MochiAd._getRes(options, clip);
var w:Number = wh[0];
var h:Number = wh[1];
mc.x = (w * 0.5);
mc.y = (h * 0.5);
chk = createEmptyMovieClip(mc, "_mochiad_wait", 3);
chk.x = (w * -0.5);
chk.y = (h * -0.5);
var bar:MovieClip = createEmptyMovieClip(chk, "_mochiad_bar", 4);
bar.x = 10;
bar.y = (h - 20);
var bar_color:Number = options.color;
delete options.color;
var bar_background:Number = options.background;
delete options.background;
var bar_outline:Number = options.outline;
delete options.outline;
var backing_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 1);
var backing:Object = backing_mc.graphics;
backing.beginFill(bar_background);
backing.moveTo(0, 0);
backing.lineTo((w - 20), 0);
backing.lineTo((w - 20), 10);
backing.lineTo(0, 10);
backing.lineTo(0, 0);
backing.endFill();
var inside_mc:MovieClip = createEmptyMovieClip(bar, "_inside", 2);
var inside:Object = inside_mc.graphics;
inside.beginFill(bar_color);
inside.moveTo(0, 0);
inside.lineTo((w - 20), 0);
inside.lineTo((w - 20), 10);
inside.lineTo(0, 10);
inside.lineTo(0, 0);
inside.endFill();
inside_mc.scaleX = 0;
var outline_mc:MovieClip = createEmptyMovieClip(bar, "_outline", 3);
var outline:Object = outline_mc.graphics;
outline.lineStyle(0, bar_outline, 100);
outline.moveTo(0, 0);
outline.lineTo((w - 20), 0);
outline.lineTo((w - 20), 10);
outline.lineTo(0, 10);
outline.lineTo(0, 0);
chk.ad_msec = ad_msec;
chk.ad_timeout = ad_timeout;
chk.started = getTimer();
chk.showing = false;
chk.last_pcnt = 0;
chk.fadeout_time = fadeout_time;
chk.fadeFunction = function ():void{
var p:Number = (100 * (1 - ((getTimer() - this.fadeout_start) / this.fadeout_time)));
if (p > 0){
this.parent.alpha = (p * 0.01);
} else {
MochiAd.unload(clip);
delete this["onEnterFrame"];
};
};
complete = false;
unloaded = false;
var f:Function = function (ev:Event):void{
ev.target.removeEventListener(ev.type, arguments.callee);
complete = true;
if (unloaded){
MochiAd.unload(clip);
};
};
clip.loaderInfo.addEventListener(Event.COMPLETE, f);
if ((clip.root is MovieClip)){
r = (clip.root as MovieClip);
if (r.framesLoaded >= r.totalFrames){
complete = true;
};
};
mc.unloadAd = function ():void{
unloaded = true;
if (complete){
MochiAd.unload(clip);
};
};
mc.adLoaded = options.ad_loaded;
mc.adjustProgress = function (msec:Number):void{
var _chk:Object = mc._mochiad_wait;
_chk.server_control = true;
_chk.showing = true;
_chk.started = getTimer();
_chk.ad_msec = msec;
};
chk["onEnterFrame"] = function ():void{
var total:Number;
if (((!(this.parent)) || (!(this.parent.parent)))){
delete this["onEnterFrame"];
return;
};
var _clip:Object = this.parent.parent.root;
var ad_clip:Object = this.parent._mochiad_ctr;
var elapsed:Number = (getTimer() - this.started);
var finished:Boolean;
var clip_total:Number = _clip.loaderInfo.bytesTotal;
var clip_loaded:Number = _clip.loaderInfo.bytesLoaded;
if (complete){
clip_loaded = Math.max(1, clip_loaded);
clip_total = clip_loaded;
};
var clip_pcnt:Number = ((100 * clip_loaded) / clip_total);
var ad_pcnt:Number = ((100 * elapsed) / chk.ad_msec);
var _inside:Object = this._mochiad_bar._inside;
var pcnt:Number = Math.min(100, Math.min(((clip_pcnt) || (0)), ad_pcnt));
pcnt = Math.max(this.last_pcnt, pcnt);
this.last_pcnt = pcnt;
_inside.scaleX = (pcnt * 0.01);
if (!chk.showing){
total = ad_clip.loaderInfo.bytesTotal;
if ((((total > 0)) || (("number" == "undefined")))){
chk.showing = true;
chk.started = getTimer();
} else {
if (elapsed > chk.ad_timeout){
options.ad_failed();
finished = true;
};
};
};
if (this.parent._mochiad_ctr_failed){
options.ad_failed();
finished = true;
};
if (elapsed > chk.ad_msec){
finished = true;
};
if (((complete) && (finished))){
if (this.server_control){
delete this.onEnterFrame;
} else {
this.fadeout_start = getTimer();
this.onEnterFrame = chk.fadeFunction;
};
};
};
doOnEnterFrame(chk);
}
public static function showPreloaderAd(options:Object):void{
trace("[MochiAd] DEPRECATED: showPreloaderAd was renamed to showPreGameAd in 2.0");
MochiAd.showPreGameAd(options);
}
public static function fetchHighScores(options:Object, callbackObj:Object, callbackMethod:Object=null):Boolean{
var lc:MovieClip = MochiAd._loadCommunicator({clip:options.clip, id:options.id});
if (!lc){
return (false);
};
lc.doSend(["fetchHighScores", options], callbackObj, callbackMethod);
return (true);
}
public static function doOnEnterFrame(mc:MovieClip):void{
var mc = mc;
var f:Function = function (ev:Object):void{
if (((("onEnterFrame" in mc)) && (mc.onEnterFrame))){
mc.onEnterFrame();
} else {
ev.target.removeEventListener(ev.type, arguments.callee);
};
};
mc.addEventListener(Event.ENTER_FRAME, f);
}
}
}//package
Section 175
//MouseControl (MouseControl)
package {
import flash.events.*;
import flash.display.*;
public class MouseControl {
public static var buttonReleased:Boolean = false;
public static var buttonPressed:Boolean = false;
public static var wheelFunction:Function = null;
public static var mouseVelX:Number = 0;
public static var mouseVelY:Number = 0;
public static var ox:Number = 0;
public static var oy:Number = 0;
public static var x:Number = 0;
public static var y:Number = 0;
public static var delta:int = 0;
public function MouseControl(){
super();
}
public static function MouseHandler(event:MouseEvent):void{
x = event.stageX;
y = event.stageY;
mouseVelX = (x - ox);
mouseVelY = (y - oy);
ox = x;
oy = y;
}
public static function MouseClickHandler(event:MouseEvent):void{
buttonPressed = true;
buttonReleased = false;
}
public static function SetWheelHandler(f:Function){
wheelFunction = f;
}
public static function InitOnce(stage:Stage):void{
stage.addEventListener(MouseEvent.MOUSE_MOVE, MouseHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseClickHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, MouseUpHandler);
stage.addEventListener(MouseEvent.MOUSE_WHEEL, MouseWheelHandler);
wheelFunction = null;
}
public static function MouseWheelHandler(event:MouseEvent):void{
delta = event.delta;
if (wheelFunction != null){
wheelFunction(delta);
};
}
public static function Reset():void{
buttonPressed = false;
buttonReleased = false;
}
public static function MouseUpHandler(event:MouseEvent):void{
buttonPressed = false;
buttonReleased = true;
}
}
}//package
Section 176
//MusicPlayer (MusicPlayer)
package {
import flash.display.*;
import flash.utils.*;
import flash.media.*;
public class MusicPlayer {
static var musicSound1:Sound;
static var volumeMod:Number = 1;
static var lastMusicID = -1;
static var musicSoundTransform1:SoundTransform;
static var loader:Loader;
static var currentMusicID:int = -1;
static var musicChannel1:SoundChannel = null;
static var musicChannel:SoundChannel = null;
static var cb:Function;
static var doMusic:Boolean;
static var streamChannelFlags:Array;
static var musicSoundTransform:SoundTransform;
static var musicSound:Sound;
static var streamSound:Sound = null;
static var streamChannels:Array;
static var streamChannelVolumes:Array;
static var main:Main;
public static var currentStreamID:int = -1;
static var musicCurrentName:String = "";
public function MusicPlayer(){
super();
}
public static function StartMusic(musicName:String){
var classRef:Class;
var m:Sound;
var musicName = musicName;
if (doMusic == false){
return;
};
if (musicChannel != null){
musicChannel.stop();
};
classRef = (getDefinitionByName(musicName) as Class);
//unresolved jump
var _slot1 = e;
classRef = null;
if (classRef == null){
trace(("Music Error: Can't find sound " + musicName));
} else {
m = (new (classRef) as Sound);
musicSoundTransform = new SoundTransform(1, 0);
musicSound = m;
musicChannel = musicSound.play(0, 999999, musicSoundTransform);
};
lastMusicID = 0;
}
public static function ToggleMute(){
doMusic = (doMusic == false);
}
public static function InitOnce(_main:Main):void{
doMusic = true;
lastMusicID = -1;
currentMusicID = -1;
streamChannels = new Array();
streamChannelFlags = new Array();
streamChannelVolumes = new Array();
main = _main;
}
public static function StopMusic(){
var i:int;
var sc:SoundChannel;
var flag:int;
i = 0;
while (i < streamChannels.length) {
flag = streamChannelFlags[i];
if ((((flag == 0)) || ((flag == 1)))){
flag = 2;
};
streamChannelFlags[i] = flag;
i++;
};
if (musicChannel != null){
musicChannel.stop();
};
}
public static function GetSpectrum():ByteArray{
var a:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(a, true, 0);
return (a);
}
public static function StartStream(_index:int){
var classRef:Class;
if (doMusic == false){
return;
};
var musicname:String = "";
if (_index == 0){
musicname = "Tune01";
};
if (_index == 1){
musicname = "Ingame1";
};
if (_index == 2){
musicname = "Ingame2";
};
if (_index == 3){
musicname = "Ingame3";
};
if (_index == 4){
musicname = "Ingame4";
};
if (_index == 5){
musicname = "Ingame5";
};
if (_index == 6){
musicname = "Ingame6";
};
if (musicCurrentName != musicname){
StopMusic();
} else {
return;
};
classRef = (getDefinitionByName(musicname) as Class);
var m:Sound = (new (classRef) as Sound);
var st:SoundTransform = new SoundTransform(0);
streamChannels.push(m.play(0, 999999, st));
streamChannelFlags.push(int(0));
streamChannelVolumes.push(Number(0));
musicCurrentName = musicname;
}
public static function UpdateOncePerFrame(){
var st:SoundTransform;
var i:int;
var sc:SoundChannel;
var flag:int;
var volume:Number;
var newflags:*;
var newchannels:*;
var newvolumes:*;
var fadeRate:Number = 0.02;
var doremove:Boolean;
i = 0;
while (i < streamChannels.length) {
sc = streamChannels[i];
flag = streamChannelFlags[i];
volume = streamChannelVolumes[i];
if (flag == 0){
st = sc.soundTransform;
volume = (volume + fadeRate);
if (volume >= 1){
volume = 1;
flag = 1;
};
st.volume = (volume * volumeMod);
sc.soundTransform = st;
} else {
if (flag == 1){
st = sc.soundTransform;
st.volume = (volume * volumeMod);
sc.soundTransform = st;
} else {
if (flag == 2){
st = sc.soundTransform;
volume = (volume - fadeRate);
if (volume <= 0){
sc.stop();
flag = 3;
doremove = true;
};
st.volume = (volume * volumeMod);
sc.soundTransform = st;
} else {
if (flag == 3){
};
};
};
};
streamChannelFlags[i] = flag;
streamChannels[i] = sc;
streamChannelVolumes[i] = volume;
if (!doMusic){
st = sc.soundTransform;
st.volume = 0;
sc.soundTransform = st;
};
i++;
};
if (doremove){
newflags = new Array();
newchannels = new Array();
newvolumes = new Array();
i = 0;
while (i < streamChannels.length) {
sc = streamChannels[i];
flag = streamChannelFlags[i];
volume = streamChannelVolumes[i];
if (flag != 3){
newflags.push(flag);
newchannels.push(sc);
newvolumes.push(volume);
};
i++;
};
streamChannelFlags = newflags;
streamChannels = newchannels;
streamChannelVolumes = newvolumes;
};
if (!doMusic){
if (musicChannel != null){
st = musicChannel.soundTransform;
st.volume = 0;
musicChannel.soundTransform = st;
};
} else {
if (musicChannel != null){
st = musicChannel.soundTransform;
st.volume = 1;
musicChannel.soundTransform = st;
};
};
}
}
}//package
Section 177
//ObjectDef (ObjectDef)
package {
import flash.geom.*;
public class ObjectDef {
var type:int;
var animNames:Array;
var animIDs:Array;
var exportName:String;
var particleExplodeID:int;
var initFuncName:String;
var maxHealth:Number;
var colRects:Array;
var pathAnimType:int;
var collisionCircleRadii:Array;
var shieldColRects:Array;
var shotControllers:Array;
var collisionCircleOffsets:Array;
public function ObjectDef(_exportName:String, _type:int, _colRect:Rectangle){
super();
animNames = new Array();
animIDs = new Array();
colRects = new Array();
shieldColRects = new Array();
collisionCircleOffsets = new Array();
collisionCircleRadii = new Array();
exportName = _exportName;
type = _type;
colRects.push(_colRect.clone());
maxHealth = 1;
initFuncName = "";
shotControllers = new Array();
}
public function AddColRect(_colRect:Rectangle){
colRects.push(_colRect.clone());
}
public function GetAnimIDFromName(name:String):int{
var i:int;
var len:int = animNames.length;
i = 0;
while (i < len) {
if (animNames[i] == name){
return (animIDs[i]);
};
i++;
};
trace(((("ERROR: Can't find anim name " + name) + " on object ") + exportName));
return (40);
}
public function SetPathAnimType(_pathAnimType:int){
pathAnimType = _pathAnimType;
}
public function AddShotController(_typeName:String, _deftypeName:String, _x:Number, _y:Number){
}
public function DoesAnimIDExist(name:String):Boolean{
var i:int;
var len:int = animNames.length;
i = 0;
while (i < len) {
if (animNames[i] == name){
return (true);
};
i++;
};
return (false);
}
public function AddShieldColRect(_colRect:Rectangle){
shieldColRects.push(_colRect.clone());
}
public function SetInitFunc(_initFuncName:String){
initFuncName = _initFuncName;
}
public function AddCollisionCircle(xoff:Number, yoff:Number, radius:Number){
collisionCircleOffsets.push(new Point(xoff, yoff));
collisionCircleRadii.push(radius);
}
public function SetParticle(_particleExplodeID:int){
particleExplodeID = _particleExplodeID;
}
public function SetHealth(_health:Number){
maxHealth = _health;
}
public function AddAnim(name:String, animID:int){
animNames.push(name);
animIDs.push(animID);
}
}
}//package
Section 178
//ObjectDefs (ObjectDefs)
package {
import flash.geom.*;
public class ObjectDefs {
static var list:Array;
public function ObjectDefs(){
super();
}
public static function Init(){
var od:ObjectDef;
list = new Array();
od = new ObjectDef("Player", 0, new Rectangle(-10, -30, 20, 40));
od.AddCollisionCircle(0, -17, 15);
od.AddCollisionCircle(0, -31, 15);
od.AddCollisionCircle(0, -45, 15);
list.push(od);
}
public static function GetObjectDefByExportName(_name:String){
var od:ObjectDef;
var i:int;
var max:int = list.length;
i = 0;
while (i < max) {
od = list[i];
if (od.exportName == _name){
return (od);
};
i++;
};
trace(("ERROR: ObjectDefs can't find object exportname " + _name));
return (null);
}
}
}//package
Section 179
//Particle (Particle)
package {
class Particle {
var graphicID:int;
public var yvel:Number;
var active:Boolean;
var maxframe:int;
var dir:Number;
var mode:int;
public var xvel:Number;
var ypos:Number;
var updateFunction:Function;
var timer:Number;
var speed:Number;
var angle:Number;
var startx:Number;
var starty:Number;
var xpos:Number;
var alpha:Number;
var yvelmax:Number;
var color:uint;
var alphaAdd:Number;
var frame:Number;
var frameVel:Number;
var visible:Boolean;
var counter:int;
function Particle(){
super();
}
public function InitSteam():void{
yvelmax = Utils.RandBetweenFloat(-5, -10);
yvel = Utils.RandBetweenFloat(0, -3);
updateFunction = UpdateSteam;
timer = Utils.RandBetweenInt(10, 30);
color = 2147548928;
}
public function InitAlienDie(c:uint):void{
yvelmax = Utils.RandBetweenFloat(-0.5, -3);
yvel = 0;
updateFunction = UpdateAlienDie;
timer = Utils.RandBetweenInt(0, 1);
color = c;
mode = 0;
}
function UpdateVelsTimer(){
xpos = (xpos + xvel);
ypos = (ypos + yvel);
timer--;
if (timer <= 0){
active = false;
};
}
function PlayAnimation():Boolean{
frame = (frame + frameVel);
if (frame >= maxframe){
frame = maxframe;
return (true);
};
return (false);
}
public function InitStar():void{
var r:Number = Utils.RandCircle();
var d:Number = Utils.RandBetweenFloat(10, 15);
xvel = (Math.cos(r) * d);
yvel = (Math.sin(r) * d);
updateFunction = UpdateStar;
timer = Utils.RandBetweenInt(5, 15);
graphicID = GraphicObjects.GetIndexByName("Stars");
frame = 0;
}
public function UpdateWater():void{
xpos = (xpos + xvel);
ypos = (ypos + yvel);
yvel = (yvel + 0.3);
timer--;
if (timer <= 0){
};
frame++;
if (frame >= 29){
frame = 29;
active = false;
};
}
function UpdateAlienDie():void{
if (mode == 0){
timer--;
if (timer <= 0){
timer = Utils.RandBetweenInt(50, 100);
mode = 1;
};
return;
};
yvel = (yvel - 1);
if (yvel < yvelmax){
yvel = yvelmax;
};
xvel = (xvel * 0.99);
xpos = (xpos + xvel);
ypos = (ypos + yvel);
timer--;
if (timer < 0){
active = false;
};
}
public function InitWater():void{
var d:Number = Utils.RandCircle();
var v:Number = Utils.RandBetweenFloat(3, 5);
xvel = (Math.cos(d) * v);
yvel = (Math.sin(d) * v);
frame = 0;
updateFunction = UpdateWater;
mode = 0;
color = 4278190335;
timer = 10;
frame = 20;
}
function UpdateStar():void{
xpos = (xpos + xvel);
ypos = (ypos + yvel);
xvel = (xvel * 0.9);
yvel = (yvel * 0.9);
timer--;
if (timer < 0){
active = false;
};
}
function CycleAnimation():Boolean{
frame = (frame + frameVel);
if (frame >= maxframe){
frame = 0;
return (true);
};
return (false);
}
function UpdateSteam():void{
yvel = (yvel - 1);
if (yvel < yvelmax){
yvel = yvelmax;
};
ypos = (ypos + yvel);
timer--;
if (timer < 0){
active = false;
};
}
public function InitSlime():void{
}
function UpdateAnimAndStop(){
xpos = (xpos + xvel);
ypos = (ypos + yvel);
if (PlayAnimation()){
active = false;
};
}
}
}//package
Section 180
//Particles (Particles)
package {
import flash.display.*;
import flash.geom.*;
public class Particles {
public static const type_dust = 0;
static var max:int;
static var list:Array;
static var main:Main;
static var nextIndex:int;
public function Particles():void{
super();
}
public static function Add(xpos:Number, ypos:Number):Particle{
var vel:Number;
var ang:Number;
var p:Particle = list[nextIndex];
nextIndex++;
if (nextIndex >= max){
nextIndex = 0;
};
p.active = true;
p.timer = 0;
p.alpha = 1;
p.alphaAdd = 0;
p.visible = true;
p.xpos = xpos;
p.ypos = ypos;
p.angle = 0;
return (p);
}
public static function GetNextIndex():int{
return (nextIndex);
}
public static function Reset(){
var i:int;
nextIndex = 0;
i = 0;
while (i < max) {
list[i].active = false;
i++;
};
}
public static function Update(ftime:Number){
var i:int;
var p:Particle;
i = 0;
while (i < max) {
p = list[i];
if (p.active == true){
p.updateFunction();
};
i++;
};
}
public static function InitOnce(_main:Main, _max:int):void{
var i:int;
var j:int;
main = _main;
max = _max;
nextIndex = 0;
list = new Array(max);
i = 0;
while (i < max) {
list[i] = new Particle();
list[i].active = false;
i++;
};
}
public static function CountActive():int{
var i:int;
var numActive:int;
i = 0;
while (i < max) {
if (list[i].active){
numActive++;
};
i++;
};
return (numActive);
}
public static function Render(bd:BitmapData){
var i:int;
var j:int;
var p:Particle;
var xp1:Number;
var yp1:Number;
var x0:Number = (0 - 16);
var x1:Number = (Defs.displayarea_w + 16);
var y0:Number = (0 - 16);
var y1:Number = (Defs.displayarea_h + 16);
var sx:Number = Game.scrollX;
var sy:Number = Game.scrollY;
i = 0;
while (i < max) {
p = list[i];
if (((p.active) && (p.visible))){
xp1 = p.xpos;
yp1 = p.ypos;
GraphicObjects.RenderAt(p.graphicID, int(p.frame), bd, xp1, yp1);
};
i++;
};
}
}
}//package
Section 181
//PauseMenu (PauseMenu)
package {
import flash.events.*;
import flash.text.*;
import flash.display.*;
import flash.geom.*;
import flash.net.*;
import flash.ui.*;
public class PauseMenu {
static var active:Boolean;
static var pauseMC:MovieClip;
static var main:Main;
public function PauseMenu():void{
super();
}
public static function pressed_buttonRestartLevel(event:MouseEvent){
Unpause();
Game.StartLevelPlay();
}
public static function pressed_buttonMusic(event:MouseEvent){
MusicPlayer.ToggleMute();
SetTicks();
}
public static function IsPaused():Boolean{
return (active);
}
public static function pressed_buttonContinue(event:MouseEvent){
Unpause();
}
public static function pressed_buttonHelp(event:MouseEvent){
}
public static function InitOnce(_main:Main):void{
main = _main;
active = false;
}
static function SetTicks(){
if (SoundPlayer.doSFX){
pauseMC.tickSFX.visible = true;
} else {
pauseMC.tickSFX.visible = false;
};
}
public static function Unpause():void{
Mouse.hide();
active = false;
main.removeChild(pauseMC);
pauseMC = null;
KeyReader.InitOnce(Game.main.stage);
}
public static function pressed_buttonSFX(event:MouseEvent){
SoundPlayer.ToggleMute();
MusicPlayer.ToggleMute();
SetTicks();
}
public static function Pause():void{
Mouse.show();
pauseMC = AddMovieClip(0, 0, new PauseScreen());
main.addChild(pauseMC);
pauseMC.buttonQuit.addEventListener(MouseEvent.CLICK, pressed_buttonQuit);
pauseMC.buttonContinue.addEventListener(MouseEvent.CLICK, pressed_buttonContinue);
active = true;
}
public static function pressed_buttonQuit(event:MouseEvent){
Unpause();
Game.main.SetGameState(Main.gameState_TITLE);
}
static function AddMovieClip(x:Number, y:Number, mc:MovieClip):MovieClip{
mc.x = x;
mc.y = y;
main.addChild(mc);
return (mc);
}
}
}//package
Section 182
//PauseScreen (PauseScreen)
package {
import flash.display.*;
public dynamic class PauseScreen extends MovieClip {
public var buttonQuit:SimpleButton;
public var buttonContinue:SimpleButton;
}
}//package
Section 183
//PhysEditor (PhysEditor)
package {
import flash.display.*;
import flash.geom.*;
import flash.ui.*;
public class PhysEditor {
static const editMode_Library:int = 1;
static const editMode_PickPiece:int = 7;
static const editMode_GridCommands:int = 8;
static const editMode_Eraser:int = 2;
static const editMode_Adjust:int = 5;
static const editMode_Commands1:int = 4;
static const editMode_Normal:int = 0;
static const editMode_Commands:int = 3;
static const editMode_Lines:int = 6;
static var gridMode_active:Boolean = false;
static var boxNumW:Number = 5;
static var renderMiniMap:Boolean = true;
static var gridsnap:int = 8;
static var prevEditMode:int = 0;
static var scrollX:Number = 0;
static var scrollY:Number = 0;
static var currentPieceList:Array;
static var boxSizeH:Number = (Defs.displayarea_h / boxNumH);
static var guideLines:Array;
static var boxSizeW:Number = (Defs.displayarea_w / boxNumW);
static var currentPointIndex:int;
static var objectZSortMode:Boolean = true;
static var currentLevel:int = 0;
static var library_page:int = 0;
static var renderObjects:Boolean = true;
static var currentLineIndex:int;
public static var currentAdjustObject:PhysObj_Instance;
static var editMode:int = 0;
static var boxNumH:Number = 4;
static var gridMode_renderGrid:Boolean = false;
static var updateTimer:int = 0;
public function PhysEditor(){
super();
}
static function Editor_GetNearbyGuidelines(origObject:PhysObj_Instance, x:Number, y:Number, maxd1:Number=50){
var body:PhysObj_Body;
var shape:PhysObj_Shape;
var p:Point;
var p1:Point;
var poi:PhysObj_Instance;
var origPO:PhysObj;
var pr:Point;
var pp:Point;
var po:PhysObj;
var ppp:Point;
var dx:Number;
var dy:Number;
var level:Boolean;
var gl:PhysEd_GuideLine;
var maxd2:Number = 3;
var level_instances:Array = GetCurrentLevelInstances();
var m:Matrix = new Matrix();
var origPoints:Array = new Array();
if (origObject != null){
origPO = Game.physObjs.FindByName(origObject.typeName);
if (origPO != null){
for each (body in origPO.bodies) {
for each (shape in body.shapes) {
if (shape.type == PhysObj_Shape.Type_Poly){
for each (p in shape.poly_points) {
m.identity();
m.rotate(Utils.DegToRad(origObject.rot));
pr = new Point(p.x, p.y);
pr = m.transformPoint(pr);
pp = new Point(((pr.x + origObject.x) + body.pos.x), ((pr.y + origObject.y) + body.pos.y));
origPoints.push(pp);
};
};
};
};
};
} else {
origPoints.push(new Point(x, y));
};
guideLines = new Array();
for each (poi in level_instances) {
if (poi != origObject){
po = Game.physObjs.FindByName(poi.typeName);
if (po != null){
for each (body in po.bodies) {
for each (shape in body.shapes) {
if (shape.type == PhysObj_Shape.Type_Poly){
for each (p in shape.poly_points) {
m.identity();
m.rotate(Utils.DegToRad(poi.rot));
pr = new Point(p.x, p.y);
pr = m.transformPoint(pr);
ppp = new Point(((pr.x + poi.x) + body.pos.x), ((pr.y + poi.y) + body.pos.y));
for each (p1 in origPoints) {
dx = Math.abs((ppp.x - p1.x));
dy = Math.abs((ppp.y - p1.y));
level = false;
if ((((dy < maxd2)) && ((dx < maxd1)))){
level = false;
if (Math.floor(ppp.y) == Math.floor(p1.y)){
level = true;
};
gl = new PhysEd_GuideLine((ppp.x - 100), (ppp.x + 100), ppp.y, 0, level);
guideLines.push(gl);
};
if ((((dx < maxd2)) && ((dy < maxd1)))){
level = false;
if (Math.floor(ppp.x) == Math.floor(p1.x)){
level = true;
};
gl = new PhysEd_GuideLine((ppp.y - 100), (ppp.y + 100), ppp.x, 1, level);
guideLines.push(gl);
};
};
};
};
};
};
};
};
};
}
static function Editor_RenderGrid(bd:BitmapData){
var x:int;
var y:int;
if (gridMode_active == false){
return;
};
if (gridMode_renderGrid == false){
return;
};
var mx:int = scrollX;
var my:int = scrollY;
mx = Math.floor(mx);
my = Math.floor(my);
mx = (int((mx / gridsnap)) * int(gridsnap));
my = (int((my / gridsnap)) * int(gridsnap));
x = mx;
while (x < (mx + Defs.displayarea_w)) {
Utils.RenderDotLine(bd, (x - scrollX), 0, (x - scrollX), Defs.displayarea_h, 300, 4286611584);
x = (x + gridsnap);
};
y = my;
while (y < (my + Defs.displayarea_h)) {
Utils.RenderDotLine(bd, 0, (y - scrollY), Defs.displayarea_w, (y - scrollY), 300, 4286611584);
y = (y + gridsnap);
};
}
static function SetCurrentLevelInstances(instances:Array):void{
Game.levels[currentLevel].instances = instances;
}
public static function Editor_NextLevel():void{
currentLevel++;
if (currentLevel > (Game.levels.length - 1)){
currentLevel = (Game.levels.length - 1);
};
currentLineIndex = -1;
currentPointIndex = -1;
}
static function Lines_ScrollToLastPointOfSelectedLine(){
if (currentLineIndex == -1){
return;
};
var l:Level = GetCurrentLevel();
var a:Array = l.lines[currentLineIndex].points;
var p:Point = a[(a.length - 1)];
scrollX = (p.x - (Defs.displayarea_w * 0.5));
scrollY = (p.y - (Defs.displayarea_h * 0.5));
}
static function GetCurrentPieceInitialPos():Point{
if (currentPieceList.length == 0){
return (new Point(0, 0));
};
var piece:Object = currentPieceList[0];
return (new Point(piece.origx, piece.origy));
}
static function AddCurrentPiece(id:int, rot:Number, xoff:Number, yoff:Number, _origX:Number=0, _origY:Number=0){
var piece:Object = new Object();
piece.id = id;
piece.rot = Number(rot);
piece.xoff = Number(xoff);
piece.yoff = Number(yoff);
piece.origx = Number(_origX);
piece.origy = Number(_origY);
currentPieceList.push(piece);
}
static function UpdateScroll(){
var dv:Number;
var xv:Number;
var yv:Number;
if (KeyReader.Down(KeyReader.KEY_SHIFT) == false){
dv = 50;
xv = 0;
yv = 0;
if (KeyReader.Down(KeyReader.KEY_CONTROL)){
dv = (dv * 0.2);
};
if (KeyReader.Down(KeyReader.KEY_LEFT)){
xv = -(dv);
};
if (KeyReader.Down(KeyReader.KEY_RIGHT)){
xv = dv;
};
if (KeyReader.Down(KeyReader.KEY_UP)){
yv = -(dv);
};
if (KeyReader.Down(KeyReader.KEY_DOWN)){
yv = dv;
};
scrollX = (scrollX + xv);
scrollY = (scrollY + yv);
};
}
static function Editor_RenderNearbyGuidelines(){
var gl:PhysEd_GuideLine;
var col:uint;
var bd:BitmapData = Game.main.screenBD;
for each (gl in guideLines) {
col = 4294901760;
if (gl.level){
col = 4278255615;
};
Utils.RenderDotLine(bd, (gl.x0 - scrollX), (gl.y0 - scrollY), (gl.x1 - scrollX), (gl.y1 - scrollY), 100, col);
};
}
static function CurrenPiece_AddRot(rv:Number){
var ob:Object;
for each (ob in currentPieceList) {
ob.rot = (ob.rot + Number(rv));
};
}
static function Lines_NewLine(){
var line:PhysLine = new PhysLine();
var l:Level = GetCurrentLevel();
l.lines.push(line);
currentLineIndex = (l.lines.length - 1);
}
static function Editor_RenderLines(){
var line:PhysLine;
var col:uint;
var i:int;
var p0:Point;
var p1:Point;
var r:Rectangle;
var l:Level = GetCurrentLevel();
var bd:BitmapData = Game.main.screenBD;
var lineIndex:int;
for each (line in l.lines) {
col = 4290822336;
if (lineIndex == currentLineIndex){
col = 4294967295;
};
if (line.points.length >= 2){
i = 0;
while (i < (line.points.length - 1)) {
p0 = line.points[i].clone();
p1 = line.points[(i + 1)].clone();
Utils.RenderDotLine(bd, (p0.x - scrollX), (p0.y - scrollY), (p1.x - scrollX), (p1.y - scrollY), 200, col);
i++;
};
};
i = 0;
while (i < line.points.length) {
col = 4294901760;
if ((((lineIndex == currentLineIndex)) && ((currentPointIndex == i)))){
col = 4294967040;
};
r = new Rectangle(((line.points[i].x - 2) - scrollX), ((line.points[i].y - 2) - scrollY), 4, 4);
Utils.RenderRectangle(bd, r, col);
i++;
};
lineIndex++;
};
}
static function CountLibraryPieces():int{
var po:PhysObj;
var count:int;
for each (po in Game.physObjs.list) {
if (po.displayInLibrary){
count++;
};
};
return (count);
}
static function Lines_Subdivide(x:Number, y:Number){
var line:PhysLine;
var pointIndex:int;
var p:Point;
var p0:int;
var p1:int;
var newpoints:Array;
var i:int;
var points:Array;
var ps:Array;
var p2:int;
var pt0:Point;
var pt1:Point;
var pt2:Point;
if ((((currentLineIndex == -1)) || ((currentPointIndex == -1)))){
return;
};
var l:Level = GetCurrentLevel();
var lineIndex:int;
var selectedLineIndex = -1;
var selectedPointIndex = -1;
for each (line in l.lines) {
pointIndex = 0;
for each (p in line.points) {
if (Utils.DistBetweenPoints(p.x, p.y, x, y) < 3){
selectedLineIndex = lineIndex;
selectedPointIndex = pointIndex;
};
pointIndex++;
};
lineIndex++;
};
if (((!((selectedLineIndex == -1))) && (!((selectedPointIndex == -1))))){
if (selectedPointIndex == currentPointIndex){
return;
};
p0 = currentPointIndex;
p1 = selectedPointIndex;
if (p1 < p0){
p2 = p0;
p1 = p0;
p0 = p2;
};
newpoints = new Array();
points = l.lines[selectedLineIndex].points;
i = p0;
while (i < p1) {
pt0 = points[i].clone();
pt1 = points[(i + 1)].clone();
pt2 = new Point(((pt0.x + pt1.x) / 2), ((pt0.y + pt1.y) / 2));
newpoints.push(pt2);
newpoints.push(pt1);
i++;
};
ps = new Array();
i = 0;
while (i <= p0) {
ps.push(points[i].clone());
i++;
};
for each (pt2 in newpoints) {
ps.push(pt2.clone());
};
i = (p1 + 1);
while (i < points.length) {
ps.push(points[i].clone());
i++;
};
l.lines[selectedLineIndex].points = ps;
};
}
static function Lines_DeletePoint(x:Number, y:Number){
var line:PhysLine;
var pointIndex:int;
var p:Point;
var a0:Array;
var a1:Array;
var i:int;
var a2:Array;
var l:Level = GetCurrentLevel();
var lineIndex:int;
var selectedLineIndex = -1;
var selectedPointIndex = -1;
for each (line in l.lines) {
pointIndex = 0;
for each (p in line.points) {
if (Utils.DistBetweenPoints(p.x, p.y, x, y) < 3){
selectedLineIndex = lineIndex;
selectedPointIndex = pointIndex;
};
pointIndex++;
};
lineIndex++;
};
if (((!((selectedLineIndex == -1))) && (!((selectedPointIndex == -1))))){
a0 = l.lines[selectedLineIndex].points;
a1 = new Array();
i = 0;
while (i < a0.length) {
if (i != selectedPointIndex){
a1.push(a0[i].clone());
};
i++;
};
l.lines[selectedLineIndex].points = a1;
a2 = new Array();
for each (line in l.lines) {
if (line.points.length != 0){
a2.push(line.Clone());
} else {
currentLineIndex = -1;
};
};
l.lines = a2;
currentPointIndex = -1;
};
}
public static function Editor_ClearLevel():void{
var level_instances:Array = new Array();
Game.levels[currentLevel].instances = level_instances;
currentLineIndex = -1;
currentPointIndex = -1;
}
static function Editor_RenderObjects(){
var poi:PhysObj_Instance;
var po:PhysObj;
var level_instances:Array = GetCurrentLevelInstances();
if (objectZSortMode){
level_instances = SortInstancesByZ(level_instances);
};
var bd:BitmapData = Game.main.screenBD;
for each (poi in level_instances) {
po = Game.physObjs.FindByName(poi.typeName);
if (po != null){
PhysObj.RenderAt(po, (poi.x - scrollX), (poi.y - scrollY), poi.rot, bd);
};
};
}
static function Lines_ScrollToFirstPointOfSelectedLine(){
if (currentLineIndex == -1){
return;
};
var l:Level = GetCurrentLevel();
var a:Array = l.lines[currentLineIndex].points;
var p:Point = a[0];
scrollX = (p.x - (Defs.displayarea_w * 0.5));
scrollY = (p.y - (Defs.displayarea_h * 0.5));
}
static function SnapToObjects(x:Number, y:Number):Point{
var physObj:PhysObj;
var gl:PhysEd_GuideLine;
var p:Point;
if (currentPieceList.length != 1){
return (null);
};
var ob:Object = currentPieceList[0];
physObj = Game.physObjs.GetByIndex(ob.id);
if (physObj == null){
return (null);
};
var pi:PhysObj_Instance = Game.CreatePhysObjInstanceAt(physObj.name, (x + ob.xoff), (y + ob.yoff), ob.rot, "");
Editor_GetNearbyGuidelines(null, x, y, 20);
var bd:BitmapData = Game.main.screenBD;
var madnumber = 99999999;
var nearestX:Number = madnumber;
var nearestY:Number = madnumber;
for each (gl in guideLines) {
if (gl.type == 1){
if (Math.abs((gl.x0 - x)) < nearestX){
nearestX = gl.x0;
};
} else {
if (Math.abs((gl.y0 - y)) < nearestY){
nearestY = gl.y0;
};
};
};
if (((!((nearestX == madnumber))) && (!((nearestY == madnumber))))){
p = new Point(nearestX, nearestY);
return (p);
};
return (null);
}
public static function ExportLevelAsXml(){
var frameID:int;
var level_instances:Array;
var poi:PhysObj_Instance;
var point:Point;
var line:PhysLine;
var i:int;
var j:int;
var points:Array;
var numPoints:int;
var numPerLine:int;
var numGroups:int;
var numRemainder:int;
var count:int;
var s1:String;
var l:Level = GetCurrentLevel();
var s:String = "";
var ss:String = "";
s = (("<level name=\"" + l.name) + "\"");
s = (s + ((" category=\"" + l.category.toString()) + "\""));
s = (s + ((" fillframe=\"" + l.fillFrame.toString()) + "\""));
s = (s + ((" surfaceframe=\"" + l.surfaceFrame.toString()) + "\""));
s = (s + ((" surfacethickness=\"" + l.surfaceThickness.toString()) + "\""));
s = (s + ((" type=\"" + l.eventType.toString()) + "\""));
s = (s + ((" opponents=\"" + l.eventOpponentsString.toString()) + "\""));
s = (s + ((" win=\"" + l.eventWinParam.toString()) + "\""));
s = (s + ((" exclusivechar=\"" + l.exclusiveChar.toString()) + "\""));
s = (s + " >");
ss = (ss + (s + "\n"));
trace(s);
s = (((("<times gold=\"" + (l.goldTime / Defs.fps)) + "\" silver=\"") + (l.silverTime / Defs.fps)) + "\" />");
ss = (ss + (s + "\n"));
trace(s);
for each (frameID in l.helpscreenFrames) {
s = (("<helpscreen frame=\"" + frameID) + "\" />");
ss = (ss + (s + "\n"));
trace(s);
};
level_instances = GetCurrentLevelInstances();
for each (poi in level_instances) {
s = (((((((((("<obj type=\"" + poi.typeName) + "\" x=\"") + poi.x) + "\" y=\"") + poi.y) + "\" rot=\"") + poi.rot) + "\" params=\"") + poi.initParams) + "\" />");
ss = (ss + (s + "\n"));
trace(s);
};
for each (line in l.lines) {
s = (((((((("<line type=\"" + line.type) + "\" name=\"") + line.name) + "\" fill=\"") + line.fill) + "\" fillscale=\"") + line.fillScaleX) + "\">");
ss = (ss + (s + "\n"));
trace(s);
points = line.points;
numPoints = points.length;
numPerLine = 10;
numGroups = (numPoints / numPerLine);
numRemainder = (numPoints % numPerLine);
count = 0;
i = 0;
while (i < numGroups) {
s1 = "<points a=\"";
j = 0;
while (j < numPerLine) {
var _temp1 = count;
count = (count + 1);
point = points[_temp1];
s1 = (s1 + ((point.x + ",") + point.y));
if (j != (numPerLine - 1)){
s1 = (s1 + ", ");
};
j++;
};
s1 = (s1 + "\" />");
s = s1;
ss = (ss + (s + "\n"));
trace(s);
i++;
};
if (numRemainder != 0){
s1 = "<points a=\"";
j = 0;
while (j < numRemainder) {
var _temp2 = count;
count = (count + 1);
point = points[_temp2];
s1 = (s1 + ((point.x + ",") + point.y));
if (j != (numRemainder - 1)){
s1 = (s1 + ", ");
};
j++;
};
s1 = (s1 + "\" />");
s = s1;
ss = (ss + (s + "\n"));
trace(s);
};
s = "</line>";
ss = (ss + (s + "\n"));
trace(s);
};
s = "</level>";
ss = (ss + (s + "\n"));
trace(s);
ExternalData.OutputString(ss);
}
static function GetNumLibraryPages():int{
var numPerPage:int = (boxNumW * boxNumH);
var num:int = CountLibraryPieces();
var p:int = (num / numPerPage);
var pr:int = (num % numPerPage);
if (pr != 0){
p++;
};
return (p);
}
static function RemoveFromLevelInstances(poi:PhysObj_Instance){
var p:PhysObj_Instance;
var level_instances:Array = GetCurrentLevelInstances();
var list1:Array = new Array();
for each (p in level_instances) {
if (p == poi){
} else {
list1.push(p);
};
};
level_instances = list1;
Game.levels[currentLevel].instances = level_instances;
}
static function Editor_RenderPickedObjectsHilight():void{
var ob:Object;
var po:PhysObj;
var x:Number;
var y:Number;
var bd:BitmapData = Game.main.screenBD;
var pos:Point = GetCurrentPieceInitialPos();
for each (ob in currentPieceList) {
po = Game.physObjs.GetByIndex(ob.id);
if (po != null){
x = ob.origx;
y = ob.origy;
PhysObj.RenderOutline(po, (x - scrollX), (y - scrollY), 9, bd);
};
};
}
static function SortInstancesByZ(list:Array):Array{
var poi:PhysObj_Instance;
var po:PhysObj;
var body:PhysObj_Body;
var graphic:PhysObj_Graphic;
for each (poi in list) {
poi.sortZ = 0;
po = Game.physObjs.FindByName(poi.typeName);
for each (body in po.bodies) {
for each (graphic in body.graphics) {
poi.sortZ = graphic.zoffset;
};
};
};
list.sortOn("sortZ", (Array.NUMERIC | Array.DESCENDING));
return (list);
}
static function Lines_SelectPoint(x:Number, y:Number){
var line:PhysLine;
var pointIndex:int;
var p:Point;
var l:Level = GetCurrentLevel();
var lineIndex:int;
currentLineIndex = -1;
currentPointIndex = -1;
for each (line in l.lines) {
pointIndex = 0;
for each (p in line.points) {
if (Utils.DistBetweenPoints(p.x, p.y, x, y) < 3){
currentLineIndex = lineIndex;
currentPointIndex = pointIndex;
return;
};
pointIndex++;
};
lineIndex++;
};
}
public static function Editor_PreviousLevel():void{
currentLevel--;
if (currentLevel < 0){
currentLevel = 0;
};
currentLineIndex = -1;
currentPointIndex = -1;
}
static function RenderBackground(bd:BitmapData){
var gfxid:int = GraphicObjects.GetIndexByName("BackgroundScroll1");
GraphicObjects.RenderAt(gfxid, 0, bd, -(scrollX), -(scrollY));
}
static function Library_PickPiece(){
var po:PhysObj;
var mx:int = MouseControl.x;
var my:int = MouseControl.y;
var x:int = (mx / boxSizeW);
var y:int = (my / boxSizeH);
var pos:int = (x + (y * boxNumW));
var numPerPage:int = (boxNumW * boxNumH);
pos = (pos + (library_page * numPerPage));
var num:int = (Game.physObjs.GetNum() - 1);
if (pos > num){
pos = num;
};
var count:int;
var count1:int;
var pos1:int;
for each (po in Game.physObjs.list) {
if (count == pos){
pos1 = count1;
};
if (po.displayInLibrary){
count++;
};
count1++;
};
ClearCurrentPieces();
AddCurrentPiece(pos1, 0, 0, 0);
}
static function Editor_RenderLineToCursor(){
var l:Level = GetCurrentLevel();
if (currentLineIndex == -1){
return;
};
var line:PhysLine = l.lines[currentLineIndex];
var mx:int = MouseControl.x;
var my:int = MouseControl.y;
var i:int = (line.points.length - 1);
var p0:Point = line.points[i].clone();
p0.x = (p0.x - scrollX);
p0.y = (p0.y - scrollY);
var bd:BitmapData = Game.main.screenBD;
Utils.RenderDotLine(bd, mx, my, p0.x, p0.y, 200, 4278255615);
}
static function Lines_SelectLine(x:Number, y:Number){
var line:PhysLine;
var p:Point;
var l:Level = GetCurrentLevel();
var lineIndex:int;
currentLineIndex = -1;
for each (line in l.lines) {
for each (p in line.points) {
if (Utils.DistBetweenPoints(p.x, p.y, x, y) < 3){
currentLineIndex = lineIndex;
return;
};
};
lineIndex++;
};
}
static function Lines_ChangeType(){
if (currentLineIndex == -1){
return;
};
var l:Level = GetCurrentLevel();
var line:PhysLine = l.lines[currentLineIndex];
line.type++;
line.type = (line.type % 8);
}
static function Lines_MovePoints(x:Number, y:Number){
var d:Number;
var p:Point;
if (currentLineIndex == -1){
return;
};
var l:Level = GetCurrentLevel();
var points:Array = l.lines[currentLineIndex].points;
var maxd:Number = 100;
for each (p in points) {
d = Utils.DistBetweenPoints(p.x, p.y, x, y);
if (d < maxd){
d = (maxd - d);
d = Utils.ScaleTo(0, 5, 0, maxd, d);
if (p.y < y){
p.y = (p.y - d);
} else {
if (p.y > y){
p.y = (p.y + d);
};
};
};
};
}
static function EditorWheelHandler(delta:int){
var index:int;
if (editMode == editMode_Normal){
if (delta > 0){
IncCurrentPiece();
};
if (delta < 0){
DecCurrentPiece();
};
};
if (editMode == editMode_Adjust){
if (currentAdjustObject != null){
if (delta > 0){
index = Game.physObjs.FindIndexByName(currentAdjustObject.typeName);
index++;
if (index >= Game.physObjs.GetNum()){
index = 0;
};
currentAdjustObject.typeName = Game.physObjs.GetByIndex(index).name;
};
if (delta < 0){
index = Game.physObjs.FindIndexByName(currentAdjustObject.typeName);
index--;
if (index < 0){
index = (Game.physObjs.GetNum() - 1);
};
currentAdjustObject.typeName = Game.physObjs.GetByIndex(index).name;
};
};
};
if (editMode == editMode_Library){
if (delta > 0){
library_page++;
if (library_page >= GetNumLibraryPages()){
library_page = 0;
};
};
if (delta < 0){
library_page--;
if (library_page < 0){
library_page = (GetNumLibraryPages() - 1);
};
};
};
}
static function GetCurrentLevelInstances():Array{
return (Game.levels[currentLevel].instances);
}
static function GenerateFloorTileGrid(){
var i:int;
var j:int;
var level_instances:Array = GetCurrentLevelInstances();
i = 0;
while (i < 3000) {
j = -2000;
while (j < 2000) {
level_instances.push(Game.CreatePhysObjInstanceAt("floortile01", i, j, 0, ""));
j = (j + 104);
};
i = (i + 160);
};
SetCurrentLevelInstances(level_instances);
}
public static function UpdateEditor():void{
var physObj:PhysObj;
var poi:PhysObj_Instance;
var pos:Point;
var v:Number;
var rv:Number;
var rotvel:Number;
var xvel:Number;
var yvel:Number;
var dv:Number;
var xv:Number;
var yv:Number;
var p:Point;
var level_instances:Array;
var posx:Number;
var posy:Number;
var ob:Object;
var pieceName:String;
var ppp:Point;
updateTimer++;
var mx:int = MouseControl.x;
var my:int = MouseControl.y;
if (gridMode_active){
mx = Math.floor(mx);
my = Math.floor(my);
mx = (int((mx / gridsnap)) * int(gridsnap));
my = (int((my / gridsnap)) * int(gridsnap));
};
var sx:Number = scrollX;
var sy:Number = scrollY;
if (gridMode_active){
sx = Math.floor(sx);
sy = Math.floor(sy);
sx = (int((sx / gridsnap)) * int(gridsnap));
sy = (int((sy / gridsnap)) * int(gridsnap));
};
var mxs:int = (mx + sx);
var mys:int = (my + sy);
var l:Level = GetCurrentLevel();
if (editMode == editMode_Commands){
if (KeyReader.Pressed(KeyReader.KEY_1)){
editMode = editMode_Normal;
};
if (KeyReader.Pressed(KeyReader.KEY_2)){
editMode = editMode_Library;
library_page++;
if (library_page >= GetNumLibraryPages()){
library_page = 0;
};
};
if (KeyReader.Pressed(KeyReader.KEY_3)){
editMode = editMode_Eraser;
};
if (KeyReader.Pressed(KeyReader.KEY_5)){
currentAdjustObject = null;
editMode = editMode_Adjust;
};
if (KeyReader.Pressed(KeyReader.KEY_6)){
editMode = editMode_Lines;
};
if (KeyReader.Pressed(KeyReader.KEY_7)){
editMode = editMode_PickPiece;
ClearCurrentPieces();
};
if (KeyReader.Pressed(KeyReader.KEY_SPACE)){
editMode = editMode_Commands1;
};
return;
};
if (editMode == editMode_Commands1){
if (KeyReader.Pressed(KeyReader.KEY_1)){
Editor_ClearLevel();
editMode = prevEditMode;
};
if (KeyReader.Pressed(KeyReader.KEY_2)){
Editor_AddLevel();
editMode = prevEditMode;
};
if (KeyReader.Pressed(KeyReader.KEY_9)){
Game.StartLevelPlay();
return;
};
if (KeyReader.Pressed(KeyReader.KEY_4)){
ExportLevelAsXml();
editMode = prevEditMode;
};
if (KeyReader.Pressed(KeyReader.KEY_5)){
ExportAllLevelsAsXml();
editMode = prevEditMode;
};
if (KeyReader.Pressed(KeyReader.KEY_SPACE)){
editMode = editMode_GridCommands;
};
if (KeyReader.Pressed(KeyReader.KEY_8)){
Editor_PreviousLevel();
};
if (KeyReader.Pressed(KeyReader.KEY_9)){
Editor_NextLevel();
};
return;
};
if (editMode == editMode_GridCommands){
if (KeyReader.Pressed(KeyReader.KEY_1)){
gridMode_active = (gridMode_active == false);
};
if (KeyReader.Pressed(KeyReader.KEY_2)){
gridMode_renderGrid = (gridMode_renderGrid == false);
};
if (KeyReader.Pressed(KeyReader.KEY_3)){
objectZSortMode = (objectZSortMode == false);
};
if (KeyReader.Pressed(KeyReader.KEY_9)){
GenerateFloorTileGrid();
};
if (KeyReader.Pressed(KeyReader.KEY_SPACE)){
editMode = prevEditMode;
};
return;
};
if (KeyReader.Pressed(KeyReader.KEY_X)){
renderMiniMap = (renderMiniMap == false);
};
if (KeyReader.Pressed(KeyReader.KEY_SPACE)){
prevEditMode = editMode;
editMode = editMode_Commands;
};
if (editMode == editMode_Library){
if (MouseControl.buttonPressed){
MouseControl.buttonPressed = false;
Library_PickPiece();
editMode = editMode_Normal;
};
if (KeyReader.Pressed(KeyReader.KEY_DOWN)){
library_page++;
if (library_page >= GetNumLibraryPages()){
library_page = 0;
};
};
if (KeyReader.Pressed(KeyReader.KEY_UP)){
library_page--;
if (library_page < 0){
library_page = (GetNumLibraryPages() - 1);
};
};
return;
};
if (editMode == editMode_PickPiece){
if (MouseControl.buttonPressed){
MouseControl.buttonPressed = false;
poi = HitTestPhysObjGraphics(mx, my);
if (poi){
if (KeyReader.Down(KeyReader.KEY_CONTROL)){
if (currentPieceList.length == 0){
AddCurrentPiece(Game.physObjs.FindIndexByName(poi.typeName), 0, 0, 0, poi.x, poi.y);
} else {
pos = GetCurrentPieceInitialPos();
AddCurrentPiece(Game.physObjs.FindIndexByName(poi.typeName), 0, (poi.x - pos.x), (poi.y - pos.y), poi.x, poi.y);
};
} else {
AddCurrentPiece(Game.physObjs.FindIndexByName(poi.typeName), 0, 0, 0, poi.x, poi.y);
editMode = editMode_Normal;
};
};
};
UpdateScroll();
return;
};
if (editMode == editMode_Eraser){
if (MouseControl.buttonPressed){
MouseControl.buttonPressed = false;
poi = HitTestPhysObjGraphics(mx, my);
if (poi){
RemoveFromLevelInstances(poi);
};
};
UpdateScroll();
return;
};
if (editMode == editMode_Adjust){
if (MouseControl.buttonPressed){
MouseControl.buttonPressed = false;
poi = HitTestPhysObjGraphics(mx, my);
if (poi){
currentAdjustObject = poi;
} else {
currentAdjustObject = null;
};
};
if (currentAdjustObject != null){
v = 1;
rv = 1;
rotvel = 0;
xvel = 0;
yvel = 0;
if (KeyReader.Down(KeyReader.KEY_CONTROL)){
v = (v * 10);
rv = (rv * 10);
};
if (KeyReader.Down(KeyReader.KEY_SHIFT)){
if (KeyReader.Down(KeyReader.KEY_LEFT)){
xvel = -(v);
};
if (KeyReader.Down(KeyReader.KEY_RIGHT)){
xvel = v;
};
if (KeyReader.Down(KeyReader.KEY_UP)){
yvel = -(v);
};
if (KeyReader.Down(KeyReader.KEY_DOWN)){
yvel = v;
};
currentAdjustObject.x = (currentAdjustObject.x + xvel);
currentAdjustObject.y = (currentAdjustObject.y + yvel);
};
if (KeyReader.Down(KeyReader.KEY_6)){
rotvel = -(rv);
};
if (KeyReader.Down(KeyReader.KEY_7)){
rotvel = rv;
};
currentAdjustObject.rot = (currentAdjustObject.rot + rotvel);
};
UpdateScroll();
return;
};
if (editMode == editMode_Lines){
if (MouseControl.buttonPressed){
if (KeyReader.Down(KeyReader.KEY_7)){
Lines_MovePoints(mxs, mys);
return;
};
MouseControl.buttonPressed = false;
if (KeyReader.Down(KeyReader.KEY_1)){
Lines_SelectLine(mxs, mys);
return;
};
if (KeyReader.Down(KeyReader.KEY_2)){
Lines_DeletePoint(mxs, mys);
return;
};
if (KeyReader.Down(KeyReader.KEY_3)){
Lines_InsertPoint(mxs, mys);
return;
};
if (KeyReader.Down(KeyReader.KEY_4)){
Lines_SelectPoint(mxs, mys);
return;
};
if (KeyReader.Down(KeyReader.KEY_5)){
Lines_NewLine();
};
if (KeyReader.Down(KeyReader.KEY_6)){
Lines_Subdivide(mxs, mys);
return;
};
Lines_AddPoint(mxs, mys);
};
if (KeyReader.Pressed(KeyReader.KEY_8)){
Lines_ChangeType();
return;
};
if (KeyReader.Pressed(KeyReader.KEY_LEFTSQUAREBRACKET)){
Lines_ScrollToFirstPointOfSelectedLine();
};
if (KeyReader.Pressed(KeyReader.KEY_RIGHTSQUAREBRACKET)){
Lines_ScrollToLastPointOfSelectedLine();
};
if (((!((currentLineIndex == -1))) && (!((currentPointIndex == -1))))){
dv = 1;
xv = 0;
yv = 0;
if (KeyReader.Down(KeyReader.KEY_CONTROL)){
dv = (dv * 10);
};
if (KeyReader.Down(KeyReader.KEY_SHIFT)){
if (KeyReader.Down(KeyReader.KEY_LEFT)){
xv = -(dv);
};
if (KeyReader.Down(KeyReader.KEY_RIGHT)){
xv = dv;
};
if (KeyReader.Down(KeyReader.KEY_UP)){
yv = -(dv);
};
if (KeyReader.Down(KeyReader.KEY_DOWN)){
yv = dv;
};
};
p = l.lines[currentLineIndex].points[currentPointIndex];
p.x = (p.x + xv);
p.y = (p.y + yv);
};
UpdateScroll();
return;
};
if (editMode == editMode_Normal){
if (KeyReader.Down(KeyReader.KEY_SHIFT) == true){
if (KeyReader.Pressed(KeyReader.KEY_UP)){
IncCurrentPiece();
};
if (KeyReader.Pressed(KeyReader.KEY_DOWN)){
DecCurrentPiece();
};
rv = 1;
if (KeyReader.Down(KeyReader.KEY_CONTROL) == false){
rv = (rv * 10);
};
if (KeyReader.Down(KeyReader.KEY_LEFT)){
CurrenPiece_AddRot(-(rv));
};
if (KeyReader.Down(KeyReader.KEY_RIGHT)){
CurrenPiece_AddRot(rv);
};
};
if (MouseControl.buttonPressed){
MouseControl.buttonPressed = false;
level_instances = GetCurrentLevelInstances();
posx = mxs;
posy = mys;
for each (ob in currentPieceList) {
physObj = Game.physObjs.GetByIndex(ob.id);
pieceName = physObj.name;
if (KeyReader.Down(KeyReader.KEY_1)){
ppp = SnapToObjects(mxs, mys);
if (ppp != null){
trace(((((((("snapped to point :" + mxs) + " ") + mys) + " -> ") + ppp.x) + " ") + ppp.y));
posx = ppp.x;
posy = ppp.y;
};
};
level_instances.push(Game.CreatePhysObjInstanceAt(pieceName, (posx + ob.xoff), (posy + ob.yoff), ob.rot, ""));
SetCurrentLevelInstances(level_instances);
};
};
UpdateScroll();
};
}
public static function InitEditor():void{
Mouse.show();
Game.InitBox2D();
GameObjects.ClearAll();
updateTimer = 0;
editMode = editMode_Normal;
currentLineIndex = -1;
currentPointIndex = -1;
currentPieceList = new Array();
AddCurrentPiece(0, 0, 0, 0, 0, 0);
currentLevel = Game.currentLevel;
var l:Level = GetCurrentLevel();
currentLineIndex = (l.lines.length - 1);
MouseControl.SetWheelHandler(EditorWheelHandler);
}
static function RenderEditor(){
var gfxid:int;
var numf:int;
var px:Number;
var s:String;
var x:int;
var y:int;
var numPerPage:int;
var min:int;
var max:int;
var num:int;
var index:int;
var po:PhysObj;
var physObj:PhysObj;
var ob:Object;
var pi:PhysObj_Instance;
var bd:BitmapData = Game.main.screenBD;
var mx:int = MouseControl.x;
var my:int = MouseControl.y;
if (gridMode_active){
mx = Math.floor(mx);
my = Math.floor(my);
mx = (int((mx / gridsnap)) * int(gridsnap));
my = (int((my / gridsnap)) * int(gridsnap));
};
var sx:Number = scrollX;
var sy:Number = scrollY;
if (gridMode_active){
sx = Math.floor(sx);
sy = Math.floor(sy);
sx = (int((sx / gridsnap)) * int(gridsnap));
sy = (int((sy / gridsnap)) * int(gridsnap));
};
var mxs:int = (mx + sx);
var mys:int = (my + sy);
if (editMode == editMode_Commands){
bd.fillRect(Defs.screenRect, 4285542576);
};
if (editMode == editMode_Commands1){
bd.fillRect(Defs.screenRect, 4285542592);
};
if (editMode == editMode_GridCommands){
bd.fillRect(Defs.screenRect, 4285542592);
};
if (editMode == editMode_Library){
bd.fillRect(Defs.screenRect, 4284498112);
x = 0;
y = 0;
x = 0;
while (x < Defs.displayarea_w) {
Utils.RenderDotLine(bd, x, 0, x, 640, 100, 4282433600);
x = (x + boxSizeW);
};
x = 0;
while (x < Defs.displayarea_h) {
Utils.RenderDotLine(bd, 0, x, 640, x, 100, 4282433600);
x = (x + boxSizeH);
};
numPerPage = (boxNumW * boxNumH);
min = (library_page * numPerPage);
max = (min + (numPerPage - 1));
x = 0;
y = 0;
num = Game.physObjs.GetNum();
index = 0;
for each (po in Game.physObjs.list) {
if (po.displayInLibrary){
if ((((index >= min)) && ((index <= max)))){
PhysObj.RenderAt(po, (x + (boxSizeW / 2)), (y + (boxSizeH / 2)), 0, bd, true, 1, new Rectangle((x + 8), (y + 8), (boxSizeW - 16), (boxSizeH - 16)));
s = po.name;
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, (x + 8), ((y + boxSizeH) - 16), s, null);
x = (x + boxSizeW);
if (x >= Defs.displayarea_w){
x = 0;
y = (y + boxSizeH);
};
};
};
index++;
};
};
if (editMode == editMode_Eraser){
bd.fillRect(Defs.screenRect, 4281549909);
RenderBackground(bd);
if (renderObjects){
Editor_RenderObjects();
};
if (renderMiniMap){
Editor_RenderMiniMap();
};
Editor_RenderLines();
};
if (editMode == editMode_PickPiece){
bd.fillRect(Defs.screenRect, 4281549909);
RenderBackground(bd);
if (renderObjects){
Editor_RenderObjects();
Editor_RenderPickedObjectsHilight();
};
if (renderMiniMap){
Editor_RenderMiniMap();
};
Editor_RenderLines();
};
if (editMode == editMode_Normal){
bd.fillRect(Defs.screenRect, 4282668390);
RenderBackground(bd);
if (renderObjects){
Editor_RenderObjects();
};
if (renderMiniMap){
Editor_RenderMiniMap();
};
Editor_RenderLines();
for each (ob in currentPieceList) {
physObj = Game.physObjs.GetByIndex(ob.id);
PhysObj.RenderAt(physObj, ((mxs - scrollX) + ob.xoff), ((mys - scrollY) + ob.yoff), ob.rot, bd);
if (physObj != null){
pi = Game.CreatePhysObjInstanceAt(physObj.name, mxs, mys, ob.rot, "");
Editor_GetNearbyGuidelines(pi, 0, 0);
Editor_RenderNearbyGuidelines();
};
};
Editor_RenderGrid(bd);
};
if (editMode == editMode_Adjust){
bd.fillRect(Defs.screenRect, 4282668390);
RenderBackground(bd);
if (renderObjects){
Editor_RenderObjects_AdjustMode();
};
if (renderMiniMap){
Editor_RenderMiniMap();
};
Editor_RenderLines();
if (currentAdjustObject != null){
Editor_GetNearbyGuidelines(currentAdjustObject, 0, 0);
Editor_RenderNearbyGuidelines();
};
Editor_RenderGrid(bd);
};
if (editMode == editMode_Lines){
bd.fillRect(Defs.screenRect, 4282668390);
RenderBackground(bd);
if (renderObjects){
Editor_RenderObjects();
};
if (renderMiniMap){
Editor_RenderMiniMap();
};
Editor_RenderLines();
Editor_RenderLineToCursor();
Editor_RenderGrid(bd);
};
RenderPanel_Editor();
}
static function Editor_RenderMiniMap(){
var poi:PhysObj_Instance;
var po:PhysObj;
var scale:Number = (1 / 20);
var level_instances:Array = GetCurrentLevelInstances();
var bd:BitmapData = Game.main.screenBD;
for each (poi in level_instances) {
po = Game.physObjs.FindByName(poi.typeName);
if (po != null){
PhysObj.RenderAt(po, (poi.x - scrollX), ((poi.y - scrollY) + (240 / scale)), poi.rot, bd, false, scale);
};
};
}
public static function HitTestPhysObjGraphics(x:Number, y:Number):PhysObj_Instance{
var i:int;
var poi:PhysObj_Instance;
var bd:BitmapData;
var po:PhysObj;
var col:uint;
var level_instances:Array = GetCurrentLevelInstances();
i = (level_instances.length - 1);
while (i >= 0) {
poi = level_instances[i];
bd = Game.main.screenBD;
bd.fillRect(Defs.screenRect, 0);
po = Game.physObjs.FindByName(poi.typeName);
PhysObj.RenderAt(po, (poi.x - scrollX), (poi.y - scrollY), poi.rot, bd);
col = bd.getPixel32(x, y);
if (col != 0){
return (poi);
};
i--;
};
return (null);
}
static function Editor_RenderObjects_AdjustMode(){
var poi:PhysObj_Instance;
var po:PhysObj;
var level_instances:Array = GetCurrentLevelInstances();
if (objectZSortMode){
level_instances = SortInstancesByZ(level_instances);
};
var bd:BitmapData = Game.main.screenBD;
for each (poi in level_instances) {
po = Game.physObjs.FindByName(poi.typeName);
if (poi == currentAdjustObject){
if ((updateTimer & 2)){
PhysObj.RenderAt(po, (poi.x - scrollX), (poi.y - scrollY), poi.rot, bd);
};
} else {
PhysObj.RenderAt(po, (poi.x - scrollX), (poi.y - scrollY), poi.rot, bd);
};
};
}
static function IncCurrentPiece(){
var ob:Object;
for each (ob in currentPieceList) {
ob.id++;
if (ob.id > (Game.physObjs.GetNum() - 1)){
ob.id = 0;
};
};
}
static function Lines_InsertPoint(x:Number, y:Number){
var line:PhysLine;
var pointIndex:int;
var p:Point;
var a0:Array;
var p0:Point;
var p1:Point;
var newPoint:Point;
var l:Level = GetCurrentLevel();
var lineIndex:int;
var selectedLineIndex = -1;
var selectedPointIndex = -1;
for each (line in l.lines) {
pointIndex = 0;
for each (p in line.points) {
if (Utils.DistBetweenPoints(p.x, p.y, x, y) < 3){
selectedLineIndex = lineIndex;
selectedPointIndex = pointIndex;
};
pointIndex++;
};
lineIndex++;
};
if (((!((selectedLineIndex == -1))) && (!((selectedPointIndex == -1))))){
a0 = l.lines[selectedLineIndex].points;
if (selectedPointIndex == (a0.length - 1)){
return;
};
p0 = a0[selectedPointIndex].clone();
p1 = a0[(selectedPointIndex + 1)].clone();
newPoint = new Point(0, 0);
newPoint.x = ((p0.x + p1.x) * 0.5);
newPoint.y = ((p0.y + p1.y) * 0.5);
a0.splice((selectedPointIndex + 1), 0, newPoint);
l.lines[selectedLineIndex].points = a0;
};
}
static function GetCurrentLevel():Level{
return (Game.levels[currentLevel]);
}
static function Lines_AddPoint(x:Number, y:Number){
if (currentLineIndex == -1){
return;
};
var l:Level = GetCurrentLevel();
var p:Point = new Point(x, y);
var pts:Array = l.lines[currentLineIndex].points;
pts.push(p);
l.lines[currentLineIndex].points = pts;
}
public static function ExportAllLevelsAsXml(){
var i:int;
var cl:int = currentLevel;
i = 0;
while (i < Game.levels.length) {
currentLevel = i;
ExportLevelAsXml();
i++;
};
currentLevel = cl;
}
static function ClearCurrentPieces():void{
currentPieceList = new Array();
}
public static function Editor_AddLevel():void{
var l:Level = new Level();
currentLevel = Game.levels.length;
Game.levels.push(l);
currentLineIndex = -1;
currentPointIndex = -1;
}
static function DecCurrentPiece(){
var ob:Object;
for each (ob in currentPieceList) {
ob.id--;
if (ob.id < 0){
ob.id = (Game.physObjs.GetNum() - 1);
};
};
}
static function RenderPanel_Editor(){
var x:Number;
var y:Number;
var s:String;
var line:PhysLine;
var bd:BitmapData = Game.main.screenBD;
if (editMode == editMode_Commands){
s = "Editor: Mode = Commands";
x = 10;
y = 10;
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
x = 50;
y = 50;
s = "1: Place Pieces";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "2: Library (cycle)";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "3: Eraser";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "4: Commands";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "5: Adjust Placement";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "6: Edit Lines";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "7: Pick Piece";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "8: Prev Level";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "9: Next Level";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
return;
};
if (editMode == editMode_Commands1){
s = "Editor: Mode = Commands1";
x = 10;
y = 10;
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
x = 50;
y = 50;
s = "1: Erase Level";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "2: Add New Level (at end)";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "4: Export current level";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "5: Export all levels";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "9: Quit To Game";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
return;
};
if (editMode == editMode_GridCommands){
s = "Editor: Mode = Grid Commands / Misc";
x = 10;
y = 10;
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
x = 50;
y = 50;
s = ("1: Grid Active: " + gridMode_active);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = ("2: Render Grid: " + gridMode_renderGrid);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = ("3: Z Sort objects: " + objectZSortMode);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
return;
};
s = "Editor: Mode = ";
if (editMode == editMode_Normal){
s = (s + "Placement");
};
if (editMode == editMode_Library){
s = (s + ((("Library Page " + int((library_page + 1)).toString()) + " / ") + int(GetNumLibraryPages()).toString()));
};
if (editMode == editMode_Eraser){
s = (s + "Eraser");
};
if (editMode == editMode_Adjust){
s = (s + "Adjust");
};
if (editMode == editMode_Lines){
s = (s + "Lines");
};
if (editMode == editMode_PickPiece){
s = (s + "PickPiece");
};
x = 10;
y = 10;
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
if (editMode == editMode_Lines){
s = "1: Select Line (hold and click on point)";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "2: Delete Point (hold and click to delete)";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "3: Insert Point after clicked point";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "4: Select Point for editing with arrow keys";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "5: New line (hold and click new point)";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "6: Subdivide between this point and selected point";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "7: Push line points";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "8: Change Type";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "[ and ]: Move to first / last point of selected line";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = ((("ScrollPos: " + scrollX) + " ") + scrollY);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = ((("CursorPos: " + int((MouseControl.x + scrollX))) + " ") + int((MouseControl.y + scrollY)));
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
if (currentLineIndex != -1){
line = GetCurrentLevel().lines[currentLineIndex];
s = ("Type: " + line.type);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
};
};
if (editMode == editMode_Adjust){
s = "Shift + Arrows: Move Piece";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "6: Rotate Left";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "7: Rotate Right";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
};
if (editMode == editMode_Normal){
s = ((("ScrollPos: " + scrollX) + " ") + scrollY);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = ((("CursorPos: " + int((MouseControl.x + scrollX))) + " ") + int((MouseControl.y + scrollY)));
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
s = "1: Snap to nearby objects";
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
};
if (editMode == editMode_Adjust){
if (currentAdjustObject != null){
s = ((((("Pos: " + currentAdjustObject.x) + " ") + currentAdjustObject.y) + " Rot: ") + currentAdjustObject.rot);
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
y = (y + 15);
};
};
x = 350;
s = ("Level=" + currentLevel.toString());
GraphicObjects.RenderStringAt(bd, GraphicObjects.gfx_font1, x, y, s, null);
}
}
}//package
class PhysEd_GuideLine {
private var level:Boolean;
private var y1:Number;
private var y0:Number;
private var x0:Number;
private var x1:Number;
private var type:int;
private function PhysEd_GuideLine(l0:Number, l1:Number, p:Number, _type:Number, _level:Boolean){
super();
type = _type;
level = _level;
if (type == 0){
x0 = l0;
x1 = l1;
y0 = p;
y1 = p;
} else {
y0 = l0;
y1 = l1;
x0 = p;
x1 = p;
};
}
}
Section 184
//PhysLine (PhysLine)
package {
import flash.display.*;
import flash.geom.*;
public class PhysLine {
var fill:int;
public var points:Array;
var name:String;
var fillScaleX:Number;
var fillScaleY:Number;
var type:int;
var catmullRomLength:Number;
public function PhysLine(){
super();
name = "undefined";
type = 0;
points = new Array();
fill = 0;
fillScaleX = 1;
fillScaleY = 1;
}
function PointOnCurve(t:Number, p0:Point, p1:Point, p2:Point, p3:Point):Point{
var out:Point = new Point();
var t2:Number = (t * t);
var t3:Number = (t2 * t);
out.x = (0.5 * ((((2 * p1.x) + ((-(p0.x) + p2.x) * t)) + (((((2 * p0.x) - (5 * p1.x)) + (4 * p2.x)) - p3.x) * t2)) + ((((-(p0.x) + (3 * p1.x)) - (3 * p2.x)) + p3.x) * t3)));
out.y = (0.5 * ((((2 * p1.y) + ((-(p0.y) + p2.y) * t)) + (((((2 * p0.y) - (5 * p1.y)) + (4 * p2.y)) - p3.y) * t2)) + ((((-(p0.y) + (3 * p1.y)) - (3 * p2.y)) + p3.y) * t3)));
return (out);
}
public function DrawCatmullRom(bd:BitmapData, col:uint, xoff:Number, yoff:Number){
var t1:Number;
var pp:Point;
var np:int = GetNumPoints();
if (np < 4){
return;
};
t1 = 0;
while (t1 < 1) {
pp = GetPointOnCatmullRom(t1);
bd.setPixel32((pp.x + xoff), (pp.y + yoff), col);
t1 = (t1 + 0.001);
};
}
public function GetPointOnCatmullRom(t:Number):Point{
var p0:Point;
var p1:Point;
var p2:Point;
var p3:Point;
var np:int = GetNumPoints();
if (np < 4){
return (new Point(0, 0));
};
var numSegs:int = (np - 1);
var seg:Number = (Number(numSegs) * t);
var i:int = seg;
var pt0:int = (i - 1);
var pt1:int = i;
var pt2:int = (i + 1);
var pt3:int = (i + 2);
if (pt0 < 0){
pt0 = 0;
};
if (pt2 > (np - 1)){
pt2 = (np - 1);
};
if (pt3 > (np - 1)){
pt3 = (np - 1);
};
p0 = points[pt0];
p1 = points[pt1];
p2 = points[pt2];
p3 = points[pt3];
var i1:int = (i + 1);
var s0:Number = ((1 / Number(numSegs)) * i);
var s1:Number = ((1 / Number(numSegs)) * i1);
var t1:Number = ((1 / (s1 - s0)) * (t - s0));
var p:Point = PointOnCurve(t1, p0, p1, p2, p3);
return (p);
}
public function GetPointOnCatmullRomLoop(t:Number):Point{
var p0:Point;
var p1:Point;
var p2:Point;
var p3:Point;
var np:uint = GetNumPoints();
if (np < 4){
return (new Point(0, 0));
};
var numSegs:int = np;
var seg:Number = (Number(numSegs) * t);
var i:int = seg;
var pt0:int = (i - 1);
var pt1:int = i;
var pt2:int = (i + 1);
var pt3:int = (i + 2);
if (pt0 < 0){
pt0 = (pt0 + np);
};
if (pt1 < 0){
pt1 = (pt1 + np);
};
if (pt1 >= np){
pt1 = (pt1 - np);
};
if (pt2 >= np){
pt2 = (pt2 - np);
};
if (pt3 >= np){
pt3 = (pt3 - np);
};
p0 = points[pt0];
p1 = points[pt1];
p2 = points[pt2];
p3 = points[pt3];
var i1:int = (i + 1);
var s0:Number = ((1 / Number(numSegs)) * i);
var s1:Number = ((1 / Number(numSegs)) * i1);
var t1:Number = ((1 / (s1 - s0)) * (t - s0));
var p:Point = PointOnCurve(t1, p0, p1, p2, p3);
return (p);
}
public function GetNumPoints():int{
return (points.length);
}
public function GetInterpolatedPoint(pos:Number, loop:Boolean, _mode:int):Point{
var numPoints:int;
var nodelen:Number;
var pi0:int;
var pi1:int;
var pos0:Number;
var pos1:Number;
var x:Number;
var y:Number;
var p:Point;
if (_mode == 1){
if (loop){
return (GetPointOnCatmullRomLoop(pos));
};
return (GetPointOnCatmullRom(pos));
};
if (loop == true){
numPoints = points.length;
nodelen = (1 / numPoints);
pi0 = Math.floor((numPoints * pos));
pi1 = ((pi0 + 1) % numPoints);
pos0 = (pi0 * nodelen);
pos1 = ((pi0 + 1) * nodelen);
x = Utils.ScaleTo(points[pi0].x, points[pi1].x, pos0, pos1, pos);
y = Utils.ScaleTo(points[pi0].y, points[pi1].y, pos0, pos1, pos);
p = new Point(x, y);
return (p);
};
numPoints = points.length;
nodelen = (1 / (numPoints - 1));
pi0 = Math.floor(((numPoints - 1) * pos));
pi1 = ((pi0 + 1) % numPoints);
pos0 = (pi0 * nodelen);
pos1 = ((pi0 + 1) * nodelen);
x = Utils.ScaleTo(points[pi0].x, points[pi1].x, pos0, pos1, pos);
y = Utils.ScaleTo(points[pi0].y, points[pi1].y, pos0, pos1, pos);
p = new Point(x, y);
return (p);
}
public function SetPointArray(a:Array){
points = a;
}
public function Clone():PhysLine{
var p:Point;
var l:PhysLine = new PhysLine();
l.name = name;
l.type = type;
l.fill = fill;
l.fillScaleX = fillScaleX;
l.fillScaleY = fillScaleY;
for each (p in points) {
l.points.push(p.clone());
};
return (l);
}
public function CalculateCatmullRomLength(){
var i:int;
var t1:Number;
var pp:Point;
var p0:Point;
var p1:Point;
var l:Array = new Array();
var np:int = GetNumPoints();
if (np < 4){
catmullRomLength = 0;
} else {
t1 = 0;
while (t1 < 1) {
pp = GetPointOnCatmullRom(t1);
l.push(pp);
t1 = (t1 + 0.025);
};
};
catmullRomLength = 0;
i = 0;
while (i < (l.length - 2)) {
p0 = l[i];
p1 = l[(i + 1)];
catmullRomLength = (catmullRomLength + Utils.DistBetweenPoints(p0.x, p0.y, p1.x, p1.y));
i++;
};
l = null;
}
}
}//package
Section 185
//PhysObj (PhysObj)
package {
import flash.display.*;
import flash.geom.*;
import Box2D.Common.Math.*;
public class PhysObj {
public var bodies:Array;
public var joints:Array;
public var name:String;
public var initFunctionName:String;
public var displayInLibrary:Boolean;
public var hitballsound:int;
public function PhysObj(){
super();
hitballsound = 0;
}
function PointFromString(s:String):Point{
var a:Array = s.split(",");
var p:Point = new Point(0, 0);
if (a.length != 2){
trace(((("PointfromString. Error, numpoints=" + a.length) + " ") + s));
return (p);
};
p.x = Number(a[0]);
p.y = Number(a[1]);
return (p);
}
function PointArrayFromString(s:String):Array{
var i:int;
var p:Point;
var pointArray:Array = new Array();
var a:Array = s.split(",");
if ((((a.length < 2)) || (((a.length % 2) == 1)))){
trace(((("PointArrayFromString. Error, numpoints=" + a.length) + " , string= ") + s));
return (pointArray);
};
var num:int = (a.length / 2);
i = 0;
while (i < num) {
p = new Point(0, 0);
p.x = Number(a[((i * 2) + 0)]);
p.y = Number(a[((i * 2) + 1)]);
pointArray.push(p);
i++;
};
return (pointArray);
}
public function BodyIndexFromName(name:String):int{
var b:PhysObj_Body;
var i:int;
while (i < bodies.length) {
b = bodies[i];
if (b.name == name){
return (i);
};
i++;
};
trace(("ERROR PhysObj BodyIndexFromName " + name));
return (0);
}
function BooleanFromString(s:String):Boolean{
var retval:Boolean;
s = s.toUpperCase();
if (s == "1"){
retval = true;
};
if (s == "TRUE"){
retval = true;
};
return (retval);
}
public function JointIndexFromName(name:String):int{
var j:PhysObj_Joint;
var i:int;
while (i < joints.length) {
j = joints[i];
if (j.name == name){
return (i);
};
i++;
};
trace(("ERROR PhysObj JointIndexFromName " + name));
return (0);
}
public function FromXml(x:XML):void{
var i:int;
var j:int;
var k:int;
var typename:String;
var bx:XML;
var body:PhysObj_Body;
var gx:XML;
var graphic:PhysObj_Graphic;
var sx:XML;
var shape:PhysObj_Shape;
var colpt:Point;
var jx:XML;
var joint:PhysObj_Joint;
bodies = new Array();
joints = new Array();
name = x.@name;
displayInLibrary = XmlHelper.GetAttrBoolean(x.@inlibrary, false);
initFunctionName = XmlHelper.GetAttrString(x.@initfunction, null);
i = 0;
while (i < x.sound.length()) {
hitballsound = int(x.sound[i].@hitball);
i++;
};
i = 0;
while (i < x.body.length()) {
bx = x.body[i];
body = new PhysObj_Body();
body.name = bx.@name;
body.fixed = BooleanFromString(bx.@fixed);
body.sensor = BooleanFromString(bx.@sensor);
body.pos = PointFromString(bx.@pos);
body.linearDamping = XmlHelper.GetAttrNumber(bx.@lineardamping, body.linearDamping);
body.angularDamping = XmlHelper.GetAttrNumber(bx.@angulardamping, body.angularDamping);
j = 0;
while (j < bx.graphic.length()) {
gx = bx.graphic[j];
graphic = new PhysObj_Graphic();
graphic.goInitFuntion = gx.@gameobjfunction;
graphic.goInitFuntionVarString = gx.@gameobjvars;
graphic.graphicName = gx.@clip;
graphic.graphicID = 0;
graphic.frame = (XmlHelper.GetAttrInt(gx.@frame) - 1);
graphic.offset = PointFromString(gx.@pos);
graphic.zoffset = XmlHelper.GetAttrNumber(gx.@zoffset, 0);
graphic.hasShadow = XmlHelper.GetAttrBoolean(gx.@shadow, true);
graphic.rot = Number(gx.@rot);
graphic.Calculate();
body.graphics.push(graphic);
j++;
};
j = 0;
while (j < bx.shape.length()) {
sx = bx.shape[j];
shape = new PhysObj_Shape();
shape.name = sx.@name;
typename = sx.@type;
colpt = PointFromString(sx.@col);
shape.collisionCategory = XmlHelper.GetAttrInt(colpt.x);
shape.collisionMask = XmlHelper.GetAttrInt(colpt.y);
shape.density = XmlHelper.GetAttrNumber(sx.@density);
shape.friction = XmlHelper.GetAttrNumber(sx.@friction);
shape.restitution = XmlHelper.GetAttrNumber(sx.@restitution);
if (typename == "circle"){
shape.type = PhysObj_Shape.Type_Circle;
shape.circle_pos = PointFromString(sx.@pos);
shape.circle_radius = XmlHelper.GetAttrNumber(sx.@radius);
} else {
if (typename == "poly"){
shape.type = PhysObj_Shape.Type_Poly;
shape.poly_points = PointArrayFromString(sx.@vertices);
shape.poly_rot = Utils.DegToRad(XmlHelper.GetAttrNumber(sx.@rot));
};
};
shape.Caclulate();
body.shapes.push(shape);
j++;
};
bodies.push(body);
i++;
};
i = 0;
while (i < x.joint.length()) {
jx = x.joint[i];
joint = new PhysObj_Joint();
joint.name = jx.@name;
joint.obj0Name = jx.@body0;
joint.obj1Name = jx.@body1;
typename = jx.@type;
if (typename == "rev"){
joint.type = PhysObj_Joint.Type_Rev;
joint.rev_pos = PointFromString(jx.@pos);
joint.rev_enableLimit = BooleanFromString(jx.@enablelimit);
joint.rev_lowerAngle = Utils.DegToRad(XmlHelper.GetAttrNumber(jx.@lowerangle));
joint.rev_upperAngle = Utils.DegToRad(XmlHelper.GetAttrNumber(jx.@upperangle));
joint.rev_enableMotor = BooleanFromString(jx.@enablemotor);
joint.rev_motorSpeed = Number(jx.@motorspeed);
joint.rev_maxMotorTorque = Number(jx.@maxmotortorque);
} else {
if (typename == "distance"){
joint.type = PhysObj_Joint.Type_Distance;
joint.dist_pos0 = PointFromString(jx.@pos);
joint.dist_pos1 = PointFromString(jx.@pos1);
joint.dist_distance = Number(jx.@distance);
} else {
if (typename == "mouse"){
joint.type = PhysObj_Joint.Type_Mouse;
} else {
if (typename == "prismatic"){
joint.type = PhysObj_Joint.Type_Prismatic;
joint.prism_pos = PointFromString(jx.@pos);
joint.prism_enableLimit = BooleanFromString(jx.@enablelimit);
joint.prism_lowerTranslation = Number(jx.@lowertranslation);
joint.prism_upperTranslation = Number(jx.@uppertranslation);
joint.prism_enableMotor = BooleanFromString(jx.@enablemotor);
joint.prism_axisangle = (Number(jx.@axisangle) - Number(90));
joint.prism_motorSpeed = Number(jx.@motorspeed);
joint.prism_maxMotorForce = Number(jx.@maxmotorforce);
};
};
};
};
joints.push(joint);
i++;
};
}
public function BodyFromName(name:String):PhysObj_Body{
var b:PhysObj_Body;
var i:int;
while (i < bodies.length) {
b = bodies[i];
if (b.name == name){
return (b);
};
i++;
};
trace(("ERROR PhysObj BodyFromName " + name));
return (null);
}
public static function RenderAt(physObj:PhysObj, x:Number, y:Number, _rotDeg:Number, bd:BitmapData, _collision:Boolean=true, _scale:Number=1, destRect:Rectangle=null){
var xp:Number;
var yp:Number;
var a:Matrix;
var body:PhysObj_Body;
var graphic:PhysObj_Graphic;
var w:Number;
var h:Number;
var scaleW:Number;
var scaleH:Number;
var scl:Number;
var bitmapData:BitmapData;
var mat:Matrix;
var p:Point;
var m:Matrix;
var rot:Number;
var i:int;
var j:int;
var shape:PhysObj_Shape;
var r:Number;
var verts:Array;
var numVerts:int;
var v0:b2Vec2;
var v1:b2Vec2;
var p0:Point;
var p1:Point;
var renderCollision:Boolean = _collision;
var scale:Number = _scale;
xp = x;
yp = y;
for each (body in physObj.bodies) {
for each (graphic in body.graphics) {
if (destRect != null){
w = GraphicObjects.GetWidth(graphic.graphicID, graphic.frame);
h = GraphicObjects.GetHeight(graphic.graphicID, graphic.frame);
scaleW = (destRect.width / w);
scaleH = (destRect.height / h);
scl = scaleW;
if (scaleH < scaleW){
scl = scaleH;
};
xp = (xp - (destRect.width / 2));
yp = (yp - (destRect.height / 2));
bitmapData = GraphicObjects.GetBitmapData(graphic.graphicID, graphic.frame);
mat = new Matrix();
mat.identity();
mat.scale(scl, scl);
mat.translate(xp, yp);
if (bitmapData != null){
bd.draw(bitmapData, mat, null, null, null, true);
};
} else {
p = new Point((body.pos.x + graphic.offset.x), (body.pos.y + graphic.offset.y));
m = new Matrix();
m.rotate(Utils.DegToRad(_rotDeg));
m.scale(scale, scale);
p = m.transformPoint(p);
xp = ((x * scale) + p.x);
yp = ((y * scale) + p.y);
rot = Utils.DegToRad((_rotDeg + graphic.rot));
GraphicObjects.RenderAtRotScaled(graphic.graphicID, graphic.frame, bd, xp, yp, scale, rot);
};
};
if (renderCollision){
for each (shape in body.shapes) {
if (shape.type == PhysObj_Shape.Type_Circle){
r = shape.circle_radius;
Utils.RenderCircle(bd, (x + shape.circle_pos.x), (y + shape.circle_pos.y), r, 4294967295);
};
if (shape.type == PhysObj_Shape.Type_Poly){
verts = shape.poly_points;
numVerts = shape.poly_points.length;
i = 0;
while (i < numVerts) {
j = (i + 1);
if (j >= numVerts){
j = 0;
};
v0 = new b2Vec2(verts[i].x, verts[i].y);
v1 = new b2Vec2(verts[j].x, verts[j].y);
mat = new Matrix();
mat.rotate(Utils.DegToRad(_rotDeg));
p0 = new Point(v0.x, v0.y);
p1 = new Point(v1.x, v1.y);
p0 = mat.transformPoint(p0);
p1 = mat.transformPoint(p1);
v0.x = p0.x;
v0.y = p0.y;
v1.x = p1.x;
v1.y = p1.y;
v0.x = (v0.x + x);
v1.x = (v1.x + x);
v0.y = (v0.y + y);
v1.y = (v1.y + y);
Utils.RenderDotLine(bd, v0.x, v0.y, v1.x, v1.y, 50, 4294967295);
i++;
};
};
};
};
};
}
public static function RenderOutline(physObj:PhysObj, x:Number, y:Number, _rotDeg:Number, bd:BitmapData){
var body:PhysObj_Body;
var graphic:PhysObj_Graphic;
var w:Number;
var h:Number;
var r:Rectangle;
for each (body in physObj.bodies) {
for each (graphic in body.graphics) {
w = GraphicObjects.GetWidth(graphic.graphicID, graphic.frame);
h = GraphicObjects.GetHeight(graphic.graphicID, graphic.frame);
r = new Rectangle(((x + body.pos.x) + graphic.offset.x), ((y + body.pos.y) + graphic.offset.y), w, h);
Utils.RenderRectangle(bd, r, 4294926464);
};
};
}
}
}//package
Section 186
//PhysObj_Body (PhysObj_Body)
package {
import flash.geom.*;
public class PhysObj_Body {
public var angularDamping:Number;
public var name:String;
public var graphics:Array;
public var pos:Point;
public var shapes:Array;
public var fixed:Boolean;
public var sensor:Boolean;
public var linearDamping:Number;
public function PhysObj_Body(){
super();
shapes = new Array();
graphics = new Array();
name = "";
pos = new Point();
fixed = true;
sensor = false;
linearDamping = 0.1;
angularDamping = 0.1;
}
}
}//package
Section 187
//PhysObj_BodyUserData (PhysObj_BodyUserData)
package {
public class PhysObj_BodyUserData {
public var type:String;
public var instance:PhysObj_Instance;
public var gameObjectID:int;
public var bodyName:String;
public function PhysObj_BodyUserData(){
super();
type = "";
bodyName = "";
gameObjectID = -1;
instance = null;
}
}
}//package
Section 188
//PhysObj_Graphic (PhysObj_Graphic)
package {
import flash.geom.*;
public class PhysObj_Graphic {
public var offset:Point;
public var graphicID:int;
public var hasShadow:Boolean;
public var graphicName:String;
public var frame:int;
public var rot:Number;
public var goInitFuntion:String;
public var zoffset:Number;
public var goInitFuntionVarString:String;
public function PhysObj_Graphic(){
super();
graphicName = "";
graphicID = 0;
frame = 0;
offset = new Point(0, 0);
rot = 0;
goInitFuntion = "";
goInitFuntionVarString = "";
zoffset = 0;
hasShadow = true;
}
public function Calculate(){
graphicID = GraphicObjects.GetIndexByName(graphicName);
if (frame < 0){
trace("ERROR: PhysObj Graphic has negative frame. Are you counting from 0 or 1?");
frame = 0;
};
}
}
}//package
Section 189
//PhysObj_Instance (PhysObj_Instance)
package {
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.Shapes.*;
import Box2D.Collision.*;
import Box2D.Common.*;
import Box2D.Dynamics.Contacts.*;
public class PhysObj_Instance {
public var removeFlag:Boolean;
public var doSwitchFunction:Function;
var paramValues:Array;
var colflags:int;
var posy:Number;
public var joints:Array;
var posx:Number;
public var switchFunction:Function;
public var initParams:String;
public var type:int;
public var hitballsound:int;
public var instanceName:String;
public var updateFunction:Function;
var paramNames:Array;
public var preUpdateFunction:Function;
public var timer:int;
public var collidetimer:int;
var stopcount:int;
public var collideFunction:Function;
public var bodies:Array;
var oldx:Number;
var oldy:Number;
public var rot:Number;
public var collideWithInstance:PhysObj_Instance;
public var typeName:String;
public var updateFunctionName:String;
public var x:Number;
public var y:Number;
public var sortZ:Number;
public function PhysObj_Instance(){
super();
bodies = new Array();
joints = new Array();
timer = 0;
collidetimer = 0;
collideFunction = null;
updateFunction = null;
preUpdateFunction = null;
switchFunction = null;
doSwitchFunction = null;
hitballsound = 0;
removeFlag = false;
updateFunctionName = null;
initParams = "";
type = 0;
sortZ = 0;
}
public function SetLinearVelocity(_x:Number, _y:Number):void{
var body:b2Body;
for each (body in bodies) {
body.SetLinearVelocity(new b2Vec2(_x, _y));
};
}
public function Update(){
if (updateFunction != null){
updateFunction();
};
}
public function PreUpdate(){
if (preUpdateFunction != null){
preUpdateFunction();
};
}
public function GetBodyAngleFromLinearVelocity(index:int):Number{
var pos:b2Vec2 = new b2Vec2(0, 0);
var body:b2Body = bodies[index];
var v:b2Vec2 = body.GetLinearVelocity();
var ang:Number = Math.atan2(v.y, v.x);
return (ang);
}
function GetParamBool(name:String, _default:Boolean=false):Boolean{
var s:String;
var i:int = paramNames.indexOf(name);
if (i != -1){
s = paramValues[i];
if (s == "true"){
return (true);
};
return (false);
};
return (_default);
}
public function LimitLinearVelocity(_max:Number):void{
var body:b2Body;
var v:b2Vec2;
for each (body in bodies) {
v = body.GetLinearVelocity();
if (v.Length() > _max){
v.Normalize();
v.Multiply(_max);
body.SetLinearVelocity(v);
};
};
}
public function SetBodyCollisionMask(_bodyIndex:int, _mask:int):void{
var body:b2Body;
var shape:b2Shape;
var fd:b2FilterData;
if (_bodyIndex == -1){
for each (body in bodies) {
shape = body.GetShapeList();
while (shape) {
fd = shape.GetFilterData();
fd.maskBits = _mask;
shape.SetFilterData(fd);
Game.world.Refilter(shape);
shape = shape.GetNext();
};
};
} else {
body = bodies[_bodyIndex];
shape = body.GetShapeList();
while (shape) {
fd = shape.GetFilterData();
fd.maskBits = _mask;
shape.SetFilterData(fd);
Game.world.Refilter(shape);
shape = shape.GetNext();
};
};
}
public function Remove(){
var joint:b2Joint;
var body:b2Body;
var bud:PhysObj_BodyUserData;
var index:int;
var go:GameObj;
for each (joint in joints) {
Game.world.DestroyJoint(joint);
};
for each (body in bodies) {
bud = (body.GetUserData() as PhysObj_BodyUserData);
if (bud != null){
index = bud.gameObjectID;
if (index != -1){
go = GameObjects.objs[index];
go.active = false;
};
};
Game.world.DestroyBody(body);
};
}
public function GetGameObject(index:int):GameObj{
var bud:PhysObj_BodyUserData = (bodies[index].GetUserData() as PhysObj_BodyUserData);
var go:GameObj = GameObjects.objs[bud.gameObjectID];
return (go);
}
function GetParamNumber(name:String, _default:Number=0):Number{
var i:int = paramNames.indexOf(name);
if (i != -1){
return (Number(paramValues[i]));
};
return (_default);
}
public function Init(){
colflags = 0;
var physobj:PhysObj = Game.physObjs.FindByName(typeName);
if (physobj.initFunctionName != null){
var _local2 = this;
_local2[physobj.initFunctionName]();
};
}
public function ApplyAngularVelocity(_bodyIndex:int, force:Number):void{
var body:b2Body;
if (_bodyIndex == -1){
for each (body in bodies) {
body.ApplyTorque(force);
};
} else {
bodies[_bodyIndex].ApplyTorque(force);
};
}
public function SetBodyXForm(_index:int, _x:Number, _y:Number, rot:Number):void{
var pos:b2Vec2 = new b2Vec2(_x, _y);
var body:b2Body = bodies[_index];
body.SetXForm(pos, rot);
}
public function SetPos(_x:Number, _y:Number):void{
var body:b2Body;
var p:b2Vec2;
var d:Number;
var f:b2Vec2;
x = _x;
y = _y;
for each (body in bodies) {
p = body.GetPosition();
d = Utils.DistBetweenPoints(x, y, p.x, p.y);
if (d > 1){
d = 1;
};
f = new b2Vec2(((x - p.x) * 0.1), ((y - p.y) * 0.01));
body.ApplyImpulse(f, new b2Vec2(0, 0));
};
}
public function GetBodyAngle(index:int):Number{
var pos:b2Vec2 = new b2Vec2(0, 0);
var body:b2Body = bodies[index];
return (body.GetAngle());
}
public function GetXForm(_index:int):b2XForm{
var body:b2Body = bodies[_index];
return (body.GetXForm());
}
public function GetBodyLinearVelocity(index:int):b2Vec2{
var pos:b2Vec2 = new b2Vec2(0, 0);
var body:b2Body = bodies[index];
var v:b2Vec2 = body.GetLinearVelocity();
return (v);
}
public function LimitAngularVelocity(_bodyIndex:int, _max:Number):void{
var body:b2Body;
var f:Number;
if (_bodyIndex == -1){
for each (body in bodies) {
f = body.GetAngularVelocity();
if (f >= _max){
f = _max;
};
if (f <= -(_max)){
f = -(_max);
};
body.SetAngularVelocity(f);
};
} else {
body = bodies[_bodyIndex];
f = body.GetAngularVelocity();
if (f >= _max){
f = _max;
};
if (f <= -(_max)){
f = -(_max);
};
body.SetAngularVelocity(f);
};
}
public function ApplyForce(_x:Number, _y:Number):void{
var body:b2Body;
for each (body in bodies) {
body.ApplyForce(new b2Vec2(_x, _y), body.GetWorldCenter());
};
}
public function GetNumBodies():int{
return (bodies.length);
}
public function SetAngularVelocity(_bodyIndex:int, _max:Number):void{
var body:b2Body;
if (_bodyIndex == -1){
for each (body in bodies) {
body.SetAngularVelocity(_max);
};
} else {
body = bodies[_bodyIndex];
body.SetAngularVelocity(_max);
};
}
public function ApplyImpulse(_x:Number, _y:Number):void{
var body:b2Body;
for each (body in bodies) {
body.ApplyImpulse(new b2Vec2(_x, _y), body.GetWorldCenter());
};
}
public function AddToPos(index:int, offset:b2Vec2):void{
var xf:b2XForm;
var body:b2Body;
if (index == -1){
for each (body in bodies) {
xf = body.GetXForm();
xf.position.Add(offset);
body.SetXForm(xf.position, 0);
};
} else {
xf = body.GetXForm();
xf.position.Add(offset);
body.SetXForm(xf.position, 0);
};
}
public function SetXForm(_x:Number, _y:Number, rot:Number):void{
var body:b2Body;
var pos:b2Vec2 = new b2Vec2(_x, _y);
for each (body in bodies) {
body.SetXForm(pos, rot);
};
}
function GetParams(params:String):void{
var s:String;
var sss:Array;
paramNames = new Array();
paramValues = new Array();
params = Utils.RemoveWhiteSpace(params);
params = params.toLowerCase();
var ss:Array = params.split(",");
trace(ss.length);
for each (s in ss) {
sss = s.split("=");
paramNames.push(sss[0]);
paramValues.push(sss[1]);
};
}
public function GetBodyAngularVelocity(_bodyIndex:int):Number{
var body:b2Body = bodies[_bodyIndex];
return (body.GetAngularVelocity());
}
function GetParam(name:String, _default:String=""):String{
var i:int = paramNames.indexOf(name);
if (i != -1){
return (paramValues[i]);
};
return (_default);
}
public function GetBodyWorldPos(index:int):b2Vec2{
var body:b2Body;
var pos:b2Vec2 = new b2Vec2(0, 0);
var i:int;
for each (body in bodies) {
if (i == index){
pos = body.GetWorldCenter().Copy();
};
i++;
};
return (pos);
}
public function WakeUp():void{
var body:b2Body;
for each (body in bodies) {
body.WakeUp();
};
}
}
}//package
Section 190
//PhysObj_Instances (PhysObj_Instances)
package {
public class PhysObj_Instances {
public var list:Array;
public function PhysObj_Instances(){
super();
list = new Array();
}
public function Exists(poi:PhysObj_Instance):Boolean{
var p:PhysObj_Instance;
for each (p in list) {
if (p == poi){
return (true);
};
};
return (false);
}
public function GetAllByTypeNameContaining(name:String):Array{
var poi:PhysObj_Instance;
var a:Array = new Array();
for each (poi in list) {
if (poi.typeName.match(name)){
a.push(poi);
};
};
return (a);
}
public function GetByIndex(index:int):PhysObj_Instance{
return (list[index]);
}
public function RemoveByName(name:String):void{
var poi:PhysObj_Instance = FindByName(name);
if (poi == null){
return;
};
Remove(poi);
}
public function GetAllByTypeName(name:String):Array{
var poi:PhysObj_Instance;
var a:Array = new Array();
for each (poi in list) {
if (poi.typeName == name){
a.push(poi);
};
};
return (a);
}
public function DoCollideFunction():void{
var pi:PhysObj_Instance;
for each (pi in list) {
if (pi.collidetimer != 0){
pi.collidetimer++;
if (pi.collidetimer >= 5){
if (pi.collideFunction != null){
pi.collideFunction(pi);
};
};
};
};
}
public function Remove(poi:PhysObj_Instance):Boolean{
var p:PhysObj_Instance;
if (Exists(poi) == false){
return (false);
};
poi.Remove();
var list1:Array = new Array();
for each (p in list) {
if (p == poi){
} else {
list1.push(p);
};
};
list = list1;
return (true);
}
public function DoDeleteList():void{
var pi:PhysObj_Instance;
var deleteList:Array = new Array();
for each (pi in list) {
if (pi.removeFlag){
deleteList.push(pi);
};
};
for each (pi in deleteList) {
Remove(pi);
};
}
public function FindByTypeName(name:String):PhysObj_Instance{
var poi:PhysObj_Instance;
for each (poi in list) {
if (poi.typeName == name){
return (poi);
};
};
return (null);
}
public function UpdatePhysObjs():void{
var pi:PhysObj_Instance;
for each (pi in list) {
pi.Update();
};
}
public function PreUpdatePhysObjs():void{
var pi:PhysObj_Instance;
for each (pi in list) {
pi.PreUpdate();
};
}
public function FindByName(name:String):PhysObj_Instance{
var poi:PhysObj_Instance;
for each (poi in list) {
if (poi.instanceName == name){
return (poi);
};
};
return (null);
}
}
}//package
Section 191
//PhysObj_Joint (PhysObj_Joint)
package {
import flash.geom.*;
public class PhysObj_Joint {
public var prism_enableLimit:Boolean;
public var prism_pos:Point;
public var obj0Name:String;
public var obj1Name:String;
public var dist_distance:Number;
public var name:String;
public var prism_lowerTranslation:Number;
public var prism_maxMotorForce:Number;
public var dist_pos0:Point;
public var dist_pos1:Point;
public var prism_enableMotor:Boolean;
public var prism_axisangle:Number;
public var prism_motorSpeed:Number;
public var rev_enableLimit:Boolean;
public var rev_enableMotor:Boolean;
public var rev_upperAngle:Number;
public var rev_lowerAngle:Number;
public var rev_maxMotorTorque:Number;
public var type:int;
public var prism_upperTranslation:Number;
public var rev_motorSpeed:Number;
public var rev_pos:Point;
public static const Type_Mouse:int = 3;
public static const Type_Prismatic:int = 2;
public static const Type_Distance:int = 1;
public static const Type_Rev:int = 0;
public function PhysObj_Joint(){
super();
type = 0;
name = "";
obj0Name = "";
obj1Name = "";
rev_pos = new Point(0, 0);
rev_enableLimit = false;
rev_lowerAngle = 0;
rev_upperAngle = 0;
rev_enableMotor = false;
rev_motorSpeed = 0;
rev_maxMotorTorque = 0;
prism_pos = new Point(0, 0);
prism_lowerTranslation = 0;
prism_upperTranslation = 0;
prism_enableLimit = false;
prism_enableMotor = false;
prism_motorSpeed = 0;
prism_maxMotorForce = 0;
prism_axisangle = 0;
dist_pos0 = new Point(0, 0);
dist_pos1 = new Point(0, 0);
dist_distance = 1;
}
}
}//package
Section 192
//PhysObj_Shape (PhysObj_Shape)
package {
import flash.geom.*;
public class PhysObj_Shape {
public var type:int;
public var poly_rot:Number;
public var circle_pos:Point;
public var density:Number;
public var restitution:Number;
public var name:String;
public var collisionCategory:int;
public var circle_radius:Number;
public var friction:Number;
public var poly_points:Array;
public var collisionMask:int;
public static const Type_Poly:int = 0;
public static const Type_Circle:int = 1;
public function PhysObj_Shape(){
super();
type = 0;
name = "";
poly_points = new Array();
circle_pos = new Point();
circle_radius = 0;
poly_rot = 0;
collisionCategory = 0;
collisionMask = 0;
}
public function Caclulate(){
var m:Matrix;
var newpts:Array;
var p:Point;
var p1:Point;
if (type == Type_Poly){
m = new Matrix();
m.rotate(poly_rot);
newpts = new Array();
for each (p in poly_points) {
p1 = m.transformPoint(p);
newpts.push(p1);
};
poly_points = newpts;
};
}
}
}//package
Section 193
//PhysObjs (PhysObjs)
package {
public class PhysObjs {
public var list:Array;
public function PhysObjs(){
super();
list = new Array();
}
public function GetNum():int{
return (list.length);
}
public function FindIndexByName(name:String):int{
var po:PhysObj;
var index:int;
for each (po in list) {
if (po.name == name){
return (index);
};
index++;
};
trace(("ERROR PhysObjs FindByName " + name));
return (0);
}
public function GetByIndex(index:int):PhysObj{
return (list[index]);
}
public function FindByName(name:String):PhysObj{
var po:PhysObj;
for each (po in list) {
if (po.name == name){
return (po);
};
};
trace(("ERROR PhysObjs FindByName " + name));
return (null);
}
public function InitFromXml(x:XML):void{
var i:int;
var px:XML;
var physobj:PhysObj;
list = new Array();
i = 0;
while (i < x.physobj.length()) {
px = x.physobj[i];
physobj = new PhysObj();
physobj.FromXml(px);
list.push(physobj);
i++;
};
}
}
}//package
Section 194
//Player (Player)
package {
public class Player {
static const upg_total:int = 5;
static const upg_speed:int = 0;
static const upg_accel:int = 1;
static const upg_boost:int = 3;
static const upg_brake:int = 2;
static const upg_spin:int = 4;
static var levels:Array;
public function Player(){
super();
}
public static function GetCost(_index):int{
var lev:int = levels[_index];
var cost:int = (lev + 1);
return (cost);
}
public static function Upgrade(_index):void{
var lev:int = levels[_index];
lev++;
if (lev > 10){
lev = 0;
};
levels[_index] = lev;
}
public static function GetLevel(_index:int):int{
return (levels[_index]);
}
public static function InitOnce(){
levels = new Array();
levels.push(0, 0, 0, 0, 0);
}
public static function SetLevel(_index:int, _level:int):void{
levels[_index] = _level;
}
}
}//package
Section 195
//PlayerDieExplosion (PlayerDieExplosion)
package {
import flash.display.*;
public dynamic class PlayerDieExplosion extends MovieClip {
}
}//package
Section 196
//PlayerHitExplosion (PlayerHitExplosion)
package {
import flash.display.*;
public dynamic class PlayerHitExplosion extends MovieClip {
}
}//package
Section 197
//PlayerShip (PlayerShip)
package {
import flash.display.*;
public dynamic class PlayerShip extends MovieClip {
}
}//package
Section 198
//PlayerShipGun (PlayerShipGun)
package {
import flash.display.*;
public dynamic class PlayerShipGun extends MovieClip {
}
}//package
Section 199
//PlayerShipGun1 (PlayerShipGun1)
package {
import flash.display.*;
public dynamic class PlayerShipGun1 extends MovieClip {
}
}//package
Section 200
//Poly (Poly)
package {
import flash.display.*;
import flash.geom.*;
public class Poly {
var param0:String;
var param1:String;
var subTypeName:String;
var active:Boolean;
var name:String;
var pointList:Array;
var typeName:String;
var boundingRectangle:Rectangle;
var closed:Boolean;
var lineList:Array;
var iparam0:int;
var hitCallback:Object;
var type:int;
var catmullRomLength:Number;
public static const polytype_WALL = 1;
public static const polytype_CEILING = 6;
public static const polytype_ZONE = 3;
public static const polytype_PATH = 0;
public static const polytype_FLOOR = 5;
public static const polytype_OVERLAY = 4;
public static const polytype_TRIGGER = 2;
public function Poly(_name:String, _type:int, x:Number, y:Number):void{
super();
lineList = new Array();
active = true;
type = _type;
name = _name;
boundingRectangle = null;
hitCallback = null;
closed = false;
pointList = new Array();
pointList.push(new Point(x, y));
}
function PointOnCurve(t:Number, p0:Point, p1:Point, p2:Point, p3:Point):Point{
var out:Point = new Point();
var t2:Number = (t * t);
var t3:Number = (t2 * t);
out.x = (0.5 * ((((2 * p1.x) + ((-(p0.x) + p2.x) * t)) + (((((2 * p0.x) - (5 * p1.x)) + (4 * p2.x)) - p3.x) * t2)) + ((((-(p0.x) + (3 * p1.x)) - (3 * p2.x)) + p3.x) * t3)));
out.y = (0.5 * ((((2 * p1.y) + ((-(p0.y) + p2.y) * t)) + (((((2 * p0.y) - (5 * p1.y)) + (4 * p2.y)) - p3.y) * t2)) + ((((-(p0.y) + (3 * p1.y)) - (3 * p2.y)) + p3.y) * t3)));
return (out);
}
public function GetPoint(index:int):Point{
return (new Point(pointList[index].x, pointList[index].y));
}
public function GetPointNormal(index:int):Point{
return (new Point(lineList[index].nx, lineList[index].ny));
}
public function GetPointOnCatmullRom(t:Number):Point{
var p0:Point;
var p1:Point;
var p2:Point;
var p3:Point;
var np:int = GetNumPoints();
if (np < 4){
return (new Point(0, 0));
};
var numSegs:int = (np - 1);
var seg:Number = (Number(numSegs) * t);
var i:int = seg;
var pt0:int = (i - 1);
var pt1:int = i;
var pt2:int = (i + 1);
var pt3:int = (i + 2);
if (pt0 < 0){
pt0 = 0;
};
if (pt2 > (np - 1)){
pt2 = (np - 1);
};
if (pt3 > (np - 1)){
pt3 = (np - 1);
};
p0 = pointList[pt0];
p1 = pointList[pt1];
p2 = pointList[pt2];
p3 = pointList[pt3];
var i1:int = (i + 1);
var s0:Number = ((1 / Number(numSegs)) * i);
var s1:Number = ((1 / Number(numSegs)) * i1);
var t1:Number = ((1 / (s1 - s0)) * (t - s0));
var p:Point = PointOnCurve(t1, p0, p1, p2, p3);
return (p);
}
public function AddLine(x0:Number, y0:Number, x1:Number, y1:Number):void{
var r:Rectangle;
var l:Line = new Line(x0, y0, x1, y1);
lineList.push(l);
pointList.push(new Point(x1, y1));
if (boundingRectangle == null){
boundingRectangle = l.boundingRect;
} else {
r = boundingRectangle.clone();
boundingRectangle = r.union(l.boundingRect);
};
}
public function GetLine(index:int):Line{
return (lineList[index]);
}
public function CalculateCatmullRomLength(){
var i:int;
var t1:Number;
var pp:Point;
var p0:Point;
var p1:Point;
var l:Array = new Array();
var np:int = GetNumPoints();
if (np < 4){
catmullRomLength = 0;
} else {
t1 = 0;
while (t1 < 1) {
pp = GetPointOnCatmullRom(t1);
l.push(pp);
t1 = (t1 + 0.025);
};
};
catmullRomLength = 0;
i = 0;
while (i < (l.length - 2)) {
p0 = l[i];
p1 = l[(i + 1)];
catmullRomLength = (catmullRomLength + Utils.DistBetweenPoints(p0.x, p0.y, p1.x, p1.y));
i++;
};
l = null;
}
public function Finish(close:Boolean){
var l0:Line;
var l1:Line;
var l:Line;
var r:Rectangle;
if (close){
l0 = lineList[0];
l1 = lineList[(lineList.length - 1)];
l = new Line(l1.x1, l1.y1, l0.x0, l0.y0);
lineList.push(l);
r = boundingRectangle.clone();
boundingRectangle = r.union(l.boundingRect);
};
closed = close;
}
public function GetCatmullRomLength():Number{
return (catmullRomLength);
}
public function GetNumLines():int{
return (lineList.length);
}
public function OffsetFromStartPoint(){
var i:int;
var l:Line;
var offx:* = -(pointList[0].x);
var offy:* = -(pointList[0].y);
i = 0;
while (i < pointList.length) {
pointList[i].x = (pointList[i].x + offx);
pointList[i].y = (pointList[i].y + offy);
i++;
};
i = 0;
while (i < lineList.length) {
l = lineList[i];
l.x0 = (l.x0 + offx);
l.x1 = (l.x1 + offx);
l.y0 = (l.y0 + offy);
l.y1 = (l.y1 + offy);
i++;
};
}
public function DrawCatmullRom(bd:BitmapData, col:uint, xoff:Number, yoff:Number){
var t1:Number;
var pp:Point;
var np:int = GetNumPoints();
if (np < 4){
return;
};
t1 = 0;
while (t1 < 1) {
pp = GetPointOnCatmullRom(t1);
bd.setPixel32((pp.x + xoff), (pp.y + yoff), col);
t1 = (t1 + 0.001);
};
}
public function GetNumPoints():int{
return (pointList.length);
}
public static function PolyFromPointList(pl:Array):Poly{
var p1:Point;
var i:int;
var p:Point = pl[0];
var poly:Poly = new Poly("", 0, p.x, p.y);
var numP:int = pl.length;
i = 0;
while (i < (numP - 1)) {
p = pl[i];
p1 = pl[(i + 1)];
poly.AddLine(p.x, p.y, p1.x, p1.y);
i++;
};
poly.Finish(true);
return (poly);
}
public static function FindAllByType(type:int, polyList:Array):Array{
var poly:Poly;
var list:Array = new Array();
for each (poly in polyList) {
if (poly.type == type){
list.push(poly);
};
};
return (list);
}
public static function FindByName(name:String, polyList:Array):Poly{
var poly:Poly;
for each (poly in polyList) {
if (poly.name == name){
return (poly);
};
};
return (null);
}
public static function FindIndexByName(name:String, polyList:Array):int{
var poly:Poly;
var index:int;
for each (poly in polyList) {
if (poly.name == name){
return (index);
};
index++;
};
return (-1);
}
}
}//package
Section 201
//PreLevelScreen (PreLevelScreen)
package {
import flash.text.*;
import flash.display.*;
public dynamic class PreLevelScreen extends MovieClip {
public var buttonBuyDaveBomb:SimpleButton;
public var textCash:TextField;
public var buttonBuyUpgrade:SimpleButton;
public var bomb0:MovieClip;
public var textDaveBombCount:TextField;
public var textHealthCost:TextField;
public var w0:MovieClip;
public var w1:MovieClip;
public var w2:MovieClip;
public var w3:MovieClip;
public var w4:MovieClip;
public var w5:MovieClip;
public var w6:MovieClip;
public var w7:MovieClip;
public var textUpgradeCost:TextField;
public var textHealth:TextField;
public var textEnteringLevel:TextField;
public var buttonBuyHealth:SimpleButton;
public var buttonContinue:SimpleButton;
public var textDaveBomb:TextField;
}
}//package
Section 202
//Preloader (Preloader)
package {
import flash.events.*;
import flash.display.*;
import org.flashdevelop.utils.*;
import flash.utils.*;
public class Preloader extends MovieClip {
static var loader:MovieClip = null;
public function Preloader(){
super();
initial_startup();
}
private function startmain():void{
FlashConnect.trace("Preloader startmain");
addEventListener(Event.ENTER_FRAME, checkFrame);
}
private function initial_startup():void{
Lic.InitFromFlex(this);
Lic.ShowAd(startup);
}
private function checkFrame(e:Event):void{
if (currentFrame == totalFrames){
removeEventListener(Event.ENTER_FRAME, checkFrame);
startmain2();
};
}
private function startup():void{
FlashConnect.trace("Preloader startup");
Lic.Mochibot();
Lic.ShowIntro(startmain);
}
private function startmain2():void{
var mainClass:Class = (getDefinitionByName("Main") as Class);
addChild((new (mainClass) as DisplayObject));
}
}
}//package
Section 203
//preloaderMC (preloaderMC)
package {
import flash.display.*;
public dynamic class preloaderMC extends MovieClip {
public var loaderBar:MovieClip;
public var adbackground:MovieClip;
public var buttonSkipCPMStarAd:SimpleButton;
public var adBox:MovieClip;
}
}//package
Section 204
//rick (rick)
package {
import flash.display.*;
public dynamic class rick extends MovieClip {
}
}//package
Section 205
//SaveData (SaveData)
package {
import flash.net.*;
public class SaveData {
static var id:String = "BostinVoyage";
public function SaveData(){
super();
}
public static function Clear():void{
var so:SharedObject = SharedObject.getLocal(id);
so.clear();
so.close();
so.flush();
trace("SaveData Data Cleared");
trace(("len: " + so.size));
}
public static function Save():void{
var i:int;
var l:Level;
var w:WeaponType;
var so:SharedObject = SharedObject.getLocal(id);
if (so == null){
trace("SO null");
return;
};
if (so.size == 0){
trace("SO size 0");
};
so.clear();
var availableweapons:Array = new Array();
var availables:Array = new Array();
var completes:Array = new Array();
i = 0;
while (i < 100) {
l = Game.GetLevel(i);
if (l != null){
availables.push(l.available);
completes.push(l.complete);
};
i++;
};
i = 0;
while (i < 8) {
w = Game.GetWeapon(i);
if (w != null){
availableweapons.push(w.available);
};
i++;
};
so.data.endmovieunlocked = Game.endMovieUnlocked;
so.data.health = Game.health;
so.data.currentweapon = Game.currentWeapon;
so.data.bombs = Game.numBombs;
so.data.difficulty = Game.difficulty;
so.data.cash = Game.cash;
so.data.availableweapons = availableweapons;
so.data.availables = availables;
so.data.completes = completes;
so.close();
trace("Saved Data OK");
}
public static function Load():void{
var i:int;
var l:Level;
var w:WeaponType;
var so:SharedObject = SharedObject.getLocal(id);
if (so == null){
trace((("Shared Object: " + id) + " is null"));
return;
};
if (so.size == 0){
trace((("Shared Object: " + id) + " size=0"));
so.close();
return;
};
i = 0;
while (i < 100) {
l = Game.GetLevel(i);
if (l != null){
l.available = so.data.availables[i];
l.complete = so.data.completes[i];
};
i++;
};
i = 0;
while (i < 8) {
w = Game.GetWeapon(i);
if (w != null){
w.available = so.data.availableweapons[i];
};
i++;
};
Game.endMovieUnlocked = so.data.endmovieunlocked;
Game.health = so.data.health;
Game.currentWeapon = so.data.currentweapon;
Game.numBombs = so.data.bombs;
Game.difficulty = so.data.difficulty;
Game.cash = so.data.cash;
so.close();
trace("Loaded data OK");
}
public static function DontLoad():void{
}
public static function Exists():Boolean{
var so:SharedObject = SharedObject.getLocal(id);
if (so == null){
trace((("Shared Object: " + id) + " null"));
return (false);
};
if (so.size == 0){
trace((("Shared Object: " + id) + " size 0"));
so.close();
return (false);
};
so.close();
return (true);
}
public static function DontSave():void{
}
}
}//package
Section 206
//selectButton (selectButton)
package {
import flash.display.*;
public dynamic class selectButton extends MovieClip {
public var stageSelect:MovieClip;
public var l0:MovieClip;
public var l1:MovieClip;
public var l2:MovieClip;
}
}//package
Section 207
//sfx_bostin (sfx_bostin)
package {
import flash.media.*;
public dynamic class sfx_bostin extends Sound {
}
}//package
Section 208
//sfx_explosion01 (sfx_explosion01)
package {
import flash.media.*;
public dynamic class sfx_explosion01 extends Sound {
}
}//package
Section 209
//sfx_explosion1 (sfx_explosion1)
package {
import flash.media.*;
public dynamic class sfx_explosion1 extends Sound {
}
}//package
Section 210
//sfx_explosion2 (sfx_explosion2)
package {
import flash.media.*;
public dynamic class sfx_explosion2 extends Sound {
}
}//package
Section 211
//sfx_lazer01 (sfx_lazer01)
package {
import flash.media.*;
public dynamic class sfx_lazer01 extends Sound {
}
}//package
Section 212
//sfx_pickup (sfx_pickup)
package {
import flash.media.*;
public dynamic class sfx_pickup extends Sound {
}
}//package
Section 213
//sfx_pickups (sfx_pickups)
package {
import flash.media.*;
public dynamic class sfx_pickups extends Sound {
}
}//package
Section 214
//sfx_readytoplay (sfx_readytoplay)
package {
import flash.media.*;
public dynamic class sfx_readytoplay extends Sound {
}
}//package
Section 215
//sfx_splat0 (sfx_splat0)
package {
import flash.media.*;
public dynamic class sfx_splat0 extends Sound {
}
}//package
Section 216
//sfx_splat1 (sfx_splat1)
package {
import flash.media.*;
public dynamic class sfx_splat1 extends Sound {
}
}//package
Section 217
//sfx_splat2 (sfx_splat2)
package {
import flash.media.*;
public dynamic class sfx_splat2 extends Sound {
}
}//package
Section 218
//sfx_splat3 (sfx_splat3)
package {
import flash.media.*;
public dynamic class sfx_splat3 extends Sound {
}
}//package
Section 219
//sfx_splat4 (sfx_splat4)
package {
import flash.media.*;
public dynamic class sfx_splat4 extends Sound {
}
}//package
Section 220
//sfx_splat5 (sfx_splat5)
package {
import flash.media.*;
public dynamic class sfx_splat5 extends Sound {
}
}//package
Section 221
//sfx_splatboss (sfx_splatboss)
package {
import flash.media.*;
public dynamic class sfx_splatboss extends Sound {
}
}//package
Section 222
//sfx_tear (sfx_tear)
package {
import flash.media.*;
public dynamic class sfx_tear extends Sound {
}
}//package
Section 223
//ShockwaveLogo (ShockwaveLogo)
package {
import flash.display.*;
public dynamic class ShockwaveLogo extends MovieClip {
}
}//package
Section 224
//Shop (Shop)
package {
import flash.events.*;
import flash.display.*;
public class Shop {
static var itemNames:Array;
static var titleMC:MovieClip;
public function Shop(){
super();
}
public static function Init(){
var i:int;
var itemMC:MovieClip;
itemNames = new Array();
itemNames.push("Speed");
itemNames.push("Accelaration");
itemNames.push("Brake");
itemNames.push("Boost");
itemNames.push("Spin");
Game.pause = true;
i = 0;
while (i < 5) {
itemMC = (titleMC.getChildByName(("item" + i.toString())) as MovieClip);
itemMC.itemIndex = i;
itemMC.addEventListener(MouseEvent.CLICK, ItemPressed, false, 0, true);
i++;
};
titleMC.buttonExit.addEventListener(MouseEvent.CLICK, buttonExitPressed, false, 0, true);
UpdateStuff();
}
public static function InitOnce(){
}
public static function buttonExitPressed(e:MouseEvent){
Game.pause = false;
Game.main.removeChild(titleMC);
titleMC = null;
KeyReader.InitOnce(Game.main.stage);
}
static function UpdateStuff():void{
var i:int;
var itemMC:MovieClip;
titleMC.textCash.text = ("Money: " + Game.cash);
i = 0;
while (i < 5) {
itemMC = (titleMC.getChildByName(("item" + i.toString())) as MovieClip);
itemMC.upgradeIcon.gotoAndStop((i + 1));
itemMC.upgradeIndicator.gotoAndStop((Player.GetLevel(i) + 1));
itemMC.upgradeText.text = itemNames[i];
itemMC.costText.text = ("cost: " + Player.GetCost(i).toString());
i++;
};
}
static function ItemPressed(e:MouseEvent){
var item:int = e.currentTarget.itemIndex;
Game.cash = (Game.cash - Player.GetCost(item));
Player.Upgrade(item);
UpdateStuff();
}
}
}//package
Section 225
//ShotController (ShotController)
package {
public class ShotController {
var delayTimer:int;
var mode:int;
var shotCount:int;
var shotDef:ShotDef;
var shotTimer:int;
public function ShotController(sd:ShotDef){
super();
shotDef = sd;
delayTimer = shotDef.initialDelay;
shotTimer = 0;
mode = 0;
}
public function Update():Boolean{
var retval:Boolean;
if (mode == 0){
delayTimer--;
if (delayTimer <= 0){
mode = 1;
delayTimer = Utils.RandBetweenInt(shotDef.timeMin, shotDef.timeMax);
};
};
if (mode == 1){
delayTimer--;
if (delayTimer <= 0){
delayTimer = Utils.RandBetweenInt(shotDef.timeMin, shotDef.timeMax);
mode = 2;
shotCount = 0;
shotTimer = 0;
};
};
if (mode == 2){
shotTimer--;
if (shotTimer <= 0){
retval = true;
shotTimer = shotDef.shotFrequency;
shotCount++;
if (shotCount >= shotDef.numShots){
mode = 1;
};
};
};
return (retval);
}
}
}//package
Section 226
//ShotDef (ShotDef)
package {
public class ShotDef {
var initialDelay:int;
var shotFrequency:int;
var timeMin:int;
var speed:Number;
var numBullets:int;
var spread:Number;
var timeMax:int;
var numShots:int;
var fixedangle:Number;
public function ShotDef(){
super();
}
}
}//package
Section 227
//SitelockedScreen (SitelockedScreen)
package {
import flash.display.*;
public dynamic class SitelockedScreen extends MovieClip {
public var buttonClickHere:SimpleButton;
}
}//package
Section 228
//SoundPlayer (SoundPlayer)
package {
import flash.utils.*;
import flash.media.*;
public class SoundPlayer {
public static const minPlayTime = 3;
static var doSFX:Boolean;
static var channel:SoundChannel;
public static var startTimes:Array;
static var timer:Timer;
static var active = false;
public static var sounds:Array;
public static var sound:Sound;
public static var times:Array;
public static var volumes:Array;
public static var lengths:Array;
public static var soundTransform:SoundTransform;
static var Instances:Array;
public static var names:Array;
public static var soundTransforms:Array;
static var main:Main;
static var playingFlag:Boolean;
public static var soundChannels:Array;
public function SoundPlayer(){
super();
}
static function AddSound(_soundName:String){
var classRef:Class;
var s:Sound;
var _soundName = _soundName;
classRef = (getDefinitionByName(_soundName) as Class);
//unresolved jump
var _slot1 = e;
classRef = null;
if (classRef == null){
trace(("AddSound Error: Can't find sound " + _soundName));
sounds.push(null);
} else {
s = (new (classRef) as Sound);
sounds.push(s);
};
names.push(_soundName);
startTimes.push(0);
lengths.push(0);
volumes.push(1);
times.push(0);
}
public static function InitOnce(_main:Main):void{
doSFX = true;
Game.soundon;
main = _main;
startTimes = new Array();
lengths = new Array();
sounds = new Array();
names = new Array();
times = new Array();
volumes = new Array();
soundChannels = new Array();
soundTransforms = new Array();
AddSound("sfx_bostin");
AddSound("sfx_readytoplay");
AddSound("sfx_pickup");
AddSound("sfx_pickups");
AddSound("sfx_explosion01");
AddSound("sfx_explosion0");
AddSound("sfx_explosion1");
AddSound("sfx_explosion2");
AddSound("sfx_splat0");
AddSound("sfx_splat1");
AddSound("sfx_splat2");
AddSound("sfx_splat3");
AddSound("sfx_splat4");
AddSound("sfx_splat5");
AddSound("sfx_splatboss");
AddSound("sfx_tear");
soundTransform = new SoundTransform(1, 0);
active = true;
playingFlag = false;
}
public static function UpdateOncePerFrame():void{
var i:int;
var c:int = times.length;
i = 0;
while (i < c) {
if (times[i] > 0){
var _local3 = times;
var _local4 = i;
var _local5 = (_local3[_local4] - 1);
_local3[_local4] = _local5;
};
i++;
};
}
public static function PlayRandomBetween(soundName:String, soundName1:String, volume:Number=1):void{
if (doSFX == false){
return;
};
var soundID0:int = names.indexOf(soundName);
var soundID1:int = names.indexOf(soundName1);
var soundID:int = Utils.RandBetweenInt(soundID0, soundID1);
PlayById(soundID, volume);
}
public static function Play(soundName:String, volume:Number=1):void{
if (doSFX == false){
return;
};
var soundID:int = names.indexOf(soundName);
PlayById(soundID, volume);
}
public static function PlayById(soundID:int, volume:Number=1):void{
var st:SoundTransform;
var s:Sound;
if (doSFX == false){
return;
};
if (times[soundID] > 0){
return;
};
if (sounds[soundID] != null){
s = sounds[soundID];
st = new SoundTransform();
st.volume = volume;
s.play(0, 0, st);
times[soundID] = 5;
} else {
trace(("SoundPlayer: Cant find sound " + soundID));
};
}
public static function ToggleMute(){
doSFX = (doSFX == false);
}
public static function GetId(soundName:String):int{
var soundID:int = names.indexOf(soundName);
return (soundID);
}
}
}//package
import flash.events.*;
import flash.utils.*;
import flash.media.*;
class SoundPlay {
private var playingFlag;
private var channel:SoundChannel;
private var timer:Timer;
private function SoundPlay(){
super();
}
public function Play(soundID:int):void{
channel = SoundPlayer.sound.play(SoundPlayer.startTimes[soundID], 1, SoundPlayer.soundTransform);
timer = new Timer(SoundPlayer.lengths[soundID]);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
playingFlag = true;
}
private function timerHandler(event:TimerEvent):void{
timer.stop();
channel.stop();
playingFlag = false;
}
public function Clear():void{
playingFlag = false;
timer = null;
}
public function Active():Boolean{
return (playingFlag);
}
}
Section 229
//SpecRange (SpecRange)
package {
public class SpecRange {
var values:Array;
var max:int;
var counters:Array;
var threshold:Number;
var count:int;
var min:int;
var amt:int;
var side:int;
var average:Number;
var skip;
public function SpecRange(_min:int, _max:int, _thresh:Number, _side:int){
super();
min = _min;
max = _max;
threshold = _thresh;
count = 0;
average = 0;
side = _side;
skip = 4;
amt = ((max - min) + 1);
var num:int = ((max - min) + 1);
values = new Array(num);
counters = new Array(num);
var i:int;
while (i < num) {
values[i] = Number(0);
counters[i] = Number(0);
i++;
};
}
}
}//package
Section 230
//Stars (Stars)
package {
import flash.display.*;
public dynamic class Stars extends MovieClip {
}
}//package
Section 231
//Stat (Stat)
package {
public class Stat {
var value:Number;
var name:String;
public function Stat(_name:String, _value:Number){
super();
name = _name;
value = _value;
}
}
}//package
Section 232
//Stats (Stats)
package {
public class Stats {
static var list:Array;
public function Stats(){
super();
}
public static function InitOnce(){
list = new Array();
}
public static function Add(_name:String, _value:Number){
var stat:Stat = FindByName(_name);
stat.value = (stat.value + _value);
}
public static function FindByName(_name:String):Stat{
var stat:Stat;
for each (stat in list) {
if (stat.name == _name){
return (stat);
};
};
return (null);
}
public static function Create(_name:String, _value:Number){
list.push(new Stat(_name, _value));
}
}
}//package
Section 233
//titleScreen (titleScreen)
package {
import flash.display.*;
public dynamic class titleScreen extends MovieClip {
public var buttonTwitter:SimpleButton;
public var buttonCompleteMovie:SimpleButton;
public var buttonMoreGames:SimpleButton;
public var buttonPlay1:SimpleButton;
public var buttonPlay2:SimpleButton;
public var buttonPlay3:SimpleButton;
public var buttonMainLogo:MainLogo;
public var buttonLongAnimalsRobotJam:SimpleButton;
public var buttonPlay0:SimpleButton;
public var savedGamesOverlay:MovieClip;
}
}//package
Section 234
//TitleScreenState (TitleScreenState)
package {
import flash.events.*;
import flash.text.*;
import flash.display.*;
import flash.media.*;
import flash.filters.*;
import flash.net.*;
import org.flashdevelop.utils.*;
import flash.ui.*;
public class TitleScreenState {
static var completeAnimMC:MovieClip;
static var showingInstructions:Boolean;
static var greyFilter:ColorMatrixFilter = new ColorMatrixFilter([0.3086, 0.6094, 0.082, 0, 0, 0.3086, 0.6094, 0.082, 0, 0, 0.3086, 0.6094, 0.082, 0, 0, 0, 0, 0, 1, 0]);
static var levelSelect_selectedLevel:int;
static var nameEntered:String = "Your Name";
static var levelCompleteAnimFrame:int;
static var levSelectMCs:Array;
static var selectedAchievementIndex:int;
static var endComicBookFrame:int;
static var main:Main;
static var instructionIndex:int;
static var comicBookFrame:int;
static var levelCompleteFinishAnimFrame:int;
static var overlayMC:MovieClip = null;
static var titleMC:MovieClip;
static var instructionsMC:MovieClip;
public function TitleScreenState(){
super();
}
public static function buttonStart1Pressed(e:MouseEvent){
Game.difficulty = 1;
buttonStartPressed(e);
}
static function EndComicBookFinished(){
var muteTransform:SoundTransform = new SoundTransform();
muteTransform.volume = 0;
titleMC.soundTransform = muteTransform;
MusicPlayer.musicCurrentName = "";
titleMC.stop();
titleMC.removeEventListener(Event.ENTER_FRAME, InitEndComicBookFrameFunc);
main.removeChild(titleMC);
titleMC = null;
Game.main.SetGameState(Main.gameState_TITLE);
}
public static function MusicMuteButton_Out(e:MouseEvent){
e.currentTarget.gotoAndStop(1);
}
public static function buttonSkipOutroPressed(e:MouseEvent){
overlayMC.stop();
main.removeChild(overlayMC);
overlayMC = null;
}
public static function LevelSelect_levelOut(e:MouseEvent){
levelSelect_selectedLevel = -1;
Game.currentLevel = levelSelect_selectedLevel;
LevelSelect_Update();
}
public static function InitPreLevelStoryScreen(){
Mouse.show();
MusicPlayer.StartStream(0);
var r:int = (Game.currentLevel % 3);
if (r != 0){
InitPreLevelScreen();
return;
};
var s:int = (Game.currentLevel / 3);
if (s == 0){
InitComicBook();
return;
};
titleMC = main.AddMovieClip(0, 0, new betweenStages());
titleMC.addEventListener(MouseEvent.CLICK, InitPreLevelStoryScreen_buttonContinuePressed, false, 0, true);
titleMC.gotoAndStop((s + 1));
}
public static function buttonSkipPressed(e:MouseEvent){
overlayMC.stop();
main.removeChild(overlayMC);
overlayMC = null;
MusicPlayer.StartStream(4);
InitLevelSelect();
}
public static function AddButton(btn:SimpleButton, clickCallback:Function){
if (btn == null){
FlashConnect.trace("add button button = null", TraceLevel.ERROR);
};
if (clickCallback == null){
FlashConnect.trace("add button clickCallback = null", TraceLevel.ERROR);
};
btn.addEventListener(MouseEvent.CLICK, clickCallback, false, 0, true);
}
static function instructionsContinuePressed(e:MouseEvent){
var l:Level = Game.GetCurrentLevel();
instructionIndex++;
if (instructionIndex > l.helpscreenFrames.length){
Game.main.removeChild(instructionsMC);
instructionsMC = null;
showingInstructions = false;
Game.InitLevelState(Game.levelState_Play);
} else {
instructionsMC.gotoAndStop(l.helpscreenFrames[instructionIndex]);
instructionsMC.buttonContinue.visible = false;
if (l.helpscreenFrames.length > (instructionIndex + 1)){
instructionsMC.buttonContinue.visible = true;
};
instructionsMC.buttonDone.visible = (instructionsMC.buttonContinue.visible == false);
};
}
public static function buttonContinueGamePressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
Game.InitGame();
SaveData.Load();
Game.health = 5;
InitLevelSelect(true);
}
public static function MusicMuteButton_Down(e:MouseEvent){
e.currentTarget.gotoAndStop(3);
MusicPlayer.ToggleMute();
e.currentTarget.offMC.visible = true;
if (MusicPlayer.doMusic){
e.currentTarget.offMC.visible = false;
};
}
public static function buttonViewScoresPressed(e:MouseEvent){
navigateToURL(new URLRequest("http://www.longanimalsgames.com/ViewHighScore.php?game=fatmooncannon"), "_blank");
trace("view scores");
}
static function PlayOutro(){
MusicPlayer.StartStream(5);
overlayMC.buttonMenu.addEventListener(MouseEvent.CLICK, buttonSkipOutroPressed, false, 0, true);
overlayMC.gotoAndPlay(1);
}
static function GetHealthCost():int{
return (200);
}
public static function LevelSelect_buttonNextPressed(e:MouseEvent){
var i:int;
var mc:MovieClip;
var cando:Boolean;
var levelID:int = e.currentTarget.levelID;
var l:Level = Game.GetLevel(levelID);
if (l.available){
cando = true;
};
if (Game.usedebug){
cando = true;
};
if (cando == false){
return;
};
for each (mc in levSelectMCs) {
mc.removeEventListener(MouseEvent.CLICK, LevelSelect_buttonNextPressed);
mc.removeEventListener(MouseEvent.MOUSE_OVER, LevelSelect_levelOver);
mc.removeEventListener(MouseEvent.MOUSE_OUT, LevelSelect_levelOut);
};
Game.main.removeChild(titleMC);
titleMC = null;
Game.currentLevel = levelID;
Game.main.SetGameState(Main.gameState_LEVEL_PLAY);
}
public static function buttonStart0Pressed(e:MouseEvent){
Game.difficulty = 0;
buttonStartPressed(e);
}
public static function InitAchievementScreen(){
var ach:Achievement;
var achMC:MovieClip;
Mouse.show();
overlayMC.buttonBack.addEventListener(MouseEvent.CLICK, AchievementScreen_buttonBackPressed, false, 0, true);
var i:int;
for each (ach in Game.achievements.list) {
achMC = (overlayMC.getChildByName(("ach" + i.toString())) as MovieClip);
if (achMC != null){
achMC.addEventListener(MouseEvent.CLICK, AchievementScreen_achievementPressed, false, 0, true);
achMC.achID = i;
achMC.textNumber.text = (i + 1).toString();
achMC.tick.visible = false;
if (ach.complete){
achMC.tick.visible = true;
};
achMC.selectedClip.visible = false;
};
i++;
};
selectedAchievementIndex = -1;
overlayMC.textName.text = "";
overlayMC.textDescription.text = "";
}
public static function buttonViewOutroPressed(e:MouseEvent){
PlayOutro();
}
static function GetDaveCost():int{
return (1000);
}
public static function Init(_main:Main){
Mouse.show();
main = _main;
MusicPlayer.StartStream(0);
main.InitStage();
titleMC = main.AddMovieClip(0, 0, new titleScreen());
titleMC.savedGamesOverlay.visible = false;
titleMC.savedGamesOverlay.buttonContinue.addEventListener(MouseEvent.CLICK, buttonContinueGamePressed, false, 0, true);
titleMC.savedGamesOverlay.buttonNewGame.addEventListener(MouseEvent.CLICK, buttonNewGamePressed, false, 0, true);
titleMC.buttonPlay0.addEventListener(MouseEvent.CLICK, buttonStart0Pressed, false, 0, true);
titleMC.buttonPlay1.addEventListener(MouseEvent.CLICK, buttonStart1Pressed, false, 0, true);
titleMC.buttonPlay2.addEventListener(MouseEvent.CLICK, buttonStart2Pressed, false, 0, true);
titleMC.buttonPlay3.addEventListener(MouseEvent.CLICK, buttonStart3Pressed, false, 0, true);
Lic.AuthorButton(titleMC.buttonLongAnimalsRobotJam);
Lic.MainLogoButton(titleMC.buttonMainLogo);
Lic.MoreGamesButton(titleMC.buttonMoreGames);
Lic.TwitterButton(titleMC.buttonTwitter);
if (Game.endMovieUnlocked){
titleMC.buttonCompleteMovie.addEventListener(MouseEvent.CLICK, buttonPlayCompleteMoviePressed, false, 0, true);
} else {
titleMC.buttonCompleteMovie.filters = [greyFilter];
};
}
public static function InitLevelCompleteAnimFrameFunc(e:Event){
if (levelCompleteAnimFrame == levelCompleteFinishAnimFrame){
completeAnimMC.removeEventListener(Event.ENTER_FRAME, InitLevelCompleteAnimFrameFunc);
main.removeChild(completeAnimMC);
completeAnimMC = null;
};
levelCompleteAnimFrame++;
}
public static function InitGameOver(){
Mouse.show();
MusicPlayer.StartStream(0);
main.InitStage();
titleMC = main.AddMovieClip(0, 0, new gameOverScreen());
titleMC.buttonContinue.addEventListener(MouseEvent.CLICK, buttonContinuePressed, false, 0, true);
titleMC.buttonQuit.addEventListener(MouseEvent.CLICK, buttonQuitPressed, false, 0, true);
}
public static function InitEndComicBookFrameFunc(e:Event){
if (endComicBookFrame == 479){
EndComicBookFinished();
};
endComicBookFrame++;
}
public static function buttonSubmitScorePressed(e:MouseEvent){
var e = e;
var s:int = Game.currentScore;
var key:int = s;
key = (key + 84563);
key = (key * 7);
key = (key - 276483);
nameEntered = titleMC.textName.text;
titleMC.buttonSubmit.visible = false;
trace(((("submit score " + s) + " key=") + key));
var path = "http://www.longanimalsgames.com/ViewHighScore.php";
var vars:URLVariables = new URLVariables();
vars.game = "fatmooncannon";
vars.submit = 1;
vars.score = s;
vars.key = key;
vars.name = nameEntered;
var request:URLRequest = new URLRequest(path);
request.method = URLRequestMethod.POST;
request.data = vars;
trace("Stats sent to server");
trace(request);
sendToURL(request);
//unresolved jump
var _slot1 = e;
trace(_slot1.message);
buttonViewScoresPressed(e);
}
static function ComicBookFinished_clicked(e:MouseEvent){
titleMC.stop();
titleMC.removeEventListener(Event.ENTER_FRAME, ComicBookFinished_clicked);
main.removeChild(titleMC);
titleMC = null;
InitPreLevelScreen();
}
public static function WorldSelect_Update(){
var i:int;
var mc:MovieClip;
i = 0;
while (i < 5) {
mc = titleMC[("level" + (i + 1).toString())];
mc.selectedMC.visible = false;
if (i == Game.currentWorldID){
mc.selectedMC.visible = true;
};
i++;
};
}
public static function InitPreLevelScreen_buttonBuyDaveBombPressed(e:MouseEvent){
var cost:int = GetDaveCost();
if (cost > Game.cash){
return;
};
Game.numBombs++;
if (Game.numBombs >= 3){
Game.numBombs = 3;
};
Game.cash = (Game.cash - cost);
UpdatePreLevelScreen();
SaveData.Save();
}
public static function MusicMuteButton_Over(e:MouseEvent){
e.currentTarget.gotoAndStop(2);
}
public static function InitLevelCompleteAnim(){
MusicPlayer.StopMusic();
var r:int = Utils.RandBetweenInt(0, 20);
if (r < 10){
completeAnimMC = main.AddMovieClip(320, 480, new yowFinished());
levelCompleteFinishAnimFrame = 87;
} else {
if (r < 15){
completeAnimMC = main.AddMovieClip(320, 480, new yowFinished2());
levelCompleteFinishAnimFrame = 113;
} else {
completeAnimMC = main.AddMovieClip(320, 480, new yowFinished3());
levelCompleteFinishAnimFrame = 96;
};
};
completeAnimMC.addEventListener(Event.ENTER_FRAME, InitLevelCompleteAnimFrameFunc, false, 0, true);
completeAnimMC.gotoAndPlay(1);
levelCompleteAnimFrame = 1;
}
public static function buttonQuitPressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
main.SetGameState(Main.gameState_TITLE);
}
public static function InitLevelSelect(_fromTitle:Boolean=false){
var x:int;
var ox:int;
var y:int;
var dx:int;
var dy:int;
var i:int;
var l:Level;
var stage:int;
var mc:MovieClip;
var levmc:MovieClip;
Mouse.show();
if (_fromTitle == false){
MusicPlayer.StartStream(0);
};
levelSelect_selectedLevel = -1;
titleMC = main.AddMovieClip(0, 0, new levelSelect());
var stages:Array = new Array("level1", "level2", "level3", "level4", "level5", "level6", "level7", "level8");
var stagesLevels:Array = new Array("l0", "l1", "l2");
var maxx = 450;
ox = 30;
x = ox;
y = 50;
dx = 90;
dy = 74;
var numLevels:* = Game.levels.length;
if (numLevels > 24){
numLevels = 24;
};
levSelectMCs = new Array();
i = 0;
while (i < numLevels) {
l = Game.GetLevel(i);
stage = (i / 3);
mc = (titleMC.getChildByName(stages[stage]) as MovieClip);
levmc = (mc.getChildByName(stagesLevels[(i % 3)]) as MovieClip);
levSelectMCs.push(levmc);
levmc.levelID = i;
mc.gotoAndStop((stage + 1));
levmc.gotoAndStop(1);
if (l.available == false){
};
if (l.complete == true){
};
levmc.addEventListener(MouseEvent.CLICK, LevelSelect_buttonNextPressed, false, 0, true);
levmc.addEventListener(MouseEvent.MOUSE_OVER, LevelSelect_levelOver, false, 0, true);
levmc.addEventListener(MouseEvent.MOUSE_OUT, LevelSelect_levelOut, false, 0, true);
levmc.useHandCursor = true;
levmc.buttonMode = true;
i++;
};
LevelSelect_Update();
}
public static function buttonPlayCompleteMoviePressed(e:MouseEvent){
MusicPlayer.StopMusic();
main.removeChild(titleMC);
titleMC = null;
InitEndComicBook();
}
public static function InitLevelEndScreen(){
Mouse.show();
var l:Level = Game.GetCurrentLevel();
titleMC.innerholder.inner.textStat0.text = "";
titleMC.innerholder.inner.textStat1.text = "";
titleMC.innerholder.inner.textStat2.text = (("Final Time: " + Utils.CounterToSecondsString(l.lastTimeTotal)) + " seconds");
var mtext:String = "";
titleMC.innerholder.inner.textStat3.text = mtext;
titleMC.innerholder.inner.textStat4.text = ("Score: " + Game.currentScore);
titleMC.buttonNext.addEventListener(MouseEvent.CLICK, LevelEnd_buttonNextPressed, false, 0, true);
titleMC.buttonMainMenu.addEventListener(MouseEvent.CLICK, LevelEnd_buttonMenuPressed, false, 0, true);
SponsorBar(titleMC.sponsorBar);
}
public static function InitPreLevelScreen_buttonBuyHealthPressed(e:MouseEvent){
var cost:int = GetHealthCost();
if (cost > Game.cash){
return;
};
Game.cash = (Game.cash - cost);
Game.health++;
if (Game.health >= Game.goPlayer.maxHealth){
Game.health = Game.goPlayer.maxHealth;
};
Game.goPlayer.health = Game.health;
UpdatePreLevelScreen();
SaveData.Save();
}
static function ComicBookFinished(){
var muteTransform:SoundTransform = new SoundTransform();
muteTransform.volume = 0;
titleMC.soundTransform = muteTransform;
MusicPlayer.musicCurrentName = "";
titleMC.stop();
titleMC.removeEventListener(Event.ENTER_FRAME, InitComicBookFrameFunc);
main.removeChild(titleMC);
titleMC = null;
titleMC = main.AddMovieClip(0, 0, new betweenStages());
titleMC.addEventListener(MouseEvent.CLICK, ComicBookFinished_clicked, false, 0, true);
titleMC.gotoAndStop(1);
MusicPlayer.StartStream(0);
}
public static function AchievementScreen_achievementPressed(e:MouseEvent){
var achMC:MovieClip;
selectedAchievementIndex = e.currentTarget.achID;
var ach:Achievement = Game.achievements.list[selectedAchievementIndex];
overlayMC.textName.text = ach.name;
overlayMC.textDescription.text = ach.description;
var i:int;
for each (ach in Game.achievements.list) {
achMC = (overlayMC.getChildByName(("ach" + i.toString())) as MovieClip);
if (achMC != null){
achMC.selectedClip.visible = false;
if (i == selectedAchievementIndex){
achMC.selectedClip.visible = true;
};
};
i++;
};
}
static function instructionsClosePressed(e:MouseEvent){
Game.main.removeChild(instructionsMC);
instructionsMC = null;
showingInstructions = false;
Game.InitLevelState(Game.levelState_Play);
}
public static function SFXMuteButton_Out(e:MouseEvent){
e.currentTarget.gotoAndStop(1);
}
public static function InitMusicMuteButton(mc:MovieClip){
mc.gotoAndStop(1);
mc.addEventListener(MouseEvent.MOUSE_OVER, MusicMuteButton_Over, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_OUT, MusicMuteButton_Out, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_DOWN, MusicMuteButton_Down, false, 0, true);
mc.offMC.visible = true;
if (MusicPlayer.doMusic){
mc.offMC.visible = false;
};
mc.useHandCursor = true;
mc.buttonMode = true;
}
public static function WorldSelect_worldOut(e:MouseEvent){
Game.currentWorldID = -1;
WorldSelect_Update();
titleMC.textInfo.text = "";
}
static function PlayIntro(){
MusicPlayer.StopMusic();
main.InitStage();
overlayMC.buttonSkip.addEventListener(MouseEvent.CLICK, buttonSkipPressed, false, 0, true);
overlayMC.gotoAndPlay(1);
}
public static function LevelSelect_levelOver(e:MouseEvent){
var levelID:int = e.currentTarget.levelID;
levelSelect_selectedLevel = levelID;
Game.currentLevel = levelID;
LevelSelect_Update();
}
public static function LevelStart_buttonNextPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
Game.pause = false;
KeyReader.InitOnce(Game.main.stage);
}
public static function InitLevelFailScreen(){
Mouse.show();
var l:Level = Game.GetCurrentLevel();
titleMC.buttonNext.addEventListener(MouseEvent.CLICK, LevelFail_buttonNextPressed, false, 0, true);
titleMC.buttonMainMenu.addEventListener(MouseEvent.CLICK, LevelFail_buttonMenuPressed, false, 0, true);
SponsorBar(titleMC.sponsorBar);
}
public static function InitComicBook_buttonContinuePressed(e:MouseEvent){
ComicBookFinished();
}
static function LevelSelect_Update(){
var i:int;
var level:Level;
var mc:MovieClip;
if (levelSelect_selectedLevel == -1){
} else {
level = Game.GetLevel(levelSelect_selectedLevel);
};
var numLevels:* = Game.levels.length;
if (numLevels > 24){
numLevels = 24;
};
i = 0;
while (i < numLevels) {
level = Game.GetLevel(i);
mc = levSelectMCs[i];
if (i == levelSelect_selectedLevel){
mc.select.visible = true;
} else {
mc.select.visible = false;
};
if (level.available){
mc.lock.visible = false;
} else {
mc.lock.visible = true;
};
i++;
};
}
public static function InitComicBook(){
MusicPlayer.StopMusic();
titleMC = main.AddMovieClip(0, 0, new ComicBookIntro());
titleMC.addEventListener(MouseEvent.CLICK, InitComicBook_buttonContinuePressed, false, 0, true);
titleMC.addEventListener(Event.ENTER_FRAME, InitComicBookFrameFunc, false, 0, true);
titleMC.gotoAndPlay(1);
comicBookFrame = 1;
}
public static function WorldSelect_worldOver(e:MouseEvent){
var worldID:int = e.currentTarget.worldID;
Game.currentWorldID = worldID;
WorldSelect_Update();
titleMC.textInfo.text = ("World " + (worldID + 1));
}
public static function InitEndComicBook(){
MusicPlayer.StopMusic();
titleMC = main.AddMovieClip(320, 240, new GameCompleteMovie());
titleMC.addEventListener(MouseEvent.CLICK, InitEndComicBook_buttonContinuePressed, false, 0, true);
titleMC.addEventListener(Event.ENTER_FRAME, InitEndComicBookFrameFunc, false, 0, true);
titleMC.gotoAndPlay(1);
comicBookFrame = 1;
}
public static function InitLevelStartScreen(){
var ach:Achievement;
var mc:TextField;
Mouse.show();
Game.pause = true;
var level:Level = Game.GetCurrentLevel();
titleMC.textTitle.text = ("Starting Level " + (Game.currentLevel + 1));
titleMC.textAchievement0.text = "";
titleMC.textAchievement1.text = "";
titleMC.textAchievement2.text = "";
titleMC.complete0.gotoAndStop(1);
titleMC.complete1.gotoAndStop(1);
titleMC.complete2.gotoAndStop(1);
var nextAchId:int;
for each (ach in Game.achievements.list) {
if ((ach.specificLevel - 1) == Game.currentLevel){
mc = titleMC[("textAchievement" + nextAchId)];
mc.text = ach.name;
mc.text = (mc.text + "\n");
mc.text = (mc.text + ach.description);
nextAchId++;
};
};
titleMC.textBest.text = "Best Time: 1.23";
titleMC.buttonNext.addEventListener(MouseEvent.CLICK, LevelStart_buttonNextPressed, false, 0, true);
}
public static function InitComicBookFrameFunc(e:Event){
if (comicBookFrame == 633){
ComicBookFinished();
};
comicBookFrame++;
}
public static function buttonClearSaveDataPressed(e:MouseEvent){
SaveData.Clear();
}
public static function LevelSelect_buttonBackPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
InitWorldSelect();
}
public static function WorldSelect_Next(){
var i:int;
var mc:MovieClip;
i = 0;
while (i < 5) {
mc = titleMC[("level" + (i + 1).toString())];
mc.removeEventListener(MouseEvent.CLICK, WorldSelect_worldPressed);
mc.removeEventListener(MouseEvent.MOUSE_OVER, WorldSelect_worldOver);
mc.removeEventListener(MouseEvent.MOUSE_OUT, WorldSelect_worldOut);
i++;
};
Game.main.removeChild(titleMC);
titleMC = null;
InitLevelSelect();
}
public static function SFXMuteButton_Down(e:MouseEvent){
e.currentTarget.gotoAndStop(3);
SoundPlayer.ToggleMute();
e.currentTarget.offMC.visible = true;
if (SoundPlayer.doSFX){
e.currentTarget.offMC.visible = false;
};
}
public static function buttonStartPressed(e:MouseEvent){
if (SaveData.Exists()){
titleMC.savedGamesOverlay.visible = true;
return;
};
buttonNewGamePressed(e);
}
public static function LevelEnd_buttonNextPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
Game.NextLevel();
}
public static function UpdatePreLevelScreen(){
var i:int;
var w:WeaponType;
var mc:MovieClip;
titleMC.bomb0.visible = true;
titleMC.textDaveBombCount.text = ("x" + Game.numBombs);
titleMC.textCash.text = Game.cash.toString();
titleMC.textHealth.text = (Game.health.toString() + " / 5");
var weapons:Array = new Array("w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7");
var numw = 8;
i = 0;
while (i < numw) {
w = Game.weapons[i];
mc = (titleMC.getChildByName(weapons[i]) as MovieClip);
mc.gotoAndStop((i + 1));
mc.lock.visible = false;
if (i == Game.currentWeapon){
mc.select.visible = true;
} else {
mc.select.visible = false;
};
i++;
};
titleMC.textUpgradeCost.text = GetWeaponCost();
titleMC.textDaveBomb.text = GetDaveCost();
titleMC.textHealthCost.text = GetHealthCost();
if ((((GetWeaponCost() > Game.cash)) || ((Game.currentWeapon == 7)))){
titleMC.buttonBuyUpgrade.visible = false;
};
if ((((GetDaveCost() > Game.cash)) || ((Game.numBombs == 3)))){
titleMC.buttonBuyDaveBomb.visible = false;
};
if ((((GetHealthCost() > Game.cash)) || ((Game.health == Game.goPlayer.maxHealth)))){
titleMC.buttonBuyHealth.visible = false;
};
}
public static function WorldSelect_buttonBackPressed(e:MouseEvent){
}
public static function InitPreLevelScreen(){
MusicPlayer.StartStream(0);
titleMC = main.AddMovieClip(0, 0, new PreLevelScreen());
titleMC.buttonContinue.addEventListener(MouseEvent.CLICK, InitPreLevelScreen_buttonContinuePressed, false, 0, true);
titleMC.buttonBuyUpgrade.addEventListener(MouseEvent.CLICK, InitPreLevelScreen_buttonBuyUpgradePressed, false, 0, true);
titleMC.buttonBuyDaveBomb.addEventListener(MouseEvent.CLICK, InitPreLevelScreen_buttonBuyDaveBombPressed, false, 0, true);
titleMC.buttonBuyHealth.addEventListener(MouseEvent.CLICK, InitPreLevelScreen_buttonBuyHealthPressed, false, 0, true);
titleMC.textEnteringLevel.text = ("Entering Level " + (Game.currentLevel + 1).toString());
UpdatePreLevelScreen();
}
public static function buttonStart3Pressed(e:MouseEvent){
Game.difficulty = 3;
buttonStartPressed(e);
}
public static function LevelFail_buttonNextPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
Game.RestartLevel();
}
public static function WorldSelect_worldPressed(e:MouseEvent){
WorldSelect_Next();
}
public static function InitEndComicBook_buttonContinuePressed(e:MouseEvent){
EndComicBookFinished();
}
public static function AchievementScreen_buttonBackPressed(e:MouseEvent){
Game.main.removeChild(overlayMC);
overlayMC = null;
}
public static function InitSFXMuteButton(mc:MovieClip){
mc.gotoAndStop(1);
mc.addEventListener(MouseEvent.MOUSE_OVER, SFXMuteButton_Over, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_OUT, SFXMuteButton_Out, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_DOWN, SFXMuteButton_Down, false, 0, true);
mc.offMC.visible = true;
if (SoundPlayer.doSFX){
mc.offMC.visible = false;
};
mc.useHandCursor = true;
mc.buttonMode = true;
}
public static function LevelEnd_buttonMenuPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
InitLevelSelect();
}
static function SponsorBar(mc:MovieClip):void{
}
public static function buttonAchievementsPressed(e:MouseEvent){
InitAchievementScreen();
}
public static function LevelFail_buttonMenuPressed(e:MouseEvent){
Game.main.removeChild(titleMC);
titleMC = null;
InitLevelSelect();
}
public static function InitWorldSelect(){
var i:int;
var mc:MovieClip;
Mouse.show();
titleMC.textInfo.text = "";
Game.currentWorldID = -1;
i = 0;
while (i < 5) {
mc = titleMC[("level" + (i + 1).toString())];
mc.addEventListener(MouseEvent.CLICK, WorldSelect_worldPressed, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_OVER, WorldSelect_worldOver, false, 0, true);
mc.addEventListener(MouseEvent.MOUSE_OUT, WorldSelect_worldOut, false, 0, true);
mc.worldID = i;
mc.gotoAndStop((i + 1));
mc.lock.visible = true;
mc.selectedMC.visible = false;
i++;
};
WorldSelect_Update();
}
public static function buttonStart2Pressed(e:MouseEvent){
Game.difficulty = 2;
buttonStartPressed(e);
}
public static function buttonNewGamePressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
Game.Init(Game.main, false);
Game.InitGame();
SaveData.Save();
InitLevelSelect(true);
}
public static function buttonEnterCheatsPressed(e:MouseEvent){
}
static function GetWeaponCost():int{
var costs:Array = new Array(500, 1000, 2000, 4000, 7000, 11000, 15000);
return (costs[Game.currentWeapon]);
}
public static function InitPreLevelScreen_buttonContinuePressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
Game.PreLevelScreenDone();
}
public static function SFXMuteButton_Over(e:MouseEvent){
e.currentTarget.gotoAndStop(2);
}
public static function buttonContinuePressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
Game.Continue();
}
public static function Update(main:Main){
}
static function InitLevelInstructions(){
showingInstructions = false;
var l:Level = Game.GetCurrentLevel();
if (l.helpscreenFrames.length == 0){
Game.InitLevelState(Game.levelState_Play);
return;
};
Mouse.show();
showingInstructions = true;
instructionIndex = 0;
instructionsMC.buttonContinue.addEventListener(MouseEvent.CLICK, instructionsContinuePressed, false, 0, true);
instructionsMC.buttonDone.addEventListener(MouseEvent.CLICK, instructionsClosePressed, false, 0, true);
Game.main.addChild(instructionsMC);
instructionsMC.buttonContinue.visible = false;
if (l.helpscreenFrames.length > (instructionIndex + 1)){
instructionsMC.buttonContinue.visible = true;
};
instructionsMC.buttonDone.visible = (instructionsMC.buttonContinue.visible == false);
instructionsMC.visible = true;
instructionsMC.gotoAndStop(l.helpscreenFrames[instructionIndex]);
}
public static function InitPreLevelStoryScreen_buttonContinuePressed(e:MouseEvent){
main.removeChild(titleMC);
titleMC = null;
InitPreLevelScreen();
}
public static function InitPreLevelScreen_buttonBuyUpgradePressed(e:MouseEvent){
var cost:int = GetWeaponCost();
if (cost > Game.cash){
return;
};
if (Game.currentWeapon >= 7){
return;
};
Game.currentWeapon++;
Game.cash = (Game.cash - cost);
UpdatePreLevelScreen();
SaveData.Save();
}
}
}//package
Section 235
//TowerDef (TowerDef)
package {
public class TowerDef {
var radii:Array;
var weapons:Array;
var price:int;
var name:String;
public function TowerDef(){
super();
name = "";
weapons = new Array();
radii = new Array();
price = 0;
}
}
}//package
Section 236
//TowerDefRadius (TowerDefRadius)
package {
public class TowerDefRadius {
var price:int;
var radius:int;
public function TowerDefRadius(){
super();
radius = 0;
price = 0;
}
}
}//package
Section 237
//TowerDefWeapon (TowerDefWeapon)
package {
public class TowerDefWeapon {
var price:int;
var name:String;
public function TowerDefWeapon(){
super();
name = "";
price = 0;
}
}
}//package
Section 238
//Tune01 (Tune01)
package {
import flash.media.*;
public dynamic class Tune01 extends Sound {
}
}//package
Section 239
//Utils (Utils)
package {
import flash.display.*;
import flash.geom.*;
public class Utils {
static var paramValues:Array;
static var paramNames:Array;
public function Utils(){
super();
}
public static function GetParamBool(name:String, _default:Boolean=false):Boolean{
var s:String;
var i:int = paramNames.indexOf(name);
if (i != -1){
s = paramValues[i];
if (s == "true"){
return (true);
};
return (false);
};
return (_default);
}
static function SideOfLine(lx0:Number, ly0:Number, lx1:Number, ly1:Number, x:Number, y:Number):Boolean{
var dot:Number = DotProduct((lx1 - lx0), (ly1 - ly0), (x - lx0), (y - ly0));
if (dot < 0){
return (false);
};
return (true);
}
public static function PointArrayFromString(s:String):Array{
var i:int;
var p:Point;
var pointArray:Array = new Array();
var a:Array = s.split(",");
if ((((a.length < 2)) || (((a.length % 2) == 1)))){
trace(((("PointArrayFromString. Error, numpoints=" + a.length) + " , string= ") + s));
return (pointArray);
};
var num:int = (a.length / 2);
i = 0;
while (i < num) {
p = new Point(0, 0);
p.x = Number(a[((i * 2) + 0)]);
p.y = Number(a[((i * 2) + 1)]);
pointArray.push(p);
i++;
};
return (pointArray);
}
public static function ScaleTo(f0:Number, f1:Number, o0:Number, o1:Number, val:Number):Number{
var od:Number = (o1 - o0);
var fd:Number = (f1 - f0);
var d:Number = ((1 / od) * (val - o0));
d = ((fd * d) + f0);
return (d);
}
static function DotProduct(x0:Number, y0:Number, x1:Number, y1:Number):Number{
var dot:Number = ((x0 * x1) + (y0 * y1));
return (dot);
}
static function RenderDotLine(bd:BitmapData, x0:Number, y0:Number, x1:Number, y1:Number, numP:int, col:uint):void{
var i:int;
var maxP:int = numP;
var dx:Number = ((x1 - x0) / Number(maxP));
var dy:Number = ((y1 - y0) / Number(maxP));
bd.setPixel32(int(x0), int(y0), col);
var ox:Number = x0;
var oy:Number = y0;
i = 0;
while (i < maxP) {
x0 = (x0 + dx);
y0 = (y0 + dy);
bd.setPixel32(int(x0), int(y0), col);
i++;
};
}
public static function LimitNumber(f0:Number, f1:Number, n:Number):Number{
if (n < f0){
n = f0;
};
if (n > f1){
n = f1;
};
return (n);
}
static function DistBetweenPoints(x0:Number, y0:Number, x1:Number, y1:Number):Number{
var dx:Number = (x1 - x0);
var dy:Number = (y1 - y0);
return (Math.sqrt(((dx * dx) + (dy * dy))));
}
public static function rgbToHex(color:uint):String{
var colorInHex:String = color.toString(16);
var c:String = ("00000" + colorInHex);
var e:int = c.length;
c = c.substring((e - 6), e);
return (c.toUpperCase());
}
public static function DegToRad(deg:Number):Number{
return ((((Math.PI * 2) / 360) * deg));
}
public static function RadToDeg(rad:Number):Number{
return (((360 / (Math.PI * 2)) * rad));
}
static function RandBetweenFloat(r0:Number, r1:Number):Number{
var r:Number = (Math.random() * (r1 - r0));
r = (r + r0);
return (r);
}
public static function LineLength(x0:Number, y0:Number, x1:Number, y1:Number):Number{
var dx:Number = (x1 - x0);
var dy:Number = (y1 - y0);
return (Math.sqrt(((dx * dx) + (dy * dy))));
}
public static function GetParams(initParams:String):void{
var params:String;
var s:String;
var sss:Array;
paramNames = new Array();
paramValues = new Array();
params = Utils.RemoveWhiteSpace(initParams);
params = params.toLowerCase();
var ss:Array = params.split(",");
for each (s in ss) {
sss = s.split("=");
paramNames.push(sss[0]);
paramValues.push(sss[1]);
};
}
public static function GetParamNumber(name:String, _default:Number=0):Number{
var i:int = paramNames.indexOf(name);
if (i != -1){
return (Number(paramValues[i]));
};
return (_default);
}
public static function RemoveWhiteSpace(s:String):String{
s = s.replace(" ", "");
return (s);
}
public static function DP1(val:Number):Number{
var n:Number = (Math.ceil((val * 10)) / 10);
return (n);
}
public static function DP2(val:Number):Number{
var n:Number = (Math.ceil((val * 100)) / 100);
return (n);
}
static function RenderRectangle(bd:BitmapData, r:Rectangle, col:uint, _numP:int=100):void{
RenderDotLine(bd, r.left, r.top, r.right, r.top, _numP, col);
RenderDotLine(bd, r.left, r.bottom, r.right, r.bottom, _numP, col);
RenderDotLine(bd, r.left, r.top, r.left, r.bottom, _numP, col);
RenderDotLine(bd, r.right, r.top, r.right, r.bottom, _numP, col);
}
public static function NumberToString2DP(n:Number):String{
var len:int;
var aa:String = DP2(n).toString();
var index:int = aa.lastIndexOf(".");
if (index == -1){
aa.concat(".00");
} else {
len = aa.length;
if (index == (len - 1)){
aa.concat("0");
};
};
return (aa);
}
static function NormalizeRot(rot:Number):Number{
while (rot < 0) {
rot = (rot + (Math.PI * 2));
};
while (rot > (Math.PI * 2)) {
rot = (rot - (Math.PI * 2));
};
return (rot);
}
static function RandBetweenInt(r0:int, r1:int):int{
var r:int = (Math.random() * ((r1 - r0) + 1));
r = (r + r0);
return (r);
}
static function RenderCircle(bd:BitmapData, x:Number, y:Number, rad:Number, col:uint, _numP:int=50):void{
var i:int;
var xp:Number;
var yp:Number;
var numP:int = _numP;
var dx:Number = ((Math.PI * 2) / numP);
var ang:Number = 0;
i = 0;
while (i < numP) {
xp = (x + (Math.cos(ang) * rad));
yp = (y + (Math.sin(ang) * rad));
ang = (ang + dx);
bd.setPixel32(int(xp), int(yp), col);
i++;
};
}
static function RandPositiveNegative(r0:Number):Number{
var r:Number = Math.random();
if (r < 0.5){
r0 = -(r0);
};
return (r0);
}
static function DotProductAng(r0:Number, r1:Number):Number{
var x0:Number = Math.cos(r0);
var y0:Number = Math.sin(r0);
var x1:Number = Math.cos(r1);
var y1:Number = Math.sin(r1);
var dot:Number = ((x0 * x1) + (y0 * y1));
return (dot);
}
public static function RandCircle():Number{
return ((Math.random() * (Math.PI * 2)));
}
public static function GetParam(name:String, _default:String=""):String{
var i:int = paramNames.indexOf(name);
if (i != -1){
return (paramValues[i]);
};
return (_default);
}
public static function CounterToSecondsString(count:int):String{
var s:String = "";
var seconds:int = (count / int(Defs.fps));
var remainder:int = (count % int(Defs.fps));
s = (s + (seconds.toString() + ":"));
var r:Number = ((100 / Defs.fps) * Number(remainder));
s = (s + Math.floor(r).toString());
return (s);
}
public static function ScaleToLimit(f0:Number, f1:Number, o0:Number, o1:Number, val:Number):Number{
return (LimitNumber(f0, f1, ScaleTo(f0, f1, o0, o1, val)));
}
public static function ScaleBetween(f0:Number, f1:Number, scale:Number):Number{
var d:Number = ((f1 - f0) * scale);
d = (f0 + d);
return (d);
}
static function Dist2BetweenPoints(x0:Number, y0:Number, x1:Number, y1:Number):Number{
var dx:Number = (x1 - x0);
var dy:Number = (y1 - y0);
return (((dx * dx) + (dy * dy)));
}
}
}//package
Section 240
//Vec (Vec)
package {
import flash.geom.*;
public class Vec {
public var speed:Number;
public var rot:Number;
public function Vec(){
super();
rot = 0;
speed = 0;
}
public function Add(v:Vec){
var x0:Number = (Math.cos(rot) * speed);
var y0:Number = (Math.sin(rot) * speed);
var x1:Number = (Math.cos(v.rot) * v.speed);
var y1:Number = (Math.sin(v.rot) * v.speed);
var dx:Number = (x0 + x1);
var dy:Number = (y0 + y1);
rot = Math.atan2(dy, dx);
speed = Math.sqrt(((dx * dx) + (dy * dy)));
}
public function Set(_r:Number, _s:Number){
rot = _r;
speed = _s;
}
function ReflectAng(wallang:Number):void{
var a:Number = (wallang - rot);
rot = (wallang + a);
NormalizeRot();
}
function NormalizeRot():void{
while (rot < 0) {
rot = (rot + (Math.PI * 2));
};
while (rot > (Math.PI * 2)) {
rot = (rot - (Math.PI * 2));
};
}
public function GetUnitTangent():Point{
var r:Number = (rot + (Math.PI * 0.5));
var p:Point = new Point(Math.cos(r), Math.sin(r));
return (p);
}
public function NearRot(r:Number, d:Number):Boolean{
var a:Number = (rot - r);
var aa:Number = Math.abs(a);
if (a > Math.PI){
if (r < rot){
r = (r + (Math.PI * 2));
} else {
r = (r - (Math.PI * 2));
};
a = (rot - r);
};
if (Math.abs(a) <= d){
return (true);
};
return (false);
}
public function AddRot(d:Number):void{
rot = (rot + d);
NormalizeRot();
}
public function SetAng(_r:Number){
rot = _r;
}
public function SetAngFromCoordinates(x0:Number, y0:Number, x1:Number, y1:Number){
rot = Math.atan2((y1 - y0), (x1 - x0));
}
public function GetYComponent():Number{
return ((Math.sin(rot) * speed));
}
public function GetXComponent():Number{
return ((Math.cos(rot) * speed));
}
public function dotRot(r:Number):Number{
var x0:Number = Math.cos(rot);
var y0:Number = Math.sin(rot);
var x1:Number = Math.cos(r);
var y1:Number = Math.sin(r);
var dot:Number = ((x0 * x1) + (y0 * y1));
return (dot);
}
public function GetUnitYComponent():Number{
return (Math.sin(rot));
}
public function GetUnitXComponent():Number{
return (Math.cos(rot));
}
}
}//package
Section 241
//WaveDef (WaveDef)
package {
public class WaveDef {
var once:Boolean;
var enemy:String;
var amountMax:int;
var frequencyMax:int;
var frequencyMin:int;
var amountMin:int;
public function WaveDef(){
super();
}
}
}//package
Section 242
//Weapon01 (Weapon01)
package {
import flash.display.*;
public dynamic class Weapon01 extends MovieClip {
}
}//package
Section 243
//Weapon02 (Weapon02)
package {
import flash.display.*;
public dynamic class Weapon02 extends MovieClip {
}
}//package
Section 244
//Weapon03 (Weapon03)
package {
import flash.display.*;
public dynamic class Weapon03 extends MovieClip {
}
}//package
Section 245
//Weapon04 (Weapon04)
package {
import flash.display.*;
public dynamic class Weapon04 extends MovieClip {
}
}//package
Section 246
//Weapon05 (Weapon05)
package {
import flash.display.*;
public dynamic class Weapon05 extends MovieClip {
}
}//package
Section 247
//Weapon06 (Weapon06)
package {
import flash.display.*;
public dynamic class Weapon06 extends MovieClip {
}
}//package
Section 248
//Weapon07 (Weapon07)
package {
import flash.display.*;
public dynamic class Weapon07 extends MovieClip {
}
}//package
Section 249
//WeaponType (WeaponType)
package {
public class WeaponType {
var items:Array;
var available:Boolean;
var name:String;
public function WeaponType(){
super();
name = "";
items = new Array();
available = false;
}
}
}//package
Section 250
//WeaponTypeItem (WeaponTypeItem)
package {
public class WeaponTypeItem {
var mcName:String;
var frequency:int;
var speed:Number;
var hp:Number;
var shotTimer:int;
var dir:Number;
var initFunctionName:String;
var oneShotWidth:Number;
var absoluteDir:Boolean;
var health:Number;
var oneShotLength:Number;
public function WeaponTypeItem(){
super();
initFunctionName = "";
hp = 1;
health = 1;
mcName = "";
dir = 0;
speed = 0;
absoluteDir = false;
oneShotWidth = 1;
oneShotLength = 1;
frequency = 1;
shotTimer = 0;
}
public function Equipped(){
shotTimer = 0;
}
}
}//package
Section 251
//XmlHelper (XmlHelper)
package {
public class XmlHelper {
public function XmlHelper(){
super();
}
public static function GetAttrString(x:Object, defaultvalue:String=""):String{
var val:String = defaultvalue;
if (x != undefined){
val = String(x);
};
return (val);
}
public static function GetAttrBoolean(x:Object, defaultvalue:Boolean=false):Boolean{
var s:String;
var val:Boolean = defaultvalue;
if (x != null){
val = false;
s = String(x);
s = s.toLowerCase();
if (x == "true"){
val = true;
};
};
return (val);
}
public static function GetAttrInt(x:Object, defaultvalue:int=0):int{
var val:int = defaultvalue;
if (x != undefined){
val = int(x);
};
return (val);
}
public static function GetAttrNumber(x:Object, defaultvalue:Number=0):Number{
var s:String;
var val:Number = defaultvalue;
if (x != undefined){
s = String(x);
if (s.charAt(0) == "%"){
s = s.replace("%", "");
val = Number(ExternalData.constants[s]);
} else {
val = Number(x);
};
};
return (val);
}
}
}//package
Section 252
//yowFinished (yowFinished)
package {
import flash.display.*;
public dynamic class yowFinished extends MovieClip {
public function yowFinished(){
addFrameScript(86, frame87);
}
function frame87(){
stop();
}
}
}//package
Section 253
//yowFinished2 (yowFinished2)
package {
import flash.display.*;
public dynamic class yowFinished2 extends MovieClip {
public function yowFinished2(){
addFrameScript(112, frame113);
}
function frame113(){
stop();
}
}
}//package
Section 254
//yowFinished3 (yowFinished3)
package {
import flash.display.*;
public dynamic class yowFinished3 extends MovieClip {
public function yowFinished3(){
addFrameScript(95, frame96);
}
function frame96(){
stop();
}
}
}//package