2019-06-11 20:05:34 +08:00

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;