199 lines
5.0 KiB
JavaScript
199 lines
5.0 KiB
JavaScript
var Tile = function() {
|
|
// Tile data:
|
|
this.pix = new Array(64);
|
|
|
|
this.fbIndex = null;
|
|
this.tIndex = null;
|
|
this.x = null;
|
|
this.y = null;
|
|
this.w = null;
|
|
this.h = null;
|
|
this.incX = null;
|
|
this.incY = null;
|
|
this.palIndex = null;
|
|
this.tpri = null;
|
|
this.c = null;
|
|
this.initialized = false;
|
|
this.opaque = new Array(8);
|
|
};
|
|
|
|
Tile.prototype = {
|
|
setBuffer: function(scanline) {
|
|
for (this.y = 0; this.y < 8; this.y++) {
|
|
this.setScanline(this.y, scanline[this.y], scanline[this.y + 8]);
|
|
}
|
|
},
|
|
|
|
setScanline: function(sline, b1, b2) {
|
|
this.initialized = true;
|
|
this.tIndex = sline << 3;
|
|
for (this.x = 0; this.x < 8; this.x++) {
|
|
this.pix[this.tIndex + this.x] =
|
|
((b1 >> (7 - this.x)) & 1) + (((b2 >> (7 - this.x)) & 1) << 1);
|
|
if (this.pix[this.tIndex + this.x] === 0) {
|
|
this.opaque[sline] = false;
|
|
}
|
|
}
|
|
},
|
|
|
|
render: function(
|
|
buffer,
|
|
srcx1,
|
|
srcy1,
|
|
srcx2,
|
|
srcy2,
|
|
dx,
|
|
dy,
|
|
palAdd,
|
|
palette,
|
|
flipHorizontal,
|
|
flipVertical,
|
|
pri,
|
|
priTable
|
|
) {
|
|
if (dx < -7 || dx >= 256 || dy < -7 || dy >= 240) {
|
|
return;
|
|
}
|
|
|
|
this.w = srcx2 - srcx1;
|
|
this.h = srcy2 - srcy1;
|
|
|
|
if (dx < 0) {
|
|
srcx1 -= dx;
|
|
}
|
|
if (dx + srcx2 >= 256) {
|
|
srcx2 = 256 - dx;
|
|
}
|
|
|
|
if (dy < 0) {
|
|
srcy1 -= dy;
|
|
}
|
|
if (dy + srcy2 >= 240) {
|
|
srcy2 = 240 - dy;
|
|
}
|
|
|
|
if (!flipHorizontal && !flipVertical) {
|
|
this.fbIndex = (dy << 8) + dx;
|
|
this.tIndex = 0;
|
|
for (this.y = 0; this.y < 8; this.y++) {
|
|
for (this.x = 0; this.x < 8; this.x++) {
|
|
if (
|
|
this.x >= srcx1 &&
|
|
this.x < srcx2 &&
|
|
this.y >= srcy1 &&
|
|
this.y < srcy2
|
|
) {
|
|
this.palIndex = this.pix[this.tIndex];
|
|
this.tpri = priTable[this.fbIndex];
|
|
if (this.palIndex !== 0 && pri <= (this.tpri & 0xff)) {
|
|
//console.log("Rendering upright tile to buffer");
|
|
buffer[this.fbIndex] = palette[this.palIndex + palAdd];
|
|
this.tpri = (this.tpri & 0xf00) | pri;
|
|
priTable[this.fbIndex] = this.tpri;
|
|
}
|
|
}
|
|
this.fbIndex++;
|
|
this.tIndex++;
|
|
}
|
|
this.fbIndex -= 8;
|
|
this.fbIndex += 256;
|
|
}
|
|
} else if (flipHorizontal && !flipVertical) {
|
|
this.fbIndex = (dy << 8) + dx;
|
|
this.tIndex = 7;
|
|
for (this.y = 0; this.y < 8; this.y++) {
|
|
for (this.x = 0; this.x < 8; this.x++) {
|
|
if (
|
|
this.x >= srcx1 &&
|
|
this.x < srcx2 &&
|
|
this.y >= srcy1 &&
|
|
this.y < srcy2
|
|
) {
|
|
this.palIndex = this.pix[this.tIndex];
|
|
this.tpri = priTable[this.fbIndex];
|
|
if (this.palIndex !== 0 && pri <= (this.tpri & 0xff)) {
|
|
buffer[this.fbIndex] = palette[this.palIndex + palAdd];
|
|
this.tpri = (this.tpri & 0xf00) | pri;
|
|
priTable[this.fbIndex] = this.tpri;
|
|
}
|
|
}
|
|
this.fbIndex++;
|
|
this.tIndex--;
|
|
}
|
|
this.fbIndex -= 8;
|
|
this.fbIndex += 256;
|
|
this.tIndex += 16;
|
|
}
|
|
} else if (flipVertical && !flipHorizontal) {
|
|
this.fbIndex = (dy << 8) + dx;
|
|
this.tIndex = 56;
|
|
for (this.y = 0; this.y < 8; this.y++) {
|
|
for (this.x = 0; this.x < 8; this.x++) {
|
|
if (
|
|
this.x >= srcx1 &&
|
|
this.x < srcx2 &&
|
|
this.y >= srcy1 &&
|
|
this.y < srcy2
|
|
) {
|
|
this.palIndex = this.pix[this.tIndex];
|
|
this.tpri = priTable[this.fbIndex];
|
|
if (this.palIndex !== 0 && pri <= (this.tpri & 0xff)) {
|
|
buffer[this.fbIndex] = palette[this.palIndex + palAdd];
|
|
this.tpri = (this.tpri & 0xf00) | pri;
|
|
priTable[this.fbIndex] = this.tpri;
|
|
}
|
|
}
|
|
this.fbIndex++;
|
|
this.tIndex++;
|
|
}
|
|
this.fbIndex -= 8;
|
|
this.fbIndex += 256;
|
|
this.tIndex -= 16;
|
|
}
|
|
} else {
|
|
this.fbIndex = (dy << 8) + dx;
|
|
this.tIndex = 63;
|
|
for (this.y = 0; this.y < 8; this.y++) {
|
|
for (this.x = 0; this.x < 8; this.x++) {
|
|
if (
|
|
this.x >= srcx1 &&
|
|
this.x < srcx2 &&
|
|
this.y >= srcy1 &&
|
|
this.y < srcy2
|
|
) {
|
|
this.palIndex = this.pix[this.tIndex];
|
|
this.tpri = priTable[this.fbIndex];
|
|
if (this.palIndex !== 0 && pri <= (this.tpri & 0xff)) {
|
|
buffer[this.fbIndex] = palette[this.palIndex + palAdd];
|
|
this.tpri = (this.tpri & 0xf00) | pri;
|
|
priTable[this.fbIndex] = this.tpri;
|
|
}
|
|
}
|
|
this.fbIndex++;
|
|
this.tIndex--;
|
|
}
|
|
this.fbIndex -= 8;
|
|
this.fbIndex += 256;
|
|
}
|
|
}
|
|
},
|
|
|
|
isTransparent: function(x, y) {
|
|
return this.pix[(y << 3) + x] === 0;
|
|
},
|
|
|
|
toJSON: function() {
|
|
return {
|
|
opaque: this.opaque,
|
|
pix: this.pix
|
|
};
|
|
},
|
|
|
|
fromJSON: function(s) {
|
|
this.opaque = s.opaque;
|
|
this.pix = s.pix;
|
|
}
|
|
};
|
|
|
|
module.exports = Tile;
|