CGame.js 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141
  1. function CGame(oData) {
  2. var _oInterface;
  3. var _oTrack;
  4. var _oMonitor;
  5. var _oAnimMonitor;
  6. var _oShapeWall;
  7. var _oPinBinder;
  8. var _oSemaphore;
  9. var _oCharacter;
  10. var _oScene;
  11. var _oBall;
  12. var _oContainerGame;
  13. var _oPowerBar;
  14. var _oEffectArrow;
  15. var _oDirFunc;
  16. var _bLaunched = false;
  17. var _bWallCollision = false;
  18. var _bDetectPinMovement = false;
  19. var _bPressedKeys = false;
  20. var _bSpare = false;
  21. var _bStrike = false;
  22. var _bKeyDir = false;
  23. var _bPinCollision = false;
  24. var _bAnimStrike = false;
  25. var _bAnimSpare = false;
  26. var _bAnimGutter = false;
  27. var _bChannelCol = false;
  28. var _bRepositionTurn = false;
  29. var _bPhysicsPinsDepends = true;
  30. var _bPlayCharacter = false;
  31. var _bExtraTurn = false;
  32. var _bHitFloor = false;
  33. var _bAwakePins = false;
  34. var _iScore;
  35. var _iTurn = 1;
  36. var _iStage = 0;
  37. var _iStateLaunch = DIRECTION;
  38. var _iPinDown;
  39. var _iPinDownTurn;
  40. var _aObjects;
  41. var _aPinObject;
  42. var _aScoreStage;
  43. var _aScoreStageStrikeCounter;
  44. var _fTimeRefreshDirection;
  45. var _fTimeResetLaunch;
  46. var _iGameState = STATE_INIT;
  47. var _oCamera = null;
  48. this._init = function () {
  49. this.pause(true);
  50. _iScore = 0;
  51. _iPinDown = 0;
  52. _iPinDownTurn = 0;
  53. $(s_oMain).trigger("start_session");
  54. $(s_oMain).trigger("start_level", 1);
  55. _aObjects = new Array();
  56. _aPinObject = new Array();
  57. playSound("ambience", 1, true);
  58. this.resetScoreStageArray();
  59. _oContainerGame = new createjs.Container();
  60. s_oStage.addChild(_oContainerGame);
  61. _oScene = new CScenario();
  62. _oShapeWall = new createjs.Shape();
  63. _oShapeWall.graphics.beginFill("black").drawRect(0, 0, CANVAS_WIDTH, 460);
  64. _oContainerGame.addChild(_oShapeWall);
  65. _oTrack = new CTrack(0, 362, s_oSpriteLibrary.getSprite("bowling_track"), _oScene.getTrackBodyDepth(), _oContainerGame);
  66. _aObjects.push(_oTrack);
  67. _oPowerBar = new CPowerBar(100, CANVAS_HEIGHT_HALF + 225, s_oStage);
  68. _oPowerBar.setVisible(false);
  69. var oSpriteEffectArrow = s_oSpriteLibrary.getSprite("effect_arrow");
  70. _oEffectArrow = new CEffectArray(CANVAS_WIDTH + 10, CANVAS_HEIGHT_HALF + 430, oSpriteEffectArrow, s_oStage);
  71. _oEffectArrow.setVisible(false);
  72. if (SHOW_3D_RENDER) {
  73. _oCamera = camera;
  74. } else {
  75. _oCamera = createOrthoGraphicCamera();
  76. }
  77. _oScene.ballBody().mass = 0;
  78. var oSpirtePins = s_oSpriteLibrary.getSprite("pin");
  79. for (var i = 0; i < PINS_POSITION.length; i++) {
  80. _aPinObject[i] = new CPin(0, 0, oSpirtePins, _oScene.getPinByID(i), _oContainerGame);
  81. _aObjects.push(_aPinObject[i]);
  82. _aPinObject[i].setPosRef(OFFSET_TRACK_POSITION.z);
  83. }
  84. if (PIN_TEST) {
  85. _aPinObject.push(new CPin(0, 0, oSpirtePins, _oScene.getPinByID(i), _oContainerGame));
  86. _aObjects.push(_aPinObject[_aPinObject.length - 1]);
  87. _aPinObject[_aPinObject.length - 1].getPhysics().quaternion.setFromEuler(Math.radians(0), Math.radians(0), Math.radians(0), 'XYZ');
  88. _aPinObject[_aPinObject.length - 1].getPhysics().mass = 0;
  89. }
  90. var oSpriteBall = s_oSpriteLibrary.getSprite("ball");
  91. _oBall = new CBall(0, 0, oSpriteBall, _oScene.ballBody(), _oContainerGame);
  92. _oBall.setVisible(false);
  93. _aObjects.push(_oBall);
  94. resizeCanvas3D();
  95. var oSpritePinBinder = s_oSpriteLibrary.getSprite("pin_binder");
  96. _oPinBinder = new CPinDragger(397, 470, oSpritePinBinder, _oContainerGame);
  97. _oPinBinder.setVisible(false);
  98. _oPinBinder.changeState("throw_pins_0");
  99. fadeSound(1,0,MS_FADE_SOUNDTRACK,"soundtrack");
  100. var oSpriteMonitor = s_oSpriteLibrary.getSprite("monitor");
  101. _oMonitor = createBitmap(oSpriteMonitor);
  102. _oMonitor.y = 225;
  103. _oContainerGame.addChild(_oMonitor);
  104. var oSpriteSemaphore = s_oSpriteLibrary.getSprite("semaphore");
  105. _oSemaphore = new CSemaphore(CANVAS_WIDTH_HALF + 3, 381, oSpriteSemaphore, _oContainerGame);
  106. _oCharacter = new CCharacter(CHARACTER_START_POS.x, CHARACTER_START_POS.y, _oContainerGame);
  107. _oInterface = new CInterface();
  108. _oAnimMonitor = new CAnimMonitor(0, 291, _oInterface.getContainerBoard());
  109. if (!s_bMobile) {
  110. document.onkeydown = onKeyDown;
  111. document.onkeyup = onKeyUp;
  112. }
  113. if (!SHOW_3D_RENDER) {
  114. _oInterface.createHelpPanel();
  115. } else {
  116. this.onExitHelp();
  117. }
  118. };
  119. this.resetScoreStageArray = function () {
  120. _aScoreStage = new Array();
  121. _aScoreStageStrikeCounter = new Array();
  122. for (var i = 0; i < LAUNCH_TURN; i++) {
  123. _aScoreStage[i] = new Array();
  124. if(i !== 9){
  125. for(var j=0; j<3; j++){
  126. _aScoreStage[i][j] = 0;
  127. }
  128. } else {
  129. for(var j=0; j<4; j++){
  130. _aScoreStage[i][j] = 0;
  131. }
  132. }
  133. _aScoreStageStrikeCounter[i] = 0;
  134. }
  135. };
  136. this.refreshPos = function (iXPos, iYPos) {
  137. _oPowerBar.setPosition(_oPowerBar.getStartPos().x + iXPos, _oPowerBar.getStartPos().y - iYPos);
  138. _oEffectArrow.setPosition(_oEffectArrow.getStartPos().x - iXPos, _oEffectArrow.getStartPos().y - iYPos);
  139. };
  140. this.startPinsPosition = function () {
  141. this.updatePinsPosition();
  142. for (var i = 0; i < _aPinObject.length; i++) {
  143. _aPinObject[i].setStartPos(_aPinObject[i].getX(), _aPinObject[i].getY());
  144. }
  145. };
  146. this.onMouseDown = function () {
  147. if (_iStateLaunch === DIRECTION) {
  148. s_oGame.deactiveEventMouseMove();
  149. s_oGame.activeStateLaunchPower();
  150. } else if (_iStateLaunch === POWER) {
  151. _oPowerBar.removeTweensMask();
  152. s_oGame.activeStateLaunchEffect();
  153. } else if (_iStateLaunch === EFFECT) {
  154. s_oGame.launchBall();
  155. _iStateLaunch = DIRECTION;
  156. }
  157. };
  158. this.manageControl = function () {
  159. if (_bLaunched) {
  160. return;
  161. }
  162. if (_iStateLaunch === DIRECTION) {
  163. _oInterface.dirArrowsVisibility(false);
  164. _bKeyDir = false;
  165. s_oGame.activeStateLaunchPower();
  166. } else if (_iStateLaunch === POWER) {
  167. _oPowerBar.removeTweensMask();
  168. s_oGame.activeStateLaunchEffect();
  169. } else if (_iStateLaunch === EFFECT) {
  170. _oEffectArrow.stopAnimation();
  171. _oEffectArrow.removeAllEventListeners();
  172. _bPlayCharacter = true;
  173. _bWallCollision = false;
  174. _bLaunched = true;
  175. _iStateLaunch = DIRECTION;
  176. }
  177. };
  178. function onKeyDown(evt) {
  179. if (!_bPressedKeys && _iGameState === STATE_PLAY && !_bLaunched) {
  180. if (_iStateLaunch === DIRECTION) {
  181. if (evt.keyCode === 37) {
  182. s_oGame.onLeft();
  183. _bPressedKeys = true;
  184. } else if (evt.keyCode === 39) {
  185. s_oGame.onRight();
  186. _bPressedKeys = true;
  187. }
  188. }
  189. if (evt.keyCode === 32) {
  190. s_oGame.manageControl();
  191. _bPressedKeys = true;
  192. }
  193. }
  194. evt.preventDefault();
  195. return false;
  196. }
  197. function onKeyUp(evt) {
  198. if (_bPressedKeys && _iGameState === STATE_PLAY) {
  199. if (_iStateLaunch === DIRECTION) {
  200. if (evt.keyCode === 37) {
  201. _bPressedKeys = false;
  202. s_oGame.dirKeyUp();
  203. } else if (evt.keyCode === 39) {
  204. _bPressedKeys = false;
  205. s_oGame.dirKeyUp();
  206. }
  207. }
  208. if (evt.keyCode === 32) {
  209. _bPressedKeys = false;
  210. }
  211. }
  212. evt.preventDefault();
  213. return false;
  214. }
  215. this.dirKeyUp = function () {
  216. _bKeyDir = false;
  217. };
  218. this.onLeft = function () {
  219. _oDirFunc = s_oGame.onLeft;
  220. _bKeyDir = true;
  221. _fTimeRefreshDirection = TIME_REFRESH_DIRECTION;
  222. var oBallBody = _oScene.ballBody();
  223. oBallBody.position.x -= DIRECTION_VELOCITY;
  224. if (oBallBody.position.x > LIMIT_HAND_RANGE_POS.x) {
  225. oBallBody.position.x = LIMIT_HAND_RANGE_POS.x;
  226. } else {
  227. _oCharacter.setPosition(_oCharacter.getX() - DIRECTION_CHARACTER_VELOCITY, _oCharacter.getY());
  228. }
  229. };
  230. this.onRight = function () {
  231. _oDirFunc = s_oGame.onRight;
  232. _bKeyDir = true;
  233. _fTimeRefreshDirection = TIME_REFRESH_DIRECTION;
  234. var oBallBody = _oScene.ballBody();
  235. oBallBody.position.x += DIRECTION_VELOCITY;
  236. if (oBallBody.position.x < -LIMIT_HAND_RANGE_POS.x) {
  237. oBallBody.position.x = -LIMIT_HAND_RANGE_POS.x;
  238. } else {
  239. _oCharacter.setPosition(_oCharacter.getX() + DIRECTION_CHARACTER_VELOCITY, _oCharacter.getY());
  240. }
  241. };
  242. this.sortDepth = function (oObj1, oObj2) {
  243. if (oObj1 === null || oObj2 === null) {
  244. return;
  245. }
  246. if (oObj1.getDepthPos() < oObj2.getDepthPos()) {
  247. if (_oContainerGame.getChildIndex(oObj1.getObject()) > _oContainerGame.getChildIndex(oObj2.getObject())) {
  248. _oContainerGame.swapChildren(oObj1.getObject(), oObj2.getObject());
  249. }
  250. } else if (oObj1.getDepthPos() > oObj2.getDepthPos()) {
  251. if (_oContainerGame.getChildIndex(oObj2.getObject()) > _oContainerGame.getChildIndex(oObj1.getObject())) {
  252. _oContainerGame.swapChildren(oObj2.getObject(), oObj1.getObject());
  253. }
  254. }
  255. };
  256. this.onExitHelp = function () {
  257. this.pause(false);
  258. _oInterface.onExitFromHelp();
  259. };
  260. this.ballPosition = function () {
  261. var oBallBody = _oScene.ballBody();
  262. var oPos2DBall = this.convert3dPosTo2dScreen(oBallBody.position, _oCamera);
  263. var fScaleDistance = oPos2DBall.z * (BALL_SCALE_FACTOR - _oBall.getStartScale()) + _oBall.getStartScale();
  264. _oBall.setPosition(oPos2DBall.x, oPos2DBall.y);
  265. _oBall.scale(fScaleDistance);
  266. if (!s_bMobile) {
  267. this.refreshShadowCast(_oBall, oBallBody, fScaleDistance);
  268. }
  269. };
  270. this.refreshShadowCast = function (oObject, oBody, fScaleDistance) {
  271. var oFieldBody = _oScene.getTrackBody();
  272. if (oBody.position.z - BALL_RADIUS < oFieldBody.position.z) {
  273. oObject.scaleShadow(0);
  274. return;
  275. }
  276. var oPosShadow = {x: oBody.position.x, y: oBody.position.y, z: oFieldBody.position.z};
  277. var oPos2dShadow = this.convert3dPosTo2dScreen(oPosShadow, _oCamera);
  278. var fDistance = (-(oBody.position.z - BALL_RADIUS) + oFieldBody.position.z) + 1;
  279. var fScaleHeight = fDistance * fScaleDistance;
  280. oObject.scaleShadow(fScaleHeight);
  281. oObject.setAlphaByHeight(fDistance);
  282. oObject.setPositionShadow(oPos2dShadow.x, oPos2dShadow.y);
  283. };
  284. this.launchBall = function () {
  285. _oBall.setVisible(true);
  286. var fForce = (_oPowerBar.getMaskValue() / _oPowerBar.getMaskHeight()) * 100;
  287. if (fForce < MIN_LAUNCH_FORCE) {
  288. fForce = MIN_LAUNCH_FORCE;
  289. }
  290. s_oGame.addImpulseToBall(-fForce * FORCE_RATE);
  291. s_oGame.addAngularVelocityToBall(_oEffectArrow.getStoppedFrame() * EFFECT_POWER_RATE);
  292. };
  293. this.activeStateLaunchPower = function () {
  294. _iStateLaunch = POWER;
  295. _oPowerBar.setVisible(true);
  296. _oPowerBar.animFade(1);
  297. _oPowerBar.animateMask(TIME_POWER_BAR);
  298. };
  299. this.activeStateLaunchEffect = function () {
  300. _iStateLaunch = EFFECT;
  301. _oEffectArrow.animFade(1);
  302. _oEffectArrow.animArrow();
  303. _oEffectArrow.setVisible(true);
  304. };
  305. this.addAngularVelocityToBall = function (fForce) {
  306. var oForce = {x: 0, y: fForce, z: 0};
  307. _oScene.setElementAngularVelocity(_oScene.ballBody(), oForce);
  308. };
  309. this.completeLaunch = function () {
  310. if (_bWallCollision) {
  311. return;
  312. }
  313. _bWallCollision = true;
  314. _bDetectPinMovement = true;
  315. _oBall.animFade(0);
  316. _oBall.playSound();
  317. createjs.Tween.get(this).wait(1500).call(function () {
  318. _oCharacter.animFade(0);
  319. });
  320. _fTimeResetLaunch = TIME_RESET_LAUNCH;
  321. };
  322. this.isAwakwePins = function (bVal) {
  323. _bAwakePins = bVal;
  324. };
  325. this.awakePins = function () {
  326. if (_bAwakePins) {
  327. for (var i = 0; i < _aPinObject.length; i++) {
  328. if (_aPinObject[i].getPhysics().position.y > _oTrack.getDepthPos() && _aPinObject[i].isDownYet()) {
  329. _aPinObject[i].getPhysics().wakeUp();
  330. } else if (_aPinObject[i].getPhysics().position.y > _oTrack.getDepthPos() && _iTurn === 1) {
  331. _aPinObject[i].getPhysics().wakeUp();
  332. }
  333. }
  334. }
  335. };
  336. this.onStopAllPin = function () {
  337. var iPinDownTurn = this.countPinDown();
  338. _iPinDown += iPinDownTurn;
  339. this.controlTurnResult(iPinDownTurn);
  340. _oPowerBar.mask(0);
  341. _oEffectArrow.animFade(0);
  342. _oPowerBar.animFade(0);
  343. };
  344. this.setPinsPhysicsMovement = function (bVal) {
  345. _bPhysicsPinsDepends = bVal;
  346. };
  347. this.nextStage = function () {
  348. this.resetScene();
  349. _oPinBinder.setVisible(false);
  350. _oScene.getPinsBinder().collisionResponse = 0;
  351. _oScene.getPinsBinder().position.y = PINS_BINDER_POSITION.y;
  352. _iPinDownTurn = 0;
  353. this.activeControl();
  354. };
  355. this.pinBinderAction = function () {
  356. _oPinBinder.setVisible(true);
  357. _oScene.getPinsBinder().collisionResponse = 1;
  358. _oPinBinder.animThrowPins();
  359. };
  360. this.repositionPins = function () {
  361. for (var i = 0; i < _aPinObject.length; i++) {
  362. _aPinObject[i].resetState();
  363. _aPinObject[i].setPosition(_aPinObject[i].getX(), _aPinObject[i].getY() - 100);
  364. _aPinObject[i].animReposition(_aPinObject[i].getStartPos().y, function () {
  365. });
  366. }
  367. };
  368. this.controlTurnResult = function (iPinDownTurn) {
  369. this.addBonusScoreToPreviousStage(iPinDownTurn);
  370. var oResult;
  371. if (!_bExtraTurn) {
  372. oResult = this.addScoreNormalTurns(iPinDownTurn);
  373. } else {
  374. oResult = this.addExtraScore(iPinDownTurn);
  375. }
  376. var bLastStage = false;
  377. _iScore += iPinDownTurn;
  378. if (_iStage !== 9) {
  379. _aScoreStage[_iStage][_iTurn - 1] = iPinDownTurn;
  380. _aScoreStage[_iStage][2] += iPinDownTurn;
  381. _oInterface.refreshTurnsBoard(_iStage, _iTurn, _aScoreStage[_iStage][2], oResult.point, bLastStage);
  382. } else {
  383. _aScoreStage[_iStage][_iTurn - 1] = iPinDownTurn;
  384. _aScoreStage[_iStage][3] += iPinDownTurn;
  385. bLastStage = true;
  386. _oInterface.refreshTurnsBoard(_iStage, _iTurn, _aScoreStage[_iStage][3], oResult.point, bLastStage);
  387. }
  388. if(_iStage !== 9){
  389. if(_bStrike){
  390. _aScoreStageStrikeCounter[_iStage] += 2;
  391. }
  392. if(_bSpare){
  393. _aScoreStageStrikeCounter[_iStage] += 1;
  394. }
  395. }
  396. if (oResult.next) {
  397. this.nextTurn();
  398. if (_iPinDown < _aPinObject.length) {
  399. _oPinBinder.setVisible(true);
  400. if(_iTurn<4 ){
  401. _oPinBinder.takeRemainPinsAndRepos();
  402. }
  403. _oScene.getPinsBinder().collisionResponse = 1;
  404. _bRepositionTurn = true;
  405. } else {
  406. _iPinDown = 0;
  407. }
  408. } else {
  409. if (_iStage !== 9) {
  410. _iPinDown = 0;
  411. _iStage++;
  412. _iTurn = 1;
  413. _oInterface.setStateTurnBoard(_iStage, "on");
  414. } else {
  415. this.gameOver();
  416. }
  417. }
  418. _oInterface.refresTotalBoard(_iScore);
  419. _iPinDownTurn = 0;
  420. _bChannelCol = false;
  421. _bPinCollision = false;
  422. _bHitFloor = false;
  423. _bStrike = false;
  424. _bSpare = false;
  425. };
  426. this.gameOver = function () {
  427. _iGameState = STATE_FINISH;
  428. _oInterface.createEndPanel(_iScore);
  429. };
  430. this.addExtraScore = function (iPinDownTurn) {
  431. var oResult = {next: true, point: iPinDownTurn};
  432. if (iPinDownTurn >= _aPinObject.length) { //STRIKE
  433. if (_bExtraTurn) {
  434. oResult = this.strikeResult();
  435. } else if (_iTurn === 2 && _bExtraTurn) {
  436. oResult = this.spareResult();
  437. }
  438. } else if (iPinDownTurn < _aPinObject.length) { //ARITMETIC ADDICTION
  439. oResult = this.aritmeticResult(iPinDownTurn);
  440. }
  441. return oResult;
  442. };
  443. this.addScoreNormalTurns = function (iPinDownTurn) {
  444. var oResult = {next: true, point: iPinDownTurn};
  445. if (_iPinDown === _aPinObject.length) { //STRIKE
  446. if (_iTurn === 1 && !_bExtraTurn) {
  447. oResult = this.strikeResult();
  448. } else if (_iTurn === 2 && !_bExtraTurn) {
  449. oResult = this.spareResult();
  450. }
  451. } else if (_iPinDown < _aPinObject.length && _iTurn === 2) { //ARITMETIC ADDICTION
  452. oResult = this.aritmeticResult(iPinDownTurn);
  453. }
  454. return oResult;
  455. };
  456. this.aritmeticResult = function (iPinDownTurn) {
  457. this.pinBinderAction();
  458. return {next: _bExtraTurn, point: iPinDownTurn};
  459. };
  460. this.spareResult = function () {
  461. var szPoint, bNextTurn = false;
  462. _bSpare = true;
  463. if (_iStage === 9) {
  464. _bExtraTurn = true;
  465. bNextTurn = true;
  466. }
  467. this.pinBinderAction();
  468. _bAnimSpare = true;
  469. playSound("gingle_spare", 1, false);
  470. _oAnimMonitor.setVisibleMonitorSpare(true);
  471. szPoint = "/";
  472. return {next: bNextTurn, point: szPoint};
  473. };
  474. this.strikeResult = function () {
  475. var szPoint, bNextTurn = false;
  476. _bStrike = true;
  477. _oAnimMonitor.setVisibleMonitorStrike(true);
  478. _bAnimStrike = true;
  479. playSound("gingle_strike", 1, false);
  480. szPoint = "X";
  481. if (_iStage === 9) {
  482. _bExtraTurn = true;
  483. bNextTurn = true;
  484. }
  485. this.pinBinderAction();
  486. return {next: bNextTurn, point: szPoint};
  487. };
  488. this.nextTurn = function () {
  489. if (_bExtraTurn) {
  490. if (_iTurn === 3) {
  491. this.gameOver();
  492. }
  493. } else if (_iStage === 9 && _iTurn === 2) {
  494. this.gameOver();
  495. }
  496. _iTurn++;
  497. };
  498. this.addBonusScoreToPreviousStage = function(iPinDownTurn){
  499. for (var i = 0; i < LAUNCH_TURN; i++) {
  500. if(_aScoreStageStrikeCounter[i]>0){
  501. _aScoreStageStrikeCounter[i]--;
  502. _aScoreStage[i][2] += iPinDownTurn;
  503. _iScore += iPinDownTurn;
  504. _oInterface.refreshTurnsBoard(i, null, _aScoreStage[i][2], null);
  505. }
  506. }
  507. };
  508. this.activeControl = function () {
  509. _oSemaphore.changeState("green");
  510. _bLaunched = false;
  511. _oInterface.dirArrowsVisibility(true);
  512. _oCharacter.setPosition(CHARACTER_START_POS.x, CHARACTER_START_POS.y);
  513. _oCharacter.animFade(1);
  514. _oCharacter.setVisible(true);
  515. };
  516. this.countPinDown = function () {
  517. var iPinDown = _iPinDownTurn;
  518. for (var i = 0; i < _aPinObject.length; i++) {
  519. if (!_aPinObject[i].isDownYet()) {
  520. var oVec3 = new CANNON.Vec3();
  521. _aPinObject[i].getPhysics().quaternion.toEuler(oVec3);
  522. oVec3.x = Math.ceil(Math.degrees(oVec3.x));
  523. oVec3.y = Math.ceil(Math.degrees(oVec3.y));
  524. oVec3.z = Math.ceil(Math.degrees(oVec3.z));
  525. if (oVec3.x > 20 || oVec3.x < -20 || oVec3.y > 20 || oVec3.y < -20 || _aPinObject[i].getPhysics().position.z < _oTrack.getHeightPos()) {
  526. iPinDown++;
  527. _aPinObject[i].setDown(true);
  528. }
  529. }
  530. }
  531. return iPinDown;
  532. };
  533. this.animUpRemainPins = function () {
  534. for (var i = 0; i < _aPinObject.length; i++) {
  535. if (!_aPinObject[i].isDownYet()) {
  536. _aPinObject[i].animTake(_aPinObject[i].getStartPos().y - 100);
  537. }
  538. }
  539. };
  540. this.repositionRemainPins = function () {
  541. for (var i = 0; i < _aPinObject.length; i++) {
  542. if (!_aPinObject[i].isDownYet()) {
  543. _aPinObject[i].getPhysics().position.set(PINS_POSITION[i].x, PINS_POSITION[i].y, PINS_POSITION[i].z);
  544. _aPinObject[i].getPhysics().quaternion.setFromEuler(0, 0, 0, 'XYZ');
  545. _aPinObject[i].getPhysics().angularVelocity.set(0, 0, 0);
  546. _aPinObject[i].getPhysics().velocity.set(0, 0, 0);
  547. _aPinObject[i].getPhysics().mass = PIN_PROPERTY.mass;
  548. _aPinObject[i].setPosition(_aPinObject[i].getStartPos().x, _aPinObject[i].getStartPos().y - 100);
  549. _aPinObject[i].setPlayedSound(false);
  550. var fAlpha = this.pinReflection(i, _aPinObject[i].getPhysics().position);
  551. _aPinObject[i].setAlphaByHeight(0);
  552. _aPinObject[i].animReposition(_aPinObject[i].getStartPos().y, fAlpha);
  553. var oPos2DPin = this.convert3dPosTo2dScreen(_aPinObject[i].getPhysics().position, _oCamera);
  554. this.pinScale(i, oPos2DPin);
  555. _aPinObject[i].setVisible(true);
  556. _aPinObject[i].pinRotation();
  557. } else {
  558. _aPinObject[i].setVisible(false);
  559. }
  560. }
  561. _bRepositionTurn = false;
  562. };
  563. this.unload = function () {
  564. s_oStage.removeAllChildren();
  565. _oInterface.unload();
  566. _oScene.destroyWorld();
  567. _oScene = null;
  568. };
  569. this.addImpulseToBall = function (fForceY) {
  570. if (_iGameState !== STATE_PLAY) {
  571. return;
  572. }
  573. _oScene.ballBody().mass = BALL_MASS;
  574. var fX = 0;
  575. var fZ = 0;
  576. var oDir = {x: fX, y: fForceY, z: fZ};
  577. var oBall = _oScene.ballBody();
  578. _oScene.addImpulse(oBall, oDir);
  579. _oScene.setElementAngularVelocity(oBall, {x: 0, y: 0, z: 0});
  580. _bLaunched = true;
  581. _oSemaphore.changeState("red");
  582. };
  583. this.pause = function (bVal) {
  584. if (bVal) {
  585. _iGameState = STATE_PAUSE;
  586. } else {
  587. _iGameState = STATE_PLAY;
  588. }
  589. createjs.Ticker.paused = bVal;
  590. };
  591. this.setPinDown = function (iID, bVal, iWhere) {
  592. if (_aPinObject[iID].isDownYet() === bVal || _bRepositionTurn) {
  593. return;
  594. }
  595. if (iWhere === WALL && !_aPinObject[iID].isDownYet()) {
  596. _aPinObject[iID].setVisibleRef(false);
  597. } else if (iWhere === SIDE_PINS_FLOOR) {
  598. _aPinObject[iID].setPosRef(_oScene.getSideFloorPins(0).position.z);
  599. }
  600. _aPinObject[iID].setDown(bVal);
  601. if (bVal) {
  602. _iPinDownTurn++;
  603. } else {
  604. _iPinDownTurn--;
  605. }
  606. };
  607. this.onExit = function () {
  608. this.unload();
  609. $(s_oMain).trigger("end_level");
  610. $(s_oMain).trigger("show_interlevel_ad");
  611. $(s_oMain).trigger("end_session", _iScore);
  612. console.log("score: " + _iScore);
  613. fadeSound(0,1,MS_FADE_SOUNDTRACK,"soundtrack");
  614. stopSound("ambience");
  615. s_oMain.gotoMenu();
  616. };
  617. this.restartGame = function () {
  618. this.resetValues();
  619. this.resetScene();
  620. _iGameState = STATE_PLAY;
  621. $(s_oMain).trigger("restart_level", 1);
  622. };
  623. this.resetValues = function () {
  624. _iStage = 0;
  625. _iScore = 0;
  626. _iPinDown = 0;
  627. _iPinDownTurn = 0;
  628. _iTurn = 1;
  629. _bLaunched = false;
  630. _bWallCollision = false;
  631. _bDetectPinMovement = false;
  632. _bPressedKeys = false;
  633. _bSpare = false;
  634. _bStrike = false;
  635. _bKeyDir = false;
  636. _bPinCollision = false;
  637. _bAnimStrike = false;
  638. _bHitFloor = false;
  639. _bAnimSpare = false;
  640. _bAnimGutter = false;
  641. _bChannelCol = false;
  642. _bRepositionTurn = false;
  643. _bPhysicsPinsDepends = true;
  644. _bPlayCharacter = false;
  645. _bExtraTurn = false;
  646. this.resetScoreStageArray();
  647. for (var i = 0; i < LAUNCH_TURN - 1; i++) {
  648. for (var j = 0; j < 2; j++) {
  649. if (j === 0) {
  650. _oInterface.refreshTurnsBoard(i, j + 1, _iScore, 0, false);
  651. } else {
  652. _oInterface.refreshTurnsBoard(i, j + 1, _iScore, "", false);
  653. }
  654. _oInterface.setStateTurnBoard(i, "off");
  655. }
  656. }
  657. for (var j = 0; j < 3; j++) {
  658. if (j === 0) {
  659. _oInterface.refreshTurnsBoard(LAUNCH_TURN - 1, j + 1, _iScore, 0, true);
  660. } else {
  661. _oInterface.refreshTurnsBoard(LAUNCH_TURN - 1, j + 1, _iScore, "", true);
  662. }
  663. _oInterface.setStateTurnBoard(LAUNCH_TURN - 1, "off");
  664. }
  665. _oInterface.setStateTurnBoard(0, "on");
  666. _oInterface.refresTotalBoard(0);
  667. _oAnimMonitor.disableRunningMonitor();
  668. };
  669. this.resetBallPosition = function () {
  670. var oBallBody = _oScene.ballBody();
  671. oBallBody.mass = 0;
  672. oBallBody.position.set(POSITION_BALL.x, POSITION_BALL.y, POSITION_BALL.z);
  673. _oScene.setElementVelocity(oBallBody, {x: 0, y: 0, z: 0});
  674. _oScene.setElementAngularVelocity(oBallBody, {x: 0, y: 0, z: 0});
  675. _oBall.setPlayedSound(false);
  676. };
  677. this._updateInit = function () {
  678. _oScene.update();
  679. this._updateBall2DPosition();
  680. _iGameState = STATE_PLAY;
  681. };
  682. this.convert2dScreenPosTo3d = function (oPos2d, oBody) {
  683. var iWidth = (s_iCanvasResizeWidth);
  684. var iHeight = (s_iCanvasResizeHeight);
  685. var mouse3D = new THREE.Vector3((oPos2d.x / iWidth) * 2 - 1, //x
  686. -(oPos2d.y / iHeight) * 2 + 1, //y
  687. -1); //z
  688. mouse3D.unproject(_oCamera);
  689. mouse3D.sub(_oCamera.position);
  690. mouse3D.normalize();
  691. var fFactor = oBody.position.y;
  692. mouse3D.multiply(new THREE.Vector3(fFactor, 1, fFactor));
  693. return mouse3D;
  694. };
  695. this.convert3dPosTo2dScreen = function (pos, oCamera) {
  696. var v3 = new THREE.Vector3(pos.x, pos.y, pos.z);
  697. var vector = v3.project(oCamera);
  698. var widthHalf = Math.floor(s_iCanvasResizeWidth) * 0.5;
  699. var heightHalf = Math.floor(s_iCanvasResizeHeight) * 0.5;
  700. vector.x = ((vector.x * widthHalf) + widthHalf) * s_fInverseScaling;
  701. vector.y = (-(vector.y * heightHalf) + heightHalf) * s_fInverseScaling;
  702. return vector;
  703. };
  704. this.resetScene = function () {
  705. this.resetPinsPosition();
  706. this.resetBallPosition();
  707. };
  708. this.resetPinsPosition = function () {
  709. for (var i = 0; i < _aPinObject.length; i++) {
  710. var oPinBody = _aPinObject[i].getPhysics();
  711. oPinBody.position.set(PINS_POSITION[i].x, PINS_POSITION[i].y, PINS_POSITION[i].z);
  712. oPinBody.quaternion.setFromEuler(0, 0, 0, 'XYZ');
  713. oPinBody.angularVelocity.set(0, 0, 0);
  714. oPinBody.velocity.set(0, 0, 0);
  715. oPinBody.collisionResponse = 1;
  716. oPinBody.mass = PIN_PROPERTY.mass;
  717. _aPinObject[i].setPosRef(_oScene.getTrackBody().position.z);
  718. var oPos2DPin = this.convert3dPosTo2dScreen(oPinBody.position, _oCamera);
  719. this.pinScale(i, oPos2DPin);
  720. _aPinObject[i].setDown(false);
  721. _aPinObject[i].setVisible(true);
  722. _aPinObject[i].setPlayedSound(false);
  723. _aPinObject[i].setVisibleRef(true);
  724. }
  725. };
  726. this._onEnd = function () {
  727. this.onExit();
  728. };
  729. this.swapChildrenIndex = function () {
  730. for (var i = 0; i < _aObjects.length - 1; i++) {
  731. for (var j = i + 1; j < _aObjects.length; j++) {
  732. if (_aObjects[i].getObject().visible && _aObjects[j].getObject().visible)
  733. this.sortDepth(_aObjects[i], _aObjects[j]);
  734. }
  735. }
  736. };
  737. this.updatePinsPosition = function () {
  738. for (var i = 0; i < _aPinObject.length; i++) {
  739. if (_aPinObject[i].getVisible()) {
  740. var oPos = this.pinPosition(i);
  741. var fScale = this.pinScale(i, oPos);
  742. if (_aPinObject[i].isVisibleRef)
  743. this.pinReflection(i, _aPinObject[i].getPhysics().position);
  744. this.pinFade(i);
  745. if (!PIN_TEST)
  746. _aPinObject[i].pinRotation();
  747. }
  748. }
  749. };
  750. this.pinFade = function (i) {
  751. if (_aPinObject[i].getPhysics().position.y < _oTrack.getDepthPos()) {
  752. var fFade = 1 - (_aPinObject[i].getPhysics().position.y - _oTrack.getDepthPos()) * (FADE_PIN_FACTOR - _oTrack.getDepthPos());
  753. _aPinObject[i].setAlpha(fFade);
  754. }
  755. };
  756. this.pinScale = function (iID, oPos2DPin) {
  757. var fScaleDistance = oPos2DPin.z * (PIN_SCALE_FACTOR - _aPinObject[iID].getStartScale()) + _aPinObject[iID].getStartScale();
  758. _aPinObject[iID].scale(fScaleDistance);
  759. return fScaleDistance;
  760. };
  761. this.pinReflection = function (iID, oPosBody) {
  762. if (oPosBody.y < _oTrack.getDepthPos()) {
  763. fAlpha = 0;
  764. _aPinObject[iID].setAlphaByHeight(fAlpha);
  765. return;
  766. }
  767. var oPosRef = {x: oPosBody.x, y: oPosBody.y, z: _aPinObject[iID].getPosRef()};
  768. var oPos2dReflection = this.convert3dPosTo2dScreen(oPosRef, _oCamera);
  769. var fDistance = (oPosBody.z) + _oScene.getTrackBody().position.z;
  770. var fAlpha = fDistance * (PIN_ALPHA_FACTOR - 1) + 1;
  771. if (fAlpha > PINS_REFLECTION_LIMIT) {
  772. fAlpha = PINS_REFLECTION_LIMIT;
  773. }
  774. var fRegYRef = fDistance * (PIN_REF_REGY_FACTOR - _aPinObject[iID].getRegYRef()) + _aPinObject[iID].getRegYRef();
  775. _aPinObject[iID].setRegYRef(fRegYRef);
  776. _aPinObject[iID].setAlphaByHeight(fAlpha);
  777. _aPinObject[iID].setPositionReflection(oPos2dReflection.x, oPos2dReflection.y);
  778. return fAlpha;
  779. };
  780. this.setPinCollide = function () {
  781. _bPinCollision = true;
  782. };
  783. this.pinPosition = function (iID) {
  784. var oPinBody = _aPinObject[iID].getPhysics();
  785. var oPos2DPin = this.convert3dPosTo2dScreen(oPinBody.position, _oCamera);
  786. _aPinObject[iID].setPosition(oPos2DPin.x, oPos2DPin.y);
  787. return oPos2DPin;
  788. };
  789. this.movementKeyDown = function () {
  790. if (_bKeyDir) {
  791. if (_fTimeRefreshDirection < 0) {
  792. _fTimeRefreshDirection = TIME_REFRESH_DIRECTION;
  793. _oDirFunc();
  794. } else {
  795. _fTimeRefreshDirection -= FPS_TIME;
  796. }
  797. }
  798. };
  799. this.pinsMovementDetect = function () {
  800. if (!_bDetectPinMovement) {
  801. return;
  802. }
  803. var iPinMovement = _aPinObject.length;
  804. for (var i = 0; i < _aPinObject.length; i++) {
  805. var oVelocity = _aPinObject[i].getPhysics().velocity;
  806. if (Math.abs(oVelocity.x) < MIN_VELOCITY_PINS && Math.abs(oVelocity.y) < MIN_VELOCITY_PINS) {
  807. s_oScenario.setElementVelocity(_aPinObject[i].getPhysics(), {x: 0, y: 0, z: 0});
  808. iPinMovement--;
  809. }
  810. }
  811. if (iPinMovement === 0) {
  812. this.onStopAllPin();
  813. _bDetectPinMovement = false;
  814. } else if (_fTimeResetLaunch < 0) {
  815. this.stopAllPin();
  816. this.onStopAllPin();
  817. _bDetectPinMovement = false;
  818. } else {
  819. _fTimeResetLaunch -= FPS_TIME;
  820. }
  821. };
  822. this.gutterBall = function () {
  823. if (!_bChannelCol && !_bPinCollision) {
  824. _bAnimGutter = true;
  825. _oAnimMonitor.setVisibleMonitorGutter(true);
  826. _bChannelCol = true;
  827. playSound("gingle_gutterball", 1, false);
  828. }
  829. };
  830. this.stopAllPin = function () {
  831. for (var i = 0; i < _aPinObject.length; i++) {
  832. s_oScenario.setElementVelocity(_aPinObject[i].getPhysics(), {x: 0, y: 0, z: 0});
  833. }
  834. };
  835. this.pinTest = function () {
  836. _aPinObject[_aPinObject.length - 1].pinRotation();
  837. console.log(_aPinObject[_aPinObject.length - 1].getPhysics().position);
  838. };
  839. this.animMonitor = function () {
  840. if (_bAnimStrike) {
  841. _bAnimStrike = _oAnimMonitor.animMonitor(_oAnimMonitor.getStrikeArray());
  842. } else if (_bAnimSpare) {
  843. _bAnimSpare = _oAnimMonitor.animMonitor(_oAnimMonitor.getSpareArray());
  844. } else if (_bAnimGutter) {
  845. _bAnimGutter = _oAnimMonitor.animMonitor(_oAnimMonitor.getGutterArray());
  846. if (!_bAnimGutter) {
  847. this.completeLaunch();
  848. }
  849. }
  850. };
  851. this.pinSoundCollision = function (iID) {
  852. _aPinObject[iID].playAudio();
  853. };
  854. this.twoPinsSoundCollision = function (iID1, iID2) {
  855. createjs.Tween.get(this).wait(Math.floor(Math.random() * 50)).call(function () {
  856. _aPinObject[iID1].playAudio();
  857. });
  858. createjs.Tween.get(this).wait(Math.floor(Math.random() * 50)).call(function () {
  859. _aPinObject[iID2].playAudio();
  860. });
  861. };
  862. this.ballHitFloor = function () {
  863. if (_bHitFloor) {
  864. return;
  865. }
  866. _bHitFloor = true;
  867. playSound("ball_hitting", 1, false);
  868. };
  869. this.channelForceApply = function () {
  870. if (!_bChannelCol) {
  871. return;
  872. }
  873. if (_oScene.ballBody().velocity.y > MIN_FORCE_BALL_GUTTER) {
  874. _oScene.ballBody().applyForce({x: 0, y: -100, z: 0}, new CANNON.Vec3(0, 0, 0));
  875. }
  876. };
  877. this.characterAnimation = function () {
  878. if (_bPlayCharacter) {
  879. _bPlayCharacter = _oCharacter.animCharacter();
  880. if (_oCharacter.getFrame() === 24) {
  881. this.launchBall();
  882. }
  883. }
  884. };
  885. this._updatePlay = function () {
  886. for (var i = 0; i < PHYSICS_ACCURACY; i++) {
  887. _oScene.update();
  888. this.awakePins();
  889. }
  890. this._updateBall2DPosition();
  891. if (_bPhysicsPinsDepends)
  892. this.updatePinsPosition();
  893. this.swapChildrenIndex();
  894. this.movementKeyDown();
  895. this.pinsMovementDetect();
  896. this.channelForceApply();
  897. this.characterAnimation();
  898. if (PIN_TEST)
  899. this.pinTest();
  900. this.animMonitor();
  901. };
  902. this.update = function () {
  903. switch (_iGameState) {
  904. case STATE_INIT:
  905. {
  906. this._updateInit();
  907. }
  908. break;
  909. case STATE_PLAY:
  910. {
  911. this._updatePlay();
  912. }
  913. break;
  914. case STATE_FINISH:
  915. _oScene.update();
  916. this.animMonitor();
  917. if (_bPhysicsPinsDepends)
  918. this.updatePinsPosition();
  919. break;
  920. case STATE_PAUSE:
  921. break;
  922. }
  923. };
  924. this._updateBall2DPosition = function () {
  925. this.ballPosition();
  926. _oCamera.updateProjectionMatrix();
  927. _oCamera.updateMatrixWorld();
  928. };
  929. s_oGame = this;
  930. TIME_POWER_BAR = oData.time_power_bar;
  931. SPEED_EFFECT_ARROW = oData.speed_effect_arrow;
  932. NUM_LEVEL_FOR_ADS = oData.num_levels_for_ads;
  933. this._init();
  934. }
  935. var s_oGame;