STORY   LOOP   FURRY   PORN   GAMES
• C •   SERVICES [?] [R] RND   POPULAR
Archived flashes:
232690
/disc/ · /res/     /show/ · /fap/ · /gg/ · /swf/P0001 · P2636 · P5272

<div style="position:absolute;top:-99px;left:-99px;"><img src="https://tools.swfchan.com/stathit.asp?noj=FRM28470302-1DC&rnd=28470302" width="1" height="1"></div>

armorgames bostinvoyage-5285.swf

This is the info page for
Flash #263232

(Click the ID number above for more basic data on this flash file.)


Text
PATIENCE. THE GAME IS LOADING.....

The volume of
this game is
ELEVEN. it does
not have a mute

CONTINUE

The VIRUS HAD BEEN DESTROYED

BOSTIN

BUT WHO WAS BEHIND THIS ?

HANG ON A SEC

NO WAY!!!!

those pesky kids

UPGRADE

BUY

CASH: $12345

HEALTH: 100%

$12345

10000

10000

UPGRADEs

HEALTH

SMART BOMB

<p align="left"><font face="Anime Ace" size="15" color="#ffffff" letterSpacing="-4.000000" kerning="0">x 3</font></p>

NEXT UPGRADE

ENTERING LEVEL 1

CONTINUE

QUIT

PAUSED

THE BAND KICKED OF THEIR WORLD TOUR

SKIP

IT LOOKS TERMINAL

this calls for my
special procedure

WE JUST NEED TWO
VOLUNTEERS.....

STAGE 1

1

2

3

STAGE 2

STAGE 3

STAGE 4

STAGE 5

STAGE 6

STAGE 7

STAGE 8

STAGE SELECT

longanimals

DDICTING

AM

E

S

health

<p align="left"><font face="Anime Ace" size="14" color="#ffffff" letterSpacing="0.000000" kerning="1">134523</font></p>

<p align="right"><font face="Anime Ace" size="14" color="#ffffff" letterSpacing="0.000000" kerning="1">100 </font></p>

left

<p align="left"><font face="Anime Ace" size="14" color="#ffffff" letterSpacing="0.000000" kerning="1">8888888</font></p>

SCORE

BOSS health

CLICK HERE TO PLAY

LOADING

the virus - wipe these out

PILLS - COLLECT FOR UPGRADES

Press X FOR SMART BOMB

THIS IS YOUR ATTACK POD, MOVE
WITH THE MOUSE, HOLD THE
BUTTON TO LOCK DIRECTION.

viruses appear from rips in
the flesh - keep out of the
way when these appear.

POINTLESS INSTRUCTIONS YOU WONT READ ANYWAY

SKIP

IT's MOVED INTO his
tongue this looks tricky
I still dont know what
we are dealing with.

THE TONGUE

Its down his windpipe
now, its like its got
some sort of plan.

THE WINDPIPE

this virus appears to be
man made, that's what it
looks like from the
genetic signatures.

THE STOMACH

ITS SURVIVED HIS
STOMACH ACID AND
LOCATED IN HIS
INTESTIVES.

THE INTESTINE

IT APpEARS TO have been
absorbed into the
blood stream. this is
getting serious now.

THE WINDPIPE

the virus has attacked
his brain cells, you
have to rid it else we
will loose him.

THE BRAIN

THE FINAL HIDING PLACE
we will find out who is
behind this genetic
virus now.

THE PUPIL

THEY THOUGHT IT WAS ALL OVER.... IT IS NOW

BUT THEN SOMEONE FOUND A BUTTON CALLED CONTINUE

EASY!

MORE GAMES

TWITTER

NORMAL!

HARD

NUTTER!

DIFFICULTY LEVELS

GAME COMPLETE
MOVIE

A GAME BY LONGANIMALS AND ROBOTJAM

CONTINUE

GAME

NEW

PRESENTS

ActionScript [AS3]

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

Library Items

