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.
 
 
 

205 lines
4.4 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/rendering/tileOpacity',
  4. 'js/rendering/spritePool'
  5. ], function (
  6. events,
  7. tileOpacity,
  8. spritePool
  9. ) {
  10. const mRandom = Math.random.bind(Math);
  11. const updateSprites = renderer => {
  12. if (renderer.titleScreen)
  13. return;
  14. const player = window.player;
  15. if (!player)
  16. return;
  17. const { w, h, width, height, stage, map, sprites } = renderer;
  18. const x = ~~((-stage.x / scale) + (width / (scale * 2)));
  19. const y = ~~((-stage.y / scale) + (height / (scale * 2)));
  20. renderer.lastUpdatePos.x = stage.x;
  21. renderer.lastUpdatePos.y = stage.y;
  22. const container = renderer.layers.tileSprites;
  23. const sw = renderer.showTilesW;
  24. const sh = renderer.showTilesH;
  25. let lowX = Math.max(0, x - sw + 1);
  26. let lowY = Math.max(0, y - sh + 2);
  27. let highX = Math.min(w, x + sw - 2);
  28. let highY = Math.min(h, y + sh - 2);
  29. let addedSprite = false;
  30. const checkHidden = renderer.isHidden.bind(renderer);
  31. const buildTile = renderer.buildTile.bind(renderer);
  32. const newVisible = [];
  33. const newHidden = [];
  34. for (let i = lowX; i < highX; i++) {
  35. let mapRow = map[i];
  36. let spriteRow = sprites[i];
  37. for (let j = lowY; j < highY; j++) {
  38. const cell = mapRow[j];
  39. if (!cell)
  40. continue;
  41. const cLen = cell.length;
  42. if (!cLen)
  43. return;
  44. const rendered = spriteRow[j];
  45. const isHidden = checkHidden(i, j);
  46. if (isHidden) {
  47. const nonFakeRendered = rendered.filter(r => !r.isFake);
  48. const rLen = nonFakeRendered.length;
  49. for (let k = 0; k < rLen; k++) {
  50. const sprite = nonFakeRendered[k];
  51. sprite.visible = false;
  52. spritePool.store(sprite);
  53. rendered.spliceWhere(s => s === sprite);
  54. }
  55. if (cell.visible) {
  56. cell.visible = false;
  57. newHidden.push({
  58. x: i,
  59. y: j
  60. });
  61. }
  62. const hasFake = cell.some(c => c[0] === '-');
  63. if (hasFake) {
  64. const isFakeRendered = rendered.some(r => r.isFake);
  65. if (isFakeRendered)
  66. continue;
  67. } else
  68. continue;
  69. } else {
  70. const fakeRendered = rendered.filter(r => r.isFake);
  71. const rLen = fakeRendered.length;
  72. for (let k = 0; k < rLen; k++) {
  73. const sprite = fakeRendered[k];
  74. sprite.visible = false;
  75. spritePool.store(sprite);
  76. rendered.spliceWhere(s => s === sprite);
  77. }
  78. if (!cell.visible) {
  79. cell.visible = true;
  80. newVisible.push({
  81. x: i,
  82. y: j
  83. });
  84. }
  85. const hasNonFake = cell.some(c => c[0] !== '-');
  86. if (hasNonFake) {
  87. const isNonFakeRendered = rendered.some(r => !r.isFake);
  88. if (isNonFakeRendered)
  89. continue;
  90. } else
  91. continue;
  92. }
  93. for (let k = 0; k < cLen; k++) {
  94. let c = cell[k];
  95. if (c === '0' || c === '')
  96. continue;
  97. const isFake = +c < 0;
  98. if (isFake && !isHidden)
  99. continue;
  100. else if (!isFake && isHidden)
  101. continue;
  102. if (isFake)
  103. c = -c;
  104. c--;
  105. let flipped = '';
  106. if (tileOpacity.canFlip(c)) {
  107. if (mRandom() < 0.5)
  108. flipped = 'flip';
  109. }
  110. let tile = spritePool.getSprite(flipped + c);
  111. if (!tile) {
  112. tile = buildTile(c, i, j);
  113. container.addChild(tile);
  114. tile.type = c;
  115. tile.sheetNum = tileOpacity.getSheetNum(c);
  116. addedSprite = true;
  117. } else {
  118. tile.position.x = i * scale;
  119. tile.position.y = j * scale;
  120. if (flipped !== '')
  121. tile.position.x += scale;
  122. tile.visible = true;
  123. }
  124. if (isFake)
  125. tile.isFake = isFake;
  126. tile.z = k;
  127. rendered.push(tile);
  128. }
  129. }
  130. }
  131. lowX = Math.max(0, lowX - 10);
  132. lowY = Math.max(0, lowY - 10);
  133. highX = Math.min(w - 1, highX + 10);
  134. highY = Math.min(h - 1, highY + 10);
  135. for (let i = lowX; i < highX; i++) {
  136. const mapRow = map[i];
  137. let spriteRow = sprites[i];
  138. let outside = ((i >= x - sw) && (i < x + sw));
  139. for (let j = lowY; j < highY; j++) {
  140. if ((outside) && (j >= y - sh) && (j < y + sh))
  141. continue;
  142. const cell = mapRow[j];
  143. if (cell.visible) {
  144. cell.visible = false;
  145. newHidden.push({ x: i, y: j });
  146. }
  147. let list = spriteRow[j];
  148. let lLen = list.length;
  149. for (let k = 0; k < lLen; k++) {
  150. let sprite = list[k];
  151. sprite.visible = false;
  152. spritePool.store(sprite);
  153. }
  154. spriteRow[j] = [];
  155. }
  156. }
  157. events.emit('onTilesVisible', newVisible, true);
  158. events.emit('onTilesVisible', newHidden, false);
  159. if (addedSprite)
  160. container.children.sort((a, b) => a.z - b.z);
  161. };
  162. return updateSprites;
  163. });