Nizax

aaaaaaaaaaa

Mar 12th, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.23 KB | None | 0 0
  1. import { AxesHelper } from '../three.module.js';
  2. //import { capturePoint } from './player.js';
  3. import { levelsPreSet, levelParam } from './levels.js';
  4. import { capturePoint, gameScene, localPlayers } from './game_logic.js';
  5.  
  6. export { effects, generateMap, mapState, tileBox, tileActionBox, tileEleminator };
  7.  
  8. // tech stuff
  9. let errorPrefix = '[MAP]',
  10. tileBox = [ {
  11. p1: {
  12. x: undefined,
  13. z: undefined
  14. },
  15. p2: {
  16. x: undefined,
  17. z: undefined
  18. },
  19. tileMeta: undefined
  20. } ], // tileBox[0] = { p1: { x:?,z:? }, p2: {x:?,z:?}, tileMeta: null } pozycji respawnu graczy
  21. // each tile in tileBox can be established by knowing whats coordinates of it
  22. //just like this: tileBox[x + (z*Xsize)]
  23. // tileBox[1+] = { obj: THREE.Obj, x:?, z:? }
  24. effects = [], // same as tileBox but each iteration has object
  25. // if object.state false then position is safe to walk
  26. // if object.state true then position have object.func to execute like META point etc.
  27. // if effects[x] is undefined then kill player
  28. mapState = {
  29. Xsize: null,
  30. Zsize: null,
  31. metaPos: { x: null, z: null },
  32. worldOrigin: {
  33. x: null,
  34. z: null
  35. },
  36. level: null,
  37. lastState: {
  38. mode: null,
  39. Xsize: null,
  40. Zsize: null
  41. }
  42. },
  43. // array of functions which need to be updated as animation
  44. tileActionBox = [],
  45. tileElemination = false;
  46.  
  47.  
  48.  
  49. function generateTiles(Xsize, Zsize, mode='arctic') {
  50. // size of the map must be accessible for tileMeta - just to make things easier
  51. if( (Xsize < 6) || (Zsize < 8) )
  52. throw new Error(`${errorPrefix} Tiles generation isnt filling minimal requirements ( X<4 , Z<8 )`);
  53. else if( levelsPreSet[`${mode}`] === undefined )
  54. throw new Error(`${errorPrefix} Tiles generation cant be started before levels initialization!`);
  55. return new Promise( function(res,rej) {
  56. // helper axes...
  57. let axesHelper = new AxesHelper( 5 );
  58. gameScene.add( axesHelper );
  59.  
  60.  
  61. // tileMeta
  62.  
  63. let tileMeta;
  64. if( tileBox[0].tileMeta !== undefined ) {
  65. // get tileMeta from levels.js:levelsPreSet object
  66. tileMeta = levelsPreSet[`${mode}`].tileMeta;
  67. tileBox[0].tileMeta = tileMeta;
  68. gameScene.add(tileMeta);
  69. } else if( tileBox[0].tileMeta == null ) {
  70. // got wiped out by mapManager('destroy')
  71. tileMeta = levelsPreSet[`${mode}`].tileMeta;
  72. tileBox[0].tileMeta = tileMeta;
  73. gameScene.add(tileMeta);
  74. } else
  75. // already exist
  76. tileMeta = tileBox[0].tileMeta;
  77.  
  78. // meta object is symmetric and of size 2 points of x
  79. // so we need to place it between two points
  80. tileMeta.position.set( // x, y, z
  81. -(mapState.metaPos.x + 0.5),
  82. 0,
  83. mapState.metaPos.z - 1 // real Z is shifted at scene by 1
  84. );
  85. //tileMeta.rotation.set( 0, Math.PI, 0);
  86.  
  87. // set META tiles to true to mark them as META points
  88. effects[ mapState.metaPos.x + ( (mapState.metaPos.z-1) * Xsize ) ] = {
  89. state: true,
  90. func: capturePoint
  91. };
  92. effects[ mapState.metaPos.x + 1 + ( (mapState.metaPos.z-1) * Xsize ) ] = {
  93. state: true,
  94. func: capturePoint
  95. };
  96.  
  97.  
  98. //position of player respawn point
  99. tileBox[0] = {
  100. p1: { //player 1
  101. x: -((mapState.metaPos.x + 1) + 1), // left part of META + 1 tile gap
  102. z: 6 - 1
  103. },
  104. p2: { //player 2
  105. x: -(mapState.metaPos.x - 1), //right part of META - 1 tile gap
  106. z: 6 - 1
  107. }
  108. };
  109.  
  110.  
  111. // tiles
  112. console.log('metaPos:');
  113. console.log(mapState.metaPos.x);
  114.  
  115. // get tile from levels.js:levelsPreSet object
  116. let tile = levelsPreSet[`${mode}`].tile;
  117.  
  118. // loop to place all tiles at desired positions
  119. for( let Z = 0; Z < Zsize; Z++ )
  120. for( let X = 1; X <= Xsize; X++ ) {
  121. // clone object which fit to choosen mode
  122. let _tile = tile.clone();
  123. // set position starting from X:1, Z:0 to X: Xsize, Z: Zsize
  124. _tile.position.set( -X, 0, Z );
  125. // make position walkable
  126. effects[X + ( Z * Xsize )] = {
  127. state: false,
  128. func: null,
  129. decayed: false,
  130. stateValue: 1,
  131. i: 1
  132. };
  133. // add tile to array to help us in future access it by knowing X and Z pos
  134. tileBox.push(_tile);
  135. // add to THREEjs scene
  136. gameScene.add(_tile);
  137.  
  138. // skip 2 tiles to avoid META, Z position is always at 2
  139. if ( ( (Z+1) == 2 ) && ( X == mapState.metaPos.x - 1 ) )
  140. X += 2;
  141. }
  142. console.log('tileBox:');
  143. console.log(tileBox);
  144. res();
  145. });
  146. }
  147.  
  148. function adjustMap(newXsize, newZsize, mode='arctic') {
  149. if( mode == mapState.lastState.mode )
  150. throw new Error(`${errorPrefix} Cant adjust tiles when mode changed`)
  151. return new Promise( function(res,rej) {
  152.  
  153. // if mapSize didnt changed
  154. if( (newXsize == mapState.lastState.Xsize) && (newZsize == mapState.lastState.Zsize) )
  155. res();
  156. else {
  157.  
  158. let tileMeta = tileBox[0].tileMeta;
  159.  
  160. // meta object is symmetric and of size 2 points of x
  161. // so we need to place it between two points
  162. tileMeta.position.set( // x, y, z
  163. -(mapState.metaPos.x + 0.5),
  164. 0,
  165. mapState.metaPos.z - 1 // real Z is shifted at scene by 1
  166. )
  167.  
  168. // calculate missing tiles for new sizes
  169. let _newAmount = (newXsize * newZsize) - 2,
  170. _oldAmount = tileBox.length - 1,
  171. _needed = _newAmount - _oldAmount,
  172. _tilePrefab = levelsPreSet[`${mode}`].tile;
  173.  
  174. // clear effects
  175. effects = [];
  176. // redefine effects
  177. effects[ mapState.metaPos.x + ( (mapState.metaPos.z-1) * newXsize ) ] = {
  178. state: true,
  179. func: capturePoint
  180. };
  181. effects[ mapState.metaPos.x + 1 + ( (mapState.metaPos.z-1) * newXsize ) ] = {
  182. state: true,
  183. func: capturePoint
  184. };
  185. // reposition all old tiles to new design
  186. // and on top of that create missing ones and push to tileBox
  187. for( let Z=0 ; Z < newZsize ; Z++)
  188. for( let X=1 ; X <= newXsize ; X++ ) {
  189. if(_oldAmount > 0) {
  190. //get old tiles from tileBox
  191. // set position starting from X:1, Z:0 to X: Xsize, Z: Zsize
  192. tileBox[X + ( Z * Xsize )].position.set( -X, 0, Z );
  193. // make position walkable
  194. effects[X + ( Z * Xsize )] = false;
  195. _oldAmount--;
  196. } else {
  197. //create new missing tiles
  198. // clone object which fit to choosen mode
  199. let _tile = _tilePrefab.clone();
  200. // set position starting from X:1, Z:0 to X: Xsize, Z: Zsize
  201. _tile.position.set( -X, 0, Z );
  202. // make position walkable
  203. effects[X + ( Z * Xsize )] = false;
  204. // set info about decay state
  205. _tile.userData.tileDecayed = false;
  206. // add tile to array to help us in future access it by knowing X and Z pos
  207. tileBox.push(_tile);
  208. // add to THREEjs scene
  209. gameScene.add(_tile);
  210. }
  211.  
  212. // skip 2 tiles to avoid META, Z position is always at 2
  213. if ( ( (Z+1) == 2 ) && ( X == mapState.metaPos.x - 1 ) )
  214. X += 2;
  215. }
  216.  
  217. //position of player respawn point
  218. tileBox[0] = {
  219. p1: { //player 1
  220. x: -((mapState.metaPos.x + 1) + 1), // left part of META + 1 tile gap
  221. z: 6 - 1
  222. },
  223. p2: { //player 2
  224. x: -(mapState.metaPos.x - 1), //right part of META - 1 tile gap
  225. z: 6 - 1
  226. }
  227. };
  228.  
  229. // SKYBOX size adjustment
  230. let skybox = levelsPreSet[`${mode}`].skybox,
  231. { textureMode, oldXsize, oldZsize } = skybox.userData.mapData;
  232.  
  233. if( textureMode !== mode )
  234. throw new Error(`${errorPrefix} Adjust skybox with different texture mode?`);
  235. else if ( (newXsize !== oldXsize) || (newZsize !== oldZsize) )
  236. skybox.scale.set(newXsize * 5, 50, newZsize * 6.25);
  237.  
  238. // WATER size adjustment
  239. let water = levelsPreSet[`${mode}`].water,
  240. { water_oldXsize, water_oldZsize } = water.userData.mapData;
  241. if( (water_oldXsize !== newXsize) || (water_oldZsize !== newZsize) )
  242. water.scale.set(Xsize * 5, 1, Zsize * 6.25);
  243.  
  244. /* MISSING !
  245.  
  246. HERE REPOSITION MISC OBJECTS
  247.  
  248. MISSING !
  249. */
  250. }
  251. });
  252. }
  253.  
  254. function deleteTiles(){
  255. /*
  256. NOT ONLY REMOVE FROM SCENE AND DELETE ALLOCATION IN APP
  257. BUT ALSO DISPOSE() EACH geometry, material, texture
  258.  
  259. gameScene.remove
  260. FOR i=1 ; i <= tileBox.length
  261. gameScene.remove(tileBox[i]) // remove from scene
  262. delete effects[i] // turn position into undefined
  263. delete tileBox[i] // turn objects into undefined
  264. */
  265. }
  266.  
  267. //function generateMap( Xsize, Zsize, mode='arctic') {
  268. function generateMap( action='LAUNCH', level=0 ) {
  269. return new Promise( function(res,rej) {
  270.  
  271. let Xsize = levelParam.levels[level].mapSize.x,
  272. Zsize = levelParam.levels[level].mapSize.z,
  273. mode = levelParam.levels[level].mode,
  274. resolveMapGeneration = function() {
  275. mapState.lastState.mode = mode;
  276. mapState.lastState.Xsize = Xsize;
  277. mapState.lastState.Zsize = Zsize;
  278. mapState.lastState.level = level;
  279. res();
  280. };
  281.  
  282. console.log(`Xsize: ${Xsize} Zsize: ${Zsize}, Mode: ${mode}`);
  283.  
  284. // info for other functions/modules
  285. mapState.Xsize = Xsize;
  286. mapState.Zsize = Zsize;
  287. // these X and Z arent translated yet to real scene axis
  288. mapState.metaPos.x = ( Xsize > 10 ) ? // below Xsize=10 the metaPos.x is 3
  289. Math.ceil((Xsize/10.8).toFixed(2) * 3) : 3;
  290. mapState.metaPos.z = 2; // Z is always relative to edge of map
  291. mapState.worldOrigin.x = -(Xsize/2), // X axis is reflected at minus
  292. mapState.worldOrigin.z = (Zsize)/2 + (((Zsize%2) == 0) ? 0.5 : 0) // Z axis is shifted -1, so Z:1 is real Z:0
  293.  
  294. mapState.level = level;
  295.  
  296. console.log(`worldOrigin: ${mapState.worldOrigin.x}, ${mapState.worldOrigin.z}`);
  297.  
  298. switch ( action ) {
  299.  
  300. // first game launch
  301. case 'LAUNCH':
  302. console.log('generateMap(): LAUNCH 1');
  303. mapManager('initialize', mode, level ).then( () => {
  304. console.log('generateMap(): LAUNCH 2');
  305. generateTiles(Xsize,Zsize,mode).then( () => {
  306. console.log('generateMap(): LAUNCH 3');
  307. applyInitialStates(mode).then( () => {
  308. console.log('generateMap(): LAUNCH 4');
  309. resolveMapGeneration();
  310. });
  311. })
  312. })
  313. break;
  314.  
  315. // re-launch after player death
  316. case 'RELAUNCH':
  317. /*
  318. SO WE HAVE HERE CLEARED MAP WITH ONLY TILES, META, SKYBOX, WATER, CLOUDS
  319. MAY BE MISSING MISC objects if mapManager() is writen bad
  320. */
  321. applyInitialStates(mode).then( () => {
  322. resolveMapGeneration();
  323. });
  324. break;
  325.  
  326. // new level, same mode
  327. case 'NEW-LEVEL':
  328. mapManager('clear').then( () => {
  329. // if mapSize changed
  330. if (
  331. ( Xsize !== mapState.lastState.Xsize ) &&
  332. ( Zsize !== mapState.lastState.Zsize ) )
  333. adjustMap(Xsize,Zsize).then( () => {
  334. resolveMapGeneration();
  335. });
  336. else
  337. resolveMapGeneration();
  338. });
  339. break;
  340.  
  341. // new mode
  342. case 'NEW-MODE':
  343. mapManager('destroy').then( () => {
  344. mapManager('initialize', mode, level ).then( () => {
  345. resolveMapGeneration();
  346. });
  347. })
  348. break;
  349.  
  350. // last level finished
  351. case 'END':
  352. //
  353. // draw loading screen
  354. //
  355. mapManager('destroyScene').then( () => {
  356. //
  357. //outro();
  358. //
  359. resolveMapGeneration();
  360. });
  361. break;
  362.  
  363. // player death
  364. case 'DEATH':
  365. // get sizes of map for level 0
  366. let { newX, newZ } = levelParam.levels[0].mapSize;
  367. if( mode !== 'arctic' )
  368. mapManager('destroy').then( () => {
  369. // generate tiles for level 0
  370. generateTiles(newX,newZ).then( () => {
  371. resolveMapGeneration();
  372. });
  373. //( player will propably execute re-launch )
  374. });
  375. else {
  376. mapManager('clear').then( () => {
  377. adjustMap(newX, newZ).then( () => {
  378. resolveMapGeneration();
  379. })
  380. });
  381. }
  382. break;
  383.  
  384. }
  385.  
  386. /* levelsPreSet[`${mode}`] = {
  387. skybox: skybox, // mesh
  388. tile: tile, // mesh
  389. tileMeta: tileMeta, // mesh
  390. enemySkins: enemySkins, // array of meshes
  391. endAnimation: endAnimation, // AnimationClip from tileMeta
  392. terrainMisc: terrainMisc // all visual stuff like big ice bergs, island, ship, snow/rain etc
  393. }
  394. */
  395.  
  396. /*
  397. soo ARCTIC MODE creates new objects and position them
  398. ISLE MODE removes all arctic stuff (everything except water) and creates ISLE, replaces tile
  399. etc...
  400.  
  401. IF terrainMisc exists then reposition it relativly to mapState.Xsize ELSE create relativly to mapState.Xsize
  402.  
  403. SCENARIOS:
  404. FIRST launch:
  405. ( LAUNCH )
  406. mapManager('initialize',mode, level:0 ).then
  407. generateTiles(Xsize,Zsize,mode).then
  408. applyInitialStates(mode)
  409. ( ready to play )
  410.  
  411. RE-launch after death: (when game_logic.js:needsGameInit == false)
  412. ( RELAUNCH )
  413. applyInitialStates(mode)
  414. ( ready to play )
  415.  
  416. NEW level, same mode
  417. ( NEW-LEVEL )
  418. IF mapSize changed
  419. adjustMap(newX,newY);
  420. ( ready to play )
  421. ELSE
  422. mapManager('clear')
  423. ( ready to play )
  424.  
  425. NEW mode
  426. ( NEW-MODE )
  427. mapManager('destroy').then
  428. mapManager('initialize',mode, level )
  429. ( ready to play )
  430.  
  431. LAST level finished
  432. ( END )
  433. mapManager('destroyScene')
  434. outro()
  435. ( ready to play )
  436.  
  437. PLAYER death
  438. ( DEATH )
  439. IF mode !== 'arctic'
  440. mapManager('destroy').then
  441. let { Xsize, Zsize } = { levelParam[0].Xsize, levelParam[0].Zsize };
  442. generateTiles(Xsize,Zsize)
  443. ( player will propably execute re-launch )
  444. ( ready to play )
  445. ELSE
  446. let {newX, newZ} = { levelParam[0].Xsize, levelParam[0].Zsize }
  447. adjustMap(newX, newZ)
  448. mapManager('clear')
  449. ( ready to play )
  450.  
  451. */
  452. });
  453. }
  454.  
  455. // prepares map for new level
  456. function mapManager(action=null,mode=null, level=null) {
  457. return new Promise( function(res,rej) {
  458.  
  459. switch( action ) {
  460. case 'initialize':
  461. console.log('mapManager: init');
  462. // check if mode is already defined and his levels
  463. if( levelsPreSet[`${mode}`].initialized !== false ) {
  464. console.log('mapManager: that mode is already defined');
  465. // check skybox textureMode
  466. if( mode !== levelsPreSet[`${mode}`].skybox.userData.mapData.textureMode ) {
  467. // dispatch old material, texutre, shader uniform
  468. let { disp_geometry,
  469. disp_textureCube,
  470. disp_cubeMat,
  471. disp_cubeMatUniform } = levelsPreSet[`${mode}`].skybox.userData.dispatchMem;
  472. disp_geometry.dispatch();
  473. disp_textureCube.dispatch();
  474. disp_cubeMatUniform.dispatch();
  475. disp_cubeMat.dispatch();
  476.  
  477. // create new one
  478. let r = `lib/textures/sky/${mode}/`;
  479. let urls = [ r + "walls.jpg", r + "walls.jpg",
  480. r + "posy.jpg", r + "negy.jpg",
  481. r + "walls.jpg", r + "walls.jpg" ];
  482. let textureCube = new CubeTextureLoader().load( urls );
  483. textureCube.format = RGBFormat;
  484. textureCube.mapping = CubeReflectionMapping;
  485. textureCube.encoding = sRGBEncoding;
  486. textureCube.flipY = false;
  487. // ---
  488. let cubeShader = ShaderLib[ 'cube' ];
  489. let cubeMat = new ShaderMaterial( {
  490. fragmentShader: cubeShader.fragmentShader,
  491. vertexShader: cubeShader.vertexShader,
  492. uniforms: cubeShader.uniforms,
  493. depthWrite: false,
  494. side: BackSide
  495. } );
  496. cubeMat.uniforms[ "tCube" ].value = textureCube;
  497. Object.defineProperty( cubeMat, 'map', {
  498. get: function () {
  499. return this.uniforms.tCube.value;
  500. }
  501. } );
  502.  
  503. levelsPreSet[`${mode}`].skybox.material = cubeMat;
  504. }
  505. // check given level sizes to skybox, water, clouds
  506. let { levelXsize, levelZsize } = levelParam.levels[level].mapSize,
  507. { textureMode, skyboxXsize, skyboxZsize } = levelsPreSet[`${mode}`].skybox.userData.mapData,
  508. { waterXsize, waterZsize } = levelsPreSet[`${mode}`].water.userData.mapData;
  509.  
  510. //skybox
  511. if( (levelXsize !== skyboxXsize) || (levelZsize !== skyboxZsize) ) {
  512. levelsPreSet[`${mode}`].skybox.scale.set(levelXsize * 5, 50, levelZsize * 6.25);
  513. }
  514. //water
  515. if( (levelXsize !== waterXsize) || (levelZsize !== waterZsize) ) {
  516. levelsPreSet[`${mode}`].skybox.scale.set(levelXsize * 5, 50, levelZsize * 6.25);
  517. }
  518. //clouds
  519. /*
  520. SHIT MISSING, not added yet
  521. propably also RAIN / SNOW
  522. */
  523. res();
  524. } else { // is that else necessary???? levels.js already did that
  525. console.log('mapManager: defining new mode');
  526. //initializeLevels(mode).then( () => {
  527. let water = levelsPreSet[`${mode}`].water,
  528. skybox = levelsPreSet[`${mode}`].skybox;
  529. skybox.position.set( mapState.worldOrigin.x, -0.05, mapState.worldOrigin.z );
  530. water.position.set( mapState.worldOrigin.x, -0.05, mapState.worldOrigin.z );
  531. gameScene.add(skybox);
  532. gameScene.add(water);
  533. console.log(skybox);
  534. console.log(water);
  535. /*
  536. gameScene.add( clouds );
  537. gameScene.add( rain/snow );
  538. gameScene.add( MISC );
  539. */
  540.  
  541. levelsPreSet[`${mode}`].initialized = true;
  542. res();
  543. //});
  544. }
  545. break;
  546. }
  547. /*
  548. SWITCH ( ACTION )
  549. initialize: [need Xsize and Zsize] - get from levelsPreSet[level].Xsize
  550. IF mapState.skybox !== null
  551. change skybox texture based on levelsPreSet[level]
  552. reposition water, clouds based on levelsPreSet[level]
  553. ELSE
  554. adds skybox, water, clouds
  555. to scene and posititon them objects from levelsPreSet
  556. BREAK;
  557. destroyScene:
  558. removes everything completly from scene and leaves it ready for outro or new game after death in isle/jungle mode
  559. leave only camera on scene and position it at (0,2,5)
  560. remember to dispatch ( or keep tileMeta, MISC loaded in background )
  561. BREAK;
  562. destroy:
  563. >REMOVE AND DISPATCH:
  564. tiles, tileMeta, all MISC from array: levelsPreSet obj:levels.js
  565. spawned: (enemy, bonus, fish)
  566.  
  567. >DONT REMOVE:
  568. water, clouds, skybox[needs texture update], player and placeholders(enemy,bonus,fish)
  569. BREAK;
  570. clear:
  571. destroy enemy using method from enemy class
  572. destroy all remained fishes and bonusBoxes
  573. heal all tiles which are (tile.userData.tileDecayed == false)
  574. null:
  575. THROW NEW ERROR('WTF U DOING');
  576.  
  577.  
  578. PRIORITIES:
  579. 0: water
  580. skybox
  581. clouds
  582. Player
  583.  
  584. 1: tiles
  585. tileMeta
  586. MISC
  587.  
  588. 2: fish
  589. bonus
  590. Enemy
  591. */
  592.  
  593. });
  594. }
  595.  
  596. function applyInitialStates(mode='arctic') {
  597. return new Promise( function(res,rej) {
  598. console.log('Initial values applied?');
  599. /*
  600. from levels.js apply:
  601. add MISC shit
  602. respawn enemies,
  603. spawn first fish based on game_logic.js:gameState.level
  604. renew all old tiles,
  605. decay on tiles,
  606. position player at respawn point and player.respawn()
  607. */
  608. let current_level = levelParam.modeInfo[`${mode}`];
  609. let Xsize = levelParam.levels[current_level].mapSize.x,
  610. Zsize = levelParam.levels[current_level].mapSize.z;
  611. // MISC SHIT
  612. levelsPreSet[`${mode}`].terrainMisc.forEach( item => {
  613. let _loc = {
  614. x: eval(item.userData.desiredPosition.x),
  615. y: eval(item.userData.desiredPosition.y),
  616. z: eval(item.userData.desiredPosition.z)
  617. },
  618. _scale;
  619. if( item.userData.desiredScale ) {
  620. _scale = {
  621. x: eval(item.userData.desiredScale.x),
  622. y: eval(item.userData.desiredScale.y),
  623. z: eval(item.userData.desiredScale.z)
  624. }
  625. } else {
  626. _scale = {
  627. x: 1,
  628. y: 1,
  629. z: 1
  630. }
  631. }
  632. item.position.set( _loc.x, _loc.y, _loc.z );
  633. item.scale.set( _scale.x, _scale.y, _scale.z );
  634. gameScene.add( item );
  635. });
  636.  
  637. res();
  638. })
  639. }
  640.  
  641. // creates Interval
  642. function tileEleminator( action='stop', delay=-1 ) {
  643. let _freq = levelParam.levels[ mapState.level ].tileDecay.freq;
  644.  
  645. if(action=='stop'){
  646. tileElemination = false;
  647. // else start if level fail isnt 100%
  648. } else if( _freq.fail !== 100 ) {
  649. let _randTile = Math.floor(Math.random() * (tileBox.length - 1)) + 1;
  650. // if first execution
  651. if( delay !== -1 ){
  652. let _firstDelay = Math.floor(Math.random() * (_freq.to - _freq.from)) + _freq.from;
  653. setTimeout( () => {
  654. tileSwitchState( _randTile, _freq );
  655. }, _firstDelay);
  656. } else {
  657. setTimeout( () => {
  658. tileSwitchState( _randTile, _freq );
  659. }, delay);
  660. }
  661. }
  662. }
  663. function tileSwitchState( tileID, freq ){
  664. let _newDelay = Math.floor(Math.random() * (freq.to - freq.from)) + freq.from,
  665. _chance = Math.floor(Math.random() * 100);
  666.  
  667. console.log( 'TILE CHECK' );
  668. console.log( `tileID: ${tileID}, tileBoxLen: ${tileBox.length}, tileActLen: ${tileActionBox.length}`);
  669.  
  670. if( _chance <= (100 - freq.fail) ) {
  671. // get duration for tile
  672. let _durStep = levelParam.levels[ mapState.level ].tileDecay.durStep;
  673. let _step = Math.floor(Math.random() * (_durStep.to - _durStep.from)) + _durStep.from;
  674. let action;
  675. // check state and execute heal / decay on that
  676. if( effects[ tileID ].decayed ) {
  677. action = new CreateTileAction( 'heal', _step, tileID );
  678. } else {
  679. action = new CreateTileAction( 'decay', _step, tileID );
  680. }
  681.  
  682. tileActionBox.push( action );
  683. };
  684.  
  685. tileEleminator( 'continue', _newDelay );
  686. }
  687.  
  688. // problemem były pozostałości po starych zmiennych z tileActionBox. Powstrzymaj rozrost arr tileActionBox...ehh
  689. // rozwiązanie: 2 listy naprzemian czyszczące się gdy przekroczą swoją wielkość
  690.  
  691. class CreateTileAction {
  692. act_tileID = tileActionBox.length;
  693. tileID = null;
  694. animFunc = null;
  695. durStep = null;
  696. tile = null;
  697. duration = 64;
  698. i=1;
  699. stateValue=1;
  700.  
  701. constructor( action='heal', step, tileID ) {
  702. this.tileID = tileID;
  703. this.durStep = step;
  704. this.tile = tileBox[tileID];
  705.  
  706. if( action == 'decay' ) {
  707. console.log( ' DECAY ' );
  708. this.tile.userData.tileData.inProgress = 'decay';
  709. this.animFunc = ( step, ID, localID ) => {
  710. if( this.i > this.duration * step ) {
  711.  
  712. // update effects[]
  713. effects[ID].state = true;
  714. effects[ID].func = {
  715. p1: localPlayers[0].death,
  716. p2: (localPlayers[1]) ? localPlayers[0].death : null,
  717. }
  718. effects[ID].decayed = true;
  719.  
  720. this.i=1;
  721. tileActionBox[localID] = null;
  722. this.tile.userData.tileData.inProgress = null;
  723. } else if( this.i%step == 0 ) {
  724. // ???
  725. this.stateValue = (this.stateValue - 1/(this.duration-1)).toFixed(2);
  726. let _sc = this.stateValue;
  727. this.tile.scale.set(_sc,1,_sc);
  728. console.log( `stateVal: ${this.stateValue}, i: ${this.i}, step: ${step}, i/step: ${this.i/step}` );
  729. }
  730. this.i++;
  731. }
  732. } else {
  733. this.tile.userData.tileData.inProgress = 'heal';
  734. console.log( ' HEAL ' );
  735. this.animFunc = ( step, ID, localID ) => {
  736. if( this.i > this.duration * step ) {
  737.  
  738. // update effects[]
  739. effects[ID].state = false;
  740. effects[ID].func = null;
  741. effects[ID].decayed = false;
  742.  
  743. this.i=1;
  744. tileActionBox[localID] = null;
  745. this.tile.userData.tileData.inProgress = null;
  746. } else if( this.i%step == 0 ) {
  747. // state = state - ( state / ( i / step ) )
  748. this.stateValue = (1 / (this.i/step)).toFixed(2);
  749. let _sc = this.stateValue;
  750. this.tile.scale.set(_sc,1,_sc);
  751. }
  752. this.i++;
  753. }
  754. }
  755. }
  756. }
  757. /*
  758. // function which will be used in game_logic.js to operate on tiles elimination in given freq
  759. function tileCreateAction( action='heal', step, tileID ) {
  760. this.act_tileID = tileActionBox.length;
  761. this.tileID = tileID;
  762. this.animFunc = null;
  763. this.durStep = step;
  764.  
  765. this.tile = tileBox[this.tileID];
  766. // LVL INFO:
  767. // levelParam.levles[mapState.level].tileDecay
  768. /* ! freq: { from: 0, to: 0, fail: 100 },
  769. durStep: { from: 0, to: 0 },
  770. ! alreadyDecayed: 0
  771. */
  772.  
  773.  
  774. /*
  775. WARTOŚĆ i jest wykorzystywana przez wszystkie działajace funkcje w danym momencie. Wiele funkcji jedna wartosc i... xd
  776. NIE MAM PEWNOŚCI CO TYCH ANIMACJI \/
  777. */
  778. /* // duration ACTS LIKE STEPS in which animation will end
  779. this.duration = 64 ;
  780. if( action == 'decay' ) {
  781. console.log( ' DECAY ' );
  782. this.tile.userData.tileData.inProgress = 'decay';
  783. this.animFunc = ( step, ID, localID ) => {
  784. if( this.i > this.duration * step ) {
  785.  
  786. // update effects[]
  787. effects[ID].state = true;
  788. effects[ID].func = {
  789. p1: localPlayers[0].death,
  790. p2: (localPlayers[1]) ? localPlayers[0].death : null,
  791. }
  792. effects[ID].decayed = true;
  793.  
  794. this.i=1;
  795. tileActionBox.splice( localID ,1 );
  796. this.tile.userData.tileData.inProgress = null;
  797. } else if( this.i%step == 0 ) {
  798. // state = state - ( state / ( i / step ) )
  799. this.stateValue = (this.stateValue - 1/(this.duration-1)).toFixed(2);
  800. let _sc = this.stateValue;
  801. this.tile.scale.set(_sc,1,_sc);
  802. console.log( `stateVal: ${this.stateValue}, i: ${this.i}, step: ${step}, i/step: ${this.i/step}` );
  803. }
  804. this.i++;
  805. }
  806. } else {
  807. this.tile.userData.tileData.inProgress = 'heal';
  808. console.log( ' HEAL ' );
  809. func.animFunc = ( step, ID, localID ) => {
  810. if( this.i > this.duration * step ) {
  811.  
  812. // update effects[]
  813. effects[ID].state = false;
  814. effects[ID].func = null;
  815. effects[ID].decayed = false;
  816.  
  817. this.i=1;
  818. tileActionBox.splice( localID ,1 );
  819. this.tile.userData.tileData.inProgress = null;
  820. } else if( this.i%step == 0 ) {
  821. // state = state - ( state / ( i / step ) )
  822. this.stateValue = (1 / (this.i/step)).toFixed(2);
  823. let _sc = this.stateValue;
  824. this.tile.scale.set(_sc,1,_sc);
  825. }
  826. this.i++;
  827. }
  828. }
  829. }*/
  830.  
  831.  
  832. /* COMMON RULES
  833.  
  834. MAPA ZACZYNA SIE logicznie OD X:1, Z:1
  835. KAŻDA logiczna POZYCJA KRY X i Z przekłada się na FIZYCZNIE odbity -X i Z+1
  836.  
  837. pozycja META będzie odpowiadać proporcjonalnie dla wielkości mapy
  838. Z będzie stałe, czyli Z: 2
  839. X będzie się zaczynać na 3 gdy Xsize=(6,10) a dalej proporcjonalnie:
  840. formułka dla X: IF X > 10 => Math.ceil((x/10.8).toFixed(2) * 3) ELSE X = 3
  841. Pozycja obiektu META to metaX + 0.5
  842. Obiekt META będzie się znajdować na metaX i metaX+1 na Z:2
  843.  
  844. pozycja RESPAWN graczy relatywna do pozycji META
  845. Z będzie stałe, czyli Z: 6
  846. X będzie to
  847. DLA P1: (metaX + 1) + 1 [lewa granica mety + odstęp 1]
  848. DLA P2: metaX - 1 [prawa granica mety - odstep 1]
  849.  
  850. */
Advertisement
Add Comment
Please, Sign In to add comment