Symbol 1 GraphicUsed by:2
Symbol 2 MovieClipUses:1Used by:21
Symbol 3 GraphicUsed by:4
Symbol 4 MovieClipUses:3Used by:21
Symbol 5 GraphicUsed by:21
Symbol 6 FontUsed by:7 9
Symbol 7 TextUses:6Used by:21
Symbol 8 GraphicUsed by:21
Symbol 9 TextUses:6Used by:21
Symbol 10 GraphicUsed by:11
Symbol 11 MovieClipUses:10Used by:21
Symbol 12 GraphicUsed by:15
Symbol 13 GraphicUsed by:14
Symbol 14 MovieClipUses:13Used by:15
Symbol 15 MovieClipUses:12 14Used by:21
Symbol 16 GraphicUsed by:17 20
Symbol 17 MovieClipUses:16Used by:20
Symbol 18 FontUsed by:19
Symbol 19 TextUses:18Used by:20
Symbol 20 ButtonUses:17 19 16Used by:21
Symbol 21 MovieClip {preloaderMC} [preloaderMC]Uses:2 4 5 7 8 9 11 15 20
Symbol 22 GraphicUsed by:23
Symbol 23 MovieClip {PlayerShip} [PlayerShip]Uses:22
Symbol 24 GraphicUsed by:33
Symbol 25 GraphicUsed by:33
Symbol 26 GraphicUsed by:33
Symbol 27 GraphicUsed by:33
Symbol 28 GraphicUsed by:33
Symbol 29 GraphicUsed by:33
Symbol 30 GraphicUsed by:33
Symbol 31 GraphicUsed by:33
Symbol 32 GraphicUsed by:33
Symbol 33 MovieClip {Enemy08} [Enemy08]Uses:24 25 26 27 28 29 30 31 32
Symbol 34 Sound {sfx_explosion0.wav} [sfx_explosion0.wav]
Symbol 35 GraphicUsed by:53
Symbol 36 GraphicUsed by:53
Symbol 37 GraphicUsed by:53
Symbol 38 GraphicUsed by:53
Symbol 39 GraphicUsed by:53
Symbol 40 GraphicUsed by:53
Symbol 41 GraphicUsed by:53
Symbol 42 GraphicUsed by:53
Symbol 43 GraphicUsed by:53
Symbol 44 GraphicUsed by:53
Symbol 45 GraphicUsed by:53
Symbol 46 GraphicUsed by:53
Symbol 47 GraphicUsed by:53
Symbol 48 GraphicUsed by:53
Symbol 49 GraphicUsed by:53
Symbol 50 GraphicUsed by:53
Symbol 51 GraphicUsed by:53
Symbol 52 GraphicUsed by:53
Symbol 53 MovieClip {Enemy01_Boss} [Enemy01_Boss]Uses:35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
Symbol 54 GraphicUsed by:62
Symbol 55 GraphicUsed by:62
Symbol 56 GraphicUsed by:62
Symbol 57 GraphicUsed by:62
Symbol 58 GraphicUsed by:62
Symbol 59 GraphicUsed by:62
Symbol 60 GraphicUsed by:62
Symbol 61 GraphicUsed by:62
Symbol 62 MovieClip {Enemy04a} [Enemy04a]Uses:54 55 56 57 58 59 60 61
Symbol 63 GraphicUsed by:71
Symbol 64 GraphicUsed by:71
Symbol 65 GraphicUsed by:71
Symbol 66 GraphicUsed by:71
Symbol 67 GraphicUsed by:71 926 997
Symbol 68 GraphicUsed by:71
Symbol 69 GraphicUsed by:71
Symbol 70 GraphicUsed by:71
Symbol 71 MovieClip {Enemy04} [Enemy04]Uses:63 64 65 66 67 68 69 70
Symbol 72 GraphicUsed by:82
Symbol 73 GraphicUsed by:82
Symbol 74 GraphicUsed by:82
Symbol 75 GraphicUsed by:82
Symbol 76 GraphicUsed by:82 508 518
Symbol 77 GraphicUsed by:82
Symbol 78 GraphicUsed by:82
Symbol 79 GraphicUsed by:82
Symbol 80 GraphicUsed by:82
Symbol 81 GraphicUsed by:82
Symbol 82 MovieClip {Enemy05} [Enemy05]Uses:72 73 74 75 76 77 78 79 80 81
Symbol 83 GraphicUsed by:93
Symbol 84 GraphicUsed by:93
Symbol 85 GraphicUsed by:93
Symbol 86 GraphicUsed by:93
Symbol 87 GraphicUsed by:93
Symbol 88 GraphicUsed by:93
Symbol 89 GraphicUsed by:93
Symbol 90 GraphicUsed by:93
Symbol 91 GraphicUsed by:93
Symbol 92 GraphicUsed by:93
Symbol 93 MovieClip {Enemy06} [Enemy06]Uses:83 84 85 86 87 88 89 90 91 92
Symbol 94 GraphicUsed by:106
Symbol 95 GraphicUsed by:106
Symbol 96 GraphicUsed by:106
Symbol 97 GraphicUsed by:106
Symbol 98 GraphicUsed by:106
Symbol 99 GraphicUsed by:106
Symbol 100 GraphicUsed by:106
Symbol 101 GraphicUsed by:106
Symbol 102 GraphicUsed by:106
Symbol 103 GraphicUsed by:106
Symbol 104 GraphicUsed by:106
Symbol 105 GraphicUsed by:106
Symbol 106 MovieClip {Enemy07} [Enemy07]Uses:94 95 96 97 98 99 100 101 102 103 104 105
Symbol 107 GraphicUsed by:125
Symbol 108 GraphicUsed by:125
Symbol 109 GraphicUsed by:125
Symbol 110 GraphicUsed by:125
Symbol 111 GraphicUsed by:125
Symbol 112 GraphicUsed by:125
Symbol 113 GraphicUsed by:125
Symbol 114 GraphicUsed by:125
Symbol 115 GraphicUsed by:125
Symbol 116 GraphicUsed by:125
Symbol 117 GraphicUsed by:125
Symbol 118 GraphicUsed by:125
Symbol 119 GraphicUsed by:125
Symbol 120 GraphicUsed by:125
Symbol 121 GraphicUsed by:125
Symbol 122 GraphicUsed by:125
Symbol 123 GraphicUsed by:125
Symbol 124 GraphicUsed by:125
Symbol 125 MovieClip {Enemy01} [Enemy01]Uses:107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
Symbol 126 GraphicUsed by:139
Symbol 127 GraphicUsed by:139
Symbol 128 GraphicUsed by:139
Symbol 129 GraphicUsed by:139
Symbol 130 GraphicUsed by:139
Symbol 131 GraphicUsed by:139
Symbol 132 GraphicUsed by:139
Symbol 133 GraphicUsed by:139
Symbol 134 GraphicUsed by:139
Symbol 135 GraphicUsed by:139
Symbol 136 GraphicUsed by:139
Symbol 137 GraphicUsed by:139
Symbol 138 GraphicUsed by:139
Symbol 139 MovieClip {Enemy02} [Enemy02]Uses:126 127 128 129 130 131 132 133 134 135 136 137 138
Symbol 140 GraphicUsed by:247
Symbol 141 GraphicUsed by:186
Symbol 142 GraphicUsed by:186
Symbol 143 GraphicUsed by:159
Symbol 144 GraphicUsed by:145
Symbol 145 MovieClipUses:144Used by:159
Symbol 146 GraphicUsed by:147
Symbol 147 MovieClipUses:146Used by:159
Symbol 148 GraphicUsed by:149
Symbol 149 MovieClipUses:148Used by:159
Symbol 150 GraphicUsed by:151
Symbol 151 MovieClipUses:150Used by:158 207 247
Symbol 152 GraphicUsed by:153
Symbol 153 MovieClipUses:152Used by:155
Symbol 154 GraphicUsed by:155
Symbol 155 MovieClipUses:153 154Used by:158 207 247
Symbol 156 GraphicUsed by:158
Symbol 157 GraphicUsed by:158
Symbol 158 MovieClipUses:151 155 156 157Used by:159
Symbol 159 MovieClipUses:143 145 147 149 158Used by:186
Symbol 160 GraphicUsed by:170 212
Symbol 161 GraphicUsed by:170 212
Symbol 162 GraphicUsed by:170 212
Symbol 163 GraphicUsed by:170
Symbol 164 GraphicUsed by:170
Symbol 165 GraphicUsed by:170
Symbol 166 GraphicUsed by:170
Symbol 167 GraphicUsed by:170
Symbol 168 GraphicUsed by:170
Symbol 169 GraphicUsed by:170
Symbol 170 MovieClipUses:160 161 162 163 164 165 166 167 168 169Used by:186
Symbol 171 GraphicUsed by:182
Symbol 172 GraphicUsed by:182
Symbol 173 GraphicUsed by:182
Symbol 174 GraphicUsed by:182
Symbol 175 GraphicUsed by:182
Symbol 176 GraphicUsed by:182
Symbol 177 GraphicUsed by:182
Symbol 178 GraphicUsed by:182
Symbol 179 GraphicUsed by:182
Symbol 180 GraphicUsed by:182
Symbol 181 GraphicUsed by:182
Symbol 182 MovieClipUses:171 172 173 174 175 176 177 178 179 180 181Used by:186
Symbol 183 GraphicUsed by:186
Symbol 184 FontUsed by:185 190 205
Symbol 185 TextUses:184Used by:186
Symbol 186 MovieClipUses:141 142 159 170 182 183 185Used by:247
Symbol 187 SoundUsed by:247 745
Symbol 188 SoundUsed by:247
Symbol 189 GraphicUsed by:191
Symbol 190 TextUses:184Used by:191
Symbol 191 MovieClipUses:189 190Used by:247
Symbol 192 SoundUsed by:247
Symbol 193 GraphicUsed by:207
Symbol 194 GraphicUsed by:207
Symbol 195 GraphicUsed by:207
Symbol 196 GraphicUsed by:203
Symbol 197 GraphicUsed by:203
Symbol 198 GraphicUsed by:203
Symbol 199 GraphicUsed by:203
Symbol 200 GraphicUsed by:203
Symbol 201 GraphicUsed by:203
Symbol 202 GraphicUsed by:203
Symbol 203 MovieClipUses:196 197 198 199 200 201 202Used by:207 247
Symbol 204 GraphicUsed by:207
Symbol 205 TextUses:184Used by:207
Symbol 206 GraphicUsed by:207 247
Symbol 207 MovieClipUses:193 194 151 155 195 203 204 205 206Used by:247
Symbol 208 GraphicUsed by:212
Symbol 209 GraphicUsed by:212
Symbol 210 FontUsed by:211 230 244
Symbol 211 TextUses:210Used by:212
Symbol 212 MovieClip {endmovie_fla.panel4_15} [endmovie_fla.panel4_15]Uses:208 160 209 211 161 162Used by:247
Symbol 213 SoundUsed by:247
Symbol 214 GraphicUsed by:247
Symbol 215 GraphicUsed by:247
Symbol 216 GraphicUsed by:247
Symbol 217 GraphicUsed by:218
Symbol 218 MovieClipUses:217Used by:247
Symbol 219 SoundUsed by:247
Symbol 220 GraphicUsed by:247
Symbol 221 GraphicUsed by:247
Symbol 222 GraphicUsed by:223
Symbol 223 MovieClipUses:222Used by:247
Symbol 224 GraphicUsed by:247
Symbol 225 GraphicUsed by:247
Symbol 226 SoundUsed by:247
Symbol 227 GraphicUsed by:231
Symbol 228 GraphicUsed by:231
Symbol 229 GraphicUsed by:231
Symbol 230 TextUses:210Used by:231
Symbol 231 MovieClipUses:227 228 229 230Used by:247
Symbol 232 SoundUsed by:247
Symbol 233 GraphicUsed by:234
Symbol 234 MovieClipUses:233Used by:247
Symbol 235 GraphicUsed by:236
Symbol 236 MovieClipUses:235Used by:247
Symbol 237 GraphicUsed by:247
Symbol 238 GraphicUsed by:247
Symbol 239 GraphicUsed by:240
Symbol 240 MovieClipUses:239Used by:247
Symbol 241 GraphicUsed by:247
Symbol 242 SoundUsed by:247
Symbol 243 GraphicUsed by:245
Symbol 244 TextUses:210Used by:245
Symbol 245 MovieClipUses:243 244Used by:247
Symbol 246 SoundUsed by:247
Symbol 247 MovieClip {GameCompleteMovie} [GameCompleteMovie]Uses:140 186 187 188 191 192 207 212 213 214 215 151 155 216 203 218 206 219 220 221 223 224 225 226 231 232 234 236 237 238 240 241 242 245 246
Symbol 248 GraphicUsed by:262
Symbol 249 GraphicUsed by:262
Symbol 250 GraphicUsed by:262
Symbol 251 GraphicUsed by:262
Symbol 252 GraphicUsed by:262
Symbol 253 GraphicUsed by:262
Symbol 254 GraphicUsed by:262
Symbol 255 GraphicUsed by:262
Symbol 256 GraphicUsed by:262
Symbol 257 GraphicUsed by:262
Symbol 258 GraphicUsed by:262
Symbol 259 GraphicUsed by:262
Symbol 260 GraphicUsed by:262
Symbol 261 GraphicUsed by:262
Symbol 262 MovieClip {Enemy03} [Enemy03]Uses:248 249 250 251 252 253 254 255 256 257 258 259 260 261
Symbol 263 GraphicUsed by:277
Symbol 264 GraphicUsed by:277
Symbol 265 GraphicUsed by:277
Symbol 266 GraphicUsed by:277
Symbol 267 GraphicUsed by:277
Symbol 268 GraphicUsed by:277
Symbol 269 GraphicUsed by:277
Symbol 270 GraphicUsed by:277
Symbol 271 GraphicUsed by:277
Symbol 272 GraphicUsed by:277
Symbol 273 GraphicUsed by:277
Symbol 274 GraphicUsed by:277
Symbol 275 GraphicUsed by:277
Symbol 276 GraphicUsed by:277
Symbol 277 MovieClip {explosion_2_large} [explosion_2_large]Uses:263 264 265 266 267 268 269 270 271 272 273 274 275 276
Symbol 278 GraphicUsed by:291 425
Symbol 279 GraphicUsed by:291
Symbol 280 GraphicUsed by:291
Symbol 281 GraphicUsed by:291
Symbol 282 GraphicUsed by:291
Symbol 283 GraphicUsed by:291
Symbol 284 GraphicUsed by:291
Symbol 285 GraphicUsed by:291
Symbol 286 GraphicUsed by:291
Symbol 287 GraphicUsed by:291
Symbol 288 GraphicUsed by:291
Symbol 289 GraphicUsed by:291
Symbol 290 GraphicUsed by:291
Symbol 291 MovieClip {Lic_All_fla.MB_mouse_6} [Lic_All_fla.MB_mouse_6]Uses:278 279 280 281 282 283 284 285 286 287 288 289 290Used by:1374
Symbol 292 GraphicUsed by:357
Symbol 293 GraphicUsed by:300
Symbol 294 GraphicUsed by:295
Symbol 295 MovieClipUses:294Used by:300 1278
Symbol 296 GraphicUsed by:297
Symbol 297 MovieClipUses:296Used by:300 1278
Symbol 298 GraphicUsed by:299
Symbol 299 MovieClipUses:298Used by:300 1278
Symbol 300 MovieClipUses:293 295 297 299Used by:357 1367
Symbol 301 GraphicUsed by:357
Symbol 302 GraphicUsed by:303 306 356 437 1329 1331 1353 1363 1365
Symbol 303 MovieClipUses:302Used by:306 356 437 1329 1331 1353 1363 1365
Symbol 304 FontUsed by:305 309 355 436 1326 1328 1330 1345 1347 1349 1352 1361 1362 1364
Symbol 305 TextUses:304Used by:306
Symbol 306 ButtonUses:303 305 302Used by:357
Symbol 307 GraphicUsed by:308 310
Symbol 308 MovieClipUses:307Used by:310
Symbol 309 TextUses:304Used by:310
Symbol 310 ButtonUses:308 309 307Used by:357
Symbol 311 GraphicUsed by:315
Symbol 312 GraphicUsed by:313
Symbol 313 MovieClipUses:312Used by:315 794
Symbol 314 GraphicUsed by:315
Symbol 315 MovieClipUses:311 313 314Used by:357
Symbol 316 GraphicUsed by:357
Symbol 317 FontUsed by:318 319 336 337 338 346 354 953 956 960
Symbol 318 EditableTextUses:317Used by:357
Symbol 319 EditableTextUses:317Used by:357
Symbol 320 GraphicUsed by:335
Symbol 321 GraphicUsed by:322
Symbol 322 MovieClipUses:321Used by:335
Symbol 323 GraphicUsed by:324
Symbol 324 MovieClipUses:323Used by:335
Symbol 325 GraphicUsed by:335
Symbol 326 GraphicUsed by:335
Symbol 327 GraphicUsed by:335
Symbol 328 GraphicUsed by:335
Symbol 329 GraphicUsed by:330
Symbol 330 MovieClipUses:329Used by:335
Symbol 331 GraphicUsed by:332
Symbol 332 MovieClipUses:331Used by:335
Symbol 333 GraphicUsed by:335
Symbol 334 GraphicUsed by:335
Symbol 335 MovieClipUses:320 322 324 325 326 327 328 330 332 333 334Used by:357
Symbol 336 EditableTextUses:317Used by:357
Symbol 337 EditableTextUses:317Used by:357
Symbol 338 EditableTextUses:317Used by:357
Symbol 339 GraphicUsed by:357
Symbol 340 FontUsed by:341 343 345 352 1280 1282 1351 1358
Symbol 341 TextUses:340Used by:357
Symbol 342 GraphicUsed by:357
Symbol 343 TextUses:340Used by:357
Symbol 344 GraphicUsed by:357
Symbol 345 TextUses:340Used by:357
Symbol 346 EditableTextUses:317 1176Used by:357
Symbol 347 GraphicUsed by:357
Symbol 348 GraphicUsed by:349
Symbol 349 MovieClipUses:348Used by:350 357 989
Symbol 350 MovieClipUses:349Used by:357
Symbol 351 GraphicUsed by:357
Symbol 352 TextUses:340Used by:357
Symbol 353 GraphicUsed by:357
Symbol 354 EditableTextUses:317Used by:357
Symbol 355 TextUses:304Used by:356
Symbol 356 ButtonUses:303 355 302Used by:357 440 1283
Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen]Uses:292 300 301 306 310 315 316 318 319 335 336 337 338 339 341 342 343 344 345 346 347 350 351 352 349 353 354 356
Symbol 358 GraphicUsed by:359
Symbol 359 MovieClip {PlayerShipGun} [PlayerShipGun]Uses:358
Symbol 360 GraphicUsed by:374
Symbol 361 GraphicUsed by:374
Symbol 362 GraphicUsed by:374
Symbol 363 GraphicUsed by:374
Symbol 364 GraphicUsed by:374
Symbol 365 GraphicUsed by:374
Symbol 366 GraphicUsed by:374
Symbol 367 GraphicUsed by:374
Symbol 368 GraphicUsed by:374
Symbol 369 GraphicUsed by:374
Symbol 370 GraphicUsed by:374
Symbol 371 GraphicUsed by:374
Symbol 372 GraphicUsed by:374
Symbol 373 GraphicUsed by:374
Symbol 374 MovieClip {explosion_2} [explosion_2]Uses:360 361 362 363 364 365 366 367 368 369 370 371 372 373
Symbol 375 BitmapUsed by:376
Symbol 376 GraphicUses:375Used by:377
Symbol 377 MovieClip {ShockwaveLogo} [ShockwaveLogo]Uses:376
Symbol 378 Sound {sfx_explosion1} [sfx_explosion1]
Symbol 379 GraphicUsed by:406
Symbol 380 GraphicUsed by:406
Symbol 381 GraphicUsed by:406
Symbol 382 GraphicUsed by:406
Symbol 383 GraphicUsed by:406
Symbol 384 GraphicUsed by:406
Symbol 385 GraphicUsed by:406
Symbol 386 GraphicUsed by:406
Symbol 387 GraphicUsed by:406
Symbol 388 GraphicUsed by:406
Symbol 389 GraphicUsed by:406
Symbol 390 GraphicUsed by:406
Symbol 391 GraphicUsed by:406
Symbol 392 GraphicUsed by:406
Symbol 393 GraphicUsed by:406
Symbol 394 GraphicUsed by:406
Symbol 395 GraphicUsed by:406
Symbol 396 GraphicUsed by:406
Symbol 397 GraphicUsed by:406
Symbol 398 GraphicUsed by:406
Symbol 399 GraphicUsed by:406
Symbol 400 GraphicUsed by:406
Symbol 401 GraphicUsed by:406
Symbol 402 GraphicUsed by:406
Symbol 403 GraphicUsed by:406
Symbol 404 GraphicUsed by:406
Symbol 405 GraphicUsed by:406
Symbol 406 MovieClip {explosion_3} [explosion_3]Uses:379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
Symbol 407 Sound {sfx_explosion2} [sfx_explosion2]
Symbol 408 Sound {sfx_lazer01} [sfx_lazer01]
Symbol 409 GraphicUsed by:417 424
Symbol 410 GraphicUsed by:417 424
Symbol 411 GraphicUsed by:417
Symbol 412 GraphicUsed by:417
Symbol 413 GraphicUsed by:417
Symbol 414 GraphicUsed by:417
Symbol 415 GraphicUsed by:417
Symbol 416 GraphicUsed by:417
Symbol 417 MovieClip {explosion_1_large} [explosion_1_large]Uses:409 410 411 412 413 414 415 416
Symbol 418 GraphicUsed by:424
Symbol 419 GraphicUsed by:424
Symbol 420 GraphicUsed by:424
Symbol 421 GraphicUsed by:424
Symbol 422 GraphicUsed by:424
Symbol 423 GraphicUsed by:424
Symbol 424 MovieClip {explosion_1} [explosion_1]Uses:409 410 418 419 420 421 422 423
Symbol 425 MovieClip {Lic_All_fla.MB_mouse_3} [Lic_All_fla.MB_mouse_3]Uses:278Used by:1374
Symbol 426 GraphicUsed by:427
Symbol 427 MovieClipUses:426Used by:428
Symbol 428 MovieClip {Weapon04} [Weapon04]Uses:427
Symbol 429 GraphicUsed by:430
Symbol 430 MovieClipUses:429Used by:431
Symbol 431 MovieClip {Weapon05} [Weapon05]Uses:430
Symbol 432 GraphicUsed by:433
Symbol 433 MovieClipUses:432Used by:434
Symbol 434 MovieClip {Weapon06} [Weapon06]Uses:433
Symbol 435 GraphicUsed by:440
Symbol 436 TextUses:304Used by:437
Symbol 437 ButtonUses:303 436 302Used by:440 1283
Symbol 438 FontUsed by:439
Symbol 439 TextUses:438Used by:440
Symbol 440 MovieClip {PauseScreen} [PauseScreen]Uses:435 356 437 439
Symbol 441 GraphicUsed by:442
Symbol 442 MovieClipUses:441Used by:443
Symbol 443 MovieClip {Weapon07} [Weapon07]Uses:442
Symbol 444 GraphicUsed by:460 1255
Symbol 445 GraphicUsed by:460 1255
Symbol 446 GraphicUsed by:460
Symbol 447 GraphicUsed by:460 1255
Symbol 448 GraphicUsed by:460
Symbol 449 GraphicUsed by:460
Symbol 450 GraphicUsed by:460
Symbol 451 GraphicUsed by:460
Symbol 452 GraphicUsed by:460
Symbol 453 GraphicUsed by:460
Symbol 454 GraphicUsed by:460
Symbol 455 GraphicUsed by:460
Symbol 456 GraphicUsed by:460
Symbol 457 GraphicUsed by:460
Symbol 458 GraphicUsed by:460
Symbol 459 GraphicUsed by:460
Symbol 460 MovieClip {Enemy03a} [Enemy03a]Uses:444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
Symbol 461 GraphicUsed by:473
Symbol 462 GraphicUsed by:473
Symbol 463 GraphicUsed by:473
Symbol 464 GraphicUsed by:473
Symbol 465 GraphicUsed by:473
Symbol 466 GraphicUsed by:473
Symbol 467 GraphicUsed by:473
Symbol 468 GraphicUsed by:473
Symbol 469 GraphicUsed by:473
Symbol 470 GraphicUsed by:473
Symbol 471 GraphicUsed by:473
Symbol 472 GraphicUsed by:473
Symbol 473 MovieClip {Enemy03_Med} [Enemy03_Med]Uses:461 462 463 464 465 466 467 468 469 470 471 472
Symbol 474 GraphicUsed by:484
Symbol 475 GraphicUsed by:484
Symbol 476 GraphicUsed by:484
Symbol 477 GraphicUsed by:484
Symbol 478 GraphicUsed by:484
Symbol 479 GraphicUsed by:484
Symbol 480 GraphicUsed by:484
Symbol 481 GraphicUsed by:484
Symbol 482 GraphicUsed by:484
Symbol 483 GraphicUsed by:484
Symbol 484 MovieClip {Enemy06_Boss} [Enemy06_Boss]Uses:474 475 476 477 478 479 480 481 482 483
Symbol 485 GraphicUsed by:498 902
Symbol 486 GraphicUsed by:498 902
Symbol 487 GraphicUsed by:498 902
Symbol 488 GraphicUsed by:498 902
Symbol 489 GraphicUsed by:498 902
Symbol 490 GraphicUsed by:498 902
Symbol 491 GraphicUsed by:498 902
Symbol 492 GraphicUsed by:498 902
Symbol 493 GraphicUsed by:498 902
Symbol 494 GraphicUsed by:498 902
Symbol 495 GraphicUsed by:498 902
Symbol 496 GraphicUsed by:498 902
Symbol 497 GraphicUsed by:498 902
Symbol 498 MovieClipUses:485 486 487 488 489 490 491 492 493 494 495 496 497Used by:499
Symbol 499 MovieClip {TitlePage_fla.bubble_logo3_44} [TitlePage_fla.bubble_logo3_44]Uses:498Used by:902
Symbol 500 GraphicUsed by:508
Symbol 501 GraphicUsed by:508
Symbol 502 GraphicUsed by:508
Symbol 503 GraphicUsed by:508
Symbol 504 GraphicUsed by:508
Symbol 505 GraphicUsed by:508
Symbol 506 GraphicUsed by:508
Symbol 507 GraphicUsed by:508
Symbol 508 MovieClip {Enemy05_Boss} [Enemy05_Boss]Uses:500 501 502 503 76 504 505 506 507
Symbol 509 GraphicUsed by:518
Symbol 510 GraphicUsed by:518
Symbol 511 GraphicUsed by:518
Symbol 512 GraphicUsed by:518
Symbol 513 GraphicUsed by:518
Symbol 514 GraphicUsed by:518
Symbol 515 GraphicUsed by:518
Symbol 516 GraphicUsed by:518
Symbol 517 GraphicUsed by:518
Symbol 518 MovieClip {Enemy05_Med} [Enemy05_Med]Uses:509 510 511 512 76 513 514 515 516 517
Symbol 519 GraphicUsed by:521
Symbol 520 GraphicUsed by:521
Symbol 521 MovieClip {Lic_All_fla.MB_eyes_MB_4} [Lic_All_fla.MB_eyes_MB_4]Uses:519 520Used by:1374
Symbol 522 GraphicUsed by:523
Symbol 523 MovieClipUses:522Used by:524
Symbol 524 MovieClip {Weapon03} [Weapon03]Uses:523
Symbol 525 GraphicUsed by:526 545 611 633
Symbol 526 MovieClipUses:525Used by:545 611 633
Symbol 527 GraphicUsed by:545
Symbol 528 GraphicUsed by:545
Symbol 529 GraphicUsed by:545
Symbol 530 GraphicUsed by:545
Symbol 531 GraphicUsed by:545
Symbol 532 GraphicUsed by:545
Symbol 533 GraphicUsed by:545
Symbol 534 GraphicUsed by:545
Symbol 535 GraphicUsed by:545
Symbol 536 GraphicUsed by:545
Symbol 537 GraphicUsed by:545
Symbol 538 GraphicUsed by:545
Symbol 539 GraphicUsed by:545
Symbol 540 GraphicUsed by:545
Symbol 541 GraphicUsed by:545
Symbol 542 GraphicUsed by:545
Symbol 543 GraphicUsed by:545
Symbol 544 GraphicUsed by:545
Symbol 545 MovieClip {yowFinished} [yowFinished]Uses:526 525 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 SS1
Symbol 546 GraphicUsed by:547
Symbol 547 MovieClipUses:546Used by:548
Symbol 548 MovieClip {Weapon02} [Weapon02]Uses:547
Symbol 549 GraphicUsed by:550
Symbol 550 MovieClipUses:549Used by:551
Symbol 551 MovieClip {Weapon01} [Weapon01]Uses:550
Symbol 552 GraphicUsed by:565
Symbol 553 GraphicUsed by:565
Symbol 554 GraphicUsed by:565
Symbol 555 GraphicUsed by:565
Symbol 556 GraphicUsed by:565
Symbol 557 GraphicUsed by:565
Symbol 558 GraphicUsed by:565
Symbol 559 GraphicUsed by:565
Symbol 560 GraphicUsed by:565
Symbol 561 GraphicUsed by:565
Symbol 562 GraphicUsed by:565
Symbol 563 GraphicUsed by:565
Symbol 564 GraphicUsed by:565
Symbol 565 MovieClip {Enemy02_Med} [Enemy02_Med]Uses:552 553 554 555 556 557 558 559 560 561 562 563 564
Symbol 566 Sound {sfx_splat4} [sfx_splat4]
Symbol 567 GraphicUsed by:574 1206
Symbol 568 GraphicUsed by:574
Symbol 569 GraphicUsed by:574
Symbol 570 GraphicUsed by:574
Symbol 571 ShapeTweeningUsed by:574
Symbol 572 ShapeTweeningUsed by:574
Symbol 573 GraphicUsed by:574
Symbol 574 MovieClip {PlayerDieExplosion} [PlayerDieExplosion]Uses:567 568 569 570 571 572 573
Symbol 575 Sound {sfx_splat5} [sfx_splat5]
Symbol 576 GraphicUsed by:589
Symbol 577 GraphicUsed by:589
Symbol 578 GraphicUsed by:589
Symbol 579 GraphicUsed by:589
Symbol 580 GraphicUsed by:589
Symbol 581 GraphicUsed by:589
Symbol 582 GraphicUsed by:589
Symbol 583 GraphicUsed by:589
Symbol 584 GraphicUsed by:589
Symbol 585 GraphicUsed by:589
Symbol 586 GraphicUsed by:589
Symbol 587 GraphicUsed by:589
Symbol 588 GraphicUsed by:589
Symbol 589 MovieClip {Enemy02a} [Enemy02a]Uses:576 577 578 579 580 581 582 583 584 585 586 587 588
Symbol 590 Sound {sfx_splat2} [sfx_splat2]
Symbol 591 Sound {sfx_splat3} [sfx_splat3]
Symbol 592 Sound {sfx_splat0} [sfx_splat0]
Symbol 593 Sound {sfx_splat1} [sfx_splat1]
Symbol 594 Sound {sfx_explosion01} [sfx_explosion01]
Symbol 595 GraphicUsed by:611
Symbol 596 GraphicUsed by:611
Symbol 597 GraphicUsed by:611
Symbol 598 GraphicUsed by:611
Symbol 599 GraphicUsed by:611
Symbol 600 GraphicUsed by:611
Symbol 601 GraphicUsed by:611
Symbol 602 GraphicUsed by:611
Symbol 603 GraphicUsed by:611
Symbol 604 GraphicUsed by:611
Symbol 605 GraphicUsed by:611
Symbol 606 GraphicUsed by:611
Symbol 607 GraphicUsed by:611
Symbol 608 GraphicUsed by:611
Symbol 609 GraphicUsed by:611
Symbol 610 GraphicUsed by:611
Symbol 611 MovieClip {yowFinished3} [yowFinished3]Uses:526 525 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 SS2
Symbol 612 GraphicUsed by:633
Symbol 613 GraphicUsed by:633
Symbol 614 GraphicUsed by:633
Symbol 615 GraphicUsed by:633
Symbol 616 GraphicUsed by:633
Symbol 617 GraphicUsed by:633
Symbol 618 GraphicUsed by:633
Symbol 619 GraphicUsed by:633
Symbol 620 GraphicUsed by:633
Symbol 621 GraphicUsed by:633
Symbol 622 GraphicUsed by:633
Symbol 623 GraphicUsed by:633
Symbol 624 GraphicUsed by:633
Symbol 625 GraphicUsed by:633
Symbol 626 GraphicUsed by:633
Symbol 627 GraphicUsed by:633
Symbol 628 GraphicUsed by:633
Symbol 629 GraphicUsed by:633
Symbol 630 GraphicUsed by:633
Symbol 631 GraphicUsed by:633
Symbol 632 GraphicUsed by:633
Symbol 633 MovieClip {yowFinished2} [yowFinished2]Uses:526 525 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 SS3
Symbol 634 BitmapUsed by:635
Symbol 635 GraphicUses:634Used by:638
Symbol 636 BitmapUsed by:637
Symbol 637 GraphicUses:636Used by:638
Symbol 638 MovieClip {Lic_All_fla.MB_Explode_5} [Lic_All_fla.MB_Explode_5]Uses:635 637Used by:1374
Symbol 639 GraphicUsed by:745
Symbol 640 GraphicUsed by:745
Symbol 641 GraphicUsed by:642
Symbol 642 MovieClipUses:641Used by:745
Symbol 643 GraphicUsed by:644
Symbol 644 MovieClipUses:643Used by:745
Symbol 645 GraphicUsed by:646
Symbol 646 MovieClipUses:645Used by:745
Symbol 647 GraphicUsed by:745
Symbol 648 FontUsed by:649 667 681 685
Symbol 649 TextUses:648Used by:745
Symbol 650 GraphicUsed by:651 654
Symbol 651 MovieClipUses:650Used by:654
Symbol 652 FontUsed by:653 1155
Symbol 653 TextUses:652Used by:654
Symbol 654 ButtonUses:651 653 650Used by:745
Symbol 655 SoundUsed by:745
Symbol 656 GraphicUsed by:745
Symbol 657 GraphicUsed by:658
Symbol 658 MovieClipUses:657Used by:745
Symbol 659 GraphicUsed by:660
Symbol 660 MovieClipUses:659Used by:745
Symbol 661 GraphicUsed by:745
Symbol 662 GraphicUsed by:745
Symbol 663 GraphicUsed by:664
Symbol 664 MovieClipUses:663Used by:745
Symbol 665 SoundUsed by:745
Symbol 666 GraphicUsed by:745
Symbol 667 TextUses:648Used by:745
Symbol 668 GraphicUsed by:745
Symbol 669 GraphicUsed by:745
Symbol 670 GraphicUsed by:671
Symbol 671 MovieClipUses:670Used by:745
Symbol 672 GraphicUsed by:745
Symbol 673 GraphicUsed by:745
Symbol 674 GraphicUsed by:675
Symbol 675 MovieClipUses:674Used by:745
Symbol 676 GraphicUsed by:677
Symbol 677 MovieClipUses:676Used by:745
Symbol 678 GraphicUsed by:679
Symbol 679 MovieClipUses:678Used by:745
Symbol 680 GraphicUsed by:682 686
Symbol 681 TextUses:648Used by:682
Symbol 682 MovieClipUses:680 681Used by:745
Symbol 683 GraphicUsed by:745
Symbol 684 SoundUsed by:745
Symbol 685 TextUses:648Used by:686
Symbol 686 MovieClipUses:680 685Used by:745
Symbol 687 SoundUsed by:745
Symbol 688 GraphicUsed by:698
Symbol 689 GraphicUsed by:698
Symbol 690 GraphicUsed by:698
Symbol 691 GraphicUsed by:698
Symbol 692 GraphicUsed by:698
Symbol 693 GraphicUsed by:698
Symbol 694 GraphicUsed by:698
Symbol 695 GraphicUsed by:698
Symbol 696 GraphicUsed by:698
Symbol 697 GraphicUsed by:698
Symbol 698 MovieClipUses:688 689 690 691 692 693 694 695 696 697Used by:716 745
Symbol 699 GraphicUsed by:710
Symbol 700 GraphicUsed by:710
Symbol 701 GraphicUsed by:710
Symbol 702 GraphicUsed by:710
Symbol 703 GraphicUsed by:710
Symbol 704 GraphicUsed by:710
Symbol 705 GraphicUsed by:710
Symbol 706 GraphicUsed by:710
Symbol 707 GraphicUsed by:710
Symbol 708 GraphicUsed by:710
Symbol 709 GraphicUsed by:710
Symbol 710 MovieClipUses:699 700 701 702 703 704 705 706 707 708 709Used by:745
Symbol 711 GraphicUsed by:745
Symbol 712 GraphicUsed by:745
Symbol 713 GraphicUsed by:745
Symbol 714 GraphicUsed by:716
Symbol 715 GraphicUsed by:716
Symbol 716 MovieClipUses:714 698 715Used by:745
Symbol 717 GraphicUsed by:745
Symbol 718 GraphicUsed by:727
Symbol 719 GraphicUsed by:727
Symbol 720 GraphicUsed by:727
Symbol 721 GraphicUsed by:727
Symbol 722 GraphicUsed by:727
Symbol 723 GraphicUsed by:727
Symbol 724 GraphicUsed by:727
Symbol 725 GraphicUsed by:727
Symbol 726 GraphicUsed by:727
Symbol 727 MovieClipUses:718 719 720 721 722 723 724 725 726Used by:745
Symbol 728 GraphicUsed by:745
Symbol 729 SoundUsed by:745
Symbol 730 GraphicUsed by:731
Symbol 731 MovieClipUses:730Used by:745
Symbol 732 GraphicUsed by:745
Symbol 733 GraphicUsed by:745
Symbol 734 GraphicUsed by:735
Symbol 735 MovieClipUses:734Used by:745
Symbol 736 GraphicUsed by:745
Symbol 737 GraphicUsed by:738
Symbol 738 MovieClipUses:737Used by:745
Symbol 739 GraphicUsed by:740
Symbol 740 MovieClipUses:739Used by:745
Symbol 741 GraphicUsed by:745
Symbol 742 SoundUsed by:745
Symbol 743 GraphicUsed by:744
Symbol 744 MovieClipUses:743Used by:745
Symbol 745 MovieClip {comicbook_fla.intro_comicBook_1} [comicbook_fla.intro_comicBook_1]Uses:639 640 642 644 646 647 649 654 187 655 656 658 660 661 662 664 665 666 667 668 669 671 672 673 675 677 679 682 683 684 686 687 698 710 711 712 713 716 717 727 728 729 731 732 733 735 736 738 740 741 742 744Used by:746
Symbol 746 MovieClip {ComicBookIntro} [ComicBookIntro]Uses:745
Symbol 747 GraphicUsed by:757
Symbol 748 GraphicUsed by:757
Symbol 749 GraphicUsed by:757
Symbol 750 GraphicUsed by:757
Symbol 751 GraphicUsed by:757
Symbol 752 GraphicUsed by:757
Symbol 753 GraphicUsed by:757
Symbol 754 GraphicUsed by:757
Symbol 755 GraphicUsed by:757
Symbol 756 GraphicUsed by:757
Symbol 757 MovieClip {Enemy06_Med} [Enemy06_Med]Uses:747 748 749 750 751 752 753 754 755 756
Symbol 758 GraphicUsed by:787
Symbol 759 FontUsed by:760 774 776 778 780 782 784 786
Symbol 760 TextUses:759Used by:787
Symbol 761 GraphicUsed by:766
Symbol 762 GraphicUsed by:763
Symbol 763 MovieClipUses:762Used by:766
Symbol 764 GraphicUsed by:765
Symbol 765 MovieClipUses:764Used by:766
Symbol 766 MovieClipUses:761 763 765Used by:787
Symbol 767 FontUsed by:768 769 770 790
Symbol 768 TextUses:767Used by:787
Symbol 769 TextUses:767Used by:787
Symbol 770 TextUses:767Used by:787
Symbol 771 GraphicUsed by:772
Symbol 772 MovieClipUses:771Used by:787
Symbol 773 GraphicUsed by:787
Symbol 774 TextUses:759Used by:787
Symbol 775 GraphicUsed by:787
Symbol 776 TextUses:759Used by:787
Symbol 777 GraphicUsed by:787
Symbol 778 TextUses:759Used by:787
Symbol 779 GraphicUsed by:787
Symbol 780 TextUses:759Used by:787
Symbol 781 GraphicUsed by:787
Symbol 782 TextUses:759Used by:787
Symbol 783 GraphicUsed by:787
Symbol 784 TextUses:759Used by:787
Symbol 785 GraphicUsed by:787
Symbol 786 TextUses:759Used by:787
Symbol 787 MovieClip {selectButton} [selectButton]Uses:758 760 766 768 769 770 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786Used by:791
Symbol 788 GraphicUsed by:791
Symbol 789 GraphicUsed by:791
Symbol 790 TextUses:767Used by:791
Symbol 791 MovieClip {levelSelect} [levelSelect]Uses:788 787 789 790
Symbol 792 GraphicUsed by:794
Symbol 793 GraphicUsed by:794
Symbol 794 MovieClipUses:792 313 793Used by:797
Symbol 795 GraphicUsed by:796
Symbol 796 MovieClipUses:795Used by:797
Symbol 797 MovieClip {daveSmartAnim} [daveSmartAnim]Uses:794 796
Symbol 798 GraphicUsed by:825
Symbol 799 GraphicUsed by:825
Symbol 800 GraphicUsed by:825
Symbol 801 GraphicUsed by:825
Symbol 802 GraphicUsed by:825
Symbol 803 GraphicUsed by:825
Symbol 804 GraphicUsed by:825
Symbol 805 GraphicUsed by:825
Symbol 806 GraphicUsed by:825
Symbol 807 GraphicUsed by:825
Symbol 808 GraphicUsed by:825
Symbol 809 GraphicUsed by:825
Symbol 810 GraphicUsed by:825
Symbol 811 GraphicUsed by:825
Symbol 812 GraphicUsed by:825
Symbol 813 GraphicUsed by:825
Symbol 814 GraphicUsed by:825
Symbol 815 GraphicUsed by:825
Symbol 816 GraphicUsed by:825
Symbol 817 GraphicUsed by:825
Symbol 818 GraphicUsed by:825
Symbol 819 GraphicUsed by:825
Symbol 820 GraphicUsed by:825
Symbol 821 GraphicUsed by:825
Symbol 822 GraphicUsed by:825
Symbol 823 GraphicUsed by:825
Symbol 824 GraphicUsed by:825
Symbol 825 MovieClip {explosion_3_large} [explosion_3_large]Uses:798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
Symbol 826 GraphicUsed by:844
Symbol 827 GraphicUsed by:844
Symbol 828 GraphicUsed by:844
Symbol 829 GraphicUsed by:844
Symbol 830 GraphicUsed by:844
Symbol 831 GraphicUsed by:844
Symbol 832 GraphicUsed by:844
Symbol 833 GraphicUsed by:844
Symbol 834 GraphicUsed by:844
Symbol 835 GraphicUsed by:844
Symbol 836 GraphicUsed by:844
Symbol 837 GraphicUsed by:844
Symbol 838 GraphicUsed by:844
Symbol 839 GraphicUsed by:844
Symbol 840 GraphicUsed by:844
Symbol 841 GraphicUsed by:844
Symbol 842 GraphicUsed by:844
Symbol 843 GraphicUsed by:844
Symbol 844 MovieClip {Enemy01a} [Enemy01a]Uses:826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843
Symbol 845 GraphicUsed by:846 864
Symbol 846 MovieClipUses:845Used by:864
Symbol 847 FontUsed by:848
Symbol 848 TextUses:847Used by:849 864
Symbol 849 MovieClipUses:848Used by:864
Symbol 850 GraphicUsed by:851 864
Symbol 851 MovieClipUses:850Used by:864
Symbol 852 GraphicUsed by:853 864
Symbol 853 MovieClipUses:852Used by:864
Symbol 854 GraphicUsed by:855 864
Symbol 855 MovieClipUses:854Used by:864
Symbol 856 GraphicUsed by:857 864
Symbol 857 MovieClipUses:856Used by:864
Symbol 858 GraphicUsed by:859
Symbol 859 MovieClipUses:858Used by:860 864
Symbol 860 MovieClipUses:859Used by:864
Symbol 861 GraphicUsed by:862
Symbol 862 MovieClipUses:861Used by:864
Symbol 863 GraphicUsed by:864
Symbol 864 ButtonUses:846 849 851 853 855 857 860 859 862 845 848 850 852 854 856 863Used by:918
Symbol 865 GraphicUsed by:873 875
Symbol 866 FontUsed by:867 869 870 871
Symbol 867 TextUses:866Used by:873 875
Symbol 868 GraphicUsed by:873 875
Symbol 869 TextUses:866Used by:873 875
Symbol 870 TextUses:866Used by:873 875
Symbol 871 TextUses:866Used by:873 875
Symbol 872 GraphicUsed by:873 875
Symbol 873 MovieClipUses:865 867 868 869 870 871 872Used by:875
Symbol 874 GraphicUsed by:875
Symbol 875 Button {AGingameButton2} [AGingameButton2]Uses:873 874 865 867 868 869 870 871 872Used by:918
Symbol 876 GraphicUsed by:877
Symbol 877 ButtonUses:876Used by:918
Symbol 878 GraphicUsed by:886
Symbol 879 BitmapUsed by:880
Symbol 880 GraphicUses:879Used by:881 886
Symbol 881 MovieClipUses:880Used by:886
Symbol 882 GraphicUsed by:886
Symbol 883 GraphicUsed by:884 886
Symbol 884 MovieClipUses:883Used by:886
Symbol 885 GraphicUsed by:886
Symbol 886 ButtonUses:878 881 882 884 885 880 883Used by:918
Symbol 887 BitmapUsed by:888 900
Symbol 888 GraphicUses:887Used by:902
Symbol 889 GraphicUsed by:902
Symbol 890 GraphicUsed by:902
Symbol 891 GraphicUsed by:902
Symbol 892 GraphicUsed by:902
Symbol 893 GraphicUsed by:902
Symbol 894 GraphicUsed by:902
Symbol 895 GraphicUsed by:902
Symbol 896 GraphicUsed by:902
Symbol 897 GraphicUsed by:902
Symbol 898 GraphicUsed by:902
Symbol 899 GraphicUsed by:902
Symbol 900 GraphicUses:887Used by:902
Symbol 901 GraphicUsed by:902
Symbol 902 ButtonUses:888 499 889 890 891 892 893 894 895 896 897 898 899 900 901 485 486 487 488 489 490 491 492 493 494 495 496 497Used by:918
Symbol 903 GraphicUsed by:906
Symbol 904 GraphicUsed by:906
Symbol 905 GraphicUsed by:906
Symbol 906 ButtonUses:903 904 905Used by:918
Symbol 907 BitmapUsed by:908
Symbol 908 GraphicUses:907Used by:909
Symbol 909 ButtonUses:908Used by:918
Symbol 910 BitmapUsed by:911
Symbol 911 GraphicUses:910Used by:912
Symbol 912 ButtonUses:911Used by:918
Symbol 913 GraphicUsed by:915
Symbol 914 GraphicUsed by:915
Symbol 915 ButtonUses:913 914Used by:918
Symbol 916 GraphicUsed by:917
Symbol 917 ButtonUses:916Used by:918
Symbol 918 MovieClip {MainLogo} [MainLogo]Uses:864 875 877 886 902 906 909 912 915 917Used by:1367
Symbol 919 GraphicUsed by:926
Symbol 920 GraphicUsed by:926
Symbol 921 GraphicUsed by:926
Symbol 922 GraphicUsed by:926
Symbol 923 GraphicUsed by:926
Symbol 924 GraphicUsed by:926
Symbol 925 GraphicUsed by:926
Symbol 926 MovieClip {Enemy04_Boss} [Enemy04_Boss]Uses:919 920 921 922 67 923 924 925
Symbol 927 GraphicUsed by:936
Symbol 928 GraphicUsed by:936
Symbol 929 GraphicUsed by:936
Symbol 930 GraphicUsed by:936
Symbol 931 GraphicUsed by:936
Symbol 932 GraphicUsed by:936 1199
Symbol 933 GraphicUsed by:936
Symbol 934 GraphicUsed by:936
Symbol 935 GraphicUsed by:936
Symbol 936 MovieClip {Enemy08_Med} [Enemy08_Med]Uses:927 928 929 930 931 932 933 934 935
Symbol 937 ShapeTweeningUsed by:943
Symbol 938 ShapeTweeningUsed by:943
Symbol 939 ShapeTweeningUsed by:943
Symbol 940 ShapeTweeningUsed by:943
Symbol 941 ShapeTweeningUsed by:943
Symbol 942 GraphicUsed by:943
Symbol 943 MovieClip {EnemyWeapon01} [EnemyWeapon01]Uses:937 938 939 940 941 942
Symbol 944 GraphicUsed by:951
Symbol 945 GraphicUsed by:951
Symbol 946 ShapeTweeningUsed by:951
Symbol 947 GraphicUsed by:951
Symbol 948 FontUsed by:949 957 961 972
Symbol 949 TextUses:948Used by:951
Symbol 950 GraphicUsed by:951
Symbol 951 MovieClipUses:944 945 946 947 949 950Used by:975
Symbol 952 GraphicUsed by:954
Symbol 953 EditableTextUses:317 1176Used by:954
Symbol 954 MovieClipUses:952 953Used by:975
Symbol 955 GraphicUsed by:958
Symbol 956 EditableTextUses:317 1176Used by:958
Symbol 957 TextUses:948Used by:958
Symbol 958 MovieClipUses:955 956 957Used by:975
Symbol 959 GraphicUsed by:962
Symbol 960 EditableTextUses:317 1176Used by:962
Symbol 961 TextUses:948Used by:962
Symbol 962 MovieClipUses:959 960 961Used by:975
Symbol 963 GraphicUsed by:966
Symbol 964 GraphicUsed by:966
Symbol 965 GraphicUsed by:966
Symbol 966 ButtonUses:963 964 965Used by:967
Symbol 967 MovieClipUses:966Used by:975
Symbol 968 GraphicUsed by:974
Symbol 969 GraphicUsed by:974
Symbol 970 ShapeTweeningUsed by:974
Symbol 971 GraphicUsed by:974
Symbol 972 TextUses:948Used by:974
Symbol 973 GraphicUsed by:974
Symbol 974 MovieClipUses:968 969 970 971 972 973Used by:975
Symbol 975 MovieClip {hud} [hud]Uses:951 954 958 962 967 974
Symbol 976 GraphicUsed by:988
Symbol 977 GraphicUsed by:988
Symbol 978 GraphicUsed by:988
Symbol 979 GraphicUsed by:988
Symbol 980 GraphicUsed by:988
Symbol 981 GraphicUsed by:988
Symbol 982 GraphicUsed by:988
Symbol 983 GraphicUsed by:988
Symbol 984 GraphicUsed by:988
Symbol 985 GraphicUsed by:988
Symbol 986 GraphicUsed by:988
Symbol 987 GraphicUsed by:988
Symbol 988 MovieClip {EnemyRick} [EnemyRick]Uses:976 977 978 979 980 981 982 983 984 985 986 987
Symbol 989 MovieClip {Antibody} [Antibody]Uses:349
Symbol 990 GraphicUsed by:997
Symbol 991 GraphicUsed by:997
Symbol 992 GraphicUsed by:997
Symbol 993 GraphicUsed by:997
Symbol 994 GraphicUsed by:997
Symbol 995 GraphicUsed by:997
Symbol 996 GraphicUsed by:997
Symbol 997 MovieClip {Enemy04_Med} [Enemy04_Med]Uses:990 991 992 993 67 994 995 996
Symbol 998 GraphicUsed by:1014
Symbol 999 GraphicUsed by:1014
Symbol 1000 SoundUsed by:1014
Symbol 1001 SoundUsed by:1014
Symbol 1002 GraphicUsed by:1014
Symbol 1003 GraphicUsed by:1004
Symbol 1004 MovieClipUses:1003Used by:1014
Symbol 1005 SoundUsed by:1014
Symbol 1006 SoundUsed by:1014
Symbol 1007 SoundUsed by:1014
Symbol 1008 GraphicUsed by:1014
Symbol 1009 GraphicUsed by:1010
Symbol 1010 ButtonUses:1009Used by:1014
Symbol 1011 GraphicUsed by:1014
Symbol 1012 SoundUsed by:1014
Symbol 1013 SoundUsed by:1014
Symbol 1014 MovieClip {Intro_ArmorGames} [Intro_ArmorGames]Uses:998 999 1000 1001 1002 1004 1005 1006 1007 1008 1010 1011 1012 1013
Symbol 1015 GraphicUsed by:1020 1068
Symbol 1016 FontUsed by:1017
Symbol 1017 TextUses:1016Used by:1019
Symbol 1018 GraphicUsed by:1019
Symbol 1019 ButtonUses:1017 1018Used by:1020
Symbol 1020 MovieClip {SitelockedScreen} [SitelockedScreen]Uses:1015 1019
Symbol 1021 Sound {sfx_pickup} [sfx_pickup]
Symbol 1022 GraphicUsed by:1031
Symbol 1023 GraphicUsed by:1031
Symbol 1024 GraphicUsed by:1031
Symbol 1025 GraphicUsed by:1031
Symbol 1026 GraphicUsed by:1031
Symbol 1027 GraphicUsed by:1031
Symbol 1028 GraphicUsed by:1031
Symbol 1029 GraphicUsed by:1031
Symbol 1030 GraphicUsed by:1031
Symbol 1031 MovieClip {levelBackgrounds} [levelBackgrounds]Uses:1022 1023 1024 1025 1026 1027 1028 1029 1030
Symbol 1032 GraphicUsed by:1041
Symbol 1033 GraphicUsed by:1041
Symbol 1034 GraphicUsed by:1041
Symbol 1035 GraphicUsed by:1041
Symbol 1036 GraphicUsed by:1041
Symbol 1037 GraphicUsed by:1041
Symbol 1038 GraphicUsed by:1041
Symbol 1039 GraphicUsed by:1041
Symbol 1040 GraphicUsed by:1041
Symbol 1041 MovieClip {Enemy08a} [Enemy08a]Uses:1032 1033 1034 1035 1036 1037 1038 1039 1040
Symbol 1042 GraphicUsed by:1053 1080
Symbol 1043 GraphicUsed by:1053
Symbol 1044 GraphicUsed by:1053
Symbol 1045 GraphicUsed by:1053
Symbol 1046 GraphicUsed by:1053
Symbol 1047 GraphicUsed by:1053
Symbol 1048 GraphicUsed by:1053
Symbol 1049 GraphicUsed by:1053
Symbol 1050 GraphicUsed by:1053
Symbol 1051 GraphicUsed by:1053
Symbol 1052 GraphicUsed by:1053
Symbol 1053 MovieClip {Enemy07_Boss} [Enemy07_Boss]Uses:1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
Symbol 1054 Sound {sfx_readytoplay} [sfx_readytoplay]
Symbol 1055 GraphicUsed by:1056
Symbol 1056 MovieClipUses:1055Used by:1068
Symbol 1057 GraphicUsed by:1061
Symbol 1058 GraphicUsed by:1061
Symbol 1059 GraphicUsed by:1061
Symbol 1060 GraphicUsed by:1061
Symbol 1061 ButtonUses:1057 1058 1059 1060Used by:1068
Symbol 1062 GraphicUsed by:1063
Symbol 1063 MovieClipUses:1062Used by:1067
Symbol 1064 FontUsed by:1065
Symbol 1065 TextUses:1064Used by:1067
Symbol 1066 GraphicUsed by:1067
Symbol 1067 MovieClipUses:1063 1065 1066Used by:1068
Symbol 1068 MovieClip {CPMStarLoaderScreen} [CPMStarLoaderScreen]Uses:1015 1056 1061 1067
Symbol 1069 GraphicUsed by:1080
Symbol 1070 GraphicUsed by:1080
Symbol 1071 GraphicUsed by:1080
Symbol 1072 GraphicUsed by:1080
Symbol 1073 GraphicUsed by:1080
Symbol 1074 GraphicUsed by:1080
Symbol 1075 GraphicUsed by:1080
Symbol 1076 GraphicUsed by:1080
Symbol 1077 GraphicUsed by:1080
Symbol 1078 GraphicUsed by:1080
Symbol 1079 GraphicUsed by:1080
Symbol 1080 MovieClip {Enemy07_Med} [Enemy07_Med]Uses:1042 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
Symbol 1081 Sound {sfx_pickups} [sfx_pickups]
Symbol 1082 GraphicUsed by:1093
Symbol 1083 GraphicUsed by:1093
Symbol 1084 GraphicUsed by:1093
Symbol 1085 GraphicUsed by:1093
Symbol 1086 GraphicUsed by:1093
Symbol 1087 GraphicUsed by:1093
Symbol 1088 GraphicUsed by:1093
Symbol 1089 GraphicUsed by:1093
Symbol 1090 GraphicUsed by:1093
Symbol 1091 GraphicUsed by:1093
Symbol 1092 GraphicUsed by:1093
Symbol 1093 MovieClip {Enemy07a} [Enemy07a]Uses:1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
Symbol 1094 GraphicUsed by:1095
Symbol 1095 MovieClip {PlayerShipGun1} [PlayerShipGun1]Uses:1094
Symbol 1096 Sound {sfx_splatboss} [sfx_splatboss]
Symbol 1097 GraphicUsed by:1192
Symbol 1098 GraphicUsed by:1192
Symbol 1099 GraphicUsed by:1192
Symbol 1100 GraphicUsed by:1113
Symbol 1101 GraphicUsed by:1113
Symbol 1102 GraphicUsed by:1113
Symbol 1103 GraphicUsed by:1113
Symbol 1104 GraphicUsed by:1113
Symbol 1105 GraphicUsed by:1113
Symbol 1106 GraphicUsed by:1113
Symbol 1107 GraphicUsed by:1113
Symbol 1108 GraphicUsed by:1113
Symbol 1109 GraphicUsed by:1113
Symbol 1110 GraphicUsed by:1113
Symbol 1111 GraphicUsed by:1113
Symbol 1112 GraphicUsed by:1113
Symbol 1113 MovieClipUses:1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112Used by:1192
Symbol 1114 GraphicUsed by:1132
Symbol 1115 GraphicUsed by:1132
Symbol 1116 GraphicUsed by:1132
Symbol 1117 GraphicUsed by:1132
Symbol 1118 GraphicUsed by:1132
Symbol 1119 GraphicUsed by:1132
Symbol 1120 GraphicUsed by:1132
Symbol 1121 GraphicUsed by:1132
Symbol 1122 GraphicUsed by:1132
Symbol 1123 GraphicUsed by:1132
Symbol 1124 GraphicUsed by:1132
Symbol 1125 GraphicUsed by:1132
Symbol 1126 GraphicUsed by:1132
Symbol 1127 GraphicUsed by:1132
Symbol 1128 GraphicUsed by:1132
Symbol 1129 GraphicUsed by:1132
Symbol 1130 GraphicUsed by:1132
Symbol 1131 GraphicUsed by:1132
Symbol 1132 MovieClipUses:1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131Used by:1192
Symbol 1133 GraphicUsed by:1134
Symbol 1134 MovieClipUses:1133Used by:1135
Symbol 1135 MovieClipUses:1134Used by:1192
Symbol 1136 FontUsed by:1137 1138 1144 1145 1150 1152 1159 1161 1164 1166 1169 1171 1174 1180 1182 1187 1189 1191
Symbol 1137 TextUses:1136Used by:1192
Symbol 1138 TextUses:1136Used by:1192
Symbol 1139 GraphicUsed by:1143
Symbol 1140 GraphicUsed by:1141
Symbol 1141 MovieClipUses:1140Used by:1143
Symbol 1142 GraphicUsed by:1143
Symbol 1143 MovieClipUses:1139 1141 1142Used by:1192
Symbol 1144 TextUses:1136Used by:1192
Symbol 1145 TextUses:1136Used by:1192
Symbol 1146 GraphicUsed by:1147
Symbol 1147 MovieClipUses:1146Used by:1192
Symbol 1148 GraphicUsed by:1149
Symbol 1149 MovieClipUses:1148Used by:1192
Symbol 1150 TextUses:1136Used by:1192
Symbol 1151 GraphicUsed by:1192
Symbol 1152 TextUses:1136Used by:1192
Symbol 1153 GraphicUsed by:1154 1156
Symbol 1154 MovieClipUses:1153Used by:1156
Symbol 1155 TextUses:652Used by:1156
Symbol 1156 ButtonUses:1154 1155 1153Used by:1192
Symbol 1157 GraphicUsed by:1192
Symbol 1158 GraphicUsed by:1192
Symbol 1159 TextUses:1136Used by:1192
Symbol 1160 GraphicUsed by:1192
Symbol 1161 TextUses:1136Used by:1192
Symbol 1162 GraphicUsed by:1192
Symbol 1163 GraphicUsed by:1192
Symbol 1164 TextUses:1136Used by:1192
Symbol 1165 GraphicUsed by:1192
Symbol 1166 TextUses:1136Used by:1192
Symbol 1167 GraphicUsed by:1192
Symbol 1168 GraphicUsed by:1192
Symbol 1169 TextUses:1136Used by:1192
Symbol 1170 GraphicUsed by:1192
Symbol 1171 TextUses:1136Used by:1192
Symbol 1172 GraphicUsed by:1192
Symbol 1173 GraphicUsed by:1192
Symbol 1174 TextUses:1136Used by:1192
Symbol 1175 GraphicUsed by:1192
Symbol 1176 FontUsed by:346 953 956 960 1177 1185
Symbol 1177 TextUses:1176Used by:1192
Symbol 1178 GraphicUsed by:1192
Symbol 1179 GraphicUsed by:1192
Symbol 1180 TextUses:1136Used by:1192
Symbol 1181 GraphicUsed by:1192
Symbol 1182 TextUses:1136Used by:1192
Symbol 1183 GraphicUsed by:1192
Symbol 1184 GraphicUsed by:1192
Symbol 1185 TextUses:1176Used by:1192
Symbol 1186 GraphicUsed by:1192
Symbol 1187 TextUses:1136Used by:1192
Symbol 1188 GraphicUsed by:1192
Symbol 1189 TextUses:1136Used by:1192
Symbol 1190 GraphicUsed by:1192
Symbol 1191 TextUses:1136Used by:1192
Symbol 1192 MovieClip {betweenStages} [betweenStages]Uses:1097 1098 1099 1113 1132 1135 1137 1138 1143 1144 1145 1147 1149 1150 1151 1152 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
Symbol 1193 GraphicUsed by:1199
Symbol 1194 GraphicUsed by:1199
Symbol 1195 GraphicUsed by:1199
Symbol 1196 GraphicUsed by:1199
Symbol 1197 GraphicUsed by:1199
Symbol 1198 GraphicUsed by:1199
Symbol 1199 MovieClip {Enemy08_Boss} [Enemy08_Boss]Uses:1193 1194 1195 932 1196 1197 1198
Symbol 1200 GraphicUsed by:1206
Symbol 1201 GraphicUsed by:1206
Symbol 1202 GraphicUsed by:1206
Symbol 1203 ShapeTweeningUsed by:1206
Symbol 1204 ShapeTweeningUsed by:1206
Symbol 1205 GraphicUsed by:1206
Symbol 1206 MovieClip {PlayerHitExplosion} [PlayerHitExplosion]Uses:1200 567 1201 1202 1203 1204 1205
Symbol 1207 ShapeTweeningUsed by:1209
Symbol 1208 GraphicUsed by:1209
Symbol 1209 MovieClip {Stars} [Stars]Uses:1207 1208
Symbol 1210 Sound {sfx_bostin} [sfx_bostin]
Symbol 1211 GraphicUsed by:1221
Symbol 1212 GraphicUsed by:1221
Symbol 1213 GraphicUsed by:1221
Symbol 1214 GraphicUsed by:1221
Symbol 1215 GraphicUsed by:1221
Symbol 1216 GraphicUsed by:1221
Symbol 1217 GraphicUsed by:1221
Symbol 1218 GraphicUsed by:1221
Symbol 1219 GraphicUsed by:1221
Symbol 1220 GraphicUsed by:1221
Symbol 1221 MovieClip {Enemy06a} [Enemy06a]Uses:1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
Symbol 1222 Sound {Tune01} [Tune01]
Symbol 1223 Sound {sfx_tear} [sfx_tear]
Symbol 1224 GraphicUsed by:1242
Symbol 1225 GraphicUsed by:1242
Symbol 1226 GraphicUsed by:1242
Symbol 1227 GraphicUsed by:1242
Symbol 1228 GraphicUsed by:1242
Symbol 1229 GraphicUsed by:1242
Symbol 1230 GraphicUsed by:1242
Symbol 1231 GraphicUsed by:1242
Symbol 1232 GraphicUsed by:1242
Symbol 1233 GraphicUsed by:1242
Symbol 1234 GraphicUsed by:1242
Symbol 1235 GraphicUsed by:1242
Symbol 1236 GraphicUsed by:1242
Symbol 1237 GraphicUsed by:1242
Symbol 1238 GraphicUsed by:1242
Symbol 1239 GraphicUsed by:1242
Symbol 1240 GraphicUsed by:1242
Symbol 1241 GraphicUsed by:1242
Symbol 1242 MovieClip {Enemy01_Med} [Enemy01_Med]Uses:1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
Symbol 1243 GraphicUsed by:1245
Symbol 1244 GraphicUsed by:1245
Symbol 1245 MovieClip {rick} [rick]Uses:1243 1244
Symbol 1246 GraphicUsed by:1255
Symbol 1247 GraphicUsed by:1255
Symbol 1248 GraphicUsed by:1255
Symbol 1249 GraphicUsed by:1255
Symbol 1250 GraphicUsed by:1255
Symbol 1251 GraphicUsed by:1255
Symbol 1252 GraphicUsed by:1255
Symbol 1253 GraphicUsed by:1255
Symbol 1254 GraphicUsed by:1255
Symbol 1255 MovieClip {Enemy03_Boss} [Enemy03_Boss]Uses:444 445 1246 447 1247 1248 1249 1250 1251 1252 1253 1254
Symbol 1256 GraphicUsed by:1283
Symbol 1257 GraphicUsed by:1278
Symbol 1258 GraphicUsed by:1259 1277
Symbol 1259 MovieClipUses:1258Used by:1277
Symbol 1260 GraphicUsed by:1261
Symbol 1261 MovieClipUses:1260Used by:1263
Symbol 1262 GraphicUsed by:1263
Symbol 1263 MovieClipUses:1261 1262Used by:1277
Symbol 1264 GraphicUsed by:1277
Symbol 1265 GraphicUsed by:1275
Symbol 1266 GraphicUsed by:1275
Symbol 1267 GraphicUsed by:1275
Symbol 1268 GraphicUsed by:1275
Symbol 1269 GraphicUsed by:1275
Symbol 1270 GraphicUsed by:1275
Symbol 1271 GraphicUsed by:1275
Symbol 1272 GraphicUsed by:1275
Symbol 1273 GraphicUsed by:1275
Symbol 1274 GraphicUsed by:1275
Symbol 1275 MovieClipUses:1265 1266 1267 1268 1269 1270 1271 1272 1273 1274Used by:1277
Symbol 1276 GraphicUsed by:1277
Symbol 1277 MovieClipUses:1259 1263 1264 1258 1275 1276Used by:1278
Symbol 1278 MovieClipUses:1257 295 297 299 1277Used by:1283
Symbol 1279 GraphicUsed by:1283
Symbol 1280 TextUses:340Used by:1283
Symbol 1281 GraphicUsed by:1283
Symbol 1282 TextUses:340Used by:1283
Symbol 1283 MovieClip {gameOverScreen} [gameOverScreen]Uses:1256 1278 356 437 1279 1280 1281 1282
Symbol 1284 GraphicUsed by:1297
Symbol 1285 GraphicUsed by:1297
Symbol 1286 GraphicUsed by:1297
Symbol 1287 GraphicUsed by:1297
Symbol 1288 GraphicUsed by:1297
Symbol 1289 GraphicUsed by:1297
Symbol 1290 GraphicUsed by:1297
Symbol 1291 GraphicUsed by:1297
Symbol 1292 GraphicUsed by:1297
Symbol 1293 GraphicUsed by:1297
Symbol 1294 GraphicUsed by:1297
Symbol 1295 GraphicUsed by:1297
Symbol 1296 GraphicUsed by:1297
Symbol 1297 MovieClipUses:1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296Used by:1298
Symbol 1298 MovieClip {Lic_All_fla.bubble_logo3_32} [Lic_All_fla.bubble_logo3_32]Uses:1297
Symbol 1299 GraphicUsed by:1367
Symbol 1300 GraphicUsed by:1310
Symbol 1301 GraphicUsed by:1310
Symbol 1302 GraphicUsed by:1310
Symbol 1303 GraphicUsed by:1310
Symbol 1304 GraphicUsed by:1310
Symbol 1305 GraphicUsed by:1310
Symbol 1306 GraphicUsed by:1310
Symbol 1307 GraphicUsed by:1310
Symbol 1308 GraphicUsed by:1310
Symbol 1309 GraphicUsed by:1310
Symbol 1310 MovieClipUses:1300 1301 1302 1303 1304 1305 1306 1307 1308 1309Used by:1367
Symbol 1311 GraphicUsed by:1322
Symbol 1312 GraphicUsed by:1322
Symbol 1313 GraphicUsed by:1322
Symbol 1314 GraphicUsed by:1322
Symbol 1315 GraphicUsed by:1322
Symbol 1316 GraphicUsed by:1322
Symbol 1317 GraphicUsed by:1322
Symbol 1318 GraphicUsed by:1322
Symbol 1319 GraphicUsed by:1322
Symbol 1320 GraphicUsed by:1322
Symbol 1321 GraphicUsed by:1322
Symbol 1322 MovieClipUses:1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321Used by:1367
Symbol 1323 GraphicUsed by:1367
Symbol 1324 GraphicUsed by:1325 1327 1346 1348 1350
Symbol 1325 MovieClipUses:1324Used by:1327 1346 1348 1350
Symbol 1326 TextUses:304Used by:1327
Symbol 1327 ButtonUses:1325 1326 1324Used by:1367
Symbol 1328 TextUses:304Used by:1329
Symbol 1329 ButtonUses:303 1328 302Used by:1367
Symbol 1330 TextUses:304Used by:1331
Symbol 1331 ButtonUses:303 1330 302Used by:1367
Symbol 1332 GraphicUsed by:1333
Symbol 1333 MovieClipUses:1332Used by:1344
Symbol 1334 GraphicUsed by:1335
Symbol 1335 MovieClipUses:1334Used by:1344
Symbol 1336 GraphicUsed by:1337
Symbol 1337 MovieClipUses:1336Used by:1344
Symbol 1338 GraphicUsed by:1339
Symbol 1339 MovieClipUses:1338Used by:1344
Symbol 1340 GraphicUsed by:1341
Symbol 1341 MovieClipUses:1340Used by:1344
Symbol 1342 GraphicUsed by:1343
Symbol 1343 MovieClipUses:1342Used by:1344
Symbol 1344 MovieClipUses:1333 1335 1337 1339 1341 1343Used by:1367
Symbol 1345 TextUses:304Used by:1346
Symbol 1346 ButtonUses:1325 1345 1324Used by:1367
Symbol 1347 TextUses:304Used by:1348
Symbol 1348 ButtonUses:1325 1347 1324Used by:1367
Symbol 1349 TextUses:304Used by:1350
Symbol 1350 ButtonUses:1325 1349 1324Used by:1367
Symbol 1351 TextUses:340Used by:1367
Symbol 1352 TextUses:304Used by:1353
Symbol 1353 ButtonUses:303 1352 302Used by:1367
Symbol 1354 GraphicUsed by:1367
Symbol 1355 GraphicUsed by:1356
Symbol 1356 MovieClipUses:1355Used by:1367
Symbol 1357 GraphicUsed by:1359
Symbol 1358 TextUses:340Used by:1359
Symbol 1359 ButtonUses:1357 1358Used by:1367
Symbol 1360 GraphicUsed by:1366
Symbol 1361 TextUses:304Used by:1363
Symbol 1362 TextUses:304Used by:1363 1365
Symbol 1363 ButtonUses:303 1361 1362 302Used by:1366
Symbol 1364 TextUses:304Used by:1365
Symbol 1365 ButtonUses:303 1364 1362 302Used by:1366
Symbol 1366 MovieClipUses:1360 1363 1365Used by:1367
Symbol 1367 MovieClip {titleScreen} [titleScreen]Uses:1299 300 1310 1322 1323 1327 1329 1331 1344 1346 1348 1350 1351 1353 1354 1356 1359 918 1366
Symbol 1368 GraphicUsed by:1374
Symbol 1369 GraphicUsed by:1374
Symbol 1370 GraphicUsed by:1374
Symbol 1371 GraphicUsed by:1374
Symbol 1372 FontUsed by:1373
Symbol 1373 TextUses:1372Used by:1374
Symbol 1374 MovieClip {Intro_MouseBreaker} [Intro_MouseBreaker]Uses:1368 425 521 638 1369 291 1370 1371 1373
Symbol 1375 Sound {Ingame1} [Ingame1]
Symbol 1376 Sound {Ingame2} [Ingame2]
Symbol 1377 GraphicUsed by:1387
Symbol 1378 GraphicUsed by:1387
Symbol 1379 GraphicUsed by:1387
Symbol 1380 GraphicUsed by:1387
Symbol 1381 GraphicUsed by:1387
Symbol 1382 GraphicUsed by:1387
Symbol 1383 GraphicUsed by:1387
Symbol 1384 GraphicUsed by:1387
Symbol 1385 GraphicUsed by:1387
Symbol 1386 GraphicUsed by:1387
Symbol 1387 MovieClip {Enemy05a} [Enemy05a]Uses:1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
Symbol 1388 Sound {Ingame5} [Ingame5]
Symbol 1389 Sound {Ingame6} [Ingame6]
Symbol 1390 Sound {Ingame3} [Ingame3]
Symbol 1391 GraphicUsed by:1404
Symbol 1392 GraphicUsed by:1404
Symbol 1393 GraphicUsed by:1404
Symbol 1394 GraphicUsed by:1404
Symbol 1395 GraphicUsed by:1404
Symbol 1396 GraphicUsed by:1404
Symbol 1397 GraphicUsed by:1404
Symbol 1398 GraphicUsed by:1404
Symbol 1399 GraphicUsed by:1404
Symbol 1400 GraphicUsed by:1404
Symbol 1401 GraphicUsed by:1404
Symbol 1402 GraphicUsed by:1404
Symbol 1403 GraphicUsed by:1404
Symbol 1404 MovieClip {Enemy02_Boss} [Enemy02_Boss]Uses:1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
Symbol 1405 Sound {Ingame4} [Ingame4]
Symbol 1406 Font {Main_Font20}
Streaming Sound 1Used by:Symbol 545 MovieClip {yowFinished} [yowFinished]
Streaming Sound 2Used by:Symbol 611 MovieClip {yowFinished3} [yowFinished3]
Streaming Sound 3Used by:Symbol 633 MovieClip {yowFinished2} [yowFinished2]

