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.
123 lines
4.7 KiB
123 lines
4.7 KiB
import { globalConfig } from "../../core/config";
|
|
import { DrawParameters } from "../../core/draw_parameters";
|
|
import { GameSystem } from "../game_system";
|
|
import { MapChunkView } from "../map_chunk_view";
|
|
import { THEME } from "../theme";
|
|
import { drawSpriteClipped } from "../../core/draw_utils";
|
|
|
|
export class MapResourcesSystem extends GameSystem {
|
|
/**
|
|
* Draws the map resources
|
|
* @param {DrawParameters} parameters
|
|
* @param {MapChunkView} chunk
|
|
*/
|
|
drawChunk(parameters, chunk) {
|
|
const basicChunkBackground = this.root.buffers.getForKey({
|
|
key: "mapresourcebg",
|
|
subKey: chunk.renderKey,
|
|
w: globalConfig.mapChunkSize,
|
|
h: globalConfig.mapChunkSize,
|
|
dpi: 1,
|
|
redrawMethod: this.generateChunkBackground.bind(this, chunk),
|
|
});
|
|
|
|
parameters.context.imageSmoothingEnabled = false;
|
|
drawSpriteClipped({
|
|
parameters,
|
|
sprite: basicChunkBackground,
|
|
x: chunk.tileX * globalConfig.tileSize,
|
|
y: chunk.tileY * globalConfig.tileSize,
|
|
w: globalConfig.mapChunkWorldSize,
|
|
h: globalConfig.mapChunkWorldSize,
|
|
originalW: globalConfig.mapChunkSize,
|
|
originalH: globalConfig.mapChunkSize,
|
|
});
|
|
parameters.context.imageSmoothingEnabled = true;
|
|
|
|
parameters.context.globalAlpha = 0.5;
|
|
|
|
if (this.root.app.settings.getAllSettings().lowQualityMapResources) {
|
|
// LOW QUALITY: Draw patch items only
|
|
for (let i = 0; i < chunk.patches.length; ++i) {
|
|
const patch = chunk.patches[i];
|
|
const destX = chunk.x * globalConfig.mapChunkWorldSize + patch.pos.x * globalConfig.tileSize;
|
|
const destY = chunk.y * globalConfig.mapChunkWorldSize + patch.pos.y * globalConfig.tileSize;
|
|
const diameter = Math.min(80, 40 / parameters.zoomLevel);
|
|
|
|
patch.item.drawItemCenteredClipped(destX, destY, parameters, diameter);
|
|
}
|
|
} else {
|
|
// HIGH QUALITY: Draw all items
|
|
const layer = chunk.lowerLayer;
|
|
const layerEntities = chunk.contents;
|
|
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
|
|
const row = layer[x];
|
|
const rowEntities = layerEntities[x];
|
|
const worldX = (chunk.tileX + x) * globalConfig.tileSize;
|
|
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
|
|
const lowerItem = row[y];
|
|
|
|
const entity = rowEntities[y];
|
|
if (entity) {
|
|
// Don't draw if there is an entity above
|
|
continue;
|
|
}
|
|
|
|
if (lowerItem) {
|
|
const worldY = (chunk.tileY + y) * globalConfig.tileSize;
|
|
|
|
const destX = worldX + globalConfig.halfTileSize;
|
|
const destY = worldY + globalConfig.halfTileSize;
|
|
|
|
lowerItem.drawItemCenteredClipped(
|
|
destX,
|
|
destY,
|
|
parameters,
|
|
globalConfig.defaultItemDiameter
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
parameters.context.globalAlpha = 1;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {MapChunkView} chunk
|
|
* @param {HTMLCanvasElement} canvas
|
|
* @param {CanvasRenderingContext2D} context
|
|
* @param {number} w
|
|
* @param {number} h
|
|
* @param {number} dpi
|
|
*/
|
|
generateChunkBackground(chunk, canvas, context, w, h, dpi) {
|
|
if (this.root.app.settings.getAllSettings().disableTileGrid) {
|
|
// The map doesn't draw a background, so we have to
|
|
context.fillStyle = THEME.map.background;
|
|
context.fillRect(0, 0, w, h);
|
|
} else {
|
|
context.clearRect(0, 0, w, h);
|
|
}
|
|
|
|
context.globalAlpha = 0.5;
|
|
const layer = chunk.lowerLayer;
|
|
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
|
|
const row = layer[x];
|
|
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
|
|
const item = row[y];
|
|
if (item) {
|
|
context.fillStyle = item.getBackgroundColorAsResource();
|
|
context.fillRect(x, y, 1, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.root.app.settings.getAllSettings().displayChunkBorders) {
|
|
context.fillStyle = THEME.map.chunkBorders;
|
|
context.fillRect(0, 0, w, 1);
|
|
context.fillRect(0, 1, 1, h);
|
|
}
|
|
}
|
|
}
|