You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

896 rivejä
20 KiB

  1. define([
  2. 'js/resources',
  3. 'js/system/events',
  4. 'js/misc/physics',
  5. 'js/rendering/effects',
  6. 'js/rendering/tileOpacity',
  7. 'js/rendering/particles',
  8. 'js/rendering/shaders/outline',
  9. 'js/rendering/spritePool',
  10. 'js/system/globals',
  11. 'js/rendering/renderLoginBackground'
  12. ], function (
  13. resources,
  14. events,
  15. physics,
  16. effects,
  17. tileOpacity,
  18. particles,
  19. shaderOutline,
  20. spritePool,
  21. globals,
  22. renderLoginBackground
  23. ) {
  24. let mRandom = Math.random.bind(Math);
  25. return {
  26. stage: null,
  27. layers: {
  28. objects: null,
  29. mobs: null,
  30. characters: null,
  31. attacks: null,
  32. effects: null,
  33. particles: null,
  34. lightPatches: null,
  35. lightBeams: null,
  36. tileSprites: null,
  37. hiders: null
  38. },
  39. titleScreen: false,
  40. width: 0,
  41. height: 0,
  42. showTilesW: 0,
  43. showTilesH: 0,
  44. pos: {
  45. x: 0,
  46. y: 0
  47. },
  48. moveTo: null,
  49. moveSpeed: 0,
  50. moveSpeedMax: 1.50,
  51. moveSpeedInc: 0.5,
  52. lastUpdatePos: {
  53. x: 0,
  54. y: 0
  55. },
  56. zoneId: null,
  57. textures: {},
  58. textureCache: {},
  59. sprites: [],
  60. lastTick: null,
  61. hiddenRooms: null,
  62. init: function () {
  63. PIXI.settings.GC_MODE = PIXI.GC_MODES.AUTO;
  64. PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST;
  65. PIXI.settings.SPRITE_MAX_TEXTURES = Math.min(PIXI.settings.SPRITE_MAX_TEXTURES, 16);
  66. PIXI.settings.RESOLUTION = 1;
  67. events.on('onGetMap', this.onGetMap.bind(this));
  68. events.on('onToggleFullscreen', this.toggleScreen.bind(this));
  69. events.on('onMoveSpeedChange', this.adaptCameraMoveSpeed.bind(this));
  70. this.width = $('body').width();
  71. this.height = $('body').height();
  72. this.showTilesW = Math.ceil((this.width / scale) / 2) + 3;
  73. this.showTilesH = Math.ceil((this.height / scale) / 2) + 3;
  74. this.renderer = new PIXI.Renderer({
  75. width: this.width,
  76. height: this.height,
  77. backgroundColor: '0x2d2136'
  78. });
  79. window.addEventListener('resize', this.onResize.bind(this));
  80. $(this.renderer.view).appendTo('.canvas-container');
  81. this.stage = new PIXI.Container();
  82. let layers = this.layers;
  83. Object.keys(layers).forEach(l => {
  84. layers[l] = new PIXI.Container();
  85. layers[l].layer = (l === 'tileSprites') ? 'tiles' : l;
  86. this.stage.addChild(layers[l]);
  87. });
  88. const textureList = globals.clientConfig.textureList;
  89. const sprites = resources.sprites;
  90. textureList.forEach(t => {
  91. this.textures[t] = new PIXI.BaseTexture(sprites[t]);
  92. this.textures[t].scaleMode = PIXI.SCALE_MODES.NEAREST;
  93. });
  94. particles.init({
  95. r: this,
  96. renderer: this.renderer,
  97. stage: this.layers.particles
  98. });
  99. this.buildSpritesTexture();
  100. },
  101. buildSpritesTexture: function () {
  102. const { clientConfig: { atlasTextureDimensions, atlasTextures } } = globals;
  103. let container = new PIXI.Container();
  104. let totalHeight = 0;
  105. atlasTextures.forEach(t => {
  106. let texture = this.textures[t];
  107. let tile = new PIXI.Sprite(new PIXI.Texture(texture));
  108. tile.width = texture.width;
  109. tile.height = texture.height;
  110. tile.x = 0;
  111. tile.y = totalHeight;
  112. atlasTextureDimensions[t] = {
  113. w: texture.width / 8,
  114. h: texture.height / 8
  115. };
  116. container.addChild(tile);
  117. totalHeight += tile.height;
  118. });
  119. let renderTexture = PIXI.RenderTexture.create(this.textures.tiles.width, totalHeight);
  120. this.renderer.render(container, renderTexture);
  121. this.textures.sprites = renderTexture;
  122. this.textures.scaleMult = PIXI.SCALE_MODES.NEAREST;
  123. },
  124. toggleScreen: function () {
  125. let isFullscreen = (window.innerHeight === screen.height);
  126. if (isFullscreen) {
  127. let doc = document;
  128. (doc.cancelFullscreen || doc.msCancelFullscreen || doc.mozCancelFullscreen || doc.webkitCancelFullScreen).call(doc);
  129. return 'Windowed';
  130. }
  131. let el = $('body')[0];
  132. (el.requestFullscreen || el.msRequestFullscreen || el.mozRequestFullscreen || el.webkitRequestFullscreen).call(el);
  133. return 'Fullscreen';
  134. },
  135. buildTitleScreen: function () {
  136. this.titleScreen = true;
  137. renderLoginBackground(this);
  138. },
  139. onResize: function () {
  140. if (isMobile)
  141. return;
  142. this.width = $('body').width();
  143. this.height = $('body').height();
  144. this.showTilesW = Math.ceil((this.width / scale) / 2) + 3;
  145. this.showTilesH = Math.ceil((this.height / scale) / 2) + 3;
  146. this.renderer.resize(this.width, this.height);
  147. if (window.player) {
  148. this.setPosition({
  149. x: (window.player.x - (this.width / (scale * 2))) * scale,
  150. y: (window.player.y - (this.height / (scale * 2))) * scale
  151. }, true);
  152. }
  153. if (this.titleScreen) {
  154. this.clean();
  155. this.buildTitleScreen();
  156. }
  157. events.emit('onResize');
  158. },
  159. getTexture: function (baseTex, cell, size) {
  160. size = size || 8;
  161. let textureName = baseTex + '_' + cell;
  162. let textureCache = this.textureCache;
  163. let cached = textureCache[textureName];
  164. if (!cached) {
  165. let y = ~~(cell / 8);
  166. let x = cell - (y * 8);
  167. cached = new PIXI.Texture(this.textures[baseTex], new PIXI.Rectangle(x * size, y * size, size, size));
  168. textureCache[textureName] = cached;
  169. }
  170. return cached;
  171. },
  172. clean: function () {
  173. this.stage.removeChild(this.layers.hiders);
  174. this.layers.hiders = new PIXI.Container();
  175. this.layers.hiders.layer = 'hiders';
  176. this.stage.addChild(this.layers.hiders);
  177. let container = this.layers.tileSprites;
  178. this.stage.removeChild(container);
  179. this.layers.tileSprites = container = new PIXI.Container();
  180. container.layer = 'tiles';
  181. this.stage.addChild(container);
  182. this.stage.children.sort((a, b) => {
  183. if (a.layer === 'hiders')
  184. return 1;
  185. else if (b.layer === 'hiders')
  186. return -1;
  187. else if (a.layer === 'tiles')
  188. return -1;
  189. else if (b.layer === 'tiles')
  190. return 1;
  191. return 0;
  192. });
  193. },
  194. buildTile: function (c, i, j) {
  195. let alpha = tileOpacity.map(c);
  196. let canFlip = tileOpacity.canFlip(c);
  197. let tile = new PIXI.Sprite(this.getTexture('sprites', c));
  198. tile.alpha = alpha;
  199. tile.position.x = i * scale;
  200. tile.position.y = j * scale;
  201. tile.width = scale;
  202. tile.height = scale;
  203. if (canFlip && mRandom() < 0.5) {
  204. tile.position.x += scale;
  205. tile.scale.x = -scaleMult;
  206. }
  207. return tile;
  208. },
  209. onGetMap: function (msg) {
  210. this.titleScreen = false;
  211. physics.init(msg.collisionMap);
  212. let map = this.map = msg.map;
  213. let w = this.w = map.length;
  214. let h = this.h = map[0].length;
  215. for (let i = 0; i < w; i++) {
  216. let row = map[i];
  217. for (let j = 0; j < h; j++) {
  218. if (!row[j].split)
  219. row[j] += '';
  220. row[j] = row[j].split(',');
  221. }
  222. }
  223. this.clean();
  224. spritePool.clean();
  225. this.stage.filters = [new PIXI.filters.AlphaFilter()];
  226. this.stage.filterArea = new PIXI.Rectangle(0, 0, Math.max(w * scale, this.width), Math.max(h * scale, this.height));
  227. this.hiddenRooms = msg.hiddenRooms;
  228. this.sprites = _.get2dArray(w, h, 'array');
  229. this.stage.children.sort((a, b) => {
  230. if (a.layer === 'tiles')
  231. return -1;
  232. else if (b.layer === 'tiles')
  233. return 1;
  234. return 0;
  235. });
  236. if (this.zoneId !== null)
  237. events.emit('onRezone', this.zoneId);
  238. this.zoneId = msg.zoneId;
  239. msg.clientObjects.forEach(c => {
  240. c.zoneId = this.zoneId;
  241. events.emit('onGetObject', c);
  242. });
  243. },
  244. setPosition: function (pos, instant) {
  245. pos.x += 16;
  246. pos.y += 16;
  247. let player = window.player;
  248. if (player) {
  249. let px = player.x;
  250. let py = player.y;
  251. let hiddenRooms = this.hiddenRooms || [];
  252. let hLen = hiddenRooms.length;
  253. for (let i = 0; i < hLen; i++) {
  254. let h = hiddenRooms[i];
  255. if (!h.discoverable)
  256. continue;
  257. if (
  258. px < h.x ||
  259. px >= h.x + h.width ||
  260. py < h.y ||
  261. py >= h.y + h.height ||
  262. !physics.isInPolygon(px, py, h.area)
  263. )
  264. continue;
  265. h.discovered = true;
  266. }
  267. }
  268. if (instant) {
  269. this.moveTo = null;
  270. this.pos = pos;
  271. this.stage.x = -~~this.pos.x;
  272. this.stage.y = -~~this.pos.y;
  273. } else
  274. this.moveTo = pos;
  275. this.updateSprites();
  276. },
  277. isVisible: function (x, y) {
  278. let stage = this.stage;
  279. let sx = -stage.x;
  280. let sy = -stage.y;
  281. let sw = this.width;
  282. let sh = this.height;
  283. return (!(x < sx || y < sy || x >= sx + sw || y >= sy + sh));
  284. },
  285. isHidden: function (x, y) {
  286. let hiddenRooms = this.hiddenRooms;
  287. let hLen = hiddenRooms.length;
  288. if (!hLen)
  289. return false;
  290. const { player: { x: px, y: py } } = window;
  291. let foundVisibleLayer = null;
  292. let foundHiddenLayer = null;
  293. hiddenRooms.forEach(h => {
  294. const { discovered, layer, interior } = h;
  295. const { x: hx, y: hy, width, height, area } = h;
  296. //Is the tile outside the hider
  297. if (
  298. x < hx ||
  299. x >= hx + width ||
  300. y < hy ||
  301. y >= hy + height
  302. ) {
  303. //If the hider is an interior, the tile should be hidden if the player is inside the hider
  304. if (interior) {
  305. if (physics.isInPolygon(px, py, area))
  306. foundHiddenLayer = layer;
  307. }
  308. return;
  309. }
  310. //Is the tile inside the hider
  311. if (!physics.isInPolygon(x, y, area))
  312. return;
  313. if (discovered) {
  314. foundVisibleLayer = layer;
  315. return;
  316. }
  317. //Is the player outside the hider
  318. if (
  319. px < hx ||
  320. px >= hx + width ||
  321. py < hy ||
  322. py >= hy + height
  323. ) {
  324. foundHiddenLayer = layer;
  325. return;
  326. }
  327. //Is the player inside the hider
  328. if (!physics.isInPolygon(px, py, area)) {
  329. foundHiddenLayer = layer;
  330. return;
  331. }
  332. foundVisibleLayer = layer;
  333. });
  334. //We compare hider layers to cater for hiders inside hiders
  335. return (foundHiddenLayer > foundVisibleLayer) || (foundHiddenLayer === 0 && foundVisibleLayer === null);
  336. },
  337. updateSprites: function () {
  338. if (this.titleScreen)
  339. return;
  340. const player = window.player;
  341. if (!player)
  342. return;
  343. const { w, h, width, height, stage, map, sprites } = this;
  344. const x = ~~((-stage.x / scale) + (width / (scale * 2)));
  345. const y = ~~((-stage.y / scale) + (height / (scale * 2)));
  346. this.lastUpdatePos.x = stage.x;
  347. this.lastUpdatePos.y = stage.y;
  348. const container = this.layers.tileSprites;
  349. const sw = this.showTilesW;
  350. const sh = this.showTilesH;
  351. let lowX = Math.max(0, x - sw + 1);
  352. let lowY = Math.max(0, y - sh + 2);
  353. let highX = Math.min(w, x + sw - 2);
  354. let highY = Math.min(h, y + sh - 2);
  355. let addedSprite = false;
  356. const checkHidden = this.isHidden.bind(this);
  357. const buildTile = this.buildTile.bind(this);
  358. const newVisible = [];
  359. const newHidden = [];
  360. for (let i = lowX; i < highX; i++) {
  361. let mapRow = map[i];
  362. let spriteRow = sprites[i];
  363. for (let j = lowY; j < highY; j++) {
  364. const cell = mapRow[j];
  365. if (!cell)
  366. continue;
  367. const cLen = cell.length;
  368. if (!cLen)
  369. return;
  370. const rendered = spriteRow[j];
  371. const isHidden = checkHidden(i, j);
  372. if (isHidden) {
  373. const nonFakeRendered = rendered.filter(r => !r.isFake);
  374. const rLen = nonFakeRendered.length;
  375. for (let k = 0; k < rLen; k++) {
  376. const sprite = nonFakeRendered[k];
  377. sprite.visible = false;
  378. spritePool.store(sprite);
  379. rendered.spliceWhere(s => s === sprite);
  380. }
  381. if (cell.visible) {
  382. cell.visible = false;
  383. newHidden.push({
  384. x: i,
  385. y: j
  386. });
  387. }
  388. const hasFake = cell.some(c => c[0] === '-');
  389. if (hasFake) {
  390. const isFakeRendered = rendered.some(r => r.isFake);
  391. if (isFakeRendered)
  392. continue;
  393. } else
  394. continue;
  395. } else {
  396. const fakeRendered = rendered.filter(r => r.isFake);
  397. const rLen = fakeRendered.length;
  398. for (let k = 0; k < rLen; k++) {
  399. const sprite = fakeRendered[k];
  400. sprite.visible = false;
  401. spritePool.store(sprite);
  402. rendered.spliceWhere(s => s === sprite);
  403. }
  404. if (!cell.visible) {
  405. cell.visible = true;
  406. newVisible.push({
  407. x: i,
  408. y: j
  409. });
  410. }
  411. const hasNonFake = cell.some(c => c[0] !== '-');
  412. if (hasNonFake) {
  413. const isNonFakeRendered = rendered.some(r => !r.isFake);
  414. if (isNonFakeRendered)
  415. continue;
  416. } else
  417. continue;
  418. }
  419. for (let k = 0; k < cLen; k++) {
  420. let c = cell[k];
  421. if (c === '0' || c === '')
  422. continue;
  423. const isFake = +c < 0;
  424. if (isFake && !isHidden)
  425. continue;
  426. else if (!isFake && isHidden)
  427. continue;
  428. if (isFake)
  429. c = -c;
  430. c--;
  431. let flipped = '';
  432. if (tileOpacity.canFlip(c)) {
  433. if (mRandom() < 0.5)
  434. flipped = 'flip';
  435. }
  436. let tile = spritePool.getSprite(flipped + c);
  437. if (!tile) {
  438. tile = buildTile(c, i, j);
  439. container.addChild(tile);
  440. tile.type = c;
  441. tile.sheetNum = tileOpacity.getSheetNum(c);
  442. addedSprite = true;
  443. } else {
  444. tile.position.x = i * scale;
  445. tile.position.y = j * scale;
  446. if (flipped !== '')
  447. tile.position.x += scale;
  448. tile.visible = true;
  449. }
  450. if (isFake)
  451. tile.isFake = isFake;
  452. tile.z = k;
  453. rendered.push(tile);
  454. }
  455. }
  456. }
  457. lowX = Math.max(0, lowX - 10);
  458. lowY = Math.max(0, lowY - 10);
  459. highX = Math.min(w - 1, highX + 10);
  460. highY = Math.min(h - 1, highY + 10);
  461. for (let i = lowX; i < highX; i++) {
  462. const mapRow = map[i];
  463. let spriteRow = sprites[i];
  464. let outside = ((i >= x - sw) && (i < x + sw));
  465. for (let j = lowY; j < highY; j++) {
  466. if ((outside) && (j >= y - sh) && (j < y + sh))
  467. continue;
  468. const cell = mapRow[j];
  469. if (cell.visible) {
  470. cell.visible = false;
  471. newHidden.push({ x: i, y: j });
  472. }
  473. let list = spriteRow[j];
  474. let lLen = list.length;
  475. for (let k = 0; k < lLen; k++) {
  476. let sprite = list[k];
  477. sprite.visible = false;
  478. spritePool.store(sprite);
  479. }
  480. spriteRow[j] = [];
  481. }
  482. }
  483. events.emit('onTilesVisible', newVisible, true);
  484. events.emit('onTilesVisible', newHidden, false);
  485. if (addedSprite)
  486. container.children.sort((a, b) => a.z - b.z);
  487. },
  488. update: function () {
  489. let time = +new Date();
  490. if (this.moveTo) {
  491. let deltaX = this.moveTo.x - this.pos.x;
  492. let deltaY = this.moveTo.y - this.pos.y;
  493. if (deltaX !== 0 || deltaY !== 0) {
  494. let distance = Math.max(Math.abs(deltaX), Math.abs(deltaY));
  495. let moveSpeedMax = this.moveSpeedMax;
  496. if (this.moveSpeed < moveSpeedMax)
  497. this.moveSpeed += this.moveSpeedInc;
  498. let moveSpeed = this.moveSpeed;
  499. if (moveSpeedMax < 1.6)
  500. moveSpeed *= 1 + (distance / 200);
  501. let elapsed = time - this.lastTick;
  502. moveSpeed *= (elapsed / 15);
  503. if (moveSpeed > distance)
  504. moveSpeed = distance;
  505. deltaX = (deltaX / distance) * moveSpeed;
  506. deltaY = (deltaY / distance) * moveSpeed;
  507. this.pos.x = this.pos.x + deltaX;
  508. this.pos.y = this.pos.y + deltaY;
  509. } else {
  510. this.moveSpeed = 0;
  511. this.moveTo = null;
  512. }
  513. let stage = this.stage;
  514. if (window.staticCamera !== true) {
  515. stage.x = -~~this.pos.x;
  516. stage.y = -~~this.pos.y;
  517. }
  518. let halfScale = scale / 2;
  519. if (Math.abs(stage.x - this.lastUpdatePos.x) > halfScale || Math.abs(stage.y - this.lastUpdatePos.y) > halfScale)
  520. this.updateSprites();
  521. events.emit('onSceneMove');
  522. }
  523. this.lastTick = time;
  524. },
  525. buildContainer: function (obj) {
  526. let container = new PIXI.Container();
  527. this.layers[obj.layerName || obj.sheetName].addChild(container);
  528. return container;
  529. },
  530. buildRectangle: function (obj) {
  531. let graphics = new PIXI.Graphics();
  532. let alpha = obj.alpha;
  533. if (obj.has('alpha'))
  534. graphics.alpha = alpha;
  535. let fillAlpha = obj.fillAlpha;
  536. if (obj.has('fillAlpha'))
  537. fillAlpha = 1;
  538. graphics.beginFill(obj.color || '0x48edff', fillAlpha);
  539. if (obj.strokeColor)
  540. graphics.lineStyle(scaleMult, obj.strokeColor);
  541. graphics.drawRect(0, 0, obj.w, obj.h);
  542. graphics.endFill();
  543. (obj.parent || this.layers[obj.layerName || obj.sheetName]).addChild(graphics);
  544. graphics.position.x = obj.x;
  545. graphics.position.y = obj.y;
  546. return graphics;
  547. },
  548. moveRectangle: function (obj) {
  549. obj.sprite.position.x = obj.x;
  550. obj.sprite.position.y = obj.y;
  551. obj.sprite.width = obj.w;
  552. obj.sprite.height = obj.h;
  553. },
  554. buildObject: function (obj) {
  555. const { sheetName, parent: container, layerName, visible = true } = obj;
  556. const sprite = new PIXI.Sprite();
  557. obj.sprite = sprite;
  558. this.setSprite(obj);
  559. sprite.visible = visible;
  560. const spriteContainer = container || this.layers[layerName || sheetName] || this.layers.objects;
  561. spriteContainer.addChild(sprite);
  562. obj.w = sprite.width;
  563. obj.h = sprite.height;
  564. return sprite;
  565. },
  566. addFilter: function (sprite) {
  567. let thickness = (sprite.width > scale) ? 8 : 16;
  568. let filter = new shaderOutline(this.renderer.width, this.renderer.height, thickness, '0xffffff');
  569. if (!sprite.filters)
  570. sprite.filters = [filter];
  571. else
  572. sprite.filters.push();
  573. return filter;
  574. },
  575. removeFilter: function (sprite, filter) {
  576. if (sprite.filters)
  577. sprite.filters = null;
  578. },
  579. buildText: function (obj) {
  580. let textSprite = new PIXI.Text(obj.text, {
  581. fontFamily: 'bitty',
  582. fontSize: (obj.fontSize || 14),
  583. fill: obj.color || 0xF2F5F5,
  584. stroke: 0x2d2136,
  585. strokeThickness: 4,
  586. align: 'center'
  587. });
  588. textSprite.x = obj.x - (textSprite.width / 2);
  589. textSprite.y = obj.y;
  590. let parentSprite = obj.parent || this.layers[obj.layerName];
  591. parentSprite.addChild(textSprite);
  592. return textSprite;
  593. },
  594. buildEmitter: function (config) {
  595. return particles.buildEmitter(config);
  596. },
  597. destroyEmitter: function (emitter) {
  598. particles.destroyEmitter(emitter);
  599. },
  600. setSprite: function (obj) {
  601. const { sprite, sheetName, cell } = obj;
  602. const bigSheets = globals.clientConfig.bigTextures;
  603. const isBigSheet = bigSheets.includes(sheetName);
  604. const newSize = isBigSheet ? 24 : 8;
  605. obj.w = newSize * scaleMult;
  606. obj.h = obj.w;
  607. sprite.width = obj.w;
  608. sprite.height = obj.h;
  609. sprite.texture = this.getTexture(sheetName, cell, newSize);
  610. if (newSize !== sprite.size) {
  611. sprite.size = newSize;
  612. this.setSpritePosition(obj);
  613. }
  614. },
  615. setSpritePosition: function (obj) {
  616. const { sprite, x, y, flipX, offsetX = 0, offsetY = 0 } = obj;
  617. sprite.x = (x * scale) + (flipX ? scale : 0) + offsetX;
  618. const oldY = sprite.y;
  619. sprite.y = (y * scale) + offsetY;
  620. if (sprite.width > scale) {
  621. if (flipX)
  622. sprite.x += scale;
  623. else
  624. sprite.x -= scale;
  625. sprite.y -= (scale * 2);
  626. }
  627. if (oldY !== sprite.y)
  628. this.reorder();
  629. sprite.scale.x = flipX ? -scaleMult : scaleMult;
  630. },
  631. reorder: function () {
  632. this.layers.mobs.children.sort((a, b) => b.y - a.y);
  633. },
  634. destroyObject: function (obj) {
  635. if (obj.sprite.parent)
  636. obj.sprite.parent.removeChild(obj.sprite);
  637. },
  638. //Changes the moveSpeedMax and moveSpeedInc variables
  639. // moveSpeed changes when mounting and unmounting
  640. // moveSpeed: 0 | moveSpeedMax: 1.5 | moveSpeedInc: 0.5
  641. // moveSpeed: 200 | moveSpeedMax: 5.5 | moveSpeedInc: 0.2
  642. // Between these values we should follow an exponential curve for moveSpeedInc since
  643. // a higher chance will proc more often, meaning the buildup in distance becomes greater
  644. adaptCameraMoveSpeed: function (moveSpeed) {
  645. const factor = Math.sqrt(moveSpeed);
  646. const maxValue = Math.sqrt(200);
  647. this.moveSpeedMax = 1.5 + ((moveSpeed / 200) * 3.5);
  648. this.moveSpeedInc = 0.2 + (((maxValue - factor) / maxValue) * 0.3);
  649. },
  650. updateMapAtPosition: function (x, y, mapCellString) {
  651. const { map, sprites, layers: { tileSprites: container } } = this;
  652. const row = sprites[x];
  653. if (!row)
  654. return;
  655. const cell = row[y];
  656. if (!cell)
  657. return;
  658. cell.forEach(c => {
  659. c.visible = false;
  660. spritePool.store(c);
  661. });
  662. cell.length = 0;
  663. map[x][y] = mapCellString.split(',');
  664. map[x][y].forEach(m => {
  665. m--;
  666. let tile = spritePool.getSprite(m);
  667. if (!tile) {
  668. tile = this.buildTile(m, x, y);
  669. container.addChild(tile);
  670. tile.type = m;
  671. tile.sheetNum = tileOpacity.getSheetNum(m);
  672. } else {
  673. tile.position.x = x * scale;
  674. tile.position.y = y * scale;
  675. tile.visible = true;
  676. }
  677. cell.push(tile);
  678. cell.visible = true;
  679. });
  680. },
  681. render: function () {
  682. if (!this.stage)
  683. return;
  684. effects.render();
  685. particles.update();
  686. this.renderer.render(this.stage);
  687. }
  688. };
  689. });