Instance Names

"loadBar"Symbol 15 MovieClip Frame 1Symbol 14 MovieClip
"adbackground"Symbol 21 MovieClip {preloaderMC} [preloaderMC] Frame 1Symbol 2 MovieClip
"adBox"Symbol 21 MovieClip {preloaderMC} [preloaderMC] Frame 1Symbol 11 MovieClip
"loaderBar"Symbol 21 MovieClip {preloaderMC} [preloaderMC] Frame 1Symbol 15 MovieClip
"buttonSkipCPMStarAd"Symbol 21 MovieClip {preloaderMC} [preloaderMC] Frame 1Symbol 20 Button
"adBox"Symbol 21 MovieClip {preloaderMC} [preloaderMC] Frame 1Symbol 11 MovieClip
"select"Symbol 335 MovieClip Frame 1Symbol 322 MovieClip
"lock"Symbol 335 MovieClip Frame 1Symbol 324 MovieClip
"buttonBuyUpgrade"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 306 Button
"buttonBuyHealth"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 310 Button
"bomb0"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 315 MovieClip
"buttonBuyDaveBomb"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 310 Button
"textCash"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 318 EditableText
"textHealth"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 319 EditableText
"w0"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w1"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w2"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w3"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w4"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w5"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w6"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"w7"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 335 MovieClip
"textUpgradeCost"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 336 EditableText
"textDaveBomb"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 337 EditableText
"textHealthCost"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 338 EditableText
"textDaveBombCount"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 346 EditableText
"textEnteringLevel"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 354 EditableText
"buttonContinue"Symbol 357 MovieClip {PreLevelScreen} [PreLevelScreen] Frame 1Symbol 356 Button
"buttonContinue"Symbol 440 MovieClip {PauseScreen} [PauseScreen] Frame 1Symbol 356 Button
"buttonQuit"Symbol 440 MovieClip {PauseScreen} [PauseScreen] Frame 1Symbol 437 Button
"select"Symbol 766 MovieClip Frame 1Symbol 763 MovieClip
"lock"Symbol 766 MovieClip Frame 1Symbol 765 MovieClip
"l0"Symbol 787 MovieClip {selectButton} [selectButton] Frame 1Symbol 766 MovieClip
"l1"Symbol 787 MovieClip {selectButton} [selectButton] Frame 1Symbol 766 MovieClip
"l2"Symbol 787 MovieClip {selectButton} [selectButton] Frame 1Symbol 766 MovieClip
"stageSelect"Symbol 787 MovieClip {selectButton} [selectButton] Frame 1Symbol 772 MovieClip
"level1"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level2"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level3"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level4"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level5"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level6"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level7"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"level8"Symbol 791 MovieClip {levelSelect} [levelSelect] Frame 1Symbol 787 MovieClip {selectButton} [selectButton]
"longAnimals"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 864 Button
"andkon"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 877 Button
"armorGames"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 886 Button
"bubbleBox"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 902 Button
"kongregate"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 906 Button
"maxGames"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 909 Button
"miniJuegos"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 912 Button
"siKids"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 915 Button
"robotJam"Symbol 918 MovieClip {MainLogo} [MainLogo] Frame 1Symbol 917 Button
"cash"Symbol 954 MovieClip Frame 1Symbol 953 EditableText
"num"Symbol 958 MovieClip Frame 1Symbol 956 EditableText
"score"Symbol 962 MovieClip Frame 1Symbol 960 EditableText
"ButtonPause"Symbol 967 MovieClip Frame 1Symbol 966 Button
"health"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 951 MovieClip
"cash"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 954 MovieClip
"kills"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 958 MovieClip
"score"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 962 MovieClip
"controls"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 967 MovieClip
"bossHealth"Symbol 975 MovieClip {hud} [hud] Frame 1Symbol 974 MovieClip
"buttonClickHere"Symbol 1020 MovieClip {SitelockedScreen} [SitelockedScreen] Frame 1Symbol 1019 Button
"adBox"Symbol 1068 MovieClip {CPMStarLoaderScreen} [CPMStarLoaderScreen] Frame 1Symbol 1056 MovieClip
"buttonSkipCPMStarAd"Symbol 1068 MovieClip {CPMStarLoaderScreen} [CPMStarLoaderScreen] Frame 1Symbol 1061 Button
"loader"Symbol 1068 MovieClip {CPMStarLoaderScreen} [CPMStarLoaderScreen] Frame 1Symbol 1067 MovieClip
"buttonContinue"Symbol 1283 MovieClip {gameOverScreen} [gameOverScreen] Frame 1Symbol 356 Button
"buttonQuit"Symbol 1283 MovieClip {gameOverScreen} [gameOverScreen] Frame 1Symbol 437 Button
"buttonContinue"Symbol 1366 MovieClip Frame 1Symbol 1363 Button
"buttonNewGame"Symbol 1366 MovieClip Frame 1Symbol 1365 Button
"buttonPlay0"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1327 Button
"buttonMoreGames"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1329 Button
"buttonTwitter"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1331 Button
"buttonPlay1"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1346 Button
"buttonPlay2"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1348 Button
"buttonPlay3"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1350 Button
"buttonCompleteMovie"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1353 Button
"buttonLongAnimalsRobotJam"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1359 Button
"buttonMainLogo"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 918 MovieClip {MainLogo} [MainLogo]
"savedGamesOverlay"Symbol 1367 MovieClip {titleScreen} [titleScreen] Frame 1Symbol 1366 MovieClip
"exp"Symbol 1374 MovieClip {Intro_MouseBreaker} [Intro_MouseBreaker] Frame 21Symbol 638 MovieClip {Lic_All_fla.MB_Explode_5} [Lic_All_fla.MB_Explode_5]

