CGame.js 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486
  1. function CGame(oData, iLevel) {
  2. var _oBgLevel;
  3. var _oInterface;
  4. var _iLevel;
  5. var _bPause;
  6. var _aBall;
  7. var _aBrick;
  8. var _aBullet;
  9. var _oPadding;
  10. var _pPaddingDim = {};
  11. var _iRadius;
  12. var _iCheckDistance;
  13. var _fPhysicsTime = 0;
  14. var _aBrickSectionUpRight;
  15. var _aBrickSectionUpLeft;
  16. var _aBrickSectionDownRight;
  17. var _aBrickSectionDownLeft;
  18. var _aBrickSectionCenterH;
  19. var _aBrickSectionCenterY;
  20. var _iCanvasWidthHalf;
  21. var _iCanvasHeightHalf;
  22. var _pBrickDim = {};
  23. var _iCenterYDiagram;
  24. var _iTotBrick;
  25. var _iRow;
  26. var _iCenterXDiagram;
  27. var _iOffsetYBricks;
  28. var _iOffsetXBricks;
  29. var _iOffsetBounceYBricks;
  30. var _iOffsetBounceXBrick;
  31. var _iOffsetXPadRight;
  32. var _iOffsetXPadLeft;
  33. var _iOffsetYBallMagnetic;
  34. var _oSettingsLevel;
  35. var _aBonusOccurrence;
  36. var _aBonus;
  37. var _iNum_Of_Bonus_Spawned;
  38. var _iSpaceBetWall;
  39. var _bLaunch;
  40. var _iTimeFireBall;
  41. var _iTimeFloor;
  42. var _iTimeMagnetic;
  43. var _iTimeShot;
  44. var _bAlmostABonus;
  45. var _iTimeReflectBrick;
  46. var _bLargePad;
  47. var _bFireBall;
  48. var _bFloor;
  49. var _bMagnetic;
  50. var _bShot;
  51. var _bSlowBall;
  52. var _bFastBall;
  53. var _bSmallPad;
  54. var _oSpriteBullet;
  55. var _oPowerUpEdge;
  56. var _iLife;
  57. var _iScore;
  58. var _iCurLevelScore;
  59. var _iBulletSPWRate;
  60. var _iFiredBullet;
  61. var _bShotLeft;
  62. var _iSpeedBallRate;
  63. var _iOffsetWallRight;
  64. var _iOffsetWallLeft;
  65. var _iOffsetBrickYPos;
  66. var _iOffsetBrickXPos;
  67. var _iOffsetBrickSectionX;
  68. var _iOffsetBrickSectionY;
  69. var _oDetectiveX = {};
  70. var _oDetectiveY = {};
  71. var _oCannons;
  72. var _iCurAngleRot;
  73. var _fTimeBounce;
  74. var _iLevelAds;
  75. this._init = function (iLevel) {
  76. _bPause = false;
  77. var oSpriteBall = s_oSpriteLibrary.getSprite("normal_ball");
  78. _iNum_Of_Bonus_Spawned = 0;
  79. _iCanvasWidthHalf = CANVAS_WIDTH / 2;
  80. _iCanvasHeightHalf = CANVAS_HEIGHT / 2;
  81. _aBall = new Array();
  82. _aBrick = new Array();
  83. _aBonus = new Array();
  84. _iSpaceBetWall = SPACE_BETWEEN_BRICKS;
  85. _iCheckDistance = 0;
  86. _iTotBrick = 0;
  87. var oSpriteBrick = s_oSpriteLibrary.getSprite("brick0");
  88. _pBrickDim = {x: oSpriteBrick.width / 2, y: oSpriteBrick.height / 2};
  89. _iSpeedBallRate = 1;
  90. _iRadius = (oSpriteBall.height / 2) + OFFSET_RADIUS_BALL;
  91. _iLevel = iLevel;
  92. _iScore = s_oMain.getScoreTillLevel(_iLevel);
  93. _iCurLevelScore = 0;
  94. _fTimeBounce = 0;
  95. _iBulletSPWRate = MAX_TIME_SHOT_BONUS;
  96. _iLife = LIFE;
  97. _oSettingsLevel = new CSettingsLevel();
  98. _aBrickSectionDownLeft = new Array();
  99. _aBrickSectionDownRight = new Array();
  100. _aBrickSectionUpLeft = new Array();
  101. _aBrickSectionUpRight = new Array();
  102. _aBrickSectionCenterH = new Array();
  103. _aBrickSectionCenterY = new Array();
  104. this.createPadding(CANVAS_WIDTH / 2);
  105. _bLargePad = false;
  106. _bFireBall = false;
  107. _bFloor = false;
  108. _bMagnetic = false;
  109. _bShot = false;
  110. _bSlowBall = false;
  111. _bFastBall = false;
  112. _bSmallPad = false;
  113. _bAlmostABonus = false;
  114. _iTimeShot = 0;
  115. _iLevelAds = 0;
  116. var iEdgeRightWidth = -OFFSETEDGERIGHT - _iRadius;
  117. var iEdgeLeftWidth = OFFSETEDGELEFT + _iRadius;
  118. _iOffsetWallRight = CANVAS_WIDTH + iEdgeRightWidth;
  119. _iOffsetWallLeft = iEdgeLeftWidth;
  120. _oBgLevel = createBitmap(s_oSpriteLibrary.getSprite("bg_level_1"));
  121. s_oStage.addChild(_oBgLevel); //Draws on canvas
  122. _oBgLevel.addEventListener("click", this.launchBall);
  123. s_oStage.setChildIndex(_oBgLevel, 0);
  124. _aBonusOccurrence = new Array();
  125. _iOffsetYBricks = _pBrickDim.y + _iRadius + OFFSET_HEIGHT_BRICK;
  126. _iOffsetXBricks = _pBrickDim.x + _iRadius + OFFSET_WIDTH_BRICK;
  127. _iOffsetBounceYBricks = _iOffsetYBricks + OFFSET_Y_BRICK;
  128. _iOffsetBounceXBrick = _iOffsetXBricks + OFFSET_X_BRICK;
  129. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  130. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  131. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  132. _iOffsetYBallMagnetic = OFFSET_PAD_MAGNETIC_Y;
  133. _iOffsetBrickYPos = (_pBrickDim.y * 2) + OFFSET_BRICK_Y_POS;
  134. _iOffsetBrickXPos = (_pBrickDim.x * 2);
  135. _iOffsetBrickSectionX = OFFSET_BRICK_SECTION_X + OFFSET_DETECTION_BRICK_SECTION_X;
  136. _iOffsetBrickSectionY = OFFSET_BRICK_SECTION_Y + OFFSET_DETECTION_BRICK_SECTION_Y;
  137. _iTimeReflectBrick = TIME_REFLECT_IRON_BRICK;
  138. _oInterface = new CInterface(_iScore);
  139. this.createABall(0, _oPadding.x, _oPadding.y - _iRadius - _pPaddingDim.y, oSpriteBall, true);
  140. this.createLevel();
  141. if (_iLevel === 1) {
  142. _oInterface.help(_iLevel);
  143. } else {
  144. _oInterface.showNumLevel(_iLevel);
  145. }
  146. _oInterface.numLevel(_iLevel);
  147. _bShotLeft = true;
  148. _bLaunch = false;
  149. _iFiredBullet = 0;
  150. setVolume("soundtrack", SOUNDTRACK_VOLUME_IN_GAME);
  151. };
  152. this.launchBall = function () {
  153. if (_bLaunch === false && _bPause === false) {
  154. if (_oPadding.x > _iCanvasWidthHalf) {
  155. _oPadding.x -= _iCanvasWidthHalf;
  156. _iCurAngleRot = -(_oPadding.x / _iCanvasWidthHalf);
  157. } else {
  158. _iCurAngleRot = _oPadding.x / _iCanvasWidthHalf;
  159. }
  160. _aBall[0].setPosition(null, _aBall[0].getY() - 3);
  161. _aBall[0].setDirection(_iCurAngleRot, -1);
  162. _aBall[0].setInfoData("OnPad", false);
  163. _bLaunch = true;
  164. } else if (_bMagnetic === true) {
  165. s_oGame.launchUnmagneticBall();
  166. }
  167. };
  168. this.createLevel = function () {
  169. this.setLevelBrick();
  170. document.dispatchEvent(new CustomEvent("start_level", {detail: { level: _iLevel } }));
  171. _aBonusOccurrence = _oSettingsLevel.createBonusOccurance(_iLevel);
  172. };
  173. this.createABall = function (iID, iXPos, iYPos, oSpriteBall, bVal, iXDir, iYDir) {
  174. _aBall[iID] = new CBall(iXPos, iYPos, oSpriteBall, iXDir, iYDir, _iSpeedBallRate, _bFireBall, _iRadius);
  175. _aBall[iID].setInfoData("ID", iID);
  176. _aBall[iID].setInfoData("OnPad", bVal);
  177. _aBall[iID].setInfoData("Collision", 0);
  178. _aBall[iID].changeRotation();
  179. if (_bFloor === true) {
  180. _aBall[iID].downFloor(true);
  181. }
  182. if (bVal === true) {
  183. _bLaunch = false;
  184. }
  185. };
  186. this.generateABonus = function (iXPos, iYPos) {
  187. var iTypeRand = Math.floor(Math.random() * _aBonusOccurrence.length);
  188. var oSpriteBonus = s_oSpriteLibrary.getSprite("bonus" + _aBonusOccurrence[iTypeRand]);
  189. _aBonus.push(new CBonus(iXPos, iYPos, oSpriteBonus, _aBonusOccurrence[iTypeRand]));
  190. _aBonus[_iNum_Of_Bonus_Spawned].setInfoData("ID", _iNum_Of_Bonus_Spawned);
  191. _iNum_Of_Bonus_Spawned++;
  192. };
  193. this.createPadding = function (iXPos) {
  194. if (_oPadding) {
  195. s_oStage.removeChild();
  196. }
  197. var oSprite = s_oSpriteLibrary.getSprite("paddle");
  198. var oData = {
  199. images: [oSprite],
  200. // width, height & registration point of each sprite
  201. frames: {width: oSprite.width / 7, height: oSprite.height / 2, regX: (oSprite.width / 2) / 7, regY: (oSprite.height / 2) / 7},
  202. animations: {
  203. small: {
  204. frames: [0]
  205. },
  206. normal: {
  207. frames: [6]
  208. },
  209. big: {
  210. frames: [12]
  211. },
  212. StoN: {
  213. frames: [1, 2, 3, 4, 5, 6]
  214. },
  215. NtoB: {
  216. frames: [7, 8, 9, 10, 11, 12]
  217. },
  218. BtoN: {
  219. frames: [11, 10, 9, 8, 7, 6]
  220. },
  221. NtoS: {
  222. frames: [5, 4, 3, 2, 1, 0]
  223. }
  224. }
  225. };
  226. var oSpriteSheet = new createjs.SpriteSheet(oData);
  227. _oPadding = createSprite(oSpriteSheet, "normal", (oSprite.width / 2) / 7, (oSprite.height / 2) / 2, oSprite.width / 7, oSprite.height / 2);
  228. _oPadding.x = iXPos;
  229. _oPadding.y = HEIGHT_OF_PADDLE;
  230. s_oStage.addChild(_oPadding);
  231. s_oStage.setChildIndex(_oPadding, 3);
  232. _pPaddingDim = {x: PADDLE_DIMENSION[1] / 2, y: ((oSprite.height / 2) / 2) - OFFSET_PAD_Y};
  233. };
  234. this.setLevelBrick = function () {
  235. var aLevelDiagram = BRICKS_LEVEL_POSITION[_iLevel-1];
  236. var iBrickNum = 0;
  237. var iMakeBrick = 0;
  238. _iRow = aLevelDiagram.length / MAX_BRICK_FOR_ROW;
  239. for (var i = 0; i < _iRow; i++) {
  240. for (var j = 0; j < MAX_BRICK_FOR_ROW; j++) {
  241. if (aLevelDiagram[iBrickNum] !== -1) {
  242. var oSpriteBrick = s_oSpriteLibrary.getSprite("brick" + aLevelDiagram[iBrickNum]);
  243. var iXPos = CANVAS_WIDTH / 2 - 250 - _iSpaceBetWall + ((_iOffsetBrickXPos + _iSpaceBetWall) * j);
  244. var iYPos = CANVAS_HEIGHT / 2 - 310 + ((_iOffsetBrickYPos + _iSpaceBetWall) * i);
  245. _aBrick[iMakeBrick] = new CBrick(iXPos, iYPos, oSpriteBrick, BRICKS_RESISTANCE[aLevelDiagram[iBrickNum]], BRICKS_DESTRUCTIBLE[aLevelDiagram[iBrickNum]]);
  246. _aBrick[iMakeBrick].setInfoData("resistance", BRICKS_RESISTANCE[aLevelDiagram[iBrickNum]]);
  247. _aBrick[iMakeBrick].setInfoData("score", BRICKS_SCORE[aLevelDiagram[iBrickNum]]);
  248. _aBrick[iMakeBrick].setInfoData("destructible", BRICKS_DESTRUCTIBLE[aLevelDiagram[iBrickNum]]);
  249. _aBrick[iMakeBrick].setChildIndex(4);
  250. if (BRICKS_DESTRUCTIBLE[aLevelDiagram[iBrickNum]] === true) {
  251. _iTotBrick++; //TOTAL BRICK TO DESTROY FOR COMPLETE THE LEVEL
  252. }
  253. else
  254. {
  255. //DON'T COUNT THE INDESTRUCTIBLE BRICKS
  256. }
  257. iMakeBrick++;
  258. }
  259. iBrickNum++;
  260. }
  261. }
  262. _iCheckDistance = _aBrick[iMakeBrick - 1].getY() + OFFSET_DIAGRAM_CHECK + _pBrickDim.y;
  263. this.createBricksSections();
  264. };
  265. this.loseBall = function (iID) {
  266. this.unloadBall(iID);
  267. if (_aBall.length < 1) {
  268. _iLife--;
  269. _oInterface.refreshBallLife(_iLife);
  270. if (_bLargePad === true) {
  271. this.deactiveLargePad();
  272. } else if (_bSmallPad === true) {
  273. this.deactiveSmallPad();
  274. }
  275. if (_bShot === true) {
  276. _iTimeShot = 0;
  277. } else if (_bMagnetic === true) {
  278. this.deactiveMagnetic();
  279. }
  280. if (_bFloor === true) {
  281. this.deactiveFloor();
  282. }
  283. if (_bFireBall === true) {
  284. this.stopFireSound();
  285. }
  286. _bLargePad = false;
  287. _bFireBall = false;
  288. _bFloor = false;
  289. _bMagnetic = false;
  290. _bSlowBall = false;
  291. _bFastBall = false;
  292. _iSpeedBallRate = 1;
  293. this.checkOtherActiveBonus();
  294. //create a ball if the user has more than a life
  295. if (_iLife > 0) {
  296. _bLaunch = false;
  297. var oSpriteBall = s_oSpriteLibrary.getSprite("normal_ball");
  298. this.createABall(0, _oPadding.x, _oPadding.y - _iRadius - _pPaddingDim.y, oSpriteBall, true);
  299. }
  300. else
  301. {
  302. _oInterface.gameOver(_iScore);
  303. }
  304. }
  305. playSound("ball_lose", 1, false);
  306. };
  307. this.setPause = function (bVal) {
  308. _bPause = bVal;
  309. };
  310. this.createBricksSections = function () {
  311. var iInsBrickRUp = 0;
  312. var iInsBrickLUp = 0;
  313. var iInsBrickRDown = 0;
  314. var iInsBrickLDown = 0;
  315. var iInsBrickCenterX = 0;
  316. var iInsBrickCenterY = 0;
  317. if (_iRow % 2 === 1) {
  318. _iCenterYDiagram = _aBrick[Math.floor(_aBrick.length / 2)].getY() + _pBrickDim.y * 2 + OFFSET_CENTER_Y_DIAGRAM;
  319. }
  320. else
  321. {
  322. _iCenterYDiagram = _aBrick[Math.floor(_aBrick.length / 2)].getY() - _pBrickDim.y + OFFSET_CENTER_Y_DIAGRAM;
  323. }
  324. _iCenterXDiagram = _iCanvasWidthHalf + _iOffsetYBricks + Math.floor(_iSpaceBetWall / 2) + OFFSET_CENTER_X_DIAGRAM;
  325. _oDetectiveX = {left: _iCenterXDiagram + _iOffsetBrickSectionX, right: _iCenterXDiagram - _iOffsetBrickSectionX, cleft: _iCenterXDiagram + OFFSET_BRICK_SECTION_X, cright: _iCenterXDiagram - OFFSET_BRICK_SECTION_X};
  326. _oDetectiveY = {down: _iCenterYDiagram + OFFSET_BRICK_SECTION_Y, up: _iCenterYDiagram - OFFSET_BRICK_SECTION_Y, cdown: _iCenterYDiagram + OFFSET_DETECTION_BRICK_SECTION_Y, cup: _iCenterYDiagram - OFFSET_DETECTION_BRICK_SECTION_Y};
  327. for (var i = 0; i < _aBrick.length; i++) {
  328. //INSERTION OF BRICKS IN SUB ARRAY
  329. if (_aBrick[i].getX() <= _iCenterXDiagram - OFFSET_BRICK_SECTION_X && _aBrick[i].getY() < _iCenterYDiagram - OFFSET_BRICK_SECTION_Y) {
  330. _aBrickSectionUpLeft[iInsBrickLUp] = _aBrick[i];
  331. iInsBrickLUp++;
  332. } else
  333. if (_aBrick[i].getX() >= _iCenterXDiagram + OFFSET_BRICK_SECTION_X && _aBrick[i].getY() < _iCenterYDiagram - OFFSET_BRICK_SECTION_Y) {
  334. _aBrickSectionUpRight[iInsBrickRUp] = _aBrick[i];
  335. iInsBrickRUp++;
  336. } else
  337. if (_aBrick[i].getX() <= _iCenterXDiagram - OFFSET_BRICK_SECTION_X && _aBrick[i].getY() > _iCenterYDiagram + OFFSET_BRICK_SECTION_Y) {
  338. _aBrickSectionDownLeft[iInsBrickLDown] = _aBrick[i];
  339. iInsBrickLDown++;
  340. } else
  341. if (_aBrick[i].getX() >= _iCenterXDiagram + OFFSET_BRICK_SECTION_X && _aBrick[i].getY() > _iCenterYDiagram + OFFSET_BRICK_SECTION_Y) {
  342. _aBrickSectionDownRight[iInsBrickRDown] = _aBrick[i];
  343. iInsBrickRDown++;
  344. } else if (_aBrick[i].getX() <= _iCenterXDiagram + OFFSET_BRICK_SECTION_X && _aBrick[i].getX() >= _iCenterXDiagram - OFFSET_BRICK_SECTION_X) {
  345. _aBrickSectionCenterH[iInsBrickCenterX] = _aBrick[i];
  346. iInsBrickCenterX++;
  347. } else if (_aBrick[i].getY() <= _iCenterYDiagram + OFFSET_BRICK_SECTION_Y && _aBrick[i].getY() >= _iCenterYDiagram - OFFSET_BRICK_SECTION_Y && _aBrick[i] && _aBrick[i].getX() >= _iCenterXDiagram + OFFSET_BRICK_SECTION_X || _aBrick[i].getX() <= _iCenterXDiagram - OFFSET_BRICK_SECTION_X) {
  348. _aBrickSectionCenterY[iInsBrickCenterY] = _aBrick[i];
  349. iInsBrickCenterY++;
  350. }
  351. }
  352. };
  353. this.onExit = function () {
  354. s_oGame.unload();
  355. s_oMain.gotoMenu();
  356. document.dispatchEvent(new CustomEvent("end_level", {detail: { score: _iScore, level: _iLevel } }));
  357. document.dispatchEvent(new CustomEvent("show_interlevel_ad"));
  358. document.dispatchEvent(new CustomEvent("end_session", {detail: { score: _iScore, level: _iLevel } }));
  359. setVolume("soundtrack", 1);
  360. };
  361. this.bonusLargePad = function () {
  362. _iCurLevelScore += BONUS_SCORE.s0;
  363. _iScore += BONUS_SCORE.s0;
  364. _oInterface.refreshScore(_iScore);
  365. if (_bSmallPad === true) {
  366. this.deactiveSmallPad();
  367. return;
  368. } else if (_bMagnetic === true) {
  369. this.deactiveMagnetic();
  370. } else if (_oCannons) {
  371. _iTimeShot = 0;
  372. _oCannons.gotoAndPlay("go");
  373. _oCannons.on("animationend", function () {
  374. s_oStage.removeChild(_oCannons);
  375. _oCannons = null;
  376. });
  377. }
  378. this.audioPowerUpBonus();
  379. if (_bLargePad) {
  380. return;
  381. }
  382. _pPaddingDim.x = PADDLE_DIMENSION[2] / 2;
  383. _oPadding.gotoAndPlay("NtoB");
  384. _oPadding.on("animationend", function () {
  385. _oPadding.gotoAndStop("big");
  386. });
  387. _bLargePad = true;
  388. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  389. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  390. };
  391. this.bonusSmallPad = function () {
  392. _iCurLevelScore += BONUS_SCORE.s9;
  393. _iScore += BONUS_SCORE.s9;
  394. _oInterface.refreshScore(_iScore);
  395. this.audioPowerUpMalus();
  396. if (_bLargePad === true) {
  397. this.deactiveLargePad();
  398. return;
  399. } else if (_bMagnetic === true) {
  400. this.deactiveMagnetic();
  401. } else if (_oCannons) {
  402. _iTimeShot = 0;
  403. _oCannons.gotoAndPlay("go");
  404. _oCannons.on("animationend", function () {
  405. s_oStage.removeChild(_oCannons);
  406. _oCannons = null;
  407. });
  408. }
  409. if (_bSmallPad) {
  410. return;
  411. }
  412. _pPaddingDim.x = PADDLE_DIMENSION[0] / 2;
  413. _oPadding.gotoAndPlay("NtoS");
  414. _oPadding.on("animationend", function () {
  415. _oPadding.gotoAndStop("small");
  416. });
  417. _bSmallPad = true;
  418. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  419. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  420. };
  421. this.bonusMultiBall = function () {
  422. _iCurLevelScore += BONUS_SCORE.s5;
  423. _iScore += BONUS_SCORE.s5;
  424. _oInterface.refreshScore(_iScore);
  425. if (_aBall.length >= MAX_BALL_SPAWN) {
  426. return;
  427. }
  428. this.audioPowerUpBonus();
  429. var iAddBalls = 0;
  430. var iCnt = 0;
  431. var oSpriteBall;
  432. iAddBalls = _aBall.length + BONUS_MULTI_BALL;
  433. var iNBallsPres = _aBall.length;
  434. if (_bFireBall === false && _bMagnetic === false) {
  435. oSpriteBall = s_oSpriteLibrary.getSprite("normal_ball");
  436. } else if (_bFireBall === true) {
  437. oSpriteBall = s_oSpriteLibrary.getSprite("fire_ball");
  438. }
  439. else {
  440. oSpriteBall = s_oSpriteLibrary.getSprite("iron_ball");
  441. }
  442. for (var i = iNBallsPres; i < iNBallsPres + iAddBalls; i++) {
  443. if (iCnt % 2 === 0) {
  444. this.createABall(i, _aBall[iCnt].getX(), _aBall[iCnt].getY(), oSpriteBall, false, 1, -1);
  445. }
  446. else
  447. {
  448. this.createABall(i, _aBall[iCnt].getX(), _aBall[iCnt].getY(), oSpriteBall, false, -1, 1);
  449. }
  450. iCnt++;
  451. }
  452. };
  453. this.bonusFireBall = function () {
  454. _iCurLevelScore += BONUS_SCORE.s1;
  455. _iScore += BONUS_SCORE.s1;
  456. _oInterface.refreshScore(_iScore);
  457. _iTimeFireBall = BONUS_TIME.t1;
  458. if (_bFireBall === true) {
  459. return;
  460. }
  461. var oSpriteFireBall = s_oSpriteLibrary.getSprite("fire_ball");
  462. for (var i = 0; i < _aBall.length; i++) {
  463. _aBall[i].changeSprite(oSpriteFireBall, "fire");
  464. }
  465. _bFireBall = true;
  466. if (_bMagnetic === true) {
  467. s_oStage.removeChild(_oPadding);
  468. this.createPadding(_oPadding.x);
  469. this.launchUnmagneticBall();
  470. _bMagnetic = false;
  471. }
  472. _bAlmostABonus = true;
  473. playSound("fireball", 1,true);
  474. this.audioPowerUpBonus();
  475. };
  476. this.createFloor = function () {
  477. var oSpriteEdge = s_oSpriteLibrary.getSprite("powerup_edge");
  478. _oPowerUpEdge = createBitmap(oSpriteEdge);
  479. _oPowerUpEdge.x = _iCanvasWidthHalf;
  480. _oPowerUpEdge.y = CANVAS_HEIGHT + oSpriteEdge.height / 2;
  481. _oPowerUpEdge.regX = oSpriteEdge.width / 2;
  482. _oPowerUpEdge.regY = oSpriteEdge.height / 2;
  483. s_oStage.addChild(_oPowerUpEdge);
  484. s_oStage.setChildIndex(_oPowerUpEdge, s_oStage.numChildren - 1);
  485. createjs.Tween.get(_oPowerUpEdge).to({y: 940}, 800, createjs.Ease.backOut);
  486. };
  487. this.bonusMagnetic = function () {
  488. _iCurLevelScore += BONUS_SCORE.s3;
  489. _iScore += BONUS_SCORE.s3;
  490. _oInterface.refreshScore(_iScore);
  491. _iTimeMagnetic = BONUS_TIME.t3;
  492. this.audioPowerUpBonus();
  493. if (_bMagnetic === true) {
  494. return;
  495. }
  496. var oSpriteIronBall = s_oSpriteLibrary.getSprite("iron_ball");
  497. for (var i = 0; i < _aBall.length; i++) {
  498. _aBall[i].changeSprite(oSpriteIronBall, "magnetic");
  499. }
  500. if (_bLargePad === true) {
  501. _oPadding.gotoAndPlay("BtoN");
  502. _oPadding.on("animationend", function () {
  503. s_oStage.removeChild(_oPadding);
  504. s_oGame.createMagneticPad(_oPadding.x);
  505. });
  506. _bLargePad = false;
  507. } else if (_bSmallPad === true) {
  508. _oPadding.gotoAndPlay("StoN");
  509. _oPadding.on("animationend", function () {
  510. s_oStage.removeChild(_oPadding);
  511. s_oGame.createMagneticPad(_oPadding.x);
  512. });
  513. _bSmallPad = false;
  514. } else if (_oCannons) {
  515. _iTimeShot = 0;
  516. _oCannons.gotoAndPlay("go");
  517. _oCannons.on("animationend", function () {
  518. s_oStage.removeChild(_oCannons);
  519. _oCannons = null;
  520. s_oStage.removeChild(_oPadding);
  521. s_oGame.createMagneticPad(_oPadding.x);
  522. });
  523. } else {
  524. this.createMagneticPad(_oPadding.x);
  525. }
  526. if (_bFireBall === true) {
  527. _bFireBall = false;
  528. this.stopFireSound();
  529. }
  530. _bMagnetic = true;
  531. _bAlmostABonus = true;
  532. };
  533. this.createMagneticPad = function (iXPos) {
  534. s_oStage.removeChild(_oPadding);
  535. var oSprite = s_oSpriteLibrary.getSprite("paddle_magnet");
  536. var oData = {
  537. images: [oSprite],
  538. // width, height & registration point of each sprite
  539. frames: {width: oSprite.width / 5, height: oSprite.height / 2, regX: ((oSprite.width + REG_X_OFFSET_PADDLE_MAGNETIC) / 2) / 5, regY: ((oSprite.height + REG_Y_OFFSET_PADDLE_MAGNETIC) / 2) / 7},
  540. animations: {magnetic: [0, 9, "magnetic", 0.5]}
  541. };
  542. var oSpriteSheet = new createjs.SpriteSheet(oData);
  543. _oPadding = createSprite(oSpriteSheet, "magnetic", ((oSprite.width + REG_X_OFFSET_PADDLE_MAGNETIC) / 2) / 5, ((oSprite.height + REG_Y_OFFSET_PADDLE_MAGNETIC) / 2) / 2, oSprite.width / 5, oSprite.height / 2);
  544. _oPadding.x = iXPos;
  545. _oPadding.y = HEIGHT_OF_PADDLE;
  546. s_oStage.addChild(_oPadding);
  547. _pPaddingDim.x = PADDLE_DIMENSION[1] / 2;
  548. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  549. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  550. };
  551. this.bonusLife = function () {
  552. _iCurLevelScore += BONUS_SCORE.s4;
  553. _iScore += BONUS_SCORE.s4;
  554. _oInterface.refreshScore(_iScore);
  555. _oInterface.refreshBallLife(_iLife);
  556. _iLife++;
  557. this.audioPowerUpBonus();
  558. };
  559. this.bonusSlowBall = function () {
  560. _iCurLevelScore += BONUS_SCORE.s7;
  561. _iScore += BONUS_SCORE.s7;
  562. _oInterface.refreshScore(_iScore);
  563. for (var i = 0; i < _aBall.length; i++) {
  564. _aBall[i].setVelocityRate(_iSpeedBallRate);
  565. }
  566. if (_iSpeedBallRate < 1) {
  567. _bSlowBall = true;
  568. this.audioPowerUpMalus();
  569. }
  570. else
  571. {
  572. this.audioPowerUpBonus();
  573. }
  574. if (_iSpeedBallRate > MIN_VELOCITY_LIMIT) {
  575. _iSpeedBallRate -= SPEED_DOWN_BALL;
  576. }
  577. if (_iSpeedBallRate < MIN_VELOCITY_LIMIT) {
  578. _iSpeedBallRate = MIN_VELOCITY_LIMIT;
  579. }
  580. };
  581. this.bonusFastBall = function () {
  582. _iCurLevelScore += BONUS_SCORE.s8;
  583. _iScore += BONUS_SCORE.s8;
  584. _oInterface.refreshScore(_iScore);
  585. if (_iSpeedBallRate < MAX_VELOCITY_LIMIT) {
  586. _iSpeedBallRate += SPEED_UP_BALL;
  587. } else {
  588. return;
  589. }
  590. for (var i = 0; i < _aBall.length; i++) {
  591. _aBall[i].setVelocityRate(_iSpeedBallRate);
  592. }
  593. if (_iSpeedBallRate > 1) {
  594. _bFastBall = true;
  595. this.audioPowerUpMalus();
  596. }
  597. else
  598. {
  599. this.audioPowerUpBonus();
  600. }
  601. };
  602. this.bonusShot = function () {
  603. _iCurLevelScore += BONUS_SCORE.s6;
  604. _iScore += BONUS_SCORE.s6;
  605. _oInterface.refreshScore(_iScore);
  606. this.audioPowerUpBonus();
  607. _iTimeShot = BONUS_TIME.t6;
  608. if (_bShot === false) {
  609. _bShot = true;
  610. _oSpriteBullet = s_oSpriteLibrary.getSprite("bullet");
  611. _aBullet = new Array();
  612. if (_bLargePad === true) {
  613. _oPadding.gotoAndPlay("BtoN");
  614. _oPadding.on("animationend", function () {
  615. _oPadding.gotoAndStop("normal");
  616. });
  617. _bLargePad = false;
  618. } else if (_bSmallPad === true) {
  619. _oPadding.gotoAndPlay("StoN");
  620. _oPadding.on("animationend", function () {
  621. _oPadding.gotoAndStop("normal");
  622. });
  623. _bSmallPad = false;
  624. } else if (_bMagnetic === true) {
  625. this.deactiveMagnetic();
  626. }
  627. if (!_oCannons) {
  628. this.createCannons();
  629. }
  630. else
  631. {
  632. _oCannons.gotoAndPlay("come");
  633. _oCannons.on("animationend", function () {
  634. _oCannons.gotoAndStop(5);
  635. });
  636. }
  637. }
  638. _bAlmostABonus = true;
  639. };
  640. this.bonusFloor = function () {
  641. _iCurLevelScore += BONUS_SCORE.s2;
  642. _iScore += BONUS_SCORE.s2;
  643. _oInterface.refreshScore(_iScore);
  644. _iTimeFloor = BONUS_TIME.t2;
  645. if (_bFloor !== true) {
  646. if (!_oPowerUpEdge) {
  647. this.createFloor();
  648. }
  649. for (var i = 0; i < _aBall.length; i++) {
  650. _aBall[i].downFloor(true);
  651. }
  652. }
  653. _bFloor = true;
  654. _bAlmostABonus = true;
  655. this.audioPowerUpBonus();
  656. };
  657. this.createCannons = function () {
  658. var oSprite = s_oSpriteLibrary.getSprite("cannons");
  659. var oData = {
  660. images: [oSprite],
  661. // width, height & registration point of each sprite
  662. frames: {width: oSprite.width / 3, height: oSprite.height / 2, regX: (oSprite.width / 2) / 3, regY: (oSprite.height / 2) / 2},
  663. animations: {
  664. come: {
  665. frames: [0, 1, 2, 3, 4, 5],
  666. speed: 0.5
  667. },
  668. go: {
  669. frames: [5, 4, 3, 2, 1, 0],
  670. speed: 0.5
  671. }
  672. }
  673. };
  674. var oSpriteSheet = new createjs.SpriteSheet(oData);
  675. _oCannons = createSprite(oSpriteSheet, "come", (oSprite.width / 2) / 3, (oSprite.height / 2) / 2, oSprite.width / 3, oSprite.height / 2);
  676. _oCannons.x = _oPadding.x;
  677. _oCannons.y = _oPadding.y + OFFSET_CANNONS_Y_POS;
  678. s_oStage.addChild(_oCannons);
  679. _oCannons.on("animationend", function () {
  680. _oCannons.gotoAndStop(5);
  681. });
  682. s_oStage.setChildIndex(_oCannons, 5);
  683. _pPaddingDim.x = (PADDLE_DIMENSION[1] + OFFSET_DIM_X_CANNONS) / 2;
  684. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  685. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  686. };
  687. this.launchUnmagneticBall = function () {
  688. for (var i = 0; i < _aBall.length; i++) {
  689. if (_aBall[i].getInfoData("OnPad") === true) {
  690. var iDirection = _aBall[i].getInfoData("Collision") / _pPaddingDim.x;
  691. var iCurAngleRot = Math.sin(iDirection);
  692. _aBall[i].setPosition(null, _aBall[i].getY() - 2);
  693. _aBall[i].changeDirection(-iCurAngleRot, -1, false, "launch");
  694. _aBall[i].setInfoData("OnPad", false);
  695. _aBall[i].changeRotation();
  696. }
  697. }
  698. };
  699. this.unload = function () {
  700. _oInterface.unload();
  701. for (var i = 0; i < _aBall.length; i++) {
  702. _aBall[i].unload();
  703. }
  704. for (var i = 0; i < _aBonus.length; i++) {
  705. _aBonus[i].unload();
  706. }
  707. createjs.Tween.removeAllTweens();
  708. s_oStage.removeAllChildren();
  709. };
  710. this.__updatePhysics = function (fPhysicsScaleTime) {
  711. var fSecond = (1 / createjs.Ticker.framerate) / _iPhysicsUpdateTime;
  712. _oPadding.x = s_oStage.mouseX/s_iScaleFactor;
  713. if (_oPadding.x < _iOffsetXPadLeft) {
  714. _oPadding.x = _iOffsetXPadLeft;
  715. }
  716. if (_oPadding.x > _iOffsetXPadRight) {
  717. _oPadding.x = _iOffsetXPadRight;
  718. }
  719. if (_oCannons) {
  720. _oCannons.x = _oPadding.x;
  721. }
  722. for (var i = 0; i < _aBall.length; i++) {
  723. if (_aBall[i].getInfoData("OnPad") === false) {
  724. var iBallX = _aBall[i].getX();
  725. var iBallY = _aBall[i].getY();
  726. _aBall[i].update(fPhysicsScaleTime);
  727. if (iBallX > _oPadding.x - _pPaddingDim.x && iBallX < _oPadding.x + _pPaddingDim.x && iBallY > (_oPadding.y - _pPaddingDim.y) - _iRadius && iBallY < (_oPadding.y + _pPaddingDim.y) + _iRadius) {
  728. if (_bMagnetic === false) {
  729. if (_iCurAngleRot === 0) {
  730. var iCollision = (_oPadding.x - iBallX);
  731. var iDirection = iCollision / _pPaddingDim.x;
  732. _aBall[i].setPosition(null, iBallY - 1);
  733. _iCurAngleRot = Math.sin(iDirection);
  734. _aBall[i].changeDirection(-_iCurAngleRot, -1, true);
  735. _aBall[i].changeRotation();
  736. }
  737. _iCurAngleRot = 0;
  738. }
  739. else
  740. {
  741. var iCollision = (_oPadding.x - _aBall[i].getX());
  742. _aBall[i].setInfoData("Collision", iCollision);
  743. if (_aBall[i].getInfoData("OnPad") === false) {
  744. _aBall[i].setPosition(null, _oPadding.y - _pPaddingDim.y - _iRadius);
  745. _aBall[i].setInfoData("OnPad", true);
  746. }
  747. break;
  748. }
  749. this.audioBoing();
  750. }
  751. if (iBallY < _iCheckDistance) {
  752. if (iBallX < _oDetectiveX.left && iBallY > _oDetectiveY.down) {
  753. for (var j = 0; j < _aBrickSectionDownLeft.length; j++) {
  754. if (iBallX > _aBrickSectionDownLeft[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionDownLeft[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionDownLeft[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionDownLeft[j].getY() + _iOffsetYBricks) {
  755. var iBrickX = _aBrickSectionDownLeft[j].getX();
  756. var iBrickY = _aBrickSectionDownLeft[j].getY();
  757. this.gestureBricks(_aBrickSectionDownLeft, j, iBrickX, iBrickY);
  758. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  759. break;
  760. }
  761. }
  762. } else if (iBallX > _oDetectiveX.right && iBallY > _oDetectiveY.down) {
  763. for (var j = 0; j < _aBrickSectionDownRight.length; j++) {
  764. if (iBallX > _aBrickSectionDownRight[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionDownRight[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionDownRight[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionDownRight[j].getY() + _iOffsetYBricks) {
  765. var iBrickX = _aBrickSectionDownRight[j].getX();
  766. var iBrickY = _aBrickSectionDownRight[j].getY();
  767. this.gestureBricks(_aBrickSectionDownRight, j, iBrickX, iBrickY);
  768. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  769. break;
  770. }
  771. }
  772. }
  773. else if (iBallX < _oDetectiveX.left && iBallY < _iCenterYDiagram) {
  774. for (var j = 0; j < _aBrickSectionUpLeft.length; j++) {
  775. if (iBallX > _aBrickSectionUpLeft[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionUpLeft[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionUpLeft[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionUpLeft[j].getY() + _iOffsetYBricks) {
  776. var iBrickX = _aBrickSectionUpLeft[j].getX();
  777. var iBrickY = _aBrickSectionUpLeft[j].getY();
  778. this.gestureBricks(_aBrickSectionUpLeft, j, iBrickX, iBrickY);
  779. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  780. }
  781. }
  782. } else if (iBallX > _oDetectiveX.right && iBallY < _iCenterYDiagram) {
  783. for (var j = 0; j < _aBrickSectionUpRight.length; j++) {
  784. if (iBallX > _aBrickSectionUpRight[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionUpRight[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionUpRight[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionUpRight[j].getY() + _iOffsetYBricks) {
  785. var iBrickX = _aBrickSectionUpRight[j].getX();
  786. var iBrickY = _aBrickSectionUpRight[j].getY();
  787. this.gestureBricks(_aBrickSectionUpRight, j, iBrickX, iBrickY);
  788. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  789. break;
  790. }
  791. }
  792. }
  793. if (iBallX > _oDetectiveX.cright && iBallX < _oDetectiveX.cleft) {
  794. for (var j = 0; j < _aBrickSectionCenterH.length; j++) {
  795. if (iBallX > _aBrickSectionCenterH[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionCenterH[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionCenterH[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionCenterH[j].getY() + _iOffsetYBricks) {
  796. var iBrickX = _aBrickSectionCenterH[j].getX();
  797. var iBrickY = _aBrickSectionCenterH[j].getY();
  798. this.gestureBricks(_aBrickSectionCenterH, j, iBrickX, iBrickY);
  799. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  800. break;
  801. }
  802. }
  803. }
  804. if (iBallY < _oDetectiveY.cdown && iBallY > _oDetectiveY.cup) {
  805. for (var j = 0; j < _aBrickSectionCenterY.length; j++) {
  806. if (iBallX > _aBrickSectionCenterY[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionCenterY[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionCenterY[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionCenterY[j].getY() + _iOffsetYBricks) {
  807. var iBrickX = _aBrickSectionCenterY[j].getX();
  808. var iBrickY = _aBrickSectionCenterY[j].getY();
  809. this.gestureBricks(_aBrickSectionCenterY, j, iBrickX, iBrickY);
  810. this.ballBounce(i, iBallX, iBallY, iBrickX, iBrickY);
  811. break;
  812. }
  813. }
  814. }
  815. }
  816. }
  817. else
  818. {
  819. _aBall[i].setPosition(_oPadding.x - _aBall[i].getInfoData("Collision"), null);
  820. if (_aBall[i].getX() > _iOffsetWallRight) {
  821. _aBall[i].setInfoData("Collision", _aBall[i].getInfoData("Collision") + 1);
  822. } else if (_aBall[i].getX() < _iOffsetWallLeft) {
  823. _aBall[i].setInfoData("Collision", _aBall[i].getInfoData("Collision") - 1);
  824. }
  825. }
  826. }
  827. //ACTIVE BONUS
  828. this.timeBonus(fSecond);
  829. //REFLECT IRON BRICK
  830. if (_iTimeReflectBrick > 0) {
  831. _iTimeReflectBrick -= fSecond;
  832. }
  833. else
  834. {
  835. for (i = 0; i < _aBrick.length; i++) {
  836. if (_aBrick[i].getInfoData("destructible") === false) {
  837. _aBrick[i].reflectBrick();
  838. _aBrick[i].setInfoData("Reflect", true);
  839. }
  840. _iTimeReflectBrick = TIME_REFLECT_IRON_BRICK;
  841. }
  842. }
  843. if (_fTimeBounce > 0) {
  844. _fTimeBounce -= fSecond;
  845. }
  846. //BONUS
  847. if (_iNum_Of_Bonus_Spawned === 0) {
  848. return;
  849. }
  850. else
  851. {
  852. this.bonusGesture();
  853. }
  854. };
  855. this.allBrickDestroyed = function () {
  856. if (_iTotBrick > 0) {
  857. return;
  858. }
  859. else
  860. {
  861. this.setPause(true);
  862. _oInterface.levelComplete(_iLevel, _iScore);
  863. _iLevelAds++;
  864. if (_iLevelAds === NUM_LEVELS_FOR_ADS) {
  865. _iLevelAds = 0;
  866. document.dispatchEvent(new CustomEvent("show_interlevel_ad"));
  867. }
  868. document.dispatchEvent(new CustomEvent("end_level", {detail: { score: _iScore, level: _iLevel } }));
  869. //document.dispatchEvent(new CustomEvent("submit_score", {detail: { score: _iScore, level: _iLevel } }));
  870. s_oMain.setLocalStorageLevel(_iLevel+1);
  871. s_oMain.setLocalStorageScore(_iCurLevelScore,_iLevel);
  872. }
  873. if (_bFireBall === true) {
  874. this.stopFireSound();
  875. }
  876. };
  877. this.stopFireSound = function () {
  878. stopSound("fireball");
  879. };
  880. this.timeBonus = function (fSecond) {
  881. if (_bAlmostABonus === true) {
  882. if (_bFireBall === true) {
  883. if (_iTimeFireBall > 0) {
  884. _iTimeFireBall -= fSecond;
  885. }
  886. else {
  887. this.deactiveFireBall();
  888. this.checkOtherActiveBonus();
  889. }
  890. } else if (_bMagnetic === true) {
  891. if (_iTimeMagnetic > 0) {
  892. _iTimeMagnetic -= fSecond;
  893. }
  894. else {
  895. this.deactiveMagnetic();
  896. this.checkOtherActiveBonus();
  897. }
  898. }
  899. if (_bFloor === true) {
  900. if (_iTimeFloor > 0) {
  901. _iTimeFloor -= fSecond;
  902. }
  903. else {
  904. this.deactiveFloor();
  905. this.checkOtherActiveBonus();
  906. }
  907. }
  908. if (_bShot === true) {
  909. if (_iTimeShot > 0) {
  910. _iTimeShot -= fSecond;
  911. _iBulletSPWRate -= 1;
  912. if (_iBulletSPWRate < 0) {
  913. if (_bShotLeft === true) {
  914. _aBullet.push(new CBullet(_oPadding.x - _pPaddingDim.x, _oPadding.y - _pPaddingDim.y, _oSpriteBullet));
  915. _bShotLeft = false;
  916. } else {
  917. _aBullet.push(new CBullet(_oPadding.x + _pPaddingDim.x, _oPadding.y - _pPaddingDim.y, _oSpriteBullet));
  918. _bShotLeft = true;
  919. }
  920. _aBullet[_iFiredBullet].setIndex(_iFiredBullet);
  921. _iBulletSPWRate = MAX_TIME_SHOT_BONUS;
  922. _iFiredBullet++;
  923. this.audioBullet();
  924. }
  925. }
  926. if (_aBullet.length < 1 && _iTimeShot < 0.1) {
  927. this.deactiveShot();
  928. this.checkOtherActiveBonus();
  929. } else {
  930. this.detectiveCollisionBullet();
  931. }
  932. }
  933. }
  934. };
  935. this.nextLevel = function () {
  936. this.unloadLevel();
  937. _iLevel++;
  938. this.createLevel();
  939. var oSpriteBall = s_oSpriteLibrary.getSprite("normal_ball");
  940. _iSpeedBallRate = 1;
  941. this.createABall(0, _oPadding.x, _oPadding.y - _iRadius - _pPaddingDim.y, oSpriteBall, true);
  942. _bShotLeft = true;
  943. _bLaunch = false;
  944. _iFiredBullet = 0;
  945. _iCurLevelScore = 0;
  946. _oInterface.showNumLevel(_iLevel);
  947. _oInterface.numLevel(_iLevel);
  948. };
  949. this.audioBrickExplosion = function () {
  950. playSound("brick_explosion", 1, false);
  951. };
  952. this.audioPowerUpBonus = function () {
  953. playSound("power_up_bonus", 1, false);
  954. };
  955. this.audioPowerUpMalus = function () {
  956. playSound("power_up_malus", 1, false);
  957. };
  958. this.audioBrickMetal = function () {
  959. playSound("brick_metal", 1, false);
  960. };
  961. this.audioBullet = function () {
  962. playSound("bullet", 1, false);
  963. };
  964. this.audioBoing = function () {
  965. playSound("boing", 1, false);
  966. };
  967. this.ballBounce = function (iID, iBallX, iBallY, iBrickX, iBrickY) {
  968. if (_bFireBall === true || _fTimeBounce > 0) {
  969. return;
  970. }
  971. if (iBallX > iBrickX + _iOffsetBounceXBrick || iBallX < iBrickX - _iOffsetBounceXBrick && iBallY > iBrickY - _iOffsetBounceYBricks && iBallY < iBrickY + _iOffsetBounceYBricks) {
  972. if (iBallX > iBrickX) {
  973. _aBall[iID].changeDirection(-1, 1, false, "side");
  974. _aBall[iID].setPosition(_aBall[iID].getX() + 3, null);
  975. _fTimeBounce = TIME_BOUNCE_BALL;
  976. }
  977. else
  978. {
  979. _aBall[iID].changeDirection(-1, 1, false, "side");
  980. _aBall[iID].setPosition(_aBall[iID].getX() - 3, null);
  981. _fTimeBounce = TIME_BOUNCE_BALL;
  982. }
  983. }
  984. else
  985. if (iBallX > iBrickX - _iOffsetXBricks && iBallX < iBrickX + _iOffsetXBricks && iBallY > iBrickY - _iOffsetYBricks && iBallY < iBrickY + _iOffsetYBricks) {
  986. if (iBallY > iBrickY) {
  987. _aBall[iID].changeDirection(1, 1, false, "base");
  988. _aBall[iID].setPosition(null, _aBall[iID].getY() + 3);
  989. _fTimeBounce = TIME_BOUNCE_BALL;
  990. }
  991. else
  992. {
  993. _aBall[iID].changeDirection(1, -1, false, "base");
  994. _aBall[iID].setPosition(null, _aBall[iID].getY() - 3);
  995. _fTimeBounce = TIME_BOUNCE_BALL;
  996. }
  997. _aBall[iID].changeRotation();
  998. }
  999. this.audioBoing();
  1000. };
  1001. this.gestureBricks = function (aBrick, iID, iBrickX, iBrickY) {
  1002. if (aBrick[iID].getInfoData("destructible") === true || _bFireBall === true) {
  1003. if (aBrick[iID].getInfoData("resistance") === 0) {
  1004. _iCurLevelScore += aBrick[iID].getInfoData("score");
  1005. _iScore += aBrick[iID].getInfoData("score");
  1006. _oInterface.refreshScore(_iScore);
  1007. if (aBrick[iID].getInfoData("destructible") === true) {
  1008. _iTotBrick--;
  1009. this.allBrickDestroyed();
  1010. }
  1011. if (aBrick[iID].getInfoData("Effect") === false) {
  1012. aBrick[iID].unload();
  1013. }
  1014. else
  1015. {
  1016. aBrick[iID].animBrick("destroyed");
  1017. this.audioBrickExplosion();
  1018. }
  1019. this.randomBonus(iBrickX, iBrickY);
  1020. aBrick.splice(iID, 1);
  1021. }
  1022. else
  1023. {
  1024. aBrick[iID].setInfoData("resistance", aBrick[iID].getInfoData("resistance") - 1);
  1025. aBrick[iID].damageBrick(aBrick[iID].getInfoData("resistance"));
  1026. playSound("brick_crack", 1, false);
  1027. }
  1028. } else {
  1029. aBrick[iID].reflectBrick();
  1030. aBrick[iID].setInfoData("Reflect", true);
  1031. this.audioBrickMetal();
  1032. }
  1033. };
  1034. this.detectiveCollisionBullet = function () {
  1035. for (var i = 0; i < _aBullet.length; i++) {
  1036. var iBallX = _aBullet[i].getX();
  1037. var iBallY = _aBullet[i].getY();
  1038. _aBullet[i].update();
  1039. if (iBallY < _iCheckDistance) {
  1040. if (iBallX < _oDetectiveX.left && iBallY > _iCenterYDiagram) {
  1041. for (var j = 0; j < _aBrickSectionDownLeft.length; j++) {
  1042. if (iBallX > _aBrickSectionDownLeft[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionDownLeft[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionDownLeft[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionDownLeft[j].getY() + _iOffsetYBricks) {
  1043. var iBrickX = _aBrickSectionDownLeft[j].getX();
  1044. var iBrickY = _aBrickSectionDownLeft[j].getY();
  1045. this.gestureBricks(_aBrickSectionDownLeft, j, iBrickX, iBrickY);
  1046. this.unloadBullet(_aBullet[i].getIndex());
  1047. break;
  1048. }
  1049. }
  1050. } else if (iBallX > _oDetectiveX.right && iBallY > _iCenterYDiagram) {
  1051. for (var j = 0; j < _aBrickSectionDownRight.length; j++) {
  1052. if (iBallX > _aBrickSectionDownRight[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionDownRight[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionDownRight[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionDownRight[j].getY() + _iOffsetYBricks) {
  1053. var iBrickX = _aBrickSectionDownRight[j].getX();
  1054. var iBrickY = _aBrickSectionDownRight[j].getY();
  1055. this.gestureBricks(_aBrickSectionDownRight, j, iBrickX, iBrickY);
  1056. this.unloadBullet(_aBullet[i].getIndex());
  1057. break;
  1058. }
  1059. }
  1060. }
  1061. else if (iBallX < _oDetectiveX.left && iBallY < _iCenterYDiagram) {
  1062. for (var j = 0; j < _aBrickSectionUpLeft.length; j++) {
  1063. if (iBallX > _aBrickSectionUpLeft[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionUpLeft[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionUpLeft[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionUpLeft[j].getY() + _iOffsetYBricks) {
  1064. var iBrickX = _aBrickSectionUpLeft[j].getX();
  1065. var iBrickY = _aBrickSectionUpLeft[j].getY();
  1066. this.gestureBricks(_aBrickSectionUpLeft, j, iBrickX, iBrickY);
  1067. this.unloadBullet(_aBullet[i].getIndex());
  1068. }
  1069. }
  1070. } else if (iBallX > _oDetectiveX.right && iBallY < _iCenterYDiagram) {
  1071. for (var j = 0; j < _aBrickSectionUpRight.length; j++) {
  1072. if (iBallX > _aBrickSectionUpRight[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionUpRight[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionUpRight[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionUpRight[j].getY() + _iOffsetYBricks) {
  1073. var iBrickX = _aBrickSectionUpRight[j].getX();
  1074. var iBrickY = _aBrickSectionUpRight[j].getY();
  1075. this.gestureBricks(_aBrickSectionUpRight, j, iBrickX, iBrickY);
  1076. this.unloadBullet(_aBullet[i].getIndex());
  1077. break;
  1078. }
  1079. }
  1080. }
  1081. if (iBallX > _oDetectiveX.cright && iBallX < _oDetectiveX.cleft) {
  1082. for (var j = 0; j < _aBrickSectionCenterH.length; j++) {
  1083. if (iBallX > _aBrickSectionCenterH[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionCenterH[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionCenterH[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionCenterH[j].getY() + _iOffsetYBricks) {
  1084. var iBrickX = _aBrickSectionCenterH[j].getX();
  1085. var iBrickY = _aBrickSectionCenterH[j].getY();
  1086. this.gestureBricks(_aBrickSectionCenterH, j, iBrickX, iBrickY);
  1087. this.unloadBullet(_aBullet[i].getIndex());
  1088. break;
  1089. }
  1090. }
  1091. }
  1092. if (iBallY < _oDetectiveY.cdown && iBallY > _oDetectiveY.cup) {
  1093. for (var j = 0; j < _aBrickSectionCenterY.length; j++) {
  1094. if (iBallX > _aBrickSectionCenterY[j].getX() - _iOffsetXBricks && iBallX < _aBrickSectionCenterY[j].getX() + _iOffsetXBricks && iBallY > _aBrickSectionCenterY[j].getY() - _iOffsetYBricks && iBallY < _aBrickSectionCenterY[j].getY() + _iOffsetYBricks) {
  1095. var iBrickX = _aBrickSectionCenterY[j].getX();
  1096. var iBrickY = _aBrickSectionCenterY[j].getY();
  1097. this.gestureBricks(_aBrickSectionCenterY, j, iBrickX, iBrickY);
  1098. this.unloadBullet(_aBullet[i].getIndex());
  1099. break;
  1100. }
  1101. }
  1102. }
  1103. }
  1104. }
  1105. };
  1106. this.deactiveFireBall = function () {
  1107. var oSpriteNormalBall = s_oSpriteLibrary.getSprite("normal_ball");
  1108. for (var i = 0; i < _aBall.length; i++) {
  1109. _aBall[i].changeSprite(oSpriteNormalBall, "normal");
  1110. }
  1111. _bFireBall = false;
  1112. this.stopFireSound();
  1113. };
  1114. this.deactiveLargePad = function () {
  1115. _oPadding.gotoAndPlay("BtoN");
  1116. _oPadding.on("animationend", function () {
  1117. _oPadding.gotoAndStop("normal");
  1118. });
  1119. _pPaddingDim.x = PADDLE_DIMENSION[1] / 2;
  1120. _iOffsetXPadRight = CANVAS_WIDTH - 102 - _pPaddingDim.x;
  1121. _iOffsetXPadLeft = 102 + _pPaddingDim.x;
  1122. _bLargePad = false;
  1123. };
  1124. this.deactiveSmallPad = function () {
  1125. _oPadding.gotoAndPlay("StoN");
  1126. _oPadding.on("animationend", function () {
  1127. _oPadding.gotoAndStop("normal");
  1128. });
  1129. _pPaddingDim.x = PADDLE_DIMENSION[1] / 2;
  1130. _iOffsetXPadRight = CANVAS_WIDTH - 102 - _pPaddingDim.x;
  1131. _iOffsetXPadLeft = 102 + _pPaddingDim.x;
  1132. _bSmallPad = false;
  1133. };
  1134. this.deactiveFloor = function () {
  1135. var oSpriteEdge = s_oSpriteLibrary.getSprite("powerup_edge");
  1136. createjs.Tween.get(_oPowerUpEdge).to({y: CANVAS_HEIGHT + oSpriteEdge.height / 2}, 800, createjs.Ease.backIn).call(function () {
  1137. if (_bFloor === false) {
  1138. s_oStage.removeChild(_oPowerUpEdge);
  1139. _oPowerUpEdge = null;
  1140. }
  1141. else
  1142. {
  1143. createjs.Tween.get(_oPowerUpEdge).to({y: 940}, 800, createjs.Ease.backOut);
  1144. }
  1145. });
  1146. for (var i = 0; i < _aBall.length; i++) {
  1147. _aBall[i].downFloor(false);
  1148. }
  1149. _bFloor = false;
  1150. };
  1151. this.deactiveMagnetic = function () {
  1152. var oSpriteNormalBall = s_oSpriteLibrary.getSprite("normal_ball");
  1153. for (var i = 0; i < _aBall.length; i++) {
  1154. _aBall[i].changeSprite(oSpriteNormalBall, "normal");
  1155. }
  1156. s_oStage.removeChild(_oPadding);
  1157. this.createPadding(_oPadding.x);
  1158. this.launchUnmagneticBall();
  1159. _bMagnetic = false;
  1160. };
  1161. this.deactiveShot = function () {
  1162. _oSpriteBullet = null;
  1163. _bShot = false;
  1164. if (_oCannons) {
  1165. _oCannons.gotoAndPlay("go");
  1166. _oCannons.on("animationend", function () {
  1167. if (_bShot === false) {
  1168. s_oStage.removeChild(_oCannons);
  1169. _oCannons = null;
  1170. }
  1171. });
  1172. }
  1173. _pPaddingDim.x = PADDLE_DIMENSION[1] / 2;
  1174. _iOffsetXPadRight = CANVAS_WIDTH - EDGE_OFFSET - _pPaddingDim.x;
  1175. _iOffsetXPadLeft = EDGE_OFFSET + _pPaddingDim.x;
  1176. };
  1177. this.checkOtherActiveBonus = function () {
  1178. if (_bFireBall === false && _bFloor === true && _bMagnetic === false && _bShot === false) {
  1179. _bAlmostABonus = false;
  1180. }
  1181. };
  1182. this.bonusGesture = function () {
  1183. for (var i = 0; i < _iNum_Of_Bonus_Spawned; i++) {
  1184. _aBonus[i].update();
  1185. if (_aBonus[i] !== undefined) {
  1186. if (_aBonus[i].getX() > (_oPadding.x - _pPaddingDim.x) - _aBonus[i].getInfoData("offsetX") && _aBonus[i].getX() < (_oPadding.x + _pPaddingDim.x) + _aBonus[i].getInfoData("offsetX") && _aBonus[i].getY() > (_oPadding.y - _pPaddingDim.y) - _aBonus[i].getInfoData("offsetY") && _aBonus[i].getY() < (_oPadding.y + _pPaddingDim.y) + _aBonus[i].getInfoData("offsetY")) {
  1187. switch (_aBonus[i].getInfoData("Type")) {
  1188. case 0:
  1189. this.bonusLargePad();
  1190. break;
  1191. case 1:
  1192. this.bonusFireBall();
  1193. break;
  1194. case 2:
  1195. this.bonusFloor();
  1196. break;
  1197. case 3:
  1198. this.bonusMagnetic();
  1199. break;
  1200. case 4:
  1201. this.bonusLife();
  1202. break;
  1203. case 5:
  1204. this.bonusMultiBall();
  1205. break;
  1206. case 6:
  1207. this.bonusShot();
  1208. break;
  1209. case 7:
  1210. this.bonusSlowBall();
  1211. break;
  1212. case 8:
  1213. this.bonusFastBall();
  1214. break;
  1215. case 9:
  1216. this.bonusSmallPad();
  1217. break;
  1218. }
  1219. this.unloadBonus(i);
  1220. break;
  1221. }
  1222. }
  1223. }
  1224. };
  1225. this.unloadBonus = function (ID) {
  1226. _aBonus[ID].unload();
  1227. _aBonus.splice(ID, 1);
  1228. if (_iNum_Of_Bonus_Spawned > 0) {
  1229. _iNum_Of_Bonus_Spawned--;
  1230. }
  1231. for (var i = 0; i < _iNum_Of_Bonus_Spawned; i++) {
  1232. _aBonus[i].resetTheIndex(i);
  1233. }
  1234. };
  1235. this.unloadBall = function (ID) {
  1236. _aBall[ID].unload();
  1237. _aBall.splice(ID, 1);
  1238. for (var i = 0; i < _aBall.length; i++) {
  1239. _aBall[i].resetTheIndex(i);
  1240. }
  1241. };
  1242. this.unloadBullet = function (ID) {
  1243. _aBullet[ID].unload();
  1244. _aBullet.splice(ID, 1);
  1245. _iFiredBullet--;
  1246. for (var i = 0; i < _aBullet.length; i++) {
  1247. _aBullet[i].setIndex(i);
  1248. }
  1249. };
  1250. this.randomBonus = function (iXPos, iYPos) {
  1251. var iRand = Math.floor(Math.random() * 100);
  1252. if (iRand < SPAWN_BONUS_PROBABILITY[_iLevel-1] && _iTotBrick > 0) {
  1253. this.generateABonus(iXPos, iYPos);
  1254. }
  1255. };
  1256. this.unloadLevel = function () {
  1257. for (var i = 0; i < _aBall.length; i++) {
  1258. _aBall[i].unload();
  1259. _aBall[i] = null;
  1260. }
  1261. for (var i = 0; i < _aBonus.length; i++) {
  1262. _aBonus[i].unload();
  1263. _aBonus[i] = null;
  1264. }
  1265. if (_aBullet !== undefined) {
  1266. for (var i = 0; i < _aBullet.length; i++) {
  1267. _aBullet[i].unload();
  1268. _aBullet[i] = null;
  1269. }
  1270. }
  1271. if (_bLargePad === true) {
  1272. this.deactiveLargePad();
  1273. } else if (_bSmallPad === true) {
  1274. this.deactiveSmallPad();
  1275. }
  1276. if (_bShot === true) {
  1277. _iTimeShot = 0;
  1278. s_oStage.removeChild(_oCannons);
  1279. _oCannons = null;
  1280. }
  1281. if (_bFloor === true) {
  1282. s_oStage.removeChild(_oPowerUpEdge);
  1283. _oPowerUpEdge = null;
  1284. }
  1285. if (_bMagnetic === true) {
  1286. s_oStage.removeChild(_oPadding);
  1287. this.createPadding(_oPadding.x);
  1288. }
  1289. _bShot = false;
  1290. _bLargePad = false;
  1291. _bFloor = false;
  1292. _bSlowBall = false;
  1293. _bMagnetic = false;
  1294. _bFireBall = false;
  1295. _bAlmostABonus = false;
  1296. for (var i = 0; i < _aBrick.length; i++) {
  1297. _aBrick[i].unload();
  1298. _aBrick[i] = null;
  1299. }
  1300. _iNum_Of_Bonus_Spawned = 0;
  1301. _aBrick = null;
  1302. _aBrickSectionCenterH = null;
  1303. _aBrickSectionCenterY = null;
  1304. _aBrickSectionDownLeft = null;
  1305. _aBrickSectionDownRight = null;
  1306. _aBrickSectionUpLeft = null;
  1307. _aBrickSectionUpRight = null;
  1308. _aBonus = null;
  1309. _aBullet = null;
  1310. _aBall = null;
  1311. _aBrick = new Array();
  1312. _aBrickSectionCenterH = new Array();
  1313. _aBrickSectionCenterY = new Array();
  1314. _aBrickSectionDownLeft = new Array();
  1315. _aBrickSectionDownRight = new Array();
  1316. _aBrickSectionUpLeft = new Array();
  1317. _aBrickSectionUpRight = new Array();
  1318. _aBonus = new Array();
  1319. _aBullet = new Array();
  1320. _aBall = new Array();
  1321. };
  1322. this.update = function () {
  1323. if (_bPause === false) {
  1324. _fPhysicsTime += s_iTimeElaps;
  1325. var iTimePhysicUpdate = parseInt(_fPhysicsTime / _iPhysicsUpdateTime);
  1326. _fPhysicsTime -= (_iPhysicsUpdateTime * iTimePhysicUpdate);
  1327. for (var i = 0; i < iTimePhysicUpdate; i++) {
  1328. for (var k = 0; k < _iPhysicsScaleTime; k++) {
  1329. this.__updatePhysics();
  1330. }
  1331. }
  1332. }
  1333. };
  1334. s_oGame = this;
  1335. var _iPhysicsUpdateTime = 16;
  1336. var _iPhysicsScaleTime = 10;
  1337. BALL_SPEED = oData.ball_speed / _iPhysicsScaleTime;
  1338. BRICKS_SCORE = oData.bricks_score;
  1339. BRICKS_RESISTANCE = oData.bricks_resistance;
  1340. BRICKS_DESTRUCTIBLE = oData.bricks_destructible;
  1341. BONUS_SPEED = oData.bonus_speed / _iPhysicsScaleTime;
  1342. BONUS_TIME = oData.bonus_time;
  1343. BONUS_SCORE = oData.bonus_score;
  1344. BULLET_SPEED = oData.bullet_speed;
  1345. LIFE = oData.life;
  1346. SPEED_DOWN_BALL = oData.speed_down_ball;
  1347. SPEED_UP_BALL = oData.speed_up_ball;
  1348. NUM_LEVELS_FOR_ADS = oData.num_levels_for_ads;
  1349. this._init(iLevel);
  1350. }
  1351. var s_oGame;