Author Topic: Side Scrolling driving Game Demo with 2D physics  (Read 3371 times)

0 Members and 1 Guest are viewing this topic.

Offline justsomeguy

  • Newbie
  • Posts: 47
    • View Profile
Side Scrolling driving Game Demo with 2D physics
« on: April 26, 2021, 12:12:01 am »
Hello

I apologize if this seems like I'm spamming, but I felt there was a significant enough update to the fzxNGN that it would warrant its own post.

I have gotten rudimentary vehicles into the engine. I have a enclosed a demo for you to play. Since it is side scrolling there is no steering its just accelerate or decelerate and hop (in case you get stuck upside down.)

There is still a lot of work to be done. This is my "Do everything the hard way now, so I can figure how to make it easier later."

Please enjoy and leave your feedback.
The artwork is all licensed CC0 public domain.

Code: QB64: [Select]
  1. '**********************************************************************************************
  2. '   FzxNGN written by justsomeguy
  3. '   Physics code ported from RandyGaul's Impulse Engine
  4. '   https://github.com/RandyGaul/ImpulseEngine
  5. '   http://RandyGaul.net
  6. '**********************************************************************************************
  7. '/*
  8. '    Copyright (c) 2013 Randy Gaul http://RandyGaul.net
  9.  
  10. '    This software is provided 'as-is', without any express or implied
  11. '    warranty. In no event will the authors be held liable for any damages
  12. '    arising from the use of this software.
  13.  
  14. '    Permission is granted to anyone to use this software for any purpose,
  15. '    including commercial applications, and to alter it and redistribute it
  16. '    freely, subject to the following restrictions:
  17. '      1. The origin of this software must not be misrepresented; you must not
  18. '         claim that you wrote the original software. If you use this software
  19. '         in a product, an acknowledgment in the product documentation would be
  20. '         appreciated but is not required.
  21. '      2. Altered source versions must be plainly marked as such, and must not be
  22. '         misrepresented as being the original software.
  23. '      3. This notice may not be removed or altered from any source distribution.
  24. '
  25. '    Port to QB64 by justsomeguy
  26. '*/
  27. '
  28.  
  29. '**********************************************************************************************
  30. '   Setup Types and Variables
  31. '**********************************************************************************************
  32. TYPE tVECTOR2d
  33.     x AS _FLOAT
  34.     y AS _FLOAT
  35.  
  36. TYPE tLINE2d ' Not used
  37.     a AS tVECTOR2d
  38.     b AS tVECTOR2d
  39.  
  40. TYPE tFACE2d ' Not used
  41.     f0 AS tVECTOR2d
  42.     f1 AS tVECTOR2d
  43.  
  44. TYPE tTRIANGLE ' Not used
  45.     a AS tVECTOR2d
  46.     b AS tVECTOR2d
  47.     c AS tVECTOR2d
  48.  
  49. TYPE tMATRIX2d
  50.     m00 AS _FLOAT
  51.     m01 AS _FLOAT
  52.     m10 AS _FLOAT
  53.     m11 AS _FLOAT
  54.  
  55. TYPE tSHAPE
  56.     ty AS INTEGER ' cSHAPE_CIRCLE = 1, cSHAPE_POLYGON = 2
  57.     radius AS _FLOAT ' Only necessary for circle shapes
  58.     u AS tMATRIX2d ' Only neceassary for polygons
  59.     texture AS LONG
  60.     flipTexture AS INTEGER 'flag for flipping texture depending on direction
  61.     scaleTextureX AS _FLOAT
  62.     scaleTextureY AS _FLOAT
  63.     offsetTextureX AS _FLOAT
  64.     offsetTextureY AS _FLOAT
  65.  
  66. TYPE tPOLY 'list of vertices for all objects in simulation
  67.     vert AS tVECTOR2d
  68.     norm AS tVECTOR2d
  69.  
  70. TYPE tPOLYATTRIB 'keep track of polys in monlithic list of vertices
  71.     start AS INTEGER ' starting vertex of the polygon
  72.     count AS INTEGER ' number of vertices in polygon
  73.  
  74. TYPE tBODY
  75.     position AS tVECTOR2d
  76.     velocity AS tVECTOR2d
  77.     force AS tVECTOR2d
  78.     angularVelocity AS _FLOAT
  79.     torque AS _FLOAT
  80.     orient AS _FLOAT
  81.     mass AS _FLOAT
  82.     invMass AS _FLOAT
  83.     inertia AS _FLOAT
  84.     invInertia AS _FLOAT
  85.     staticFriction AS _FLOAT
  86.     dynamicFriction AS _FLOAT
  87.     restitution AS _FLOAT
  88.     shape AS tSHAPE
  89.     pa AS tPOLYATTRIB
  90.     c AS LONG ' color
  91.     visible AS INTEGER 'Hide a body ;)
  92.  
  93. TYPE tMANIFOLD
  94.     A AS INTEGER
  95.     B AS INTEGER
  96.     penetration AS _FLOAT
  97.     normal AS tVECTOR2d
  98.     contactCount AS INTEGER
  99.     e AS _FLOAT
  100.     df AS _FLOAT
  101.     sf AS _FLOAT
  102.     cv AS _FLOAT 'contact velocity
  103.  
  104. TYPE tHIT
  105.     A AS INTEGER
  106.     B AS INTEGER
  107.     position AS tVECTOR2d
  108.     cv AS _FLOAT
  109.  
  110. TYPE tJOINT
  111.     M AS tMATRIX2d
  112.     localAnchor1 AS tVECTOR2d
  113.     localAnchor2 AS tVECTOR2d
  114.     r1 AS tVECTOR2d
  115.     r2 AS tVECTOR2d
  116.     bias AS tVECTOR2d
  117.     P AS tVECTOR2d
  118.     body1 AS INTEGER
  119.     body2 AS INTEGER
  120.     biasFactor AS _FLOAT
  121.     softness AS _FLOAT
  122.  
  123. TYPE tCAMERA
  124.     position AS tVECTOR2d
  125.     zoom AS _FLOAT
  126.  
  127. TYPE tWORLD
  128.     plusLimit AS tVECTOR2d
  129.     minusLimit AS tVECTOR2d
  130.     gravity AS tVECTOR2d
  131.     spawn AS tVECTOR2d
  132.     terrainPosition AS tVECTOR2d
  133.  
  134. TYPE tVEHICLE
  135.     body AS INTEGER
  136.     wheelOne AS INTEGER
  137.     wheelTwo AS INTEGER
  138.     axleJointOne AS INTEGER
  139.     axleJointTwo AS INTEGER
  140.     auxBodyOne AS INTEGER
  141.     auxJointOne AS INTEGER
  142.     wheelOneOffset AS tVECTOR2d
  143.     wheelTwoOffset AS tVECTOR2d
  144.     auxOneOffset AS tVECTOR2d
  145.     torque AS _FLOAT
  146.  
  147. CONST cSHAPE_CIRCLE = 1
  148. CONST cSHAPE_POLYGON = 2
  149. CONST cSHAPE_TRAP = 3
  150. CONST cSHAPE_TERRAIN = 4
  151. CONST cPRECISION = 100
  152. CONST cMAXNUMOFTRIANGLES = 100
  153. CONST cMAXNUMBEROFOBJECTS = 1000 ' Max number of objects at one time
  154. CONST cMAXNUMBEROFPOLYGONS = 10000 ' Max number of total vertices included in all objects
  155. CONST cMAXNUMBEROFJOINTS = 100
  156. CONST cMAXNUMBEROFHITS = 1000
  157. CONST cPI = 3.14159
  158. CONST cEPSILON = 0.0001
  159. CONST cEPSILON_SQ = cEPSILON * cEPSILON
  160. CONST cBIAS_RELATIVE = 0.95
  161. CONST cBIAS_ABSOLUTE = 0.01
  162. CONST cDT = 1.0 / 20.0
  163. CONST cITERATIONS = 10
  164. CONST cPENETRATION_ALLOWANCE = 0.05
  165. CONST cPENETRATION_CORRECTION = 0.4 ' misspelled in original code
  166. CONST cPARAMETER_POSITION = 1
  167. CONST cPARAMETER_VELOCITY = 2
  168. CONST cPARAMETER_FORCE = 3
  169. CONST cPARAMETER_ANGULARVELOCITY = 4
  170. CONST cPARAMETER_TORQUE = 5
  171. CONST cPARAMETER_ORIENT = 6
  172. CONST cPARAMETER_STATICFRICTION = 7
  173. CONST cPARAMETER_DYNAMICFRICTION = 8
  174. CONST cPARAMETER_COLOR = 9
  175. CONST cPARAMETER_VISIBLE = 10
  176. CONST cPARAMETER_STATIC = 11
  177. CONST cPARAMETER_TEXTURE = 12
  178. CONST cPARAMETER_FLIPTEXTURE = 13
  179. CONST cRENDER_JOINTS = 0
  180. CONST cRENDER_COLLISIONS = 0
  181. CONST cPLAYER_FORCE = 2000000
  182.  
  183.  
  184. DIM SHARED sRESTING AS _FLOAT
  185. DIM SHARED sNUMBEROFBODIES AS INTEGER: sNUMBEROFBODIES = 100 ' 0 is included
  186. DIM SHARED sNUMBEROFJOINTS AS INTEGER: sNUMBEROFJOINTS = 3 ' if zero then no joints at all
  187. DIM SHARED sNUMBEROFVEHICLES AS INTEGER: sNUMBEROFVEHICLES = 1
  188.  
  189. DIM poly(cMAXNUMBEROFPOLYGONS) AS tPOLY
  190. DIM body(cMAXNUMBEROFOBJECTS) AS tBODY
  191. DIM joints(cMAXNUMBEROFJOINTS) AS tJOINT
  192. DIM hits(cMAXNUMBEROFHITS) AS tHIT
  193. DIM veh(sNUMBEROFVEHICLES) AS tVEHICLE
  194. DIM camera AS tCAMERA
  195.  
  196. DIM timerOne AS INTEGER
  197.  
  198. DIM SHARED world AS tWORLD
  199.  
  200. CONST cSCENE_USER = 0
  201. CONST cSCENE_WHEEL_1 = 1
  202. CONST cSCENE_WHEEL_2 = 2
  203. CONST cSCENE_HEAD = 3
  204. CONST cSCENE_RAMP_1 = 4
  205. CONST cSCENE_RAMP_2 = 5
  206. CONST cSCENE_RAMP_3 = 6
  207. CONST cSCENE_RAMP_4 = 7
  208. CONST cSCENE_RAMP_5 = 8
  209. CONST cSCENE_RAMP_6 = 9
  210. CONST cSCENE_RAMP_7 = 10
  211. CONST cSCENE_RAMP_8 = 11
  212. CONST cSCENE_RAMP_9 = 12
  213. CONST cSCENE_RAMP_10 = 13
  214. CONST cSCENE_LOOPRAMP_1 = 14
  215. CONST cSCENE_LOOPRAMP_2 = 15
  216. CONST cSCENE_LOOPSEGMENTS = 16
  217. CONST cSCENE_NUMBEROFLOOPSEGMENTS = 20
  218. CONST cSCENE_TERRAIN = cSCENE_LOOPSEGMENTS + cSCENE_NUMBEROFLOOPSEGMENTS
  219.  
  220. CONST cLOOP_CENTER_X = 53500
  221. CONST cLOOP_CENTER_Y = 225
  222. CONST cLOOP_RAMPHEIGHT = 400
  223. CONST cLOOP_RAMPWIDTH = 500
  224. CONST cLOOP_RAMPTHICKNESS = 200
  225. CONST cLOOP_RADIUS = 900
  226.  
  227.  
  228. '**********************************************************************************************
  229. _TITLE "FzxNGN" ' vowels are obsolete
  230. SCREEN _NEWIMAGE(1024, 768, 32)
  231.  
  232. timerOne = _FREETIMER
  233. ON TIMER(timerOne, 1) renderFps
  234. TIMER(timerOne) ON
  235. camera.zoom = .5
  236. 'RANDOMIZE TIMER
  237. CALL buildSimpleScene(poly(), body(), joints(), veh())
  238. '**********************************************************************************************
  239. DO: fps = fps + 1
  240.     CLS , _RGB32(127, 200, 227)
  241.     LOCATE 1, 45: PRINT "FPS:"; (fpsLast); "  x:"; INT(body(cSCENE_USER).position.x); "  y:"; INT(body(cSCENE_USER).position.y); " vel:"; INT(ABS(body(cSCENE_USER).velocity.x))
  242.  
  243.     CALL animateScene(poly(), body(), hits(), camera, veh())
  244.     CALL impulseStep(poly(), body(), joints(), cDT, cITERATIONS, hits())
  245.     CALL renderBodies(poly(), body(), joints(), hits(), camera)
  246.  
  247.     _DISPLAY
  248.     _LIMIT 120
  249. '**********************************************************************************************
  250. '   End of Main loop
  251. '**********************************************************************************************
  252.  
  253. '**********************************************************************************************
  254. '   Scene Creation and Handling Ahead
  255. '**********************************************************************************************
  256. SUB animateScene (p() AS tPOLY, body() AS tBODY, hits() AS tHIT, camera AS tCAMERA, veh() AS tVEHICLE)
  257.     ' Keep the player's head  upright
  258.  
  259.  
  260.     CALL setBody(body(), cPARAMETER_ORIENT, cSCENE_HEAD, body(cSCENE_USER).orient, 0)
  261.  
  262.     'Comment/Uncomment the next line to keep the vehicle upright (It has weird side effects)
  263.     'CALL setBody(body(), cPARAMETER_ORIENT, cSCENE_USER, 0, 0)
  264.  
  265.     'camera follows the player
  266.     CALL vectorSet(camera.position, body(cSCENE_USER).position.x - ((_WIDTH / 2) * (1 / camera.zoom)), body(cSCENE_USER).position.y - ((_HEIGHT / 2) * (1 / camera.zoom)))
  267.  
  268.  
  269.     IF _KEYDOWN(32) OR _KEYDOWN(87) OR _KEYDOWN(119) OR _KEYDOWN(18432) THEN
  270.         IF isBodyTouching(hits(), cSCENE_WHEEL_1) OR isBodyTouching(hits(), cSCENE_WHEEL_2) THEN ' makes sure your touching something when you jump
  271.             CALL vectorSet(body(cSCENE_USER).force, 0, -cPLAYER_FORCE)
  272.         END IF
  273.     END IF
  274.  
  275.     IF _KEYDOWN(65) OR _KEYDOWN(97) OR _KEYDOWN(19200) THEN
  276.         body(cSCENE_WHEEL_1).torque = -8000000
  277.         body(cSCENE_WHEEL_2).torque = -8000000
  278.     END IF
  279.  
  280.     IF _KEYDOWN(68) OR _KEYDOWN(100) OR _KEYDOWN(19712) THEN
  281.         body(cSCENE_WHEEL_1).torque = 8000000
  282.         body(cSCENE_WHEEL_2).torque = 8000000
  283.     END IF
  284.  
  285.     body(cSCENE_WHEEL_1).angularVelocity = impulseClamp(-50, 50, body(cSCENE_WHEEL_1).angularVelocity)
  286.     body(cSCENE_WHEEL_2).angularVelocity = impulseClamp(-50, 50, body(cSCENE_WHEEL_2).angularVelocity)
  287.  
  288.  
  289.  
  290.     IF body(cSCENE_USER).position.x > world.plusLimit.x OR body(cSCENE_USER).position.x < world.minusLimit.x THEN
  291.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_USER, 0, 0)
  292.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_USER, 0, 0)
  293.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_USER, world.spawn.x, world.spawn.y)
  294.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_1, body(cSCENE_USER).position.x + 55, body(cSCENE_USER).position.y + 65)
  295.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_WHEEL_1, 0, 0)
  296.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_WHEEL_1, 0, 0)
  297.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_2, body(cSCENE_USER).position.x - 55, body(cSCENE_USER).position.y + 65)
  298.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_WHEEL_2, 0, 0)
  299.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_WHEEL_2, 0, 0)
  300.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_HEAD, body(cSCENE_USER).position.x - 15, body(cSCENE_USER).position.y - 65)
  301.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_HEAD, 0, 0)
  302.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_HEAD, 0, 0)
  303.  
  304.     END IF
  305.  
  306.     IF body(cSCENE_USER).position.y > world.plusLimit.y THEN
  307.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_USER, 0, 0)
  308.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_USER, 0, 0)
  309.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_USER, world.spawn.x, world.spawn.y)
  310.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_1, body(cSCENE_USER).position.x + 55, body(cSCENE_USER).position.y + 65)
  311.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_WHEEL_1, 0, 0)
  312.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_WHEEL_1, 0, 0)
  313.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_2, body(cSCENE_USER).position.x - 55, body(cSCENE_USER).position.y + 65)
  314.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_WHEEL_2, 0, 0)
  315.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_WHEEL_2, 0, 0)
  316.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_HEAD, body(cSCENE_USER).position.x - 15, body(cSCENE_USER).position.y - 65)
  317.         CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_HEAD, 0, 0)
  318.         CALL setBody(body(), cPARAMETER_ANGULARVELOCITY, cSCENE_HEAD, 0, 0)
  319.     END IF
  320.  
  321.     'Disable collisions on second ramp so you can get out
  322.     IF body(cSCENE_USER).position.x > cLOOP_CENTER_X + cLOOP_RAMPWIDTH + 100 THEN
  323.         IF body(cSCENE_USER).position.y < cLOOP_CENTER_Y - 1000 THEN
  324.             CALL disableCollisions(p(), body(), cSCENE_LOOPRAMP_2)
  325.         END IF
  326.     END IF
  327.  
  328.     'Renable for the next pass through
  329.     IF body(cSCENE_USER).position.x > cLOOP_CENTER_X + cLOOP_RAMPWIDTH + 1000 THEN
  330.         CALL EnableCollisions(p(), body(), cSCENE_LOOPRAMP_2)
  331.         CALL vectorSet(p(body(cSCENE_LOOPRAMP_2).pa.start + 0).norm, 0, 0)
  332.     END IF
  333.  
  334.  
  335. SUB buildSimpleScene (p() AS tPOLY, body() AS tBODY, j() AS tJOINT, v() AS tVEHICLE)
  336.     DIM i AS INTEGER
  337.     DIM bm(5) AS LONG ' array texture bitmaps
  338.     CALL generateBitmap(bm()) ' auto generated bitmaps can be substituted for whatever images you have
  339.  
  340.     '********************************************************
  341.     '   Setup World
  342.     '********************************************************
  343.  
  344.     CALL vectorSet(world.minusLimit, -6500, -2000)
  345.     CALL vectorSet(world.plusLimit, 60000, 10000)
  346.     CALL vectorSet(world.spawn, -5000, -800)
  347.     CALL vectorSet(world.gravity, 0.0, 100.0)
  348.     CALL vectorSet(world.terrainPosition, -7000.0, 1000.0)
  349.     DIM o AS tVECTOR2d: CALL vectorMultiplyScalarND(o, world.gravity, cDT): sRESTING = vectorLengthSq(o) + cEPSILON
  350.  
  351.     '********************************************************
  352.     '   Build Vehicle
  353.     '********************************************************
  354.  
  355.     ' Build Body
  356.     CALL createBoxBodies(p(), body(), cSCENE_USER, 80, 30)
  357.     CALL polygonComputeMass(body(), p(), cSCENE_USER, .1) 'lower the mass of the body by 90%
  358.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_USER, world.spawn.x, world.spawn.y)
  359.     CALL setBody(body(), cPARAMETER_VELOCITY, cSCENE_USER, 0, 0)
  360.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_USER, bm(0), 0)
  361.     body(cSCENE_USER).shape.scaleTextureX = 1.5
  362.     body(cSCENE_USER).shape.scaleTextureY = 2
  363.     body(cSCENE_USER).shape.offsetTextureY = 10
  364.  
  365.     'Build Wheel 1
  366.     CALL createCircleBody(body(), cSCENE_WHEEL_1, 35)
  367.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_WHEEL_1, bm(1), 0)
  368.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_1, body(cSCENE_USER).position.x + 75, body(cSCENE_USER).position.y + 65)
  369.     body(cSCENE_WHEEL_1).staticFriction = 0.9
  370.     body(cSCENE_WHEEL_1).dynamicFriction = 0.6
  371.  
  372.     'Build Wheel 2
  373.     CALL createCircleBody(body(), cSCENE_WHEEL_2, 35)
  374.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_WHEEL_2, bm(1), 0)
  375.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_WHEEL_2, body(cSCENE_USER).position.x - 75, body(cSCENE_USER).position.y + 65)
  376.     body(cSCENE_WHEEL_2).staticFriction = 0.9
  377.     body(cSCENE_WHEEL_2).dynamicFriction = 0.6
  378.  
  379.     'Attach Wheel1 to Body
  380.     CALL jointSet(j(1), body(), cSCENE_USER, cSCENE_WHEEL_1, body(cSCENE_WHEEL_1).position.x, body(cSCENE_WHEEL_1).position.y)
  381.     j(1).softness = 0.001
  382.     j(1).biasFactor = 500
  383.  
  384.     'Attach Wheel2 to Body
  385.     CALL jointSet(j(2), body(), cSCENE_USER, cSCENE_WHEEL_2, body(cSCENE_WHEEL_2).position.x, body(cSCENE_WHEEL_2).position.y)
  386.     j(2).softness = 0.001
  387.     j(2).biasFactor = 500
  388.  
  389.     'Build and attach Drivers Head
  390.     CALL createCircleBody(body(), cSCENE_HEAD, 25)
  391.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_HEAD, bm(2), 0)
  392.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_HEAD, body(cSCENE_USER).position.x - 15, body(cSCENE_USER).position.y - 65)
  393.     CALL jointSet(j(3), body(), cSCENE_USER, cSCENE_HEAD, body(cSCENE_HEAD).position.x, body(cSCENE_HEAD).position.y)
  394.     j(3).softness = 0.01
  395.     j(3).biasFactor = 300
  396.  
  397.     '********************************************************
  398.     '   Build Level
  399.     '********************************************************
  400.     '   Put Out Ramps for some sweet Jumps
  401.     '********************************************************
  402.  
  403.     FOR i = 0 TO 9
  404.         CALL createTrapBody(p(), body(), cSCENE_RAMP_1 + i, 1000, 200, 350, 0)
  405.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + i, i * 5000, 500)
  406.         CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_RAMP_1 + i, bm(4), 0)
  407.         CALL bodySetStatic(body(cSCENE_RAMP_1 + i))
  408.     NEXT i
  409.  
  410.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 0, 0 * 5000, 550)
  411.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 1, 1 * 5000, 400)
  412.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 2, 2 * 5000, 400)
  413.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 3, 3 * 5000, 350)
  414.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 4, 4 * 5000, 350)
  415.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 5, 5 * 5000, 350)
  416.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 6, 6 * 5000, 450)
  417.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 7, 7 * 5000, 450)
  418.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 8, 8 * 5000, 450)
  419.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_RAMP_1 + 9, 9 * 5000, 450)
  420.  
  421.     '********************************************************
  422.     '   Build loop
  423.     '********************************************************
  424.  
  425.     'Ramp 1
  426.     CALL createTrapBody(p(), body(), cSCENE_LOOPRAMP_1, cLOOP_RAMPWIDTH, cLOOP_RAMPTHICKNESS, 0, cLOOP_RAMPHEIGHT)
  427.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_LOOPRAMP_1, cLOOP_CENTER_X, cLOOP_CENTER_Y)
  428.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_LOOPRAMP_1, bm(4), 0)
  429.     CALL bodySetStatic(body(cSCENE_LOOPRAMP_1))
  430.     'kill collision on the side
  431.     CALL vectorSet(p(body(cSCENE_LOOPRAMP_1).pa.start + 2).norm, 0, 0)
  432.  
  433.     'Ramp 2
  434.     CALL createTrapBody(p(), body(), cSCENE_LOOPRAMP_2, cLOOP_RAMPWIDTH, cLOOP_RAMPTHICKNESS, cLOOP_RAMPHEIGHT, 0)
  435.     CALL setBody(body(), cPARAMETER_POSITION, cSCENE_LOOPRAMP_2, cLOOP_CENTER_X + cLOOP_RAMPWIDTH, cLOOP_CENTER_Y)
  436.     CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_LOOPRAMP_2, bm(4), 0)
  437.     CALL bodySetStatic(body(cSCENE_LOOPRAMP_2))
  438.     'kill collision on the side
  439.     CALL vectorSet(p(body(cSCENE_LOOPRAMP_2).pa.start + 0).norm, 0, 0)
  440.  
  441.     'cSCENE_LOOPSEGMENTS + cSCENE_NUMBEROFLOOPSEGMENTS
  442.     FOR i = 0 TO cSCENE_NUMBEROFLOOPSEGMENTS - 1
  443.         CALL createBoxBodies(p(), body(), cSCENE_LOOPSEGMENTS + i, 25, 110)
  444.         CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_LOOPSEGMENTS + i, bm(4), 0)
  445.     NEXT
  446.     DIM AS _FLOAT xp, yp, theta, rotOff
  447.     rotOff = 10.5
  448.     theta = (cPI / (cSCENE_NUMBEROFLOOPSEGMENTS / 2) * .75)
  449.     FOR i = 0 TO cSCENE_NUMBEROFLOOPSEGMENTS - 1
  450.         xp = cLOOP_CENTER_X - cLOOP_RADIUS * COS((i + rotOff) * theta) + 250
  451.         yp = cLOOP_CENTER_Y + cLOOP_RADIUS * SIN((i + rotOff) * theta) - 1075
  452.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_LOOPSEGMENTS + i, xp, yp)
  453.         CALL setBody(body(), cPARAMETER_ORIENT, cSCENE_LOOPSEGMENTS + i, -(i + rotOff) * theta, 0)
  454.         CALL bodySetStatic(body(cSCENE_LOOPSEGMENTS + i))
  455.     NEXT
  456.     '********************************************************
  457.     '   Build Ground
  458.     '********************************************************
  459.  
  460.     DIM AS _FLOAT p1, p2
  461.     DIM numberOfTerrainSegments AS INTEGER: numberOfTerrainSegments = sNUMBEROFBODIES - cSCENE_TERRAIN
  462.     DIM AS _FLOAT terrainSliceWidth, terrainNominalHeight
  463.  
  464.     terrainSliceWidth = 1500
  465.     terrainNominalHeight = 500
  466.  
  467.     CALL createTerrianBody(p(), body(), cSCENE_TERRAIN, numberOfTerrainSegments, terrainSliceWidth, terrainNominalHeight)
  468.  
  469.     FOR i = 0 TO numberOfTerrainSegments - 1
  470.         p1 = (terrainSliceWidth / 2) - p(body(cSCENE_TERRAIN + i).pa.start).vert.x
  471.         p2 = terrainNominalHeight - p(body(cSCENE_TERRAIN + i).pa.start + 1).vert.y
  472.         CALL setBody(body(), cPARAMETER_POSITION, cSCENE_TERRAIN + i, world.terrainPosition.x + p1 + (terrainSliceWidth * i), world.terrainPosition.y + p2)
  473.         CALL setBody(body(), cPARAMETER_TEXTURE, cSCENE_TERRAIN + i, bm(3), 0)
  474.     NEXT
  475.  
  476.  
  477. '**********************************************************************************************
  478. '   Collision Helper Tools
  479. '**********************************************************************************************
  480.  
  481.  
  482. SUB disableCollisions (p() AS tPOLY, body() AS tBODY, index AS INTEGER)
  483.     DIM i AS INTEGER
  484.     FOR i = 0 TO body(index).pa.count
  485.         CALL vectorSet(p(body(index).pa.start + i).norm, 0, 0)
  486.     NEXT
  487.  
  488. SUB EnableCollisions (p() AS tPOLY, body() AS tBODY, index AS INTEGER)
  489.     DIM i AS INTEGER
  490.     DIM face AS tVECTOR2d
  491.     FOR i = 0 TO body(index).pa.count
  492.         CALL vectorSubVectorND(face, p(body(index).pa.start + arrayNextIndex(i, body(index).pa.count)).vert, p(body(index).pa.start + i).vert)
  493.         CALL vectorSet(p(body(index).pa.start + i).norm, face.y, -face.x)
  494.         CALL vectorNormalize(p(body(index).pa.start + i).norm)
  495.     NEXT
  496.  
  497. FUNCTION isBodyTouchingBody (hits() AS tHIT, A AS INTEGER, B AS INTEGER)
  498.     DIM hitcount AS INTEGER: hitcount = 1
  499.     isBodyTouchingBody = 0
  500.     DO WHILE hits(hitcount).A <> hits(hitcount).B
  501.         IF hits(hitcount).A = A AND hits(hitcount).B = B THEN
  502.             isBodyTouchingBody = hitcount
  503.             EXIT FUNCTION
  504.         END IF
  505.         hitcount = hitcount + 1: IF hitcount > UBOUND(hits) THEN EXIT FUNCTION
  506.     LOOP
  507.  
  508. FUNCTION isBodyTouchingStatic (body() AS tBODY, hits() AS tHIT, A AS INTEGER)
  509.     DIM hitcount AS INTEGER: hitcount = 1
  510.     isBodyTouchingStatic = 0
  511.     DO WHILE hits(hitcount).A <> hits(hitcount).B
  512.         IF hits(hitcount).A = A THEN
  513.             IF body(hits(hitcount).B).mass = 0 THEN
  514.                 isBodyTouchingStatic = hitcount
  515.                 EXIT FUNCTION
  516.             END IF
  517.         ELSE
  518.             IF hits(hitcount).B = A THEN
  519.                 IF body(hits(hitcount).A).mass = 0 THEN
  520.                     isBodyTouchingStatic = hitcount
  521.                     EXIT FUNCTION
  522.                 END IF
  523.             END IF
  524.         END IF
  525.         hitcount = hitcount + 1: IF hitcount > UBOUND(hits) THEN EXIT FUNCTION
  526.     LOOP
  527.  
  528. FUNCTION isBodyTouching (hits() AS tHIT, A AS INTEGER)
  529.     DIM hitcount AS INTEGER: hitcount = 1
  530.     isBodyTouching = 0
  531.     DO WHILE hits(hitcount).A <> hits(hitcount).B
  532.         IF hits(hitcount).A = A OR hits(hitcount).B = A THEN
  533.             isBodyTouching = hitcount
  534.             EXIT FUNCTION
  535.         END IF
  536.         hitcount = hitcount + 1: IF hitcount > UBOUND(hits) THEN EXIT FUNCTION
  537.     LOOP
  538.  
  539. FUNCTION highestCollisionVelocity (hits() AS tHIT, A AS INTEGER)
  540.     DIM hitcount AS INTEGER: hitcount = 1
  541.     DIM hiCv AS _FLOAT: hiCv = 0
  542.     highestCollisionVelocity = 0
  543.     DO WHILE hits(hitcount).A <> hits(hitcount).B
  544.         IF hits(hitcount).A = A AND ABS(hits(hitcount).cv) > hiCv AND hits(hitcount).cv < 0 THEN
  545.             hiCv = ABS(hits(hitcount).cv)
  546.         END IF
  547.         hitcount = hitcount + 1: IF hitcount > UBOUND(hits) THEN EXIT FUNCTION
  548.     LOOP
  549.     highestCollisionVelocity = hiCv
  550.  
  551.  
  552. '**********************************************************************************************
  553. '   Physics and Collision Stuff Ahead
  554. '**********************************************************************************************
  555.  
  556. SUB impulseIntegrateForces (b AS tBODY, dt AS _FLOAT)
  557.     IF b.invMass = 0.0 THEN EXIT SUB
  558.     DIM dts AS _FLOAT
  559.     dts = dt * .5
  560.     CALL vectorAddVectorScalar(b.velocity, b.force, b.invMass * dts)
  561.     CALL vectorAddVectorScalar(b.velocity, world.gravity, dts)
  562.     b.angularVelocity = b.angularVelocity + (b.torque * b.invInertia * dts)
  563.  
  564. SUB impulseIntegrateVelocity (body AS tBODY, dt AS _FLOAT)
  565.     IF body.invMass = 0.0 THEN EXIT SUB
  566.     CALL vectorAddVectorScalar(body.position, body.velocity, dt)
  567.     body.orient = body.orient + (body.angularVelocity * dt)
  568.     CALL matrixSetRadians(body.shape.u, body.orient)
  569.     CALL impulseIntegrateForces(body, dt)
  570.  
  571. SUB impulseStep (p() AS tPOLY, body() AS tBODY, j() AS tJOINT, dt AS _FLOAT, iterations AS INTEGER, hits() AS tHIT)
  572.     DIM A AS tBODY
  573.     DIM B AS tBODY
  574.     DIM c(cMAXNUMBEROFOBJECTS) AS tVECTOR2d
  575.     DIM m AS tMANIFOLD
  576.     DIM manifolds(sNUMBEROFBODIES * sNUMBEROFBODIES) AS tMANIFOLD
  577.     DIM collisions(sNUMBEROFBODIES * sNUMBEROFBODIES, cMAXNUMBEROFOBJECTS) AS tVECTOR2d
  578.     DIM manifoldCount AS INTEGER: manifoldCount = 0
  579.     '    // Generate new collision info
  580.     DIM i, j, k AS INTEGER
  581.     DIM hitCount AS INTEGER: hitCount = 0
  582.     DIM dHit AS tHIT 'empty
  583.     ' // erase hitlist
  584.     DO
  585.         hits(hitCount) = dHit
  586.         hitCount = hitCount + 1
  587.     LOOP UNTIL hits(hitCount).A = hits(hitCount).B
  588.     hitCount = 0
  589.  
  590.     ' TODO: Implement hidden object logic
  591.     FOR i = 0 TO sNUMBEROFBODIES ' number of bodies
  592.         A = body(i)
  593.         FOR j = i + 1 TO sNUMBEROFBODIES
  594.             B = body(j)
  595.             IF A.invMass = 0.0 AND B.invMass = 0.0 THEN _CONTINUE
  596.             'Mainfold solve - handle collisions
  597.             IF A.shape.ty = cSHAPE_CIRCLE AND B.shape.ty = cSHAPE_CIRCLE THEN
  598.                 CALL collisionCCHandle(m, c(), A, B)
  599.             ELSE
  600.                 IF A.shape.ty = cSHAPE_POLYGON AND B.shape.ty = cSHAPE_POLYGON THEN
  601.                     CALL collisionPPHandle(p(), body(), m, c(), i, j)
  602.                 ELSE
  603.                     IF A.shape.ty = cSHAPE_CIRCLE AND B.shape.ty = cSHAPE_POLYGON THEN
  604.                         CALL collisionCPHandle(p(), body(), m, c(), i, j)
  605.                     ELSE
  606.                         IF B.shape.ty = cSHAPE_CIRCLE AND A.shape.ty = cSHAPE_POLYGON THEN
  607.                             CALL collisionPCHandle(p(), body(), m, c(), i, j)
  608.                         END IF
  609.                     END IF
  610.                 END IF
  611.             END IF
  612.             IF m.contactCount > 0 THEN
  613.                 m.A = i 'identify the index of objects
  614.                 m.B = j
  615.                 manifolds(manifoldCount) = m
  616.                 FOR k = 0 TO m.contactCount
  617.                     hits(hitCount).A = i
  618.                     hits(hitCount).B = j
  619.                     hits(hitCount).position = c(k)
  620.                     collisions(manifoldCount, k) = c(k)
  621.                     hitCount = hitCount + 1
  622.                 NEXT
  623.                 manifoldCount = manifoldCount + 1
  624.             END IF
  625.         NEXT
  626.     NEXT
  627.  
  628.     '   // Integrate forces
  629.     FOR i = 0 TO sNUMBEROFBODIES
  630.         CALL impulseIntegrateForces(body(i), dt)
  631.     NEXT
  632.     '   // Initialize collision
  633.     FOR i = 0 TO manifoldCount - 1
  634.         ' this is the stupidest thing ever since QB will not let you split arrays
  635.         FOR k = 0 TO manifolds(i).contactCount - 1
  636.             c(k) = collisions(i, k)
  637.         NEXT
  638.         CALL manifoldInit(manifolds(i), body(), c())
  639.     NEXT
  640.     ' joint pre Steps
  641.  
  642.     FOR i = 1 TO sNUMBEROFJOINTS
  643.         CALL jointPrestep(j(i), body(), dt)
  644.     NEXT
  645.  
  646.     '// Solve collisions
  647.     FOR j = 0 TO iterations - 1
  648.         FOR i = 0 TO manifoldCount - 1
  649.             FOR k = 0 TO manifolds(i).contactCount - 1
  650.                 c(k) = collisions(i, k)
  651.             NEXT
  652.             CALL manifoldApplyImpulse(manifolds(i), body(), c())
  653.             'store the hit speed for later
  654.             FOR k = 0 TO hitCount - 1
  655.                 IF manifolds(i).A = hits(k).A AND manifolds(i).B = hits(k).B THEN
  656.                     hits(k).cv = manifolds(i).cv
  657.                 END IF
  658.             NEXT
  659.         NEXT
  660.         FOR i = 1 TO sNUMBEROFJOINTS
  661.             CALL jointApplyImpulse(j(i), body())
  662.         NEXT
  663.     NEXT
  664.  
  665.     '// Integrate velocities
  666.     FOR i = 0 TO sNUMBEROFBODIES
  667.         CALL impulseIntegrateVelocity(body(i), dt)
  668.     NEXT
  669.     '// Correct positions
  670.     FOR i = 0 TO manifoldCount - 1
  671.         CALL manifoldPositionalCorrection(manifolds(i), body())
  672.     NEXT
  673.     '// Clear all forces
  674.     FOR i = 0 TO sNUMBEROFBODIES
  675.         CALL vectorSet(body(i).force, 0, 0)
  676.         body(i).torque = 0
  677.     NEXT
  678.  
  679. SUB bodyApplyImpulse (body AS tBODY, impulse AS tVECTOR2d, contactVector AS tVECTOR2d)
  680.     CALL vectorAddVectorScalar(body.velocity, impulse, body.invMass)
  681.     body.angularVelocity = body.angularVelocity + body.invInertia * vectorCross(contactVector, impulse)
  682.  
  683. SUB bodySetStatic (body AS tBODY)
  684.     body.inertia = 0.0
  685.     body.invInertia = 0.0
  686.     body.mass = 0.0
  687.     body.invMass = 0.0
  688.  
  689. SUB manifoldInit (m AS tMANIFOLD, body() AS tBODY, contacts() AS tVECTOR2d)
  690.     DIM ra AS tVECTOR2d
  691.     DIM rb AS tVECTOR2d
  692.     DIM rv AS tVECTOR2d
  693.     DIM tv1 AS tVECTOR2d
  694.     DIM tv2 AS tVECTOR2d
  695.     m.e = scalarMin(body(m.A).restitution, body(m.B).restitution)
  696.     m.sf = SQR(body(m.A).staticFriction * body(m.A).staticFriction)
  697.     m.df = SQR(body(m.A).dynamicFriction * body(m.A).dynamicFriction)
  698.     DIM i AS INTEGER
  699.     FOR i = 0 TO m.contactCount - 1
  700.         CALL vectorSubVectorND(contacts(i), body(m.A).position, ra)
  701.         CALL vectorSubVectorND(contacts(i), body(m.B).position, rb)
  702.  
  703.         CALL vectorCrossScalar(tv1, rb, body(m.B).angularVelocity)
  704.         CALL vectorCrossScalar(tv2, ra, body(m.A).angularVelocity)
  705.         CALL vectorAddVector(tv1, body(m.B).velocity)
  706.         CALL vectorSubVectorND(tv2, body(m.A).velocity, tv2)
  707.         CALL vectorSubVectorND(rv, tv1, tv2)
  708.  
  709.         IF vectorLengthSq(rv) < sRESTING THEN
  710.             m.e = 0.0
  711.         END IF
  712.     NEXT
  713.  
  714. SUB manifoldApplyImpulse (m AS tMANIFOLD, body() AS tBODY, contacts() AS tVECTOR2d)
  715.     DIM ra AS tVECTOR2d
  716.     DIM rb AS tVECTOR2d
  717.     DIM rv AS tVECTOR2d
  718.     DIM tv1 AS tVECTOR2d
  719.     DIM tv2 AS tVECTOR2d
  720.     DIM contactVel AS _FLOAT
  721.  
  722.     DIM raCrossN AS _FLOAT
  723.     DIM rbCrossN AS _FLOAT
  724.     DIM invMassSum AS _FLOAT
  725.     DIM i AS INTEGER
  726.     DIM j AS _FLOAT
  727.     DIM impulse AS tVECTOR2d
  728.  
  729.     DIM t AS tVECTOR2d
  730.     DIM jt AS _FLOAT
  731.     DIM tangentImpulse AS tVECTOR2d
  732.  
  733.     IF impulseEqual(body(m.A).invMass + body(m.B).invMass, 0.0) THEN
  734.         CALL manifoldInfiniteMassCorrection(body(m.A), body(m.B))
  735.         EXIT SUB
  736.     END IF
  737.  
  738.     FOR i = 0 TO m.contactCount - 1
  739.         '// Calculate radii from COM to contact
  740.         '// Vec2 ra = contacts[i] - A->position;
  741.         '// Vec2 rb = contacts[i] - B->position;
  742.         CALL vectorSubVectorND(ra, contacts(i), body(m.A).position)
  743.         CALL vectorSubVectorND(rb, contacts(i), body(m.B).position)
  744.  
  745.         '// Relative velocity
  746.         '// Vec2 rv = B->velocity + Cross( B->angularVelocity, rb ) - A->velocity - Cross( A->angularVelocity, ra );
  747.         CALL vectorCrossScalar(tv1, rb, body(m.B).angularVelocity)
  748.         CALL vectorCrossScalar(tv2, ra, body(m.A).angularVelocity)
  749.         CALL vectorAddVectorND(rv, tv1, body(m.B).velocity)
  750.         CALL vectorSubVector(rv, body(m.A).velocity)
  751.         CALL vectorSubVector(rv, tv2)
  752.  
  753.         '// Relative velocity along the normal
  754.         '// real contactVel = Dot( rv, normal );
  755.         contactVel = vectorDot(rv, m.normal)
  756.  
  757.         '// Do not resolve if velocities are separating
  758.         IF contactVel > 0 THEN EXIT SUB
  759.         m.cv = contactVel
  760.         '// real raCrossN = Cross( ra, normal );
  761.         '// real rbCrossN = Cross( rb, normal );
  762.         '// real invMassSum = A->im + B->im + Sqr( raCrossN ) * A->iI + Sqr( rbCrossN ) * B->iI;
  763.         raCrossN = vectorCross(ra, m.normal)
  764.         rbCrossN = vectorCross(rb, m.normal)
  765.         invMassSum = body(m.A).invMass + body(m.B).invMass + (raCrossN * raCrossN) * body(m.A).invInertia + (rbCrossN * rbCrossN) * body(m.B).invInertia
  766.  
  767.         '// Calculate impulse scalar
  768.         j = -(1.0 + m.e) * contactVel
  769.         j = j / invMassSum
  770.         j = j / m.contactCount
  771.  
  772.         '// Apply impulse
  773.         CALL vectorMultiplyScalarND(impulse, m.normal, j)
  774.  
  775.         CALL vectorNegND(tv1, impulse)
  776.         CALL bodyApplyImpulse(body(m.A), tv1, ra)
  777.         CALL bodyApplyImpulse(body(m.B), impulse, rb)
  778.  
  779.         '// Friction impulse
  780.         '// rv = B->velocity + Cross( B->angularVelocity, rb ) - A->velocity - Cross( A->angularVelocity, ra );
  781.         CALL vectorCrossScalar(tv1, rb, body(m.B).angularVelocity)
  782.         CALL vectorCrossScalar(tv2, ra, body(m.A).angularVelocity)
  783.         CALL vectorAddVectorND(rv, tv1, body(m.B).velocity)
  784.         CALL vectorSubVector(rv, body(m.A).velocity)
  785.         CALL vectorSubVector(rv, tv2)
  786.  
  787.         '// Vec2 t = rv - (normal * Dot( rv, normal ));
  788.         '// t.Normalize( );
  789.         CALL vectorMultiplyScalarND(t, m.normal, vectorDot(rv, m.normal))
  790.         CALL vectorSubVectorND(t, rv, t)
  791.         CALL vectorNormalize(t)
  792.  
  793.         '// j tangent magnitude
  794.         jt = -vectorDot(rv, t)
  795.         jt = jt / invMassSum
  796.         jt = jt / m.contactCount
  797.  
  798.         '// Don't apply tiny friction impulses
  799.         IF impulseEqual(jt, 0.0) THEN EXIT SUB
  800.  
  801.         '// Coulumb's law
  802.         IF ABS(jt) < j * m.sf THEN
  803.             CALL vectorMultiplyScalarND(tangentImpulse, t, jt)
  804.         ELSE
  805.             CALL vectorMultiplyScalarND(tangentImpulse, t, -j * m.df)
  806.         END IF
  807.  
  808.         '// Apply friction impulse
  809.         '// A->ApplyImpulse( -tangentImpulse, ra );
  810.         '// B->ApplyImpulse( tangentImpulse, rb );
  811.         CALL vectorNegND(tv1, tangentImpulse)
  812.         CALL bodyApplyImpulse(body(m.A), tv1, ra)
  813.         CALL bodyApplyImpulse(body(m.B), tangentImpulse, rb)
  814.     NEXT i
  815.  
  816. SUB manifoldPositionalCorrection (m AS tMANIFOLD, body() AS tBODY)
  817.     DIM correction AS _FLOAT
  818.     correction = scalarMax(m.penetration - cPENETRATION_ALLOWANCE, 0.0) / (body(m.A).invMass + body(m.B).invMass) * cPENETRATION_CORRECTION
  819.     CALL vectorAddVectorScalar(body(m.A).position, m.normal, -body(m.A).invMass * correction)
  820.     CALL vectorAddVectorScalar(body(m.B).position, m.normal, body(m.B).invMass * correction)
  821.  
  822. SUB manifoldInfiniteMassCorrection (A AS tBODY, B AS tBODY)
  823.     CALL vectorSet(A.velocity, 0, 0)
  824.     CALL vectorSet(B.velocity, 0, 0)
  825.  
  826. '**********************************************************************************************
  827. '   Collision Stuff Ahead
  828. '**********************************************************************************************
  829.  
  830. SUB collisionCCHandle (m AS tMANIFOLD, contacts() AS tVECTOR2d, A AS tBODY, B AS tBODY)
  831.     DIM normal AS tVECTOR2d
  832.     DIM dist_sqr AS _FLOAT
  833.     DIM radius AS _FLOAT
  834.  
  835.     CALL vectorSubVectorND(normal, B.position, A.position) ' Subtract two vectors position A and position B
  836.     dist_sqr = vectorLengthSq(normal) ' Calculate the distance between the balls or circles
  837.     radius = A.shape.radius + B.shape.radius ' Add both circle A and circle B radius
  838.  
  839.     IF (dist_sqr >= radius * radius) THEN
  840.         m.contactCount = 0
  841.     ELSE
  842.         DIM distance AS _FLOAT
  843.         distance = SQR(dist_sqr)
  844.         m.contactCount = 1
  845.  
  846.         IF distance = 0 THEN
  847.             m.penetration = A.shape.radius
  848.             CALL vectorSet(m.normal, 1.0, 0.0)
  849.             CALL vectorSetVector(contacts(0), A.position)
  850.         ELSE
  851.             m.penetration = radius - distance
  852.             CALL vectorDivideScalarND(m.normal, normal, distance)
  853.  
  854.             CALL vectorMultiplyScalarND(contacts(0), m.normal, A.shape.radius)
  855.             CALL vectorAddVector(contacts(0), A.position)
  856.         END IF
  857.     END IF
  858.  
  859. SUB collisionPCHandle (p() AS tPOLY, body() AS tBODY, m AS tMANIFOLD, contacts() AS tVECTOR2d, A AS INTEGER, B AS INTEGER)
  860.     CALL collisionCPHandle(p(), body(), m, contacts(), B, A)
  861.     IF m.contactCount > 0 THEN
  862.         CALL vectorNeg(m.normal)
  863.     END IF
  864.  
  865. SUB collisionCPHandle (p() AS tPOLY, body() AS tBODY, m AS tMANIFOLD, contacts() AS tVECTOR2d, A AS INTEGER, B AS INTEGER)
  866.     'A is the Circle
  867.     'B is the POLY
  868.     m.contactCount = 0
  869.     DIM center AS tVECTOR2d
  870.     DIM tm AS tMATRIX2d
  871.     DIM tv AS tVECTOR2d
  872.     DIM ARadius AS _FLOAT: ARadius = body(A).shape.radius
  873.  
  874.     CALL vectorSubVectorND(center, body(A).position, body(B).position)
  875.     CALL matrixTranspose(body(B).shape.u, tm)
  876.     CALL matrixMultiplyVector(tm, center, center)
  877.  
  878.     DIM separation AS _FLOAT: separation = -9999999
  879.     DIM faceNormal AS INTEGER: faceNormal = 0
  880.     DIM i AS INTEGER
  881.     DIM s AS _FLOAT
  882.     FOR i = 0 TO body(B).pa.count
  883.         CALL vectorSubVectorND(tv, center, p(body(B).pa.start + i).vert)
  884.         s = vectorDot(p(body(B).pa.start + i).norm, tv)
  885.         IF s > ARadius THEN EXIT SUB
  886.         IF s > separation THEN
  887.             separation = s
  888.             faceNormal = i
  889.         END IF
  890.     NEXT
  891.     DIM v1 AS tVECTOR2d
  892.     v1 = p(body(B).pa.start + faceNormal).vert
  893.     DIM i2 AS INTEGER
  894.     i2 = body(B).pa.start + arrayNextIndex(faceNormal, body(B).pa.count)
  895.     DIM v2 AS tVECTOR2d
  896.     v2 = p(i2).vert
  897.  
  898.     IF separation < cEPSILON THEN
  899.         m.contactCount = 1
  900.         CALL matrixMultiplyVector(body(B).shape.u, p(body(B).pa.start + faceNormal).norm, m.normal)
  901.         CALL vectorNeg(m.normal)
  902.         CALL vectorMultiplyScalarND(contacts(0), m.normal, ARadius)
  903.         CALL vectorAddVector(contacts(0), body(A).position)
  904.         m.penetration = ARadius
  905.         EXIT SUB
  906.     END IF
  907.  
  908.     DIM dot1 AS _FLOAT
  909.     DIM dot2 AS _FLOAT
  910.  
  911.     DIM tv1 AS tVECTOR2d
  912.     DIM tv2 AS tVECTOR2d
  913.     DIM n AS tVECTOR2d
  914.     CALL vectorSubVectorND(tv1, center, v1)
  915.     CALL vectorSubVectorND(tv2, v2, v1)
  916.     dot1 = vectorDot(tv1, tv2)
  917.     CALL vectorSubVectorND(tv1, center, v2)
  918.     CALL vectorSubVectorND(tv2, v1, v2)
  919.     dot2 = vectorDot(tv1, tv2)
  920.     m.penetration = ARadius - separation
  921.     IF dot1 <= 0.0 THEN
  922.         IF vectorSqDist(center, v1) > ARadius * ARadius THEN EXIT SUB
  923.         m.contactCount = 1
  924.         CALL vectorSubVectorND(n, v1, center)
  925.         CALL matrixMultiplyVector(body(B).shape.u, n, n)
  926.         CALL vectorNormalize(n)
  927.         m.normal = n
  928.         CALL matrixMultiplyVector(body(B).shape.u, v1, v1)
  929.         CALL vectorAddVectorND(v1, v1, body(B).position)
  930.         contacts(0) = v1
  931.     ELSE
  932.         IF dot2 <= 0.0 THEN
  933.             IF vectorSqDist(center, v2) > ARadius * ARadius THEN EXIT SUB
  934.             m.contactCount = 1
  935.             CALL vectorSubVectorND(n, v2, center)
  936.             CALL matrixMultiplyVector(body(B).shape.u, v2, v2)
  937.             CALL vectorAddVectorND(v2, v2, body(B).position)
  938.             contacts(0) = v2
  939.             CALL matrixMultiplyVector(body(B).shape.u, n, n)
  940.             CALL vectorNormalize(n)
  941.             m.normal = n
  942.         ELSE
  943.             n = p(body(B).pa.start + faceNormal).norm
  944.             CALL vectorSubVectorND(tv1, center, v1)
  945.             IF vectorDot(tv1, n) > ARadius THEN EXIT SUB
  946.             m.contactCount = 1
  947.             CALL matrixMultiplyVector(body(B).shape.u, n, n)
  948.             CALL vectorNeg(n)
  949.             m.normal = n
  950.             CALL vectorMultiplyScalarND(contacts(0), m.normal, ARadius)
  951.             CALL vectorAddVector(contacts(0), body(A).position)
  952.         END IF
  953.     END IF
  954.  
  955. FUNCTION collisionPPClip (n AS tVECTOR2d, c AS _FLOAT, face() AS tVECTOR2d)
  956.     DIM sp AS INTEGER: sp = 0
  957.     DIM o(cMAXNUMBEROFPOLYGONS) AS tVECTOR2d
  958.  
  959.     o(0) = face(0)
  960.     o(1) = face(1)
  961.  
  962.     DIM d1 AS _FLOAT: d1 = vectorDot(n, face(0)) - c
  963.     DIM d2 AS _FLOAT: d2 = vectorDot(n, face(1)) - c
  964.  
  965.     IF d1 <= 0.0 THEN
  966.         o(sp) = face(0)
  967.         sp = sp + 1
  968.     END IF
  969.  
  970.     IF d2 <= 0.0 THEN
  971.         o(sp) = face(1)
  972.         sp = sp + 1
  973.     END IF
  974.  
  975.     IF d1 * d2 < 0.0 THEN
  976.         DIM alpha AS _FLOAT: alpha = d1 / (d1 - d2)
  977.         DIM tempv AS tVECTOR2d
  978.         'out[sp] = face[0] + alpha * (face[1] - face[0]);
  979.         CALL vectorSubVectorND(tempv, face(1), face(0))
  980.         CALL vectorMultiplyScalar(tempv, alpha)
  981.         CALL vectorAddVectorND(o(sp), tempv, face(0))
  982.         sp = sp + 1
  983.     END IF
  984.     face(0) = o(0)
  985.     face(1) = o(1)
  986.     collisionPPClip = sp
  987.  
  988. SUB collisionPPFindIncidentFace (p() AS tPOLY, b() AS tBODY, v() AS tVECTOR2d, RefPoly AS INTEGER, IncPoly AS INTEGER, referenceIndex AS INTEGER)
  989.     DIM referenceNormal AS tVECTOR2d
  990.     DIM uRef AS tMATRIX2d: uRef = b(RefPoly).shape.u
  991.     DIM uInc AS tMATRIX2d: uInc = b(IncPoly).shape.u
  992.     DIM uTemp AS tMATRIX2d
  993.     DIM i AS INTEGER
  994.     referenceNormal = p(b(RefPoly).pa.start + referenceIndex).norm
  995.  
  996.     '        // Calculate normal in incident's frame of reference
  997.     '        // referenceNormal = RefPoly->u * referenceNormal; // To world space
  998.     CALL matrixMultiplyVector(uRef, referenceNormal, referenceNormal)
  999.     '        // referenceNormal = IncPoly->u.Transpose( ) * referenceNormal; // To incident's model space
  1000.     CALL matrixTranspose(uInc, uTemp)
  1001.     CALL matrixMultiplyVector(uTemp, referenceNormal, referenceNormal)
  1002.  
  1003.     DIM incidentFace AS INTEGER: incidentFace = 0
  1004.     DIM minDot AS _FLOAT: minDot = 9999999
  1005.     DIM dot AS _FLOAT
  1006.     FOR i = 0 TO b(IncPoly).pa.count
  1007.         dot = vectorDot(referenceNormal, p(b(IncPoly).pa.start + i).norm)
  1008.         IF (dot < minDot) THEN
  1009.             minDot = dot
  1010.             incidentFace = i
  1011.         END IF
  1012.     NEXT
  1013.  
  1014.     '// Assign face vertices for incidentFace
  1015.     '// v[0] = IncPoly->u * IncPoly->m_vertices[incidentFace] + IncPoly->body->position;
  1016.     CALL matrixMultiplyVector(uInc, p(b(IncPoly).pa.start + incidentFace).vert, v(0))
  1017.     CALL vectorAddVector(v(0), b(IncPoly).position)
  1018.  
  1019.     '// incidentFace = incidentFace + 1 >= (int32)IncPoly->m_vertexCount ? 0 : incidentFace + 1;
  1020.     incidentFace = arrayNextIndex(incidentFace, b(IncPoly).pa.count)
  1021.  
  1022.     '// v[1] = IncPoly->u * IncPoly->m_vertices[incidentFace] +  IncPoly->body->position;
  1023.     CALL matrixMultiplyVector(uInc, p(b(IncPoly).pa.start + incidentFace).vert, v(1))
  1024.     CALL vectorAddVector(v(1), b(IncPoly).position)
  1025.  
  1026. SUB collisionPPHandle (p() AS tPOLY, body() AS tBODY, m AS tMANIFOLD, contacts() AS tVECTOR2d, A AS INTEGER, B AS INTEGER)
  1027.     m.contactCount = 0
  1028.  
  1029.     DIM faceA(100) AS INTEGER
  1030.  
  1031.     DIM penetrationA AS _FLOAT
  1032.     penetrationA = collisionPPFindAxisLeastPenetration(p(), body(), faceA(), A, B)
  1033.     IF penetrationA >= 0.0 THEN EXIT SUB
  1034.  
  1035.     DIM faceB(100) AS INTEGER
  1036.  
  1037.     DIM penetrationB AS _FLOAT
  1038.     penetrationB = collisionPPFindAxisLeastPenetration(p(), body(), faceB(), B, A)
  1039.     IF penetrationB >= 0.0 THEN EXIT SUB
  1040.  
  1041.  
  1042.     DIM referenceIndex AS INTEGER
  1043.     DIM flip AS INTEGER
  1044.  
  1045.     DIM RefPoly AS INTEGER
  1046.     DIM IncPoly AS INTEGER
  1047.  
  1048.     IF impulseGT(penetrationA, penetrationB) THEN
  1049.         RefPoly = A
  1050.         IncPoly = B
  1051.         referenceIndex = faceA(0)
  1052.         flip = 0
  1053.     ELSE
  1054.         RefPoly = B
  1055.         IncPoly = A
  1056.         referenceIndex = faceB(0)
  1057.         flip = 1
  1058.     END IF
  1059.  
  1060.     DIM incidentFace(2) AS tVECTOR2d
  1061.  
  1062.     CALL collisionPPFindIncidentFace(p(), body(), incidentFace(), RefPoly, IncPoly, referenceIndex)
  1063.     DIM v1 AS tVECTOR2d
  1064.     DIM v2 AS tVECTOR2d
  1065.     DIM v1t AS tVECTOR2d
  1066.     DIM v2t AS tVECTOR2d
  1067.  
  1068.     v1 = p(body(RefPoly).pa.start + referenceIndex).vert
  1069.     referenceIndex = arrayNextIndex(referenceIndex, body(RefPoly).pa.count)
  1070.     v2 = p(body(RefPoly).pa.start + referenceIndex).vert
  1071.     '// Transform vertices to world space
  1072.     '// v1 = RefPoly->u * v1 + RefPoly->body->position;
  1073.     '// v2 = RefPoly->u * v2 + RefPoly->body->position;
  1074.     CALL matrixMultiplyVector(body(RefPoly).shape.u, v1, v1t)
  1075.     CALL vectorAddVectorND(v1, v1t, body(RefPoly).position)
  1076.     CALL matrixMultiplyVector(body(RefPoly).shape.u, v2, v2t)
  1077.     CALL vectorAddVectorND(v2, v2t, body(RefPoly).position)
  1078.  
  1079.     '// Calculate reference face side normal in world space
  1080.     '// Vec2 sidePlaneNormal = (v2 - v1);
  1081.     '// sidePlaneNormal.Normalize( );
  1082.     DIM sidePlaneNormal AS tVECTOR2d
  1083.     CALL vectorSubVectorND(sidePlaneNormal, v2, v1)
  1084.     CALL vectorNormalize(sidePlaneNormal)
  1085.  
  1086.     '// Orthogonalize
  1087.     '// Vec2 refFaceNormal( sidePlaneNormal.y, -sidePlaneNormal.x );
  1088.     DIM refFaceNormal AS tVECTOR2d
  1089.     CALL vectorSet(refFaceNormal, sidePlaneNormal.y, -sidePlaneNormal.x)
  1090.  
  1091.     '// ax + by = c
  1092.     '// c is distance from origin
  1093.     '// real refC = Dot( refFaceNormal, v1 );
  1094.     '// real negSide = -Dot( sidePlaneNormal, v1 );
  1095.     '// real posSide = Dot( sidePlaneNormal, v2 );
  1096.     DIM refC AS _FLOAT: refC = vectorDot(refFaceNormal, v1)
  1097.     DIM negSide AS _FLOAT: negSide = -vectorDot(sidePlaneNormal, v1)
  1098.     DIM posSide AS _FLOAT: posSide = vectorDot(sidePlaneNormal, v2)
  1099.  
  1100.  
  1101.     '// Clip incident face to reference face side planes
  1102.     '// if(Clip( -sidePlaneNormal, negSide, incidentFace ) < 2)
  1103.     DIM negSidePlaneNormal AS tVECTOR2d
  1104.     CALL vectorNegND(negSidePlaneNormal, sidePlaneNormal)
  1105.  
  1106.     IF collisionPPClip(negSidePlaneNormal, negSide, incidentFace()) < 2 THEN EXIT SUB
  1107.     IF collisionPPClip(sidePlaneNormal, posSide, incidentFace()) < 2 THEN EXIT SUB
  1108.  
  1109.     CALL vectorSet(m.normal, refFaceNormal.x, refFaceNormal.y)
  1110.     IF flip THEN CALL vectorNeg(m.normal)
  1111.  
  1112.     '// Keep points behind reference face
  1113.     DIM cp AS INTEGER: cp = 0 '// clipped points behind reference face
  1114.     DIM separation AS _FLOAT
  1115.     separation = vectorDot(refFaceNormal, incidentFace(0)) - refC
  1116.     IF separation <= 0.0 THEN
  1117.         contacts(cp) = incidentFace(0)
  1118.         m.penetration = -separation
  1119.         cp = cp + 1
  1120.     ELSE
  1121.         m.penetration = 0
  1122.     END IF
  1123.  
  1124.     separation = vectorDot(refFaceNormal, incidentFace(1)) - refC
  1125.     IF separation <= 0.0 THEN
  1126.         contacts(cp) = incidentFace(1)
  1127.         m.penetration = m.penetration + -separation
  1128.         cp = cp + 1
  1129.         m.penetration = m.penetration / cp
  1130.     END IF
  1131.     m.contactCount = cp
  1132.  
  1133. FUNCTION collisionPPFindAxisLeastPenetration (p() AS tPOLY, body() AS tBODY, faceIndex() AS INTEGER, A AS INTEGER, B AS INTEGER)
  1134.     DIM bestDistance AS _FLOAT: bestDistance = -9999999
  1135.     DIM bestIndex AS INTEGER: bestIndex = 0
  1136.  
  1137.     DIM n AS tVECTOR2d
  1138.     DIM nw AS tVECTOR2d
  1139.     DIM buT AS tMATRIX2d
  1140.     DIM s AS tVECTOR2d
  1141.     DIM nn AS tVECTOR2d
  1142.     DIM v AS tVECTOR2d
  1143.     DIM tv AS tVECTOR2d
  1144.     DIM d AS _FLOAT
  1145.     DIM i, k AS INTEGER
  1146.  
  1147.     FOR i = 0 TO body(A).pa.count
  1148.         k = body(A).pa.start + i
  1149.  
  1150.         '// Retrieve a face normal from A
  1151.         '// Vec2 n = A->m_normals[i];
  1152.         '// Vec2 nw = A->u * n;
  1153.         n = p(k).norm
  1154.         CALL matrixMultiplyVector(body(A).shape.u, n, nw)
  1155.  
  1156.  
  1157.         '// Transform face normal into B's model space
  1158.         '// Mat2 buT = B->u.Transpose( );
  1159.         '// n = buT * nw;
  1160.         CALL matrixTranspose(body(B).shape.u, buT)
  1161.         CALL matrixMultiplyVector(buT, nw, n)
  1162.  
  1163.         '// Retrieve support point from B along -n
  1164.         '// Vec2 s = B->GetSupport( -n );
  1165.         CALL vectorNegND(nn, n)
  1166.         CALL vectorGetSupport(p(), body(), B, nn, s)
  1167.  
  1168.         '// Retrieve vertex on face from A, transform into
  1169.         '// B's model space
  1170.         '// Vec2 v = A->m_vertices[i];
  1171.         '// v = A->u * v + A->body->position;
  1172.         '// v -= B->body->position;
  1173.         '// v = buT * v;
  1174.  
  1175.         v = p(k).vert
  1176.         CALL matrixMultiplyVector(body(A).shape.u, v, tv)
  1177.         CALL vectorAddVectorND(v, tv, body(A).position)
  1178.  
  1179.         CALL vectorSubVector(v, body(B).position)
  1180.         CALL matrixMultiplyVector(buT, v, tv)
  1181.  
  1182.         CALL vectorSubVector(s, tv)
  1183.         d = vectorDot(n, s)
  1184.  
  1185.         IF d > bestDistance THEN
  1186.             bestDistance = d
  1187.             bestIndex = i
  1188.         END IF
  1189.  
  1190.     NEXT i
  1191.  
  1192.     faceIndex(0) = bestIndex
  1193.  
  1194.     collisionPPFindAxisLeastPenetration = bestDistance
  1195.  
  1196. '**********************************************************************************************
  1197. '   Shape Creation Ahead
  1198. '**********************************************************************************************
  1199.  
  1200. SUB shapeCreate (sh AS tSHAPE, ty AS INTEGER, radius AS _FLOAT)
  1201.     DIM u AS tMATRIX2d
  1202.     CALL matrixSetScalar(u, 1, 0, 0, 1)
  1203.     sh.ty = ty
  1204.     sh.radius = radius
  1205.     sh.u = u
  1206.     sh.scaleTextureX = 1.0
  1207.     sh.scaleTextureY = 1.0
  1208.  
  1209. '**********************************************************************************************
  1210. '   Scene Creation Tools ahead
  1211. '**********************************************************************************************
  1212.  
  1213. SUB setBody (body() AS tBODY, Parameter AS INTEGER, Index AS INTEGER, arg1 AS _FLOAT, arg2 AS _FLOAT)
  1214.     SELECT CASE Parameter
  1215.         CASE cPARAMETER_POSITION:
  1216.             CALL vectorSet(body(Index).position, arg1, arg2)
  1217.         CASE cPARAMETER_VELOCITY:
  1218.             CALL vectorSet(body(Index).velocity, arg1, arg2)
  1219.         CASE cPARAMETER_FORCE:
  1220.             CALL vectorSet(body(Index).force, arg1, arg2)
  1221.         CASE cPARAMETER_ANGULARVELOCITY:
  1222.             body(Index).angularVelocity = arg1
  1223.         CASE cPARAMETER_TORQUE:
  1224.             body(Index).torque = arg1
  1225.         CASE cPARAMETER_ORIENT:
  1226.             body(Index).orient = arg1
  1227.             CALL matrixSetRadians(body(Index).shape.u, body(Index).orient)
  1228.         CASE cPARAMETER_STATICFRICTION:
  1229.             body(Index).staticFriction = arg1
  1230.         CASE cPARAMETER_DYNAMICFRICTION:
  1231.             body(Index).dynamicFriction = arg1
  1232.         CASE cPARAMETER_COLOR:
  1233.             body(Index).c = arg1
  1234.         CASE cPARAMETER_VISIBLE:
  1235.             body(Index).visible = arg1
  1236.         CASE cPARAMETER_STATIC:
  1237.             CALL bodySetStatic(body(Index))
  1238.         CASE cPARAMETER_TEXTURE:
  1239.             body(Index).shape.texture = arg1
  1240.         CASE cPARAMETER_FLIPTEXTURE: 'does the texture flip directions when moving left or right
  1241.             body(Index).shape.flipTexture = arg1
  1242.     END SELECT
  1243.  
  1244. SUB createCircleBody (body() AS tBODY, index AS INTEGER, radius AS _FLOAT)
  1245.     DIM shape AS tSHAPE
  1246.     CALL shapeCreate(shape, cSHAPE_CIRCLE, radius)
  1247.     CALL bodyCreate(body(), index, shape)
  1248.     'no vertices have to created for circles
  1249.     CALL circleInitialize(body(), index)
  1250.     ' Even though circles do not have vertices, they still must be included in the vertices list
  1251.     IF index = 0 THEN
  1252.         body(index).pa.start = 0
  1253.     ELSE
  1254.         body(index).pa.start = body(index - 1).pa.start + body(index - 1).pa.count + 1
  1255.     END IF
  1256.     body(index).pa.count = 1
  1257.     body(index).c = _RGB32(255, 255, 255)
  1258.  
  1259. SUB createBoxBodies (p() AS tPOLY, body() AS tBODY, index AS INTEGER, xs AS _FLOAT, ys AS _FLOAT)
  1260.     DIM shape AS tSHAPE
  1261.     CALL shapeCreate(shape, cSHAPE_POLYGON, 0)
  1262.     CALL bodyCreate(body(), index, shape)
  1263.     CALL boxCreate(p(), body(), index, xs, ys)
  1264.     CALL polygonInitialize(body(), p(), index)
  1265.     body(index).c = _RGB32(255, 255, 255)
  1266.  
  1267. SUB createTrapBody (p() AS tPOLY, body() AS tBODY, index AS INTEGER, xs AS _FLOAT, ys AS _FLOAT, yoff1 AS _FLOAT, yoff2 AS _FLOAT)
  1268.     DIM shape AS tSHAPE
  1269.     CALL shapeCreate(shape, cSHAPE_POLYGON, 0)
  1270.     CALL bodyCreate(body(), index, shape)
  1271.     CALL trapCreate(p(), body(), index, xs, ys, yoff1, yoff2)
  1272.     CALL polygonInitialize(body(), p(), index)
  1273.     body(index).c = _RGB32(255, 255, 255)
  1274.  
  1275.  
  1276. SUB createBodies (p() AS tPOLY, body() AS tBODY, index AS INTEGER, ty AS INTEGER)
  1277.     IF ty = cSHAPE_CIRCLE THEN
  1278.         CALL createCircleBody(body(), index, 10 + RND * 20)
  1279.     ELSE
  1280.         IF ty = cSHAPE_POLYGON THEN
  1281.             CALL createBoxBodies(p(), body(), index, 10 + RND * 10, 10 + RND * 10)
  1282.         END IF
  1283.     END IF
  1284.     body(index).c = _RGB32(55 + RND * 200, 55 + RND * 200, 55 + RND * 200)
  1285.  
  1286.  
  1287. SUB bodyCreate (body() AS tBODY, index AS INTEGER, shape AS tSHAPE)
  1288.     CALL vectorSet(body(index).position, 0, 0)
  1289.     CALL vectorSet(body(index).velocity, 0, 0)
  1290.     body(index).angularVelocity = 0.0
  1291.     body(index).torque = 0.0
  1292.     body(index).orient = 0.0 ' impulseRandom_float(-cPI, cPI)
  1293.  
  1294.     CALL vectorSet(body(index).force, 0, 0)
  1295.     body(index).staticFriction = 0.5
  1296.     body(index).dynamicFriction = 0.3
  1297.     body(index).restitution = 0.2
  1298.     body(index).shape = shape
  1299.  
  1300. SUB boxCreate (p() AS tPOLY, body() AS tBODY, index AS INTEGER, sizex AS _FLOAT, sizey AS _FLOAT)
  1301.     DIM vertlength AS INTEGER: vertlength = 3
  1302.     DIM verts(vertlength) AS tVECTOR2d
  1303.  
  1304.     CALL vectorSet(verts(0), -sizex, -sizey)
  1305.     CALL vectorSet(verts(1), sizex, -sizey)
  1306.     CALL vectorSet(verts(2), sizex, sizey)
  1307.     CALL vectorSet(verts(3), -sizex, sizey)
  1308.  
  1309.     CALL vertexSet(p(), body(), index, verts(), vertlength)
  1310.  
  1311. SUB trapCreate (p() AS tPOLY, body() AS tBODY, index AS INTEGER, sizex AS _FLOAT, sizey AS _FLOAT, yOff1 AS _FLOAT, yOff2 AS _FLOAT)
  1312.     DIM vertlength AS INTEGER: vertlength = 3
  1313.     DIM verts(vertlength) AS tVECTOR2d
  1314.  
  1315.     CALL vectorSet(verts(0), -sizex, -sizey - yOff2)
  1316.     CALL vectorSet(verts(1), sizex, -sizey - yOff1)
  1317.     CALL vectorSet(verts(2), sizex, sizey)
  1318.     CALL vectorSet(verts(3), -sizex, sizey)
  1319.  
  1320.     CALL vertexSet(p(), body(), index, verts(), vertlength)
  1321.  
  1322. SUB createTerrianBody (p() AS tPOLY, body() AS tBODY, index AS INTEGER, slices AS INTEGER, sliceWidth AS _FLOAT, nominalHeight AS _FLOAT)
  1323.     DIM shape AS tSHAPE
  1324.     DIM elevation(slices) AS _FLOAT
  1325.  
  1326.     DIM AS INTEGER i, j
  1327.     FOR j = 0 TO slices
  1328.         elevation(j) = RND * 500
  1329.     NEXT
  1330.  
  1331.  
  1332.     CALL shapeCreate(shape, cSHAPE_POLYGON, 0)
  1333.  
  1334.     FOR i = 0 TO slices - 1
  1335.         CALL bodyCreate(body(), index + i, shape)
  1336.         CALL terrainCreate(p(), body(), index + i, elevation(i), elevation(i + 1), sliceWidth, nominalHeight)
  1337.         CALL polygonInitialize(body(), p(), index + i)
  1338.         body(index + i).c = _RGB32(255, 255, 255)
  1339.         CALL bodySetStatic(body(index + i))
  1340.     NEXT i
  1341.  
  1342.  
  1343. SUB terrainCreate (p() AS tPOLY, body() AS tBODY, index AS INTEGER, ele1 AS _FLOAT, ele2 AS _FLOAT, sliceWidth AS _FLOAT, nominalHeight AS _FLOAT)
  1344.     DIM AS INTEGER vertLength
  1345.     vertLength = 3 ' numOfslices + 1
  1346.     DIM verts(vertLength) AS tVECTOR2d
  1347.  
  1348.     CALL vectorSet(verts(0), 0, nominalHeight)
  1349.     CALL vectorSet(verts(1), (0) * sliceWidth, -nominalHeight - ele1)
  1350.     CALL vectorSet(verts(2), (1) * sliceWidth, -nominalHeight - ele2)
  1351.     CALL vectorSet(verts(3), (1) * sliceWidth, nominalHeight)
  1352.     CALL vertexSet(p(), body(), index, verts(), vertLength)
  1353.  
  1354.  
  1355.  
  1356. SUB vShapeCreate (p() AS tPOLY, body() AS tBODY, index AS INTEGER, sizex AS _FLOAT, sizey AS _FLOAT)
  1357.     DIM vertlength AS INTEGER: vertlength = 7
  1358.     DIM verts(vertlength) AS tVECTOR2d
  1359.  
  1360.     CALL vectorSet(verts(0), -sizex, -sizey)
  1361.     CALL vectorSet(verts(1), sizex, -sizey)
  1362.     CALL vectorSet(verts(2), sizex, sizey)
  1363.     CALL vectorSet(verts(3), -sizex, sizey)
  1364.     CALL vectorSet(verts(4), -sizex, sizey / 2)
  1365.     CALL vectorSet(verts(5), sizex / 2, sizey / 2)
  1366.     CALL vectorSet(verts(6), sizex / 2, -sizey / 2)
  1367.     CALL vectorSet(verts(7), -sizex, sizey / 2)
  1368.  
  1369.     CALL vertexSet(p(), body(), index, verts(), vertlength)
  1370.  
  1371. SUB vertexSet (p() AS tPOLY, body() AS tBODY, index AS INTEGER, verts() AS tVECTOR2d, vertLength AS INTEGER)
  1372.     DIM rightMost AS INTEGER: rightMost = 0
  1373.     DIM highestXCoord AS _FLOAT: highestXCoord = verts(0).x
  1374.     DIM i AS INTEGER
  1375.     DIM x AS _FLOAT
  1376.     FOR i = 1 TO vertLength
  1377.         x = verts(i).x
  1378.         IF x > highestXCoord THEN
  1379.             highestXCoord = x
  1380.             rightMost = i
  1381.         ELSE
  1382.             IF x = highestXCoord THEN
  1383.                 IF verts(i).y < verts(rightMost).y THEN
  1384.                     rightMost = i
  1385.                 END IF
  1386.             END IF
  1387.         END IF
  1388.     NEXT
  1389.     DIM hull(cMAXNUMBEROFPOLYGONS) AS INTEGER
  1390.     DIM outCount AS INTEGER: outCount = 0
  1391.     DIM indexHull AS INTEGER: indexHull = rightMost
  1392.     DIM nextHullIndex AS INTEGER
  1393.     DIM e1 AS tVECTOR2d
  1394.     DIM e2 AS tVECTOR2d
  1395.     DIM c AS _FLOAT
  1396.     DO
  1397.         hull(outCount) = indexHull
  1398.         nextHullIndex = 0
  1399.         FOR i = 1 TO vertLength
  1400.             IF nextHullIndex = indexHull THEN
  1401.                 nextHullIndex = i
  1402.                 _CONTINUE
  1403.             END IF
  1404.             CALL vectorSubVectorND(e1, verts(nextHullIndex), verts(hull(outCount)))
  1405.             CALL vectorSubVectorND(e2, verts(i), verts(hull(outCount)))
  1406.             c = vectorCross(e1, e2)
  1407.             IF c < 0.0 THEN nextHullIndex = i
  1408.             IF c = 0.0 AND (vectorLengthSq(e2) > vectorLengthSq(e1)) THEN
  1409.                 nextHullIndex = i
  1410.             END IF
  1411.         NEXT
  1412.         outCount = outCount + 1
  1413.         indexHull = nextHullIndex
  1414.         IF nextHullIndex = rightMost THEN
  1415.             body(index).pa.count = outCount - 1
  1416.             EXIT DO
  1417.         END IF
  1418.     LOOP
  1419.  
  1420.     IF index = 0 THEN
  1421.         body(index).pa.start = 0
  1422.     ELSE
  1423.         body(index).pa.start = body(index - 1).pa.start + body(index - 1).pa.count + 1
  1424.     END IF
  1425.  
  1426.     FOR i = 0 TO vertLength
  1427.         p(body(index).pa.start + i).vert = verts(hull(i))
  1428.     NEXT
  1429.  
  1430.     DIM face AS tVECTOR2d
  1431.     FOR i = 0 TO vertLength
  1432.         CALL vectorSubVectorND(face, p(body(index).pa.start + arrayNextIndex(i, body(index).pa.count)).vert, p(body(index).pa.start + i).vert)
  1433.         CALL vectorSet(p(body(index).pa.start + i).norm, face.y, -face.x)
  1434.         CALL vectorNormalize(p(body(index).pa.start + i).norm)
  1435.     NEXT
  1436.  
  1437. FUNCTION arrayNextIndex (i AS INTEGER, count AS INTEGER)
  1438.     arrayNextIndex = ((i + 1) MOD (count + 1))
  1439.  
  1440. '**********************************************************************************************
  1441. '   Rendering Stuff Ahead
  1442. '**********************************************************************************************
  1443.  
  1444. SUB renderFps
  1445.     fpsLast = fps
  1446.     fps = 0
  1447.  
  1448. SUB renderBodies (p() AS tPOLY, body() AS tBODY, j() AS tJOINT, hits() AS tHIT, camera AS tCAMERA)
  1449.     DIM i AS INTEGER
  1450.     DIM hitcount AS INTEGER
  1451.     DIM camoffset AS tVECTOR2d
  1452.     DIM AS _FLOAT cx, cy, cwx, cwy, ox, oy, owx, owy
  1453.  
  1454.     FOR i = 0 TO sNUMBEROFBODIES
  1455.         'TODO: Put hidden object logic
  1456.         'AABB to cut down on rendering objects out of camera view
  1457.         cx = camera.position.x
  1458.         cy = camera.position.y
  1459.         cwx = _WIDTH * (1 / camera.zoom)
  1460.         cwy = _HEIGHT * (1 / camera.zoom)
  1461.         ox = body(i).position.x - 5000
  1462.         oy = body(i).position.y - 5000
  1463.         owx = 10000
  1464.         owy = 10000
  1465.         IF cx < ox + owx AND cx + cwx > ox AND cy < oy + owy AND cy + cwy > oy THEN
  1466.  
  1467.             IF body(i).shape.ty = cSHAPE_CIRCLE THEN
  1468.                 IF body(i).shape.texture = 0 THEN
  1469.                     CALL renderWireframeCircle(body(), i, camera)
  1470.                 ELSE
  1471.                     CALL renderTexturedCircle(body(), i, camera)
  1472.                 END IF
  1473.             ELSE IF body(i).shape.ty = cSHAPE_POLYGON THEN
  1474.                     IF body(i).shape.texture = 0 THEN
  1475.                         CALL renderWireframePoly(p(), body(), i, camera)
  1476.                     ELSE
  1477.                         CALL renderTexturedBox(p(), body(), i, camera)
  1478.                     END IF
  1479.                 END IF
  1480.             END IF
  1481.         END IF
  1482.     NEXT
  1483.     IF cRENDER_JOINTS THEN
  1484.         FOR i = 1 TO sNUMBEROFJOINTS
  1485.             CALL renderJoints(j(i), body(), camera)
  1486.         NEXT
  1487.     END IF
  1488.     IF cRENDER_COLLISIONS THEN
  1489.         hitcount = 0
  1490.         DO WHILE hits(hitcount).A <> hits(hitcount).B
  1491.             CALL vectorSubVectorND(camoffset, hits(hitcount).position, camera.position)
  1492.             CIRCLE (camoffset.x, camoffset.y), 5, _RGB(255, 6, 11)
  1493.             hitcount = hitcount + 1
  1494.         LOOP
  1495.     END IF
  1496.  
  1497.  
  1498. SUB renderJoints (j AS tJOINT, b() AS tBODY, camera AS tCAMERA)
  1499.     DIM b1 AS tBODY: b1 = b(j.body1)
  1500.     DIM b2 AS tBODY: b2 = b(j.body2)
  1501.     DIM R1 AS tMATRIX2d: R1 = b1.shape.u 'Call matrixSetRadians(R1, b1.orient)
  1502.     DIM R2 AS tMATRIX2d: R2 = b2.shape.u ' Call matrixSetRadians(R2, b2.orient)
  1503.  
  1504.     DIM x1 AS tVECTOR2d: x1 = b1.position
  1505.     DIM p1 AS tVECTOR2d: CALL matrixMultiplyVector(R1, j.localAnchor1, p1)
  1506.  
  1507.     CALL vectorAddVectorND(p1, p1, x1)
  1508.  
  1509.     DIM x2 AS tVECTOR2d: x2 = b2.position
  1510.     DIM p2 AS tVECTOR2d: CALL matrixMultiplyVector(R2, j.localAnchor2, p2)
  1511.  
  1512.     CALL vectorAddVectorND(p2, p2, x2)
  1513.  
  1514.     CALL vectorSubVector(p1, camera.position)
  1515.     CALL vectorSubVector(x2, camera.position)
  1516.  
  1517.     'Line (x1.x, x1.y)-(p1.x, p1.y), _RGB(127, 127, 244) 'blue
  1518.     LINE (p1.x, p1.y)-(x2.x, x2.y), _RGB(255, 255, 127) 'yellow
  1519.     ' Line (x2.x, x2.y)-(p2.x, p2.y), _RGB32(127, 255, 127) 'green
  1520.     ' Line (p2.x, p2.y)-(x1.x, x1.y), _RGB(127, 6, 127) 'purple
  1521.  
  1522. SUB renderWireframePoly (p() AS tPOLY, b() AS tBODY, index AS INTEGER, camera AS tCAMERA)
  1523.     DIM a AS tVECTOR2d ' dummy vertices
  1524.     DIM b AS tVECTOR2d
  1525.  
  1526.     DIM i, element, element_next AS INTEGER
  1527.     FOR i = 0 TO b(index).pa.count
  1528.         element = b(index).pa.start + i
  1529.         element_next = b(index).pa.start + arrayNextIndex(i, b(index).pa.count) ' wrap around back to first element
  1530.         a = p(element).vert
  1531.         b = p(element_next).vert
  1532.  
  1533.         CALL matrixMultiplyVector(b(index).shape.u, a, a)
  1534.         CALL matrixMultiplyVector(b(index).shape.u, b, b)
  1535.         CALL vectorAddVector(a, b(index).position)
  1536.         CALL vectorAddVector(b, b(index).position)
  1537.         CALL vectorSubVector(a, camera.position)
  1538.         CALL vectorSubVector(b, camera.position)
  1539.         CALL vectorMultiplyScalar(a, camera.zoom)
  1540.         CALL vectorMultiplyScalar(b, camera.zoom)
  1541.         LINE (a.x, a.y)-(b.x, b.y), b(index).c
  1542.     NEXT
  1543.  
  1544. SUB renderTexturedBox (p() AS tPOLY, b() AS tBODY, index AS INTEGER, camera AS tCAMERA)
  1545.     DIM vert(3) AS tVECTOR2d
  1546.     DIM W, H AS INTEGER
  1547.     DIM bm AS LONG
  1548.     bm = b(index).shape.texture
  1549.     W = _WIDTH(bm): H = _HEIGHT(bm)
  1550.     DIM i AS INTEGER
  1551.     FOR i = 0 TO 3
  1552.         vert(i) = p(b(index).pa.start + i).vert
  1553.         vert(i).x = vert(i).x + b(index).shape.offsetTextureX
  1554.         vert(i).y = vert(i).y + b(index).shape.offsetTextureY
  1555.         vert(i).x = vert(i).x * b(index).shape.scaleTextureX
  1556.         vert(i).y = vert(i).y * b(index).shape.scaleTextureY
  1557.  
  1558.         CALL matrixMultiplyVector(b(index).shape.u, vert(i), vert(i))
  1559.         CALL vectorAddVector(vert(i), b(index).position)
  1560.         CALL vectorSubVector(vert(i), camera.position)
  1561.         CALL vectorMultiplyScalar(vert(i), camera.zoom)
  1562.     NEXT
  1563.     IF b(index).velocity.x > 1 OR b(index).shape.flipTexture = 0 THEN
  1564.         _MAPTRIANGLE (0, 0)-(W - 1, 0)-(W - 1, H - 1), bm TO(vert(3).x, vert(3).y)-(vert(0).x, vert(0).y)-(vert(1).x, vert(1).y)
  1565.         _MAPTRIANGLE (0, 0)-(0, H - 1)-(W - 1, H - 1), bm TO(vert(3).x, vert(3).y)-(vert(2).x, vert(2).y)-(vert(1).x, vert(1).y)
  1566.     ELSE
  1567.         _MAPTRIANGLE (0, 0)-(W - 1, 0)-(W - 1, H - 1), bm TO(vert(0).x, vert(0).y)-(vert(3).x, vert(3).y)-(vert(2).x, vert(2).y)
  1568.         _MAPTRIANGLE (0, 0)-(0, H - 1)-(W - 1, H - 1), bm TO(vert(0).x, vert(0).y)-(vert(1).x, vert(1).y)-(vert(2).x, vert(2).y)
  1569.     END IF
  1570.  
  1571.  
  1572. SUB renderWireframeCircle (b() AS tBODY, index AS INTEGER, camera AS tCAMERA)
  1573.     DIM tv AS tVECTOR2d: tv = b(index).position
  1574.     CALL vectorSubVector(tv, camera.position)
  1575.     CALL vectorMultiplyScalar(tv, camera.zoom)
  1576.     CIRCLE (tv.x, tv.y), b(index).shape.radius, b(index).c
  1577.     LINE (tv.x, tv.y)-(tv.x + COS(b(index).orient) * b(index).shape.radius, tv.y + SIN(b(index).orient) * b(index).shape.radius), b(index).c
  1578.  
  1579. SUB renderTexturedCircle (b() AS tBODY, index AS INTEGER, camera AS tCAMERA)
  1580.     DIM vert(3) AS tVECTOR2d
  1581.     DIM W, H AS INTEGER
  1582.     DIM bm AS LONG
  1583.     bm = b(index).shape.texture
  1584.     W = _WIDTH(bm): H = _HEIGHT(bm)
  1585.     CALL vectorSet(vert(0), -b(index).shape.radius, -b(index).shape.radius)
  1586.     CALL vectorSet(vert(1), -b(index).shape.radius, b(index).shape.radius)
  1587.     CALL vectorSet(vert(2), b(index).shape.radius, b(index).shape.radius)
  1588.     CALL vectorSet(vert(3), b(index).shape.radius, -b(index).shape.radius)
  1589.     DIM i AS INTEGER
  1590.     FOR i = 0 TO 3
  1591.         CALL matrixMultiplyVector(b(index).shape.u, vert(i), vert(i))
  1592.         CALL vectorAddVector(vert(i), b(index).position)
  1593.         CALL vectorSubVector(vert(i), camera.position)
  1594.         CALL vectorMultiplyScalar(vert(i), camera.zoom)
  1595.     NEXT
  1596.     _MAPTRIANGLE (0, 0)-(0, H - 1)-(W - 1, H - 1), bm TO(vert(0).x, vert(0).y)-(vert(1).x, vert(1).y)-(vert(2).x, vert(2).y)
  1597.     _MAPTRIANGLE (0, 0)-(W - 1, 0)-(W - 1, H - 1), bm TO(vert(0).x, vert(0).y)-(vert(3).x, vert(3).y)-(vert(2).x, vert(2).y)
  1598.  
  1599. SUB polygonSetOrient (b AS tBODY, radians AS _FLOAT)
  1600.     CALL matrixSetRadians(b.shape.u, radians)
  1601.  
  1602. '**********************************************************************************************
  1603. '   Object initialization Ahead
  1604. '**********************************************************************************************
  1605.  
  1606. SUB circleInitialize (b() AS tBODY, index AS INTEGER)
  1607.     CALL circleComputeMass(b(), index, 1.0)
  1608.  
  1609. SUB circleComputeMass (b() AS tBODY, index AS INTEGER, density AS _FLOAT)
  1610.     b(index).mass = cPI * b(index).shape.radius * b(index).shape.radius * density
  1611.     IF b(index).mass <> 0 THEN
  1612.         b(index).invMass = 1.0 / b(index).mass
  1613.     ELSE
  1614.         b(index).invMass = 0.0
  1615.     END IF
  1616.  
  1617.     b(index).inertia = b(index).mass * b(index).shape.radius * b(index).shape.radius
  1618.  
  1619.     IF b(index).inertia <> 0 THEN
  1620.         b(index).invInertia = 1.0 / b(index).inertia
  1621.     ELSE
  1622.         b(index).invInertia = 0.0
  1623.     END IF
  1624.  
  1625. SUB polygonInitialize (body() AS tBODY, p() AS tPOLY, index AS INTEGER)
  1626.     CALL polygonComputeMass(body(), p(), index, 1.0)
  1627.  
  1628. SUB polygonComputeMass (b() AS tBODY, p() AS tPOLY, index AS INTEGER, density AS _FLOAT)
  1629.     DIM c AS tVECTOR2d ' centroid
  1630.     DIM p1 AS tVECTOR2d
  1631.     DIM p2 AS tVECTOR2d
  1632.     DIM area AS _FLOAT
  1633.     DIM I AS _FLOAT
  1634.     DIM k_inv3 AS _FLOAT
  1635.     DIM D AS _FLOAT
  1636.     DIM triangleArea AS _FLOAT
  1637.     DIM weight AS _FLOAT
  1638.     DIM intx2 AS _FLOAT
  1639.     DIM inty2 AS _FLOAT
  1640.     DIM ii AS INTEGER
  1641.  
  1642.     k_inv3 = 1.0 / 3.0
  1643.  
  1644.     FOR ii = 0 TO b(index).pa.count
  1645.         p1 = p(b(index).pa.start + ii).vert
  1646.         p2 = p(b(index).pa.start + arrayNextIndex(ii, b(index).pa.count)).vert
  1647.         D = vectorCross(p1, p2)
  1648.         triangleArea = .5 * D
  1649.         area = area + triangleArea
  1650.         weight = triangleArea * k_inv3
  1651.         CALL vectorAddVectorScalar(c, p1, weight)
  1652.         CALL vectorAddVectorScalar(c, p2, weight)
  1653.         intx2 = p1.x * p1.x + p2.x * p1.x + p2.x * p2.x
  1654.         inty2 = p1.y * p1.y + p2.y * p1.y + p2.y * p2.y
  1655.         I = I + (0.25 * k_inv3 * D) * (intx2 + inty2)
  1656.     NEXT ii
  1657.  
  1658.     CALL vectorMultiplyScalar(c, 1.0 / area)
  1659.  
  1660.     FOR ii = 0 TO b(index).pa.count
  1661.         CALL vectorSubVector(p(b(index).pa.start + ii).vert, c)
  1662.     NEXT
  1663.  
  1664.     b(index).mass = density * area
  1665.     IF b(index).mass <> 0.0 THEN
  1666.         b(index).invMass = 1.0 / b(index).mass
  1667.     ELSE
  1668.         b(index).invMass = 0.0
  1669.     END IF
  1670.  
  1671.     b(index).inertia = I * density
  1672.     IF b(index).inertia <> 0 THEN
  1673.         b(index).invInertia = 1.0 / b(index).inertia
  1674.     ELSE
  1675.         b(index).invInertia = 0.0
  1676.     END IF
  1677. '**********************************************************************************************
  1678. '   Joint Stuff Ahead
  1679. '**********************************************************************************************
  1680. SUB jointSet (j AS tJOINT, body() AS tBODY, b1 AS INTEGER, b2 AS INTEGER, x AS _FLOAT, y AS _FLOAT)
  1681.     DIM anchor AS tVECTOR2d
  1682.     CALL vectorSet(anchor, x, y)
  1683.     DIM Rot1 AS tMATRIX2d: Rot1 = body(b1).shape.u 'Call matrixSetRadians(Rot1, body(b1).orient)
  1684.     DIM Rot2 AS tMATRIX2d: Rot2 = body(b2).shape.u 'Call matrixSetRadians(Rot2, body(b2).orient)
  1685.     DIM Rot1T AS tMATRIX2d: CALL matrixTranspose(Rot1, Rot1T)
  1686.     DIM Rot2T AS tMATRIX2d: CALL matrixTranspose(Rot2, Rot2T)
  1687.     DIM tv AS tVECTOR2d
  1688.  
  1689.     j.body1 = b1
  1690.     j.body2 = b2
  1691.  
  1692.     CALL vectorSubVectorND(tv, anchor, body(b1).position)
  1693.     CALL matrixMultiplyVector(Rot1T, tv, j.localAnchor1)
  1694.  
  1695.     CALL vectorSubVectorND(tv, anchor, body(b2).position)
  1696.     CALL matrixMultiplyVector(Rot2T, tv, j.localAnchor2)
  1697.  
  1698.     CALL vectorSet(j.P, 0, 0)
  1699.  
  1700.     j.softness = 0.001
  1701.     j.biasFactor = 100
  1702.  
  1703.  
  1704. SUB jointPrestep (j AS tJOINT, body() AS tBODY, inv_dt AS _FLOAT)
  1705.     DIM Rot1 AS tMATRIX2d: Rot1 = body(j.body1).shape.u 'Call matrixSetRadians(Rot1, body(j.body1).orient)
  1706.     DIM Rot2 AS tMATRIX2d: Rot2 = body(j.body2).shape.u 'Call matrixSetRadians(Rot2, body(j.body2).orient)
  1707.     DIM b1invMass AS _FLOAT
  1708.     DIM b2invMass AS _FLOAT
  1709.  
  1710.     DIM b1invInertia AS _FLOAT
  1711.     DIM b2invInertia AS _FLOAT
  1712.  
  1713.     CALL matrixMultiplyVector(Rot1, j.localAnchor1, j.r1)
  1714.     CALL matrixMultiplyVector(Rot2, j.localAnchor2, j.r2)
  1715.  
  1716.     b1invMass = body(j.body1).invMass
  1717.     b2invMass = body(j.body2).invMass
  1718.  
  1719.     b1invInertia = body(j.body1).invInertia
  1720.     b2invInertia = body(j.body2).invInertia
  1721.  
  1722.     DIM K1 AS tMATRIX2d
  1723.     Call matrixSetScalar(K1, b1invMass + b2invMass, 0,_
  1724.                                                 0, b1invMass + b2invMass)
  1725.     DIM K2 AS tMATRIX2d
  1726.     Call matrixSetScalar(K2, b1invInertia * j.r1.y * j.r1.y, -b1invInertia * j.r1.x * j.r1.y,_
  1727.                             -b1invInertia * j.r1.x * j.r1.y,  b1invInertia * j.r1.x * j.r1.x)
  1728.  
  1729.     DIM K3 AS tMATRIX2d
  1730.     Call matrixSetScalar(K3,  b2invInertia * j.r2.y * j.r2.y, - b2invInertia * j.r2.x * j.r2.y,_
  1731.                              -b2invInertia * j.r2.x * j.r2.y,   b2invInertia * j.r2.x * j.r2.x)
  1732.  
  1733.     DIM K AS tMATRIX2d
  1734.     CALL matrixAddMatrix(K1, K2, K)
  1735.     CALL matrixAddMatrix(K3, K, K)
  1736.     K.m00 = K.m00 + j.softness
  1737.     K.m11 = K.m11 + j.softness
  1738.     CALL matrixInvert(K, j.M)
  1739.  
  1740.     DIM p1 AS tVECTOR2d: CALL vectorAddVectorND(p1, body(j.body1).position, j.r1)
  1741.     DIM p2 AS tVECTOR2d: CALL vectorAddVectorND(p2, body(j.body2).position, j.r2)
  1742.     DIM dp AS tVECTOR2d: CALL vectorSubVectorND(dp, p2, p1)
  1743.  
  1744.     CALL vectorMultiplyScalarND(j.bias, dp, -j.biasFactor * inv_dt)
  1745.     'Call vectorSet(j.bias, 0, 0)
  1746.     CALL vectorSet(j.P, 0, 0)
  1747.  
  1748. SUB jointApplyImpulse (j AS tJOINT, body() AS tBODY)
  1749.     DIM dv AS tVECTOR2d
  1750.     DIM impulse AS tVECTOR2d
  1751.     DIM cross1 AS tVECTOR2d
  1752.     DIM cross2 AS tVECTOR2d
  1753.     DIM tv AS tVECTOR2d
  1754.  
  1755.  
  1756.     'Vec2 dv = body2->velocity + Cross(body2->angularVelocity, r2) - body1->velocity - Cross(body1->angularVelocity, r1);
  1757.     CALL vectorCrossScalar(cross2, j.r2, body(j.body2).angularVelocity)
  1758.     CALL vectorCrossScalar(cross1, j.r1, body(j.body1).angularVelocity)
  1759.     CALL vectorAddVectorND(dv, body(j.body2).velocity, cross2)
  1760.     CALL vectorSubVectorND(dv, dv, body(j.body1).velocity)
  1761.     CALL vectorSubVectorND(dv, dv, cross1)
  1762.  
  1763.     ' impulse = M * (bias - dv - softness * P);
  1764.     CALL vectorMultiplyScalarND(tv, j.P, j.softness)
  1765.     CALL vectorSubVectorND(impulse, j.bias, dv)
  1766.     CALL vectorSubVectorND(impulse, impulse, tv)
  1767.     CALL matrixMultiplyVector(j.M, impulse, impulse)
  1768.  
  1769.     ' body1->velocity -= body1->invMass * impulse;
  1770.  
  1771.     CALL vectorMultiplyScalarND(tv, impulse, body(j.body1).invMass)
  1772.     CALL vectorSubVectorND(body(j.body1).velocity, body(j.body1).velocity, tv)
  1773.  
  1774.     ' body1->angularVelocity -= body1->invI * Cross(r1, impulse);
  1775.     DIM crossScalar AS _FLOAT
  1776.     crossScalar = vectorCross(j.r1, impulse)
  1777.     body(j.body1).angularVelocity = body(j.body1).angularVelocity - body(j.body1).invInertia * crossScalar
  1778.  
  1779.     CALL vectorMultiplyScalarND(tv, impulse, body(j.body2).invMass)
  1780.     CALL vectorAddVectorND(body(j.body2).velocity, body(j.body2).velocity, tv)
  1781.  
  1782.     crossScalar = vectorCross(j.r2, impulse)
  1783.     body(j.body2).angularVelocity = body(j.body2).angularVelocity + body(j.body2).invInertia * crossScalar
  1784.  
  1785.     CALL vectorAddVectorND(j.P, j.P, impulse)
  1786.  
  1787.  
  1788. '**********************************************************************************************
  1789. '   Vector Math Ahead
  1790. '**********************************************************************************************
  1791.  
  1792. SUB vectorSet (v AS tVECTOR2d, x AS _FLOAT, y AS _FLOAT)
  1793.     v.x = x
  1794.     v.y = y
  1795.  
  1796. SUB vectorSetVector (o AS tVECTOR2d, v AS tVECTOR2d)
  1797.     o.x = v.x
  1798.     o.y = v.y
  1799.  
  1800. SUB vectorNeg (v AS tVECTOR2d)
  1801.     v.x = -v.x
  1802.     v.y = -v.y
  1803.  
  1804. SUB vectorNegND (o AS tVECTOR2d, v AS tVECTOR2d)
  1805.     o.x = -v.x
  1806.     o.y = -v.y
  1807.  
  1808. SUB vectorMultiplyScalar (v AS tVECTOR2d, s AS _FLOAT)
  1809.     v.x = v.x * s
  1810.     v.y = v.y * s
  1811.  
  1812. SUB vectorMultiplyScalarND (o AS tVECTOR2d, v AS tVECTOR2d, s AS _FLOAT)
  1813.     o.x = v.x * s
  1814.     o.y = v.y * s
  1815.  
  1816. SUB vectorDivideScalar (v AS tVECTOR2d, s AS _FLOAT)
  1817.     v.x = v.x / s
  1818.     v.y = v.y / s
  1819.  
  1820. SUB vectorDivideScalarND (o AS tVECTOR2d, v AS tVECTOR2d, s AS _FLOAT)
  1821.     o.x = v.x / s
  1822.     o.y = v.y / s
  1823.  
  1824. SUB vectorAddScalar (v AS tVECTOR2d, s AS _FLOAT)
  1825.     v.x = v.x + s
  1826.     v.y = v.y + s
  1827.  
  1828. SUB vectorAddScalarND (o AS tVECTOR2d, v AS tVECTOR2d, s AS _FLOAT)
  1829.     o.x = v.x + s
  1830.     o.y = v.y + s
  1831.  
  1832. SUB vectorMultiplyVector (v AS tVECTOR2d, m AS tVECTOR2d)
  1833.     v.x = v.x * m.x
  1834.     v.y = v.y * m.y
  1835.  
  1836. SUB vectorMultiplyVectorND (o AS tVECTOR2d, v AS tVECTOR2d, m AS tVECTOR2d)
  1837.     o.x = v.x * m.x
  1838.     o.y = v.y * m.y
  1839.  
  1840. SUB vectorDivideVector (v AS tVECTOR2d, m AS tVECTOR2d)
  1841.     v.x = v.x / m.x
  1842.     v.y = v.y / m.y
  1843.  
  1844. SUB vectorAddVector (v AS tVECTOR2d, m AS tVECTOR2d)
  1845.     v.x = v.x + m.x
  1846.     v.y = v.y + m.y
  1847.  
  1848. SUB vectorAddVectorND (o AS tVECTOR2d, v AS tVECTOR2d, m AS tVECTOR2d)
  1849.     o.x = v.x + m.x
  1850.     o.y = v.y + m.y
  1851.  
  1852. SUB vectorAddVectorScalar (v AS tVECTOR2d, m AS tVECTOR2d, s AS _FLOAT)
  1853.     v.x = v.x + m.x * s
  1854.     v.y = v.y + m.y * s
  1855.  
  1856. SUB vectorAddVectorScalarND (o AS tVECTOR2d, v AS tVECTOR2d, m AS tVECTOR2d, s AS _FLOAT)
  1857.     o.x = v.x + m.x * s
  1858.     o.y = v.y + m.y * s
  1859.  
  1860. SUB vectorSubVector (v AS tVECTOR2d, m AS tVECTOR2d)
  1861.     v.x = v.x - m.x
  1862.     v.y = v.y - m.y
  1863.  
  1864. SUB vectorSubVectorND (o AS tVECTOR2d, v AS tVECTOR2d, m AS tVECTOR2d)
  1865.     o.x = v.x - m.x
  1866.     o.y = v.y - m.y
  1867.  
  1868. FUNCTION vectorLengthSq (v AS tVECTOR2d)
  1869.     vectorLengthSq = v.x * v.x + v.y * v.y
  1870.  
  1871. FUNCTION vectorLength (v AS tVECTOR2d)
  1872.     vectorLength = SQR(vectorLengthSq(v))
  1873.  
  1874. SUB vectorRotate (v AS tVECTOR2d, radians AS _FLOAT)
  1875.     DIM c, s, xp, yp AS _FLOAT
  1876.     c = COS(radians)
  1877.     s = SIN(radians)
  1878.     xp = v.x * c - v.y * s
  1879.     yp = v.x * s + v.y * c
  1880.     v.x = xp
  1881.     v.y = yp
  1882.  
  1883. SUB vectorNormalize (v AS tVECTOR2d)
  1884.     DIM lenSQ, invLen AS _FLOAT
  1885.     lenSQ = vectorLengthSq(v)
  1886.     IF lenSQ > cEPSILON_SQ THEN
  1887.         invLen = 1.0 / SQR(lenSQ)
  1888.         v.x = v.x * invLen
  1889.         v.y = v.y * invLen
  1890.     END IF
  1891.  
  1892. SUB vectorMin (a AS tVECTOR2d, b AS tVECTOR2d, o AS tVECTOR2d)
  1893.     o.x = scalarMin(a.x, b.x)
  1894.     o.y = scalarMin(a.y, b.y)
  1895.  
  1896. SUB vectorMax (a AS tVECTOR2d, b AS tVECTOR2d, o AS tVECTOR2d)
  1897.     o.x = scalarMax(a.x, b.x)
  1898.     o.y = scalarMax(a.y, b.y)
  1899.  
  1900. FUNCTION vectorDot (a AS tVECTOR2d, b AS tVECTOR2d)
  1901.     vectorDot = a.x * b.x + a.y * b.y
  1902.  
  1903. FUNCTION vectorSqDist (a AS tVECTOR2d, b AS tVECTOR2d)
  1904.     DIM dx, dy AS _FLOAT
  1905.     dx = b.x - a.x
  1906.     dy = b.y - a.y
  1907.     vectorSqDist = dx * dx + dy * dy
  1908.  
  1909. FUNCTION vectorDistance (a AS tVECTOR2d, b AS tVECTOR2d)
  1910.     vectorDistance = SQR(vectorSqDist(a, b))
  1911.  
  1912. FUNCTION vectorCross (a AS tVECTOR2d, b AS tVECTOR2d)
  1913.     vectorCross = a.x * b.y - a.y * b.x
  1914.  
  1915. SUB vectorCrossScalar (o AS tVECTOR2d, v AS tVECTOR2d, a AS _FLOAT)
  1916.     o.x = v.y * -a
  1917.     o.y = v.x * a
  1918.  
  1919. FUNCTION vectorArea (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d)
  1920.     vectorArea = (((b.x - a.x) * (c.y - a.y)) - ((c.x - a.x) * (b.y - a.y)))
  1921.  
  1922. FUNCTION vectorLeft (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d)
  1923.     vectorLeft = vectorArea(a, b, c) > 0
  1924.  
  1925. FUNCTION vectorLeftOn (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d)
  1926.     vectorLeftOn = vectorArea(a, b, c) >= 0
  1927.  
  1928. FUNCTION vectorRight (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d)
  1929.     vectorRight = vectorArea(a, b, c) < 0
  1930.  
  1931. FUNCTION vectorRightOn (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d)
  1932.     vectorRightOn = vectorArea(a, b, c) <= 0
  1933.  
  1934. FUNCTION vectorCollinear (a AS tVECTOR2d, b AS tVECTOR2d, c AS tVECTOR2d, thresholdAngle AS _FLOAT)
  1935.     IF (thresholdAngle = 0) THEN
  1936.         vectorCollinear = (vectorArea(a, b, c) = 0)
  1937.     ELSE
  1938.         DIM ab AS tVECTOR2d
  1939.         DIM bc AS tVECTOR2d
  1940.         DIM dot AS _FLOAT
  1941.         DIM magA AS _FLOAT
  1942.         DIM magB AS _FLOAT
  1943.         DIM angle AS _FLOAT
  1944.  
  1945.         ab.x = b.x - a.x
  1946.         ab.y = b.y - a.y
  1947.         bc.x = c.x - b.x
  1948.         bc.y = c.y - b.y
  1949.  
  1950.         dot = ab.x * bc.x + ab.y * bc.y
  1951.         magA = SQR(ab.x * ab.x + ab.y * ab.y)
  1952.         magB = SQR(bc.x * bc.x + bc.y * bc.y)
  1953.         angle = _ACOS(dot / (magA * magB))
  1954.         vectorCollinear = angle < thresholdAngle
  1955.     END IF
  1956.  
  1957. SUB vectorGetSupport (p() AS tPOLY, body() AS tBODY, index AS INTEGER, dir AS tVECTOR2d, bestVertex AS tVECTOR2d)
  1958.     DIM bestProjection AS _FLOAT
  1959.     DIM v AS tVECTOR2d
  1960.     DIM projection AS _FLOAT
  1961.     DIM i AS INTEGER
  1962.     bestVertex.x = -9999999
  1963.     bestVertex.y = -9999999
  1964.     bestProjection = -9999999
  1965.  
  1966.     FOR i = 0 TO body(index).pa.count
  1967.         v = p(i + body(index).pa.start).vert
  1968.         projection = vectorDot(v, dir)
  1969.         IF projection > bestProjection THEN
  1970.             bestVertex = v
  1971.             bestProjection = projection
  1972.         END IF
  1973.     NEXT
  1974.  
  1975. '**********************************************************************************************
  1976. '   Matrix Stuff Ahead
  1977. '**********************************************************************************************
  1978.  
  1979. SUB matrixSetRadians (m AS tMATRIX2d, radians AS _FLOAT)
  1980.     DIM c AS _FLOAT
  1981.     DIM s AS _FLOAT
  1982.     c = COS(radians)
  1983.     s = SIN(radians)
  1984.     m.m00 = c
  1985.     m.m01 = -s
  1986.     m.m10 = s
  1987.     m.m11 = c
  1988.  
  1989. SUB matrixSetScalar (m AS tMATRIX2d, a AS _FLOAT, b AS _FLOAT, c AS _FLOAT, d AS _FLOAT)
  1990.     m.m00 = a
  1991.     m.m01 = b
  1992.     m.m10 = c
  1993.     m.m11 = d
  1994.  
  1995. SUB matrixAbs (m AS tMATRIX2d, o AS tMATRIX2d)
  1996.     o.m00 = ABS(m.m00)
  1997.     o.m01 = ABS(m.m01)
  1998.     o.m10 = ABS(m.m10)
  1999.     o.m11 = ABS(m.m11)
  2000.  
  2001. SUB matrixGetAxisX (m AS tMATRIX2d, o AS tVECTOR2d)
  2002.     o.x = m.m00
  2003.     o.y = m.m10
  2004.  
  2005. SUB matrixGetAxisY (m AS tMATRIX2d, o AS tVECTOR2d)
  2006.     o.x = m.m01
  2007.     o.y = m.m11
  2008.  
  2009. SUB matrixTransposeI (m AS tMATRIX2d)
  2010.     SWAP m.m01, m.m10
  2011.  
  2012. SUB matrixTranspose (m AS tMATRIX2d, o AS tMATRIX2d)
  2013.     DIM tm AS tMATRIX2d
  2014.     tm.m00 = m.m00
  2015.     tm.m01 = m.m10
  2016.     tm.m10 = m.m01
  2017.     tm.m11 = m.m11
  2018.     o = tm
  2019.  
  2020. SUB matrixInvert (m AS tMATRIX2d, o AS tMATRIX2d)
  2021.     DIM a, b, c, d, det AS _FLOAT
  2022.     DIM tm AS tMATRIX2d
  2023.  
  2024.     a = m.m00: b = m.m01: c = m.m10: d = m.m11
  2025.     det = a * d - b * c
  2026.     IF det = 0 THEN EXIT SUB
  2027.  
  2028.     det = 1 / det
  2029.     tm.m00 = det * d: tm.m01 = -det * b
  2030.     tm.m10 = -det * c: tm.m11 = det * a
  2031.     o = tm
  2032.  
  2033. SUB matrixMultiplyVector (m AS tMATRIX2d, v AS tVECTOR2d, o AS tVECTOR2d)
  2034.     DIM t AS tVECTOR2d
  2035.     t.x = m.m00 * v.x + m.m01 * v.y
  2036.     t.y = m.m10 * v.x + m.m11 * v.y
  2037.     o = t
  2038.  
  2039. SUB matrixAddMatrix (m AS tMATRIX2d, x AS tMATRIX2d, o AS tMATRIX2d)
  2040.     o.m00 = m.m00 + x.m00
  2041.     o.m01 = m.m01 + x.m01
  2042.     o.m10 = m.m10 + x.m10
  2043.     o.m11 = m.m11 + x.m11
  2044.  
  2045. SUB matrixMultiplyMatrix (m AS tMATRIX2d, x AS tMATRIX2d, o AS tMATRIX2d)
  2046.     o.m00 = m.m00 * x.m00 + m.m01 * x.m10
  2047.     o.m01 = m.m00 * x.m01 + m.m01 * x.m11
  2048.     o.m10 = m.m10 * x.m00 + m.m11 * x.m10
  2049.     o.m11 = m.m10 * x.m01 + m.m11 * x.m11
  2050.  
  2051. '**********************************************************************************************
  2052. '   Mostly Unused Stuff Ahead
  2053. '**********************************************************************************************
  2054.  
  2055. SUB polygonMakeCCW (obj AS tTRIANGLE)
  2056.     IF vectorLeft(obj.a, obj.b, obj.c) = 0 THEN
  2057.         SWAP obj.a, obj.c
  2058.     END IF
  2059.  
  2060. FUNCTION polygonIsReflex (t AS tTRIANGLE)
  2061.     polygonIsReflex = vectorRight(t.a, t.b, t.c)
  2062.  
  2063. FUNCTION scalarMin (a AS _FLOAT, b AS _FLOAT)
  2064.     IF a < b THEN
  2065.         scalarMin = a
  2066.     ELSE
  2067.         scalarMin = b
  2068.     END IF
  2069.  
  2070. FUNCTION scalarMax (a AS _FLOAT, b AS _FLOAT)
  2071.     IF a > b THEN
  2072.         scalarMax = a
  2073.     ELSE
  2074.         scalarMax = b
  2075.     END IF
  2076.  
  2077. SUB lineIntersection (l1 AS tLINE2d, l2 AS tLINE2d, o AS tVECTOR2d)
  2078.     DIM a1, b1, c1, a2, b2, c2, det AS _FLOAT
  2079.     o.x = 0
  2080.     o.y = 0
  2081.     a1 = l1.b.y - l1.a.y
  2082.     b1 = l1.a.x - l1.b.x
  2083.     c1 = a1 * l1.a.x + b1 * l1.a.y
  2084.     a2 = l2.b.y - l2.a.y
  2085.     b2 = l2.a.x - l2.b.x
  2086.     c2 = a2 * l2.a.x + b2 * l2.a.y
  2087.     det = a1 * b2 - a2 * b1
  2088.  
  2089.     IF INT(det * cPRECISION) <> 0 THEN
  2090.         o.x = (b2 * c1 - b1 * c2) / det
  2091.         o.y = (a1 * c2 - a2 * c1) / det
  2092.     END IF
  2093.  
  2094. FUNCTION lineSegmentsIntersect (l1 AS tLINE2d, l2 AS tLINE2d)
  2095.     DIM dx, dy, da, db, s, t AS _FLOAT
  2096.     dx = l1.b.x - l1.a.x
  2097.     dy = l1.b.y - l1.a.y
  2098.     da = l2.b.x - l2.a.x
  2099.     db = l2.b.y - l2.a.y
  2100.     IF da * dy - db * dx = 0 THEN
  2101.         lineSegmentsIntersect = 0
  2102.     ELSE
  2103.         s = (dx * (l2.a.y - l1.a.y) + dy * (l1.a.x - l2.a.x)) / (da * dy - db * dx)
  2104.         t = (da * (l1.a.y - l2.a.y) + db * (l2.a.x - l1.a.x)) / (db * dx - da * dy)
  2105.         lineSegmentsIntersect = (s >= 0 AND s <= 1 AND t >= 0 AND t <= 1)
  2106.     END IF
  2107.  
  2108. '**********************************************************************************************
  2109. '   Impulse Specific Math Ahead
  2110. '**********************************************************************************************
  2111.  
  2112. FUNCTION impulseEqual (a AS _FLOAT, b AS _FLOAT)
  2113.     impulseEqual = ABS(a - b) <= cEPSILON
  2114.  
  2115. FUNCTION impulseClamp (min AS _FLOAT, max AS _FLOAT, a AS _FLOAT)
  2116.     IF a < min THEN
  2117.         impulseClamp = min
  2118.     ELSE IF a > max THEN
  2119.             impulseClamp = max
  2120.         ELSE
  2121.             impulseClamp = a
  2122.         END IF
  2123.     END IF
  2124.  
  2125. FUNCTION impulseRound (a AS _FLOAT)
  2126.     impulseRound = INT(a + 0.5)
  2127.  
  2128. FUNCTION impulseRandom_float (min AS _FLOAT, max AS _FLOAT)
  2129.     impulseRandom_float = ((max - min) * RND + min)
  2130.  
  2131. FUNCTION impulseRandomInteger (min AS INTEGER, max AS INTEGER)
  2132.     impulseRandomInteger = INT((max - min) * RND + min)
  2133.  
  2134. FUNCTION impulseGT (a AS _FLOAT, b AS _FLOAT)
  2135.     impulseGT = (a >= b * cBIAS_RELATIVE + a * cBIAS_ABSOLUTE)
  2136.  
  2137. '**********************************************************************************************
  2138. '   Troubleshooting Tools
  2139. '**********************************************************************************************
  2140.  
  2141. SUB printMatrix (u AS tMATRIX2d, n AS INTEGER)
  2142.     PRINT "---------------------------"
  2143.     PRINT n; " u:"; u.m00; "|"; u.m10
  2144.     PRINT "       "; u.m10; "|"; u.m11
  2145.     DO
  2146.     LOOP UNTIL _KEYHIT = 27
  2147.  
  2148.  
  2149. '**********************************************************************************************
  2150. '   Generate Bitmap
  2151. '**********************************************************************************************
  2152.  
  2153. SUB generateBitmap (bm() AS LONG)
  2154.     DIM cl AS _UNSIGNED LONG
  2155.     DIM rleCount, y, x, i AS INTEGER
  2156.     'TODO: Do a pallete pass and color pixels based on pallete
  2157.  
  2158.     'CarBody  - License CC0 - GameArt2D.com
  2159.     DATA 1147,0,4278190083,4278261626,4278193217
  2160.     DATA 4278190081,4278190088,4278190084,4278190082
  2161.     DATA 4278190087,4278394763,4278788960,4278255873
  2162.     DATA 4278913804,4279308561,4279111182,4279505940
  2163.     DATA 4279374359,4278255875,4278460556,4279847562
  2164.     DATA 4278718994,4278584851,4278979598,4279045399
  2165.     DATA 4279374355,4281282351,4281019179,4280887593
  2166.     DATA 4279703323,4278387467,4278255879,4279637535
  2167.     DATA 4278519049,4280840112,4279248424,4279242773
  2168.     DATA 4279834913,4280492843,4279176979,4279703320
  2169.     DATA 4280427044,4280953386,4281019183,4280756009
  2170.     DATA 4281413948,4281611327,4278394506,4281832407
  2171.     DATA 4279843904,4279111198,4278979597,4280229663
  2172.     DATA 4280098077,4281677109,4281545523,4281611316
  2173.     DATA 4281216558,4280756007,4281479730,4282071867
  2174.     DATA 4283256142,4280953389,4278394505,4282031069
  2175.     DATA 4281035381,4278190337,4278255880,4280821804
  2176.     DATA 4289177511,4286677377,4281084972,4280295456
  2177.     DATA 4282927176,4283848281,4280887600,4278263177
  2178.     DATA 4281636569,4282623666,4278256387,4281282357
  2179.     DATA 4289835441,4291743438,4291940817,4285690482
  2180.     DATA 4281150765,4280558628,4281413937,4282400832
  2181.     DATA 4284572001,4289769650,4279176977,4278197641
  2182.     DATA 4280585429,4284014834,4278322438,4283453530
  2183.     DATA 4291546059,4284045657,4281742902,4280821800
  2184.     DATA 4281874488,4282532418,4283256141,4287466893
  2185.     DATA 4289835448,4279600595,4284350207,4279182124
  2186.     DATA 4278913810,4281151030,4280953651,4281150774
  2187.     DATA 4278848014,4284440418,4291480266,4292269782
  2188.     DATA 4293388263,4293585642,4290295992,4283387727
  2189.     DATA 4282137660,4283321934,4283914071,4293914607
  2190.     DATA 4284703592,4278616275,4283627263,4281035640
  2191.     DATA 4281545531,4292927970,4293125348,4293914864
  2192.     DATA 4282071870,4284506210,4291282887,4293059298
  2193.     DATA 4293322470,4293388521,4290953923,4283519313
  2194.     DATA 4280361249,4288980132,4293191142,4290625218
  2195.     DATA 4278222035,4282707199,4283020486,4289046185
  2196.     DATA 4291283144,4290690750,4291348937,4281282356
  2197.     DATA 4278255877,4281479734,4291019458,4292796383
  2198.     DATA 4293519071,4294567868,4289241230,4281940281
  2199.     DATA 4284177244,4292596671,4294963139,4283781713
  2200.     DATA 4278222291,4281065727,4284608508,4278190085
  2201.     DATA 4288848804,4289901234,4290559164,4280953391
  2202.     DATA 4280032293,4288059029,4292203991,4294764211
  2203.     DATA 4294961325,4293908901,4285557857,4283124555
  2204.     DATA 4283190348,4284308312,4292856989,4294961069
  2205.     DATA 4292856987,4278387463,4279425023,4284543487
  2206.     DATA 4279580737,4279241999,4288124824,4289967027
  2207.     DATA 4290624957,4278190340,4278718003,4278717745
  2208.     DATA 4278652208,4280034126,4284245130,4290360507
  2209.     DATA 4291805619,4291871931,4292135101,4285427590
  2210.     DATA 4281810530,4280757842,4281086807,4280823636
  2211.     DATA 4282600048,4282600052,4286216071,4291805625
  2212.     DATA 4291609023,4290622387,4281217360,4278454826
  2213.     DATA 4278519325,4278395024,4278222546,4278245375
  2214.     DATA 4284413951,4281631370,4286545792,4279641736
  2215.     DATA 4281422079,4281356287,4281290495,4281224702
  2216.     DATA 4281027325,4280961789,4280961788,4281158910
  2217.     DATA 4281224703,4281027324,4281356030,4281420796
  2218.     DATA 4281157367,4281425144,4281360610,4279180406
  2219.     DATA 4280889705,4289112500,4289572532,4289769907
  2220.     DATA 4289769649,4290361785,4280887599,4278394785
  2221.     DATA 4278397137,4278397135,4278396879,4278396880
  2222.     DATA 4278528724,4278397397,4278331344,4279514827
  2223.     DATA 4280632006,4282274741,4285100955,4287597957
  2224.     DATA 4287400838,4287137928,4287203721,4283914074
  2225.     DATA 4278584840,4278328991,4278331342,4278265551
  2226.     DATA 4278199249,4278594250,4282800035,4285691528
  2227.     DATA 4286742912,4282861384,4278328992,4278331599
  2228.     DATA 4278331598,4278331340,4278331339,4278331338
  2229.     DATA 4278331341,4278331600,4278331601,4278331345
  2230.     DATA 4278331343,4278200015,4278660043,4280828342
  2231.     DATA 4282401355,4278262149,4278263446,4278263445
  2232.     DATA 4278263706,4278263967,4278329508,4278329770
  2233.     DATA 4278330289,4278330554,4278330817,4278331077
  2234.     DATA 4278198981,4278193483,4278261618,4278263705
  2235.     DATA 4278263708,4278263970,4278330549,4278397394
  2236.     DATA 4278790076,4278526120,4278191946,4278198428
  2237.     DATA 4280294018,4279770248,4278198430,4278263703
  2238.     DATA 4278329763,4278330294,4278331081,4278726368
  2239.     DATA 4279318781,4278661111,4285892299,4291613155
  2240.     DATA 4279638579,4278198171,4286843961,4291690496
  2241.     DATA 4291428611,4284354901,4278198170,4278329497
  2242.     DATA 4278329498,4278263447,4278528195,4279384575
  2243.     DATA 4279252991,4279186131,4294835967,4294309625
  2244.     DATA 4285295994,4278263704,4278264490,4278264758
  2245.     DATA 4278265020,4278265023,4278265022,4278265015
  2246.     DATA 4278329761,4285206603,4281800561,4279508107
  2247.     DATA 4286712890,4291756032,4291887104,4286581819
  2248.     DATA 4279382196,4280961230,4283986144,4291811320
  2249.     DATA 4291679736,4283131624,4278331346,4279252724
  2250.     DATA 4279252986,4278200026,4283393738,4293980401
  2251.     DATA 4293585641,4287796382,4278387720,4278197913
  2252.     DATA 4279250862,4279449040,4278660313,4278923753
  2253.     DATA 4279121139,4279121395,4278924011,4278660316
  2254.     DATA 4278397136,4278330288,4284027480,4292214784
  2255.     DATA 4291821568,4289856533,4290118674,4292083712
  2256.     DATA 4288022827,4278200017,4293191931,4289444345
  2257.     DATA 4291942651,4294967295,4287537661,4278990077
  2258.     DATA 4278528985,4278197963,4286287062,4294704124
  2259.     DATA 4289243568,4279243028,4278196378,4284380115
  2260.     DATA 4294309886,4292600319,4281357055,4279187193
  2261.     DATA 4278857957,4278594779,4278594522,4278594781
  2262.     DATA 4278660574,4278396084,4283503453,4286712633
  2263.     DATA 4282979428,4278525846,4279049873,4292149248
  2264.     DATA 4287957291,4278330552,4278397140,4281553368
  2265.     DATA 4279317713,4280829909,4287274217,4285498595
  2266.     DATA 4279317972,4278857961,4278923755,4278265548
  2267.     DATA 4278197705,4287799518,4293519848,4290034132
  2268.     DATA 4279572257,4278197916,4279185605,4294375422
  2269.     DATA 4289707260,4279120866,4278397138,4278264231
  2270.     DATA 4278787731,4288415782,4292018176,4290053140
  2271.     DATA 4282783079,4280490623,4278330553,4278198989
  2272.     DATA 4278199501,4278197447,4288588513,4293651433
  2273.     DATA 4290100967,4279640406,4278263707,4278198964
  2274.     DATA 4279647210,4292731903,4289181179,4279120596
  2275.     DATA 4278199757,4278263709,4278263964,4278198431
  2276.     DATA 4288088621,4291494149,4290839309,4286123587
  2277.     DATA 4288743462,4292345856,4291952640,4292870144
  2278.     DATA 4283832441,4278200530,4278197704,4287865309
  2279.     DATA 4293651176,4289969379,4279643540,4278594780
  2280.     DATA 4279252987,4278398203,4278198741,4278330029
  2281.     DATA 4278330028,4278330293,4278264235,4278195300
  2282.     DATA 4278195561,4278195820,4279112542,4280815435
  2283.     DATA 4281077576,4278392166,4278457446,4285007388
  2284.     DATA 4287496192,4287692800,4284941852,4281535812
  2285.     DATA 4287103235,4287365120,4284484929,4278200271
  2286.     DATA 4278330550,4278331080,4278197964,4286352850
  2287.     DATA 4293454054,4289180125,4279317192,4278261361
  2288.     DATA 4278396349,4279055603,4278594778,4278196610
  2289.     DATA 4278391654,4284352035,4287430656,4285924114
  2290.     DATA 4278195309,4278784866,4285793043,4287561728
  2291.     DATA 4287168515,4281142856,4278195569,4283566124
  2292.     DATA 4287823872,4286906894,4280098983,4278198991
  2293.     DATA 4283327426,4294440951,4294769657,4287667666
  2294.     DATA 4278660566,4278191126,4278261362,4278594523
  2295.     DATA 4278989549,4278329240,4278591105,4278656638
  2296.     DATA 4278460560,4278197917,4278264488,4278265807
  2297.     DATA 4281739161,4290256932,4290977052,4290780702
  2298.     DATA 4290911516,4288226363,4280235670,4280890511
  2299.     DATA 4284689251,4283510641,4279973786,4279842714
  2300.     DATA 4282986359,4291370263,4285932130,4278396877
  2301.     DATA 4278264492,4278263702,4278525844,4278787708
  2302.     DATA 4278722175,4278329239,4278198172,4278330547
  2303.     DATA 4278199759,4279448250,4293256677,4294309364
  2304.     DATA 4286221793,4278199503,4278192955,4278262146
  2305.     DATA 4278990065,4278330814,4278787702,4279900702
  2306.     DATA 4279900696,4279834904,4280496228,4278460824
  2307.     DATA 4278198957,4280557998,4289922331,4291493890
  2308.     DATA 4284354899,4278198429,4279639178,4290380559
  2309.     DATA 4291035659,4282195091,4278200532,4280561513
  2310.     DATA 4281611315,4279900697,4279966233,4278918763
  2311.     DATA 4278330816,4278197442,4288259022,4292073188
  2312.     DATA 4281422050,4278331604,4278259542,4278195856
  2313.     DATA 4279055871,4278792434,4278199499,4278264227
  2314.     DATA 4278198174,4279245905,4279966229,4279900698
  2315.     DATA 4282992708,4282665318,4278526617,4278199746
  2316.     DATA 4286909504,4289790472,4290772992,4290576384
  2317.     DATA 4290510848,4289135376,4281276010,4278197390
  2318.     DATA 4279572862,4284419653,4289921287,4288939548
  2319.     DATA 4278462415,4278265539,4278592409,4282139754
  2320.     DATA 4283124296,4280492835,4279834905,4279376968
  2321.     DATA 4278199221,4280566472,4278792700,4278200283
  2322.     DATA 4278193764,4278716426,4282663492,4285036746
  2323.     DATA 4284907774,4285170163,4285432802,4285498852
  2324.     DATA 4282013127,4278197144,4278984034,4279900699
  2325.     DATA 4284440154,4280560725,4278198439,4278195825
  2326.     DATA 4278784867,4285989906,4287627264,4287889408
  2327.     DATA 4288217088,4288086016,4283830356,4278200794
  2328.     DATA 4280101477,4284242772,4279115099,4278197400
  2329.     DATA 4281289407,4285630437,4285367267,4285301488
  2330.     DATA 4284907775,4285170416,4284903852,4284440168
  2331.     DATA 4282532426,4278782218,4278650631,4290559169
  2332.     DATA 4294901502,4294572532,4294572534,4294966773
  2333.     DATA 4280828586,4280559931,4280953385,4280163870
  2334.     DATA 4283585106,4280098073,4278787698,4278198434
  2335.     DATA 4278330551,4278194794,4278194535,4280748871
  2336.     DATA 4286906369,4287299584,4286447622,4281469503
  2337.     DATA 4281862203,4286185482,4281145999,4278200265
  2338.     DATA 4278263968,4278656644,4280294939,4283387726
  2339.     DATA 4282664004,4280032284,4279769112,4279834648
  2340.     DATA 4279638308,4278328454,4279513505,4294967286
  2341.     DATA 4294309361,4294309105,4294901241,4294572535
  2342.     DATA 4291348684,4284308835,4293783021,4294111986
  2343.     DATA 4291349725,4278195605,4279642224,4281676849
  2344.     DATA 4280624421,4283058762,4279966491,4279638832
  2345.     DATA 4278199230,4280960174,4280960427,4283776908
  2346.     DATA 4291374389,4292225835,4292291370,4289671496
  2347.     DATA 4281811874,4280894892,4281484454,4289737031
  2348.     DATA 4292553511,4279446214,4278199483,4278198176
  2349.     DATA 4279573567,4279966489,4282335039,4283716692
  2350.     DATA 4281611053,4279773290,4278197656,4290165975
  2351.     DATA 4293585639,4293651435,4293980400,4294177779
  2352.     DATA 4285624694,4290690752,4294638330,4293848553
  2353.     DATA 4286680774,4278197139,4280692306,4281676850
  2354.     DATA 4282006074,4279835170,4278722172,4278264754
  2355.     DATA 4279442571,4288612131,4291100934,4282586472
  2356.     DATA 4278198691,4285206345,4291297542,4278200792
  2357.     DATA 4278264752,4278525837,4279900701,4283979864
  2358.     DATA 4281611057,4281086020,4278197912,4286220483
  2359.     DATA 4293914345,4293717228,4292598749,4293125093
  2360.     DATA 4294111722,4283327156,4278197134,4279177247
  2361.     DATA 4279308311,4279242776,4279374361,4280690220
  2362.     DATA 4282598211,4283650899,4280427042,4279049569
  2363.     DATA 4278199215,4284028269,4291166208,4290117632
  2364.     DATA 4289986560,4288087062,4278262662,4278393733
  2365.     DATA 4283502667,4286580775,4285467444,4288611088
  2366.     DATA 4288153122,4278200789,4278264491,4278918508
  2367.     DATA 4279900700,4283782485,4282729797,4281413938
  2368.     DATA 4281150770,4281019186,4281216043,4278394770
  2369.     DATA 4283064243,4294177258,4292006611,4293454056
  2370.     DATA 4294308843,4281222826,4278196869,4279111184
  2371.     DATA 4281413939,4282861383,4279245903,4278198695
  2372.     DATA 4280884628,4288151552,4287758336,4287954944
  2373.     DATA 4285858837,4278916196,4278195824,4284221223
  2374.     DATA 4285270581,4278200531,4278198696,4279245910
  2375.     DATA 4279703319,4283848278,4281874489,4278255874
  2376.     DATA 4278255616,4278261358,4281025706,4292335575
  2377.     DATA 4288980136,4292861919,4294440428,4279907748
  2378.     DATA 4278195827,4279769116,4282203453,4284177243
  2379.     DATA 4279311430,4278528192,4281544301,4281609583
  2380.     DATA 4280561787,4279644548,4279972225,4282592100
  2381.     DATA 4286652981,4283967572,4285211974,4288879900
  2382.     DATA 4289076505,4285669459,4278200272,4278198694
  2383.     DATA 4279442504,4284440415,4282992969,4282269246
  2384.     DATA 4279900704,4278260059,4280631209,4293322471
  2385.     DATA 4293454055,4292796126,4290493373,4283848285
  2386.     DATA 4292138196,4293124568,4279841954,4278195308
  2387.     DATA 4278387460,4280756011,4284308829,4279376965
  2388.     DATA 4278331076,4278197655,4278721939,4282062446
  2389.     DATA 4278918289,4278394262,4285795395,4292411392
  2390.     DATA 4287695677,4279508037,4284111450,4283453520
  2391.     DATA 4281150768,4278259796,4280368294,4292006612
  2392.     DATA 4292203988,4292006610,4284900973,4288585380
  2393.     DATA 4291809231,4292664018,4280894124,4278196089
  2394.     DATA 4278650634,4282795590,4282795594,4279311433
  2395.     DATA 4278265287,4278329237,4278329496,4278394775
  2396.     DATA 4278656916,4278263960,4278198426,4283176034
  2397.     DATA 4291690498,4288219704,4278200018,4278460847
  2398.     DATA 4279442507,4281677116,4284243036,4278848016
  2399.     DATA 4278260575,4280499886,4292203729,4291875023
  2400.     DATA 4292203989,4288980138,4278519046,4278782220
  2401.     DATA 4286743170,4287203722,4280887075,4279769118
  2402.     DATA 4279966499,4278782223,4281282354,4279900438
  2403.     DATA 4279965969,4281676586,4281742382,4281611052
  2404.     DATA 4281676845,4281676589,4281480496,4281022005
  2405.     DATA 4281152819,4281150241,4279900176,4279900439
  2406.     DATA 4280821805,4278453253,4279308569,4280295461
  2407.     DATA 4280097560,4287269515,4286808963,4284637799
  2408.     DATA 4278584841,4281216562,4284177245,4279111189
  2409.     DATA 4282466625,4278979596,4281348145,4279111188
  2410.     DATA 4283387732,4278782224,4281808695,4281808702
  2411.     DATA 4281479731,4278584838,4281150773,4279242772
  2412.     DATA 4280163874,4284374622,4279571740,4281874497
  2413.     DATA 4282729805,4284243037,4280492840,4278584844
  2414.     DATA 4283453524,4278387462,4282006081,4281874490
  2415.     DATA 4280887595,4281940283,4282006079,4278387461
  2416.     DATA 4278650632,4282992974,4278782222,4278848012
  2417.     DATA 4282664008,4280558633,4280427043,4280492837
  2418.     DATA 4282335044,4281611319,4278321671,4278716428
  2419.     DATA 4278716427,4280624423,4282729801,4278584842
  2420.     DATA 4278519051,4281216561,4279308562,4280361252
  2421.     DATA 4283782490,4278716424,4279571733,4280953388
  2422.     DATA 4281479732,4283848282,4278782221,4280098084
  2423.     DATA 4281282352,4279966496,4283387729,4282466626
  2424.     DATA 4280427047,4281348146,4280558634,4283256144
  2425.     DATA 4279834909,4278584843,4278321668,4279242769
  2426.     DATA 4280229672,4280624425,4279374357,4281348144
  2427.     DATA 4279440151,4280821802,4283519315,4279703328
  2428.     DATA 4278453256,4282203456,4283453522,4282006080
  2429.     DATA 4278848013,4281216560,4278979600,4280492841
  2430.     DATA 4281874491,4278716433,4278782226,4279505946
  2431.     DATA 4281808698,4280427046,4279111186,4281216559
  2432.     DATA 4278913807,4279308565,4278519047,4278650639
  2433.     DATA 4281150767,4279045394,4281150766,4281677112
  2434.     DATA 4279308566,4281084975,4279637526,4278519054
  2435.     DATA 4281413940,4278255876,4280361260,4280295464
  2436.     DATA 4278321666,4280229665,4280887598,4280032288
  2437.     DATA 4278979602,4278979601,4281348149,4282006075
  2438.     DATA 4282861386,4280098083,4280163878,4282532420
  2439.     DATA 4278716425,4279045389,4280887597,4282729798
  2440.     DATA 4278782217,4279703326,4281808696,4279176975
  2441.     DATA 4279176980,4280558635,4278453255,4282729799
  2442.     DATA 4279045391,4282203457,4280163877,4278321667
  2443.     DATA 4281413943,4281808699,4278650633,4280229668
  2444.     DATA 4282795591,4280163875,4279637532,4280229670
  2445.     DATA 4279900706,4281282360,4280163879,0,22,1,1,0,11,2,0,3,0
  2446.     DATA 0,45,4,0,5,0,6,0,7,0,8,0,6,0,0,9
  2447.     DATA 9,0,10,0,7,0,0,41,7,0,4,0,0,0,11,0
  2448.     DATA 12,0,13,0,14,0,15,0,16,0,0,0,7,0,17,0
  2449.     DATA 0,6,18,0,19,0,20,0,0,40,21,0,22,0,23,0
  2450.     DATA 4,0,11,0,24,0,25,0,26,0,27,0,28,0,29,0
  2451.     DATA 30,0,31,0,32,0,0,5,9,0,33,0,34,0,0,40
  2452.     DATA 35,0,36,0,37,0,38,0,39,0,40,0,25,0,26,0
  2453.     DATA 41,0,42,0,43,0,44,0,45,0,31,0,0,5,46,0
  2454.     DATA 47,0,48,0,0,40,49,0,50,0,51,0,52,0,53,0
  2455.     DATA 54,0,55,0,56,0,57,0,55,0,58,0,59,0,60,0
  2456.     DATA 61,0,0,5,62,0,63,0,64,0,65,0,0,38,66,0
  2457.     DATA 67,0,59,0,68,0,69,0,70,0,54,1,55,0,71,0
  2458.     DATA 53,0,54,0,58,0,72,0,73,0,74,0,0,4,75,0
  2459.     DATA 76,0,77,0,78,0,0,39,79,0,80,0,81,0,82,0
  2460.     DATA 83,0,84,0,54,1,85,0,86,0,54,1,87,0,88,0
  2461.     DATA 89,0,90,0,0,3,91,0,92,0,93,0,94,0,0,39
  2462.     DATA 95,0,81,0,96,0,82,0,96,0,97,0,98,0,54,0
  2463.     DATA 99,0,84,0,54,0,100,0,101,0,102,0,103,0,104,0
  2464.     DATA 7,0,0,2,91,0,105,0,106,0,107,0,0,2,108,0
  2465.     DATA 109,0,110,7,111,0,112,0,0,24,113,0,114,0,115,0
  2466.     DATA 116,0,117,0,118,0,119,0,120,0,99,0,56,0,27,0
  2467.     DATA 102,0,121,0,122,0,96,0,123,0,124,0,0,2,75,0
  2468.     DATA 125,0,126,0,127,0,0,1,128,0,129,0,130,8,131,0
  2469.     DATA 132,0,0,23,5,0,133,0,134,0,135,0,136,0,137,0
  2470.     DATA 138,0,139,0,120,0,99,0,56,0,41,0,102,0,140,0
  2471.     DATA 121,0,141,0,142,0,143,0,4,0,0,1,75,0,144,0
  2472.     DATA 145,0,146,0,0,0,1,0,147,0,148,0,149,8,150,0
  2473.     DATA 151,0,0,23,152,0,153,0,154,0,155,0,156,0,157,0
  2474.     DATA 158,0,159,0,98,0,99,0,56,0,27,0,120,0,84,0
  2475.     DATA 160,0,161,0,162,0,163,0,0,2,75,0,164,0,165,0
  2476.     DATA 166,0,167,0,39,0,168,0,169,9,170,0,171,0,0,24
  2477.     DATA 172,0,173,0,174,0,175,0,176,0,177,0,178,0,120,0
  2478.     DATA 99,0,56,0,41,0,179,0,180,0,181,0,182,0,183,0
  2479.     DATA 184,0,185,0,0,1,75,0,164,0,186,0,187,0,188,0
  2480.     DATA 189,0,190,0,191,9,192,0,171,0,0,11,193,0,194,0
  2481.     DATA 195,9,196,0,197,0,198,0,199,0,200,0,201,0,202,0
  2482.     DATA 203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0
  2483.     DATA 211,0,212,0,213,0,214,0,215,0,216,0,217,0,218,0
  2484.     DATA 219,0,220,0,221,0,4,0,222,0,191,9,192,0,171,0
  2485.     DATA 0,11,223,0,224,0,225,10,226,0,227,0,228,0,229,1
  2486.     DATA 230,0,231,0,226,3,232,0,227,0,231,0,228,0,233,0
  2487.     DATA 228,0,226,0,225,1,234,0,235,0,236,0,237,0,238,0
  2488.     DATA 239,0,240,0,241,0,242,0,243,0,169,5,244,0,245,0
  2489.     DATA 246,0,0,11,247,0,248,0,249,33,250,0,251,0,252,0
  2490.     DATA 253,0,254,0,255,0,256,0,257,0,258,0,259,0,260,0
  2491.     DATA 261,0,262,0,263,0,28,0,264,0,0,11,265,0,254,0
  2492.     DATA 266,40,267,0,268,0,269,0,270,0,271,0,272,0,273,0
  2493.     DATA 0,13,274,0,275,0,276,22,277,0,278,0,279,1,277,0
  2494.     DATA 280,0,281,0,282,0,283,1,254,1,284,0,266,7,285,0
  2495.     DATA 286,0,287,0,288,0,0,13,289,0,290,0,291,22,290,4
  2496.     DATA 291,1,290,0,292,0,293,0,294,0,295,0,296,0,297,0
  2497.     DATA 298,0,299,0,278,0,284,1,266,3,267,0,300,0,301,0
  2498.     DATA 0,12,302,0,292,0,303,37,292,0,304,0,305,0,306,0
  2499.     DATA 278,0,254,0,266,3,307,0,308,0,309,0,310,0,4,0
  2500.     DATA 0,8,302,0,292,0,303,24,311,0,312,0,313,0,314,0
  2501.     DATA 303,11,315,0,290,0,316,0,317,0,318,0,266,0,319,0
  2502.     DATA 320,0,321,0,322,0,323,0,324,0,0,8,302,0,292,0
  2503.     DATA 303,23,325,0,326,0,327,0,328,0,329,0,330,0,303,11
  2504.     DATA 331,0,332,0,303,0,333,0,334,0,335,0,336,0,337,0
  2505.     DATA 338,0,339,0,340,0,4,0,0,7,302,0,292,0,303,2
  2506.     DATA 341,0,292,0,342,0,343,0,344,0,345,0,346,0,347,0
  2507.     DATA 348,0,315,0,303,6,330,0,349,0,350,0,351,0,352,0
  2508.     DATA 353,1,327,0,354,0,355,0,325,0,303,5,341,0,292,0
  2509.     DATA 356,0,357,0,358,0,359,0,360,0,361,0,362,0,363,0
  2510.     DATA 364,0,365,0,366,0,367,0,368,0,369,0,370,0,0,7
  2511.     DATA 302,0,292,0,303,1,371,0,372,0,373,0,374,0,375,0
  2512.     DATA 376,0,377,0,378,0,379,0,380,0,381,0,303,6,314,0
  2513.     DATA 382,0,354,0,383,0,384,0,385,0,386,0,353,0,327,0
  2514.     DATA 387,0,388,0,311,0,330,0,303,3,295,0,389,0,390,0
  2515.     DATA 391,0,392,0,393,1,394,0,395,0,320,0,396,0,397,0
  2516.     DATA 398,0,399,0,116,0,400,0,401,0,0,7,302,0,292,0
  2517.     DATA 341,0,402,0,403,0,404,0,405,0,406,0,407,0,408,0
  2518.     DATA 409,0,396,0,410,0,411,0,412,0,413,0,303,7,414,0
  2519.     DATA 415,0,416,0,417,0,418,0,419,0,327,1,354,0,420,0
  2520.     DATA 417,0,311,0,303,0,292,0,421,0,248,0,422,0,423,0
  2521.     DATA 424,0,425,0,426,0,427,0,428,0,429,0,430,0,431,0
  2522.     DATA 432,0,433,0,393,0,434,0,435,0,436,0,0,7,302,0
  2523.     DATA 292,0,437,0,438,0,439,0,393,0,440,0,441,0,431,0
  2524.     DATA 280,0,266,3,280,0,442,0,443,0,341,0,303,5,325,0
  2525.     DATA 311,0,351,0,444,0,314,0,445,0,446,0,327,1,354,0
  2526.     DATA 447,0,448,0,449,0,450,0,283,0,266,4,451,0,452,0
  2527.     DATA 266,1,442,0,266,0,453,0,454,0,393,0,455,0,456,0
  2528.     DATA 457,0,0,7,302,0,458,0,459,0,460,0,461,0,462,0
  2529.     DATA 463,0,464,0,266,2,284,2,266,1,280,0,465,0,466,5
  2530.     DATA 467,0,468,0,469,0,470,0,471,0,472,0,473,0,419,0
  2531.     DATA 474,2,475,0,476,0,477,0,266,1,284,2,266,6,478,0
  2532.     DATA 479,0,393,0,480,0,481,0,482,0,4,0,0,6,302,0
  2533.     DATA 305,0,483,0,484,0,485,0,486,0,280,0,266,0,284,0
  2534.     DATA 318,0,297,0,487,0,488,0,489,0,299,0,266,0,284,0
  2535.     DATA 490,0,491,0,492,0,493,0,494,0,495,0,496,0,497,0
  2536.     DATA 498,0,499,0,500,0,501,1,502,0,503,0,504,0,505,0
  2537.     DATA 501,0,506,0,507,0,266,0,284,0,299,0,508,0,488,0
  2538.     DATA 487,0,450,0,509,0,254,0,266,3,510,0,511,0,393,0
  2539.     DATA 512,0,513,0,514,0,4,0,0,6,515,0,516,0,517,0
  2540.     DATA 335,0,518,0,266,1,254,0,297,0,303,5,381,0,266,0
  2541.     DATA 509,0,519,0,520,0,521,0,522,0,500,0,501,0,523,0
  2542.     DATA 524,0,525,0,526,0,527,0,528,0,529,0,530,0,531,0
  2543.     DATA 532,0,533,0,534,0,266,0,280,0,296,0,292,0,303,3
  2544.     DATA 292,0,489,0,254,0,266,2,535,0,536,0,537,0,538,0
  2545.     DATA 539,0,540,0,541,0,0,6,542,0,543,0,335,0,544,0
  2546.     DATA 284,0,266,0,284,0,489,0,341,0,458,0,545,0,546,0
  2547.     DATA 547,0,548,0,549,0,290,0,550,0,551,0,552,0,553,0
  2548.     DATA 554,0,555,2,556,0,557,0,558,0,559,0,560,0,561,0
  2549.     DATA 562,0,563,0,564,0,565,0,566,0,567,0,284,0,568,0
  2550.     DATA 569,0,549,0,570,0,571,0,572,0,573,0,574,0,303,0
  2551.     DATA 575,0,280,0,266,1,576,0,577,0,578,0,579,0,580,0
  2552.     DATA 581,0,582,0,0,6,583,0,584,0,320,0,543,0,266,1
  2553.     DATA 585,0,458,0,292,0,586,0,587,0,588,0,589,0,86,0
  2554.     DATA 590,0,591,0,303,0,592,0,593,0,594,0,327,4,595,0
  2555.     DATA 596,0,597,0,303,1,330,0,598,0,599,0,600,0,601,0
  2556.     DATA 602,0,296,0,315,0,332,0,603,0,604,0,605,0,588,0
  2557.     DATA 606,0,607,0,458,0,341,0,608,0,266,1,284,0,609,0
  2558.     DATA 610,0,611,0,612,0,613,0,614,0,0,6,615,0,616,0
  2559.     DATA 617,0,268,0,451,0,618,0,619,0,620,0,621,0,622,0
  2560.     DATA 605,0,623,0,51,0,98,0,624,0,625,0,626,0,458,0
  2561.     DATA 627,0,628,0,629,0,630,0,631,0,632,1,631,0,633,0
  2562.     DATA 634,0,635,0,636,0,637,0,638,0,631,0,639,0,640,0
  2563.     DATA 641,0,292,0,642,0,643,0,644,0,55,0,645,0,646,0
  2564.     DATA 623,0,622,0,647,0,341,0,293,0,464,0,451,1,535,0
  2565.     DATA 648,0,649,0,650,0,651,0,652,0,0,4,653,0,654,0
  2566.     DATA 655,0,656,0,657,0,658,0,659,0,660,0,661,0,662,0
  2567.     DATA 663,0,623,1,646,0,41,0,100,0,102,0,664,0,665,0
  2568.     DATA 437,0,487,0,666,0,667,0,668,0,669,0,670,0,500,2
  2569.     DATA 671,0,672,0,673,0,501,0,500,0,527,0,674,0,675,0
  2570.     DATA 550,0,292,0,676,0,677,0,121,0,159,0,70,0,646,0
  2571.     DATA 623,1,663,0,678,0,679,0,680,0,681,0,682,2,683,0
  2572.     DATA 684,0,685,0,686,0,687,0,688,0,689,0,0,0,690,0
  2573.     DATA 691,0,692,0,393,0,693,0,393,0,694,0,695,0,696,0
  2574.     DATA 62,0,697,0,698,0,27,0,699,0,623,0,86,0,87,0
  2575.     DATA 700,1,701,0,702,0,703,0,704,0,705,0,706,0,707,0
  2576.     DATA 708,0,709,1,527,0,710,0,711,0,712,0,713,0,527,0
  2577.     DATA 522,0,714,0,715,0,716,0,717,0,718,0,719,0,139,0
  2578.     DATA 720,0,25,0,721,0,722,1,723,0,724,0,725,0,726,0
  2579.     DATA 727,0,728,0,729,2,730,0,393,0,731,0,393,1,732,0
  2580.     DATA 7,0,733,0,393,2,734,0,735,0,455,0,736,0,737,0
  2581.     DATA 738,0,739,0,54,0,55,0,56,0,740,0,58,0,741,0
  2582.     DATA 122,0,87,0,742,0,743,0,574,0,744,0,745,0,746,0
  2583.     DATA 747,0,748,0,749,0,750,0,751,0,752,0,746,0,753,0
  2584.     DATA 754,0,755,0,756,0,757,0,758,0,759,0,760,0,761,0
  2585.     DATA 762,0,763,0,180,0,55,0,54,0,58,2,764,0,765,0
  2586.     DATA 766,0,767,0,768,0,136,1,578,0,769,0,770,0,771,0
  2587.     DATA 393,2,772,0,773,0,771,0,774,0,123,0,136,1,775,0
  2588.     DATA 776,0,777,0,778,0,779,0,55,1,54,1,780,0,102,0
  2589.     DATA 97,0,56,0,623,0,781,0,782,0,783,0,592,0,784,0
  2590.     DATA 785,0,354,0,327,0,786,0,787,0,574,0,325,0,620,0
  2591.     DATA 788,0,789,0,790,0,791,0,792,0,793,0,794,0,646,0
  2592.     DATA 84,0,795,0,180,0,120,0,54,3,796,0,797,0,798,0
  2593.     DATA 799,0,800,0,136,4,116,0,771,0,774,0,801,0,802,0
  2594.     DATA 803,0,578,1,136,2,804,0,805,0,806,0,807,0,808,0
  2595.     DATA 809,0,810,0,811,0,54,0,812,0,121,0,813,0,814,0
  2596.     DATA 623,0,794,0,815,0,816,0,817,0,818,0,819,0,820,0
  2597.     DATA 819,0,821,0,822,0,823,0,824,0,825,0,826,0,827,0
  2598.     DATA 828,0,829,0,830,0,831,0,832,0,623,0,51,0,833,0
  2599.     DATA 102,0,834,0,835,0,836,0,837,2,838,0,839,0,840,0
  2600.     DATA 841,0,136,5,578,1,136,0,116,0,842,0,843,0,136,3
  2601.     DATA 844,0,845,0,846,0,0,3,847,0,848,0,741,0,813,0
  2602.     DATA 849,0,623,1,605,0,850,0,851,0,852,0,853,0,854,0
  2603.     DATA 855,0,856,0,857,0,858,0,859,0,670,2,532,0,860,0
  2604.     DATA 861,0,862,0,863,0,663,0,623,0,864,0,834,0,865,0
  2605.     DATA 72,0,866,0,22,0,867,2,868,0,869,0,870,0,841,0
  2606.     DATA 136,7,116,0,871,0,872,0,873,0,116,3,874,0,875,0
  2607.     DATA 876,0,0,2,4,0,877,0,878,0,741,0,879,0,159,0
  2608.     DATA 623,1,605,0,880,0,304,0,881,0,882,0,883,0,884,0
  2609.     DATA 885,0,886,0,887,0,888,0,889,0,890,0,891,0,892,0
  2610.     DATA 893,0,894,0,895,0,896,0,623,1,721,0,100,0,897,0
  2611.     DATA 898,0,899,0,900,0,0,3,901,0,902,0,903,0,904,0
  2612.     DATA 116,5,843,0,905,0,906,0,907,0,908,0,82,0,908,2
  2613.     DATA 909,0,910,0,911,0,0,2,912,0,913,0,720,0,179,0
  2614.     DATA 914,0,98,0,57,0,623,0,605,0,915,0,458,0,916,0
  2615.     DATA 917,0,371,2,918,0,919,0,920,0,371,0,921,0,922,0
  2616.     DATA 923,0,924,0,477,0,895,0,925,0,623,0,742,0,27,0
  2617.     DATA 54,0,926,0,927,0,101,0,928,0,11,0,0,2,929,0
  2618.     DATA 930,0,931,0,932,0,908,5,82,0,933,0,934,0,689,0
  2619.     DATA 935,0,908,0,936,2,937,0,938,0,939,0,0,2,940,0
  2620.     DATA 100,0,941,0,122,0,942,0,246,0,55,0,99,0,589,0
  2621.     DATA 943,0,666,0,944,0,945,0,946,2,947,0,948,0,949,0
  2622.     DATA 946,0,950,0,951,0,952,0,953,0,954,0,955,0,956,0
  2623.     DATA 623,0,85,0,98,0,36,0,957,0,958,0,941,0,159,0
  2624.     DATA 959,0,0,2,960,0,961,0,962,0,963,0,936,5,964,0
  2625.     DATA 965,0,966,0,0,0,967,0,124,0,968,2,969,0,970,0
  2626.     DATA 0,0,4,0,0,1,971,0,120,0,898,0,88,0,972,0
  2627.     DATA 973,0,974,0,55,0,57,0,975,0,976,0,977,0,978,2
  2628.     DATA 979,0,980,0,981,3,982,0,983,0,984,0,985,0,986,0
  2629.     DATA 987,0,52,0,53,0,988,0,989,0,990,0,88,0,180,0
  2630.     DATA 59,0,991,0,0,3,992,0,993,0,968,5,994,0,995,0
  2631.     DATA 996,0,0,11,7,0,997,0,87,0,927,0,998,0,6,0
  2632.     DATA 0,0,999,0,54,1,84,0,1000,0,55,0,54,1,98,0
  2633.     DATA 1001,0,70,0,52,0,722,0,740,0,52,0,53,0,54,1
  2634.     DATA 899,0,1000,0,70,0,86,0,1002,0,1003,0,0,0,4,0
  2635.     DATA 1004,0,763,0,1000,0,54,0,167,0,0,25,1005,0,1006,0
  2636.     DATA 941,0,879,0,1007,0,0,2,990,0,1008,0,849,0,139,0
  2637.     DATA 55,0,54,1,98,0,1009,0,26,0,646,0,15,0,814,0
  2638.     DATA 646,0,53,0,54,1,120,0,763,0,834,0,54,0,972,0
  2639.     DATA 4,0,0,1,1010,0,879,0,741,0,55,0,1011,0,0,25
  2640.     DATA 1012,0,159,0,102,0,1013,0,1014,0,0,3,1015,0,700,0
  2641.     DATA 179,0,55,0,54,1,98,0,1009,0,26,0,646,0,15,0
  2642.     DATA 814,0,646,0,53,0,54,1,780,0,180,0,139,0,1016,0
  2643.     DATA 7,0,0,2,1011,0,1017,0,121,0,780,0,1018,0,0,25
  2644.     DATA 1019,0,55,0,813,0,1020,0,912,0,0,1,1021,0,1022,0
  2645.     DATA 813,0,898,0,1023,0,54,2,98,0,1009,0,26,0,646,0
  2646.     DATA 15,0,814,0,646,0,53,0,54,1,1024,0,1025,0,741,0
  2647.     DATA 927,0,1026,0,1027,0,0,1,1028,0,1029,0,813,0,159,0
  2648.     DATA 1030,0,0,24,4,0,1031,0,51,0,941,0,957,0,867,0
  2649.     DATA 0,0,996,0,1032,0,180,0,741,0,159,0,1033,0,58,0
  2650.     DATA 54,1,98,0,1009,0,26,0,646,0,15,0,814,0,646,0
  2651.     DATA 53,0,54,1,1034,0,1035,0,159,0,179,0,121,0,1036,0
  2652.     DATA 996,0,0,0,867,0,1037,0,849,0,645,0,689,0,6,0
  2653.     DATA 0,23,1038,0,14,0,57,0,61,0,1039,0,0,0,1040,0
  2654.     DATA 942,0,119,0,849,0,98,0,54,0,811,0,58,0,54,1
  2655.     DATA 98,0,1009,0,26,0,646,0,15,0,814,0,646,0,53,0
  2656.     DATA 54,1,1034,0,1041,0,54,0,98,0,941,0,927,0,1042,0
  2657.     DATA 1043,0,0,0,1044,0,1045,0,740,0,1046,0,1021,0,0,23
  2658.     DATA 996,0,722,0,99,0,1047,0,7,0,1040,0,1048,0,179,0
  2659.     DATA 720,0,54,6,98,0,1049,0,26,0,742,0,1050,0,645,0
  2660.     DATA 742,0,53,0,54,1,1051,0,1052,0,54,1,55,0,720,0
  2661.     DATA 179,0,1053,0,1054,0,0,0,1055,0,26,0,623,0,996,0
  2662.     DATA 4,0,0,21,17,0,653,0,140,0,1056,0,959,0,1057,0
  2663.     DATA 1058,0,179,0,1059,0,1060,0,848,0,54,19,1061,0,1062,0
  2664.     DATA 1059,0,180,0,1063,0,1064,0,1065,0,55,0,71,0,1031,0
  2665.     DATA 867,0,0,21,1066,0,1067,0,645,0,848,0,1068,0,1058,0
  2666.     DATA 179,0,87,0,1069,0,17,0,1070,0,53,0,54,0,98,0
  2667.     DATA 86,0,25,0,1071,9,25,0,53,1,54,1,1072,0,4,0
  2668.     DATA 1073,0,87,0,180,0,1074,0,1075,0,974,0,85,0,1070,0
  2669.     DATA 1066,0,0,20,4,0,1076,0,646,0,41,0,1077,0,1078,0
  2670.     DATA 179,0,159,0,54,0,1035,0,7,0,22,0,55,0,780,0
  2671.     DATA 121,0,100,0,722,0,742,9,623,0,898,0,102,0,100,0
  2672.     DATA 54,0,90,0,4,0,99,0,54,0,780,0,741,0,139,0
  2673.     DATA 1079,0,25,0,646,0,32,0,0,21,1080,0,52,0,54,0
  2674.     DATA 1000,0,898,0,100,0,54,1,1081,0,1082,0,1083,0,101,0
  2675.     DATA 927,0,898,0,1084,0,35,0,1085,0,1086,7,1085,0,1087,0
  2676.     DATA 1088,0,898,0,139,0,87,0,1089,0,1090,0,1091,0,54,1
  2677.     DATA 159,0,898,0,72,0,86,0,52,0,1092,0,0,20,17,0
  2678.     DATA 1093,0,645,0,54,0,898,0,98,0,54,3,53,0,119,0
  2679.     DATA 179,0,101,0,37,0,912,0,0,11,1094,0,37,0,812,0
  2680.     DATA 180,0,121,0,98,0,54,3,98,0,898,0,53,0,99,0
  2681.     DATA 13,0,30,0,0,18,6,0,1095,0,1050,0,56,0,55,0
  2682.     DATA 1096,0,1097,0,1098,0,54,0,58,0,762,0,927,0,849,0
  2683.     DATA 1099,0,35,0,4,0,0,13,7,0,1100,0,1037,0,72,0
  2684.     DATA 119,0,762,0,58,0,54,0,1096,0,112,0,1101,0,1006,0
  2685.     DATA 56,0,1102,0,973,0,1,0,0,16,1103,0,1104,0,1000,0
  2686.     DATA 41,0,1071,0,54,0,1034,0,1105,0,1073,0,58,0,741,0
  2687.     DATA 119,0,899,0,1106,0,7,0,0,17,4,0,1107,0,87,0
  2688.     DATA 121,0,179,0,54,0,57,0,1108,0,1109,0,55,0,56,0
  2689.     DATA 25,0,1000,0,1110,0,185,0,0,14,17,0,1037,0,865,0
  2690.     DATA 763,0,119,0,55,0,54,0,1061,0,1111,0,59,0,119,0
  2691.     DATA 849,0,974,0,1112,0,0,21,1113,0,1114,0,941,0,119,0
  2692.     DATA 1115,0,794,0,1061,0,58,0,100,0,813,0,865,0,833,0
  2693.     DATA 988,0,7,0,0,13,847,0,1116,0,70,0,722,0,720,0
  2694.     DATA 120,0,54,0,55,0,720,0,121,0,59,0,1117,0,1,0
  2695.     DATA 0,23,1,0,1118,0,120,0,119,0,812,0,55,0,58,0
  2696.     DATA 812,0,87,0,1102,0,159,0,1119,0,1120,0,0,12,4,0
  2697.     DATA 28,0,720,0,1121,0,1108,0,27,0,87,0,100,0,121,0
  2698.     DATA 849,0,246,0,967,0,4,0,0,26,1030,0,1122,0,849,0
  2699.     DATA 102,0,59,0,720,0,699,0,1108,0,864,0,1123,0,1097,0
  2700.     DATA 0,12,4,0,877,0,120,0,1124,0,0,0,814,0,101,0
  2701.     DATA 121,0,1023,0,1125,0,7,0,0,29,7,0,971,0,1126,0
  2702.     DATA 180,0,762,0,1102,0,0,0,1127,0,101,0,1128,0,0,13
  2703.     DATA 1070,0,1123,0,15,0,1009,0,86,0,87,0,1129,0,185,0
  2704.     DATA 0,33,1130,0,37,0,720,0,71,0,0,0,646,0,1131,0
  2705.     DATA 1132,0,0,13,967,0,1133,0,878,0,84,0,720,0,1134,0
  2706.     DATA 0,36,1135,0,1136,0,87,0,740,0,159,0,1137,0,1138,0
  2707.     DATA 0,13,7,0,1139,0,72,0,179,0,1137,0,1054,0,0,36
  2708.     DATA 4,0,28,0,1140,0,179,0,898,0,1141,0,7,0,0,14
  2709.     DATA 1105,0,1142,0,1143,0,108,0,4,0,0,37,1105,0,1144,0
  2710.     DATA 1145,0,1146,0,185,0,0,9
  2711.  
  2712.     'Wheel - License CC0 - GameArt2D.com
  2713.  
  2714.     DATA 429,0,4278453261,4279045404,4279900712
  2715.     DATA 4280624431,4281282361,4281348158,4279834919
  2716.     DATA 4279966518,4281282366,4281150776,4280427054
  2717.     DATA 4279900708,4279045400,4278321677,4278190084
  2718.     DATA 4278782227,4280098089,4281348156,4282795593
  2719.     DATA 4283190348,4283256141,4280427050,4280756026
  2720.     DATA 4282598215,4278387466,4279440166,4283058763
  2721.     DATA 4283124555,4282861383,4282532418,4282335039
  2722.     DATA 4282137660,4281150770,4280427049,4281413942
  2723.     DATA 4282203453,4282598211,4282532423,4278453263
  2724.     DATA 4278255877,4278255882,4278321672,4279703334
  2725.     DATA 4278387468,4278453260,4282598214,4281874488
  2726.     DATA 4281611316,4281545523,4281940281,4282400832
  2727.     DATA 4280624437,4278190083,4279571750,4281874497
  2728.     DATA 4278190088,4279440163,4282071875,4279637541
  2729.     DATA 4278387470,4279505948,4281282354,4280624427
  2730.     DATA 4279308574,4281479740,4281940287,4279176991
  2731.     DATA 4278190081,4278650641,4283058762,4281611320
  2732.     DATA 4281150768,4281677109,4282466625,4280690226
  2733.     DATA 4279308580,4282400838,4281742902,4282664004
  2734.     DATA 4282071873,4278979611,4278190082,4278190086
  2735.     DATA 4282992969,4282071867,4282861385,4279505961
  2736.     DATA 4279308589,4281479730,4282795590,4279045405
  2737.     DATA 4278255883,4280427062,4281216558,4280887593
  2738.     DATA 4280558628,4280361249,4280229663,4280163870
  2739.     DATA 4280295456,4280427042,4280624421,4280953386
  2740.     DATA 4281282351,4280098093,4279045410,4278255874
  2741.     DATA 4279966501,4281150765,4280098077,4279900698
  2742.     DATA 4279505956,4279111196,4279703339,4279966499
  2743.     DATA 4281019179,4279571749,4280361261,4279374372
  2744.     DATA 4281348144,4278650646,4280756007,4279966491
  2745.     DATA 4284111450,4285098345,4285624689,4285558896
  2746.     DATA 4285032552,4283914071,4282269246,4282006081
  2747.     DATA 4278190085,4281150778,4282927176,4281413937
  2748.     DATA 4284243036,4287598479,4289440683,4289967027
  2749.     DATA 4289901234,4289506476,4288651167,4288716960
  2750.     DATA 4289638062,4289309097,4287203721,4283782485
  2751.     DATA 4280492835,4280690214,4285493103,4289374890
  2752.     DATA 4285361517,4279637526,4286282619,4289703855
  2753.     DATA 4289111718,4284769380,4279111198,4278387467
  2754.     DATA 4282335045,4289177511,4288782753,4279703319
  2755.     DATA 4281874495,4280032301,4286348412,4290164406
  2756.     DATA 4290624957,4291085508,4289572269,4290032820
  2757.     DATA 4291019715,4290559164,4290098613,4289769648
  2758.     DATA 4285427310,4287532686,4290230199,4291546059
  2759.     DATA 4291611852,4286743170,4291282887,4291480266
  2760.     DATA 4290953922,4286611584,4281742907,4280163882
  2761.     DATA 4278453264,4278321669,4281545531,4290756543
  2762.     DATA 4291217094,4291348680,4286545791,4281019183
  2763.     DATA 4278321670,4279769121,4291151301,4279242782
  2764.     DATA 4278321674,4279111199,4278519052,4278387471
  2765.     DATA 4278190087,4281019184,4284045657,4292072403
  2766.     DATA 4292532954,4292861919,4292993505,4292796126
  2767.     DATA 4292467161,4292006610,4281084979,4282137667
  2768.     DATA 4278584852,4280295472,4280756019,4292203989
  2769.     DATA 4293125091,4293980400,4294375158,4294440951
  2770.     DATA 4294046193,4293388263,4293322470,4293256677
  2771.     DATA 4292927712,4292138196,4281874496,4281084972
  2772.     DATA 4285953654,4290822336,4291677645,4294572537
  2773.     DATA 4294967295,4294769916,4293585642,4292664540
  2774.     DATA 4284703587,4281084984,4278650640,4282927178
  2775.     DATA 4290295992,4291743438,4294901502,4294835709
  2776.     DATA 4293783021,4293059298,4289045925,4282598216
  2777.     DATA 4278321678,4279440159,4280032284,4284900966
  2778.     DATA 4293454056,4294704123,4291940817,4288322202
  2779.     DATA 4288256409,4293190884,4292598747,4290888129
  2780.     DATA 4283585106,4278979608,4280163885,4288190616
  2781.     DATA 4292269782,4294309365,4288387995,4288980132
  2782.     DATA 4289243304,4288914339,4289835441,4287006342
  2783.     DATA 4279769124,4281150774,4288848546,4280295470
  2784.     DATA 4283387727,4291414473,4281150773,4282203459
  2785.     DATA 4282006074,4294111986,4293848814,4288519581
  2786.     DATA 4283716692,4281150782,4280427065,4280690235
  2787.     DATA 4281479733,4286085240,4288059030,4287269514
  2788.     DATA 4280361263,4286677377,4279045389,4292335575
  2789.     DATA 4280229672,4278848010,4290493371,4279834905
  2790.     DATA 4281413938,4286151033,4285690482,4284835173
  2791.     DATA 4281216563,4279966504,4282269252,4292730333
  2792.     DATA 4288585374,4283848278,4281413951,4283519313
  2793.     DATA 4281282357,4281019193,4292401368,4288453788
  2794.     DATA 4294177779,4279834916,4279571744,4285229931
  2795.     DATA 4291809231,4293914607,4278716437,4290361785
  2796.     DATA 4282006082,4286414205,4290690750,4280492848
  2797.     DATA 4282729797,4281084986,4279176986,4284637794
  2798.     DATA 4280756013,4278255878,4279769123,4287137928
  2799.     DATA 4286019447,4279374365,4278519054,4281348146
  2800.     DATA 4280953398,4278519051,4279900713,4281808698
  2801.     DATA 4287335307,4280821800,4281940290,4280163884
  2802.     DATA 4287072135,4281808695,4286216826,4279769126
  2803.     DATA 4278387472,4284572001,4279571733,4281874498
  2804.     DATA 4278255880,4279769130,4278979596,4279242768
  2805.     DATA 4285756275,4279374366,4281545533,4287993237
  2806.     DATA 4280887606,4278848022,4282729800,4283321934
  2807.     DATA 4284966759,4286479998,4285822068,4278519057
  2808.     DATA 4279571752,4279176992,4280361265,4280098094
  2809.     DATA 4280098091,4279769125,4279834922,4279374374
  2810.     DATA 4278321675,4279177004,4279637547,4279505958
  2811.     DATA 4278979618,4279966506,4279505960,4282664007
  2812.     DATA 4279242784,4278782229,4281282353,4281874491
  2813.     DATA 4278650642,4279834918,4281216566,4279769120
  2814.     DATA 4281084977,4279703325,4280229681,4282203460
  2815.     DATA 4279505954,4280229678,4282466630,4279242783
  2816.     DATA 4278255881,4281348152,4281808704,4278650639
  2817.     DATA 4278255876,4278716436,4281413939,4280953388
  2818.     DATA 4280427056,4281940289,4281677118,4280163887
  2819.     DATA 4278913819,4279440160,4281084981,4280163881
  2820.     DATA 4280361271,4281216574,4280953396,4280098092
  2821.     DATA 4278519056,0,24,1,0,2,0
  2822.     DATA 3,0,4,0,5,0,6,0,7,0,0,1,8,0,9,0
  2823.     DATA 10,0,11,0,12,0,13,0,14,0,0,43,15,0,16,0
  2824.     DATA 17,0,18,0,19,0,20,0,21,3,22,0,0,1,23,0
  2825.     DATA 21,3,20,0,24,0,5,0,7,0,25,0,0,40,26,0
  2826.     DATA 27,0,21,1,20,0,28,0,29,0,30,0,31,0,32,0
  2827.     DATA 33,0,34,1,35,0,36,0,31,0,37,0,29,0,28,0
  2828.     DATA 20,0,21,0,38,0,39,0,0,0,40,0,41,0,0,33
  2829.     DATA 42,0,43,0,44,0,0,0,45,0,46,0,29,0,31,0
  2830.     DATA 47,0,48,0,49,11,48,0,50,0,51,0,52,0,53,0
  2831.     DATA 0,0,54,0,55,0,54,0,56,0,0,29,15,0,57,0
  2832.     DATA 58,0,21,0,59,0,60,0,61,0,62,0,49,19,63,0
  2833.     DATA 64,0,65,0,21,1,66,0,67,0,68,0,0,26,69,0
  2834.     DATA 10,0,27,0,20,0,70,0,71,0,72,0,49,23,73,0
  2835.     DATA 74,0,28,0,21,0,27,0,75,0,45,0,0,23,68,0
  2836.     DATA 76,0,77,0,21,0,20,0,30,0,73,0,49,27,78,0
  2837.     DATA 79,0,20,0,21,0,80,0,81,0,82,0,0,20,83,0
  2838.     DATA 17,0,27,0,20,0,84,0,50,0,49,31,85,0,70,0
  2839.     DATA 21,0,86,0,87,0,68,0,0,19,88,0,21,0,20,0
  2840.     DATA 79,0,48,0,49,13,89,4,49,14,73,0,90,0,21,0
  2841.     DATA 27,0,91,0,0,19,92,0,93,0,31,0,49,11,89,0
  2842.     DATA 94,0,95,0,96,0,97,0,98,0,99,1,100,0,101,0
  2843.     DATA 102,0,103,0,104,0,89,0,49,11,30,0,105,0,53,0
  2844.     DATA 0,16,56,0,106,0,53,0,107,0,108,0,49,9,89,0
  2845.     DATA 109,0,96,0,110,0,111,11,99,0,102,0,94,0,89,0
  2846.     DATA 49,9,112,0,53,0,82,0,113,0,68,0,0,12,68,0
  2847.     DATA 105,0,27,0,114,0,115,0,49,8,89,0,116,0,98,0
  2848.     DATA 111,17,97,0,109,0,49,9,117,0,118,0,20,0,87,0
  2849.     DATA 82,0,0,11,119,0,27,0,20,0,31,0,49,7,89,0
  2850.     DATA 94,0,100,0,111,21,97,0,120,0,49,8,30,0,21,0
  2851.     DATA 86,0,81,0,0,10,121,0,38,0,20,0,37,0,49,7
  2852.     DATA 89,0,122,0,123,0,111,6,122,0,74,0,124,0,125,0
  2853.     DATA 126,0,127,0,128,0,129,0,130,0,102,0,111,6,123,0
  2854.     DATA 95,0,89,0,49,7,90,0,21,0,131,0,45,0,0,8
  2855.     DATA 132,0,133,0,21,0,134,0,48,0,49,6,135,0,101,0
  2856.     DATA 111,5,122,0,136,0,137,0,138,0,139,0,140,0,141,0
  2857.     DATA 142,0,143,0,144,0,139,1,145,0,146,0,147,0,148,0
  2858.     DATA 111,5,96,0,89,0,49,6,73,0,70,0,21,0,75,0
  2859.     DATA 68,0,0,7,54,0,20,1,47,0,49,6,135,0,98,0
  2860.     DATA 111,4,149,0,150,0,151,0,139,3,141,0,152,0,153,0
  2861.     DATA 123,0,154,0,155,0,139,3,156,0,157,0,97,0,111,4
  2862.     DATA 101,0,89,0,49,6,85,0,20,0,27,0,158,0,0,6
  2863.     DATA 159,0,160,0,20,0,74,0,49,6,135,0,98,0,111,3
  2864.     DATA 123,0,147,0,161,0,139,5,162,0,163,0,0,1,95,0
  2865.     DATA 156,0,139,5,162,0,84,0,111,4,101,0,89,0,49,6
  2866.     DATA 79,0,21,0,164,0,56,0,0,4,68,0,165,0,21,0
  2867.     DATA 70,0,48,0,49,5,89,0,101,0,111,3,97,0,166,0
  2868.     DATA 140,0,139,3,167,0,168,0,169,0,170,0,100,0,0,1
  2869.     DATA 89,0,171,0,172,0,173,0,174,0,139,3,175,0,176,0
  2870.     DATA 110,0,111,3,96,0,89,0,49,5,78,0,28,0,21,0
  2871.     DATA 26,0,0,4,60,0,77,0,20,0,130,0,49,5,89,0
  2872.     DATA 122,0,111,3,102,0,177,0,139,3,178,0,172,0,179,0
  2873.     DATA 180,1,169,0,181,0,104,0,73,0,177,0,182,0,180,1
  2874.     DATA 183,0,184,0,167,0,139,3,185,0,98,0,111,3,103,0
  2875.     DATA 49,6,186,0,187,0,188,0,0,4,189,0,59,0,190,0
  2876.     DATA 48,0,49,5,109,0,111,3,97,0,177,0,139,3,191,0
  2877.     DATA 179,0,180,4,192,0,174,0,178,0,193,0,180,4,183,0
  2878.     DATA 168,0,139,3,194,0,110,0,111,2,123,0,120,0,49,5
  2879.     DATA 195,0,196,0,0,7,197,0,49,5,89,0,98,0,111,2
  2880.     DATA 123,0,194,0,139,2,174,0,198,0,180,17,172,0,171,0
  2881.     DATA 139,2,152,0,111,3,101,0,49,6,199,0,200,0,201,0
  2882.     DATA 82,0,0,1,202,0,203,0,204,0,205,0,49,5,103,0
  2883.     DATA 111,3,206,0,140,0,139,1,174,0,182,0,180,5,207,0
  2884.     DATA 208,0,209,0,210,1,211,0,212,0,213,0,180,5,198,0
  2885.     DATA 171,0,139,1,175,0,29,0,111,3,109,0,49,5,214,0
  2886.     DATA 215,0,86,0,216,0,0,1,217,0,38,0,218,0,49,5
  2887.     DATA 89,0,99,0,111,2,103,0,151,0,139,2,192,0,180,4
  2888.     DATA 219,0,220,0,221,0,222,0,223,0,224,0,225,0,226,1
  2889.     DATA 227,0,228,0,229,0,180,4,172,0,139,2,143,0,100,0
  2890.     DATA 111,2,97,0,89,0,49,5,84,0,21,0,12,0,0,0
  2891.     DATA 15,0,230,0,21,0,36,0,49,5,231,0,111,3,232,0
  2892.     DATA 139,2,233,0,180,3,234,0,211,0,225,0,235,0,236,3
  2893.     DATA 237,0,238,0,226,2,227,0,239,0,180,4,168,0,139,2
  2894.     DATA 240,0,111,3,104,0,49,5,74,0,21,0,241,0,0,0
  2895.     DATA 242,0,243,0,20,0,78,0,49,4,89,0,101,0,111,2
  2896.     DATA 109,0,170,0,139,1,244,0,179,0,180,2,245,0,210,0
  2897.     DATA 226,0,222,0,236,0,246,0,247,0,248,0,249,1,238,0
  2898.     DATA 227,0,226,3,209,0,180,3,183,0,174,0,139,1,250,0
  2899.     DATA 101,0,111,2,149,0,49,5,50,0,20,0,251,0,252,0
  2900.     DATA 253,0,21,0,70,0,49,5,135,0,254,0,111,2,255,0
  2901.     DATA 139,2,169,0,180,3,211,0,226,0,256,0,247,0,257,0
  2902.     DATA 258,0,156,0,259,0,260,1,259,0,156,0,193,0,261,0
  2903.     DATA 226,2,262,0,180,3,263,0,139,2,264,0,111,2,99,0
  2904.     DATA 89,0,49,4,48,0,28,0,27,0,265,0,266,0,21,0
  2905.     DATA 79,0,49,5,231,0,111,2,254,0,267,0,139,1,178,0
  2906.     DATA 179,0,180,2,268,0,226,1,238,0,269,0,175,0,260,0
  2907.     DATA 270,0,271,0,272,1,273,0,270,0,260,0,274,0,210,0
  2908.     DATA 226,1,227,0,207,0,180,2,183,0,174,0,139,1,275,0
  2909.     DATA 111,3,104,0,49,5,134,0,21,0,276,0,277,0,21,0
  2910.     DATA 51,0,49,5,122,0,111,2,104,0,175,0,139,1,191,0
  2911.     DATA 180,2,234,0,220,0,226,1,261,0,155,0,260,0,271,0
  2912.     DATA 274,0,139,3,175,0,278,0,260,0,274,0,261,0,226,1
  2913.     DATA 228,0,180,3,173,0,139,1,272,0,148,0,111,2,103,0
  2914.     DATA 49,5,37,0,21,0,279,0,6,0,21,0,32,0,49,4
  2915.     DATA 89,0,101,0,111,2,280,0,139,2,192,0,180,2,219,0
  2916.     DATA 226,1,227,0,191,0,260,0,250,0,139,6,140,0,278,0
  2917.     DATA 260,0,281,0,226,1,227,0,258,0,180,2,172,0,139,1
  2918.     DATA 140,0,85,0,111,2,149,0,49,5,51,0,21,0,282,0
  2919.     DATA 283,0,21,0,284,0,49,4,89,0,98,0,111,2,128,0
  2920.     DATA 140,0,170,0,156,0,174,0,193,0,180,1,239,0,256,0
  2921.     DATA 285,0,286,0,143,0,287,0,140,0,139,7,175,0,259,0
  2922.     DATA 161,0,227,0,226,1,212,0,180,1,192,0,140,0,156,0
  2923.     DATA 155,0,139,0,288,0,111,2,101,0,49,5,36,0,21,0
  2924.     DATA 289,0,290,0,291,0,292,0,49,4,89,0,110,0,111,2
  2925.     DATA 293,0,138,0,176,0,101,0,73,0,294,0,281,0,180,0
  2926.     DATA 249,0,235,0,236,0,226,0,260,0,156,0,139,9,278,0
  2927.     DATA 259,0,262,0,226,1,211,0,180,0,182,0,295,0,94,0
  2928.     DATA 149,0,154,0,144,0,157,0,111,2,100,0,49,5,292,0
  2929.     DATA 49,0,296,0,0,1,231,0,49,4,89,0,254,0,111,2
  2930.     DATA 297,0,259,0,298,0,0,1,79,0,173,0,180,0,256,0
  2931.     DATA 246,0,236,0,299,0,260,0,138,0,139,9,161,0,260,0
  2932.     DATA 213,0,226,1,228,0,180,0,174,0,120,0,0,1,110,0
  2933.     DATA 162,0,152,0,111,2,98,0,49,5,300,0,0,3,231,0
  2934.     DATA 49,4,89,0,254,0,111,2,297,0,260,0,301,0,0,1
  2935.     DATA 51,0,302,0,180,0,226,0,247,0,236,0,299,0,260,0
  2936.     DATA 138,0,139,9,161,0,260,0,258,0,226,1,228,0,180,0
  2937.     DATA 171,0,231,0,0,1,303,0,143,0,152,0,111,2,98,0
  2938.     DATA 49,5,300,0,0,1,22,0,63,0,304,0,49,4,89,0
  2939.     DATA 110,0,111,2,305,0,151,0,157,0,163,0,95,0,137,0
  2940.     DATA 281,0,180,0,210,0,286,0,257,0,249,0,260,0,156,0
  2941.     DATA 139,8,140,0,273,0,259,0,208,0,226,1,211,0,180,0
  2942.     DATA 198,0,181,0,97,0,111,0,306,0,170,0,307,0,111,2
  2943.     DATA 100,0,49,5,308,0,63,0,309,0,310,0,21,0,284,0
  2944.     DATA 49,4,89,0,98,0,111,2,125,0,140,0,141,0,278,0
  2945.     DATA 274,0,192,0,180,1,311,0,226,1,249,0,312,0,287,0
  2946.     DATA 140,0,139,7,274,0,270,0,250,0,227,0,226,1,212,0
  2947.     DATA 180,1,169,0,170,0,273,0,170,0,140,0,313,0,111,2
  2948.     DATA 101,0,49,5,36,0,21,0,289,0,314,0,21,0,32,0
  2949.     DATA 49,5,101,0,111,2,315,0,139,2,182,0,180,2,219,0
  2950.     DATA 226,2,173,0,260,0,161,0,139,6,140,0,273,0,260,0
  2951.     DATA 192,0,226,1,227,0,213,0,180,2,172,0,139,1,140,0
  2952.     DATA 36,0,111,2,102,0,49,5,51,0,21,0,316,0,317,0
  2953.     DATA 21,0,51,0,49,5,149,0,111,2,135,0,274,0,139,1
  2954.     DATA 233,0,180,2,234,0,220,0,226,1,210,0,156,0,260,0
  2955.     DATA 161,0,140,0,139,2,140,0,274,0,271,0,260,0,170,0
  2956.     DATA 261,0,226,1,210,0,180,3,173,0,139,1,145,0,102,0
  2957.     DATA 111,2,103,0,49,5,37,0,21,0,11,0,279,0,21,0
  2958.     DATA 79,0,49,5,231,0,111,2,110,0,270,0,139,1,178,0
  2959.     DATA 179,0,180,2,318,0,226,2,262,0,156,0,260,0,287,0
  2960.     DATA 156,0,151,1,250,0,319,0,260,0,140,0,320,0,256,0
  2961.     DATA 226,0,227,0,219,0,180,2,183,0,174,0,139,1,295,0
  2962.     DATA 111,3,104,0,49,5,29,0,21,0,321,0,322,0,21,0
  2963.     DATA 84,0,49,5,135,0,123,0,111,2,323,0,139,2,198,0
  2964.     DATA 180,3,228,0,226,2,210,0,168,0,142,0,260,3,271,0
  2965.     DATA 324,0,257,0,236,0,325,0,227,0,311,0,180,2,179,0
  2966.     DATA 184,0,139,1,140,0,129,0,111,2,110,0,89,0,49,4
  2967.     DATA 48,0,28,0,20,0,13,0,326,0,27,0,20,0,78,0
  2968.     DATA 49,5,101,0,111,2,135,0,155,0,139,1,327,0,179,0
  2969.     DATA 180,2,245,0,249,0,226,3,249,0,207,0,281,0,183,0
  2970.     DATA 268,0,235,0,236,1,246,0,286,0,228,0,234,0,180,2
  2971.     DATA 179,0,167,0,139,1,272,0,102,0,111,2,102,0,49,5
  2972.     DATA 50,0,20,0,24,0,14,0,56,0,328,0,21,0,36,0
  2973.     DATA 49,5,116,0,111,3,329,0,139,2,184,0,180,3,245,0
  2974.     DATA 228,0,226,7,325,0,247,0,246,0,269,0,211,0,234,0
  2975.     DATA 180,2,179,0,330,0,139,1,140,0,125,0,111,3,94,0
  2976.     DATA 49,5,51,0,21,0,5,0,0,1,331,0,21,0,332,0
  2977.     DATA 49,5,89,0,110,0,111,2,104,0,170,0,139,1,171,0
  2978.     DATA 182,0,180,4,318,0,220,0,226,6,225,0,261,0,268,0
  2979.     DATA 180,4,198,0,139,2,271,0,148,0,111,2,100,0,89,0
  2980.     DATA 49,4,89,0,333,0,243,0,309,0,0,1,334,0,20,0
  2981.     DATA 310,0,62,0,49,5,95,0,111,3,335,0,140,0,139,1
  2982.     DATA 167,0,193,0,180,4,234,0,219,0,239,0,210,0,220,1
  2983.     DATA 210,0,262,0,229,0,234,0,180,4,192,0,171,0,139,1
  2984.     DATA 274,0,280,0,111,3,231,0,49,5,336,0,204,0,16,0
  2985.     DATA 60,0,0,1,337,0,119,0,60,0,338,0,49,5,89,0
  2986.     DATA 99,0,111,2,110,0,339,0,139,2,167,0,182,0,180,16
  2987.     DATA 179,0,198,0,174,0,139,1,140,0,340,0,111,3,97,0
  2988.     DATA 89,0,49,5,341,0,0,7,342,0,343,0,49,5,231,0
  2989.     DATA 111,3,102,0,294,0,139,2,171,0,184,0,179,0,180,4
  2990.     DATA 193,0,327,0,302,0,281,0,180,4,179,0,191,0,139,2
  2991.     DATA 140,0,146,0,98,0,111,2,123,0,104,0,49,5,73,0
  2992.     DATA 344,0,158,0,15,0,0,4,345,0,346,0,347,0,49,5
  2993.     DATA 89,0,102,0,111,3,103,0,294,0,139,3,244,0,198,0
  2994.     DATA 179,0,180,1,198,0,348,0,32,0,30,0,294,0,193,0
  2995.     DATA 180,1,179,0,172,0,178,0,139,2,140,0,295,0,148,0
  2996.     DATA 111,3,349,0,49,6,51,0,21,0,350,0,41,0,0,4
  2997.     DATA 351,0,21,0,84,0,48,0,49,5,89,0,100,0,111,3
  2998.     DATA 102,0,352,0,140,0,139,3,178,0,191,0,192,0,155,0
  2999.     DATA 96,0,0,1,353,0,167,0,198,0,330,0,167,0,139,3
  3000.     DATA 274,0,354,0,100,0,111,3,148,0,89,0,49,5,73,0
  3001.     DATA 28,0,20,0,355,0,0,5,356,0,24,0,21,0,31,0
  3002.     DATA 49,6,120,0,99,0,111,3,110,0,357,0,141,0,139,5
  3003.     DATA 143,0,358,0,0,1,149,0,156,0,139,4,140,0,272,0
  3004.     DATA 288,0,123,0,111,3,100,0,135,0,49,6,37,0,21,0
  3005.     DATA 359,0,360,0,0,6,361,0,20,0,28,0,353,0,49,6
  3006.     DATA 120,0,99,0,111,4,94,0,154,0,155,0,139,3,138,0
  3007.     DATA 240,0,362,0,363,0,364,0,144,0,139,2,140,0,141,0
  3008.     DATA 126,0,122,0,111,4,100,0,135,0,49,6,284,0,20,0
  3009.     DATA 27,0,365,0,0,7,40,0,366,0,21,0,29,0,49,7
  3010.     DATA 120,0,100,0,111,5,104,0,125,0,259,0,175,0,139,0
  3011.     DATA 140,0,151,0,259,0,319,0,141,0,140,0,139,0,144,0
  3012.     DATA 367,0,335,0,103,0,111,5,101,0,135,0,49,6,73,0
  3013.     DATA 84,0,21,0,368,0,132,0,0,8,369,0,370,0,21,0
  3014.     DATA 30,0,49,7,89,0,102,0,111,6,254,0,120,0,371,0
  3015.     DATA 372,0,232,0,373,0,329,0,374,0,157,0,28,0,231,0
  3016.     DATA 123,0,111,5,123,0,122,0,89,0,49,7,332,0,21,0
  3017.     DATA 215,0,375,0,0,10,376,0,20,1,36,0,49,7,89,0
  3018.     DATA 109,0,99,0,111,21,98,0,94,0,49,8,51,0,21,0
  3019.     DATA 27,0,377,0,0,11,68,0,378,0,20,0,379,0,380,0
  3020.     DATA 49,8,89,0,95,0,99,0,111,17,98,0,116,0,89,0
  3021.     DATA 49,8,381,0,93,0,20,0,382,0,82,0,0,12,360,0
  3022.     DATA 383,0,53,0,384,0,380,0,49,9,89,0,116,0,101,0
  3023.     DATA 123,0,111,11,254,0,148,0,109,0,89,0,49,9,338,0
  3024.     DATA 82,0,92,0,385,0,68,0,0,16,82,0,296,0,36,0
  3025.     DATA 49,11,135,0,231,0,122,0,101,0,98,0,110,0,254,1
  3026.     DATA 110,0,100,0,148,0,122,0,109,0,135,0,49,11,51,0
  3027.     DATA 386,0,53,0,0,19,387,0,20,1,30,0,49,34,48,0
  3028.     DATA 79,0,21,0,27,0,388,0,0,19,360,0,217,0,20,0
  3029.     DATA 21,0,29,0,353,0,49,31,50,0,84,0,21,0,27,0
  3030.     DATA 389,0,68,0,0,20,68,0,390,0,391,0,21,0,20,0
  3031.     DATA 51,0,48,0,49,27,73,0,30,0,20,0,21,0,160,0
  3032.     DATA 392,0,82,0,0,23,393,0,65,0,20,0,21,0,84,0
  3033.     DATA 36,0,49,24,394,0,395,0,70,0,21,0,27,0,10,0
  3034.     DATA 396,0,0,26,337,0,397,0,38,0,21,1,398,0,399,0
  3035.     DATA 205,0,49,19,400,0,401,0,60,0,402,0,20,0,403,0
  3036.     DATA 404,0,15,0,0,29,356,0,405,0,406,0,407,0,0,0
  3037.     DATA 408,0,409,0,36,0,78,0,49,13,353,0,130,0,90,0
  3038.     DATA 410,0,83,0,0,0,411,0,382,0,42,0,0,32,68,0
  3039.     DATA 60,0,412,0,0,0,413,0,86,0,21,0,20,0,84,0
  3040.     DATA 79,0,51,0,36,0,284,0,414,0,415,1,292,0,284,0
  3041.     DATA 36,0,74,0,332,0,70,0,20,0,21,1,27,0,81,0
  3042.     DATA 0,40,69,0,416,0,417,0,27,0,21,4,22,0,0,1
  3043.     DATA 23,0,21,3,20,0,243,0,418,0,419,0,420,0,53,0
  3044.     DATA 0,42,15,0,242,0,421,0,405,0,422,0,9,0,328,0
  3045.     DATA 423,0,0,1,424,0,350,0,425,0,426,0,427,0,341,0
  3046.     DATA 428,0,15,0,0,22
  3047.  
  3048.     'head - License CC0 - GameArt2D.com
  3049.     DATA 846,0,4278255689,4279631924,4282253346
  3050.     DATA 4285464596,4288806919,4291166209,4291493888
  3051.     DATA 4291428352,4289855492,4286578703,4283760667
  3052.     DATA 4280746027,4278779966,4278190158,4278321223
  3053.     DATA 4280614957,4285792274,4291231745,4291690496
  3054.     DATA 4291624960,4289789956,4284088345,4279959601
  3055.     DATA 4278190156,4279370035,4284612631,4290904066
  3056.     DATA 4291559424,4290904064,4290117632,4289462272
  3057.     DATA 4289003520,4288741376,4288610304,4288675840
  3058.     DATA 4288937984,4289331200,4289921024,4290641920
  3059.     DATA 4291362816,4285005846,4280156208,4278255688
  3060.     DATA 4278190159,4278321471,4279174950,4284942350
  3061.     DATA 4291231744,4290576384,4289396736,4288479232
  3062.     DATA 4288217088,4288872448,4289855488,4290707458
  3063.     DATA 4284743703,4280025137,4278452291,4281139241
  3064.     DATA 4283041557,4280620823,4287891207,4290838528
  3065.     DATA 4289527808,4289593344,4290772992,4285333524
  3066.     DATA 4280680492,4278190157,4279828530,4285792275
  3067.     DATA 4287956743,4280555287,4288677125,4290052096
  3068.     DATA 4288806912,4289658880,4291297281,4286709775
  3069.     DATA 4280483885,4278255691,4279304247,4287561740
  3070.     DATA 4290118146,4281144597,4286318600,4289200128
  3071.     DATA 4288282624,4288741384,4279894066,4281532454
  3072.     DATA 4286120450,4285792513,4288151552,4288413696
  3073.     DATA 4290707456,4282318882,4287561728,4285005824
  3074.     DATA 4287889408,4289396742,4286185472,4286251008
  3075.     DATA 4288548109,4288878873,4287954951,4278845500
  3076.     DATA 4290379776,4285136896,4287496192,4290533207
  3077.     DATA 4291128942,4288086016,4278517824,4279500853
  3078.     DATA 4288544768,4287692800,4292783533,4293312961
  3079.     DATA 4278779962,4287102976,4285661184,4288614673
  3080.     DATA 4294636788,4294768888,4288945437,4290445312
  3081.     DATA 4286644224,4286119936,4290665821,4294967295
  3082.     DATA 4290996842,4286447616,4286382080,4288349702
  3083.     DATA 4291724934,4292121748,4292452769,4294040796
  3084.     DATA 4294239717,4292849840,4292386719,4291989134
  3085.     DATA 4291393656,4288482059,4286513152,4284484363
  3086.     DATA 4282716433,4286383365,4290004036,4294570224
  3087.     DATA 4290401107,4287300098,4287627521,4284615949
  3088.     DATA 4282137660,4282598211,4280884766,4287234562
  3089.     DATA 4289673272,4294372074,4294967038,4294438124
  3090.     DATA 4289937729,4287171082,4281478702,4281147424
  3091.     DATA 4286645252,4281868834,4278979596,4281348144
  3092.     DATA 4281479730,4284222476,4289474351,4294305510
  3093.     DATA 4289540915,4279435317,4282000677,4280624421
  3094.     DATA 4282532418,4282454803,4286906368,4285988864
  3095.     DATA 4287431170,4280228635,4278190080,4279440147
  3096.     DATA 4281611316,4288020480,4287954944,4293114554
  3097.     DATA 4294173153,4288217345,4278911286,4279703062
  3098.     DATA 4281413937,4281015838,4286971904,4280360478
  3099.     DATA 4281216558,4282585361,4287168512,4285726720
  3100.     DATA 4285267968,4284940288,4285269767,4294373359
  3101.     DATA 4294901502,4288683550,4278845750,4279703319
  3102.     DATA 4280953386,4280818973,4287299584,4285333504
  3103.     DATA 4281277725,4280163870,4281084972,4284025868
  3104.     DATA 4287758336,4285530112,4285399040,4286840832
  3105.     DATA 4287365120,4289345335,4294835195,4291923855
  3106.     DATA 4290801262,4288436312,4285071360,4279304245
  3107.     DATA 4280950816,4280492835,4281282351,4281668628
  3108.     DATA 4284091404,4280293657,4287038211,4287823872
  3109.     DATA 4291261299,4294371817,4290335057,4289673015
  3110.     DATA 4293975003,4291924626,4286775296,4285923328
  3111.     DATA 4285202432,4285792256,4285074958,4280361249
  3112.     DATA 4280097820,4285401096,4283633166,4281864979
  3113.     DATA 4285728519,4286316544,4286709760,4291195506
  3114.     DATA 4289011744,4288680723,4291460220,4287627264
  3115.     DATA 4278845497,4290314240,4285335560,4285990406
  3116.     DATA 4287234048,4287037440,4278845496,4286578688
  3117.     DATA 4284874752,4284809216,4279304241,4286054400
  3118.     DATA 4288348160,4289069056,4289134592,4279107639
  3119.     DATA 4281991200,4289265664,4291100672,4290969600
  3120.     DATA 4281270306,4286840846,4289724416,4285267979
  3121.     DATA 4278255690,4287889409,4278386755,4279173176
  3122.     DATA 4289789952,4279959597,4280614951,4283105302
  3123.     DATA 4280418339,4287496194,4278648893,4278648889
  3124.     DATA 4284743680,4290183168,4286251015,4278321222
  3125.     DATA 4283957253,4290510848,4283564052,4281073690
  3126.     DATA 4285533184,4286653696,4287443456,4288365568
  3127.     DATA 4289420288,4289284609,4279631920,4278583354
  3128.     DATA 4287120390,4290671360,4292186624,4293240320
  3129.     DATA 4294492928,4294756096,4294888192,4294953984
  3130.     DATA 4291528448,4291166208,4289986560,4278190155
  3131.     DATA 4288182801,4293241866,4286121478,4280680486
  3132.     DATA 4287919634,4294757404,4286783255,4285204745
  3133.     DATA 4282192402,4284746250,4284680714,4287169283
  3134.     DATA 4283109135,4283371022,4285859591,4287365634
  3135.     DATA 4285794055,4286971908,4287525140,4294886912
  3136.     DATA 4294884352,4294884865,4294887684,4294955038
  3137.     DATA 4289687636,4287693057,4284288012,4281537556
  3138.     DATA 4281406741,4282650897,4284418827,4283698702
  3139.     DATA 4284877322,4286187014,4281472277,4283043599
  3140.     DATA 4285662983,4282257938,4280746022,4287192597
  3141.     DATA 4294877440,4294877184,4294877955,4294884360
  3142.     DATA 4294953728,4293906331,4285663495,4282912784
  3143.     DATA 4281996051,4287824129,4280817174,4287758593
  3144.     DATA 4287496449,4284549899,4285597447,4286382087
  3145.     DATA 4287322133,4294877703,4294878220,4294877444
  3146.     DATA 4294884359,4294955037,4294895276,4289753428
  3147.     DATA 4286448901,4284942858,4281079318,4285466632
  3148.     DATA 4280686359,4279238708,4286928150,4294883651
  3149.     DATA 4294893219,4294897358,4294963670,4294896065
  3150.     DATA 4294890626,4294953994,4294961069,4294499749
  3151.     DATA 4286655264,4285532168,4280751895,4286317829
  3152.     DATA 4284287755,4282384411,4278255692,4289502346
  3153.     DATA 4294964444,4294962369,4294961329,4294961071
  3154.     DATA 4294960804,4294954512,4294958125,4293378962
  3155.     DATA 4285666319,4284156940,4285007365,4286589471
  3156.     DATA 4288762643,4290408704,4291594496,4292318976
  3157.     DATA 4292515584,4292378112,4292179200,4291784448
  3158.     DATA 4291066672,4281538351,4280025123,4281270296
  3159.     DATA 4282974218,4284416001,4285923336,4286478727
  3160.     DATA 4294963664,4294960812,4294960019,4294953988
  3161.     DATA 4294954756,4294963541,4292720007,4285534733
  3162.     DATA 4286252293,4280490008,4280489751,4285007107
  3163.     DATA 4287380524,4290940009,4293774489,4294895020
  3164.     DATA 4294956872,4294885120,4294878208,4294877700
  3165.     DATA 4294886998,4294960809,4289765252,4278321219
  3166.     DATA 4279566377,4283105289,4285464576,4286709763
  3167.     DATA 4280952916,4294963924,4294959775,4294957700
  3168.     DATA 4294956924,4294957442,4294957683,4294954247
  3169.     DATA 4294955271,4294963295,4293115278,4286259994
  3170.     DATA 4286907139,4287496706,4285337098,4289094474
  3171.     DATA 4293247376,4294957660,4294887936,4294882304
  3172.     DATA 4294881577,4294896324,4294958480,4294960552
  3173.     DATA 4281741646,4280877083,4282253328,4291149494
  3174.     DATA 4294959515,4294955629,4294955627,4294955082
  3175.     DATA 4294954245,4294955530,4294963048,4294235031
  3176.     DATA 4288697394,4284875523,4285468426,4289621587
  3177.     DATA 4293972380,4294891631,4294879488,4294877441
  3178.     DATA 4294887269,4294769134,4288868038,4294832853
  3179.     DATA 4294958479,4290423177,4279828518,4278321218
  3180.     DATA 4279177033,4294766026,4294956406,4294954818
  3181.     DATA 4294956044,4294963061,4294957441,4294897094
  3182.     DATA 4292724679,4287646025,4284809730,4285467392
  3183.     DATA 4289744640,4294096983,4294890877,4294878731
  3184.     DATA 4294894252,4281063294,4289785803,4294957702
  3185.     DATA 4294763691,4278584646,4282071389,4294961848
  3186.     DATA 4294960291,4294954553,4294953986,4294962550
  3187.     DATA 4294956145,4294966258,4294901245,4293186515
  3188.     DATA 4289492855,4284750100,4284678144,4284678657
  3189.     DATA 4286787884,4290478173,4294229342,4294879766
  3190.     DATA 4294890362,4294893205,4294882606,4294893203
  3191.     DATA 4294835966,4280523612,4284080282,4294958738
  3192.     DATA 4294960810,4279768647,4282795107,4294959516
  3193.     DATA 4294954033,4294956664,4294967036,4292142556
  3194.     DATA 4279003959,4278676787,4278633310,4294441196
  3195.     DATA 4294959774,4294960553,4294960811,4294901758
  3196.     DATA 4278282288,4281980292,4294959517,4294960292
  3197.     DATA 4280163143,4280292658,4292457071,4294953512
  3198.     DATA 4294955013,4294962292,4294959256,4294966778
  3199.     DATA 4286572465,4283424147,4279074369,4278216239
  3200.     DATA 4278224446,4278899306,4294769133,4294959257
  3201.     DATA 4294962628,4294965224,4294963406,4294960294
  3202.     DATA 4286310062,4279933527,4278218290,4282636683
  3203.     DATA 4279505478,4282991191,4294960293,4294952995
  3204.     DATA 4294954246,4294961766,4294955628,4294965221
  3205.     DATA 4290048465,4278308965,4278240093,4278494801
  3206.     DATA 4285848998,4286375855,4294963665,4294961072
  3207.     DATA 4294964964,4294965222,4294962110,4294959514
  3208.     DATA 4294967035,4287425209,4278241119,4282106492
  3209.     DATA 4288736709,4294960551,4294106278,4278387528
  3210.     DATA 4278848072,4294764208,4294956407,4294952227
  3211.     DATA 4294959427,4294955887,4294960296,4287162806
  3212.     DATA 4279161452,4280538745,4294704893,4294958999
  3213.     DATA 4294962108,4294962888,4294961588,4294961589
  3214.     DATA 4294960032,4294964185,4293786612,4281129087
  3215.     DATA 4287228343,4294900462,4294956404,4288121207
  3216.     DATA 4278453062,4293184650,4294958995,4294885929
  3217.     DATA 4294953989,4294887680,4294889745,4294957960
  3218.     DATA 4294114551,4293458929,4294962368,4294508027
  3219.     DATA 4294442490,4294961074,4279834438,4279702326
  3220.     DATA 4290943753,4294955563,4294956925,4294885429
  3221.     DATA 4294884864,4294887770,4294956405,4294965482
  3222.     DATA 4294966518,4294958219,4294961333,4294966257
  3223.     DATA 4294962887,4294762394,4285687654,4278978621
  3224.     DATA 4282854948,4288769807,4294752768,4294883584
  3225.     DATA 4294881792,4294886484,4294957183,4294886475
  3226.     DATA 4294886152,4294881280,4294887515,4294956923
  3227.     DATA 4294955888,4294956922,4293645727,4294106020
  3228.     DATA 4289370752,4278255947,4282789156,4293234691
  3229.     DATA 4294885196,4294894500,4294882062,4294882331
  3230.     DATA 4294878472,4294885962,4294958477,4290686337
  3231.     DATA 4283056946,4280426263,4280623641,4292527764
  3232.     DATA 4294959255,4294763690,4280689481,4278387270
  3233.     DATA 4282723109,4289818380,4293300483,4293169667
  3234.     DATA 4288701968,4282725425,4294957398,4294958973
  3235.     DATA 4294959494,4294959248,4294957440,4294885185
  3236.     DATA 4294885443,4294954851,4294888023,4294956665
  3237.     DATA 4294958220,4294958739,4294171813,4288647276
  3238.     DATA 4288515947,4292856471,4294369191,4293119642
  3239.     DATA 4290686081,4289699459,4278255945,4278255946
  3240.     DATA 4281082669,4294954521,4294955621,4294955370
  3241.     DATA 4294888798,4294958997,4294960035,4293908898
  3242.     DATA 4294829483,4293711004,4278913605,4290746634
  3243.     DATA 4294885888,4294882560,4294880529,4294886221
  3244.     DATA 4294956146,4294960034,4293379192,4279702337
  3245.     DATA 4281212460,4291528712,4294881024,4294879744
  3246.     DATA 4294877952,4294878993,4294881831,4294752054
  3247.     DATA 4294752572,4291796803,4287592014,4288446803
  3248.     DATA 4290682202,4293837927,4294758251,4294957443
  3249.     DATA 4294958737,4294759286,4289104469,4278782020
  3250.     DATA 4278584386,4282329127,4286599446,4289358861
  3251.     DATA 4292183813,4293498114,4293694978,4293038083
  3252.     DATA 4291198471,4288832783,4286731285,4283314467
  3253.     DATA 4280686639,4278715712,4278321736,4279044930
  3254.     DATA 4279899456,4281674817,4283318340,4286145868
  3255.     DATA 4288578131,4291997024,4294561130,4294758250
  3256.     DATA 4294957182,4294957962,4294758509,4290024793
  3257.     DATA 4280754496,4278518853,4279307842,4280293951
  3258.     DATA 4282003522,4283121219,4285291081,4287263312
  3259.     DATA 4287986513,4288841299,4289301076,4288315218
  3260.     DATA 4282069314,4278913347,0,24,1,0
  3261.     DATA 2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0
  3262.     DATA 10,0,11,0,12,0,13,0,14,0,0,46,15,0,16,0
  3263.     DATA 17,0,18,0,19,1,20,7,19,1,21,0,22,0,23,0
  3264.     DATA 1,0,0,40,24,0,25,0,26,0,27,0,19,1,20,0
  3265.     DATA 28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0
  3266.     DATA 36,0,37,0,38,0,39,0,40,0,20,0,19,0,27,0
  3267.     DATA 41,0,42,0,43,0,0,34,44,0,45,0,46,0,47,0
  3268.     DATA 48,0,19,0,20,0,7,0,49,0,50,0,51,0,52,11
  3269.     DATA 53,0,54,0,29,0,28,0,19,0,55,0,56,0,57,0
  3270.     DATA 1,0,0,29,58,0,59,0,60,0,61,0,62,0,20,0
  3271.     DATA 28,0,63,0,64,0,51,0,52,17,34,0,65,0,66,0
  3272.     DATA 28,0,19,0,55,0,67,0,68,0,58,0,44,0,0,22
  3273.     DATA 69,0,70,0,71,0,18,0,72,0,73,0,74,0,48,0
  3274.     DATA 75,0,76,0,52,23,34,0,77,0,63,0,28,0,19,0
  3275.     DATA 78,0,79,0,80,0,81,0,0,19,82,0,83,0,7,0
  3276.     DATA 19,0,84,0,85,0,86,0,87,0,88,0,52,28,34,0
  3277.     DATA 65,0,39,0,8,0,19,0,89,0,90,0,0,16,44,0
  3278.     DATA 91,0,78,0,19,0,20,0,66,0,92,0,93,0,94,0
  3279.     DATA 52,33,95,0,50,0,96,0,8,0,97,0,44,0,0,14
  3280.     DATA 80,0,7,0,19,0,63,0,32,0,98,0,99,0,100,0
  3281.     DATA 52,37,36,0,96,0,68,0,0,13,24,0,101,0,20,0
  3282.     DATA 30,0,88,0,52,0,102,0,103,0,52,26,104,0,105,0
  3283.     DATA 52,10,88,0,106,0,24,0,0,12,107,0,7,0,108,0
  3284.     DATA 52,1,94,0,109,0,110,0,52,26,111,0,112,0,52,11
  3285.     DATA 113,0,114,0,0,12,115,0,7,0,116,0,52,1,117,0
  3286.     DATA 99,0,94,0,52,26,118,0,119,0,52,12,120,0,0,12
  3287.     DATA 115,0,66,0,52,2,121,0,122,0,94,0,52,25,123,0
  3288.     DATA 124,0,125,0,126,0,52,11,120,0,0,12,115,0,127,0
  3289.     DATA 52,2,128,0,129,0,52,26,130,0,131,1,132,0,52,11
  3290.     DATA 120,0,0,12,115,0,127,0,52,2,133,0,134,0,52,1
  3291.     DATA 94,0,52,18,135,0,112,0,136,0,137,0,138,0,139,0
  3292.     DATA 131,1,140,0,141,0,142,0,143,0,144,0,145,0,52,6
  3293.     DATA 120,0,0,12,115,0,127,0,52,2,134,0,146,0,52,0
  3294.     DATA 113,0,147,0,148,0,149,0,52,17,150,0,151,0,131,7
  3295.     DATA 124,0,152,0,52,7,120,0,0,12,115,0,127,0,153,0
  3296.     DATA 154,0,52,0,133,1,52,0,155,0,156,0,157,0,158,0
  3297.     DATA 159,0,52,17,160,0,161,0,131,4,162,0,163,0,164,0
  3298.     DATA 52,8,120,0,0,12,115,0,165,0,166,0,167,0,168,0
  3299.     DATA 128,0,103,0,113,0,169,0,170,0,171,0,172,0,173,0
  3300.     DATA 52,18,174,0,175,0,131,3,163,0,176,0,52,9,120,0
  3301.     DATA 0,12,177,0,178,0,179,0,180,0,181,0,182,0,183,0
  3302.     DATA 184,0,185,0,186,0,187,0,188,0,148,0,52,12,94,2
  3303.     DATA 189,0,190,2,191,0,131,3,192,0,193,0,52,9,120,0
  3304.     DATA 0,12,194,0,195,0,186,0,196,0,197,0,198,0,122,0
  3305.     DATA 184,0,199,0,186,0,187,0,200,0,201,0,52,8,94,1
  3306.     DATA 100,0,202,0,134,0,203,0,204,0,99,0,205,1,206,0
  3307.     DATA 207,0,131,0,208,0,131,1,208,0,209,0,113,0,52,8
  3308.     DATA 120,0,0,12,210,0,211,0,186,0,212,0,213,0,214,0
  3309.     DATA 215,0,189,0,216,0,217,0,218,0,179,0,219,0,52,6
  3310.     DATA 94,0,220,0,128,0,221,0,205,0,222,0,102,0,223,0
  3311.     DATA 224,0,117,0,100,1,225,0,208,0,226,0,227,0,228,0
  3312.     DATA 124,0,131,0,229,0,230,0,203,0,146,0,224,0,189,0
  3313.     DATA 52,4,120,0,0,12,231,0,232,0,233,0,234,0,235,0
  3314.     DATA 190,0,205,0,94,0,236,0,233,0,179,0,237,0,238,0
  3315.     DATA 52,4,189,0,198,0,122,0,205,0,203,0,182,0,239,0
  3316.     DATA 94,0,52,5,240,0,241,0,242,0,52,1,243,0,244,0
  3317.     DATA 245,0,98,0,246,0,247,0,248,0,99,0,249,0,246,0
  3318.     DATA 117,0,94,0,52,0,120,0,0,12,115,0,250,0,251,0
  3319.     DATA 252,0,253,0,113,0,230,0,190,1,254,0,255,0,256,0
  3320.     DATA 52,2,94,0,117,0,257,0,230,0,222,0,258,0,239,0
  3321.     DATA 94,0,52,8,259,0,260,0,52,3,261,0,262,0,52,2
  3322.     DATA 113,0,263,0,128,0,122,0,205,0,222,0,133,0,264,0
  3323.     DATA 0,12,115,0,265,0,266,0,267,0,94,1,215,0,98,0
  3324.     DATA 52,3,94,1,268,0,249,0,205,0,183,0,224,0,94,0
  3325.     DATA 52,11,193,0,52,5,193,0,52,5,94,0,190,0,269,0
  3326.     DATA 183,0,270,0,0,12,115,0,127,0,52,3,203,0,202,0
  3327.     DATA 52,2,239,0,146,0,248,1,271,0,100,0,94,0,52,30
  3328.     DATA 94,0,120,0,0,12,115,0,127,0,52,3,183,0,182,0
  3329.     DATA 190,0,182,0,122,0,272,0,249,0,202,0,94,0,52,34
  3330.     DATA 120,0,0,12,115,0,127,0,94,1,239,0,202,0,221,0
  3331.     DATA 230,0,273,0,221,0,258,0,100,0,52,37,120,0,0,12
  3332.     DATA 274,0,203,0,248,0,205,0,273,0,215,0,275,0,182,0
  3333.     DATA 239,0,52,20,88,1,276,0,116,0,33,0,36,0,277,0
  3334.     DATA 278,1,32,0,35,0,88,0,52,7,279,0,0,12,280,0
  3335.     DATA 281,0,190,0,117,0,113,0,52,18,88,0,53,0,77,0
  3336.     DATA 265,0,66,0,282,0,40,0,20,0,19,8,28,0,283,0
  3337.     DATA 75,0,36,0,52,4,284,0,0,12,285,0,19,0,7,0
  3338.     DATA 286,0,88,0,52,14,94,1,53,0,75,0,48,0,19,18
  3339.     DATA 20,0,29,0,37,0,52,2,287,0,0,11,288,0,18,0
  3340.     DATA 19,2,63,0,76,0,52,11,94,0,113,0,189,0,94,0
  3341.     DATA 276,0,95,0,36,0,29,0,19,19,20,0,54,0,189,0
  3342.     DATA 94,0,289,0,290,0,0,10,291,0,48,0,40,0,8,0
  3343.     DATA 28,0,20,0,7,0,292,0,88,0,52,7,94,0,113,1
  3344.     DATA 94,0,52,4,88,0,30,0,20,0,19,18,20,0,32,0
  3345.     DATA 189,0,113,0,293,0,0,10,294,0,52,0,88,0,276,0
  3346.     DATA 51,0,34,0,76,0,32,0,116,0,52,5,94,0,113,0
  3347.     DATA 189,0,94,0,52,8,37,0,8,0,19,18,283,0,52,0
  3348.     DATA 113,0,295,0,0,10,296,0,122,0,275,0,133,0,182,0
  3349.     DATA 214,0,117,0,190,0,94,1,52,3,94,0,189,0,94,0
  3350.     DATA 52,11,76,0,282,0,19,17,20,0,278,0,52,0,297,0
  3351.     DATA 298,0,0,9,299,0,300,5,272,0,109,0,221,0,247,0
  3352.     DATA 224,0,52,0,94,0,189,0,94,0,52,13,51,0,39,0
  3353.     DATA 19,17,301,0,52,1,302,0,303,0,0,8,69,0,304,0
  3354.     DATA 300,8,99,0,117,0,189,0,52,16,88,0,38,0,28,0
  3355.     DATA 19,15,305,0,52,2,306,0,44,0,0,8,307,0,300,3
  3356.     DATA 273,0,308,0,309,0,310,0,311,0,312,0,313,0,94,0
  3357.     DATA 52,18,53,0,96,0,20,0,19,12,20,0,65,0,52,2
  3358.     DATA 189,0,314,0,0,8,315,0,316,0,317,0,318,0,319,0
  3359.     DATA 320,0,321,0,322,0,323,2,324,0,220,0,189,0,94,0
  3360.     DATA 52,18,33,0,292,0,39,0,325,0,20,0,19,7,7,0
  3361.     DATA 326,0,52,4,302,0,327,0,0,8,328,0,323,8,329,0
  3362.     DATA 258,0,255,0,330,0,52,22,88,0,34,0,36,0,87,0
  3363.     DATA 31,0,77,0,286,0,64,0,277,0,276,0,52,6,331,0
  3364.     DATA 0,8,332,0,323,8,333,0,334,0,335,0,336,0,94,0
  3365.     DATA 52,19,94,1,100,0,154,0,337,0,338,0,339,0,340,0
  3366.     DATA 173,0,190,0,341,0,342,0,343,0,344,0,339,0,94,1
  3367.     DATA 52,1,345,0,43,0,0,7,346,0,347,0,348,0,349,0
  3368.     DATA 350,0,323,4,351,0,352,0,121,0,353,0,354,0,154,0
  3369.     DATA 52,15,94,0,113,0,339,0,343,0,355,0,356,0,159,0
  3370.     DATA 357,0,358,0,343,0,173,0,335,0,159,0,359,0,360,0
  3371.     DATA 361,0,362,0,363,0,364,0,365,0,256,0,94,0,52,0
  3372.     DATA 366,0,0,7,367,0,368,0,369,1,370,0,371,0,372,0
  3373.     DATA 323,2,351,0,373,0,374,0,100,0,375,0,376,0,94,0
  3374.     DATA 52,12,94,0,190,0,377,0,376,0,378,0,379,0,256,0
  3375.     DATA 380,0,94,0,52,9,94,0,153,0,381,0,382,0,381,0
  3376.     DATA 342,0,383,0,24,0,0,6,384,0,369,1,385,0,386,0
  3377.     DATA 387,0,388,0,323,2,389,0,390,0,391,0,129,0,189,0
  3378.     DATA 392,0,335,0,364,0,94,0,52,8,94,1,393,0,394,0
  3379.     DATA 238,0,256,0,379,0,52,1,94,1,113,0,190,0,239,0
  3380.     DATA 220,1,239,0,100,0,190,0,113,0,94,1,52,2,395,0
  3381.     DATA 396,0,159,0,397,0,0,6,398,0,399,0,400,0,401,0
  3382.     DATA 402,0,403,0,404,0,405,0,323,1,389,0,406,0,407,0
  3383.     DATA 408,0,128,0,94,0,409,0,410,0,392,0,153,0,94,0
  3384.     DATA 52,5,377,0,338,0,411,0,412,0,342,0,113,0,52,0
  3385.     DATA 94,0,113,0,224,0,133,0,122,0,109,0,272,0,300,4
  3386.     DATA 272,0,230,0,215,0,249,0,133,0,214,0,189,0,52,0
  3387.     DATA 343,0,94,0,413,0,0,5,414,0,415,0,416,0,417,0
  3388.     DATA 418,0,406,0,419,0,420,0,421,0,323,1,422,0,406,1
  3389.     DATA 423,0,424,0,128,0,94,0,154,1,410,0,201,0,190,0
  3390.     DATA 154,0,94,1,339,0,168,0,425,0,376,0,168,0,52,1
  3391.     DATA 94,0,98,0,103,0,230,0,426,0,427,0,428,0,429,0
  3392.     DATA 430,0,431,0,432,0,433,0,434,0,435,0,436,0,437,0
  3393.     DATA 438,0,439,0,440,0,441,0,99,0,134,0,189,0,52,0
  3394.     DATA 442,0,0,4,44,0,443,0,444,0,419,0,406,0,445,1
  3395.     DATA 406,0,446,0,447,1,448,0,449,0,406,2,450,0,451,0
  3396.     DATA 129,0,189,0,52,0,153,0,409,0,452,0,453,0,254,0
  3397.     DATA 364,0,454,0,236,0,100,0,94,0,52,0,94,0,268,0
  3398.     DATA 122,0,455,0,456,0,457,0,458,0,459,0,460,0,323,0
  3399.     DATA 322,0,461,0,462,0,369,0,463,0,464,0,465,0,466,0
  3400.     DATA 24,0,0,0,14,0,467,0,468,0,469,0,470,0,190,0
  3401.     DATA 471,0,0,4,472,0,473,0,406,0,445,0,474,0,475,0
  3402.     DATA 476,0,477,0,478,0,323,0,479,0,480,0,481,0,406,3
  3403.     DATA 482,0,483,0,215,0,268,0,94,0,52,0,113,0,484,0
  3404.     DATA 392,0,353,0,485,0,94,0,52,0,94,0,268,0,221,0
  3405.     DATA 486,0,487,0,488,0,390,0,406,2,489,0,490,0,491,0
  3406.     DATA 369,1,492,0,493,0,494,0,495,0,406,0,496,0,0,3
  3407.     DATA 327,0,497,0,248,0,498,0,0,3,14,0,499,0,418,0
  3408.     DATA 406,0,500,0,501,0,502,2,503,0,323,0,504,0,505,0
  3409.     DATA 506,0,406,4,507,0,508,0,509,0,122,0,268,0,113,0
  3410.     DATA 52,3,94,0,202,0,221,0,510,0,511,0,512,0,390,0
  3411.     DATA 406,4,513,0,514,0,369,0,515,0,516,0,517,0,518,0
  3412.     DATA 519,0,520,0,406,0,521,0,14,0,0,3,14,0,522,0
  3413.     DATA 523,0,0,3,524,0,525,0,406,0,445,0,526,0,502,3
  3414.     DATA 527,0,323,0,479,0,528,0,529,0,406,3,445,0,530,0
  3415.     DATA 531,0,532,0,533,0,534,0,109,0,102,0,269,0,121,0
  3416.     DATA 134,0,248,0,535,0,536,0,537,0,406,7,538,0,369,0
  3417.     DATA 539,0,540,0,162,0,208,0,541,0,542,0,543,0,406,0
  3418.     DATA 544,0,545,0,0,10,546,0,547,0,406,0,548,0,502,4
  3419.     DATA 549,0,323,0,550,0,528,0,551,0,406,3,495,0,552,0
  3420.     DATA 553,0,131,0,554,0,555,0,556,0,557,0,558,0,559,0
  3421.     DATA 560,0,561,0,562,0,563,0,564,0,406,7,565,0,566,0
  3422.     DATA 567,0,162,0,131,0,568,0,569,0,570,0,571,0,572,0
  3423.     DATA 406,0,573,0,0,10,574,0,419,0,406,0,575,0,502,4
  3424.     DATA 576,0,323,1,505,0,551,0,406,3,575,0,577,0,578,0
  3425.     DATA 131,2,579,0,580,0,581,0,582,0,583,0,584,0,406,0
  3426.     DATA 585,1,406,4,418,0,406,1,586,2,131,0,587,0,579,0
  3427.     DATA 588,0,589,0,590,0,591,0,406,0,592,0,0,9,593,0
  3428.     DATA 594,0,406,1,575,0,502,4,595,0,323,0,447,0,596,0
  3429.     DATA 597,0,406,3,598,0,526,0,599,0,131,0,600,0,601,0
  3430.     DATA 602,0,603,0,604,0,605,0,606,0,607,0,406,6,608,0
  3431.     DATA 609,0,610,0,406,2,611,0,131,0,612,0,613,0,614,0
  3432.     DATA 615,0,607,0,548,0,406,0,616,0,0,9,14,0,617,0
  3433.     DATA 406,1,618,0,502,4,619,0,323,0,620,0,323,0,621,0
  3434.     DATA 406,3,584,0,622,0,623,0,131,0,624,0,625,0,626,0
  3435.     DATA 627,0,628,0,629,0,630,0,575,0,406,5,631,0,632,0
  3436.     DATA 609,0,633,0,634,0,406,1,635,0,636,0,637,0,638,0
  3437.     DATA 639,0,640,0,543,0,641,0,642,0,643,0,0,10,644,0
  3438.     DATA 645,0,406,0,445,0,646,0,502,3,647,0,323,0,620,0
  3439.     DATA 323,0,648,0,406,3,572,0,649,0,650,0,162,0,208,0
  3440.     DATA 651,0,652,0,653,0,654,0,208,0,655,0,585,0,406,5
  3441.     DATA 656,0,657,0,658,0,406,0,659,0,406,1,660,0,661,0
  3442.     DATA 662,0,663,0,664,0,665,0,666,0,445,0,667,0,0,11
  3443.     DATA 668,0,669,0,406,1,670,0,502,3,671,0,323,0,672,0
  3444.     DATA 673,0,674,0,420,0,406,3,675,0,501,0,630,0,162,0
  3445.     DATA 131,0,676,0,677,0,208,0,678,0,543,0,406,13,445,0
  3446.     DATA 474,0,162,0,679,0,680,0,681,0,530,0,544,0,682,0
  3447.     DATA 0,9,44,0,683,0,684,0,685,0,572,0,406,0,586,0
  3448.     DATA 686,0,502,2,687,0,672,0,550,0,688,0,462,0,689,0
  3449.     DATA 406,3,495,0,690,0,649,0,681,0,691,0,692,0,623,0
  3450.     DATA 611,0,690,0,641,0,406,14,693,0,694,0,695,0,696,0
  3451.     DATA 649,0,697,0,698,0,44,0,0,7,699,0,700,0,701,0
  3452.     DATA 702,0,703,0,704,0,705,0,445,0,406,0,585,0,706,0
  3453.     DATA 502,1,707,0,708,0,709,0,348,0,710,1,598,0,406,3
  3454.     DATA 618,0,711,0,502,1,712,0,502,0,713,0,591,0,406,8
  3455.     DATA 390,0,714,0,715,0,406,3,585,0,577,0,622,0,502,0
  3456.     DATA 543,0,716,0,24,0,0,8,717,0,718,0,719,0,369,1
  3457.     DATA 368,0,515,0,720,0,721,0,406,0,445,0,607,0,477,0
  3458.     DATA 666,0,722,0,723,0,724,0,725,0,474,0,445,0,406,4
  3459.     DATA 445,0,575,0,726,1,575,0,586,0,406,7,390,0,727,0
  3460.     DATA 728,0,729,0,730,0,731,0,406,3,495,0,571,0,732,0
  3461.     DATA 733,0,734,0,0,11,735,0,736,0,737,0,738,0,739,0
  3462.     DATA 740,0,741,0,742,0,743,0,744,0,745,0,746,0,747,0
  3463.     DATA 748,0,749,0,750,0,622,0,751,0,543,0,752,0,753,0
  3464.     DATA 500,0,548,0,572,0,445,0,406,10,754,0,755,0,756,0
  3465.     DATA 757,0,758,0,759,0,760,0,406,6,761,0,69,0,0,13
  3466.     DATA 44,0,762,0,763,0,0,0,764,0,323,2,765,0,766,0
  3467.     DATA 767,0,768,0,502,8,712,0,751,0,543,0,769,0,770,0
  3468.     DATA 586,0,406,6,771,0,544,0,406,3,772,0,406,4,445,0
  3469.     DATA 773,0,774,0,0,17,735,0,775,0,372,0,490,0,776,0
  3470.     DATA 777,0,778,0,779,0,767,0,502,13,780,0,530,0,571,0
  3471.     DATA 781,0,445,0,406,12,445,0,500,0,782,0,783,0,0,16
  3472.     DATA 762,0,784,0,785,0,786,0,787,0,788,0,369,3,789,0
  3473.     DATA 790,0,791,0,792,0,793,0,794,0,795,0,796,0,797,0
  3474.     DATA 798,1,502,7,780,0,799,0,670,0,781,0,445,0,406,5
  3475.     DATA 445,0,641,0,800,0,801,0,802,0,803,0,0,17,804,0
  3476.     DATA 805,0,806,0,807,0,808,0,809,0,810,0,811,0,812,0
  3477.     DATA 813,0,814,0,815,0,816,0,817,0,14,0,0,1,14,0
  3478.     DATA 69,0,818,0,819,0,820,0,821,0,822,0,823,0,824,0
  3479.     DATA 825,0,826,0,827,0,502,3,552,0,828,0,829,0,753,0
  3480.     DATA 607,0,500,0,571,0,706,0,830,0,831,0,832,0,14,0
  3481.     DATA 0,22,14,3,44,0,0,16,14,0,69,0,833,0,834,0
  3482.     DATA 835,0,836,0,837,0,838,0,839,0,840,0,841,0,842,0
  3483.     DATA 843,0,823,0,844,0,845,0,44,0,0,15
  3484.  
  3485.  
  3486.     'Grass
  3487.     'CC0 license - Credit "Kenney.nl" or "www.kenney.nl"
  3488.  
  3489.     DATA 156,4287879972,4287814179,4287682083,4286627359
  3490.     DATA 4286627103,4286757664,4288715570,4287475494
  3491.     DATA 4286692383,4288062764,4288128044,4288780851
  3492.     DATA 4286953250,4288845877,4290347331,4290020671
  3493.     DATA 4287671336,4286822944,4288258606,4290216769
  3494.     DATA 4290282050,4287605800,4289955390,4290412611
  3495.     DATA 4288911157,4287018786,4288846132,4290478148
  3496.     DATA 4289825085,4287736617,4286822689,4288193581
  3497.     DATA 4290151488,4290217025,4288193326,4287671080
  3498.     DATA 4289759804,4288911413,4287018787,4287149348
  3499.     DATA 4288780596,4289759549,4287801642,4286888225
  3500.     DATA 4288323887,4290020927,4290086464,4288389423
  3501.     DATA 4286887969,4287801897,4287149092,4287083811
  3502.     DATA 4288780852,4290151489,4290544457,4290478149
  3503.     DATA 4289629243,4287867178,4289955647,4290543943
  3504.     DATA 4289563707,4287083812,4287344678,4288976438
  3505.     DATA 4290610250,4290939734,4290742096,4289694524
  3506.     DATA 4287084067,4288585010,4289955646,4290544200
  3507.     DATA 4290873683,4290873684,4288650290,4289628988
  3508.     DATA 4289041974,4287410215,4287279653,4289237560
  3509.     DATA 4291071579,4291071578,4286692128,4287018531
  3510.     DATA 4288715571,4290544199,4288715315,4290742095
  3511.     DATA 4291071322,4290610251,4287344934,4289302841
  3512.     DATA 4290347330,4291137372,4290807889,4289759805
  3513.     DATA 4287736361,4286953506,4291071321,4290939735
  3514.     DATA 4289302585,4286626847,4286887970,4289368121
  3515.     DATA 4287018530,4289498683,4290347075,4290609994
  3516.     DATA 4289955391,4287540775,4288976693,4289498427
  3517.     DATA 4289563708,4290676044,4291005528,4290085951
  3518.     DATA 4289172279,4290609993,4290086207,4290741839
  3519.     DATA 4291005784,4290676045,4290478406,4291005785
  3520.     DATA 4291137630,4291137373,4290478405,4291269988
  3521.     DATA 4291203681,4291203938,4291138145,4291269989
  3522.     DATA 4291336040,4291137629,4291269731,4291336039
  3523.     DATA 4291137631,4291401833,4291335783,4291269474
  3524.     DATA 4291137887,4291203423,4291335782,4291269733
  3525.     DATA 4291137886,4291270245,4291269732,4291269990
  3526.     DATA 4291203424,4291203680,4291203939,4291203682
  3527.     DATA 4291269475,4291203937,4291270246,4291204195
  3528.     DATA 0,4,1,2,0,6,1,3
  3529.     DATA 0,6,1,2,0,7,1,2,0,6,1,3,0,6,1,2
  3530.     DATA 0,3,2,63,3,521,4,1,3,18,4,1,3,18,4,1
  3531.     DATA 3,18,5,0,6,0,7,0,4,0,3,16,8,0,9,0
  3532.     DATA 10,0,8,0,3,14,4,0,3,0,4,0,7,0,11,0
  3533.     DATA 5,0,3,16,12,0,13,0,14,0,15,0,16,0,8,0
  3534.     DATA 3,12,4,0,3,0,17,0,18,0,19,0,20,0,18,0
  3535.     DATA 17,0,3,12,4,0,3,0,8,0,21,0,22,0,23,0
  3536.     DATA 24,0,12,0,3,12,4,0,3,0,25,0,26,0,20,0
  3537.     DATA 27,0,23,0,28,0,29,0,8,0,3,10,4,1,30,0
  3538.     DATA 31,0,32,0,27,1,33,0,34,0,30,0,3,11,4,0
  3539.     DATA 8,0,35,0,36,0,23,0,27,0,20,0,37,0,38,0
  3540.     DATA 3,12,39,0,40,0,19,0,27,2,23,0,41,0,42,0
  3541.     DATA 5,0,3,10,43,0,44,0,45,0,27,3,46,0,47,0
  3542.     DATA 48,0,3,10,5,0,49,0,36,0,23,0,27,2,20,0
  3543.     DATA 13,0,50,0,3,10,51,0,52,0,53,0,27,1,54,0
  3544.     DATA 55,0,27,0,23,0,56,0,57,0,5,0,3,8,43,0
  3545.     DATA 34,0,58,0,27,1,59,1,27,1,45,0,18,0,48,0
  3546.     DATA 3,8,5,0,49,0,60,0,23,0,27,0,55,0,54,0
  3547.     DATA 27,1,53,0,26,0,61,0,3,5,4,2,62,0,63,0
  3548.     DATA 53,0,27,1,64,0,65,0,66,0,55,0,27,0,23,0
  3549.     DATA 67,0,57,0,5,0,3,4,4,0,3,0,68,0,69,0
  3550.     DATA 70,0,27,1,71,0,72,0,73,0,71,0,27,1,58,0
  3551.     DATA 74,0,51,0,3,4,4,1,5,0,49,0,75,0,23,0
  3552.     DATA 27,0,55,0,66,0,65,0,64,0,27,1,19,0,76,0
  3553.     DATA 77,0,4,0,3,2,4,2,78,0,79,0,20,0,27,1
  3554.     DATA 64,0,65,0,80,0,81,0,66,0,55,0,27,0,23,0
  3555.     DATA 56,0,42,0,82,0,3,2,4,0,3,0,83,0,84,0
  3556.     DATA 53,0,27,1,85,0,72,0,80,1,73,0,71,0,27,1
  3557.     DATA 53,0,86,0,51,0,3,2,4,0,3,0,8,0,49,0
  3558.     DATA 60,0,23,0,27,0,55,0,87,0,88,0,80,0,65,0
  3559.     DATA 89,0,27,1,20,0,79,0,90,0,4,0,3,2,4,0
  3560.     DATA 78,0,91,0,92,0,27,1,89,0,65,0,80,0,93,0
  3561.     DATA 80,0,88,0,94,0,55,0,27,0,23,0,95,0,96,0
  3562.     DATA 8,0,3,2,97,0,26,0,53,0,27,1,71,0,72,0
  3563.     DATA 80,0,93,1,80,0,73,0,71,0,27,1,19,0,13,0
  3564.     DATA 12,0,3,2,8,0,35,0,36,0,23,0,27,0,55,0
  3565.     DATA 66,0,98,0,80,0,93,0,80,0,99,0,89,0,27,1
  3566.     DATA 92,0,91,0,90,0,4,0,3,0,4,0,51,0,100,0
  3567.     DATA 92,0,27,1,64,0,65,0,80,0,93,2,80,0,88,0
  3568.     DATA 66,0,55,0,27,0,23,0,95,0,35,0,101,0,3,0
  3569.     DATA 30,0,86,0,19,0,27,1,85,0,72,0,80,0,93,3
  3570.     DATA 80,0,73,0,85,0,27,1,19,0,40,0,102,0,3,0
  3571.     DATA 4,0,21,0,36,0,23,0,27,0,55,0,87,0,98,0
  3572.     DATA 80,0,93,2,80,0,65,0,89,0,27,1,92,0,103,0
  3573.     DATA 50,0,4,0,104,0,105,0,106,0,27,1,107,0,99,0
  3574.     DATA 80,0,93,4,80,0,81,0,66,0,55,0,27,0,23,0
  3575.     DATA 108,0,109,0,8,0,24,0,20,0,27,1,85,0,72,0
  3576.     DATA 80,0,93,5,80,0,73,0,71,0,27,1,20,0,110,0
  3577.     DATA 5,0,7,0,22,0,23,0,27,0,55,0,66,0,88,0
  3578.     DATA 80,0,93,4,80,0,99,0,64,0,27,1,23,0,111,0
  3579.     DATA 51,0,112,0,23,0,27,1,113,0,114,0,80,0,93,6
  3580.     DATA 80,0,81,0,87,0,55,0,27,0,23,0,115,0,116,0
  3581.     DATA 14,0,27,1,117,0,65,0,80,0,93,7,80,0,65,0
  3582.     DATA 107,0,27,1,14,0,116,0,118,0,23,0,27,0,55,0
  3583.     DATA 119,0,81,0,80,0,93,6,80,0,120,0,121,0,27,1
  3584.     DATA 23,0,75,0,27,1,55,0,113,0,98,0,93,10,80,0
  3585.     DATA 66,0,122,0,27,4,107,0,99,0,93,11,99,0,64,0
  3586.     DATA 27,4,122,0,66,0,80,0,93,10,98,0,121,0,55,0
  3587.     DATA 27,3,113,0,123,0,93,12,80,0,87,0,122,0,27,2
  3588.     DATA 117,0,99,0,93,13,99,0,107,0,27,2,122,0,119,0
  3589.     DATA 81,0,93,12,123,0,121,0,27,2,113,0,123,0,93,6
  3590.     DATA 124,0,93,6,80,0,66,0,122,0,27,0,107,0,99,0
  3591.     DATA 93,6,125,1,93,6,99,0,64,0,27,0,126,0,66,0
  3592.     DATA 81,0,93,6,124,0,93,6,98,0,121,0,55,0,113,0
  3593.     DATA 123,0,93,6,124,0,127,0,128,0,93,6,80,0,66,0
  3594.     DATA 64,0,99,0,93,6,125,0,129,1,125,0,93,6,99,0
  3595.     DATA 64,0,87,0,81,0,93,6,130,0,127,0,124,0,93,6
  3596.     DATA 123,0,121,0,98,0,93,6,124,0,131,0,132,1,128,0
  3597.     DATA 93,6,80,0,114,0,93,6,133,0,134,0,132,1,134,0
  3598.     DATA 133,0,93,6,114,0,80,0,93,6,128,0,135,0,132,0
  3599.     DATA 131,0,136,0,93,6,98,0,93,6,124,0,131,0,132,0
  3600.     DATA 137,0,132,0,138,0,128,0,93,13,133,0,139,0,132,0
  3601.     DATA 137,1,132,0,134,0,133,0,93,13,128,0,138,0,132,0
  3602.     DATA 137,0,132,0,131,0,124,0,93,12,136,0,131,0,132,0
  3603.     DATA 137,2,132,0,138,0,128,0,93,11,133,0,134,0,132,0
  3604.     DATA 137,3,132,0,134,0,133,0,93,11,128,0,138,0,132,0
  3605.     DATA 137,2,132,0,131,0,140,0,93,10,124,0,131,0,132,0
  3606.     DATA 137,4,132,0,138,0,128,0,93,9,133,0,139,0,132,0
  3607.     DATA 137,5,132,0,134,0,133,0,93,9,128,0,138,0,132,0
  3608.     DATA 137,4,132,0,131,0,124,0,93,8,141,0,142,0,132,0
  3609.     DATA 137,6,132,0,138,0,128,0,93,7,124,0,127,0,132,0
  3610.     DATA 137,7,132,0,131,0,124,0,93,7,128,0,138,0,132,0
  3611.     DATA 137,6,132,0,142,0,141,0,93,6,124,0,142,0,132,0
  3612.     DATA 137,8,132,0,138,0,128,0,93,5,124,0,143,0,132,0
  3613.     DATA 137,9,132,0,131,0,124,0,93,5,130,0,138,0,132,0
  3614.     DATA 137,8,132,0,142,0,140,0,93,4,140,0,138,0,137,12
  3615.     DATA 132,0,128,0,93,3,124,0,131,0,137,13,131,0,124,0
  3616.     DATA 93,3,130,0,132,0,137,12,138,0,141,0,93,2,124,0
  3617.     DATA 138,0,137,14,132,0,128,0,93,1,124,0,131,0,137,15
  3618.     DATA 131,0,124,0,93,1,130,0,132,0,137,14,138,0,144,0
  3619.     DATA 93,0,140,0,138,0,137,16,132,0,128,0,124,0,131,0
  3620.     DATA 137,17,131,0,124,0,130,0,132,0,137,16,138,0,141,0
  3621.     DATA 138,0,137,18,132,0,145,0,137,19,145,0,132,0,137,18
  3622.     DATA 138,0,137,73,132,0,137,62,146,0,138,0,137,18,147,1
  3623.     DATA 137,18,138,0,146,0,137,18,146,0,124,0,148,0,138,0
  3624.     DATA 137,16,147,0,140,1,147,0,137,16,138,0,149,0,133,0
  3625.     DATA 134,0,137,16,134,0,133,0,93,1,141,0,138,0,137,14
  3626.     DATA 147,0,136,0,93,1,124,0,147,0,137,14,138,0,148,0
  3627.     DATA 93,1,133,0,134,0,137,14,146,0,133,0,93,3,141,0
  3628.     DATA 138,0,137,12,147,0,140,0,93,3,140,0,147,0,137,12
  3629.     DATA 135,0,148,0,93,3,133,0,134,0,137,10,132,1,134,0
  3630.     DATA 133,0,93,5,148,0,138,0,132,0,137,7,132,1,147,0
  3631.     DATA 136,0,93,5,124,0,147,0,132,0,137,7,132,1,138,0
  3632.     DATA 149,0,93,5,133,0,134,0,132,0,137,7,132,1,146,0
  3633.     DATA 133,0,93,7,141,0,138,0,132,0,137,6,132,0,131,0
  3634.     DATA 140,0,93,7,136,0,131,0,132,0,137,6,132,0,138,0
  3635.     DATA 148,0,93,7,133,0,134,0,132,1,137,4,132,0,135,0
  3636.     DATA 150,0,133,0,93,9,149,0,142,0,132,0,137,4,132,0
  3637.     DATA 146,0,133,0,93,9,133,0,134,0,132,0,137,4,132,0
  3638.     DATA 142,0,149,0,93,10,151,0,135,0,132,0,137,2,132,0
  3639.     DATA 135,0,129,0,93,12,149,0,142,0,132,0,137,2,132,0
  3640.     DATA 146,0,133,0,93,11,133,0,146,0,132,0,137,2,132,0
  3641.     DATA 142,0,149,0,93,12,129,0,135,0,132,0,137,0,132,1
  3642.     DATA 129,0,93,14,149,0,142,0,132,2,146,0,133,0,93,13
  3643.     DATA 133,0,146,0,132,2,142,0,149,0,93,14,129,0,135,0
  3644.     DATA 132,1,129,0,93,16,149,0,138,0,132,0,146,0,133,0
  3645.     DATA 93,15,133,0,134,0,132,0,138,0,149,0,93,16,129,0
  3646.     DATA 132,0,151,0,93,18,148,0,152,0,133,0,93,17,133,0
  3647.     DATA 152,0,148,0,93,18,128,0,93,20,125,0,93,19,125,0
  3648.     DATA 93,158,153,0,125,0,93,18,140,1,93,19,129,0,93,18
  3649.     DATA 129,0,132,0,154,0,125,0,93,16,140,0,135,1,140,0
  3650.     DATA 93,17,146,0,132,0,146,0,93,16,129,0,132,0,137,0
  3651.     DATA 132,0,147,0,124,0,93,14,141,0,135,0,137,1,135,0
  3652.     DATA 148,0,93,14,125,0,146,0,132,0,137,0,132,0,127,0
  3653.     DATA 93,14,129,0,132,0,137,2,132,0,147,0,124,0,93,12
  3654.     DATA 148,0,142,0,137,3,138,0,149,0,93,12,125,0,146,0
  3655.     DATA 132,0,137,2,132,0,134,0,125,0,93,10,133,0,129,0
  3656.     DATA 135,0,137,4,132,0,131,0,136,0,93,10,149,0,142,0
  3657.     DATA 137,5,138,0,149,0,93,10,133,0,134,0,132,0,137,4
  3658.     DATA 132,0,146,0,133,0,93,8,133,0,134,0,132,0,137,6
  3659.     DATA 132,0,131,0,140,0,93,8,149,0,142,0,137,7,142,0
  3660.     DATA 128,0,125,0,93,7,124,0,146,0,132,0,137,6,132,0
  3661.     DATA 134,0,133,0,93,6,133,0,134,0,132,0,137,9,142,0
  3662.     DATA 149,0,93,6,149,0,142,0,137,9,135,0,129,0,125,0
  3663.     DATA 93,5,136,0,131,0,132,0,137,8,132,0,134,0,133,0
  3664.     DATA 93,4,125,0,134,0,132,0,137,11,142,0,148,0,93,4
  3665.     DATA 149,0,142,0,137,11,138,0,129,0,93,4,124,0,131,0
  3666.     DATA 132,0,137,10,132,0,134,0,133,0,93,3,134,0,132,0
  3667.     DATA 137,13,142,0,149,0,93,2,148,0,142,0,137,13,135,0
  3668.     DATA 129,0,93,2,124,0,131,0,132,0,137,12,132,0,146,0
  3669.     DATA 125,0,93,1,129,0,132,0,137,15,138,0,140,0,93,0
  3670.     DATA 141,0,142,0,137,15,135,0,129,0,93,0,124,0,131,0
  3671.     DATA 132,0,137,14,132,0,134,0,93,0,150,0,132,0,137,17
  3672.     DATA 135,0,150,0,135,0,137,17,132,0,155,0,147,0,132,0
  3673.     DATA 137,16,132,0,127,0,132,0,137,19,132,0,137,19,132,1
  3674.     DATA 137,18,132,0
  3675.  
  3676.     ' Crate
  3677.     DATA 423,4282460194,4283248930,4281212195,4283511331
  3678.     DATA 4284759589,4285219623,4285876779,4286205228
  3679.     DATA 4286336558,4286271022,4286139436,4285810986
  3680.     DATA 4284825381,4282000418,4286204972,4287519283
  3681.     DATA 4289359165,4290016323,4290147908,4289884994
  3682.     DATA 4289227836,4287322161,4286139435,4285350952
  3683.     DATA 4285876778,4287453746,4286008107,4287979317
  3684.     DATA 4289819200,4289950529,4289753407,4287716660
  3685.     DATA 4287387954,4286271021,4289490750,4287913781
  3686.     DATA 4285482537,4288176438,4289556285,4289622078
  3687.     DATA 4287519538,4282329110,4285811240,4289359164
  3688.     DATA 4285219878,4282526231,4288176694,4287782196
  3689.     DATA 4285548072,4288110646,4288702009,4285942571
  3690.     DATA 4290082372,4289424957,4282854681,4278190080
  3691.     DATA 4281409553,4288702265,4287913780,4280949518
  3692.     DATA 4284234528,4285613865,4288307767,4289227580
  3693.     DATA 4288307511,4285942315,4286468397,4281672210
  3694.     DATA 4284891428,4289030715,4284300321,4281738003
  3695.     DATA 4287322417,4287519539,4287979573,4289162044
  3696.     DATA 4288241975,4287716404,4286073900,4287847989
  3697.     DATA 4289293628,4288504887,4289030458,4289162043
  3698.     DATA 4288899130,4289424956,4287650867,4288570680
  3699.     DATA 4286599725,4288767801,4287847988,4288833338
  3700.     DATA 4288504888,4289030714,4287585075,4288045109
  3701.     DATA 4288439351,4288899386,4289884993,4282000660
  3702.     DATA 4279569671,4284037407,4289424700,4285416744
  3703.     DATA 4285351208,4285285416,4285548073,4288110902
  3704.     DATA 4283183387,4279307014,4283249179,4281803539
  3705.     DATA 4279438342,4283906079,4289096251,4288439352
  3706.     DATA 4288964922,4289490751,4287453492,4284693795
  3707.     DATA 4282854422,4282722837,4282657301,4282394387
  3708.     DATA 4282788629,4282920214,4282723093,4282460180
  3709.     DATA 4282591509,4282985751,4282854167,4284891172
  3710.     DATA 4287387955,4289950785,4289622080,4283117594
  3711.     DATA 4279306757,4288308022,4286139690,4289030459
  3712.     DATA 4288701753,4288505143,4287125296,4288570936
  3713.     DATA 4290148165,4287519541,4285022501,4284365346
  3714.     DATA 4285679401,4286270764,4285285159,4284628259
  3715.     DATA 4285088294,4286533677,4285153831,4285088038
  3716.     DATA 4287650869,4290147909,4290082115,4287191088
  3717.     DATA 4289490493,4285679658,4290279237,4290016578
  3718.     DATA 4288373559,4286139947,4288702264,4284168992
  3719.     DATA 4279898377,4283643421,4289687871,4290213701
  3720.     DATA 4287782198,4285416745,4285942316,4286205230
  3721.     DATA 4286073901,4284956710,4286533679,4287256370
  3722.     DATA 4286402351,4286073645,4285810987,4287519284
  3723.     DATA 4286402094,4285876780,4287847990,4290082114
  3724.     DATA 4286074154,4280029449,4282657560,4288373815
  3725.     DATA 4278386945,4282657816,4289687614,4290279494
  3726.     DATA 4287387956,4285482281,4287519540,4290213702
  3727.     DATA 4285482791,4278321408,4288308023,4290147910
  3728.     DATA 4285942572,4290016579,4286731054,4287716659
  3729.     DATA 4289490749,4290279238,4287585077,4286204973
  3730.     DATA 4288636473,4287716406,4286993713,4290213445
  3731.     DATA 4288570424,4288044854,4285614122,4286993712
  3732.     DATA 4287453748,4286336557,4285745194,4287585076
  3733.     DATA 4288570681,4286665006,4284628258,4288439095
  3734.     DATA 4286796592,4285285160,4286796591,4286008108
  3735.     DATA 4284299808,4287256369,4286139437,4287453747
  3736.     DATA 4290082373,4283971358,4283051287,4286008364
  3737.     DATA 4283773980,4282263058,4283905566,4286928175
  3738.     DATA 4288636217,4288504632,4288176182,4286665262
  3739.     DATA 4283642652,4282328595,4284102688,4283774237
  3740.     DATA 4283840029,4286927919,4288767545,4290082371
  3741.     DATA 4287519285,4285482536,4286730799,4283708444
  3742.     DATA 4284102687,4285810731,4286205229,4285745195
  3743.     DATA 4287125040,4288439096,4289687870,4286862127
  3744.     DATA 4285876523,4283445787,4282131474,4284431137
  3745.     DATA 4287125041,4290147907,4286927920,4283971102
  3746.     DATA 4284234016,4283314202,4282197266,4290082117
  3747.     DATA 4288176439,4283773981,4282000145,4284825378
  3748.     DATA 4286665007,4285613866,4284102686,4289556286
  3749.     DATA 4289424958,4287190833,4286862128,4286665263
  3750.     DATA 4284234014,4289491006,4283379995,4287321906
  3751.     DATA 4287059249,4286533678,4282394388,4285088295
  3752.     DATA 4282131730,4290345030,4284036894,4284037151
  3753.     DATA 4283839773,4284168223,4290345031,4283905565
  3754.     DATA 4283577116,4288373303,4290147651,4289359422
  3755.     DATA 4282460179,4284036895,4284365601,4289096250
  3756.     DATA 4286796336,4290016322,4285876522,4290148164
  3757.     DATA 4285088039,4286993456,4285153830,4286468143
  3758.     DATA 4282263059,4283511579,4283511323,4287059248
  3759.     DATA 4290213444,4283708701,4285745451,4283642908
  3760.     DATA 4282197522,4284365345,4283839774,4283840030
  3761.     DATA 4289950786,4282525716,4283905309,4283511324
  3762.     DATA 4284168222,4283379994,4290016580,4287059505
  3763.     DATA 4289293629,4290213700,4282525972,4288505144
  3764.     DATA 4282000401,4284299807,4286665517,4283051802
  3765.     DATA 4286731310,4283708445,4284891174,4284102430
  3766.     DATA 4286993455,4283183131,4285351463,4289227835
  3767.     DATA 4282723352,4286270765,4284760099,4281015055
  3768.     DATA 4285548583,4281935124,4285285926,4284234529
  3769.     DATA 4288768057,4286205739,4283380508,4287256625
  3770.     DATA 4282328851,4284168479,4283314715,4286993967
  3771.     DATA 4280949262,4278584322,4288044853,4286927921
  3772.     DATA 4286270766,4287190834,4283117080,4284890916
  3773.     DATA 4287650868,4289425215,4282394902,4278452993
  3774.     DATA 4282197781,4284103199,4280226571,4285679912
  3775.     DATA 4286073899,4286139692,4287913525,4280095242
  3776.     DATA 4285220134,4288045110,4287125554,4288768059
  3777.     DATA 4288439353,4287322419,4290082116,4284891684
  3778.     DATA 4280226826,4283446044,4289096507,4282920473
  3779.     DATA 4280292363,4286008362,4289753408,4281672211
  3780.     DATA 4288242230,4281212176,4285877033,4287979318
  3781.     DATA 4287256626,4285154087,4288833593,4288176183
  3782.     DATA 4284759845,4281277987,4280423717,0,1
  3783.     DATA 1,61,2,0,3,0,4,0,5,0,6,0,7,0,8,0
  3784.     DATA 9,0,8,3,9,0,8,46,10,0,11,0,5,0,12,0
  3785.     DATA 13,0,3,0,5,0,14,0,15,0,16,0,17,0,18,51
  3786.     DATA 19,0,20,0,21,0,22,0,23,0,13,0,3,0,24,0
  3787.     DATA 25,0,26,0,27,0,28,0,29,51,30,0,31,0,26,0
  3788.     DATA 32,0,6,0,13,0,3,0,33,0,34,0,35,0,36,0
  3789.     DATA 37,0,38,0,39,0,38,0,40,0,41,0,42,0,38,0
  3790.     DATA 39,37,43,0,44,0,45,0,46,0,39,1,38,0,47,0
  3791.     DATA 48,0,49,0,50,0,51,0,13,0,3,0,8,0,52,0
  3792.     DATA 29,0,49,0,36,0,47,0,53,0,39,0,54,0,55,0
  3793.     DATA 56,0,57,0,39,37,58,0,59,0,55,0,60,0,39,0
  3794.     DATA 43,0,15,0,61,0,62,0,63,0,64,0,65,0,13,0
  3795.     DATA 3,0,9,0,18,0,29,0,38,0,31,0,65,0,47,0
  3796.     DATA 43,0,66,0,67,0,68,0,53,0,39,37,69,0,70,0
  3797.     DATA 71,0,72,0,43,0,73,0,26,0,74,0,38,0,75,0
  3798.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,0
  3799.     DATA 53,0,77,0,78,0,79,0,80,0,81,0,82,0,83,39
  3800.     DATA 84,0,57,0,85,0,86,0,22,0,35,0,53,0,39,0
  3801.     DATA 75,0,76,0,65,0,13,0,3,0,8,0,18,0,29,0
  3802.     DATA 87,0,88,0,89,0,90,0,6,0,47,0,91,0,92,41
  3803.     DATA 93,0,94,0,24,0,95,0,96,0,88,0,97,0,75,0
  3804.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,98,0,99,0
  3805.     DATA 100,0,101,0,102,0,31,0,103,0,104,0,105,5,104,0
  3806.     DATA 106,27,23,0,105,5,103,0,23,0,107,0,20,0,108,0
  3807.     DATA 109,0,110,0,75,0,76,0,65,0,13,0,3,0,8,0
  3808.     DATA 18,0,98,0,111,0,112,0,113,0,114,0,82,0,103,0
  3809.     DATA 115,0,116,3,75,0,117,0,118,0,119,0,120,0,121,3
  3810.     DATA 122,0,123,0,124,0,125,0,126,0,121,5,122,0,127,0
  3811.     DATA 128,0,129,0,121,4,130,0,131,0,132,0,69,0,116,4
  3812.     DATA 27,0,106,0,133,0,134,0,135,0,136,0,135,0,75,0
  3813.     DATA 76,0,65,0,13,0,3,0,9,0,18,0,29,0,137,0
  3814.     DATA 138,0,89,0,139,0,140,0,23,0,116,0,38,0,141,0
  3815.     DATA 142,0,143,0,39,0,18,0,144,0,145,0,146,0,5,0
  3816.     DATA 23,2,105,0,147,0,148,0,149,0,106,0,23,5,150,0
  3817.     DATA 151,0,152,0,153,0,106,0,23,2,154,0,155,0,156,0
  3818.     DATA 157,0,158,0,39,0,83,0,159,0,95,0,160,0,92,0
  3819.     DATA 161,0,162,0,163,0,164,0,165,0,166,0,75,0,76,0
  3820.     DATA 65,0,13,0,3,0,8,0,18,0,29,0,39,2,139,0
  3821.     DATA 140,0,23,0,116,0,83,0,167,0,168,0,169,0,39,0
  3822.     DATA 170,0,18,0,171,0,172,0,173,0,174,0,175,1,176,0
  3823.     DATA 177,0,178,0,179,0,180,0,175,5,181,0,105,0,182,0
  3824.     DATA 183,0,184,0,175,1,185,0,173,0,186,0,171,0,187,0
  3825.     DATA 39,1,188,0,189,0,190,0,191,0,92,0,161,0,162,0
  3826.     DATA 163,0,39,2,75,0,76,0,65,0,13,0,3,0,8,0
  3827.     DATA 18,0,29,0,39,2,139,0,140,0,23,0,116,0,83,0
  3828.     DATA 108,0,192,0,193,0,39,1,194,0,18,0,195,0,196,0
  3829.     DATA 173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0
  3830.     DATA 175,5,181,0,105,0,182,0,183,0,184,0,175,0,185,0
  3831.     DATA 197,0,198,0,199,0,163,0,39,2,200,0,201,0,56,0
  3832.     DATA 46,0,92,0,161,0,162,0,163,0,39,2,75,0,76,0
  3833.     DATA 65,0,13,0,3,0,8,0,18,0,29,0,39,2,139,0
  3834.     DATA 140,0,23,0,116,0,38,0,202,0,88,0,164,0,39,3
  3835.     DATA 18,0,203,0,196,0,103,0,204,0,176,0,177,0,178,0
  3836.     DATA 179,0,180,0,175,5,181,0,105,0,182,0,183,0,184,0
  3837.     DATA 174,0,173,0,183,0,157,0,205,0,39,3,97,0,206,0
  3838.     DATA 207,0,53,0,92,0,161,0,162,0,163,0,39,2,75,0
  3839.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3840.     DATA 139,0,140,0,23,0,97,0,208,0,39,7,18,0,209,0
  3841.     DATA 210,0,106,0,185,0,177,0,178,0,179,0,180,0,175,5
  3842.     DATA 181,0,105,0,182,0,183,0,211,0,36,0,156,0,199,0
  3843.     DATA 205,0,39,6,38,0,102,0,115,0,161,0,162,0,163,0
  3844.     DATA 39,2,75,0,76,0,65,0,13,0,3,0,8,0,18,0
  3845.     DATA 29,0,39,2,139,0,140,0,23,0,212,0,91,0,53,0
  3846.     DATA 39,6,194,0,18,0,157,0,213,0,103,0,177,0,178,0
  3847.     DATA 179,0,180,0,175,5,181,0,105,0,182,0,214,0,61,0
  3848.     DATA 172,0,215,0,158,0,39,5,38,1,43,0,216,0,217,0
  3849.     DATA 218,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3850.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,103,0
  3851.     DATA 219,0,92,0,89,0,53,0,39,6,170,0,18,0,215,0
  3852.     DATA 220,0,155,0,221,0,179,0,180,0,175,5,181,0,105,0
  3853.     DATA 36,0,222,0,223,0,171,0,158,0,39,6,38,0,43,0
  3854.     DATA 224,0,76,0,225,0,222,0,162,0,163,0,39,2,75,0
  3855.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3856.     DATA 139,0,140,0,48,0,226,0,219,0,227,0,57,0,160,0
  3857.     DATA 39,6,194,0,18,0,203,0,132,0,161,0,228,0,180,0
  3858.     DATA 175,5,181,0,229,0,152,0,183,0,157,0,205,0,39,7
  3859.     DATA 85,0,216,0,76,0,230,0,151,0,231,0,162,0,163,0
  3860.     DATA 39,2,75,0,76,0,65,0,13,0,3,0,8,0,18,0
  3861.     DATA 29,0,39,2,139,0,140,0,48,0,121,0,232,0,233,0
  3862.     DATA 164,0,50,0,38,0,39,7,18,0,203,0,118,0,222,0
  3863.     DATA 234,1,175,3,234,0,174,0,150,0,235,0,236,0,158,0
  3864.     DATA 39,6,38,1,216,0,76,0,219,0,237,0,238,0,239,0
  3865.     DATA 162,0,163,0,39,2,75,0,76,0,65,0,13,0,3,0
  3866.     DATA 8,0,18,0,29,0,39,2,139,0,140,0,106,0,240,0
  3867.     DATA 241,0,242,0,243,0,76,0,244,0,53,0,39,7,18,0
  3868.     DATA 209,0,213,0,106,0,174,0,175,3,174,0,36,0,186,0
  3869.     DATA 209,0,158,0,39,6,38,0,102,0,245,0,246,0,247,0
  3870.     DATA 248,0,249,0,250,0,10,0,162,0,163,0,39,2,75,0
  3871.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3872.     DATA 139,0,140,0,61,0,182,0,251,0,127,0,252,0,253,0
  3873.     DATA 227,0,254,0,53,0,39,7,255,0,157,0,256,0,36,0
  3874.     DATA 174,0,234,0,175,0,174,0,257,0,156,0,215,0,158,0
  3875.     DATA 39,5,38,1,43,0,244,0,76,0,258,0,259,0,127,0
  3876.     DATA 260,0,261,0,262,0,162,0,163,0,39,2,75,0,76,0
  3877.     DATA 65,0,13,0,3,0,8,0,18,0,29,0,39,2,139,0
  3878.     DATA 140,0,61,0,234,0,263,0,248,0,123,0,251,0,264,0
  3879.     DATA 265,0,254,0,53,0,39,6,266,0,255,0,157,0,183,0
  3880.     DATA 103,0,174,0,185,0,103,0,198,0,171,0,158,0,194,0
  3881.     DATA 39,5,38,0,43,0,244,0,62,0,267,0,242,0,127,0
  3882.     DATA 237,0,268,0,181,0,262,0,162,0,163,0,39,2,75,0
  3883.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3884.     DATA 139,0,140,0,61,0,234,0,175,0,222,0,269,0,270,0
  3885.     DATA 271,0,272,0,227,0,50,0,160,0,39,6,194,0,273,0
  3886.     DATA 203,0,196,0,229,0,23,0,183,0,157,0,158,0,194,0
  3887.     DATA 39,6,85,0,87,0,76,0,274,0,275,0,249,0,276,0
  3888.     DATA 182,0,175,0,181,0,262,0,162,0,163,0,39,2,75,0
  3889.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3890.     DATA 139,0,140,0,61,0,234,0,175,1,173,0,277,0,278,0
  3891.     DATA 232,0,219,0,62,0,224,0,38,0,39,7,158,0,279,0
  3892.     DATA 198,0,186,0,199,0,158,0,39,6,38,0,160,0,92,0
  3893.     DATA 280,0,230,0,281,0,282,0,283,0,284,0,175,1,181,0
  3894.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3895.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3896.     DATA 234,0,175,1,285,0,154,0,286,0,123,0,242,0,253,0
  3897.     DATA 76,0,212,0,53,0,39,7,287,0,288,0,209,0,158,0
  3898.     DATA 39,6,38,0,102,0,87,0,246,0,247,0,248,0,278,0
  3899.     DATA 251,0,289,0,290,0,175,1,181,0,262,0,162,0,163,0
  3900.     DATA 39,2,75,0,76,0,65,0,13,0,3,0,8,0,18,0
  3901.     DATA 29,0,39,2,139,0,140,0,61,0,234,0,175,1,285,0
  3902.     DATA 154,0,291,0,292,0,127,0,242,0,253,0,227,0,50,0
  3903.     DATA 53,0,39,5,85,0,293,0,171,0,158,0,39,6,38,0
  3904.     DATA 43,0,244,0,76,0,258,0,248,0,127,0,294,0,150,0
  3905.     DATA 295,0,290,0,175,1,181,0,262,0,162,0,163,0,39,2
  3906.     DATA 75,0,76,0,65,0,13,0,3,0,8,0,18,0,29,0
  3907.     DATA 39,2,139,0,140,0,61,0,234,0,175,1,285,0,154,0
  3908.     DATA 296,0,297,0,248,0,298,0,242,0,289,0,265,0,50,0
  3909.     DATA 53,0,39,3,85,0,34,0,195,0,18,0,194,0,39,5
  3910.     DATA 287,0,16,0,244,0,62,0,274,0,281,0,123,0,242,0
  3911.     DATA 299,0,197,0,295,0,290,0,175,0,234,0,181,0,262,0
  3912.     DATA 162,0,163,0,39,2,75,0,76,0,65,0,13,0,3,0
  3913.     DATA 8,0,18,0,29,0,39,2,139,0,140,0,61,0,234,0
  3914.     DATA 175,1,285,0,154,0,296,1,182,0,281,0,300,0,232,0
  3915.     DATA 219,0,227,0,244,0,208,0,39,1,160,0,34,0,301,0
  3916.     DATA 158,0,39,7,160,0,216,0,64,0,230,0,302,0,300,0
  3917.     DATA 303,0,6,0,197,1,295,0,290,0,175,0,234,0,181,0
  3918.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3919.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3920.     DATA 234,0,175,1,285,0,154,0,296,1,175,0,231,0,304,0
  3921.     DATA 278,0,305,0,219,0,62,0,244,0,38,0,160,0,39,0
  3922.     DATA 306,0,158,0,39,7,160,0,216,0,280,0,230,0,307,0
  3923.     DATA 300,0,260,0,231,0,175,0,197,1,295,0,290,0,175,1
  3924.     DATA 181,0,262,0,162,0,163,0,39,2,75,0,76,0,65,0
  3925.     DATA 13,0,3,0,8,0,18,0,29,0,39,2,139,0,140,0
  3926.     DATA 61,0,234,0,175,1,285,0,154,0,296,1,175,1,234,0
  3927.     DATA 308,0,249,0,242,0,253,0,309,0,114,0,287,0,301,0
  3928.     DATA 310,0,39,7,53,0,244,0,280,0,247,0,248,0,249,0
  3929.     DATA 242,0,176,0,175,1,197,1,295,0,290,0,175,1,181,0
  3930.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3931.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3932.     DATA 234,0,175,1,285,0,154,0,296,1,175,2,182,0,248,0
  3933.     DATA 127,0,260,0,25,0,311,0,162,0,18,0,194,0,39,6
  3934.     DATA 53,0,50,0,309,0,272,0,242,0,312,0,252,0,182,0
  3935.     DATA 175,2,197,1,295,0,290,0,175,1,181,0,262,0,162,0
  3936.     DATA 163,0,39,2,75,0,76,0,65,0,13,0,3,0,8,0
  3937.     DATA 18,0,29,0,39,2,139,0,140,0,61,0,234,0,175,1
  3938.     DATA 285,0,154,0,296,1,175,3,263,0,313,0,314,0,186,0
  3939.     DATA 195,0,310,0,194,0,39,6,53,0,212,0,92,0,116,0
  3940.     DATA 15,0,276,0,260,0,182,0,175,2,234,0,197,1,295,0
  3941.     DATA 290,0,175,1,181,0,262,0,162,0,163,0,39,2,75,0
  3942.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3943.     DATA 139,0,140,0,61,0,234,0,175,1,285,0,154,0,296,1
  3944.     DATA 175,3,174,0,23,0,220,0,209,0,310,0,194,0,39,6
  3945.     DATA 38,0,244,0,164,0,82,0,39,0,157,0,132,0,5,0
  3946.     DATA 174,0,175,3,197,1,295,0,290,0,175,0,234,0,181,0
  3947.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3948.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3949.     DATA 234,0,175,1,285,0,154,0,296,1,175,1,234,0,174,0
  3950.     DATA 36,0,210,0,157,0,310,0,39,7,38,0,244,0,309,0
  3951.     DATA 82,0,160,0,39,0,163,0,157,0,183,0,197,0,174,0
  3952.     DATA 234,0,175,1,197,1,295,0,290,0,175,1,181,0,262,0
  3953.     DATA 162,0,163,0,39,2,75,0,76,0,65,0,13,0,3,0
  3954.     DATA 8,0,18,0,29,0,39,2,139,0,140,0,61,0,234,0
  3955.     DATA 175,1,285,0,154,0,296,1,175,1,231,0,106,0,156,0
  3956.     DATA 209,0,18,0,39,7,53,0,244,0,227,0,114,0,38,0
  3957.     DATA 39,2,158,0,157,0,210,0,106,0,231,0,175,1,197,1
  3958.     DATA 295,0,290,0,175,1,181,0,262,0,162,0,163,0,39,2
  3959.     DATA 75,0,76,0,65,0,13,0,3,0,8,0,18,0,29,0
  3960.     DATA 39,2,139,0,140,0,61,0,234,0,175,1,285,0,154,0
  3961.     DATA 296,1,175,0,185,0,173,0,186,0,171,0,310,0,194,0
  3962.     DATA 39,6,53,0,50,0,245,0,114,0,38,0,39,4,158,0
  3963.     DATA 157,0,213,0,197,0,174,0,175,0,197,1,295,0,290,0
  3964.     DATA 175,0,234,0,181,0,262,0,162,0,163,0,39,2,75,0
  3965.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3966.     DATA 139,0,140,0,61,0,234,0,175,1,285,0,154,0,296,1
  3967.     DATA 185,0,103,0,183,0,209,0,310,0,194,0,39,6,53,0
  3968.     DATA 50,0,92,0,315,0,160,0,39,5,194,0,158,0,157,0
  3969.     DATA 118,0,103,0,174,0,197,1,295,0,290,0,175,1,181,0
  3970.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3971.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3972.     DATA 234,0,175,1,285,0,154,0,296,0,316,0,103,0,183,0
  3973.     DATA 157,0,273,0,194,0,39,6,38,0,244,0,309,0,116,0
  3974.     DATA 114,0,38,0,39,7,317,0,236,0,196,0,173,0,229,0
  3975.     DATA 197,0,295,0,290,0,175,0,234,0,181,0,262,0,162,0
  3976.     DATA 163,0,39,2,75,0,76,0,65,0,13,0,3,0,8,0
  3977.     DATA 18,0,29,0,39,2,139,0,140,0,61,0,234,0,175,1
  3978.     DATA 285,0,154,0,258,0,318,0,223,0,144,0,319,0,39,7
  3979.     DATA 38,0,244,0,76,0,272,0,21,0,309,0,216,0,38,0
  3980.     DATA 287,0,39,6,158,0,236,0,118,0,320,0,197,0,179,0
  3981.     DATA 290,0,175,1,181,0,262,0,162,0,163,0,39,2,75,0
  3982.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  3983.     DATA 139,0,140,0,61,0,234,0,175,1,285,0,155,0,161,0
  3984.     DATA 172,0,195,0,273,0,39,7,53,0,244,0,280,0,247,0
  3985.     DATA 242,0,260,0,243,0,62,0,216,0,16,0,287,0,39,6
  3986.     DATA 317,0,157,0,213,0,103,0,321,0,290,0,175,1,181,0
  3987.     DATA 262,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  3988.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,61,0
  3989.     DATA 234,0,175,1,36,0,322,0,156,0,171,0,18,0,170,0
  3990.     DATA 39,6,53,0,254,0,62,0,230,0,248,0,278,0,249,0
  3991.     DATA 242,0,219,0,227,0,244,0,43,0,287,0,39,6,205,0
  3992.     DATA 236,0,256,0,318,0,323,0,175,0,234,0,181,0,262,0
  3993.     DATA 162,0,163,0,39,2,75,0,76,0,65,0,13,0,3,0
  3994.     DATA 8,0,18,0,29,0,39,2,139,0,140,0,61,0,234,0
  3995.     DATA 175,0,185,0,23,0,235,0,195,0,18,0,170,0,39,6
  3996.     DATA 53,0,254,0,62,0,230,0,242,0,324,0,325,0,326,0
  3997.     DATA 298,0,260,0,327,0,227,0,244,0,43,0,38,0,39,6
  3998.     DATA 205,0,157,0,220,0,106,0,174,0,175,0,181,0,262,0
  3999.     DATA 162,0,163,0,39,2,75,0,76,0,65,0,13,0,3,0
  4000.     DATA 8,0,18,0,29,0,39,2,139,0,140,0,61,0,234,0
  4001.     DATA 174,0,103,0,183,0,157,0,328,0,194,0,39,6,38,0
  4002.     DATA 50,0,62,0,274,0,313,0,300,0,329,0,182,0,330,0
  4003.     DATA 331,0,332,0,333,0,272,0,164,0,216,0,85,0,39,7
  4004.     DATA 205,0,236,0,196,0,173,0,231,0,181,0,262,0,162,0
  4005.     DATA 163,0,39,2,75,0,76,0,65,0,13,0,3,0,8,0
  4006.     DATA 18,0,29,0,39,2,139,0,140,0,61,0,268,0,36,0
  4007.     DATA 172,0,195,0,18,0,39,7,208,0,244,0,246,0,258,0
  4008.     DATA 334,0,300,0,242,0,176,0,175,1,176,0,335,0,300,0
  4009.     DATA 275,0,253,0,64,0,265,0,85,0,38,0,39,6,336,0
  4010.     DATA 199,0,213,0,36,0,268,0,262,0,162,0,163,0,39,2
  4011.     DATA 75,0,76,0,65,0,13,0,3,0,8,0,18,0,29,0
  4012.     DATA 39,2,139,0,140,0,48,0,36,0,156,0,195,0,18,0
  4013.     DATA 39,7,53,0,50,0,76,0,247,0,259,0,337,0,338,0
  4014.     DATA 231,0,175,3,181,0,251,0,324,0,334,0,253,0,62,0
  4015.     DATA 216,0,43,0,38,0,39,6,317,0,157,0,256,0,36,0
  4016.     DATA 78,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  4017.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,103,0
  4018.     DATA 235,0,162,0,18,0,170,0,39,6,53,0,89,0,62,0
  4019.     DATA 230,0,339,0,127,0,340,0,174,0,175,5,263,0,341,0
  4020.     DATA 298,0,302,0,219,0,164,0,87,0,43,0,38,0,39,6
  4021.     DATA 205,0,342,0,343,0,161,0,162,0,163,0,39,2,75,0
  4022.     DATA 76,0,65,0,13,0,3,0,8,0,18,0,29,0,39,2
  4023.     DATA 139,0,140,0,23,0,344,0,345,0,170,0,39,6,53,0
  4024.     DATA 254,0,62,0,274,0,335,0,300,0,302,0,284,0,180,0
  4025.     DATA 175,5,181,0,177,0,277,0,346,0,260,0,272,0,227,0
  4026.     DATA 87,0,43,0,38,0,39,6,336,0,347,0,161,0,162,0
  4027.     DATA 163,0,39,2,75,0,76,0,65,0,13,0,3,0,8,0
  4028.     DATA 18,0,29,0,39,2,139,0,140,0,23,0,69,0,194,0
  4029.     DATA 39,6,38,0,50,0,62,0,267,0,313,0,348,0,277,0
  4030.     DATA 7,0,179,0,180,0,175,5,181,0,105,0,36,0,349,0
  4031.     DATA 278,0,232,0,327,0,164,0,92,0,160,0,39,7,92,0
  4032.     DATA 161,0,162,0,163,0,39,2,75,0,76,0,65,0,13,0
  4033.     DATA 3,0,8,0,18,0,29,0,39,2,139,0,140,0,23,0
  4034.     DATA 116,0,208,0,350,0,351,0,352,0,39,2,208,0,254,0
  4035.     DATA 246,0,258,0,281,0,300,0,353,0,354,0,178,0,179,0
  4036.     DATA 180,0,175,5,181,0,105,0,182,0,132,0,355,0,278,0
  4037.     DATA 302,0,356,0,64,0,245,0,85,0,38,0,39,1,37,0
  4038.     DATA 357,0,358,0,359,0,92,0,161,0,162,0,163,0,39,2
  4039.     DATA 75,0,76,0,65,0,13,0,3,0,8,0,18,0,29,0
  4040.     DATA 39,2,139,0,140,0,23,0,116,1,360,0,55,0,71,0
  4041.     DATA 39,1,53,0,254,0,76,0,247,0,248,0,249,0,248,0
  4042.     DATA 185,0,177,0,178,0,179,0,180,0,175,5,181,0,105,0
  4043.     DATA 182,0,183,0,361,0,259,0,123,0,242,0,253,0,62,0
  4044.     DATA 216,0,43,0,38,0,39,0,362,0,55,0,363,0,90,0
  4045.     DATA 92,0,161,0,162,0,163,0,39,2,75,0,76,0,65,0
  4046.     DATA 13,0,3,0,8,0,18,0,29,0,39,2,139,0,140,0
  4047.     DATA 23,0,116,0,43,0,364,0,365,0,366,0,39,0,53,0
  4048.     DATA 89,0,62,0,219,0,248,0,123,0,331,0,222,0,176,0
  4049.     DATA 177,0,178,0,179,0,180,0,175,5,181,0,105,0,182,0
  4050.     DATA 183,0,184,0,263,0,259,0,337,0,242,0,289,0,164,0
  4051.     DATA 216,0,80,0,38,0,159,0,99,0,367,0,368,0,92,0
  4052.     DATA 161,0,162,0,163,0,38,0,39,1,75,0,76,0,65,0
  4053.     DATA 13,0,3,0,8,0,18,0,29,0,369,0,370,0,371,0
  4054.     DATA 139,0,140,0,23,0,116,0,38,0,80,0,143,0,43,0
  4055.     DATA 38,0,116,0,164,0,230,0,237,0,278,0,251,0,263,0
  4056.     DATA 175,0,176,0,177,0,178,0,179,0,180,0,175,3,234,0
  4057.     DATA 175,0,181,0,105,0,182,0,183,0,184,0,175,0,263,0
  4058.     DATA 304,0,372,0,373,0,219,0,227,0,92,0,43,0,160,0
  4059.     DATA 57,0,69,0,38,0,92,0,161,0,162,0,317,0,88,0
  4060.     DATA 374,0,375,0,75,0,76,0,65,0,13,0,3,0,8,0
  4061.     DATA 18,0,98,0,376,0,377,0,135,0,114,0,69,0,103,0
  4062.     DATA 378,0,92,4,37,0,247,0,151,0,129,0,252,0,263,0
  4063.     DATA 176,1,231,0,154,0,221,0,379,0,380,0,176,5,231,0
  4064.     DATA 173,0,182,0,381,0,361,0,176,1,330,0,307,0,382,0
  4065.     DATA 383,0,230,0,37,0,115,0,92,3,384,0,106,0,163,0
  4066.     DATA 385,0,386,0,387,0,388,0,75,0,76,0,65,0,13,0
  4067.     DATA 3,0,8,0,18,0,29,0,389,0,390,0,391,0,43,0
  4068.     DATA 73,0,23,0,106,0,148,5,222,0,26,1,392,0,10,4
  4069.     DATA 393,0,7,0,393,0,10,8,7,0,393,0,10,2,392,0
  4070.     DATA 26,1,161,0,148,5,36,0,105,0,394,0,53,0,362,0
  4071.     DATA 395,0,396,0,75,0,76,0,65,0,13,0,3,0,8,0
  4072.     DATA 18,0,29,0,38,0,160,0,43,0,86,0,24,0,397,0
  4073.     DATA 336,0,301,41,310,0,35,0,11,0,79,0,16,0,160,0
  4074.     DATA 38,0,75,0,76,0,65,0,13,0,3,0,8,0,18,0
  4075.     DATA 29,0,39,0,43,0,73,0,22,0,95,0,116,0,398,0
  4076.     DATA 399,0,336,38,29,0,400,0,401,0,20,0,90,0,78,0
  4077.     DATA 77,0,16,0,39,0,75,0,76,0,65,0,13,0,3,0
  4078.     DATA 8,0,402,0,98,0,38,0,15,0,26,0,35,0,53,0
  4079.     DATA 403,0,404,0,405,0,406,0,39,37,87,0,407,0,408,0
  4080.     DATA 409,0,43,0,77,0,26,0,47,0,208,0,20,0,62,0
  4081.     DATA 65,0,13,0,3,0,33,0,410,0,194,0,47,0,61,0
  4082.     DATA 74,0,53,0,39,0,405,0,55,0,411,0,93,0,39,37
  4083.     DATA 412,0,413,0,55,0,68,0,39,0,43,0,31,0,61,0
  4084.     DATA 217,0,208,0,89,0,51,0,13,0,3,0,78,0,83,0
  4085.     DATA 77,0,48,0,202,0,38,0,39,1,116,0,414,0,95,0
  4086.     DATA 38,0,39,37,208,0,86,0,138,0,83,0,39,1,208,0
  4087.     DATA 27,0,106,0,415,0,84,0,26,0,13,0,3,0,318,0
  4088.     DATA 21,0,26,0,107,0,20,0,114,50,406,0,43,0,35,0
  4089.     DATA 65,0,416,0,24,0,13,0,3,0,417,0,22,0,32,0
  4090.     DATA 418,0,164,0,246,0,419,0,246,0,419,1,246,0,419,0
  4091.     DATA 246,0,419,3,246,0,419,3,246,0,419,7,246,0,419,3
  4092.     DATA 246,0,419,3,246,0,419,3,246,0,419,8,280,0,92,0
  4093.     DATA 84,0,289,0,392,0,105,0,13,0,3,0,420,0,105,0
  4094.     DATA 6,0,26,0,51,53,26,0,318,0,105,0,12,0,13,0
  4095.     DATA 421,0,13,61,422,0
  4096.  
  4097.     DIM palCount AS INTEGER
  4098.     DIM pal(4096) AS _UNSIGNED LONG
  4099.     DIM j AS INTEGER
  4100.     FOR i = 0 TO 4
  4101.  
  4102.         READ palCount
  4103.         FOR j = 0 TO palCount - 1
  4104.             READ pal(j)
  4105.         NEXT
  4106.  
  4107.         bm(i) = _NEWIMAGE(64, 64, 32)
  4108.         _DEST bm(i)
  4109.  
  4110.         READ cl
  4111.         READ rleCount
  4112.  
  4113.         FOR y = 0 TO 63
  4114.             FOR x = 0 TO 63
  4115.                 PSET (x, y), pal(cl)
  4116.                 rleCount = rleCount - 1
  4117.                 IF rleCount < 0 THEN
  4118.                     READ cl
  4119.                     READ rleCount
  4120.                 END IF
  4121.             NEXT
  4122.         NEXT
  4123.     NEXT
  4124.  
  4125.     _DEST 0
  4126.  

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Side Scrolling driving Game Demo with 2D physics
« Reply #1 on: April 26, 2021, 01:35:58 am »
LOL luv the bobble head

Oh man!
My hat got stuck!.PNG
* My hat got stuck!.PNG (Filesize: 52.09 KB, Dimensions: 1017x638, Views: 105)

Offline TempodiBasic

  • Forum Resident
  • Posts: 1792
    • View Profile
Re: Side Scrolling driving Game Demo with 2D physics
« Reply #2 on: April 26, 2021, 12:19:27 pm »
Cool!
I find it very fine, also the head bouncing movement!
Thanks to share.
Programming isn't difficult, only it's  consuming time and coffee

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
    • View Profile
Re: Side Scrolling driving Game Demo with 2D physics
« Reply #3 on: April 27, 2021, 05:57:19 am »
This is SO cool... Best part... I didn't die... lol
Logic is the beginning of wisdom.

Offline justsomeguy

  • Newbie
  • Posts: 47
    • View Profile
Re: Side Scrolling driving Game Demo with 2D physics
« Reply #4 on: April 27, 2021, 11:39:33 am »
I'm glad you guys seem to be enjoying it.

I've been working on the back-end stuff to give it more functionality and make it easier to use in your own projects.