CGame.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. function CGame(oData){
  2. var _bUpdate = false;
  3. var _iState;
  4. var _oDraggingNugget = null;
  5. var _iDirHook;
  6. var _iHookSpeed;
  7. var _iRopeSpeed;
  8. var _iSlowDown;
  9. var _iScore = 0;
  10. var _iCurLevel = 1;
  11. var _iCurTargetLevel;
  12. var _iNuggetToRemove;
  13. var _iTimeElaps;
  14. var _aNuggets;
  15. var _aMalus;
  16. var _pStartPosExit;
  17. var _pStartPosAudio;
  18. var _pStartPosFullscreen;
  19. var _oHook;
  20. var _oHurt;
  21. var _oBg;
  22. var _oHelpPanel;
  23. var _oButExit;
  24. var _oButStart;
  25. var _oEndPanel;
  26. var _oChangeLevel;
  27. var _oAudioToggle;
  28. var _oLevelText;
  29. var _oTimeText;
  30. var _oTargetText;
  31. var _oLevelTextBack;
  32. var _oTimeTextBack;
  33. var _oTargetTextBack;
  34. var _oClockSprite;
  35. var _oLevelSettings;
  36. var _oButFullscreen;
  37. var _fRequestFullScreen = null;
  38. var _fCancelFullScreen = null;
  39. this._init = function(){
  40. this.changeState(STATE_HOOK_ROTATE);
  41. _oLevelSettings = new CLevelSettings();
  42. _oBg = createBitmap(s_oSpriteLibrary.getSprite('bg_game'));
  43. s_oStage.addChild(_oBg);
  44. _oLevelTextBack = new createjs.Text(TEXT_LEVEL+" 1","32px "+FONT_GAME, "#000");
  45. _oLevelTextBack.x = 310;
  46. _oLevelTextBack.y = CANVAS_HEIGHT - 30;
  47. _oLevelTextBack.textAlign = "left";
  48. _oLevelTextBack.textBaseline = "alphabetic";
  49. s_oStage.addChild(_oLevelTextBack);
  50. _oLevelText = new createjs.Text(TEXT_LEVEL+" 1","32px "+FONT_GAME, "#fff");
  51. _oLevelText.x = 308;
  52. _oLevelText.y = CANVAS_HEIGHT - 32;
  53. _oLevelText.textAlign = "left";
  54. _oLevelText.textBaseline = "alphabetic";
  55. s_oStage.addChild(_oLevelText);
  56. _oClockSprite = createBitmap(s_oSpriteLibrary.getSprite('clock'));
  57. _oClockSprite.x = 298;
  58. _oClockSprite.y = 10;
  59. s_oStage.addChild(_oClockSprite);
  60. _oTimeTextBack = new createjs.Text((LEVEL_TIME/1000),"40px "+FONT_GAME, "#000");
  61. _oTimeTextBack.x = 380;
  62. _oTimeTextBack.y = 57;
  63. _oTimeTextBack.textAlign = "center";
  64. _oTimeTextBack.textBaseline = "alphabetic";
  65. s_oStage.addChild(_oTimeTextBack);
  66. _oTimeText = new createjs.Text((LEVEL_TIME/1000),"40px "+FONT_GAME, "#fff");
  67. _oTimeText.x = 378;
  68. _oTimeText.y = 55;
  69. _oTimeText.textAlign = "center";
  70. _oTimeText.textBaseline = "alphabetic";
  71. s_oStage.addChild(_oTimeText);
  72. _iSlowDown = 0;
  73. _iRopeSpeed = 0.05;
  74. _iHookSpeed = HOOK_SPEED;
  75. _iTimeElaps = LEVEL_TIME;
  76. _iCurTargetLevel = _oLevelSettings.getLevelTarget(_iCurLevel);
  77. _iCurTarget = 0;
  78. _oTargetTextBack = new createjs.Text(_iScore+"$/"+_iCurTargetLevel+"$","40px "+FONT_GAME, "#000");
  79. _oTargetTextBack.x = 310;
  80. _oTargetTextBack.y = 117;
  81. _oTargetTextBack.textAlign = "left";
  82. _oTargetTextBack.textBaseline = "alphabetic";
  83. s_oStage.addChild(_oTargetTextBack);
  84. _oTargetText = new createjs.Text(_iScore+"$/"+_iCurTargetLevel+"$","40px "+FONT_GAME, "#fff");
  85. _oTargetText.x = 308;
  86. _oTargetText.y = 115;
  87. _oTargetText.textAlign = "left";
  88. _oTargetText.textBaseline = "alphabetic";
  89. s_oStage.addChild(_oTargetText);
  90. var oSpriteHook = s_oSpriteLibrary.getSprite("hook");
  91. _oHook = new CHook(oSpriteHook);
  92. this._initNuggets();
  93. _oButStart = new createjs.Shape();
  94. _oButStart.graphics.beginFill("yellow").drawRect(0,0,CANVAS_WIDTH,CANVAS_HEIGHT);
  95. _oButStart.alpha = 0.01;
  96. s_oStage.addChild(_oButStart);
  97. var oParent = this;
  98. _oButStart.on("pressup",function(){oParent._onStartDig()});
  99. _oHurt = new createjs.Shape();
  100. _oHurt.graphics.beginFill("red").drawRect(0,0,CANVAS_WIDTH,CANVAS_HEIGHT);
  101. _oHurt.alpha = 0.1;
  102. _oHurt.visible = false;
  103. s_oStage.addChild(_oHurt);
  104. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  105. var oSprite = s_oSpriteLibrary.getSprite('audio_icon')
  106. _pStartPosAudio = {x: CANVAS_WIDTH - 170, y: 60};
  107. _oAudioToggle = new CToggle(_pStartPosAudio.x,_pStartPosAudio.y,oSprite,s_bAudioActive,s_oStage);
  108. _oAudioToggle.addEventListener(ON_MOUSE_UP, this._onAudioToggle, this);
  109. oSprite = s_oSpriteLibrary.getSprite('but_fullscreen');
  110. _pStartPosFullscreen = {x:_pStartPosAudio.x - oSprite.width/2 - 10,y:_pStartPosAudio.y};
  111. }else{
  112. oSprite = s_oSpriteLibrary.getSprite('but_fullscreen');
  113. _pStartPosFullscreen = {x: CANVAS_WIDTH - 170, y: 60};
  114. }
  115. var doc = window.document;
  116. var docEl = doc.documentElement;
  117. _fRequestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
  118. _fCancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
  119. if(ENABLE_FULLSCREEN === false){
  120. _fRequestFullScreen = false;
  121. }
  122. if (_fRequestFullScreen && inIframe() === false){
  123. _oButFullscreen = new CToggle(_pStartPosFullscreen.x,_pStartPosFullscreen.y,oSprite,s_bFullscreen,s_oStage);
  124. _oButFullscreen.addEventListener(ON_MOUSE_UP, this._onFullscreenRelease, this);
  125. }
  126. var oSprite = s_oSpriteLibrary.getSprite('but_exit');
  127. _pStartPosExit = {x: CANVAS_WIDTH - (oSprite.width/2) - 10, y: 10+ (oSprite.height/2)};
  128. _oButExit = new CGfxButton(_pStartPosExit.x,_pStartPosExit.y,oSprite,true);
  129. _oButExit.addEventListener(ON_MOUSE_UP, this._onExit, this);
  130. oSprite = s_oSpriteLibrary.getSprite('bg_help');
  131. _oHelpPanel = new CHelp(oSprite);
  132. var oSprite = s_oSpriteLibrary.getSprite("msg_box");
  133. _oChangeLevel = new CChangeLevel(oSprite);
  134. this.refreshButtonPos(s_iOffsetX,s_iOffsetY);
  135. };
  136. this.refreshButtonPos = function(iNewX,iNewY){
  137. _oButExit.setPosition(_pStartPosExit.x - iNewX,iNewY + _pStartPosExit.y);
  138. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  139. _oAudioToggle.setPosition(_pStartPosAudio.x - iNewX,iNewY + _pStartPosAudio.y);
  140. }
  141. if (_fRequestFullScreen && inIframe() === false){
  142. _oButFullscreen.setPosition(_pStartPosFullscreen.x - iNewX,_pStartPosFullscreen.y + iNewY);
  143. }
  144. };
  145. this.unload = function(){
  146. s_oStage.removeAllChildren();
  147. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  148. _oAudioToggle.unload();
  149. _oAudioToggle = null;
  150. }
  151. if (_fRequestFullScreen && inIframe() === false){
  152. _oButFullscreen.unload();
  153. }
  154. _oButExit.unload();
  155. _oButExit = null;
  156. for(var j=0;j<_aNuggets.length;j++){
  157. _aNuggets[j].unload();
  158. }
  159. for(var i=0;i<_aMalus.length;i++){
  160. _aMalus[i].unload();
  161. }
  162. s_oGame = null;
  163. };
  164. this.resetFullscreenBut = function(){
  165. _oButFullscreen.setActive(s_bFullscreen);
  166. };
  167. this._initNuggets = function(){
  168. _aNuggets = new Array();
  169. _aMalus = new Array();
  170. var aPos = _oLevelSettings.getNuggetPosInLevel(_iCurLevel);
  171. var aInfo = _oLevelSettings.getNuggetInfoInLevel(_iCurLevel);
  172. for(var k=0;k<aPos.length;k++){
  173. var oSprite = s_oSpriteLibrary.getSprite('nugget_'+aInfo[k].type);
  174. var oNugget = new CNugget(aPos[k].x,aPos[k].y,aInfo[k].scale,oSprite);
  175. _aNuggets.push(oNugget);
  176. }
  177. var oSpriteMalus = s_oSpriteLibrary.getSprite('malus');
  178. var aMalusPos = _oLevelSettings.getMalusPosInLevel(_iCurLevel);
  179. for(var j=0;j<aMalusPos.length;j++){
  180. var oMalus = new CMalus(aMalusPos[j].x,aMalusPos[j].y,1,oSpriteMalus);
  181. _aMalus.push(oMalus);
  182. }
  183. _iNuggetToRemove = aPos.length;
  184. };
  185. this.changeLevel = function(){
  186. for(var i=0;i<_aNuggets.length;i++){
  187. _aNuggets[i].unload();
  188. }
  189. for(var t=0;t<_aMalus.length;t++){
  190. _aMalus[t].unload();
  191. }
  192. _iSlowDown = 0;
  193. _iHookSpeed = HOOK_SPEED;
  194. _oHook.reset();
  195. _iRopeSpeed+=0.025;
  196. _iTimeElaps = LEVEL_TIME;
  197. _aNuggets = new Array();
  198. var aPos = _oLevelSettings.getNuggetPosInLevel(_iCurLevel);
  199. var aInfo = _oLevelSettings.getNuggetInfoInLevel(_iCurLevel);
  200. for(var k=0;k<aPos.length;k++){
  201. var oSprite = s_oSpriteLibrary.getSprite('nugget_'+aInfo[k].type);
  202. var oNugget = new CNugget(aPos[k].x,aPos[k].y,aInfo[k].scale,oSprite);
  203. _aNuggets.push(oNugget);
  204. }
  205. _aMalus= new Array();
  206. var oSpriteMalus = s_oSpriteLibrary.getSprite('malus');
  207. var aMalusPos = _oLevelSettings.getMalusPosInLevel(_iCurLevel);
  208. for(var j=0;j<aMalusPos.length;j++){
  209. var oMalus = new CMalus(aMalusPos[j].x,aMalusPos[j].y,1,oSpriteMalus);
  210. _aMalus.push(oMalus);
  211. }
  212. _iNuggetToRemove = aPos.length;
  213. this.changeState(STATE_HOOK_ROTATE);
  214. _bUpdate = true;
  215. $(s_oMain).trigger("start_level",_iCurLevel);
  216. };
  217. this.changeState = function(iState){
  218. _iState = iState;
  219. switch(_iState){
  220. case STATE_HOOK_ROTATE:{
  221. if(_oDraggingNugget){
  222. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  223. playSound("bonus",1,false);
  224. }
  225. _iScore += _oDraggingNugget.getValue();
  226. _oTargetTextBack.text = _iScore + "$/" + _iCurTargetLevel+"$";
  227. _oTargetText.text = _iScore + "$/" + _iCurTargetLevel+"$";
  228. _oDraggingNugget.hide();
  229. _oDraggingNugget = null;
  230. _iNuggetToRemove--;
  231. if(_iNuggetToRemove === 0){
  232. this._endLevel();
  233. }
  234. }else if(_oHook){
  235. _oHook.reset();
  236. }
  237. break;
  238. }
  239. }
  240. };
  241. this._checkCollision = function( oHook, oNugget ){
  242. var vHookPos = oHook.getPos();
  243. var vNuggetPos = oNugget.getPos();
  244. var fNuggetRadius = oNugget.getRadius();
  245. var fDistance = Math.sqrt( ( (vNuggetPos.x - vHookPos.x)*(vNuggetPos.x - vHookPos.x) ) +
  246. ( (vNuggetPos.y - vHookPos.y)*(vNuggetPos.y - vHookPos.y) ) );
  247. if ( fDistance < fNuggetRadius ){
  248. return true;
  249. }else{
  250. return false;
  251. }
  252. };
  253. this.hookOutOfBounds = function(){
  254. _iSlowDown = 0;
  255. this.changeState(STATE_HOOK_MOVE_BACK);
  256. };
  257. this._endLevel = function(){
  258. _bUpdate = false;
  259. _iState = -1;
  260. $(s_oMain).trigger("end_level",_iCurLevel);
  261. if(_iScore < _iCurTargetLevel){
  262. this._gameOver();
  263. }else{
  264. _iCurLevel++;
  265. if(_iCurLevel > _oLevelSettings.getNumLevels()){
  266. this._win();
  267. }else{
  268. _iCurTargetLevel = _oLevelSettings.getLevelTarget(_iCurLevel);
  269. _oLevelText.text = TEXT_LEVEL + " "+_iCurLevel;
  270. _oLevelTextBack.text = TEXT_LEVEL + " "+_iCurLevel;
  271. _oTargetText.text = _iScore + "$/"+ _iCurTargetLevel + "$";
  272. _oTargetTextBack.text = _iScore + "$/" + _iCurTargetLevel+"$";
  273. _oChangeLevel = new CChangeLevel(s_oSpriteLibrary.getSprite("msg_box"));
  274. _oChangeLevel.show(_iCurLevel,_iCurTargetLevel);
  275. }
  276. }
  277. };
  278. this.showHurt = function(){
  279. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  280. playSound("explosion",1,false);
  281. }
  282. _oHurt.visible = true;
  283. var oParent = this;
  284. createjs.Tween.get(_oHurt).to({alpha:0.6 }, 400).call(function() {oParent._resetHurt();});
  285. };
  286. this._resetHurt = function(){
  287. _oHurt.visible = false;
  288. _oHurt.alpha = 0.5;
  289. };
  290. this._gameOver = function(){
  291. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  292. playSound("game_over",1,false);
  293. }
  294. _oEndPanel = new CEndPanel(s_oSpriteLibrary.getSprite('msg_box'));
  295. _oEndPanel.show(_iScore,false);
  296. };
  297. this._win = function(){
  298. if(DISABLE_SOUND_MOBILE === false || s_bMobile === false){
  299. playSound("win",1,false);
  300. }
  301. _oEndPanel = new CEndPanel(s_oSpriteLibrary.getSprite('msg_box'));
  302. _oEndPanel.show(_iScore,true);
  303. };
  304. this._onStartDig = function(){
  305. if(_iState === STATE_HOOK_ROTATE){
  306. _iDirHook = (_oHook.getRotationDeg()+90)*0.0174532925;
  307. this.changeState(STATE_HOOK_MOVE);
  308. }
  309. };
  310. this.onExitHelp = function(){
  311. _bUpdate = true;
  312. };
  313. this._onExit = function(){
  314. $(s_oMain).trigger("end_session");
  315. $(s_oMain).trigger("share_event",_iScore);
  316. $(s_oMain).trigger("save_score",_iScore);
  317. this.unload();
  318. s_oMain.gotoMenu();
  319. };
  320. this._onFullscreenRelease = function(){
  321. if(s_bFullscreen) {
  322. _fCancelFullScreen.call(window.document);
  323. }else{
  324. _fRequestFullScreen.call(window.document.documentElement);
  325. }
  326. sizeHandler();
  327. };
  328. this._onAudioToggle = function(){
  329. Howler.mute(s_bAudioActive);
  330. s_bAudioActive = !s_bAudioActive;
  331. };
  332. this.update = function(){
  333. if(_bUpdate === false){
  334. return;
  335. }
  336. _iTimeElaps -= s_iTimeElaps;
  337. var iCurSec = Math.floor(_iTimeElaps/1000);
  338. _oTimeText.text = ""+ iCurSec;
  339. _oTimeTextBack.text = ""+ iCurSec;
  340. if(_iTimeElaps < 0){
  341. _oTimeText.text = "0";
  342. _oTimeTextBack.text = "0";
  343. this._endLevel();
  344. }
  345. switch(_iState){
  346. case STATE_HOOK_ROTATE:{
  347. _oHook.updateRotation(_iRopeSpeed);
  348. break;
  349. }
  350. case STATE_HOOK_MOVE:{
  351. _oHook.updateMove();
  352. for(var i=0;i<_aNuggets.length;i++){
  353. if(_aNuggets[i].isActive() && this._checkCollision(_oHook,_aNuggets[i])){
  354. //console.log("COLLIDE WITH "+_aNuggets[i].getX()+","+_aNuggets[i].getY()+" WIDTH: "+_aNuggets[i].getWidth());
  355. _iSlowDown = Math.floor(_aNuggets[i].getRadius()) / 8;
  356. _oDraggingNugget = _aNuggets[i];
  357. this.changeState(STATE_HOOK_MOVE_BACK);
  358. break;
  359. }
  360. }
  361. for(var j=0;j<_aMalus.length;j++){
  362. if(this._checkCollision(_oHook,_aMalus[j])){
  363. _iSlowDown = 0;
  364. this.showHurt();
  365. this.changeState(STATE_HOOK_MOVE_BACK);
  366. _iScore -= MALUS_SCORE;
  367. if(_iScore<0){
  368. _iScore = 0;
  369. }
  370. _oTargetText.text = _iScore + "$/"+ _iCurTargetLevel + "$";
  371. _oTargetTextBack.text = _iScore + "$/" + _iCurTargetLevel+"$";
  372. _aMalus[j].unload();
  373. _aMalus.splice(j,1);
  374. break;
  375. }
  376. }
  377. break;
  378. }
  379. case STATE_HOOK_MOVE_BACK:{
  380. _oHook.updateMoveBack(_iSlowDown);
  381. if(_oDraggingNugget){
  382. _oDraggingNugget.updateMoveBack(_iHookSpeed - _iSlowDown,_iDirHook);
  383. }
  384. break;
  385. }
  386. }
  387. };
  388. s_oGame=this;
  389. MALUS_SCORE = oData.malus_score;
  390. HOOK_SPEED = oData.hook_speed;
  391. LEVEL_TIME = oData.level_time;
  392. this._init();
  393. }
  394. var s_oGame = null;