Special Tags

FileAttributes (69)Timeline Frame 1Access network only, Metadata present, AS3.
SWFMetaData (77)Timeline Frame 1458 bytes "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'><rdf:Description rdf:about='' xmlns ..."
ScriptLimits (65)Timeline Frame 1MaxRecursionDepth: 1000, ScriptTimeout: 60 seconds
ExportAssets (56)Timeline Frame 1Symbol 21 as "preloaderMC"
ExportAssets (56)Timeline Frame 2Symbol 23 as "PlayerShip"
ExportAssets (56)Timeline Frame 2Symbol 33 as "Enemy08"
ExportAssets (56)Timeline Frame 2Symbol 34 as "sfx_explosion0.wav"
ExportAssets (56)Timeline Frame 2Symbol 53 as "Enemy01_Boss"
ExportAssets (56)Timeline Frame 2Symbol 62 as "Enemy04a"
ExportAssets (56)Timeline Frame 2Symbol 71 as "Enemy04"
ExportAssets (56)Timeline Frame 2Symbol 82 as "Enemy05"
ExportAssets (56)Timeline Frame 2Symbol 93 as "Enemy06"
ExportAssets (56)Timeline Frame 2Symbol 106 as "Enemy07"
ExportAssets (56)Timeline Frame 2Symbol 125 as "Enemy01"
ExportAssets (56)Timeline Frame 2Symbol 139 as "Enemy02"
ExportAssets (56)Timeline Frame 2Symbol 247 as "GameCompleteMovie"
ExportAssets (56)Timeline Frame 2Symbol 262 as "Enemy03"
ExportAssets (56)Timeline Frame 2Symbol 277 as "explosion_2_large"
ExportAssets (56)Timeline Frame 2Symbol 291 as "Lic_All_fla.MB_mouse_6"
ExportAssets (56)Timeline Frame 2Symbol 357 as "PreLevelScreen"
ExportAssets (56)Timeline Frame 2Symbol 359 as "PlayerShipGun"
ExportAssets (56)Timeline Frame 2Symbol 374 as "explosion_2"
ExportAssets (56)Timeline Frame 2Symbol 377 as "ShockwaveLogo"
ExportAssets (56)Timeline Frame 2Symbol 378 as "sfx_explosion1"
ExportAssets (56)Timeline Frame 2Symbol 406 as "explosion_3"
ExportAssets (56)Timeline Frame 2Symbol 407 as "sfx_explosion2"
ExportAssets (56)Timeline Frame 2Symbol 408 as "sfx_lazer01"
ExportAssets (56)Timeline Frame 2Symbol 417 as "explosion_1_large"
ExportAssets (56)Timeline Frame 2Symbol 424 as "explosion_1"
ExportAssets (56)Timeline Frame 2Symbol 425 as "Lic_All_fla.MB_mouse_3"
ExportAssets (56)Timeline Frame 2Symbol 428 as "Weapon04"
ExportAssets (56)Timeline Frame 2Symbol 431 as "Weapon05"
ExportAssets (56)Timeline Frame 2Symbol 434 as "Weapon06"
ExportAssets (56)Timeline Frame 2Symbol 440 as "PauseScreen"
ExportAssets (56)Timeline Frame 2Symbol 443 as "Weapon07"
ExportAssets (56)Timeline Frame 2Symbol 460 as "Enemy03a"
ExportAssets (56)Timeline Frame 2Symbol 473 as "Enemy03_Med"
ExportAssets (56)Timeline Frame 2Symbol 484 as "Enemy06_Boss"
ExportAssets (56)Timeline Frame 2Symbol 499 as "TitlePage_fla.bubble_logo3_44"
ExportAssets (56)Timeline Frame 2Symbol 508 as "Enemy05_Boss"
ExportAssets (56)Timeline Frame 2Symbol 212 as "endmovie_fla.panel4_15"
ExportAssets (56)Timeline Frame 2Symbol 518 as "Enemy05_Med"
ExportAssets (56)Timeline Frame 2Symbol 521 as "Lic_All_fla.MB_eyes_MB_4"
ExportAssets (56)Timeline Frame 2Symbol 524 as "Weapon03"
ExportAssets (56)Timeline Frame 2Symbol 545 as "yowFinished"
ExportAssets (56)Timeline Frame 2Symbol 548 as "Weapon02"
ExportAssets (56)Timeline Frame 2Symbol 551 as "Weapon01"
ExportAssets (56)Timeline Frame 2Symbol 565 as "Enemy02_Med"
ExportAssets (56)Timeline Frame 2Symbol 566 as "sfx_splat4"
ExportAssets (56)Timeline Frame 2Symbol 574 as "PlayerDieExplosion"
ExportAssets (56)Timeline Frame 2Symbol 575 as "sfx_splat5"
ExportAssets (56)Timeline Frame 2Symbol 589 as "Enemy02a"
ExportAssets (56)Timeline Frame 2Symbol 590 as "sfx_splat2"
ExportAssets (56)Timeline Frame 2Symbol 591 as "sfx_splat3"
ExportAssets (56)Timeline Frame 2Symbol 592 as "sfx_splat0"
ExportAssets (56)Timeline Frame 2Symbol 593 as "sfx_splat1"
ExportAssets (56)Timeline Frame 2Symbol 594 as "sfx_explosion01"
ExportAssets (56)Timeline Frame 2Symbol 611 as "yowFinished3"
ExportAssets (56)Timeline Frame 2Symbol 633 as "yowFinished2"
ExportAssets (56)Timeline Frame 2Symbol 638 as "Lic_All_fla.MB_Explode_5"
ExportAssets (56)Timeline Frame 2Symbol 746 as "ComicBookIntro"
ExportAssets (56)Timeline Frame 2Symbol 757 as "Enemy06_Med"
ExportAssets (56)Timeline Frame 2Symbol 787 as "selectButton"
ExportAssets (56)Timeline Frame 2Symbol 791 as "levelSelect"
ExportAssets (56)Timeline Frame 2Symbol 797 as "daveSmartAnim"
ExportAssets (56)Timeline Frame 2Symbol 825 as "explosion_3_large"
ExportAssets (56)Timeline Frame 2Symbol 844 as "Enemy01a"
ExportAssets (56)Timeline Frame 2Symbol 918 as "MainLogo"
ExportAssets (56)Timeline Frame 2Symbol 926 as "Enemy04_Boss"
ExportAssets (56)Timeline Frame 2Symbol 936 as "Enemy08_Med"
ExportAssets (56)Timeline Frame 2Symbol 943 as "EnemyWeapon01"
ExportAssets (56)Timeline Frame 2Symbol 975 as "hud"
ExportAssets (56)Timeline Frame 2Symbol 988 as "EnemyRick"
ExportAssets (56)Timeline Frame 2Symbol 989 as "Antibody"
ExportAssets (56)Timeline Frame 2Symbol 997 as "Enemy04_Med"
ExportAssets (56)Timeline Frame 2Symbol 1014 as "Intro_ArmorGames"
ExportAssets (56)Timeline Frame 2Symbol 1020 as "SitelockedScreen"
ExportAssets (56)Timeline Frame 2Symbol 1021 as "sfx_pickup"
ExportAssets (56)Timeline Frame 2Symbol 1031 as "levelBackgrounds"
ExportAssets (56)Timeline Frame 2Symbol 875 as "AGingameButton2"
ExportAssets (56)Timeline Frame 2Symbol 1041 as "Enemy08a"
ExportAssets (56)Timeline Frame 2Symbol 1053 as "Enemy07_Boss"
ExportAssets (56)Timeline Frame 2Symbol 1054 as "sfx_readytoplay"
ExportAssets (56)Timeline Frame 2Symbol 1068 as "CPMStarLoaderScreen"
ExportAssets (56)Timeline Frame 2Symbol 1080 as "Enemy07_Med"
ExportAssets (56)Timeline Frame 2Symbol 1081 as "sfx_pickups"
ExportAssets (56)Timeline Frame 2Symbol 1093 as "Enemy07a"
ExportAssets (56)Timeline Frame 2Symbol 1095 as "PlayerShipGun1"
ExportAssets (56)Timeline Frame 2Symbol 1096 as "sfx_splatboss"
ExportAssets (56)Timeline Frame 2Symbol 1192 as "betweenStages"
ExportAssets (56)Timeline Frame 2Symbol 1199 as "Enemy08_Boss"
ExportAssets (56)Timeline Frame 2Symbol 1206 as "PlayerHitExplosion"
ExportAssets (56)Timeline Frame 2Symbol 1209 as "Stars"
ExportAssets (56)Timeline Frame 2Symbol 745 as "comicbook_fla.intro_comicBook_1"
ExportAssets (56)Timeline Frame 2Symbol 1210 as "sfx_bostin"
ExportAssets (56)Timeline Frame 2Symbol 1221 as "Enemy06a"
ExportAssets (56)Timeline Frame 2Symbol 1222 as "Tune01"
ExportAssets (56)Timeline Frame 2Symbol 1223 as "sfx_tear"
ExportAssets (56)Timeline Frame 2Symbol 1242 as "Enemy01_Med"
ExportAssets (56)Timeline Frame 2Symbol 1245 as "rick"
ExportAssets (56)Timeline Frame 2Symbol 1255 as "Enemy03_Boss"
ExportAssets (56)Timeline Frame 2Symbol 1283 as "gameOverScreen"
ExportAssets (56)Timeline Frame 2Symbol 1298 as "Lic_All_fla.bubble_logo3_32"
ExportAssets (56)Timeline Frame 2Symbol 1367 as "titleScreen"
ExportAssets (56)Timeline Frame 2Symbol 1374 as "Intro_MouseBreaker"
ExportAssets (56)Timeline Frame 2Symbol 1375 as "Ingame1"
ExportAssets (56)Timeline Frame 2Symbol 1376 as "Ingame2"
ExportAssets (56)Timeline Frame 2Symbol 1387 as "Enemy05a"
ExportAssets (56)Timeline Frame 2Symbol 1388 as "Ingame5"
ExportAssets (56)Timeline Frame 2Symbol 1389 as "Ingame6"
ExportAssets (56)Timeline Frame 2Symbol 1390 as "Ingame3"
ExportAssets (56)Timeline Frame 2Symbol 1404 as "Enemy02_Boss"
ExportAssets (56)Timeline Frame 2Symbol 1405 as "Ingame4"
EnableDebugger2 (64)Timeline Frame 131 bytes "u.$1$GK$9g3rirzRJ8eOkY2ABXkJH/."
DebugMX1 (63)Timeline Frame 1
SerialNumber (41)Timeline Frame 1

Labels

"Preloader"Frame 1
"start"Frame 2
"blink"Symbol 53 MovieClip {Enemy01_Boss} [Enemy01_Boss] Frame 34
"blink"Symbol 125 MovieClip {Enemy01} [Enemy01] Frame 34
"blink"Symbol 139 MovieClip {Enemy02} [Enemy02] Frame 33
"blink"Symbol 565 MovieClip {Enemy02_Med} [Enemy02_Med] Frame 33
"blink"Symbol 589 MovieClip {Enemy02a} [Enemy02a] Frame 33
"blink"Symbol 844 MovieClip {Enemy01a} [Enemy01a] Frame 34
"blink"Symbol 1113 MovieClip Frame 33
"blink"Symbol 1132 MovieClip Frame 34
"blink"Symbol 1242 MovieClip {Enemy01_Med} [Enemy01_Med] Frame 34
"blink"Symbol 1404 MovieClip {Enemy02_Boss} [Enemy02_Boss] Frame 33




https://swfchan.com/53/263232/info.shtml
Created: 21/3 -2026 00:58:16 Last modified: 21/3 -2026 00:58:16 Server time: 01/04 -2026 10:21:42