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

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

armorgames splitter-2569.swf

This is the info page for
Flash #268213

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


Text
CONTINUE

This site does not support this game.
Please visit King.com to play.

ActionScript [AS3]

Section 1
//ArrayUtilities (ascb.util.ArrayUtilities) package ascb.util { public class ArrayUtilities { public function ArrayUtilities(){ super(); } public static function duplicate(oArray:Object, bRecursive:Boolean=false):Object{ var oDuplicate:Object; var sItem:String; var i:Number; if (bRecursive){ if ((oArray is Array)){ oDuplicate = new Array(); i = 0; while (i < oArray.length) { if ((oArray[i] is Object)){ oDuplicate[i] = duplicate(oArray[i]); } else { oDuplicate[i] = oArray[i]; }; i++; }; return (oDuplicate); } else { oDuplicate = new Object(); for (sItem in oArray) { if ((((((((oArray[sItem] is Object)) && (!((oArray[sItem] is String))))) && (!((oArray[sItem] is Boolean))))) && (!((oArray[sItem] is Number))))){ oDuplicate[sItem] = duplicate(oArray[sItem], bRecursive); } else { oDuplicate[sItem] = oArray[sItem]; }; }; return (oDuplicate); }; } else { if ((oArray is Array)){ return (oArray.concat()); }; oDuplicate = new Object(); for (sItem in oArray) { oDuplicate[sItem] = oArray[sItem]; }; }; return (!NULL!); } public static function max(aArray:Array):Number{ var aCopy:Array = aArray.concat(); aCopy.sort(Array.NUMERIC); var nMaximum:Number = Number(aCopy.pop()); return (nMaximum); } public static function findMatchIndex(aArray:Array, oElement:Object, ... _args):Number{ var nStartingIndex:Number = 0; var bPartialMatch:Boolean; if (typeof(_args[0]) == "number"){ nStartingIndex = _args[0]; } else { if (typeof(_args[1]) == "number"){ nStartingIndex = _args[1]; }; }; if (typeof(_args[0]) == "boolean"){ bPartialMatch = _args[0]; }; var bMatch:Boolean; var i:Number = nStartingIndex; while (i < aArray.length) { if (bPartialMatch){ bMatch = !((aArray[i].indexOf(oElement) == -1)); } else { bMatch = (aArray[i] == oElement); }; if (bMatch){ return (i); }; i++; }; return (-1); } public static function switchElements(aArray:Array, nIndexA:Number, nIndexB:Number):void{ var oElementA:Object = aArray[nIndexA]; var oElementB:Object = aArray[nIndexB]; aArray.splice(nIndexA, 1, oElementB); aArray.splice(nIndexB, 1, oElementA); } public static function toString(oArray:Object, nLevel:uint=0):String{ var sItem:String; var sIndent:String = ""; var i:Number = 0; while (i < nLevel) { sIndent = (sIndent + "\t"); i++; }; var sOutput:String = ""; for (sItem in oArray) { if ((oArray[sItem] is Object)){ sOutput = (((((sIndent + "** ") + sItem) + " **\n") + toString(oArray[sItem], (nLevel + 1))) + sOutput); } else { sOutput = (sOutput + ((((sIndent + sItem) + ":") + oArray[sItem]) + "\n")); }; }; return (sOutput); } public static function randomize(aArray:Array):Array{ var oElement:Object; var nRandom:Number; var aCopy:Array = aArray.concat(); var aRandomized:Array = new Array(); var i:Number = 0; while (i < aCopy.length) { nRandom = NumberUtilities.random(0, (aCopy.length - 1)); aRandomized.push(aCopy[nRandom]); aCopy.splice(nRandom, 1); i--; i++; }; return (aRandomized); } public static function min(aArray:Array):Number{ var aCopy:Array = aArray.concat(); aCopy.sort(Array.NUMERIC); var nMinimum:Number = Number(aCopy.shift()); return (nMinimum); } public static function sum(aArray:Array):Number{ var nSum:Number = 0; var i:Number = 0; while (i < aArray.length) { if (typeof(aArray[i]) == "number"){ nSum = (nSum + aArray[i]); }; i++; }; return (nSum); } public static function findMatchIndices(aArray:Array, oElement:Object, bPartialMatch:Boolean=false):Array{ var aIndices:Array = new Array(); var nIndex:Number = findMatchIndex(aArray, oElement, bPartialMatch); while (nIndex != -1) { aIndices.push(nIndex); nIndex = findMatchIndex(aArray, oElement, bPartialMatch, (nIndex + 1)); }; return (aIndices); } public static function findLastMatchIndex(aArray:Array, oElement:Object, oParameter:Object):Number{ var nStartingIndex:Number = aArray.length; var bPartialMatch:Boolean; if (typeof(arguments[2]) == "number"){ nStartingIndex = arguments[2]; } else { if (typeof(arguments[3]) == "number"){ nStartingIndex = arguments[3]; }; }; if (typeof(arguments[2]) == "boolean"){ bPartialMatch = arguments[2]; }; var bMatch:Boolean; var i:Number = nStartingIndex; while (i >= 0) { if (bPartialMatch){ bMatch = !((aArray[i].indexOf(oElement) == -1)); } else { bMatch = (aArray[i] == oElement); }; if (bMatch){ return (i); }; i--; }; return (-1); } public static function average(aArray:Array):Number{ return ((sum(aArray) / aArray.length)); } private static function objectEquals(oInstanceA:Object, oInstanceB:Object):Boolean{ var sItem:String; for (sItem in oInstanceA) { if ((oInstanceA[sItem] is Object)){ if (!objectEquals(oInstanceA[sItem], oInstanceB[sItem])){ return (false); }; } else { if (oInstanceA[sItem] != oInstanceB[sItem]){ return (false); }; }; }; return (true); } public static function equals(aArrayA:Array, aArrayB:Array, bNotOrdered:Boolean, bRecursive:Boolean):Boolean{ if (aArrayA.length != aArrayB.length){ return (false); }; var aArrayACopy:Array = aArrayA.concat(); var aArrayBCopy:Array = aArrayB.concat(); if (bNotOrdered){ aArrayACopy.sort(); aArrayBCopy.sort(); }; var i:Number = 0; while (i < aArrayACopy.length) { if ((((aArrayACopy[i] is Array)) && (bRecursive))){ if (!equals(aArrayACopy[i], aArrayBCopy[i], bNotOrdered, bRecursive)){ return (false); }; } else { if ((((aArrayACopy[i] is Object)) && (bRecursive))){ if (!objectEquals(aArrayACopy[i], aArrayBCopy[i])){ return (false); }; } else { if (aArrayACopy[i] != aArrayBCopy[i]){ return (false); }; }; }; i++; }; return (true); } } }//package ascb.util
Section 2
//NumberUtilities (ascb.util.NumberUtilities) package ascb.util { public class NumberUtilities { private static var _aUniqueIDs:Array; public function NumberUtilities(){ super(); } public static function random(nMinimum:Number, nMaximum:Number=0, nRoundToInterval:Number=1):Number{ var nTemp:Number; if (nMinimum > nMaximum){ nTemp = nMinimum; nMinimum = nMaximum; nMaximum = nTemp; }; var nDeltaRange:Number = ((nMaximum - nMinimum) + (1 * nRoundToInterval)); var nRandomNumber:Number = (Math.random() * nDeltaRange); nRandomNumber = (nRandomNumber + nMinimum); return (floor(nRandomNumber, nRoundToInterval)); } public static function ceil(nNumber:Number, nRoundToInterval:Number=1):Number{ return ((Math.ceil((nNumber / nRoundToInterval)) * nRoundToInterval)); } public static function getUnique():Number{ if (_aUniqueIDs == null){ _aUniqueIDs = new Array(); }; var dCurrent:Date = new Date(); var nID:Number = dCurrent.getTime(); while (!(isUnique(nID))) { nID = (nID + NumberUtilities.random(dCurrent.getTime(), (2 * dCurrent.getTime()))); }; _aUniqueIDs.push(nID); return (nID); } private static function isUnique(nNumber:Number):Boolean{ var i:Number = 0; while (i < _aUniqueIDs.length) { if (_aUniqueIDs[i] == nNumber){ return (false); }; i++; }; return (true); } public static function floor(nNumber:Number, nRoundToInterval:Number=1):Number{ return ((Math.floor((nNumber / nRoundToInterval)) * nRoundToInterval)); } public static function round(nNumber:Number, nRoundToInterval:Number=1):Number{ return ((Math.round((nNumber / nRoundToInterval)) * nRoundToInterval)); } } }//package ascb.util
Section 3
//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 4
//b2CircleShape (Box2D.Collision.Shapes.b2CircleShape) package Box2D.Collision.Shapes { 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):Boolean{ 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.x + ((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){ return (false); }; 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 (false); }; 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 (true); }; return (false); } 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((Math.min(p1X, p2X) - m_radius), (Math.min(p1Y, p2Y) - m_radius)); aabb.upperBound.Set((Math.max(p1X, p2X) + m_radius), (Math.max(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 5
//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 6
//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 7
//b2PolygonShape (Box2D.Collision.Shapes.b2PolygonShape) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; 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++; }; } public function GetCoreVertices():Array{ return (m_coreVertices); } public function GetVertices():Array{ return (m_vertices); } 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(Math.min(aabb1.lowerBound.x, aabb2.lowerBound.x), Math.min(aabb1.lowerBound.y, aabb2.lowerBound.y)); aabb.upperBound.Set(Math.max(aabb1.upperBound.x, aabb2.upperBound.x), Math.max(aabb1.upperBound.y, aabb2.upperBound.y)); } 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):Boolean{ 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) { tX = (m_vertices[i].x - p1X); tY = (m_vertices[i].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 (false); }; 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 (true); }; return (false); } 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[(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 Support(xf:b2XForm, dX:Number, dY:Number):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; var bestValue:Number = ((m_coreVertices[0].x * dLocalX) + (m_coreVertices[0].y * dLocalY)); var i = 1; while (i < m_vertexCount) { value = ((m_coreVertices[i].x * dLocalX) + (m_coreVertices[i].y * dLocalY)); if (value > bestValue){ bestIndex = i; bestValue = value; }; i++; }; tMat = xf.R; var tVec:b2Vec2 = 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); } override public function UpdateSweepRadius(center:b2Vec2):void{ var dX:Number; var dY:Number; m_sweepRadius = 0; var i:int; while (i < m_vertexCount) { dX = (m_coreVertices[i].x - center.x); dY = (m_coreVertices[i].y - center.y); dX = Math.sqrt(((dX * dX) + (dY * dY))); m_sweepRadius = Math.max(m_sweepRadius, dX); i++; }; } 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)); } public function GetVertexCount():int{ return (m_vertexCount); } override public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{ 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) { tX = (pLocalX - m_vertices[i].x); tY = (pLocalY - m_vertices[i].y); dot = ((m_normals[i].x * tX) + (m_normals[i].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[(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[(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)); lowerX = Math.min(lowerX, rX); lowerY = Math.min(lowerY, rY); upperX = Math.max(upperX, rX); upperY = Math.max(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 8
//b2Shape (Box2D.Collision.Shapes.b2Shape) package Box2D.Collision.Shapes { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; public class b2Shape { public var m_next:b2Shape; public var m_type:int; public var m_restitution:Number; public var m_sweepRadius:Number; public var m_userData; public var m_density:Number; public var m_proxyId:uint; public var m_friction:Number; public var m_isSensor:Boolean; public var m_groupIndex:int; public var m_categoryBits:uint; public var m_body:b2Body; public var m_maskBits:uint; public static const e_polygonShape:int = 1; public static const e_unknownShape:int = -1; public static const e_circleShape:int = 0; public static const e_shapeTypeCount:int = 2; 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_categoryBits = def.categoryBits; m_maskBits = def.maskBits; m_groupIndex = def.groupIndex; m_isSensor = def.isSensor; } 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 TestSegment(xf:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number):Boolean{ return (false); } public function IsSensor():Boolean{ return (m_isSensor); } public function ComputeMass(massData:b2MassData):void{ } 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 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 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 GetUserData(){ return (m_userData); } public function TestPoint(xf:b2XForm, p:b2Vec2):Boolean{ return (false); } public function ResetProxy(broadPhase:b2BroadPhase, transform:b2XForm):void{ if (m_proxyId != b2Pair.b2_nullProxy){ 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 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 9
//b2ShapeDef (Box2D.Collision.Shapes.b2ShapeDef) package Box2D.Collision.Shapes { public class b2ShapeDef { public var friction:Number; public var groupIndex:int; public var categoryBits:int; public var density:Number; public var restitution:Number; public var maskBits:int; public var userData;// = null public var type:int; public var isSensor:Boolean; public function b2ShapeDef(){ super(); type = b2Shape.e_unknownShape; userData = null; friction = 0.2; restitution = 0; density = 0; categoryBits = 1; maskBits = 0xFFFF; groupIndex = 0; isSensor = false; } } }//package Box2D.Collision.Shapes
Section 10
//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 11
//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 12
//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 13
//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_quantizationFactor:b2Vec2; public var m_worldAABB:b2AABB; public var m_freeProxy:uint; 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_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; 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[(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{ if ((((proxyId == b2Pair.b2_nullProxy)) || ((m_proxyPool[proxyId].IsValid() == false)))){ return (null); }; return (m_proxyPool[proxyId]); } private function IncrementTimeStamp():void{ var i:uint; if (m_timeStamp == b2Settings.USHRT_MAX){ i = 0; while (i < b2Settings.b2_maxProxies) { m_proxyPool[i].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 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) { if (bounds[j].IsLower()){ IncrementOverlapCount(bounds[j].proxyId); }; j++; }; if (lowerQuery > 0){ i = (lowerQuery - 1); s = bounds[i].stabbingCount; while (s) { if (bounds[i].IsLower()){ proxy = m_proxyPool[bounds[i].proxyId]; if (lowerQuery <= proxy.upperBounds[axis]){ IncrementOverlapCount(bounds[i].proxyId); s--; }; }; i--; }; }; lowerQueryOut[0] = lowerQuery; upperQueryOut[0] = upperQuery; } private function TestOverlapValidate(p1:b2Proxy, p2:b2Proxy):Boolean{ var bounds:Array; var axis:int; while (axis < 2) { bounds = m_bounds[axis]; if (bounds[p1.lowerBounds[axis]].value > bounds[p2.upperBounds[axis]].value){ return (false); }; if (bounds[p1.upperBounds[axis]].value < bounds[p2.lowerBounds[axis]].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 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[(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[(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[(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[(tIndex + j)]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; upperIndex++; bounds[lowerIndex].value = lowerValues[axis]; bounds[lowerIndex].proxyId = proxyId; bounds[upperIndex].value = upperValues[axis]; bounds[upperIndex].proxyId = proxyId; bounds[lowerIndex].stabbingCount = ((lowerIndex == 0)) ? 0 : bounds[(lowerIndex - 1)].stabbingCount; bounds[upperIndex].stabbingCount = bounds[(upperIndex - 1)].stabbingCount; index = lowerIndex; while (index < upperIndex) { bounds[index].stabbingCount++; index++; }; index = lowerIndex; while (index < (boundCount + 2)) { proxy2 = m_proxyPool[bounds[index].proxyId]; if (bounds[index].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 bounds:Array; var lowerIndex:uint; var upperIndex:uint; var lowerValue:uint; var upperValue:uint; var tArr:Array; var j:int; var tEnd:int; var tBound1:b2Bound; var tBound2:b2Bound; 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]; lowerValue = bounds[lowerIndex].value; upperValue = bounds[upperIndex].value; tArr = new Array(); tEnd = ((upperIndex - lowerIndex) - 1); j = 0; while (j < tEnd) { tArr[j] = new b2Bound(); tBound1 = tArr[j]; tBound2 = bounds[((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[(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[((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[(tIndex + j)]; tBound1.value = tBound2.value; tBound1.proxyId = tBound2.proxyId; tBound1.stabbingCount = tBound2.stabbingCount; j++; }; tEnd = (boundCount - 2); index = lowerIndex; while (index < tEnd) { proxy2 = m_proxyPool[bounds[index].proxyId]; if (bounds[index].IsLower()){ proxy2.lowerBounds[axis] = index; } else { proxy2.upperBounds[axis] = index; }; index++; }; tEnd = (upperIndex - 1); index2 = lowerIndex; while (index2 < tEnd) { bounds[index2].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 axis:int; while (axis < 2) { bounds = m_bounds[axis]; if (b.lowerValues[axis] > bounds[p.upperBounds[axis]].value){ return (false); }; if (b.upperValues[axis] < bounds[p.lowerBounds[axis]].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 MoveProxy(proxyId:uint, aabb:b2AABB):void{ 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) { oldValues.lowerValues[axis] = m_bounds[axis][proxy.lowerBounds[axis]].value; oldValues.upperValues[axis] = m_bounds[axis][proxy.upperBounds[axis]].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]; deltaLower = (lowerValue - bounds[lowerIndex].value); deltaUpper = (upperValue - bounds[upperIndex].value); bounds[lowerIndex].value = lowerValue; bounds[upperIndex].value = upperValue; if (deltaLower < 0){ index = lowerIndex; while ((((index > 0)) && ((lowerValue < bounds[(index - 1)].value)))) { bound = bounds[index]; prevBound = bounds[(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); }; var _local23 = prevProxy.upperBounds; var _local24 = axis; var _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.stabbingCount++; } else { _local23 = prevProxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.stabbingCount--; }; _local23 = proxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.Swap(prevBound); index--; }; }; if (deltaUpper > 0){ index = upperIndex; while ((((index < (boundCount - 1))) && ((bounds[(index + 1)].value <= upperValue)))) { bound = bounds[index]; nextBound = bounds[(index + 1)]; nextProxyId = nextBound.proxyId; nextProxy = m_proxyPool[nextProxyId]; nextBound.stabbingCount++; if (nextBound.IsLower() == true){ if (TestOverlap(newValues, nextProxy)){ m_pairManager.AddBufferedPair(proxyId, nextProxyId); }; _local23 = nextProxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.stabbingCount++; } else { _local23 = nextProxy.upperBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.stabbingCount--; }; _local23 = proxy.upperBounds; _local24 = axis; _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.Swap(nextBound); index++; }; }; if (deltaLower > 0){ index = lowerIndex; while ((((index < (boundCount - 1))) && ((bounds[(index + 1)].value <= lowerValue)))) { bound = bounds[index]; nextBound = bounds[(index + 1)]; nextProxyId = nextBound.proxyId; nextProxy = m_proxyPool[nextProxyId]; nextBound.stabbingCount--; if (nextBound.IsUpper()){ if (TestOverlap(oldValues, nextProxy)){ m_pairManager.RemoveBufferedPair(proxyId, nextProxyId); }; _local23 = nextProxy.upperBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.stabbingCount--; } else { _local23 = nextProxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.stabbingCount++; }; _local23 = proxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.Swap(nextBound); index++; }; }; if (deltaUpper < 0){ index = upperIndex; while ((((index > 0)) && ((upperValue < bounds[(index - 1)].value)))) { bound = bounds[index]; prevBound = bounds[(index - 1)]; prevProxyId = prevBound.proxyId; prevProxy = m_proxyPool[prevProxyId]; prevBound.stabbingCount--; if (prevBound.IsLower() == true){ if (TestOverlap(oldValues, prevProxy)){ m_pairManager.RemoveBufferedPair(proxyId, prevProxyId); }; _local23 = prevProxy.lowerBounds; _local24 = axis; _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.stabbingCount--; } else { _local23 = prevProxy.upperBounds; _local24 = axis; _local25 = (_local23[_local24] + 1); _local23[_local24] = _local25; bound.stabbingCount++; }; _local23 = proxy.upperBounds; _local24 = axis; _local25 = (_local23[_local24] - 1); _local23[_local24] = _local25; bound.Swap(prevBound); index--; }; }; axis++; }; } public static function BinarySearch(bounds:Array, count:int, value:uint):uint{ var mid:int; var low:int; var high:int = (count - 1); while (low <= high) { mid = ((low + high) / 2); if (bounds[mid].value > value){ high = (mid - 1); } else { if (bounds[mid].value < value){ low = (mid + 1); } else { return (uint(mid)); }; }; }; return (uint(low)); } } }//package Box2D.Collision
Section 14
//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 15
//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; public static const b2_oldPoint:uint = 4; public static const b2_newPoint:uint = 2; 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; tMat = xf1.R; tVec = poly1.m_normals[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 < poly2.m_vertexCount) { tVec = poly2.m_vertices[i]; dot = ((tVec.x * normal1X) + (tVec.y * normal1Y)); if (dot < minDot){ minDot = dot; index = i; }; i++; }; tVec = poly1.m_vertices[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 = poly2.m_vertices[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; tMat = xf1.R; tVec = poly1.m_normals[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 < poly2.m_vertexCount) { tVec = poly2.m_normals[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) < poly2.m_vertexCount)) ? (i1 + 1) : 0; tClip = c[0]; tVec = poly2.m_vertices[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.referenceFace = edge1; tClip.id.features.incidentEdge = i1; tClip.id.features.incidentVertex = 0; tClip = c[1]; tVec = poly2.m_vertices[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.referenceFace = 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 poly1:b2PolygonShape; var poly2:b2PolygonShape; var edge1:int; var flip:uint; var np:int; 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 vert1s:Array = poly1.m_vertices; var v11:b2Vec2 = vert1s[edge1].Copy(); var v12:b2Vec2 = (((edge1 + 1) < count1)) ? vert1s[(edge1 + 1)].Copy() : vert1s[0].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) { separation = (b2Math.b2Dot(frontNormal, clipPoints2[i].v) - frontOffset); if (separation <= 0){ cp = manifold.points[pointCount]; cp.separation = separation; cp.localPoint1 = b2Math.b2MulXT(xfA, clipPoints2[i].v); cp.localPoint2 = b2Math.b2MulXT(xfB, clipPoints2[i].v); cp.id.key = clipPoints2[i].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; 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) { dot = ((poly1.m_normals[i].x * dLocal1X) + (poly1.m_normals[i].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 vIn1:b2Vec2; var distance0:Number; var interp:Number; var tVec:b2Vec2; var numOut:int; var vIn0:b2Vec2 = vIn[0].v; vIn1 = vIn[1].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 _local12 = _temp1; vOut[_local12] = vIn[0]; }; if (distance1 <= 0){ var _temp2 = numOut; numOut = (numOut + 1); _local12 = _temp2; vOut[_local12] = vIn[1]; }; if ((distance0 * distance1) < 0){ interp = (distance0 / (distance0 - distance1)); tVec = vOut[numOut].v; tVec.x = (vIn0.x + (interp * (vIn1.x - vIn0.x))); tVec.y = (vIn0.y + (interp * (vIn1.y - vIn0.y))); if (distance0 > 0){ vOut[numOut].id = vIn[0].id; } else { vOut[numOut].id = vIn[1].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 radiusSum:Number = (circle1.m_radius + circle2.m_radius); 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 + (circle1.m_radius * manifold.normal.x)); p1Y = (p1Y + (circle1.m_radius * manifold.normal.y)); p2X = (p2X - (circle2.m_radius * manifold.normal.x)); p2Y = (p2Y - (circle2.m_radius * 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 i:int; while (i < polygon.m_vertexCount) { dX = (cLocalX - polygon.m_vertices[i].x); dY = (cLocalY - polygon.m_vertices[i].y); s = ((polygon.m_normals[i].x * dX) + (polygon.m_normals[i].y * dY)); if (s > radius){ return; }; if (s > separation){ separation = s; normalIndex = i; }; i++; }; if (separation < Number.MIN_VALUE){ manifold.pointCount = 1; tVec = polygon.m_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.referenceFace = b2_nullFeature; 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) < polygon.m_vertexCount)) ? (vertIndex1 + 1) : 0; var eX:Number = (polygon.m_vertices[vertIndex2].x - polygon.m_vertices[vertIndex1].x); var eY:Number = (polygon.m_vertices[vertIndex2].y - polygon.m_vertices[vertIndex1].y); var length:Number = Math.sqrt(((eX * eX) + (eY * eY))); eX = (eX / length); eY = (eY / length); if (length < Number.MIN_VALUE){ dX = (cLocalX - polygon.m_vertices[vertIndex1].x); dY = (cLocalY - polygon.m_vertices[vertIndex1].y); 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)); tPoint = manifold.points[0]; tPoint.id.features.incidentEdge = b2_nullFeature; tPoint.id.features.incidentVertex = vertIndex1; tPoint.id.features.referenceFace = b2_nullFeature; 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 = (dist - radius); return; }; dX = (cLocalX - polygon.m_vertices[vertIndex1].x); dY = (cLocalY - polygon.m_vertices[vertIndex1].y); var u:Number = ((dX * eX) + (dY * eY)); tPoint = manifold.points[0]; tPoint.id.features.incidentEdge = b2_nullFeature; tPoint.id.features.incidentVertex = b2_nullFeature; tPoint.id.features.referenceFace = b2_nullFeature; tPoint.id.features.flip = 0; if (u <= 0){ pX = polygon.m_vertices[vertIndex1].x; pY = polygon.m_vertices[vertIndex1].y; tPoint.id.features.incidentVertex = vertIndex1; } else { if (u >= length){ pX = polygon.m_vertices[vertIndex2].x; pY = polygon.m_vertices[vertIndex2].y; tPoint.id.features.incidentVertex = vertIndex2; } else { pX = ((eX * u) + polygon.m_vertices[vertIndex1].x); pY = ((eY * u) + polygon.m_vertices[vertIndex1].y); tPoint.id.features.incidentEdge = vertIndex1; }; }; 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); } } }//package Box2D.Collision
Section 16
//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._referenceFace = (_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 17
//b2ContactPoint (Box2D.Collision.b2ContactPoint) package Box2D.Collision { import Box2D.Common.Math.*; import Box2D.Collision.Shapes.*; public class b2ContactPoint { public var normalForce:Number; public var separation:Number; public var normal:b2Vec2; public var position:b2Vec2; public var tangentForce:Number; public var shape1:b2Shape; public var shape2:b2Shape; public var id:b2ContactID; public function b2ContactPoint(){ position = new b2Vec2(); normal = new b2Vec2(); id = new b2ContactID(); super(); } } }//package Box2D.Collision
Section 18
//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 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) { 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 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: p1s[0].SetV(w1); p2s[0].SetV(w2); points[0].Set(wX, wY); x1.SetV(p1s[0]); x2.SetV(p2s[0]); pointCount++; break; case 1: p1s[1].SetV(w1); p2s[1].SetV(w2); points[1].x = wX; points[1].y = wY; pointCount = ProcessTwo(x1, x2, p1s, p2s, points); break; case 2: p1s[2].SetV(w1); p2s[2].SetV(w2); points[2].x = wX; points[2].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) { maxSqr = b2Math.b2Max(maxSqr, ((points[i].x * points[i].x) + (points[i].y * points[i].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 lambda:Number; 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)))){ 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)))){ 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.GetRadius() - 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.GetType(); var type2:int = shape2.GetType(); 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 lambda:Number; 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 19
//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 20
//b2ManifoldPoint (Box2D.Collision.b2ManifoldPoint) package Box2D.Collision { import Box2D.Common.Math.*; public class b2ManifoldPoint { public var normalForce:Number; public var tangentForce:Number; public var id:b2ContactID; public var separation:Number; public var localPoint2:b2Vec2; public var localPoint1:b2Vec2; 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; normalForce = m.normalForce; tangentForce = m.tangentForce; id.key = m.id.key; } public function Reset():void{ localPoint1.SetZero(); localPoint2.SetZero(); separation = 0; normalForce = 0; tangentForce = 0; id.key = 0; } } }//package Box2D.Collision
Section 21
//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 22
//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 23
//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 24
//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[(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 index:uint = m_hashTable[hash]; while (((!((index == b2Pair.b2_nullPair))) && ((Equals(m_pairs[index], proxyId1, proxyId2) == false)))) { index = m_pairs[index].next; }; if (index == b2Pair.b2_nullPair){ return (null); }; return (m_pairs[index]); } 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 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) { pair = Find(m_pairBuffer[i].proxyId1, m_pairBuffer[i].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); }; m_pairBuffer[removeCount].proxyId1 = pair.proxyId1; m_pairBuffer[removeCount].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) { RemovePair(m_pairBuffer[i].proxyId1, m_pairBuffer[i].proxyId2); i++; }; m_pairBufferCount = 0; if (b2BroadPhase.s_validate){ ValidateTable(); }; } public function RemoveBufferedPair(proxyId1:int, proxyId2:int):void{ var pair:b2Pair = Find(proxyId1, proxyId2); if (pair == null){ return; }; if (pair.IsBuffered() == false){ pair.SetBuffered(); m_pairBuffer[m_pairBufferCount].proxyId1 = pair.proxyId1; m_pairBuffer[m_pairBufferCount].proxyId2 = pair.proxyId2; m_pairBufferCount++; }; pair.SetRemoved(); if (b2BroadPhase.s_validate){ ValidateBuffer(); }; } private function RemovePair(proxyId1:uint, proxyId2:uint){ var temp:uint; var index:uint; var pair:b2Pair; 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; if (pNode){ pNode.next = m_pairs[node].next; } else { m_hashTable[hash] = m_pairs[node].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 pair:b2Pair = AddPair(proxyId1, proxyId2); if (pair.IsBuffered() == false){ pair.SetBuffered(); m_pairBuffer[m_pairBufferCount].proxyId1 = pair.proxyId1; m_pairBuffer[m_pairBufferCount].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 25
//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 26
//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 27
//b2Segment (Box2D.Collision.b2Segment) package Box2D.Collision { import Box2D.Common.Math.*; 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); } } }//package Box2D.Collision
Section 28
//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 t:Number; var xf1:b2XForm; var xf2:b2XForm; var nLen:Number; var approachVelocityBound:Number; var dAlpha:Number; var newAlpha:Number; var r1:Number = shape1.GetSweepRadius(); var r2:Number = shape2.GetSweepRadius(); 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 { targetDistance = Math.max((0.05 * b2Settings.b2_toiSlop), (distance - (0.5 * b2Settings.b2_toiSlop))); }; }; 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))) + (Math.abs(omega1) * r1)) + (Math.abs(omega2) * r2)); if (Math.abs(approachVelocityBound) < Number.MIN_VALUE){ 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 29
//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 30
//Features (Box2D.Collision.Features) package Box2D.Collision { public class Features { public var _referenceFace: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 referenceFace():int{ return (_referenceFace); } 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 referenceFace(value:int):void{ _referenceFace = value; _m_id._key = ((_m_id._key & 4294967040) | (_referenceFace & 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 31
//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 32
//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 33
//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 34
//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{ x = Math.abs(x); y = Math.abs(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 35
//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 36
//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 37
//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 = 0x0200; public static const b2_maxAngularVelocitySquared:Number = 62500; public static const b2_maxPolygonVertices:int = 20; public static const b2_velocityThreshold:Number = 1; public static const b2_contactBaumgarte:Number = 0.2; public static const b2_maxPairs:int = 4096; 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 38
//b2CircleContact (Box2D.Dynamics.Contacts.b2CircleContact) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import Box2D.Common.*; public class b2CircleContact extends b2Contact { private var m_manifolds:Array; public var m_manifold:b2Manifold; private var m0:b2Manifold; private static var 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; m_manifold.points[0].normalForce = 0; m_manifold.points[0].tangentForce = 0; } override public function Evaluate(listener:b2ContactListener):void{ var cp:b2ContactPoint; var tMat:b2Mat22; var tVec:b2Vec2; 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); if (m_manifold.pointCount > 0){ m_manifoldCount = 1; if (m0.pointCount == 0){ m_manifold.points[0].id.features.flip = (m_manifold.points[0].id.features.flip | b2Collision.b2_newPoint); } else { m_manifold.points[0].id.features.flip = (m_manifold.points[0].id.features.flip & ~(b2Collision.b2_newPoint)); }; } else { m_manifoldCount = 0; if ((((m0.pointCount > 0)) && (listener))){ cp = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.normal.SetV(m0.normal); tMat = b1.m_xf.R; tVec = m0.points[0].localPoint1; cp.position.x = (b1.m_xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (b1.m_xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = m0.points[0].separation; cp.normalForce = m0.points[0].normalForce; cp.tangentForce = m0.points[0].tangentForce; cp.id.key = m0.points[0].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 39
//b2Contact (Box2D.Dynamics.Contacts.b2Contact) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; 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{ Evaluate(listener); var body1:b2Body = m_shape1.GetBody(); var body2:b2Body = m_shape2.GetBody(); 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.GetManifoldCount() > 0){ contact.GetShape1().GetBody().WakeUp(); contact.GetShape2().GetBody().WakeUp(); }; var type1:int = contact.GetShape1().GetType(); var type2:int = contact.GetShape2().GetType(); var destroyFcn:* = s_registers[type1][type2].destroyFcn; destroyFcn(contact, allocator); } public static function AddType(createFcn, destroyFcn, 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 createFcn:* = s_registers[type1][type2].createFcn; if (createFcn){ if (s_registers[type1][type2].primary){ return (createFcn(shape1, shape2, allocator)); }; c = createFcn(shape2, shape1, allocator); i = 0; while (i < c.GetManifoldCount()) { m = c.GetManifolds()[i]; m.normal = m.normal.Negative(); i++; }; return (c); //unresolved jump }; return (null); } } }//package Box2D.Dynamics.Contacts
Section 40
//b2ContactConstraint (Box2D.Dynamics.Contacts.b2ContactConstraint) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; 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 41
//b2ContactConstraintPoint (Box2D.Dynamics.Contacts.b2ContactConstraintPoint) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; public class b2ContactConstraintPoint { public var tangentForce:Number; public var normalForce:Number; public var positionImpulse:Number; public var separation:Number; public var localAnchor1:b2Vec2; public var localAnchor2:b2Vec2; public var tangentMass:Number; public var normalMass:Number; public var velocityBias:Number; public var equalizedMass:Number; public function b2ContactConstraintPoint(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); super(); } } }//package Box2D.Dynamics.Contacts
Section 42
//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 43
//b2ContactRegister (Box2D.Dynamics.Contacts.b2ContactRegister) package Box2D.Dynamics.Contacts { public class b2ContactRegister { public var primary:Boolean; public var createFcn; public var destroyFcn; public function b2ContactRegister(){ super(); } } }//package Box2D.Dynamics.Contacts
Section 44
//b2ContactSolver (Box2D.Dynamics.Contacts.b2ContactSolver) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; 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 i:int; var tVec:b2Vec2; var tMat:b2Mat22; var contact:b2Contact; 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) { m_constraintCount = (m_constraintCount + contacts[i].GetManifoldCount()); 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.GetManifoldCount(); 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.normalForce = cp.normalForce; ccp.tangentForce = cp.tangentForce; ccp.separation = cp.separation; ccp.positionImpulse = 0; ccp.localAnchor1.SetV(cp.localPoint1); ccp.localAnchor2.SetV(cp.localPoint2); tMat = b1.m_xf.R; r1X = (ccp.localAnchor1.x - b1.GetLocalCenter().x); r1Y = (ccp.localAnchor1.y - b1.GetLocalCenter().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 = (ccp.localAnchor2.x - b2.GetLocalCenter().x); r2Y = (ccp.localAnchor2.y - b2.GetLocalCenter().y); tX = ((tMat.col1.x * r2X) + (tMat.col2.x * r2Y)); r2Y = ((tMat.col1.y * r2X) + (tMat.col2.y * r2Y)); r2X = tX; 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():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 r1X:Number; var r1Y:Number; var r2X:Number; var r2Y: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 (b2World.s_enableWarmStarting){ tCount = c.pointCount; j = 0; while (j < tCount) { ccp = c.points[j]; PX = (m_step.dt * ((ccp.normalForce * normalX) + (ccp.tangentForce * tangentX))); PY = (m_step.dt * ((ccp.normalForce * normalY) + (ccp.tangentForce * tangentY))); tMat = b1.m_xf.R; tVec = b1.GetLocalCenter(); 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.GetLocalCenter(); 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; b1.m_angularVelocity = (b1.m_angularVelocity - (invI1 * ((r1X * PY) - (r1Y * 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 * ((r2X * PY) - (r2Y * 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.normalForce = 0; ccp2.tangentForce = 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.GetLocalCenter(); 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.GetLocalCenter(); 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 lambda:Number; var newImpulse:Number; var PX:Number; var PY:Number; var tMat:b2Mat22; var tVec:b2Vec2; var c:b2ContactConstraint; var b1:b2Body; var b2:b2Body; var b1_angularVelocity:Number; var b1_linearVelocity:b2Vec2; var b2_angularVelocity:Number; var b2_linearVelocity: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 tX:Number; var tCount:int; var vn:Number; var newForce:Number; var vt:Number; var maxFriction:Number; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; b1 = c.body1; b2 = c.body2; b1_angularVelocity = b1.m_angularVelocity; b1_linearVelocity = b1.m_linearVelocity; b2_angularVelocity = b2.m_angularVelocity; b2_linearVelocity = 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); tCount = c.pointCount; j = 0; while (j < tCount) { ccp = c.points[j]; tMat = b1.m_xf.R; tVec = b1.GetLocalCenter(); 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.GetLocalCenter(); 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; dvX = (((b2_linearVelocity.x + (-(b2_angularVelocity) * r2Y)) - b1_linearVelocity.x) - (-(b1_angularVelocity) * r1Y)); dvY = (((b2_linearVelocity.y + (b2_angularVelocity * r2X)) - b1_linearVelocity.y) - (b1_angularVelocity * r1X)); vn = ((dvX * normalX) + (dvY * normalY)); lambda = ((-(m_step.inv_dt) * ccp.normalMass) * (vn - ccp.velocityBias)); newForce = b2Math.b2Max((ccp.normalForce + lambda), 0); lambda = (newForce - ccp.normalForce); PX = ((m_step.dt * lambda) * normalX); PY = ((m_step.dt * lambda) * normalY); b1_linearVelocity.x = (b1_linearVelocity.x - (invMass1 * PX)); b1_linearVelocity.y = (b1_linearVelocity.y - (invMass1 * PY)); b1_angularVelocity = (b1_angularVelocity - (invI1 * ((r1X * PY) - (r1Y * PX)))); b2_linearVelocity.x = (b2_linearVelocity.x + (invMass2 * PX)); b2_linearVelocity.y = (b2_linearVelocity.y + (invMass2 * PY)); b2_angularVelocity = (b2_angularVelocity + (invI2 * ((r2X * PY) - (r2Y * PX)))); ccp.normalForce = newForce; dvX = (((b2_linearVelocity.x + (-(b2_angularVelocity) * r2Y)) - b1_linearVelocity.x) - (-(b1_angularVelocity) * r1Y)); dvY = (((b2_linearVelocity.y + (b2_angularVelocity * r2X)) - b1_linearVelocity.y) - (b1_angularVelocity * r1X)); vt = ((dvX * tangentX) + (dvY * tangentY)); lambda = ((m_step.inv_dt * ccp.tangentMass) * -(vt)); maxFriction = (c.friction * ccp.normalForce); newForce = b2Math.b2Clamp((ccp.tangentForce + lambda), -(maxFriction), maxFriction); lambda = (newForce - ccp.tangentForce); PX = ((m_step.dt * lambda) * tangentX); PY = ((m_step.dt * lambda) * tangentY); b1_linearVelocity.x = (b1_linearVelocity.x - (invMass1 * PX)); b1_linearVelocity.y = (b1_linearVelocity.y - (invMass1 * PY)); b1_angularVelocity = (b1_angularVelocity - (invI1 * ((r1X * PY) - (r1Y * PX)))); b2_linearVelocity.x = (b2_linearVelocity.x + (invMass2 * PX)); b2_linearVelocity.y = (b2_linearVelocity.y + (invMass2 * PY)); b2_angularVelocity = (b2_angularVelocity + (invI2 * ((r2X * PY) - (r2Y * PX)))); ccp.tangentForce = newForce; j++; }; b1.m_angularVelocity = b1_angularVelocity; b2.m_angularVelocity = b2_angularVelocity; i++; }; } public function FinalizeVelocityConstraints():void{ var c:b2ContactConstraint; var m:b2Manifold; var j:int; var i:int; while (i < m_constraintCount) { c = m_constraints[i]; m = c.manifold; j = 0; while (j < c.pointCount) { m.points[j].normalForce = c.points[j].normalForce; m.points[j].tangentForce = c.points[j].tangentForce; 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.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import Box2D.Common.*; public class b2PolyAndCircleContact extends b2Contact { private var m_manifolds:Array; public var m_manifold:b2Manifold; private var m0:b2Manifold; private static var 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; m_manifold.points[0].normalForce = 0; m_manifold.points[0].tangentForce = 0; } override public function Evaluate(listener:b2ContactListener):void{ var cp:b2ContactPoint; var tMat:b2Mat22; var tVec:b2Vec2; var b1:b2Body = m_shape1.GetBody(); var b2:b2Body = m_shape2.GetBody(); m0.Set(m_manifold); b2Collision.b2CollidePolygonAndCircle(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2CircleShape), b2.m_xf); if (m_manifold.pointCount > 0){ m_manifoldCount = 1; if (m0.pointCount == 0){ m_manifold.points[0].id.features.flip = (m_manifold.points[0].id.features.flip | b2Collision.b2_newPoint); } else { m_manifold.points[0].id.features.flip = (m_manifold.points[0].id.features.flip & ~(b2Collision.b2_newPoint)); }; } else { m_manifoldCount = 0; if ((((m0.pointCount > 0)) && (listener))){ cp = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.normal.SetV(m0.normal); tMat = b1.m_xf.R; tVec = m0.points[0].localPoint1; cp.position.x = (b1.m_xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (b1.m_xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = m0.points[0].separation; cp.normalForce = m0.points[0].normalForce; cp.tangentForce = m0.points[0].tangentForce; cp.id = m0.points[0].id; 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 b2PolyAndCircleContact(shape1, shape2)); } } }//package Box2D.Dynamics.Contacts
Section 47
//b2PolygonContact (Box2D.Dynamics.Contacts.b2PolygonContact) package Box2D.Dynamics.Contacts { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; public class b2PolygonContact extends b2Contact { private var m_manifolds:Array; private var m0:b2Manifold; public var m_manifold:b2Manifold; private static var 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 cp:b2ContactPoint; var i:int; var mp:b2ManifoldPoint; var matched:Boolean; var idKey:uint; var j:int; var cp0:b2ManifoldPoint; var id0:b2ContactID; var mp0:b2ManifoldPoint; var tMat:b2Mat22; var tVec:b2Vec2; var b1:b2Body = m_shape1.GetBody(); var b2:b2Body = m_shape2.GetBody(); m0.Set(m_manifold); b2Collision.b2CollidePolygons(m_manifold, (m_shape1 as b2PolygonShape), b1.m_xf, (m_shape2 as b2PolygonShape), b2.m_xf); var match:Array = [false, false]; if (m_manifold.pointCount > 0){ i = 0; while (i < m_manifold.pointCount) { mp = m_manifold.points[i]; mp.normalForce = 0; mp.tangentForce = 0; matched = false; idKey = mp.id.key; j = 0; while (j < m0.pointCount) { if (match[j] == true){ } else { cp0 = m0.points[j]; id0 = cp0.id; id0.features.flip = (id0.features.flip & ~(b2Collision.b2_newPoint)); if (id0.key == idKey){ match[j] = true; mp.normalForce = cp0.normalForce; mp.tangentForce = cp0.tangentForce; matched = true; break; }; }; j++; }; if (matched == false){ mp.id.features.flip = (mp.id.features.flip | b2Collision.b2_newPoint); }; i++; }; m_manifoldCount = 1; } else { m_manifoldCount = 0; }; if (((listener) && ((m0.pointCount > 0)))){ cp = s_evalCP; cp.shape1 = m_shape1; cp.shape2 = m_shape2; cp.normal.SetV(m0.normal); i = 0; while (i < m0.pointCount) { if (match[i]){ } else { mp0 = m0.points[i]; tMat = b1.m_xf.R; tVec = mp0.localPoint1; cp.position.x = (b1.m_xf.position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (b1.m_xf.position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = mp0.separation; cp.normalForce = mp0.normalForce; cp.tangentForce = mp0.tangentForce; 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.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Common.*; public class b2DistanceJoint extends b2Joint { public var m_localAnchor1:b2Vec2; public var m_localAnchor2:b2Vec2; public var m_u:b2Vec2; public var m_length:Number; public var m_force:Number; public var m_mass: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_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 GetReactionTorque():Number{ return (0); } override public function GetReactionForce():b2Vec2{ var F:b2Vec2 = new b2Vec2(); F.SetV(m_u); F.Multiply(m_force); return (F); } override public function SolvePositionConstraints():Boolean{ 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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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 InitVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var tX:Number; var b1:b2Body; var b2:b2Body; var r1X:Number; var r1Y:Number; var r2X:Number; var PX:Number; var PY:Number; b1 = m_body1; b2 = m_body2; tMat = b1.m_xf.R; r1X = (m_localAnchor1.x - b1.GetLocalCenter().x); r1Y = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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)); m_mass = (((b1.m_invMass + ((b1.m_invI * cr1u) * cr1u)) + b2.m_invMass) + ((b2.m_invI * cr2u) * cr2u)); m_mass = (1 / m_mass); if (b2World.s_enableWarmStarting){ PX = ((step.dt * m_force) * m_u.x); PY = ((step.dt * m_force) * 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_force = 0; }; } override public function SolveVelocityConstraints(step:b2TimeStep):void{ var tMat:b2Mat22; var b1:b2Body; b1 = m_body1; var b2:b2Body = m_body2; tMat = b1.m_xf.R; var r1X:Number = (m_localAnchor1.x - b1.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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 force:Number = ((-(step.inv_dt) * m_mass) * Cdot); m_force = (m_force + force); var PX:Number = ((step.dt * force) * m_u.x); var PY:Number = ((step.dt * force) * 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.Common.Math.*; import Box2D.Dynamics.*; public class b2DistanceJointDef extends b2JointDef { public var localAnchor1:b2Vec2; public var length:Number; public var localAnchor2:b2Vec2; public function b2DistanceJointDef(){ localAnchor1 = new b2Vec2(); localAnchor2 = new b2Vec2(); super(); type = b2Joint.e_distanceJoint; length = 1; } 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))); } } }//package Box2D.Dynamics.Joints
Section 50
//b2GearJoint (Box2D.Dynamics.Joints.b2GearJoint) package Box2D.Dynamics.Joints { import Box2D.Common.Math.*; import Box2D.Dynamics.*; 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); 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 (def.joint1.m_type == 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 (def.joint2.m_type == 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 b1:b2Body; var b2:b2Body; 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; b1 = m_body1; b2 = 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.GetLocalCenter().x); rY = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); rY = (m_localAnchor2.y - b2.GetLocalCenter().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 (b2World.s_enableWarmStarting){ 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.GetLocalCenter().x); var rY:Number = (m_localAnchor1.y - m_body2.GetLocalCenter().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.Common.Math.*; import Box2D.Dynamics.*; public class b2Joint { public var m_islandFlag:Boolean; 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_userData; public var m_body1:b2Body; 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 InitPositionConstraints():void{ } 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 GetBody1():b2Body{ return (m_body1); } public function SolveVelocityConstraints(step:b2TimeStep):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.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Common.*; public class b2MouseJoint extends b2Joint { private var K1:b2Mat22; private var K:b2Mat22; public var m_mass:b2Mat22; public var m_beta:Number; public var m_force:b2Vec2; private var K2:b2Mat22; public var m_target:b2Vec2; public var m_gamma:Number; 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_force = 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_force.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 = ((mass * omega) * omega); m_gamma = (1 / (d + (def.timeStep * k))); m_beta = ((def.timeStep * k) / (d + (def.timeStep * 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.GetLocalCenter().x); rY = (m_localAnchor.y - b.GetLocalCenter().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_force.x); var PY:Number = (step.dt * m_force.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_force); } 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.GetLocalCenter().x); var rY:Number = (m_localAnchor.y - b.GetLocalCenter().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_force.x)); tY = ((CdotY + ((m_beta * step.inv_dt) * m_C.y)) + ((m_gamma * step.dt) * m_force.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_force.x; var oldForceY:Number = m_force.y; m_force.x = (m_force.x + forceX); m_force.y = (m_force.y + forceY); var forceMagnitude:Number = m_force.Length(); if (forceMagnitude > m_maxForce){ m_force.Multiply((m_maxForce / forceMagnitude)); }; forceX = (m_force.x - oldForceX); forceY = (m_force.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.Common.Math.*; import Box2D.Dynamics.*; 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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); r1Y = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); r2Y = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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 (b2World.s_enableWarmStarting){ 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.Common.Math.*; import Box2D.Dynamics.*; 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.Common.Math.*; import Box2D.Dynamics.*; 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.GetLocalCenter().x); r1Y = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); r2Y = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); r1Y = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); r2Y = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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 (b2World.s_enableWarmStarting){ 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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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.Common.Math.*; import Box2D.Dynamics.*; 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.Common.Math.*; import Box2D.Dynamics.*; 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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); var r1Y:Number = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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.GetLocalCenter().x); r1Y = (m_localAnchor1.y - b1.GetLocalCenter().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.GetLocalCenter().x); var r2Y:Number = (m_localAnchor2.y - b2.GetLocalCenter().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 (b2World.s_enableWarmStarting){ 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.Common.Math.*; import Box2D.Dynamics.*; 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_xf:b2XForm; public var m_next:b2Body; public var m_contactList:b2ContactEdge; public var m_angularVelocity:Number; public var m_shapeList:b2Shape; public var m_force:b2Vec2; public var m_sweep:b2Sweep; public var m_mass:Number; public var m_torque:Number; public var m_userData; public var m_linearVelocity:b2Vec2; public var m_flags:uint; public var m_invI:Number; public var m_world:b2World; public var m_prev:b2Body; public var m_invMass:Number; public var m_type:uint; public var m_linearDamping:Number; public var m_shapeCount:int; public var m_angularDamping:Number; 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, type:uint, 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_type = type; 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_mass = 0; m_invMass = 0; m_I = 0; m_invI = 0; if (m_type == e_dynamicType){ m_mass = bd.massData.mass; }; if (m_mass > 0){ m_invMass = (1 / m_mass); }; if (((((m_flags & b2Body.e_fixedRotationFlag) == 0)) && ((m_type == e_dynamicType)))){ m_I = bd.massData.I; }; if (m_I > 0){ m_invI = (1 / m_I); }; m_userData = bd.userData; m_shapeList = null; m_shapeCount = 0; } 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 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 GetLinearVelocity():b2Vec2{ return (m_linearVelocity); } 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; }; if (m_type == e_staticType){ 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); } else { m_invMass = 0; m_invI = 0; }; 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; }; } 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 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 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 GetContactList():b2ContactEdge{ return (m_contactList); } public function GetAngularVelocity():Number{ return (m_angularVelocity); } public function GetMass():Number{ return (m_mass); } public function GetShapeList():b2Shape{ return (m_shapeList); } public function GetLocalPoint(worldPoint:b2Vec2):b2Vec2{ return (b2Math.b2MulXT(m_xf, worldPoint)); } public function SetAngularVelocity(omega:Number):void{ m_angularVelocity = omega; } public function SetMass(massData:b2MassData):void{ var tMat:b2Mat22; if (m_world.m_lock == true){ return; }; if (m_type == e_staticType){ return; }; m_mass = 0; 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); tMat = 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); var s:b2Shape = m_shapeList; while (s) { s.UpdateSweepRadius(m_sweep.localCenter); 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 GetNext():b2Body{ return (m_next); } 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 found:Boolean; while (node != null) { if (node == s){ node = s.m_next; found = true; break; }; 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 GetLocalVector(worldVector:b2Vec2):b2Vec2{ return (b2Math.b2MulTMV(m_xf.R, worldVector)); } public function GetWorldPoint(localPoint:b2Vec2):b2Vec2{ return (b2Math.b2MulX(m_xf, localPoint)); } 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{ if ((((shape1.m_groupIndex == shape2.m_groupIndex)) && (!((shape1.m_groupIndex == 0))))){ return ((shape1.m_groupIndex > 0)); }; var collide:Boolean = ((!(((shape1.m_maskBits & shape2.m_categoryBits) == 0))) && (!(((shape1.m_categoryBits & shape2.m_maskBits) == 0)))); return (collide); } } }//package Box2D.Dynamics
Section 68
//b2ContactListener (Box2D.Dynamics.b2ContactListener) package Box2D.Dynamics { import Box2D.Collision.*; 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{ } } }//package Box2D.Dynamics
Section 69
//b2ContactManager (Box2D.Dynamics.b2ContactManager) package Box2D.Dynamics { import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; 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; 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 cp:b2ContactPoint; var b1:b2Body; var manifolds:Array; var i:int; var manifold:b2Manifold; var j:int; var point:b2ManifoldPoint; var tMat:b2Mat22; var tPos:b2Vec2; var tVec:b2Vec2; var shape1:b2Shape = c.GetShape1(); var shape2:b2Shape = c.GetShape2(); var manifoldCount:int = c.GetManifoldCount(); if ((((manifoldCount > 0)) && (m_world.m_contactListener))){ cp = new b2ContactPoint(); cp.shape1 = c.GetShape1(); cp.shape2 = c.GetShape2(); b1 = cp.shape1.GetBody(); manifolds = c.GetManifolds(); i = 0; while (i < manifoldCount) { manifold = manifolds[i]; cp.normal.SetV(manifold.normal); j = 0; while (j < manifold.pointCount) { point = manifold.points[j]; tMat = b1.GetXForm().R; tPos = b1.GetXForm().position; tVec = point.localPoint1; cp.position.x = (tPos.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (tPos.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = point.separation; cp.normalForce = point.normalForce; cp.tangentForce = point.tangentForce; cp.id = point.id; 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.GetBody(); var body2:b2Body = shape2.GetBody(); 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 shape1:b2Shape = (proxyUserData1 as b2Shape); var shape2:b2Shape = (proxyUserData2 as b2Shape); var body1:b2Body = shape1.GetBody(); var body2:b2Body = shape2.GetBody(); 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.GetShape1(); shape2 = c.GetShape2(); body1 = shape1.GetBody(); body2 = shape2.GetBody(); 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 cp:b2ContactPoint; var b1:b2Body; var manifoldCount:int; var manifolds:Array; var i:int; var manifold:b2Manifold; var j:int; var point:b2ManifoldPoint; var tMat:b2Mat22; var tPos:b2Vec2; var tVec:b2Vec2; var c:b2Contact = m_world.m_contactList; while (c) { body1 = c.GetShape1().GetBody(); body2 = c.GetShape2().GetBody(); if (((body1.IsSleeping()) && (body2.IsSleeping()))){ } else { c.Update(m_world.m_contactListener); if ((((c.IsSolid() == false)) && (m_world.m_contactListener))){ cp = new b2ContactPoint(); cp.shape1 = c.GetShape1(); cp.shape2 = c.GetShape2(); cp.normalForce = 0; cp.tangentForce = 0; b1 = cp.shape1.GetBody(); manifoldCount = c.GetManifoldCount(); manifolds = c.GetManifolds(); i = 0; while (i < manifoldCount) { manifold = manifolds[i]; cp.normal.SetV(manifold.normal); j = 0; while (j < manifold.pointCount) { point = manifold.points[j]; tMat = b1.GetXForm().R; tPos = b1.GetXForm().position; tVec = point.localPoint1; cp.position.x = (tPos.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (tPos.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = point.separation; if ((point.id.features.flip & b2Collision.b2_newPoint)){ point.id.features.flip = (point.id.features.flip & ~(b2Collision.b2_newPoint)); cp.id = point.id; m_world.m_contactListener.Add(cp); } else { cp.id = point.id; m_world.m_contactListener.Persist(cp); }; j++; }; i++; }; }; }; c = c.GetNext(); }; } } }//package Box2D.Dynamics
Section 70
//b2DebugDraw (Box2D.Dynamics.b2DebugDraw) package Box2D.Dynamics { import flash.display.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; 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.Collision.*; import Box2D.Dynamics.Joints.*; 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_reportCP:b2ContactPoint = new b2ContactPoint(); 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 cp:b2ContactPoint; 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]; cp = s_reportCP; cp.shape1 = c.GetShape1(); cp.shape2 = c.GetShape2(); b1 = cp.shape1.GetBody(); manifoldCount = c.GetManifoldCount(); manifolds = c.GetManifolds(); j = 0; while (j < manifoldCount) { manifold = manifolds[j]; cp.normal.SetV(manifold.normal); k = 0; while (k < manifold.pointCount) { point = manifold.points[k]; ccp = cc.points[k]; tMat = b1.GetXForm().R; tVec = point.localPoint1; cp.position.x = (b1.GetXForm().position.x + ((tMat.col1.x * tVec.x) + (tMat.col2.x * tVec.y))); cp.position.y = (b1.GetXForm().position.y + ((tMat.col1.y * tVec.x) + (tMat.col2.y * tVec.y))); cp.separation = point.separation; cp.normalForce = ccp.normalForce; cp.tangentForce = ccp.tangentForce; if ((point.id.features.flip & b2Collision.b2_newPoint)){ point.id.features.flip = (point.id.features.flip & ~(b2Collision.b2_newPoint)); cp.id.key = point.id.key; m_listener.Add(cp); } else { cp.id.key = point.id.key; m_listener.Persist(cp); }; 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 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(); i = 0; while (i < m_jointCount) { m_joints[i].InitVelocityConstraints(step); i++; }; i = 0; while (i < step.maxIterations) { contactSolver.SolveVelocityConstraints(); j = 0; while (j < m_jointCount) { m_joints[j].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) { m_joints[i].InitPositionConstraints(); i++; }; m_positionIterationCount = 0; while (m_positionIterationCount < step.maxIterations) { contactsOkay = contactSolver.SolvePositionConstraints(b2Settings.b2_contactBaumgarte); jointsOkay = true; i = 0; while (i < m_jointCount) { jointOkay = m_joints[i].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 dt:Number; public var maxIterations:int; 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.Collision.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.Shapes.*; import Box2D.Common.*; import Box2D.Dynamics.Contacts.*; public class b2World { public var m_contactList:b2Contact; public var m_blockAllocator; public var m_boundaryListener:b2BoundaryListener; public var m_allowSleep:Boolean; public var m_contactListener:b2ContactListener; public var m_broadPhase:b2BroadPhase; public var m_destructionListener:b2DestructionListener; public var m_jointCount:int; public var m_bodyCount:int; public var m_lock:Boolean; public var m_positionIterationCount:int; public var m_groundBody:b2Body; public var m_contactCount:int; public var m_debugDraw:b2DebugDraw; public var m_contactFilter:b2ContactFilter; public var m_bodyList:b2Body; 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 s_enablePositionCorrection:int = 1; private static var s_coreColor:b2Color = new b2Color(0.9, 0.6, 0.6); private static var s_xf:b2XForm = new b2XForm(); public static var s_enableWarmStarting:int = 1; public static var s_enableTOI:int = 1; public function b2World(worldAABB:b2AABB, gravity:b2Vec2, doSleep:Boolean){ 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_allowSleep = doSleep; m_gravity = gravity; m_lock = false; m_contactManager.m_world = this; m_broadPhase = new b2BroadPhase(worldAABB, m_contactManager); var bd:b2BodyDef = new b2BodyDef(); m_groundBody = CreateStaticBody(bd); } public function DrawJoint(joint:b2Joint):void{ var pulley:b2PulleyJoint; var s1:b2Vec2; var s2:b2Vec2; var b1:b2Body = joint.GetBody1(); var b2:b2Body = joint.GetBody2(); var xf1:b2XForm = b1.GetXForm(); var xf2:b2XForm = b2.GetXForm(); 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.GetType()){ 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 SetDebugDraw(debugDraw:b2DebugDraw):void{ m_debugDraw = debugDraw; } public function SetListener(listener:b2ContactListener):void{ m_contactListener = listener; } 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.GetXForm(); 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.GetNext(); }; b = b.GetNext(); }; }; if ((flags & b2DebugDraw.e_jointBit)){ j = m_jointList; while (j) { DrawJoint(j); j = j.GetNext(); }; }; 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.GetXForm(); s = b.GetShapeList(); while (s) { if (s.GetType() != 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.GetNext(); }; b = b.GetNext(); }; }; if ((flags & b2DebugDraw.e_centerOfMassBit)){ b = m_bodyList; while (b) { xf = s_xf; xf.R = b.GetXForm().R; xf.position = b.GetWorldCenter(); m_debugDraw.DrawXForm(xf); b = b.GetNext(); }; }; } 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.GetLocalPosition()); radius = circle.GetRadius(); 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 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.GetManifoldCount() == 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, (s_enablePositionCorrection > 0), m_allowSleep); m_positionIterationCount = Math.max(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.GetNext(); }; m_broadPhase.Commit(); } public function GetGroundBody():b2Body{ return (m_groundBody); } 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] as b2Shape); i++; }; return (count); } 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.GetShape1(); s2 = c.GetShape2(); b1 = s1.GetBody(); b2 = s2.GetBody(); 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 = Math.min((((1 - toi) * t0) + 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.GetShape1(); s2 = minContact.GetShape2(); b1 = s1.GetBody(); b2 = s2.GetBody(); b1.Advance(minTOI); b2.Advance(minTOI); minContact.Update(m_contactListener); minContact.m_flags = (minContact.m_flags & ~(b2Contact.e_toiFlag)); if (minContact.GetManifoldCount() == 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.GetManifoldCount() == 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 GetBodyList():b2Body{ return (m_bodyList); } public function CreateDynamicBody(def:b2BodyDef):b2Body{ if (m_lock == true){ return (null); }; var b:b2Body = new b2Body(def, b2Body.e_dynamicType, 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 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.ResetProxy(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.ResetProxy(m_broadPhase, b.m_xf); s = s.m_next; }; }; } public function SetFilter(filter:b2ContactFilter):void{ m_contactFilter = filter; } public function SetBoundaryListener(listener:b2BoundaryListener):void{ m_boundaryListener = listener; } public function SetDestructionListener(listener:b2DestructionListener):void{ m_destructionListener = listener; } public function CreateStaticBody(def:b2BodyDef):b2Body{ if (m_lock == true){ return (null); }; var b:b2Body = new b2Body(def, b2Body.e_staticType, 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 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; }; m_contactManager.Collide(); if (step.dt > 0){ Solve(step); }; if (((s_enableTOI) && ((step.dt > 0)))){ SolveTOI(step); }; DrawDebugData(); m_lock = false; } } }//package Box2D.Dynamics
Section 75
//ColorShortcuts (caurina.transitions.properties.ColorShortcuts) package caurina.transitions.properties { import flash.geom.*; import caurina.transitions.*; import flash.filters.*; public class ColorShortcuts { private static var LUMINANCE_B:Number = 0.072169; private static var LUMINANCE_G:Number = 0.71516; private static var LUMINANCE_R:Number = 0.212671; public function ColorShortcuts(){ super(); trace("This is an static class and should not be instantiated."); } public static function _color_splitter(p_value, p_parameters:Array):Array{ var nArray:Array = new Array(); if (p_value == null){ nArray.push({name:"_color_redMultiplier", value:1}); nArray.push({name:"_color_redOffset", value:0}); nArray.push({name:"_color_greenMultiplier", value:1}); nArray.push({name:"_color_greenOffset", value:0}); nArray.push({name:"_color_blueMultiplier", value:1}); nArray.push({name:"_color_blueOffset", value:0}); } else { nArray.push({name:"_color_redMultiplier", value:0}); nArray.push({name:"_color_redOffset", value:AuxFunctions.numberToR(p_value)}); nArray.push({name:"_color_greenMultiplier", value:0}); nArray.push({name:"_color_greenOffset", value:AuxFunctions.numberToG(p_value)}); nArray.push({name:"_color_blueMultiplier", value:0}); nArray.push({name:"_color_blueOffset", value:AuxFunctions.numberToB(p_value)}); }; return (nArray); } public static function _contrast_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var mc:Number; var co:Number; mc = (p_value + 1); co = Math.round((p_value * -128)); var cfm:ColorTransform = new ColorTransform(mc, mc, mc, 1, co, co, co, 0); p_obj.transform.colorTransform = cfm; } public static function _brightness_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ var isTint:Boolean = p_parameters[0]; var cfm:ColorTransform = p_obj.transform.colorTransform; var mc:Number = (1 - (((cfm.redMultiplier + cfm.greenMultiplier) + cfm.blueMultiplier) / 3)); var co:Number = (((cfm.redOffset + cfm.greenOffset) + cfm.blueOffset) / 3); if (isTint){ return (((co > 0)) ? (co / 0xFF) : -(mc)); //unresolved jump }; return ((co / 100)); } public static function _saturation_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ var mtx:Array = getObjectMatrix(p_obj); var isDumb:Boolean = p_parameters[0]; var rl:Number = (isDumb) ? (1 / 3) : LUMINANCE_R; var gl:Number = (isDumb) ? (1 / 3) : LUMINANCE_G; var bl:Number = (isDumb) ? (1 / 3) : LUMINANCE_B; var mc:Number = (((((mtx[0] - rl) / (1 - rl)) + ((mtx[6] - gl) / (1 - gl))) + ((mtx[12] - bl) / (1 - bl))) / 3); var cc:Number = (1 - (((((((mtx[1] / gl) + (mtx[2] / bl)) + (mtx[5] / rl)) + (mtx[7] / bl)) + (mtx[10] / rl)) + (mtx[11] / gl)) / 6)); return (((mc + cc) / 2)); } public static function _oldColor_property_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ return ((p_obj.transform.colorTransform[p_parameters[0]] * 100)); } public static function _brightness_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var mc:Number; var co:Number; var isTint:Boolean = p_parameters[0]; if (isTint){ mc = (1 - Math.abs(p_value)); co = ((p_value > 0)) ? Math.round((p_value * 0xFF)) : 0; } else { mc = 1; co = Math.round((p_value * 100)); }; var cfm:ColorTransform = new ColorTransform(mc, mc, mc, 1, co, co, co, 0); p_obj.transform.colorTransform = cfm; } public static function _saturation_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var isDumb:Boolean = p_parameters[0]; var rl:Number = (isDumb) ? (1 / 3) : LUMINANCE_R; var gl:Number = (isDumb) ? (1 / 3) : LUMINANCE_G; var bl:Number = (isDumb) ? (1 / 3) : LUMINANCE_B; var sf:Number = p_value; var nf:Number = (1 - sf); var nr:Number = (rl * nf); var ng:Number = (gl * nf); var nb:Number = (bl * nf); var mtx:Array = [(nr + sf), ng, nb, 0, 0, nr, (ng + sf), nb, 0, 0, nr, ng, (nb + sf), 0, 0, 0, 0, 0, 1, 0]; setObjectMatrix(p_obj, mtx); } private static function getObjectMatrix(p_obj:Object):Array{ var i:Number = 0; while (i < p_obj.filters.length) { if ((p_obj.filters[i] is ColorMatrixFilter)){ return (p_obj.filters[i].matrix.concat()); }; i++; }; return ([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]); } public static function getHueDistance(mtx1:Array, mtx2:Array):Number{ return (((Math.abs((mtx1[0] - mtx2[0])) + Math.abs((mtx1[1] - mtx2[1]))) + Math.abs((mtx1[2] - mtx2[2])))); } public static function _hue_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ setObjectMatrix(p_obj, getHueMatrix(p_value)); } public static function _hue_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ var i:Number; var angleToSplit:Number; var mtx:Array = getObjectMatrix(p_obj); var hues:Array = []; hues[0] = {angle:-179.9, matrix:getHueMatrix(-179.9)}; hues[1] = {angle:180, matrix:getHueMatrix(180)}; i = 0; while (i < hues.length) { hues[i].distance = getHueDistance(mtx, hues[i].matrix); i++; }; var maxTries:Number = 15; i = 0; while (i < maxTries) { if (hues[0].distance < hues[1].distance){ angleToSplit = 1; } else { angleToSplit = 0; }; hues[angleToSplit].angle = ((hues[0].angle + hues[1].angle) / 2); hues[angleToSplit].matrix = getHueMatrix(hues[angleToSplit].angle); hues[angleToSplit].distance = getHueDistance(mtx, hues[angleToSplit].matrix); i++; }; return (hues[angleToSplit].angle); } public static function getHueMatrix(hue:Number):Array{ var ha:Number = ((hue * Math.PI) / 180); var rl:Number = LUMINANCE_R; var gl:Number = LUMINANCE_G; var bl:Number = LUMINANCE_B; var c:Number = Math.cos(ha); var s:Number = Math.sin(ha); var mtx:Array = [((rl + (c * (1 - rl))) + (s * -(rl))), ((gl + (c * -(gl))) + (s * -(gl))), ((bl + (c * -(bl))) + (s * (1 - bl))), 0, 0, ((rl + (c * -(rl))) + (s * 0.143)), ((gl + (c * (1 - gl))) + (s * 0.14)), ((bl + (c * -(bl))) + (s * -0.283)), 0, 0, ((rl + (c * -(rl))) + (s * -((1 - rl)))), ((gl + (c * -(gl))) + (s * gl)), ((bl + (c * (1 - bl))) + (s * bl)), 0, 0, 0, 0, 0, 1, 0]; return (mtx); } public static function _color_property_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ return (p_obj.transform.colorTransform[p_parameters[0]]); } public static function init():void{ Tweener.registerSpecialProperty("_color_ra", _oldColor_property_get, _oldColor_property_set, ["redMultiplier"]); Tweener.registerSpecialProperty("_color_rb", _color_property_get, _color_property_set, ["redOffset"]); Tweener.registerSpecialProperty("_color_ga", _oldColor_property_get, _oldColor_property_set, ["greenMultiplier"]); Tweener.registerSpecialProperty("_color_gb", _color_property_get, _color_property_set, ["greenOffset"]); Tweener.registerSpecialProperty("_color_ba", _oldColor_property_get, _oldColor_property_set, ["blueMultiplier"]); Tweener.registerSpecialProperty("_color_bb", _color_property_get, _color_property_set, ["blueOffset"]); Tweener.registerSpecialProperty("_color_aa", _oldColor_property_get, _oldColor_property_set, ["alphaMultiplier"]); Tweener.registerSpecialProperty("_color_ab", _color_property_get, _color_property_set, ["alphaOffset"]); Tweener.registerSpecialProperty("_color_redMultiplier", _color_property_get, _color_property_set, ["redMultiplier"]); Tweener.registerSpecialProperty("_color_redOffset", _color_property_get, _color_property_set, ["redOffset"]); Tweener.registerSpecialProperty("_color_greenMultiplier", _color_property_get, _color_property_set, ["greenMultiplier"]); Tweener.registerSpecialProperty("_color_greenOffset", _color_property_get, _color_property_set, ["greenOffset"]); Tweener.registerSpecialProperty("_color_blueMultiplier", _color_property_get, _color_property_set, ["blueMultiplier"]); Tweener.registerSpecialProperty("_color_blueOffset", _color_property_get, _color_property_set, ["blueOffset"]); Tweener.registerSpecialProperty("_color_alphaMultiplier", _color_property_get, _color_property_set, ["alphaMultiplier"]); Tweener.registerSpecialProperty("_color_alphaOffset", _color_property_get, _color_property_set, ["alphaOffset"]); Tweener.registerSpecialPropertySplitter("_color", _color_splitter); Tweener.registerSpecialPropertySplitter("_colorTransform", _colorTransform_splitter); Tweener.registerSpecialProperty("_brightness", _brightness_get, _brightness_set, [false]); Tweener.registerSpecialProperty("_tintBrightness", _brightness_get, _brightness_set, [true]); Tweener.registerSpecialProperty("_contrast", _contrast_get, _contrast_set); Tweener.registerSpecialProperty("_hue", _hue_get, _hue_set); Tweener.registerSpecialProperty("_saturation", _saturation_get, _saturation_set, [false]); Tweener.registerSpecialProperty("_dumbSaturation", _saturation_get, _saturation_set, [true]); } private static function setObjectMatrix(p_obj:Object, p_matrix:Array):void{ var cmtx:ColorMatrixFilter; var objFilters:Array = p_obj.filters.concat(); var found:Boolean; var i:Number = 0; while (i < objFilters.length) { if ((objFilters[i] is ColorMatrixFilter)){ objFilters[i].matrix = p_matrix.concat(); found = true; }; i++; }; if (!found){ cmtx = new ColorMatrixFilter(p_matrix); objFilters[objFilters.length] = cmtx; }; p_obj.filters = objFilters; } public static function _color_property_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var cfm:ColorTransform = p_obj.transform.colorTransform; cfm[p_parameters[0]] = p_value; p_obj.transform.colorTransform = cfm; } public static function _oldColor_property_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var tf:ColorTransform = p_obj.transform.colorTransform; tf[p_parameters[0]] = (p_value / 100); p_obj.transform.colorTransform = tf; } public static function _contrast_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ var mc:Number; var co:Number; var cfm:ColorTransform = p_obj.transform.colorTransform; mc = ((((cfm.redMultiplier + cfm.greenMultiplier) + cfm.blueMultiplier) / 3) - 1); co = ((((cfm.redOffset + cfm.greenOffset) + cfm.blueOffset) / 3) / -128); return (((mc + co) / 2)); } public static function _colorTransform_splitter(p_value:Object, p_parameters:Array):Array{ var nArray:Array = new Array(); if (p_value == null){ nArray.push({name:"_color_redMultiplier", value:1}); nArray.push({name:"_color_redOffset", value:0}); nArray.push({name:"_color_greenMultiplier", value:1}); nArray.push({name:"_color_greenOffset", value:0}); nArray.push({name:"_color_blueMultiplier", value:1}); nArray.push({name:"_color_blueOffset", value:0}); } else { if (p_value.ra != undefined){ nArray.push({name:"_color_ra", value:p_value.ra}); }; if (p_value.rb != undefined){ nArray.push({name:"_color_rb", value:p_value.rb}); }; if (p_value.ga != undefined){ nArray.push({name:"_color_ba", value:p_value.ba}); }; if (p_value.gb != undefined){ nArray.push({name:"_color_bb", value:p_value.bb}); }; if (p_value.ba != undefined){ nArray.push({name:"_color_ga", value:p_value.ga}); }; if (p_value.bb != undefined){ nArray.push({name:"_color_gb", value:p_value.gb}); }; if (p_value.aa != undefined){ nArray.push({name:"_color_aa", value:p_value.aa}); }; if (p_value.ab != undefined){ nArray.push({name:"_color_ab", value:p_value.ab}); }; if (p_value.redMultiplier != undefined){ nArray.push({name:"_color_redMultiplier", value:p_value.redMultiplier}); }; if (p_value.redOffset != undefined){ nArray.push({name:"_color_redOffset", value:p_value.redOffset}); }; if (p_value.blueMultiplier != undefined){ nArray.push({name:"_color_blueMultiplier", value:p_value.blueMultiplier}); }; if (p_value.blueOffset != undefined){ nArray.push({name:"_color_blueOffset", value:p_value.blueOffset}); }; if (p_value.greenMultiplier != undefined){ nArray.push({name:"_color_greenMultiplier", value:p_value.greenMultiplier}); }; if (p_value.greenOffset != undefined){ nArray.push({name:"_color_greenOffset", value:p_value.greenOffset}); }; if (p_value.alphaMultiplier != undefined){ nArray.push({name:"_color_alphaMultiplier", value:p_value.alphaMultiplier}); }; if (p_value.alphaOffset != undefined){ nArray.push({name:"_color_alphaOffset", value:p_value.alphaOffset}); }; }; return (nArray); } } }//package caurina.transitions.properties
Section 76
//SoundShortcuts (caurina.transitions.properties.SoundShortcuts) package caurina.transitions.properties { import flash.media.*; import caurina.transitions.*; public class SoundShortcuts { public function SoundShortcuts(){ super(); trace("This is an static class and should not be instantiated."); } public static function init():void{ Tweener.registerSpecialProperty("_sound_volume", _sound_volume_get, _sound_volume_set); Tweener.registerSpecialProperty("_sound_pan", _sound_pan_get, _sound_pan_set); } public static function _sound_pan_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var sndTransform:SoundTransform = p_obj.soundTransform; sndTransform.pan = p_value; p_obj.soundTransform = sndTransform; } public static function _sound_volume_set(p_obj:Object, p_value:Number, p_parameters:Array, p_extra:Object=null):void{ var sndTransform:SoundTransform = p_obj.soundTransform; sndTransform.volume = p_value; p_obj.soundTransform = sndTransform; } public static function _sound_pan_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ return (p_obj.soundTransform.pan); } public static function _sound_volume_get(p_obj:Object, p_parameters:Array, p_extra:Object=null):Number{ return (p_obj.soundTransform.volume); } } }//package caurina.transitions.properties
Section 77
//AuxFunctions (caurina.transitions.AuxFunctions) package caurina.transitions { public class AuxFunctions { public function AuxFunctions(){ super(); } public static function concatObjects(... _args):Object{ var currentObject:Object; var prop:String; var finalObject:Object = {}; var i:int; while (i < _args.length) { currentObject = _args[i]; for (prop in currentObject) { if (currentObject[prop] == null){ delete finalObject[prop]; } else { finalObject[prop] = currentObject[prop]; }; }; i++; }; return (finalObject); } public static function numberToG(p_num:Number):Number{ return (((p_num & 0xFF00) >> 8)); } public static function numberToR(p_num:Number):Number{ return (((p_num & 0xFF0000) >> 16)); } public static function isInArray(p_string:String, p_array:Array):Boolean{ var l:uint = p_array.length; var i:uint; while (i < l) { if (p_array[i] == p_string){ return (true); }; i++; }; return (false); } public static function getObjectLength(p_object:Object):uint{ var pName:String; var totalProperties:uint; for (pName in p_object) { totalProperties++; }; return (totalProperties); } public static function numberToB(p_num:Number):Number{ return ((p_num & 0xFF)); } } }//package caurina.transitions
Section 78
//Equations (caurina.transitions.Equations) package caurina.transitions { public class Equations { public function Equations(){ super(); trace("Equations is a static class and should not be instantiated."); } public static function easeOutBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); if (t < (1 / 2.75)){ return (((c * ((7.5625 * t) * t)) + b)); }; if (t < (2 / 2.75)){ t = (t - (1.5 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.75)) + b)); }; if (t < (2.5 / 2.75)){ t = (t - (2.25 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.9375)) + b)); }; t = (t - (2.625 / 2.75)); return (((c * (((7.5625 * t) * t) + 0.984375)) + b)); } public static function easeInOutElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / (d / 2)); if (t == 2){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * (0.3 * 1.5)) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; if (t < 1){ --t; return (((-0.5 * ((a * Math.pow(2, (10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p)))) + b)); }; --t; return ((((((a * Math.pow(2, (-10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p))) * 0.5) + c) + b)); } public static function easeInOutQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return (((((c / 2) * t) * t) + b)); }; --t; return ((((-(c) / 2) * ((t * (t - 2)) - 1)) + b)); } public static function easeInOutBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (((easeInBounce((t * 2), 0, c, d) * 0.5) + b)); }; return ((((easeOutBounce(((t * 2) - d), 0, c, d) * 0.5) + (c * 0.5)) + b)); } public static function easeInOutBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = (t / (d / 2)); if (t < 1){ s = (s * 1.525); return ((((c / 2) * ((t * t) * (((s + 1) * t) - s))) + b)); }; t = (t - 2); s = (s * 1.525); return ((((c / 2) * (((t * t) * (((s + 1) * t) + s)) + 2)) + b)); } public static function easeOutInCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutCubic((t * 2), b, (c / 2), d, p_params)); }; return (easeInCubic(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeNone(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((c * t) / d) + b)); } public static function easeOutBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = ((t / d) - 1); return (((c * (((t * t) * (((s + 1) * t) + s)) + 1)) + b)); } public static function easeInOutSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((-(c) / 2) * (Math.cos(((Math.PI * t) / d)) - 1)) + b)); } public static function easeInBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number = (((!(Boolean(p_params))) || (isNaN(p_params.overshoot)))) ? 1.70158 : p_params.overshoot; t = (t / d); return (((((c * t) * t) * (((s + 1) * t) - s)) + b)); } public static function easeInQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((((c * t) * t) * t) * t) + b)); } public static function easeOutInQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuint((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuint(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutInBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutBounce((t * 2), b, (c / 2), d, p_params)); }; return (easeInBounce(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function init():void{ Tweener.registerTransition("easenone", easeNone); Tweener.registerTransition("linear", easeNone); Tweener.registerTransition("easeinquad", easeInQuad); Tweener.registerTransition("easeoutquad", easeOutQuad); Tweener.registerTransition("easeinoutquad", easeInOutQuad); Tweener.registerTransition("easeoutinquad", easeOutInQuad); Tweener.registerTransition("easeincubic", easeInCubic); Tweener.registerTransition("easeoutcubic", easeOutCubic); Tweener.registerTransition("easeinoutcubic", easeInOutCubic); Tweener.registerTransition("easeoutincubic", easeOutInCubic); Tweener.registerTransition("easeinquart", easeInQuart); Tweener.registerTransition("easeoutquart", easeOutQuart); Tweener.registerTransition("easeinoutquart", easeInOutQuart); Tweener.registerTransition("easeoutinquart", easeOutInQuart); Tweener.registerTransition("easeinquint", easeInQuint); Tweener.registerTransition("easeoutquint", easeOutQuint); Tweener.registerTransition("easeinoutquint", easeInOutQuint); Tweener.registerTransition("easeoutinquint", easeOutInQuint); Tweener.registerTransition("easeinsine", easeInSine); Tweener.registerTransition("easeoutsine", easeOutSine); Tweener.registerTransition("easeinoutsine", easeInOutSine); Tweener.registerTransition("easeoutinsine", easeOutInSine); Tweener.registerTransition("easeincirc", easeInCirc); Tweener.registerTransition("easeoutcirc", easeOutCirc); Tweener.registerTransition("easeinoutcirc", easeInOutCirc); Tweener.registerTransition("easeoutincirc", easeOutInCirc); Tweener.registerTransition("easeinexpo", easeInExpo); Tweener.registerTransition("easeoutexpo", easeOutExpo); Tweener.registerTransition("easeinoutexpo", easeInOutExpo); Tweener.registerTransition("easeoutinexpo", easeOutInExpo); Tweener.registerTransition("easeinelastic", easeInElastic); Tweener.registerTransition("easeoutelastic", easeOutElastic); Tweener.registerTransition("easeinoutelastic", easeInOutElastic); Tweener.registerTransition("easeoutinelastic", easeOutInElastic); Tweener.registerTransition("easeinback", easeInBack); Tweener.registerTransition("easeoutback", easeOutBack); Tweener.registerTransition("easeinoutback", easeInOutBack); Tweener.registerTransition("easeoutinback", easeOutInBack); Tweener.registerTransition("easeinbounce", easeInBounce); Tweener.registerTransition("easeoutbounce", easeOutBounce); Tweener.registerTransition("easeinoutbounce", easeInOutBounce); Tweener.registerTransition("easeoutinbounce", easeOutInBounce); } public static function easeOutExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((t)==d) ? (b + c) : (((c * 1.001) * (-(Math.pow(2, ((-10 * t) / d))) + 1)) + b)); } public static function easeOutInBack(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutBack((t * 2), b, (c / 2), d, p_params)); }; return (easeInBack(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((t)==0) ? b : (((c * Math.pow(2, (10 * ((t / d) - 1)))) + b) - (c * 0.001))); } public static function easeInCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((((c * t) * t) * t) + b)); } public static function easeInQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((((((c * t) * t) * t) * t) * t) + b)); } public static function easeInOutCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((-(c) / 2) * (Math.sqrt((1 - (t * t))) - 1)) + b)); }; t = (t - 2); return ((((c / 2) * (Math.sqrt((1 - (t * t))) + 1)) + b)); } public static function easeInQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((c * t) * t) + b)); } public static function easeInBounce(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((c - easeOutBounce((d - t), 0, c, d)) + b)); } public static function easeOutInExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutExpo((t * 2), b, (c / 2), d, p_params)); }; return (easeInExpo(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((-(c) * ((((t * t) * t) * t) - 1)) + b)); } public static function easeInSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return ((((-(c) * Math.cos(((t / d) * (Math.PI / 2)))) + c) + b)); } public static function easeInOutQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return (((((((c / 2) * t) * t) * t) * t) + b)); }; t = (t - 2); return ((((-(c) / 2) * ((((t * t) * t) * t) - 2)) + b)); } public static function easeOutQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return ((((-(c) * t) * (t - 2)) + b)); } public static function easeOutInElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutElastic((t * 2), b, (c / 2), d, p_params)); }; return (easeInElastic(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / d); if (t == 1){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * 0.3) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; --t; return ((-(((a * Math.pow(2, (10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p)))) + b)); } public static function easeOutCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * (((t * t) * t) + 1)) + b)); } public static function easeOutQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * (((((t * t) * t) * t) * t) + 1)) + b)); } public static function easeOutInQuad(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuad((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuad(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ return (((c * Math.sin(((t / d) * (Math.PI / 2)))) + b)); } public static function easeInOutCubic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((((c / 2) * t) * t) * t) + b)); }; t = (t - 2); return ((((c / 2) * (((t * t) * t) + 2)) + b)); } public static function easeInOutQuint(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / (d / 2)); if (t < 1){ return ((((((((c / 2) * t) * t) * t) * t) * t) + b)); }; t = (t - 2); return ((((c / 2) * (((((t * t) * t) * t) * t) + 2)) + b)); } public static function easeInCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = (t / d); return (((-(c) * (Math.sqrt((1 - (t * t))) - 1)) + b)); } public static function easeOutInSine(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutSine((t * 2), b, (c / 2), d, p_params)); }; return (easeInSine(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeInOutExpo(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t == 0){ return (b); }; if (t == d){ return ((b + c)); }; t = (t / (d / 2)); if (t < 1){ return (((((c / 2) * Math.pow(2, (10 * (t - 1)))) + b) - (c * 0.0005))); }; --t; return (((((c / 2) * 1.0005) * (-(Math.pow(2, (-10 * t))) + 2)) + b)); } public static function easeOutElastic(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ var s:Number; if (t == 0){ return (b); }; t = (t / d); if (t == 1){ return ((b + c)); }; var p:Number = (((!(Boolean(p_params))) || (isNaN(p_params.period)))) ? (d * 0.3) : p_params.period; var a:Number = (((!(Boolean(p_params))) || (isNaN(p_params.amplitude)))) ? 0 : p_params.amplitude; if (((!(Boolean(a))) || ((a < Math.abs(c))))){ a = c; s = (p / 4); } else { s = ((p / (2 * Math.PI)) * Math.asin((c / a))); }; return (((((a * Math.pow(2, (-10 * t))) * Math.sin(((((t * d) - s) * (2 * Math.PI)) / p))) + c) + b)); } public static function easeOutCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ t = ((t / d) - 1); return (((c * Math.sqrt((1 - (t * t)))) + b)); } public static function easeOutInQuart(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutQuart((t * 2), b, (c / 2), d, p_params)); }; return (easeInQuart(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } public static function easeOutInCirc(t:Number, b:Number, c:Number, d:Number, p_params:Object=null):Number{ if (t < (d / 2)){ return (easeOutCirc((t * 2), b, (c / 2), d, p_params)); }; return (easeInCirc(((t * 2) - d), (b + (c / 2)), (c / 2), d, p_params)); } } }//package caurina.transitions
Section 79
//PropertyInfoObj (caurina.transitions.PropertyInfoObj) package caurina.transitions { public class PropertyInfoObj { public var modifierParameters:Array; public var isSpecialProperty:Boolean; public var valueComplete:Number; public var modifierFunction:Function; public var extra:Object; public var valueStart:Number; public var hasModifier:Boolean; public var arrayIndex:Number; public var originalValueComplete:Object; public function PropertyInfoObj(p_valueStart:Number, p_valueComplete:Number, p_originalValueComplete:Object, p_arrayIndex:Number, p_extra:Object, p_isSpecialProperty:Boolean, p_modifierFunction:Function, p_modifierParameters:Array){ super(); valueStart = p_valueStart; valueComplete = p_valueComplete; originalValueComplete = p_originalValueComplete; arrayIndex = p_arrayIndex; extra = p_extra; isSpecialProperty = p_isSpecialProperty; hasModifier = Boolean(p_modifierFunction); modifierFunction = p_modifierFunction; modifierParameters = p_modifierParameters; } public function toString():String{ var returnStr:String = "\n[PropertyInfoObj "; returnStr = (returnStr + ("valueStart:" + String(valueStart))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("valueComplete:" + String(valueComplete))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("originalValueComplete:" + String(originalValueComplete))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("arrayIndex:" + String(arrayIndex))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("extra:" + String(extra))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("isSpecialProperty:" + String(isSpecialProperty))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("hasModifier:" + String(hasModifier))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("modifierFunction:" + String(modifierFunction))); returnStr = (returnStr + ", "); returnStr = (returnStr + ("modifierParameters:" + String(modifierParameters))); returnStr = (returnStr + "]\n"); return (returnStr); } public function clone():PropertyInfoObj{ var nProperty:PropertyInfoObj = new PropertyInfoObj(valueStart, valueComplete, originalValueComplete, arrayIndex, extra, isSpecialProperty, modifierFunction, modifierParameters); return (nProperty); } } }//package caurina.transitions
Section 80
//SpecialProperty (caurina.transitions.SpecialProperty) package caurina.transitions { public class SpecialProperty { public var parameters:Array; public var getValue:Function; public var preProcess:Function; public var setValue:Function; public function SpecialProperty(p_getFunction:Function, p_setFunction:Function, p_parameters:Array=null, p_preProcessFunction:Function=null){ super(); getValue = p_getFunction; setValue = p_setFunction; parameters = p_parameters; preProcess = p_preProcessFunction; } public function toString():String{ var value:String = ""; value = (value + "[SpecialProperty "); value = (value + ("getValue:" + String(getValue))); value = (value + ", "); value = (value + ("setValue:" + String(setValue))); value = (value + ", "); value = (value + ("parameters:" + String(parameters))); value = (value + ", "); value = (value + ("preProcess:" + String(preProcess))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 81
//SpecialPropertyModifier (caurina.transitions.SpecialPropertyModifier) package caurina.transitions { public class SpecialPropertyModifier { public var getValue:Function; public var modifyValues:Function; public function SpecialPropertyModifier(p_modifyFunction:Function, p_getFunction:Function){ super(); modifyValues = p_modifyFunction; getValue = p_getFunction; } public function toString():String{ var value:String = ""; value = (value + "[SpecialPropertyModifier "); value = (value + ("modifyValues:" + String(modifyValues))); value = (value + ", "); value = (value + ("getValue:" + String(getValue))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 82
//SpecialPropertySplitter (caurina.transitions.SpecialPropertySplitter) package caurina.transitions { public class SpecialPropertySplitter { public var parameters:Array; public var splitValues:Function; public function SpecialPropertySplitter(p_splitFunction:Function, p_parameters:Array){ super(); splitValues = p_splitFunction; parameters = p_parameters; } public function toString():String{ var value:String = ""; value = (value + "[SpecialPropertySplitter "); value = (value + ("splitValues:" + String(splitValues))); value = (value + ", "); value = (value + ("parameters:" + String(parameters))); value = (value + "]"); return (value); } } }//package caurina.transitions
Section 83
//Tweener (caurina.transitions.Tweener) package caurina.transitions { import flash.events.*; import flash.display.*; import flash.utils.*; public class Tweener { private static var _timeScale:Number = 1; private static var _currentTimeFrame:Number; private static var _specialPropertySplitterList:Object; private static var _engineExists:Boolean = false; private static var _specialPropertyModifierList:Object; private static var _currentTime:Number; private static var _tweenList:Array; private static var _specialPropertyList:Object; private static var _transitionList:Object; private static var _inited:Boolean = false; private static var __tweener_controller__:MovieClip; public function Tweener(){ super(); trace("Tweener is a static class and should not be instantiated."); } public static function registerSpecialPropertyModifier(p_name:String, p_modifyFunction:Function, p_getFunction:Function):void{ if (!_inited){ init(); }; var spm:SpecialPropertyModifier = new SpecialPropertyModifier(p_modifyFunction, p_getFunction); _specialPropertyModifierList[p_name] = spm; } public static function registerSpecialProperty(p_name:String, p_getFunction:Function, p_setFunction:Function, p_parameters:Array=null, p_preProcessFunction:Function=null):void{ if (!_inited){ init(); }; var sp:SpecialProperty = new SpecialProperty(p_getFunction, p_setFunction, p_parameters, p_preProcessFunction); _specialPropertyList[p_name] = sp; } public static function init(... _args):void{ _inited = true; _transitionList = new Object(); Equations.init(); _specialPropertyList = new Object(); _specialPropertyModifierList = new Object(); _specialPropertySplitterList = new Object(); } private static function updateTweens():Boolean{ var i:int; if (_tweenList.length == 0){ return (false); }; i = 0; while (i < _tweenList.length) { if ((((_tweenList[i] == undefined)) || (!(_tweenList[i].isPaused)))){ if (!updateTweenByIndex(i)){ removeTweenByIndex(i); }; if (_tweenList[i] == null){ removeTweenByIndex(i, true); i--; }; }; i++; }; return (true); } public static function addCaller(p_scopes:Object=null, p_parameters:Object=null):Boolean{ var i:Number; var rScopes:Array; var rTransition:Function; var nTween:TweenListObj; var myT:Number; var trans:String; if (!Boolean(p_scopes)){ return (false); }; if ((p_scopes is Array)){ rScopes = p_scopes.concat(); } else { rScopes = [p_scopes]; }; var p_obj:Object = p_parameters; if (!_inited){ init(); }; if (((!(_engineExists)) || (!(Boolean(__tweener_controller__))))){ startEngine(); }; var rTime:Number = (isNaN(p_obj.time)) ? 0 : p_obj.time; var rDelay:Number = (isNaN(p_obj.delay)) ? 0 : p_obj.delay; if (typeof(p_obj.transition) == "string"){ trans = p_obj.transition.toLowerCase(); rTransition = _transitionList[trans]; } else { rTransition = p_obj.transition; }; if (!Boolean(rTransition)){ rTransition = _transitionList["easeoutexpo"]; }; i = 0; while (i < rScopes.length) { if (p_obj.useFrames == true){ nTween = new TweenListObj(rScopes[i], (_currentTimeFrame + (rDelay / _timeScale)), (_currentTimeFrame + ((rDelay + rTime) / _timeScale)), true, rTransition, p_obj.transitionParams); } else { nTween = new TweenListObj(rScopes[i], (_currentTime + ((rDelay * 1000) / _timeScale)), (_currentTime + (((rDelay * 1000) + (rTime * 1000)) / _timeScale)), false, rTransition, p_obj.transitionParams); }; nTween.properties = null; nTween.onStart = p_obj.onStart; nTween.onUpdate = p_obj.onUpdate; nTween.onComplete = p_obj.onComplete; nTween.onOverwrite = p_obj.onOverwrite; nTween.onStartParams = p_obj.onStartParams; nTween.onUpdateParams = p_obj.onUpdateParams; nTween.onCompleteParams = p_obj.onCompleteParams; nTween.onOverwriteParams = p_obj.onOverwriteParams; nTween.onStartScope = p_obj.onStartScope; nTween.onUpdateScope = p_obj.onUpdateScope; nTween.onCompleteScope = p_obj.onCompleteScope; nTween.onOverwriteScope = p_obj.onOverwriteScope; nTween.onErrorScope = p_obj.onErrorScope; nTween.isCaller = true; nTween.count = p_obj.count; nTween.waitFrames = p_obj.waitFrames; _tweenList.push(nTween); if ((((rTime == 0)) && ((rDelay == 0)))){ myT = (_tweenList.length - 1); updateTweenByIndex(myT); removeTweenByIndex(myT); }; i++; }; return (true); } public static function pauseAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var paused:Boolean; i = 0; while (i < _tweenList.length) { pauseTweenByIndex(i); paused = true; i++; }; return (paused); } public static function removeTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(removeTweenByIndex, p_scope, properties)); } public static function splitTweens(p_tween:Number, p_properties:Array):uint{ var i:uint; var pName:String; var found:Boolean; var originalTween:TweenListObj = _tweenList[p_tween]; var newTween:TweenListObj = originalTween.clone(false); i = 0; while (i < p_properties.length) { pName = p_properties[i]; if (Boolean(originalTween.properties[pName])){ originalTween.properties[pName] = undefined; delete originalTween.properties[pName]; }; i++; }; for (pName in newTween.properties) { found = false; i = 0; while (i < p_properties.length) { if (p_properties[i] == pName){ found = true; break; }; i++; }; if (!found){ newTween.properties[pName] = undefined; delete newTween.properties[pName]; }; }; _tweenList.push(newTween); return ((_tweenList.length - 1)); } public static function updateFrame():void{ _currentTimeFrame++; } public static function resumeTweenByIndex(p_tween:Number):Boolean{ var tTweening:TweenListObj = _tweenList[p_tween]; if ((((tTweening == null)) || (!(tTweening.isPaused)))){ return (false); }; var cTime:Number = getCurrentTweeningTime(tTweening); tTweening.timeStart = (tTweening.timeStart + (cTime - tTweening.timePaused)); tTweening.timeComplete = (tTweening.timeComplete + (cTime - tTweening.timePaused)); tTweening.timePaused = undefined; tTweening.isPaused = false; return (true); } public static function getVersion():String{ return ("AS3 1.31.71"); } public static function onEnterFrame(e:Event):void{ updateTime(); updateFrame(); var hasUpdated:Boolean; hasUpdated = updateTweens(); if (!hasUpdated){ stopEngine(); }; } public static function updateTime():void{ _currentTime = getTimer(); } private static function updateTweenByIndex(i:Number):Boolean{ var tTweening:TweenListObj; var mustUpdate:Boolean; var nv:Number; var t:Number; var b:Number; var c:Number; var d:Number; var pName:String; var eventScope:Object; var tScope:Object; var tProperty:Object; var pv:Number; var i = i; tTweening = _tweenList[i]; if ((((tTweening == null)) || (!(Boolean(tTweening.scope))))){ return (false); }; var isOver:Boolean; var cTime:Number = getCurrentTweeningTime(tTweening); if (cTime >= tTweening.timeStart){ tScope = tTweening.scope; if (tTweening.isCaller){ do { t = (((tTweening.timeComplete - tTweening.timeStart) / tTweening.count) * (tTweening.timesCalled + 1)); b = tTweening.timeStart; c = (tTweening.timeComplete - tTweening.timeStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, b, c, d); //unresolved if if (Boolean(tTweening.onUpdate)){ eventScope = (Boolean(tTweening.onUpdateScope)) ? tTweening.onUpdateScope : tScope; tTweening.onUpdate.apply(eventScope, tTweening.onUpdateParams); continue; var _slot1 = e; handleError(tTweening, _slot1, "onUpdate"); }; } while (tTweening.timesCalled++, !(tTweening.timesCalled >= tTweening.count)); } else { mustUpdate = (((((tTweening.skipUpdates < 1)) || (!(tTweening.skipUpdates)))) || ((tTweening.updatesSkipped >= tTweening.skipUpdates))); if (cTime >= tTweening.timeComplete){ isOver = true; mustUpdate = true; }; if (!tTweening.hasStarted){ if (Boolean(tTweening.onStart)){ eventScope = (Boolean(tTweening.onStartScope)) ? tTweening.onStartScope : tScope; tTweening.onStart.apply(eventScope, tTweening.onStartParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onStart"); }; for (pName in tTweening.properties) { if (tTweening.properties[pName].isSpecialProperty){ if (Boolean(_specialPropertyList[pName].preProcess)){ tTweening.properties[pName].valueComplete = _specialPropertyList[pName].preProcess(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].originalValueComplete, tTweening.properties[pName].extra); }; pv = _specialPropertyList[pName].getValue(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].extra); } else { pv = tScope[pName]; }; tTweening.properties[pName].valueStart = (isNaN(pv)) ? tTweening.properties[pName].valueComplete : pv; }; mustUpdate = true; tTweening.hasStarted = true; }; if (mustUpdate){ for (pName in tTweening.properties) { tProperty = tTweening.properties[pName]; if (isOver){ nv = tProperty.valueComplete; } else { if (tProperty.hasModifier){ t = (cTime - tTweening.timeStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, 0, 1, d, tTweening.transitionParams); nv = tProperty.modifierFunction(tProperty.valueStart, tProperty.valueComplete, nv, tProperty.modifierParameters); } else { t = (cTime - tTweening.timeStart); b = tProperty.valueStart; c = (tProperty.valueComplete - tProperty.valueStart); d = (tTweening.timeComplete - tTweening.timeStart); nv = tTweening.transition(t, b, c, d, tTweening.transitionParams); }; }; if (tTweening.rounded){ nv = Math.round(nv); }; if (tProperty.isSpecialProperty){ _specialPropertyList[pName].setValue(tScope, nv, _specialPropertyList[pName].parameters, tTweening.properties[pName].extra); } else { tScope[pName] = nv; }; }; tTweening.updatesSkipped = 0; if (Boolean(tTweening.onUpdate)){ eventScope = (Boolean(tTweening.onUpdateScope)) ? tTweening.onUpdateScope : tScope; tTweening.onUpdate.apply(eventScope, tTweening.onUpdateParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onUpdate"); }; } else { tTweening.updatesSkipped++; }; }; if (((isOver) && (Boolean(tTweening.onComplete)))){ eventScope = (Boolean(tTweening.onCompleteScope)) ? tTweening.onCompleteScope : tScope; tTweening.onComplete.apply(eventScope, tTweening.onCompleteParams); //unresolved jump var _slot1 = e; handleError(tTweening, _slot1, "onComplete"); }; return (!(isOver)); }; return (true); } public static function setTimeScale(p_time:Number):void{ var i:Number; var cTime:Number; if (isNaN(p_time)){ p_time = 1; }; if (p_time < 1E-5){ p_time = 1E-5; }; if (p_time != _timeScale){ if (_tweenList != null){ i = 0; while (i < _tweenList.length) { cTime = getCurrentTweeningTime(_tweenList[i]); _tweenList[i].timeStart = (cTime - (((cTime - _tweenList[i].timeStart) * _timeScale) / p_time)); _tweenList[i].timeComplete = (cTime - (((cTime - _tweenList[i].timeComplete) * _timeScale) / p_time)); if (_tweenList[i].timePaused != undefined){ _tweenList[i].timePaused = (cTime - (((cTime - _tweenList[i].timePaused) * _timeScale) / p_time)); }; i++; }; }; _timeScale = p_time; }; } public static function resumeAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var resumed:Boolean; i = 0; while (i < _tweenList.length) { resumeTweenByIndex(i); resumed = true; i++; }; return (resumed); } private static function handleError(pTweening:TweenListObj, pError:Error, pCallBackName:String):void{ var eventScope:Object; var pTweening = pTweening; var pError = pError; var pCallBackName = pCallBackName; if (((Boolean(pTweening.onError)) && ((pTweening.onError is Function)))){ eventScope = (Boolean(pTweening.onErrorScope)) ? pTweening.onErrorScope : pTweening.scope; pTweening.onError.apply(eventScope, [pTweening.scope, pError]); //unresolved jump var _slot1 = metaError; printError(((((String(pTweening.scope) + " raised an error while executing the 'onError' handler. Original error:\n ") + pError.getStackTrace()) + "\nonError error: ") + _slot1.getStackTrace())); } else { if (!Boolean(pTweening.onError)){ printError(((((String(pTweening.scope) + " raised an error while executing the '") + pCallBackName) + "'handler. \n") + pError.getStackTrace())); }; }; } private static function startEngine():void{ _engineExists = true; _tweenList = new Array(); __tweener_controller__ = new MovieClip(); __tweener_controller__.addEventListener(Event.ENTER_FRAME, Tweener.onEnterFrame); _currentTimeFrame = 0; updateTime(); } public static function removeAllTweens():Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; var removed:Boolean; i = 0; while (i < _tweenList.length) { removeTweenByIndex(i); removed = true; i++; }; return (removed); } public static function addTween(p_scopes:Object=null, p_parameters:Object=null):Boolean{ var i:Number; var j:Number; var istr:String; var rScopes:Array; var rTransition:Function; var nProperties:Object; var nTween:TweenListObj; var myT:Number; var splitProperties:Array; var splitProperties2:Array; var tempModifiedProperties:Array; var trans:String; if (!Boolean(p_scopes)){ return (false); }; if ((p_scopes is Array)){ rScopes = p_scopes.concat(); } else { rScopes = [p_scopes]; }; var p_obj:Object = TweenListObj.makePropertiesChain(p_parameters); if (!_inited){ init(); }; if (((!(_engineExists)) || (!(Boolean(__tweener_controller__))))){ startEngine(); }; var rTime:Number = (isNaN(p_obj.time)) ? 0 : p_obj.time; var rDelay:Number = (isNaN(p_obj.delay)) ? 0 : p_obj.delay; var rProperties:Array = new Array(); var restrictedWords:Object = {time:true, delay:true, useFrames:true, skipUpdates:true, transition:true, transitionParams:true, onStart:true, onUpdate:true, onComplete:true, onOverwrite:true, onError:true, rounded:true, onStartParams:true, onUpdateParams:true, onCompleteParams:true, onOverwriteParams:true, onStartScope:true, onUpdateScope:true, onCompleteScope:true, onOverwriteScope:true, onErrorScope:true}; var modifiedProperties:Object = new Object(); for (istr in p_obj) { if (!restrictedWords[istr]){ if (_specialPropertySplitterList[istr]){ splitProperties = _specialPropertySplitterList[istr].splitValues(p_obj[istr], _specialPropertySplitterList[istr].parameters); i = 0; while (i < splitProperties.length) { if (_specialPropertySplitterList[splitProperties[i].name]){ splitProperties2 = _specialPropertySplitterList[splitProperties[i].name].splitValues(splitProperties[i].value, _specialPropertySplitterList[splitProperties[i].name].parameters); j = 0; while (j < splitProperties2.length) { rProperties[splitProperties2[j].name] = {valueStart:undefined, valueComplete:splitProperties2[j].value, arrayIndex:splitProperties2[j].arrayIndex, isSpecialProperty:false}; j++; }; } else { rProperties[splitProperties[i].name] = {valueStart:undefined, valueComplete:splitProperties[i].value, arrayIndex:splitProperties[i].arrayIndex, isSpecialProperty:false}; }; i++; }; } else { if (_specialPropertyModifierList[istr] != undefined){ tempModifiedProperties = _specialPropertyModifierList[istr].modifyValues(p_obj[istr]); i = 0; while (i < tempModifiedProperties.length) { modifiedProperties[tempModifiedProperties[i].name] = {modifierParameters:tempModifiedProperties[i].parameters, modifierFunction:_specialPropertyModifierList[istr].getValue}; i++; }; } else { rProperties[istr] = {valueStart:undefined, valueComplete:p_obj[istr]}; }; }; }; }; for (istr in rProperties) { if (_specialPropertyList[istr] != undefined){ rProperties[istr].isSpecialProperty = true; } else { if (rScopes[0][istr] == undefined){ printError((((("The property '" + istr) + "' doesn't seem to be a normal object property of ") + String(rScopes[0])) + " or a registered special property.")); }; }; }; for (istr in modifiedProperties) { if (rProperties[istr] != undefined){ rProperties[istr].modifierParameters = modifiedProperties[istr].modifierParameters; rProperties[istr].modifierFunction = modifiedProperties[istr].modifierFunction; }; }; if (typeof(p_obj.transition) == "string"){ trans = p_obj.transition.toLowerCase(); rTransition = _transitionList[trans]; } else { rTransition = p_obj.transition; }; if (!Boolean(rTransition)){ rTransition = _transitionList["easeoutexpo"]; }; i = 0; while (i < rScopes.length) { nProperties = new Object(); for (istr in rProperties) { nProperties[istr] = new PropertyInfoObj(rProperties[istr].valueStart, rProperties[istr].valueComplete, rProperties[istr].valueComplete, rProperties[istr].arrayIndex, {}, rProperties[istr].isSpecialProperty, rProperties[istr].modifierFunction, rProperties[istr].modifierParameters); }; if (p_obj.useFrames == true){ nTween = new TweenListObj(rScopes[i], (_currentTimeFrame + (rDelay / _timeScale)), (_currentTimeFrame + ((rDelay + rTime) / _timeScale)), true, rTransition, p_obj.transitionParams); } else { nTween = new TweenListObj(rScopes[i], (_currentTime + ((rDelay * 1000) / _timeScale)), (_currentTime + (((rDelay * 1000) + (rTime * 1000)) / _timeScale)), false, rTransition, p_obj.transitionParams); }; nTween.properties = nProperties; nTween.onStart = p_obj.onStart; nTween.onUpdate = p_obj.onUpdate; nTween.onComplete = p_obj.onComplete; nTween.onOverwrite = p_obj.onOverwrite; nTween.onError = p_obj.onError; nTween.onStartParams = p_obj.onStartParams; nTween.onUpdateParams = p_obj.onUpdateParams; nTween.onCompleteParams = p_obj.onCompleteParams; nTween.onOverwriteParams = p_obj.onOverwriteParams; nTween.onStartScope = p_obj.onStartScope; nTween.onUpdateScope = p_obj.onUpdateScope; nTween.onCompleteScope = p_obj.onCompleteScope; nTween.onOverwriteScope = p_obj.onOverwriteScope; nTween.onErrorScope = p_obj.onErrorScope; nTween.rounded = p_obj.rounded; nTween.skipUpdates = p_obj.skipUpdates; removeTweensByTime(nTween.scope, nTween.properties, nTween.timeStart, nTween.timeComplete); _tweenList.push(nTween); if ((((rTime == 0)) && ((rDelay == 0)))){ myT = (_tweenList.length - 1); updateTweenByIndex(myT); removeTweenByIndex(myT); }; i++; }; return (true); } public static function registerTransition(p_name:String, p_function:Function):void{ if (!_inited){ init(); }; _transitionList[p_name] = p_function; } public static function printError(p_message:String):void{ trace(("## [Tweener] Error: " + p_message)); } private static function affectTweens(p_affectFunction:Function, p_scope:Object, p_properties:Array):Boolean{ var i:uint; var affectedProperties:Array; var j:uint; var objectProperties:uint; var slicedTweenIndex:uint; var affected:Boolean; if (!Boolean(_tweenList)){ return (false); }; i = 0; while (i < _tweenList.length) { if (((_tweenList[i]) && ((_tweenList[i].scope == p_scope)))){ if (p_properties.length == 0){ p_affectFunction(i); affected = true; } else { affectedProperties = new Array(); j = 0; while (j < p_properties.length) { if (Boolean(_tweenList[i].properties[p_properties[j]])){ affectedProperties.push(p_properties[j]); }; j++; }; if (affectedProperties.length > 0){ objectProperties = AuxFunctions.getObjectLength(_tweenList[i].properties); if (objectProperties == affectedProperties.length){ p_affectFunction(i); affected = true; } else { slicedTweenIndex = splitTweens(i, affectedProperties); p_affectFunction(slicedTweenIndex); affected = true; }; }; }; }; i++; }; return (affected); } public static function getTweens(p_scope:Object):Array{ var i:uint; var pName:String; if (!Boolean(_tweenList)){ return ([]); }; var tList:Array = new Array(); i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ for (pName in _tweenList[i].properties) { tList.push(pName); }; }; i++; }; return (tList); } public static function isTweening(p_scope:Object):Boolean{ var i:uint; if (!Boolean(_tweenList)){ return (false); }; i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ return (true); }; i++; }; return (false); } public static function pauseTweenByIndex(p_tween:Number):Boolean{ var tTweening:TweenListObj = _tweenList[p_tween]; if ((((tTweening == null)) || (tTweening.isPaused))){ return (false); }; tTweening.timePaused = getCurrentTweeningTime(tTweening); tTweening.isPaused = true; return (true); } public static function getCurrentTweeningTime(p_tweening:Object):Number{ return ((p_tweening.useFrames) ? _currentTimeFrame : _currentTime); } public static function getTweenCount(p_scope:Object):Number{ var i:uint; if (!Boolean(_tweenList)){ return (0); }; var c:Number = 0; i = 0; while (i < _tweenList.length) { if (((Boolean(_tweenList[i])) && ((_tweenList[i].scope == p_scope)))){ c = (c + AuxFunctions.getObjectLength(_tweenList[i].properties)); }; i++; }; return (c); } private static function stopEngine():void{ _engineExists = false; _tweenList = null; _currentTime = 0; _currentTimeFrame = 0; __tweener_controller__.removeEventListener(Event.ENTER_FRAME, Tweener.onEnterFrame); __tweener_controller__ = null; } public static function removeTweensByTime(p_scope:Object, p_properties:Object, p_timeStart:Number, p_timeComplete:Number):Boolean{ var removedLocally:Boolean; var i:uint; var pName:String; var eventScope:Object; var p_scope = p_scope; var p_properties = p_properties; var p_timeStart = p_timeStart; var p_timeComplete = p_timeComplete; var removed:Boolean; var tl:uint = _tweenList.length; i = 0; while (i < tl) { if (((Boolean(_tweenList[i])) && ((p_scope == _tweenList[i].scope)))){ if ((((p_timeComplete > _tweenList[i].timeStart)) && ((p_timeStart < _tweenList[i].timeComplete)))){ removedLocally = false; for (pName in _tweenList[i].properties) { if (Boolean(p_properties[pName])){ if (Boolean(_tweenList[i].onOverwrite)){ eventScope = (Boolean(_tweenList[i].onOverwriteScope)) ? _tweenList[i].onOverwriteScope : _tweenList[i].scope; _tweenList[i].onOverwrite.apply(eventScope, _tweenList[i].onOverwriteParams); //unresolved jump var _slot1 = e; handleError(_tweenList[i], _slot1, "onOverwrite"); }; _tweenList[i].properties[pName] = undefined; delete _tweenList[i].properties[pName]; removedLocally = true; removed = true; }; }; if (removedLocally){ if (AuxFunctions.getObjectLength(_tweenList[i].properties) == 0){ removeTweenByIndex(i); }; }; }; }; i = (i + 1); }; return (removed); } public static function registerSpecialPropertySplitter(p_name:String, p_splitFunction:Function, p_parameters:Array=null):void{ if (!_inited){ init(); }; var sps:SpecialPropertySplitter = new SpecialPropertySplitter(p_splitFunction, p_parameters); _specialPropertySplitterList[p_name] = sps; } public static function removeTweenByIndex(i:Number, p_finalRemoval:Boolean=false):Boolean{ _tweenList[i] = null; if (p_finalRemoval){ _tweenList.splice(i, 1); }; return (true); } public static function resumeTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(resumeTweenByIndex, p_scope, properties)); } public static function pauseTweens(p_scope:Object, ... _args):Boolean{ var i:uint; var properties:Array = new Array(); i = 0; while (i < _args.length) { if ((((typeof(_args[i]) == "string")) && (!(AuxFunctions.isInArray(_args[i], properties))))){ properties.push(_args[i]); }; i++; }; return (affectTweens(pauseTweenByIndex, p_scope, properties)); } } }//package caurina.transitions
Section 84
//TweenListObj (caurina.transitions.TweenListObj) package caurina.transitions { public class TweenListObj { public var hasStarted:Boolean; public var onUpdate:Function; public var useFrames:Boolean; public var count:Number; public var onOverwriteParams:Array; public var timeStart:Number; public var timeComplete:Number; public var onStartParams:Array; public var onUpdateScope:Object; public var rounded:Boolean; public var onUpdateParams:Array; public var properties:Object; public var onComplete:Function; public var transitionParams:Object; public var updatesSkipped:Number; public var onStart:Function; public var onOverwriteScope:Object; public var skipUpdates:Number; public var onStartScope:Object; public var scope:Object; public var isCaller:Boolean; public var timePaused:Number; public var transition:Function; public var onCompleteParams:Array; public var onError:Function; public var timesCalled:Number; public var onErrorScope:Object; public var onOverwrite:Function; public var isPaused:Boolean; public var waitFrames:Boolean; public var onCompleteScope:Object; public function TweenListObj(p_scope:Object, p_timeStart:Number, p_timeComplete:Number, p_useFrames:Boolean, p_transition:Function, p_transitionParams:Object){ super(); scope = p_scope; timeStart = p_timeStart; timeComplete = p_timeComplete; useFrames = p_useFrames; transition = p_transition; transitionParams = p_transitionParams; properties = new Object(); isPaused = false; timePaused = undefined; isCaller = false; updatesSkipped = 0; timesCalled = 0; skipUpdates = 0; hasStarted = false; } public function clone(omitEvents:Boolean):TweenListObj{ var pName:String; var nTween:TweenListObj = new TweenListObj(scope, timeStart, timeComplete, useFrames, transition, transitionParams); nTween.properties = new Array(); for (pName in properties) { nTween.properties[pName] = properties[pName].clone(); }; nTween.skipUpdates = skipUpdates; nTween.updatesSkipped = updatesSkipped; if (!omitEvents){ nTween.onStart = onStart; nTween.onUpdate = onUpdate; nTween.onComplete = onComplete; nTween.onOverwrite = onOverwrite; nTween.onError = onError; nTween.onStartParams = onStartParams; nTween.onUpdateParams = onUpdateParams; nTween.onCompleteParams = onCompleteParams; nTween.onOverwriteParams = onOverwriteParams; nTween.onStartScope = onStartScope; nTween.onUpdateScope = onUpdateScope; nTween.onCompleteScope = onCompleteScope; nTween.onOverwriteScope = onOverwriteScope; nTween.onErrorScope = onErrorScope; }; nTween.rounded = rounded; nTween.isPaused = isPaused; nTween.timePaused = timePaused; nTween.isCaller = isCaller; nTween.count = count; nTween.timesCalled = timesCalled; nTween.waitFrames = waitFrames; nTween.hasStarted = hasStarted; return (nTween); } public function toString():String{ var i:String; var returnStr:String = "\n[TweenListObj "; returnStr = (returnStr + ("scope:" + String(scope))); returnStr = (returnStr + ", properties:"); var isFirst:Boolean; for (i in properties) { if (!isFirst){ returnStr = (returnStr + ","); }; returnStr = (returnStr + ("[name:" + properties[i].name)); returnStr = (returnStr + (",valueStart:" + properties[i].valueStart)); returnStr = (returnStr + (",valueComplete:" + properties[i].valueComplete)); returnStr = (returnStr + "]"); isFirst = false; }; returnStr = (returnStr + (", timeStart:" + String(timeStart))); returnStr = (returnStr + (", timeComplete:" + String(timeComplete))); returnStr = (returnStr + (", useFrames:" + String(useFrames))); returnStr = (returnStr + (", transition:" + String(transition))); returnStr = (returnStr + (", transitionParams:" + String(transitionParams))); if (skipUpdates){ returnStr = (returnStr + (", skipUpdates:" + String(skipUpdates))); }; if (updatesSkipped){ returnStr = (returnStr + (", updatesSkipped:" + String(updatesSkipped))); }; if (Boolean(onStart)){ returnStr = (returnStr + (", onStart:" + String(onStart))); }; if (Boolean(onUpdate)){ returnStr = (returnStr + (", onUpdate:" + String(onUpdate))); }; if (Boolean(onComplete)){ returnStr = (returnStr + (", onComplete:" + String(onComplete))); }; if (Boolean(onOverwrite)){ returnStr = (returnStr + (", onOverwrite:" + String(onOverwrite))); }; if (Boolean(onError)){ returnStr = (returnStr + (", onError:" + String(onError))); }; if (onStartParams){ returnStr = (returnStr + (", onStartParams:" + String(onStartParams))); }; if (onUpdateParams){ returnStr = (returnStr + (", onUpdateParams:" + String(onUpdateParams))); }; if (onCompleteParams){ returnStr = (returnStr + (", onCompleteParams:" + String(onCompleteParams))); }; if (onOverwriteParams){ returnStr = (returnStr + (", onOverwriteParams:" + String(onOverwriteParams))); }; if (onStartScope){ returnStr = (returnStr + (", onStartScope:" + String(onStartScope))); }; if (onUpdateScope){ returnStr = (returnStr + (", onUpdateScope:" + String(onUpdateScope))); }; if (onCompleteScope){ returnStr = (returnStr + (", onCompleteScope:" + String(onCompleteScope))); }; if (onOverwriteScope){ returnStr = (returnStr + (", onOverwriteScope:" + String(onOverwriteScope))); }; if (onErrorScope){ returnStr = (returnStr + (", onErrorScope:" + String(onErrorScope))); }; if (rounded){ returnStr = (returnStr + (", rounded:" + String(rounded))); }; if (isPaused){ returnStr = (returnStr + (", isPaused:" + String(isPaused))); }; if (timePaused){ returnStr = (returnStr + (", timePaused:" + String(timePaused))); }; if (isCaller){ returnStr = (returnStr + (", isCaller:" + String(isCaller))); }; if (count){ returnStr = (returnStr + (", count:" + String(count))); }; if (timesCalled){ returnStr = (returnStr + (", timesCalled:" + String(timesCalled))); }; if (waitFrames){ returnStr = (returnStr + (", waitFrames:" + String(waitFrames))); }; if (hasStarted){ returnStr = (returnStr + (", hasStarted:" + String(hasStarted))); }; returnStr = (returnStr + "]\n"); return (returnStr); } public static function makePropertiesChain(p_obj:Object):Object{ var chainedObject:Object; var chain:Object; var currChainObj:Object; var len:Number; var i:Number; var k:Number; var baseObject:Object = p_obj.base; if (baseObject){ chainedObject = {}; if ((baseObject is Array)){ chain = []; k = 0; while (k < baseObject.length) { chain.push(baseObject[k]); k++; }; } else { chain = [baseObject]; }; chain.push(p_obj); len = chain.length; i = 0; while (i < len) { if (chain[i]["base"]){ currChainObj = AuxFunctions.concatObjects(makePropertiesChain(chain[i]["base"]), chain[i]); } else { currChainObj = chain[i]; }; chainedObject = AuxFunctions.concatObjects(chainedObject, currChainObj); i++; }; if (chainedObject["base"]){ delete chainedObject["base"]; }; return (chainedObject); //unresolved jump }; return (p_obj); } } }//package caurina.transitions
Section 85
//IPublisher (com.luminicbox.log.IPublisher) package com.luminicbox.log { public interface IPublisher { function toString():String; function publish(:LogEvent):void; } }//package com.luminicbox.log
Section 86
//Level (com.luminicbox.log.Level) package com.luminicbox.log { public class Level { private var _value:Number; private var _name:String; public static var ALL:Level = new Level("ALL", 1); ; public static var LOG:Level = new Level("LOG", 1); ; public static var FATAL:Level = new Level("FATAL", 32); ; public static var WARN:Level = new Level("WARN", 8); ; public static var INFO:Level = new Level("INFO", 4); ; public static var ERROR:Level = new Level("ERROR", 16); ; public static var DEBUG:Level = new Level("DEBUG", 2); ; public static var NONE:Level = new Level("NONE", 0x0400); ; public function Level(name:String, value:Number){ super(); this._name = name; this._value = value; } public function getName():String{ return (_name); } public function toString():String{ return (getName()); } public function getValue():Number{ return (_value); } } }//package com.luminicbox.log
Section 87
//LogEvent (com.luminicbox.log.LogEvent) package com.luminicbox.log { public class LogEvent { public var level:Level; public var loggerId:String; public var argument:Object; public var time:Date; public function LogEvent(loggerId:String, argument:Object, level:Level){ super(); this.loggerId = loggerId; this.argument = argument; this.level = level; time = new Date(); } public static function serialize(logEvent:LogEvent):Object{ var o:Object = new Object(); o.loggerId = logEvent.loggerId; o.time = logEvent.time; o.levelName = logEvent.level.getName(); o.argument = logEvent.argument; return (o); } public static function deserialize(o:Object):LogEvent{ var l:Level = Level[("" + o.levelName)]; var e:LogEvent = new LogEvent(o.loggerId, o.argument, l); e.time = o.time; return (e); } } }//package com.luminicbox.log
Section 88
//Logger (com.luminicbox.log.Logger) package com.luminicbox.log { public class Logger { private var _level:Level; private var _loggerId:String; private var _publishers:Array; private var _filters:Array; public function Logger(logId:String=""){ super(); if (logId.length > 0){ this._loggerId = logId; }; this._level = Level.LOG; _publishers = new Array(); _filters = new Array(); } public function setLevel(level:Level):void{ _level = level; } public function log(argument:Object):void{ publish(argument, Level.LOG); } public function warn(argument:Object):void{ publish(argument, Level.WARN); } public function error(argument:Object):void{ publish(argument, Level.ERROR); } public function fatal(argument:Object):void{ publish(argument, Level.FATAL); } public function getPublishers():Array{ return (_publishers); } public function info(argument:Object):void{ publish(argument, Level.INFO); } private function publish(argument:Object, level:Level):void{ var e:LogEvent; var publisher:String; if (level.getValue() >= _level.getValue()){ e = new LogEvent(this._loggerId, argument, level); for (publisher in _publishers) { IPublisher(_publishers[publisher]).publish(e); }; }; } public function debug(argument:Object):void{ publish(argument, Level.DEBUG); } public function addPublisher(publisher:IPublisher):void{ if (!_publishers[publisher.toString()]){ _publishers[publisher.toString()] = publisher; }; } public function removePublisher(publisher:IPublisher):void{ delete _publishers[publisher.toString()]; } } }//package com.luminicbox.log
Section 89
//MainParticles (com.midasplayer.particle.MainParticles) package com.midasplayer.particle { import flash.events.*; import flash.display.*; public class MainParticles extends Sprite { private var minAlpha:Number;// = 0.01 private var maxSize:Number;// = 29 private var numParticles:int;// = 20 private var maxXVel:Number;// = 1 private var minYVel:Number;// = -1 private var maxAlpha:Number;// = 0.02 private var maxYVel:Number;// = 1 private var particles:Array; private var emitter; private var minXVel:Number;// = -1 private var minSize:Number;// = 12 private var SparkClass:Class; public function MainParticles(){ particles = new Array(); SparkClass = MainParticles_SparkClass; super(); addEventListener(Event.ENTER_FRAME, enterFrame); } public function kill():void{ removeEventListener(Event.ENTER_FRAME, enterFrame); var i:Number = 0; while (i < particles.length) { particles[i].destroy(); i++; }; } private function randRange(min:Number, max:Number):Number{ var randomNum:Number = ((Math.random() * (max - min)) + min); return (randomNum); } public function setEmitterClip(clip):void{ emitter = clip; } private function createNewParticle():void{ var particle:* = new Particle(SparkClass, emitter, -10, -7, stage.stageWidth, stage.stageHeight); particle.setVel(randRange(minXVel, maxXVel), randRange(minYVel, maxYVel)); particle.setSize(randRange(minSize, maxSize)); particles.push(particle); while (particles.length > numParticles) { particle = particles.shift(); particle.destroy(); }; var i:Number = 0; while (i < particles.length) { particles[i].update(); i++; }; } private function enterFrame(e:Event){ createNewParticle(); } } }//package com.midasplayer.particle
Section 90
//MainParticles_SparkClass (com.midasplayer.particle.MainParticles_SparkClass) package com.midasplayer.particle { import mx.core.*; import flash.display.*; public class MainParticles_SparkClass extends MovieClipAsset { public var bg:DisplayObject; public var back:DisplayObject; public var adBox:DisplayObject; public var continue_bt:DisplayObject; public var fireLogoHolder:DisplayObject; public var mcPlayBtn:DisplayObject; public var bar:DisplayObject; public var dragonHolder:DisplayObject; public var bannedSign:DisplayObject; public var adsHolder:DisplayObject; public var play_bt:DisplayObject; public var barHolder:DisplayObject; } }//package com.midasplayer.particle
Section 91
//Particle (com.midasplayer.particle.Particle) package com.midasplayer.particle { import flash.display.*; import flash.geom.*; public class Particle { private var _yVel:Number; private var _xVel:Number; private var _stageWidth:Number; private var _stageHeight:Number; private var _alphaDecr:Number;// = 0 private var clip:DisplayObject; public function Particle(spriteclass:Class, targetclip:DisplayObjectContainer, xpos:Number, ypos:Number, stageWidth:Number, stageHeight:Number){ super(); _stageWidth = stageWidth; _stageHeight = stageHeight; clip = new (spriteclass); targetclip.addChild(clip); clip.x = xpos; clip.y = ypos; } public function update(){ clip.x = (clip.x + _xVel); clip.y = (clip.y + _yVel); clip.alpha = (clip.alpha - _alphaDecr); } public function setSize(size:Number){ clip.width = size; clip.height = size; } public function setColour(newColour:Number){ var ct:ColorTransform = new ColorTransform(); ct.color = newColour; clip.transform.colorTransform = ct; } public function setAlphaDecr(val:Number):void{ _alphaDecr = val; } public function destroy():void{ clip.parent.removeChild(clip); clip = null; } public function setVel(xvel:Number, yvel:Number){ _xVel = xvel; _yVel = yvel; } } }//package com.midasplayer.particle
Section 92
//DragonLoader (com.midasplayer.DragonLoader) package com.midasplayer { import flash.events.*; import caurina.transitions.*; import flash.display.*; import flash.media.*; import flash.utils.*; public class DragonLoader extends Sprite { private var bannedSignBack:Sprite; private var m_fireLogoClip:MovieClip; private var oldFrameRate:int; private var WindowClass:Class; private var m_bannedSign:Sprite; private var m_dragonClip:MovieClip; private var m_bg:Sprite; private var m_glimmer:Sprite; private var GlimmerClass:Class; private var window:Sprite; private var SndBellClass:Class; private var m_playBtn:MovieClip; private var m_sndBell:Sound; public static var LAUNCH_GAME:String = "launchGame"; public function DragonLoader(){ WindowClass = DragonLoader_WindowClass; SndBellClass = DragonLoader_SndBellClass; GlimmerClass = DragonLoader_GlimmerClass; super(); window = new WindowClass(); addChild(window); } public function destroy():void{ m_playBtn.removeEventListener(MouseEvent.ROLL_OVER, btnOver); m_playBtn.removeEventListener(MouseEvent.ROLL_OUT, btnOut); m_playBtn.removeEventListener(MouseEvent.MOUSE_DOWN, btnDown); m_playBtn.removeEventListener(MouseEvent.MOUSE_UP, launchGame); this.parent.removeChild(this); } public function onMainMovie(evt:MouseEvent):void{ KingAPI.openLoaderMovieLink(); } public function showBannedScreen():void{ m_bannedSign.alpha = 1; } public function playLoaderMovie():void{ m_dragonClip.addEventListener(Event.ENTER_FRAME, animationDone); m_dragonClip.play(); } private function btnOut(evt:MouseEvent):void{ m_playBtn.gotoAndStop("idle"); } private function fireEfHandler(e:Event):void{ if (m_fireLogoClip.currentFrame == m_fireLogoClip.totalFrames){ m_fireLogoClip.stop(); m_fireLogoClip.removeEventListener(Event.ENTER_FRAME, fireEfHandler); }; } private function logoVisible(e:Event):void{ if (m_fireLogoClip.currentFrame == m_fireLogoClip.totalFrames){ m_fireLogoClip.removeEventListener(Event.ENTER_FRAME, logoVisible); m_playBtn.alpha = 0; Tweener.addTween(m_playBtn, {alpha:1, time:0.5}); m_glimmer = new GlimmerClass(); m_glimmer.x = (m_fireLogoClip.x - m_glimmer.width); m_glimmer.y = (m_fireLogoClip.y + 112); this.addChild(m_glimmer); setTimeout(onGlimmerTmr, 1000, null); }; } public function launchGame(evt:Event):void{ root.stage.frameRate = oldFrameRate; trace(LAUNCH_GAME); this.dispatchEvent(new Event(LAUNCH_GAME)); destroy(); } private function btnDown(evt:MouseEvent):void{ m_playBtn.gotoAndStop("down"); } private function glimmerDone():void{ this.removeChild(m_glimmer); } public function animationDone(e:Event):void{ if (m_dragonClip.currentFrame == 80){ m_fireLogoClip.visible = true; m_fireLogoClip.play(); m_fireLogoClip.addEventListener(Event.ENTER_FRAME, fireEfHandler); Tweener.addTween(m_fireLogoClip, {x:(((stage.width / 2) - (m_dragonClip.width / 2)) - 51), time:1, onComplete:logoInPlace}); }; if (m_dragonClip.currentFrame == m_dragonClip.totalFrames){ m_dragonClip.removeEventListener(Event.ENTER_FRAME, animationDone); m_dragonClip.stop(); m_playBtn.x = ((stage.width / 2) - (m_playBtn.width / 2)); m_playBtn.y = (m_fireLogoClip.y + 210); m_playBtn.addEventListener(MouseEvent.ROLL_OVER, btnOver); m_playBtn.addEventListener(MouseEvent.ROLL_OUT, btnOut); m_playBtn.addEventListener(MouseEvent.MOUSE_DOWN, btnDown); m_playBtn.addEventListener(MouseEvent.MOUSE_UP, launchGame); }; } public function init(name:String, mochiSignature:String=""):void{ m_bannedSign = (window.getChildByName("bannedSign") as Sprite); bannedSignBack = (m_bannedSign.getChildByName("bg") as Sprite); bannedSignBack.width = stage.stageWidth; bannedSignBack.height = stage.stageHeight; m_bannedSign.alpha = 0; m_bannedSign.addEventListener(MouseEvent.CLICK, onMainMovie); m_bannedSign.buttonMode = true; m_fireLogoClip = (window.getChildByName("fireLogoHolder") as MovieClip); m_fireLogoClip.x = ((bannedSignBack.width - m_fireLogoClip.width) - 90); m_fireLogoClip.y = (((bannedSignBack.height / 2) - (m_fireLogoClip.height / 2)) - 60); m_fireLogoClip.visible = false; m_fireLogoClip.stop(); m_dragonClip = (window.getChildByName("dragonHolder") as MovieClip); m_dragonClip.x = (bannedSignBack.width - m_dragonClip.width); m_dragonClip.y = ((bannedSignBack.height / 2) - (m_dragonClip.height / 2)); m_dragonClip.stop(); m_playBtn = (window.getChildByName("mcPlayBtn") as MovieClip); m_playBtn.buttonMode = true; m_playBtn.alpha = 0; m_playBtn.stop(); m_sndBell = new SndBellClass(); oldFrameRate = root.stage.frameRate; root.stage.frameRate = 30; if (KingAPI.banned){ showBannedScreen(); } else { if (!Factory.VERSION_MYGAME){ playLoaderMovie(); } else { SoundMixer.stopAll(); launchGame(null); }; }; } private function btnOver(evt:MouseEvent):void{ m_playBtn.gotoAndStop("over"); } private function logoInPlace():void{ m_fireLogoClip.addEventListener(Event.ENTER_FRAME, logoVisible); } private function onGlimmerTmr(e:Event):void{ var startX:Number = (m_fireLogoClip.x - m_glimmer.width); var destX:Number = ((m_fireLogoClip.x + m_fireLogoClip.width) - 80); m_glimmer.x = startX; Tweener.addTween(m_glimmer, {x:destX, time:0.5, onComplete:glimmerDone}); m_sndBell.play(); } } }//package com.midasplayer
Section 93
//DragonLoader_GlimmerClass (com.midasplayer.DragonLoader_GlimmerClass) package com.midasplayer { import mx.core.*; import flash.display.*; public class DragonLoader_GlimmerClass extends SpriteAsset { public var bar:DisplayObject; public var back:DisplayObject; public var adBox:DisplayObject; public var continue_bt:DisplayObject; public var adsHolder:DisplayObject; public var play_bt:DisplayObject; public var barHolder:DisplayObject; } }//package com.midasplayer
Section 94
//DragonLoader_SndBellClass (com.midasplayer.DragonLoader_SndBellClass) package com.midasplayer { import mx.core.*; import flash.display.*; public class DragonLoader_SndBellClass extends SoundAsset { public var bar:DisplayObject; public var back:DisplayObject; public var adBox:DisplayObject; public var continue_bt:DisplayObject; public var adsHolder:DisplayObject; public var play_bt:DisplayObject; public var barHolder:DisplayObject; } }//package com.midasplayer
Section 95
//DragonLoader_WindowClass (com.midasplayer.DragonLoader_WindowClass) package com.midasplayer { import mx.core.*; import flash.display.*; public class DragonLoader_WindowClass extends SpriteAsset { public var bg:DisplayObject; public var back:DisplayObject; public var adBox:DisplayObject; public var continue_bt:DisplayObject; public var fireLogoHolder:DisplayObject; public var mcPlayBtn:DisplayObject; public var bar:DisplayObject; public var dragonHolder:DisplayObject; public var bannedSign:DisplayObject; public var adsHolder:DisplayObject; public var play_bt:DisplayObject; public var barHolder:DisplayObject; } }//package com.midasplayer
Section 96
//KingAPI (com.midasplayer.KingAPI) package com.midasplayer { import flash.events.*; import flash.net.*; import flash.external.*; public class KingAPI { public static const LINK_TYPE_RIGHT_CLICK:String = "rightclick"; public static const USER_TYPE_SUBSCRIPTION:int = 3; public static const LINK_TYPE_HIGHSCORES:String = "highscores"; public static const LINK_TYPE_SIGN:String = "sign"; public static const INITIALIZED_EVENT:String = "initialized"; public static const LINK_TYPE_OTHER_GAMES:String = "other_games"; public static const USER_TYPE_REGISTERED:int = 1; private static const SAK:String = "ggfd7sday923mdsfd8csfds34"; private static const loadHomeParametersURL:String = "http://www.king.com/servlet/FreeGameServlet?action=load"; public static const LINK_TYPE_LOADER_MOVIE:String = "loader_movie"; private static const bounceURL:String = "http://www.mygame.com/king/bounce.jsp"; public static const LINK_TYPE_PROTECT:String = "protect"; public static const LINK_TYPE_ADD_GAME:String = "add_game"; public static const USER_TYPE_GOLD:int = 2; public static const USER_TYPE_UNREGISTERED:int = 0; public static const HOST_BANNED_EVENT:String = "hostBanned"; private static const SK:String = "vf78hxcsjak77cxzhjkwad87s"; private static const loadCountURL:String = "http://www.mygame.com/king/loadcount.jsp"; public static const LINK_TYPE_LOADER_PROGRESS:String = "loader_progress"; private static var check:String = null; public static var gameName:String; public static var banned:Boolean = false; protected static var dispatcher:EventDispatcher; public static var isHome:Boolean = false; private static var sessionID:String; private static var iscore:int = 123; public static var fromURL:String; private static var SSK:String = "ng43ui54hy35tdsnd6f54rews"; public function KingAPI(){ super(); } private static function loadUrlErrorHandler(event:Event):void{ trace(("Unable to load url: " + event)); } public static function resetScore():void{ iscore = 123; check = null; } public static function openOfflineProtectionLink():void{ openKingPage(LINK_TYPE_PROTECT); } public static function init(name:String, from:String):void{ var so:SharedObject; var rnd1:Number; var rnd2:Number; var name = name; var from = from; gameName = name; fromURL = from; var loadCounter:URLLoader = new URLLoader(); var reqvars:URLVariables = new URLVariables(); reqvars.game = gameName; reqvars.from = fromURL; so = SharedObject.getLocal("sessionId"); if (so.data.sessionID == null){ rnd1 = Math.abs(Math.floor((Math.random() * 4294967295))); rnd2 = Math.abs(Math.floor((Math.random() * 4294967295))); so.data.sessionID = (rnd1.toString(16) + rnd2.toString(16)); so.flush(); }; sessionID = so.data.sessionID; //unresolved jump var _slot1 = e; sessionID = "error"; reqvars.session = sessionID; var request:URLRequest = new URLRequest(((loadCountURL + "?") + reqvars.toString())); loadCounter.addEventListener(Event.COMPLETE, loadCountHandler); loadCounter.addEventListener(IOErrorEvent.IO_ERROR, loadUrlErrorHandler); loadCounter.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loadUrlErrorHandler); loadCounter.load(request); //unresolved jump var _slot1 = error; trace(("Unable to load loadcount url: " + loadCountURL)); trace(_slot1.message); } private static function loadHomeParametersHandler(event:Event):void{ var loadCounter:URLLoader = URLLoader(event.target); trace(("loadCounter.data" + loadCounter.data)); } public static function submitInternalScore():void{ checkScore(); var tmpscore:int = ((iscore - 123) / 2); submitScore(tmpscore); } public static function openOtherGamesLink():void{ openKingPage(LINK_TYPE_OTHER_GAMES); } public static function openKingPage(type:String, page:String=null):void{ var reqvars:URLVariables = new URLVariables(); reqvars.game = gameName; reqvars.from = fromURL; reqvars.type = type; reqvars.session = sessionID; if (page != null){ reqvars.redirect = page; }; var target:String = "_blank"; if (isHome){ target = "_top"; }; navigateToURL(new URLRequest(((bounceURL + "?") + reqvars.toString())), target); } private static function loadCountHandler(event:Event):void{ var vars:URLVariables; var event = event; var loadCounter:URLLoader = URLLoader(event.target); trace(("loadCounter.data :" + loadCounter.data)); vars = new URLVariables(loadCounter.data); if (vars.h == "true"){ isHome = true; }; if (vars.b == "true"){ banned = true; dispatcher.dispatchEvent(new Event(HOST_BANNED_EVENT)); } else { dispatcher.dispatchEvent(new Event(INITIALIZED_EVENT)); }; trace((("::" + vars.h) + "::")); trace((("::" + vars.b) + "::")); //unresolved jump var _slot1 = e; trace(("Error reading data from loadcount url: " + _slot1)); } public static function addEventListener(type:String, listener:Function):void{ if (dispatcher == null){ dispatcher = new EventDispatcher(); }; dispatcher.addEventListener(type, listener); } public static function openLoaderMovieLink():void{ openKingPage(LINK_TYPE_LOADER_MOVIE); } public static function removeEventListener(type:String, listener:Function):void{ if (dispatcher == null){ return; }; dispatcher.removeEventListener(type, listener); } public static function submitScore(score:int):void{ var score = score; var hash:String = md5.encrypt(((((score + ":") + gameName) + ":") + SSK)); if (isHome){ ExternalInterface.call("submitScore", score, hash); } else { openKingPage(LINK_TYPE_HIGHSCORES, ((((("game/" + gameName) + "/submit/") + score) + ":") + hash)); }; //unresolved jump var _slot1 = e; trace(_slot1); } public static function submitLevel(level:int):void{ var level = level; var hash:String = md5.encrypt(((((level + ":") + gameName) + ":") + SSK)); trace("h: ", hash); if (isHome){ ExternalInterface.call("submitLevel", level, hash); }; //unresolved jump var _slot1 = e; trace(_slot1); trace("ok"); } public static function openHighscoresLink():void{ openKingPage(LINK_TYPE_HIGHSCORES, (("game/" + gameName) + "/highscores")); } public static function openSignLink():void{ openKingPage(LINK_TYPE_SIGN); } public static function openRightClickLink():void{ openKingPage(LINK_TYPE_RIGHT_CLICK); } private static function checkScore():void{ if (check != null){ if (check != md5.encrypt(((((iscore + ":") + gameName) + ":") + SK))){ SSK = "ng41ui54hy35tdsnd6f54rews"; }; }; } public static function addScore(points:int):int{ checkScore(); var tmpscore:int = ((iscore - 123) / 2); tmpscore = (tmpscore + points); iscore = ((tmpscore * 2) + 123); check = md5.encrypt(((((iscore + ":") + gameName) + ":") + SK)); return (tmpscore); } public static function openLoaderProgressLink():void{ openKingPage(LINK_TYPE_LOADER_PROGRESS); } public static function openAddToWebsiteLink():void{ openKingPage(LINK_TYPE_ADD_GAME, "website_content.jsp"); } public static function submitAchievement(achievement:String):void{ var achievement = achievement; var hash:String = md5.encrypt(((((achievement + ":") + gameName) + ":") + SAK)); if (isHome){ ExternalInterface.call("submitAchievement", achievement, hash); }; //unresolved jump var _slot1 = e; trace(_slot1); } } }//package com.midasplayer
Section 97
//md5 (com.midasplayer.md5) package com.midasplayer { public class md5 { public static const HEX_FORMAT_LOWERCASE:uint = 0; public static const HEX_FORMAT_UPPERCASE:uint = 1; public static const BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE:String = ""; public static const BASE64_PAD_CHARACTER_RFC_COMPLIANCE:String = "="; public static var hexcase:uint = 0; public static var b64pad:String = ""; public function md5(){ super(); } public static function md5_gg(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number{ return (md5_cmn(((b & d) | (c & ~(d))), a, b, x, s, t)); } public static function md5_cmn(q:Number, a:Number, b:Number, x:Number, s:Number, t:Number):Number{ return (safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)); } public static function binl_md5(x:Array, len:Number):Array{ var olda:Number; var oldb:Number; var oldc:Number; var oldd:Number; x[(len >> 5)] = (x[(len >> 5)] | (128 << (len % 32))); x[((((len + 64) >>> 9) << 4) + 14)] = len; var a:Number = 1732584193; var b:Number = -271733879; var c:Number = -1732584194; var d:Number = 271733878; var i:Number = 0; while (i < x.length) { olda = a; oldb = b; oldc = c; oldd = d; a = md5_ff(a, b, c, d, x[(i + 0)], 7, -680876936); d = md5_ff(d, a, b, c, x[(i + 1)], 12, -389564586); c = md5_ff(c, d, a, b, x[(i + 2)], 17, 606105819); b = md5_ff(b, c, d, a, x[(i + 3)], 22, -1044525330); a = md5_ff(a, b, c, d, x[(i + 4)], 7, -176418897); d = md5_ff(d, a, b, c, x[(i + 5)], 12, 1200080426); c = md5_ff(c, d, a, b, x[(i + 6)], 17, -1473231341); b = md5_ff(b, c, d, a, x[(i + 7)], 22, -45705983); a = md5_ff(a, b, c, d, x[(i + 8)], 7, 1770035416); d = md5_ff(d, a, b, c, x[(i + 9)], 12, -1958414417); c = md5_ff(c, d, a, b, x[(i + 10)], 17, -42063); b = md5_ff(b, c, d, a, x[(i + 11)], 22, -1990404162); a = md5_ff(a, b, c, d, x[(i + 12)], 7, 1804603682); d = md5_ff(d, a, b, c, x[(i + 13)], 12, -40341101); c = md5_ff(c, d, a, b, x[(i + 14)], 17, -1502002290); b = md5_ff(b, c, d, a, x[(i + 15)], 22, 1236535329); a = md5_gg(a, b, c, d, x[(i + 1)], 5, -165796510); d = md5_gg(d, a, b, c, x[(i + 6)], 9, -1069501632); c = md5_gg(c, d, a, b, x[(i + 11)], 14, 643717713); b = md5_gg(b, c, d, a, x[(i + 0)], 20, -373897302); a = md5_gg(a, b, c, d, x[(i + 5)], 5, -701558691); d = md5_gg(d, a, b, c, x[(i + 10)], 9, 38016083); c = md5_gg(c, d, a, b, x[(i + 15)], 14, -660478335); b = md5_gg(b, c, d, a, x[(i + 4)], 20, -405537848); a = md5_gg(a, b, c, d, x[(i + 9)], 5, 568446438); d = md5_gg(d, a, b, c, x[(i + 14)], 9, -1019803690); c = md5_gg(c, d, a, b, x[(i + 3)], 14, -187363961); b = md5_gg(b, c, d, a, x[(i + 8)], 20, 1163531501); a = md5_gg(a, b, c, d, x[(i + 13)], 5, -1444681467); d = md5_gg(d, a, b, c, x[(i + 2)], 9, -51403784); c = md5_gg(c, d, a, b, x[(i + 7)], 14, 1735328473); b = md5_gg(b, c, d, a, x[(i + 12)], 20, -1926607734); a = md5_hh(a, b, c, d, x[(i + 5)], 4, -378558); d = md5_hh(d, a, b, c, x[(i + 8)], 11, -2022574463); c = md5_hh(c, d, a, b, x[(i + 11)], 16, 1839030562); b = md5_hh(b, c, d, a, x[(i + 14)], 23, -35309556); a = md5_hh(a, b, c, d, x[(i + 1)], 4, -1530992060); d = md5_hh(d, a, b, c, x[(i + 4)], 11, 1272893353); c = md5_hh(c, d, a, b, x[(i + 7)], 16, -155497632); b = md5_hh(b, c, d, a, x[(i + 10)], 23, -1094730640); a = md5_hh(a, b, c, d, x[(i + 13)], 4, 681279174); d = md5_hh(d, a, b, c, x[(i + 0)], 11, -358537222); c = md5_hh(c, d, a, b, x[(i + 3)], 16, -722521979); b = md5_hh(b, c, d, a, x[(i + 6)], 23, 76029189); a = md5_hh(a, b, c, d, x[(i + 9)], 4, -640364487); d = md5_hh(d, a, b, c, x[(i + 12)], 11, -421815835); c = md5_hh(c, d, a, b, x[(i + 15)], 16, 530742520); b = md5_hh(b, c, d, a, x[(i + 2)], 23, -995338651); a = md5_ii(a, b, c, d, x[(i + 0)], 6, -198630844); d = md5_ii(d, a, b, c, x[(i + 7)], 10, 1126891415); c = md5_ii(c, d, a, b, x[(i + 14)], 15, -1416354905); b = md5_ii(b, c, d, a, x[(i + 5)], 21, -57434055); a = md5_ii(a, b, c, d, x[(i + 12)], 6, 1700485571); d = md5_ii(d, a, b, c, x[(i + 3)], 10, -1894986606); c = md5_ii(c, d, a, b, x[(i + 10)], 15, -1051523); b = md5_ii(b, c, d, a, x[(i + 1)], 21, -2054922799); a = md5_ii(a, b, c, d, x[(i + 8)], 6, 1873313359); d = md5_ii(d, a, b, c, x[(i + 15)], 10, -30611744); c = md5_ii(c, d, a, b, x[(i + 6)], 15, -1560198380); b = md5_ii(b, c, d, a, x[(i + 13)], 21, 1309151649); a = md5_ii(a, b, c, d, x[(i + 4)], 6, -145523070); d = md5_ii(d, a, b, c, x[(i + 11)], 10, -1120210379); c = md5_ii(c, d, a, b, x[(i + 2)], 15, 718787259); b = md5_ii(b, c, d, a, x[(i + 9)], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); i = (i + 16); }; return ([a, b, c, d]); } public static function str2rstr_utf16le(input:String):String{ var output:String = ""; var i:Number = 0; while (i < input.length) { output = (output + String.fromCharCode((input.charCodeAt(i) & 0xFF), ((input.charCodeAt(i) >>> 8) & 0xFF))); i++; }; return (output); } public static function hex_hmac_md5(key:String, data:String):String{ return (rstr2hex(rstr_hmac_md5(str2rstr_utf8(key), str2rstr_utf8(data)))); } public static function binl2rstr(input:Array):String{ var output:String = ""; var i:Number = 0; while (i < (input.length * 32)) { output = (output + String.fromCharCode(((input[(i >> 5)] >>> (i % 32)) & 0xFF))); i = (i + 8); }; return (output); } public static function md5_ff(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number{ return (md5_cmn(((b & c) | (~(b) & d)), a, b, x, s, t)); } public static function md5_ii(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number{ return (md5_cmn((c ^ (b | ~(d))), a, b, x, s, t)); } public static function rstr2binl(input:String):Array{ var i:Number; var output:Array = Array((input.length >> 2)); i = 0; while (i < output.length) { output[i] = 0; i++; }; i = 0; while (i < (input.length * 8)) { output[(i >> 5)] = (output[(i >> 5)] | ((input.charCodeAt((i / 8)) & 0xFF) << (i % 32))); i = (i + 8); }; return (output); } public static function md5_vm_test():Boolean{ return ((hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72")); } public static function b64_md5(string:String):String{ return (rstr2b64(rstr_md5(str2rstr_utf8(string)))); } public static function any_hmac_md5(key:String, data:String, encoding:String):String{ return (rstr2any(rstr_hmac_md5(str2rstr_utf8(key), str2rstr_utf8(data)), encoding)); } public static function hex_md5(string:String):String{ return (rstr2hex(rstr_md5(str2rstr_utf8(string)))); } public static function bit_rol(num:Number, cnt:Number):Number{ return (((num << cnt) | (num >>> (32 - cnt)))); } public static function encrypt(string:String):String{ return (hex_md5(string)); } public static function md5_hh(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number{ return (md5_cmn(((b ^ c) ^ d), a, b, x, s, t)); } public static function rstr2hex(input:String):String{ var x:Number; var hex_tab:String = (hexcase) ? "0123456789ABCDEF" : "0123456789abcdef"; var output:String = ""; var i:Number = 0; while (i < input.length) { x = input.charCodeAt(i); output = (output + (hex_tab.charAt(((x >>> 4) & 15)) + hex_tab.charAt((x & 15)))); i++; }; return (output); } public static function any_md5(string:String, encoding:String):String{ return (rstr2any(rstr_md5(str2rstr_utf8(string)), encoding)); } public static function b64_hmac_md5(key:String, data:String):String{ return (rstr2b64(rstr_hmac_md5(str2rstr_utf8(key), str2rstr_utf8(data)))); } public static function rstr2b64(input:String):String{ var triplet:Number; var j:Number; var tab:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var output:String = ""; var len:Number = input.length; var i:Number = 0; while (i < len) { triplet = (((input.charCodeAt(i) << 16) | (((i + 1) < len)) ? (input.charCodeAt((i + 1)) << 8) : 0) | (((i + 2) < len)) ? input.charCodeAt((i + 2)) : 0); j = 0; while (j < 4) { if (((i * 8) + (j * 6)) > (input.length * 8)){ output = (output + b64pad); } else { output = (output + tab.charAt(((triplet >>> (6 * (3 - j))) & 63))); }; j++; }; i = (i + 3); }; return (output); } public static function safe_add(x:Number, y:Number):Number{ var lsw:Number = ((x & 0xFFFF) + (y & 0xFFFF)); var msw:Number = (((x >> 16) + (y >> 16)) + (lsw >> 16)); return (((msw << 16) | (lsw & 0xFFFF))); } public static function str2rstr_utf8(input:String):String{ var x:Number; var y:Number; var output:String = ""; var i:Number = -1; while (++i < input.length) { x = input.charCodeAt(i); y = (((i + 1) < input.length)) ? input.charCodeAt((i + 1)) : 0; if ((((((((0xD800 <= x)) && ((x <= 56319)))) && ((0xDC00 <= y)))) && ((y <= 57343)))){ x = ((65536 + ((x & 1023) << 10)) + (y & 1023)); i++; }; if (x <= 127){ output = (output + String.fromCharCode(x)); } else { if (x <= 2047){ output = (output + String.fromCharCode((192 | ((x >>> 6) & 31)), (128 | (x & 63)))); } else { if (x <= 0xFFFF){ output = (output + String.fromCharCode((224 | ((x >>> 12) & 15)), (128 | ((x >>> 6) & 63)), (128 | (x & 63)))); } else { if (x <= 2097151){ output = (output + String.fromCharCode((240 | ((x >>> 18) & 7)), (128 | ((x >>> 12) & 63)), (128 | ((x >>> 6) & 63)), (128 | (x & 63)))); }; }; }; }; }; return (output); } public static function rstr_hmac_md5(key:String, data:String):String{ var bkey:Array = rstr2binl(key); if (bkey.length > 16){ bkey = binl_md5(bkey, (key.length * 8)); }; var ipad:Array = Array(16); var opad:Array = Array(16); var i:Number = 0; while (i < 16) { ipad[i] = (bkey[i] ^ 909522486); opad[i] = (bkey[i] ^ 1549556828); i++; }; var hash:Array = binl_md5(ipad.concat(rstr2binl(data)), (0x0200 + (data.length * 8))); return (binl2rstr(binl_md5(opad.concat(hash), (0x0200 + 128)))); } public static function str2rstr_utf16be(input:String):String{ var output:String = ""; var i:Number = 0; while (i < input.length) { output = (output + String.fromCharCode(((input.charCodeAt(i) >>> 8) & 0xFF), (input.charCodeAt(i) & 0xFF))); i++; }; return (output); } public static function rstr2any(input:String, encoding:String):String{ var i:Number; var q:Number; var x:Number; var quotient:Array; var divisor:Number = encoding.length; var remainders:Array = []; var dividend:Array = Array((input.length / 2)); i = 0; while (i < dividend.length) { dividend[i] = ((input.charCodeAt((i * 2)) << 8) | input.charCodeAt(((i * 2) + 1))); i++; }; while (dividend.length > 0) { quotient = []; x = 0; i = 0; while (i < dividend.length) { x = ((x << 16) + dividend[i]); q = Math.floor((x / divisor)); x = (x - (q * divisor)); if ((((quotient.length > 0)) || ((q > 0)))){ quotient[quotient.length] = q; }; i++; }; remainders[remainders.length] = x; dividend = quotient; }; var output:String = ""; i = (remainders.length - 1); while (i >= 0) { output = (output + encoding.charAt(remainders[i])); i--; }; return (output); } public static function rstr_md5(string:String):String{ return (binl2rstr(binl_md5(rstr2binl(string), (string.length * 8)))); } } }//package com.midasplayer
Section 98
//CoreEvent (core.events.CoreEvent) package core.events { import flash.events.*; public class CoreEvent extends Event { public var data:Object; public static const PLAYER_COLLIDE:String = "ExitCollide"; public static const CHECK_BODY_INTERSECTIONS:String = "CheckBodyIntersections"; public static const UPDATE:String = "Update"; public static const BONUS_COLLECT:String = "BonusCollect"; public static const LEVEL_COMPLETE:String = "LevelComplete"; public static const LEVEL_RESTART_END:String = "LevelRestartEnd"; public static const LEVEL_RESTART_START:String = "LevelRestartStart"; public static const LEVEL_FAIL:String = "LevelFail"; public static const DESTROY:String = "Destroy"; public static const GET_JOINT_OBJECT:String = "GetJointObject"; public static const SPLIT_SUCCESS:String = "SplitSuccess"; public static const RETURN_JOINT_OBJECT:String = "ReturnJointObject"; public static const GET_BODY_UNDER_POINT:String = "GetBodyUnderPoint"; public static const RETURN_BODY_UNDER_POINT:String = "ReturnBodyUnderPoint"; public static const CHECK_JOINT_INTERSECTIONS:String = "CheckJointIntersections"; public function CoreEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false):void{ super(type, bubbles, cancelable); this.data = data; } } }//package core.events
Section 99
//BaseObject (core.objects.BaseObject) package core.objects { import flash.events.*; import core.*; import flash.display.*; import core.events.*; public class BaseObject extends EventDispatcher { protected var engine:GameEngine; protected var def:BaseObjectDef; protected var skin:Sprite; public function BaseObject(def:BaseObjectDef):void{ super(); this.def = def; init(); } public function destroy(e:CoreEvent=null):void{ skin.parent.removeChild(skin); engine.dispatcher.removeEventListener(CoreEvent.DESTROY, destroy); engine.dispatcher.removeEventListener(CoreEvent.LEVEL_RESTART_START, levelRestartStart); } protected function updateSkin():void{ } public function moveTo(x:Number, y:Number):void{ } protected function init():void{ engine = GameEngine.getInstance(); engine.dispatcher.addEventListener(CoreEvent.LEVEL_RESTART_START, levelRestartStart); engine.dispatcher.addEventListener(CoreEvent.DESTROY, destroy); } protected function levelRestartStart(e:CoreEvent):void{ dispatchEvent(new CoreEvent(CoreEvent.LEVEL_RESTART_END)); } protected function createSkin():Sprite{ return (null); } } }//package core.objects
Section 100
//BaseObjectDef (core.objects.BaseObjectDef) package core.objects { public class BaseObjectDef { public var splittable:Boolean; public var x:Number; public var y:Number; public var id:uint; private static var ID:uint = 0; public function BaseObjectDef(x:Number, y:Number, splittable:Boolean):void{ super(); this.id = ID; this.x = x; this.y = y; this.splittable = splittable; ID++; } public function getStringDef():String{ return (null); } } }//package core.objects
Section 101
//BodyObject (core.objects.BodyObject) package core.objects { import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import caurina.transitions.*; public class BodyObject extends BaseObject { protected var body:b2Body; protected var bodyObjDef:BodyObjectDef; public function BodyObject(bodyObjDef:BodyObjectDef):void{ this.bodyObjDef = bodyObjDef; super(bodyObjDef); } protected function createShapeDef():b2ShapeDef{ return (null); } protected function updateHandler(e:CoreEvent):void{ updateSkin(); checkBounds(); } override protected function updateSkin():void{ var pos:b2Vec2 = body.GetPosition(); skin.x = (pos.x * engine.m_physScale); skin.y = (pos.y * engine.m_physScale); skin.rotation = ((body.GetAngle() * 180) / Math.PI); } protected function createBodyDef():b2BodyDef{ return (null); } protected function restartComplete():void{ dispatchEvent(new CoreEvent(CoreEvent.LEVEL_RESTART_END)); } override public function moveTo(x:Number, y:Number):void{ var pos:b2Vec2 = new b2Vec2((x / engine.m_physScale), (y / engine.m_physScale)); body.SetXForm(pos, body.GetAngle()); updateSkin(); } override protected function init():void{ super.init(); var shapeDef:b2ShapeDef = createShapeDef(); var bodyDef:b2BodyDef = createBodyDef(); body = createBody(bodyDef, shapeDef); skin = createSkin(); moveTo(def.x, def.y); engine.dispatcher.addEventListener(CoreEvent.GET_BODY_UNDER_POINT, getBodyUnderPointHander); } public function getBody():b2Body{ return (body); } override protected function levelRestartStart(e:CoreEvent):void{ var cp:Point = new Point(skin.x, skin.y); var dist:Number = Point.distance(new Point(bodyObjDef.x, bodyObjDef.y), cp); var time:Number = (dist / 300); Tweener.addTween(skin, {x:bodyObjDef.x, y:bodyObjDef.y, rotation:0, time:time, transition:"easeinoutquad", onComplete:restartComplete}); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.m_world.DestroyBody(body); if (!bodyObjDef.isStatic){ engine.dispatcher.removeEventListener(CoreEvent.UPDATE, updateHandler); }; engine.dispatcher.removeEventListener(CoreEvent.GET_BODY_UNDER_POINT, getBodyUnderPointHander); } protected function getBodyUnderPointHander(e:CoreEvent):void{ var p:Point = (e.data as Point); if (skin.hitTestPoint(p.x, p.y, true)){ dispatchEvent(new CoreEvent(CoreEvent.RETURN_BODY_UNDER_POINT, this)); }; } protected function checkBounds():void{ var pos:b2Vec2 = body.GetPosition(); var py:Number = (pos.y * engine.m_physScale); if (py > 1000){ engine.removeBaseObj(this); }; } protected function createBody(bodyDef:b2BodyDef, shapeDef:b2ShapeDef):b2Body{ var body:b2Body; if (bodyObjDef.isStatic){ body = engine.m_world.CreateStaticBody(bodyDef); } else { body = engine.m_world.CreateDynamicBody(bodyDef); engine.dispatcher.addEventListener(CoreEvent.UPDATE, updateHandler); }; body.CreateShape(shapeDef); body.SetMassFromShapes(); return (body); } } }//package core.objects
Section 102
//BodyObjectDef (core.objects.BodyObjectDef) package core.objects { import flash.geom.*; public class BodyObjectDef extends BaseObjectDef { public var startPos:Point; public var startRotation:Number; public var isStatic:Boolean; public function BodyObjectDef(x:Number, y:Number, splittable:Boolean, isStatic:Boolean):void{ this.isStatic = isStatic; super(x, y, splittable); } } }//package core.objects
Section 103
//Bonus (core.objects.Bonus) package core.objects { import flash.display.*; import core.events.*; import flash.media.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.Contacts.*; import caurina.transitions.*; public class Bonus extends CircleObject { private var sndCollect:Sound; protected var bonusDef:BonusDef; public static const NAME:String = "Bonus"; public function Bonus(def:BonusDef):void{ this.bonusDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.isSensor = true; return (shapeDef); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = super.createBodyDef(); bodyDef.userData = NAME; return (bodyDef); } override protected function updateHandler(e:CoreEvent):void{ checkCollisions(); } private function checkCollisions():void{ var body1:b2Body; var body2:b2Body; var c:b2ContactEdge = body.m_contactList; while (c) { body1 = c.contact.m_shape1.m_body; body2 = c.contact.m_shape2.m_body; if ((((((body1.m_userData == Player.NAME)) && ((body2.m_userData == NAME)))) || ((((body1.m_userData == NAME)) && ((body2.m_userData == Player.NAME)))))){ collect(); }; c = c.next; }; } private function collect():void{ dispatchEvent(new CoreEvent(CoreEvent.BONUS_COLLECT, this)); engine.sndChannel = sndCollect.play(0, 0, engine.sndTransform); var animSkin:Sprite = createSkin(); animSkin.x = skin.x; animSkin.y = skin.y; Tweener.addTween(animSkin, {scaleX:1.5, scaleY:1.5, rotation:60, time:0.3, transition:"easeoutquad"}); Tweener.addTween(animSkin, {scaleX:0, scaleY:0, rotation:-180, delay:0.4, time:0.5, transition:"easeoutquad", onComplete:animComplete}); } override protected function init():void{ super.init(); engine.dispatcher.addEventListener(CoreEvent.UPDATE, updateHandler); initSounds(); } private function animComplete():void{ } private function initSounds():void{ var CollectClass:Class = engine.assets.getAssetClass("SndStarCollect"); sndCollect = new (CollectClass); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("BonusAsset"); var skin:Sprite = new (SkinClass); engine.canvas.playerContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.dispatcher.removeEventListener(CoreEvent.UPDATE, updateHandler); } } }//package core.objects
Section 104
//BonusDef (core.objects.BonusDef) package core.objects { public class BonusDef extends CircleObjectDef { public static const NAME:String = "b"; public function BonusDef(x:Number, y:Number, r:Number):void{ super(x, y, false, true, r); } override public function getStringDef():String{ var str = (NAME + "_"); str = (str + (x + "_")); str = (str + (y + "_")); str = (str + r); return (str); } public static function parseStringDef(stringDef:String):BonusDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var def:BonusDef = new BonusDef(x, y, r); return (def); } } }//package core.objects
Section 105
//CircleObject (core.objects.CircleObject) package core.objects { import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; public class CircleObject extends BodyObject { protected var circleDef:CircleObjectDef; public function CircleObject(def:CircleObjectDef):void{ this.circleDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2CircleDef = new b2CircleDef(); shapeDef.radius = (circleDef.r / engine.m_physScale); shapeDef.density = 1; shapeDef.friction = 0.5; shapeDef.restitution = 0.2; return (shapeDef); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((circleDef.x / engine.m_physScale), (circleDef.y / engine.m_physScale)); return (bodyDef); } override protected function createSkin():Sprite{ var MaterialClass:Class; if (circleDef.isStatic){ MaterialClass = engine.assets.getAssetClass("BrickMaterial"); } else { MaterialClass = engine.assets.getAssetClass("MetallMaterial"); }; var skinData:BitmapData = (new MaterialClass(0, 0) as BitmapData); var skin:Sprite = new Sprite(); skin.graphics.beginBitmapFill(skinData, null, true, true); skin.graphics.lineStyle(0, 0, 1); skin.graphics.drawCircle(0, 0, circleDef.r); skin.graphics.endFill(); engine.canvas.bodiesContainer.addChild(skin); return (skin); } override protected function getBodyUnderPointHander(e:CoreEvent):void{ var p:Point = (e.data as Point); var bpos:b2Vec2 = body.GetPosition(); var bx:Number = (bpos.x * engine.m_physScale); var by:Number = (bpos.y * engine.m_physScale); var dist:Number = Math.sqrt((((bx - p.x) * (bx - p.x)) + ((by - p.y) * (by - p.y)))); if (dist <= circleDef.r){ dispatchEvent(new CoreEvent(CoreEvent.RETURN_BODY_UNDER_POINT, this)); }; } } }//package core.objects
Section 106
//CircleObjectDef (core.objects.CircleObjectDef) package core.objects { public class CircleObjectDef extends BodyObjectDef { public var r:Number; public static const NAME:String = "c"; public function CircleObjectDef(x:Number, y:Number, splittable:Boolean, isStatic:Boolean, r:Number):void{ this.r = r; super(x, y, splittable, isStatic); } override public function getStringDef():String{ var typeIndex:int; var str = (NAME + "_"); switch (isStatic){ case false: typeIndex = 1; break; case true: typeIndex = 2; break; }; str = (str + (x + "_")); str = (str + (y + "_")); str = (str + (typeIndex + "_")); str = (str + r); return (str); } public static function parseStringDef(stringDef:String):CircleObjectDef{ var isStatic:Boolean; var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var typeIndex:int = props[3]; switch (typeIndex){ case 1: isStatic = false; break; case 2: isStatic = true; break; }; var r:Number = props[4]; var circleDef:CircleObjectDef = new CircleObjectDef(x, y, false, isStatic, r); return (circleDef); } } }//package core.objects
Section 107
//DistanceJointObject (core.objects.DistanceJointObject) package core.objects { import core.*; import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; public class DistanceJointObject extends BaseObject { private var color:uint; protected var joint:b2DistanceJoint; protected var jointDef:DistanceJointObjectDef; public function DistanceJointObject(jointDef:DistanceJointObjectDef):void{ this.jointDef = jointDef; super(jointDef); } protected function updateHandler(e:CoreEvent):void{ updateSkin(); } protected function checkIntersections(e:CoreEvent):void{ var data:Object; var mouseLine:Line = (e.data as Line); var a1:b2Vec2 = joint.GetAnchor1().Copy(); a1.Multiply(engine.m_physScale); var a2:b2Vec2 = joint.GetAnchor2().Copy(); a2.Multiply(engine.m_physScale); var line:Line = new Line(new Point(Math.round(a1.x), Math.round(a1.y)), new Point(Math.round(a2.x), Math.round(a2.y))); if (Line.checkIntersections(mouseLine, line)){ data = {remove:this}; dispatchEvent(new CoreEvent(CoreEvent.SPLIT_SUCCESS, data)); }; } override protected function updateSkin():void{ if (!joint){ return; }; var a1:b2Vec2 = joint.GetAnchor1().Copy(); a1.Multiply(engine.m_physScale); var a2:b2Vec2 = joint.GetAnchor2().Copy(); a2.Multiply(engine.m_physScale); skin.graphics.clear(); skin.graphics.lineStyle(3, color, 1); skin.graphics.moveTo(a1.x, a1.y); skin.graphics.lineTo(a2.x, a2.y); skin.graphics.lineStyle(0, 0); drawPoint(a1.x, a1.y); drawPoint(a2.x, a2.y); } private function drawPoint(x:Number, y:Number):void{ skin.graphics.moveTo((x - 3), y); skin.graphics.lineTo((x + 3), y); skin.graphics.moveTo(x, (y - 3)); skin.graphics.lineTo(x, (y + 3)); } protected function createJoint():b2DistanceJoint{ var body2Obj:BodyObject; var body1Obj:BodyObject = engine.getBodyObjUnderPoint(jointDef.anchor1); body2Obj = engine.getBodyObjUnderPoint(jointDef.anchor2); if (((!(body1Obj)) || (!(body2Obj)))){ return (null); }; var djd:b2DistanceJointDef = new b2DistanceJointDef(); djd.collideConnected = true; var v1:b2Vec2 = new b2Vec2((jointDef.anchor1.x / engine.m_physScale), (jointDef.anchor1.y / engine.m_physScale)); var v2:b2Vec2 = new b2Vec2((jointDef.anchor2.x / engine.m_physScale), (jointDef.anchor2.y / engine.m_physScale)); djd.Initialize(body1Obj.getBody(), body2Obj.getBody(), v1, v2); var joint:b2DistanceJoint = (engine.m_world.CreateJoint(djd) as b2DistanceJoint); return (joint); } override protected function init():void{ super.init(); joint = createJoint(); skin = createSkin(); updateSkin(); if (joint){ engine.dispatcher.addEventListener(CoreEvent.GET_JOINT_OBJECT, getJointObjectHandler); engine.dispatcher.addEventListener(CoreEvent.CHECK_JOINT_INTERSECTIONS, checkIntersections); engine.dispatcher.addEventListener(CoreEvent.UPDATE, updateHandler); }; } protected function getJointObjectHandler(e:CoreEvent):void{ var j:b2Joint = (e.data as b2Joint); if (j == joint){ dispatchEvent(new CoreEvent(CoreEvent.RETURN_JOINT_OBJECT, this)); }; } override protected function createSkin():Sprite{ color = (jointDef.splittable) ? 0xFFFF00 : 0x555555; var skin:Sprite = new Sprite(); engine.canvas.jointsContainer.addChild(skin); if (!joint){ skin.graphics.clear(); skin.graphics.lineStyle(3, color, 1); skin.graphics.moveTo(jointDef.anchor1.x, jointDef.anchor1.y); skin.graphics.lineTo(jointDef.anchor2.x, jointDef.anchor2.y); }; return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); if (joint){ engine.m_world.DestroyJoint(joint); }; engine.dispatcher.removeEventListener(CoreEvent.GET_JOINT_OBJECT, getJointObjectHandler); engine.dispatcher.removeEventListener(CoreEvent.CHECK_JOINT_INTERSECTIONS, checkIntersections); engine.dispatcher.removeEventListener(CoreEvent.UPDATE, updateHandler); } override protected function levelRestartStart(e:CoreEvent):void{ super.levelRestartStart(e); skin.visible = false; } } }//package core.objects
Section 108
//DistanceJointObjectDef (core.objects.DistanceJointObjectDef) package core.objects { import flash.geom.*; public class DistanceJointObjectDef extends BaseObjectDef { public var anchor1:Point; public var anchor2:Point; public static const NAME:String = "j"; public function DistanceJointObjectDef(x:Number, y:Number, splittable:Boolean, anchor1:Point, anchor2:Point):void{ this.anchor1 = anchor1; this.anchor2 = anchor2; super(x, y, splittable); } public function updateAnchors(a1:Point, a2:Point):void{ anchor1.x = a1.x; anchor1.y = a1.y; anchor2.x = a2.x; anchor2.y = a2.y; x = Math.round((anchor1.x + ((anchor2.x - anchor1.x) / 2))); y = Math.round((anchor1.y + ((anchor2.y - anchor1.y) / 2))); } override public function getStringDef():String{ var str = (NAME + "_"); str = (str + (x + "_")); str = (str + (y + "_")); str = (str + (anchor1.x + "_")); str = (str + (anchor1.y + "_")); str = (str + (anchor2.x + "_")); str = (str + anchor2.y); return (str); } public static function parseStringDef(stringDef:String):DistanceJointObjectDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var a1x:Number = props[3]; var a1y:Number = props[4]; var a2x:Number = props[5]; var a2y:Number = props[6]; var a1:Point = new Point(a1x, a1y); var a2:Point = new Point(a2x, a2y); var def:DistanceJointObjectDef = new DistanceJointObjectDef(x, y, true, a1, a2); return (def); } } }//package core.objects
Section 109
//Exit (core.objects.Exit) package core.objects { import flash.display.*; import core.events.*; import flash.media.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import Box2D.Dynamics.Contacts.*; public class Exit extends CircleObject { protected var exitDef:ExitDef; private var sndLevelComplete:Sound; public static const NAME:String = "Exit"; public function Exit(def:ExitDef):void{ this.exitDef = def; super(def); } override protected function createShapeDef():b2ShapeDef{ var shapeDef:b2ShapeDef = super.createShapeDef(); shapeDef.isSensor = true; return (shapeDef); } override protected function updateHandler(e:CoreEvent):void{ checkCollisions(); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = super.createBodyDef(); bodyDef.userData = NAME; return (bodyDef); } private function checkCollisions():void{ var body1:b2Body; var body2:b2Body; var c:b2ContactEdge = body.m_contactList; while (c) { body1 = c.contact.m_shape1.m_body; body2 = c.contact.m_shape2.m_body; if ((((((body1.m_userData == Player.NAME)) && ((body2.m_userData == NAME)))) || ((((body1.m_userData == NAME)) && ((body2.m_userData == Player.NAME)))))){ levelComplete(); }; c = c.next; }; } override protected function init():void{ super.init(); engine.dispatcher.addEventListener(CoreEvent.UPDATE, updateHandler); initSounds(); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("ExitAsset"); var skin:Sprite = new (SkinClass); engine.canvas.playerContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); engine.dispatcher.removeEventListener(CoreEvent.UPDATE, updateHandler); } private function initSounds():void{ var LevelCompleteClass:Class = engine.assets.getAssetClass("SndLevelComplete"); sndLevelComplete = new (LevelCompleteClass); } private function levelComplete():void{ engine.sndChannel = sndLevelComplete.play(0, 0, engine.sndTransform); dispatchEvent(new CoreEvent(CoreEvent.LEVEL_COMPLETE)); } } }//package core.objects
Section 110
//ExitDef (core.objects.ExitDef) package core.objects { public class ExitDef extends CircleObjectDef { public static const NAME:String = "e"; public function ExitDef(x:Number, y:Number, r:Number):void{ super(x, y, false, true, r); } override public function getStringDef():String{ var str = (NAME + "_"); str = (str + (x + "_")); str = (str + (y + "_")); str = (str + r); return (str); } public static function parseStringDef(stringDef:String):ExitDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var def:ExitDef = new ExitDef(x, y, r); return (def); } } }//package core.objects
Section 111
//Player (core.objects.Player) package core.objects { import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import caurina.transitions.*; public class Player extends CircleObject { protected var playerDef:PlayerDef; private var eyeRight:Sprite; private var pupilRight:Sprite; private var pupilLeft:Sprite; private var eyeLeft:Sprite; private var skinInner:Sprite; public static const NAME:String = "Player"; public function Player(def:PlayerDef):void{ this.playerDef = def; super(def); } override protected function createSkin():Sprite{ var SkinClass:Class = engine.assets.getAssetClass("PlayerAsset"); var skin:Sprite = new (SkinClass); engine.canvas.playerContainer.addChild(skin); return (skin); } override protected function updateHandler(e:CoreEvent):void{ super.updateHandler(e); rotateEye(eyeLeft, pupilLeft); rotateEye(eyeRight, pupilRight); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = super.createBodyDef(); bodyDef.userData = NAME; return (bodyDef); } public function levelComplete(exitPos:Point):void{ Tweener.addTween(skin, {x:exitPos.x, y:exitPos.y, rotation:(skin.rotation + 180), scaleX:0, scaleY:0, time:0.7, transition:"linear"}); } override protected function init():void{ super.init(); skinInner = (skin.getChildByName("inner") as Sprite); eyeLeft = (skinInner.getChildByName("eyeLeft") as Sprite); eyeRight = (skinInner.getChildByName("eyeRight") as Sprite); pupilLeft = (eyeLeft.getChildByName("pupil") as Sprite); pupilRight = (eyeRight.getChildByName("pupil") as Sprite); } protected function rotateEye(eye:Sprite, pupil:Sprite):void{ var globalEye:Point; var localEye:Point; var dir:b2Vec2; var globalEyeVector:b2Vec2; var mouseVector:b2Vec2 = new b2Vec2(skin.stage.mouseX, skin.stage.mouseY); var r:Number = 5; globalEye = eye.parent.localToGlobal(new Point(eye.x, eye.y)); globalEyeVector = new b2Vec2(globalEye.x, globalEye.y); dir = mouseVector.Copy(); dir.Subtract(globalEyeVector); if (dir.Length() < r){ localEye = eye.globalToLocal(new Point(mouseVector.x, mouseVector.y)); } else { dir.Normalize(); dir.Multiply(r); globalEyeVector.Add(dir); localEye = eye.globalToLocal(new Point(globalEyeVector.x, globalEyeVector.y)); }; pupil.x = localEye.x; pupil.y = localEye.y; } override protected function checkBounds():void{ var pos:b2Vec2 = body.GetPosition(); var py:Number = (pos.y * engine.m_physScale); if (py > 500){ engine.playerOutOfBounds(); }; } } }//package core.objects
Section 112
//PlayerDef (core.objects.PlayerDef) package core.objects { public class PlayerDef extends CircleObjectDef { public static const NAME:String = "p"; public function PlayerDef(x:Number, y:Number, r:Number):void{ super(x, y, false, false, r); } override public function getStringDef():String{ var str = (NAME + "_"); str = (str + (x + "_")); str = (str + (y + "_")); str = (str + r); return (str); } public static function parseStringDef(stringDef:String):PlayerDef{ var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var playerDef:PlayerDef = new PlayerDef(x, y, r); return (playerDef); } } }//package core.objects
Section 113
//PolyObject (core.objects.PolyObject) package core.objects { import core.*; import flash.display.*; import core.events.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; import geom.*; import caurina.transitions.*; public class PolyObject extends BodyObject { protected var polyDef:PolyObjectDef; public function PolyObject(polyDef:PolyObjectDef):void{ this.polyDef = polyDef; super(polyDef); } override protected function createShapeDef():b2ShapeDef{ var defVertex:Point; var vertex:Point; var shapeDef:b2PolygonDef = new b2PolygonDef(); var sprite:Sprite = new Sprite(); sprite.x = polyDef.x; sprite.y = polyDef.y; shapeDef.vertexCount = polyDef.vertices.length; var i:uint; while (i < polyDef.vertices.length) { defVertex = polyDef.vertices[i]; vertex = sprite.globalToLocal(defVertex); polyDef.vertices[i] = vertex; shapeDef.vertices[i].Set((vertex.x / engine.m_physScale), (vertex.y / engine.m_physScale)); i++; }; shapeDef.density = 1; return (shapeDef); } public function isPointInside(p:Point):Boolean{ return (getGeomPoly().isPointInside(p)); } private function getSplittedPieceDef(polyPoints:Array, linearVel:b2Vec2, angularVel:Number):Object{ var vertices:Array = polyPoints; var pos:b2Vec2 = body.GetPosition().Copy(); pos.Multiply(engine.m_physScale); var rot:Number = (polyDef.skinRotation + ((body.GetAngle() * 180) / Math.PI)); return ({pos:pos, vertices:vertices, linearVel:linearVel, angularVel:angularVel, startPos:polyDef.startPos, skinRotation:rot}); } override protected function createBodyDef():b2BodyDef{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((polyDef.x / engine.m_physScale), (polyDef.y / engine.m_physScale)); return (bodyDef); } protected function checkIntersections(e:CoreEvent):void{ var vertex:b2Vec2; var line:Line; var intersection:Point; var vertexIndex:uint; var angularVel:Number; var piece1Def:Object; var piece2Def:Object; var data:Object; var mouseLine:Line = (e.data as Line); var polyShape:b2PolygonShape = (body.m_shapeList as b2PolygonShape); var prevVertex:b2Vec2 = getPolyVertex(polyShape, 0); var poly1Points:Array = [new Point(prevVertex.x, prevVertex.y)]; var poly2Points:Array = []; var polyPoints:Array = poly1Points; var intersectionPoints:Array = []; var i:uint = 1; while (i <= polyShape.m_vertexCount) { vertexIndex = i; if (vertexIndex == polyShape.m_vertexCount){ vertexIndex = 0; }; vertex = getPolyVertex(polyShape, vertexIndex); line = new Line(new Point(Math.round(prevVertex.x), Math.round(prevVertex.y)), new Point(Math.round(vertex.x), Math.round(vertex.y))); intersection = Line.checkIntersections(mouseLine, line); if (intersection){ poly1Points.push(intersection); poly2Points.push(intersection); if ((polyPoints == poly1Points)){ polyPoints = poly2Points; } else { polyPoints = poly1Points; }; intersectionPoints.push(intersection); }; if (vertexIndex != 0){ polyPoints.push(new Point(vertex.x, vertex.y)); }; prevVertex = vertex; i++; }; if (intersectionPoints.length == 2){ angularVel = body.m_angularVelocity; piece1Def = getSplittedPieceDef(poly1Points, body.m_linearVelocity.Copy(), angularVel); piece2Def = getSplittedPieceDef(poly2Points, body.m_linearVelocity.Copy(), angularVel); data = {remove:this, add:[piece1Def, piece2Def]}; dispatchEvent(new CoreEvent(CoreEvent.SPLIT_SUCCESS, data)); }; } override protected function getBodyUnderPointHander(e:CoreEvent):void{ var p:Point = (e.data as Point); if (isPointInside(p)){ dispatchEvent(new CoreEvent(CoreEvent.RETURN_BODY_UNDER_POINT, this)); }; } private function getPolyVertex(polyShape:b2PolygonShape, vertexIndex:uint):b2Vec2{ var vertex:b2Vec2 = polyShape.m_vertices[vertexIndex]; var vertex2:b2Vec2 = vertex.Copy(); var angle:Number = polyShape.GetBody().GetAngle(); rotateVec(vertex2, angle); var pos:b2Vec2 = polyShape.GetBody().GetPosition(); var pos2:b2Vec2 = pos.Copy(); pos2.Add(vertex2); pos2.Multiply(engine.m_physScale); return (pos2); } override protected function init():void{ super.init(); if (polyDef.splittable){ engine.dispatcher.addEventListener(CoreEvent.CHECK_BODY_INTERSECTIONS, checkIntersections); }; } private function rotateVec(vec:b2Vec2, angle:Number):void{ var ca:Number = Math.cos(angle); var sa:Number = Math.sin(angle); var rx:Number = ((vec.x * ca) - (vec.y * sa)); vec.y = ((vec.x * sa) + (vec.y * ca)); vec.x = rx; } override protected function levelRestartStart(e:CoreEvent):void{ var cp:Point = new Point(skin.x, skin.y); var dist:Number = Point.distance(new Point(polyDef.startPos.x, polyDef.startPos.y), cp); var time:Number = (dist / 300); Tweener.addTween(skin, {x:polyDef.startPos.x, y:polyDef.startPos.y, rotation:-(polyDef.skinRotation), time:time, transition:"easeinoutquad", onComplete:restartComplete}); } override protected function createSkin():Sprite{ var SkinClass:Class; var vertex:Point; if (polyDef.isStatic){ SkinClass = engine.assets.getAssetClass("BrickMaterial"); } else { if (polyDef.splittable){ SkinClass = engine.assets.getAssetClass("WoodMaterial"); } else { SkinClass = engine.assets.getAssetClass("MetallMaterial"); }; }; var skinData:BitmapData = (new SkinClass(0, 0) as BitmapData); var skin:Sprite = new Sprite(); var m:Matrix = new Matrix(); m.rotate(((polyDef.skinRotation * Math.PI) / 180)); skin.graphics.beginBitmapFill(skinData, m, true, true); skin.graphics.lineStyle(0, 0, 1); var firstVertex:Point = polyDef.vertices[0]; skin.graphics.moveTo(firstVertex.x, firstVertex.y); var i:uint = 1; while (i < polyDef.vertices.length) { vertex = polyDef.vertices[i]; skin.graphics.lineTo(vertex.x, vertex.y); i++; }; skin.graphics.lineTo(firstVertex.x, firstVertex.y); skin.graphics.endFill(); engine.canvas.bodiesContainer.addChild(skin); return (skin); } override public function destroy(e:CoreEvent=null):void{ super.destroy(e); if (polyDef.splittable){ engine.dispatcher.removeEventListener(CoreEvent.CHECK_BODY_INTERSECTIONS, checkIntersections); }; } private function getGeomPoly():GeomPoly{ var v:b2Vec2; var vertex:Vector; var geomVertices:Array = []; var bodyPos:b2Vec2 = body.GetPosition(); var bx:Number = (bodyPos.x * engine.m_physScale); var by:Number = (bodyPos.y * engine.m_physScale); var i:uint; while (i < polyDef.vertices.length) { v = body.GetWorldPoint(new b2Vec2((polyDef.vertices[i].x / engine.m_physScale), (polyDef.vertices[i].y / engine.m_physScale))); vertex = new Vector((v.x * engine.m_physScale), (v.y * engine.m_physScale)); geomVertices.push(vertex); i++; }; return (new GeomPoly(geomVertices)); } } }//package core.objects
Section 114
//PolyObjectDef (core.objects.PolyObjectDef) package core.objects { import flash.geom.*; public class PolyObjectDef extends BodyObjectDef { public var vertices:Array; public var skinRotation:Number; public static const NAME:String = "po"; public function PolyObjectDef(x:Number, y:Number, splittable:Boolean, isStatic:Boolean, vertices:Array, skinRotation:Number, startPos:Point=null):void{ this.vertices = vertices; this.skinRotation = skinRotation; this.startPos = ((startPos == null)) ? new Point(x, y) : startPos; super(x, y, splittable, isStatic); } public static function parseStringDef(stringDef:String):PolyObjectDef{ var isStatic:Boolean; var splittable:Boolean; var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var typeIndex:int = props[3]; switch (typeIndex){ case 0: isStatic = false; splittable = true; break; case 1: isStatic = false; splittable = false; break; case 2: isStatic = true; splittable = false; break; }; var v:String = props[4]; var vs:Array = v.split("|"); var vertices:Array = []; var i:uint; while (i < vs.length) { vertices.push(new Point(vs[i], vs[(i + 1)])); i = (i + 2); }; var skinRotation:Number = props[5]; var def:PolyObjectDef = new PolyObjectDef(x, y, splittable, isStatic, vertices, skinRotation); return (def); } } }//package core.objects
Section 115
//RectObject (core.objects.RectObject) package core.objects { import flash.display.*; import flash.geom.*; public class RectObject extends PolyObject { protected var rectDef:RectObjectDef; public function RectObject(rectDef:RectObjectDef):void{ this.rectDef = rectDef; var s:Sprite = new Sprite(); s.x = rectDef.x; s.y = rectDef.y; s.rotation = rectDef.rotation; var p0:Point = s.localToGlobal(new Point((-(rectDef.w) / 2), (-(rectDef.h) / 2))); var p1:Point = s.localToGlobal(new Point((rectDef.w / 2), (-(rectDef.h) / 2))); var p2:Point = s.localToGlobal(new Point((rectDef.w / 2), (rectDef.h / 2))); var p3:Point = s.localToGlobal(new Point((-(rectDef.w) / 2), (rectDef.h / 2))); rectDef.vertices = [p0, p1, p2, p3]; rectDef.skinRotation = 0; super(rectDef); } } }//package core.objects
Section 116
//RectObjectDef (core.objects.RectObjectDef) package core.objects { import flash.geom.*; public class RectObjectDef extends PolyObjectDef { public var w:Number; public var h:Number; public var rotation:Number; public static const NAME:String = "r"; public function RectObjectDef(x:Number, y:Number, splittable:Boolean, isStatic:Boolean, width:Number, height:Number, rotation:Number=0):void{ this.w = width; this.h = height; this.rotation = rotation; var vertices:Array = []; vertices.push(new Point((x - (width / 2)), (y - (height / 2)))); vertices.push(new Point((x + (width / 2)), (y - (height / 2)))); vertices.push(new Point((x + (width / 2)), (y + (height / 2)))); vertices.push(new Point((x - (width / 2)), (y + (height / 2)))); super(x, y, splittable, isStatic, vertices, 0); } override public function getStringDef():String{ var typeIndex:int; var str = (NAME + "_"); str = (str + (x + "_")); str = (str + (y + "_")); switch (isStatic){ case false: typeIndex = (splittable) ? 0 : 1; break; case true: typeIndex = 2; break; }; str = (str + (typeIndex + "_")); str = (str + (w + "_")); str = (str + (h + "_")); str = (str + rotation); return (str); } public static function parseStringDef(stringDef:String):RectObjectDef{ var isStatic:Boolean; var splittable:Boolean; var props:Array = stringDef.split("_"); var x:Number = props[1]; var y:Number = props[2]; var typeIndex:int = props[3]; switch (typeIndex){ case 0: isStatic = false; splittable = true; break; case 1: isStatic = false; splittable = false; break; case 2: isStatic = true; splittable = false; break; }; var w:Number = props[4]; var h:Number = props[5]; var skinRotation:Number = props[6]; var def:RectObjectDef = new RectObjectDef(x, y, splittable, isStatic, w, h, skinRotation); return (def); } } }//package core.objects
Section 117
//CoreAssets (core.CoreAssets) package core { import flash.events.*; import flash.display.*; import flash.system.*; public class CoreAssets extends EventDispatcher implements IGameAssets { private var Assets:Class; private var appDomain:ApplicationDomain; public var inited:Boolean; private static var instance:CoreAssets; public function CoreAssets():void{ Assets = CoreAssets_Assets; super(); inited = false; } public function init():void{ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetsInitHandler); loader.loadBytes(new Assets()); } private function assetsInitHandler(e:Event):void{ appDomain = e.target.content.loaderInfo.applicationDomain; inited = true; dispatchEvent(new Event(Event.INIT)); } public function getAssetClass(name:String):Class{ if (!appDomain.hasDefinition(name)){ trace((("*Error*: There is no definition of class '" + name) + "'")); return (null); }; return ((appDomain.getDefinition(name) as Class)); } public static function getInstance():CoreAssets{ if (!instance){ instance = new (CoreAssets); }; return (instance); } } }//package core
Section 118
//CoreAssets_Assets (core.CoreAssets_Assets) package core { import mx.core.*; public class CoreAssets_Assets extends ByteArrayAsset { } }//package core
Section 119
//GameCanvas (core.GameCanvas) package core { import flash.display.*; public class GameCanvas { public var playerContainer:Sprite; public var bodiesContainer:Sprite; public var jointsContainer:Sprite; public var debugContainer:Sprite; public function GameCanvas(bodiesContainer:Sprite, jointsContainer:Sprite, playerContainer:Sprite, debugContainer:Sprite):void{ super(); this.bodiesContainer = bodiesContainer; this.jointsContainer = jointsContainer; this.playerContainer = playerContainer; this.debugContainer = debugContainer; } } }//package core
Section 120
//GameEngine (core.GameEngine) package core { import flash.events.*; import core.events.*; import core.objects.*; import flash.media.*; import flash.geom.*; import Box2D.Common.Math.*; import Box2D.Collision.*; import Box2D.Dynamics.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.Shapes.*; public class GameEngine { public var sndTransform:SoundTransform; private var splitSuccess:Boolean; public var assets:IGameAssets; private var currentLevel:Level; private var jointObj:DistanceJointObject; public var m_physScale:Number;// = 30 private var sndSplitSuccess:Sound; private var objects:Array; private var exit:Exit; public var dispatcher:EventDispatcher; private var currentObjectsNum:int; public var m_world:b2World; private var m_iterations:int;// = 10 private var m_timeStep:Number;// = 0.0333333333333333 private var objectsNum:int; public var canvas:GameCanvas; public var sndChannel:SoundChannel; private var player:Player; private var bodyObj:BodyObject; public static const SPLIT_FAIL:String = "SplitFail"; public static const SPLIT_SUCCESS:String = "SplitSuccess"; private static var instance:GameEngine; public function GameEngine():void{ super(); init(); } private function splitSuccessHandler(e:CoreEvent):void{ var data:Object = e.data; if ((e.target is PolyObject)){ splitPoly(data); } else { if ((e.target is DistanceJointObject)){ splitDistanceJoint(data); }; }; splitSuccess = true; } private function createRect(def:RectObjectDef):void{ var rect:RectObject = new RectObject(def); createBaseObj(rect); } private function parseLevel(levelDef:String):void{ var objDef:String; var props:Array; var name:String; var objects:Array = levelDef.split(" "); var i:uint; while (i < objects.length) { objDef = objects[i]; props = objDef.split("_"); name = props[0]; switch (name){ case PlayerDef.NAME: createPlayer(PlayerDef.parseStringDef(objDef)); break; case CircleObjectDef.NAME: createCircle(CircleObjectDef.parseStringDef(objDef)); break; case ExitDef.NAME: createExit(ExitDef.parseStringDef(objDef)); break; case PolyObjectDef.NAME: createPoly(PolyObjectDef.parseStringDef(objDef)); break; case DistanceJointObjectDef.NAME: createJoint(DistanceJointObjectDef.parseStringDef(objDef)); break; case BonusDef.NAME: createBonus(BonusDef.parseStringDef(objDef)); break; case RectObjectDef.NAME: createRect(RectObjectDef.parseStringDef(objDef)); }; i++; }; } public function levelAbort():void{ canvas.bodiesContainer.removeEventListener(Event.ENTER_FRAME, efHandler); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.DESTROY)); } private function init():void{ dispatcher = new EventDispatcher(); } public function initialize(assets:IGameAssets, canvas:GameCanvas, sndTransform:SoundTransform):void{ this.assets = assets; this.canvas = canvas; this.sndTransform = sndTransform; initSounds(); } private function splitDistanceJoint(data:Object):void{ removeBaseObj((data.remove as DistanceJointObject)); } private function createBonus(def:BonusDef):void{ var bonus:Bonus = new Bonus(def); bonus.addEventListener(CoreEvent.BONUS_COLLECT, bonusCollectHandler); createBaseObj(bonus); } private function returnJointObjHandler(e:CoreEvent):void{ jointObj = (e.data as DistanceJointObject); } public function levelRestartStart():void{ canvas.bodiesContainer.removeEventListener(Event.ENTER_FRAME, efHandler); currentObjectsNum = 0; dispatcher.dispatchEvent(new CoreEvent(CoreEvent.LEVEL_RESTART_START)); } private function initWalls():void{ var wallB:b2Body; var wallSd:b2PolygonDef = new b2PolygonDef(); var wallBd:b2BodyDef = new b2BodyDef(); wallBd.position.Set((-95 / m_physScale), ((480 / m_physScale) / 2)); wallSd.SetAsBox((100 / m_physScale), ((480 / m_physScale) / 2)); wallB = m_world.CreateStaticBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); wallBd.position.Set((((640 + 95) - 60) / m_physScale), ((480 / m_physScale) / 2)); wallB = m_world.CreateStaticBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); wallBd.position.Set(((640 / m_physScale) / 2), (-95 / m_physScale)); wallSd.SetAsBox(((640 / m_physScale) / 2), (100 / m_physScale)); wallB = m_world.CreateStaticBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); wallBd.position.Set(((640 / m_physScale) / 2), ((480 + 95) / m_physScale)); wallB = m_world.CreateStaticBody(wallBd); wallB.CreateShape(wallSd); wallB.SetMassFromShapes(); } private function createExit(def:ExitDef):void{ exit = new Exit(def); exit.addEventListener(CoreEvent.LEVEL_COMPLETE, levelCompleteHandler); createBaseObj(exit); } public function levelStart(level:Level):void{ objectsNum = 0; objects = []; initBox2d(); initWalls(); parseLevel(level.def); currentLevel = level; canvas.bodiesContainer.addEventListener(Event.ENTER_FRAME, efHandler); } private function bonusCollectHandler(e:CoreEvent):void{ var bonus:Bonus = (e.data as Bonus); removeBaseObj(bonus); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.BONUS_COLLECT)); } private function levelCompleteHandler(e:CoreEvent):void{ canvas.bodiesContainer.removeEventListener(Event.ENTER_FRAME, efHandler); var b2pos:b2Vec2 = exit.getBody().GetPosition(); var pos:Point = new Point((b2pos.x * m_physScale), (b2pos.y * m_physScale)); player.levelComplete(pos); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.LEVEL_COMPLETE)); } public function getBodyObjUnderPoint(p:Point):BodyObject{ bodyObj = null; dispatcher.dispatchEvent(new CoreEvent(CoreEvent.GET_BODY_UNDER_POINT, p)); return (bodyObj); } private function returnBodyUnderPointHandler(e:CoreEvent):void{ bodyObj = (e.data as BodyObject); } public function removeBaseObj(baseObj:BaseObject):void{ baseObj.removeEventListener(CoreEvent.SPLIT_SUCCESS, splitSuccessHandler); baseObj.removeEventListener(CoreEvent.LEVEL_RESTART_END, levelRestartEnd); objectsNum--; baseObj.destroy(); } private function createBaseObj(baseObj:BaseObject):void{ baseObj.addEventListener(CoreEvent.SPLIT_SUCCESS, splitSuccessHandler); baseObj.addEventListener(CoreEvent.LEVEL_RESTART_END, levelRestartEnd); baseObj.addEventListener(CoreEvent.RETURN_BODY_UNDER_POINT, returnBodyUnderPointHandler); objects.push(baseObj); objectsNum++; } private function splitPoly(data:Object):void{ var i:uint; var joint:b2DistanceJoint; var a1:b2Vec2; var a2:b2Vec2; var pos:b2Vec2; var vertices:Array; var polyDef:PolyObjectDef; var angularVel:Number; var gp1:Point; var gp2:Point; var jointDef:DistanceJointObjectDef; var polyObj:PolyObject = (data.remove as PolyObject); var apoints:Array = []; var jointsToDestroy:Array = []; var jlist:b2JointEdge = polyObj.getBody().m_jointList; while (jlist) { joint = (jlist.joint as b2DistanceJoint); a1 = joint.GetAnchor1().Copy(); a2 = joint.GetAnchor2().Copy(); jointObj = null; dispatcher.dispatchEvent(new CoreEvent(CoreEvent.GET_JOINT_OBJECT, joint)); jointsToDestroy.push(jointObj); apoints.push({a1:a1, a2:a2}); jlist = jlist.next; }; i = 0; while (i < jointsToDestroy.length) { removeBaseObj(jointsToDestroy[i]); i++; }; removeBaseObj(polyObj); var add:Array = (data.add as Array); i = 0; while (i < add.length) { pos = add[i].pos; vertices = add[i].vertices; polyDef = new PolyObjectDef(pos.x, pos.y, true, false, vertices, add[i].skinRotation, add[i].startPos); polyObj = createPoly(polyDef); angularVel = add[i].angularVel; polyObj.getBody().m_linearVelocity = add[i].linearVel; polyObj.getBody().m_angularVelocity = angularVel; i++; }; i = 0; while (i < apoints.length) { gp1 = new Point((apoints[i].a1.x * m_physScale), (apoints[i].a1.y * m_physScale)); gp2 = new Point((apoints[i].a2.x * m_physScale), (apoints[i].a2.y * m_physScale)); jointDef = new DistanceJointObjectDef(100, 100, true, gp1, gp2); createJoint(jointDef); i++; }; } private function initBox2d():void{ var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-1000, -1000); worldAABB.upperBound.Set(1000, 1000); var gravity:b2Vec2 = new b2Vec2(0, 10); var doSleep:Boolean; m_world = new b2World(worldAABB, gravity, doSleep); var dbgDraw:b2DebugDraw = new b2DebugDraw(); canvas.debugContainer.mouseEnabled = false; canvas.debugContainer.mouseChildren = false; dbgDraw.m_sprite = canvas.debugContainer; dbgDraw.m_drawScale = m_physScale; dbgDraw.m_fillAlpha = 0.7; dbgDraw.m_lineThickness = 1; dbgDraw.m_drawFlags = (b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit); } public function levelResume():void{ canvas.bodiesContainer.addEventListener(Event.ENTER_FRAME, efHandler); } public function levelPause():void{ canvas.bodiesContainer.removeEventListener(Event.ENTER_FRAME, efHandler); } public function playerOutOfBounds():void{ levelPause(); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.LEVEL_FAIL)); } public function checkIntersections(mouseLine:Line):void{ splitSuccess = false; dispatcher.dispatchEvent(new CoreEvent(CoreEvent.CHECK_JOINT_INTERSECTIONS, mouseLine)); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.CHECK_BODY_INTERSECTIONS, mouseLine)); if (splitSuccess){ dispatcher.dispatchEvent(new CoreEvent(SPLIT_SUCCESS)); sndChannel = sndSplitSuccess.play(0, 0, sndTransform); } else { dispatcher.dispatchEvent(new CoreEvent(SPLIT_FAIL)); }; } private function createPoly(def:PolyObjectDef):PolyObject{ var poly:PolyObject = new PolyObject(def); createBaseObj(poly); return (poly); } private function efHandler(e:Event):void{ m_world.Step(m_timeStep, m_iterations); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.UPDATE)); } private function createCircle(def:CircleObjectDef):void{ var circle:CircleObject = new CircleObject(def); createBaseObj(circle); } private function createJoint(def:DistanceJointObjectDef):void{ var joint:DistanceJointObject = new DistanceJointObject(def); joint.addEventListener(CoreEvent.RETURN_JOINT_OBJECT, returnJointObjHandler); joint.addEventListener(CoreEvent.SPLIT_SUCCESS, splitSuccessHandler); createBaseObj(joint); } private function levelRestartEnd(e:CoreEvent):void{ currentObjectsNum++; trace(currentObjectsNum, objectsNum); if (currentObjectsNum == objectsNum){ dispatcher.dispatchEvent(new CoreEvent(CoreEvent.DESTROY)); dispatcher.dispatchEvent(new CoreEvent(CoreEvent.LEVEL_RESTART_END)); }; } private function initSounds():void{ var SplitSuccessClass:Class = assets.getAssetClass("SndSplitSuccess"); sndSplitSuccess = new (SplitSuccessClass); } private function createPlayer(def:PlayerDef):void{ player = new Player(def); createBaseObj(player); } public static function getInstance():GameEngine{ if (instance == null){ instance = new (GameEngine); }; return (instance); } } }//package core
Section 121
//IGameAssets (core.IGameAssets) package core { public interface IGameAssets { function getAssetClass(:String):Class; } }//package core
Section 122
//Level (core.Level) package core { public class Level { public var def:String; public function Level(def:String):void{ super(); this.def = def; } } }//package core
Section 123
//Line (core.Line) package core { import flash.geom.*; public class Line { public var p1:Point; public var p2:Point; public var b:Number; public var k:Number; public function Line(p1:Point, p2:Point){ super(); this.p1 = p1; this.p2 = p2; init(); } private function init():void{ var dx:Number = (p1.x - p2.x); if (Math.abs(dx) < 1E-7){ k = 1000000; } else { k = ((p1.y - p2.y) / dx); }; b = (p1.y - (k * p1.x)); } public function toString():String{ return (((("Line k: " + k) + ", b: ") + b)); } public static function checkIntersections(line1:Line, line2:Line):Point{ var dk:Number = (line1.k - line2.k); if (Math.abs(dk) < 1E-7){ dk = 1E-7; }; var x:Number = ((line2.b - line1.b) / dk); var y:Number = ((line1.k * x) + line1.b); var p:Point = new Point(x, y); if (((inSegment(p, line1)) && (inSegment(p, line2)))){ return (p); }; return (null); } private static function inSegment(p:Point, segmentLine:Line):Boolean{ if (segmentLine.p1.x == segmentLine.p2.x){ if ((((((p.y >= segmentLine.p1.y)) && ((p.y <= segmentLine.p2.y)))) || ((((p.y <= segmentLine.p1.y)) && ((p.y >= segmentLine.p2.y)))))){ return (true); }; } else { if ((((((p.x >= segmentLine.p1.x)) && ((p.x <= segmentLine.p2.x)))) || ((((p.x <= segmentLine.p1.x)) && ((p.x >= segmentLine.p2.x)))))){ return (true); }; }; return (false); } } }//package core
Section 124
//compareStringCaseInSensitive (de.polygonal.ds.sort.compare.compareStringCaseInSensitive) package de.polygonal.ds.sort.compare { public function compareStringCaseInSensitive(a:String, b:String):int{ var r:int; var k:int; var i:int; a = a.toLowerCase(); b = b.toLowerCase(); if ((a.length + b.length) > 2){ r = 0; k = ((a.length > b.length)) ? a.length : b.length; i = 0; while (i < k) { r = (a.charCodeAt(i) - b.charCodeAt(i)); if (r != 0){ break; }; i++; }; return (r); } else { }; return ((!NULL! - !NULL!)); } }//package de.polygonal.ds.sort.compare
Section 125
//compareStringCaseInSensitiveDesc (de.polygonal.ds.sort.compare.compareStringCaseInSensitiveDesc) package de.polygonal.ds.sort.compare { public function compareStringCaseInSensitiveDesc(a:String, b:String):int{ var r:int; var k:int; var i:int; a = a.toLowerCase(); b = b.toLowerCase(); if ((a.length + b.length) > 2){ r = 0; k = ((a.length > b.length)) ? a.length : b.length; i = 0; while (i < k) { r = (b.charCodeAt(i) - a.charCodeAt(i)); if (r != 0){ break; }; i++; }; return (r); } else { }; return ((!NULL! - !NULL!)); } }//package de.polygonal.ds.sort.compare
Section 126
//compareStringCaseSensitive (de.polygonal.ds.sort.compare.compareStringCaseSensitive) package de.polygonal.ds.sort.compare { public function compareStringCaseSensitive(a:String, b:String):int{ var r:int; var k:int; var i:int; if ((a.length + b.length) > 2){ r = 0; k = ((a.length > b.length)) ? a.length : b.length; i = 0; while (i < k) { r = (a.charCodeAt(i) - b.charCodeAt(i)); if (r != 0){ break; }; i++; }; return (r); } else { }; return ((!NULL! - !NULL!)); } }//package de.polygonal.ds.sort.compare
Section 127
//compareStringCaseSensitiveDesc (de.polygonal.ds.sort.compare.compareStringCaseSensitiveDesc) package de.polygonal.ds.sort.compare { public function compareStringCaseSensitiveDesc(a:String, b:String):int{ var r:int; var k:int; var i:int; if ((a.length + b.length) > 2){ r = 0; k = ((a.length > b.length)) ? a.length : b.length; i = 0; while (i < k) { r = (b.charCodeAt(i) - a.charCodeAt(i)); if (r != 0){ break; }; i++; }; return (r); } else { }; return ((!NULL! - !NULL!)); } }//package de.polygonal.ds.sort.compare
Section 128
//dLinkedInsertionSort (de.polygonal.ds.sort.dLinkedInsertionSort) package de.polygonal.ds.sort { import de.polygonal.ds.*; public function dLinkedInsertionSort(node:DListNode, descending:Boolean=false):DListNode{ var p:DListNode; var n:DListNode; var m:DListNode; var i:DListNode; var val:*; if (!node){ return (null); }; var h:DListNode = node; if (descending){ n = h.next; while (n) { m = n.next; p = n.prev; if (p.data < n.data){ i = p; while (i.prev) { if (i.prev.data < n.data){ i = i.prev; } else { break; }; }; if (m){ p.next = m; m.prev = p; } else { p.next = null; }; if (i == h){ n.prev = null; n.next = i; i.prev = n; h = n; } else { n.prev = i.prev; i.prev.next = n; n.next = i; i.prev = n; }; }; n = m; }; return (h); } else { n = h.next; //unresolved jump m = n.next; p = n.prev; //unresolved if i = p; while (i.prev) { if (i.prev.data > n.data){ i = i.prev; } else { break; }; }; if (m){ p.next = m; m.prev = p; } else { p.next = null; }; if (i == h){ n.prev = null; n.next = i; i.prev = n; h = n; //unresolved jump }; n.prev = i.prev; i.prev.next = n; n.next = i; }; n.prev = !NULL!; n = m; //unresolved if return (h); } }//package de.polygonal.ds.sort
Section 129
//dLinkedInsertionSortCmp (de.polygonal.ds.sort.dLinkedInsertionSortCmp) package de.polygonal.ds.sort { import de.polygonal.ds.*; public function dLinkedInsertionSortCmp(node:DListNode, cmp:Function, descending:Boolean=false):DListNode{ var p:DListNode; var n:DListNode; var m:DListNode; var i:DListNode; var val:*; if (((!(node)) || ((cmp == null)))){ return (null); }; var h:DListNode = node; if (descending){ n = h.next; while (n) { m = n.next; p = n.prev; if (cmp(p.data, n.data) < 0){ i = p; while (i.prev) { if (cmp(i.prev.data, n.data) < 0){ i = i.prev; } else { break; }; }; if (m){ p.next = m; m.prev = p; } else { p.next = null; }; if (i == h){ n.prev = null; n.next = i; i.prev = n; h = n; } else { n.prev = i.prev; i.prev.next = n; n.next = i; i.prev = n; }; }; n = m; }; } else { n = h.next; while (n) { m = n.next; p = n.prev; if (cmp(p.data, n.data) > 0){ i = p; while (i.prev) { if (cmp(i.prev.data, n.data) > 0){ i = i.prev; } else { break; }; }; if (m){ p.next = m; m.prev = p; } else { p.next = null; }; if (i == h){ n.prev = null; n.next = i; i.prev = n; h = n; } else { n.prev = i.prev; i.prev.next = n; n.next = i; i.prev = n; }; }; n = m; }; }; return (h); } }//package de.polygonal.ds.sort
Section 130
//dLinkedMergeSort (de.polygonal.ds.sort.dLinkedMergeSort) package de.polygonal.ds.sort { import de.polygonal.ds.*; public function dLinkedMergeSort(node:DListNode, descending:Boolean=false):DListNode{ var p:DListNode; var q:DListNode; var e:DListNode; var tail:DListNode; var nmerges:int; var psize:int; var qsize:int; var i:int; if (!node){ return (null); }; var h:DListNode = node; var insize = 1; if (descending){ while (true) { p = h; tail = null; h = tail; nmerges = 0; while (p) { nmerges++; i = 0; psize = 0; q = p; while (i < insize) { psize++; q = q.next; if (!q){ break; }; i++; }; qsize = insize; while ((((psize > 0)) || ((((qsize > 0)) && (q))))) { if (psize == 0){ e = q; q = q.next; qsize--; } else { if ((((qsize == 0)) || (!(q)))){ e = p; p = p.next; psize--; } else { if ((p.data - q.data) >= 0){ e = p; p = p.next; psize--; } else { e = q; q = q.next; qsize--; }; }; }; if (tail){ tail.next = e; } else { h = e; }; e.prev = tail; tail = e; }; p = q; }; tail.next = null; if (nmerges <= 1){ return (h); }; insize = (insize << 1); }; } else { while (true) { p = h; tail = null; h = tail; nmerges = 0; while (p) { nmerges++; i = 0; psize = 0; q = p; while (i < insize) { psize++; q = q.next; if (!q){ break; }; i++; }; qsize = insize; while ((((psize > 0)) || ((((qsize > 0)) && (q))))) { if (psize == 0){ e = q; q = q.next; qsize--; } else { if ((((qsize == 0)) || (!(q)))){ e = p; p = p.next; psize--; } else { if ((p.data - q.data) <= 0){ e = p; p = p.next; psize--; } else { e = q; q = q.next; qsize--; }; }; }; if (tail){ tail.next = e; } else { h = e; }; e.prev = tail; tail = e; }; p = q; }; tail.next = null; if (nmerges <= 1){ return (h); }; insize = (insize << 1); }; }; return (null); } }//package de.polygonal.ds.sort
Section 131
//dLinkedMergeSortCmp (de.polygonal.ds.sort.dLinkedMergeSortCmp) package de.polygonal.ds.sort { import de.polygonal.ds.*; public function dLinkedMergeSortCmp(node:DListNode, cmp:Function, descending:Boolean=false):DListNode{ var p:DListNode; var q:DListNode; var e:DListNode; var tail:DListNode; var nmerges:int; var psize:int; var qsize:int; var i:int; if (((!(node)) || ((cmp == null)))){ return (null); }; var h:DListNode = node; var insize = 1; if (descending){ while (true) { p = h; tail = null; h = tail; nmerges = 0; while (p) { nmerges++; i = 0; psize = 0; q = p; while (i < insize) { psize++; q = q.next; if (!q){ break; }; i++; }; qsize = insize; while ((((psize > 0)) || ((((qsize > 0)) && (q))))) { if (psize == 0){ e = q; q = q.next; qsize--; } else { if ((((qsize == 0)) || (!(q)))){ e = p; p = p.next; psize--; } else { if (cmp(p.data, q.data) >= 0){ e = p; p = p.next; psize--; } else { e = q; q = q.next; qsize--; }; }; }; if (tail){ tail.next = e; } else { h = e; }; e.prev = tail; tail = e; }; p = q; }; node.prev = tail; tail.next = null; if (nmerges <= 1){ return (h); }; insize = (insize << 1); }; } else { while (true) { p = h; tail = null; h = tail; nmerges = 0; while (p) { nmerges++; i = 0; psize = 0; q = p; while (i < insize) { psize++; q = q.next; if (!q){ break; }; i++; }; qsize = insize; while ((((psize > 0)) || ((((qsize > 0)) && (q))))) { if (psize == 0){ e = q; q = q.next; qsize--; } else { if ((((qsize == 0)) || (!(q)))){ e = p; p = p.next; psize--; } else { if (cmp(p.data, q.data) <= 0){ e = p; p = p.next; psize--; } else { e = q; q = q.next; qsize--; }; }; }; if (tail){ tail.next = e; } else { h = e; }; e.prev = tail; tail = e; }; p = q; }; node.prev = tail; tail.next = null; if (nmerges <= 1){ return (h); }; insize = (insize << 1); }; }; return (null); } }//package de.polygonal.ds.sort
Section 132
//Collection (de.polygonal.ds.Collection) package de.polygonal.ds { public interface Collection { function get size():int; function isEmpty():Boolean; function getIterator():Iterator; function clear():void; function toArray():Array; function contains():Boolean; } }//package de.polygonal.ds
Section 133
//DLinkedList (de.polygonal.ds.DLinkedList) package de.polygonal.ds { import de.polygonal.ds.sort.compare.*; import de.polygonal.ds.sort.*; public class DLinkedList implements Collection { private var _count:int; public var tail:DListNode; public var head:DListNode; public function DLinkedList(... _args){ super(); head = (tail = null); _count = 0; if (_args.length > 0){ append.apply(this, _args); }; } public function get size():int{ return (_count); } public function isEmpty():Boolean{ return ((_count == 0)); } public function remove(itr:DListIterator):Boolean{ if (((!((itr.list == this))) || (!(itr.node)))){ return (false); }; var node:DListNode = itr.node; if (node == head){ head = head.next; } else { if (node == tail){ tail = tail.prev; }; }; if (itr.node){ itr.node = itr.node.next; }; if (node.prev){ node.prev.next = node.next; }; if (node.next){ node.next.prev = node.prev; }; node.next = (node.prev = null); if (head == null){ tail = null; }; _count--; return (true); } public function removeHead(){ var obj:*; if (head){ obj = head.data; head = head.next; if (head){ head.prev = null; } else { tail = null; }; _count--; return (obj); }; return (null); } public function clear():void{ var next:DListNode; var node:DListNode = head; head = null; while (node) { next = node.next; node.next = (node.prev = null); node = next; }; _count = 0; } public function prepend(... _args):DListNode{ var t:DListNode; var i:int; var k:int = _args.length; var node:DListNode = new DListNode(_args[int((k - 1))]); if (head){ head.insertBefore(node); head = head.prev; } else { head = (tail = node); }; if (k > 1){ t = node; i = (k - 2); while (i >= 0) { node = new DListNode(_args[i]); head.insertBefore(node); head = head.prev; i--; }; _count = (_count + k); return (t); }; _count++; return (node); } public function popDown():void{ var t:DListNode = tail; if (tail.prev == head){ tail = head; tail.next = null; head = t; head.prev = null; head.next = tail; tail.prev = head; } else { tail = tail.prev; tail.next = null; head.prev = t; t.prev = null; t.next = head; head = t; }; } public function concat(... _args):DLinkedList{ var a:DLinkedList; var n:DListNode; var c:DLinkedList = new DLinkedList(); n = head; while (n) { c.append(n.data); n = n.next; }; var k:int = _args.length; var i:int; while (i < k) { a = _args[i]; n = a.head; while (n) { c.append(n.data); n = n.next; }; i++; }; return (c); } public function insertBefore(itr:DListIterator, obj):DListNode{ var node:DListNode; if (itr.list != this){ return (null); }; if (itr.node){ node = new DListNode(obj); itr.node.insertBefore(node); if (itr.node == head){ head = head.prev; }; _count++; return (node); //unresolved jump }; return (prepend(obj)); } public function append(... _args):DListNode{ var t:DListNode; var i:int; var k:int = _args.length; var node:DListNode = new DListNode(_args[0]); if (head){ tail.insertAfter(node); tail = tail.next; } else { head = (tail = node); }; if (k > 1){ t = node; i = 1; while (i < k) { node = new DListNode(_args[i]); tail.insertAfter(node); tail = tail.next; i++; }; _count = (_count + k); return (t); }; _count++; return (node); } public function sort(... _args):void{ var b:int; var cmp:Function; var o:*; if (_count <= 1){ return; }; if (_args.length > 0){ b = 0; cmp = null; o = _args[0]; if ((o is Function)){ cmp = o; if (_args.length > 1){ o = _args[1]; if ((o is int)){ b = o; }; }; } else { if ((o is int)){ b = o; }; }; if (Boolean(cmp)){ if ((b & 2)){ head = dLinkedInsertionSortCmp(head, cmp, (b == 18)); } else { head = dLinkedMergeSortCmp(head, cmp, (b == 16)); }; } else { if ((b & 2)){ if ((b & 4)){ if (b == 22){ head = dLinkedInsertionSortCmp(head, compareStringCaseSensitiveDesc); } else { if (b == 14){ head = dLinkedInsertionSortCmp(head, compareStringCaseInSensitive); } else { if (b == 30){ head = dLinkedInsertionSortCmp(head, compareStringCaseInSensitiveDesc); } else { head = dLinkedInsertionSortCmp(head, compareStringCaseSensitive); }; }; }; } else { head = dLinkedInsertionSort(head, (b == 18)); }; } else { if ((b & 4)){ if (b == 20){ head = dLinkedMergeSortCmp(head, compareStringCaseSensitiveDesc); } else { if (b == 12){ head = dLinkedMergeSortCmp(head, compareStringCaseInSensitive); } else { if (b == 28){ head = dLinkedMergeSortCmp(head, compareStringCaseInSensitiveDesc); } else { head = dLinkedMergeSortCmp(head, compareStringCaseSensitive); }; }; }; } else { if ((b & 16)){ head = dLinkedMergeSort(head, true); }; }; }; }; } else { head = dLinkedMergeSort(head); }; } public function contains(obj):Boolean{ var node:DListNode = head; while (node) { if (node.data == obj){ return (true); }; node = node.next; }; return (false); } public function reverse():void{ var mark:DListNode; var next:DListNode; if (_count == 0){ return; }; var node:DListNode = tail; while (node) { mark = node.prev; if (!node.next){ node.next = node.prev; node.prev = null; head = node; } else { if (!node.prev){ node.prev = node.next; node.next = null; tail = node; } else { next = node.next; node.next = node.prev; node.prev = next; }; }; node = mark; }; } public function insertAfter(itr:DListIterator, obj):DListNode{ var node:DListNode; if (itr.list != this){ return (null); }; if (itr.node){ node = new DListNode(obj); itr.node.insertAfter(node); if (itr.node == tail){ tail = itr.node.next; }; _count++; return (node); //unresolved jump }; return (append(obj)); } public function getIterator():Iterator{ return (new DListIterator(this, head)); } public function toArray():Array{ var a:Array = []; var node:DListNode = head; while (node) { a.push(node.data); node = node.next; }; return (a); } public function getListIterator():DListIterator{ return (new DListIterator(this, head)); } public function join(sep):String{ if (_count == 0){ return (""); }; var s:String = ""; var node:DListNode = head; while (node.next) { s = (s + (node.data + sep)); node = node.next; }; s = (s + node.data); return (s); } public function toString():String{ return ((("[DLinkedList > has " + size) + " nodes]")); } public function removeTail(){ var obj:*; if (tail){ obj = tail.data; tail = tail.prev; if (tail){ tail.next = null; } else { head = null; }; _count--; return (obj); }; return (null); } public function lastNodeOf(obj, from:DListIterator=null):DListIterator{ if (from != null){ if (from.list != this){ return (null); }; }; var node:DListNode = ((from)==null) ? tail : from.node; while (node) { if (node.data === obj){ return (new DListIterator(this, node)); }; node = node.prev; }; return (null); } public function merge(... _args):void{ var a:DLinkedList; a = _args[0]; if (head){ tail.next = a.head; a.head.prev = tail; tail = a.tail; } else { head = a.head; tail = a.tail; }; _count = (_count + a.size); var k:int = _args.length; var i = 1; while (i < k) { a = _args[i]; tail.next = a.head; a.head.prev = tail; tail = a.tail; _count = (_count + a.size); i++; }; } public function nodeOf(obj, from:DListIterator=null):DListIterator{ if (from != null){ if (from.list != this){ return (null); }; }; var node:DListNode = ((from)==null) ? head : from.node; while (node) { if (node.data === obj){ return (new DListIterator(this, node)); }; node = node.next; }; return (null); } public function dump():String{ if (head == null){ return ("DLinkedList, empty"); }; var s = (((("DLinkedList, has " + _count) + " node") + ((_count == 1)) ? "" : "s") + "\n|< Head\n"); var itr:DListIterator = getListIterator(); while (itr.valid()) { s = (s + (("\t" + itr.data) + "\n")); itr.forth(); }; s = (s + "Tail >|"); return (s); } public function splice(start:DListIterator, deleteCount:uint=4294967295, ... _args):DLinkedList{ var s:DListNode; var t:DListNode; var c:DLinkedList; var i:int; var k:int; var n:DListNode; if (start){ if (start.list != this){ return (null); }; }; if (start.node){ s = start.node; t = start.node.prev; c = new DLinkedList(); if (deleteCount == 4294967295){ if (start.node == tail){ return (c); }; while (start.node) { c.append(start.node.data); start.remove(); }; start.list = c; start.node = s; return (c); } else { i = 0; while (i < deleteCount) { if (start.node){ c.append(start.node.data); start.remove(); } else { break; }; i++; }; }; k = _args.length; if (k > 0){ if (_count == 0){ i = 0; while (i < k) { append(_args[i]); i++; }; } else { if (t == null){ n = prepend(_args[0]); i = 1; while (i < k) { n.insertAfter(new DListNode(_args[i])); if (n == tail){ tail = n.next; }; n = n.next; _count++; i++; }; } else { n = t; i = 0; while (i < k) { n.insertAfter(new DListNode(_args[i])); if (n == tail){ tail = n.next; }; n = n.next; _count++; i++; }; }; }; start.node = n; } else { start.node = s; }; start.list = c; return (c); }; return (null); } public function shiftUp():void{ var t:DListNode = head; if (head.next == tail){ head = tail; head.prev = null; tail = t; tail.next = null; head.next = tail; tail.prev = head; } else { head = head.next; head.prev = null; tail.next = t; t.next = null; t.prev = tail; tail = t; }; } } }//package de.polygonal.ds
Section 134
//DListIterator (de.polygonal.ds.DListIterator) package de.polygonal.ds { public class DListIterator implements Iterator { public var node:DListNode; public var list:DLinkedList; public function DListIterator(list:DLinkedList, node:DListNode=null){ super(); this.list = list; this.node = node; } public function remove():Boolean{ return (list.remove(this)); } public function back():void{ if (node){ node = node.prev; }; } public function start():void{ node = list.head; } public function get data(){ if (node){ return (node.data); }; return (null); } public function forth():void{ if (node){ node = node.next; }; } public function toString():String{ return ((("{DListIterator, data=" + (node) ? node.data : "null") + "}")); } public function hasNext():Boolean{ return (Boolean(node)); } public function valid():Boolean{ return (Boolean(node)); } public function next(){ var obj:*; if (hasNext()){ obj = node.data; node = node.next; return (obj); }; return (null); } public function set data(obj):void{ node.data = obj; } public function end():void{ node = list.tail; } } }//package de.polygonal.ds
Section 135
//DListNode (de.polygonal.ds.DListNode) package de.polygonal.ds { public class DListNode implements LinkedListNode { public var prev:DListNode; public var next:DListNode; public var data; public function DListNode(obj){ super(); next = (prev = null); data = obj; } public function unlink():void{ if (prev){ prev.next = next; }; if (next){ next.prev = prev; }; next = (prev = null); } public function insertAfter(node:DListNode):void{ node.next = next; node.prev = this; if (next){ next.prev = node; }; next = node; } public function insertBefore(node:DListNode):void{ node.next = this; node.prev = prev; if (prev){ prev.next = node; }; prev = node; } public function toString():String{ return ((("[DListNode, data=" + data) + "]")); } } }//package de.polygonal.ds
Section 136
//Iterator (de.polygonal.ds.Iterator) package de.polygonal.ds { public interface Iterator { function start():void; function set data(E:\Flash\Classes\as3ds\src;de\polygonal\ds;Iterator.as):void; function get data(); function next(); function hasNext():Boolean; } }//package de.polygonal.ds
Section 137
//LinkedListNode (de.polygonal.ds.LinkedListNode) package de.polygonal.ds { public interface LinkedListNode { } }//package de.polygonal.ds
Section 138
//LevelTestEndCommand (editor.controller.LevelTestEndCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import core.*; import org.puremvc.as3.patterns.command.*; import caurina.transitions.*; public class LevelTestEndCommand extends SimpleCommand implements ICommand { public function LevelTestEndCommand(){ super(); } override public function execute(note:INotification):void{ Tweener.removeAllTweens(); GameEngine.getInstance().levelAbort(); } } }//package editor.controller
Section 139
//LevelTestStartCommand (editor.controller.LevelTestStartCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class LevelTestStartCommand extends SimpleCommand implements ICommand { public function LevelTestStartCommand(){ super(); } override public function execute(note:INotification):void{ var levelTestProxy:LevelTestProxy = (facade.retrieveProxy(LevelTestProxy.NAME) as LevelTestProxy); levelTestProxy.startTest(); } } }//package editor.controller
Section 140
//ObjectAddCommand (editor.controller.ObjectAddCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import core.objects.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class ObjectAddCommand extends SimpleCommand implements ICommand { public function ObjectAddCommand(){ super(); } override public function execute(note:INotification):void{ var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); workspaceProxy.objectAdd((note.getBody() as BaseObjectDef)); } } }//package editor.controller
Section 141
//ObjectsDeleteCommand (editor.controller.ObjectsDeleteCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class ObjectsDeleteCommand extends SimpleCommand implements ICommand { public function ObjectsDeleteCommand(){ super(); } override public function execute(note:INotification):void{ var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); workspaceProxy.objectsDelete((note.getBody() as Array)); } } }//package editor.controller
Section 142
//ObjectsMoveCommand (editor.controller.ObjectsMoveCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import flash.geom.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class ObjectsMoveCommand extends SimpleCommand implements ICommand { public function ObjectsMoveCommand(){ super(); } override public function execute(note:INotification):void{ var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); workspaceProxy.objectsMove((note.getBody() as Point)); } } }//package editor.controller
Section 143
//ObjectsSelectCommand (editor.controller.ObjectsSelectCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class ObjectsSelectCommand extends SimpleCommand implements ICommand { public function ObjectsSelectCommand(){ super(); } override public function execute(note:INotification):void{ var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); workspaceProxy.objectsSelect((note.getBody() as Array)); } } }//package editor.controller
Section 144
//ToolSelectCommand (editor.controller.ToolSelectCommand) package editor.controller { import org.puremvc.as3.interfaces.*; import editor.model.*; import org.puremvc.as3.patterns.command.*; public class ToolSelectCommand extends SimpleCommand implements ICommand { public function ToolSelectCommand(){ super(); } override public function execute(note:INotification):void{ var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); workspaceProxy.toolSelect((note.getBody() as Tool)); } } }//package editor.controller
Section 145
//EditorAssets (editor.model.EditorAssets) package editor.model { import flash.events.*; import core.*; import flash.display.*; import flash.system.*; public class EditorAssets extends EventDispatcher implements IGameAssets { private var Assets:Class; private var appDomain:ApplicationDomain; public var inited:Boolean; private static var instance:EditorAssets; public function EditorAssets():void{ Assets = EditorAssets_Assets; super(); inited = false; } public function init():void{ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetsInitHandler); loader.loadBytes(new Assets()); } private function assetsInitHandler(e:Event):void{ appDomain = e.target.content.loaderInfo.applicationDomain; inited = true; dispatchEvent(new Event(Event.INIT)); } public function getAssetClass(name:String):Class{ if (!appDomain.hasDefinition(name)){ trace((("*Error*: There is no definition of class '" + name) + "'")); return (null); }; return ((appDomain.getDefinition(name) as Class)); } public static function getInstance():EditorAssets{ if (!instance){ instance = new (EditorAssets); }; return (instance); } } }//package editor.model
Section 146
//EditorAssets_Assets (editor.model.EditorAssets_Assets) package editor.model { import mx.core.*; public class EditorAssets_Assets extends ByteArrayAsset { } }//package editor.model
Section 147
//LevelTestProxy (editor.model.LevelTestProxy) package editor.model { import core.*; import flash.display.*; import game.model.*; import core.events.*; import org.puremvc.as3.patterns.proxy.*; import game.view.*; import editor.controller.*; import editor.view.*; public class LevelTestProxy extends Proxy { public static const LEVEL_TEST_START:String = "LevelTestStart"; public static const LEVEL_TEST_END:String = "LevelTestEnd"; public static const NAME:String = "LevelTestProxy"; public static const LEVEL_RESTART_START:String = "LevelRestartStart"; public static const LEVEL_RESTART_END:String = "LevelRestartEnd"; public function LevelTestProxy():void{ super(NAME); init(); } private function init():void{ if (!facade.hasCommand(LEVEL_TEST_START)){ facade.registerCommand(LEVEL_TEST_START, LevelTestStartCommand); }; if (!facade.hasCommand(LEVEL_TEST_END)){ facade.registerCommand(LEVEL_TEST_END, LevelTestEndCommand); }; } private function splitSuccessHandler(e:CoreEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameEngine.SPLIT_SUCCESS); } private function splitFailHandler(e:CoreEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameEngine.SPLIT_FAIL); } public function startTest():void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var debugContainer:Sprite = appMed.getPopupContainer(); var levelTestMed:LevelTestMediator = (facade.retrieveMediator(LevelTestMediator.NAME) as LevelTestMediator); var bodiesContainer:Sprite = levelTestMed.getBodiesContainer(); var jointsContainer:Sprite = levelTestMed.getJointsContainer(); var playerContainer:Sprite = levelTestMed.getPlayerContainer(); var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); var levelDef:String = workspaceProxy.saveLevel(); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var engine:GameEngine = GameEngine.getInstance(); var canvas:GameCanvas = new GameCanvas(bodiesContainer, jointsContainer, playerContainer, debugContainer); engine.initialize(CoreAssets.getInstance(), canvas, appProxy.sndTransform); engine.dispatcher.addEventListener(GameEngine.SPLIT_SUCCESS, splitSuccessHandler); engine.dispatcher.addEventListener(GameEngine.SPLIT_FAIL, splitFailHandler); engine.dispatcher.addEventListener(CoreEvent.LEVEL_RESTART_END, levelRestartEndHandler); engine.dispatcher.addEventListener(CoreEvent.LEVEL_COMPLETE, levelCompleteHandler); engine.levelStart(new Level(levelDef)); } public function levelRestartStart():void{ GameEngine.getInstance().levelRestartStart(); } public function destroy():void{ facade.removeProxy(NAME); } private function levelRestartEndHandler(e:CoreEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(LevelTestProxy.LEVEL_TEST_START); } private function levelCompleteHandler(e:CoreEvent):void{ trace("yo!"); } } }//package editor.model
Section 148
//Tool (editor.model.Tool) package editor.model { public class Tool { public var type:String; public var id:uint; public static const TYPE_BONUS:String = "TypeBonus"; public static const TYPE_CIRCLE:String = "TypeCircle"; public static const TYPE_SELECTION:String = "TypeSelection"; public static const TYPE_RECT:String = "TypeRect"; public static const TYPE_JOINT:String = "TypeJoint"; public function Tool(id:uint, type:String):void{ super(); this.id = id; this.type = type; init(); } private function init():void{ } } }//package editor.model
Section 149
//WorkspaceProxy (editor.model.WorkspaceProxy) package editor.model { import org.puremvc.as3.interfaces.*; import game.model.*; import core.objects.*; import flash.geom.*; import org.puremvc.as3.patterns.proxy.*; import ascb.util.*; import editor.controller.*; import editor.view.*; public class WorkspaceProxy extends Proxy implements IProxy { private var objects:Array; private var tools:Array; private var notesProxy:NotesProxy; public var currentTool:Tool; private var selectedObjects:Array; public static const OBJECT_ADD:String = "ObjectAdd"; public static const TOOL_SELECT:String = "ToolSelect"; public static const OBJECTS_SELECT:String = "ObjectsSelect"; public static const NAME:String = "WorkspaceProxy"; public static const OBJECT_UPDATE:String = "ObjectUpdate"; public static const OBJECTS_DELETE:String = "ObjectsDelete"; public static const OBJECTS_MOVE:String = "ObjectsMove"; public function WorkspaceProxy():void{ super(NAME); init(); } private function createRect(props:Array):RectObjectDef{ var splittable:Boolean; var isStatic:Boolean; var x:Number = props[1]; var y:Number = props[2]; var type:int = props[3]; if (type == 0){ splittable = true; isStatic = false; } else { if (type == 1){ splittable = false; isStatic = false; } else { if (type == 2){ splittable = false; isStatic = true; }; }; }; var width:Number = props[4]; var height:Number = props[5]; var rotation:Number = props[6]; var def:RectObjectDef = new RectObjectDef(x, y, splittable, isStatic, width, height, rotation); return (def); } public function destroy():void{ facade.removeProxy(NAME); } public function getSelectedObjectIndex(obj:BaseObjectDef):int{ var i:uint; while (i < selectedObjects.length) { if (obj == selectedObjects[i]){ return (i); }; i++; }; return (-1); } public function getSelectedObjects():Array{ return (selectedObjects); } public function objectsMove(dpos:Point):void{ var obj:BaseObjectDef; var jointObj:DistanceJointObjectDef; var i:uint; while (i < selectedObjects.length) { obj = selectedObjects[i]; obj.x = (obj.x + dpos.x); obj.y = (obj.y + dpos.y); if ((obj is DistanceJointObjectDef)){ jointObj = (obj as DistanceJointObjectDef); jointObj.anchor1.x = (jointObj.anchor1.x + dpos.x); jointObj.anchor1.y = (jointObj.anchor1.y + dpos.y); jointObj.anchor2.x = (jointObj.anchor2.x + dpos.x); jointObj.anchor2.y = (jointObj.anchor2.y + dpos.y); }; i++; }; } public function saveLevel():String{ var i:uint; var obj:BaseObjectDef; var level:String = ""; i = 0; for (;i < objects.length;i++) { obj = objects[i]; if (!(obj is DistanceJointObjectDef)){ level = (level + (obj.getStringDef() + " ")); } else { continue; }; }; i = 0; for (;i < objects.length;i++) { obj = objects[i]; if ((obj is DistanceJointObjectDef)){ level = (level + (obj.getStringDef() + " ")); } else { continue; }; }; return (level); } private function createBonus(props:Array):BonusDef{ var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var def:BonusDef = new BonusDef(x, y, r); return (def); } private function init():void{ if (!facade.hasCommand(TOOL_SELECT)){ facade.registerCommand(TOOL_SELECT, ToolSelectCommand); }; if (!facade.hasCommand(OBJECT_ADD)){ facade.registerCommand(OBJECT_ADD, ObjectAddCommand); }; if (!facade.hasCommand(OBJECTS_SELECT)){ facade.registerCommand(OBJECTS_SELECT, ObjectsSelectCommand); }; if (!facade.hasCommand(OBJECTS_MOVE)){ facade.registerCommand(OBJECTS_MOVE, ObjectsMoveCommand); }; if (!facade.hasCommand(OBJECTS_DELETE)){ facade.registerCommand(OBJECTS_DELETE, ObjectsDeleteCommand); }; notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); tools = []; tools.push(new Tool(0, Tool.TYPE_SELECTION)); tools.push(new Tool(1, Tool.TYPE_CIRCLE)); tools.push(new Tool(2, Tool.TYPE_RECT)); tools.push(new Tool(3, Tool.TYPE_JOINT)); tools.push(new Tool(4, Tool.TYPE_BONUS)); objects = []; selectedObjects = []; } private function getObjectIndex(obj:BaseObjectDef):int{ var i:uint; while (i < objects.length) { if (obj == objects[i]){ return (i); }; i++; }; return (-1); } public function getObjects():Array{ return (objects); } public function objectsDelete(objsToDelete:Array):void{ var obj:BaseObjectDef; var objIndex:int; var selObjIndex:int; var objMed:WorldObjectMediator; var i:uint; while (i < objsToDelete.length) { obj = objsToDelete[i]; objIndex = getObjectIndex(obj); objects.splice(objIndex, 1); selObjIndex = getSelectedObjectIndex(obj); if (selObjIndex != -1){ selectedObjects.splice(selObjIndex, 1); }; objMed = (facade.retrieveMediator((WorldObjectMediator.NAME_BASE + obj.id)) as WorldObjectMediator); objMed.deleteObject(); i++; }; } public function getTools():Array{ return (tools); } public function objectAdd(obj:BaseObjectDef):void{ var objMed:WorldObjectMediator; objects.push(obj); var medName:String = (WorldObjectMediator.NAME_BASE + obj.id); if ((obj is PlayerDef)){ objMed = new PlayerObjectMediator(medName); } else { if ((obj is ExitDef)){ objMed = new ExitObjectMediator(medName); } else { if ((obj is BonusDef)){ objMed = new BonusObjectMediator(medName); } else { if ((obj is CircleObjectDef)){ objMed = new CircleObjectMediator(medName); } else { if ((obj is RectObjectDef)){ objMed = new RectObjectMediator(medName); } else { if ((obj is DistanceJointObjectDef)){ objMed = new JointObjectMediator(medName); }; }; }; }; }; }; facade.registerMediator(objMed); objMed.loadData(obj); notesProxy.push(OBJECTS_SELECT, [obj]); } private function createCircle(props:Array):CircleObjectDef{ var isStatic:Boolean; var x:Number = props[1]; var y:Number = props[2]; var type:int = props[3]; var splittable:Boolean; if ((type == 1)){ isStatic = false; } else { isStatic = true; }; var r:Number = props[4]; var def:CircleObjectDef = new CircleObjectDef(x, y, splittable, isStatic, r); return (def); } private function createJoint(props:Array):DistanceJointObjectDef{ var x:Number = props[1]; var y:Number = props[2]; var splittable:Boolean; var a1x:Number = props[3]; var a1y:Number = props[4]; var a2x:Number = props[5]; var a2y:Number = props[6]; var a1:Point = new Point(a1x, a1y); var a2:Point = new Point(a2x, a2y); var def:DistanceJointObjectDef = new DistanceJointObjectDef(x, y, splittable, a1, a2); return (def); } public function objectsSelect(objects:Array):void{ selectedObjects = objects; } public function start():void{ notesProxy.push(TOOL_SELECT, tools[0]); var exit:ExitDef = new ExitDef(200, 100, 5); notesProxy.push(OBJECT_ADD, exit); var player:PlayerDef = new PlayerDef(100, 100, 20); notesProxy.push(OBJECT_ADD, player); } public function toolSelect(tool:Tool):void{ currentTool = tool; } private function createExit(props:Array):ExitDef{ var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var def:ExitDef = new ExitDef(x, y, r); return (def); } private function createPlayer(props:Array):PlayerDef{ var x:Number = props[1]; var y:Number = props[2]; var r:Number = props[3]; var def:PlayerDef = new PlayerDef(x, y, r); return (def); } public function loadLevel(levelDef:String):void{ var objDef:String; var props:Array; var name:String; var def:BaseObjectDef; notesProxy.push(OBJECTS_DELETE, ArrayUtilities.duplicate(getObjects())); var objects:Array = levelDef.split(" "); var i:uint; for (;i < objects.length;i++) { objDef = objects[i]; props = objDef.split("_"); name = props[0]; switch (name){ case PlayerDef.NAME: def = createPlayer(props); break; case CircleObjectDef.NAME: def = createCircle(props); break; case ExitDef.NAME: def = createExit(props); break; case DistanceJointObjectDef.NAME: def = createJoint(props); break; case BonusDef.NAME: def = createBonus(props); break; case RectObjectDef.NAME: def = createRect(props); break; default: continue; }; notesProxy.push(OBJECT_ADD, def); }; } } }//package editor.model
Section 150
//JointObjectView (editor.view.components.JointObjectView) package editor.view.components { import flash.display.*; public class JointObjectView extends WorldObjectView { public var point1:Sprite; public var point2:Sprite; public var lineContainer:Sprite; public var pointsContainer:Sprite; public function JointObjectView():void{ super(); } override protected function init():void{ super.init(); lineContainer = new Sprite(); container.addChild(lineContainer); pointsContainer = new Sprite(); container.addChild(pointsContainer); point1 = new Sprite(); container.addChild(point1); point2 = new Sprite(); container.addChild(point2); } } }//package editor.view.components
Section 151
//JointPointView (editor.view.components.JointPointView) package editor.view.components { import flash.display.*; public class JointPointView { public var window:Sprite; public function JointPointView(window:Sprite):void{ super(); this.window = window; init(); } private function init():void{ drawPoint(); } private function drawPoint():void{ window.graphics.clear(); window.graphics.beginFill(0, 0.7); window.graphics.drawCircle(0, 0, 4); window.graphics.endFill(); } } }//package editor.view.components
Section 152
//LevelTestView (editor.view.components.LevelTestView) package editor.view.components { import flash.display.*; import editor.model.*; public class LevelTestView extends Sprite { public var bodiesContainer:Sprite; public var restart_bt:SimpleButton; public var mouseHandler:Sprite; public var playerContainer:Sprite; public var back_bt:SimpleButton; public var objectsContainer:Sprite; private var window:Sprite; public var jointsContainer:Sprite; public var levelContainer:Sprite; public function LevelTestView():void{ super(); init(); } private function init():void{ var windowClass:Class = EditorAssets.getInstance().getAssetClass("LevelTestWindow"); window = new (windowClass); addChild(window); back_bt = (window.getChildByName("back_bt") as SimpleButton); restart_bt = (window.getChildByName("restart_bt") as SimpleButton); levelContainer = (window.getChildByName("levelContainer") as Sprite); objectsContainer = (levelContainer.getChildByName("objectsContainer") as Sprite); bodiesContainer = (objectsContainer.getChildByName("bodiesContainer") as Sprite); jointsContainer = (objectsContainer.getChildByName("jointsContainer") as Sprite); playerContainer = (objectsContainer.getChildByName("playerContainer") as Sprite); mouseHandler = (levelContainer.getChildByName("mouseHandler") as Sprite); } } }//package editor.view.components
Section 153
//WorkspaceView (editor.view.components.WorkspaceView) package editor.view.components { import flash.display.*; public class WorkspaceView { public var bodiesContainer:Sprite; public var mouseHandler:Sprite; public var objectsContainer:Sprite; public var playerContainer:Sprite; public var window:Sprite; public var toolsCanvas:Sprite; public var jointsContainer:Sprite; public function WorkspaceView(window:Sprite):void{ super(); this.window = window; init(); } private function init():void{ mouseHandler = (window.getChildByName("mouseHandler") as Sprite); objectsContainer = (window.getChildByName("objectsContainer") as Sprite); bodiesContainer = (objectsContainer.getChildByName("bodiesContainer") as Sprite); playerContainer = (objectsContainer.getChildByName("playerContainer") as Sprite); jointsContainer = (objectsContainer.getChildByName("jointsContainer") as Sprite); toolsCanvas = (window.getChildByName("toolsCanvas") as Sprite); } } }//package editor.view.components
Section 154
//WorldObjectView (editor.view.components.WorldObjectView) package editor.view.components { import flash.display.*; public class WorldObjectView extends Sprite { public var container:Sprite; public var origin:Sprite; public var frame:Sprite; public function WorldObjectView():void{ super(); init(); } protected function init():void{ container = new Sprite(); addChild(container); frame = new Sprite(); addChild(frame); origin = new Sprite(); frame.addChild(origin); } } }//package editor.view.components
Section 155
//BodyObjectMediator (editor.view.BodyObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import core.objects.*; public class BodyObjectMediator extends WorldObjectMediator implements IMediator { protected var bodyObj:BodyObject; public function BodyObjectMediator(NAME:String):void{ super(NAME); } override public function loadData(obj:BaseObjectDef):void{ bodyObj = (obj as BodyObject); super.loadData(obj); } override protected function processData():void{ super.processData(); draw(); _view.frame.visible = false; } override protected function drawFrame():void{ _view.frame.graphics.clear(); _view.frame.graphics.lineStyle(0, 0); _view.frame.graphics.drawRect((-(_view.container.width) / 2), (-(_view.container.height) / 2), _view.container.width, _view.container.height); } } }//package editor.view
Section 156
//BonusObjectMediator (editor.view.BonusObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import editor.view.components.*; public class BonusObjectMediator extends CircleObjectMediator implements IMediator { public function BonusObjectMediator(NAME:String):void{ super(NAME); } override protected function init():void{ _view = new WorldObjectView(); var workspaceMed:WorkspaceMediator = (facade.retrieveMediator(WorkspaceMediator.NAME) as WorkspaceMediator); workspaceMed.getPlayerContainer().addChild(_view); } override protected function draw():void{ var bonusClass:Class = (GameAssets.getInstance().getAssetClass("BonusAsset") as Class); var bonus:Sprite = new (bonusClass); _view.container.addChild(bonus); drawFrame(); } } }//package editor.view
Section 157
//CircleObjectMediator (editor.view.CircleObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import flash.display.*; import core.objects.*; import flash.geom.*; import editor.model.*; public class CircleObjectMediator extends BodyObjectMediator implements IMediator { protected var circleObj:CircleObjectDef; public function CircleObjectMediator(NAME:String):void{ super(NAME); } override public function loadData(obj:BaseObjectDef):void{ circleObj = (obj as CircleObjectDef); super.loadData(obj); } override protected function draw():void{ var MaterialClass:Class; switch (circleObj.isStatic){ case false: MaterialClass = EditorAssets.getInstance().getAssetClass("MetallMaterial"); break; case true: MaterialClass = EditorAssets.getInstance().getAssetClass("BrickMaterial"); break; }; var skinData:BitmapData = (new MaterialClass(200, 200) as BitmapData); var m:Matrix = new Matrix(); m.translate(100, 100); _view.container.graphics.clear(); _view.container.graphics.beginBitmapFill(skinData, m); _view.container.graphics.drawCircle(0, 0, circleObj.r); _view.container.graphics.endFill(); super.draw(); } override protected function update():void{ super.update(); draw(); } override protected function processData():void{ super.processData(); } } }//package editor.view
Section 158
//ExitObjectMediator (editor.view.ExitObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import editor.view.components.*; public class ExitObjectMediator extends CircleObjectMediator implements IMediator { public function ExitObjectMediator(NAME:String):void{ super(NAME); } override protected function init():void{ _view = new WorldObjectView(); var workspaceMed:WorkspaceMediator = (facade.retrieveMediator(WorkspaceMediator.NAME) as WorkspaceMediator); workspaceMed.getPlayerContainer().addChild(_view); } override protected function draw():void{ var exitClass:Class = (GameAssets.getInstance().getAssetClass("ExitAsset") as Class); var exit:Sprite = new (exitClass); _view.container.addChild(exit); drawFrame(); } } }//package editor.view
Section 159
//JointObjectMediator (editor.view.JointObjectMediator) package editor.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.objects.*; import flash.geom.*; import editor.view.components.*; public class JointObjectMediator extends WorldObjectMediator implements IMediator { private var point2Med:JointPointMediator; private var point1Med:JointPointMediator; protected var jointObj:DistanceJointObjectDef; private var _jointView:JointObjectView; public function JointObjectMediator(NAME:String):void{ super(NAME); } override protected function draw():void{ var lp1:Point = _jointView.lineContainer.globalToLocal(jointObj.anchor1); var lp2:Point = _jointView.lineContainer.globalToLocal(jointObj.anchor2); _jointView.lineContainer.graphics.clear(); _jointView.lineContainer.graphics.lineStyle(3, 0xFF9900); _jointView.lineContainer.graphics.moveTo(lp1.x, lp1.y); _jointView.lineContainer.graphics.lineTo(lp2.x, lp2.y); super.draw(); } override protected function drawFrame():void{ var rect:Rectangle = _view.container.getBounds(_view.frame); _view.frame.graphics.clear(); _view.frame.graphics.lineStyle(0, 0); _view.frame.graphics.drawRect(rect.x, rect.y, rect.width, rect.height); } override public function deleteObject():void{ var medName:String; medName = (((JointPointMediator.NAME_BASE + jointObj.id) + "_") + 1); var point1Med:JointPointMediator = (facade.retrieveMediator(medName) as JointPointMediator); point1Med.destroy(); medName = (((JointPointMediator.NAME_BASE + jointObj.id) + "_") + 2); var point2Med:JointPointMediator = (facade.retrieveMediator(medName) as JointPointMediator); point2Med.destroy(); super.deleteObject(); } override public function loadData(obj:BaseObjectDef):void{ jointObj = (obj as DistanceJointObjectDef); super.loadData(obj); } override protected function update():void{ super.update(); _view.x = jointObj.x; _view.y = jointObj.y; point1Med.update(); point2Med.update(); draw(); } override protected function processData():void{ var medName:String; drawOrigin(); _view.x = obj.x; _view.y = obj.y; _jointView.lineContainer.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); medName = (((JointPointMediator.NAME_BASE + jointObj.id) + "_") + 1); var point1View:JointPointView = new JointPointView(_jointView.point1); point1Med = new JointPointMediator(medName, point1View); point1Med.loadData(jointObj, 1); facade.registerMediator(point1Med); medName = (((JointPointMediator.NAME_BASE + jointObj.id) + "_") + 2); var point2View:JointPointView = new JointPointView(_jointView.point2); point2Med = new JointPointMediator(medName, point2View); point2Med.loadData(jointObj, 2); facade.registerMediator(point2Med); draw(); _view.frame.visible = false; } override protected function init():void{ _view = new JointObjectView(); var workspaceMed:WorkspaceMediator = (facade.retrieveMediator(WorkspaceMediator.NAME) as WorkspaceMediator); workspaceMed.getJointsContainer().addChild(_view); _jointView = (_view as JointObjectView); } } }//package editor.view
Section 160
//JointPointMediator (editor.view.JointPointMediator) package editor.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.model.*; import core.objects.*; import flash.geom.*; import editor.model.*; import editor.view.components.*; import org.puremvc.as3.patterns.mediator.*; public class JointPointMediator extends Mediator implements IMediator { private var pointIndex:uint; private var _view:JointPointView; private var jointObj:DistanceJointObjectDef; public var NAME:String; public static const NAME_BASE:String = "JointPointMediator"; public function JointPointMediator(NAME:String, viewComponent:JointPointView):void{ this.NAME = NAME; super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } public function destroy():void{ facade.removeMediator(NAME); } private function mouseDownHandler(e:MouseEvent):void{ _view.window.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); _view.window.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } public function update():void{ var jointPoint:Point = getJointPoint(pointIndex); var gp:Point = _view.window.parent.globalToLocal(jointPoint); _view.window.x = gp.x; _view.window.y = gp.y; } private function mouseUpHandler(e:MouseEvent):void{ _view.window.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); _view.window.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } private function init():void{ _view = (getViewComponent() as JointPointView); } private function mouseMoveHandler(e:MouseEvent):void{ var jointPoint:Point = getJointPoint(pointIndex); jointPoint.x = _view.window.stage.mouseX; jointPoint.y = _view.window.stage.mouseY; jointObj.updateAnchors(jointObj.anchor1, jointObj.anchor2); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(WorkspaceProxy.OBJECT_UPDATE, jointObj); } override public function handleNotification(note:INotification):void{ } public function loadData(jointObj:DistanceJointObjectDef, pointIndex:uint):void{ this.jointObj = jointObj; this.pointIndex = pointIndex; var jointPoint:Point = getJointPoint(pointIndex); var gp:Point = _view.window.parent.globalToLocal(jointPoint); _view.window.x = gp.x; _view.window.y = gp.y; _view.window.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); } protected function tryUpdate(updateObj:BaseObjectDef):void{ if (updateObj == jointObj){ update(); }; } private function getJointPoint(index:uint):Point{ if (index == 1){ return (jointObj.anchor1); }; return (jointObj.anchor2); } } }//package editor.view
Section 161
//LevelTestMediator (editor.view.LevelTestMediator) package editor.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import flash.display.*; import game.model.*; import editor.model.*; import editor.view.components.*; import org.puremvc.as3.patterns.mediator.*; import game.view.*; public class LevelTestMediator extends Mediator implements IMediator { private var _view:LevelTestView; public static const NAME:String = "LevelTestMediator"; public function LevelTestMediator(viewComponent:LevelTestView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } public function getJointsContainer():Sprite{ return (_view.jointsContainer); } private function backClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(LevelTestProxy.LEVEL_TEST_END); destroy(); } public function getPlayerContainer():Sprite{ return (_view.playerContainer); } public function getBodiesContainer():Sprite{ return (_view.bodiesContainer); } private function init():void{ _view = (getViewComponent() as LevelTestView); var mouseHandlerView:MouseHandlerView = new MouseHandlerView(_view.mouseHandler); var mouseHandlerMed:MouseHandlerMediator = new MouseHandlerMediator(mouseHandlerView); facade.registerMediator(mouseHandlerMed); _view.back_bt.addEventListener(MouseEvent.CLICK, backClickHandler); _view.restart_bt.addEventListener(MouseEvent.CLICK, restartClickHandler); } private function restartClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_RESTART_START); } override public function handleNotification(note:INotification):void{ } public function destroy():void{ facade.removeMediator(MouseHandlerMediator.NAME); _view.parent.removeChild(_view); facade.removeMediator(NAME); } } }//package editor.view
Section 162
//PlayerObjectMediator (editor.view.PlayerObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import editor.view.components.*; public class PlayerObjectMediator extends CircleObjectMediator implements IMediator { public function PlayerObjectMediator(NAME:String):void{ super(NAME); } override protected function init():void{ _view = new WorldObjectView(); var workspaceMed:WorkspaceMediator = (facade.retrieveMediator(WorkspaceMediator.NAME) as WorkspaceMediator); workspaceMed.getPlayerContainer().addChild(_view); } override protected function draw():void{ var playerClass:Class = (GameAssets.getInstance().getAssetClass("PlayerAsset") as Class); var player:Sprite = new (playerClass); _view.container.addChild(player); drawFrame(); } } }//package editor.view
Section 163
//RectObjectMediator (editor.view.RectObjectMediator) package editor.view { import org.puremvc.as3.interfaces.*; import flash.display.*; import core.objects.*; import flash.geom.*; import editor.model.*; public class RectObjectMediator extends BodyObjectMediator implements IMediator { protected var rectObj:RectObjectDef; public function RectObjectMediator(NAME:String):void{ super(NAME); } override public function loadData(obj:BaseObjectDef):void{ rectObj = (obj as RectObjectDef); super.loadData(obj); } override protected function update():void{ super.update(); draw(); } override protected function draw():void{ var MaterialClass:Class; if (rectObj.isStatic){ MaterialClass = EditorAssets.getInstance().getAssetClass("BrickMaterial"); } else { if (rectObj.splittable){ MaterialClass = EditorAssets.getInstance().getAssetClass("WoodMaterial"); } else { MaterialClass = EditorAssets.getInstance().getAssetClass("MetallMaterial"); }; }; var skinData:BitmapData = (new MaterialClass(200, 200) as BitmapData); var m:Matrix = new Matrix(); m.translate(100, 100); _view.container.graphics.clear(); _view.container.graphics.beginBitmapFill(skinData, m); _view.container.graphics.drawRect((-(rectObj.w) / 2), (-(rectObj.h) / 2), rectObj.w, rectObj.h); _view.container.graphics.endFill(); _view.container.rotation = rectObj.rotation; super.draw(); } override protected function drawFrame():void{ var rect:Rectangle = _view.container.getBounds(_view.frame); _view.frame.graphics.clear(); _view.frame.graphics.lineStyle(0, 0); _view.frame.graphics.drawRect(rect.x, rect.y, rect.width, rect.height); } override protected function processData():void{ super.processData(); } } }//package editor.view
Section 164
//WorkspaceMediator (editor.view.WorkspaceMediator) package editor.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import editor.view.components.*; import org.puremvc.as3.patterns.mediator.*; public class WorkspaceMediator extends Mediator implements IMediator { private var _view:WorkspaceView; public static const NAME:String = "WorkspaceMediator"; public static const MOUSE_DOWN:String = "WorkspaceMouseDown"; public function WorkspaceMediator(viewComponent:WorkspaceView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } public function getJointsContainer():Sprite{ return (_view.jointsContainer); } public function getObjectsContainer():Sprite{ return (_view.objectsContainer); } public function getPlayerContainer():Sprite{ return (_view.playerContainer); } public function getBodiesContainer():Sprite{ return (_view.bodiesContainer); } private function init():void{ _view = (getViewComponent() as WorkspaceView); _view.window.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); } private function mouseDownHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(MOUSE_DOWN); } override public function handleNotification(note:INotification):void{ } public function destroy():void{ facade.removeMediator(NAME); } public function getToolsCanvas():Sprite{ return (_view.toolsCanvas); } } }//package editor.view
Section 165
//WorldObjectMediator (editor.view.WorldObjectMediator) package editor.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.model.*; import core.objects.*; import flash.geom.*; import editor.model.*; import editor.view.components.*; import org.puremvc.as3.patterns.mediator.*; public class WorldObjectMediator extends Mediator implements IMediator { protected var moveOffset:Point; protected var _view:WorldObjectView; protected var obj:BaseObjectDef; public static const NAME_BASE:String = "WorldObjectMediator"; public function WorldObjectMediator(NAME:String):void{ super(NAME); init(); } protected function processData():void{ drawOrigin(); _view.x = obj.x; _view.y = obj.y; _view.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); } protected function tryDelete(objsToDelete:Array):void{ var delObj:BaseObjectDef; var i:uint; while (i < objsToDelete.length) { delObj = objsToDelete[i]; if (delObj == obj){ deleteObject(); }; i++; }; } protected function update():void{ } public function deleteObject():void{ _view.parent.removeChild(_view); facade.removeMediator((NAME_BASE + obj.id)); } protected function drawFrame():void{ } protected function mouseUpHandler(e:MouseEvent):void{ _view.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); _view.stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } protected function draw():void{ drawFrame(); } protected function mouseMoveHandler(e:MouseEvent):void{ var oldPos:Point = new Point(_view.x, _view.y); var newPos:Point = new Point((_view.parent.mouseX - moveOffset.x), (_view.parent.mouseY - moveOffset.y)); var dpos:Point = new Point((newPos.x - oldPos.x), (newPos.y - oldPos.y)); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(WorkspaceProxy.OBJECTS_MOVE, dpos); } protected function init():void{ _view = new WorldObjectView(); var workspaceMed:WorkspaceMediator = (facade.retrieveMediator(WorkspaceMediator.NAME) as WorkspaceMediator); workspaceMed.getBodiesContainer().addChild(_view); } protected function drawOrigin():void{ _view.origin.graphics.clear(); _view.origin.graphics.beginFill(0, 1); _view.origin.graphics.drawCircle(0, 0, 2); _view.origin.graphics.endFill(); } override public function listNotificationInterests():Array{ return ([WorkspaceProxy.OBJECTS_SELECT, WorkspaceProxy.OBJECTS_MOVE, WorkspaceProxy.OBJECT_UPDATE]); } protected function mouseDownHandler(e:MouseEvent):void{ var objects:Array; var notesProxy:NotesProxy; var workspaceProxy:WorkspaceProxy = (facade.retrieveProxy(WorkspaceProxy.NAME) as WorkspaceProxy); if (workspaceProxy.currentTool.type == Tool.TYPE_SELECTION){ _view.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); _view.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); moveOffset = new Point((_view.parent.mouseX - _view.x), (_view.parent.mouseY - _view.y)); if (workspaceProxy.getSelectedObjectIndex(obj) == -1){ objects = [obj]; notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(WorkspaceProxy.OBJECTS_SELECT, objects); }; }; } protected function checkSelection(selectedObjects:Array):void{ var i:uint; while (i < selectedObjects.length) { if (selectedObjects[i] == obj){ select(); return; }; i++; }; deselect(); } protected function tryUpdate(updateObj:BaseObjectDef):void{ if (updateObj == obj){ update(); }; } public function loadData(obj:BaseObjectDef):void{ this.obj = obj; processData(); } protected function checkMove():void{ _view.x = obj.x; _view.y = obj.y; } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case WorkspaceProxy.OBJECTS_SELECT: checkSelection((note.getBody() as Array)); break; case WorkspaceProxy.OBJECTS_MOVE: checkMove(); break; case WorkspaceProxy.OBJECT_UPDATE: tryUpdate((note.getBody() as BaseObjectDef)); break; }; } protected function select():void{ _view.frame.visible = true; } protected function deselect():void{ _view.frame.visible = false; } } }//package editor.view
Section 166
//BaseScrollPane (fl.containers.BaseScrollPane) package fl.containers { import flash.events.*; import flash.display.*; import flash.geom.*; import fl.controls.*; import fl.core.*; import fl.events.*; public class BaseScrollPane extends UIComponent { protected var defaultLineScrollSize:Number;// = 4 protected var _maxHorizontalScrollPosition:Number;// = 0 protected var vScrollBar:Boolean; protected var disabledOverlay:Shape; protected var hScrollBar:Boolean; protected var availableWidth:Number; protected var _verticalPageScrollSize:Number;// = 0 protected var vOffset:Number;// = 0 protected var _verticalScrollBar:ScrollBar; protected var useFixedHorizontalScrolling:Boolean;// = false protected var contentWidth:Number;// = 0 protected var contentHeight:Number;// = 0 protected var _horizontalPageScrollSize:Number;// = 0 protected var background:DisplayObject; protected var _useBitmpScrolling:Boolean;// = false protected var contentPadding:Number;// = 0 protected var availableHeight:Number; protected var _horizontalScrollBar:ScrollBar; protected var contentScrollRect:Rectangle; protected var _horizontalScrollPolicy:String; protected var _verticalScrollPolicy:String; protected static const SCROLL_BAR_STYLES:Object = {upArrowDisabledSkin:"upArrowDisabledSkin", upArrowDownSkin:"upArrowDownSkin", upArrowOverSkin:"upArrowOverSkin", upArrowUpSkin:"upArrowUpSkin", downArrowDisabledSkin:"downArrowDisabledSkin", downArrowDownSkin:"downArrowDownSkin", downArrowOverSkin:"downArrowOverSkin", downArrowUpSkin:"downArrowUpSkin", thumbDisabledSkin:"thumbDisabledSkin", thumbDownSkin:"thumbDownSkin", thumbOverSkin:"thumbOverSkin", thumbUpSkin:"thumbUpSkin", thumbIcon:"thumbIcon", trackDisabledSkin:"trackDisabledSkin", trackDownSkin:"trackDownSkin", trackOverSkin:"trackOverSkin", trackUpSkin:"trackUpSkin", repeatDelay:"repeatDelay", repeatInterval:"repeatInterval"}; private static var defaultStyles:Object = {repeatDelay:500, repeatInterval:35, skin:"ScrollPane_upSkin", contentPadding:0, disabledAlpha:0.5}; public function BaseScrollPane(){ contentWidth = 0; contentHeight = 0; contentPadding = 0; vOffset = 0; _maxHorizontalScrollPosition = 0; _horizontalPageScrollSize = 0; _verticalPageScrollSize = 0; defaultLineScrollSize = 4; useFixedHorizontalScrolling = false; _useBitmpScrolling = false; super(); } protected function handleWheel(_arg1:MouseEvent):void{ if (((((!(enabled)) || (!(_verticalScrollBar.visible)))) || ((contentHeight <= availableHeight)))){ return; }; _verticalScrollBar.scrollPosition = (_verticalScrollBar.scrollPosition - (_arg1.delta * verticalLineScrollSize)); setVerticalScrollPosition(_verticalScrollBar.scrollPosition); dispatchEvent(new ScrollEvent(ScrollBarDirection.VERTICAL, _arg1.delta, horizontalScrollPosition)); } public function get verticalScrollPosition():Number{ return (_verticalScrollBar.scrollPosition); } protected function drawDisabledOverlay():void{ if (enabled){ if (contains(disabledOverlay)){ removeChild(disabledOverlay); }; } else { disabledOverlay.x = (disabledOverlay.y = contentPadding); disabledOverlay.width = availableWidth; disabledOverlay.height = availableHeight; disabledOverlay.alpha = (getStyleValue("disabledAlpha") as Number); addChild(disabledOverlay); }; } public function set verticalScrollPosition(_arg1:Number):void{ drawNow(); _verticalScrollBar.scrollPosition = _arg1; setVerticalScrollPosition(_verticalScrollBar.scrollPosition, false); } protected function setContentSize(_arg1:Number, _arg2:Number):void{ if ((((((contentWidth == _arg1)) || (useFixedHorizontalScrolling))) && ((contentHeight == _arg2)))){ return; }; contentWidth = _arg1; contentHeight = _arg2; invalidate(InvalidationType.SIZE); } public function get horizontalScrollPosition():Number{ return (_horizontalScrollBar.scrollPosition); } public function get horizontalScrollBar():ScrollBar{ return (_horizontalScrollBar); } override public function set enabled(_arg1:Boolean):void{ if (enabled == _arg1){ return; }; _verticalScrollBar.enabled = _arg1; _horizontalScrollBar.enabled = _arg1; super.enabled = _arg1; } public function get verticalLineScrollSize():Number{ return (_verticalScrollBar.lineScrollSize); } public function get horizontalScrollPolicy():String{ return (_horizontalScrollPolicy); } protected function calculateAvailableSize():void{ var _local1:Number; var _local2:Number; var _local3:Number; var _local4:Number; var _local5:Number; _local1 = ScrollBar.WIDTH; _local2 = (contentPadding = Number(getStyleValue("contentPadding"))); _local3 = ((height - (2 * _local2)) - vOffset); vScrollBar = (((_verticalScrollPolicy == ScrollPolicy.ON)) || ((((_verticalScrollPolicy == ScrollPolicy.AUTO)) && ((contentHeight > _local3))))); _local4 = ((width - (vScrollBar) ? _local1 : 0) - (2 * _local2)); _local5 = (useFixedHorizontalScrolling) ? _maxHorizontalScrollPosition : (contentWidth - _local4); hScrollBar = (((_horizontalScrollPolicy == ScrollPolicy.ON)) || ((((_horizontalScrollPolicy == ScrollPolicy.AUTO)) && ((_local5 > 0))))); if (hScrollBar){ _local3 = (_local3 - _local1); }; if (((((((hScrollBar) && (!(vScrollBar)))) && ((_verticalScrollPolicy == ScrollPolicy.AUTO)))) && ((contentHeight > _local3)))){ vScrollBar = true; _local4 = (_local4 - _local1); }; availableHeight = (_local3 + vOffset); availableWidth = _local4; } public function get maxVerticalScrollPosition():Number{ drawNow(); return (Math.max(0, (contentHeight - availableHeight))); } public function set horizontalScrollPosition(_arg1:Number):void{ drawNow(); _horizontalScrollBar.scrollPosition = _arg1; setHorizontalScrollPosition(_horizontalScrollBar.scrollPosition, false); } public function get horizontalLineScrollSize():Number{ return (_horizontalScrollBar.lineScrollSize); } public function set verticalPageScrollSize(_arg1:Number):void{ _verticalPageScrollSize = _arg1; invalidate(InvalidationType.SIZE); } public function get verticalScrollPolicy():String{ return (_verticalScrollPolicy); } protected function setHorizontalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ } public function get useBitmapScrolling():Boolean{ return (_useBitmpScrolling); } protected function handleScroll(_arg1:ScrollEvent):void{ if (_arg1.target == _verticalScrollBar){ setVerticalScrollPosition(_arg1.position); } else { setHorizontalScrollPosition(_arg1.position); }; } public function set verticalLineScrollSize(_arg1:Number):void{ _verticalScrollBar.lineScrollSize = _arg1; } public function get verticalScrollBar():ScrollBar{ return (_verticalScrollBar); } protected function setVerticalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ } public function set horizontalPageScrollSize(_arg1:Number):void{ _horizontalPageScrollSize = _arg1; invalidate(InvalidationType.SIZE); } override protected function draw():void{ if (isInvalid(InvalidationType.STYLES)){ setStyles(); drawBackground(); if (contentPadding != getStyleValue("contentPadding")){ invalidate(InvalidationType.SIZE, false); }; }; if (isInvalid(InvalidationType.SIZE, InvalidationType.STATE)){ drawLayout(); }; updateChildren(); super.draw(); } public function set horizontalScrollPolicy(_arg1:String):void{ _horizontalScrollPolicy = _arg1; invalidate(InvalidationType.SIZE); } override protected function configUI():void{ var _local1:Graphics; super.configUI(); contentScrollRect = new Rectangle(0, 0, 85, 85); _verticalScrollBar = new ScrollBar(); _verticalScrollBar.addEventListener(ScrollEvent.SCROLL, handleScroll, false, 0, true); _verticalScrollBar.visible = false; _verticalScrollBar.lineScrollSize = defaultLineScrollSize; addChild(_verticalScrollBar); copyStylesToChild(_verticalScrollBar, SCROLL_BAR_STYLES); _horizontalScrollBar = new ScrollBar(); _horizontalScrollBar.direction = ScrollBarDirection.HORIZONTAL; _horizontalScrollBar.addEventListener(ScrollEvent.SCROLL, handleScroll, false, 0, true); _horizontalScrollBar.visible = false; _horizontalScrollBar.lineScrollSize = defaultLineScrollSize; addChild(_horizontalScrollBar); copyStylesToChild(_horizontalScrollBar, SCROLL_BAR_STYLES); disabledOverlay = new Shape(); _local1 = disabledOverlay.graphics; _local1.beginFill(0xFFFFFF); _local1.drawRect(0, 0, width, height); _local1.endFill(); addEventListener(MouseEvent.MOUSE_WHEEL, handleWheel, false, 0, true); } protected function calculateContentWidth():void{ } public function get verticalPageScrollSize():Number{ if (isNaN(availableHeight)){ drawNow(); }; return (((((_verticalPageScrollSize == 0)) && (!(isNaN(availableHeight))))) ? availableHeight : _verticalPageScrollSize); } protected function drawLayout():void{ calculateAvailableSize(); calculateContentWidth(); background.width = width; background.height = height; if (vScrollBar){ _verticalScrollBar.visible = true; _verticalScrollBar.x = ((width - ScrollBar.WIDTH) - contentPadding); _verticalScrollBar.y = contentPadding; _verticalScrollBar.height = availableHeight; } else { _verticalScrollBar.visible = false; }; _verticalScrollBar.setScrollProperties(availableHeight, 0, (contentHeight - availableHeight), verticalPageScrollSize); setVerticalScrollPosition(_verticalScrollBar.scrollPosition, false); if (hScrollBar){ _horizontalScrollBar.visible = true; _horizontalScrollBar.x = contentPadding; _horizontalScrollBar.y = ((height - ScrollBar.WIDTH) - contentPadding); _horizontalScrollBar.width = availableWidth; } else { _horizontalScrollBar.visible = false; }; _horizontalScrollBar.setScrollProperties(availableWidth, 0, (useFixedHorizontalScrolling) ? _maxHorizontalScrollPosition : (contentWidth - availableWidth), horizontalPageScrollSize); setHorizontalScrollPosition(_horizontalScrollBar.scrollPosition, false); drawDisabledOverlay(); } protected function drawBackground():void{ var _local1:DisplayObject; _local1 = background; background = getDisplayObjectInstance(getStyleValue("skin")); background.width = width; background.height = height; addChildAt(background, 0); if (((!((_local1 == null))) && (!((_local1 == background))))){ removeChild(_local1); }; } public function set horizontalLineScrollSize(_arg1:Number):void{ _horizontalScrollBar.lineScrollSize = _arg1; } public function get horizontalPageScrollSize():Number{ if (isNaN(availableWidth)){ drawNow(); }; return (((((_horizontalPageScrollSize == 0)) && (!(isNaN(availableWidth))))) ? availableWidth : _horizontalPageScrollSize); } public function get maxHorizontalScrollPosition():Number{ drawNow(); return (Math.max(0, (contentWidth - availableWidth))); } protected function setStyles():void{ copyStylesToChild(_verticalScrollBar, SCROLL_BAR_STYLES); copyStylesToChild(_horizontalScrollBar, SCROLL_BAR_STYLES); } protected function updateChildren():void{ _verticalScrollBar.enabled = (_horizontalScrollBar.enabled = enabled); _verticalScrollBar.drawNow(); _horizontalScrollBar.drawNow(); } public function set verticalScrollPolicy(_arg1:String):void{ _verticalScrollPolicy = _arg1; invalidate(InvalidationType.SIZE); } public function set useBitmapScrolling(_arg1:Boolean):void{ _useBitmpScrolling = _arg1; invalidate(InvalidationType.STATE); } public static function getStyleDefinition():Object{ return (mergeStyles(defaultStyles, ScrollBar.getStyleDefinition())); } } }//package fl.containers
Section 167
//DataGridCellEditor (fl.controls.dataGridClasses.DataGridCellEditor) package fl.controls.dataGridClasses { import fl.controls.*; import fl.controls.listClasses.*; public class DataGridCellEditor extends TextInput implements ICellRenderer { protected var _data:Object; protected var _listData:ListData; private static var defaultStyles:Object = {textPadding:1, textFormat:null, upSkin:"DataGridCellEditor_skin"}; public function DataGridCellEditor():void{ } public function get selected():Boolean{ return (false); } public function set listData(_arg1:ListData):void{ _listData = _arg1; text = _listData.label; } public function setMouseState(_arg1:String):void{ } public function set selected(_arg1:Boolean):void{ } public function set data(_arg1:Object):void{ _data = _arg1; } public function get listData():ListData{ return (_listData); } public function get data():Object{ return (_data); } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls.dataGridClasses
Section 168
//DataGridColumn (fl.controls.dataGridClasses.DataGridColumn) package fl.controls.dataGridClasses { import fl.controls.*; import fl.core.*; public class DataGridColumn { private var _headerText:String; public var editorDataField:String;// = "text" private var forceImport:DataGridCellEditor; private var _headerRenderer:Object; public var sortOptions:uint;// = 0 private var _cellRenderer:Object; private var _columnName:String; public var resizable:Boolean;// = true private var _sortCompareFunction:Function; private var _visible:Boolean;// = true public var sortDescending:Boolean;// = false public var owner:DataGrid; private var _imeMode:String; private var _width:Number;// = 100 public var editable:Boolean;// = true public var itemEditor:Object;// = "fl.controls.dataGridClasses.DataGridCellEditor" public var explicitWidth:Number; private var _minWidth:Number;// = 20 private var _labelFunction:Function; public var sortable:Boolean;// = true public var colNum:Number; public var dataField:String; public function DataGridColumn(_arg1:String=null){ _minWidth = 20; _width = 100; _visible = true; sortable = true; resizable = true; editable = true; itemEditor = "fl.controls.dataGridClasses.DataGridCellEditor"; editorDataField = "text"; sortDescending = false; sortOptions = 0; super(); if (_arg1){ dataField = _arg1; headerText = _arg1; }; } public function set headerRenderer(_arg1:Object):void{ _headerRenderer = _arg1; if (owner){ owner.invalidate(InvalidationType.DATA); }; } public function get imeMode():String{ return (_imeMode); } public function setWidth(_arg1:Number):void{ _width = _arg1; } public function set width(_arg1:Number):void{ var _local2:Boolean; explicitWidth = _arg1; if (owner != null){ _local2 = resizable; resizable = false; owner.resizeColumn(colNum, _arg1); resizable = _local2; } else { _width = _arg1; }; } public function set cellRenderer(_arg1:Object):void{ _cellRenderer = _arg1; if (owner){ owner.invalidate(InvalidationType.DATA); }; } public function get minWidth():Number{ return (_minWidth); } public function set imeMode(_arg1:String):void{ _imeMode = _arg1; } public function toString():String{ return ("[object DataGridColumn]"); } public function get visible():Boolean{ return (_visible); } public function itemToLabel(_arg1:Object):String{ var data = _arg1; if (!data){ return (" "); }; if (labelFunction != null){ return (labelFunction(data)); }; if (owner.labelFunction != null){ return (owner.labelFunction(data, this)); }; if ((((typeof(data) == "object")) || ((typeof(data) == "xml")))){ try { data = data[dataField]; } catch(e:Error) { data = null; }; }; if ((data is String)){ return (String(data)); }; try { return (data.toString()); } catch(e:Error) { }; return (" "); } public function set minWidth(_arg1:Number):void{ _minWidth = _arg1; if (_width < _arg1){ _width = _arg1; }; if (owner){ owner.invalidate(InvalidationType.SIZE); }; } public function set headerText(_arg1:String):void{ _headerText = _arg1; if (owner){ owner.invalidate(InvalidationType.DATA); }; } public function set sortCompareFunction(_arg1:Function):void{ _sortCompareFunction = _arg1; } public function get width():Number{ return (_width); } public function get cellRenderer():Object{ return (_cellRenderer); } public function set labelFunction(_arg1:Function):void{ if (_labelFunction == _arg1){ return; }; _labelFunction = _arg1; if (owner){ owner.invalidate(InvalidationType.DATA); }; } public function get headerText():String{ return (((_headerText)!=null) ? _headerText : dataField); } public function get sortCompareFunction():Function{ return (_sortCompareFunction); } public function get headerRenderer():Object{ return (_headerRenderer); } public function get labelFunction():Function{ return (_labelFunction); } public function set visible(_arg1:Boolean):void{ if (_visible != _arg1){ _visible = _arg1; if (owner){ owner.invalidate(InvalidationType.SIZE); }; }; } } }//package fl.controls.dataGridClasses
Section 169
//HeaderRenderer (fl.controls.dataGridClasses.HeaderRenderer) package fl.controls.dataGridClasses { import fl.controls.*; public class HeaderRenderer extends LabelButton { public var _column:uint; private static var defaultStyles:Object = {upSkin:"HeaderRenderer_upSkin", downSkin:"HeaderRenderer_downSkin", overSkin:"HeaderRenderer_overSkin", disabledSkin:"HeaderRenderer_disabledSkin", selectedDisabledSkin:"HeaderRenderer_selectedDisabledSkin", selectedUpSkin:"HeaderRenderer_selectedUpSkin", selectedDownSkin:"HeaderRenderer_selectedDownSkin", selectedOverSkin:"HeaderRenderer_selectedOverSkin", textFormat:null, disabledTextFormat:null, textPadding:5}; public function HeaderRenderer():void{ focusEnabled = false; } public function set column(_arg1:uint):void{ _column = _arg1; } public function get column():uint{ return (_column); } override protected function drawLayout():void{ var _local1:Number; var _local2:Number; var _local3:Number; var _local4:Number; var _local5:Number; _local1 = Number(getStyleValue("textPadding")); textField.height = (textField.textHeight + 4); textField.visible = (label.length > 0); _local2 = (textField.textWidth + 4); _local3 = (textField.textHeight + 4); _local4 = ((icon)==null) ? 0 : (icon.width + 4); _local5 = Math.max(0, Math.min(_local2, ((width - (2 * _local1)) - _local4))); if (icon != null){ icon.x = (((width - _local1) - icon.width) - 2); icon.y = Math.round(((height - icon.height) / 2)); }; textField.width = _local5; textField.x = _local1; textField.y = Math.round(((height - textField.height) / 2)); background.width = width; background.height = height; } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls.dataGridClasses
Section 170
//CellRenderer (fl.controls.listClasses.CellRenderer) package fl.controls.listClasses { import flash.events.*; import fl.controls.*; public class CellRenderer extends LabelButton implements ICellRenderer { protected var _data:Object; protected var _listData:ListData; private static var defaultStyles:Object = {upSkin:"CellRenderer_upSkin", downSkin:"CellRenderer_downSkin", overSkin:"CellRenderer_overSkin", disabledSkin:"CellRenderer_disabledSkin", selectedDisabledSkin:"CellRenderer_selectedDisabledSkin", selectedUpSkin:"CellRenderer_selectedUpSkin", selectedDownSkin:"CellRenderer_selectedDownSkin", selectedOverSkin:"CellRenderer_selectedOverSkin", textFormat:null, disabledTextFormat:null, embedFonts:null, textPadding:5}; public function CellRenderer():void{ toggle = true; focusEnabled = false; } override protected function toggleSelected(_arg1:MouseEvent):void{ } override public function get selected():Boolean{ return (super.selected); } public function set listData(_arg1:ListData):void{ _listData = _arg1; label = _listData.label; setStyle("icon", _listData.icon); } override public function set selected(_arg1:Boolean):void{ super.selected = _arg1; } public function set data(_arg1:Object):void{ _data = _arg1; } public function get listData():ListData{ return (_listData); } override public function setSize(_arg1:Number, _arg2:Number):void{ super.setSize(_arg1, _arg2); } override protected function drawLayout():void{ var _local1:Number; var _local2:Number; var _local3:Number; _local1 = Number(getStyleValue("textPadding")); _local2 = 0; if (icon != null){ icon.x = _local1; icon.y = Math.round(((height - icon.height) >> 1)); _local2 = (icon.width + _local1); }; if (label.length > 0){ textField.visible = true; _local3 = Math.max(0, ((width - _local2) - (_local1 * 2))); textField.width = _local3; textField.height = (textField.textHeight + 4); textField.x = (_local2 + _local1); textField.y = Math.round(((height - textField.height) >> 1)); } else { textField.visible = false; }; background.width = width; background.height = height; } public function get data():Object{ return (_data); } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls.listClasses
Section 171
//ICellRenderer (fl.controls.listClasses.ICellRenderer) package fl.controls.listClasses { public interface ICellRenderer { function setSize(_arg1:Number, _arg2:Number):void; function get listData():ListData; function get data():Object; function setMouseState(_arg1:String):void; function set x(_arg1:Number):void; function set y(_arg1:Number):void; function set data(_arg1:Object):void; function set selected(_arg1:Boolean):void; function set listData(_arg1:ListData):void; function get selected():Boolean; } }//package fl.controls.listClasses
Section 172
//ListData (fl.controls.listClasses.ListData) package fl.controls.listClasses { import fl.core.*; public class ListData { protected var _index:uint; protected var _owner:UIComponent; protected var _label:String; protected var _icon:Object;// = null protected var _row:uint; protected var _column:uint; public function ListData(_arg1:String, _arg2:Object, _arg3:UIComponent, _arg4:uint, _arg5:uint, _arg6:uint=0){ _icon = null; super(); _label = _arg1; _icon = _arg2; _owner = _arg3; _index = _arg4; _row = _arg5; _column = _arg6; } public function get owner():UIComponent{ return (_owner); } public function get label():String{ return (_label); } public function get row():uint{ return (_row); } public function get index():uint{ return (_index); } public function get icon():Object{ return (_icon); } public function get column():uint{ return (_column); } } }//package fl.controls.listClasses
Section 173
//BaseButton (fl.controls.BaseButton) package fl.controls { import flash.events.*; import flash.display.*; import fl.core.*; import fl.events.*; import flash.utils.*; public class BaseButton extends UIComponent { protected var _selected:Boolean;// = false private var unlockedMouseState:String; protected var pressTimer:Timer; protected var mouseState:String; protected var background:DisplayObject; private var _mouseStateLocked:Boolean;// = false protected var _autoRepeat:Boolean;// = false private static var defaultStyles:Object = {upSkin:"Button_upSkin", downSkin:"Button_downSkin", overSkin:"Button_overSkin", disabledSkin:"Button_disabledSkin", selectedDisabledSkin:"Button_selectedDisabledSkin", selectedUpSkin:"Button_selectedUpSkin", selectedDownSkin:"Button_selectedDownSkin", selectedOverSkin:"Button_selectedOverSkin", focusRectSkin:null, focusRectPadding:null, repeatDelay:500, repeatInterval:35}; public function BaseButton(){ _selected = false; _autoRepeat = false; _mouseStateLocked = false; super(); buttonMode = true; mouseChildren = false; useHandCursor = false; setupMouseEvents(); setMouseState("up"); pressTimer = new Timer(1, 0); pressTimer.addEventListener(TimerEvent.TIMER, buttonDown, false, 0, true); } protected function endPress():void{ pressTimer.reset(); } public function set mouseStateLocked(_arg1:Boolean):void{ _mouseStateLocked = _arg1; if (_arg1 == false){ setMouseState(unlockedMouseState); } else { unlockedMouseState = mouseState; }; } public function get autoRepeat():Boolean{ return (_autoRepeat); } public function set autoRepeat(_arg1:Boolean):void{ _autoRepeat = _arg1; } override public function set enabled(_arg1:Boolean):void{ super.enabled = _arg1; mouseEnabled = _arg1; } public function get selected():Boolean{ return (_selected); } protected function mouseEventHandler(_arg1:MouseEvent):void{ if (_arg1.type == MouseEvent.MOUSE_DOWN){ setMouseState("down"); startPress(); } else { if ((((_arg1.type == MouseEvent.ROLL_OVER)) || ((_arg1.type == MouseEvent.MOUSE_UP)))){ setMouseState("over"); endPress(); } else { if (_arg1.type == MouseEvent.ROLL_OUT){ setMouseState("up"); endPress(); }; }; }; } public function setMouseState(_arg1:String):void{ if (_mouseStateLocked){ unlockedMouseState = _arg1; return; }; if (mouseState == _arg1){ return; }; mouseState = _arg1; invalidate(InvalidationType.STATE); } protected function startPress():void{ if (_autoRepeat){ pressTimer.delay = Number(getStyleValue("repeatDelay")); pressTimer.start(); }; dispatchEvent(new ComponentEvent(ComponentEvent.BUTTON_DOWN, true)); } protected function buttonDown(_arg1:TimerEvent):void{ if (!_autoRepeat){ endPress(); return; }; if (pressTimer.currentCount == 1){ pressTimer.delay = Number(getStyleValue("repeatInterval")); }; dispatchEvent(new ComponentEvent(ComponentEvent.BUTTON_DOWN, true)); } public function set selected(_arg1:Boolean):void{ if (_selected == _arg1){ return; }; _selected = _arg1; invalidate(InvalidationType.STATE); } override public function get enabled():Boolean{ return (super.enabled); } override protected function draw():void{ if (isInvalid(InvalidationType.STYLES, InvalidationType.STATE)){ drawBackground(); invalidate(InvalidationType.SIZE, false); }; if (isInvalid(InvalidationType.SIZE)){ drawLayout(); }; super.draw(); } protected function setupMouseEvents():void{ addEventListener(MouseEvent.ROLL_OVER, mouseEventHandler, false, 0, true); addEventListener(MouseEvent.MOUSE_DOWN, mouseEventHandler, false, 0, true); addEventListener(MouseEvent.MOUSE_UP, mouseEventHandler, false, 0, true); addEventListener(MouseEvent.ROLL_OUT, mouseEventHandler, false, 0, true); } protected function drawLayout():void{ background.width = width; background.height = height; } protected function drawBackground():void{ var _local1:String; var _local2:DisplayObject; _local1 = (enabled) ? mouseState : "disabled"; if (selected){ _local1 = (("selected" + _local1.substr(0, 1).toUpperCase()) + _local1.substr(1)); }; _local1 = (_local1 + "Skin"); _local2 = background; background = getDisplayObjectInstance(getStyleValue(_local1)); addChildAt(background, 0); if (((!((_local2 == null))) && (!((_local2 == background))))){ removeChild(_local2); }; } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls
Section 174
//Button (fl.controls.Button) package fl.controls { import flash.display.*; import fl.managers.*; import fl.core.*; public class Button extends LabelButton implements IFocusManagerComponent { protected var emphasizedBorder:DisplayObject; protected var _emphasized:Boolean;// = false private static var defaultStyles:Object = {emphasizedSkin:"Button_emphasizedSkin", emphasizedPadding:2}; public static var createAccessibilityImplementation:Function; public function Button(){ _emphasized = false; super(); } override public function drawFocus(_arg1:Boolean):void{ var _local2:Number; var _local3:*; super.drawFocus(_arg1); if (_arg1){ _local2 = Number(getStyleValue("emphasizedPadding")); if ((((_local2 < 0)) || (!(_emphasized)))){ _local2 = 0; }; _local3 = getStyleValue("focusRectPadding"); _local3 = ((_local3)==null) ? 2 : _local3; _local3 = (_local3 + _local2); uiFocusRect.x = -(_local3); uiFocusRect.y = -(_local3); uiFocusRect.width = (width + (_local3 * 2)); uiFocusRect.height = (height + (_local3 * 2)); }; } public function set emphasized(_arg1:Boolean):void{ _emphasized = _arg1; invalidate(InvalidationType.STYLES); } override protected function draw():void{ if (((isInvalid(InvalidationType.STYLES)) || (isInvalid(InvalidationType.SIZE)))){ drawEmphasized(); }; super.draw(); if (emphasizedBorder != null){ setChildIndex(emphasizedBorder, (numChildren - 1)); }; } public function get emphasized():Boolean{ return (_emphasized); } override protected function initializeAccessibility():void{ if (Button.createAccessibilityImplementation != null){ Button.createAccessibilityImplementation(this); }; } protected function drawEmphasized():void{ var _local1:Object; var _local2:Number; if (emphasizedBorder != null){ removeChild(emphasizedBorder); }; emphasizedBorder = null; if (!_emphasized){ return; }; _local1 = getStyleValue("emphasizedSkin"); if (_local1 != null){ emphasizedBorder = getDisplayObjectInstance(_local1); }; if (emphasizedBorder != null){ addChildAt(emphasizedBorder, 0); _local2 = Number(getStyleValue("emphasizedPadding")); emphasizedBorder.x = (emphasizedBorder.y = -(_local2)); emphasizedBorder.width = (width + (_local2 * 2)); emphasizedBorder.height = (height + (_local2 * 2)); }; } public static function getStyleDefinition():Object{ return (UIComponent.mergeStyles(LabelButton.getStyleDefinition(), defaultStyles)); } } }//package fl.controls
Section 175
//ButtonLabelPlacement (fl.controls.ButtonLabelPlacement) package fl.controls { public class ButtonLabelPlacement { public static const TOP:String = "top"; public static const LEFT:String = "left"; public static const BOTTOM:String = "bottom"; public static const RIGHT:String = "right"; } }//package fl.controls
Section 176
//DataGrid (fl.controls.DataGrid) package fl.controls { import flash.events.*; import flash.display.*; import flash.geom.*; import fl.managers.*; import fl.core.*; import fl.controls.listClasses.*; import fl.events.*; import fl.data.*; import fl.controls.dataGridClasses.*; import flash.utils.*; import flash.ui.*; public class DataGrid extends SelectableList implements IFocusManagerComponent { protected var _showHeaders:Boolean;// = true protected var _sortIndex:int;// = -1 protected var _minColumnWidth:Number; protected var _headerRenderer:Object; public var sortableColumns:Boolean;// = true protected var activeCellRenderersMap:Dictionary; protected var _labelFunction:Function; protected var headerSortArrow:Sprite; protected var _sortDescending:Boolean;// = false protected var losingFocus:Boolean;// = false protected var maxHeaderHeight:Number;// = 25 protected var minColumnWidthInvalid:Boolean;// = false protected var _rowHeight:Number;// = 20 protected var _cellRenderer:Object; protected var proposedEditedItemPosition; public var editable:Boolean;// = false protected var dragHandlesMap:Dictionary; protected var header:Sprite; protected var availableCellRenderersMap:Dictionary; protected var _columns:Array; public var resizableColumns:Boolean;// = true protected var columnStretchStartWidth:Number; protected var actualRowIndex:int; protected var _editedItemPosition:Object; protected var editedItemPositionChanged:Boolean;// = false protected var actualColIndex:int; protected var columnStretchCursor:Sprite; protected var visibleColumns:Array; protected var headerMask:Sprite; public var itemEditorInstance:Object; protected var displayableColumns:Array; protected var columnStretchIndex:Number;// = -1 protected var columnsInvalid:Boolean;// = true protected var currentHoveredRow:int;// = -1 protected var isPressed:Boolean;// = false protected var lastSortIndex:int;// = -1 protected var columnStretchStartX:Number; protected var _headerHeight:Number;// = 25 protected static const HEADER_STYLES:Object = {disabledSkin:"headerDisabledSkin", downSkin:"headerDownSkin", overSkin:"headerOverSkin", upSkin:"headerUpSkin", textFormat:"headerTextFormat", disabledTextFormat:"headerDisabledTextFormat", textPadding:"headerTextPadding"}; private static var defaultStyles:Object = {headerUpSkin:"HeaderRenderer_upSkin", headerDownSkin:"HeaderRenderer_downSkin", headerOverSkin:"HeaderRenderer_overSkin", headerDisabledSkin:"HeaderRenderer_disabledSkin", headerSortArrowDescSkin:"HeaderSortArrow_descIcon", headerSortArrowAscSkin:"HeaderSortArrow_ascIcon", columnStretchCursorSkin:"ColumnStretch_cursor", columnDividerSkin:null, headerTextFormat:null, headerDisabledTextFormat:null, headerTextPadding:5, headerRenderer:HeaderRenderer, focusRectSkin:null, focusRectPadding:null, skin:"DataGrid_skin"}; public static var createAccessibilityImplementation:Function; public function DataGrid(){ _rowHeight = 20; _headerHeight = 25; _showHeaders = true; columnsInvalid = true; minColumnWidthInvalid = false; columnStretchIndex = -1; _sortIndex = -1; lastSortIndex = -1; _sortDescending = false; editedItemPositionChanged = false; isPressed = false; losingFocus = false; maxHeaderHeight = 25; currentHoveredRow = -1; editable = false; resizableColumns = true; sortableColumns = true; super(); if (_columns == null){ _columns = []; }; _horizontalScrollPolicy = ScrollPolicy.OFF; activeCellRenderersMap = new Dictionary(true); availableCellRenderersMap = new Dictionary(true); addEventListener(DataGridEvent.ITEM_EDIT_BEGINNING, itemEditorItemEditBeginningHandler, false, -50); addEventListener(DataGridEvent.ITEM_EDIT_BEGIN, itemEditorItemEditBeginHandler, false, -50); addEventListener(DataGridEvent.ITEM_EDIT_END, itemEditorItemEditEndHandler, false, -50); addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } override protected function drawList():void{ var _local1:uint; var _local2:uint; var _local3:Number; var _local4:Number; var _local5:uint; var _local6:Object; var _local7:ICellRenderer; var _local8:Array; var _local9:DataGridColumn; var _local10:Boolean; var _local11:Dictionary; var _local12:DataGridColumn; var _local13:Sprite; var _local14:UIComponent; var _local15:Array; var _local16:uint; var _local17:uint; var _local18:Number; var _local19:DataGridColumn; var _local20:Object; var _local21:Array; var _local22:Dictionary; var _local23:Object; var _local24:HeaderRenderer; var _local25:Sprite; var _local26:Graphics; var _local27:Boolean; var _local28:String; if (showHeaders){ header.visible = true; header.x = (contentPadding - _horizontalScrollPosition); header.y = contentPadding; listHolder.y = (contentPadding + headerHeight); _local18 = Math.floor((availableHeight - headerHeight)); _verticalScrollBar.setScrollProperties(_local18, 0, (contentHeight - _local18), _verticalScrollBar.pageScrollSize); } else { header.visible = false; listHolder.y = contentPadding; }; listHolder.x = contentPadding; contentScrollRect = listHolder.scrollRect; contentScrollRect.x = _horizontalScrollPosition; contentScrollRect.y = (vOffset + (Math.floor(_verticalScrollPosition) % rowHeight)); listHolder.scrollRect = contentScrollRect; listHolder.cacheAsBitmap = useBitmapScrolling; _local1 = Math.min(Math.max((length - 1), 0), Math.floor((_verticalScrollPosition / rowHeight))); _local2 = Math.min(Math.max((length - 1), 0), ((_local1 + rowCount) + 1)); _local10 = list.hitTestPoint(stage.mouseX, stage.mouseY); calculateColumnSizes(); _local11 = (renderedItems = new Dictionary(true)); if (length > 0){ _local5 = _local1; while (_local5 <= _local2) { _local11[_dataProvider.getItemAt(_local5)] = true; _local5++; }; }; _local3 = 0; _local12 = (visibleColumns[0] as DataGridColumn); _local5 = 0; while (_local5 < displayableColumns.length) { _local19 = (displayableColumns[_local5] as DataGridColumn); if (_local19 != _local12){ _local3 = (_local3 + _local19.width); } else { break; }; _local5++; }; while (header.numChildren > 0) { header.removeChildAt(0); }; dragHandlesMap = new Dictionary(true); _local15 = []; _local16 = visibleColumns.length; _local17 = 0; while (_local17 < _local16) { _local9 = (visibleColumns[_local17] as DataGridColumn); _local15.push(_local9.colNum); if (showHeaders){ _local23 = ((_local9.headerRenderer)!=null) ? _local9.headerRenderer : _headerRenderer; _local24 = (getDisplayObjectInstance(_local23) as HeaderRenderer); if (_local24 != null){ _local24.addEventListener(MouseEvent.CLICK, handleHeaderRendererClick, false, 0, true); _local24.x = _local3; _local24.y = 0; _local24.setSize(_local9.width, headerHeight); _local24.column = _local9.colNum; _local24.label = _local9.headerText; header.addChildAt(_local24, _local17); copyStylesToChild(_local24, HEADER_STYLES); if ((((((sortIndex == -1)) && ((lastSortIndex == -1)))) || (!((_local9.colNum == sortIndex))))){ _local24.setStyle("icon", null); } else { _local24.setStyle("icon", (sortDescending) ? getStyleValue("headerSortArrowAscSkin") : getStyleValue("headerSortArrowDescSkin")); }; if ((((((_local17 < (_local16 - 1))) && (resizableColumns))) && (_local9.resizable))){ _local25 = new Sprite(); _local26 = _local25.graphics; _local26.beginFill(0, 0); _local26.drawRect(0, 0, 3, headerHeight); _local26.endFill(); _local25.x = ((_local3 + _local9.width) - 2); _local25.y = 0; _local25.alpha = 0; _local25.addEventListener(MouseEvent.MOUSE_OVER, handleHeaderResizeOver, false, 0, true); _local25.addEventListener(MouseEvent.MOUSE_OUT, handleHeaderResizeOut, false, 0, true); _local25.addEventListener(MouseEvent.MOUSE_DOWN, handleHeaderResizeDown, false, 0, true); header.addChild(_local25); dragHandlesMap[_local25] = _local9.colNum; }; if ((((((_local17 == (_local16 - 1))) && ((_horizontalScrollPosition == 0)))) && ((availableWidth > (_local3 + _local9.width))))){ _local4 = Math.floor((availableWidth - _local3)); _local24.setSize(_local4, headerHeight); } else { _local4 = _local9.width; }; _local24.drawNow(); }; }; _local20 = ((_local9.cellRenderer)!=null) ? _local9.cellRenderer : _cellRenderer; _local21 = availableCellRenderersMap[_local9]; _local8 = activeCellRenderersMap[_local9]; if (_local8 == null){ _local8 = []; activeCellRenderersMap[_local9] = _local8; }; if (_local21 == null){ _local21 = []; availableCellRenderersMap[_local9] = _local21; }; _local22 = new Dictionary(true); while (_local8.length > 0) { _local7 = _local8.pop(); _local6 = _local7.data; if ((((_local11[_local6] == null)) || ((invalidItems[_local6] == true)))){ _local21.push(_local7); } else { _local22[_local6] = _local7; invalidItems[_local6] = true; }; list.removeChild((_local7 as DisplayObject)); }; if (length > 0){ _local5 = _local1; while (_local5 <= _local2) { _local27 = false; _local6 = _dataProvider.getItemAt(_local5); if (_local22[_local6] != null){ _local27 = true; _local7 = _local22[_local6]; delete _local22[_local6]; } else { if (_local21.length > 0){ _local7 = (_local21.pop() as ICellRenderer); } else { _local7 = (getDisplayObjectInstance(_local20) as ICellRenderer); _local13 = (_local7 as Sprite); if (_local13 != null){ _local13.addEventListener(MouseEvent.CLICK, handleCellRendererClick, false, 0, true); _local13.addEventListener(MouseEvent.ROLL_OVER, handleCellRendererMouseEvent, false, 0, true); _local13.addEventListener(MouseEvent.ROLL_OUT, handleCellRendererMouseEvent, false, 0, true); _local13.addEventListener(Event.CHANGE, handleCellRendererChange, false, 0, true); _local13.doubleClickEnabled = true; _local13.addEventListener(MouseEvent.DOUBLE_CLICK, handleCellRendererDoubleClick, false, 0, true); if (_local13["setStyle"] != null){ for (_local28 in rendererStyles) { var _local31 = _local13; _local31["setStyle"](_local28, rendererStyles[_local28]); }; }; }; }; }; list.addChild((_local7 as Sprite)); _local8.push(_local7); _local7.x = _local3; _local7.y = (rowHeight * (_local5 - _local1)); _local7.setSize(((_local17)==(_local16 - 1)) ? _local4 : _local9.width, rowHeight); if (!_local27){ _local7.data = _local6; }; _local7.listData = new ListData(columnItemToLabel(_local9.colNum, _local6), null, this, _local5, _local5, _local17); if (((_local10) && (isHovered(_local7)))){ _local7.setMouseState("over"); currentHoveredRow = _local5; } else { _local7.setMouseState("up"); }; _local7.selected = !((_selectedIndices.indexOf(_local5) == -1)); if ((_local7 is UIComponent)){ _local14 = (_local7 as UIComponent); _local14.drawNow(); }; _local5++; }; }; _local3 = (_local3 + _local9.width); _local17++; }; _local5 = 0; while (_local5 < _columns.length) { if (_local15.indexOf(_local5) == -1){ removeCellRenderersByColumn((_columns[_local5] as DataGridColumn)); }; _local5++; }; if (editedItemPositionChanged){ editedItemPositionChanged = false; commitEditedItemPosition(proposedEditedItemPosition); proposedEditedItemPosition = undefined; }; invalidItems = new Dictionary(true); } protected function itemEditorItemEditBeginningHandler(_arg1:DataGridEvent):void{ if (!_arg1.isDefaultPrevented()){ setEditedItemPosition({columnIndex:_arg1.columnIndex, rowIndex:uint(_arg1.rowIndex)}); } else { if (!itemEditorInstance){ _editedItemPosition = null; editable = false; setFocus(); editable = true; }; }; } protected function itemEditorItemEditEndHandler(_arg1:DataGridEvent):void{ var _local2:Boolean; var _local3:Object; var _local4:String; var _local5:Object; var _local6:String; var _local7:XML; var _local8:IFocusManager; if (!_arg1.isDefaultPrevented()){ _local2 = false; if (((itemEditorInstance) && (!((_arg1.reason == DataGridEventReason.CANCELLED))))){ _local3 = itemEditorInstance[_columns[_arg1.columnIndex].editorDataField]; _local4 = _columns[_arg1.columnIndex].dataField; _local5 = _arg1.itemRenderer.data; _local6 = ""; for each (_local7 in describeType(_local5).variable) { if (_local4 == _local7.@name.toString()){ _local6 = _local7.@type.toString(); break; }; }; switch (_local6){ case "String": if (!(_local3 is String)){ _local3 = _local3.toString(); }; break; case "uint": if (!(_local3 is uint)){ _local3 = uint(_local3); }; break; case "int": if (!(_local3 is int)){ _local3 = int(_local3); }; break; case "Number": if (!(_local3 is Number)){ _local3 = Number(_local3); }; break; }; if (_local5[_local4] != _local3){ _local2 = true; _local5[_local4] = _local3; }; _arg1.itemRenderer.data = _local5; }; } else { if (_arg1.reason != DataGridEventReason.OTHER){ if (((itemEditorInstance) && (_editedItemPosition))){ if (selectedIndex != _editedItemPosition.rowIndex){ selectedIndex = _editedItemPosition.rowIndex; }; _local8 = focusManager; if ((itemEditorInstance is IFocusManagerComponent)){ _local8.setFocus(InteractiveObject(itemEditorInstance)); }; }; }; }; if ((((_arg1.reason == DataGridEventReason.OTHER)) || (!(_arg1.isDefaultPrevented())))){ destroyItemEditor(); }; } public function get editedItemPosition():Object{ if (_editedItemPosition){ return ({rowIndex:_editedItemPosition.rowIndex, columnIndex:_editedItemPosition.columnIndex}); }; return (_editedItemPosition); } protected function setEditedItemPosition(_arg1:Object):void{ editedItemPositionChanged = true; proposedEditedItemPosition = _arg1; if (((_arg1) && (!((_arg1.rowIndex == selectedIndex))))){ selectedIndex = _arg1.rowIndex; }; invalidate(InvalidationType.DATA); } public function set headerHeight(_arg1:Number):void{ maxHeaderHeight = _arg1; _headerHeight = Math.max(0, _arg1); invalidate(InvalidationType.SIZE); } protected function handleHeaderResizeDown(_arg1:MouseEvent):void{ var _local2:Sprite; var _local3:Number; var _local4:DataGridColumn; _local2 = (_arg1.currentTarget as Sprite); _local3 = dragHandlesMap[_local2]; _local4 = getColumnAt(_local3); columnStretchIndex = _local3; columnStretchStartX = _arg1.stageX; columnStretchStartWidth = _local4.width; stage.addEventListener(MouseEvent.MOUSE_MOVE, handleHeaderResizeMove, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, handleHeaderResizeUp, false, 0, true); } protected function deactivateHandler(_arg1:Event):void{ if (itemEditorInstance){ endEdit(DataGridEventReason.OTHER); losingFocus = true; setFocus(); }; } protected function keyFocusChangeHandler(_arg1:FocusEvent):void{ if ((((((_arg1.keyCode == Keyboard.TAB)) && (!(_arg1.isDefaultPrevented())))) && (findNextItemRenderer(_arg1.shiftKey)))){ _arg1.preventDefault(); }; } override protected function handleDataChange(_arg1:DataChangeEvent):void{ super.handleDataChange(_arg1); if (_columns == null){ _columns = []; }; if (_columns.length == 0){ createColumnsFromDataProvider(); }; } public function set editedItemPosition(_arg1:Object):void{ var _local2:Object; _local2 = {rowIndex:_arg1.rowIndex, columnIndex:_arg1.columnIndex}; setEditedItemPosition(_local2); } override public function itemToCellRenderer(_arg1:Object):ICellRenderer{ return (null); } public function getCellRendererAt(_arg1:uint, _arg2:uint):ICellRenderer{ var _local3:DataGridColumn; var _local4:Array; var _local5:uint; var _local6:ICellRenderer; _local3 = (_columns[_arg2] as DataGridColumn); if (_local3 != null){ _local4 = (activeCellRenderersMap[_local3] as Array); if (_local4 != null){ _local5 = 0; while (_local5 < _local4.length) { _local6 = (_local4[_local5] as ICellRenderer); if (_local6.listData.row == _arg1){ return (_local6); }; _local5++; }; }; }; return (null); } override protected function keyDownHandler(_arg1:KeyboardEvent):void{ if (((!(selectable)) || (itemEditorInstance))){ return; }; switch (_arg1.keyCode){ case Keyboard.UP: case Keyboard.DOWN: case Keyboard.END: case Keyboard.HOME: case Keyboard.PAGE_UP: case Keyboard.PAGE_DOWN: moveSelectionVertically(_arg1.keyCode, ((_arg1.shiftKey) && (_allowMultipleSelection)), ((_arg1.ctrlKey) && (_allowMultipleSelection))); break; case Keyboard.LEFT: case Keyboard.RIGHT: moveSelectionHorizontally(_arg1.keyCode, ((_arg1.shiftKey) && (_allowMultipleSelection)), ((_arg1.ctrlKey) && (_allowMultipleSelection))); break; case Keyboard.SPACE: if (caretIndex == -1){ caretIndex = 0; }; scrollToIndex(caretIndex); doKeySelection(caretIndex, _arg1.shiftKey, _arg1.ctrlKey); break; default: break; }; _arg1.stopPropagation(); } protected function handleHeaderResizeUp(_arg1:MouseEvent):void{ var _local2:Sprite; var _local3:DataGridColumn; var _local4:HeaderRenderer; var _local5:uint; var _local6:DataGridEvent; _local2 = (_arg1.currentTarget as Sprite); _local3 = (_columns[columnStretchIndex] as DataGridColumn); _local5 = 0; while (_local5 < header.numChildren) { _local4 = (header.getChildAt(_local5) as HeaderRenderer); if (((_local4) && ((_local4.column == columnStretchIndex)))){ break; }; _local5++; }; _local6 = new DataGridEvent(DataGridEvent.COLUMN_STRETCH, false, true, columnStretchIndex, -1, _local4, (_local3) ? _local3.dataField : null); dispatchEvent(_local6); columnStretchIndex = -1; showColumnStretchCursor(false); stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleHeaderResizeMove, false); stage.removeEventListener(MouseEvent.MOUSE_UP, handleHeaderResizeUp, false); } protected function handleHeaderResizeOver(_arg1:MouseEvent):void{ if (columnStretchIndex == -1){ showColumnStretchCursor(); }; } override protected function focusInHandler(_arg1:FocusEvent):void{ var _local2:Boolean; var _local3:DataGridColumn; if (_arg1.target != this){ return; }; if (losingFocus){ losingFocus = false; return; }; setIMEMode(true); super.focusInHandler(_arg1); if (((editable) && (!(isPressed)))){ _local2 = !((editedItemPosition == null)); if (!_editedItemPosition){ _editedItemPosition = {rowIndex:0, columnIndex:0}; while (_editedItemPosition.columnIndex < _columns.length) { _local3 = (_columns[_editedItemPosition.columnIndex] as DataGridColumn); if (((_local3.editable) && (_local3.visible))){ _local2 = true; break; }; _editedItemPosition.columnIndex++; }; }; if (_local2){ setEditedItemPosition(_editedItemPosition); }; }; if (editable){ addEventListener(FocusEvent.KEY_FOCUS_CHANGE, keyFocusChangeHandler); addEventListener(MouseEvent.MOUSE_DOWN, mouseFocusChangeHandler); }; } public function createItemEditor(_arg1:uint, _arg2:uint):void{ var _local3:DataGridColumn; var _local4:ICellRenderer; var _local5:Sprite; var _local6:int; if (displayableColumns.length != _columns.length){ _local6 = 0; while (_local6 < displayableColumns.length) { if (displayableColumns[_local6].colNum >= _arg1){ _arg1 = displayableColumns[_local6].colNum; break; }; _local6++; }; if (_local6 == displayableColumns.length){ _arg1 = 0; }; }; _local3 = (_columns[_arg1] as DataGridColumn); _local4 = getCellRendererAt(_arg2, _arg1); if (!itemEditorInstance){ itemEditorInstance = getDisplayObjectInstance(_local3.itemEditor); itemEditorInstance.tabEnabled = false; list.addChild(DisplayObject(itemEditorInstance)); }; list.setChildIndex(DisplayObject(itemEditorInstance), (list.numChildren - 1)); _local5 = (_local4 as Sprite); itemEditorInstance.visible = true; itemEditorInstance.move(_local5.x, _local5.y); itemEditorInstance.setSize(_local3.width, rowHeight); itemEditorInstance.drawNow(); DisplayObject(itemEditorInstance).addEventListener(FocusEvent.FOCUS_OUT, itemEditorFocusOutHandler); _local5.visible = false; DisplayObject(itemEditorInstance).addEventListener(KeyboardEvent.KEY_DOWN, editorKeyDownHandler); stage.addEventListener(MouseEvent.MOUSE_DOWN, editorMouseDownHandler, true, 0, true); } private function itemEditorFocusOutHandler(_arg1:FocusEvent):void{ if (((_arg1.relatedObject) && (contains(_arg1.relatedObject)))){ return; }; if (!_arg1.relatedObject){ return; }; if (itemEditorInstance){ endEdit(DataGridEventReason.OTHER); }; } override public function get horizontalScrollPolicy():String{ return (_horizontalScrollPolicy); } override protected function updateRendererStyles():void{ var _local1:Array; var _local2:Object; var _local3:uint; var _local4:uint; var _local5:String; _local1 = []; for (_local2 in availableCellRenderersMap) { _local1 = _local1.concat(availableCellRenderersMap[_local2]); }; for (_local2 in activeCellRenderersMap) { _local1 = _local1.concat(activeCellRenderersMap[_local2]); }; _local3 = _local1.length; _local4 = 0; while (_local4 < _local3) { if (_local1[_local4]["setStyle"] == null){ } else { for (_local5 in updatedRendererStyles) { _local1[_local4].setStyle(_local5, updatedRendererStyles[_local5]); }; _local1[_local4].drawNow(); }; _local4++; }; updatedRendererStyles = {}; } public function set minColumnWidth(_arg1:Number):void{ _minColumnWidth = _arg1; columnsInvalid = true; minColumnWidthInvalid = true; invalidate(InvalidationType.SIZE); } protected function showColumnStretchCursor(_arg1:Boolean=true):void{ if (columnStretchCursor == null){ columnStretchCursor = (getDisplayObjectInstance(getStyleValue("columnStretchCursorSkin")) as Sprite); columnStretchCursor.mouseEnabled = false; }; if (_arg1){ Mouse.hide(); stage.addChild(columnStretchCursor); stage.addEventListener(MouseEvent.MOUSE_MOVE, positionColumnStretchCursor, false, 0, true); columnStretchCursor.x = stage.mouseX; columnStretchCursor.y = stage.mouseY; } else { stage.removeEventListener(MouseEvent.MOUSE_MOVE, positionColumnStretchCursor, false); if (stage.contains(columnStretchCursor)){ stage.removeChild(columnStretchCursor); }; Mouse.show(); }; } protected function findNextEnterItemRenderer(_arg1:KeyboardEvent):void{ var _local2:int; var _local3:int; var _local4:int; var _local5:DataGridEvent; if (proposedEditedItemPosition !== undefined){ return; }; _local2 = _editedItemPosition.rowIndex; _local3 = _editedItemPosition.columnIndex; _local4 = (_editedItemPosition.rowIndex + (_arg1.shiftKey) ? -1 : 1); if ((((_local4 >= 0)) && ((_local4 < length)))){ _local2 = _local4; }; _local5 = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGINNING, false, true, _local3, _local2); _local5.dataField = _columns[_local3].dataField; dispatchEvent(_local5); } protected function mouseFocusChangeHandler(_arg1:MouseEvent):void{ if (((((itemEditorInstance) && (!(_arg1.isDefaultPrevented())))) && (itemRendererContains(itemEditorInstance, DisplayObject(_arg1.target))))){ _arg1.preventDefault(); }; } public function get imeMode():String{ return (_imeMode); } public function editField(_arg1:uint, _arg2:String, _arg3:Object):void{ var _local4:Object; _local4 = getItemAt(_arg1); _local4[_arg2] = _arg3; replaceItemAt(_local4, _arg1); } protected function calculateAvailableHeight():Number{ var _local1:Number; var _local2:Number; _local1 = Number(getStyleValue("contentPadding")); _local2 = ((((_horizontalScrollPolicy == ScrollPolicy.ON)) || ((((_horizontalScrollPolicy == ScrollPolicy.AUTO)) && ((_maxHorizontalScrollPosition > 0)))))) ? 15 : 0; return ((((height - (_local1 * 2)) - _local2) - (showHeaders) ? headerHeight : 0)); } protected function mouseUpHandler(_arg1:MouseEvent):void{ if (((!(enabled)) || (!(selectable)))){ return; }; isPressed = false; } override protected function moveSelectionHorizontally(_arg1:uint, _arg2:Boolean, _arg3:Boolean):void{ } public function resizeColumn(_arg1:int, _arg2:Number):void{ var _local3:DataGridColumn; var _local4:int; var _local5:Number; var _local6:int; var _local7:DataGridColumn; var _local8:DataGridColumn; var _local9:int; var _local10:Number; var _local11:Number; var _local12:Number; if (_columns.length == 0){ return; }; _local3 = (_columns[_arg1] as DataGridColumn); if (!_local3){ return; }; if (((!(visibleColumns)) || ((visibleColumns.length == 0)))){ _local3.setWidth(_arg2); return; }; if (_arg2 < _local3.minWidth){ _arg2 = _local3.minWidth; }; if ((((_horizontalScrollPolicy == ScrollPolicy.ON)) || ((_horizontalScrollPolicy == ScrollPolicy.AUTO)))){ _local3.setWidth(_arg2); _local3.explicitWidth = _arg2; } else { _local4 = getVisibleColumnIndex(_local3); if (_local4 != -1){ _local5 = 0; _local6 = visibleColumns.length; _local9 = (_local4 + 1); while (_local9 < _local6) { _local7 = (visibleColumns[_local9] as DataGridColumn); if (((_local7) && (_local7.resizable))){ _local5 = (_local5 + _local7.width); }; _local9++; }; _local11 = ((_local3.width - _arg2) + _local5); if (_local5){ _local3.setWidth(_arg2); _local3.explicitWidth = _arg2; }; _local12 = 0; _local9 = (_local4 + 1); while (_local9 < _local6) { _local7 = (visibleColumns[_local9] as DataGridColumn); if (_local7.resizable){ _local10 = ((_local7.width * _local11) / _local5); if (_local10 < _local7.minWidth){ _local10 = _local7.minWidth; }; _local7.setWidth(_local10); _local12 = (_local12 + _local7.width); _local8 = _local7; }; _local9++; }; if (_local12 > _local11){ _local10 = ((_local3.width - _local12) + _local11); if (_local10 < _local3.minWidth){ _local10 = _local3.minWidth; }; _local3.setWidth(_local10); } else { if (_local8){ _local8.setWidth(((_local8.width - _local12) + _local11)); }; }; } else { _local3.setWidth(_arg2); _local3.explicitWidth = _arg2; }; }; columnsInvalid = true; invalidate(InvalidationType.SIZE); } protected function itemEditorItemEditBeginHandler(_arg1:DataGridEvent):void{ var _local2:IFocusManager; if (stage){ stage.addEventListener(Event.DEACTIVATE, deactivateHandler, false, 0, true); }; if (!_arg1.isDefaultPrevented()){ createItemEditor(_arg1.columnIndex, uint(_arg1.rowIndex)); ICellRenderer(itemEditorInstance).listData = ICellRenderer(editedItemRenderer).listData; ICellRenderer(itemEditorInstance).data = editedItemRenderer.data; itemEditorInstance.imeMode = ((columns[_arg1.columnIndex].imeMode)==null) ? _imeMode : columns[_arg1.columnIndex].imeMode; _local2 = focusManager; if ((itemEditorInstance is IFocusManagerComponent)){ _local2.setFocus(InteractiveObject(itemEditorInstance)); }; _local2.defaultButtonEnabled = false; _arg1 = new DataGridEvent(DataGridEvent.ITEM_FOCUS_IN, false, false, _editedItemPosition.columnIndex, _editedItemPosition.rowIndex, itemEditorInstance); dispatchEvent(_arg1); }; } override protected function draw():void{ var _local1:Boolean; _local1 = !((contentHeight == (rowHeight * length))); contentHeight = (rowHeight * length); if (isInvalid(InvalidationType.STYLES)){ setStyles(); drawBackground(); if (contentPadding != getStyleValue("contentPadding")){ invalidate(InvalidationType.SIZE, false); }; if (((!((_cellRenderer == getStyleValue("cellRenderer")))) || (!((_headerRenderer == getStyleValue("headerRenderer")))))){ _invalidateList(); _cellRenderer = getStyleValue("cellRenderer"); _headerRenderer = getStyleValue("headerRenderer"); }; }; if (isInvalid(InvalidationType.SIZE)){ columnsInvalid = true; }; if (((isInvalid(InvalidationType.SIZE, InvalidationType.STATE)) || (_local1))){ drawLayout(); drawDisabledOverlay(); }; if (isInvalid(InvalidationType.RENDERER_STYLES)){ updateRendererStyles(); }; if (isInvalid(InvalidationType.STYLES, InvalidationType.SIZE, InvalidationType.DATA, InvalidationType.SCROLL, InvalidationType.SELECTED)){ drawList(); }; updateChildren(); validate(); } override public function set horizontalScrollPolicy(_arg1:String):void{ super.horizontalScrollPolicy = _arg1; columnsInvalid = true; } protected function getVisibleColumnIndex(_arg1:DataGridColumn):int{ var _local2:uint; _local2 = 0; while (_local2 < visibleColumns.length) { if (_arg1 == visibleColumns[_local2]){ return (_local2); }; _local2++; }; return (-1); } protected function itemRendererContains(_arg1:Object, _arg2:DisplayObject):Boolean{ if (((((!(_arg2)) || (!(_arg1)))) || (!((_arg1 is DisplayObjectContainer))))){ return (false); }; return (DisplayObjectContainer(_arg1).contains(_arg2)); } override protected function configUI():void{ var _local1:Graphics; useFixedHorizontalScrolling = false; super.configUI(); headerMask = new Sprite(); _local1 = headerMask.graphics; _local1.beginFill(0, 0.3); _local1.drawRect(0, 0, 100, 100); _local1.endFill(); headerMask.visible = false; addChild(headerMask); header = new Sprite(); addChild(header); header.mask = headerMask; _horizontalScrollPolicy = ScrollPolicy.OFF; _verticalScrollPolicy = ScrollPolicy.AUTO; } public function columnItemToLabel(_arg1:uint, _arg2:Object):String{ var _local3:DataGridColumn; _local3 = (_columns[_arg1] as DataGridColumn); if (_local3 != null){ return (_local3.itemToLabel(_arg2)); }; return (" "); } protected function endEdit(_arg1:String):Boolean{ var _local2:DataGridEvent; if (!editedItemRenderer){ return (true); }; _local2 = new DataGridEvent(DataGridEvent.ITEM_EDIT_END, false, true, editedItemPosition.columnIndex, editedItemPosition.rowIndex, editedItemRenderer, _columns[editedItemPosition.columnIndex].dataField, _arg1); dispatchEvent(_local2); return (!(_local2.isDefaultPrevented())); } override protected function drawLayout():void{ vOffset = (showHeaders) ? headerHeight : 0; super.drawLayout(); contentScrollRect = listHolder.scrollRect; if (showHeaders){ headerHeight = maxHeaderHeight; if (Math.floor((availableHeight - headerHeight)) <= 0){ _headerHeight = availableHeight; }; list.y = headerHeight; contentScrollRect = listHolder.scrollRect; contentScrollRect.y = (contentPadding + headerHeight); contentScrollRect.height = (availableHeight - headerHeight); listHolder.y = (contentPadding + headerHeight); headerMask.x = contentPadding; headerMask.y = contentPadding; headerMask.width = availableWidth; headerMask.height = headerHeight; } else { contentScrollRect.y = contentPadding; listHolder.y = 0; }; listHolder.scrollRect = contentScrollRect; } protected function commitEditedItemPosition(_arg1:Object):void{ var _local2:ICellRenderer; var _local3:DataGridEvent; var _local4:String; var _local5:int; if (((!(enabled)) || (!(editable)))){ return; }; if (((((((((itemEditorInstance) && (_arg1))) && ((itemEditorInstance is IFocusManagerComponent)))) && ((_editedItemPosition.rowIndex == _arg1.rowIndex)))) && ((_editedItemPosition.columnIndex == _arg1.columnIndex)))){ IFocusManagerComponent(itemEditorInstance).setFocus(); return; }; if (itemEditorInstance){ if (!_arg1){ _local4 = DataGridEventReason.OTHER; } else { if (((!(editedItemPosition)) || ((_arg1.rowIndex == editedItemPosition.rowIndex)))){ _local4 = DataGridEventReason.NEW_COLUMN; } else { _local4 = DataGridEventReason.NEW_ROW; }; }; if (((!(endEdit(_local4))) && (!((_local4 == DataGridEventReason.OTHER))))){ return; }; }; _editedItemPosition = _arg1; if (!_arg1){ return; }; actualRowIndex = _arg1.rowIndex; actualColIndex = _arg1.columnIndex; if (displayableColumns.length != _columns.length){ _local5 = 0; while (_local5 < displayableColumns.length) { if (displayableColumns[_local5].colNum >= actualColIndex){ actualColIndex = displayableColumns[_local5].colNum; break; }; _local5++; }; if (_local5 == displayableColumns.length){ actualColIndex = 0; }; }; scrollToPosition(actualRowIndex, actualColIndex); _local2 = getCellRendererAt(actualRowIndex, actualColIndex); _local3 = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGIN, false, true, actualColIndex, actualRowIndex, _local2); dispatchEvent(_local3); if (editedItemPositionChanged){ editedItemPositionChanged = false; commitEditedItemPosition(proposedEditedItemPosition); proposedEditedItemPosition = undefined; }; if (!itemEditorInstance){ commitEditedItemPosition(null); }; } protected function handleHeaderRendererClick(_arg1:MouseEvent):void{ var _local2:HeaderRenderer; var _local3:uint; var _local4:DataGridColumn; var _local5:uint; var _local6:DataGridEvent; if (!_enabled){ return; }; _local2 = (_arg1.currentTarget as HeaderRenderer); _local3 = _local2.column; _local4 = (_columns[_local3] as DataGridColumn); if (((sortableColumns) && (_local4.sortable))){ _local5 = _sortIndex; _sortIndex = _local3; _local6 = new DataGridEvent(DataGridEvent.HEADER_RELEASE, false, true, _local3, -1, _local2, (_local4) ? _local4.dataField : null); if (((!(dispatchEvent(_local6))) || (!(_selectable)))){ _sortIndex = lastSortIndex; return; }; lastSortIndex = _local5; sortByColumn(_local3); invalidate(InvalidationType.DATA); }; } public function get showHeaders():Boolean{ return (_showHeaders); } public function get sortIndex():int{ return (_sortIndex); } public function set labelFunction(_arg1:Function):void{ if (_labelFunction == _arg1){ return; }; _labelFunction = _arg1; invalidate(InvalidationType.DATA); } public function getColumnIndex(_arg1:String):int{ var _local2:uint; var _local3:DataGridColumn; _local2 = 0; while (_local2 < _columns.length) { _local3 = (_columns[_local2] as DataGridColumn); if (_local3.dataField == _arg1){ return (_local2); }; _local2++; }; return (-1); } protected function createColumnsFromDataProvider():void{ var _local1:Object; var _local2:String; _columns = []; if (length > 0){ _local1 = _dataProvider.getItemAt(0); for (_local2 in _local1) { addColumn(_local2); }; }; } protected function editorMouseDownHandler(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:uint; if (!itemRendererContains(itemEditorInstance, DisplayObject(_arg1.target))){ if ((((_arg1.target is ICellRenderer)) && (contains(DisplayObject(_arg1.target))))){ _local2 = (_arg1.target as ICellRenderer); _local3 = _local2.listData.row; if (_editedItemPosition.rowIndex == _local3){ endEdit(DataGridEventReason.NEW_COLUMN); } else { endEdit(DataGridEventReason.NEW_ROW); }; } else { endEdit(DataGridEventReason.OTHER); }; }; } public function addColumnAt(_arg1, _arg2:uint):DataGridColumn{ var _local3:DataGridColumn; var _local4:*; var _local5:uint; if (_arg2 < _columns.length){ _columns.splice(_arg2, 0, ""); _local5 = (_arg2 + 1); while (_local5 < _columns.length) { _local3 = (_columns[_local5] as DataGridColumn); _local3.colNum = _local5; _local5++; }; }; _local4 = _arg1; if (!(_local4 is DataGridColumn)){ if ((_local4 is String)){ _local4 = new DataGridColumn(_local4); } else { _local4 = new DataGridColumn(); }; }; _local3 = (_local4 as DataGridColumn); _local3.owner = this; _local3.colNum = _arg2; _columns[_arg2] = _local3; invalidate(InvalidationType.SIZE); columnsInvalid = true; return (_local3); } public function destroyItemEditor():void{ var _local1:DataGridEvent; if (itemEditorInstance){ DisplayObject(itemEditorInstance).removeEventListener(KeyboardEvent.KEY_DOWN, editorKeyDownHandler); stage.removeEventListener(MouseEvent.MOUSE_DOWN, editorMouseDownHandler, true); _local1 = new DataGridEvent(DataGridEvent.ITEM_FOCUS_OUT, false, false, _editedItemPosition.columnIndex, _editedItemPosition.rowIndex, itemEditorInstance); dispatchEvent(_local1); if (((itemEditorInstance) && ((itemEditorInstance is UIComponent)))){ UIComponent(itemEditorInstance).drawFocus(false); }; list.removeChild(DisplayObject(itemEditorInstance)); DisplayObject(editedItemRenderer).visible = true; itemEditorInstance = null; }; } public function set imeMode(_arg1:String):void{ _imeMode = _arg1; } protected function doKeySelection(_arg1:int, _arg2:Boolean, _arg3:Boolean):void{ var _local4:Boolean; var _local5:int; var _local6:Array; var _local7:int; var _local8:int; _local4 = false; if (_arg2){ _local6 = []; _local7 = lastCaretIndex; _local8 = _arg1; if (_local7 == -1){ _local7 = ((caretIndex)!=-1) ? caretIndex : _arg1; }; if (_local7 > _local8){ _local8 = _local7; _local7 = _arg1; }; _local5 = _local7; while (_local5 <= _local8) { _local6.push(_local5); _local5++; }; selectedIndices = _local6; caretIndex = _arg1; _local4 = true; } else { if (_arg3){ caretIndex = _arg1; } else { selectedIndex = _arg1; caretIndex = (lastCaretIndex = _arg1); _local4 = true; }; }; if (_local4){ dispatchEvent(new Event(Event.CHANGE)); }; invalidate(InvalidationType.DATA); } public function get headerHeight():Number{ return (_headerHeight); } public function getColumnCount():uint{ return (_columns.length); } protected function sortByColumn(_arg1:int):void{ var _local2:DataGridColumn; var _local3:Boolean; var _local4:uint; _local2 = (columns[_arg1] as DataGridColumn); if (((((!(enabled)) || (!(_local2)))) || (!(_local2.sortable)))){ return; }; _local3 = _local2.sortDescending; _local4 = _local2.sortOptions; if (_local3){ _local4 = (_local4 | Array.DESCENDING); } else { _local4 = (_local4 & ~(Array.DESCENDING)); }; if (_local2.sortCompareFunction != null){ sortItems(_local2.sortCompareFunction, _local4); } else { sortItemsOn(_local2.dataField, _local4); }; _sortDescending = (_local2.sortDescending = !(_local3)); if ((((lastSortIndex >= 0)) && (!((lastSortIndex == sortIndex))))){ _local2 = (columns[lastSortIndex] as DataGridColumn); if (_local2 != null){ _local2.sortDescending = false; }; }; } public function get minColumnWidth():Number{ return (_minColumnWidth); } protected function isHovered(_arg1:ICellRenderer):Boolean{ var _local2:uint; var _local3:Number; var _local4:Point; _local2 = Math.min(Math.max((length - 1), 0), Math.floor((_verticalScrollPosition / rowHeight))); _local3 = ((_arg1.listData.row - _local2) * rowHeight); _local4 = list.globalToLocal(new Point(0, stage.mouseY)); return ((((_local4.y > _local3)) && ((_local4.y < (_local3 + rowHeight))))); } protected function mouseDownHandler(_arg1:MouseEvent):void{ if (((!(enabled)) || (!(selectable)))){ return; }; isPressed = true; } override public function set enabled(_arg1:Boolean):void{ super.enabled = _arg1; header.mouseChildren = _enabled; } override protected function moveSelectionVertically(_arg1:uint, _arg2:Boolean, _arg3:Boolean):void{ var _local4:int; var _local5:int; var _local6:int; _local4 = Math.max(Math.floor((calculateAvailableHeight() / rowHeight)), 1); _local5 = -1; _local6 = 0; switch (_arg1){ case Keyboard.UP: if (caretIndex > 0){ _local5 = (caretIndex - 1); }; break; case Keyboard.DOWN: if (caretIndex < (length - 1)){ _local5 = (caretIndex + 1); }; break; case Keyboard.PAGE_UP: if (caretIndex > 0){ _local5 = Math.max((caretIndex - _local4), 0); }; break; case Keyboard.PAGE_DOWN: if (caretIndex < (length - 1)){ _local5 = Math.min((caretIndex + _local4), (length - 1)); }; break; case Keyboard.HOME: if (caretIndex > 0){ _local5 = 0; }; break; case Keyboard.END: if (caretIndex < (length - 1)){ _local5 = (length - 1); }; break; }; if (_local5 >= 0){ doKeySelection(_local5, _arg2, _arg3); scrollToSelected(); }; } protected function handleHeaderResizeOut(_arg1:MouseEvent):void{ if (columnStretchIndex == -1){ showColumnStretchCursor(false); }; } public function removeAllColumns():void{ if (_columns.length > 0){ removeCellRenderers(); _columns = []; invalidate(InvalidationType.SIZE); columnsInvalid = true; }; } public function set rowCount(_arg1:uint):void{ var _local2:Number; var _local3:Number; _local2 = Number(getStyleValue("contentPadding")); _local3 = ((((_horizontalScrollPolicy == ScrollPolicy.ON)) || ((((_horizontalScrollPolicy == ScrollPolicy.AUTO)) && (hScrollBar))))) ? 15 : 0; height = ((((rowHeight * _arg1) + (2 * _local2)) + _local3) + (showHeaders) ? headerHeight : 0); } protected function removeCellRenderers():void{ var _local1:uint; _local1 = 0; while (_local1 < _columns.length) { removeCellRenderersByColumn((_columns[_local1] as DataGridColumn)); _local1++; }; } public function removeColumnAt(_arg1:uint):DataGridColumn{ var _local2:DataGridColumn; var _local3:uint; _local2 = (_columns[_arg1] as DataGridColumn); if (_local2 != null){ removeCellRenderersByColumn(_local2); _columns.splice(_arg1, 1); _local3 = _arg1; while (_local3 < _columns.length) { _local2 = (_columns[_local3] as DataGridColumn); if (_local2){ _local2.colNum = _local3; }; _local3++; }; invalidate(InvalidationType.SIZE); columnsInvalid = true; }; return (_local2); } override protected function setHorizontalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ if (_arg1 == _horizontalScrollPosition){ return; }; contentScrollRect = listHolder.scrollRect; contentScrollRect.x = _arg1; listHolder.scrollRect = contentScrollRect; list.x = 0; header.x = -(_arg1); super.setHorizontalScrollPosition(_arg1, true); invalidate(InvalidationType.SCROLL); columnsInvalid = true; } public function get labelFunction():Function{ return (_labelFunction); } override protected function handleCellRendererClick(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:DataGridColumn; var _local4:DataGridEvent; super.handleCellRendererClick(_arg1); _local2 = (_arg1.currentTarget as ICellRenderer); if (((((_local2) && (_local2.data))) && (!((_local2 == itemEditorInstance))))){ _local3 = (_columns[_local2.listData.column] as DataGridColumn); if (((((editable) && (_local3))) && (_local3.editable))){ _local4 = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGINNING, false, true, _local2.listData.column, _local2.listData.row, _local2, _local3.dataField); dispatchEvent(_local4); }; }; } override protected function focusOutHandler(_arg1:FocusEvent):void{ setIMEMode(false); if (_arg1.target == this){ super.focusOutHandler(_arg1); }; if ((((_arg1.relatedObject == this)) && (itemRendererContains(itemEditorInstance, DisplayObject(_arg1.target))))){ return; }; if ((((_arg1.relatedObject == null)) && (itemRendererContains(editedItemRenderer, DisplayObject(_arg1.target))))){ return; }; if ((((_arg1.relatedObject == null)) && (itemRendererContains(itemEditorInstance, DisplayObject(_arg1.target))))){ return; }; if (((itemEditorInstance) && (((!(_arg1.relatedObject)) || (!(itemRendererContains(itemEditorInstance, _arg1.relatedObject))))))){ endEdit(DataGridEventReason.OTHER); removeEventListener(FocusEvent.KEY_FOCUS_CHANGE, keyFocusChangeHandler); removeEventListener(MouseEvent.MOUSE_DOWN, mouseFocusChangeHandler); }; } protected function positionColumnStretchCursor(_arg1:MouseEvent):void{ columnStretchCursor.x = _arg1.stageX; columnStretchCursor.y = _arg1.stageY; } override protected function setVerticalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ if (itemEditorInstance){ endEdit(DataGridEventReason.OTHER); }; invalidate(InvalidationType.SCROLL); super.setVerticalScrollPosition(_arg1, true); } public function get sortDescending():Boolean{ return (_sortDescending); } protected function editorKeyDownHandler(_arg1:KeyboardEvent):void{ if (_arg1.keyCode == Keyboard.ESCAPE){ endEdit(DataGridEventReason.CANCELLED); } else { if (((_arg1.ctrlKey) && ((_arg1.charCode == 46)))){ endEdit(DataGridEventReason.CANCELLED); } else { if ((((_arg1.charCode == Keyboard.ENTER)) && (!((_arg1.keyCode == 229))))){ if (endEdit(DataGridEventReason.NEW_ROW)){ findNextEnterItemRenderer(_arg1); }; }; }; }; } override protected function calculateContentWidth():void{ var _local1:int; var _local2:int; var _local3:DataGridColumn; if (_columns.length == 0){ contentWidth = 0; return; }; if (minColumnWidthInvalid){ _local1 = _columns.length; _local2 = 0; while (_local2 < _local1) { _local3 = (_columns[_local2] as DataGridColumn); _local3.minWidth = minColumnWidth; _local2++; }; minColumnWidthInvalid = false; }; if (horizontalScrollPolicy == ScrollPolicy.OFF){ contentWidth = availableWidth; } else { contentWidth = 0; _local1 = _columns.length; _local2 = 0; while (_local2 < _local1) { _local3 = (_columns[_local2] as DataGridColumn); if (_local3.visible){ contentWidth = (contentWidth + _local3.width); }; _local2++; }; if (((!(isNaN(_horizontalScrollPosition))) && (((_horizontalScrollPosition + availableWidth) > contentWidth)))){ setHorizontalScrollPosition((contentWidth - availableWidth)); }; }; } override public function get rowCount():uint{ return (Math.ceil((calculateAvailableHeight() / rowHeight))); } public function addColumn(_arg1):DataGridColumn{ return (addColumnAt(_arg1, _columns.length)); } protected function removeCellRenderersByColumn(_arg1:DataGridColumn):void{ var _local2:Array; if (_arg1 == null){ return; }; _local2 = activeCellRenderersMap[_arg1]; if (_local2 != null){ while (_local2.length > 0) { list.removeChild((_local2.pop() as DisplayObject)); }; }; } override protected function handleCellRendererMouseEvent(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:int; var _local4:String; var _local5:uint; var _local6:DataGridColumn; var _local7:ICellRenderer; _local2 = (_arg1.target as ICellRenderer); if (_local2){ _local3 = _local2.listData.row; if (_arg1.type == MouseEvent.ROLL_OVER){ _local4 = "over"; } else { if (_arg1.type == MouseEvent.ROLL_OUT){ _local4 = "up"; }; }; if (_local4){ _local5 = 0; while (_local5 < visibleColumns.length) { _local6 = (visibleColumns[_local5] as DataGridColumn); _local7 = getCellRendererAt(_local3, _local6.colNum); if (_local7){ _local7.setMouseState(_local4); }; if (_local3 != currentHoveredRow){ _local7 = getCellRendererAt(currentHoveredRow, _local6.colNum); if (_local7){ _local7.setMouseState("up"); }; }; _local5++; }; }; }; super.handleCellRendererMouseEvent(_arg1); } protected function handleHeaderResizeMove(_arg1:MouseEvent):void{ var _local2:Number; var _local3:Number; _local2 = (_arg1.stageX - columnStretchStartX); _local3 = (columnStretchStartWidth + _local2); resizeColumn(columnStretchIndex, _local3); } public function set rowHeight(_arg1:Number):void{ _rowHeight = Math.max(0, _arg1); invalidate(InvalidationType.SIZE); } protected function scrollToPosition(_arg1:int, _arg2:int):void{ var _local3:Number; var _local4:Number; var _local5:uint; var _local6:Number; var _local7:DataGridColumn; var _local8:DataGridColumn; _local3 = verticalScrollPosition; _local4 = horizontalScrollPosition; scrollToIndex(_arg1); _local6 = 0; _local7 = (_columns[_arg2] as DataGridColumn); _local5 = 0; while (_local5 < displayableColumns.length) { _local8 = (displayableColumns[_local5] as DataGridColumn); if (_local8 != _local7){ _local6 = (_local6 + _local8.width); } else { break; }; _local5++; }; if (horizontalScrollPosition > _local6){ horizontalScrollPosition = _local6; } else { if ((horizontalScrollPosition + availableWidth) < (_local6 + _local7.width)){ horizontalScrollPosition = -((availableWidth - (_local6 + _local7.width))); }; }; if (((!((_local3 == verticalScrollPosition))) || (!((_local4 == horizontalScrollPosition))))){ drawNow(); }; } protected function findNextItemRenderer(_arg1:Boolean):Boolean{ var _local2:int; var _local3:int; var _local4:Boolean; var _local5:int; var _local6:int; var _local7:String; var _local8:DataGridEvent; if (!_editedItemPosition){ return (false); }; if (proposedEditedItemPosition !== undefined){ return (false); }; _local2 = _editedItemPosition.rowIndex; _local3 = _editedItemPosition.columnIndex; _local4 = false; _local5 = (_arg1) ? -1 : 1; _local6 = (length - 1); while (!(_local4)) { _local3 = (_local3 + _local5); if ((((_local3 < 0)) || ((_local3 >= _columns.length)))){ _local3 = ((_local3)<0) ? (_columns.length - 1) : 0; _local2 = (_local2 + _local5); if ((((_local2 < 0)) || ((_local2 > _local6)))){ setEditedItemPosition(null); losingFocus = true; setFocus(); return (false); }; }; if (((_columns[_local3].editable) && (_columns[_local3].visible))){ _local4 = true; if (_local2 == _editedItemPosition.rowIndex){ _local7 = DataGridEventReason.NEW_COLUMN; } else { _local7 = DataGridEventReason.NEW_ROW; }; if (((!(itemEditorInstance)) || (endEdit(_local7)))){ _local8 = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGINNING, false, true, _local3, _local2); _local8.dataField = _columns[_local3].dataField; dispatchEvent(_local8); }; }; }; return (_local4); } override public function set dataProvider(_arg1:DataProvider):void{ super.dataProvider = _arg1; if (_columns == null){ _columns = []; }; if (_columns.length == 0){ createColumnsFromDataProvider(); }; removeCellRenderers(); } override public function setSize(_arg1:Number, _arg2:Number):void{ super.setSize(_arg1, _arg2); columnsInvalid = true; } override public function scrollToIndex(_arg1:int):void{ var _local2:int; var _local3:int; var _local4:Number; drawNow(); _local2 = (Math.floor(((_verticalScrollPosition + availableHeight) / rowHeight)) - 1); _local3 = Math.ceil((_verticalScrollPosition / rowHeight)); if (_arg1 < _local3){ verticalScrollPosition = (_arg1 * rowHeight); } else { if (_arg1 >= _local2){ _local4 = ((((_horizontalScrollPolicy == ScrollPolicy.ON)) || ((((_horizontalScrollPolicy == ScrollPolicy.AUTO)) && (hScrollBar))))) ? 15 : 0; verticalScrollPosition = (((((_arg1 + 1) * rowHeight) - availableHeight) + _local4) + (showHeaders) ? headerHeight : 0); }; }; } protected function calculateColumnSizes():void{ var _local1:Number; var _local2:int; var _local3:int; var _local4:Number; var _local5:DataGridColumn; var _local6:DataGridColumn; var _local7:Number; var _local8:int; var _local9:Number; var _local10:int; var _local11:Number; var _local12:Number; var _local13:Number; var _local14:Number; _local4 = 0; if (_columns.length == 0){ visibleColumns = []; displayableColumns = []; return; }; if (columnsInvalid){ columnsInvalid = false; visibleColumns = []; if (minColumnWidthInvalid){ _local2 = _columns.length; _local3 = 0; while (_local3 < _local2) { _columns[_local3].minWidth = minColumnWidth; _local3++; }; minColumnWidthInvalid = false; }; displayableColumns = null; _local2 = _columns.length; _local3 = 0; while (_local3 < _local2) { if (((displayableColumns) && (_columns[_local3].visible))){ displayableColumns.push(_columns[_local3]); } else { if (((!(displayableColumns)) && (!(_columns[_local3].visible)))){ displayableColumns = new Array(_local3); _local8 = 0; while (_local8 < _local3) { displayableColumns[_local8] = _columns[_local8]; _local8++; }; }; }; _local3++; }; if (!displayableColumns){ displayableColumns = _columns; }; if (horizontalScrollPolicy == ScrollPolicy.OFF){ _local2 = displayableColumns.length; _local3 = 0; while (_local3 < _local2) { visibleColumns.push(displayableColumns[_local3]); _local3++; }; } else { _local2 = displayableColumns.length; _local9 = 0; _local3 = 0; while (_local3 < _local2) { _local5 = (displayableColumns[_local3] as DataGridColumn); if (((((_local9 + _local5.width) > _horizontalScrollPosition)) && ((_local9 < (_horizontalScrollPosition + availableWidth))))){ visibleColumns.push(_local5); }; _local9 = (_local9 + _local5.width); _local3++; }; }; }; if (horizontalScrollPolicy == ScrollPolicy.OFF){ _local10 = 0; _local11 = 0; _local2 = visibleColumns.length; _local3 = 0; while (_local3 < _local2) { _local5 = (visibleColumns[_local3] as DataGridColumn); if (_local5.resizable){ if (!isNaN(_local5.explicitWidth)){ _local11 = (_local11 + _local5.width); } else { _local10++; _local11 = (_local11 + _local5.minWidth); }; } else { _local11 = (_local11 + _local5.width); }; _local4 = (_local4 + _local5.width); _local3++; }; _local13 = availableWidth; if ((((availableWidth > _local11)) && (_local10))){ _local2 = visibleColumns.length; _local3 = 0; while (_local3 < _local2) { _local5 = (visibleColumns[_local3] as DataGridColumn); if (((_local5.resizable) && (isNaN(_local5.explicitWidth)))){ _local6 = _local5; if (_local4 > availableWidth){ _local12 = ((_local6.width - _local6.minWidth) / (_local4 - _local11)); } else { _local12 = (_local6.width / _local4); }; _local7 = (_local6.width - ((_local4 - availableWidth) * _local12)); _local14 = _local5.minWidth; _local5.setWidth(Math.max(_local7, _local14)); }; _local13 = (_local13 - _local5.width); _local3++; }; if (((_local13) && (_local6))){ _local6.setWidth((_local6.width + _local13)); }; } else { _local2 = visibleColumns.length; _local3 = 0; while (_local3 < _local2) { _local6 = (visibleColumns[_local3] as DataGridColumn); _local12 = (_local6.width / _local4); _local7 = (availableWidth * _local12); _local6.setWidth(_local7); _local6.explicitWidth = NaN; _local13 = (_local13 - _local7); _local3++; }; if (((_local13) && (_local6))){ _local6.setWidth((_local6.width + _local13)); }; }; }; } public function set showHeaders(_arg1:Boolean):void{ _showHeaders = _arg1; invalidate(InvalidationType.SIZE); } override protected function initializeAccessibility():void{ if (DataGrid.createAccessibilityImplementation != null){ DataGrid.createAccessibilityImplementation(this); }; } public function getColumnAt(_arg1:uint):DataGridColumn{ return ((_columns[_arg1] as DataGridColumn)); } public function get rowHeight():Number{ return (_rowHeight); } public function set columns(_arg1:Array):void{ var _local2:uint; removeCellRenderers(); _columns = []; _local2 = 0; while (_local2 < _arg1.length) { addColumn(_arg1[_local2]); _local2++; }; } public function get editedItemRenderer():ICellRenderer{ if (!itemEditorInstance){ return (null); }; return (getCellRendererAt(actualRowIndex, actualColIndex)); } public function get columns():Array{ return (_columns.slice(0)); } public function spaceColumnsEqually():void{ var _local1:Number; var _local2:int; var _local3:DataGridColumn; drawNow(); if (displayableColumns.length > 0){ _local1 = (availableWidth / displayableColumns.length); _local2 = 0; while (_local2 < displayableColumns.length) { _local3 = (displayableColumns[_local2] as DataGridColumn); _local3.width = _local1; _local2++; }; invalidate(InvalidationType.SIZE); columnsInvalid = true; }; } public static function getStyleDefinition():Object{ return (mergeStyles(defaultStyles, SelectableList.getStyleDefinition(), ScrollBar.getStyleDefinition())); } } }//package fl.controls
Section 177
//LabelButton (fl.controls.LabelButton) package fl.controls { import flash.events.*; import flash.display.*; import fl.managers.*; import fl.core.*; import fl.events.*; import flash.text.*; import flash.ui.*; public class LabelButton extends BaseButton implements IFocusManagerComponent { protected var _labelPlacement:String;// = "right" protected var _toggle:Boolean;// = false protected var icon:DisplayObject; protected var oldMouseState:String; protected var mode:String;// = "center" public var textField:TextField; protected var _label:String;// = "Label" private static var defaultStyles:Object = {icon:null, upIcon:null, downIcon:null, overIcon:null, disabledIcon:null, selectedDisabledIcon:null, selectedUpIcon:null, selectedDownIcon:null, selectedOverIcon:null, textFormat:null, disabledTextFormat:null, textPadding:5, embedFonts:false}; public static var createAccessibilityImplementation:Function; public function LabelButton(){ _labelPlacement = ButtonLabelPlacement.RIGHT; _toggle = false; _label = "Label"; mode = "center"; super(); } protected function toggleSelected(_arg1:MouseEvent):void{ selected = !(selected); dispatchEvent(new Event(Event.CHANGE, true)); } public function get labelPlacement():String{ return (_labelPlacement); } override protected function keyDownHandler(_arg1:KeyboardEvent):void{ if (!enabled){ return; }; if (_arg1.keyCode == Keyboard.SPACE){ if (oldMouseState == null){ oldMouseState = mouseState; }; setMouseState("down"); startPress(); }; } protected function setEmbedFont(){ var _local1:Object; _local1 = getStyleValue("embedFonts"); if (_local1 != null){ textField.embedFonts = _local1; }; } override protected function keyUpHandler(_arg1:KeyboardEvent):void{ if (!enabled){ return; }; if (_arg1.keyCode == Keyboard.SPACE){ setMouseState(oldMouseState); oldMouseState = null; endPress(); dispatchEvent(new MouseEvent(MouseEvent.CLICK)); }; } override public function get selected():Boolean{ return ((_toggle) ? _selected : false); } public function set labelPlacement(_arg1:String):void{ _labelPlacement = _arg1; invalidate(InvalidationType.SIZE); } public function set toggle(_arg1:Boolean):void{ if (((!(_arg1)) && (super.selected))){ selected = false; }; _toggle = _arg1; if (_toggle){ addEventListener(MouseEvent.CLICK, toggleSelected, false, 0, true); } else { removeEventListener(MouseEvent.CLICK, toggleSelected); }; invalidate(InvalidationType.STATE); } public function get label():String{ return (_label); } override public function set selected(_arg1:Boolean):void{ _selected = _arg1; if (_toggle){ invalidate(InvalidationType.STATE); }; } override protected function draw():void{ if (textField.text != _label){ label = _label; }; if (isInvalid(InvalidationType.STYLES, InvalidationType.STATE)){ drawBackground(); drawIcon(); drawTextFormat(); invalidate(InvalidationType.SIZE, false); }; if (isInvalid(InvalidationType.SIZE)){ drawLayout(); }; if (isInvalid(InvalidationType.SIZE, InvalidationType.STYLES)){ if (((isFocused) && (focusManager.showFocusIndicator))){ drawFocus(true); }; }; validate(); } public function get toggle():Boolean{ return (_toggle); } override protected function configUI():void{ super.configUI(); textField = new TextField(); textField.type = TextFieldType.DYNAMIC; textField.selectable = false; addChild(textField); } override protected function drawLayout():void{ var _local1:Number; var _local2:String; var _local3:Number; var _local4:Number; var _local5:Number; var _local6:Number; var _local7:Number; var _local8:Number; _local1 = Number(getStyleValue("textPadding")); _local2 = ((((icon == null)) && ((mode == "center")))) ? ButtonLabelPlacement.TOP : _labelPlacement; textField.height = (textField.textHeight + 4); _local3 = (textField.textWidth + 4); _local4 = (textField.textHeight + 4); _local5 = ((icon)==null) ? 0 : (icon.width + _local1); _local6 = ((icon)==null) ? 0 : (icon.height + _local1); textField.visible = (label.length > 0); if (icon != null){ icon.x = Math.round(((width - icon.width) / 2)); icon.y = Math.round(((height - icon.height) / 2)); }; if (textField.visible == false){ textField.width = 0; textField.height = 0; } else { if ((((_local2 == ButtonLabelPlacement.BOTTOM)) || ((_local2 == ButtonLabelPlacement.TOP)))){ _local7 = Math.max(0, Math.min(_local3, (width - (2 * _local1)))); if ((height - 2) > _local4){ _local8 = _local4; } else { _local8 = (height - 2); }; _local3 = _local7; textField.width = _local3; _local4 = _local8; textField.height = _local4; textField.x = Math.round(((width - _local3) / 2)); textField.y = Math.round(((((height - textField.height) - _local6) / 2) + ((_local2)==ButtonLabelPlacement.BOTTOM) ? _local6 : 0)); if (icon != null){ icon.y = Math.round(((_local2)==ButtonLabelPlacement.BOTTOM) ? (textField.y - _local6) : ((textField.y + textField.height) + _local1)); }; } else { _local7 = Math.max(0, Math.min(_local3, ((width - _local5) - (2 * _local1)))); _local3 = _local7; textField.width = _local3; textField.x = Math.round(((((width - _local3) - _local5) / 2) + ((_local2)!=ButtonLabelPlacement.LEFT) ? _local5 : 0)); textField.y = Math.round(((height - textField.height) / 2)); if (icon != null){ icon.x = Math.round(((_local2)!=ButtonLabelPlacement.LEFT) ? (textField.x - _local5) : ((textField.x + _local3) + _local1)); }; }; }; super.drawLayout(); } override protected function initializeAccessibility():void{ if (LabelButton.createAccessibilityImplementation != null){ LabelButton.createAccessibilityImplementation(this); }; } protected function drawIcon():void{ var _local1:DisplayObject; var _local2:String; var _local3:Object; _local1 = icon; _local2 = (enabled) ? mouseState : "disabled"; if (selected){ _local2 = (("selected" + _local2.substr(0, 1).toUpperCase()) + _local2.substr(1)); }; _local2 = (_local2 + "Icon"); _local3 = getStyleValue(_local2); if (_local3 == null){ _local3 = getStyleValue("icon"); }; if (_local3 != null){ icon = getDisplayObjectInstance(_local3); }; if (icon != null){ addChildAt(icon, 1); }; if (((!((_local1 == null))) && (!((_local1 == icon))))){ removeChild(_local1); }; } public function set label(_arg1:String):void{ _label = _arg1; if (textField.text != _label){ textField.text = _label; dispatchEvent(new ComponentEvent(ComponentEvent.LABEL_CHANGE)); }; invalidate(InvalidationType.SIZE); invalidate(InvalidationType.STYLES); } protected function drawTextFormat():void{ var _local1:Object; var _local2:TextFormat; var _local3:TextFormat; _local1 = UIComponent.getStyleDefinition(); _local2 = (enabled) ? (_local1.defaultTextFormat as TextFormat) : (_local1.defaultDisabledTextFormat as TextFormat); textField.setTextFormat(_local2); _local3 = (getStyleValue((enabled) ? "textFormat" : "disabledTextFormat") as TextFormat); if (_local3 != null){ textField.setTextFormat(_local3); } else { _local3 = _local2; }; textField.defaultTextFormat = _local3; setEmbedFont(); } public static function getStyleDefinition():Object{ return (mergeStyles(defaultStyles, BaseButton.getStyleDefinition())); } } }//package fl.controls
Section 178
//ScrollBar (fl.controls.ScrollBar) package fl.controls { import flash.events.*; import fl.core.*; import fl.events.*; public class ScrollBar extends UIComponent { private var _direction:String;// = "vertical" protected var inDrag:Boolean;// = false protected var upArrow:BaseButton; private var _pageScrollSize:Number;// = 0 protected var downArrow:BaseButton; private var _pageSize:Number;// = 10 private var thumbScrollOffset:Number; private var _maxScrollPosition:Number;// = 0 private var _scrollPosition:Number;// = 0 protected var track:BaseButton; private var _minScrollPosition:Number;// = 0 private var _lineScrollSize:Number;// = 1 protected var thumb:LabelButton; protected static const THUMB_STYLES:Object = {disabledSkin:"thumbDisabledSkin", downSkin:"thumbDownSkin", overSkin:"thumbOverSkin", upSkin:"thumbUpSkin", icon:"thumbIcon", textPadding:0}; public static const WIDTH:Number = 15; protected static const DOWN_ARROW_STYLES:Object = {disabledSkin:"downArrowDisabledSkin", downSkin:"downArrowDownSkin", overSkin:"downArrowOverSkin", upSkin:"downArrowUpSkin", repeatDelay:"repeatDelay", repeatInterval:"repeatInterval"}; protected static const UP_ARROW_STYLES:Object = {disabledSkin:"upArrowDisabledSkin", downSkin:"upArrowDownSkin", overSkin:"upArrowOverSkin", upSkin:"upArrowUpSkin", repeatDelay:"repeatDelay", repeatInterval:"repeatInterval"}; protected static const TRACK_STYLES:Object = {disabledSkin:"trackDisabledSkin", downSkin:"trackDownSkin", overSkin:"trackOverSkin", upSkin:"trackUpSkin", repeatDelay:"repeatDelay", repeatInterval:"repeatInterval"}; private static var defaultStyles:Object = {downArrowDisabledSkin:"ScrollArrowDown_disabledSkin", downArrowDownSkin:"ScrollArrowDown_downSkin", downArrowOverSkin:"ScrollArrowDown_overSkin", downArrowUpSkin:"ScrollArrowDown_upSkin", thumbDisabledSkin:"ScrollThumb_upSkin", thumbDownSkin:"ScrollThumb_downSkin", thumbOverSkin:"ScrollThumb_overSkin", thumbUpSkin:"ScrollThumb_upSkin", trackDisabledSkin:"ScrollTrack_skin", trackDownSkin:"ScrollTrack_skin", trackOverSkin:"ScrollTrack_skin", trackUpSkin:"ScrollTrack_skin", upArrowDisabledSkin:"ScrollArrowUp_disabledSkin", upArrowDownSkin:"ScrollArrowUp_downSkin", upArrowOverSkin:"ScrollArrowUp_overSkin", upArrowUpSkin:"ScrollArrowUp_upSkin", thumbIcon:"ScrollBar_thumbIcon", repeatDelay:500, repeatInterval:35}; public function ScrollBar(){ _pageSize = 10; _pageScrollSize = 0; _lineScrollSize = 1; _minScrollPosition = 0; _maxScrollPosition = 0; _scrollPosition = 0; _direction = ScrollBarDirection.VERTICAL; inDrag = false; super(); setStyles(); focusEnabled = false; } public function get minScrollPosition():Number{ return (_minScrollPosition); } public function set minScrollPosition(_arg1:Number):void{ setScrollProperties(_pageSize, _arg1, _maxScrollPosition); } public function setScrollPosition(_arg1:Number, _arg2:Boolean=true):void{ var _local3:Number; _local3 = scrollPosition; _scrollPosition = Math.max(_minScrollPosition, Math.min(_maxScrollPosition, _arg1)); if (_local3 == _scrollPosition){ return; }; if (_arg2){ dispatchEvent(new ScrollEvent(_direction, (scrollPosition - _local3), scrollPosition)); }; updateThumb(); } public function set scrollPosition(_arg1:Number):void{ setScrollPosition(_arg1, true); } public function get pageScrollSize():Number{ return (((_pageScrollSize)==0) ? _pageSize : _pageScrollSize); } public function set pageSize(_arg1:Number):void{ if (_arg1 > 0){ _pageSize = _arg1; }; } public function setScrollProperties(_arg1:Number, _arg2:Number, _arg3:Number, _arg4:Number=0):void{ this.pageSize = _arg1; _minScrollPosition = _arg2; _maxScrollPosition = _arg3; if (_arg4 >= 0){ _pageScrollSize = _arg4; }; enabled = (_maxScrollPosition > _minScrollPosition); setScrollPosition(_scrollPosition, false); updateThumb(); } override public function set enabled(_arg1:Boolean):void{ super.enabled = _arg1; downArrow.enabled = (track.enabled = (thumb.enabled = (upArrow.enabled = ((enabled) && ((_maxScrollPosition > _minScrollPosition)))))); updateThumb(); } protected function updateThumb():void{ var _local1:Number; _local1 = ((_maxScrollPosition - _minScrollPosition) + _pageSize); if ((((((track.height <= 12)) || ((_maxScrollPosition <= _minScrollPosition)))) || ((((_local1 == 0)) || (isNaN(_local1)))))){ thumb.height = 12; thumb.visible = false; } else { thumb.height = Math.max(13, ((_pageSize / _local1) * track.height)); thumb.y = (track.y + ((track.height - thumb.height) * ((_scrollPosition - _minScrollPosition) / (_maxScrollPosition - _minScrollPosition)))); thumb.visible = enabled; }; } protected function thumbPressHandler(_arg1:MouseEvent):void{ inDrag = true; thumbScrollOffset = (mouseY - thumb.y); thumb.mouseStateLocked = true; mouseChildren = false; stage.addEventListener(MouseEvent.MOUSE_MOVE, handleThumbDrag, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, thumbReleaseHandler, false, 0, true); } protected function thumbReleaseHandler(_arg1:MouseEvent):void{ inDrag = false; mouseChildren = true; thumb.mouseStateLocked = false; stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleThumbDrag); stage.removeEventListener(MouseEvent.MOUSE_UP, thumbReleaseHandler); } public function set pageScrollSize(_arg1:Number):void{ if (_arg1 >= 0){ _pageScrollSize = _arg1; }; } protected function handleThumbDrag(_arg1:MouseEvent):void{ var _local2:Number; _local2 = Math.max(0, Math.min((track.height - thumb.height), ((mouseY - track.y) - thumbScrollOffset))); setScrollPosition((((_local2 / (track.height - thumb.height)) * (_maxScrollPosition - _minScrollPosition)) + _minScrollPosition)); } public function set direction(_arg1:String):void{ var _local2:Boolean; if (_direction == _arg1){ return; }; _direction = _arg1; if (isLivePreview){ return; }; setScaleY(1); _local2 = (_direction == ScrollBarDirection.HORIZONTAL); if (((_local2) && (componentInspectorSetting))){ if (rotation == 90){ return; }; setScaleX(-1); rotation = -90; }; if (!componentInspectorSetting){ if (((_local2) && ((rotation == 0)))){ rotation = -90; setScaleX(-1); } else { if (((!(_local2)) && ((rotation == -90)))){ rotation = 0; setScaleX(1); }; }; }; invalidate(InvalidationType.SIZE); } public function set lineScrollSize(_arg1:Number):void{ if (_arg1 > 0){ _lineScrollSize = _arg1; }; } override public function get height():Number{ return (((_direction)==ScrollBarDirection.HORIZONTAL) ? super.width : super.height); } protected function scrollPressHandler(_arg1:ComponentEvent):void{ var _local2:Number; var _local3:Number; _arg1.stopImmediatePropagation(); if (_arg1.currentTarget == upArrow){ setScrollPosition((_scrollPosition - _lineScrollSize)); } else { if (_arg1.currentTarget == downArrow){ setScrollPosition((_scrollPosition + _lineScrollSize)); } else { _local2 = (((track.mouseY / track.height) * (_maxScrollPosition - _minScrollPosition)) + _minScrollPosition); _local3 = ((pageScrollSize)==0) ? pageSize : pageScrollSize; if (_scrollPosition < _local2){ setScrollPosition(Math.min(_local2, (_scrollPosition + _local3))); } else { if (_scrollPosition > _local2){ setScrollPosition(Math.max(_local2, (_scrollPosition - _local3))); }; }; }; }; } public function get pageSize():Number{ return (_pageSize); } public function set maxScrollPosition(_arg1:Number):void{ setScrollProperties(_pageSize, _minScrollPosition, _arg1); } public function get scrollPosition():Number{ return (_scrollPosition); } override public function get enabled():Boolean{ return (super.enabled); } override protected function draw():void{ var _local1:Number; if (isInvalid(InvalidationType.SIZE)){ _local1 = super.height; downArrow.move(0, Math.max(upArrow.height, (_local1 - downArrow.height))); track.setSize(WIDTH, Math.max(0, (_local1 - (downArrow.height + upArrow.height)))); updateThumb(); }; if (isInvalid(InvalidationType.STYLES, InvalidationType.STATE)){ setStyles(); }; downArrow.drawNow(); upArrow.drawNow(); track.drawNow(); thumb.drawNow(); validate(); } override protected function configUI():void{ super.configUI(); track = new BaseButton(); track.move(0, 14); track.useHandCursor = false; track.autoRepeat = true; track.focusEnabled = false; addChild(track); thumb = new LabelButton(); thumb.label = ""; thumb.setSize(WIDTH, 15); thumb.move(0, 15); thumb.focusEnabled = false; addChild(thumb); downArrow = new BaseButton(); downArrow.setSize(WIDTH, 14); downArrow.autoRepeat = true; downArrow.focusEnabled = false; addChild(downArrow); upArrow = new BaseButton(); upArrow.setSize(WIDTH, 14); upArrow.move(0, 0); upArrow.autoRepeat = true; upArrow.focusEnabled = false; addChild(upArrow); upArrow.addEventListener(ComponentEvent.BUTTON_DOWN, scrollPressHandler, false, 0, true); downArrow.addEventListener(ComponentEvent.BUTTON_DOWN, scrollPressHandler, false, 0, true); track.addEventListener(ComponentEvent.BUTTON_DOWN, scrollPressHandler, false, 0, true); thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbPressHandler, false, 0, true); enabled = false; } public function get direction():String{ return (_direction); } public function get lineScrollSize():Number{ return (_lineScrollSize); } override public function setSize(_arg1:Number, _arg2:Number):void{ if (_direction == ScrollBarDirection.HORIZONTAL){ super.setSize(_arg2, _arg1); } else { super.setSize(_arg1, _arg2); }; } public function get maxScrollPosition():Number{ return (_maxScrollPosition); } override public function get width():Number{ return (((_direction)==ScrollBarDirection.HORIZONTAL) ? super.height : super.width); } protected function setStyles():void{ copyStylesToChild(downArrow, DOWN_ARROW_STYLES); copyStylesToChild(thumb, THUMB_STYLES); copyStylesToChild(track, TRACK_STYLES); copyStylesToChild(upArrow, UP_ARROW_STYLES); } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls
Section 179
//ScrollBarDirection (fl.controls.ScrollBarDirection) package fl.controls { public class ScrollBarDirection { public static const HORIZONTAL:String = "horizontal"; public static const VERTICAL:String = "vertical"; } }//package fl.controls
Section 180
//ScrollPolicy (fl.controls.ScrollPolicy) package fl.controls { public class ScrollPolicy { public static const OFF:String = "off"; public static const ON:String = "on"; public static const AUTO:String = "auto"; } }//package fl.controls
Section 181
//SelectableList (fl.controls.SelectableList) package fl.controls { import flash.events.*; import flash.display.*; import fl.managers.*; import fl.core.*; import fl.controls.listClasses.*; import fl.events.*; import fl.data.*; import flash.utils.*; import fl.containers.*; import flash.ui.*; public class SelectableList extends BaseScrollPane implements IFocusManagerComponent { protected var invalidItems:Dictionary; protected var renderedItems:Dictionary; protected var listHolder:Sprite; protected var _allowMultipleSelection:Boolean;// = false protected var lastCaretIndex:int;// = -1 protected var _selectedIndices:Array; protected var availableCellRenderers:Array; protected var list:Sprite; protected var caretIndex:int;// = -1 protected var updatedRendererStyles:Object; protected var preChangeItems:Array; protected var activeCellRenderers:Array; protected var rendererStyles:Object; protected var _verticalScrollPosition:Number; protected var _dataProvider:DataProvider; protected var _horizontalScrollPosition:Number; private var collectionItemImport:SimpleCollectionItem; protected var _selectable:Boolean;// = true private static var defaultStyles:Object = {skin:"List_skin", cellRenderer:CellRenderer, contentPadding:null, disabledAlpha:null}; public static var createAccessibilityImplementation:Function; public function SelectableList(){ _allowMultipleSelection = false; _selectable = true; caretIndex = -1; lastCaretIndex = -1; super(); activeCellRenderers = []; availableCellRenderers = []; invalidItems = new Dictionary(true); renderedItems = new Dictionary(true); _selectedIndices = []; if (dataProvider == null){ dataProvider = new DataProvider(); }; verticalScrollPolicy = ScrollPolicy.AUTO; rendererStyles = {}; updatedRendererStyles = {}; } protected function drawList():void{ } public function set allowMultipleSelection(_arg1:Boolean):void{ if (_arg1 == _allowMultipleSelection){ return; }; _allowMultipleSelection = _arg1; if (((!(_arg1)) && ((_selectedIndices.length > 1)))){ _selectedIndices = [_selectedIndices.pop()]; invalidate(InvalidationType.DATA); }; } public function sortItemsOn(_arg1:String, _arg2:Object=null){ return (_dataProvider.sortOn(_arg1, _arg2)); } public function removeItemAt(_arg1:uint):Object{ return (_dataProvider.removeItemAt(_arg1)); } public function get selectedItem():Object{ return (((_selectedIndices.length)==0) ? null : _dataProvider.getItemAt(selectedIndex)); } override protected function keyDownHandler(_arg1:KeyboardEvent):void{ if (!selectable){ return; }; switch (_arg1.keyCode){ case Keyboard.UP: case Keyboard.DOWN: case Keyboard.END: case Keyboard.HOME: case Keyboard.PAGE_UP: case Keyboard.PAGE_DOWN: moveSelectionVertically(_arg1.keyCode, ((_arg1.shiftKey) && (_allowMultipleSelection)), ((_arg1.ctrlKey) && (_allowMultipleSelection))); _arg1.stopPropagation(); break; case Keyboard.LEFT: case Keyboard.RIGHT: moveSelectionHorizontally(_arg1.keyCode, ((_arg1.shiftKey) && (_allowMultipleSelection)), ((_arg1.ctrlKey) && (_allowMultipleSelection))); _arg1.stopPropagation(); break; }; } public function get selectable():Boolean{ return (_selectable); } public function itemToCellRenderer(_arg1:Object):ICellRenderer{ var _local2:*; var _local3:ICellRenderer; if (_arg1 != null){ for (_local2 in activeCellRenderers) { _local3 = (activeCellRenderers[_local2] as ICellRenderer); if (_local3.data == _arg1){ return (_local3); }; }; }; return (null); } public function getNextIndexAtLetter(_arg1:String, _arg2:int=-1):int{ var _local3:int; var _local4:Number; var _local5:Number; var _local6:Object; var _local7:String; if (length == 0){ return (-1); }; _arg1 = _arg1.toUpperCase(); _local3 = (length - 1); _local4 = 0; while (_local4 < _local3) { _local5 = ((_arg2 + 1) + _local4); if (_local5 > (length - 1)){ _local5 = (_local5 - length); }; _local6 = getItemAt(_local5); if (_local6 == null){ break; }; _local7 = itemToLabel(_local6); if (_local7 == null){ } else { if (_local7.charAt(0).toUpperCase() == _arg1){ return (_local5); }; }; _local4++; }; return (-1); } public function invalidateList():void{ _invalidateList(); invalidate(InvalidationType.DATA); } override public function set enabled(_arg1:Boolean):void{ super.enabled = _arg1; list.mouseChildren = _enabled; } public function get selectedIndices():Array{ return (_selectedIndices.concat()); } public function set selectable(_arg1:Boolean):void{ if (_arg1 == _selectable){ return; }; if (!_arg1){ selectedIndices = []; }; _selectable = _arg1; } public function itemToLabel(_arg1:Object):String{ return (_arg1["label"]); } public function addItemAt(_arg1:Object, _arg2:uint):void{ _dataProvider.addItemAt(_arg1, _arg2); invalidateList(); } public function replaceItemAt(_arg1:Object, _arg2:uint):Object{ return (_dataProvider.replaceItemAt(_arg1, _arg2)); } protected function handleDataChange(_arg1:DataChangeEvent):void{ var _local2:int; var _local3:int; var _local4:String; var _local5:uint; _local2 = _arg1.startIndex; _local3 = _arg1.endIndex; _local4 = _arg1.changeType; if (_local4 == DataChangeType.INVALIDATE_ALL){ clearSelection(); invalidateList(); } else { if (_local4 == DataChangeType.INVALIDATE){ _local5 = 0; while (_local5 < _arg1.items.length) { invalidateItem(_arg1.items[_local5]); _local5++; }; } else { if (_local4 == DataChangeType.ADD){ _local5 = 0; while (_local5 < _selectedIndices.length) { if (_selectedIndices[_local5] >= _local2){ _selectedIndices[_local5] = (_selectedIndices[_local5] + (_local2 - _local3)); }; _local5++; }; } else { if (_local4 == DataChangeType.REMOVE){ _local5 = 0; while (_local5 < _selectedIndices.length) { if (_selectedIndices[_local5] >= _local2){ if (_selectedIndices[_local5] <= _local3){ delete _selectedIndices[_local5]; } else { _selectedIndices[_local5] = (_selectedIndices[_local5] - ((_local2 - _local3) + 1)); }; }; _local5++; }; } else { if (_local4 == DataChangeType.REMOVE_ALL){ clearSelection(); } else { if (_local4 == DataChangeType.REPLACE){ } else { selectedItems = preChangeItems; preChangeItems = null; }; }; }; }; }; }; invalidate(InvalidationType.DATA); } protected function _invalidateList():void{ availableCellRenderers = []; while (activeCellRenderers.length > 0) { list.removeChild((activeCellRenderers.pop() as DisplayObject)); }; } protected function updateRendererStyles():void{ var _local1:Array; var _local2:uint; var _local3:uint; var _local4:String; _local1 = availableCellRenderers.concat(activeCellRenderers); _local2 = _local1.length; _local3 = 0; while (_local3 < _local2) { if (_local1[_local3].setStyle == null){ } else { for (_local4 in updatedRendererStyles) { _local1[_local3].setStyle(_local4, updatedRendererStyles[_local4]); }; _local1[_local3].drawNow(); }; _local3++; }; updatedRendererStyles = {}; } public function set selectedItem(_arg1:Object):void{ var _local2:int; _local2 = _dataProvider.getItemIndex(_arg1); selectedIndex = _local2; } public function sortItems(... _args){ return (_dataProvider.sort.apply(_dataProvider, _args)); } public function removeAll():void{ _dataProvider.removeAll(); } protected function handleCellRendererChange(_arg1:Event):void{ var _local2:ICellRenderer; var _local3:uint; _local2 = (_arg1.currentTarget as ICellRenderer); _local3 = _local2.listData.index; _dataProvider.invalidateItemAt(_local3); } protected function moveSelectionVertically(_arg1:uint, _arg2:Boolean, _arg3:Boolean):void{ } override protected function setHorizontalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ var _local3:Number; if (_arg1 == _horizontalScrollPosition){ return; }; _local3 = (_arg1 - _horizontalScrollPosition); _horizontalScrollPosition = _arg1; if (_arg2){ dispatchEvent(new ScrollEvent(ScrollBarDirection.HORIZONTAL, _local3, _arg1)); }; } public function scrollToSelected():void{ scrollToIndex(selectedIndex); } public function invalidateItem(_arg1:Object):void{ if (renderedItems[_arg1] == null){ return; }; invalidItems[_arg1] = true; invalidate(InvalidationType.DATA); } protected function handleCellRendererClick(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:uint; var _local4:int; var _local5:int; var _local6:uint; if (!_enabled){ return; }; _local2 = (_arg1.currentTarget as ICellRenderer); _local3 = _local2.listData.index; if (((!(dispatchEvent(new ListEvent(ListEvent.ITEM_CLICK, false, true, _local2.listData.column, _local2.listData.row, _local3, _local2.data)))) || (!(_selectable)))){ return; }; _local4 = selectedIndices.indexOf(_local3); if (!_allowMultipleSelection){ if (_local4 != -1){ return; }; _local2.selected = true; _selectedIndices = [_local3]; lastCaretIndex = (caretIndex = _local3); } else { if (_arg1.shiftKey){ _local6 = ((_selectedIndices.length)>0) ? _selectedIndices[0] : _local3; _selectedIndices = []; if (_local6 > _local3){ _local5 = _local6; while (_local5 >= _local3) { _selectedIndices.push(_local5); _local5--; }; } else { _local5 = _local6; while (_local5 <= _local3) { _selectedIndices.push(_local5); _local5++; }; }; caretIndex = _local3; } else { if (_arg1.ctrlKey){ if (_local4 != -1){ _local2.selected = false; _selectedIndices.splice(_local4, 1); } else { _local2.selected = true; _selectedIndices.push(_local3); }; caretIndex = _local3; } else { _selectedIndices = [_local3]; lastCaretIndex = (caretIndex = _local3); }; }; }; dispatchEvent(new Event(Event.CHANGE)); invalidate(InvalidationType.DATA); } public function get length():uint{ return (_dataProvider.length); } public function get allowMultipleSelection():Boolean{ return (_allowMultipleSelection); } protected function onPreChange(_arg1:DataChangeEvent):void{ switch (_arg1.changeType){ case DataChangeType.REMOVE: case DataChangeType.ADD: case DataChangeType.INVALIDATE: case DataChangeType.REMOVE_ALL: case DataChangeType.REPLACE: case DataChangeType.INVALIDATE_ALL: break; default: preChangeItems = selectedItems; break; }; } public function getRendererStyle(_arg1:String, _arg2:int=-1):Object{ return (rendererStyles[_arg1]); } override protected function setVerticalScrollPosition(_arg1:Number, _arg2:Boolean=false):void{ var _local3:Number; if (_arg1 == _verticalScrollPosition){ return; }; _local3 = (_arg1 - _verticalScrollPosition); _verticalScrollPosition = _arg1; if (_arg2){ dispatchEvent(new ScrollEvent(ScrollBarDirection.VERTICAL, _local3, _arg1)); }; } protected function moveSelectionHorizontally(_arg1:uint, _arg2:Boolean, _arg3:Boolean):void{ } public function set selectedIndices(_arg1:Array):void{ if (!_selectable){ return; }; _selectedIndices = ((_arg1)==null) ? [] : _arg1.concat(); invalidate(InvalidationType.SELECTED); } public function get selectedIndex():int{ return (((_selectedIndices.length)==0) ? -1 : _selectedIndices[(_selectedIndices.length - 1)]); } override protected function draw():void{ super.draw(); } override protected function configUI():void{ super.configUI(); listHolder = new Sprite(); addChild(listHolder); listHolder.scrollRect = contentScrollRect; list = new Sprite(); listHolder.addChild(list); } public function addItem(_arg1:Object):void{ _dataProvider.addItem(_arg1); invalidateList(); } protected function handleCellRendererMouseEvent(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:String; _local2 = (_arg1.target as ICellRenderer); _local3 = ((_arg1.type)==MouseEvent.ROLL_OVER) ? ListEvent.ITEM_ROLL_OVER : ListEvent.ITEM_ROLL_OUT; dispatchEvent(new ListEvent(_local3, false, false, _local2.listData.column, _local2.listData.row, _local2.listData.index, _local2.data)); } public function clearRendererStyle(_arg1:String, _arg2:int=-1):void{ delete rendererStyles[_arg1]; updatedRendererStyles[_arg1] = null; invalidate(InvalidationType.RENDERER_STYLES); } protected function handleCellRendererDoubleClick(_arg1:MouseEvent):void{ var _local2:ICellRenderer; var _local3:uint; if (!_enabled){ return; }; _local2 = (_arg1.currentTarget as ICellRenderer); _local3 = _local2.listData.index; dispatchEvent(new ListEvent(ListEvent.ITEM_DOUBLE_CLICK, false, true, _local2.listData.column, _local2.listData.row, _local3, _local2.data)); } public function get rowCount():uint{ return (0); } public function isItemSelected(_arg1:Object):Boolean{ return ((selectedItems.indexOf(_arg1) > -1)); } public function set dataProvider(_arg1:DataProvider):void{ if (_dataProvider != null){ _dataProvider.removeEventListener(DataChangeEvent.DATA_CHANGE, handleDataChange); _dataProvider.removeEventListener(DataChangeEvent.PRE_DATA_CHANGE, onPreChange); }; _dataProvider = _arg1; _dataProvider.addEventListener(DataChangeEvent.DATA_CHANGE, handleDataChange, false, 0, true); _dataProvider.addEventListener(DataChangeEvent.PRE_DATA_CHANGE, onPreChange, false, 0, true); clearSelection(); invalidateList(); } override protected function drawLayout():void{ super.drawLayout(); contentScrollRect = listHolder.scrollRect; contentScrollRect.width = availableWidth; contentScrollRect.height = availableHeight; listHolder.scrollRect = contentScrollRect; } public function getItemAt(_arg1:uint):Object{ return (_dataProvider.getItemAt(_arg1)); } override protected function initializeAccessibility():void{ if (SelectableList.createAccessibilityImplementation != null){ SelectableList.createAccessibilityImplementation(this); }; } public function scrollToIndex(_arg1:int):void{ } public function removeItem(_arg1:Object):Object{ return (_dataProvider.removeItem(_arg1)); } public function get dataProvider():DataProvider{ return (_dataProvider); } public function set maxHorizontalScrollPosition(_arg1:Number):void{ _maxHorizontalScrollPosition = _arg1; invalidate(InvalidationType.SIZE); } public function setRendererStyle(_arg1:String, _arg2:Object, _arg3:uint=0):void{ if (rendererStyles[_arg1] == _arg2){ return; }; updatedRendererStyles[_arg1] = _arg2; rendererStyles[_arg1] = _arg2; invalidate(InvalidationType.RENDERER_STYLES); } public function invalidateItemAt(_arg1:uint):void{ var _local2:Object; _local2 = _dataProvider.getItemAt(_arg1); if (_local2 != null){ invalidateItem(_local2); }; } public function set selectedItems(_arg1:Array):void{ var _local2:Array; var _local3:uint; var _local4:int; if (_arg1 == null){ selectedIndices = null; return; }; _local2 = []; _local3 = 0; while (_local3 < _arg1.length) { _local4 = _dataProvider.getItemIndex(_arg1[_local3]); if (_local4 != -1){ _local2.push(_local4); }; _local3++; }; selectedIndices = _local2; } public function clearSelection():void{ selectedIndex = -1; } override public function get maxHorizontalScrollPosition():Number{ return (_maxHorizontalScrollPosition); } public function get selectedItems():Array{ var _local1:Array; var _local2:uint; _local1 = []; _local2 = 0; while (_local2 < _selectedIndices.length) { _local1.push(_dataProvider.getItemAt(_selectedIndices[_local2])); _local2++; }; return (_local1); } public function set selectedIndex(_arg1:int):void{ selectedIndices = ((_arg1)==-1) ? null : [_arg1]; } public static function getStyleDefinition():Object{ return (mergeStyles(defaultStyles, BaseScrollPane.getStyleDefinition())); } } }//package fl.controls
Section 182
//TextInput (fl.controls.TextInput) package fl.controls { import flash.events.*; import flash.display.*; import fl.managers.*; import fl.core.*; import fl.events.*; import flash.text.*; import flash.ui.*; public class TextInput extends UIComponent implements IFocusManagerComponent { protected var _html:Boolean;// = false protected var _savedHTML:String; protected var background:DisplayObject; protected var _editable:Boolean;// = true public var textField:TextField; private static var defaultStyles:Object = {upSkin:"TextInput_upSkin", disabledSkin:"TextInput_disabledSkin", focusRectSkin:null, focusRectPadding:null, textFormat:null, disabledTextFormat:null, textPadding:0, embedFonts:false}; public static var createAccessibilityImplementation:Function; public function TextInput(){ _editable = true; _html = false; super(); } override public function drawFocus(_arg1:Boolean):void{ if (focusTarget != null){ focusTarget.drawFocus(_arg1); return; }; super.drawFocus(_arg1); } public function set imeMode(_arg1:String):void{ _imeMode = _arg1; } override protected function isOurFocus(_arg1:DisplayObject):Boolean{ return ((((_arg1 == textField)) || (super.isOurFocus(_arg1)))); } protected function handleKeyDown(_arg1:KeyboardEvent):void{ if (_arg1.keyCode == Keyboard.ENTER){ dispatchEvent(new ComponentEvent(ComponentEvent.ENTER, true)); }; } public function set text(_arg1:String):void{ textField.text = _arg1; _html = false; invalidate(InvalidationType.DATA); invalidate(InvalidationType.STYLES); } protected function updateTextFieldType():void{ textField.type = (((enabled) && (editable))) ? TextFieldType.INPUT : TextFieldType.DYNAMIC; textField.selectable = enabled; } public function get selectionEndIndex():int{ return (textField.selectionEndIndex); } public function get editable():Boolean{ return (_editable); } override protected function focusInHandler(_arg1:FocusEvent):void{ var _local2:IFocusManager; if (_arg1.target == this){ stage.focus = textField; }; _local2 = focusManager; if (((editable) && (_local2))){ _local2.showFocusIndicator = true; if (((textField.selectable) && ((textField.selectionBeginIndex == textField.selectionBeginIndex)))){ setSelection(0, textField.length); }; }; super.focusInHandler(_arg1); if (editable){ setIMEMode(true); }; } public function get selectionBeginIndex():int{ return (textField.selectionBeginIndex); } public function set alwaysShowSelection(_arg1:Boolean):void{ textField.alwaysShowSelection = _arg1; } override public function set enabled(_arg1:Boolean):void{ super.enabled = _arg1; updateTextFieldType(); } protected function setEmbedFont(){ var _local1:Object; _local1 = getStyleValue("embedFonts"); if (_local1 != null){ textField.embedFonts = _local1; }; } public function get horizontalScrollPosition():int{ return (textField.scrollH); } public function set condenseWhite(_arg1:Boolean):void{ textField.condenseWhite = _arg1; } public function set displayAsPassword(_arg1:Boolean):void{ textField.displayAsPassword = _arg1; } public function set horizontalScrollPosition(_arg1:int):void{ textField.scrollH = _arg1; } public function get restrict():String{ return (textField.restrict); } public function get textWidth():Number{ return (textField.textWidth); } public function get textHeight():Number{ return (textField.textHeight); } public function set editable(_arg1:Boolean):void{ _editable = _arg1; updateTextFieldType(); } public function get maxChars():int{ return (textField.maxChars); } public function get length():int{ return (textField.length); } public function getLineMetrics(_arg1:int):TextLineMetrics{ return (textField.getLineMetrics(_arg1)); } public function get imeMode():String{ return (_imeMode); } override protected function focusOutHandler(_arg1:FocusEvent):void{ super.focusOutHandler(_arg1); if (editable){ setIMEMode(false); }; } public function set htmlText(_arg1:String):void{ if (_arg1 == ""){ text = ""; return; }; _html = true; _savedHTML = _arg1; textField.htmlText = _arg1; invalidate(InvalidationType.DATA); invalidate(InvalidationType.STYLES); } public function get text():String{ return (textField.text); } override public function get enabled():Boolean{ return (super.enabled); } public function get condenseWhite():Boolean{ return (textField.condenseWhite); } public function get alwaysShowSelection():Boolean{ return (textField.alwaysShowSelection); } override protected function draw():void{ var _local1:Object; if (isInvalid(InvalidationType.STYLES, InvalidationType.STATE)){ drawTextFormat(); drawBackground(); _local1 = getStyleValue("embedFonts"); if (_local1 != null){ textField.embedFonts = _local1; }; invalidate(InvalidationType.SIZE, false); }; if (isInvalid(InvalidationType.SIZE)){ drawLayout(); }; super.draw(); } protected function handleTextInput(_arg1:TextEvent):void{ _arg1.stopPropagation(); dispatchEvent(new TextEvent(TextEvent.TEXT_INPUT, true, false, _arg1.text)); } override protected function configUI():void{ super.configUI(); tabChildren = true; textField = new TextField(); addChild(textField); updateTextFieldType(); textField.addEventListener(TextEvent.TEXT_INPUT, handleTextInput, false, 0, true); textField.addEventListener(Event.CHANGE, handleChange, false, 0, true); textField.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown, false, 0, true); } public function setSelection(_arg1:int, _arg2:int):void{ textField.setSelection(_arg1, _arg2); } public function get displayAsPassword():Boolean{ return (textField.displayAsPassword); } public function appendText(_arg1:String):void{ textField.appendText(_arg1); } public function set restrict(_arg1:String):void{ if (((componentInspectorSetting) && ((_arg1 == "")))){ _arg1 = null; }; textField.restrict = _arg1; } public function get htmlText():String{ return (textField.htmlText); } protected function drawBackground():void{ var _local1:DisplayObject; var _local2:String; _local1 = background; _local2 = (enabled) ? "upSkin" : "disabledSkin"; background = getDisplayObjectInstance(getStyleValue(_local2)); if (background == null){ return; }; addChildAt(background, 0); if (((((!((_local1 == null))) && (!((_local1 == background))))) && (contains(_local1)))){ removeChild(_local1); }; } override public function setFocus():void{ stage.focus = textField; } protected function drawLayout():void{ var _local1:Number; _local1 = Number(getStyleValue("textPadding")); if (background != null){ background.width = width; background.height = height; }; textField.width = (width - (2 * _local1)); textField.height = (height - (2 * _local1)); textField.x = (textField.y = _local1); } public function set maxChars(_arg1:int):void{ textField.maxChars = _arg1; } public function get maxHorizontalScrollPosition():int{ return (textField.maxScrollH); } protected function drawTextFormat():void{ var _local1:Object; var _local2:TextFormat; var _local3:TextFormat; _local1 = UIComponent.getStyleDefinition(); _local2 = (enabled) ? (_local1.defaultTextFormat as TextFormat) : (_local1.defaultDisabledTextFormat as TextFormat); textField.setTextFormat(_local2); _local3 = (getStyleValue((enabled) ? "textFormat" : "disabledTextFormat") as TextFormat); if (_local3 != null){ textField.setTextFormat(_local3); } else { _local3 = _local2; }; textField.defaultTextFormat = _local3; setEmbedFont(); if (_html){ textField.htmlText = _savedHTML; }; } protected function handleChange(_arg1:Event):void{ _arg1.stopPropagation(); dispatchEvent(new Event(Event.CHANGE, true)); } public static function getStyleDefinition():Object{ return (defaultStyles); } } }//package fl.controls
Section 183
//ComponentShim (fl.core.ComponentShim) package fl.core { import flash.display.*; public dynamic class ComponentShim extends MovieClip { } }//package fl.core
Section 184
//InvalidationType (fl.core.InvalidationType) package fl.core { public class InvalidationType { public static const SIZE:String = "size"; public static const ALL:String = "all"; public static const DATA:String = "data"; public static const SCROLL:String = "scroll"; public static const STATE:String = "state"; public static const STYLES:String = "styles"; public static const SELECTED:String = "selected"; public static const RENDERER_STYLES:String = "rendererStyles"; } }//package fl.core
Section 185
//UIComponent (fl.core.UIComponent) package fl.core { import flash.events.*; import flash.display.*; import fl.managers.*; import fl.events.*; import flash.text.*; import flash.system.*; import flash.utils.*; public class UIComponent extends Sprite { protected var _enabled:Boolean;// = true private var _mouseFocusEnabled:Boolean;// = true protected var startHeight:Number; protected var _height:Number; protected var _oldIMEMode:String;// = null protected var startWidth:Number; public var focusTarget:IFocusManagerComponent; protected var errorCaught:Boolean;// = false protected var uiFocusRect:DisplayObject; protected var _width:Number; public var version:String;// = "3.0.0.15" protected var isFocused:Boolean;// = false protected var callLaterMethods:Dictionary; private var _focusEnabled:Boolean;// = true private var tempText:TextField; protected var invalidateFlag:Boolean;// = false protected var _inspector:Boolean;// = false protected var sharedStyles:Object; protected var invalidHash:Object; protected var isLivePreview:Boolean;// = false protected var _imeMode:String;// = null protected var instanceStyles:Object; protected var _x:Number; protected var _y:Number; public static var inCallLaterPhase:Boolean = false; private static var defaultStyles:Object = {focusRectSkin:"focusRectSkin", focusRectPadding:2, textFormat:new TextFormat("_sans", 11, 0, false, false, false, "", "", TextFormatAlign.LEFT, 0, 0, 0, 0), disabledTextFormat:new TextFormat("_sans", 11, 0x999999, false, false, false, "", "", TextFormatAlign.LEFT, 0, 0, 0, 0), defaultTextFormat:new TextFormat("_sans", 11, 0, false, false, false, "", "", TextFormatAlign.LEFT, 0, 0, 0, 0), defaultDisabledTextFormat:new TextFormat("_sans", 11, 0x999999, false, false, false, "", "", TextFormatAlign.LEFT, 0, 0, 0, 0)}; public static var createAccessibilityImplementation:Function; private static var focusManagers:Dictionary = new Dictionary(false); public function UIComponent(){ version = "3.0.0.15"; isLivePreview = false; invalidateFlag = false; _enabled = true; isFocused = false; _focusEnabled = true; _mouseFocusEnabled = true; _imeMode = null; _oldIMEMode = null; errorCaught = false; _inspector = false; super(); instanceStyles = {}; sharedStyles = {}; invalidHash = {}; callLaterMethods = new Dictionary(); StyleManager.registerInstance(this); configUI(); invalidate(InvalidationType.ALL); tabEnabled = (this is IFocusManagerComponent); focusRect = false; if (tabEnabled){ addEventListener(FocusEvent.FOCUS_IN, focusInHandler); addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler); addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); }; initializeFocusManager(); addEventListener(Event.ENTER_FRAME, hookAccessibility, false, 0, true); } public function drawFocus(_arg1:Boolean):void{ var _local2:Number; isFocused = _arg1; if (((!((uiFocusRect == null))) && (contains(uiFocusRect)))){ removeChild(uiFocusRect); uiFocusRect = null; }; if (_arg1){ uiFocusRect = (getDisplayObjectInstance(getStyleValue("focusRectSkin")) as Sprite); if (uiFocusRect == null){ return; }; _local2 = Number(getStyleValue("focusRectPadding")); uiFocusRect.x = -(_local2); uiFocusRect.y = -(_local2); uiFocusRect.width = (width + (_local2 * 2)); uiFocusRect.height = (height + (_local2 * 2)); addChildAt(uiFocusRect, 0); }; } private function callLaterDispatcher(_arg1:Event):void{ var _local2:Dictionary; var _local3:Object; if (_arg1.type == Event.ADDED_TO_STAGE){ removeEventListener(Event.ADDED_TO_STAGE, callLaterDispatcher); stage.addEventListener(Event.RENDER, callLaterDispatcher, false, 0, true); stage.invalidate(); return; }; _arg1.target.removeEventListener(Event.RENDER, callLaterDispatcher); if (stage == null){ addEventListener(Event.ADDED_TO_STAGE, callLaterDispatcher, false, 0, true); return; }; inCallLaterPhase = true; _local2 = callLaterMethods; for (_local3 in _local2) { _local3(); delete _local2[_local3]; }; inCallLaterPhase = false; } private function addedHandler(_arg1:Event):void{ removeEventListener("addedToStage", addedHandler); initializeFocusManager(); } protected function getStyleValue(_arg1:String):Object{ return (((instanceStyles[_arg1])==null) ? sharedStyles[_arg1] : instanceStyles[_arg1]); } protected function isOurFocus(_arg1:DisplayObject):Boolean{ return ((_arg1 == this)); } override public function get scaleX():Number{ return ((width / startWidth)); } override public function get scaleY():Number{ return ((height / startHeight)); } override public function set height(_arg1:Number):void{ if (_height == _arg1){ return; }; setSize(width, _arg1); } protected function keyDownHandler(_arg1:KeyboardEvent):void{ } protected function focusInHandler(_arg1:FocusEvent):void{ var _local2:IFocusManager; if (isOurFocus((_arg1.target as DisplayObject))){ _local2 = focusManager; if (((_local2) && (_local2.showFocusIndicator))){ drawFocus(true); isFocused = true; }; }; } public function setStyle(_arg1:String, _arg2:Object):void{ if ((((instanceStyles[_arg1] === _arg2)) && (!((_arg2 is TextFormat))))){ return; }; instanceStyles[_arg1] = _arg2; invalidate(InvalidationType.STYLES); } override public function get visible():Boolean{ return (super.visible); } public function get componentInspectorSetting():Boolean{ return (_inspector); } override public function get x():Number{ return ((isNaN(_x)) ? super.x : _x); } override public function get y():Number{ return ((isNaN(_y)) ? super.y : _y); } protected function setIMEMode(_arg1:Boolean){ var enabled = _arg1; if (_imeMode != null){ if (enabled){ IME.enabled = true; _oldIMEMode = IME.conversionMode; try { if (((!(errorCaught)) && (!((IME.conversionMode == IMEConversionMode.UNKNOWN))))){ IME.conversionMode = _imeMode; }; errorCaught = false; } catch(e:Error) { errorCaught = true; throw (new Error(("IME mode not supported: " + _imeMode))); }; } else { if (((!((IME.conversionMode == IMEConversionMode.UNKNOWN))) && (!((_oldIMEMode == IMEConversionMode.UNKNOWN))))){ IME.conversionMode = _oldIMEMode; }; IME.enabled = false; }; }; } public function set enabled(_arg1:Boolean):void{ if (_arg1 == _enabled){ return; }; _enabled = _arg1; invalidate(InvalidationType.STATE); } public function setSharedStyle(_arg1:String, _arg2:Object):void{ if ((((sharedStyles[_arg1] === _arg2)) && (!((_arg2 is TextFormat))))){ return; }; sharedStyles[_arg1] = _arg2; if (instanceStyles[_arg1] == null){ invalidate(InvalidationType.STYLES); }; } protected function keyUpHandler(_arg1:KeyboardEvent):void{ } public function set focusEnabled(_arg1:Boolean):void{ _focusEnabled = _arg1; } override public function set scaleX(_arg1:Number):void{ setSize((startWidth * _arg1), height); } public function get mouseFocusEnabled():Boolean{ return (_mouseFocusEnabled); } override public function set scaleY(_arg1:Number):void{ setSize(width, (startHeight * _arg1)); } protected function getDisplayObjectInstance(_arg1:Object):DisplayObject{ var classDef:Object; var skin = _arg1; classDef = null; if ((skin is Class)){ return ((new (skin) as DisplayObject)); }; if ((skin is DisplayObject)){ (skin as DisplayObject).x = 0; (skin as DisplayObject).y = 0; return ((skin as DisplayObject)); }; try { classDef = getDefinitionByName(skin.toString()); } catch(e:Error) { try { classDef = (loaderInfo.applicationDomain.getDefinition(skin.toString()) as Object); } catch(e:Error) { }; }; if (classDef == null){ return (null); }; return ((new (classDef) as DisplayObject)); } protected function copyStylesToChild(_arg1:UIComponent, _arg2:Object):void{ var _local3:String; for (_local3 in _arg2) { _arg1.setStyle(_local3, getStyleValue(_arg2[_local3])); }; } protected function beforeComponentParameters():void{ } protected function callLater(_arg1:Function):void{ if (inCallLaterPhase){ return; }; callLaterMethods[_arg1] = true; if (stage != null){ stage.addEventListener(Event.RENDER, callLaterDispatcher, false, 0, true); stage.invalidate(); } else { addEventListener(Event.ADDED_TO_STAGE, callLaterDispatcher, false, 0, true); }; } protected function createFocusManager():void{ if (focusManagers[stage] == null){ focusManagers[stage] = new FocusManager(stage); }; } override public function set visible(_arg1:Boolean):void{ var _local2:String; if (super.visible == _arg1){ return; }; super.visible = _arg1; _local2 = (_arg1) ? ComponentEvent.SHOW : ComponentEvent.HIDE; dispatchEvent(new ComponentEvent(_local2, true)); } protected function hookAccessibility(_arg1:Event):void{ removeEventListener(Event.ENTER_FRAME, hookAccessibility); initializeAccessibility(); } public function set componentInspectorSetting(_arg1:Boolean):void{ _inspector = _arg1; if (_inspector){ beforeComponentParameters(); } else { afterComponentParameters(); }; } override public function set x(_arg1:Number):void{ move(_arg1, _y); } public function drawNow():void{ draw(); } override public function set y(_arg1:Number):void{ move(_x, _arg1); } protected function checkLivePreview():Boolean{ var className:String; if (parent == null){ return (false); }; try { className = getQualifiedClassName(parent); } catch(e:Error) { }; return ((className == "fl.livepreview::LivePreviewParent")); } protected function focusOutHandler(_arg1:FocusEvent):void{ if (isOurFocus((_arg1.target as DisplayObject))){ drawFocus(false); isFocused = false; }; } public function set mouseFocusEnabled(_arg1:Boolean):void{ _mouseFocusEnabled = _arg1; } public function getFocus():InteractiveObject{ if (stage){ return (stage.focus); }; return (null); } protected function validate():void{ invalidHash = {}; } override public function get height():Number{ return (_height); } public function invalidate(_arg1:String="all", _arg2:Boolean=true):void{ invalidHash[_arg1] = true; if (_arg2){ this.callLater(draw); }; } public function get enabled():Boolean{ return (_enabled); } protected function getScaleX():Number{ return (super.scaleX); } protected function getScaleY():Number{ return (super.scaleY); } public function get focusEnabled():Boolean{ return (_focusEnabled); } protected function afterComponentParameters():void{ } protected function draw():void{ if (isInvalid(InvalidationType.SIZE, InvalidationType.STYLES)){ if (((isFocused) && (focusManager.showFocusIndicator))){ drawFocus(true); }; }; validate(); } protected function configUI():void{ var _local1:Number; var _local2:Number; var _local3:Number; isLivePreview = checkLivePreview(); _local1 = rotation; rotation = 0; _local2 = super.width; _local3 = super.height; var _local4 = 1; super.scaleY = _local4; super.scaleX = _local4; setSize(_local2, _local3); move(super.x, super.y); rotation = _local1; startWidth = _local2; startHeight = _local3; if (numChildren > 0){ removeChildAt(0); }; } protected function setScaleX(_arg1:Number):void{ super.scaleX = _arg1; } protected function setScaleY(_arg1:Number):void{ super.scaleY = _arg1; } private function initializeFocusManager():void{ if (stage == null){ addEventListener(Event.ADDED_TO_STAGE, addedHandler, false, 0, true); } else { createFocusManager(); }; } public function set focusManager(_arg1:IFocusManager):void{ UIComponent.focusManagers[this] = _arg1; } public function clearStyle(_arg1:String):void{ setStyle(_arg1, null); } protected function isInvalid(_arg1:String, ... _args):Boolean{ if (((invalidHash[_arg1]) || (invalidHash[InvalidationType.ALL]))){ return (true); }; while (_args.length > 0) { if (invalidHash[_args.pop()]){ return (true); }; }; return (false); } public function setSize(_arg1:Number, _arg2:Number):void{ _width = _arg1; _height = _arg2; invalidate(InvalidationType.SIZE); dispatchEvent(new ComponentEvent(ComponentEvent.RESIZE, false)); } override public function set width(_arg1:Number):void{ if (_width == _arg1){ return; }; setSize(_arg1, height); } public function setFocus():void{ if (stage){ stage.focus = this; }; } protected function initializeAccessibility():void{ if (UIComponent.createAccessibilityImplementation != null){ UIComponent.createAccessibilityImplementation(this); }; } public function get focusManager():IFocusManager{ var _local1:DisplayObject; _local1 = this; while (_local1) { if (UIComponent.focusManagers[_local1] != null){ return (IFocusManager(UIComponent.focusManagers[_local1])); }; _local1 = _local1.parent; }; return (null); } override public function get width():Number{ return (_width); } public function move(_arg1:Number, _arg2:Number):void{ _x = _arg1; _y = _arg2; super.x = Math.round(_arg1); super.y = Math.round(_arg2); dispatchEvent(new ComponentEvent(ComponentEvent.MOVE)); } public function validateNow():void{ invalidate(InvalidationType.ALL, false); draw(); } public function getStyle(_arg1:String):Object{ return (instanceStyles[_arg1]); } public static function getStyleDefinition():Object{ return (defaultStyles); } public static function mergeStyles(... _args):Object{ var _local2:Object; var _local3:uint; var _local4:uint; var _local5:Object; var _local6:String; _local2 = {}; _local3 = _args.length; _local4 = 0; while (_local4 < _local3) { _local5 = _args[_local4]; for (_local6 in _local5) { if (_local2[_local6] != null){ } else { _local2[_local6] = _args[_local4][_local6]; }; }; _local4++; }; return (_local2); } } }//package fl.core
Section 186
//DataProvider (fl.data.DataProvider) package fl.data { import flash.events.*; import fl.events.*; public class DataProvider extends EventDispatcher { protected var data:Array; public function DataProvider(_arg1:Object=null){ if (_arg1 == null){ data = []; } else { data = getDataFromObject(_arg1); }; } protected function dispatchPreChangeEvent(_arg1:String, _arg2:Array, _arg3:int, _arg4:int):void{ dispatchEvent(new DataChangeEvent(DataChangeEvent.PRE_DATA_CHANGE, _arg1, _arg2, _arg3, _arg4)); } public function invalidateItemAt(_arg1:int):void{ checkIndex(_arg1, (data.length - 1)); dispatchChangeEvent(DataChangeType.INVALIDATE, [data[_arg1]], _arg1, _arg1); } public function getItemIndex(_arg1:Object):int{ return (data.indexOf(_arg1)); } protected function getDataFromObject(_arg1:Object):Array{ var _local2:Array; var _local3:Array; var _local4:uint; var _local5:Object; var _local6:XML; var _local7:XMLList; var _local8:XML; var _local9:XMLList; var _local10:XML; var _local11:XMLList; var _local12:XML; if ((_arg1 is Array)){ _local3 = (_arg1 as Array); if (_local3.length > 0){ if ((((_local3[0] is String)) || ((_local3[0] is Number)))){ _local2 = []; _local4 = 0; while (_local4 < _local3.length) { _local5 = {label:String(_local3[_local4]), data:_local3[_local4]}; _local2.push(_local5); _local4++; }; return (_local2); }; }; return (_arg1.concat()); //unresolved jump }; if ((_arg1 is DataProvider)){ return (_arg1.toArray()); }; if ((_arg1 is XML)){ _local6 = (_arg1 as XML); _local2 = []; _local7 = _local6.*; for each (_local8 in _local7) { _arg1 = {}; _local9 = _local8.attributes(); for each (_local10 in _local9) { _arg1[_local10.localName()] = _local10.toString(); }; _local11 = _local8.*; for each (_local12 in _local11) { if (_local12.hasSimpleContent()){ _arg1[_local12.localName()] = _local12.toString(); }; }; _local2.push(_arg1); }; return (_local2); //unresolved jump }; throw (new TypeError((("Error: Type Coercion failed: cannot convert " + _arg1) + " to Array or DataProvider."))); } public function removeItemAt(_arg1:uint):Object{ var _local2:Array; checkIndex(_arg1, (data.length - 1)); dispatchPreChangeEvent(DataChangeType.REMOVE, data.slice(_arg1, (_arg1 + 1)), _arg1, _arg1); _local2 = data.splice(_arg1, 1); dispatchChangeEvent(DataChangeType.REMOVE, _local2, _arg1, _arg1); return (_local2[0]); } public function addItem(_arg1:Object):void{ dispatchPreChangeEvent(DataChangeType.ADD, [_arg1], (data.length - 1), (data.length - 1)); data.push(_arg1); dispatchChangeEvent(DataChangeType.ADD, [_arg1], (data.length - 1), (data.length - 1)); } public function sortOn(_arg1:Object, _arg2:Object=null){ var _local3:Array; dispatchPreChangeEvent(DataChangeType.SORT, data.concat(), 0, (data.length - 1)); _local3 = data.sortOn(_arg1, _arg2); dispatchChangeEvent(DataChangeType.SORT, data.concat(), 0, (data.length - 1)); return (_local3); } public function sort(... _args){ var _local2:Array; dispatchPreChangeEvent(DataChangeType.SORT, data.concat(), 0, (data.length - 1)); _local2 = data.sort.apply(data, _args); dispatchChangeEvent(DataChangeType.SORT, data.concat(), 0, (data.length - 1)); return (_local2); } public function addItems(_arg1:Object):void{ addItemsAt(_arg1, data.length); } public function concat(_arg1:Object):void{ addItems(_arg1); } public function clone():DataProvider{ return (new DataProvider(data)); } public function toArray():Array{ return (data.concat()); } public function get length():uint{ return (data.length); } public function addItemAt(_arg1:Object, _arg2:uint):void{ checkIndex(_arg2, data.length); dispatchPreChangeEvent(DataChangeType.ADD, [_arg1], _arg2, _arg2); data.splice(_arg2, 0, _arg1); dispatchChangeEvent(DataChangeType.ADD, [_arg1], _arg2, _arg2); } public function getItemAt(_arg1:uint):Object{ checkIndex(_arg1, (data.length - 1)); return (data[_arg1]); } override public function toString():String{ return ((("DataProvider [" + data.join(" , ")) + "]")); } public function invalidateItem(_arg1:Object):void{ var _local2:uint; _local2 = getItemIndex(_arg1); if (_local2 == -1){ return; }; invalidateItemAt(_local2); } protected function dispatchChangeEvent(_arg1:String, _arg2:Array, _arg3:int, _arg4:int):void{ dispatchEvent(new DataChangeEvent(DataChangeEvent.DATA_CHANGE, _arg1, _arg2, _arg3, _arg4)); } protected function checkIndex(_arg1:int, _arg2:int):void{ if ((((_arg1 > _arg2)) || ((_arg1 < 0)))){ throw (new RangeError((((("DataProvider index (" + _arg1) + ") is not in acceptable range (0 - ") + _arg2) + ")"))); }; } public function addItemsAt(_arg1:Object, _arg2:uint):void{ var _local3:Array; checkIndex(_arg2, data.length); _local3 = getDataFromObject(_arg1); dispatchPreChangeEvent(DataChangeType.ADD, _local3, _arg2, ((_arg2 + _local3.length) - 1)); data.splice.apply(data, [_arg2, 0].concat(_local3)); dispatchChangeEvent(DataChangeType.ADD, _local3, _arg2, ((_arg2 + _local3.length) - 1)); } public function replaceItem(_arg1:Object, _arg2:Object):Object{ var _local3:int; _local3 = getItemIndex(_arg2); if (_local3 != -1){ return (replaceItemAt(_arg1, _local3)); }; return (null); } public function removeItem(_arg1:Object):Object{ var _local2:int; _local2 = getItemIndex(_arg1); if (_local2 != -1){ return (removeItemAt(_local2)); }; return (null); } public function merge(_arg1:Object):void{ var _local2:Array; var _local3:uint; var _local4:uint; var _local5:uint; var _local6:Object; _local2 = getDataFromObject(_arg1); _local3 = _local2.length; _local4 = data.length; dispatchPreChangeEvent(DataChangeType.ADD, data.slice(_local4, data.length), _local4, (this.data.length - 1)); _local5 = 0; while (_local5 < _local3) { _local6 = _local2[_local5]; if (getItemIndex(_local6) == -1){ data.push(_local6); }; _local5++; }; if (data.length > _local4){ dispatchChangeEvent(DataChangeType.ADD, data.slice(_local4, data.length), _local4, (this.data.length - 1)); } else { dispatchChangeEvent(DataChangeType.ADD, [], -1, -1); }; } public function replaceItemAt(_arg1:Object, _arg2:uint):Object{ var _local3:Array; checkIndex(_arg2, (data.length - 1)); _local3 = [data[_arg2]]; dispatchPreChangeEvent(DataChangeType.REPLACE, _local3, _arg2, _arg2); data[_arg2] = _arg1; dispatchChangeEvent(DataChangeType.REPLACE, _local3, _arg2, _arg2); return (_local3[0]); } public function invalidate():void{ dispatchEvent(new DataChangeEvent(DataChangeEvent.DATA_CHANGE, DataChangeType.INVALIDATE_ALL, data.concat(), 0, data.length)); } public function removeAll():void{ var _local1:Array; _local1 = data.concat(); dispatchPreChangeEvent(DataChangeType.REMOVE_ALL, _local1, 0, _local1.length); data = []; dispatchChangeEvent(DataChangeType.REMOVE_ALL, _local1, 0, _local1.length); } } }//package fl.data
Section 187
//SimpleCollectionItem (fl.data.SimpleCollectionItem) package fl.data { public dynamic class SimpleCollectionItem { public var label:String; public var data:String; public function toString():String{ return ((((("[SimpleCollectionItem: " + label) + ",") + data) + "]")); } } }//package fl.data
Section 188
//ComponentEvent (fl.events.ComponentEvent) package fl.events { import flash.events.*; public class ComponentEvent extends Event { public static const HIDE:String = "hide"; public static const BUTTON_DOWN:String = "buttonDown"; public static const MOVE:String = "move"; public static const RESIZE:String = "resize"; public static const ENTER:String = "enter"; public static const LABEL_CHANGE:String = "labelChange"; public static const SHOW:String = "show"; public function ComponentEvent(_arg1:String, _arg2:Boolean=false, _arg3:Boolean=false){ super(_arg1, _arg2, _arg3); } override public function toString():String{ return (formatToString("ComponentEvent", "type", "bubbles", "cancelable")); } override public function clone():Event{ return (new ComponentEvent(type, bubbles, cancelable)); } } }//package fl.events
Section 189
//DataChangeEvent (fl.events.DataChangeEvent) package fl.events { import flash.events.*; public class DataChangeEvent extends Event { protected var _items:Array; protected var _endIndex:uint; protected var _changeType:String; protected var _startIndex:uint; public static const PRE_DATA_CHANGE:String = "preDataChange"; public static const DATA_CHANGE:String = "dataChange"; public function DataChangeEvent(_arg1:String, _arg2:String, _arg3:Array, _arg4:int=-1, _arg5:int=-1):void{ super(_arg1); _changeType = _arg2; _startIndex = _arg4; _items = _arg3; _endIndex = ((_arg5)==-1) ? _startIndex : _arg5; } public function get changeType():String{ return (_changeType); } public function get startIndex():uint{ return (_startIndex); } public function get items():Array{ return (_items); } override public function clone():Event{ return (new DataChangeEvent(type, _changeType, _items, _startIndex, _endIndex)); } override public function toString():String{ return (formatToString("DataChangeEvent", "type", "changeType", "startIndex", "endIndex", "bubbles", "cancelable")); } public function get endIndex():uint{ return (_endIndex); } } }//package fl.events
Section 190
//DataChangeType (fl.events.DataChangeType) package fl.events { public class DataChangeType { public static const ADD:String = "add"; public static const REMOVE:String = "remove"; public static const REMOVE_ALL:String = "removeAll"; public static const CHANGE:String = "change"; public static const REPLACE:String = "replace"; public static const INVALIDATE:String = "invalidate"; public static const INVALIDATE_ALL:String = "invalidateAll"; public static const SORT:String = "sort"; } }//package fl.events
Section 191
//DataGridEvent (fl.events.DataGridEvent) package fl.events { import flash.events.*; public class DataGridEvent extends ListEvent { protected var _itemRenderer:Object; protected var _reason:String; protected var _dataField:String; public static const ITEM_EDIT_BEGIN:String = "itemEditBegin"; public static const ITEM_EDIT_END:String = "itemEditEnd"; public static const ITEM_EDIT_BEGINNING:String = "itemEditBeginning"; public static const HEADER_RELEASE:String = "headerRelease"; public static const ITEM_FOCUS_IN:String = "itemFocusIn"; public static const ITEM_FOCUS_OUT:String = "itemFocusOut"; public static const COLUMN_STRETCH:String = "columnStretch"; public function DataGridEvent(_arg1:String, _arg2:Boolean=false, _arg3:Boolean=false, _arg4:int=-1, _arg5:int=-1, _arg6:Object=null, _arg7:String=null, _arg8:String=null){ super(_arg1, _arg2, _arg3, _arg4, _arg5); _itemRenderer = _arg6; _dataField = _arg7; _reason = _arg8; } public function get reason():String{ return (_reason); } public function set dataField(_arg1:String):void{ _dataField = _arg1; } override public function toString():String{ return (formatToString("DataGridEvent", "type", "bubbles", "cancelable", "columnIndex", "rowIndex", "itemRenderer", "dataField", "reason")); } public function get dataField():String{ return (_dataField); } override public function clone():Event{ return (new DataGridEvent(type, bubbles, cancelable, columnIndex, int(rowIndex), _itemRenderer, _dataField, _reason)); } public function get itemRenderer():Object{ return (_itemRenderer); } } }//package fl.events
Section 192
//DataGridEventReason (fl.events.DataGridEventReason) package fl.events { public final class DataGridEventReason { public static const OTHER:String = "other"; public static const CANCELLED:String = "cancelled"; public static const NEW_COLUMN:String = "newColumn"; public static const NEW_ROW:String = "newRow"; } }//package fl.events
Section 193
//ListEvent (fl.events.ListEvent) package fl.events { import flash.events.*; public class ListEvent extends Event { protected var _index:int; protected var _item:Object; protected var _columnIndex:int; protected var _rowIndex:int; public static const ITEM_DOUBLE_CLICK:String = "itemDoubleClick"; public static const ITEM_ROLL_OUT:String = "itemRollOut"; public static const ITEM_ROLL_OVER:String = "itemRollOver"; public static const ITEM_CLICK:String = "itemClick"; public function ListEvent(_arg1:String, _arg2:Boolean=false, _arg3:Boolean=false, _arg4:int=-1, _arg5:int=-1, _arg6:int=-1, _arg7:Object=null){ super(_arg1, _arg2, _arg3); _rowIndex = _arg5; _columnIndex = _arg4; _index = _arg6; _item = _arg7; } public function get rowIndex():Object{ return (_rowIndex); } public function get index():int{ return (_index); } public function get item():Object{ return (_item); } public function get columnIndex():int{ return (_columnIndex); } override public function clone():Event{ return (new ListEvent(type, bubbles, cancelable, _columnIndex, _rowIndex)); } override public function toString():String{ return (formatToString("ListEvent", "type", "bubbles", "cancelable", "columnIndex", "rowIndex", "index", "item")); } } }//package fl.events
Section 194
//ScrollEvent (fl.events.ScrollEvent) package fl.events { import flash.events.*; public class ScrollEvent extends Event { private var _position:Number; private var _direction:String; private var _delta:Number; public static const SCROLL:String = "scroll"; public function ScrollEvent(_arg1:String, _arg2:Number, _arg3:Number){ super(ScrollEvent.SCROLL, false, false); _direction = _arg1; _delta = _arg2; _position = _arg3; } override public function clone():Event{ return (new ScrollEvent(_direction, _delta, _position)); } public function get position():Number{ return (_position); } override public function toString():String{ return (formatToString("ScrollEvent", "type", "bubbles", "cancelable", "direction", "delta", "position")); } public function get delta():Number{ return (_delta); } public function get direction():String{ return (_direction); } } }//package fl.events
Section 195
//FocusManager (fl.managers.FocusManager) package fl.managers { import flash.events.*; import flash.display.*; import fl.controls.*; import fl.core.*; import flash.text.*; import flash.utils.*; import flash.ui.*; public class FocusManager implements IFocusManager { private var focusableObjects:Dictionary; private var _showFocusIndicator:Boolean;// = true private var defButton:Button; private var focusableCandidates:Array; private var _form:DisplayObjectContainer; private var _defaultButtonEnabled:Boolean;// = true private var activated:Boolean;// = false private var _defaultButton:Button; private var calculateCandidates:Boolean;// = true private var lastFocus:InteractiveObject; private var lastAction:String; public function FocusManager(_arg1:DisplayObjectContainer){ activated = false; calculateCandidates = true; _showFocusIndicator = true; _defaultButtonEnabled = true; super(); focusableObjects = new Dictionary(true); if (_arg1 != null){ _form = _arg1; addFocusables(DisplayObject(_arg1)); _arg1.addEventListener(Event.ADDED, addedHandler); _arg1.addEventListener(Event.REMOVED, removedHandler); activate(); }; } public function get showFocusIndicator():Boolean{ return (_showFocusIndicator); } private function getIndexOfNextObject(_arg1:int, _arg2:Boolean, _arg3:Boolean, _arg4:String):int{ var _local5:int; var _local6:int; var _local7:DisplayObject; var _local8:IFocusManagerGroup; var _local9:int; var _local10:DisplayObject; var _local11:IFocusManagerGroup; _local5 = focusableCandidates.length; _local6 = _arg1; while (true) { if (_arg2){ _arg1--; } else { _arg1++; }; if (_arg3){ if (((_arg2) && ((_arg1 < 0)))){ break; }; if (((!(_arg2)) && ((_arg1 == _local5)))){ break; }; } else { _arg1 = ((_arg1 + _local5) % _local5); if (_local6 == _arg1){ break; }; }; if (isValidFocusCandidate(focusableCandidates[_arg1], _arg4)){ _local7 = DisplayObject(findFocusManagerComponent(focusableCandidates[_arg1])); if ((_local7 is IFocusManagerGroup)){ _local8 = IFocusManagerGroup(_local7); _local9 = 0; while (_local9 < focusableCandidates.length) { _local10 = focusableCandidates[_local9]; if ((_local10 is IFocusManagerGroup)){ _local11 = IFocusManagerGroup(_local10); if ((((_local11.groupName == _local8.groupName)) && (_local11.selected))){ _arg1 = _local9; break; }; }; _local9++; }; }; return (_arg1); }; }; return (_arg1); } public function set form(_arg1:DisplayObjectContainer):void{ _form = _arg1; } private function addFocusables(_arg1:DisplayObject, _arg2:Boolean=false):void{ var focusable:IFocusManagerComponent; var io:InteractiveObject; var doc:DisplayObjectContainer; var i:int; var child:DisplayObject; var o = _arg1; var skipTopLevel = _arg2; if (!skipTopLevel){ if ((o is IFocusManagerComponent)){ focusable = IFocusManagerComponent(o); if (focusable.focusEnabled){ if (((focusable.tabEnabled) && (isTabVisible(o)))){ focusableObjects[o] = true; calculateCandidates = true; }; o.addEventListener(Event.TAB_ENABLED_CHANGE, tabEnabledChangeHandler); o.addEventListener(Event.TAB_INDEX_CHANGE, tabIndexChangeHandler); }; } else { if ((o is InteractiveObject)){ io = (o as InteractiveObject); if (((((io) && (io.tabEnabled))) && ((findFocusManagerComponent(io) == io)))){ focusableObjects[io] = true; calculateCandidates = true; }; io.addEventListener(Event.TAB_ENABLED_CHANGE, tabEnabledChangeHandler); io.addEventListener(Event.TAB_INDEX_CHANGE, tabIndexChangeHandler); }; }; }; if ((o is DisplayObjectContainer)){ doc = DisplayObjectContainer(o); o.addEventListener(Event.TAB_CHILDREN_CHANGE, tabChildrenChangeHandler); if ((((((doc is Stage)) || ((doc.parent is Stage)))) || (doc.tabChildren))){ i = 0; while (i < doc.numChildren) { try { child = doc.getChildAt(i); if (child != null){ addFocusables(doc.getChildAt(i)); }; } catch(error:SecurityError) { }; i = (i + 1); }; }; }; } private function getChildIndex(_arg1:DisplayObjectContainer, _arg2:DisplayObject):int{ return (_arg1.getChildIndex(_arg2)); } private function mouseFocusChangeHandler(_arg1:FocusEvent):void{ if ((_arg1.relatedObject is TextField)){ return; }; _arg1.preventDefault(); } private function focusOutHandler(_arg1:FocusEvent):void{ var _local2:InteractiveObject; _local2 = (_arg1.target as InteractiveObject); } private function isValidFocusCandidate(_arg1:DisplayObject, _arg2:String):Boolean{ var _local3:IFocusManagerGroup; if (!isEnabledAndVisible(_arg1)){ return (false); }; if ((_arg1 is IFocusManagerGroup)){ _local3 = IFocusManagerGroup(_arg1); if (_arg2 == _local3.groupName){ return (false); }; }; return (true); } public function findFocusManagerComponent(_arg1:InteractiveObject):InteractiveObject{ var _local2:InteractiveObject; _local2 = _arg1; while (_arg1) { if ((((_arg1 is IFocusManagerComponent)) && (IFocusManagerComponent(_arg1).focusEnabled))){ return (_arg1); }; _arg1 = _arg1.parent; }; return (_local2); } private function sortFocusableObjectsTabIndex():void{ var _local1:Object; var _local2:InteractiveObject; focusableCandidates = []; for (_local1 in focusableObjects) { _local2 = InteractiveObject(_local1); if (((_local2.tabIndex) && (!(isNaN(Number(_local2.tabIndex)))))){ focusableCandidates.push(_local2); }; }; focusableCandidates.sort(sortByTabIndex); } private function removeFocusables(_arg1:DisplayObject):void{ var _local2:Object; var _local3:DisplayObject; if ((_arg1 is DisplayObjectContainer)){ _arg1.removeEventListener(Event.TAB_CHILDREN_CHANGE, tabChildrenChangeHandler); _arg1.removeEventListener(Event.TAB_INDEX_CHANGE, tabIndexChangeHandler); for (_local2 in focusableObjects) { _local3 = DisplayObject(_local2); if (DisplayObjectContainer(_arg1).contains(_local3)){ if (_local3 == lastFocus){ lastFocus = null; }; _local3.removeEventListener(Event.TAB_ENABLED_CHANGE, tabEnabledChangeHandler); delete focusableObjects[_local2]; calculateCandidates = true; }; }; }; } private function addedHandler(_arg1:Event):void{ var _local2:DisplayObject; _local2 = DisplayObject(_arg1.target); if (_local2.stage){ addFocusables(DisplayObject(_arg1.target)); }; } private function getTopLevelFocusTarget(_arg1:InteractiveObject):InteractiveObject{ while (_arg1 != InteractiveObject(form)) { if ((((((((_arg1 is IFocusManagerComponent)) && (IFocusManagerComponent(_arg1).focusEnabled))) && (IFocusManagerComponent(_arg1).mouseFocusEnabled))) && (UIComponent(_arg1).enabled))){ return (_arg1); }; _arg1 = _arg1.parent; if (_arg1 == null){ break; }; }; return (null); } private function tabChildrenChangeHandler(_arg1:Event):void{ var _local2:DisplayObjectContainer; if (_arg1.target != _arg1.currentTarget){ return; }; calculateCandidates = true; _local2 = DisplayObjectContainer(_arg1.target); if (_local2.tabChildren){ addFocusables(_local2, true); } else { removeFocusables(_local2); }; } public function sendDefaultButtonEvent():void{ defButton.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } public function getFocus():InteractiveObject{ var _local1:InteractiveObject; _local1 = form.stage.focus; return (findFocusManagerComponent(_local1)); } private function isEnabledAndVisible(_arg1:DisplayObject):Boolean{ var _local2:DisplayObjectContainer; var _local3:TextField; var _local4:SimpleButton; _local2 = DisplayObject(form).parent; while (_arg1 != _local2) { if ((_arg1 is UIComponent)){ if (!UIComponent(_arg1).enabled){ return (false); }; } else { if ((_arg1 is TextField)){ _local3 = TextField(_arg1); if ((((_local3.type == TextFieldType.DYNAMIC)) || (!(_local3.selectable)))){ return (false); }; } else { if ((_arg1 is SimpleButton)){ _local4 = SimpleButton(_arg1); if (!_local4.enabled){ return (false); }; }; }; }; if (!_arg1.visible){ return (false); }; _arg1 = _arg1.parent; }; return (true); } public function set defaultButton(_arg1:Button):void{ var _local2:Button; _local2 = (_arg1) ? Button(_arg1) : null; if (_local2 != _defaultButton){ if (_defaultButton){ _defaultButton.emphasized = false; }; if (defButton){ defButton.emphasized = false; }; _defaultButton = _local2; defButton = _local2; if (_local2){ _local2.emphasized = true; }; }; } private function deactivateHandler(_arg1:Event):void{ var _local2:InteractiveObject; _local2 = InteractiveObject(_arg1.target); } public function setFocus(_arg1:InteractiveObject):void{ if ((_arg1 is IFocusManagerComponent)){ IFocusManagerComponent(_arg1).setFocus(); } else { form.stage.focus = _arg1; }; } private function setFocusToNextObject(_arg1:FocusEvent):void{ var _local2:InteractiveObject; if (!hasFocusableObjects()){ return; }; _local2 = getNextFocusManagerComponent(_arg1.shiftKey); if (_local2){ setFocus(_local2); }; } private function hasFocusableObjects():Boolean{ var _local1:Object; for (_local1 in focusableObjects) { return (true); }; return (false); } private function tabIndexChangeHandler(_arg1:Event):void{ calculateCandidates = true; } private function sortFocusableObjects():void{ var _local1:Object; var _local2:InteractiveObject; focusableCandidates = []; for (_local1 in focusableObjects) { _local2 = InteractiveObject(_local1); if (((((_local2.tabIndex) && (!(isNaN(Number(_local2.tabIndex)))))) && ((_local2.tabIndex > 0)))){ sortFocusableObjectsTabIndex(); return; }; focusableCandidates.push(_local2); }; focusableCandidates.sort(sortByDepth); } private function keyFocusChangeHandler(_arg1:FocusEvent):void{ showFocusIndicator = true; if ((((((_arg1.keyCode == Keyboard.TAB)) || ((_arg1.keyCode == 0)))) && (!(_arg1.isDefaultPrevented())))){ setFocusToNextObject(_arg1); _arg1.preventDefault(); }; } private function getIndexOfFocusedObject(_arg1:DisplayObject):int{ var _local2:int; var _local3:int; _local2 = focusableCandidates.length; _local3 = 0; _local3 = 0; while (_local3 < _local2) { if (focusableCandidates[_local3] == _arg1){ return (_local3); }; _local3++; }; return (-1); } public function hideFocus():void{ } private function removedHandler(_arg1:Event):void{ var _local2:int; var _local3:DisplayObject; var _local4:InteractiveObject; _local3 = DisplayObject(_arg1.target); if ((((_local3 is IFocusManagerComponent)) && ((focusableObjects[_local3] == true)))){ if (_local3 == lastFocus){ IFocusManagerComponent(lastFocus).drawFocus(false); lastFocus = null; }; _local3.removeEventListener(Event.TAB_ENABLED_CHANGE, tabEnabledChangeHandler); delete focusableObjects[_local3]; calculateCandidates = true; } else { if ((((_local3 is InteractiveObject)) && ((focusableObjects[_local3] == true)))){ _local4 = (_local3 as InteractiveObject); if (_local4){ if (_local4 == lastFocus){ lastFocus = null; }; delete focusableObjects[_local4]; calculateCandidates = true; }; _local3.addEventListener(Event.TAB_ENABLED_CHANGE, tabEnabledChangeHandler); }; }; removeFocusables(_local3); } private function sortByDepth(_arg1:InteractiveObject, _arg2:InteractiveObject):Number{ var _local3:String; var _local4:String; var _local5:int; var _local6:String; var _local7:String; var _local8:String; var _local9:DisplayObject; var _local10:DisplayObject; _local3 = ""; _local4 = ""; _local8 = "0000"; _local9 = DisplayObject(_arg1); _local10 = DisplayObject(_arg2); while (((!((_local9 == DisplayObject(form)))) && (_local9.parent))) { _local5 = getChildIndex(_local9.parent, _local9); _local6 = _local5.toString(16); if (_local6.length < 4){ _local7 = (_local8.substring(0, (4 - _local6.length)) + _local6); }; _local3 = (_local7 + _local3); _local9 = _local9.parent; }; while (((!((_local10 == DisplayObject(form)))) && (_local10.parent))) { _local5 = getChildIndex(_local10.parent, _local10); _local6 = _local5.toString(16); if (_local6.length < 4){ _local7 = (_local8.substring(0, (4 - _local6.length)) + _local6); }; _local4 = (_local7 + _local4); _local10 = _local10.parent; }; return (((_local3 > _local4)) ? 1 : ((_local3 < _local4)) ? -1 : 0); } public function get defaultButton():Button{ return (_defaultButton); } private function activateHandler(_arg1:Event):void{ var _local2:InteractiveObject; _local2 = InteractiveObject(_arg1.target); if (lastFocus){ if ((lastFocus is IFocusManagerComponent)){ IFocusManagerComponent(lastFocus).setFocus(); } else { form.stage.focus = lastFocus; }; }; lastAction = "ACTIVATE"; } public function showFocus():void{ } public function set defaultButtonEnabled(_arg1:Boolean):void{ _defaultButtonEnabled = _arg1; } public function getNextFocusManagerComponent(_arg1:Boolean=false):InteractiveObject{ var _local2:DisplayObject; var _local3:String; var _local4:int; var _local5:Boolean; var _local6:int; var _local7:int; var _local8:IFocusManagerGroup; if (!hasFocusableObjects()){ return (null); }; if (calculateCandidates){ sortFocusableObjects(); calculateCandidates = false; }; _local2 = form.stage.focus; _local2 = DisplayObject(findFocusManagerComponent(InteractiveObject(_local2))); _local3 = ""; if ((_local2 is IFocusManagerGroup)){ _local8 = IFocusManagerGroup(_local2); _local3 = _local8.groupName; }; _local4 = getIndexOfFocusedObject(_local2); _local5 = false; _local6 = _local4; if (_local4 == -1){ if (_arg1){ _local4 = focusableCandidates.length; }; _local5 = true; }; _local7 = getIndexOfNextObject(_local4, _arg1, _local5, _local3); return (findFocusManagerComponent(focusableCandidates[_local7])); } private function mouseDownHandler(_arg1:MouseEvent):void{ var _local2:InteractiveObject; if (_arg1.isDefaultPrevented()){ return; }; _local2 = getTopLevelFocusTarget(InteractiveObject(_arg1.target)); if (!_local2){ return; }; showFocusIndicator = false; if (((((!((_local2 == lastFocus))) || ((lastAction == "ACTIVATE")))) && (!((_local2 is TextField))))){ setFocus(_local2); }; lastAction = "MOUSEDOWN"; } private function isTabVisible(_arg1:DisplayObject):Boolean{ var _local2:DisplayObjectContainer; _local2 = _arg1.parent; while (((((_local2) && (!((_local2 is Stage))))) && (!(((_local2.parent) && ((_local2.parent is Stage))))))) { if (!_local2.tabChildren){ return (false); }; _local2 = _local2.parent; }; return (true); } public function get nextTabIndex():int{ return (0); } private function keyDownHandler(_arg1:KeyboardEvent):void{ if (_arg1.keyCode == Keyboard.TAB){ lastAction = "KEY"; if (calculateCandidates){ sortFocusableObjects(); calculateCandidates = false; }; }; if (((((((defaultButtonEnabled) && ((_arg1.keyCode == Keyboard.ENTER)))) && (defaultButton))) && (defButton.enabled))){ sendDefaultButtonEvent(); }; } private function focusInHandler(_arg1:FocusEvent):void{ var _local2:InteractiveObject; var _local3:Button; _local2 = InteractiveObject(_arg1.target); if (form.contains(_local2)){ lastFocus = findFocusManagerComponent(InteractiveObject(_local2)); if ((lastFocus is Button)){ _local3 = Button(lastFocus); if (defButton){ defButton.emphasized = false; defButton = _local3; _local3.emphasized = true; }; } else { if (((defButton) && (!((defButton == _defaultButton))))){ defButton.emphasized = false; defButton = _defaultButton; _defaultButton.emphasized = true; }; }; }; } private function tabEnabledChangeHandler(_arg1:Event):void{ var _local2:InteractiveObject; var _local3:Boolean; calculateCandidates = true; _local2 = InteractiveObject(_arg1.target); _local3 = (focusableObjects[_local2] == true); if (_local2.tabEnabled){ if (((!(_local3)) && (isTabVisible(_local2)))){ if (!(_local2 is IFocusManagerComponent)){ _local2.focusRect = false; }; focusableObjects[_local2] = true; }; } else { if (_local3){ delete focusableObjects[_local2]; }; }; } public function set showFocusIndicator(_arg1:Boolean):void{ _showFocusIndicator = _arg1; } public function get form():DisplayObjectContainer{ return (_form); } private function sortByTabIndex(_arg1:InteractiveObject, _arg2:InteractiveObject):int{ return (((_arg1.tabIndex > _arg2.tabIndex)) ? 1 : ((_arg1.tabIndex < _arg2.tabIndex)) ? -1 : sortByDepth(_arg1, _arg2)); } public function activate():void{ if (activated){ return; }; form.stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, mouseFocusChangeHandler, false, 0, true); form.stage.addEventListener(FocusEvent.KEY_FOCUS_CHANGE, keyFocusChangeHandler, false, 0, true); form.addEventListener(FocusEvent.FOCUS_IN, focusInHandler, true); form.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler, true); form.stage.addEventListener(Event.ACTIVATE, activateHandler, false, 0, true); form.stage.addEventListener(Event.DEACTIVATE, deactivateHandler, false, 0, true); form.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); form.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true); activated = true; if (lastFocus){ setFocus(lastFocus); }; } public function deactivate():void{ form.stage.removeEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, mouseFocusChangeHandler); form.stage.removeEventListener(FocusEvent.KEY_FOCUS_CHANGE, keyFocusChangeHandler); form.removeEventListener(FocusEvent.FOCUS_IN, focusInHandler, true); form.removeEventListener(FocusEvent.FOCUS_OUT, focusOutHandler, true); form.stage.removeEventListener(Event.ACTIVATE, activateHandler); form.stage.removeEventListener(Event.DEACTIVATE, deactivateHandler); form.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); form.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true); activated = false; } public function get defaultButtonEnabled():Boolean{ return (_defaultButtonEnabled); } } }//package fl.managers
Section 196
//IFocusManager (fl.managers.IFocusManager) package fl.managers { import flash.display.*; import fl.controls.*; public interface IFocusManager { function getFocus():InteractiveObject; function deactivate():void; function set defaultButton(_arg1:Button):void; function set showFocusIndicator(_arg1:Boolean):void; function get defaultButtonEnabled():Boolean; function get nextTabIndex():int; function get defaultButton():Button; function get showFocusIndicator():Boolean; function setFocus(_arg1:InteractiveObject):void; function activate():void; function showFocus():void; function set defaultButtonEnabled(_arg1:Boolean):void; function hideFocus():void; function findFocusManagerComponent(_arg1:InteractiveObject):InteractiveObject; function getNextFocusManagerComponent(_arg1:Boolean=false):InteractiveObject; } }//package fl.managers
Section 197
//IFocusManagerComponent (fl.managers.IFocusManagerComponent) package fl.managers { public interface IFocusManagerComponent { function set focusEnabled(_arg1:Boolean):void; function drawFocus(_arg1:Boolean):void; function setFocus():void; function get focusEnabled():Boolean; function get tabEnabled():Boolean; function get tabIndex():int; function get mouseFocusEnabled():Boolean; } }//package fl.managers
Section 198
//IFocusManagerGroup (fl.managers.IFocusManagerGroup) package fl.managers { public interface IFocusManagerGroup { function set groupName(_arg1:String):void; function set selected(_arg1:Boolean):void; function get groupName():String; function get selected():Boolean; } }//package fl.managers
Section 199
//StyleManager (fl.managers.StyleManager) package fl.managers { import fl.core.*; import flash.text.*; import flash.utils.*; public class StyleManager { private var globalStyles:Object; private var classToDefaultStylesDict:Dictionary; private var styleToClassesHash:Object; private var classToStylesDict:Dictionary; private var classToInstancesDict:Dictionary; private static var _instance:StyleManager; public function StyleManager(){ styleToClassesHash = {}; classToInstancesDict = new Dictionary(true); classToStylesDict = new Dictionary(true); classToDefaultStylesDict = new Dictionary(true); globalStyles = UIComponent.getStyleDefinition(); } public static function clearComponentStyle(_arg1:Object, _arg2:String):void{ var _local3:Class; var _local4:Object; _local3 = getClassDef(_arg1); _local4 = getInstance().classToStylesDict[_local3]; if (((!((_local4 == null))) && (!((_local4[_arg2] == null))))){ delete _local4[_arg2]; invalidateComponentStyle(_local3, _arg2); }; } private static function getClassDef(_arg1:Object):Class{ var component = _arg1; if ((component is Class)){ return ((component as Class)); }; try { return ((getDefinitionByName(getQualifiedClassName(component)) as Class)); } catch(e:Error) { if ((component is UIComponent)){ try { return ((component.loaderInfo.applicationDomain.getDefinition(getQualifiedClassName(component)) as Class)); } catch(e:Error) { }; }; }; return (null); } public static function clearStyle(_arg1:String):void{ setStyle(_arg1, null); } public static function setComponentStyle(_arg1:Object, _arg2:String, _arg3:Object):void{ var _local4:Class; var _local5:Object; _local4 = getClassDef(_arg1); _local5 = getInstance().classToStylesDict[_local4]; if (_local5 == null){ _local5 = (getInstance().classToStylesDict[_local4] = {}); }; if (_local5 == _arg3){ return; }; _local5[_arg2] = _arg3; invalidateComponentStyle(_local4, _arg2); } private static function setSharedStyles(_arg1:UIComponent):void{ var _local2:StyleManager; var _local3:Class; var _local4:Object; var _local5:String; _local2 = getInstance(); _local3 = getClassDef(_arg1); _local4 = _local2.classToDefaultStylesDict[_local3]; for (_local5 in _local4) { _arg1.setSharedStyle(_local5, getSharedStyle(_arg1, _local5)); }; } public static function getComponentStyle(_arg1:Object, _arg2:String):Object{ var _local3:Class; var _local4:Object; _local3 = getClassDef(_arg1); _local4 = getInstance().classToStylesDict[_local3]; return (((_local4)==null) ? null : _local4[_arg2]); } private static function getInstance(){ if (_instance == null){ _instance = new (StyleManager); }; return (_instance); } private static function invalidateComponentStyle(_arg1:Class, _arg2:String):void{ var _local3:Dictionary; var _local4:Object; var _local5:UIComponent; _local3 = getInstance().classToInstancesDict[_arg1]; if (_local3 == null){ return; }; for (_local4 in _local3) { _local5 = (_local4 as UIComponent); if (_local5 == null){ } else { _local5.setSharedStyle(_arg2, getSharedStyle(_local5, _arg2)); }; }; } private static function invalidateStyle(_arg1:String):void{ var _local2:Dictionary; var _local3:Object; _local2 = getInstance().styleToClassesHash[_arg1]; if (_local2 == null){ return; }; for (_local3 in _local2) { invalidateComponentStyle(Class(_local3), _arg1); }; } public static function registerInstance(_arg1:UIComponent):void{ var inst:StyleManager; var classDef:Class; var target:Class; var defaultStyles:Object; var styleToClasses:Object; var n:String; var instance = _arg1; inst = getInstance(); classDef = getClassDef(instance); if (classDef == null){ return; }; if (inst.classToInstancesDict[classDef] == null){ inst.classToInstancesDict[classDef] = new Dictionary(true); target = classDef; while (defaultStyles == null) { if (target["getStyleDefinition"] != null){ defaultStyles = target["getStyleDefinition"](); break; }; try { target = (instance.loaderInfo.applicationDomain.getDefinition(getQualifiedSuperclassName(target)) as Class); } catch(err:Error) { try { target = (getDefinitionByName(getQualifiedSuperclassName(target)) as Class); } catch(e:Error) { defaultStyles = UIComponent.getStyleDefinition(); break; }; }; }; styleToClasses = inst.styleToClassesHash; for (n in defaultStyles) { if (styleToClasses[n] == null){ styleToClasses[n] = new Dictionary(true); }; styleToClasses[n][classDef] = true; }; inst.classToDefaultStylesDict[classDef] = defaultStyles; inst.classToStylesDict[classDef] = {}; }; inst.classToInstancesDict[classDef][instance] = true; setSharedStyles(instance); } public static function getStyle(_arg1:String):Object{ return (getInstance().globalStyles[_arg1]); } private static function getSharedStyle(_arg1:UIComponent, _arg2:String):Object{ var _local3:Class; var _local4:StyleManager; var _local5:Object; _local3 = getClassDef(_arg1); _local4 = getInstance(); _local5 = _local4.classToStylesDict[_local3][_arg2]; if (_local5 != null){ return (_local5); }; _local5 = _local4.globalStyles[_arg2]; if (_local5 != null){ return (_local5); }; return (_local4.classToDefaultStylesDict[_local3][_arg2]); } public static function setStyle(_arg1:String, _arg2:Object):void{ var _local3:Object; _local3 = getInstance().globalStyles; if ((((_local3[_arg1] === _arg2)) && (!((_arg2 is TextFormat))))){ return; }; _local3[_arg1] = _arg2; invalidateStyle(_arg1); } } }//package fl.managers
Section 200
//CreditsShowCommand (game.controller.CreditsShowCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class CreditsShowCommand extends SimpleCommand implements ICommand { public function CreditsShowCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var creditsView:CreditsView = new CreditsView(); appMed.getViewContainer().addChild(creditsView); var creditsMed:CreditsMediator = new CreditsMediator(creditsView); facade.registerMediator(creditsMed); } } }//package game.controller
Section 201
//EndGameCommand (game.controller.EndGameCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class EndGameCommand extends SimpleCommand implements ICommand { public function EndGameCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.endGame(); var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); gameMed.destroy(); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var mainMenuView:MainMenuView = new MainMenuView(); appMed.getViewContainer().addChild(mainMenuView); var mainMenuMed:MainMenuMediator = new MainMenuMediator(mainMenuView); facade.registerMediator(mainMenuMed); } } }//package game.controller
Section 202
//InitializeCommand (game.controller.InitializeCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class InitializeCommand extends SimpleCommand implements ICommand { public function InitializeCommand(){ super(); } override public function execute(note:INotification):void{ var appView:AppView = new AppView(); ApplicationFacade.getInstance().viewContainer.addChild(appView); var appMed:AppMediator = new AppMediator(appView); facade.registerMediator(appMed); var mainMenuView:MainMenuView = new MainMenuView(); appMed.getViewContainer().addChild(mainMenuView); var mainMenuMed:MainMenuMediator = new MainMenuMediator(mainMenuView); facade.registerMediator(mainMenuMed); var logoView:LogoView = new LogoView(); appMed.getViewContainer().addChild(logoView); var logoMed:LogoMediator = new LogoMediator(logoView); facade.registerMediator(logoMed); } } }//package game.controller
Section 203
//InstructionsShowCommand (game.controller.InstructionsShowCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class InstructionsShowCommand extends SimpleCommand implements ICommand { public function InstructionsShowCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var instructionsView:InstructionsView = new InstructionsView(); appMed.getViewContainer().addChild(instructionsView); var instructionsMed:InstructionsMediator = new InstructionsMediator(instructionsView); facade.registerMediator(instructionsMed); } } }//package game.controller
Section 204
//LevelCompleteCommand (game.controller.LevelCompleteCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class LevelCompleteCommand extends SimpleCommand implements ICommand { public function LevelCompleteCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelComplete(); } } }//package game.controller
Section 205
//LevelEndCommand (game.controller.LevelEndCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; import caurina.transitions.*; public class LevelEndCommand extends SimpleCommand implements ICommand { public function LevelEndCommand(){ super(); } override public function execute(note:INotification):void{ Tweener.removeAllTweens(); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelEnd(); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_SELECT); } } }//package game.controller
Section 206
//LevelNextCommand (game.controller.LevelNextCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class LevelNextCommand extends SimpleCommand implements ICommand { public function LevelNextCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.nextLevel(); } } }//package game.controller
Section 207
//LevelSelectCommand (game.controller.LevelSelectCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class LevelSelectCommand extends SimpleCommand implements ICommand { public function LevelSelectCommand(){ super(); } override public function execute(note:INotification):void{ var levelSelectView:LevelSelectView = new LevelSelectView(); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); appMed.getViewContainer().addChild(levelSelectView); var levelSelectMed:LevelSelectMediator = new LevelSelectMediator(levelSelectView); facade.registerMediator(levelSelectMed); } } }//package game.controller
Section 208
//LevelStartCommand (game.controller.LevelStartCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.model.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class LevelStartCommand extends SimpleCommand implements ICommand { public function LevelStartCommand(){ super(); } override public function execute(note:INotification):void{ var levelSelectMed:LevelSelectMediator = (facade.retrieveMediator(LevelSelectMediator.NAME) as LevelSelectMediator); if (levelSelectMed){ levelSelectMed.destroy(); }; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.startLevel((note.getBody() as uint)); } } }//package game.controller
Section 209
//MouseDrawEndCommand (game.controller.MouseDrawEndCommand) package game.controller { import org.puremvc.as3.interfaces.*; import core.*; import org.puremvc.as3.patterns.command.*; public class MouseDrawEndCommand extends SimpleCommand implements ICommand { public function MouseDrawEndCommand(){ super(); } override public function execute(note:INotification):void{ GameEngine.getInstance().checkIntersections((note.getBody() as Line)); } } }//package game.controller
Section 210
//MouseDrawStartCommand (game.controller.MouseDrawStartCommand) package game.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.command.*; public class MouseDrawStartCommand extends SimpleCommand implements ICommand { public function MouseDrawStartCommand(){ super(); } override public function execute(not:INotification):void{ } } }//package game.controller
Section 211
//OptionsShowCommand (game.controller.OptionsShowCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class OptionsShowCommand extends SimpleCommand implements ICommand { public function OptionsShowCommand(){ super(); } override public function execute(note:INotification):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var optionsView:OptionsView = new OptionsView(); appMed.getViewContainer().addChild(optionsView); var optionsMed:OptionsMediator = new OptionsMediator(optionsView); facade.registerMediator(optionsMed); } } }//package game.controller
Section 212
//StartGameCommand (game.controller.StartGameCommand) package game.controller { import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.command.*; import game.view.*; public class StartGameCommand extends SimpleCommand implements ICommand { public function StartGameCommand(){ super(); } override public function execute(note:INotification):void{ var gameProxy:GameProxy = new GameProxy(); GameProxy.OPEN_LEVELS = note.getBody(); facade.registerProxy(gameProxy); var gameView:GameView = new GameView(); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); appMed.getViewContainer().addChild(gameView); var gameMed:GameMediator = new GameMediator(gameView); facade.registerMediator(gameMed); gameProxy.startGame(); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_SELECT); notesProxy.push(AppProxy.INSTRUCTIONS_SHOW); } } }//package game.controller
Section 213
//StartupCommand (game.controller.StartupCommand) package game.controller { import org.puremvc.as3.interfaces.*; import flash.display.*; import game.model.*; import org.puremvc.as3.patterns.command.*; public class StartupCommand extends SimpleCommand implements ICommand { public function StartupCommand(){ super(); } override public function execute(note:INotification):void{ var container:Sprite = note.getBody().container; var appProxy:AppProxy = new AppProxy(); facade.registerProxy(appProxy); appProxy.startApp(); } } }//package game.controller
Section 214
//AppProxy (game.model.AppProxy) package game.model { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.*; import flash.display.*; import flash.media.*; import game.controller.*; import org.puremvc.as3.patterns.proxy.*; import flash.net.*; import flash.system.*; import caurina.transitions.properties.*; import game.view.*; public class AppProxy extends Proxy implements IProxy { public var agi; private var sharedObject:SharedObject; public var completeLevels:Array; private var devKey:String;// = "81e402f6d18cfd00bc230089f5128a2a" public var sndTransform:SoundTransform; private var loader:Loader; public var musicEnabled:Boolean; public var musicChannel:SoundChannel; private var music:Sound; private var notesProxy:NotesProxy; public var shadowsEnabled:Boolean; private var gameKey:String;// = "splitter" public var soundEnabled:Boolean; private var embedAssets:GameAssets; public static const NAME:String = "AppProxy"; public static const START_GAME:String = "StartGame"; public static const INITIALIZE:String = "Initialize"; public static const INSTRUCTIONS_HIDE:String = "InstructionsHide"; public static const OPTIONS_SHOW:String = "OptionsShow"; public static const OPTIONS_HIDE:String = "OptionsHide"; public static const CREDITS_HIDE:String = "CreditsHide"; public static const HOST:String = "http://www.king.com/games/splitter/"; public static const CREDITS_SHOW:String = "CreditsShow"; public static const INSTRUCTIONS_SHOW:String = "InstructionsShow"; public static const DEBUG:Boolean = false; public static const END_GAME:String = "EndGame"; public static const LEVEL_CREATE:String = "LevelCreate"; public static const SAVE_SCORE_SCRIPT:String = "save_score.php"; public function AppProxy():void{ super(NAME); init(); } private function coreAssetsInitHandler(e:Event):void{ var embedAssets:GameAssets = GameAssets.getInstance(); embedAssets.addEventListener(Event.INIT, assetsInitHandler); embedAssets.init(); } private function loadComplete(e:Event):void{ agi = e.currentTarget.content; ApplicationFacade.getInstance().agiContainer.addChild(agi); agi.init(devKey, gameKey, null, true); } private function init():void{ facade.registerCommand(INITIALIZE, InitializeCommand); facade.registerCommand(START_GAME, StartGameCommand); facade.registerCommand(END_GAME, EndGameCommand); facade.registerCommand(INSTRUCTIONS_SHOW, InstructionsShowCommand); facade.registerCommand(CREDITS_SHOW, CreditsShowCommand); facade.registerCommand(OPTIONS_SHOW, OptionsShowCommand); notesProxy = new NotesProxy(); facade.registerProxy(notesProxy); sharedObject = SharedObject.getLocal("gameData"); shadowsEnabled = true; soundEnabled = true; musicEnabled = true; if (sharedObject.data.shadowsEnabled != undefined){ shadowsEnabled = sharedObject.data.shadowsEnabled; }; if (sharedObject.data.soundEnabled != undefined){ soundEnabled = sharedObject.data.soundEnabled; }; if (sharedObject.data.musicEnabled != undefined){ musicEnabled = sharedObject.data.musicEnabled; }; sndTransform = new SoundTransform(); updateSoundOptions(); completeLevels = sharedObject.data.completeLevels; if (completeLevels == null){ completeLevels = []; }; } public function startApp():void{ var coreAssets:CoreAssets = CoreAssets.getInstance(); coreAssets.addEventListener(Event.INIT, coreAssetsInitHandler); coreAssets.init(); } public function flushLevels():void{ var level:GameLevel; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var levels:Array = gameProxy.getLevels(); completeLevels = []; var i:uint; while (i < levels.length) { level = levels[i]; if (level.status == GameLevel.STATUS_COMPLETE){ completeLevels.push({id:level.id, bonuses:level.collectedBonuses, time:level.time}); }; i++; }; sharedObject.data.completeLevels = completeLevels; sharedObject.flush(); } private function initArmorScores():void{ var agi_url:String = "http://agi.armorgames.com/assets/agi/AGI.swf"; Security.allowDomain(agi_url); var urlRequest:URLRequest = new URLRequest(agi_url); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); loader.load(urlRequest); } public function clearProgress():void{ completeLevels = []; sharedObject.data.completeLevels = completeLevels; sharedObject.flush(); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); if (gameProxy){ gameProxy.initLevels(); }; } public function logoComplete():void{ var volume:Number = (musicEnabled) ? 0.5 : 0; var musicTransform:SoundTransform = new SoundTransform(volume); musicChannel = music.play(0, 100000, musicTransform); } private function editorInitHandler(e:Event):void{ var embedAssets:GameAssets = GameAssets.getInstance(); embedAssets.addEventListener(Event.INIT, assetsInitHandler); embedAssets.init(); } private function initMusic():void{ var musicClass:Class = GameAssets.getInstance().getAssetClass("island2"); music = new (musicClass); } private function assetsInitHandler(e:Event=null):void{ ColorShortcuts.init(); SoundShortcuts.init(); initMusic(); initArmorScores(); notesProxy.push(INITIALIZE); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); } public function flushOptions():void{ sharedObject.data.shadowsEnabled = shadowsEnabled; sharedObject.data.soundEnabled = soundEnabled; sharedObject.data.musicEnabled = musicEnabled; updateSoundOptions(); sharedObject.flush(); } private function updateSoundOptions():void{ sndTransform.volume = (soundEnabled) ? 1 : 0; } } }//package game.model
Section 215
//GameAssets (game.model.GameAssets) package game.model { import flash.events.*; import flash.display.*; import flash.system.*; public class GameAssets extends EventDispatcher { private var Assets:Class; private var appDomain:ApplicationDomain; private static var instance:GameAssets; public function GameAssets():void{ Assets = GameAssets_Assets; super(); } public function init():void{ var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetsInitHandler); loader.loadBytes(new Assets()); } private function assetsInitHandler(e:Event):void{ appDomain = e.target.content.loaderInfo.applicationDomain; dispatchEvent(new Event(Event.INIT)); } public function getAssetClass(name:String):Class{ if (!appDomain.hasDefinition(name)){ trace((("*Error*: There is no definition of class '" + name) + "'")); return (null); }; return ((appDomain.getDefinition(name) as Class)); } public static function getInstance():GameAssets{ if (!instance){ instance = new (GameAssets); }; return (instance); } } }//package game.model
Section 216
//GameAssets_Assets (game.model.GameAssets_Assets) package game.model { import mx.core.*; public class GameAssets_Assets extends ByteArrayAsset { } }//package game.model
Section 217
//GameLevel (game.model.GameLevel) package game.model { import core.*; import core.objects.*; public class GameLevel extends Level { public var collectedBonuses:uint; public var timeScore:int; public var totalBonuses:uint; public var time:uint; public var cuts:uint; public var status:String; public var bonusScore:int; public var score:int; public var name:String; public var id:uint; public static const STATUS_INCOMPLETE:String = "StatusIncomplete"; public static const STATUS_COMPLETE:String = "StatusComplete"; public function GameLevel(id:uint, def:String, cuts:uint, name:String):void{ this.id = id; this.cuts = cuts; this.name = name; super(def); init(); } public function complete(time:int, bonuses:int):void{ status = STATUS_COMPLETE; this.time = time; collectedBonuses = bonuses; timeScore = Math.floor((((60 * 40) - time) / 40)); if (timeScore < 0){ timeScore = 0; }; bonusScore = (collectedBonuses * 10); score = (timeScore + bonusScore); } private function init():void{ totalBonuses = 0; collectedBonuses = 0; status = STATUS_INCOMPLETE; time = 0; countBonuses(); } private function countBonuses():void{ var objDef:String; var props:Array; var objects:Array = def.split(" "); var i:uint; while (i < objects.length) { objDef = objects[i]; props = objDef.split("_"); switch (props[0]){ case BonusDef.NAME: totalBonuses++; break; }; i++; }; } } }//package game.model
Section 218
//GameProxy (game.model.GameProxy) package game.model { import org.puremvc.as3.interfaces.*; import core.*; import game.view.components.*; import flash.display.*; import core.events.*; import game.controller.*; import org.puremvc.as3.patterns.proxy.*; import game.view.*; import flash.utils.*; import ascb.util.*; import com.midasplayer.*; public class GameProxy extends Proxy implements IProxy { public var currentLevel:GameLevel; private var collectedBonuses:int; private var availableLevels:Array; public var cutsLeft:uint; private var notesProxy:NotesProxy; private var prevTime:int; private var engine:GameEngine; private var recorderProxy:RecorderProxy; private var startScore:uint; public var openLevels:uint; private var levels:Array; private var levelTime:int; public static const SPLIT_FAIL:String = "SplitFail"; public static const LEVEL_UPDATE:String = "LevelUpdate"; public static const BONUS_COLLECT:String = "BonusCollect"; public static const NAME:String = "GameProxy"; public static const LEVEL_RESTART_END:String = "LevelRestartEnd"; public static const LEVEL_RESTART_START:String = "LevelRestartStart"; public static const SPLIT_SUCCESS:String = "SplitSuccess"; public static const LEVEL_END:String = "LevelEnd"; public static const LEVEL_START:String = "LevelStart"; public static const LEVEL_COMPLETE:String = "LevelComplete"; public static const LEVEL_NEXT:String = "LevelNext"; public static const LEVEL_SELECT:String = "LevelSelect"; public static var OPEN_LEVELS:Boolean = false; public function GameProxy():void{ super(NAME); init(); } private function splitSuccessHandler(e:CoreEvent):void{ cutsLeft--; notesProxy.push(GameEngine.SPLIT_SUCCESS); } public function getCutsLeft():uint{ return (cutsLeft); } private function updateAvailableLevels():void{ var level:GameLevel; var opLevs:uint = openLevels; var i:uint; while (i < levels.length) { level = levels[i]; if (level.status == GameLevel.STATUS_COMPLETE){ opLevs++; }; i++; }; availableLevels = (ArrayUtilities.duplicate(levels) as Array); availableLevels.splice(opLevs, (levels.length - opLevs)); } private function init():void{ if (!facade.hasCommand(LEVEL_SELECT)){ facade.registerCommand(LEVEL_SELECT, LevelSelectCommand); }; if (!facade.hasCommand(LEVEL_START)){ facade.registerCommand(LEVEL_START, LevelStartCommand); }; if (!facade.hasCommand(LEVEL_END)){ facade.registerCommand(LEVEL_END, LevelEndCommand); }; if (!facade.hasCommand(LEVEL_COMPLETE)){ facade.registerCommand(LEVEL_COMPLETE, LevelCompleteCommand); }; if (!facade.hasCommand(LEVEL_NEXT)){ facade.registerCommand(LEVEL_NEXT, LevelNextCommand); }; var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); recorderProxy = new RecorderProxy(); facade.registerProxy(recorderProxy); engine = GameEngine.getInstance(); engine.dispatcher.addEventListener(CoreEvent.LEVEL_COMPLETE, levelCompleteHandler); engine.dispatcher.addEventListener(CoreEvent.LEVEL_RESTART_END, levelRestartEndHandler); engine.dispatcher.addEventListener(GameEngine.SPLIT_SUCCESS, splitSuccessHandler); engine.dispatcher.addEventListener(GameEngine.SPLIT_FAIL, splitFailHandler); engine.dispatcher.addEventListener(CoreEvent.BONUS_COLLECT, bonusCollectHandler); engine.dispatcher.addEventListener(CoreEvent.UPDATE, levelUpdateHandler); } public function mouseDrawEnd():void{ recorderProxy.mouseDrawEnd(); } public function getCurrentLevel():GameLevel{ return (currentLevel); } private function levelUpdateHandler(e:CoreEvent):void{ levelTime++; notesProxy.push(LEVEL_UPDATE); } public function getTotalBonuses():uint{ var level:GameLevel; var totalBonuses:uint; var i:uint; while (i < levels.length) { level = levels[i]; totalBonuses = (totalBonuses + level.collectedBonuses); i++; }; return (totalBonuses); } public function getLevelIndex(levelId:uint):int{ var level:GameLevel; var i:uint; while (i < levels.length) { level = levels[i]; if (level.id == levelId){ return (i); }; i++; }; return (-1); } public function initLevels():void{ var i:uint; var level:GameLevel; var clevId:uint; levels = []; levels.push(new GameLevel(0, "e_340_455_5 p_150_205_20 r_150_325_0_200_200_0 r_150_450_2_200_50_0 b_190_213_5 ", 10, "Hello, world!")); levels.push(new GameLevel(1, "e_500_455_5 p_300_315_20 c_150_60_2_10 c_250_160_2_10 c_100_160_1_20 r_300_405_1_50_140_0 b_420_385_5 j_125_110_150_60_100_160 j_175_160_250_160_100_160 ", 2, "Hello, joints")); levels.push(new GameLevel(2, "e_32_455_5 p_493_127_20 r_174_260_2_15_200_0 r_494_317_2_15_314_0 r_329_155_0_380_13_0 b_329_326_5 ", 2, "Slope")); levels.push(new GameLevel(3, "e_486_455_5 p_33_339_20 r_87_405_2_308_15_30 c_305_325_2_12 r_305_423_1_20_98_0 c_114_218_1_33 b_450_455_5 j_305_358_305_325_305_390 j_23_353_32_345_14_361 ", 1, "Gates")); levels.push(new GameLevel(4, "e_197_176_5 p_117_391_20 r_262_419_0_331_15_0 r_101_450_0_28_50_0 r_424_451_0_30_50_0 c_263_449_1_25 c_356_70_2_13 c_355_154_1_40 b_142_266_5 j_356_110_356_66_356_153 ", 2, "Catapult")); levels.push(new GameLevel(5, "e_100_420_5 p_364_236_20 r_200_192_0_70_153_0 r_272_278_2_214_19_0 r_352_263_2_50_18_30 b_279_418_5 j_295_179_225_123_365_234 ", 2, "Grapple")); levels.push(new GameLevel(6, "e_80_455_5 p_360_385_20 r_350_415_1_300_20_0 r_240_450_0_40_50_0 r_460_450_0_40_50_0 b_130_455_5 ", 3, "Table")); levels.push(new GameLevel(7, "e_110_455_5 p_60_144_20 r_314_174_2_520_20_0 r_125_139_1_10_50_0 r_165_139_1_10_50_0 r_205_139_1_10_50_0 r_245_139_1_10_50_0 r_285_139_1_10_50_0 r_325_139_1_10_50_0 r_365_139_1_10_50_0 r_405_139_1_10_50_0 r_445_139_1_10_50_0 r_485_139_1_10_50_0 r_517_116_1_10_50_-30 r_97_313_2_259_20_34 c_525_207_1_20 b_30_230_5 j_425_194_325_180_525_207 j_539_193_551_178_526_207 ", 2, "Domino")); levels.push(new GameLevel(8, "e_240_455_5 p_450_160_20 r_450_200_0_150_40_0 r_450_340_0_150_40_0 c_350_100_2_5 c_550_100_2_5 c_350_240_2_5 c_550_240_2_5 b_280_455_5 j_373_145_350_100_395_190 j_528_145_550_100_505_190 j_373_285_350_240_395_330 j_528_285_550_240_505_330 ", 4, "Balconies")); levels.push(new GameLevel(9, "e_280_437_5 p_201_215_20 r_315_245_0_300_20_0 r_434_215_0_40_40_0 r_173_305_0_15_100_0 r_458_305_0_15_100_0 r_315_365_0_300_20_0 r_308_425_0_15_100_0 r_323_425_0_15_100_0 b_280_305_5 ", 5, "Stack")); levels.push(new GameLevel(10, "e_60_455_5 p_300_315_20 b_120_455_5 r_300_405_1_50_140_0 c_150_60_2_10 c_250_160_2_10 c_100_160_1_25 j_125_110_150_60_100_160 j_175_160_250_160_100_160 ", 2, "How u doin, joints?")); levels.push(new GameLevel(11, "e_520_455_5 p_290_220_20 r_290_110_2_200_20_0 c_95_110_1_20 c_250_220_1_20 c_330_220_1_20 c_370_220_1_20 b_413_293_5 j_153_110_210_110_95_110 j_250_165_250_110_250_220 j_290_165_290_110_290_220 j_330_165_330_110_330_220 j_370_165_370_110_370_220 ", 3, "Pendulum")); levels.push(new GameLevel(12, "e_430_415_5 p_64_54_20 r_71_149_2_200_20_55 r_209_74_2_200_20_-15 r_285_265_0_560_20_0 r_70_375_2_40_200_0 r_380_375_2_40_200_0 r_480_375_2_40_200_0 c_24_28_1_20 c_74_96_1_20 c_110_38_1_20 c_162_51_1_20 b_430_373_5 ", 4, "Pit")); levels.push(new GameLevel(13, "e_320_455_5 p_60_360_20 r_65_465_0_120_20_0 r_60_388_0_100_15_0 c_20_445_1_10 c_100_445_1_10 c_260_440_2_10 b_260_380_5 j_20_418_20_445_20_390 j_38_418_20_445_55_390 j_83_418_100_445_65_390 j_100_418_100_445_100_390 j_60_375_60_360_60_390 ", 4, "Driving school")); levels.push(new GameLevel(14, "e_25_425_5 p_549_350_20 r_45_460_2_80_30_0 r_150_460_2_70_30_0 r_250_460_2_70_30_0 r_350_460_2_70_30_0 r_465_460_2_100_30_0 r_507_410_2_170_20_-30 c_20_100_1_15 c_60_100_1_15 c_100_100_1_15 c_140_100_1_15 c_240_100_2_10 b_250_430_5 j_190_100_240_100_140_100 j_150_100_240_100_60_100 j_170_100_240_100_100_100 j_130_100_240_100_20_100 j_560_363_549_350_571_375 ", 5, "Road's repair")); levels.push(new GameLevel(15, "e_30_455_5 p_294_255_20 r_293_375_0_100_200_0 b_105_405_5 ", 1, "Only one")); levels.push(new GameLevel(16, "e_550_400_5 p_50_400_20 r_290_110_2_570_20_0 r_65_190_0_80_40_0 r_185_190_0_80_40_0 r_305_190_0_80_40_0 r_415_190_0_80_40_0 r_290_430_2_570_20_0 r_143_423_2_50_10_-5 r_273_423_2_50_10_-5 r_415_423_2_50_10_-5 b_305_395_5 j_65_150_65_110_65_190 j_185_150_185_110_185_190 j_304_150_304_110_304_190 j_416_150_416_110_416_190 ", 4, "Rocks")); levels.push(new GameLevel(17, "e_550_400_5 p_50_100_20 r_250_30_2_20_20_0 r_450_30_2_20_20_0 r_350_220_0_100_320_0 r_350_435_2_100_80_0 c_150_100_2_10 b_500_400_5 j_283_53_250_30_315_75 j_418_53_450_30_385_75 j_100_100_150_100_50_100 ", 3, "Wall")); levels.push(new GameLevel(18, "e_30_455_5 p_155_385_20 c_300_450_2_25 r_300_415_1_350_20_0 r_435_385_0_40_40_0 b_235_385_5 j_435_400_435_385_435_415 ", 2, "Swing")); levels.push(new GameLevel(19, "e_46_182_5 p_553_150_20 r_250_40_2_20_20_0 r_250_180_0_300_20_0 r_150_270_0_70_100_0 r_350_270_0_70_100_0 r_460_190_2_100_20_0 r_533_186_2_100_20_-5 b_42_135_5 b_54_62_5 j_250_112_250_40_250_183 j_150_211_150_181_150_241 j_350_211_350_181_350_241 ", 5, "Elevator")); levels.push(new GameLevel(20, "e_24_453_5 p_267_452_20 r_324_188_2_10_200_0 r_412_155_0_20_300_0 r_141_438_2_197_19_30 b_90_376_5 j_366_100_324_100_408_99 j_366_151_323_129_409_173 j_367_204_325_223_408_184 j_364_273_322_273_406_273 ", 3, "Pusher")); levels.push(new GameLevel(21, "e_550_338_5 p_190_145_20 r_140_232_0_171_130_0 r_140_306_2_169_20_0 c_90_145_1_20 r_360_240_2_200_10_10 r_512_258_2_112_10_0 b_412_321_5 j_140_135_90_135_190_135 j_140_155_90_155_190_155 ", 3, "Connections")); levels.push(new GameLevel(22, "e_545_434_5 p_140_177_20 c_325_254_2_10 c_355_254_2_10 r_343_145_0_200_20_0 r_109_465_2_210_20_0 r_515_465_2_120_20_0 r_64_442_2_130_19_20 r_114_212_2_128_19_-10 b_329_438_5 j_323_199_323_254_323_144 j_354_200_354_255_354_144 ", 2, "Bridge")); levels.push(new GameLevel(23, "e_295_240_5 p_295_110_20 r_295_340_2_250_20_0 r_295_230_0_250_200_0 ", 3, "Core")); levels.push(new GameLevel(24, "e_404_455_5 p_279_454_20 r_238_315_2_200_20_0 r_144_247_0_64_117_0 b_344_456_5 ", 3, "The last one")); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var completeLevels:Array = appProxy.completeLevels; i = 0; while (i < completeLevels.length) { clevId = completeLevels[i].id; level = levels[clevId]; level.complete(completeLevels[i].time, completeLevels[i].bonuses); i++; }; openLevels = (OPEN_LEVELS) ? levels.length : 3; updateAvailableLevels(); } private function processLevelComplete():void{ var levelCompleteView:LevelCompleteView = new LevelCompleteView(); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); appMed.getViewContainer().addChild(levelCompleteView); var levelCompleteMed:LevelCompleteMediator = new LevelCompleteMediator(levelCompleteView); facade.registerMediator(levelCompleteMed); } private function levelCompleteHandler(e:CoreEvent):void{ notesProxy.push(LEVEL_COMPLETE); } private function levelRestartEndHandler(e:CoreEvent):void{ notesProxy.push(LEVEL_RESTART_END); notesProxy.push(LEVEL_START, currentLevel.id); } public function levelRestartStart():void{ GameEngine.getInstance().levelRestartStart(); } private function bonusCollectHandler(e:CoreEvent):void{ collectedBonuses++; } public function levelEnd():void{ GameEngine.getInstance().levelAbort(); } public function startLevel(num:uint):void{ recorderProxy.startRecord(); collectedBonuses = 0; levelTime = 0; var level:GameLevel = getLevel(num); cutsLeft = level.cuts; currentLevel = level; var engine:GameEngine = GameEngine.getInstance(); engine.levelStart(level); prevTime = getTimer(); } private function getLevel(id:uint):GameLevel{ return (levels[id]); } public function nextLevel():void{ engine.levelAbort(); var index:uint = getLevelIndex(currentLevel.id); if (index < (levels.length - 1)){ notesProxy.push(LEVEL_START, (index + 1)); } else { notesProxy.push(LEVEL_END); }; } private function splitFailHandler(e:CoreEvent):void{ notesProxy.push(GameEngine.SPLIT_FAIL); } private function processGameComplete():void{ var gameCompleteView:GameCompleteView = new GameCompleteView(); var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); appMed.getViewContainer().addChild(gameCompleteView); var gameCompleteMed:GameCompleteMediator = new GameCompleteMediator(gameCompleteView); facade.registerMediator(gameCompleteMed); } public function getScore():int{ var level:GameLevel; var totalScore:int; var totalBonuses:uint; var totalTime:uint; var i:uint; while (i < levels.length) { level = levels[i]; totalScore = (totalScore + level.score); i++; }; return (totalScore); } public function levelComplete():void{ var completeLevels:uint; var level:GameLevel; if (collectedBonuses >= currentLevel.collectedBonuses){ currentLevel.complete(levelTime, collectedBonuses); }; var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var i:uint; while (i < levels.length) { level = levels[i]; if (level.status == GameLevel.STATUS_COMPLETE){ completeLevels++; }; i++; }; trace("isHome: ", KingAPI.isHome); if (KingAPI.isHome){ KingAPI.submitLevel(completeLevels); }; if (Factory.VERSION_KONG){ Factory.kongregate.scores.submit(getScore()); Factory.kongregate.stats.submit("LevelsCompleted", completeLevels); Factory.kongregate.stats.submit("StarsCollected", getStarsCollected()); }; updateAvailableLevels(); appProxy.flushLevels(); if (completeLevels == levels.length){ processGameComplete(); } else { processLevelComplete(); }; } private function getStarsCollected():int{ var level:GameLevel; var starsCollected:uint; var i:uint; while (i < levels.length) { level = levels[i]; if (level.status == GameLevel.STATUS_COMPLETE){ starsCollected = (starsCollected + level.collectedBonuses); }; i++; }; return (starsCollected); } public function mouseDrawStart():void{ recorderProxy.mouseDrawStart(); } public function getAvailableLevels():Array{ return (availableLevels); } public function getLevels():Array{ return (levels); } public function endGame():void{ GameEngine.getInstance().levelAbort(); engine.dispatcher.removeEventListener(CoreEvent.LEVEL_COMPLETE, levelCompleteHandler); engine.dispatcher.removeEventListener(CoreEvent.LEVEL_RESTART_END, levelRestartEndHandler); engine.dispatcher.removeEventListener(GameEngine.SPLIT_SUCCESS, splitSuccessHandler); engine.dispatcher.removeEventListener(GameEngine.SPLIT_FAIL, splitFailHandler); engine.dispatcher.removeEventListener(CoreEvent.BONUS_COLLECT, bonusCollectHandler); engine.dispatcher.removeEventListener(CoreEvent.UPDATE, levelUpdateHandler); facade.removeProxy(RecorderProxy.NAME); facade.removeProxy(NAME); } public function startGame():void{ initLevels(); startScore = 500; var gameMed:GameMediator = (facade.retrieveMediator(GameMediator.NAME) as GameMediator); var bodiesContainer:Sprite = gameMed.getBodiesContainer(); var jointsContainer:Sprite = gameMed.getJointsContainer(); var playerContainer:Sprite = gameMed.getPlayerContainer(); var debugContainer:Sprite = jointsContainer; var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var engine:GameEngine = GameEngine.getInstance(); var canvas:GameCanvas = new GameCanvas(bodiesContainer, jointsContainer, playerContainer, debugContainer); engine.initialize(CoreAssets.getInstance(), canvas, appProxy.sndTransform); } } }//package game.model
Section 219
//NotesProxy (game.model.NotesProxy) package game.model { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.proxy.*; public class NotesProxy extends Proxy implements IProxy { private var notes:Array; public static const NAME:String = "NotesProxy"; public function NotesProxy():void{ super(NAME); init(); } private function init():void{ notes = []; } private function sendNote():void{ var note:Object = notes[0]; if (note.name != GameProxy.LEVEL_UPDATE){ trace("note!", note.name); }; sendNotification(note.name, note.body); sendNoteComplete(); } public function push(name:String, body:Object=null):void{ var note:Object = {name:name, body:body}; notes.push(note); if (notes.length == 1){ sendNote(); }; } private function sendNoteComplete():void{ notes.splice(0, 1); if (notes.length > 0){ sendNote(); }; } } }//package game.model
Section 220
//RecorderProxy (game.model.RecorderProxy) package game.model { import flash.events.*; import core.*; import flash.display.*; import core.events.*; import org.puremvc.as3.patterns.proxy.*; import flash.net.*; import game.view.*; public class RecorderProxy extends Proxy { private var record:String; private var cursor:Sprite; private var drawEnd:Boolean; private var drawStart:Boolean; private static const SOLUTIONS:Array = ["1helloworld", "2hellojoints", "3slope", "4gates", "5catapult", "6grapple", "7table", "8domino", "9balconies", "10stack", "11howudoinjoints", "12pendulum", "13pit", "14drivingschool", "15roadsrepair", "16onlyone", "17rocks", "18wall", "19swing", "20elevator", "21pusher", "22connections", "23bridge", "24core", "25thelastone"]; public static const RECORD_COMPLETE:String = "RecordComplete"; private static const UPLOAD_SCRIPT:String = "upload.jsp"; public static const NAME:String = "RecorderProxy"; private static const SOLUTION_PREFIX:String = "solution/"; private static const VIEWER:String = "viewer.jsp"; public static const RECORD_ERROR:String = "RecordError"; public function RecorderProxy():void{ super(NAME); init(); } private function updateHandler(e:CoreEvent):void{ record = (record + ((cursor.x + "_") + cursor.y)); if (drawStart){ record = (record + ("_" + "down")); drawStart = false; }; if (drawEnd){ record = (record + ("_" + "up")); drawEnd = false; }; record = (record + " "); } private function loadCompleteHandler(e:Event):void{ var notesProxy:NotesProxy; var response:String; var e = e; notesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); response = (((AppProxy.HOST + VIEWER) + "?w=") + String(e.target.data)); notesProxy.push(RECORD_COMPLETE, response); //unresolved jump var _slot1 = error; response = "An error occured when communicating with server. "; notesProxy.push(RECORD_ERROR, response); } public function getRecord():String{ return (record); } private function ioErrorHandler(e:IOErrorEvent):void{ var response:String = ("An error occurred when attempting to save walkthrough. " + e.text); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(RECORD_ERROR, response); } public function stopRecord():void{ GameEngine.getInstance().dispatcher.removeEventListener(CoreEvent.UPDATE, updateHandler); } public function getSolution(levelId:uint):String{ return ((((AppProxy.HOST + VIEWER) + "?s=") + SOLUTIONS[levelId])); } private function init():void{ } public function mouseDrawEnd():void{ drawEnd = true; } public function saveRecord():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var xml:XML = new XML(<data/> ); var levelXml:XMLList = new XMLList(new XML((("<level>" + ??esc_xelem ) + "</level>"))); levelXml.@name = gameProxy.currentLevel.name; xml.appendChild(levelXml); var recordXml:XMLList = new XMLList(new XML((("<record>" + ??esc_xelem ) + "</record>"))); xml.appendChild(recordXml); var urlReq:URLRequest = new URLRequest((AppProxy.HOST + UPLOAD_SCRIPT)); urlReq.data = xml; urlReq.contentType = "application/x-www-form-urlencoded"; urlReq.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, loadCompleteHandler); loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); navigateToURL(urlReq); } public function mouseDrawStart():void{ drawStart = true; } public function startRecord():void{ record = ""; var mouseMed:MouseHandlerMediator = (facade.retrieveMediator(MouseHandlerMediator.NAME) as MouseHandlerMediator); cursor = mouseMed.getCursor(); GameEngine.getInstance().dispatcher.addEventListener(CoreEvent.UPDATE, updateHandler); } } }//package game.model
Section 221
//CustomCellRenderer (game.view.components.ui.CustomCellRenderer) package game.view.components.ui { import game.model.*; import fl.controls.listClasses.*; public class CustomCellRenderer extends CellRenderer { private var upSkinIncompleteClass:Class; private var overSkinCompleteClass:Class; private var upSkinCompleteClass:Class; private var overSkinIncompleteClass:Class; public function CustomCellRenderer(){ upSkinIncompleteClass = CustomCellRenderer_upSkinIncompleteClass; upSkinCompleteClass = CustomCellRenderer_upSkinCompleteClass; overSkinIncompleteClass = CustomCellRenderer_overSkinIncompleteClass; overSkinCompleteClass = CustomCellRenderer_overSkinCompleteClass; super(); } override protected function drawBackground():void{ switch (data.levelStatus){ case GameLevel.STATUS_INCOMPLETE: setStyle("upSkin", upSkinIncompleteClass); setStyle("overSkin", overSkinIncompleteClass); setStyle("downSkin", overSkinIncompleteClass); setStyle("selectedUpSkin", overSkinIncompleteClass); setStyle("selectedDownSkin", overSkinIncompleteClass); setStyle("selectedOverSkin", overSkinIncompleteClass); break; case GameLevel.STATUS_COMPLETE: setStyle("upSkin", upSkinCompleteClass); setStyle("overSkin", overSkinCompleteClass); setStyle("downSkin", overSkinCompleteClass); setStyle("selectedUpSkin", overSkinCompleteClass); setStyle("selectedDownSkin", overSkinCompleteClass); setStyle("selectedOverSkin", overSkinCompleteClass); break; }; super.drawBackground(); } public static function getStyleDefinition():Object{ return (CellRenderer.getStyleDefinition()); } } }//package game.view.components.ui
Section 222
//CustomCellRenderer_overSkinCompleteClass (game.view.components.ui.CustomCellRenderer_overSkinCompleteClass) package game.view.components.ui { import flash.display.*; import mx.core.*; public class CustomCellRenderer_overSkinCompleteClass extends SpriteAsset { public var bar:DisplayObject; public var barHolder:DisplayObject; public var play_bt:DisplayObject; public var armor:DisplayObject; } }//package game.view.components.ui
Section 223
//CustomCellRenderer_overSkinIncompleteClass (game.view.components.ui.CustomCellRenderer_overSkinIncompleteClass) package game.view.components.ui { import flash.display.*; import mx.core.*; public class CustomCellRenderer_overSkinIncompleteClass extends SpriteAsset { public var bar:DisplayObject; public var barHolder:DisplayObject; public var play_bt:DisplayObject; public var armor:DisplayObject; } }//package game.view.components.ui
Section 224
//CustomCellRenderer_upSkinCompleteClass (game.view.components.ui.CustomCellRenderer_upSkinCompleteClass) package game.view.components.ui { import flash.display.*; import mx.core.*; public class CustomCellRenderer_upSkinCompleteClass extends SpriteAsset { public var bar:DisplayObject; public var barHolder:DisplayObject; public var play_bt:DisplayObject; public var armor:DisplayObject; } }//package game.view.components.ui
Section 225
//CustomCellRenderer_upSkinIncompleteClass (game.view.components.ui.CustomCellRenderer_upSkinIncompleteClass) package game.view.components.ui { import flash.display.*; import mx.core.*; public class CustomCellRenderer_upSkinIncompleteClass extends SpriteAsset { public var bar:DisplayObject; public var barHolder:DisplayObject; public var play_bt:DisplayObject; public var armor:DisplayObject; } }//package game.view.components.ui
Section 226
//AppView (game.view.components.AppView) package game.view.components { import flash.display.*; import game.model.*; public class AppView extends Sprite { private var window:Sprite; public var container:Sprite; public var popupContainer:Sprite; public var sponsorLogo_bt:SimpleButton; public function AppView(){ super(); init(); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("AppWindow"); window = new (WindowClass); addChild(window); container = (window.getChildByName("container") as Sprite); popupContainer = (window.getChildByName("popupContainer") as Sprite); sponsorLogo_bt = (window.getChildByName("sponsorLogo_bt") as SimpleButton); } } }//package game.view.components
Section 227
//CreditsView (game.view.components.CreditsView) package game.view.components { import flash.display.*; import game.model.*; public class CreditsView extends Sprite { public var fglLogo:MovieClip; public var soundSnap:Sprite; public var karataev1:SimpleButton; public var karataev2:SimpleButton; private var window:Sprite; public var popov:SimpleButton; public var close_bt:SimpleButton; public var johnny_bt:SimpleButton; public var box2d:Sprite; public function CreditsView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("CreditsWindow"); window = new (windowClass); addChild(window); close_bt = (window.getChildByName("close_bt") as SimpleButton); karataev1 = (window.getChildByName("karataev1") as SimpleButton); karataev2 = (window.getChildByName("karataev2") as SimpleButton); popov = (window.getChildByName("popov") as SimpleButton); box2d = (window.getChildByName("box2d") as Sprite); soundSnap = (window.getChildByName("soundSnap") as Sprite); johnny_bt = (window.getChildByName("johnny_bt") as SimpleButton); fglLogo = (window.getChildByName("fglLogo") as MovieClip); box2d.buttonMode = true; soundSnap.buttonMode = true; fglLogo.buttonMode = true; tabChildren = false; } } }//package game.view.components
Section 228
//FpsMeterView (game.view.components.FpsMeterView) package game.view.components { import flash.display.*; import flash.text.*; public class FpsMeterView { public var window:Sprite; public var fps_tf:TextField; public function FpsMeterView(window:Sprite):void{ super(); this.window = window; init(); } private function init():void{ fps_tf = (window.getChildByName("fps_tf") as TextField); } } }//package game.view.components
Section 229
//GameCompleteView (game.view.components.GameCompleteView) package game.view.components { import flash.events.*; import flash.display.*; import game.model.*; import flash.text.*; public class GameCompleteView extends Sprite { public var status_tf:TextField; public var contentMask:Sprite; public var name_tf:TextField; public var sendScore_bt:SimpleButton; public var selectLevel_bt:SimpleButton; public var clearProgress_bt:SimpleButton; private var window:Sprite; public var save_bt:SimpleButton; public var nameHolder:Sprite; public var score_tf:TextField; public function GameCompleteView():void{ super(); init(); } private function addedHandler(e:Event):void{ stage.focus = name_tf; } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("GameCompleteWindow"); window = (new (windowClass) as Sprite); addChild(window); contentMask = (window.getChildByName("_mask") as Sprite); score_tf = (window.getChildByName("score_tf") as TextField); nameHolder = (window.getChildByName("nameHolder") as Sprite); name_tf = (nameHolder.getChildByName("name_tf") as TextField); sendScore_bt = (window.getChildByName("sendScore_bt") as SimpleButton); clearProgress_bt = (window.getChildByName("clearProgress_bt") as SimpleButton); selectLevel_bt = (window.getChildByName("selectLevel_bt") as SimpleButton); save_bt = (window.getChildByName("save_bt") as SimpleButton); status_tf = (window.getChildByName("status_tf") as TextField); name_tf.maxChars = 15; name_tf.border = true; name_tf.background = false; name_tf.borderColor = 0x996600; tabChildren = false; addEventListener(Event.ADDED_TO_STAGE, addedHandler); } } }//package game.view.components
Section 230
//GameMenuView (game.view.components.GameMenuView) package game.view.components { import flash.display.*; import flash.text.*; public class GameMenuView { public var levels_bt:SimpleButton; public var music:MovieClip; public var cuts_tf:TextField; public var restart_bt:SimpleButton; public var sponsorLogo_bt:SimpleButton; public var sound:MovieClip; public var window:Sprite; public var cuts:Sprite; public var menu_bt:SimpleButton; public var solution_bt:SimpleButton; public var score_tf:TextField; public function GameMenuView(window:Sprite):void{ super(); this.window = window; init(); } private function init():void{ restart_bt = (window.getChildByName("restart_bt") as SimpleButton); levels_bt = (window.getChildByName("levels_bt") as SimpleButton); menu_bt = (window.getChildByName("menu_bt") as SimpleButton); music = (window.getChildByName("music") as MovieClip); sound = (window.getChildByName("sound") as MovieClip); score_tf = (window.getChildByName("score_tf") as TextField); cuts = (window.getChildByName("cuts") as Sprite); cuts_tf = (cuts.getChildByName("cuts_tf") as TextField); sponsorLogo_bt = (window.getChildByName("sponsorLogo_bt") as SimpleButton); solution_bt = (window.getChildByName("solution_bt") as SimpleButton); music.buttonMode = true; sound.buttonMode = true; window.tabChildren = false; } } }//package game.view.components
Section 231
//GameView (game.view.components.GameView) package game.view.components { import flash.display.*; import game.model.*; import flash.text.*; public class GameView extends Sprite { public var levelName_tf:TextField; public var infoView:Sprite; public var objectsContainer:Sprite; public var jointsContainer:Sprite; public var backContainer:Sprite; public var levelContainer:Sprite; public var fpsMeter:Sprite; public var bodiesContainer:Sprite; public var mouseHandler:Sprite; public var back:Sprite; public var playerContainer:Sprite; public var gameMenu:Sprite; public function GameView(){ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("GameView"); var window:Sprite = (new (windowClass) as Sprite); addChild(window); levelContainer = (window.getChildByName("levelContainer") as Sprite); infoView = (window.getChildByName("infoView") as Sprite); fpsMeter = (window.getChildByName("fpsMeter") as Sprite); mouseHandler = (levelContainer.getChildByName("mouseHandler") as Sprite); objectsContainer = (levelContainer.getChildByName("objectsContainer") as Sprite); bodiesContainer = (objectsContainer.getChildByName("bodiesContainer") as Sprite); jointsContainer = (objectsContainer.getChildByName("jointsContainer") as Sprite); playerContainer = (objectsContainer.getChildByName("playerContainer") as Sprite); gameMenu = (window.getChildByName("gameMenu") as Sprite); back = (window.getChildByName("back") as Sprite); backContainer = (back.getChildByName("container") as Sprite); levelName_tf = (window.getChildByName("levelName_tf") as TextField); levelName_tf.mouseEnabled = false; } } }//package game.view.components
Section 232
//InstructionsView (game.view.components.InstructionsView) package game.view.components { import flash.display.*; import game.model.*; public class InstructionsView extends Sprite { private var window:Sprite; public var close_bt:SimpleButton; public function InstructionsView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("InstructionsWindow"); window = new (windowClass); addChild(window); close_bt = (window.getChildByName("close_bt") as SimpleButton); tabChildren = false; } } }//package game.view.components
Section 233
//LevelCompleteView (game.view.components.LevelCompleteView) package game.view.components { import flash.display.*; import game.model.*; import flash.text.*; public class LevelCompleteView extends Sprite { public var levelScore_tf:TextField; public var contentMask:Sprite; public var timeBonus_tf:TextField; public var selectLevel_bt:SimpleButton; public var next_bt:SimpleButton; private var window:Sprite; public var starsBonus_tf:TextField; public var save_bt:SimpleButton; public var totalScore_tf:TextField; public var replayLevel_bt:SimpleButton; public var status_tf:TextField; public function LevelCompleteView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("LevelCompleteViewWindow"); window = (new (windowClass) as Sprite); addChild(window); contentMask = (window.getChildByName("_mask") as Sprite); next_bt = (window.getChildByName("next_bt") as SimpleButton); selectLevel_bt = (window.getChildByName("selectLevel_bt") as SimpleButton); replayLevel_bt = (window.getChildByName("replay_bt") as SimpleButton); timeBonus_tf = (window.getChildByName("timeBonus_tf") as TextField); starsBonus_tf = (window.getChildByName("starsBonus_tf") as TextField); levelScore_tf = (window.getChildByName("levelScore_tf") as TextField); totalScore_tf = (window.getChildByName("totalScore_tf") as TextField); save_bt = (window.getChildByName("save_bt") as SimpleButton); status_tf = (window.getChildByName("status_tf") as TextField); status_tf.wordWrap = true; status_tf.autoSize = TextFieldAutoSize.LEFT; tabChildren = false; } } }//package game.view.components
Section 234
//LevelItem (game.view.components.LevelItem) package game.view.components { import flash.events.*; import flash.display.*; import game.model.*; import flash.text.*; public class LevelItem extends Sprite { public var level:GameLevel; private var name_tf:TextField; private var back:MovieClip; private var frame:MovieClip; private var window:Sprite; private var selectedFrame:Sprite; private var stars_tf:TextField; private var isAvailable:Boolean; public static const SELECT:String = "Select"; public function LevelItem(level:GameLevel, isAvailable:Boolean):void{ super(); this.level = level; this.isAvailable = isAvailable; init(); } private function mouseDownHandler(e:MouseEvent):void{ dispatchEvent(new Event(SELECT)); } private function rollOutHandler(e:MouseEvent):void{ frame.gotoAndStop(1); } public function deselect():void{ selectedFrame.visible = false; } private function rollOverHandler(e:MouseEvent):void{ frame.gotoAndStop(2); } public function select():void{ selectedFrame.visible = true; } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("LevelItemAsset"); window = new (WindowClass); addChild(window); frame = (window.getChildByName("frame") as MovieClip); selectedFrame = (window.getChildByName("selectedFrame") as Sprite); back = (window.getChildByName("back") as MovieClip); name_tf = (window.getChildByName("name_tf") as TextField); stars_tf = (window.getChildByName("stars_tf") as TextField); frame.stop(); selectedFrame.visible = false; if (level.status == GameLevel.STATUS_INCOMPLETE){ back.gotoAndStop(1); } else { back.gotoAndStop(2); }; var levelName:String = ((uint((level.id + 1)) + ". ") + level.name); name_tf.text = levelName; stars_tf.text = ((level.collectedBonuses + "/") + level.totalBonuses); if (isAvailable){ addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); addEventListener(MouseEvent.ROLL_OVER, rollOverHandler); addEventListener(MouseEvent.ROLL_OUT, rollOutHandler); } else { alpha = 0.5; }; } } }//package game.view.components
Section 235
//LevelSelectView (game.view.components.LevelSelectView) package game.view.components { import flash.display.*; import game.model.*; import fl.controls.*; import flash.text.*; public class LevelSelectView extends Sprite { public var itemsContainer:Sprite; public var disabledGrid:DataGrid; public var grid:DataGrid; private var window:Sprite; public var menu_bt:SimpleButton; private var headerUpSkinClass:Class; public var totalStars_tf:TextField; public var ok_bt:SimpleButton; public function LevelSelectView(){ headerUpSkinClass = LevelSelectView_headerUpSkinClass; super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("LevelSelectView"); window = (new (windowClass) as Sprite); addChild(window); ok_bt = (window.getChildByName("ok_bt") as SimpleButton); menu_bt = (window.getChildByName("menu_bt") as SimpleButton); totalStars_tf = (window.getChildByName("totalStars_tf") as TextField); var rowHeight:uint = 17; itemsContainer = (window.getChildByName("itemsContainer") as Sprite); tabChildren = false; } } }//package game.view.components
Section 236
//LevelSelectView_headerUpSkinClass (game.view.components.LevelSelectView_headerUpSkinClass) package game.view.components { import mx.core.*; public class LevelSelectView_headerUpSkinClass extends SpriteAsset { } }//package game.view.components
Section 237
//LogoView (game.view.components.LogoView) package game.view.components { import flash.display.*; import game.model.*; public class LogoView extends Sprite { public var window:Sprite; public var inner:MovieClip; public var spash_bt:SimpleButton; public function LogoView():void{ super(); init(); } private function init():void{ var WindowClass:Class = GameAssets.getInstance().getAssetClass("LogoWindow"); window = new (WindowClass); addChild(window); inner = (window.getChildByName("ag") as MovieClip); spash_bt = (window.getChildByName("splash_bt") as SimpleButton); } } }//package game.view.components
Section 238
//MainMenuView (game.view.components.MainMenuView) package game.view.components { import flash.display.*; import game.model.*; public class MainMenuView extends Sprite { public var moreGames_bt:SimpleButton; public var iphoneActive:Sprite; public var highscores_bt:SimpleButton; public var options_bt:SimpleButton; public var credits_bt:SimpleButton; public var player:Sprite; public var iphone:Sprite; public var leftPupil:Sprite; public var logo:MovieClip; public var instructions_bt:SimpleButton; private var window:Sprite; public var leftEye:Sprite; public var rightPupil:Sprite; public var create_bt:SimpleButton; public var website_bt:SimpleButton; public var iphoneInner:Sprite; public var rightEye:Sprite; public var startGame_bt:SimpleButton; public function MainMenuView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("MainMenuWindow"); window = new (windowClass); addChild(window); startGame_bt = (window.getChildByName("startGame_bt") as SimpleButton); instructions_bt = (window.getChildByName("instructions_bt") as SimpleButton); options_bt = (window.getChildByName("options_bt") as SimpleButton); credits_bt = (window.getChildByName("credits_bt") as SimpleButton); highscores_bt = (window.getChildByName("highscores_bt") as SimpleButton); website_bt = (window.getChildByName("website_bt") as SimpleButton); moreGames_bt = (window.getChildByName("moreGames_bt") as SimpleButton); create_bt = (window.getChildByName("create_bt") as SimpleButton); logo = (window.getChildByName("logo") as MovieClip); player = (window.getChildByName("player") as Sprite); leftEye = (player.getChildByName("leftEye") as Sprite); leftPupil = (leftEye.getChildByName("pupil") as Sprite); rightEye = (player.getChildByName("rightEye") as Sprite); rightPupil = (rightEye.getChildByName("pupil") as Sprite); iphone = (window.getChildByName("iphone") as Sprite); iphoneInner = (iphone.getChildByName("inner") as Sprite); iphoneActive = (iphone.getChildByName("active") as Sprite); tabChildren = false; } } }//package game.view.components
Section 239
//MouseHandlerView (game.view.components.MouseHandlerView) package game.view.components { import flash.display.*; import game.model.*; import flash.filters.*; public class MouseHandlerView { public var window:Sprite; public var drawingContainer:Sprite; public var workspace:Sprite; public var cursor:Sprite; public var cursorContainer:Sprite; public function MouseHandlerView(window:Sprite){ super(); this.window = window; init(); } private function init():void{ workspace = (window.getChildByName("workspace") as Sprite); drawingContainer = new Sprite(); window.addChild(drawingContainer); cursorContainer = new Sprite(); window.addChild(cursorContainer); var cursorClass:Class = GameAssets.getInstance().getAssetClass("KnifeAsset"); cursor = new (cursorClass); cursorContainer.addChild(cursor); cursor.y = -100; var shadow:DropShadowFilter = new DropShadowFilter(); cursor.filters = [shadow]; } } }//package game.view.components
Section 240
//OptionsView (game.view.components.OptionsView) package game.view.components { import flash.display.*; import game.model.*; public class OptionsView extends Sprite { private var window:Sprite; public var shadows:MovieClip; public var music:MovieClip; public var close_bt:SimpleButton; public var sound:MovieClip; public function OptionsView():void{ super(); init(); } private function init():void{ var windowClass:Class = GameAssets.getInstance().getAssetClass("OptionsWindow"); window = new (windowClass); addChild(window); close_bt = (window.getChildByName("close_bt") as SimpleButton); shadows = (window.getChildByName("shadows") as MovieClip); sound = (window.getChildByName("sound") as MovieClip); music = (window.getChildByName("music") as MovieClip); shadows.stop(); sound.stop(); music.stop(); shadows.buttonMode = true; sound.buttonMode = true; music.buttonMode = true; tabChildren = false; } } }//package game.view.components
Section 241
//AppMediator (game.view.AppMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import flash.display.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; public class AppMediator extends Mediator implements IMediator { private var _view:AppView; public static const NAME:String = "AppMediator"; public function AppMediator(viewComponent:AppView):void{ super(NAME, viewComponent); init(); } private function init():void{ _view = (getViewComponent() as AppView); _view.sponsorLogo_bt.addEventListener(MouseEvent.CLICK, sponsorClickHandler); _view.sponsorLogo_bt.visible = false; } public function getPopupContainer():Sprite{ return (_view.popupContainer); } public function logoComplete():void{ _view.sponsorLogo_bt.visible = true; } public function getViewContainer():Sprite{ return (_view.container); } override public function listNotificationInterests():Array{ return ([]); } override public function handleNotification(note:INotification):void{ } private function sponsorClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://armorgames.com"), "_blank"); } } }//package game.view
Section 242
//CreditsMediator (game.view.CreditsMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; public class CreditsMediator extends Mediator implements IMediator { private var _view:CreditsView; public static const NAME:String = "CreditsMediator"; public function CreditsMediator(viewComponent:CreditsView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } private function popovClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:tyomart@mail.ru"), "_blank"); } override public function handleNotification(note:INotification):void{ } private function appearMoveComplete():void{ _view.close_bt.addEventListener(MouseEvent.CLICK, closeClickHandler); _view.karataev1.addEventListener(MouseEvent.CLICK, emailClickHandler); _view.karataev2.addEventListener(MouseEvent.CLICK, emailClickHandler); _view.popov.addEventListener(MouseEvent.CLICK, popovClickHandler); if (!Factory.VERSION_WHIRLED){ _view.box2d.addEventListener(MouseEvent.CLICK, box2dClickHandler); _view.soundSnap.addEventListener(MouseEvent.CLICK, soundSnapClickHandler); _view.fglLogo.addEventListener(MouseEvent.CLICK, fglClickHandler); }; _view.johnny_bt.addEventListener(MouseEvent.CLICK, johnnyClickHandler); _view.fglLogo.play(); } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function dissapearMoveComplete():void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.CREDITS_HIDE); destroy(); } private function fglClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://www.flashgamelicense.com/game_referral.php?game_id=1596"), "_blank"); } private function init():void{ _view = (getViewComponent() as CreditsView); _view.fglLogo.stop(); _view.y = -480; Tweener.addTween(_view, {y:0, time:0.7, transition:"easeoutback", onComplete:appearMoveComplete}); } private function johnnyClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:johnny@johnny-k.ru"), "_blank"); } private function closeClickHandler(e:MouseEvent):void{ Tweener.addTween(_view, {y:480, time:0.7, transition:"easeinback", onComplete:dissapearMoveComplete}); } private function soundSnapClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://soundsnap.com"), "_blank"); } private function emailClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("mailto:eugene.karataev@gmail.com"), "_blank"); } private function box2dClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://box2d.org"), "_blank"); } } }//package game.view
Section 243
//FpsMeterMediator (game.view.FpsMeterMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import org.puremvc.as3.patterns.mediator.*; import flash.utils.*; public class FpsMeterMediator extends Mediator implements IMediator { private var _view:FpsMeterView; private var frames:int; private var time:int; public static const NAME:String = "FpsMeterMediator"; public function FpsMeterMediator(viewComponent:FpsMeterView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } private function efHandler(e:Event):void{ if ((getTimer() - 1000) >= time){ _view.fps_tf.text = frames.toString(); frames = 0; time = getTimer(); } else { frames++; }; } private function init():void{ _view = (getViewComponent() as FpsMeterView); time = getTimer(); frames = 0; _view.fps_tf.text = "0"; _view.window.addEventListener(Event.ENTER_FRAME, efHandler); _view.window.visible = false; } override public function handleNotification(note:INotification):void{ } } }//package game.view
Section 244
//GameCompleteMediator (game.view.GameCompleteMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; import com.midasplayer.*; public class GameCompleteMediator extends Mediator implements IMediator { private var _view:GameCompleteView; private var score:int; public static const NAME:String = "GameCompleteMediator"; public function GameCompleteMediator(viewComponent:GameCompleteView):void{ super(NAME, viewComponent); init(); } private function sendApplecartScore():void{ var scriptRequest:URLRequest = new URLRequest("http://www.applecartgames.com/HiScores/HiScorePage.aspx"); var scriptVars:URLVariables = new URLVariables(); scriptVars.TheGamesNameValue = "SplitterGame"; scriptVars.ThePlayersNameValue = _view.name_tf.text; scriptVars.TheHighScoreValue = score; scriptRequest.method = URLRequestMethod.POST; scriptRequest.data = scriptVars; navigateToURL(scriptRequest, "_blank"); } private function initRecord():void{ var recorderProxy:RecorderProxy = (facade.retrieveProxy(RecorderProxy.NAME) as RecorderProxy); recorderProxy.saveRecord(); } override public function handleNotification(note:INotification):void{ } override public function listNotificationInterests():Array{ return ([]); } private function sendWhirledScore():void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); } private function selectLevelClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_END); destroy(); } private function sendScoreClickHandler(e:MouseEvent):void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appMed.getPopupContainer().addChild(appProxy.agi); appProxy.agi.showScoreboardSubmit(score); _view.sendScore_bt.visible = false; var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.END_GAME); destroy(); } private function init():void{ _view = (getViewComponent() as GameCompleteView); _view.contentMask.scaleY = 0; Tweener.addTween(_view.contentMask, {scaleY:1, time:0.5, transition:"easeoutquad"}); _view.sendScore_bt.addEventListener(MouseEvent.CLICK, sendScoreClickHandler); _view.clearProgress_bt.addEventListener(MouseEvent.CLICK, clearProgressClickHandler); _view.selectLevel_bt.addEventListener(MouseEvent.CLICK, selectLevelClickHandler); _view.save_bt.addEventListener(MouseEvent.CLICK, saveClickHandler); _view.name_tf.text = ""; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); score = gameProxy.getScore(); _view.score_tf.text = score.toString(); _view.save_bt.visible = false; if (Factory.VERSION_APPLECART){ } else { _view.nameHolder.visible = false; }; } private function sendScore():void{ var vars:String = ""; vars = (vars + (("name=" + _view.name_tf.text) + "&")); vars = (vars + ("score=" + score.toString())); var variables:URLVariables = new URLVariables(vars); var urlReq:URLRequest = new URLRequest((AppProxy.HOST + AppProxy.SAVE_SCORE_SCRIPT)); urlReq.method = URLRequestMethod.POST; urlReq.data = variables; var loader:URLLoader = new URLLoader(); KingAPI.submitScore(score); } private function destroy():void{ _view.sendScore_bt.removeEventListener(MouseEvent.CLICK, sendScoreClickHandler); _view.clearProgress_bt.removeEventListener(MouseEvent.CLICK, clearProgressClickHandler); _view.selectLevel_bt.removeEventListener(MouseEvent.CLICK, selectLevelClickHandler); _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function clearProgressClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.clearProgress(); _view.clearProgress_bt.visible = false; } private function saveClickHandler(e:MouseEvent):void{ initRecord(); _view.save_bt.mouseEnabled = false; _view.save_bt.alpha = 0.3; } } }//package game.view
Section 245
//GameMediator (game.view.GameMediator) package game.view { import org.puremvc.as3.interfaces.*; import game.view.components.*; import flash.display.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; import flash.filters.*; public class GameMediator extends Mediator implements IMediator { private var _view:GameView; private var hint:Sprite; private var appProxy:AppProxy; private var updateBack:Boolean; private var circleColors:Array; public static const NAME:String = "GameMediator"; public function GameMediator(viewComponent:GameView):void{ super(NAME, viewComponent); init(); } private function startLevel():void{ var shadow:DropShadowFilter; var HintClass:Class; if (appProxy.shadowsEnabled){ shadow = new DropShadowFilter(); _view.objectsContainer.filters = [shadow]; }; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); clearHint(); if (gameProxy.currentLevel.id < 4){ HintClass = GameAssets.getInstance().getAssetClass((("Level" + gameProxy.currentLevel.id) + "Hint")); hint = new (HintClass); _view.levelContainer.addChild(hint); hint.mouseEnabled = false; if (updateBack){ hint.y = -10; hint.alpha = 0; Tweener.addTween(hint, {y:0, alpha:1, time:0.5, transition:"easeoutquad"}); }; }; if (updateBack){ createBack(); updateBack = false; }; _view.levelName_tf.text = gameProxy.currentLevel.name; } private function createBack():void{ while (_view.backContainer.numChildren > 0) { _view.backContainer.removeChildAt(0); }; var numCircles:uint = (2 + (Math.random() * 6)); var i:uint; while (i < numCircles) { createCircle(); i++; }; } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case GameProxy.LEVEL_START: startLevel(); break; case GameProxy.LEVEL_COMPLETE: levelComplete(); break; case GameProxy.LEVEL_RESTART_START: levelRestartStart(); break; case GameProxy.LEVEL_RESTART_END: clearFilters(); break; case GameProxy.LEVEL_END: levelEnd(); break; case MouseHandlerMediator.MOUSE_DRAW_START: mouseDrawStart(); break; case MouseHandlerMediator.MOUSE_DRAW_END: mouseDrawEnd(); break; }; } private function init():void{ _view = (getViewComponent() as GameView); appProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); var fpsMeterView:FpsMeterView = new FpsMeterView(_view.fpsMeter); var fpsMeterMed:FpsMeterMediator = new FpsMeterMediator(fpsMeterView); facade.registerMediator(fpsMeterMed); var mouseHandlerView:MouseHandlerView = new MouseHandlerView(_view.mouseHandler); var mouseHandlerMed:GameMouseHandlerMediator = new GameMouseHandlerMediator(mouseHandlerView); facade.registerMediator(mouseHandlerMed); var gameMenuView:GameMenuView = new GameMenuView(_view.gameMenu); var gameMenuMed:GameMenuMediator = new GameMenuMediator(gameMenuView); facade.registerMediator(gameMenuMed); updateBack = true; circleColors = [16248271, 15326393, 13877908, 15849093, 13876863, 13352601, 14995083]; } private function mouseDrawEnd():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.mouseDrawEnd(); } private function mouseDrawStart():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.mouseDrawStart(); } private function levelComplete():void{ clearFilters(); updateBack = true; } public function getJointsContainer():Sprite{ return (_view.jointsContainer); } public function getPlayerContainer():Sprite{ return (_view.playerContainer); } public function getBodiesContainer():Sprite{ return (_view.bodiesContainer); } private function createCircle():void{ var circle:Sprite = new Sprite(); var x:Number = (Math.random() * 640); var y:Number = (Math.random() * 480); var r:Number = (40 + (Math.random() * 150)); var color:Number = circleColors[Math.floor((Math.random() * circleColors.length))]; circle.graphics.beginFill(color); circle.graphics.drawCircle(x, y, r); circle.graphics.endFill(); _view.backContainer.addChild(circle); } private function clearFilters():void{ if (appProxy.shadowsEnabled){ _view.objectsContainer.filters = []; }; } override public function listNotificationInterests():Array{ return ([GameProxy.LEVEL_START, GameProxy.LEVEL_COMPLETE, GameProxy.LEVEL_RESTART_START, GameProxy.LEVEL_RESTART_END, GameProxy.LEVEL_END, MouseHandlerMediator.MOUSE_DRAW_START, MouseHandlerMediator.MOUSE_DRAW_END]); } private function clearHint():void{ if (hint){ hint.parent.removeChild(hint); hint = null; }; } private function levelEnd():void{ clearFilters(); updateBack = true; clearHint(); while (_view.playerContainer.numChildren > 0) { _view.playerContainer.removeChildAt(0); }; } public function destroy():void{ facade.removeMediator(FpsMeterMediator.NAME); facade.removeMediator(MouseHandlerMediator.NAME); facade.removeMediator(GameMenuMediator.NAME); _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function levelRestartStart():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); gameProxy.levelRestartStart(); } } }//package game.view
Section 246
//GameMenuMediator (game.view.GameMenuMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; import com.midasplayer.*; public class GameMenuMediator extends Mediator implements IMediator { private var _view:GameMenuView; private var gameProxy:GameProxy; public static const NAME:String = "GameMenuMediator"; public function GameMenuMediator(viewComponent:GameMenuView):void{ super(NAME, viewComponent); init(); } private function levelStart():void{ updateStat(); } private function splitSuccess():void{ updateStat(); } private function bonusCollect():void{ updateStat(); } private function init():void{ var frame:uint; _view = (getViewComponent() as GameMenuView); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); frame = (appProxy.musicEnabled) ? 1 : 2; _view.music.gotoAndStop(frame); frame = (appProxy.soundEnabled) ? 1 : 2; _view.sound.gotoAndStop(frame); _view.restart_bt.addEventListener(MouseEvent.CLICK, restartClickHandler); _view.levels_bt.addEventListener(MouseEvent.CLICK, levelsClickHandler); _view.menu_bt.addEventListener(MouseEvent.CLICK, menuClickHandler); _view.music.addEventListener(MouseEvent.CLICK, muteClickHandler); _view.sound.addEventListener(MouseEvent.CLICK, soundClickHandler); _view.sponsorLogo_bt.addEventListener(MouseEvent.CLICK, sponsorClickHandler); _view.sponsorLogo_bt.visible = false; _view.solution_bt.addEventListener(MouseEvent.CLICK, solutionClickHandler); gameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); _view.solution_bt.visible = false; } private function soundClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); if (_view.sound.currentFrame == 1){ _view.sound.gotoAndStop(2); appProxy.soundEnabled = false; } else { _view.sound.gotoAndStop(1); appProxy.soundEnabled = true; }; appProxy.flushOptions(); } private function restartClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_RESTART_START); } private function muteClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); if (_view.music.currentFrame == 1){ _view.music.gotoAndStop(2); appProxy.musicEnabled = false; Tweener.addTween(appProxy.musicChannel, {_sound_volume:0, time:0.5, transition:"linear"}); } else { _view.music.gotoAndStop(1); appProxy.musicEnabled = true; Tweener.addTween(appProxy.musicChannel, {_sound_volume:0.5, time:0.5, transition:"linear"}); }; appProxy.flushOptions(); } override public function listNotificationInterests():Array{ return ([GameProxy.LEVEL_START, GameProxy.LEVEL_RESTART_START, GameProxy.LEVEL_RESTART_END, GameProxy.LEVEL_END, GameProxy.BONUS_COLLECT, GameProxy.SPLIT_SUCCESS, MouseHandlerMediator.SPLIT_NOT_AVAILABLE, GameProxy.LEVEL_UPDATE]); } private function menuClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.END_GAME); } private function sponsorClickHandler(e:MouseEvent):void{ KingAPI.openOtherGamesLink(); } private function levelUpdate():void{ updateStat(); } private function levelRestartEnd():void{ _view.restart_bt.mouseEnabled = true; } private function levelsClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_END); } private function levelEnd():void{ _view.restart_bt.mouseEnabled = true; } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case GameProxy.LEVEL_START: levelStart(); break; case GameProxy.LEVEL_RESTART_START: levelRestartStart(); break; case GameProxy.LEVEL_RESTART_END: levelRestartEnd(); break; case GameProxy.LEVEL_END: levelEnd(); break; case GameProxy.BONUS_COLLECT: bonusCollect(); break; case GameProxy.SPLIT_SUCCESS: splitSuccess(); break; case MouseHandlerMediator.SPLIT_NOT_AVAILABLE: splitNotAvailable(); break; case GameProxy.LEVEL_UPDATE: levelUpdate(); break; }; } private function solutionClickHandler(e:MouseEvent):void{ var recProxy:RecorderProxy = (facade.retrieveProxy(RecorderProxy.NAME) as RecorderProxy); var solPath:String = recProxy.getSolution(gameProxy.getLevelIndex(gameProxy.currentLevel.id)); navigateToURL(new URLRequest(solPath), "_blank"); } private function updateStat():void{ _view.score_tf.text = gameProxy.getScore().toString(); _view.cuts_tf.text = gameProxy.getCutsLeft().toString(); } private function levelRestartStart():void{ _view.restart_bt.mouseEnabled = false; } private function splitNotAvailable():void{ var colorObj:Object = {ra:0.5, rb:100, ga:0, gb:0, ba:0, bb:0, aa:1, ab:0}; var i:uint; while (i < 2) { Tweener.addTween(_view.cuts, {scaleX:2, scaleY:2, time:0.25, delay:((0.25 * 2) * i), transition:"linear"}); Tweener.addTween(_view.cuts, {scaleX:1, scaleY:1, time:0.25, delay:(0.25 * (1 + (2 * i))), transition:"linear"}); i++; }; } } }//package game.view
Section 247
//GameMouseHandlerMediator (game.view.GameMouseHandlerMediator) package game.view { import game.view.components.*; import game.model.*; public class GameMouseHandlerMediator extends MouseHandlerMediator { public function GameMouseHandlerMediator(viewComponent:MouseHandlerView):void{ super(viewComponent); } override protected function doMouseDown():void{ var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var cutsLeft:uint = gameProxy.getCutsLeft(); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); if (cutsLeft > 0){ super.doMouseDown(); } else { notesProxy.push(SPLIT_NOT_AVAILABLE); }; } } }//package game.view
Section 248
//InstructionsMediator (game.view.InstructionsMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; public class InstructionsMediator extends Mediator implements IMediator { private var _view:InstructionsView; public static const NAME:String = "InstructionsMediator"; public function InstructionsMediator(viewComponent:InstructionsView):void{ super(NAME, viewComponent); init(); } private function init():void{ _view = (getViewComponent() as InstructionsView); _view.y = -480; Tweener.addTween(_view, {y:0, time:1.5, transition:"easeoutback", onComplete:appearMoveComplete}); } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } override public function listNotificationInterests():Array{ return ([]); } private function closeClickHandler(e:MouseEvent):void{ Tweener.addTween(_view, {y:480, time:0.7, transition:"easeinback", onComplete:dissapearMoveComplete}); } override public function handleNotification(note:INotification):void{ } private function dissapearMoveComplete():void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.INSTRUCTIONS_HIDE); destroy(); } private function appearMoveComplete():void{ _view.close_bt.addEventListener(MouseEvent.CLICK, closeClickHandler); } } }//package game.view
Section 249
//LevelCompleteMediator (game.view.LevelCompleteMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; public class LevelCompleteMediator extends Mediator implements IMediator { private var _view:LevelCompleteView; public static const NAME:String = "LevelCompleetMediator"; public function LevelCompleteMediator(viewComponent:LevelCompleteView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([RecorderProxy.RECORD_COMPLETE, RecorderProxy.RECORD_ERROR]); } private function initRecord():void{ var recorderProxy:RecorderProxy = (facade.retrieveProxy(RecorderProxy.NAME) as RecorderProxy); recorderProxy.saveRecord(); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case RecorderProxy.RECORD_COMPLETE: recordComplete((note.getBody() as String)); break; case RecorderProxy.RECORD_ERROR: recordError((note.getBody() as String)); break; }; } private function saveClickHandler(e:MouseEvent):void{ initRecord(); _view.save_bt.mouseEnabled = false; _view.save_bt.alpha = 0.3; } private function recordComplete(path:String):void{ _view.status_tf.htmlText = (((("<u><a target='blank' href='" + path) + "'>") + path) + "</a></u>"); } private function init():void{ _view = (getViewComponent() as LevelCompleteView); _view.save_bt.addEventListener(MouseEvent.CLICK, saveClickHandler); _view.contentMask.scaleY = 0; Tweener.addTween(_view.contentMask, {scaleY:1, time:0.5, transition:"easeoutquad"}); _view.next_bt.addEventListener(MouseEvent.CLICK, nextClickHandler); _view.selectLevel_bt.addEventListener(MouseEvent.CLICK, selectLevelClickHandler); _view.replayLevel_bt.addEventListener(MouseEvent.CLICK, replayLevelClickHandler); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var level:GameLevel = gameProxy.currentLevel; _view.timeBonus_tf.text = level.timeScore.toString(); _view.starsBonus_tf.text = ((level.collectedBonuses.toString() + " * 10 = ") + level.bonusScore.toString()); _view.levelScore_tf.text = level.score.toString(); _view.totalScore_tf.text = gameProxy.getScore().toString(); _view.save_bt.visible = false; } private function selectLevelClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_END); destroy(); } private function nextClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_NEXT); destroy(); } private function recordError(txt:String):void{ _view.status_tf.text = txt; } private function destroy():void{ _view.save_bt.removeEventListener(MouseEvent.CLICK, saveClickHandler); _view.next_bt.removeEventListener(MouseEvent.CLICK, nextClickHandler); _view.selectLevel_bt.removeEventListener(MouseEvent.CLICK, selectLevelClickHandler); _view.replayLevel_bt.removeEventListener(MouseEvent.CLICK, replayLevelClickHandler); _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function replayLevelClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); notesProxy.push(GameProxy.LEVEL_END); notesProxy.push(GameProxy.LEVEL_START, gameProxy.currentLevel.id); destroy(); } } }//package game.view
Section 250
//LevelSelectMediator (game.view.LevelSelectMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import fl.controls.*; import fl.controls.dataGridClasses.*; import org.puremvc.as3.patterns.mediator.*; import game.view.components.ui.*; public class LevelSelectMediator extends Mediator implements IMediator { private var _view:LevelSelectView; private var items:Array; private var selectedItem:LevelItem; public static const NAME:String = "LevelSelectMediator"; public function LevelSelectMediator(viewComponent:LevelSelectView):void{ super(NAME, viewComponent); init(); } private function menuClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.END_GAME); destroy(); } private function fillGrid(grid:DataGrid, levels:Array):void{ var level:GameLevel; var levelName:String; var bonuses:String; grid.removeAll(); grid.addColumn("level"); var colStars:DataGridColumn = new DataGridColumn("stars"); colStars.setWidth(40); grid.addColumn(colStars); grid.setStyle("cellRenderer", CustomCellRenderer); var i:uint; while (i < levels.length) { level = levels[i]; levelName = ((uint((i + 1)) + ". ") + level.name); bonuses = ((level.collectedBonuses + "/") + level.totalBonuses); grid.addItem({level:levelName, stars:bonuses, levelStatus:level.status}); i++; }; } private function createItems():void{ var level:GameLevel; var levelItem:LevelItem; var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var levels:Array = gameProxy.getLevels(); var availableLevels:Array = gameProxy.getAvailableLevels(); items = []; var i:uint; while (i < levels.length) { level = levels[i]; levelItem = new LevelItem(level, (i < availableLevels.length)); levelItem.y = (i * 17); _view.itemsContainer.addChild(levelItem); levelItem.addEventListener(LevelItem.SELECT, itemSelectHandler); items.push(levelItem); i++; }; var curLevel:GameLevel = gameProxy.getCurrentLevel(); var index:uint = (curLevel) ? curLevel.id : 0; selectItem(items[index]); } private function selectItem(item:LevelItem):void{ if (selectedItem){ selectedItem.deselect(); }; selectedItem = item; selectedItem.select(); } private function init():void{ _view = (getViewComponent() as LevelSelectView); _view.ok_bt.addEventListener(MouseEvent.CLICK, okClickHandler); _view.menu_bt.addEventListener(MouseEvent.CLICK, menuClickHandler); var gameProxy:GameProxy = (facade.retrieveProxy(GameProxy.NAME) as GameProxy); var levels:Array = gameProxy.getLevels(); var availableLevels:Array = gameProxy.getAvailableLevels(); _view.totalStars_tf.text = gameProxy.getTotalBonuses().toString(); createItems(); } override public function handleNotification(note:INotification):void{ } override public function listNotificationInterests():Array{ return ([]); } public function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function itemSelectHandler(e:Event):void{ var item:LevelItem = (e.target as LevelItem); selectItem(item); } private function okClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(GameProxy.LEVEL_START, selectedItem.level.id); } } }//package game.view
Section 251
//LogoMediator (game.view.LogoMediator) package game.view { import flash.events.*; import game.view.components.*; import game.model.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; public class LogoMediator extends Mediator { private var _view:LogoView; public static const COMPLETE:String = "complete"; public static const NAME:String = "LogoMediator"; public function LogoMediator(viewComponent:LogoView):void{ super(NAME, viewComponent); init(); } private function efHandler(e:Event):void{ if (_view.inner.currentFrame == _view.inner.totalFrames){ finish(); }; } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function init():void{ _view = (getViewComponent() as LogoView); _view.inner.addEventListener(Event.ENTER_FRAME, efHandler); _view.spash_bt.addEventListener(MouseEvent.CLICK, splashClickHandler); } private function splashClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://armorgames.com"), "_blank"); } private function finish():void{ _view.inner.stop(); _view.inner.removeEventListener(Event.ENTER_FRAME, efHandler); reallyFinish(); } private function reallyFinish():void{ var appMed:AppMediator = (facade.retrieveMediator(AppMediator.NAME) as AppMediator); appMed.logoComplete(); var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.logoComplete(); destroy(); } } }//package game.view
Section 252
//MainMenuMediator (game.view.MainMenuMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import flash.display.*; import game.model.*; import flash.geom.*; import Box2D.Common.Math.*; import flash.net.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; import com.midasplayer.*; public class MainMenuMediator extends Mediator implements IMediator { private var _view:MainMenuView; public static const NAME:String = "MainMenuMediator"; public function MainMenuMediator(viewComponent:MainMenuView):void{ super(NAME, viewComponent); init(); } private function destroy():void{ _view.player.removeEventListener(Event.ENTER_FRAME, playerEfHandler); _view.parent.removeChild(_view); facade.removeMediator(NAME); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case AppProxy.INSTRUCTIONS_SHOW: case AppProxy.CREDITS_SHOW: case AppProxy.OPTIONS_SHOW: deactivate(); break; case AppProxy.INSTRUCTIONS_HIDE: case AppProxy.CREDITS_HIDE: case AppProxy.OPTIONS_HIDE: activate(); break; }; } private function highscoresClickHandler(e:MouseEvent):void{ var appProxy:AppProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); appProxy.agi.initAGUI({onClose:closeHandler}); appProxy.agi.showScoreboardList(); } private function createClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.LEVEL_CREATE); } private function playerEfHandler(e:Event):void{ rotateEye(_view.leftEye, _view.leftPupil); rotateEye(_view.rightEye, _view.rightPupil); } private function init():void{ _view = (getViewComponent() as MainMenuView); _view.startGame_bt.addEventListener(MouseEvent.CLICK, startGameClickHandler); _view.instructions_bt.addEventListener(MouseEvent.CLICK, instructionsClickHandler); _view.options_bt.addEventListener(MouseEvent.CLICK, optionsClickHandler); _view.credits_bt.addEventListener(MouseEvent.CLICK, creditsClickHandler); _view.highscores_bt.addEventListener(MouseEvent.CLICK, highscoresClickHandler); _view.website_bt.addEventListener(MouseEvent.CLICK, websiteClickHandler); _view.moreGames_bt.addEventListener(MouseEvent.CLICK, moreGamesClickHandler); _view.create_bt.addEventListener(MouseEvent.CLICK, createClickHandler); _view.logo.stop(); _view.logo.alpha = 0; _view.logo.scaleX = (_view.logo.scaleY = 0.6); Tweener.addTween(_view.logo, {scaleX:1, scaleY:1, alpha:1, time:0.6, transition:"easeoutback"}); _view.startGame_bt.alpha = 0; _view.options_bt.alpha = 0; _view.credits_bt.alpha = 0; _view.highscores_bt.alpha = 0; _view.website_bt.alpha = 0; _view.moreGames_bt.alpha = 0; Tweener.addTween(_view.startGame_bt, {alpha:1, time:0.4, transition:"linear", delay:0.6}); Tweener.addTween(_view.options_bt, {alpha:1, time:0.4, transition:"linear", delay:0.8}); Tweener.addTween(_view.credits_bt, {alpha:1, time:0.4, transition:"linear", delay:1}); Tweener.addTween(_view.highscores_bt, {alpha:1, time:0.4, transition:"linear", delay:1.2}); Tweener.addTween(_view.moreGames_bt, {alpha:1, time:0.4, transition:"linear", delay:1.4, onComplete:logoAppearComplete}); _view.player.addEventListener(Event.ENTER_FRAME, playerEfHandler); _view.website_bt.visible = false; _view.iphone.buttonMode = true; _view.iphoneActive.addEventListener(MouseEvent.ROLL_OVER, iphoneRollOverHandler); _view.iphoneActive.addEventListener(MouseEvent.ROLL_OUT, iphoneRollOutHandler); _view.iphoneActive.addEventListener(MouseEvent.CLICK, iphoneClickHandler); } private function rotateEye(eye:Sprite, pupil:Sprite):void{ var globalEye:Point; var localEye:Point; var dir:b2Vec2; var globalEyeVector:b2Vec2; var mouseVector:b2Vec2 = new b2Vec2(_view.stage.mouseX, _view.stage.mouseY); var r:Number = 15; globalEye = eye.parent.localToGlobal(new Point(eye.x, eye.y)); globalEyeVector = new b2Vec2(globalEye.x, globalEye.y); dir = mouseVector.Copy(); dir.Subtract(globalEyeVector); if (dir.Length() < r){ localEye = eye.globalToLocal(new Point(mouseVector.x, mouseVector.y)); } else { dir.Normalize(); dir.Multiply(r); globalEyeVector.Add(dir); localEye = eye.globalToLocal(new Point(globalEyeVector.x, globalEyeVector.y)); }; pupil.x = localEye.x; pupil.y = localEye.y; var scale:Number = (1 - ((dir.Length() / r) * 0.15)); pupil.scaleX = (pupil.scaleY = scale); } private function creditsClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.CREDITS_SHOW); } private function applecartHighscores():void{ var scriptRequest:URLRequest = new URLRequest("http://www.applecartgames.com/HiScores/HiScorePage.aspx"); var scriptVars:URLVariables = new URLVariables(); scriptVars.TheGamesNameValue = "SplitterGame"; scriptRequest.method = URLRequestMethod.POST; scriptRequest.data = scriptVars; navigateToURL(scriptRequest, "_blank"); } private function optionsClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.OPTIONS_SHOW); } private function websiteClickHandler(e:MouseEvent):void{ KingAPI.openAddToWebsiteLink(); } private function iphoneClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://itunes.apple.com/us/app/splitter-pals/id406840521"), "_blank"); } private function logoEfHandler(e:Event):void{ if (_view.logo.currentFrame == _view.logo.totalFrames){ _view.logo.stop(); _view.logo.removeEventListener(Event.ENTER_FRAME, logoEfHandler); }; } private function moreGamesClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://armorgames.com"), "_blank"); } override public function listNotificationInterests():Array{ return ([AppProxy.INSTRUCTIONS_SHOW, AppProxy.INSTRUCTIONS_HIDE, AppProxy.CREDITS_SHOW, AppProxy.CREDITS_HIDE, AppProxy.OPTIONS_SHOW, AppProxy.OPTIONS_HIDE]); } private function closeHandler():void{ } private function activate():void{ _view.mouseChildren = true; } private function iphoneRollOverHandler(e:MouseEvent):void{ Tweener.addTween(_view.iphoneInner, {rotation:-20, time:0.2, transition:"easeoutquad"}); } private function instructionsClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.INSTRUCTIONS_SHOW); } private function logoAppearComplete():void{ _view.logo.gotoAndPlay(2); _view.logo.addEventListener(Event.ENTER_FRAME, logoEfHandler); } private function deactivate():void{ _view.mouseChildren = false; } private function startGameClickHandler(e:MouseEvent):void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.START_GAME, e.shiftKey); destroy(); } private function iphoneRollOutHandler(e:MouseEvent):void{ Tweener.addTween(_view.iphoneInner, {rotation:0, time:0.2, transition:"easeoutquad"}); } } }//package game.view
Section 253
//MouseHandlerMediator (game.view.MouseHandlerMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import core.*; import game.view.components.*; import flash.display.*; import game.model.*; import flash.geom.*; import editor.model.*; import game.controller.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; import flash.filters.*; import flash.ui.*; public class MouseHandlerMediator extends Mediator implements IMediator { protected var _view:MouseHandlerView; protected var startPoint:Point; protected var mouseUp:Boolean; protected var mouseDown:Boolean; protected var line:Sprite; public static const MOUSE_DRAW_START:String = "MouseDrawStart"; public static const SPLIT_NOT_AVAILABLE:String = "SplitNotAvailable"; public static const MOUSE_DRAW_END:String = "MouseDrawEnd"; public static const NAME:String = "MouseHandlerMediator"; public function MouseHandlerMediator(viewComponent:MouseHandlerView):void{ super(NAME, viewComponent); init(); } private function stageMouseDownHandler(e:MouseEvent):void{ mouseDown = true; } private function levelEnd():void{ clear(); } private function splitSuccess():void{ Tweener.addTween(line, {alpha:0.3, time:0.3, transition:"linear"}); } private function cursorMouseMoveHandler(e:MouseEvent=null):void{ _view.cursor.x = _view.cursorContainer.mouseX; _view.cursor.y = _view.cursorContainer.mouseY; } public function getCursor():Sprite{ return (_view.cursor); } private function clear():void{ while (_view.drawingContainer.numChildren > 0) { _view.drawingContainer.removeChildAt(0); }; _view.window.removeEventListener(MouseEvent.MOUSE_DOWN, stageMouseDownHandler); mouseDown = false; mouseUp = false; } private function init():void{ _view = (getViewComponent() as MouseHandlerView); facade.registerCommand(MOUSE_DRAW_START, MouseDrawStartCommand); facade.registerCommand(MOUSE_DRAW_END, MouseDrawEndCommand); _view.window.addEventListener(MouseEvent.ROLL_OUT, cursorRollOutHandler); } private function splitFail():void{ Tweener.addTween(line, {alpha:0, time:0.3, transition:"linear"}); } protected function doMouseDown():void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); line = new Sprite(); var shadow:DropShadowFilter = new DropShadowFilter(); line.filters = [shadow]; _view.drawingContainer.addChild(line); _view.window.stage.addEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler); _view.window.stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler); startPoint = new Point(line.mouseX, line.mouseY); notesProxy.push(MOUSE_DRAW_START, startPoint); Tweener.addTween(_view.cursor, {rotation:-70, time:0.2, transition:"easeoutquad"}); } private function levelComplete():void{ deactivateCursor(); } private function cursorRollOverHandler(e:MouseEvent):void{ activateCursor(); _view.workspace.removeEventListener(MouseEvent.ROLL_OVER, cursorRollOverHandler); } private function doMouseUp():void{ _view.window.stage.removeEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler); _view.window.stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler); var endPoint:Point = new Point(Math.round(line.mouseX), Math.round(line.mouseY)); var l:Line = new Line(startPoint, endPoint); var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(MOUSE_DRAW_END, l); Tweener.addTween(_view.cursor, {rotation:0, time:0.2, transition:"easeoutquad"}); } private function stageMouseUpHandler(e:MouseEvent):void{ mouseUp = true; } private function activateCursor():void{ Mouse.hide(); _view.cursor.visible = true; _view.cursor.root.addEventListener(MouseEvent.MOUSE_MOVE, cursorMouseMoveHandler); cursorMouseMoveHandler(); _view.window.addEventListener(MouseEvent.ROLL_OUT, cursorRollOutHandler); } private function deactivateCursor():void{ _view.cursor.visible = false; _view.cursor.root.removeEventListener(MouseEvent.MOUSE_MOVE, cursorMouseMoveHandler); } private function levelUpdate():void{ if (mouseDown){ doMouseDown(); mouseDown = false; }; if (mouseUp){ doMouseUp(); mouseUp = false; }; } private function levelRestartEnd():void{ } private function stageMouseMoveHandler(e:MouseEvent):void{ line.graphics.clear(); line.graphics.lineStyle(2, 0xFF0000, 1); line.graphics.moveTo(startPoint.x, startPoint.y); line.graphics.lineTo(line.mouseX, line.mouseY); } private function cursorRollOutHandler(e:MouseEvent):void{ Mouse.show(); _view.window.addEventListener(MouseEvent.ROLL_OVER, cursorRollOverHandler); } private function levelRestartStart():void{ clear(); } override public function listNotificationInterests():Array{ return ([GameProxy.LEVEL_RESTART_START, GameProxy.LEVEL_RESTART_END, GameProxy.LEVEL_START, GameProxy.LEVEL_END, GameProxy.LEVEL_COMPLETE, LevelTestProxy.LEVEL_TEST_START, LevelTestProxy.LEVEL_TEST_END, GameProxy.SPLIT_SUCCESS, GameProxy.SPLIT_FAIL, GameProxy.LEVEL_UPDATE]); } override public function handleNotification(note:INotification):void{ switch (note.getName()){ case GameProxy.LEVEL_RESTART_START: levelRestartStart(); break; case GameProxy.LEVEL_RESTART_END: case LevelTestProxy.LEVEL_TEST_END: levelRestartEnd(); break; case GameProxy.LEVEL_START: case LevelTestProxy.LEVEL_TEST_START: levelStart(); break; case GameProxy.LEVEL_END: levelEnd(); break; case GameProxy.LEVEL_COMPLETE: levelComplete(); break; case GameProxy.SPLIT_SUCCESS: splitSuccess(); break; case GameProxy.SPLIT_FAIL: splitFail(); break; case GameProxy.LEVEL_UPDATE: levelUpdate(); break; }; } private function levelStart():void{ clear(); _view.window.addEventListener(MouseEvent.MOUSE_DOWN, stageMouseDownHandler); _view.cursor.rotation = 0; if (_view.workspace.hitTestPoint(_view.window.stage.mouseX, _view.window.stage.mouseY)){ activateCursor(); } else { _view.workspace.addEventListener(MouseEvent.ROLL_OVER, cursorRollOverHandler); }; } } }//package game.view
Section 254
//OptionsMediator (game.view.OptionsMediator) package game.view { import flash.events.*; import org.puremvc.as3.interfaces.*; import game.view.components.*; import game.model.*; import org.puremvc.as3.patterns.mediator.*; import caurina.transitions.*; public class OptionsMediator extends Mediator implements IMediator { private var _view:OptionsView; private var appProxy:AppProxy; public static const NAME:String = "OptionsMediator"; public function OptionsMediator(viewComponent:OptionsView):void{ super(NAME, viewComponent); init(); } override public function listNotificationInterests():Array{ return ([]); } override public function handleNotification(note:INotification):void{ } private function musicClickHandler(e:MouseEvent):void{ if (_view.music.currentFrame == 1){ _view.music.gotoAndStop(2); appProxy.musicEnabled = true; Tweener.addTween(appProxy.musicChannel, {_sound_volume:0.5, time:0.5, transition:"linear"}); } else { _view.music.gotoAndStop(1); appProxy.musicEnabled = false; Tweener.addTween(appProxy.musicChannel, {_sound_volume:0, time:0.5, transition:"linear"}); }; appProxy.flushOptions(); } private function destroy():void{ _view.parent.removeChild(_view); facade.removeMediator(NAME); } private function dissapearMoveComplete():void{ var notesProxy:NotesProxy = (facade.retrieveProxy(NotesProxy.NAME) as NotesProxy); notesProxy.push(AppProxy.OPTIONS_HIDE); destroy(); } private function init():void{ var frame:uint; _view = (getViewComponent() as OptionsView); appProxy = (facade.retrieveProxy(AppProxy.NAME) as AppProxy); frame = (appProxy.shadowsEnabled) ? 2 : 1; _view.shadows.gotoAndStop(frame); frame = (appProxy.soundEnabled) ? 2 : 1; _view.sound.gotoAndStop(frame); frame = (appProxy.musicEnabled) ? 2 : 1; _view.music.gotoAndStop(frame); _view.y = -480; Tweener.addTween(_view, {y:0, time:0.7, transition:"easeoutback", onComplete:appearMoveComplete}); } private function soundClickHandler(e:MouseEvent):void{ if (_view.sound.currentFrame == 1){ _view.sound.gotoAndStop(2); appProxy.soundEnabled = true; } else { _view.sound.gotoAndStop(1); appProxy.soundEnabled = false; }; appProxy.flushOptions(); } private function shadowsClickHandler(e:MouseEvent):void{ if (_view.shadows.currentFrame == 1){ _view.shadows.gotoAndStop(2); appProxy.shadowsEnabled = true; } else { _view.shadows.gotoAndStop(1); appProxy.shadowsEnabled = false; }; appProxy.flushOptions(); } private function closeClickHandler(e:MouseEvent):void{ Tweener.addTween(_view, {y:480, time:0.7, transition:"easeinback", onComplete:dissapearMoveComplete}); } private function appearMoveComplete():void{ _view.close_bt.addEventListener(MouseEvent.CLICK, closeClickHandler); _view.shadows.addEventListener(MouseEvent.CLICK, shadowsClickHandler); _view.sound.addEventListener(MouseEvent.CLICK, soundClickHandler); _view.music.addEventListener(MouseEvent.CLICK, musicClickHandler); } } }//package game.view
Section 255
//GeomLine (geom.GeomLine) package geom { import flash.geom.*; public class GeomLine extends GeomObj { public var p1:Vector; public var p2:Vector; public function GeomLine(p1:Vector, p2:Vector):void{ super(); this.p1 = p1; this.p2 = p2; } override public function getBoundingBox():Rectangle{ var x:Number = (p1.x + ((p2.x - p1.x) / 2)); var y:Number = (p1.y + ((p2.y - p1.y) / 2)); return (new Rectangle((x - 10), (y - 10), 20, 20)); } override public function translate(dx:Number, dy:Number):void{ p1.x = (p1.x + dx); p2.x = (p2.x + dx); p1.y = (p1.y + dy); p2.y = (p2.y + dy); } } }//package geom
Section 256
//GeomObj (geom.GeomObj) package geom { import flash.geom.*; public class GeomObj { public function GeomObj():void{ super(); } public function getBoundingBox():Rectangle{ return (null); } public function isPointInside(p:Point):Boolean{ return (false); } public function isRectInside(rect:Rectangle):Boolean{ return (false); } public function translate(dx:Number, dy:Number):void{ } public static function lineLineInts(line1:GeomLine, line2:GeomLine):Vector{ var intPoint:Vector; var x1:Number = line1.p1.x; var x2:Number = line1.p2.x; var x3:Number = line2.p1.x; var x4:Number = line2.p2.x; var y1:Number = line1.p1.y; var y2:Number = line1.p2.y; var y3:Number = line2.p1.y; var y4:Number = line2.p2.y; if ((((Math.max(x1, x2) < Math.min(x3, x4))) || ((Math.max(x3, x4) < Math.min(x1, x2))))){ return (null); }; if ((((Math.max(y1, y2) < Math.min(y3, y4))) || ((Math.max(y3, y4) < Math.min(y1, y2))))){ return (null); }; var ua:Number = (((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3))); var ub:Number = (((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3))); var denom:Number = (((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1))); if (Math.abs(denom) < 0.001){ return (null); }; ua = (ua / denom); ub = (ub / denom); if ((((((((0 < ua)) && ((ua < 1)))) && ((0 < ub)))) && ((ub < 1)))){ intPoint = new Vector((x1 + (ua * (x2 - x1))), (y1 + (ua * (y2 - y1)))); return (intPoint); }; return (null); } public static function checkInts(obj1:GeomObj, obj2:GeomObj):Array{ var intPoint:Vector; var points:Array = []; if ((obj1 is GeomLine)){ if ((obj2 is GeomLine)){ intPoint = GeomObj.lineLineInts((obj1 as GeomLine), (obj2 as GeomLine)); if (intPoint){ points.push(intPoint); }; } else { if ((obj2 is GeomPoly)){ points = GeomObj.linePolyInts((obj1 as GeomLine), (obj2 as GeomPoly)); }; }; } else { if ((obj1 is GeomPoly)){ if ((obj2 is GeomLine)){ points = GeomObj.linePolyInts((obj2 as GeomLine), (obj1 as GeomPoly)); }; }; }; return (points); } public static function linePolyInts(line:GeomLine, poly:GeomPoly):Array{ var polyLine:GeomLine; var intPoint:Vector; var points:Array = []; var i:uint = 1; while (i < poly.vertices.length) { polyLine = new GeomLine(poly.vertices[(i - 1)], poly.vertices[i]); intPoint = lineLineInts(line, polyLine); if (intPoint){ points.push(intPoint); }; i++; }; polyLine = new GeomLine(poly.vertices[0], poly.vertices[(poly.vertices.length - 1)]); intPoint = lineLineInts(line, polyLine); if (intPoint){ points.push(intPoint); }; return (points); } } }//package geom
Section 257
//GeomPoly (geom.GeomPoly) package geom { import flash.geom.*; public class GeomPoly extends GeomObj { public var isReversed:Boolean; public var vertices:Array; public function GeomPoly(vertices:Array):void{ super(); this.vertices = vertices; isReversed = false; if (!isCW()){ vertices.reverse(); isReversed = true; }; } override public function isPointInside(p:Point):Boolean{ var polyLine:GeomLine; var intPoint:Vector; var testLine:GeomLine = new GeomLine(new Vector(p.x, p.y), new Vector((p.x + 1000), p.y)); var parity:uint; var index:uint; var i:uint = 1; while (i <= vertices.length) { index = i; if (index == vertices.length){ index = 0; }; polyLine = new GeomLine(vertices[index], vertices[(i - 1)]); intPoint = GeomObj.lineLineInts(testLine, polyLine); if (intPoint){ parity = (parity + 1); }; i++; }; return ((((parity > 0)) && (!(((parity % 2) == 0))))); } public function getArea():Number{ var v1:Vector; var v2:Vector; var area:Number = 0; var first:Vector = vertices[0]; var i:uint = 2; while (i < vertices.length) { v1 = vertices[(i - 1)].subtract(first); v2 = vertices[i].subtract(first); area = (area + v1.cross(v2)); i++; }; return (area); } override public function isRectInside(rect:Rectangle):Boolean{ var polyLine:GeomLine; var j:uint; var rectLines:Array = [new GeomLine(new Vector(rect.x, rect.y), new Vector((rect.x + rect.width), rect.y)), new GeomLine(new Vector((rect.x + rect.width), rect.y), new Vector((rect.x + rect.width), (rect.y + rect.height))), new GeomLine(new Vector((rect.x + rect.width), (rect.y + rect.height)), new Vector(rect.x, (rect.y + rect.height))), new GeomLine(new Vector(rect.x, (rect.y + rect.height)), new Vector(rect.x, rect.y))]; var i:uint = 1; while (i < vertices.length) { polyLine = new GeomLine(vertices[i], vertices[(i - 1)]); j = 0; while (j < rectLines.length) { if (GeomObj.lineLineInts(polyLine, rectLines[j])){ return (true); }; j++; }; i++; }; return (false); } override public function translate(dx:Number, dy:Number):void{ var vertex:Vector; var i:uint; while (i < vertices.length) { vertex = vertices[i]; vertex.x = (vertex.x + dx); vertex.y = (vertex.y + dy); i++; }; } override public function getBoundingBox():Rectangle{ var v:Vector; var minX:Number = 1000; var minY:Number = 1000; var maxX:Number = -1000; var maxY:Number = -1000; var i:uint; while (i < vertices.length) { v = vertices[i]; if (v.x < minX){ minX = v.x; }; if (v.x > maxX){ maxX = v.x; }; if (v.y < minY){ minY = v.y; }; if (v.y > maxY){ maxY = v.y; }; i++; }; return (new Rectangle(minX, minY, (maxX - minX), (maxY - minY))); } public function split(line:GeomLine):Array{ var splittablePoly:SplittablePoly = new SplittablePoly(vertices); return (splittablePoly.split(line)); } public function isSimple():Boolean{ var index:uint; var line:GeomLine; var j:uint; var index2:uint; var line2:GeomLine; var intPoint:Vector; var i:uint = 1; while (i <= vertices.length) { index = i; if (index == vertices.length){ index = 0; }; line = new GeomLine(vertices[index], vertices[(i - 1)]); j = (i + 1); while (j <= vertices.length) { index2 = j; if (index2 == vertices.length){ index2 = 0; }; line2 = new GeomLine(vertices[index2], vertices[(j - 1)]); intPoint = GeomObj.lineLineInts(line, line2); if (intPoint){ return (false); }; j++; }; i++; }; return (true); } public function isCW():Boolean{ return ((getArea() > 0)); } public static function parseStringDef(stringDef:String):GeomPoly{ var coords:Array; var vertex:Vector; var vertices:Array = []; var verticesDef:Array = stringDef.split(","); var i:uint; while (i < verticesDef.length) { coords = verticesDef[i].split(" "); vertex = new Vector(Number(coords[0]), Number(coords[1])); vertices.push(vertex); i++; }; return (new GeomPoly(vertices)); } } }//package geom import de.polygonal.ds.*; class SplittablePoly { private var lineDll:DLinkedList; private var polyDll:DLinkedList; private var vertices:Array; private var inboundDll:DLinkedList; private function SplittablePoly(vertices:Array):void{ super(); this.vertices = vertices; } private function createPieces():Array{ var inboundNode:PolyNode; var lineItr:DListIterator; var lineNode:PolyNode; var polyItr:DListIterator; var node:PolyNode; var node2:PolyNode; var poly2Itr:DListIterator; var outPolys:Array = []; trace(lineDll.dump()); trace(polyDll.dump()); trace(inboundDll.dump()); polyDll.tail.next = polyDll.head; var polyVertices:Array = []; var itr:DListIterator = inboundDll.getListIterator(); for (;itr.valid();itr.forth()) { inboundNode = (itr.data as PolyNode); if (!inboundNode.isLineVisited){ lineItr = lineDll.nodeOf(inboundNode); lineItr.back(); lineNode = (lineItr.data as PolyNode); if (lineNode != lineDll.head.data){ polyVertices.push(inboundNode); } else { continue; }; polyItr = polyDll.nodeOf(lineNode); while (true) { node = (polyItr.data as PolyNode); if (node == polyVertices[0]){ break; }; polyVertices.push(node); if (node.isInbound){ node.isLineVisited = true; lineItr = lineDll.nodeOf(node); lineItr.back(); node2 = (lineItr.data as PolyNode); if (node2 == polyVertices[0]){ break; }; if (node2 == lineDll.head.data){ node.isPolyVisited = true; polyItr.forth(); } else { polyItr = polyDll.nodeOf(node2); }; } else { polyItr.forth(); }; }; if (polyVertices.length > 0){ outPolys.push(createPiece(polyVertices)); }; polyVertices = []; }; if (!inboundNode.isPolyVisited){ poly2Itr = polyDll.nodeOf(inboundNode); polyVertices.push(inboundNode); while (true) { poly2Itr.forth(); node = (poly2Itr.data as PolyNode); if (node == polyVertices[0]){ break; } else { polyVertices.push(node); if (node.isOutbound){ lineItr = lineDll.nodeOf(node); lineItr.forth(); node2 = (lineItr.data as PolyNode); if (node2 == polyVertices[0]){ break; }; if (node2 == lineDll.tail.data){ node2.isLineVisited = true; } else { poly2Itr = polyDll.nodeOf(node2); polyVertices.push(node2); node2.isPolyVisited = true; }; } else { if (node.isInbound){ node.isPolyVisited = true; }; }; }; }; outPolys.push(createPiece(polyVertices)); polyVertices = []; }; }; return (outPolys); } private function createPiece(nodes:Array):GeomPoly{ var node:PolyNode; var vertices:Array = []; var i:uint; while (i < nodes.length) { node = nodes[i]; vertices.push(node.vec.copy()); i++; }; var poly:GeomPoly = new GeomPoly(vertices); return (poly); } public function split(line:GeomLine):Array{ var itr:DListIterator; var polyLine:GeomLine; var i:uint; var vertexIndex:uint; var vertex:Vector; var intsPoints:Array; var node:PolyNode; var intDist:Number; var lineVertex:Vector; var dist:Number; var lineVec:Vector = line.p2.subtract(line.p1); var polyVertices:Array = []; var lineVertices:Array = [line.p1, line.p2]; var prevVertex:Vector = vertices[0]; polyDll = new DLinkedList(); lineDll = new DLinkedList(); inboundDll = new DLinkedList(); lineDll.append(new PolyNode(line.p1)); lineDll.append(new PolyNode(line.p2)); i = 1; while (i <= vertices.length) { vertexIndex = i; if (vertexIndex == vertices.length){ vertexIndex = 0; }; vertex = vertices[vertexIndex]; polyDll.append(new PolyNode(prevVertex)); polyLine = new GeomLine(vertex, prevVertex); intsPoints = GeomObj.checkInts(polyLine, line); if (intsPoints.length > 0){ node = new PolyNode(intsPoints[0]); node.checkBound(lineVec, prevVertex); polyDll.append(node); if (node.isInbound){ inboundDll.append(node); }; intDist = (((node.vec.x - line.p1.x) * (node.vec.x - line.p1.x)) + ((node.vec.y - line.p1.y) * (node.vec.y - line.p1.y))); itr = lineDll.getListIterator(); while (itr.valid()) { lineVertex = (itr.data.vec as Vector); dist = (((lineVertex.x - line.p1.x) * (lineVertex.x - line.p1.x)) + ((lineVertex.y - line.p1.y) * (lineVertex.y - line.p1.y))); if (intDist < dist){ lineDll.insertBefore(itr, node); break; }; itr.forth(); }; }; prevVertex = vertex; i++; }; return (createPieces()); } } class PolyNode { public var isInbound:Boolean;// = false public var vec:Vector; public var isLineVisited:Boolean;// = false public var isPolyVisited:Boolean;// = false public var isOutbound:Boolean;// = false public var id:uint; public static var ID:uint; private function PolyNode(vec:Vector):void{ super(); id = ID++; this.vec = vec; } public function toString():String{ return (("n " + id)); } public function checkBound(lineVec:Vector, prevVec:Vector):void{ var v:Vector = vec.subtract(prevVec); if (lineVec.cross(v) > 0){ isInbound = true; } else { isOutbound = true; }; } }
Section 258
//Vector (geom.Vector) package geom { public class Vector { public var x:Number; public var y:Number; public function Vector(x:Number, y:Number):void{ super(); this.x = x; this.y = y; } public function dot(v:Vector):Number{ return (((x * v.x) + (y * v.y))); } public function subtract(v:Vector):Vector{ return (new Vector((x - v.x), (y - v.y))); } public function copy():Vector{ return (new Vector(x, y)); } public function toString():String{ return (((x + " ") + y)); } public function cross(v:Vector):Number{ return (((x * v.y) - (y * v.x))); } } }//package geom
Section 259
//ByteArrayAsset (mx.core.ByteArrayAsset) package mx.core { import flash.utils.*; public class ByteArrayAsset extends ByteArray implements IFlexAsset { mx_internal static const VERSION:String = "3.0.0.0"; public function ByteArrayAsset(){ super(); } } }//package mx.core
Section 260
//EdgeMetrics (mx.core.EdgeMetrics) package mx.core { public class EdgeMetrics { public var top:Number; public var left:Number; public var bottom:Number; public var right:Number; mx_internal static const VERSION:String = "3.0.0.0"; public static const EMPTY:EdgeMetrics = new EdgeMetrics(0, 0, 0, 0); ; public function EdgeMetrics(left:Number=0, top:Number=0, right:Number=0, bottom:Number=0){ super(); this.left = left; this.top = top; this.right = right; this.bottom = bottom; } public function clone():EdgeMetrics{ return (new EdgeMetrics(left, top, right, bottom)); } } }//package mx.core
Section 261
//FlexMovieClip (mx.core.FlexMovieClip) package mx.core { import flash.display.*; import mx.utils.*; public class FlexMovieClip extends MovieClip { mx_internal static const VERSION:String = "3.0.0.0"; public function FlexMovieClip(){ super(); name = NameUtil.createUniqueName(this); //unresolved jump var _slot1 = e; } override public function toString():String{ return (NameUtil.displayObjectToString(this)); } } }//package mx.core
Section 262
//FlexSprite (mx.core.FlexSprite) package mx.core { import flash.display.*; import mx.utils.*; public class FlexSprite extends Sprite { mx_internal static const VERSION:String = "3.0.0.0"; public function FlexSprite(){ super(); name = NameUtil.createUniqueName(this); //unresolved jump var _slot1 = e; } override public function toString():String{ return (NameUtil.displayObjectToString(this)); } } }//package mx.core
Section 263
//IBorder (mx.core.IBorder) package mx.core { public interface IBorder { function get borderMetrics():EdgeMetrics; } }//package mx.core
Section 264
//IFlexAsset (mx.core.IFlexAsset) package mx.core { public interface IFlexAsset { } }//package mx.core
Section 265
//IFlexDisplayObject (mx.core.IFlexDisplayObject) package mx.core { import flash.events.*; import flash.display.*; import flash.geom.*; import flash.accessibility.*; public interface IFlexDisplayObject extends IBitmapDrawable, IEventDispatcher { function get visible():Boolean; function get rotation():Number; function localToGlobal(void:Point):Point; function get name():String; function set width(flash.display:Number):void; function get measuredHeight():Number; function get blendMode():String; function get scale9Grid():Rectangle; function set name(flash.display:String):void; function set scaleX(flash.display:Number):void; function set scaleY(flash.display:Number):void; function get measuredWidth():Number; function get accessibilityProperties():AccessibilityProperties; function set scrollRect(flash.display:Rectangle):void; function get cacheAsBitmap():Boolean; function globalToLocal(void:Point):Point; function get height():Number; function set blendMode(flash.display:String):void; function get parent():DisplayObjectContainer; function getBounds(String:DisplayObject):Rectangle; function get opaqueBackground():Object; function set scale9Grid(flash.display:Rectangle):void; function setActualSize(_arg1:Number, _arg2:Number):void; function set alpha(flash.display:Number):void; function set accessibilityProperties(flash.display:AccessibilityProperties):void; function get width():Number; function hitTestPoint(_arg1:Number, _arg2:Number, _arg3:Boolean=false):Boolean; function set cacheAsBitmap(flash.display:Boolean):void; function get scaleX():Number; function get scaleY():Number; function get scrollRect():Rectangle; function get mouseX():Number; function get mouseY():Number; function set height(flash.display:Number):void; function set mask(flash.display:DisplayObject):void; function getRect(String:DisplayObject):Rectangle; function get alpha():Number; function set transform(flash.display:Transform):void; function move(_arg1:Number, _arg2:Number):void; function get loaderInfo():LoaderInfo; function get root():DisplayObject; function hitTestObject(mx.core:IFlexDisplayObject/mx.core:IFlexDisplayObject:stage/get:DisplayObject):Boolean; function set opaqueBackground(flash.display:Object):void; function set visible(flash.display:Boolean):void; function get mask():DisplayObject; function set x(flash.display:Number):void; function set y(flash.display:Number):void; function get transform():Transform; function set filters(flash.display:Array):void; function get x():Number; function get y():Number; function get filters():Array; function set rotation(flash.display:Number):void; function get stage():Stage; } }//package mx.core
Section 266
//IRepeaterClient (mx.core.IRepeaterClient) package mx.core { public interface IRepeaterClient { function get instanceIndices():Array; function set instanceIndices(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function get isDocument():Boolean; function set repeaters(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function initializeRepeaterArrays(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:IRepeaterClient):void; function get repeaters():Array; function set repeaterIndices(E:\dev\3.0.x\frameworks\projects\framework\src;mx\core;IRepeaterClient.as:Array):void; function get repeaterIndices():Array; } }//package mx.core
Section 267
//MovieClipAsset (mx.core.MovieClipAsset) package mx.core { public class MovieClipAsset extends FlexMovieClip implements IFlexAsset, IFlexDisplayObject, IBorder { private var _measuredHeight:Number; private var _measuredWidth:Number; mx_internal static const VERSION:String = "3.0.0.0"; public function MovieClipAsset(){ super(); _measuredWidth = width; _measuredHeight = height; } public function get measuredWidth():Number{ return (_measuredWidth); } public function get measuredHeight():Number{ return (_measuredHeight); } public function setActualSize(newWidth:Number, newHeight:Number):void{ width = newWidth; height = newHeight; } public function move(x:Number, y:Number):void{ this.x = x; this.y = y; } public function get borderMetrics():EdgeMetrics{ if (scale9Grid == null){ return (EdgeMetrics.EMPTY); }; return (new EdgeMetrics(scale9Grid.left, scale9Grid.top, Math.ceil((measuredWidth - scale9Grid.right)), Math.ceil((measuredHeight - scale9Grid.bottom)))); } } }//package mx.core
Section 268
//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 269
//SoundAsset (mx.core.SoundAsset) package mx.core { import flash.media.*; public class SoundAsset extends Sound implements IFlexAsset { mx_internal static const VERSION:String = "3.0.0.0"; public function SoundAsset(){ super(); } } }//package mx.core
Section 270
//SpriteAsset (mx.core.SpriteAsset) package mx.core { public class SpriteAsset extends FlexSprite implements IFlexAsset, IFlexDisplayObject, IBorder { private var _measuredHeight:Number; private var _measuredWidth:Number; mx_internal static const VERSION:String = "3.0.0.0"; public function SpriteAsset(){ super(); _measuredWidth = width; _measuredHeight = height; } public function get measuredWidth():Number{ return (_measuredWidth); } public function get measuredHeight():Number{ return (_measuredHeight); } public function setActualSize(newWidth:Number, newHeight:Number):void{ width = newWidth; height = newHeight; } public function move(x:Number, y:Number):void{ this.x = x; this.y = y; } public function get borderMetrics():EdgeMetrics{ if (scale9Grid == null){ return (EdgeMetrics.EMPTY); }; return (new EdgeMetrics(scale9Grid.left, scale9Grid.top, Math.ceil((measuredWidth - scale9Grid.right)), Math.ceil((measuredHeight - scale9Grid.bottom)))); } } }//package mx.core
Section 271
//NameUtil (mx.utils.NameUtil) package mx.utils { import mx.core.*; import flash.display.*; import flash.utils.*; public class NameUtil { mx_internal static const VERSION:String = "3.0.0.0"; private static var counter:int = 0; public function NameUtil(){ super(); } public static function displayObjectToString(displayObject:DisplayObject):String{ var result:String; var s:String; var indices:Array; var o:DisplayObject = displayObject; while (o != null) { if (((((o.parent) && (o.stage))) && ((o.parent == o.stage)))){ break; }; s = o.name; if ((o is IRepeaterClient)){ indices = IRepeaterClient(o).instanceIndices; if (indices){ s = (s + (("[" + indices.join("][")) + "]")); }; }; result = ((result == null)) ? s : ((s + ".") + result); o = o.parent; }; return (result); } public static function createUniqueName(object:Object):String{ if (!object){ return (null); }; var name:String = getQualifiedClassName(object); var index:int = name.indexOf("::"); if (index != -1){ name = name.substr((index + 2)); }; var charCode:int = name.charCodeAt((name.length - 1)); if ((((charCode >= 48)) && ((charCode <= 57)))){ name = (name + "_"); }; return ((name + counter++)); } } }//package mx.utils
Section 272
//Controller (org.puremvc.as3.core.controller.Controller) package org.puremvc.as3.core.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.core.view.*; import org.puremvc.as3.patterns.observer.*; public class Controller implements IController { protected const SINGLETON_MSG:String = "Controller Singleton already constructed!"; protected var commandMap:Array; protected var view:IView; protected static var instance:IController; public function Controller(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; commandMap = new Array(); initializeController(); } public function removeCommand(notificationName:String):void{ commandMap[notificationName] = null; } public function registerCommand(notificationName:String, commandClassRef:Class):void{ if (commandMap[notificationName] == null){ view.registerObserver(notificationName, new Observer(executeCommand, this)); }; commandMap[notificationName] = commandClassRef; } protected function initializeController():void{ view = View.getInstance(); } public function hasCommand(notificationName:String):Boolean{ return (!((commandMap[notificationName] == null))); } public function executeCommand(note:INotification):void{ var commandClassRef:Class = commandMap[note.getName()]; if (commandClassRef == null){ return; }; var commandInstance:ICommand = new (commandClassRef); commandInstance.execute(note); } public static function getInstance():IController{ if (instance == null){ instance = new (Controller); }; return (instance); } } }//package org.puremvc.as3.core.controller
Section 273
//Model (org.puremvc.as3.core.model.Model) package org.puremvc.as3.core.model { import org.puremvc.as3.interfaces.*; public class Model implements IModel { protected const SINGLETON_MSG:String = "Model Singleton already constructed!"; protected var proxyMap:Array; protected static var instance:IModel; public function Model(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; proxyMap = new Array(); initializeModel(); } protected function initializeModel():void{ } public function removeProxy(proxyName:String):IProxy{ var proxy:IProxy = (proxyMap[proxyName] as IProxy); proxyMap[proxyName] = null; return (proxy); } public function hasProxy(proxyName:String):Boolean{ return (!((proxyMap[proxyName] == null))); } public function retrieveProxy(proxyName:String):IProxy{ return (proxyMap[proxyName]); } public function registerProxy(proxy:IProxy):void{ proxyMap[proxy.getProxyName()] = proxy; } public static function getInstance():IModel{ if (instance == null){ instance = new (Model); }; return (instance); } } }//package org.puremvc.as3.core.model
Section 274
//View (org.puremvc.as3.core.view.View) package org.puremvc.as3.core.view { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class View implements IView { protected const SINGLETON_MSG:String = "View Singleton already constructed!"; protected var observerMap:Array; protected var mediatorMap:Array; protected static var instance:IView; public function View(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; mediatorMap = new Array(); observerMap = new Array(); initializeView(); } public function retrieveMediator(mediatorName:String):IMediator{ return (mediatorMap[mediatorName]); } public function hasMediator(mediatorName:String):Boolean{ return (!((mediatorMap[mediatorName] == null))); } public function notifyObservers(notification:INotification):void{ var observers:Array; var i:Number; var observer:IObserver; if (observerMap[notification.getName()] != null){ observers = (observerMap[notification.getName()] as Array); i = 0; while (i < observers.length) { observer = (observers[i] as IObserver); observer.notifyObserver(notification); i++; }; }; } protected function initializeView():void{ } public function registerMediator(mediator:IMediator):void{ var observer:Observer; var i:Number; mediatorMap[mediator.getMediatorName()] = mediator; var interests:Array = mediator.listNotificationInterests(); if (interests.length > 0){ observer = new Observer(mediator.handleNotification, mediator); i = 0; while (i < interests.length) { registerObserver(interests[i], observer); i++; }; }; mediator.onRegister(); } public function removeMediator(mediatorName:String):IMediator{ var notificationName:String; var mediator:IMediator; var observers:Array; var removalTargets:Array; var i:int; var target:int; for (notificationName in observerMap) { observers = observerMap[notificationName]; removalTargets = new Array(); i = 0; while (i < observers.length) { if (Observer(observers[i]).compareNotifyContext(retrieveMediator(mediatorName)) == true){ removalTargets.push(i); }; i++; }; while (removalTargets.length > 0) { target = removalTargets.pop(); observers.splice(target, 1); }; if (observers.length == 0){ delete observerMap[notificationName]; }; }; mediator = (mediatorMap[mediatorName] as IMediator); delete mediatorMap[mediatorName]; if (mediator){ mediator.onRemove(); }; return (mediator); } public function registerObserver(notificationName:String, observer:IObserver):void{ if (observerMap[notificationName] != null){ observerMap[notificationName].push(observer); } else { observerMap[notificationName] = [observer]; }; } public static function getInstance():IView{ if (instance == null){ instance = new (View); }; return (instance); } } }//package org.puremvc.as3.core.view
Section 275
//ICommand (org.puremvc.as3.interfaces.ICommand) package org.puremvc.as3.interfaces { public interface ICommand { function execute(:INotification):void; } }//package org.puremvc.as3.interfaces
Section 276
//IController (org.puremvc.as3.interfaces.IController) package org.puremvc.as3.interfaces { public interface IController { function registerCommand(_arg1:String, _arg2:Class):void; function hasCommand(org.puremvc.as3.interfaces:IController/org.puremvc.as3.interfaces:IController:registerCommand:String):Boolean; function executeCommand(:INotification):void; function removeCommand(:String):void; } }//package org.puremvc.as3.interfaces
Section 277
//IFacade (org.puremvc.as3.interfaces.IFacade) package org.puremvc.as3.interfaces { public interface IFacade extends INotifier { function removeCommand(:String):void; function registerCommand(_arg1:String, _arg2:Class):void; function removeProxy(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IFacade.as:String):IProxy; function registerProxy(:IProxy):void; function hasMediator(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function retrieveMediator(org.puremvc.as3.interfaces:String):IMediator; function hasCommand(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function retrieveProxy(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IFacade.as:String):IProxy; function hasProxy(org.puremvc.as3.interfaces:IFacade/org.puremvc.as3.interfaces:IFacade:registerProxy:String):Boolean; function registerMediator(:IMediator):void; function removeMediator(org.puremvc.as3.interfaces:String):IMediator; } }//package org.puremvc.as3.interfaces
Section 278
//IMediator (org.puremvc.as3.interfaces.IMediator) package org.puremvc.as3.interfaces { public interface IMediator { function listNotificationInterests():Array; function onRegister():void; function handleNotification(org.puremvc.as3.interfaces:IMediator/org.puremvc.as3.interfaces:IMediator:getMediatorName:INotification):void; function getMediatorName():String; function setViewComponent(org.puremvc.as3.interfaces:IMediator/org.puremvc.as3.interfaces:IMediator:getMediatorName:Object):void; function getViewComponent():Object; function onRemove():void; } }//package org.puremvc.as3.interfaces
Section 279
//IModel (org.puremvc.as3.interfaces.IModel) package org.puremvc.as3.interfaces { public interface IModel { function removeProxy(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IModel.as:String):IProxy; function retrieveProxy(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IModel.as:String):IProxy; function registerProxy(:IProxy):void; function hasProxy(org.puremvc.as3.interfaces:IModel/org.puremvc.as3.interfaces:IModel:registerProxy:String):Boolean; } }//package org.puremvc.as3.interfaces
Section 280
//INotification (org.puremvc.as3.interfaces.INotification) package org.puremvc.as3.interfaces { public interface INotification { function getType():String; function getName():String; function toString():String; function setBody(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;INotification.as:Object):void; function getBody():Object; function setType(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;INotification.as:String):void; } }//package org.puremvc.as3.interfaces
Section 281
//INotifier (org.puremvc.as3.interfaces.INotifier) package org.puremvc.as3.interfaces { public interface INotifier { function sendNotification(_arg1:String, _arg2:Object=null, _arg3:String=null):void; } }//package org.puremvc.as3.interfaces
Section 282
//IObserver (org.puremvc.as3.interfaces.IObserver) package org.puremvc.as3.interfaces { public interface IObserver { function compareNotifyContext(void:Object):Boolean; function setNotifyContext(:Object):void; function setNotifyMethod(:Function):void; function notifyObserver(:INotification):void; } }//package org.puremvc.as3.interfaces
Section 283
//IProxy (org.puremvc.as3.interfaces.IProxy) package org.puremvc.as3.interfaces { public interface IProxy { function getData():Object; function getProxyName():String; function setData(E:\Flash\Classes\PureMVC_AS3_2_0_RC3;org\puremvc\as3\interfaces;IProxy.as:Object):void; } }//package org.puremvc.as3.interfaces
Section 284
//IView (org.puremvc.as3.interfaces.IView) package org.puremvc.as3.interfaces { public interface IView { function notifyObservers(:INotification):void; function registerMediator(:IMediator):void; function removeMediator(org.puremvc.as3.interfaces:IView/org.puremvc.as3.interfaces:IView:registerObserver:String):IMediator; function registerObserver(_arg1:String, _arg2:IObserver):void; function hasMediator(void:String):Boolean; function retrieveMediator(org.puremvc.as3.interfaces:IView/org.puremvc.as3.interfaces:IView:registerObserver:String):IMediator; } }//package org.puremvc.as3.interfaces
Section 285
//SimpleCommand (org.puremvc.as3.patterns.command.SimpleCommand) package org.puremvc.as3.patterns.command { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class SimpleCommand extends Notifier implements ICommand, INotifier { public function SimpleCommand(){ super(); } public function execute(notification:INotification):void{ } } }//package org.puremvc.as3.patterns.command
Section 286
//Facade (org.puremvc.as3.patterns.facade.Facade) package org.puremvc.as3.patterns.facade { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.core.view.*; import org.puremvc.as3.core.controller.*; import org.puremvc.as3.core.model.*; import org.puremvc.as3.patterns.observer.*; public class Facade implements IFacade { protected const SINGLETON_MSG:String = "Facade Singleton already constructed!"; protected var controller:IController; protected var view:IView; protected var model:IModel; protected static var instance:IFacade; public function Facade(){ super(); if (instance != null){ throw (Error(SINGLETON_MSG)); }; instance = this; initializeFacade(); } public function removeProxy(proxyName:String):IProxy{ var proxy:IProxy; if (model != null){ proxy = model.removeProxy(proxyName); }; return (proxy); } public function registerProxy(proxy:IProxy):void{ model.registerProxy(proxy); } protected function initializeController():void{ if (controller != null){ return; }; controller = Controller.getInstance(); } protected function initializeFacade():void{ initializeModel(); initializeController(); initializeView(); } public function retrieveProxy(proxyName:String):IProxy{ return (model.retrieveProxy(proxyName)); } public function sendNotification(notificationName:String, body:Object=null, type:String=null):void{ notifyObservers(new Notification(notificationName, body, type)); } public function notifyObservers(notification:INotification):void{ if (view != null){ view.notifyObservers(notification); }; } protected function initializeView():void{ if (view != null){ return; }; view = View.getInstance(); } public function retrieveMediator(mediatorName:String):IMediator{ return ((view.retrieveMediator(mediatorName) as IMediator)); } public function removeMediator(mediatorName:String):IMediator{ var mediator:IMediator; if (view != null){ mediator = view.removeMediator(mediatorName); }; return (mediator); } public function hasCommand(notificationName:String):Boolean{ return (controller.hasCommand(notificationName)); } public function removeCommand(notificationName:String):void{ controller.removeCommand(notificationName); } public function registerCommand(notificationName:String, commandClassRef:Class):void{ controller.registerCommand(notificationName, commandClassRef); } public function hasMediator(mediatorName:String):Boolean{ return (view.hasMediator(mediatorName)); } public function registerMediator(mediator:IMediator):void{ if (view != null){ view.registerMediator(mediator); }; } protected function initializeModel():void{ if (model != null){ return; }; model = Model.getInstance(); } public function hasProxy(proxyName:String):Boolean{ return (model.hasProxy(proxyName)); } public static function getInstance():IFacade{ if (instance == null){ instance = new (Facade); }; return (instance); } } }//package org.puremvc.as3.patterns.facade
Section 287
//Mediator (org.puremvc.as3.patterns.mediator.Mediator) package org.puremvc.as3.patterns.mediator { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class Mediator extends Notifier implements IMediator, INotifier { protected var viewComponent:Object; protected var mediatorName:String; public static const NAME:String = "Mediator"; public function Mediator(mediatorName:String=null, viewComponent:Object=null){ super(); this.mediatorName = ((mediatorName)!=null) ? mediatorName : NAME; this.viewComponent = viewComponent; } public function listNotificationInterests():Array{ return ([]); } public function onRegister():void{ } public function onRemove():void{ } public function getViewComponent():Object{ return (viewComponent); } public function handleNotification(notification:INotification):void{ } public function getMediatorName():String{ return (mediatorName); } public function setViewComponent(viewComponent:Object):void{ this.viewComponent = viewComponent; } } }//package org.puremvc.as3.patterns.mediator
Section 288
//Notification (org.puremvc.as3.patterns.observer.Notification) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; public class Notification implements INotification { private var body:Object; private var name:String; private var type:String; public function Notification(name:String, body:Object=null, type:String=null){ super(); this.name = name; this.body = body; this.type = type; } public function setBody(body:Object):void{ this.body = body; } public function getName():String{ return (name); } public function toString():String{ var msg:String = ("Notification Name: " + getName()); msg = (msg + ("\nBody:" + ((body)==null) ? "null" : body.toString())); msg = (msg + ("\nType:" + ((type)==null) ? "null" : type)); return (msg); } public function getType():String{ return (type); } public function setType(type:String):void{ this.type = type; } public function getBody():Object{ return (body); } } }//package org.puremvc.as3.patterns.observer
Section 289
//Notifier (org.puremvc.as3.patterns.observer.Notifier) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.facade.*; public class Notifier implements INotifier { protected var facade:IFacade; public function Notifier(){ facade = Facade.getInstance(); super(); } public function sendNotification(notificationName:String, body:Object=null, type:String=null):void{ facade.sendNotification(notificationName, body, type); } } }//package org.puremvc.as3.patterns.observer
Section 290
//Observer (org.puremvc.as3.patterns.observer.Observer) package org.puremvc.as3.patterns.observer { import org.puremvc.as3.interfaces.*; public class Observer implements IObserver { private var notify:Function; private var context:Object; public function Observer(notifyMethod:Function, notifyContext:Object){ super(); setNotifyMethod(notifyMethod); setNotifyContext(notifyContext); } private function getNotifyMethod():Function{ return (notify); } public function compareNotifyContext(object:Object):Boolean{ return ((object === this.context)); } public function setNotifyContext(notifyContext:Object):void{ context = notifyContext; } private function getNotifyContext():Object{ return (context); } public function setNotifyMethod(notifyMethod:Function):void{ notify = notifyMethod; } public function notifyObserver(notification:INotification):void{ this.getNotifyMethod().apply(this.getNotifyContext(), [notification]); } } }//package org.puremvc.as3.patterns.observer
Section 291
//Proxy (org.puremvc.as3.patterns.proxy.Proxy) package org.puremvc.as3.patterns.proxy { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; public class Proxy extends Notifier implements IProxy, INotifier { protected var proxyName:String; protected var data:Object; public static var NAME:String = "Proxy"; public function Proxy(proxyName:String=null, data:Object=null){ super(); this.proxyName = ((proxyName)!=null) ? proxyName : NAME; if (data != null){ setData(data); }; } public function getData():Object{ return (data); } public function getProxyName():String{ return (proxyName); } public function setData(data:Object):void{ this.data = data; } } }//package org.puremvc.as3.patterns.proxy
Section 292
//ApplicationFacade (ApplicationFacade) package { import org.puremvc.as3.interfaces.*; import com.luminicbox.log.*; import flash.display.*; import org.puremvc.as3.patterns.facade.*; import org.puremvc.as3.patterns.observer.*; import game.controller.*; public class ApplicationFacade extends Facade implements IFacade { public var viewContainer:Sprite; public var logger:Logger; public var agiContainer:Sprite; public static const STARTUP:String = "Startup"; public function ApplicationFacade(){ super(); } override protected function initializeController():void{ super.initializeController(); registerCommand(STARTUP, StartupCommand); } public function startup(startupObj:Object):void{ var container:Sprite = startupObj.container; viewContainer = new Sprite(); container.addChild(viewContainer); agiContainer = new Sprite(); container.addChild(agiContainer); notifyObservers(new Notification(STARTUP, startupObj)); } public static function getInstance():ApplicationFacade{ if (instance == null){ instance = new (ApplicationFacade); }; return ((instance as ApplicationFacade)); } } }//package
Section 293
//CellRenderer_disabledSkin (CellRenderer_disabledSkin) package { import flash.display.*; public dynamic class CellRenderer_disabledSkin extends MovieClip { } }//package
Section 294
//CellRenderer_downSkin (CellRenderer_downSkin) package { import flash.display.*; public dynamic class CellRenderer_downSkin extends MovieClip { } }//package
Section 295
//CellRenderer_overSkin (CellRenderer_overSkin) package { import flash.display.*; public dynamic class CellRenderer_overSkin extends MovieClip { } }//package
Section 296
//CellRenderer_selectedDisabledSkin (CellRenderer_selectedDisabledSkin) package { import flash.display.*; public dynamic class CellRenderer_selectedDisabledSkin extends MovieClip { } }//package
Section 297
//CellRenderer_selectedDownSkin (CellRenderer_selectedDownSkin) package { import flash.display.*; public dynamic class CellRenderer_selectedDownSkin extends MovieClip { } }//package
Section 298
//CellRenderer_selectedOverSkin (CellRenderer_selectedOverSkin) package { import flash.display.*; public dynamic class CellRenderer_selectedOverSkin extends MovieClip { } }//package
Section 299
//CellRenderer_selectedUpSkin (CellRenderer_selectedUpSkin) package { import flash.display.*; public dynamic class CellRenderer_selectedUpSkin extends MovieClip { } }//package
Section 300
//CellRenderer_upSkin (CellRenderer_upSkin) package { import flash.display.*; public dynamic class CellRenderer_upSkin extends MovieClip { } }//package
Section 301
//ColumnStretch_cursor (ColumnStretch_cursor) package { import flash.display.*; public dynamic class ColumnStretch_cursor extends MovieClip { } }//package
Section 302
//DataGrid_skin (DataGrid_skin) package { import flash.display.*; public dynamic class DataGrid_skin extends MovieClip { } }//package
Section 303
//DataGridCellEditor_skin (DataGridCellEditor_skin) package { import flash.display.*; public dynamic class DataGridCellEditor_skin extends MovieClip { } }//package
Section 304
//Factory (Factory) package { import flash.events.*; import caurina.transitions.*; import flash.display.*; import com.midasplayer.*; import flash.ui.*; import flash.net.*; import flash.utils.*; public class Factory extends MovieClip { private var dragonLoader:DragonLoader; private var preloader:KingPreloader; private var preloader2:Preloader; private var gameName:String; public static var VERSION_KONG:Boolean; public static var VERSION_MYGAME:Boolean; public static var VERSION_ARMORGAMES:Boolean; public static var VERSION_OLOLOGAMES:Boolean; public static var VERSION_WHIRLED:Boolean; public static var VERSION_APPLECART:Boolean; public static var VERSION_UQUDOS:Boolean; public static var VERSION_YAHOO:Boolean; public static var VERSION_ANDKON:Boolean; public static var VERSION_LOCAL:Boolean; public static var VERSION_FREEONLINEGAMES:Boolean; public static var kongregate; public function Factory():void{ super(); init(); } private function preloaderCompleteHandler(e:Event):void{ dragonLoader = new DragonLoader(); addChild(dragonLoader); dragonLoader.addEventListener(DragonLoader.LAUNCH_GAME, launchGameHandler); dragonLoader.init(gameName, "dba8b01a"); } private function kongAPILoadComplete(event:Event):void{ kongregate = event.target.content; kongregate.services.connect(); trace(("\n" + kongregate.services)); trace(("\n" + kongregate.user)); trace(("\n" + kongregate.scores)); trace(("\n" + kongregate.stats)); } private function checkDomain():Boolean{ var url:String = stage.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); VERSION_KONG = ((domain == "kongregate.com")) ? true : false; VERSION_UQUDOS = ((domain == "uqudos.com")) ? true : false; VERSION_ANDKON = ((domain == "andkon.com")) ? true : false; VERSION_APPLECART = ((((domain == "applecartgames.com")) || ((domain == "isfland.com")))) ? true : false; VERSION_WHIRLED = ((domain == "whirled.com")) ? true : false; VERSION_FREEONLINEGAMES = ((domain == "freeonlinegames.com")) ? true : false; VERSION_YAHOO = ((domain == "yimg.com")) ? true : false; VERSION_ARMORGAMES = ((domain == "armorgames.com")) ? true : false; VERSION_OLOLOGAMES = ((domain == "olologames.com")) ? true : false; VERSION_LOCAL = ((domain == "")) ? true : false; trace("DOMAIN: ", domain); if ((((((domain == "flashgamelicense.com")) || ((domain == "king.com")))) || ((domain == "mygame.com")))){ return (true); }; return (false); } private function launchGameHandler(e:Event):void{ nextFrame(); initApp(); } private function preload(e:Event):void{ VERSION_MYGAME = (checkDomain()) ? true : false; preloader = new KingPreloader(this); addChild(preloader); preloader.addEventListener(Event.COMPLETE, preloaderCompleteHandler); if (VERSION_KONG){ initKongAPI(); }; } private function initKongAPI():void{ var paramObj:Object = LoaderInfo(root.loaderInfo).parameters; var api_url:String = ((paramObj.api_path) || ("http://www.kongregate.com/flash/API_AS3_Local.swf")); trace(("API path: " + api_url)); var request:URLRequest = new URLRequest(api_url); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, kongAPILoadComplete); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, kongAPIErrorHandler); loader.load(request); this.addChild(loader); } private function init():void{ stop(); gameName = "splitter"; Tweener.init(); var myContextMenu:ContextMenu = new ContextMenu(); myContextMenu.hideBuiltInItems(); contextMenu = myContextMenu; checkDomain(); if (((((VERSION_LOCAL) || (VERSION_ARMORGAMES))) || (VERSION_OLOLOGAMES))){ preloader2 = new Preloader(this); addChild(preloader2); preloader2.addEventListener(Preloader.COMPLETE, preloader2CompleteHandler); }; } private function initApp():void{ var app:Object; var mainClass:Class = (getDefinitionByName("Splitter2Armor") as Class); if (mainClass){ app = new (mainClass); addChild((app as DisplayObject)); }; } private function preloader2CompleteHandler(e:Event):void{ preloader2.removeEventListener(Preloader.COMPLETE, preloader2CompleteHandler); nextFrame(); initApp(); } private function kongAPIErrorHandler(e:IOErrorEvent):void{ trace("ZZ", e.text); } } }//package
Section 305
//focusRectSkin (focusRectSkin) package { import flash.display.*; public dynamic class focusRectSkin extends MovieClip { } }//package
Section 306
//HeaderRenderer_disabledSkin (HeaderRenderer_disabledSkin) package { import flash.display.*; public dynamic class HeaderRenderer_disabledSkin extends MovieClip { } }//package
Section 307
//HeaderRenderer_downSkin (HeaderRenderer_downSkin) package { import flash.display.*; public dynamic class HeaderRenderer_downSkin extends MovieClip { } }//package
Section 308
//HeaderRenderer_overSkin (HeaderRenderer_overSkin) package { import flash.display.*; public dynamic class HeaderRenderer_overSkin extends MovieClip { } }//package
Section 309
//HeaderRenderer_selectedDisabledSkin (HeaderRenderer_selectedDisabledSkin) package { import flash.display.*; public dynamic class HeaderRenderer_selectedDisabledSkin extends MovieClip { } }//package
Section 310
//HeaderRenderer_selectedDownSkin (HeaderRenderer_selectedDownSkin) package { import flash.display.*; public dynamic class HeaderRenderer_selectedDownSkin extends MovieClip { } }//package
Section 311
//HeaderRenderer_selectedOverSkin (HeaderRenderer_selectedOverSkin) package { import flash.display.*; public dynamic class HeaderRenderer_selectedOverSkin extends MovieClip { } }//package
Section 312
//HeaderRenderer_selectedUpSkin (HeaderRenderer_selectedUpSkin) package { import flash.display.*; public dynamic class HeaderRenderer_selectedUpSkin extends MovieClip { } }//package
Section 313
//HeaderRenderer_upSkin (HeaderRenderer_upSkin) package { import flash.display.*; public dynamic class HeaderRenderer_upSkin extends MovieClip { } }//package
Section 314
//HeaderSortArrow_ascIcon (HeaderSortArrow_ascIcon) package { import flash.display.*; public dynamic class HeaderSortArrow_ascIcon extends MovieClip { } }//package
Section 315
//HeaderSortArrow_descIcon (HeaderSortArrow_descIcon) package { import flash.display.*; public dynamic class HeaderSortArrow_descIcon extends MovieClip { } }//package
Section 316
//KingPreloader (KingPreloader) package { import flash.events.*; import flash.display.*; import com.midasplayer.*; import com.midasplayer.particle.*; public class KingPreloader extends Sprite { private var WindowClass:Class; private var factory:Factory; private var bar:Sprite; private var barHolder:Sprite; private var back:Sprite; private var continue_bt:SimpleButton; private var particles:MainParticles; private var window:Sprite; private var particlesHolder:Sprite; private var adsBox:Sprite; private var adsHolder:Sprite; public function KingPreloader(factory:Factory):void{ WindowClass = KingPreloader_WindowClass; super(); this.factory = factory; init(); } private function backClickHandler(e:MouseEvent):void{ KingAPI.openLoaderProgressLink(); } private function continueClickHandler(e:MouseEvent):void{ continue_bt.removeEventListener(MouseEvent.CLICK, continueClickHandler); parent.removeChild(this); dispatchEvent(new Event(Event.COMPLETE)); } private function init():void{ window = new WindowClass(); addChild(window); back = (window.getChildByName("back") as Sprite); barHolder = (window.getChildByName("barHolder") as Sprite); bar = (barHolder.getChildByName("bar") as Sprite); particlesHolder = new Sprite(); barHolder.addChild(particlesHolder); particlesHolder.y = bar.y; back.buttonMode = true; back.addEventListener(MouseEvent.CLICK, backClickHandler); particles = new MainParticles(); particles.setEmitterClip(particlesHolder); addChild(particles); adsHolder = (window.getChildByName("adsHolder") as Sprite); adsBox = (adsHolder.getChildByName("adBox") as Sprite); continue_bt = (adsHolder.getChildByName("continue_bt") as SimpleButton); continue_bt.visible = false; adsHolder.visible = false; addEventListener(Event.ENTER_FRAME, efHandler); } private function efHandler(e:Event):void{ var percent:Number; if (factory.framesLoaded == factory.totalFrames){ removeEventListener(Event.ENTER_FRAME, efHandler); back.removeEventListener(MouseEvent.CLICK, backClickHandler); particles.kill(); removeChild(particles); bar.scaleX = 0; parent.removeChild(this); dispatchEvent(new Event(Event.COMPLETE)); } else { percent = (stage.loaderInfo.bytesLoaded / stage.loaderInfo.bytesTotal); bar.scaleX = (1 - percent); particlesHolder.x = ((percent * 100) + 5); }; } } }//package
Section 317
//KingPreloader_WindowClass (KingPreloader_WindowClass) package { import mx.core.*; import flash.display.*; public class KingPreloader_WindowClass extends SpriteAsset { public var back:DisplayObject; public var adBox:DisplayObject; public var continue_bt:DisplayObject; public var bar:DisplayObject; public var adsHolder:DisplayObject; public var barHolder:DisplayObject; } }//package
Section 318
//Preloader (Preloader) package { import flash.events.*; import flash.display.*; import flash.ui.*; import flash.net.*; public class Preloader extends Sprite { private var myContextMenu:ContextMenu; private var sponsorLogo:Sprite; private var windowClass:Class; private var armor:Sprite; private var window:Sprite; private var factory:Factory; private var bar:Sprite; private var play_bt:SimpleButton; private var barHolder:Sprite; public static const COMPLETE:String = "PreloadComplete"; public function Preloader(factory:Factory):void{ windowClass = Preloader_windowClass; super(); this.factory = factory; window = new windowClass(); window.tabChildren = false; addChild(window); barHolder = (window.getChildByName("barHolder") as Sprite); bar = (barHolder.getChildByName("bar") as Sprite); play_bt = (window.getChildByName("play_bt") as SimpleButton); armor = (window.getChildByName("armor") as Sprite); bar.scaleX = 0; addEventListener(Event.ENTER_FRAME, efHandler); play_bt.visible = false; play_bt.addEventListener(MouseEvent.CLICK, playClickHandler); armor.buttonMode = true; armor.addEventListener(MouseEvent.CLICK, armorClickHandler); } private function armorClickHandler(e:MouseEvent):void{ navigateToURL(new URLRequest("http://armorgames.com"), "_blank"); } private function efHandler(e:Event):void{ var percent:Number; graphics.clear(); if (factory.framesLoaded == factory.totalFrames){ bar.scaleX = 0; removeEventListener(Event.ENTER_FRAME, efHandler); play_bt.visible = true; } else { percent = (root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal); bar.scaleX = (1 - percent); }; } private function playClickHandler(e:MouseEvent):void{ play_bt.removeEventListener(MouseEvent.CLICK, playClickHandler); dispatchEvent(new Event(COMPLETE)); } } }//package
Section 319
//Preloader_windowClass (Preloader_windowClass) package { import mx.core.*; import flash.display.*; public class Preloader_windowClass extends SpriteAsset { public var bar:DisplayObject; public var barHolder:DisplayObject; public var play_bt:DisplayObject; public var armor:DisplayObject; } }//package
Section 320
//ScrollArrowDown_disabledSkin (ScrollArrowDown_disabledSkin) package { import flash.display.*; public dynamic class ScrollArrowDown_disabledSkin extends MovieClip { } }//package
Section 321
//ScrollArrowDown_downSkin (ScrollArrowDown_downSkin) package { import flash.display.*; public dynamic class ScrollArrowDown_downSkin extends MovieClip { } }//package
Section 322
//ScrollArrowDown_overSkin (ScrollArrowDown_overSkin) package { import flash.display.*; public dynamic class ScrollArrowDown_overSkin extends MovieClip { } }//package
Section 323
//ScrollArrowDown_upSkin (ScrollArrowDown_upSkin) package { import flash.display.*; public dynamic class ScrollArrowDown_upSkin extends MovieClip { } }//package
Section 324
//ScrollArrowUp_disabledSkin (ScrollArrowUp_disabledSkin) package { import flash.display.*; public dynamic class ScrollArrowUp_disabledSkin extends MovieClip { } }//package
Section 325
//ScrollArrowUp_downSkin (ScrollArrowUp_downSkin) package { import flash.display.*; public dynamic class ScrollArrowUp_downSkin extends MovieClip { } }//package
Section 326
//ScrollArrowUp_overSkin (ScrollArrowUp_overSkin) package { import flash.display.*; public dynamic class ScrollArrowUp_overSkin extends MovieClip { } }//package
Section 327
//ScrollArrowUp_upSkin (ScrollArrowUp_upSkin) package { import flash.display.*; public dynamic class ScrollArrowUp_upSkin extends MovieClip { } }//package
Section 328
//ScrollBar_thumbIcon (ScrollBar_thumbIcon) package { import flash.display.*; public dynamic class ScrollBar_thumbIcon extends MovieClip { } }//package
Section 329
//ScrollThumb_downSkin (ScrollThumb_downSkin) package { import flash.display.*; public dynamic class ScrollThumb_downSkin extends MovieClip { } }//package
Section 330
//ScrollThumb_overSkin (ScrollThumb_overSkin) package { import flash.display.*; public dynamic class ScrollThumb_overSkin extends MovieClip { } }//package
Section 331
//ScrollThumb_upSkin (ScrollThumb_upSkin) package { import flash.display.*; public dynamic class ScrollThumb_upSkin extends MovieClip { } }//package
Section 332
//ScrollTrack_skin (ScrollTrack_skin) package { import flash.display.*; public dynamic class ScrollTrack_skin extends MovieClip { } }//package
Section 333
//Splitter2Armor (Splitter2Armor) package { import flash.events.*; import flash.display.*; public class Splitter2Armor extends Sprite { public function Splitter2Armor(){ super(); addEventListener(Event.ADDED_TO_STAGE, addedHandler); } private function addedHandler(e:Event):void{ ApplicationFacade.getInstance().startup({container:this}); } } }//package
Section 334
//TextInput_disabledSkin (TextInput_disabledSkin) package { import flash.display.*; public dynamic class TextInput_disabledSkin extends MovieClip { } }//package
Section 335
//TextInput_upSkin (TextInput_upSkin) package { import flash.display.*; public dynamic class TextInput_upSkin extends MovieClip { } }//package

Library Items

Symbol 1 GraphicUsed by:22
Symbol 2 BitmapUsed by:3 56
Symbol 3 GraphicUses:2Used by:8
Symbol 4 BitmapUsed by:5 57
Symbol 5 GraphicUses:4Used by:8
Symbol 6 BitmapUsed by:7 58
Symbol 7 GraphicUses:6Used by:8
Symbol 8 ButtonUses:3 5 7Used by:22
Symbol 9 BitmapUsed by:10
Symbol 10 GraphicUses:9Used by:13
Symbol 11 GraphicUsed by:12
Symbol 12 MovieClipUses:11Used by:13
Symbol 13 MovieClipUses:10 12Used by:22
Symbol 14 GraphicUsed by:21
Symbol 15 BitmapUsed by:16
Symbol 16 GraphicUses:15Used by:17
Symbol 17 MovieClipUses:16Used by:21
Symbol 18 GraphicUsed by:21
Symbol 19 GraphicUsed by:20
Symbol 20 MovieClipUses:19Used by:21
Symbol 21 MovieClipUses:14 17 18 20Used by:22
Symbol 22 MovieClip {Preloader_windowClass} [PreloaderWindow]Uses:1 8 13 21
Symbol 23 BitmapUsed by:24
Symbol 24 GraphicUses:23Used by:27
Symbol 25 GraphicUsed by:26
Symbol 26 MovieClipUses:25Used by:27
Symbol 27 MovieClipUses:24 26Used by:42
Symbol 28 GraphicUsed by:29
Symbol 29 MovieClipUses:28Used by:42
Symbol 30 GraphicUsed by:31
Symbol 31 MovieClipUses:30Used by:41
Symbol 32 GraphicUsed by:33 40
Symbol 33 MovieClipUses:32Used by:39
Symbol 34 GraphicUsed by:39 40
Symbol 35 FontUsed by:36
Symbol 36 TextUses:35Used by:39 40
Symbol 37 GraphicUsed by:38 40
Symbol 38 MovieClipUses:37Used by:39
Symbol 39 MovieClipUses:33 34 36 38Used by:40
Symbol 40 ButtonUses:39 32 34 36 37Used by:41
Symbol 41 MovieClipUses:31 40Used by:42
Symbol 42 MovieClip {KingPreloader_WindowClass} [KingLoaderAsset]Uses:27 29 41
Symbol 43 BitmapUsed by:44
Symbol 44 GraphicUses:43Used by:45
Symbol 45 MovieClip {com.midasplayer.DragonLoader_GlimmerClass} [mcGlimmer]Uses:44
Symbol 46 VideoUsed by:48
Symbol 47 SoundUsed by:48
Symbol 48 MovieClipUses:46 47Used by:60
Symbol 49 VideoUsed by:50
Symbol 50 MovieClipUses:49Used by:60
Symbol 51 GraphicUsed by:52
Symbol 52 MovieClipUses:51Used by:55
Symbol 53 FontUsed by:54
Symbol 54 EditableTextUses:53Used by:55
Symbol 55 MovieClipUses:52 54Used by:60
Symbol 56 GraphicUses:2Used by:59
Symbol 57 GraphicUses:4Used by:59
Symbol 58 GraphicUses:6Used by:59
Symbol 59 MovieClipUses:56 57 58Used by:60
Symbol 60 MovieClip {com.midasplayer.DragonLoader_WindowClass} [DragonLoaderWindow]Uses:48 50 55 59
Symbol 61 Sound {com.midasplayer.DragonLoader_SndBellClass} [sfxBell]
Symbol 62 BitmapUsed by:63
Symbol 63 GraphicUses:62Used by:108
Symbol 64 BitmapUsed by:65
Symbol 65 GraphicUses:64Used by:108
Symbol 66 BitmapUsed by:67
Symbol 67 GraphicUses:66Used by:108
Symbol 68 BitmapUsed by:69
Symbol 69 GraphicUses:68Used by:108
Symbol 70 BitmapUsed by:71
Symbol 71 GraphicUses:70Used by:108
Symbol 72 BitmapUsed by:73
Symbol 73 GraphicUses:72Used by:108
Symbol 74 BitmapUsed by:75
Symbol 75 GraphicUses:74Used by:108
Symbol 76 BitmapUsed by:77
Symbol 77 GraphicUses:76Used by:108
Symbol 78 BitmapUsed by:79
Symbol 79 GraphicUses:78Used by:108
Symbol 80 BitmapUsed by:81
Symbol 81 GraphicUses:80Used by:108
Symbol 82 BitmapUsed by:83
Symbol 83 GraphicUses:82Used by:108
Symbol 84 BitmapUsed by:85
Symbol 85 GraphicUses:84Used by:108
Symbol 86 BitmapUsed by:87
Symbol 87 GraphicUses:86Used by:108
Symbol 88 BitmapUsed by:89
Symbol 89 GraphicUses:88Used by:108
Symbol 90 BitmapUsed by:91
Symbol 91 GraphicUses:90Used by:108
Symbol 92 BitmapUsed by:93
Symbol 93 GraphicUses:92Used by:108
Symbol 94 BitmapUsed by:95
Symbol 95 GraphicUses:94Used by:108
Symbol 96 BitmapUsed by:97
Symbol 97 GraphicUses:96Used by:108
Symbol 98 BitmapUsed by:99
Symbol 99 GraphicUses:98Used by:108
Symbol 100 BitmapUsed by:101
Symbol 101 GraphicUses:100Used by:108
Symbol 102 BitmapUsed by:103
Symbol 103 GraphicUses:102Used by:108
Symbol 104 BitmapUsed by:105
Symbol 105 GraphicUses:104Used by:108
Symbol 106 BitmapUsed by:107
Symbol 107 GraphicUses:106Used by:108
Symbol 108 MovieClip {com.midasplayer.particle.MainParticles_SparkClass} [spark]Uses:63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107
Symbol 109 BinaryData {core.CoreAssets_Assets} [core.CoreAssets_Assets]
Symbol 110 GraphicUsed by:111
Symbol 111 MovieClip {CellRenderer_upSkin} [CellRenderer_upSkin]Uses:110Used by:127
Symbol 112 MovieClip {fl.core.ComponentShim} [fl.core.ComponentShim]Used by:127 145 183 186 190
Symbol 113 GraphicUsed by:114
Symbol 114 MovieClip {CellRenderer_disabledSkin} [CellRenderer_disabledSkin]Uses:113Used by:127
Symbol 115 GraphicUsed by:116
Symbol 116 MovieClip {CellRenderer_downSkin} [CellRenderer_downSkin]Uses:115Used by:127
Symbol 117 GraphicUsed by:118
Symbol 118 MovieClip {CellRenderer_overSkin} [CellRenderer_overSkin]Uses:117Used by:127
Symbol 119 GraphicUsed by:120
Symbol 120 MovieClip {CellRenderer_selectedDisabledSkin} [CellRenderer_selectedDisabledSkin]Uses:119Used by:127
Symbol 121 GraphicUsed by:122
Symbol 122 MovieClip {CellRenderer_selectedDownSkin} [CellRenderer_selectedDownSkin]Uses:121Used by:127
Symbol 123 GraphicUsed by:124
Symbol 124 MovieClip {CellRenderer_selectedOverSkin} [CellRenderer_selectedOverSkin]Uses:123Used by:127
Symbol 125 GraphicUsed by:126
Symbol 126 MovieClip {CellRenderer_selectedUpSkin} [CellRenderer_selectedUpSkin]Uses:125Used by:127
Symbol 127 MovieClip {fl.controls.listClasses.CellRenderer} [fl.controls.listClasses.CellRenderer]Uses:111 112 114 116 118 120 122 124 126Used by:186
Symbol 128 GraphicUsed by:129
Symbol 129 MovieClipUses:128Used by:186 190
Symbol 130 GraphicUsed by:131
Symbol 131 MovieClip {HeaderRenderer_upSkin} [HeaderRenderer_upSkin]Uses:130Used by:145
Symbol 132 GraphicUsed by:133
Symbol 133 MovieClip {HeaderRenderer_disabledSkin} [HeaderRenderer_disabledSkin]Uses:132Used by:145
Symbol 134 GraphicUsed by:135 140
Symbol 135 MovieClip {HeaderRenderer_downSkin} [HeaderRenderer_downSkin]Uses:134Used by:145
Symbol 136 GraphicUsed by:137
Symbol 137 MovieClip {HeaderRenderer_overSkin} [HeaderRenderer_overSkin]Uses:136Used by:145
Symbol 138 GraphicUsed by:139
Symbol 139 MovieClip {HeaderRenderer_selectedDisabledSkin} [HeaderRenderer_selectedDisabledSkin]Uses:138Used by:145
Symbol 140 MovieClip {HeaderRenderer_selectedDownSkin} [HeaderRenderer_selectedDownSkin]Uses:134Used by:145
Symbol 141 GraphicUsed by:142
Symbol 142 MovieClip {HeaderRenderer_selectedOverSkin} [HeaderRenderer_selectedOverSkin]Uses:141Used by:145
Symbol 143 GraphicUsed by:144
Symbol 144 MovieClip {HeaderRenderer_selectedUpSkin} [HeaderRenderer_selectedUpSkin]Uses:143Used by:145
Symbol 145 MovieClip {fl.controls.dataGridClasses.HeaderRenderer} [fl.controls.dataGridClasses.HeaderRenderer]Uses:131 112 133 135 137 139 140 142 144Used by:186
Symbol 146 GraphicUsed by:147 159 162 166 176
Symbol 147 MovieClip {HeaderSortArrow_ascIcon} [HeaderSortArrow_ascIcon]Uses:146Used by:186
Symbol 148 GraphicUsed by:149
Symbol 149 MovieClip {HeaderSortArrow_descIcon} [HeaderSortArrow_descIcon]Uses:148Used by:186
Symbol 150 GraphicUsed by:151
Symbol 151 MovieClip {focusRectSkin} [focusRectSkin]Uses:150Used by:183 186 190
Symbol 152 GraphicUsed by:153
Symbol 153 MovieClip {ColumnStretch_cursor} [ColumnStretch_cursor]Uses:152Used by:186
Symbol 154 GraphicUsed by:155
Symbol 155 MovieClip {DataGrid_skin} [DataGrid_skin]Uses:154Used by:186
Symbol 156 GraphicUsed by:157
Symbol 157 MovieClip {ScrollTrack_skin} [ScrollTrack_skin]Uses:156Used by:183
Symbol 158 GraphicUsed by:160
Symbol 159 MovieClipUses:146Used by:160 170 172
Symbol 160 MovieClip {ScrollArrowUp_downSkin} [ScrollArrowUp_downSkin]Uses:158 159Used by:183
Symbol 161 GraphicUsed by:162
Symbol 162 MovieClip {ScrollArrowDown_downSkin} [ScrollArrowDown_downSkin]Uses:161 146Used by:183
Symbol 163 GraphicUsed by:164
Symbol 164 MovieClip {ScrollThumb_downSkin} [ScrollThumb_downSkin]Uses:163Used by:183
Symbol 165 GraphicUsed by:166
Symbol 166 MovieClip {ScrollArrowDown_overSkin} [ScrollArrowDown_overSkin]Uses:165 146Used by:183
Symbol 167 GraphicUsed by:168
Symbol 168 MovieClip {ScrollThumb_overSkin} [ScrollThumb_overSkin]Uses:167Used by:183
Symbol 169 GraphicUsed by:170
Symbol 170 MovieClip {ScrollArrowUp_overSkin} [ScrollArrowUp_overSkin]Uses:169 159Used by:183
Symbol 171 GraphicUsed by:172
Symbol 172 MovieClip {ScrollArrowUp_upSkin} [ScrollArrowUp_upSkin]Uses:171 159Used by:183
Symbol 173 GraphicUsed by:174
Symbol 174 MovieClip {ScrollThumb_upSkin} [ScrollThumb_upSkin]Uses:173Used by:183
Symbol 175 GraphicUsed by:176
Symbol 176 MovieClip {ScrollArrowDown_upSkin} [ScrollArrowDown_upSkin]Uses:175 146Used by:183
Symbol 177 GraphicUsed by:178
Symbol 178 MovieClip {ScrollArrowDown_disabledSkin} [ScrollArrowDown_disabledSkin]Uses:177Used by:183
Symbol 179 GraphicUsed by:180
Symbol 180 MovieClip {ScrollArrowUp_disabledSkin} [ScrollArrowUp_disabledSkin]Uses:179Used by:183
Symbol 181 GraphicUsed by:182
Symbol 182 MovieClip {ScrollBar_thumbIcon} [ScrollBar_thumbIcon]Uses:181Used by:183
Symbol 183 MovieClip {fl.controls.ScrollBar} [fl.controls.ScrollBar]Uses:157 112 151 160 162 164 166 168 170 172 174 176 178 180 182Used by:186
Symbol 184 GraphicUsed by:185 189
Symbol 185 MovieClip {DataGridCellEditor_skin} [DataGridCellEditor_skin]Uses:184Used by:186
Symbol 186 MovieClip {fl.controls.DataGrid} [fl.controls.DataGrid]Uses:129 112 145 147 149 127 151 153 155 183 185
Symbol 187 GraphicUsed by:188
Symbol 188 MovieClip {TextInput_disabledSkin} [TextInput_disabledSkin]Uses:187Used by:190
Symbol 189 MovieClip {TextInput_upSkin} [TextInput_upSkin]Uses:184Used by:190
Symbol 190 MovieClip {fl.controls.TextInput} [fl.controls.TextInput]Uses:129 112 188 189 151
Symbol 191 GraphicUsed by:192
Symbol 192 MovieClip {game.view.components.ui.CustomCellRenderer_overSkinIncompleteClass} [CellRenderer_overSkinIncomplete]Uses:191
Symbol 193 GraphicUsed by:194
Symbol 194 MovieClip {game.view.components.ui.CustomCellRenderer_upSkinIncompleteClass} [CellRenderer_upSkinIncomplete]Uses:193
Symbol 195 GraphicUsed by:196
Symbol 196 MovieClip {game.view.components.ui.CustomCellRenderer_upSkinCompleteClass} [CellRenderer_upSkinComplete]Uses:195
Symbol 197 GraphicUsed by:198
Symbol 198 MovieClip {game.view.components.ui.CustomCellRenderer_overSkinCompleteClass} [CellRenderer_overSkinComplete]Uses:197
Symbol 199 MovieClip {fl.controls.Button} [fl.controls.Button]
Symbol 200 BinaryData {editor.model.EditorAssets_Assets} [editor.model.EditorAssets_Assets]
Symbol 201 GraphicUsed by:202
Symbol 202 MovieClip {game.view.components.LevelSelectView_headerUpSkinClass}Uses:201
Symbol 203 BinaryData {game.model.GameAssets_Assets}

Instance Names

"bar"Symbol 13 MovieClip Frame 1Symbol 12 MovieClip
"play_bt"Symbol 22 MovieClip {Preloader_windowClass} [PreloaderWindow] Frame 1Symbol 8 Button
"barHolder"Symbol 22 MovieClip {Preloader_windowClass} [PreloaderWindow] Frame 1Symbol 13 MovieClip
"armor"Symbol 22 MovieClip {Preloader_windowClass} [PreloaderWindow] Frame 1Symbol 21 MovieClip
"bar"Symbol 27 MovieClip Frame 1Symbol 26 MovieClip
"adBox"Symbol 41 MovieClip Frame 1Symbol 31 MovieClip
"continue_bt"Symbol 41 MovieClip Frame 1Symbol 40 Button
"barHolder"Symbol 42 MovieClip {KingPreloader_WindowClass} [KingLoaderAsset] Frame 1Symbol 27 MovieClip
"back"Symbol 42 MovieClip {KingPreloader_WindowClass} [KingLoaderAsset] Frame 1Symbol 29 MovieClip
"adsHolder"Symbol 42 MovieClip {KingPreloader_WindowClass} [KingLoaderAsset] Frame 1Symbol 41 MovieClip
"bg"Symbol 55 MovieClip Frame 1Symbol 52 MovieClip
"dragonHolder"Symbol 60 MovieClip {com.midasplayer.DragonLoader_WindowClass} [DragonLoaderWindow] Frame 1Symbol 48 MovieClip
"fireLogoHolder"Symbol 60 MovieClip {com.midasplayer.DragonLoader_WindowClass} [DragonLoaderWindow] Frame 1Symbol 50 MovieClip
"bannedSign"Symbol 60 MovieClip {com.midasplayer.DragonLoader_WindowClass} [DragonLoaderWindow] Frame 1Symbol 55 MovieClip
"mcPlayBtn"Symbol 60 MovieClip {com.midasplayer.DragonLoader_WindowClass} [DragonLoaderWindow] Frame 1Symbol 59 MovieClip

Special Tags

FileAttributes (69)Timeline Frame 1Access network only, Metadata present, AS3.
SWFMetaData (77)Timeline Frame 1457 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 22 as "PreloaderWindow"
ExportAssets (56)Timeline Frame 1Symbol 42 as "KingLoaderAsset"
ExportAssets (56)Timeline Frame 1Symbol 45 as "mcGlimmer"
ExportAssets (56)Timeline Frame 1Symbol 60 as "DragonLoaderWindow"
ExportAssets (56)Timeline Frame 1Symbol 61 as "sfxBell"
ExportAssets (56)Timeline Frame 1Symbol 108 as "spark"
ExportAssets (56)Timeline Frame 2Symbol 109 as "core.CoreAssets_Assets"
ExportAssets (56)Timeline Frame 2Symbol 127 as "fl.controls.listClasses.CellRenderer"
ExportAssets (56)Timeline Frame 2Symbol 186 as "fl.controls.DataGrid"
ExportAssets (56)Timeline Frame 2Symbol 190 as "fl.controls.TextInput"
ExportAssets (56)Timeline Frame 2Symbol 120 as "CellRenderer_selectedDisabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 124 as "CellRenderer_selectedOverSkin"
ExportAssets (56)Timeline Frame 2Symbol 114 as "CellRenderer_disabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 122 as "CellRenderer_selectedDownSkin"
ExportAssets (56)Timeline Frame 2Symbol 126 as "CellRenderer_selectedUpSkin"
ExportAssets (56)Timeline Frame 2Symbol 111 as "CellRenderer_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 116 as "CellRenderer_downSkin"
ExportAssets (56)Timeline Frame 2Symbol 118 as "CellRenderer_overSkin"
ExportAssets (56)Timeline Frame 2Symbol 112 as "fl.core.ComponentShim"
ExportAssets (56)Timeline Frame 2Symbol 192 as "CellRenderer_overSkinIncomplete"
ExportAssets (56)Timeline Frame 2Symbol 194 as "CellRenderer_upSkinIncomplete"
ExportAssets (56)Timeline Frame 2Symbol 196 as "CellRenderer_upSkinComplete"
ExportAssets (56)Timeline Frame 2Symbol 198 as "CellRenderer_overSkinComplete"
ExportAssets (56)Timeline Frame 2Symbol 183 as "fl.controls.ScrollBar"
ExportAssets (56)Timeline Frame 2Symbol 145 as "fl.controls.dataGridClasses.HeaderRenderer"
ExportAssets (56)Timeline Frame 2Symbol 185 as "DataGridCellEditor_skin"
ExportAssets (56)Timeline Frame 2Symbol 151 as "focusRectSkin"
ExportAssets (56)Timeline Frame 2Symbol 153 as "ColumnStretch_cursor"
ExportAssets (56)Timeline Frame 2Symbol 155 as "DataGrid_skin"
ExportAssets (56)Timeline Frame 2Symbol 149 as "HeaderSortArrow_descIcon"
ExportAssets (56)Timeline Frame 2Symbol 147 as "HeaderSortArrow_ascIcon"
ExportAssets (56)Timeline Frame 2Symbol 188 as "TextInput_disabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 189 as "TextInput_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 199 as "fl.controls.Button"
ExportAssets (56)Timeline Frame 2Symbol 172 as "ScrollArrowUp_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 178 as "ScrollArrowDown_disabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 170 as "ScrollArrowUp_overSkin"
ExportAssets (56)Timeline Frame 2Symbol 160 as "ScrollArrowUp_downSkin"
ExportAssets (56)Timeline Frame 2Symbol 162 as "ScrollArrowDown_downSkin"
ExportAssets (56)Timeline Frame 2Symbol 176 as "ScrollArrowDown_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 182 as "ScrollBar_thumbIcon"
ExportAssets (56)Timeline Frame 2Symbol 180 as "ScrollArrowUp_disabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 168 as "ScrollThumb_overSkin"
ExportAssets (56)Timeline Frame 2Symbol 164 as "ScrollThumb_downSkin"
ExportAssets (56)Timeline Frame 2Symbol 166 as "ScrollArrowDown_overSkin"
ExportAssets (56)Timeline Frame 2Symbol 157 as "ScrollTrack_skin"
ExportAssets (56)Timeline Frame 2Symbol 174 as "ScrollThumb_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 142 as "HeaderRenderer_selectedOverSkin"
ExportAssets (56)Timeline Frame 2Symbol 131 as "HeaderRenderer_upSkin"
ExportAssets (56)Timeline Frame 2Symbol 137 as "HeaderRenderer_overSkin"
ExportAssets (56)Timeline Frame 2Symbol 140 as "HeaderRenderer_selectedDownSkin"
ExportAssets (56)Timeline Frame 2Symbol 144 as "HeaderRenderer_selectedUpSkin"
ExportAssets (56)Timeline Frame 2Symbol 139 as "HeaderRenderer_selectedDisabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 133 as "HeaderRenderer_disabledSkin"
ExportAssets (56)Timeline Frame 2Symbol 135 as "HeaderRenderer_downSkin"
ExportAssets (56)Timeline Frame 2Symbol 200 as "editor.model.EditorAssets_Assets"
EnableDebugger2 (64)Timeline Frame 131 bytes "u.$1$Sh$f4plErynkm4788n4aKfgT0."
DebugMX1 (63)Timeline Frame 1
SerialNumber (41)Timeline Frame 1

Labels

"Factory"Frame 1
"Splitter2Armor"Frame 2
"idle"Symbol 59 MovieClip Frame 1
"over"Symbol 59 MovieClip Frame 2
"down"Symbol 59 MovieClip Frame 3
"loop"Symbol 108 MovieClip {com.midasplayer.particle.MainParticles_SparkClass} [spark] Frame 10




https://swfchan.com/54/268213/info.shtml
Created: 14/6 -2026 17:56:35 Last modified: 14/6 -2026 17:56:35 Server time: 23/06 -2026 15:39:05