|
|
@@ -5,17 +5,21 @@ import NESTile from "/app/js/models/NESTile.js"; |
|
|
|
import NESPalette from "/app/js/models/NESPalette.js"; |
|
|
|
|
|
|
|
|
|
|
|
function LRIdx2TileIdxCo(index){ |
|
|
|
function LRIdx2TileIdxCo(index, lid){ |
|
|
|
lid || (lid = 2); |
|
|
|
var res = { |
|
|
|
lid: 0, |
|
|
|
index: 0, |
|
|
|
x: 0, |
|
|
|
y: 0 |
|
|
|
}; |
|
|
|
var x = Math.floor(index % 256); |
|
|
|
var y = Math.floor(index / 256); |
|
|
|
var w = (lid == 2) ? 256 : 128; |
|
|
|
var x = Math.floor(index % w); |
|
|
|
var y = Math.floor(index / w); |
|
|
|
if (x < 128){ |
|
|
|
res.index = (Math.floor(y/8) * 16) + Math.floor(x / 8); |
|
|
|
if (lid !== 2) |
|
|
|
res.lid = lid; |
|
|
|
} else { |
|
|
|
res.index = (Math.floor(y/8) * 16) + Math.floor((x - 128) / 8); |
|
|
|
res.lid = 1; |
|
|
@@ -30,6 +34,7 @@ export default class NESBank extends ISurface{ |
|
|
|
super(); |
|
|
|
this.__LP = []; // Left Patterns (Sprites) |
|
|
|
this.__RP = []; // Right Patterns (Backgrounds) |
|
|
|
this.__AccessMode = 2; // 0 = Sprites only | 1 = BG only | 2 = Sprites and BG |
|
|
|
|
|
|
|
for (var i=0; i < 256; i++){ |
|
|
|
this.__LP.push(new NESTile()); |
|
|
@@ -39,6 +44,20 @@ export default class NESBank extends ISurface{ |
|
|
|
this.__palette = null; |
|
|
|
} |
|
|
|
|
|
|
|
get access_mode(){return this.__AccessMode;} |
|
|
|
set access_mode(m){ |
|
|
|
if (!Utils.isInt(m)) |
|
|
|
throw new TypeError("Access mode expected to be integer."); |
|
|
|
switch(m){ |
|
|
|
case NESBank.ACCESSMODE_SPRITE: |
|
|
|
this.__AccessMode = NESBank.ACCESSMODE_SPRITE; break; |
|
|
|
case NESBank.ACCESSMODE_BACKGROUND: |
|
|
|
this.__AccessMode = NESBank.ACCESSMODE_BACKGROUND; break; |
|
|
|
case NESBank.ACCESSMODE_FULL: |
|
|
|
this.__AccessMode = NESBank.ACCESSMODE_FULL; break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
get json(){ |
|
|
|
JSON.stringify({ |
|
|
|
LP: this.__LP.map(x=>x.base64), |
|
|
@@ -69,14 +88,14 @@ export default class NESBank extends ISurface{ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
get width(){return 256;} |
|
|
|
get width(){return (this.__AccessMode == NESBank.ACCESSMODE_FULL) ? 256 : 128;} |
|
|
|
get height(){return 128;} |
|
|
|
get length(){return this.width * this.height;} |
|
|
|
|
|
|
|
get coloridx(){ |
|
|
|
return new Proxy(this, { |
|
|
|
get:function(obj, prop){ |
|
|
|
var len = (obj.__LP.length * 8) + (obj.__RP.length * 8); |
|
|
|
var len = obj.length * 8; |
|
|
|
if (prop === "length") |
|
|
|
return len; |
|
|
|
if (!Utils.isInt(prop)) |
|
|
@@ -85,7 +104,7 @@ export default class NESBank extends ISurface{ |
|
|
|
if (prop < 0 || prop >= len) |
|
|
|
return NESPalette.Default[4]; |
|
|
|
|
|
|
|
var res = LRIdx2TileIdxCo(prop); |
|
|
|
var res = LRIdx2TileIdxCo(prop, this.__AccessMode); |
|
|
|
var list = (res.lid === 0) ? obj.__LP : obj.__RP; |
|
|
|
return list[res.index].getPixelIndex(res.x, res.y); |
|
|
|
}, |
|
|
@@ -102,7 +121,7 @@ export default class NESBank extends ISurface{ |
|
|
|
if (value < 0 || value >= 4) |
|
|
|
throw new RangeError("Color index out of bounds."); |
|
|
|
|
|
|
|
var res = LRIdx2TileIdxCo(prop); |
|
|
|
var res = LRIdx2TileIdxCo(prop, this.__AccessMode); |
|
|
|
var list = (res.lid === 0) ? obj.__LP : obj.__RP; |
|
|
|
list[res.index].setPixelIndex(res.x, res.y, value); |
|
|
|
return true; |
|
|
@@ -179,10 +198,10 @@ export default class NESBank extends ISurface{ |
|
|
|
} |
|
|
|
|
|
|
|
getColor(x,y){ |
|
|
|
if (x < 0 || x >= 256 || y < 0 || y >= 128) |
|
|
|
if (x < 0 || x >= this.width || y < 0 || y >= this.height) |
|
|
|
return this.__default_pi[4]; |
|
|
|
|
|
|
|
var res = LRIdx2TileIdxCo((y*256)+x); |
|
|
|
var res = LRIdx2TileIdxCo((y*this.width)+x, this.__AccessMode); |
|
|
|
var list = (res.lid === 0) ? this.__LP : this.__RP; |
|
|
|
var pi = list[res.index].paletteIndex; |
|
|
|
var ci = list[res.index].getPixelIndex(res.x, res.y); |
|
|
@@ -194,10 +213,10 @@ export default class NESBank extends ISurface{ |
|
|
|
} |
|
|
|
|
|
|
|
getColorIndex(x, y){ |
|
|
|
if (x < 0 || x >= 256 || y < 0 || y >= 128) |
|
|
|
if (x < 0 || x >= this.width || y < 0 || y >= this.height) |
|
|
|
return {pi: -1, ci:-1}; |
|
|
|
|
|
|
|
var res = LRIdx2TileIdxCo((y*256)+x); |
|
|
|
var res = LRIdx2TileIdxCo((y*this.width)+x, this.__AccessMode); |
|
|
|
var list = (res.lid === 0) ? this.__LP : this.__RP; |
|
|
|
return { |
|
|
|
pi: list[res.index].paletteIndex, |
|
|
@@ -206,7 +225,7 @@ export default class NESBank extends ISurface{ |
|
|
|
} |
|
|
|
|
|
|
|
setColorIndex(x, y, ci, pi){ |
|
|
|
if (x < 0 || x >= 256 || y < 0 || y > 128) |
|
|
|
if (x < 0 || x >= this.width || y < 0 || y > this.height) |
|
|
|
throw new RangeError("Coordinates out of bounds."); |
|
|
|
if (!Utils.isInt(pi)) |
|
|
|
pi = -1; |
|
|
@@ -214,10 +233,10 @@ export default class NESBank extends ISurface{ |
|
|
|
ci = 0; |
|
|
|
|
|
|
|
if (pi < 0){ |
|
|
|
this.coloridx[(y*256)+x] = ci; |
|
|
|
this.coloridx[(y*this.width)+x] = ci; |
|
|
|
} else { |
|
|
|
|
|
|
|
var res = LRIdx2TileIdxCo((y*256)+x); |
|
|
|
var res = LRIdx2TileIdxCo((y*this.width)+x, this.__AccessMode); |
|
|
|
var list = (res.lid === 0) ? this.__LP : this.__RP; |
|
|
|
|
|
|
|
list[res.index].paletteIndex = pi; |
|
|
@@ -229,4 +248,8 @@ export default class NESBank extends ISurface{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NESBank.ACCESSMODE_SPRITE = 0; |
|
|
|
NESBank.ACCESSMODE_BACKGROUND = 1; |
|
|
|
NESBank.ACCESSMODE_FULL = 2; |
|
|
|
|
|
|
|
|