iigs-game-engine/tools/mkscales.js

51 lines
1.3 KiB
JavaScript

/**
* Generated data tables for BG1 scaling
*/
const RATIOS = [0.5, 0.63, 0.75, 0.87, 1.0, 1.125, 1.25, 1.375, 1.5, 1.66, 1.83, 2.0, 2.5, 3.0, 3.5, 4.0];
const NUM_SCALES = RATIOS.length;
main(process.argv.slice(2)).then(
() => process.exit(0),
(e) => {
console.error(e);
process.exit(1);
}
);
function toHex(n) {
return '$' + n.toString(16).toUpperCase().padStart(4, '0');
}
async function main(argv) {
const _ = console.log;
for (let i = 0; i < NUM_SCALES; i += 1) {
const arr = gen_scale_table(RATIOS[i]).map(n => toHex(n)).join(',');
_(`Scale${i} dw ${arr}`);
}
}
function gen_scale_table(ratio) {
// Take a bunch of values from 0 to 162 (82 total). Use the middle as a reference
// and scale out based on the (inverse) ratio, e.g. a ratio of 2 will double the pixels
const ref = Array.from({ length: 82 }, (_, i) => i * 2);
const center = 40.5;
const factor = 1. / ratio;
const table = [];
for (let i = 0; i < 82; i++) {
let index = 2 * Math.floor(center + (factor * (i - center)));
while (index < 0) {
index += 162;
}
while (index > 162) {
index -= 162;
}
table.push(index);
}
return table;
}