A pixel art painter geared specifically at NES pixel art. Includes export for .chr binary file as well as palette and namespace data.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

120 lines
2.9KB

  1. import Utils from "/app/js/common/Utils.js";
  2. import NESTile from "/app/js/models/NESTile.js";
  3. import NESPalette from "/app/js/models/NESPalette.js";
  4. export default class NESBank {
  5. constructor(){
  6. this.__LP = []; // Left Patterns (Sprites)
  7. this.__RP = []; // Right Patterns (Backgrounds)
  8. for (var i=0; i < 256; i++){
  9. this.__LP.push(new NESTile());
  10. this.__RP.push(new NESTile());
  11. }
  12. this.__palette = null;
  13. }
  14. get json(){
  15. JSON.stringify({
  16. LP: this.__LP.map(x=>x.base64),
  17. RP: this.__RP.map(x=>x.base64)
  18. });
  19. }
  20. get chr(){
  21. var buff = new Uint8Array(8192);
  22. var offset = 0;
  23. this.__LP.forEach(function(i){
  24. buff.set(i.chr, offset);
  25. offset += 16;
  26. });
  27. this.__RP.forEach(function(i){
  28. buff.set(i.chr, offset);
  29. offset += 16;
  30. });
  31. return buff;
  32. }
  33. get palette(){return this.__palette;}
  34. set palette(p){
  35. if (p !== null && !(p instanceof NESPalette))
  36. throw new TypeError("Expected null or NESPalette object.");
  37. if (p !== this.__palette){
  38. this.__palette = p;
  39. }
  40. }
  41. get lp(){
  42. return new Proxy(this, {
  43. get: function(obj, prop){
  44. if (prop === "length")
  45. return obj.__LP.length;
  46. if (!Utils.isInt(prop))
  47. throw new TypeError("Expected integer index.");
  48. prop = parseInt(prop);
  49. if (prop < 0 || prop >= 256)
  50. throw new RangeError("Index out of bounds.");
  51. return this.__LP[prop];
  52. },
  53. set: function(obj, prop, value){
  54. if (!Utils.isInt(prop))
  55. throw new TypeError("Expected integer index.");
  56. if (!(value instanceof NESTile))
  57. throw new TypeError("Can only assign NESTile objects.");
  58. prop = parseInt(prop);
  59. if (prop < 0 || prop >= 256)
  60. throw new RangeError("Index out of bounds.");
  61. this.__LP[prop].copy(value);
  62. }
  63. });
  64. }
  65. get rp(){
  66. return new Proxy(this, {
  67. get: function(obj, prop){
  68. if (prop === "length")
  69. return obj.__RP.length;
  70. if (!Utils.isInt(prop))
  71. throw new TypeError("Expected integer index.");
  72. prop = parseInt(prop);
  73. if (prop < 0 || prop >= 256)
  74. throw new RangeError("Index out of bounds.");
  75. return this.__RP[prop];
  76. },
  77. set: function(obj, prop, value){
  78. if (!Utils.isInt(prop))
  79. throw new TypeError("Expected integer index.");
  80. if (!(value instanceof NESTile))
  81. throw new TypeError("Can only assign NESTile objects.");
  82. prop = parseInt(prop);
  83. if (prop < 0 || prop >= 256)
  84. throw new RangeError("Index out of bounds.");
  85. this.__RP[prop].copy(value);
  86. }
  87. });
  88. }
  89. copy(b){
  90. if (!(b instanceof NESBank))
  91. throw new TypeError("Expected NESBank object.");
  92. for (var i=0; i < 256; i++){
  93. this.lp[i] = b.lp[i];
  94. this.rp[i] = b.rp[i];
  95. }
  96. return this;
  97. }
  98. clone(){
  99. return (new NESBank()).copy(this);
  100. }
  101. }