src/prototype/cost-matrix.ts
declare global {
interface CostMatrix {
render: (roomName?: string, asVisual?: boolean) => string;
}
}
/**
* Outputs a cost matrix as a table for console output.
*/
PathFinder.CostMatrix.prototype.render = function (this: CostMatrix, roomName?: string, asVisual?: boolean): string {
const terrain = roomName && Game.map.getRoomTerrain(roomName);
const visual = roomName && asVisual && Game.rooms[roomName]?.visual;
let output = '<table style="display: inline-block">';
for (let y = 0; y < 50; y++) {
output += '<tr style="height: 2px">';
for (let x = 0; x < 50; x++) {
let value = this.get(x, y);
if (value === 0 && roomName) {
// Simulate fallback to room terrain values.
if (terrain.get(x, y) === TERRAIN_MASK_WALL) {
value = 255;
}
else if (terrain.get(x, y) === TERRAIN_MASK_SWAMP) {
value = 10;
}
else {
value = 2;
}
}
// Generate color gradient for matrix values of 1-99.
let color = 'gray';
if (value >= 100) color = 'black';
else if (value >= 75) color = 'rgb(' + Math.round(255 * (1 - (value - 75) / 25)) + ', 0, 255)';
else if (value >= 50) color = 'rgb(255, 0, ' + Math.round(255 * (value - 50) / 25) + ')';
else if (value >= 25) color = 'rgb(255, ' + Math.round(255 * (1 - (value - 25) / 25)) + ', 0)';
else if (value > 0) color = 'rgb(' + Math.round(255 * value / 25) + ', 255, 0)';
if (visual) {
visual.rect(x - 0.4, y - 0.4, 0.8, 0.8, {
fill: color,
opacity: 0.5,
});
}
output += '<td style="width: 2px; background: ' + color + '"></td>';
}
output += '</tr>';
}
output += '</table>';
return output;
};
export {};