import Utils from "/app/js/common/Utils.js"; import ISurface from "/app/js/ifaces/ISurface.js"; import NESBank from "/app/js/models/NESBank.js"; import NESPalette from "/app/js/models/NESPalette.js"; export default class NESNameTable extends ISurface{ constructor(){ super(); this.__bank = null; this.__palette = null; this.__tiles = []; this.__attribs = []; for (let i=0; i < 960; i++) this.__tiles[i] = 0; for (let i=0; i < 64; i++) this.__attribs[i] = [0,0,0,0]; } get bank(){return this.__bank;} set bank(b){ if (b !== null and !(b instanceof NESBank)) throw new TypeError("Expected a NESBank object."); this.__bank = b; } get palette(){return this.__palette;} set palette(p){ if (p !== null && !(p instanceof NESPalette)) throw new TypeError("Expected a NESPalette object."); this.__palette = p; } get width(){return 256;} get height(){return 240;} get length(){return 0;} get undos(){return 0;} get redos(){return 0;} copy(b){ this.bank = b.bank; this.palette = b.palette; for (let i=0; i < 960; i++) this.__tiles[i] = b.__tiles[i]; for (let i=0; i < 64; i++){ this.__attribs[i] = [ b.__attribs[i][0], b.__attribs[i][1], b.__attribs[i][2], b.__attribs[i][3] ]; } return this; } clone(){ return (new NESNameTable()).clone(this); } snapshot(){return this;} undo(){return this;} redo(){return this;} clearUndos(){return this;} clearRedos(){return this;} clearHistory(){ return this.clearUndos().clearRedos(); } getColor(x, y){ var pal = {pi:-1, ci:-1}; try { pal = this.getColorIndex(x, y); } catch (e) {throw e;} if (this.__palette !== null && pal.pi >= 0 && pal.ci >= 0) { return this.__palette.get_palette_color(pal.pi, pal.ci); } else if (pal.ci >= 0){ return NESPalette.Default(pal.ci); } return NESPalette.Default(4); } getColorIndex(x, y){ if (x < 0 || x >= this.width || y < 0 || y >= this.height) throw new RangeError("Coordinates are out of bounds."); var pi = -1; var ci = -1; if (this.__bank !== null){ var _x = Math.floor(x % 8); var _y = Math.floor(y % 8); var tileX = Math.floor(x / 32); var tileY = Math.floor(y / 32); var tileIndex = 256 + this.__tiles[(tileY * 32) + tileX]; ci = this.__bank.rp[tileIndex].getPixelIndex(_x, _y); pi = this._PaletteFromCoords(x, y); } return {pi:pi, ci:ci}; } setColorIndex(x, y, ci, pi){ return this; } _PaletteFromCoords(x,y){ var blockX = Math.floor(x / 32); var blockY = Math.floor(y / 32); var bIndex = (blockY * 8) + blockX; var palX = Math.floor(x % 16); var palY = Math.floor(y % 16); var pIndex = ((palX < 8) ? 0 : 1) + ((palY >= 8) ? 2 : 0); return this.__attribs[bIndex][pIndex]; } }