/miku/plugins/extendMap.enchant.js

https://github.com/tkayama/hanachin.github.com · JavaScript · 313 lines · 280 code · 9 blank · 24 comment · 91 complexity · 3a99726a93722d4780260aaa7b886492 MD5 · raw file

  1. /**
  2. * extendMap.enchant.js
  3. *
  4. * enchantMapEditor:
  5. * http://github.com/wise9/enchantMapEditor
  6. */
  7. enchant.extendMap = {};
  8. enchant.extendMap.ExMap = enchant.Class.create(enchant.Map, {
  9. type2data: function() {
  10. var len = this._typeData.length;
  11. var xlen = this._typeData[0][0].length;
  12. var ylen = this._typeData[0].length;
  13. for (var index = 0; index < len; index++) {
  14. this._data[index] = new Array();
  15. for (var y = 0; y < ylen; y++) {
  16. this._data[index][y] = new Array();
  17. for (var x = 0; x < xlen; x++) {
  18. this._data[index][y][x] = this.searchPattern(index, x, y);
  19. }
  20. }
  21. }
  22. },
  23. data2type: function() {
  24. var len = this._data.length;
  25. var xlen = this._data[0][0].length;
  26. var ylen = this._data[0].length;
  27. this._typeData = new Array();
  28. for (var index = 0; index < len; index++) {
  29. this._typeData[index] = new Array();
  30. for (var y = 0; y < ylen; y++) {
  31. this._typeData[index][y] = new Array();
  32. for (var x = 0; x < xlen; x++) {
  33. this._typeData[index][y][x] = Math.floor(this._data[index][y][x] / 68);
  34. if (this._data[index][y][x] % 17 > 12) {
  35. this._typeData[index][y][x] = -1;
  36. }
  37. }
  38. }
  39. }
  40. },
  41. isOwn: function(index, x, y, own) {
  42. var data = this._typeData[index][y][x];
  43. if (data == own
  44. || data == -1
  45. || data > 7
  46. || (typeof this._types != 'undefined')
  47. && this._types[data].parentNum == this._types[own].baseNum) {
  48. return true;
  49. } else {
  50. return false;
  51. }
  52. },
  53. searchPattern: function(index, x, y) {
  54. var patternTable = {
  55. 0:42, 2:54, 8: 3, 10:53, 11:57, 16: 1, 18:51, 22:55, 24: 2, 26:52,
  56. 27:44, 30:45, 31:56, 64:20, 66:37, 72:19, 74:36, 75:10, 80:17, 82:34,
  57. 86:11, 88:18, 90:35, 91:60, 94:58, 95:59, 104:23, 106:27, 107:40, 120:61,
  58. 122:26, 123:43, 126: 9, 127: 6, 208:21, 210:28, 214:38, 216:62, 218:24, 222:41,
  59. 223: 7, 219: 8, 248:22, 250:25, 251: 4, 254: 5, 255:39
  60. };
  61. var patternNumber = 0;
  62. var own = this._typeData[index][y][x];
  63. var xlen = this._typeData[index][y].length - 1;
  64. var ylen = this._typeData[index].length - 1;
  65. if (own == -1) {
  66. return -1;
  67. } else if (own > 7) {
  68. return this._data[index][y][x];
  69. }
  70. if (x == 0) {
  71. patternNumber |= 41;
  72. } else if (x == xlen) {
  73. patternNumber |= 148;
  74. }
  75. if (y == 0) {
  76. patternNumber |= 7;
  77. } else if (y == ylen) {
  78. patternNumber |= 224;
  79. }
  80. if (x > 0) {
  81. if (this.isOwn(index, x - 1, y, own)) {
  82. patternNumber += 8;
  83. }
  84. }
  85. if (x < xlen) {
  86. if (this.isOwn(index, x + 1, y, own)) {
  87. patternNumber += 16;
  88. }
  89. }
  90. if (y > 0) {
  91. if (this.isOwn(index, x, y - 1, own)) {
  92. patternNumber += 2;
  93. }
  94. }
  95. if (y < ylen) {
  96. if (this.isOwn(index, x, y + 1, own)) {
  97. patternNumber += 64;
  98. }
  99. }
  100. if (x > 0 && y > 0) {
  101. if (this.isOwn(index, x - 1, y - 1, own)) {
  102. patternNumber += 1;
  103. }
  104. }
  105. if (x < xlen && y > 0) {
  106. if (this.isOwn(index, x + 1, y - 1, own)) {
  107. patternNumber += 4;
  108. }
  109. }
  110. if (x > 0 && y < ylen) {
  111. if (this.isOwn(index, x - 1, y + 1, own)) {
  112. patternNumber += 32;
  113. }
  114. }
  115. if (x < xlen && y < ylen) {
  116. if (this.isOwn(index, x + 1, y + 1, own)) {
  117. patternNumber += 128;
  118. }
  119. }
  120. if (!((patternNumber & 1) && (patternNumber & 2) && (patternNumber & 8))) {
  121. patternNumber &= 254;
  122. }
  123. if (!((patternNumber & 4) && (patternNumber & 2) && (patternNumber & 16))) {
  124. patternNumber &= 251;
  125. }
  126. if (!((patternNumber & 32) && (patternNumber & 64) && (patternNumber & 8))) {
  127. patternNumber &= 223;
  128. }
  129. if (!((patternNumber & 128) && (patternNumber & 64) && (patternNumber & 16))) {
  130. patternNumber &= 127;
  131. }
  132. if (patternTable.hasOwnProperty(patternNumber)) {
  133. var ret = own * 68 + patternTable[patternNumber];
  134. } else {
  135. var ret = -1;
  136. console.log('this._typeData[' + index + '][' + y + '][' + x + '] = ' + patternNumber + ' // undefined');
  137. }
  138. return ret;
  139. },
  140. match: function(ind1, ind2) {
  141. var i = 0;
  142. while (i < 1024) {
  143. if(this._types[ind1].baseType[i] ^ this._types[ind2].parentType[i]) {
  144. return false;
  145. } else {
  146. i++;
  147. }
  148. }
  149. return true;
  150. },
  151. loadTypeData: function(data) {
  152. this._typeData = Array.prototype.slice.apply(arguments);
  153. this._dirty = true;
  154. this.type2data();
  155. var c = 0;
  156. for (var index = 0, l = this._data.length; index < l; index++) {
  157. for (var y = 0, ll = this._data[0].length; y < ll; y++) {
  158. for (var x = 0, lll = this._data[0][0].length; x < lll; x++) {
  159. if (this._typeData[index][y][x] > 7) {
  160. this._typeData[index][y][x] = -1;
  161. }
  162. if (this._data[index][y][x] >= 0) {
  163. c++;
  164. }
  165. }
  166. }
  167. }
  168. if (c / (data.length * data[0].length) > 0.2) {
  169. this._tight = true;
  170. } else {
  171. this._tight = false;
  172. }
  173. },
  174. loadData: function(data) {
  175. this._data = Array.prototype.slice.apply(arguments);
  176. this._dirty = true;
  177. this.data2type();
  178. var c = 0;
  179. for (var index = 0, l = this._data.length; index < l; index++) {
  180. for (var y = 0, ll = this._data[0].length; y < ll; y++) {
  181. for (var x = 0, lll = this._data[0][0].length; x < lll; x++) {
  182. if (this._data[index][y][x] >= 0) {
  183. c++;
  184. }
  185. }
  186. }
  187. }
  188. if (c / (data.length * data[0].length) > 0.2) {
  189. this._tight = true;
  190. } else {
  191. this._tight = false;
  192. }
  193. },
  194. image: {
  195. get: function() {
  196. return this._image;
  197. },
  198. set: function(image) {
  199. var img = image.clone();
  200. var game = enchant.Game.instance;
  201. var surface = new Surface(272, 512);
  202. var Type = function(image, left, top, tileWidth, tileHeight) {
  203. this.baseType = [];
  204. this.parentType = [];
  205. this.baseType = image.context.getImageData(left, top, tileWidth, tileHeight).data;
  206. this.parentType = image.context.getImageData(left + tileWidth, top, tileWidth, tileHeight).data;
  207. };
  208. var extract = function(left, top, sx, sy) {
  209. var params = [
  210. [ 0, 16, 48, 8, 16, 0, 48, 8 ], [ 0, 56, 48, 8, 16, 8, 48, 8 ],
  211. [ 0, 16, 8, 48, 48,16, 8, 48 ], [ 40, 16, 8, 48, 56,16, 8, 48 ],
  212. [ 0, 16, 48, 48, 0,16, 48, 48 ], [ 40, 8, 8, 8, 8,24, 8, 8 ],
  213. [ 40, 0, 8, 8, 8,48, 8, 8 ], [ 32, 8, 8, 8, 32,24, 8, 8 ],
  214. [ 32, 0, 8, 8, 32,48, 8, 8 ], [ 40, 0, 8, 8, 8,32, 8, 8 ],
  215. [ 40, 8, 8, 8, 8,40, 8, 8 ], [ 32, 0, 8, 8, 32,32, 8, 8 ],
  216. [ 32, 8, 8, 8, 32,40, 8, 8 ], [ 32, 8, 8, 8, 16,24, 8, 8 ],
  217. [ 40, 8, 8, 8, 24,24, 8, 8 ], [ 40, 0, 8, 8, 24,48, 8, 8 ],
  218. [ 32, 0, 8, 8, 16,48, 8, 8 ], [ 32, 0, 16, 16,112,16, 16, 16 ],
  219. [ 32, 0, 16, 16,112,32, 16, 16 ], [ 32, 0, 16, 16,112,48, 16, 16 ],
  220. [ 32, 0, 16, 16,128,16, 16, 16 ], [ 32, 0, 16, 16,128,48, 16, 16 ],
  221. [ 32, 0, 16, 16,144,16, 16, 16 ], [ 32, 0, 16, 16,144,32, 16, 16 ],
  222. [ 32, 0, 16, 16,144,48, 16, 16 ], [ 24, 32, 8, 8,120,48, 8, 8 ],
  223. [ 24, 40, 8, 8,120,24, 8, 8 ], [ 16, 32, 8, 8,144,48, 8, 8 ],
  224. [ 16, 40, 8, 8,144,24, 8, 8 ], [ 16, 40, 16, 8,128,24, 16, 8 ],
  225. [ 16, 32, 16, 8,128,48, 16, 8 ], [ 24, 32, 8, 16,120,32, 8, 16 ],
  226. [ 16, 32, 8, 16,144,32, 8, 16 ], [ 0, 16, 8, 8,128,32, 8, 8 ],
  227. [ 40, 16, 8, 8,136,32, 8, 8 ], [ 0, 56, 8, 8,128,40, 8, 8 ],
  228. [ 40, 56, 8, 8,136,40, 8, 8 ], [ 16, 32, 16, 16, 64, 0, 16, 16 ],
  229. [ 40, 0, 8, 8, 72, 0, 8, 8 ], [ 16, 32, 16, 16, 80, 0, 16, 16 ],
  230. [ 32, 0, 8, 8, 80, 0, 8, 8 ], [ 16, 32, 16, 16, 96, 0, 16, 16 ],
  231. [ 40, 8, 8, 8,104, 8, 8, 8 ], [ 16, 32, 16, 16,112, 0, 16, 16 ],
  232. [ 32, 8, 8, 8,112, 8, 8, 8 ], [ 16, 32, 16, 16,128, 0, 16, 16 ],
  233. [ 40, 0, 8, 8,136, 0, 8, 8 ], [ 32, 8, 8, 8,128, 8, 8, 8 ],
  234. [ 16, 32, 16, 16,144, 0, 16, 16 ], [ 32, 0, 8, 8,144, 0, 8, 8 ],
  235. [ 40, 8, 8, 8,152, 8, 8, 8 ], [ 32, 32, 16, 16,160, 0, 16, 16 ],
  236. [ 32, 32, 16, 16,160,16, 16, 16 ], [ 32, 8, 8, 8,160, 8, 8, 8 ],
  237. [ 32, 0, 8, 8,160,16, 8, 8 ], [ 0, 32, 16, 16,176, 0, 16, 16 ],
  238. [ 0, 32, 16, 16,176,16, 16, 16 ], [ 40, 8, 8, 8,184, 8, 8, 8 ],
  239. [ 40, 0, 8, 8,184,16, 8, 8 ], [ 8, 48, 16, 16,160,32, 16, 16 ],
  240. [ 8, 48, 16, 16,176,32, 16, 16 ], [ 40, 0, 8, 8,168,32, 8, 8 ],
  241. [ 32, 0, 8, 8,176,32, 8, 8 ], [ 8, 16, 16, 16,160,48, 16, 16 ],
  242. [ 8, 16, 16, 16,176,48, 16, 16 ], [ 40, 8, 8, 8,168,56, 8, 8 ],
  243. [ 32, 8, 8, 8,176,56, 8, 8 ], [ 0, 0, 16, 16, 0, 0, 16, 16 ],
  244. [ 0, 16, 48, 48, 64,16, 48, 48 ], [ 32, 0, 16, 16, 16,32, 16, 16 ]
  245. ];
  246. for (var i = 0, l = params.length; i < l; i++) {
  247. params[i][0] += left;
  248. params[i][1] += top;
  249. params[i][4] += sx;
  250. params[i][5] += sy;
  251. params[i].unshift(image);
  252. surface.draw.apply(surface, params[i]);
  253. }
  254. };
  255. // イメージの展開
  256. surface.draw(image, 96, 0, 80, 256, 192, 0, 80, 256);
  257. surface.draw(image, 176, 0, 80, 256, 192, 256, 80, 256);
  258. for (var y = 0; y < 4; y++) {
  259. for(var x = 0; x < 2; x++) {
  260. var left = x * 48;
  261. var top = y * 64;
  262. extract(left, top, 0, (x+y*2)*64);
  263. }
  264. }
  265. this._image = surface;
  266. this._types = new Array();
  267. for (var y = 0; y < 4; y++) {
  268. for(var x = 0; x < 2; x++) {
  269. var left = x * 48;
  270. var top = y * 64;
  271. this._types[x+y*2] = new Type(img, left, top, this.tileWidth, this.tileHeight);
  272. }
  273. }
  274. for (var i = 0; i < 8; i++) {
  275. for (var j = 0; j < 8; j++) {
  276. if (this.match(i, j)) {
  277. this._types[j].parentNum = i;
  278. }
  279. }
  280. if (this._types[i].parentNum == undefined) {
  281. this._types[i].parentNum = i;
  282. }
  283. this._types[i].baseNum = i;
  284. }
  285. /*
  286. if (RETINA_DISPLAY && game.scale == 2) {
  287. var img = new Surface(image.width * 2, image.height * 2);
  288. var tileWidth = this._tileWidth || image.width;
  289. var tileHeight = this._tileHeight || image.height;
  290. var row = image.width / tileWidth | 0;
  291. var col = image.height / tileHeight | 0;
  292. for (var y = 0; y < col; y++) {
  293. for (var x = 0; x < row; x++) {
  294. img.draw(image, x * tileWidth, y * tileHeight, tileWidth, tileHeight,
  295. x * tileWidth * 2, y * tileHeight * 2, tileWidth * 2, tileHeight * 2);
  296. }
  297. }
  298. this._doubledImage = img;
  299. }
  300. this._dirty = true;
  301. */
  302. }
  303. }
  304. });