|
- import {EventCaller} from "/app/js/common/EventCaller.js"
-
- /**
- * Object for manipulating the eight NES palettes.
- * @extends EventCaller
- */
- export default class NESPalette extends EventCaller{
- constructor(){
- super();
- this.__BGColor = 63; // Index to the background color ALL palettes MUST share.
- this.__palette = [
- // Tile/Background Palettes
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0,
- // Sprite Palettes
- 0,0,0,
- 0,0,0,
- 0,0,0,
- 0,0,0
- ];
- }
-
- /**
- * Sets one or all of the eight color palettes to the values given. By default, function
- * assumes the given array is for all eight palettes (or 25 total color indexes, 3 per palette
- * and 1 background/transparency color used by ALL palettes).
- * If a single palette is being set, the array must only contain 3 entries.
- * @param {Array} apci - Array of color indexes to store into the palette(s)
- * @param {number} [p=8] - Zero-based index of the palette being set. Any value outside the range of 0 - 7 will set ALL palettes.
- * @returns {this}
- */
- set_palette(apci, p=8){
- if (typeof(p) != 'number')
- throw new TypeError("First argument expected to be a number.");
- if (!(apci instanceof Array))
- throw new TypeError("Expected an array of color index values.");
- if (p < 0 || p >= 8){ // Setting ALL palettes!
- if (apci.length != 25)
- throw new RangeError("Color array must contain 25 color values to fill all palettes.");
- this.__BGColor = apci[0];
- for (var i=0; i < 24; i++){
- if (typeof(apci[i+1]) == 'number'){
- this.__palette[i] = apci[i+1]
- }
- }
- } else { // Setting a specific palette.
- if (apci.length != 3)
- throw new RangeError("Color array must contain three color values.");
- p *= 3;
- for (var i=0; i < 4; i++){
- if (typeof(apci[i]) === 'number'){
- this.__palette[p+i] = apci[i];
- }
- }
- }
- this.emit("palettes_changed", {type:"ALL"});
- return this;
- }
-
- /**
- * Sets a palette's color index value to a given system color index.
- * NOTE: Setting palette color index 0 for ANY palette changes that index for ALL palettes.
- * @param {number} p - The index of the palette being set.
- * @param {number} pci - The palette color index (0 - 3) to set.
- * @param {number} sci - The system color index (0 - 63) value to set to.
- * @returns {this}
- */
- set_palette_syscolor_index(p, pci, sci){
- if (typeof(p) != 'number' || typeof(pci) != 'number' || typeof(sci) != 'number')
- throw new TypeError("Palette, palette color, and system color index expected to be numbers.");
- if (p < 0 || p >= 8){
- throw new RangeError("Palette index is out of bounds.");
- }
- if (pci < 0 || pci >= 4){
- throw new RangeError("Palette color index is out of bounds.");
- }
- if (sci < 0 || sci >= 64){
- throw new RangeError("System color index is out of bounds.");
- }
- if (pci == 0){
- this.__BGColor = sci;
- this.emit("palettes_changed", {type:"ALL", cindex:0});
- } else {
- this.__palette[(p*3) + (pci-1)] = sci;
- this.emit("palettes_changed", {type:(p < 4) ? "TILE" : "SPRITE", pindex:p, cindex:pci});
- }
- return this;
- }
-
- /**
- * Returns the system color index at the given palette color index.
- * @param {number} p - The index (0 - 7) of the palette.
- * @param {number} pci - The palette color index (0 - 3).
- * @returns {number} - The index of the system color used.
- */
- get_palette_syscolor_index(p, pci){
- if (typeof(p) != 'number' || typeof(pci) != 'number')
- throw new TypeError("Palette and color index expected to be numbers.");
- if (p < 0 || p >= 8){
- throw new RangeError("Palette index is out of bounds.");
- }
- if (pci < 0 || pci >= 4){
- throw new RangeError("Palette color index is out of bounds.");
- }
- return (pci === 0) ? this.__BGColor : this.__palette[(p*3)+(pci-1)];
- }
-
- /**
- * Returns a hex string color value used by the NES system at the index stored at the given
- * palette color index.
- * @param {number} p - The index (0 - 7) of the palette.
- * @param {number} pci - The palette color index (0 - 3).
- * @returns {string}
- */
- get_palette_color(p, pci){
- if (typeof(p) != 'number' || typeof(pci) != 'number')
- throw new TypeError("Palette and color index expected to be numbers.");
- if (p < 0 || p >= 8){
- throw new RangeError("Palette index is out of bounds.");
- }
- if (pci < 0 || pci >= 4){
- throw new RangeError("Palette color index is out of bounds.");
- }
- return NESPalette.SystemColor[this.get_palette_syscolor_index(p, pci)];
- }
-
- /**
- * Generates a small 6502 assembly block string containing the current palette data.
- * @param {string} [memname="PaletteData"] The label named under which to store the data.
- * @returns {string}
- */
- to_asm(memname="PaletteData"){
- var NumToHex=function(n){
- var h = n.toString(16);
- if (h.length %2)
- h = '0' + h;
- return '$' + h;
- };
- var BGHex = NumToHex(this.__BGColor);
- var s = memname + ":\n\t.db ";
-
- // Storing background palette data.
- for (var i=0; i < 12; i++){
- if (i % 3 == 0)
- s += ((i == 0) ? "" : " ") + BGHex;
- s += " " + NumToHex(this.__palette[i]);
- }
- s += "\t; Background palette data.\n\t.db ";
-
- // Storing foreground palette data.
- for (var i=12; i < 24; i++){
- if (i % 3 == 0)
- s += ((i == 12) ? "" : " ") + BGHex;
- s += " " + NumToHex(this.__palette[i]);
- }
- s += "\t; Foreground palette data.";
-
- return s;
- }
- }
-
-
- // NES Palette color information comes from the following site...
- // http://www.thealmightyguru.com/Games/Hacking/Wiki/index.php/NES_Palette
- /**
- * Hex string color values representing the NES system palette.
- */
- NESPalette.SystemColor = [
- "#7C7C7C",
- "#0000FC",
- "#0000BC",
- "#4428BC",
- "#940084",
- "#A80020",
- "#A81000",
- "#881400",
- "#503000",
- "#007800",
- "#006800",
- "#005800",
- "#004058",
- "#000000",
- "#000000",
- "#000000",
- "#BCBCBC",
- "#0078F8",
- "#0058F8",
- "#6844FC",
- "#D800CC",
- "#E40058",
- "#F83800",
- "#E45C10",
- "#AC7C00",
- "#00B800",
- "#00A800",
- "#00A844",
- "#008888",
- "#000000",
- "#000000",
- "#000000",
- "#F8F8F8",
- "#3CBCFC",
- "#6888FC",
- "#9878F8",
- "#F878F8",
- "#F85898",
- "#F87858",
- "#FCA044",
- "#F8B800",
- "#B8F818",
- "#58D854",
- "#58F898",
- "#00E8D8",
- "#787878",
- "#000000",
- "#000000",
- "#FCFCFC",
- "#A4E4FC",
- "#B8B8F8",
- "#D8B8F8",
- "#F8B8F8",
- "#F8A4C0",
- "#F0D0B0",
- "#FCE0A8",
- "#F8D878",
- "#D8F878",
- "#B8F8B8",
- "#B8F8D8",
- "#00FCFC",
- "#F8D8F8",
- "#000000",
- "#000000"
- ];
-
- NESPalette.Default = [
- "#080808",
- "#343434",
- "#a2a2a2",
- "#efefef",
- "#666666" // Out of bounds color.
- ];
-
|