topical media & game development

talk show tell print

mobile-graphic-enchant-plugins-extendMap.enchant.js / js



  
@fileOverview extendMap.enchant.js
version: 1.0 @require enchant.js v0.4 or later
author: rtsan @description enchantMapEditor: http://github.com/wise9/enchantMapEditor

  
  
  
plugin namespace object @type {Object}

  
  enchant.extendMap = {};
  
  
scope enchant.extendMap.ExMap.prototype @type {*}

  
  enchant.extendMap.ExMap = enchant.Class.create(enchant.Map, {
      
@extends enchant.Map

  
  
      type2data: function() {
          var len = this._typeData.length;
          var xlen = this._typeData[0][0].length;
          var ylen = this._typeData[0].length;
          for (var index = 0; index < len; index++) {
              this._data[index] = new Array();
              for (var y = 0; y < ylen; y++) {
                  this._data[index][y] = new Array();
                  for (var x = 0; x < xlen; x++) {
                      this._data[index][y][x] = this.searchPattern(index, x, y);
                  }
              }
          }
      },
      data2type: function() {
          var len = this._data.length;
          var xlen = this._data[0][0].length;
          var ylen = this._data[0].length;
          this._typeData = new Array();
          for (var index = 0; index < len; index++) {
              this._typeData[index] = new Array();
              for (var y = 0; y < ylen; y++) {
                  this._typeData[index][y] = new Array();
                  for (var x = 0; x < xlen; x++) {
                      this._typeData[index][y][x] = Math.floor(this._data[index][y][x] / 68);
                      if (this._data[index][y][x] % 17 > 12) {
                          this._typeData[index][y][x] = -1;
                      }
                  }
              }
          }
      },
      isOwn: function(index, x, y, own) {
          var data = this._typeData[index][y][x];
          if (data == own
              || data == -1
              || data > 7
              || (typeof this._types != 'undefined')
              && this._types[data].parentNum == this._types[own].baseNum) {
              return true;
          } else {
              return false;
          }
      },
      searchPattern: function(index, x, y) {
          var patternTable = {
              0: 42, 2: 54, 8: 3, 10: 53, 11: 57, 16: 1, 18: 51, 22: 55, 24: 2, 26: 52,
              27: 44, 30: 45, 31: 56, 64: 20, 66: 37, 72: 19, 74: 36, 75: 10, 80: 17, 82: 34,
              86: 11, 88: 18, 90: 35, 91: 60, 94: 58, 95: 59, 104: 23, 106: 27, 107: 40, 120: 61,
              122: 26, 123: 43, 126: 9, 127: 6, 208: 21, 210: 28, 214: 38, 216: 62, 218: 24, 222: 41,
              223: 7, 219: 8, 248: 22, 250: 25, 251: 4, 254: 5, 255: 39
          };
          var patternNumber = 0;
          var own = this._typeData[index][y][x];
          var xlen = this._typeData[index][y].length - 1;
          var ylen = this._typeData[index].length - 1;
          if (own == -1) {
              return -1;
          } else if (own > 7) {
              return this._data[index][y][x];
          }
          if (x == 0) {
              patternNumber |= 41;
          } else if (x == xlen) {
              patternNumber |= 148;
          }
          if (y == 0) {
              patternNumber |= 7;
          } else if (y == ylen) {
              patternNumber |= 224;
          }
  
          if (x > 0) {
              if (this.isOwn(index, x - 1, y, own)) {
                  patternNumber += 8;
              }
  
          }
          if (x < xlen) {
              if (this.isOwn(index, x + 1, y, own)) {
                  patternNumber += 16;
              }
          }
          if (y > 0) {
              if (this.isOwn(index, x, y - 1, own)) {
                  patternNumber += 2;
              }
          }
          if (y < ylen) {
              if (this.isOwn(index, x, y + 1, own)) {
                  patternNumber += 64;
              }
          }
          if (x > 0 && y > 0) {
              if (this.isOwn(index, x - 1, y - 1, own)) {
                  patternNumber += 1;
              }
          }
          if (x < xlen && y > 0) {
              if (this.isOwn(index, x + 1, y - 1, own)) {
                  patternNumber += 4;
              }
          }
          if (x > 0 && y < ylen) {
              if (this.isOwn(index, x - 1, y + 1, own)) {
                  patternNumber += 32;
              }
          }
          if (x < xlen && y < ylen) {
              if (this.isOwn(index, x + 1, y + 1, own)) {
                  patternNumber += 128;
              }
          }
  
          if (!((patternNumber & 1) && (patternNumber & 2) && (patternNumber & 8))) {
              patternNumber &= 254;
          }
          if (!((patternNumber & 4) && (patternNumber & 2) && (patternNumber & 16))) {
              patternNumber &= 251;
          }
          if (!((patternNumber & 32) && (patternNumber & 64) && (patternNumber & 8))) {
              patternNumber &= 223;
          }
          if (!((patternNumber & 128) && (patternNumber & 64) && (patternNumber & 16))) {
              patternNumber &= 127;
          }
  
          if (patternTable.hasOwnProperty(patternNumber)) {
              var ret = own * 68 + patternTable[patternNumber];
          } else {
              var ret = -1;
              console.log('this._typeData[' + index + '][' + y + '][' + x + '] = ' + patternNumber + ' // undefined');
          }
          return ret;
      },
      match: function(ind1, ind2) {
          var i = 0;
          while (i < 1024) {
              if (this._types[ind1].baseType[i] ^ this._types[ind2].parentType[i]) {
                  return false;
              } else {
                  i++;
              }
          }
          return true;
      },
      loadTypeData: function(data) {
          this._typeData = Array.prototype.slice.apply(arguments);
          this._dirty = true;
          this.type2data();
          var c = 0;
          for (var index = 0, l = this._data.length; index < l; index++) {
              for (var y = 0, ll = this._data[0].length; y < ll; y++) {
                  for (var x = 0, lll = this._data[0][0].length; x < lll; x++) {
                      if (this._typeData[index][y][x] > 7) {
                          this._typeData[index][y][x] = -1;
                      }
                      if (this._data[index][y][x] >= 0) {
                          c++;
                      }
                  }
              }
          }
          if (c / (data.length * data[0].length) > 0.2) {
              this._tight = true;
          } else {
              this._tight = false;
          }
      },
      loadData: function(data) {
          this._data = Array.prototype.slice.apply(arguments);
          this._dirty = true;
          this.data2type();
          var c = 0;
          for (var index = 0, l = this._data.length; index < l; index++) {
              for (var y = 0, ll = this._data[0].length; y < ll; y++) {
                  for (var x = 0, lll = this._data[0][0].length; x < lll; x++) {
                      if (this._data[index][y][x] >= 0) {
                          c++;
                      }
                  }
              }
          }
          if (c / (data.length * data[0].length) > 0.2) {
              this._tight = true;
          } else {
              this._tight = false;
          }
      },
      image: {
          get: function() {
              return this._image;
          },
          set: function(image) {
              var img = image.clone();
              var core = enchant.Core.instance;
              var surface = new Surface(272, 512);
              var Type = function(image, left, top, tileWidth, tileHeight) {
                  this.baseType = [];
                  this.parentType = [];
                  this.baseType = image.context.getImageData(left, top, tileWidth, tileHeight).data;
                  this.parentType = image.context.getImageData(left + tileWidth, top, tileWidth, tileHeight).data;
              };
              var extract = function(left, top, sx, sy) {
                  var params = [
                      [  0, 16, 48, 8, 16, 0, 48, 8 ],
                      [  0, 56, 48, 8, 16, 8, 48, 8 ],
                      [  0, 16, 8, 48, 48, 16, 8, 48 ],
                      [ 40, 16, 8, 48, 56, 16, 8, 48 ],
                      [  0, 16, 48, 48, 0, 16, 48, 48 ],
                      [ 40, 8, 8, 8, 8, 24, 8, 8 ],
                      [ 40, 0, 8, 8, 8, 48, 8, 8 ],
                      [ 32, 8, 8, 8, 32, 24, 8, 8 ],
                      [ 32, 0, 8, 8, 32, 48, 8, 8 ],
                      [ 40, 0, 8, 8, 8, 32, 8, 8 ],
                      [ 40, 8, 8, 8, 8, 40, 8, 8 ],
                      [ 32, 0, 8, 8, 32, 32, 8, 8 ],
                      [ 32, 8, 8, 8, 32, 40, 8, 8 ],
                      [ 32, 8, 8, 8, 16, 24, 8, 8 ],
                      [ 40, 8, 8, 8, 24, 24, 8, 8 ],
                      [ 40, 0, 8, 8, 24, 48, 8, 8 ],
                      [ 32, 0, 8, 8, 16, 48, 8, 8 ],
                      [ 32, 0, 16, 16, 112, 16, 16, 16 ],
                      [ 32, 0, 16, 16, 112, 32, 16, 16 ],
                      [ 32, 0, 16, 16, 112, 48, 16, 16 ],
                      [ 32, 0, 16, 16, 128, 16, 16, 16 ],
                      [ 32, 0, 16, 16, 128, 48, 16, 16 ],
                      [ 32, 0, 16, 16, 144, 16, 16, 16 ],
                      [ 32, 0, 16, 16, 144, 32, 16, 16 ],
                      [ 32, 0, 16, 16, 144, 48, 16, 16 ],
                      [ 24, 32, 8, 8, 120, 48, 8, 8 ],
                      [ 24, 40, 8, 8, 120, 24, 8, 8 ],
                      [ 16, 32, 8, 8, 144, 48, 8, 8 ],
                      [ 16, 40, 8, 8, 144, 24, 8, 8 ],
                      [ 16, 40, 16, 8, 128, 24, 16, 8 ],
                      [ 16, 32, 16, 8, 128, 48, 16, 8 ],
                      [ 24, 32, 8, 16, 120, 32, 8, 16 ],
                      [ 16, 32, 8, 16, 144, 32, 8, 16 ],
                      [  0, 16, 8, 8, 128, 32, 8, 8 ],
                      [ 40, 16, 8, 8, 136, 32, 8, 8 ],
                      [  0, 56, 8, 8, 128, 40, 8, 8 ],
                      [ 40, 56, 8, 8, 136, 40, 8, 8 ],
                      [ 16, 32, 16, 16, 64, 0, 16, 16 ],
                      [ 40, 0, 8, 8, 72, 0, 8, 8 ],
                      [ 16, 32, 16, 16, 80, 0, 16, 16 ],
                      [ 32, 0, 8, 8, 80, 0, 8, 8 ],
                      [ 16, 32, 16, 16, 96, 0, 16, 16 ],
                      [ 40, 8, 8, 8, 104, 8, 8, 8 ],
                      [ 16, 32, 16, 16, 112, 0, 16, 16 ],
                      [ 32, 8, 8, 8, 112, 8, 8, 8 ],
                      [ 16, 32, 16, 16, 128, 0, 16, 16 ],
                      [ 40, 0, 8, 8, 136, 0, 8, 8 ],
                      [ 32, 8, 8, 8, 128, 8, 8, 8 ],
                      [ 16, 32, 16, 16, 144, 0, 16, 16 ],
                      [ 32, 0, 8, 8, 144, 0, 8, 8 ],
                      [ 40, 8, 8, 8, 152, 8, 8, 8 ],
                      [ 32, 32, 16, 16, 160, 0, 16, 16 ],
                      [ 32, 32, 16, 16, 160, 16, 16, 16 ],
                      [ 32, 8, 8, 8, 160, 8, 8, 8 ],
                      [ 32, 0, 8, 8, 160, 16, 8, 8 ],
                      [  0, 32, 16, 16, 176, 0, 16, 16 ],
                      [  0, 32, 16, 16, 176, 16, 16, 16 ],
                      [ 40, 8, 8, 8, 184, 8, 8, 8 ],
                      [ 40, 0, 8, 8, 184, 16, 8, 8 ],
                      [  8, 48, 16, 16, 160, 32, 16, 16 ],
                      [  8, 48, 16, 16, 176, 32, 16, 16 ],
                      [ 40, 0, 8, 8, 168, 32, 8, 8 ],
                      [ 32, 0, 8, 8, 176, 32, 8, 8 ],
                      [  8, 16, 16, 16, 160, 48, 16, 16 ],
                      [  8, 16, 16, 16, 176, 48, 16, 16 ],
                      [ 40, 8, 8, 8, 168, 56, 8, 8 ],
                      [ 32, 8, 8, 8, 176, 56, 8, 8 ],
                      [  0, 0, 16, 16, 0, 0, 16, 16 ],
                      [  0, 16, 48, 48, 64, 16, 48, 48 ],
                      [ 32, 0, 16, 16, 16, 32, 16, 16 ]
                  ];
                  for (var i = 0, l = params.length; i < l; i++) {
                      params[i][0] += left;
                      params[i][1] += top;
                      params[i][4] += sx;
                      params[i][5] += sy;
                      params[i].unshift(image);
                      surface.draw.apply(surface, params[i]);
                  }
              };
  
              // イメージの展開
              surface.draw(image, 96, 0, 80, 256, 192, 0, 80, 256);
              surface.draw(image, 176, 0, 80, 256, 192, 256, 80, 256);
              for (var y = 0; y < 4; y++) {
                  for (var x = 0; x < 2; x++) {
                      var left = x * 48;
                      var top = y * 64;
                      extract(left, top, 0, (x + y * 2) * 64);
                  }
              }
  
              this._image = surface;
              this._types = new Array();
  
              for (var y = 0; y < 4; y++) {
                  for (var x = 0; x < 2; x++) {
                      var left = x * 48;
                      var top = y * 64;
                      this._types[x + y * 2] = new Type(img, left, top, this.tileWidth, this.tileHeight);
                  }
              }
              for (var i = 0; i < 8; i++) {
                  for (var j = 0; j < 8; j++) {
                      if (this.match(i, j)) {
                          this._types[j].parentNum = i;
                      }
                  }
                  if (this._types[i].parentNum == undefined) {
                      this._types[i].parentNum = i;
                  }
                  this._types[i].baseNum = i;
              }
  
              /*
               if (RETINA_DISPLAY && core.scale == 2) {
               var img = new Surface(image.width * 2, image.height * 2);
               var tileWidth = this._tileWidth || image.width;
               var tileHeight = this._tileHeight || image.height;
               var row = image.width / tileWidth | 0;
               var col = image.height / tileHeight | 0;
               for (var y = 0; y < col; y++) {
               for (var x = 0; x < row; x++) {
               img.draw(image, x * tileWidth, y * tileHeight, tileWidth, tileHeight,
               x * tileWidth * 2, y * tileHeight * 2, tileWidth * 2, tileHeight * 2);
               }
               }
               this._doubledImage = img;
               }
               this._dirty = true;
               */
          }
      }
  });
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.